diff --git a/.cursor/rules/vars-usage.mdc b/.cursor/rules/vars-usage.mdc deleted file mode 100644 index 233e0aba..00000000 --- a/.cursor/rules/vars-usage.mdc +++ /dev/null @@ -1,18 +0,0 @@ ---- -description: Restricts usage of the global Mineflayer `bot` variable to only src/ files; prohibits usage in renderer/. Specifies correct usage of player state and appViewer globals. -globs: src/**/*.ts,renderer/**/*.ts -alwaysApply: false ---- -Ask AI - -- The global variable `bot` refers to the Mineflayer bot instance. -- You may use `bot` directly in any file under the `src/` directory (e.g., `src/mineflayer/playerState.ts`). -- Do **not** use `bot` directly in any file under the `renderer/` directory or its subfolders (e.g., `renderer/viewer/three/worldrendererThree.ts`). -- In renderer code, all bot/player state and events must be accessed via explicit interfaces, state managers, or passed-in objects, never by referencing `bot` directly. -- In renderer code (such as in `WorldRendererThree`), use the `playerState` property (e.g., `worldRenderer.playerState.gameMode`) to access player state. The implementation for `playerState` lives in `src/mineflayer/playerState.ts`. -- In `src/` code, you may use the global variable `appViewer` from `src/appViewer.ts` directly. Do **not** import `appViewer` or use `window.appViewer`; use the global `appViewer` variable as-is. -- Some other global variables that can be used without window prefixes are listed in src/globals.d.ts - -Rationale: This ensures a clean separation between the Mineflayer logic (server-side/game logic) and the renderer (client-side/view logic), making the renderer portable and testable, and maintains proper usage of global state. - -For more general project contributing guides see CONTRIBUTING.md on like how to setup the project. Use pnpm tsc if needed to validate result with typechecking the whole project. diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 38ca0016..00000000 --- a/.dockerignore +++ /dev/null @@ -1,3 +0,0 @@ -# build stuff -node_modules -public \ No newline at end of file diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 9aa16166..00000000 --- a/.eslintignore +++ /dev/null @@ -1,9 +0,0 @@ -node_modules -rsbuild.config.ts -*.module.css.d.ts -*.generated.ts -generated -dist -public -**/*/rsbuildSharedConfig.ts -src/mcDataTypes.ts \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 63f6749a..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,223 +0,0 @@ -{ - "extends": [ - "zardoy", - "plugin:@stylistic/disable-legacy" - ], - "ignorePatterns": [ - "!*.js" - ], - "plugins": [ - "@stylistic" - ], - "rules": { - // style - "@stylistic/space-infix-ops": "error", - "@stylistic/no-multi-spaces": "error", - "@stylistic/no-trailing-spaces": "error", - "@stylistic/space-before-function-paren": "error", - "@stylistic/array-bracket-spacing": "error", - // would be great to have but breaks TS code like (url?) => ... - // "@stylistic/arrow-parens": [ - // "error", - // "as-needed" - // ], - "@stylistic/arrow-spacing": "error", - "@stylistic/block-spacing": "error", - "@typescript-eslint/no-this-alias": "off", - "@stylistic/brace-style": [ - "error", - "1tbs", - { - "allowSingleLine": true - } - ], - // too annoying to be forced to multi-line, probably should be enforced to never - // "@stylistic/comma-dangle": [ - // "error", - // "always-multiline" - // ], - "@stylistic/computed-property-spacing": "error", - "@stylistic/dot-location": [ - "error", - "property" - ], - "@stylistic/eol-last": "error", - "@stylistic/function-call-spacing": "error", - "@stylistic/function-paren-newline": [ - "error", - "consistent" - ], - "@stylistic/generator-star-spacing": "error", - "@stylistic/implicit-arrow-linebreak": "error", - "@stylistic/indent-binary-ops": [ - "error", - 2 - ], - "@stylistic/function-call-argument-newline": [ - "error", - "consistent" - ], - "@stylistic/space-in-parens": [ - "error", - "never" - ], - "@stylistic/object-curly-spacing": [ - "error", - "always" - ], - "@stylistic/comma-spacing": "error", - "@stylistic/semi": [ - "error", - "never" - ], - "@stylistic/indent": [ - "error", - 2, - { - "SwitchCase": 1, - "ignoredNodes": [ - "TemplateLiteral" - ] - } - ], - "@stylistic/quotes": [ - "error", - "single", - { - "allowTemplateLiterals": true - } - ], - "@stylistic/key-spacing": "error", - "@stylistic/keyword-spacing": "error", - // "@stylistic/line-comment-position": "error", // not needed - // "@stylistic/lines-around-comment": "error", // also not sure if needed - // "@stylistic/max-len": "error", // also not sure if needed - // "@stylistic/linebreak-style": "error", // let git decide - "@stylistic/max-statements-per-line": [ - "error", - { - "max": 5 - } - ], - // "@stylistic/member-delimiter-style": "error", - // "@stylistic/multiline-ternary": "error", // not needed - // "@stylistic/newline-per-chained-call": "error", // not sure if needed - "@stylistic/new-parens": "error", - "@typescript-eslint/class-literal-property-style": "off", - "@stylistic/no-confusing-arrow": "error", - "@stylistic/wrap-iife": "error", - "@stylistic/space-before-blocks": "error", - "@stylistic/type-generic-spacing": "error", - "@stylistic/template-tag-spacing": "error", - "@stylistic/template-curly-spacing": "error", - "@stylistic/type-annotation-spacing": "error", - "@stylistic/jsx-child-element-spacing": "error", - // buggy - // "@stylistic/jsx-closing-bracket-location": "error", - // "@stylistic/jsx-closing-tag-location": "error", - "@stylistic/jsx-curly-brace-presence": "error", - "@stylistic/jsx-curly-newline": "error", - "@stylistic/jsx-curly-spacing": "error", - "@stylistic/jsx-equals-spacing": "error", - "@stylistic/jsx-first-prop-new-line": "error", - "@stylistic/jsx-function-call-newline": "error", - "@stylistic/jsx-max-props-per-line": [ - "error", - { - "maximum": 7 - } - ], - "@stylistic/jsx-pascal-case": "error", - "@stylistic/jsx-props-no-multi-spaces": "error", - "@stylistic/jsx-self-closing-comp": "error", - // "@stylistic/jsx-sort-props": [ - // "error", - // { - // "callbacksLast": false, - // "shorthandFirst": true, - // "shorthandLast": false, - // "multiline": "ignore", - // "ignoreCase": true, - // "noSortAlphabetically": true, - // "reservedFirst": [ - // "key", - // "className" - // ], - // "locale": "auto" - // } - // ], - // perf - "import/no-deprecated": "off", - // --- - "@typescript-eslint/prefer-nullish-coalescing": "off", - "@typescript-eslint/naming-convention": "off", - "prefer-template": "off", - // intentional: improve readability in some cases - "no-else-return": "off", - "@typescript-eslint/padding-line-between-statements": "off", - "@typescript-eslint/no-dynamic-delete": "off", - "arrow-body-style": "off", - "unicorn/prefer-ternary": "off", - "unicorn/switch-case-braces": "off", - "@typescript-eslint/consistent-type-definitions": "off", - "unicorn/explicit-length-check": "off", - "unicorn/prefer-dom-node-append": "off", - "typescript-eslint/no-confusing-void-expression": "off", - "unicorn/no-lonely-if": "off", - "no-multi-assign": "off", - "sonarjs/no-duplicate-string": "off", - "new-cap": "off", - "unicorn/consistent-destructuring": "off", - "unicorn/no-await-expression-member": "off", - "unicorn/prefer-add-event-listener": "off", - "unicorn/prefer-top-level-await": "off", - "default-case": "off", - // I guess it would better to fix - "node/prefer-global/buffer": "off", - "unicorn/prefer-optional-catch-binding": "off", // still useful for debugging - "no-alert": "off", // todo once replaced with ui, enable - "@typescript-eslint/restrict-plus-operands": "off", - // --- - "@typescript-eslint/no-throw-literal": "off", // disabling because of "rule expansion" - "no-empty-function": "off", - "@typescript-eslint/no-explicit-any": "off", - "import/no-extraneous-dependencies": "off", - "@typescript-eslint/ban-types": "off", - "unicorn/prefer-query-selector": "off", - "@typescript-eslint/dot-notation": "off", // trick prop type-checking - "@typescript-eslint/consistent-type-imports": "off", - "no-negated-condition": "off", - "@typescript-eslint/no-require-imports": "off", - "unicorn/prefer-number-properties": "off", - "@typescript-eslint/no-confusing-void-expression": "off", - "unicorn/no-empty-file": "off", - "unicorn/prefer-event-target": "off", - "@typescript-eslint/member-ordering": "off", - // needs to be fixed actually - "complexity": "off", - "@typescript-eslint/no-floating-promises": "warn", - "no-async-promise-executor": "off", - "no-bitwise": "off", - "unicorn/filename-case": "off", - "max-depth": "off", - "unicorn/no-typeof-undefined": "off" - }, - "overrides": [ - { - "files": [ - "*.js" - ], - "rules": { - "@stylistic/space-before-function-paren": [ - "error", - { - "anonymous": "always", - "named": "never", - "asyncArrow": "always" - } - ] - } - } - ], - "root": true -} diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index e80b7100..00000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Benchmark -on: - issue_comment: - types: [created] - push: - branches: - - perf-test -jobs: - deploy: - runs-on: ubuntu-latest - if: >- - (github.event_name == 'push' && github.ref == 'refs/heads/perf-test') || - ( - github.event_name == 'issue_comment' && - github.event.issue.pull_request != '' && - (startsWith(github.event.comment.body, '/benchmark')) - ) - permissions: - pull-requests: write - steps: - - run: lscpu - - - name: Checkout - uses: actions/checkout@v2 - - name: Setup pnpm - uses: pnpm/action-setup@v4 - - uses: actions/setup-node@v4 - with: - node-version: 22 - cache: "pnpm" - - name: Move Cypress to dependencies - run: | - jq '.dependencies.cypress = .optionalDependencies.cypress | del(.optionalDependencies.cypress)' package.json > package.json.tmp - mv package.json.tmp package.json - - run: pnpm install --no-frozen-lockfile - - - run: pnpm build - - run: nohup pnpm prod-start & - - - run: pnpm test:benchmark - id: benchmark - continue-on-error: true - # read benchmark results from stdout - - run: | - if [ -f benchmark.txt ]; then - # Format the benchmark results for GitHub comment - BENCHMARK_RESULT=$(cat benchmark.txt | sed 's/^/- /') - echo "BENCHMARK_RESULT<> $GITHUB_ENV - echo "$BENCHMARK_RESULT" >> $GITHUB_ENV - echo "EOF" >> $GITHUB_ENV - else - echo "BENCHMARK_RESULT=Benchmark failed to run or produce results" >> $GITHUB_ENV - fi - - - uses: mshick/add-pr-comment@v2 - with: - allow-repeats: true - message: | - Benchmark result: ${{ env.BENCHMARK_RESULT }} diff --git a/.github/workflows/build-single-file.yml b/.github/workflows/build-single-file.yml deleted file mode 100644 index 5f9800db..00000000 --- a/.github/workflows/build-single-file.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: build-single-file - -on: - workflow_dispatch: - -jobs: - build-and-bundle: - runs-on: ubuntu-latest - permissions: write-all - steps: - - name: Checkout repository - uses: actions/checkout@master - - - uses: actions/setup-node@v4 - with: - node-version: 22 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install - - - name: Build single-file version - minecraft.html - run: pnpm build-single-file && mv dist/single/index.html minecraft.html - env: - LOCAL_CONFIG_FILE: config.mcraft-only.json - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: minecraft.html - path: minecraft.html diff --git a/.github/workflows/build-zip.yml b/.github/workflows/build-zip.yml deleted file mode 100644 index 76ca65ca..00000000 --- a/.github/workflows/build-zip.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: Make Self Host Zip - -on: - workflow_dispatch: - -jobs: - build-and-bundle: - runs-on: ubuntu-latest - permissions: write-all - steps: - - name: Checkout repository - uses: actions/checkout@master - - - uses: actions/setup-node@v4 - with: - node-version: 22 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - - name: Install dependencies - run: pnpm install - - - name: Build project - run: pnpm build - env: - LOCAL_CONFIG_FILE: config.mcraft-only.json - - - name: Bundle server.js - run: | - pnpm esbuild server.js --bundle --platform=node --outfile=bundled-server.js --define:process.env.NODE_ENV="'production'" - - - name: Create distribution package - run: | - mkdir -p package - cp -r dist package/ - cp bundled-server.js package/server.js - cd package - zip -r ../self-host.zip . - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: self-host - path: self-host.zip diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 8fc56ea9..00000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,177 +0,0 @@ -name: CI -on: - pull_request: -jobs: - build-and-deploy: - runs-on: ubuntu-latest - permissions: write-all - steps: - - name: Checkout repository - uses: actions/checkout@master - - name: Setup Java JDK - uses: actions/setup-java@v1.4.3 - with: - java-version: 17 - java-package: jre - - uses: actions/setup-node@v4 - with: - node-version: 22 - # cache: "pnpm" - - name: Install pnpm - uses: pnpm/action-setup@v4 - - run: pnpm install - - run: pnpm build-single-file - - name: Store minecraft.html size - run: | - SIZE_BYTES=$(du -s dist/single/minecraft.html 2>/dev/null | cut -f1) - echo "SIZE_BYTES=$SIZE_BYTES" >> $GITHUB_ENV - - run: pnpm check-build - - name: Create zip package for size comparison - run: | - mkdir -p package - cp -r dist package/ - cd package - zip -r ../self-host.zip . - - run: pnpm build-playground - # - run: pnpm build-storybook - - run: pnpm test-unit - - run: pnpm lint - - - name: Parse Bundle Stats - run: | - GZIP_BYTES=$(du -s self-host.zip 2>/dev/null | cut -f1) - SIZE=$(echo "scale=2; $SIZE_BYTES/1024/1024" | bc) - GZIP_SIZE=$(echo "scale=2; $GZIP_BYTES/1024/1024" | bc) - echo "{\"total\": ${SIZE}, \"gzipped\": ${GZIP_SIZE}}" > /tmp/bundle-stats.json - - # - name: Compare Bundle Stats - # id: compare - # uses: actions/github-script@v6 - # env: - # GITHUB_TOKEN: ${{ secrets.GIST_TOKEN }} - # with: - # script: | - # const gistId = '${{ secrets.BUNDLE_STATS_GIST_ID }}'; - - # async function getGistContent() { - # const { data } = await github.rest.gists.get({ - # gist_id: gistId, - # headers: { - # authorization: `token ${process.env.GITHUB_TOKEN}` - # } - # }); - # return JSON.parse(data.files['bundle-stats.json'].content || '{}'); - # } - - # const content = await getGistContent(); - # const baseStats = content['${{ github.event.pull_request.base.ref }}']; - # const newStats = require('/tmp/bundle-stats.json'); - - # const comparison = `minecraft.html (normal build gzip)\n${baseStats.total}MB (${baseStats.gzipped}MB compressed) -> ${newStats.total}MB (${newStats.gzipped}MB compressed)`; - # core.setOutput('stats', comparison); - - # - run: pnpm tsx scripts/buildNpmReact.ts - - run: nohup pnpm prod-start & - - run: nohup pnpm test-mc-server & - - uses: cypress-io/github-action@v5 - with: - install: false - - uses: actions/upload-artifact@v4 - if: failure() - with: - name: cypress-images - path: cypress/screenshots/ - # - run: node scripts/outdatedGitPackages.mjs - # if: ${{ github.event.pull_request.base.ref == 'release' }} - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - # - name: Store Bundle Stats - # if: github.event.pull_request.base.ref == 'next' - # uses: actions/github-script@v6 - # env: - # GITHUB_TOKEN: ${{ secrets.GIST_TOKEN }} - # with: - # script: | - # const gistId = '${{ secrets.BUNDLE_STATS_GIST_ID }}'; - - # async function getGistContent() { - # const { data } = await github.rest.gists.get({ - # gist_id: gistId, - # headers: { - # authorization: `token ${process.env.GITHUB_TOKEN}` - # } - # }); - # return JSON.parse(data.files['bundle-stats.json'].content || '{}'); - # } - - # async function updateGistContent(content) { - # await github.rest.gists.update({ - # gist_id: gistId, - # headers: { - # authorization: `token ${process.env.GITHUB_TOKEN}` - # }, - # files: { - # 'bundle-stats.json': { - # content: JSON.stringify(content, null, 2) - # } - # } - # }); - # } - - # const stats = require('/tmp/bundle-stats.json'); - # const content = await getGistContent(); - # content['${{ github.event.pull_request.base.ref }}'] = stats; - # await updateGistContent(content); - - # - name: Update PR Description - # uses: actions/github-script@v6 - # with: - # script: | - # const { data: pr } = await github.rest.pulls.get({ - # owner: context.repo.owner, - # repo: context.repo.repo, - # pull_number: context.issue.number - # }); - - # let body = pr.body || ''; - # const statsMarker = '### Bundle Size'; - # const comparison = '${{ steps.compare.outputs.stats }}'; - - # if (body.includes(statsMarker)) { - # body = body.replace( - # new RegExp(`${statsMarker}[^\n]*\n[^\n]*`), - # `${statsMarker}\n${comparison}` - # ); - # } else { - # body += `\n\n${statsMarker}\n${comparison}`; - # } - - # await github.rest.pulls.update({ - # owner: context.repo.owner, - # repo: context.repo.repo, - # pull_number: context.issue.number, - # body - # }); - # dedupe-check: - # runs-on: ubuntu-latest - # if: github.event.pull_request.head.ref == 'next' - # steps: - # - name: Checkout repository - # uses: actions/checkout@v2 - - # - name: Install pnpm - # run: npm install -g pnpm@9.0.4 - - # - name: Run pnpm dedupe - # run: pnpm dedupe - - # - name: Check for changes - # run: | - # if ! git diff --exit-code --quiet pnpm-lock.yaml; then - # echo "pnpm dedupe introduced changes:" - # git diff --color=always pnpm-lock.yaml - # exit 1 - # else - # echo "No changes detected after pnpm dedupe in pnpm-lock.yaml" - # fi diff --git a/.github/workflows/fix-lint.yml b/.github/workflows/fix-lint.yml deleted file mode 100644 index da2cf87d..00000000 --- a/.github/workflows/fix-lint.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Fix Lint Command -on: - issue_comment: - types: [created] -jobs: - deploy: - runs-on: ubuntu-latest - if: >- - github.event.issue.pull_request != '' && - ( - contains(github.event.comment.body, '/fix') - ) - permissions: - pull-requests: write - steps: - - uses: actions/checkout@v2 - with: - ref: refs/pull/${{ github.event.issue.number }}/head - - uses: actions/setup-node@v4 - with: - node-version: 22 - - name: Install pnpm - uses: pnpm/action-setup@v4 - - run: pnpm install - - run: pnpm lint --fix - - name: Push Changes - uses: ad-m/github-push-action@master - with: - github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/merge-next.yml b/.github/workflows/merge-next.yml deleted file mode 100644 index ee02789b..00000000 --- a/.github/workflows/merge-next.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Update Base Branch Command -on: - issue_comment: - types: [created] -jobs: - deploy: - runs-on: ubuntu-latest - if: >- - github.event.issue.pull_request != '' && - ( - contains(github.event.comment.body, '/update') - ) - permissions: - pull-requests: write - contents: write - steps: - - uses: actions/checkout@v2 - with: - fetch-depth: 0 # Fetch all history so we can merge branches - ref: refs/pull/${{ github.event.issue.number }}/head - - name: Fetch All Branches - run: git fetch --all - # - name: Checkout PR - # run: git checkout ${{ github.event.issue.pull_request.head.ref }} - - name: Merge From Next - run: git merge origin/next --strategy-option=theirs - - name: Push Changes - run: git push diff --git a/.github/workflows/next-deploy.yml b/.github/workflows/next-deploy.yml deleted file mode 100644 index 75b39f6c..00000000 --- a/.github/workflows/next-deploy.yml +++ /dev/null @@ -1,91 +0,0 @@ -name: Vercel Deploy Next -env: - VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} - VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} - ALIASES: ${{ vars.ALIASES }} - MAIN_MENU_LINKS: ${{ vars.MAIN_MENU_LINKS }} -on: - push: - branches: - - next -jobs: - deploy: - runs-on: ubuntu-latest - permissions: - pull-requests: write - steps: - - name: Checkout - uses: actions/checkout@v2 - - uses: actions/setup-node@v4 - with: - node-version: 22 - - name: Install pnpm - uses: pnpm/action-setup@v4 - - name: Install Global Dependencies - run: pnpm add -g vercel - - name: Install Dependencies - run: pnpm install - - name: Pull Vercel Environment Information - run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }} - - name: Write Release Info - run: | - echo "{\"latestTag\": \"$(git rev-parse --short $GITHUB_SHA)\", \"isCommit\": true}" > assets/release.json - - name: Download Generated Sounds map - run: node scripts/downloadSoundsMap.mjs - - name: Build Project Artifacts - run: vercel build --token=${{ secrets.VERCEL_TOKEN }} - env: - CONFIG_JSON_SOURCE: BUNDLED - LOCAL_CONFIG_FILE: config.mcraft-only.json - - name: Copy playground files - run: | - mkdir -p .vercel/output/static/playground - pnpm build-playground - cp -r renderer/dist/* .vercel/output/static/playground/ - - name: Deploy Project Artifacts to Vercel - uses: mathiasvr/command-output@v2.0.0 - with: - run: vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} - id: deploy - - name: Start servers for testing - run: | - nohup pnpm prod-start & - nohup pnpm test-mc-server & - - name: Run Cypress smoke tests - uses: cypress-io/github-action@v5 - with: - install: false - spec: cypress/e2e/smoke.spec.ts - - uses: actions/upload-artifact@v4 - if: failure() - with: - name: cypress-smoke-test-screenshots - path: cypress/screenshots/ - - name: Set deployment aliases - run: | - for alias in $(echo ${{ secrets.TEST_PREVIEW_DOMAIN }} | tr "," "\n"); do - vercel alias set ${{ steps.deploy.outputs.stdout }} $alias --token=${{ secrets.VERCEL_TOKEN }} --scope=zaro - done - - - name: Create Release Pull Request - uses: actions/github-script@v6 - with: - script: | - const { data: pulls } = await github.rest.pulls.list({ - owner: context.repo.owner, - repo: context.repo.repo, - head: `${context.repo.owner}:next`, - base: 'release', - state: 'open' - }); - - if (pulls.length === 0) { - await github.rest.pulls.create({ - owner: context.repo.owner, - repo: context.repo.repo, - title: 'Release', - head: 'next', - base: 'release', - body: 'PR was created automatically by the release workflow, hope you release it as soon as possible!', - }); - } diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml deleted file mode 100644 index 89fd6698..00000000 --- a/.github/workflows/preview.yml +++ /dev/null @@ -1,114 +0,0 @@ -name: Vercel PR Deploy (Preview) -env: - VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} - VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} - ALIASES: ${{ vars.ALIASES }} -on: - issue_comment: - types: [created] - pull_request_target: -jobs: - deploy: - runs-on: ubuntu-latest - if: >- - ( - ( - github.event_name == 'issue_comment' && - contains(github.event.comment.body, '/deploy') && - github.event.issue.pull_request != null - ) || - ( - github.event_name == 'pull_request_target' && - contains(fromJson(vars.AUTO_DEPLOY_PRS), github.event.pull_request.number) - ) - ) - permissions: - pull-requests: write - steps: - - name: Checkout Base To Temp - uses: actions/checkout@v2 - with: - path: temp-base-repo - - name: Get deployment alias - run: node temp-base-repo/scripts/githubActions.mjs getAlias - id: alias - env: - ALIASES: ${{ env.ALIASES }} - PULL_URL: ${{ github.event.issue.pull_request.url || github.event.pull_request.url }} - - name: Checkout PR (comment) - uses: actions/checkout@v2 - if: github.event_name == 'issue_comment' - with: - ref: refs/pull/${{ github.event.issue.number }}/head - - name: Checkout PR (pull_request) - uses: actions/checkout@v2 - if: github.event_name == 'pull_request_target' - with: - ref: refs/pull/${{ github.event.pull_request.number }}/head - - - name: Install pnpm - uses: pnpm/action-setup@v4 - - uses: actions/setup-node@v4 - with: - node-version: 22 - cache: "pnpm" - - name: Update deployAlwaysUpdate packages - run: | - if [ -f package.json ]; then - PACKAGES=$(node -e "const pkg = require('./package.json'); if (pkg.deployAlwaysUpdate) console.log(pkg.deployAlwaysUpdate.join(' '))") - if [ ! -z "$PACKAGES" ]; then - echo "Updating packages: $PACKAGES" - pnpm up -L $PACKAGES - else - echo "No deployAlwaysUpdate packages found in package.json" - fi - else - echo "package.json not found" - fi - - name: Install Global Dependencies - run: pnpm add -g vercel - - name: Pull Vercel Environment Information - run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }} - - name: Write Release Info - run: | - echo "{\"latestTag\": \"$(git rev-parse --short ${{ github.event.pull_request.head.sha }})\", \"isCommit\": true}" > assets/release.json - - name: Download Generated Sounds map - run: node scripts/downloadSoundsMap.mjs - - name: Build Project Artifacts - run: vercel build --token=${{ secrets.VERCEL_TOKEN }} - env: - CONFIG_JSON_SOURCE: BUNDLED - LOCAL_CONFIG_FILE: config.mcraft-only.json - - name: Copy playground files - run: | - mkdir -p .vercel/output/static/playground - pnpm build-playground - cp -r renderer/dist/* .vercel/output/static/playground/ - - name: Write pr redirect index.html - run: | - mkdir -p .vercel/output/static/pr - echo "" > .vercel/output/static/pr/index.html - - name: Write commit redirect index.html - run: | - mkdir -p .vercel/output/static/commit - echo "" > .vercel/output/static/commit/index.html - - name: Deploy Project Artifacts to Vercel - uses: mathiasvr/command-output@v2.0.0 - with: - run: vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} - id: deploy - - uses: mshick/add-pr-comment@v2 - # if: github.event_name == 'issue_comment' - with: - allow-repeats: true - message: | - Deployed to Vercel Preview: ${{ steps.deploy.outputs.stdout }} - [Playground](${{ steps.deploy.outputs.stdout }}/playground/) - [Storybook](${{ steps.deploy.outputs.stdout }}/storybook/) - # - run: git checkout next scripts/githubActions.mjs - - name: Set deployment alias - if: ${{ steps.alias.outputs.alias != '' && steps.alias.outputs.alias != 'mcraft.fun' && steps.alias.outputs.alias != 's.mcraft.fun' }} - run: | - for alias in $(echo ${{ steps.alias.outputs.alias }} | tr "," "\n"); do - vercel alias set ${{ steps.deploy.outputs.stdout }} $alias --token=${{ secrets.VERCEL_TOKEN }} --scope=zaro - done diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 3e8c4136..00000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,116 +0,0 @@ -name: Release -env: - VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} - VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} - MAIN_MENU_LINKS: ${{ vars.MAIN_MENU_LINKS }} -on: - push: - branches: [release] -jobs: - build-and-deploy: - runs-on: ubuntu-latest - permissions: write-all - steps: - - name: Checkout repository - uses: actions/checkout@master - - uses: actions/setup-node@v4 - with: - node-version: 22 - - name: Install pnpm - uses: pnpm/action-setup@v4 - - name: Install Global Dependencies - run: pnpm add -g vercel - # - run: pnpm install - # - run: pnpm build - - run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} - - run: node scripts/replaceFavicon.mjs ${{ secrets.FAVICON_MAIN }} - # will install + build to .vercel/output/static - - name: Get Release Info - run: pnpx zardoy-release empty --skip-github --output-file assets/release.json - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Download Generated Sounds map - run: node scripts/downloadSoundsMap.mjs - - run: vercel build --token=${{ secrets.VERCEL_TOKEN }} --prod - env: - CONFIG_JSON_SOURCE: BUNDLED - LOCAL_CONFIG_FILE: config.mcraft-only.json - - name: Copy playground files - run: | - mkdir -p .vercel/output/static/playground - pnpm build-playground - cp -r renderer/dist/* .vercel/output/static/playground/ - - # publish to github - - run: cp vercel.json .vercel/output/static/vercel.json - - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: .vercel/output/static - force_orphan: true - - # Create CNAME file for custom domain - - name: Create CNAME file - run: echo "github.mcraft.fun" > .vercel/output/static/CNAME - - - name: Deploy to mwc-mcraft-pages repository - uses: peaceiris/actions-gh-pages@v3 - with: - personal_token: ${{ secrets.MCW_MCRAFT_PAGE_DEPLOY_TOKEN }} - external_repository: ${{ github.repository_owner }}/mwc-mcraft-pages - publish_dir: .vercel/output/static - publish_branch: main - destination_dir: docs - force_orphan: true - - - name: Change index.html title - run: | - # change Minecraft Web Client to Minecraft Web Client — Free Online Browser Version - sed -i 's/Minecraft Web Client<\/title>/<title>Minecraft Web Client — Free Online Browser Version<\/title>/' .vercel/output/static/index.html - - - name: Deploy Project to Vercel - uses: mathiasvr/command-output@v2.0.0 - with: - run: vercel deploy --prebuilt --token=${{ secrets.VERCEL_TOKEN }} --prod - id: deploy - - name: Get releasing alias - run: node scripts/githubActions.mjs getReleasingAlias - id: alias - - name: Set deployment alias - run: | - for alias in $(echo ${{ steps.alias.outputs.alias }} | tr "," "\n"); do - vercel alias set ${{ steps.deploy.outputs.stdout }} $alias --token=${{ secrets.VERCEL_TOKEN }} --scope=zaro - done - - - name: Build single-file version - minecraft.html - run: pnpm build-single-file && mv dist/single/index.html minecraft.html - - name: Build self-host version - run: pnpm build - - name: Bundle server.js - run: | - pnpm esbuild server.js --bundle --platform=node --outfile=bundled-server.js --define:process.env.NODE_ENV="'production'" - - - name: Create zip package - run: | - mkdir -p package - cp -r dist package/ - cp bundled-server.js package/server.js - cd package - zip -r ../self-host.zip . - - - run: | - pnpx zardoy-release node --footer "This release URL: https://$(echo ${{ steps.alias.outputs.alias }} | cut -d',' -f1) (Vercel URL: ${{ steps.deploy.outputs.stdout }})" - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # has possible output: tag - id: release - - # has output - - name: Set publishing config - run: pnpm config set '//registry.npmjs.org/:_authToken' "${NODE_AUTH_TOKEN}" - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - # - run: pnpm tsx scripts/buildNpmReact.ts ${{ steps.release.outputs.tag }} - # if: steps.release.outputs.tag - # env: - # NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 33734572..00000000 --- a/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -node_modules/ -package-lock.json -.vscode -**/public -*.log -.env.local -Thumbs.db -build -localSettings.mjs -dist* -.DS_Store -.idea/ -/world -data*.json -out -*.iml -.vercel -generated -storybook-static -server-jar -config.local.json -logs/ - -src/react/npmReactComponents.ts diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 3ff87f13..00000000 --- a/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules/ -package-lock.json -.vscode \ No newline at end of file diff --git a/.npmrc b/.npmrc deleted file mode 100644 index b602bc2e..00000000 --- a/.npmrc +++ /dev/null @@ -1,3 +0,0 @@ -public-hoist-pattern=* -ignore-workspace-root-check=true -shell-emulator=true diff --git a/.storybook/main.ts b/.storybook/main.ts deleted file mode 100644 index 46d2bcd1..00000000 --- a/.storybook/main.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { StorybookConfig } from "@storybook/react-vite"; - -const config: StorybookConfig = { - stories: ["../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"], - addons: ["@storybook/addon-links", "@storybook/addon-essentials"], - framework: { - name: "@storybook/react-vite", - options: {}, - }, - docs: { - autodocs: "tag", - }, -}; -export default config; diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx deleted file mode 100644 index 05c36eba..00000000 --- a/.storybook/preview.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React from 'react' - -import type { Preview } from "@storybook/react" - -import './storybook.css' -import '../src/styles.css' -import '../src/scaleInterface' - -const preview: Preview = { - decorators: [ - (Story, c) => { - const noScaling = c.parameters.noScaling - return <div id={noScaling ? '' : 'ui-root'}> - <Story /> - </div> - }, - ], - parameters: { - actions: { argTypesRegex: "^on[A-Z].*" }, - controls: { - matchers: { - color: /(background|color)$/i, - date: /Date$/, - }, - }, - }, -} - -export default preview diff --git a/.storybook/storybook.css b/.storybook/storybook.css deleted file mode 100644 index 9a98f519..00000000 --- a/.storybook/storybook.css +++ /dev/null @@ -1,18 +0,0 @@ -#storybook-root::before { - content: ""; - position: fixed; - inset: 0; - background-image: url("../assets/storybook-bg.jpg"); - background-size: cover; - background-position: center; -} - -@font-face { - font-family: minecraft; - src: url(../assets/minecraftia.woff); -} - -@font-face { - font-family: mojangles; - src: url(../assets/mojangles.ttf); -} diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index dec88163..00000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "configurations": [ - // recommended as much faster - { - // to launch "C:\Program Files\Google\Chrome Beta\Application\chrome.exe" --remote-debugging-port=9222 - "type": "chrome", - "address": "localhost", - "name": "Attach Chrome", - "request": "attach", - // comment if using webpack - "pathMapping": { - "/": "${workspaceFolder}/dist" - }, - "outFiles": [ - "${workspaceFolder}/dist/**/*.js", - // "!${workspaceFolder}/dist/**/*vendors*", - "!${workspaceFolder}/dist/**/*mc-data*", - "!**/node_modules/**" - ], - "skipFiles": [ - // "<node_internals>/**/*vendors*" - "<node_internals>/**/*mc-data*" - ], - "port": 9222, - }, - { - // not recommended as in most cases it will slower as it launches from extension host so it slows down extension host, not sure why - "type": "chrome", - "name": "Launch Chrome", - "request": "launch", - "url": "http://localhost:3000/", - "pathMapping": { - "/": "${workspaceFolder}/dist" - }, - "outFiles": [ - "${workspaceFolder}/dist/**/*.js", - // "!${workspaceFolder}/dist/**/*vendors*", - "!${workspaceFolder}/dist/**/*mc-data*", - "!**/node_modules/**" - ], - "skipFiles": [ - // "<node_internals>/**/*vendors*" - "<node_internals>/**/*mc-data*" - ], - }, - { - // to launch "C:\Program Files\Mozilla Firefox\firefox.exe" -start-debugger-server - "type": "firefox", - "name": "Attach Firefox", - "request": "attach", - // comment if using webpack - "url": "http://localhost:3000/", - "webRoot": "${workspaceFolder}/", - "skipFiles": [ - // "<node_internals>/**/*vendors*" - "<node_internals>/**/*mc-data*" - ], - }, - ] -} diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index ca74a57d..00000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "viewer-server", - "command": "live-server --port=9090", - "type": "shell", - "args": [], - "problemMatcher": [], - // set cwd - "options": { - "cwd": "${workspaceFolder}/prismarine-viewer/public/" - }, - "presentation": { - "reveal": "silent" - }, - }, - { - "label": "viewer-esbuild", - "type": "shell", - "command": "node prismarine-viewer/esbuild.mjs -w", - "problemMatcher": "$esbuild-watch", - "presentation": { - "reveal": "silent" - }, - }, - { - "label": "viewer server+esbuild", - "dependsOn": [ - "viewer-server", - "viewer-esbuild" - ], - "dependsOrder": "parallel", - } - ] -} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index a5a3482d..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,195 +0,0 @@ -# Contributing Guide - -After forking the repository, run the following commands to get started: - -0. Ensure you have [Node.js](https://nodejs.org) installed. Enable corepack with `corepack enable` *(1). -1. Install dependencies: `pnpm i` -2. Start the project in development mode: `pnpm start` or build the project for production: `pnpm build` -3. Read the [Tasks Categories](#tasks-categories) and [Workflow](#workflow) sections below -4. Let us know if you are working on something and be sure to open a PR if you got any changes. Happy coding! - -*(1): If you are getting `Cannot find matching keyid` update corepack to the latest version with `npm i -g corepack`. - -*(2): If still something doesn't work ensure you have the right nodejs version with `node -v` (tested on 22.x) - -<!-- *(3): For GitHub codespaces (cloud ide): Run `pnpm i @rsbuild/core@1.2.4 @rsbuild/plugin-node-polyfill@1.3.0 @rsbuild/plugin-react@1.1.0 @rsbuild/plugin-typed-css-modules@1.0.2` command to avoid crashes because of limited ram --> - -## Project Structure - -There are 3 main parts of the project: - -### Core (`src`) - -This is the main app source code which reuses all the other parts of the project. - -> The first version used Webpack, then was migrated to Esbuild and now is using Rsbuild! - -- Scripts: - - Start: `pnpm start`, `pnpm dev-rsbuild` (if you don't need proxy server also running) - - Build: `pnpm build` (note that `build` script builds only the core app, not the whole project!) - -Paths: - -- `src` - main app source code -- `src/react` - React components - almost all UI is in this folder. Almost every component has its base (reused in app and storybook) and `Provider` - which is a component that provides context to its children. Consider looking at DeathScreen component to see how it's used. - -### Renderer: Playground & Mesher (`renderer`) - -- Playground Scripts: - - Start: `pnpm run-playground` (playground, mesher + server) or `pnpm watch-playground` - - Build: `pnpm build-playground` or `node renderer/esbuild.mjs` - -- Mesher Scripts: - - Start: `pnpm watch-mesher` - - Build: `pnpm build-mesher` - -Paths: - -- `renderer` - Improved and refactored version of <https://github.com/PrismarineJS/prismarine-viewer>. Here is everything related to rendering the game world itself (no ui at all). Two most important parts here are: -- `renderer/viewer/lib/worldrenderer.ts` - adding new objects to three.js happens here (sections) -- `renderer/viewer/lib/models.ts` - preparing data for rendering (blocks) - happens in worker: out file - `worker.js`, building - `renderer/buildWorker.mjs` -- `renderer/playground/playground.ts` - Playground (source of <mcraft.fun/playground.html>) Use this for testing any rendering changes. You can also modify the playground code. - -### Storybook (`.storybook`) - -Storybook is a tool for easier developing and testing React components. -Path of all Storybook stories is `src/react/**/*.stories.tsx`. - -- Scripts: - - Start: `pnpm storybook` - - Build: `pnpm build-storybook` - -## Core-related - -How different modules are used: - -- `mineflayer` - provider `bot` variable and as mineflayer states it is a wrapper for the `node-minecraft-protocol` module and is used to connect and interact with real Java Minecraft servers. However not all events & properties are exposed and sometimes you have to use `bot._client.on('packet_name', data => ...)` to handle packets that are not handled via mineflayer API. Also you can use almost any mineflayer plugin. - -## Running Main App + Playground - -To start the main web app and playground, run `pnpm run-all`. Note is doesn't start storybook and tests. - -## Cypress Tests (E2E) - -Cypress tests are located in `cypress` folder. To run them, run `pnpm test-mc-server` and then `pnpm test:cypress` when the `pnpm prod-start` is running (or change the port to 3000 to test with the dev server). Usually you don't need to run these until you get issues on the CI. - -## Unit Tests - -There are not many unit tests for now (which we are trying to improve). -Location of unit tests: `**/*.test.ts` files in `src` folder and `renderer` folder. -Start them with `pnpm test-unit`. - -## Making protocol-related changes - -You can get a description of packets for the latest protocol version from <https://wiki.vg/Protocol> and for previous protocol versions from <https://wiki.vg/Protocol_version_numbers> (look for *Page* links that have *Protocol* in URL). - -Also there are [src/generatedClientPackets.ts](src/generatedClientPackets.ts) and [src/generatedServerPackets.ts](src/generatedServerPackets.ts) files that have definitions of packets that come from the server and the client respectively. These files are generated from the protocol files. Protocol, blocks info and other data go from <https://github.com/prismarineJS/minecraft-data> repository. - -## A few other notes - -- To link dependency locally e.g. flying-squid add this to `pnpm` > `overrides` of root package.json: `"flying-squid": "file:../space-squid",` (with some modules `pnpm link` also works) - -- Press `Y` to reload application into the same world (server, local world or random singleplayer world) -- To start React profiling disable `REACT_APP_PROFILING` code first. -- It's recommended to use debugger for debugging. VSCode has a great debugger built-in. If debugger is slow, you can use `--no-sources` flag that would allow browser to speedup .map file parsing. -- Some data are cached between restarts. If you see something doesn't work after upgrading dependencies, try to clear the by simply removing the `dist` folder. -- The same folder `dist` is used for both development and production builds, so be careful when deploying the project. -- Use `start-prod` script to start the project in production mode after running the `build` script to build the project. -- If CI is failing on the next branch for some reason, feel free to use the latest commit for release branch. We will update the base branch asap. Please, always make sure to allow maintainers do changes when opening PRs. - -## Tasks Categories - -(most important for now are on top). - -## 1. Client-side Logic (most important right now) - -Everything related to the client side packets. Investigate issues when something goes wrong with some server. It's much easier to work on these types of tasks when you have experience in Java with Minecraft, a deep understanding of the original client, and know how to debug it (which is not hard actually). Right now the client is easily detectable by anti-cheat plugins, and the main goal is to fix it (mostly because of wrong physics implementation). - -Priority tasks: - -- Rewrite or fix the physics logic (Botcraft or Grim can be used as a reference as well) -- Implement basic minecart / boat / horse riding -- Fix auto jump module (false triggers, performance issues) -- Investigate connection issues to some servers -- Setup a platform for automatic cron testing against the latest version of the anti-cheat plugins -- ... - -Goals: - -- Make more servers playable. Right now on hypixel-like servers (servers with minigames), only tnt run (and probably ) is fully playable. - -Notes: - -- You can see the incoming/outgoing packets in the console (F12 in Chrome) by enabling `options.debugLogNotFrequentPackets = true`. However, if you need a FULL log of all packets, you can start recording the packets by going into `Settings` > `Advanced` > `Enable Packets Replay` and then you can download the file and use it to replay the packets. -- You can use mcraft-e2e studio to send the same packets over and over again (which is useful for testing) or use the packets replayer (which is useful for debugging). - -## 2. Three.js Renderer - -Example tasks: - -- Improve / fix entity rendering -- Better update entities on specific packets -- Investigate performance issues under different conditions (instructions provided) -- Work on the playground code - -Goals: - -- Fix a lot of entity rendering issues (including position updates) -- Implement switching camera mode (first person, third person, etc) -- Animated blocks -- Armor rendering -- ... - -Note: - -- It's useful to know how to use helpers & additional cameras (e.g. setScissor) - -## 3. Server-side Logic - -Flying squid fork (space-squid). -Example tasks: - -- Add missing commands (e.g. /scoreboard) -- Basic physics (player fall damage, falling blocks & entities) -- Basic entities AI (spawning, attacking) -- Pvp -- Emit more packets on some specific events (e.g. when a player uses an item) -- Make more maps playable (e.g. fix when something is not implemented in both server and client and blocking map interaction) -- ... - -Long Term Goals: - -- Make most adventure maps playable -- Make a way to complete the game from the scratch (crafting, different dimensions, terrain generation, etc) -- Make bedwars playable! -Most of the tasks are straightforward to implement, just be sure to use a debugger ;). If you feel you are stuck, ask for help on Discord. Absolutely any tests / refactor suggestions are welcome! - -## 4. Frontend - -New React components, improve UI (including mobile support). - -## Workflow - -1. Locate the problem on the public test server & make an easily reproducible environment (you can also use local packets replay server or your custom server setup). Dm me for details on public test server / replay server -2. Debug the code, find an issue in the code, isolate the problem -3. Develop, try to fix and test. Finally we should find a way to fix it. It's ideal to have an automatic test but it's not necessary for now -3. Repeat step 1 to make sure the task is done and the problem is fixed (or the feature is implemented) - -## Updating Dependencies - -1. Use `pnpm update-git-deps` to check and update git dependencies (like mineflayer fork, prismarine packages etc). The script will: - - Show which git dependencies have updates available - - Ask if you want to update them - - Skip dependencies listed in `pnpm.updateConfig.ignoreDependencies` - -2. Update PrismarineJS dependencies to the latest version: `minecraft-data` (be sure to replace the version twice in the package.json), `mineflayer`, `minecraft-protocol`, `prismarine-block`, `prismarine-chunk`, `prismarine-item`, ... - -3. If `minecraft-protocol` patch fails, do this: - 1. Remove the patch from `patchedDependencies` in `package.json` - 2. Run `pnpm patch minecraft-protocol`, open patch directory - 3. Apply the patch manually in this directory: `patch -p1 < minecraft-protocol@<version>.patch` - 4. Run the suggested command from `pnpm patch ...` (previous step) to update the patch - -### Would be useful to have - -- cleanup folder & modules structure, cleanup playground code diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 22bcfac6..00000000 --- a/Dockerfile +++ /dev/null @@ -1,43 +0,0 @@ -# ---- Build Stage ---- -FROM node:18-alpine AS build -# Without git installing the npm packages fails -RUN apk add git -WORKDIR /app -COPY . /app -# install pnpm with corepack -RUN corepack enable -# Build arguments -ARG DOWNLOAD_SOUNDS=false -ARG DISABLE_SERVICE_WORKER=false -ARG CONFIG_JSON_SOURCE=REMOTE -# TODO need flat --no-root-optional -RUN node ./scripts/dockerPrepare.mjs -RUN pnpm i -# Download sounds if flag is enabled -RUN if [ "$DOWNLOAD_SOUNDS" = "true" ] ; then node scripts/downloadSoundsMap.mjs ; fi - -# TODO for development -# EXPOSE 9090 -# VOLUME /app/src -# VOLUME /app/renderer -# ENTRYPOINT ["pnpm", "run", "run-all"] - -# only for prod -RUN DISABLE_SERVICE_WORKER=$DISABLE_SERVICE_WORKER \ - CONFIG_JSON_SOURCE=$CONFIG_JSON_SOURCE \ - pnpm run build - -# ---- Run Stage ---- -FROM node:18-alpine -RUN apk add git -WORKDIR /app -# Copy build artifacts from the build stage -COPY --from=build /app/dist /app/dist -COPY server.js /app/server.js -# Install express -RUN npm i -g pnpm@10.8.0 -RUN npm init -yp -RUN pnpm i express github:zardoy/prismarinejs-net-browserify compression cors -EXPOSE 8080 -VOLUME /app/public -ENTRYPOINT ["node", "server.js", "--prod"] diff --git a/Dockerfile.proxy b/Dockerfile.proxy deleted file mode 100644 index 746eef72..00000000 --- a/Dockerfile.proxy +++ /dev/null @@ -1,11 +0,0 @@ -# ---- Run Stage ---- -FROM node:18-alpine -RUN apk add git -WORKDIR /app -COPY server.js /app/server.js -# Install server dependencies -RUN npm i -g pnpm@9.0.4 -RUN npm init -yp -RUN pnpm i express github:zardoy/prismarinejs-net-browserify compression cors -EXPOSE 8080 -ENTRYPOINT ["node", "server.js"] diff --git a/LICENSE b/LICENSE deleted file mode 100644 index ee939a65..00000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020 PrismarineJS - -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/README.MD b/README.MD deleted file mode 100644 index 018784e3..00000000 --- a/README.MD +++ /dev/null @@ -1,238 +0,0 @@ -# Minecraft Web Client - -![banner](./docs-assets/banner.jpg) - -Minecraft **clone** rewritten in TypeScript using the best modern web technologies. Minecraft vanilla-compatible client and integrated server packaged into a single web app. - -You can try this out at [mcraft.fun](https://mcraft.fun/), [pcm.gg](https://pcm.gg) (short link), [mcon.vercel.app](https://mcon.vercel.app/) or the GitHub pages deploy. Every commit from the default (`develop`) branch is deployed to [s.mcraft.fun](https://s.mcraft.fun/) and [s.pcm.gg](https://s.pcm.gg/) - so it's usually newer, but might be less stable. - -> For Turkey/Russia use [ru.mcraft.fun](https://ru.mcraft.fun/) (since Cloudflare is blocked) - -Don't confuse with [Eaglercraft](https://git.eaglercraft.rip/eaglercraft/eaglercraft-1.8) which is a REAL vanilla Minecraft Java edition port to the web (but with its own limitations). Eaglercraft is a fully playable solution, meanwhile this project is aimed for *device-compatiiblity* and better performance so it feels portable, flexible and lightweight. It's also a very strong example on how to build true HTML games for the web at scale entirely with the JS ecosystem. Have fun! - -For building the project yourself / contributing, see [Development, Debugging & Contributing](#development-debugging--contributing). For reference at what and how web technologies / frameworks are used, see [TECH.md](./TECH.md) (also for comparison with Eaglercraft). - -> **Note**: You can deploy it on your own server in less than a minute using a one-liner script from [Minecraft Everywhere repo](https://github.com/zardoy/minecraft-everywhere) - -### Big Features - -- Official Mineflayer [plugin integration](https://github.com/zardoy/mcraft-fun-mineflayer-plugin)! View / Control your bot remotely. -- Open any zip world file or even folder in read-write mode! -- Connect to Java servers running in both offline (cracked) and online mode* (it's possible because of proxy servers, see below) -- Integrated JS server clone capable of opening Java world saves in any way (folders, zip, web chunks streaming, etc) -- Singleplayer mode with simple world generations! -- Works offline -- First-class touch (mobile) & controller support -- First-class keybindings configuration -- Advanced Resource pack support: Custom GUI, all textures. Server resource packs are supported with proper CORS configuration. -- Builtin JEI with recipes & descriptions for almost every item (JEI is creative inventory replacement) -- Custom protocol channel extensions (eg for custom block models in the world) -- Play with friends over internet! (P2P is powered by Peer.js discovery servers) -- ~~Google Drive support for reading / saving worlds back to the cloud~~ -- Support for custom rendering 3D engines. Modular architecture. -- even even more! - -All components that are in [Storybook](https://minimap.mcraft.fun/storybook/) are published as npm module and can be used in other projects: [`minecraft-react`](https://npmjs.com/minecraft-react) - -### Recommended Settings - -- Controls -> **Touch Controls Type** -> **Joystick** -- Controls -> **Auto Full Screen** -> **On** - To avoid ctrl+w issue -- Interface -> **Enable Minimap** -> **Always** - To enable useful minimap (why not?) -- Controls -> **Raw Input** -> **On** - This will make the controls more precise (UPD: already enabled by default) -- Interface -> **Chat Select** -> **On** - To select chat messages (UPD: already enabled by default) - -### Browser Notes - -This project is tested with BrowserStack. Special thanks to [BrowserStack](https://www.browserstack.com/) for providing testing infrastructure! - -Howerver, it's known that these browsers have issues: - -**Opera Mini**: Disable *mouse gestures* in browsre settings to avoid opening new tab on right click hold - -**Vivaldi**: Disable Controls -> *Raw Input* in game settings if experiencing issues - -### Versions Support - -Server versions 1.8 - 1.21.5 are supported. -First class versions (most of the features are tested on these versions): - -- 1.19.4 -- 1.21.4 - -Versions below 1.13 are not tested currently and may not work correctly. - -### World Loading - -Zip files and folders are supported. Just drag and drop them into the browser window. You can open folders in readonly and read-write mode. New chunks may be generated incorrectly for now. -In case of opening zip files they are stored in your ram entirely, so there is a ~300mb file limit on IOS. -Whatever offline mode you used (zip, folder, just single player), you can always export world with the `/export` command typed in the game chat. - -![docs-assets/singleplayer-future-city-1-10-2.jpg](./docs-assets/singleplayer-future-city-1-10-2.jpg) - -### Servers & Proxy - -You can play almost on any Java server, vanilla servers are fully supported. -See the [Mineflayer](https://github.com/PrismarineJS/mineflayer) repo for the list of supported versions (should support majority of versions). -There is a builtin proxy, but you can also host your one! Just clone the repo, run `pnpm i` (following CONTRIBUTING.MD) and run `pnpm prod-start`, then you can specify `http://localhost:8080` in the proxy field. Or you can deploy it to the cloud service: - -[![Deploy to Koyeb](https://www.koyeb.com/static/images/deploy/button.svg)](https://app.koyeb.com/deploy?name=minecraft-web-client&type=git&repository=zardoy%2Fminecraft-web-client&branch=next&builder=dockerfile&env%5B%5D=&ports=8080%3Bhttp%3B%2F) - -> **Note**: If you want to make **your own** Minecraft server accessible to web clients (without our proxies), you can use [mwc-proxy](https://github.com/zardoy/mwc-proxy) - a lightweight JS WebSocket proxy that runs on the same server as your Minecraft server, allowing players to connect directly via `wss://play.example.com`. `?client_mcraft` is added to the URL, so the proxy will know that it's this client. - -Proxy servers are used to connect to Minecraft servers which use TCP protocol. When you connect connect to a server with a proxy, websocket connection is created between you (browser client) and the proxy server located in Europe, then the proxy connects to the Minecraft server and sends the data to the client (you) without any packet deserialization to avoid any additional delays. That said all the Minecraft protocol packets are processed by the client, right in your browser. - -```mermaid -graph LR - A[Web App - Client] --> C[Proxy Server] - C --> B[Minecraft Server] - style A fill:#f9d,stroke:#333,stroke-width:2px - style B fill:#fc0,stroke:#333,stroke-width:2px - style C fill:#fff,stroke:#333,stroke-width:2px -``` - -So if the server is located in Europe and you are connecting from Europe, you will have ~40ms ping (~180ms with residential proxy version), however if you are in the US and connecting to the server located in US, you will have >200ms ping, which is the worst case scenario. - -Again, the proxy server is not a part of the client, it is a separate service that you can host yourself. - -### Docker Files - -- [Main Dockerfile](./Dockerfile) - for production build & offline/private usage. Includes full web-app + proxy server for connecting to Minecraft servers. -- [Proxy Dockerfile](./Dockerfile.proxy) - for proxy server only - that one you would be able to specify in the proxy field on the client (`docker build . -f Dockerfile.proxy -t minecraft-web-proxy`) - -In case of using docker, you don't have to follow preparation steps from CONTRIBUTING.MD, like installing Node.js, pnpm, etc. - -### Rendering - -#### Three.js Renderer - -- Uses WebGL2. Chunks are rendered using Geometry Buffers prepared by 4 mesher workers. -- Entities & text rendering -- Supports resource packs -- Doesn't support occlusion culling - -### Advanced Settings - -There are many many settings, that are not exposed in the UI yet. You can find or change them by opening the browser console and typing `options`. You can also change them by typing `options.<setting_name> = <value>`. - -### Console - -To open the console, press `F12`, or if you are on mobile, you can type `#dev` in the URL (browser address bar), it wont't reload the page, but you will see a button to open the console. This way you can change advanced settings and see all errors or warnings. Also this way you can access global variables (described below). - -### Development, Debugging & Contributing - -It should be easy to build/start the project locally. See [CONTRIBUTING.MD](./CONTRIBUTING.md) for more info. Also you can look at Dockerfile for reference. - -There is world renderer playground ([link](https://mcon.vercel.app/playground/)). - -However, there are many things that can be done in online production version (like debugging actual source code). Also you can access some global variables in the console and there are a few useful examples: - -- If you type `debugToggle`, press enter in console - It will enables all debug messages! Warning: this will start all packets spam. -Instead I recommend setting `options.debugLogNotFrequentPackets`. Also you can use `debugTopPackets` (with JSON.stringify) to see what packets were received/sent by name - -- `bot` - Mineflayer bot instance. See Mineflayer documentation for more. -- `world` - Three.js world instance, basically does all the rendering (part of renderer backend). -- `world.sectionObjects` - Object with all active chunk sections (geometries) in the world. Each chunk section is a Three.js mesh or group. -- `debugSceneChunks` - The same as above, but relative to current bot position (e.g. 0,0 is the current chunk). -- `debugChangedOptions` - See what options are changed. Don't change options here. -- `localServer`/`server` - Only for singleplayer mode/host. Flying Squid server instance, see it's documentation for more. -- `localServer.overworld.storageProvider.regions` - See ALL LOADED region files with all raw data. -- `localServer.levelData.LevelName = 'test'; localServer.writeLevelDat()` - Change name of the world - -- `nbt.simplify(someNbt)` - Simplifies nbt data, so it's easier to read. - -The most useful thing in devtools is the watch expression. You can add any expression there and it will be re-evaluated in real time. For example, you can add `world.getCameraPosition()` to see the camera position and so on. - -<img src="./docs-assets/watch-expr.png" alt="Watch expression" width="480"/> - -You can also drag and drop any .dat or .mca (region files) into the browser window to see it's contents in the console. - -### F3 Keybindings - -- `F3` - Toggle debug overlay -- `F3 + A` - Reload all chunks (these that are loaded from the server) -<!-- <!-- - `F3 + N` - Restart local server (basically resets the world!) --> -- `F3 + G` - Toggle chunk sections (geometries) border visibility + entities outline (aka Three.js geometry helpers) - -world chunks have a *yellow* border, hostile mobs have a *red* outline, passive mobs have a *green* outline, players have a *blue* outline. - -### Query Parameters - -Press `Y` to set query parameters to url of your current game state. - -There are some parameters you can set in the url to archive some specific behaviors: - -General: - -- **`?setting=<setting_name>:<setting_value>`** - Set and lock the setting on load. You can set multiple settings by separating them with `&` e.g. `?setting=autoParkour:true&setting=renderDistance:4` -- `?modal=<modal>` - Open specific modal on page load eg `keybindings`. Very useful on UI changes testing during dev. For path use `,` as separator. To get currently opened modal type this in the console: `activeModalStack.at(-1).reactType` -- `?replayFileUrl=<url>` - Load and start a packet replay session from a URL with a integrated server. For debugging / previewing recorded sessions. The file must be CORS enabled. - -Server specific: - -- `?ip=<server_address>` - Display connect screen to the server on load with predefined server ip. `:<port>` is optional and can be added to the ip. -- `?name=<name>` - Set the server name for saving to the server list -- `?version=<version>` - Set the version for the server -- `?proxy=<proxy_address>` - Set the proxy server address to use for the server -- `?username=<username>` - Set the username for the server -- `?lockConnect=true` - Only works then `ip` parameter is set. Disables cancel/save buttons and all inputs in the connect screen already set as parameters. Useful for integrates iframes. -- `?autoConnect=true` - Only works then `ip` and `version` parameters are set and `allowAutoConnect` is `true` in config.json! Directly connects to the specified server. Useful for integrates iframes. -- `?serversList=<list_or_url>` - `<list_or_url>` can be a list of servers in the format `ip:version,ip` or a url to a json file with the same format (array) or a txt file with line-delimited list of server IPs. -- `?addPing=<ping>` - Add a latency to both sides of the connection. Useful for testing ping issues. For example `?addPing=100` will add 200ms to your ping. - -Single player specific: - -- `?loadSave=<save_name>` - Load the save on load with the specified folder name (not title) -- `?singleplayer=1` or `?sp=1` - Create empty world on load. Nothing will be saved -- `?version=<version>` - Set the version for the singleplayer world (when used with `?singleplayer=1`) -- `?noSave=true` - Disable auto save on unload / disconnect / export whenever a world is loaded. Only manual save with `/save` command will work. -- `?serverSetting=<key>:<value>` - Set local server [options](https://github.com/zardoy/space-squid/tree/everything/src/modules.ts#L51). For example `?serverSetting=noInitialChunksSend:true` will disable initial chunks loading on the loading screen. -- `?map=<map_url>` - Load the map from ZIP. You can use any url, but it must be **CORS enabled**. -- `?mapDir=<index_file_url>` - Load the map from a file descriptor. It's recommended and the fastest way to load world but requires additional setup. The file must be in the following format: - -```json -{ - "baseUrl": "<url>", - "index": { - "level.dat": null, - "region": { - "r.-1.-1.mca": null, - "r.-1.0.mca": null, - "r.0.-1.mca": null, - "r.0.0.mca": null, - } - } -} -``` - -Note that `mapDir` also accepts base64 encoded JSON like so: -`?mapDir=data:application/json;base64,...` where `...` is the base64 encoded JSON of the index file. -In this case you must use `?mapDirBaseUrl` to specify the base URL to fetch the files from index. - -- `?mapDirBaseUrl` - See above. - -Only during development: - -- `?reconnect=true` - Reconnect to the server on page reloads. Very useful on server testing. - -<!-- - `?mapDirGuess=<base_url>` - Load the map from the provided URL and paths will be guessed with a few additional fetch requests. --> - -### Notable Things that Power this Project - -- [Mineflayer](https://github.com/PrismarineJS/mineflayer) - Handles all client-side communications with the server (including the builtin one) - forked -- [Forked Flying Squid (Space Squid)](https://github.com/zardoy/space-squid) - The builtin offline server that makes single player & P2P possible! -- [Prismarine Provider Anvil](https://github.com/PrismarineJS/prismarine-provider-anvil) - Handles world loading (region format) -- [Prismarine Physics](https://github.com/PrismarineJS/prismarine-physics) - Does all the physics calculations -- [Minecraft Protocol](https://github.com/PrismarineJS/node-minecraft-protocol) - Makes connections to servers possible -- [Peer.js](https://peerjs.com/) - P2P networking (when you open to wan) -- [Three.js](https://threejs.org/) - Helping in 3D rendering - -### Things that are not planned yet - -- Mods, plugins (basically JARs) support, shaders - since they all are related to specific game pipelines - -### Alternatives - -- [https://github.com/ClassiCube/ClassiCube](ClassiCube - Better C# Rewrite) [DEMO](https://www.classicube.net/server/play/?warned=true) -- [https://m.eaglercraft.com/](EaglerCraft) - Eaglercraft runnable on mobile (real Minecraft in the browser) -- [js-minecraft](https://github.com/LabyStudio/js-minecraft) - An insanely well done clone from the graphical side that inspired many features here diff --git a/README.NPM.MD b/README.NPM.MD deleted file mode 100644 index dc2c7c72..00000000 --- a/README.NPM.MD +++ /dev/null @@ -1,36 +0,0 @@ -# Minecraft React - -Minecraft UI components for React extracted from [mcraft.fun](https://mcraft.fun) project. - -```bash -pnpm i minecraft-react -``` - -![demo](./docs-assets/npm-banner.jpeg) - -## Usage - -```jsx -import { Scoreboard } from 'minecraft-react' - -const App = () => { - return ( - <Scoreboard - open - title="Scoreboard" - items={[ - { name: 'Player 1', value: 10 }, - { name: 'Player 2', value: 20 }, - { name: 'Player 3', value: 30 }, - ]} - /> - ) -} -``` - -See [Storybook](https://mcraft.fun/storybook/) or [Storybook (Mirror link)](https://mcon.vercel.app/storybook/) for more examples and full components list. Also take a look at the full [standalone example](https://github.com/zardoy/minecraft-web-client/tree/experiments/UiStandaloneExample.tsx). - -There are two types of components: - -- Small UI components or HUD components -- Full screen components (like sign editor, worlds selector) diff --git a/TECH.md b/TECH.md deleted file mode 100644 index 2d15993a..00000000 --- a/TECH.md +++ /dev/null @@ -1,58 +0,0 @@ -### Eaglercraft Comparison - -This project uses proxies so you can connect to almost any vanilla server. Though proxies have some limitations such as increased latency and servers will complain about using VPN (though we have a workaround for that, but ping will be much higher). -This client generally has better performance but some features reproduction might be inaccurate eg its less stable and more buggy in some cases. - -| Feature | This project | Eaglercraft | Description | -| --------------------------------- | ----------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| General | | | | -| Mobile Support (touch) | ✅(+) | ✅ | | -| Gamepad Support | ✅ | ❌ | | -| A11Y | ✅ | ❌ | We have DOM for almost all UI so your extensions and other browser features will work natively like on any other web page (but maybe it's not needed) | -| Game Features | | | | -| Servers Support (quality) | ❌(+) | ✅ | Eaglercraft is vanilla Minecraft, while this project tries to emulate original game behavior at protocol level (Mineflayer is used) | -| Servers Support (any version, ip) | ✅ | ❌ | We support almost all Minecraft versions, only important if you connect to a server where you need new content like blocks or if you play with friends. And you can connect to almost any server using proxy servers! | -| Servers Support (online mode) | ✅ | ❌ | Join to online servers like Hypixel using your Microsoft account without additional proxies | -| Singleplayer Survival Features | ❌ | ✅ | Just like Eaglercraft this project can generate and save worlds, but generator is simple and only a few survival features are supported (look here for [supported features list](https://github.com/zardoy/space-squid)) | -| Singleplayer Maps | ✅ | ✅ | We support any version, but adventure maps won't work, but simple parkour and build maps might be interesting to explore... | -| Singleplayer Maps World Streaming | ✅ | ❌ | Thanks to Browserfs, saves can be loaded to local singleplayer server using multiple ways: from local folder, server directory (not zip), dropbox or other cloud *backend* etc... | -| P2P Multiplayer | ✅ | ✅ | A way to connect to other browser running the project. But it's almost useless here since many survival features are not implemented. Maybe only to build / explore maps together... | -| Voice Chat | ❌(+) | ✅ | Eaglercraft has custom WebRTC voice chat implementation, though it could also be easily implemented there | -| Online Servers | ✅ | ❌ | We have custom implementation (including integration on proxy side) for joining to servers | -| Plugin Features | ✅ | ❌ | We have Mineflayer plugins support, like Auto Jump & Auto Parkour was added here that way | -| Direct Connection | ✅ | ✅ | We have DOM for almost all UI so your extensions and other browser features will work natively like on any other web page | -| Moding | ✅(own js mods) | ❌ | This project will support mods for singleplayer. In theory its possible to implement support for modded servers on protocol level (including all needed mods) | -| Video Recording | ❌ | ✅ | Doesn't feel needed | -| Metaverse Features | ✅(50%) | ❌ | We have videos / images support inside world, but not iframes (custom protocol channel) | -| Sounds | ✅ | ✅ | | -| Resource Packs | ✅(+extras) | ✅ | This project has very limited support for them (only textures images are loadable for now) | -| Assets Compressing & Splitting | ✅ | ❌ | We have advanced Minecraft data processing and good code chunk splitting so the web app will open much faster and use less memory | -| Graphics | | | | -| Fancy Graphics | ❌ | ✅ | While Eaglercraft has top-level shaders we don't even support lighting | -| Fast & Efficient Graphics | ❌(+) | ❌ | Feels like no one needs to have 64 rendering distance work smoothly | -| VR | ✅(-) | ❌ | Feels like not needed feature. UI is missing in this project since DOM can't be rendered in VR so Eaglercraft could be better in that aspect | -| AR | ❌ | ❌ | Would be the most useless feature | -| Minimap & Waypoints | ✅(-) | ❌ | We have buggy minimap, which can be enabled in settings and full map is opened by pressing `M` key | - -Features available to only this project: - -- CSS & JS Customization -- JS Real Time Debugging & Console Scripting (eg Devtools) - -### Tech Stack - -Bundler: Rsbuild! -UI: powered by React and css modules. Storybook helps with UI development. - -### Rare WEB Features - -There are a number of web features that are not commonly used but you might be interested in them if you decide to build your own game in the web. - -TODO - -| API | Usage & Description | -| ------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- | -| `Crypto` API | Used to make chat features work when joining online servers with authentication. | -| `requestPointerLock({ unadjustedMovement: true })` API | Required for games. Disables system mouse acceleration (important for Mac users). Aka mouse raw input | -| `navigator.keyboard.lock()` | (only in Chromium browsers) When entering fullscreen it allows to use any key combination like ctrl+w in the game | -| `navigator.keyboard.getLayoutMap()` | (only in Chromium browsers) To display the right keyboard symbol for the key keybinding on different keyboard layouts (e.g. QWERTY vs AZERTY) | diff --git a/assets/background/panorama_0.png b/assets/background/panorama_0.png deleted file mode 100644 index 185a3dda..00000000 Binary files a/assets/background/panorama_0.png and /dev/null differ diff --git a/assets/background/panorama_1.png b/assets/background/panorama_1.png deleted file mode 100644 index c5cbfd0d..00000000 Binary files a/assets/background/panorama_1.png and /dev/null differ diff --git a/assets/background/panorama_2.png b/assets/background/panorama_2.png deleted file mode 100644 index f8fb7f79..00000000 Binary files a/assets/background/panorama_2.png and /dev/null differ diff --git a/assets/background/panorama_3.png b/assets/background/panorama_3.png deleted file mode 100644 index c029be04..00000000 Binary files a/assets/background/panorama_3.png and /dev/null differ diff --git a/assets/background/panorama_4.png b/assets/background/panorama_4.png deleted file mode 100644 index bed2ae74..00000000 Binary files a/assets/background/panorama_4.png and /dev/null differ diff --git a/assets/background/panorama_5.png b/assets/background/panorama_5.png deleted file mode 100644 index 3e7bdec7..00000000 Binary files a/assets/background/panorama_5.png and /dev/null differ diff --git a/assets/button_click.mp3 b/assets/button_click.mp3 deleted file mode 100644 index e60582fd..00000000 Binary files a/assets/button_click.mp3 and /dev/null differ diff --git a/assets/config.html b/assets/config.html deleted file mode 100644 index 9bd2dd8e..00000000 --- a/assets/config.html +++ /dev/null @@ -1,39 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>Configure client - - - -
- - - - - -
- - - diff --git a/assets/customTextures/readme.md b/assets/customTextures/readme.md deleted file mode 100644 index e2a78c20..00000000 --- a/assets/customTextures/readme.md +++ /dev/null @@ -1,2 +0,0 @@ -here you can place custom textures for bundled files (blocks/items) e.g. blocks/stone.png -get file names from here (blocks/items) https://zardoy.github.io/mc-assets/ diff --git a/assets/debug-inputs.html b/assets/debug-inputs.html deleted file mode 100644 index 584fe4d7..00000000 --- a/assets/debug-inputs.html +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - Web Input Debugger - - - -
- -
- -
-
W
-
A
-
S
-
D
-
- -
-
Ctrl
-
- -
-
Space
-
- - - - diff --git a/assets/destroy_stage_0.png b/assets/destroy_stage_0.png deleted file mode 100644 index f65b7ede..00000000 Binary files a/assets/destroy_stage_0.png and /dev/null differ diff --git a/assets/destroy_stage_1.png b/assets/destroy_stage_1.png deleted file mode 100644 index 7c915961..00000000 Binary files a/assets/destroy_stage_1.png and /dev/null differ diff --git a/assets/destroy_stage_2.png b/assets/destroy_stage_2.png deleted file mode 100644 index dadd6b05..00000000 Binary files a/assets/destroy_stage_2.png and /dev/null differ diff --git a/assets/destroy_stage_3.png b/assets/destroy_stage_3.png deleted file mode 100644 index 52a40b65..00000000 Binary files a/assets/destroy_stage_3.png and /dev/null differ diff --git a/assets/destroy_stage_4.png b/assets/destroy_stage_4.png deleted file mode 100644 index e37c88a2..00000000 Binary files a/assets/destroy_stage_4.png and /dev/null differ diff --git a/assets/destroy_stage_5.png b/assets/destroy_stage_5.png deleted file mode 100644 index 9590d2f7..00000000 Binary files a/assets/destroy_stage_5.png and /dev/null differ diff --git a/assets/destroy_stage_6.png b/assets/destroy_stage_6.png deleted file mode 100644 index fb00ade5..00000000 Binary files a/assets/destroy_stage_6.png and /dev/null differ diff --git a/assets/destroy_stage_7.png b/assets/destroy_stage_7.png deleted file mode 100644 index 0b40c789..00000000 Binary files a/assets/destroy_stage_7.png and /dev/null differ diff --git a/assets/destroy_stage_8.png b/assets/destroy_stage_8.png deleted file mode 100644 index c0bf1dec..00000000 Binary files a/assets/destroy_stage_8.png and /dev/null differ diff --git a/assets/destroy_stage_9.png b/assets/destroy_stage_9.png deleted file mode 100644 index e3185f82..00000000 Binary files a/assets/destroy_stage_9.png and /dev/null differ diff --git a/assets/edition.png b/assets/edition.png deleted file mode 100644 index 995cdb17..00000000 Binary files a/assets/edition.png and /dev/null differ diff --git a/assets/favicon.png b/assets/favicon.png deleted file mode 100644 index 046cacd0..00000000 Binary files a/assets/favicon.png and /dev/null differ diff --git a/assets/generic_91.png b/assets/generic_91.png deleted file mode 100644 index 99e4d04a..00000000 Binary files a/assets/generic_91.png and /dev/null differ diff --git a/assets/generic_92.png b/assets/generic_92.png deleted file mode 100644 index 299e081b..00000000 Binary files a/assets/generic_92.png and /dev/null differ diff --git a/assets/generic_93.png b/assets/generic_93.png deleted file mode 100644 index 1b35f671..00000000 Binary files a/assets/generic_93.png and /dev/null differ diff --git a/assets/generic_94.png b/assets/generic_94.png deleted file mode 100644 index 19dc788d..00000000 Binary files a/assets/generic_94.png and /dev/null differ diff --git a/assets/generic_95.png b/assets/generic_95.png deleted file mode 100644 index 2286dbfc..00000000 Binary files a/assets/generic_95.png and /dev/null differ diff --git a/assets/gui.png b/assets/gui.png deleted file mode 100644 index d583b6b4..00000000 Binary files a/assets/gui.png and /dev/null differ diff --git a/assets/loading-bg.jpg b/assets/loading-bg.jpg deleted file mode 100644 index 168c741e..00000000 Binary files a/assets/loading-bg.jpg and /dev/null differ diff --git a/assets/manifest.json b/assets/manifest.json deleted file mode 100644 index 4310ae7f..00000000 --- a/assets/manifest.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "Minecraft Web Client", - "short_name": "Minecraft Web Client", - "scope": "./", - "start_url": "./", - "icons": [ - { - "src": "favicon.png", - "sizes": "720x720" - } - ], - "background_color": "#349474", - "theme_color": "#349474", - "lang": "en-US", - "orientation": "landscape", - "display": "standalone" -} diff --git a/assets/minecraftia.woff b/assets/minecraftia.woff deleted file mode 100644 index 45790132..00000000 Binary files a/assets/minecraftia.woff and /dev/null differ diff --git a/assets/mojangles.ttf b/assets/mojangles.ttf deleted file mode 100644 index e7b87e9f..00000000 Binary files a/assets/mojangles.ttf and /dev/null differ diff --git a/assets/playground.html b/assets/playground.html deleted file mode 100644 index 8c394f91..00000000 --- a/assets/playground.html +++ /dev/null @@ -1,4 +0,0 @@ - - diff --git a/assets/storybook-bg.jpg b/assets/storybook-bg.jpg deleted file mode 100644 index 75d0156d..00000000 Binary files a/assets/storybook-bg.jpg and /dev/null differ diff --git a/buildCommits.ts b/buildCommits.ts new file mode 100644 index 00000000..c210354b --- /dev/null +++ b/buildCommits.ts @@ -0,0 +1,161 @@ +import { + execSync as exec +} from 'child_process' +import fs from 'fs' + +const isOnGoingMode = process.argv[2] === 'on' + +const targetBranch = 'main-light' +// const sourceBranch = 'main' +const sourceBranch = 'origin/next' + +// show message of last commit on branch next +const lastTargetMessage = exec(`git log -2 --pretty=format:%s ${targetBranch}`).toString().split('\n').find(x => !x.startsWith('Merge ')) +if (!lastTargetMessage) throw new Error('no last target message') +const sourceCommits = exec(`git log --pretty=format:%h:%s ${sourceBranch}`).toString().split('\n') +// find the commit hash of the commit with the same message on branch + +type Config = { + parent: string, + hardcodedDropCommits: string[], + hardcodedRemoveFilesCommits: Record, +} + +const {hardcodedDropCommits, hardcodedRemoveFilesCommits, parent}: Config = { + parent: 'upstream/master' || process.argv[3], + hardcodedDropCommits: [], + hardcodedRemoveFilesCommits: {} +} + +const lines = exec(`git log --pretty=format:%h:%s --name-only ${sourceBranch}`).toString().split('\n') + +type Commit = { + hash: string + msg: string + files: string[] +} + +const commits: Commit[] = [] + +let isHeader = true +for (const line of lines) { + if (isHeader) { + const [hash, ...msg] = line.split(':') + const message = msg.join(':'); + if (message === lastTargetMessage) break + console.log('Picking', message) + commits.push({ hash, msg: message, files: [] }) + isHeader = false + continue + } + + if (line === '') { + isHeader = true + continue + } + + commits[commits.length - 1].files.push(line) +} + +const dropPaths = [ + 'prismarine-viewer/', + '.github/workflows/cherry-pick-upstream.yml', + '.github/workflows/sync-upstream.yml', +] + +const isFileChangeShouldBeIgnored = (file: string) => { + return dropPaths.some(path => file.startsWith(path)) +} + +let editCommits: string[] = [] +const dropCommits: string[] = [] +let newFeatures: string[] = [] +let newFixes: string[] = [] +const conventionalRegex = /(?:\[.+]\s)??(\w+)(\(\S+\))?:/g +for (const commit of commits) { + const fileShouldBeIgnored = (file) => { + if (isFileChangeShouldBeIgnored(file)) return true + if (hardcodedRemoveFilesCommits[commit.hash]?.includes(file)) return true + } + + const forcefullyDrop = hardcodedDropCommits.includes(commit.hash); + if (forcefullyDrop || commit.files.some(fileShouldBeIgnored)) { + if (forcefullyDrop || commit.files.every(fileShouldBeIgnored)) { + console.log('drop', commit.msg, commit.files) + dropCommits.push(commit.hash) + } else { + console.log('edit', commit.msg, commit.files.filter(file => fileShouldBeIgnored(file))) + editCommits.push(commit.hash) + } + } + + // for of matches + const matches = [...commit.msg.matchAll(conventionalRegex)] + for (const [i, match] of matches.entries()) { + const [, type, scope] = match + const nextMatchI = matches[i + 1]?.index ?? commit.msg.length + const message = commit.msg.slice(match.index, nextMatchI) + if (type === 'feat') { + newFeatures.push(message) + } else if (type === 'fix') { + newFixes.push(message) + } + } +} + +console.log(commits, dropCommits, editCommits) + +for (const commit of commits) { + if (dropCommits.includes(commit.hash)) continue + if (editCommits.includes(commit.hash)) { + throw new Error('not implemented') + // exec('git cherry-pick --no-commit ' + commit.hash) + continue + } + exec('git cherry-pick ' + commit.hash) +} + +throw new Error('stop') + +// dropCommits.reverse() + +// let actions = '' +// for (const commit of dropCommits) { +// actions += `drop ${commit}\n` +// } + +// const dropPathsPerCommit = editCommits.reduce((acc, commit) => { +// acc[commit] = commits.find(c => c.hash === commit)!.files.filter(isFileChangeShouldBeIgnored) +// return acc +// }, {}) + +// // const commandsExec = [] +// const filesToRemove = editCommits.map(commit => dropPathsPerCommit[commit]) + +// for (const commit of editCommits) { +// // actions += `edit ${commit}\n` +// const filesToRemove = dropPathsPerCommit[commit] +// // commandsExec.push([...filesToRemove.map(file => `rm ${file}`), 'git add .', 'git rebase --continue'].join(' && ')) +// } +// if (!isOnGoingMode) { +// const newActions = [...editCommits.map(editCommit => `edit ${editCommit}`), ...dropCommits.map(dropCommit => `drop ${dropCommit}`)].join('\n') + '\n' +// fs.writeFileSync('./actions', newActions, 'utf8') +// exec(`git rebase -i --rebase-merges ${parent}`, { +// env: { +// GIT_SEQUENCE_EDITOR: 'tsx replaceScript.ts', +// }, +// }) +// } + +// for (const commit of filesToRemove) { +// const headCommit = fs.readFileSync('./.git/HEAD', 'utf8').trim().slice(0, 7) +// const files = dropPathsPerCommit[headCommit] +// console.log('removing', files.join(', ')) +// files.forEach(file => fs.unlinkSync(file)) +// exec('git add -u') +// exec('git rebase --continue', { +// env: { +// GIT_EDITOR: 'true', +// }, +// }) +// } diff --git a/config.json b/config.json deleted file mode 100644 index 2bfa9cfe..00000000 --- a/config.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "version": 1, - "defaultHost": "", - "defaultProxy": "https://proxy.mcraft.fun", - "mapsProvider": "https://maps.mcraft.fun/", - "skinTexturesProxy": "", - "peerJsServer": "", - "peerJsServerFallback": "https://p2p.mcraft.fun", - "promoteServers": [ - { - "ip": "wss://play.mcraft.fun" - }, - { - "ip": "wss://play.webmc.fun", - "name": "WebMC" - }, - { - "ip": "wss://ws.fuchsmc.net" - }, - { - "ip": "wss://play2.mcraft.fun" - }, - { - "ip": "wss://play-creative.mcraft.fun", - "description": "Might be available soon, stay tuned!" - }, - { - "ip": "kaboom.pw", - "version": "1.20.3", - "description": "Very nice a polite server. Must try for everyone!" - } - ], - "rightSideText": "A Minecraft client clone in the browser!", - "splashText": "The sunset is coming!", - "splashTextFallback": "Welcome!", - "pauseLinks": [ - [ - { - "type": "github" - }, - { - "type": "discord" - } - ] - ], - "defaultUsername": "mcrafter{0-9999}", - "mobileButtons": [ - { - "action": "general.drop", - "actionHold": "general.dropStack", - "label": "Q" - }, - { - "action": "general.selectItem", - "actionHold": "", - "label": "S" - }, - { - "action": "general.debugOverlay", - "actionHold": "general.debugOverlayHelpMenu", - "label": "F3" - }, - { - "action": "general.playersList", - "actionHold": "", - "icon": "pixelarticons:users", - "label": "TAB" - }, - { - "action": "general.chat", - "actionHold": "", - "label": "" - }, - { - "action": "ui.pauseMenu", - "actionHold": "", - "label": "" - } - ] -} diff --git a/config.mcraft-only.json b/config.mcraft-only.json deleted file mode 100644 index 52a3aa2c..00000000 --- a/config.mcraft-only.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "alwaysReconnectButton": true, - "reportBugButtonWithReconnect": true, - "allowAutoConnect": true -} diff --git a/cypress.config.ts b/cypress.config.ts deleted file mode 100644 index 3bf2c720..00000000 --- a/cypress.config.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { defineConfig } from 'cypress' - -const isPerformanceTest = process.env.PERFORMANCE_TEST === 'true' - -export default defineConfig({ - video: false, - chromeWebSecurity: false, - screenshotOnRunFailure: true, // Enable screenshots on test failures - e2e: { - // We've imported your old cypress plugins here. - // You may want to clean this up later by importing these. - setupNodeEvents (on, config) { - // https://medium.com/automation-with-donald/get-memory-consumption-of-web-app-with-cypress-84e2656e5a0f - on('before:browser:launch', (browser = { - name: "", - family: "chromium", - channel: "", - displayName: "", - version: "", - majorVersion: "", - path: "", - isHeaded: false, - isHeadless: false - }, launchOptions) => { - if (browser.family === 'chromium' && browser.name !== 'electron') { - // auto open devtools - launchOptions.args.push('--enable-precise-memory-info') - } - - return launchOptions - - }) - - return require('./cypress/plugins/index.js')(on, config) - }, - baseUrl: 'http://localhost:8080', - specPattern: !isPerformanceTest ? 'cypress/e2e/smoke.spec.ts' : 'cypress/e2e/rendering_performance.spec.ts', - excludeSpecPattern: ['**/__snapshots__/*', '**/__image_snapshots__/*'], - }, -}) diff --git a/cypress/.gitignore b/cypress/.gitignore deleted file mode 100644 index 3451417e..00000000 --- a/cypress/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -screenshots -fixtures diff --git a/cypress/e2e/__image_snapshots__/superflat-world #0.png b/cypress/e2e/__image_snapshots__/superflat-world #0.png deleted file mode 100644 index dcddd3ad..00000000 Binary files a/cypress/e2e/__image_snapshots__/superflat-world #0.png and /dev/null differ diff --git a/cypress/e2e/__image_snapshots__/superflat-world #1.png b/cypress/e2e/__image_snapshots__/superflat-world #1.png deleted file mode 100644 index 763d4514..00000000 Binary files a/cypress/e2e/__image_snapshots__/superflat-world #1.png and /dev/null differ diff --git a/cypress/e2e/__image_snapshots__/superflat-world #2.png b/cypress/e2e/__image_snapshots__/superflat-world #2.png deleted file mode 100644 index 763d4514..00000000 Binary files a/cypress/e2e/__image_snapshots__/superflat-world #2.png and /dev/null differ diff --git a/cypress/e2e/rendering_performance.spec.ts b/cypress/e2e/rendering_performance.spec.ts deleted file mode 100644 index 2ca85329..00000000 --- a/cypress/e2e/rendering_performance.spec.ts +++ /dev/null @@ -1,32 +0,0 @@ -/// -import { BenchmarkAdapterInfo, getAllInfoLines } from '../../src/benchmarkAdapter' -import { cleanVisit } from './shared' - -it('Benchmark rendering performance', () => { - cleanVisit('/?openBenchmark=true&renderDistance=5') - // wait for render end event - return cy.document().then({ timeout: 180_000 }, doc => { - return new Cypress.Promise(resolve => { - cy.log('Waiting for world to load') - doc.addEventListener('cypress-world-ready', resolve) - }).then(() => { - cy.log('World loaded') - }) - }).then(() => { - cy.window().then(win => { - const adapter = win.benchmarkAdapter as BenchmarkAdapterInfo - - const messages = getAllInfoLines(adapter) - // wait for 10 seconds - cy.wait(10_000) - const messages2 = getAllInfoLines(adapter, true) - for (const message of messages) { - cy.log(message) - } - for (const message of messages2) { - cy.log(message) - } - cy.writeFile('benchmark.txt', [...messages, ...messages2].join('\n')) - }) - }) -}) diff --git a/cypress/e2e/shared.ts b/cypress/e2e/shared.ts deleted file mode 100644 index 47518f1b..00000000 --- a/cypress/e2e/shared.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { AppOptions } from '../../src/optionsStorage' - -export const cleanVisit = (url?) => { - cy.clearLocalStorage() - visit(url) - window.localStorage.options = { - chatOpacity: 0 - } -} -export const visit = (url = '/') => { - window.localStorage.cypress = 'true' - cy.visit(url) -} -export const setOptions = (options: Partial) => { - cy.window().then(win => { - Object.assign(win['options'], options) - }) -} diff --git a/cypress/e2e/smoke.spec.ts b/cypress/e2e/smoke.spec.ts deleted file mode 100644 index ae110155..00000000 --- a/cypress/e2e/smoke.spec.ts +++ /dev/null @@ -1,108 +0,0 @@ -/* eslint-disable max-nested-callbacks */ -/// -import supportedVersions from '../../src/supportedVersions.mjs' -import { setOptions, cleanVisit, visit } from './shared' - -// todo use ssl - -const compareRenderedFlatWorld = () => { - // wait for render - // cy.wait(6000) - // cy.get('body').toMatchImageSnapshot({ - // name: 'superflat-world', - // }) -} - -const testWorldLoad = () => { - return cy.document().then({ timeout: 35_000 }, doc => { - return new Cypress.Promise(resolve => { - doc.addEventListener('cypress-world-ready', resolve) - }) - }).then(() => { - compareRenderedFlatWorld() - }) -} - -it('Loads & renders singleplayer', () => { - cleanVisit('/?singleplayer=1') - setOptions({ - localServerOptions: { - generation: { - name: 'superflat', - // eslint-disable-next-line unicorn/numeric-separators-style - options: { seed: 250869072 } - }, - }, - renderDistance: 2 - }) - testWorldLoad() -}) - -it.skip('Joins to local flying-squid server', () => { - visit('/?ip=localhost&version=1.16.1') - window.localStorage.version = '' - // todo replace with data-test - // cy.get('[data-test-id="servers-screen-button"]').click() - // cy.get('[data-test-id="server-ip"]').clear().focus().type('localhost') - // cy.get('[data-test-id="version"]').clear().focus().type('1.16.1') // todo needs to fix autoversion - cy.get('[data-test-id="connect-qs"]').click() // todo! cypress sometimes doesn't click - testWorldLoad() -}) - -it.skip('Joins to local latest Java vanilla server', () => { - const version = supportedVersions.at(-1)! - cy.task('startServer', [version, 25_590]).then(() => { - visit('/?ip=localhost:25590&username=bot') - cy.get('[data-test-id="connect-qs"]').click() - testWorldLoad().then(() => { - let x = 0 - let z = 0 - cy.window().then((win) => { - x = win.bot.entity.position.x - z = win.bot.entity.position.z - }) - cy.document().trigger('keydown', { code: 'KeyW' }) - cy.wait(1500).then(() => { - cy.document().trigger('keyup', { code: 'KeyW' }) - cy.window().then(async (win) => { - // eslint-disable-next-line prefer-destructuring - const bot: typeof __type_bot = win.bot - // todo use f3 stats instead - if (bot.entity.position.x === x && bot.entity.position.z === z) { - throw new Error('Player not moved') - } - - bot.chat('Hello') // todo assert - bot.chat('/gamemode creative') - // bot.on('message', () => { - void bot.creative.setInventorySlot(bot.inventory.hotbarStart, new win.PrismarineItem(1, 1, 0)) - // }) - await bot.lookAt(bot.entity.position.offset(1, 0, 1)) - }).then(() => { - cy.document().trigger('mousedown', { button: 2, isTrusted: true, force: true }) // right click - cy.document().trigger('mouseup', { button: 2, isTrusted: true, force: true }) - cy.wait(1000) - }) - }) - }) - }) -}) - -it('Loads & renders zip world', () => { - cleanVisit() - cy.get('[data-test-id="select-file-folder"]').click({ shiftKey: true }) - cy.get('input[type="file"]').selectFile('cypress/superflat.zip', { force: true }) - testWorldLoad() -}) - - -it.skip('Loads & renders world from folder', () => { - cleanVisit() - // dragndrop folder - cy.get('[data-test-id="select-file-folder"]').click() - cy.get('input[type="file"]').selectFile('server-jar/world', { - force: true, - // action: 'drag-drop', - }) - testWorldLoad() -}) diff --git a/cypress/minecraft-server.mjs b/cypress/minecraft-server.mjs deleted file mode 100644 index ea7bbcd1..00000000 --- a/cypress/minecraft-server.mjs +++ /dev/null @@ -1,26 +0,0 @@ -//@ts-check -import mcServer from 'flying-squid' -import defaultOptions from 'flying-squid/config/default-settings.json' with { type: 'json' } - -/** @type {Options} */ -const serverOptions = { - ...defaultOptions, - 'online-mode': false, - 'logging': false, - 'gameMode': 0, - 'difficulty': 0, - 'worldFolder': undefined, - // todo set sid, disable entities auto-spawn - 'generation': { - 'name': 'superflat', - options: {} - // 'options': { - // 'worldHeight': 80 - // } - }, - 'modpe': false, - 'view-distance': 4, - 'everybody-op': true, - 'version': '1.16.1' -} -const server = mcServer.createMCServer(serverOptions) diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js deleted file mode 100644 index e55f5d26..00000000 --- a/cypress/plugins/index.js +++ /dev/null @@ -1,33 +0,0 @@ -//@ts-check -const { cypressEsbuildPreprocessor } = require('cypress-esbuild-preprocessor') -const { initPlugin } = require('cypress-plugin-snapshots/plugin') -const polyfill = require('esbuild-plugin-polyfill-node') -const { startMinecraftServer } = require('./startServer') - -module.exports = (on, config) => { - initPlugin(on, config) - on('file:preprocessor', cypressEsbuildPreprocessor({ - esbuildOptions: { - sourcemap: true, - plugins: [ - polyfill.polyfillNode({ - polyfills: { - crypto: true, - }, - }) - ], - }, - })) - on('task', { - log(message) { - console.log(message) - return null - }, - }) - on('task', { - async startServer([version, port]) { - return startMinecraftServer(version, port) - } - }) - return config -} diff --git a/cypress/plugins/ops.json b/cypress/plugins/ops.json deleted file mode 100644 index ade5aaa5..00000000 --- a/cypress/plugins/ops.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - { - "uuid": "67128b5b-2e6b-3ad1-baa0-1b937b03e5c5", - "name": "bot", - "level": 4, - "bypassesPlayerLimit": false - } -] diff --git a/cypress/plugins/server.properties b/cypress/plugins/server.properties deleted file mode 100644 index 5873a1aa..00000000 --- a/cypress/plugins/server.properties +++ /dev/null @@ -1,61 +0,0 @@ -#Minecraft server properties -allow-flight=false -allow-nether=true -broadcast-console-to-ops=true -broadcast-rcon-to-ops=true -difficulty=peaceful -enable-command-block=false -enable-jmx-monitoring=false -enable-query=false -enable-rcon=false -enable-status=true -enforce-secure-profile=true -enforce-whitelist=false -entity-broadcast-range-percentage=100 -force-gamemode=false -function-permission-level=2 -gamemode=survival -generate-structures=true -generator-settings={} -hardcore=false -hide-online-players=false -initial-disabled-packs= -initial-enabled-packs=vanilla -level-name=world -level-seed= -level-type=flat -log-ips=true -max-build-height=256 -max-chained-neighbor-updates=1000000 -max-players=20 -max-tick-time=60000 -max-world-size=29999984 -motd=A Minecraft Server -network-compression-threshold=256 -online-mode=false -op-permission-level=4 -player-idle-timeout=0 -prevent-proxy-connections=false -pvp=true -query.port=25565 -rate-limit=0 -rcon.password= -rcon.port=25575 -require-resource-pack=false -resource-pack= -resource-pack-id= -resource-pack-prompt= -resource-pack-sha1= -server-ip= -server-port=25565 -simulation-distance=10 -snooper-enabled=true -spawn-animals=true -spawn-monsters=true -spawn-npcs=true -spawn-protection=16 -sync-chunk-writes=true -text-filtering-config= -use-native-transport=true -view-distance=10 -white-list=false diff --git a/cypress/plugins/startServer.ts b/cypress/plugins/startServer.ts deleted file mode 100644 index ecf0d210..00000000 --- a/cypress/plugins/startServer.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { ChildProcess, spawn } from 'child_process' -import * as fs from 'fs' -import * as path from 'path' -import { promisify } from 'util' -import { downloadServer } from 'minecraft-wrap' -import * as waitOn from 'wait-on' - -let prevProcess: ChildProcess | null = null -export const startMinecraftServer = async (version: string, port: number) => { - if (prevProcess) return null - const jar = `./server-jar/${version}.jar` - - const start = () => { - // if (prevProcess) { - // prevProcess.kill() - // } - - prevProcess = spawn('java', ['-jar', path.basename(jar), 'nogui', '--port', `${port}`], { - stdio: 'inherit', - cwd: path.dirname(jar), - }) - } - - let coldStart = false - if (fs.existsSync(jar)) { - start() - } else { - coldStart = true - promisify(downloadServer)(version, jar).then(() => { - // add eula.txt - fs.writeFileSync(path.join(path.dirname(jar), 'eula.txt'), 'eula=true') - // copy cypress/plugins/server.properties - fs.copyFileSync(path.join(__dirname, 'server.properties'), path.join(path.dirname(jar), 'server.properties')) - // copy ops.json - fs.copyFileSync(path.join(__dirname, 'ops.json'), path.join(path.dirname(jar), 'ops.json')) - start() - }) - } - - return new Promise((res) => { - waitOn({ resources: [`tcp:localhost:${port}`] }, () => { - setTimeout(() => res(null), coldStart ? 6500 : 2000) // todo retry instead of timeout - }) - }) -} diff --git a/cypress/superflat.zip b/cypress/superflat.zip deleted file mode 100644 index 10fc9f46..00000000 Binary files a/cypress/superflat.zip and /dev/null differ diff --git a/cypress/support/e2e.js b/cypress/support/e2e.js deleted file mode 100644 index bef856f5..00000000 --- a/cypress/support/e2e.js +++ /dev/null @@ -1,2 +0,0 @@ -import 'cypress-plugin-snapshots/commands' -Cypress.Commands.overwrite('log', (_subject, message) => cy.task('log', message)) diff --git a/docs-assets/banner.jpg b/docs-assets/banner.jpg deleted file mode 100644 index 270a6863..00000000 Binary files a/docs-assets/banner.jpg and /dev/null differ diff --git a/docs-assets/handled-packets.md b/docs-assets/handled-packets.md deleted file mode 100644 index 497ec5ec..00000000 --- a/docs-assets/handled-packets.md +++ /dev/null @@ -1,169 +0,0 @@ -# Handled Packets - -## Server -> Client - -❌ statistics -❌ advancements -❌ face_player -❌ nbt_query_response -❌ chat_suggestions -❌ trade_list -❌ vehicle_move -❌ open_book -❌ craft_recipe_response -❌ end_combat_event -❌ enter_combat_event -❌ unlock_recipes -❌ camera -❌ update_view_position -❌ update_view_distance -❌ entity_sound_effect -❌ stop_sound -❌ feature_flags -❌ select_advancement_tab -❌ declare_recipes -❌ tags -❌ acknowledge_player_digging -❌ initialize_world_border -❌ world_border_center -❌ world_border_lerp_size -❌ world_border_size -❌ world_border_warning_delay -❌ world_border_warning_reach -❌ simulation_distance -❌ chunk_biomes -❌ hurt_animation -✅ damage_event -✅ spawn_entity -✅ spawn_entity_experience_orb -✅ named_entity_spawn -✅ animation -✅ block_break_animation -✅ tile_entity_data -✅ block_action -✅ block_change -✅ boss_bar -✅ difficulty -✅ tab_complete -✅ declare_commands -✅ multi_block_change -✅ close_window -✅ open_window -✅ window_items -✅ craft_progress_bar -✅ set_slot -✅ set_cooldown -✅ custom_payload -✅ hide_message -✅ kick_disconnect -✅ profileless_chat -✅ entity_status -✅ explosion -✅ unload_chunk -✅ game_state_change -✅ open_horse_window -✅ keep_alive -✅ map_chunk -✅ world_event -✅ world_particles -✅ update_light -✅ login -✅ map -✅ rel_entity_move -✅ entity_move_look -✅ entity_look -✅ open_sign_entity -✅ abilities -✅ player_chat -✅ death_combat_event -✅ player_remove -✅ player_info -✅ position -✅ entity_destroy -✅ remove_entity_effect -✅ resource_pack_send -✅ respawn -✅ entity_head_rotation -✅ held_item_slot -✅ scoreboard_display_objective -✅ entity_metadata -✅ attach_entity -✅ entity_velocity -✅ entity_equipment -✅ experience -✅ update_health -✅ scoreboard_objective -✅ set_passengers -✅ teams -✅ scoreboard_score -✅ spawn_position -✅ update_time -✅ sound_effect -✅ system_chat -✅ playerlist_header -✅ collect -✅ entity_teleport -✅ entity_update_attributes -✅ entity_effect -✅ server_data -✅ clear_titles -✅ action_bar -✅ ping -✅ set_title_subtitle -✅ set_title_text -✅ set_title_time -✅ packet - -## Client -> Server - -❌ query_block_nbt -❌ set_difficulty -❌ query_entity_nbt -❌ pick_item -❌ set_beacon_effect -❌ update_command_block_minecart -❌ update_structure_block -❌ generate_structure -❌ lock_difficulty -❌ craft_recipe_request -❌ displayed_recipe -❌ recipe_book -❌ update_jigsaw_block -❌ spectate -❌ advancement_tab -✅ teleport_confirm -✅ chat_command -✅ chat_message -✅ message_acknowledgement -✅ edit_book -✅ name_item -✅ select_trade -✅ update_command_block -✅ tab_complete -✅ client_command -✅ settings -✅ enchant_item -✅ window_click -✅ close_window -✅ custom_payload -✅ use_entity -✅ keep_alive -✅ position -✅ position_look -✅ look -✅ flying -✅ vehicle_move -✅ steer_boat -✅ abilities -✅ block_dig -✅ entity_action -✅ steer_vehicle -✅ resource_pack_receive -✅ held_item_slot -✅ set_creative_slot -✅ update_sign -✅ arm_animation -✅ block_place -✅ use_item -✅ pong -✅ chat_session_update diff --git a/docs-assets/npm-banner.jpeg b/docs-assets/npm-banner.jpeg deleted file mode 100644 index 95de07b8..00000000 Binary files a/docs-assets/npm-banner.jpeg and /dev/null differ diff --git a/docs-assets/singleplayer-future-city-1-10-2.jpg b/docs-assets/singleplayer-future-city-1-10-2.jpg deleted file mode 100644 index e5be2ada..00000000 Binary files a/docs-assets/singleplayer-future-city-1-10-2.jpg and /dev/null differ diff --git a/docs-assets/watch-expr.png b/docs-assets/watch-expr.png deleted file mode 100644 index a21c07a9..00000000 Binary files a/docs-assets/watch-expr.png and /dev/null differ diff --git a/experiments/UiStandaloneExample.tsx b/experiments/UiStandaloneExample.tsx deleted file mode 100644 index 80f68e8d..00000000 --- a/experiments/UiStandaloneExample.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import React, { useState } from 'react' -import { createRoot } from 'react-dom/client' -import { - Button, - Slider, - ArmorBar, - BreathBar, - Chat, - HealthBar, - PlayerListOverlay, - Scoreboard, - MessageFormattedString, - XPBar, - FoodBar -} from '../dist-npm' - -const ExampleDemo = () => { - const [sliderValue, setSliderValue] = useState(0) - - return ( -
- - setSliderValue(value)} /> - - { - console.log('typed', message) - // close - }} - /> - - - - - "§bRed" displays as - - -
- ) -} - -createRoot(document.body as Element).render() diff --git a/experiments/decode.html b/experiments/decode.html deleted file mode 100644 index fd55e622..00000000 --- a/experiments/decode.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/experiments/decode.ts b/experiments/decode.ts deleted file mode 100644 index 6d0f876d..00000000 --- a/experiments/decode.ts +++ /dev/null @@ -1,26 +0,0 @@ -// Include the pako library -import pako from 'pako'; -import compressedJsRaw from './compressed.js?raw' - -function decompressFromBase64(input) { - // Decode the Base64 string - const binaryString = atob(input); - const len = binaryString.length; - const bytes = new Uint8Array(len); - - // Convert the binary string to a byte array - for (let i = 0; i < len; i++) { - bytes[i] = binaryString.charCodeAt(i); - } - - // Decompress the byte array - const decompressedData = pako.inflate(bytes, { to: 'string' }); - - return decompressedData; -} - -// Use the function -console.time('decompress'); -const decompressedData = decompressFromBase64(compressedJsRaw); -console.timeEnd('decompress') -console.log(decompressedData) diff --git a/experiments/ios-safe-area-bottom-bug.html b/experiments/ios-safe-area-bottom-bug.html deleted file mode 100644 index 53d867f5..00000000 --- a/experiments/ios-safe-area-bottom-bug.html +++ /dev/null @@ -1,15 +0,0 @@ - -
- bottom: env(safe-area-inset-bottom) -
diff --git a/experiments/pointers.html b/experiments/pointers.html deleted file mode 100644 index 1d2d15dc..00000000 --- a/experiments/pointers.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - Document - - -
- - - diff --git a/experiments/state.html b/experiments/state.html deleted file mode 100644 index 7a5282b7..00000000 --- a/experiments/state.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/experiments/state.ts b/experiments/state.ts deleted file mode 100644 index b01523fc..00000000 --- a/experiments/state.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { SmoothSwitcher } from '../renderer/viewer/lib/smoothSwitcher' - -const div = document.createElement('div') -div.style.width = '100px' -div.style.height = '100px' -div.style.backgroundColor = 'red' -document.body.appendChild(div) - -const pos = {x: 0, y: 0} - -const positionSwitcher = new SmoothSwitcher(() => pos, (key, value) => { - pos[key] = value -}) -globalThis.positionSwitcher = positionSwitcher - -document.body.addEventListener('keydown', e => { - if (e.code === 'ArrowLeft' || e.code === 'ArrowRight') { - const to = { - x: e.code === 'ArrowLeft' ? -100 : 100 - } - console.log(pos, to) - positionSwitcher.transitionTo(to, e.code === 'ArrowLeft' ? 'Left' : 'Right', () => { - console.log('Switched to ', e.code === 'ArrowLeft' ? 'Left' : 'Right') - }) - } - if (e.code === 'Space') { - pos.x = 200 - } -}) - -const render = () => { - positionSwitcher.update() - div.style.transform = `translate(${pos.x}px, ${pos.y}px)` - requestAnimationFrame(render) -} - -render() diff --git a/experiments/three-item.html b/experiments/three-item.html deleted file mode 100644 index 70155c50..00000000 --- a/experiments/three-item.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - Minecraft Item Viewer - - - - - - diff --git a/experiments/three-item.ts b/experiments/three-item.ts deleted file mode 100644 index b9d492fe..00000000 --- a/experiments/three-item.ts +++ /dev/null @@ -1,108 +0,0 @@ -import * as THREE from 'three' -import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls' -import itemsAtlas from 'mc-assets/dist/itemsAtlasLegacy.png' -import { createItemMeshFromCanvas, createItemMesh } from '../renderer/viewer/three/itemMesh' - -// Create scene, camera and renderer -const scene = new THREE.Scene() -const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000) -const renderer = new THREE.WebGLRenderer({ antialias: true }) -renderer.setSize(window.innerWidth, window.innerHeight) -document.body.appendChild(renderer.domElement) - -// Setup camera and controls -camera.position.set(0, 0, 3) -const controls = new OrbitControls(camera, renderer.domElement) -controls.enableDamping = true - -// Background and lights -scene.background = new THREE.Color(0x333333) -const ambientLight = new THREE.AmbientLight(0xffffff, 0.7) -scene.add(ambientLight) - -// Animation loop -function animate () { - requestAnimationFrame(animate) - controls.update() - renderer.render(scene, camera) -} - -async function setupItemMesh () { - try { - const loader = new THREE.TextureLoader() - const atlasTexture = await loader.loadAsync(itemsAtlas) - - // Pixel-art configuration - atlasTexture.magFilter = THREE.NearestFilter - atlasTexture.minFilter = THREE.NearestFilter - atlasTexture.generateMipmaps = false - atlasTexture.wrapS = atlasTexture.wrapT = THREE.ClampToEdgeWrapping - - // Extract the tile at x=2, y=0 (16x16) - const tileSize = 16 - const tileX = 2 - const tileY = 0 - - const canvas = document.createElement('canvas') - canvas.width = tileSize - canvas.height = tileSize - const ctx = canvas.getContext('2d')! - - ctx.imageSmoothingEnabled = false - ctx.drawImage( - atlasTexture.image, - tileX * tileSize, - tileY * tileSize, - tileSize, - tileSize, - 0, - 0, - tileSize, - tileSize - ) - - // Test both approaches - working manual extraction: - const meshOld = createItemMeshFromCanvas(canvas, { depth: 0.1 }) - meshOld.position.x = -1 - meshOld.rotation.x = -Math.PI / 12 - meshOld.rotation.y = Math.PI / 12 - scene.add(meshOld) - - // And new unified function: - const atlasWidth = atlasTexture.image.width - const atlasHeight = atlasTexture.image.height - const u = (tileX * tileSize) / atlasWidth - const v = (tileY * tileSize) / atlasHeight - const sizeX = tileSize / atlasWidth - const sizeY = tileSize / atlasHeight - - console.log('Debug texture coords:', {u, v, sizeX, sizeY, atlasWidth, atlasHeight}) - - const resultNew = createItemMesh(atlasTexture, { - u, v, sizeX, sizeY - }, { - faceCamera: false, - use3D: true, - depth: 0.1 - }) - - resultNew.mesh.position.x = 1 - resultNew.mesh.rotation.x = -Math.PI / 12 - resultNew.mesh.rotation.y = Math.PI / 12 - scene.add(resultNew.mesh) - - animate() - } catch (err) { - console.error('Failed to create item mesh:', err) - } -} - -// Handle window resize -window.addEventListener('resize', () => { - camera.aspect = window.innerWidth / window.innerHeight - camera.updateProjectionMatrix() - renderer.setSize(window.innerWidth, window.innerHeight) -}) - -// Start -setupItemMesh() diff --git a/experiments/three-labels.html b/experiments/three-labels.html deleted file mode 100644 index 2b25bc23..00000000 --- a/experiments/three-labels.html +++ /dev/null @@ -1,5 +0,0 @@ - - diff --git a/experiments/three-labels.ts b/experiments/three-labels.ts deleted file mode 100644 index b69dc95b..00000000 --- a/experiments/three-labels.ts +++ /dev/null @@ -1,67 +0,0 @@ -import * as THREE from 'three' -import { FirstPersonControls } from 'three/addons/controls/FirstPersonControls.js' -import { createWaypointSprite, WAYPOINT_CONFIG } from '../renderer/viewer/three/waypointSprite' - -// Create scene, camera and renderer -const scene = new THREE.Scene() -const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000) -const renderer = new THREE.WebGLRenderer({ antialias: true }) -renderer.setSize(window.innerWidth, window.innerHeight) -document.body.appendChild(renderer.domElement) - -// Add FirstPersonControls -const controls = new FirstPersonControls(camera, renderer.domElement) -controls.lookSpeed = 0.1 -controls.movementSpeed = 10 -controls.lookVertical = true -controls.constrainVertical = true -controls.verticalMin = 0.1 -controls.verticalMax = Math.PI - 0.1 - -// Position camera -camera.position.y = 1.6 // Typical eye height -camera.lookAt(0, 1.6, -1) - -// Create a helper grid and axes -const grid = new THREE.GridHelper(20, 20) -scene.add(grid) -const axes = new THREE.AxesHelper(5) -scene.add(axes) - -// Create waypoint sprite via utility -const waypoint = createWaypointSprite({ - position: new THREE.Vector3(0, 0, -5), - color: 0xff0000, - label: 'Target', -}) -scene.add(waypoint.group) - -// Use built-in offscreen arrow from utils -waypoint.enableOffscreenArrow(true) -waypoint.setArrowParent(scene) - -// Animation loop -function animate() { - requestAnimationFrame(animate) - - const delta = Math.min(clock.getDelta(), 0.1) - controls.update(delta) - - // Unified camera update (size, distance text, arrow, visibility) - const sizeVec = renderer.getSize(new THREE.Vector2()) - waypoint.updateForCamera(camera.position, camera, sizeVec.width, sizeVec.height) - - renderer.render(scene, camera) -} - -// Handle window resize -window.addEventListener('resize', () => { - camera.aspect = window.innerWidth / window.innerHeight - camera.updateProjectionMatrix() - renderer.setSize(window.innerWidth, window.innerHeight) -}) - -// Add clock for controls -const clock = new THREE.Clock() - -animate() diff --git a/experiments/three.html b/experiments/three.html deleted file mode 100644 index 8765081b..00000000 --- a/experiments/three.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/experiments/three.ts b/experiments/three.ts deleted file mode 100644 index 21142b5f..00000000 --- a/experiments/three.ts +++ /dev/null @@ -1,60 +0,0 @@ -import * as THREE from 'three' - -// Create scene, camera and renderer -const scene = new THREE.Scene() -const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000) -const renderer = new THREE.WebGLRenderer() -renderer.setSize(window.innerWidth, window.innerHeight) -document.body.appendChild(renderer.domElement) - -// Position camera -camera.position.z = 5 - -// Create a canvas with some content -const canvas = document.createElement('canvas') -canvas.width = 256 -canvas.height = 256 -const ctx = canvas.getContext('2d') - -scene.background = new THREE.Color(0x444444) - -// Draw something on the canvas -ctx.fillStyle = '#444444' -// ctx.fillRect(0, 0, 256, 256) -ctx.fillStyle = 'red' -ctx.font = '48px Arial' -ctx.textAlign = 'center' -ctx.textBaseline = 'middle' -ctx.fillText('Hello!', 128, 128) - -// Create bitmap and texture -async function createTexturedBox() { - const canvas2 = new OffscreenCanvas(256, 256) - const ctx2 = canvas2.getContext('2d')! - ctx2.drawImage(canvas, 0, 0) - const texture = new THREE.Texture(canvas2) - texture.magFilter = THREE.NearestFilter - texture.minFilter = THREE.NearestFilter - texture.needsUpdate = true - texture.flipY = false - - // Create box with texture - const geometry = new THREE.BoxGeometry(2, 2, 2) - const material = new THREE.MeshBasicMaterial({ - map: texture, - side: THREE.DoubleSide, - premultipliedAlpha: false, - }) - const cube = new THREE.Mesh(geometry, material) - scene.add(cube) -} - -// Create the textured box -createTexturedBox() - -// Animation loop -function animate() { - requestAnimationFrame(animate) - renderer.render(scene, camera) -} -animate() diff --git a/experiments/vite.config.ts b/experiments/vite.config.ts deleted file mode 100644 index e0a30bef..00000000 --- a/experiments/vite.config.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { defineConfig } from 'vite'; - -export default defineConfig({ - root: 'experiments', -}) diff --git a/index.html b/index.html deleted file mode 100644 index b2fa3dbd..00000000 --- a/index.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - - - - - - Minecraft Web Client - - - - - - - - - - - - -
-
- - - diff --git a/lastPickedCommit b/lastPickedCommit new file mode 100644 index 00000000..ae19fb89 --- /dev/null +++ b/lastPickedCommit @@ -0,0 +1 @@ +14a9a2b diff --git a/package.json b/package.json deleted file mode 100644 index ff673726..00000000 --- a/package.json +++ /dev/null @@ -1,242 +0,0 @@ -{ - "name": "minecraft-web-client", - "version": "0.0.0-dev", - "description": "A minecraft client running in a browser", - "scripts": { - "dev-rsbuild": "rsbuild dev", - "dev-proxy": "node server.js", - "start": "run-p dev-proxy dev-rsbuild watch-mesher", - "start2": "run-p dev-rsbuild watch-mesher", - "start-metrics": "ENABLE_METRICS=true rsbuild dev", - "build": "pnpm build-other-workers && rsbuild build", - "build-analyze": "BUNDLE_ANALYZE=true rsbuild build && pnpm build-other-workers", - "build-single-file": "SINGLE_FILE_BUILD=true rsbuild build", - "prepare-project": "tsx scripts/genShims.ts && tsx scripts/makeOptimizedMcData.mjs && tsx scripts/genLargeDataAliases.ts", - "check-build": "pnpm prepare-project && tsc && pnpm build", - "test:cypress": "cypress run", - "test:benchmark": "PERFORMANCE_TEST=true cypress run", - "test:cypress:open": "cypress open", - "test-unit": "vitest", - "test:e2e": "start-test http-get://localhost:8080 test:cypress", - "prod-start": "node server.js --prod", - "test-mc-server": "tsx cypress/minecraft-server.mjs", - "lint": "eslint \"{src,cypress,renderer}/**/*.{ts,js,jsx,tsx}\"", - "lint-fix": "pnpm lint --fix", - "storybook": "storybook dev -p 6006", - "build-storybook": "storybook build && node scripts/build.js moveStorybookFiles", - "start-experiments": "vite --config experiments/vite.config.ts --host", - "watch-other-workers": "echo NOT IMPLEMENTED", - "build-other-workers": "echo NOT IMPLEMENTED", - "build-mesher": "node renderer/buildMesherWorker.mjs", - "watch-mesher": "pnpm build-mesher -w", - "run-playground": "run-p watch-mesher watch-other-workers watch-playground", - "run-all": "run-p start run-playground", - "build-playground": "rsbuild build --config renderer/rsbuild.config.ts", - "watch-playground": "rsbuild dev --config renderer/rsbuild.config.ts", - "update-git-deps": "tsx scripts/updateGitDeps.ts", - "request-data": "tsx scripts/requestData.ts" - }, - "keywords": [ - "prismarine", - "web", - "client" - ], - "release": { - "attachReleaseFiles": "{self-host.zip,minecraft.html}" - }, - "publish": { - "preset": { - "publishOnlyIfChanged": true, - "runBuild": false - } - }, - "license": "MIT", - "dependencies": { - "@dimaka/interface": "0.0.3-alpha.0", - "@floating-ui/react": "^0.26.1", - "@monaco-editor/react": "^4.7.0", - "@nxg-org/mineflayer-auto-jump": "^0.7.18", - "@nxg-org/mineflayer-tracker": "1.3.0", - "@react-oauth/google": "^0.12.1", - "@stylistic/eslint-plugin": "^2.6.1", - "@types/gapi": "^0.0.47", - "@types/react": "^18.2.20", - "@types/react-dom": "^18.2.7", - "@types/wicg-file-system-access": "^2023.10.2", - "@xmcl/text-component": "^2.1.3", - "@zardoy/react-util": "^0.2.4", - "@zardoy/utils": "^0.0.11", - "adm-zip": "^0.5.12", - "browserfs": "github:zardoy/browserfs#build", - "change-case": "^5.1.2", - "classnames": "^2.5.1", - "compression": "^1.7.4", - "cors": "^2.8.5", - "debug": "^4.3.4", - "deepslate": "^0.23.5", - "diff-match-patch": "^1.0.5", - "eruda": "^3.0.1", - "esbuild": "^0.19.3", - "esbuild-plugin-polyfill-node": "^0.3.0", - "express": "^4.18.2", - "filesize": "^10.0.12", - "flying-squid": "npm:@zardoy/flying-squid@^0.0.104", - "framer-motion": "^12.9.2", - "fs-extra": "^11.1.1", - "google-drive-browserfs": "github:zardoy/browserfs#google-drive", - "jszip": "^3.10.1", - "lodash-es": "^4.17.21", - "mcraft-fun-mineflayer": "^0.1.23", - "minecraft-data": "3.98.0", - "minecraft-protocol": "github:PrismarineJS/node-minecraft-protocol#master", - "mineflayer-item-map-downloader": "github:zardoy/mineflayer-item-map-downloader", - "mojangson": "^2.0.4", - "net-browserify": "github:zardoy/prismarinejs-net-browserify", - "node-gzip": "^1.1.2", - "peerjs": "^1.5.0", - "pixelarticons": "^1.8.1", - "pretty-bytes": "^6.1.1", - "prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", - "prosemirror-example-setup": "^1.2.2", - "prosemirror-markdown": "^1.12.0", - "prosemirror-menu": "^1.2.4", - "prosemirror-state": "^1.4.3", - "prosemirror-view": "^1.33.1", - "qrcode.react": "^3.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-select": "^5.8.0", - "react-zoom-pan-pinch": "3.4.4", - "remark": "^15.0.1", - "sanitize-filename": "^1.6.3", - "skinview3d": "^3.0.1", - "source-map-js": "^1.0.2", - "stats-gl": "^1.0.5", - "stats.js": "^0.17.0", - "tabbable": "^6.2.0", - "title-case": "3.x", - "ua-parser-js": "^1.0.37", - "use-typed-event-listener": "^4.0.2", - "valtio": "^1.11.1", - "vec3": "^0.1.7", - "wait-on": "^7.2.0", - "workbox-build": "^7.0.0" - }, - "devDependencies": { - "@rsbuild/core": "1.3.5", - "@rsbuild/plugin-node-polyfill": "1.3.0", - "@rsbuild/plugin-react": "1.2.0", - "@rsbuild/plugin-type-check": "1.2.1", - "@rsbuild/plugin-typed-css-modules": "1.0.2", - "@storybook/addon-essentials": "^7.4.6", - "@storybook/addon-links": "^7.4.6", - "@storybook/blocks": "^7.4.6", - "@storybook/react": "^7.4.6", - "@storybook/react-vite": "^7.4.6", - "@types/diff-match-patch": "^1.0.36", - "@types/lodash-es": "^4.17.9", - "@types/stats.js": "^0.17.1", - "@types/three": "0.154.0", - "@types/ua-parser-js": "^0.7.39", - "@types/wait-on": "^5.3.4", - "@xmcl/installer": "^5.1.0", - "assert": "^2.0.0", - "browserify-zlib": "^0.2.0", - "buffer": "^6.0.3", - "constants-browserify": "^1.0.0", - "contro-max": "^0.1.9", - "crypto-browserify": "^3.12.0", - "cypress-esbuild-preprocessor": "^1.0.2", - "eslint": "^8.50.0", - "eslint-config-zardoy": "^0.2.17", - "events": "^3.3.0", - "gzip-size": "^7.0.0", - "http-browserify": "^1.7.0", - "http-server": "^14.1.1", - "https-browserify": "^1.0.0", - "mc-assets": "^0.2.62", - "minecraft-inventory-gui": "github:zardoy/minecraft-inventory-gui#next", - "mineflayer": "github:zardoy/mineflayer#gen-the-master", - "mineflayer-mouse": "^0.1.21", - "npm-run-all": "^4.1.5", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.1", - "path-exists-cli": "^2.0.0", - "process": "github:PrismarineJS/node-process", - "renderer": "link:renderer", - "rimraf": "^5.0.1", - "storybook": "^7.4.6", - "stream-browserify": "^3.0.0", - "three": "0.154.0", - "timers-browserify": "^2.0.12", - "typescript": "5.5.4", - "vitest": "^0.34.6", - "yaml": "^2.3.2" - }, - "optionalDependencies": { - "cypress": "^10.11.0", - "cypress-plugin-snapshots": "^1.4.4", - "sharp": "^0.33.5", - "systeminformation": "^5.21.22" - }, - "browserslist": { - "production": [ - "iOS >= 14", - "Android >= 13", - "Chrome >= 103", - "not dead", - "not ie <= 11", - "not op_mini all", - "> 0.5%" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "pnpm": { - "overrides": { - "mineflayer": "github:zardoy/mineflayer#gen-the-master", - "@nxg-org/mineflayer-physics-util": "1.8.10", - "buffer": "^6.0.3", - "vec3": "0.1.10", - "three": "0.154.0", - "diamond-square": "github:zardoy/diamond-square", - "prismarine-block": "github:zardoy/prismarine-block#next-era", - "prismarine-world": "github:zardoy/prismarine-world#next-era", - "minecraft-data": "3.98.0", - "prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", - "prismarine-physics": "github:zardoy/prismarine-physics", - "minecraft-protocol": "github:PrismarineJS/node-minecraft-protocol#master", - "react": "^18.2.0", - "prismarine-chunk": "github:zardoy/prismarine-chunk#master", - "prismarine-item": "latest" - }, - "updateConfig": { - "ignoreDependencies": [ - "browserfs", - "google-drive-browserfs" - ] - }, - "patchedDependencies": { - "pixelarticons@1.8.1": "patches/pixelarticons@1.8.1.patch", - "mineflayer-item-map-downloader@1.2.0": "patches/mineflayer-item-map-downloader@1.2.0.patch", - "minecraft-protocol": "patches/minecraft-protocol.patch" - }, - "ignoredBuiltDependencies": [ - "canvas", - "core-js", - "gl" - ], - "onlyBuiltDependencies": [ - "sharp", - "cypress", - "esbuild", - "fsevents" - ], - "ignorePatchFailures": false, - "allowUnusedPatches": false - }, - "packageManager": "pnpm@10.8.0+sha512.0e82714d1b5b43c74610193cb20734897c1d00de89d0e18420aebc5977fa13d780a9cb05734624e81ebd81cc876cd464794850641c48b9544326b5622ca29971" -} diff --git a/package.npm.json b/package.npm.json deleted file mode 100644 index 4853780f..00000000 --- a/package.npm.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "minecraft-react", - "description": "A Minecraft-like React UI library", - "keywords": [ - "minecraft", - "minecraft style", - "minecraft ui", - "minecraft components", - "minecraft react", - "minecraft library", - "minecraft web", - "minecraft browser" - ], - "license": "MIT", - "sideEffects": false, - "files": [ - "**" - ], - "exports": { - ".": { - "default": "./dist/react/npmReactComponents.js", - "types": "./dist/react/npmReactComponents.d.ts" - }, - "./*": { - "default": "./dist/react/*", - "types": "./dist/react/*" - }, - "./dist": { - "default": "./dist/*", - "types": "./dist/*" - } - }, - "module": "./dist/react/npmReactComponents.js", - "types": "./dist/react/npmReactComponents.d.ts", - "repository": "zardoy/minecraft-web-client", - "version": "0.0.0-dev", - "dependencies": {}, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } -} diff --git a/patches/minecraft-protocol.patch b/patches/minecraft-protocol.patch deleted file mode 100644 index e29f87d9..00000000 --- a/patches/minecraft-protocol.patch +++ /dev/null @@ -1,138 +0,0 @@ -diff --git a/src/client/chat.js b/src/client/chat.js -index 0021870994fc59a82f0ac8aba0a65a8be43ef2f4..a53fceb843105ea2a1d88722b3fc7c3b43cb102a 100644 ---- a/src/client/chat.js -+++ b/src/client/chat.js -@@ -116,7 +116,7 @@ module.exports = function (client, options) { - for (const player of packet.data) { - if (player.chatSession) { - client._players[player.uuid] = { -- publicKey: crypto.createPublicKey({ key: player.chatSession.publicKey.keyBytes, format: 'der', type: 'spki' }), -+ // publicKey: crypto.createPublicKey({ key: player.chatSession.publicKey.keyBytes, format: 'der', type: 'spki' }), - publicKeyDER: player.chatSession.publicKey.keyBytes, - sessionUuid: player.chatSession.uuid - } -@@ -126,7 +126,7 @@ module.exports = function (client, options) { - - if (player.crypto) { - client._players[player.uuid] = { -- publicKey: crypto.createPublicKey({ key: player.crypto.publicKey, format: 'der', type: 'spki' }), -+ // publicKey: crypto.createPublicKey({ key: player.crypto.publicKey, format: 'der', type: 'spki' }), - publicKeyDER: player.crypto.publicKey, - signature: player.crypto.signature, - displayName: player.displayName || player.name -@@ -196,7 +196,7 @@ module.exports = function (client, options) { - if (mcData.supportFeature('useChatSessions')) { - const tsDelta = BigInt(Date.now()) - packet.timestamp - const expired = !packet.timestamp || tsDelta > messageExpireTime || tsDelta < 0 -- const verified = !packet.unsignedChatContent && updateAndValidateSession(packet.senderUuid, packet.plainMessage, packet.signature, packet.index, packet.previousMessages, packet.salt, packet.timestamp) && !expired -+ const verified = false && !packet.unsignedChatContent && updateAndValidateSession(packet.senderUuid, packet.plainMessage, packet.signature, packet.index, packet.previousMessages, packet.salt, packet.timestamp) && !expired - if (verified) client._signatureCache.push(packet.signature) - client.emit('playerChat', { - globalIndex: packet.globalIndex, -@@ -362,7 +362,7 @@ module.exports = function (client, options) { - } - } - -- client._signedChat = (message, options = {}) => { -+ client._signedChat = async (message, options = {}) => { - options.timestamp = options.timestamp || BigInt(Date.now()) - options.salt = options.salt || 1n - -@@ -407,7 +407,7 @@ module.exports = function (client, options) { - message, - timestamp: options.timestamp, - salt: options.salt, -- signature: (client.profileKeys && client._session) ? client.signMessage(message, options.timestamp, options.salt, undefined, acknowledgements) : undefined, -+ signature: (client.profileKeys && client._session) ? await client.signMessage(message, options.timestamp, options.salt, undefined, acknowledgements) : undefined, - offset: client._lastSeenMessages.pending, - checksum: computeChatChecksum(client._lastSeenMessages), // 1.21.5+ - acknowledged -@@ -422,7 +422,7 @@ module.exports = function (client, options) { - message, - timestamp: options.timestamp, - salt: options.salt, -- signature: client.profileKeys ? client.signMessage(message, options.timestamp, options.salt, options.preview) : Buffer.alloc(0), -+ signature: client.profileKeys ? await client.signMessage(message, options.timestamp, options.salt, options.preview) : Buffer.alloc(0), - signedPreview: options.didPreview, - previousMessages: client._lastSeenMessages.map((e) => ({ - messageSender: e.sender, -diff --git a/src/client/encrypt.js b/src/client/encrypt.js -index 63cc2bd9615100bd2fd63dfe14c094aa6b8cd1c9..36df57d1196af9761d920fa285ac48f85410eaef 100644 ---- a/src/client/encrypt.js -+++ b/src/client/encrypt.js -@@ -25,7 +25,11 @@ module.exports = function (client, options) { - if (packet.serverId !== '-') { - debug('This server appears to be an online server and you are providing no password, the authentication will probably fail') - } -- sendEncryptionKeyResponse() -+ client.end('This server appears to be an online server and you are providing no authentication. Try authenticating first.') -+ // sendEncryptionKeyResponse() -+ // client.once('set_compression', () => { -+ // clearTimeout(loginTimeout) -+ // }) - } - - function onJoinServerResponse (err) { -diff --git a/src/client/pluginChannels.js b/src/client/pluginChannels.js -index 671eb452f31e6b5fcd57d715f1009d010160c65f..7f69f511c8fb97d431ec5125c851b49be8e2ab76 100644 ---- a/src/client/pluginChannels.js -+++ b/src/client/pluginChannels.js -@@ -57,7 +57,7 @@ module.exports = function (client, options) { - try { - packet.data = proto.parsePacketBuffer(channel, packet.data).data - } catch (error) { -- client.emit('error', error) -+ client.emit('error', error, { customPayload: packet }) - return - } - } -diff --git a/src/client.js b/src/client.js -index e369e77d055ba919e8f9da7b8e8b5dc879c74cf4..54bb9e6644388e9b6bd42b3012951875989cdf0c 100644 ---- a/src/client.js -+++ b/src/client.js -@@ -111,7 +111,13 @@ class Client extends EventEmitter { - this._hasBundlePacket = false - } - } else { -- emitPacket(parsed) -+ try { -+ emitPacket(parsed) -+ } catch (err) { -+ console.log('Client incorrectly handled packet ' + parsed.metadata.name) -+ console.error(err) -+ // todo investigate why it doesn't close the stream even if unhandled there -+ } - } - }) - } -@@ -169,7 +175,10 @@ class Client extends EventEmitter { - } - - const onFatalError = (err) => { -- this.emit('error', err) -+ // todo find out what is trying to write after client disconnect -+ if(err.code !== 'ECONNABORTED') { -+ this.emit('error', err) -+ } - endSocket() - } - -@@ -198,6 +207,10 @@ class Client extends EventEmitter { - serializer -> framer -> socket -> splitter -> deserializer */ - if (this.serializer) { - this.serializer.end() -+ setTimeout(() => { -+ this.socket?.end() -+ this.socket?.emit('end') -+ }, 2000) // allow the serializer to finish writing - } else { - if (this.socket) this.socket.end() - } -@@ -243,6 +256,7 @@ class Client extends EventEmitter { - debug('writing packet ' + this.state + '.' + name) - debug(params) - } -+ this.emit('writePacket', name, params) - this.serializer.write({ name, params }) - } - diff --git a/patches/mineflayer-item-map-downloader@1.2.0.patch b/patches/mineflayer-item-map-downloader@1.2.0.patch deleted file mode 100644 index 97813cc1..00000000 --- a/patches/mineflayer-item-map-downloader@1.2.0.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/package.json b/package.json -index 2a7aff75a9f1c7fe4eebb657002e58f4581dad0e..cd3490983353336efeb13f24f0af69c6c1d16444 100644 ---- a/package.json -+++ b/package.json -@@ -9,10 +9,7 @@ - "keywords": [], - "author": "Ic3Tank", - "license": "ISC", -- "dependencies": { -- "mineflayer": "^4.3.0", -- "sharp": "^0.30.6" -- }, -+ "dependencies": {}, - "devDependencies": { - "mineflayer-item-map-downloader": "file:./" - } diff --git a/patches/pixelarticons@1.8.1.patch b/patches/pixelarticons@1.8.1.patch deleted file mode 100644 index b65b6f2b..00000000 --- a/patches/pixelarticons@1.8.1.patch +++ /dev/null @@ -1,28 +0,0 @@ -diff --git a/fonts/pixelart-icons-font.css b/fonts/pixelart-icons-font.css -index 3b2ebe839370d96bf93ef5ca94a827f07e49378d..4f8d76be2ca6e4ddc43c68d0a6f0f69979165ab4 100644 ---- a/fonts/pixelart-icons-font.css -+++ b/fonts/pixelart-icons-font.css -@@ -1,16 +1,13 @@ - @font-face { - font-family: "pixelart-icons-font"; -- src: url('pixelart-icons-font.eot?t=1711815892278'); /* IE9*/ -- src: url('pixelart-icons-font.eot?t=1711815892278#iefix') format('embedded-opentype'), /* IE6-IE8 */ -+ src: - url("pixelart-icons-font.woff2?t=1711815892278") format("woff2"), - url("pixelart-icons-font.woff?t=1711815892278") format("woff"), -- url('pixelart-icons-font.ttf?t=1711815892278') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ -- url('pixelart-icons-font.svg?t=1711815892278#pixelart-icons-font') format('svg'); /* iOS 4.1- */ -+ url('pixelart-icons-font.ttf?t=1711815892278') format('truetype'); /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ - } - - [class^="pixelart-icons-font-"], [class*=" pixelart-icons-font-"] { - font-family: 'pixelart-icons-font' !important; -- font-size:24px; - font-style:normal; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -@@ -503,4 +500,3 @@ - .pixelart-icons-font-zap:before { content: "\ebe4"; } - .pixelart-icons-font-zoom-in:before { content: "\ebe5"; } - .pixelart-icons-font-zoom-out:before { content: "\ebe6"; } -- diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 5bcd74a0..00000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,20809 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -overrides: - mineflayer: github:zardoy/mineflayer#gen-the-master - '@nxg-org/mineflayer-physics-util': 1.8.10 - buffer: ^6.0.3 - vec3: 0.1.10 - three: 0.154.0 - diamond-square: github:zardoy/diamond-square - prismarine-block: github:zardoy/prismarine-block#next-era - prismarine-world: github:zardoy/prismarine-world#next-era - minecraft-data: 3.98.0 - prismarine-provider-anvil: github:zardoy/prismarine-provider-anvil#everything - prismarine-physics: github:zardoy/prismarine-physics - minecraft-protocol: github:PrismarineJS/node-minecraft-protocol#master - react: ^18.2.0 - prismarine-chunk: github:zardoy/prismarine-chunk#master - prismarine-item: latest - -patchedDependencies: - minecraft-protocol: - hash: 4ebdae314c68d01ce7879445c0b8bde5f90373abba8b66ed00d42e7a5f542f8b - path: patches/minecraft-protocol.patch - mineflayer-item-map-downloader@1.2.0: - hash: a731ebbace2d8790c973ab3a5ba33494a6e9658533a9710dd8ba36f86db061ad - path: patches/mineflayer-item-map-downloader@1.2.0.patch - pixelarticons@1.8.1: - hash: 533230072bc402f425c86abd3d0356fe087b14cab2a254d93f419b083f2d8dfa - path: patches/pixelarticons@1.8.1.patch - -importers: - - .: - dependencies: - '@dimaka/interface': - specifier: 0.0.3-alpha.0 - version: 0.0.3-alpha.0(@babel/core@7.26.9)(@popperjs/core@2.11.8)(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@floating-ui/react': - specifier: ^0.26.1 - version: 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@monaco-editor/react': - specifier: ^4.7.0 - version: 4.7.0(monaco-editor@0.52.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@nxg-org/mineflayer-auto-jump': - specifier: ^0.7.18 - version: 0.7.18 - '@nxg-org/mineflayer-tracker': - specifier: 1.3.0 - version: 1.3.0(encoding@0.1.13) - '@react-oauth/google': - specifier: ^0.12.1 - version: 0.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@stylistic/eslint-plugin': - specifier: ^2.6.1 - version: 2.13.0(eslint@8.57.1)(typescript@5.5.4) - '@types/gapi': - specifier: ^0.0.47 - version: 0.0.47 - '@types/react': - specifier: ^18.2.20 - version: 18.3.18 - '@types/react-dom': - specifier: ^18.2.7 - version: 18.3.5(@types/react@18.3.18) - '@types/wicg-file-system-access': - specifier: ^2023.10.2 - version: 2023.10.5 - '@xmcl/text-component': - specifier: ^2.1.3 - version: 2.1.3 - '@zardoy/react-util': - specifier: ^0.2.4 - version: 0.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@zardoy/utils': - specifier: ^0.0.11 - version: 0.0.11 - adm-zip: - specifier: ^0.5.12 - version: 0.5.16 - browserfs: - specifier: github:zardoy/browserfs#build - version: https://codeload.github.com/zardoy/browserfs/tar.gz/e60ca69e74888e057a96a468afe1d62347d3f56f - change-case: - specifier: ^5.1.2 - version: 5.4.4 - classnames: - specifier: ^2.5.1 - version: 2.5.1 - compression: - specifier: ^1.7.4 - version: 1.8.0 - cors: - specifier: ^2.8.5 - version: 2.8.5 - debug: - specifier: ^4.3.4 - version: 4.4.0(supports-color@8.1.1) - deepslate: - specifier: ^0.23.5 - version: 0.23.5 - diff-match-patch: - specifier: ^1.0.5 - version: 1.0.5 - eruda: - specifier: ^3.0.1 - version: 3.4.1 - esbuild: - specifier: ^0.19.3 - version: 0.19.12 - esbuild-plugin-polyfill-node: - specifier: ^0.3.0 - version: 0.3.0(esbuild@0.19.12) - express: - specifier: ^4.18.2 - version: 4.21.2 - filesize: - specifier: ^10.0.12 - version: 10.1.6 - flying-squid: - specifier: npm:@zardoy/flying-squid@^0.0.104 - version: '@zardoy/flying-squid@0.0.104(encoding@0.1.13)' - framer-motion: - specifier: ^12.9.2 - version: 12.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - fs-extra: - specifier: ^11.1.1 - version: 11.3.0 - google-drive-browserfs: - specifier: github:zardoy/browserfs#google-drive - version: browserfs@https://codeload.github.com/zardoy/browserfs/tar.gz/ab58ae8ef00e3a31db01909e365e6cb5188436e0 - jszip: - specifier: ^3.10.1 - version: 3.10.1 - lodash-es: - specifier: ^4.17.21 - version: 4.17.21 - mcraft-fun-mineflayer: - specifier: ^0.1.23 - version: 0.1.23(encoding@0.1.13)(mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/dd3b1ff38506d6f72d90e8444186e4e75fe82659(encoding@0.1.13)) - minecraft-data: - specifier: 3.98.0 - version: 3.98.0 - minecraft-protocol: - specifier: github:PrismarineJS/node-minecraft-protocol#master - version: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/bf89f7e86526c54d8c43f555d8f6dfa4948fd2d9(patch_hash=4ebdae314c68d01ce7879445c0b8bde5f90373abba8b66ed00d42e7a5f542f8b)(encoding@0.1.13) - mineflayer-item-map-downloader: - specifier: github:zardoy/mineflayer-item-map-downloader - version: https://codeload.github.com/zardoy/mineflayer-item-map-downloader/tar.gz/a8d210ecdcf78dd082fa149a96e1612cc9747824(patch_hash=a731ebbace2d8790c973ab3a5ba33494a6e9658533a9710dd8ba36f86db061ad)(encoding@0.1.13) - mojangson: - specifier: ^2.0.4 - version: 2.0.4 - net-browserify: - specifier: github:zardoy/prismarinejs-net-browserify - version: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/e754999ffdea67853bc9b10553b5e9908b40f618 - node-gzip: - specifier: ^1.1.2 - version: 1.1.2 - peerjs: - specifier: ^1.5.0 - version: 1.5.4 - pixelarticons: - specifier: ^1.8.1 - version: 1.8.1(patch_hash=533230072bc402f425c86abd3d0356fe087b14cab2a254d93f419b083f2d8dfa) - pretty-bytes: - specifier: ^6.1.1 - version: 6.1.1 - prismarine-provider-anvil: - specifier: github:zardoy/prismarine-provider-anvil#everything - version: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/1d548fac63fe977c8281f0a9a522b37e4d92d0b7(minecraft-data@3.98.0) - prosemirror-example-setup: - specifier: ^1.2.2 - version: 1.2.3 - prosemirror-markdown: - specifier: ^1.12.0 - version: 1.13.1 - prosemirror-menu: - specifier: ^1.2.4 - version: 1.2.4 - prosemirror-state: - specifier: ^1.4.3 - version: 1.4.3 - prosemirror-view: - specifier: ^1.33.1 - version: 1.38.1 - qrcode.react: - specifier: ^3.1.0 - version: 3.2.0(react@18.3.1) - react: - specifier: ^18.2.0 - version: 18.3.1 - react-dom: - specifier: ^18.2.0 - version: 18.3.1(react@18.3.1) - react-select: - specifier: ^5.8.0 - version: 5.10.1(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-zoom-pan-pinch: - specifier: 3.4.4 - version: 3.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - remark: - specifier: ^15.0.1 - version: 15.0.1 - sanitize-filename: - specifier: ^1.6.3 - version: 1.6.3 - skinview3d: - specifier: ^3.0.1 - version: 3.1.0 - source-map-js: - specifier: ^1.0.2 - version: 1.2.1 - stats-gl: - specifier: ^1.0.5 - version: 1.0.7 - stats.js: - specifier: ^0.17.0 - version: 0.17.0 - tabbable: - specifier: ^6.2.0 - version: 6.2.0 - title-case: - specifier: 3.x - version: 3.0.3 - ua-parser-js: - specifier: ^1.0.37 - version: 1.0.40 - use-typed-event-listener: - specifier: ^4.0.2 - version: 4.0.2(react@18.3.1)(typescript@5.5.4) - valtio: - specifier: ^1.11.1 - version: 1.13.2(@types/react@18.3.18)(react@18.3.1) - vec3: - specifier: 0.1.10 - version: 0.1.10 - wait-on: - specifier: ^7.2.0 - version: 7.2.0(debug@4.4.0) - workbox-build: - specifier: ^7.0.0 - version: 7.3.0(@types/babel__core@7.20.5) - devDependencies: - '@rsbuild/core': - specifier: 1.3.5 - version: 1.3.5 - '@rsbuild/plugin-node-polyfill': - specifier: 1.3.0 - version: 1.3.0(@rsbuild/core@1.3.5) - '@rsbuild/plugin-react': - specifier: 1.2.0 - version: 1.2.0(@rsbuild/core@1.3.5) - '@rsbuild/plugin-type-check': - specifier: 1.2.1 - version: 1.2.1(@rsbuild/core@1.3.5)(@rspack/core@1.3.3(@swc/helpers@0.5.15))(typescript@5.5.4) - '@rsbuild/plugin-typed-css-modules': - specifier: 1.0.2 - version: 1.0.2(@rsbuild/core@1.3.5) - '@storybook/addon-essentials': - specifier: ^7.4.6 - version: 7.6.20(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/addon-links': - specifier: ^7.4.6 - version: 7.6.20(react@18.3.1) - '@storybook/blocks': - specifier: ^7.4.6 - version: 7.6.20(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/react': - specifier: ^7.4.6 - version: 7.6.20(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) - '@storybook/react-vite': - specifier: ^7.4.6 - version: 7.6.20(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@2.79.2)(typescript@5.5.4)(vite@6.2.1(@types/node@22.13.9)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)) - '@types/diff-match-patch': - specifier: ^1.0.36 - version: 1.0.36 - '@types/lodash-es': - specifier: ^4.17.9 - version: 4.17.12 - '@types/stats.js': - specifier: ^0.17.1 - version: 0.17.3 - '@types/three': - specifier: 0.154.0 - version: 0.154.0 - '@types/ua-parser-js': - specifier: ^0.7.39 - version: 0.7.39 - '@types/wait-on': - specifier: ^5.3.4 - version: 5.3.4 - '@xmcl/installer': - specifier: ^5.1.0 - version: 5.4.0 - assert: - specifier: ^2.0.0 - version: 2.1.0 - browserify-zlib: - specifier: ^0.2.0 - version: 0.2.0 - buffer: - specifier: ^6.0.3 - version: 6.0.3 - constants-browserify: - specifier: ^1.0.0 - version: 1.0.0 - contro-max: - specifier: ^0.1.9 - version: 0.1.9(typescript@5.5.4) - crypto-browserify: - specifier: ^3.12.0 - version: 3.12.1 - cypress-esbuild-preprocessor: - specifier: ^1.0.2 - version: 1.0.2 - eslint: - specifier: ^8.50.0 - version: 8.57.1 - eslint-config-zardoy: - specifier: ^0.2.17 - version: 0.2.17(eslint-plugin-react-hooks@5.2.0(eslint@8.57.1))(eslint-plugin-react@7.37.4(eslint@8.57.1))(eslint@8.57.1)(typescript@5.5.4) - events: - specifier: ^3.3.0 - version: 3.3.0 - gzip-size: - specifier: ^7.0.0 - version: 7.0.0 - http-browserify: - specifier: ^1.7.0 - version: 1.7.0 - http-server: - specifier: ^14.1.1 - version: 14.1.1(debug@4.4.0) - https-browserify: - specifier: ^1.0.0 - version: 1.0.0 - mc-assets: - specifier: ^0.2.62 - version: 0.2.62 - minecraft-inventory-gui: - specifier: github:zardoy/minecraft-inventory-gui#next - version: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/89c33d396f3fde4804c71f4be3c203ade1833b41(@types/react@18.3.18)(react@18.3.1) - mineflayer: - specifier: github:zardoy/mineflayer#gen-the-master - version: https://codeload.github.com/zardoy/mineflayer/tar.gz/dd3b1ff38506d6f72d90e8444186e4e75fe82659(encoding@0.1.13) - mineflayer-mouse: - specifier: ^0.1.21 - version: 0.1.21 - npm-run-all: - specifier: ^4.1.5 - version: 4.1.5 - os-browserify: - specifier: ^0.3.0 - version: 0.3.0 - path-browserify: - specifier: ^1.0.1 - version: 1.0.1 - path-exists-cli: - specifier: ^2.0.0 - version: 2.0.0 - process: - specifier: github:PrismarineJS/node-process - version: https://codeload.github.com/PrismarineJS/node-process/tar.gz/380d0b4f4c86f1b65b216c311bf00431f314e88e - renderer: - specifier: link:renderer - version: link:renderer - rimraf: - specifier: ^5.0.1 - version: 5.0.10 - storybook: - specifier: ^7.4.6 - version: 7.6.20(encoding@0.1.13) - stream-browserify: - specifier: ^3.0.0 - version: 3.0.0 - three: - specifier: 0.154.0 - version: 0.154.0 - timers-browserify: - specifier: ^2.0.12 - version: 2.0.12 - typescript: - specifier: 5.5.4 - version: 5.5.4 - vitest: - specifier: ^0.34.6 - version: 0.34.6(terser@5.39.0) - yaml: - specifier: ^2.3.2 - version: 2.7.0 - optionalDependencies: - cypress: - specifier: ^10.11.0 - version: 10.11.0 - cypress-plugin-snapshots: - specifier: ^1.4.4 - version: 1.4.4(cypress@10.11.0)(debug@4.4.0) - sharp: - specifier: ^0.33.5 - version: 0.33.5 - systeminformation: - specifier: ^5.21.22 - version: 5.25.11 - - renderer: - dependencies: - '@tweenjs/tween.js': - specifier: ^20.0.3 - version: 20.0.3 - assert: - specifier: ^2.0.0 - version: 2.1.0 - buffer: - specifier: ^6.0.3 - version: 6.0.3 - filesize: - specifier: ^10.0.12 - version: 10.1.6 - fs-extra: - specifier: ^11.0.0 - version: 11.3.0 - lil-gui: - specifier: ^0.18.2 - version: 0.18.2 - minecraft-wrap: - specifier: ^1.3.0 - version: 1.6.0(encoding@0.1.13) - minecrafthawkeye: - specifier: ^1.3.6 - version: 1.3.9 - prismarine-block: - specifier: github:zardoy/prismarine-block#next-era - version: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 - prismarine-chunk: - specifier: github:zardoy/prismarine-chunk#master - version: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/c5feac83b61d95feb4d4f22c063dacfb8c192a9f(minecraft-data@3.98.0) - prismarine-schematic: - specifier: ^1.2.0 - version: 1.2.3 - process: - specifier: ^0.11.10 - version: 0.11.10 - renderer: - specifier: link:./ - version: 'link:' - socket.io: - specifier: ^4.0.0 - version: 4.8.1 - socket.io-client: - specifier: ^4.0.0 - version: 4.8.1 - three-stdlib: - specifier: ^2.26.11 - version: 2.35.14(three@0.154.0) - three.meshline: - specifier: ^1.3.0 - version: 1.4.0 - tsx: - specifier: ^4.7.0 - version: 4.19.3 - vec3: - specifier: 0.1.10 - version: 0.1.10 - devDependencies: - live-server: - specifier: ^1.2.2 - version: 1.2.2 - optionalDependencies: - canvas: - specifier: ^2.11.2 - version: 2.11.2(encoding@0.1.13) - node-canvas-webgl: - specifier: ^0.3.0 - version: 0.3.0(encoding@0.1.13) - - renderer/viewer/sign-renderer: - dependencies: - vite: - specifier: ^4.4.9 - version: 4.5.9(@types/node@22.13.9)(terser@5.39.0) - -packages: - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@apideck/better-ajv-errors@0.3.6': - resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} - engines: {node: '>=10'} - peerDependencies: - ajv: '>=8' - - '@aw-web-design/x-default-browser@1.4.126': - resolution: {integrity: sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==} - hasBin: true - - '@azure/msal-common@14.16.0': - resolution: {integrity: sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==} - engines: {node: '>=0.8.0'} - - '@azure/msal-node@2.16.2': - resolution: {integrity: sha512-An7l1hEr0w1HMMh1LU+rtDtqL7/jw74ORlc9Wnh06v7TU/xpG39/Zdr1ZJu3QpjUfKJ+E0/OXMW8DRSWTlh7qQ==} - engines: {node: '>=16'} - - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.26.8': - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.26.9': - resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.26.9': - resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.26.5': - resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-create-class-features-plugin@7.26.9': - resolution: {integrity: sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-create-regexp-features-plugin@7.26.3': - resolution: {integrity: sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-define-polyfill-provider@0.6.3': - resolution: {integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - '@babel/helper-member-expression-to-functions@7.25.9': - resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-optimise-call-expression@7.25.9': - resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-remap-async-to-generator@7.25.9': - resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-replace-supers@7.26.5': - resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-wrap-function@7.25.9': - resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.26.9': - resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.26.9': - resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': - resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': - resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': - resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': - resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': - resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-flow@7.26.0': - resolution: {integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-assertions@7.26.0': - resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-jsx@7.25.9': - resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-typescript@7.25.9': - resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-arrow-functions@7.25.9': - resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-async-generator-functions@7.26.8': - resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-async-to-generator@7.25.9': - resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-block-scoped-functions@7.26.5': - resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-block-scoping@7.25.9': - resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-class-properties@7.25.9': - resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-class-static-block@7.26.0': - resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - - '@babel/plugin-transform-classes@7.25.9': - resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-computed-properties@7.25.9': - resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-destructuring@7.25.9': - resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-dotall-regex@7.25.9': - resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-duplicate-keys@7.25.9': - resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-dynamic-import@7.25.9': - resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-exponentiation-operator@7.26.3': - resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-export-namespace-from@7.25.9': - resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-flow-strip-types@7.26.5': - resolution: {integrity: sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-for-of@7.26.9': - resolution: {integrity: sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-function-name@7.25.9': - resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-json-strings@7.25.9': - resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-literals@7.25.9': - resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-logical-assignment-operators@7.25.9': - resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-member-expression-literals@7.25.9': - resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-amd@7.25.9': - resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-commonjs@7.26.3': - resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-systemjs@7.25.9': - resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-umd@7.25.9': - resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-new-target@7.25.9': - resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': - resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-numeric-separator@7.25.9': - resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-rest-spread@7.25.9': - resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-super@7.25.9': - resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-catch-binding@7.25.9': - resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-chaining@7.25.9': - resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-parameters@7.25.9': - resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-methods@7.25.9': - resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-property-in-object@7.25.9': - resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-property-literals@7.25.9': - resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-self@7.25.9': - resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-source@7.25.9': - resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regenerator@7.25.9': - resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regexp-modifiers@7.26.0': - resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-reserved-words@7.25.9': - resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-shorthand-properties@7.25.9': - resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-spread@7.25.9': - resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-sticky-regex@7.25.9': - resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-template-literals@7.26.8': - resolution: {integrity: sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typeof-symbol@7.26.7': - resolution: {integrity: sha512-jfoTXXZTgGg36BmhqT3cAYK5qkmqvJpvNrPhaK/52Vgjhw4Rq29s9UqpWWV0D6yuRmgiFH/BUVlkl96zJWqnaw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typescript@7.26.8': - resolution: {integrity: sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-escapes@7.25.9': - resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-property-regex@7.25.9': - resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-regex@7.25.9': - resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-sets-regex@7.25.9': - resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/preset-env@7.26.9': - resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-flow@7.25.9': - resolution: {integrity: sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - - '@babel/preset-typescript@7.26.0': - resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/register@7.25.9': - resolution: {integrity: sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/runtime@7.26.9': - resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.26.9': - resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.26.9': - resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.26.9': - resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} - engines: {node: '>=6.9.0'} - - '@base2/pretty-print-object@1.0.1': - resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} - - '@colors/colors@1.5.0': - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - - '@cypress/request@2.88.12': - resolution: {integrity: sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==} - engines: {node: '>= 6'} - - '@cypress/xvfb@1.2.4': - resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==} - - '@dimaka/interface@0.0.3-alpha.0': - resolution: {integrity: sha512-BzRUaLk+jhC1uvcix4SXRGhw7k39pldlvwtRT0NGFsuQt1uMV9vOhGMzm3rLorVXQ7vAmqcZk3Hy8oYlXKQoDw==} - peerDependencies: - react: ^18.2.0 - - '@discoveryjs/json-ext@0.5.7': - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - - '@emnapi/runtime@1.3.1': - resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} - - '@emotion/babel-plugin@11.13.5': - resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} - - '@emotion/cache@11.14.0': - resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} - - '@emotion/css@11.5.0': - resolution: {integrity: sha512-mqjz/3aqR9rp40M+pvwdKYWxlQK4Nj3cnNjo3Tx6SM14dSsEn7q/4W2/I7PlgG+mb27iITHugXuBIHH/QwUBVQ==} - peerDependencies: - '@babel/core': ^7.0.0 - peerDependenciesMeta: - '@babel/core': - optional: true - - '@emotion/hash@0.9.2': - resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} - - '@emotion/memoize@0.9.0': - resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} - - '@emotion/react@11.14.0': - resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@emotion/serialize@1.3.3': - resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} - - '@emotion/sheet@1.4.0': - resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} - - '@emotion/unitless@0.10.0': - resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} - - '@emotion/use-insertion-effect-with-fallbacks@1.2.0': - resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} - peerDependencies: - react: ^18.2.0 - - '@emotion/utils@1.4.2': - resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} - - '@emotion/weak-memoize@0.4.0': - resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} - - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - - '@esbuild/aix-ppc64@0.25.0': - resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.18.20': - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.25.0': - resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.18.20': - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.25.0': - resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.18.20': - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.25.0': - resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.18.20': - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.25.0': - resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.18.20': - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.0': - resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.18.20': - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.25.0': - resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.18.20': - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.0': - resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.18.20': - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.25.0': - resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.18.20': - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.25.0': - resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.18.20': - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.25.0': - resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.18.20': - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.25.0': - resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.18.20': - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.25.0': - resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.18.20': - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.25.0': - resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.18.20': - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.0': - resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.18.20': - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.25.0': - resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.18.20': - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.25.0': - resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.0': - resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.18.20': - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.0': - resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.0': - resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.18.20': - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.0': - resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.18.20': - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.25.0': - resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.18.20': - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.25.0': - resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.18.20': - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.25.0': - resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.18.20': - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.25.0': - resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.4.1': - resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@fal-works/esbuild-plugin-global-externals@2.1.2': - resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} - - '@fastify/busboy@2.1.1': - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - - '@floating-ui/core@1.6.9': - resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} - - '@floating-ui/dom@1.6.13': - resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} - - '@floating-ui/react-dom@2.1.2': - resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} - peerDependencies: - react: ^18.2.0 - react-dom: '>=16.8.0' - - '@floating-ui/react@0.26.28': - resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} - peerDependencies: - react: ^18.2.0 - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.2.9': - resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} - - '@gar/promisify@1.1.3': - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - - '@hapi/hoek@9.3.0': - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - - '@hapi/topo@5.1.0': - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - - '@img/sharp-darwin-arm64@0.33.5': - resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [darwin] - - '@img/sharp-darwin-x64@0.33.5': - resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [darwin] - - '@img/sharp-libvips-darwin-arm64@1.0.4': - resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} - cpu: [arm64] - os: [darwin] - - '@img/sharp-libvips-darwin-x64@1.0.4': - resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} - cpu: [x64] - os: [darwin] - - '@img/sharp-libvips-linux-arm64@1.0.4': - resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} - cpu: [arm64] - os: [linux] - - '@img/sharp-libvips-linux-arm@1.0.5': - resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} - cpu: [arm] - os: [linux] - - '@img/sharp-libvips-linux-s390x@1.0.4': - resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} - cpu: [s390x] - os: [linux] - - '@img/sharp-libvips-linux-x64@1.0.4': - resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} - cpu: [x64] - os: [linux] - - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} - cpu: [arm64] - os: [linux] - - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} - cpu: [x64] - os: [linux] - - '@img/sharp-linux-arm64@0.33.5': - resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - - '@img/sharp-linux-arm@0.33.5': - resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm] - os: [linux] - - '@img/sharp-linux-s390x@0.33.5': - resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [s390x] - os: [linux] - - '@img/sharp-linux-x64@0.33.5': - resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - - '@img/sharp-linuxmusl-arm64@0.33.5': - resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [arm64] - os: [linux] - - '@img/sharp-linuxmusl-x64@0.33.5': - resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [linux] - - '@img/sharp-wasm32@0.33.5': - resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [wasm32] - - '@img/sharp-win32-ia32@0.33.5': - resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [ia32] - os: [win32] - - '@img/sharp-win32-x64@0.33.5': - resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [x64] - os: [win32] - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@istanbuljs/load-nyc-config@1.1.0': - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/transform@29.7.0': - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jimp/bmp@0.10.3': - resolution: {integrity: sha512-keMOc5woiDmONXsB/6aXLR4Z5Q+v8lFq3EY2rcj2FmstbDMhRuGbmcBxlEgOqfRjwvtf/wOtJ3Of37oAWtVfLg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/core@0.10.3': - resolution: {integrity: sha512-Gd5IpL3U2bFIO57Fh/OA3HCpWm4uW/pU01E75rI03BXfTdz3T+J7TwvyG1XaqsQ7/DSlS99GXtLQPlfFIe28UA==} - - '@jimp/custom@0.10.3': - resolution: {integrity: sha512-nZmSI+jwTi5IRyNLbKSXQovoeqsw+D0Jn0SxW08wYQvdkiWA8bTlDQFgQ7HVwCAKBm8oKkDB/ZEo9qvHJ+1gAQ==} - - '@jimp/gif@0.10.3': - resolution: {integrity: sha512-vjlRodSfz1CrUvvrnUuD/DsLK1GHB/yDZXHthVdZu23zYJIW7/WrIiD1IgQ5wOMV7NocfrvPn2iqUfBP81/WWA==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/jpeg@0.10.3': - resolution: {integrity: sha512-AAANwgUZOt6f6P7LZxY9lyJ9xclqutYJlsxt3JbriXUGJgrrFAIkcKcqv1nObgmQASSAQKYaMV9KdHjMlWFKlQ==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-blit@0.10.3': - resolution: {integrity: sha512-5zlKlCfx4JWw9qUVC7GI4DzXyxDWyFvgZLaoGFoT00mlXlN75SarlDwc9iZ/2e2kp4bJWxz3cGgG4G/WXrbg3Q==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-blur@0.10.3': - resolution: {integrity: sha512-cTOK3rjh1Yjh23jSfA6EHCHjsPJDEGLC8K2y9gM7dnTUK1y9NNmkFS23uHpyjgsWFIoH9oRh2SpEs3INjCpZhQ==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-circle@0.10.3': - resolution: {integrity: sha512-51GAPIVelqAcfuUpaM5JWJ0iWl4vEjNXB7p4P7SX5udugK5bxXUjO6KA2qgWmdpHuCKtoNgkzWU9fNSuYp7tCA==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-color@0.10.3': - resolution: {integrity: sha512-RgeHUElmlTH7vpI4WyQrz6u59spiKfVQbsG/XUzfWGamFSixa24ZDwX/yV/Ts+eNaz7pZeIuv533qmKPvw2ujg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-contain@0.10.3': - resolution: {integrity: sha512-bYJKW9dqzcB0Ihc6u7jSyKa3juStzbLs2LFr6fu8TzA2WkMS/R8h+ddkiO36+F9ILTWHP0CIA3HFe5OdOGcigw==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-blit': '>=0.3.5' - '@jimp/plugin-resize': '>=0.3.5' - '@jimp/plugin-scale': '>=0.3.5' - - '@jimp/plugin-cover@0.10.3': - resolution: {integrity: sha512-pOxu0cM0BRPzdV468n4dMocJXoMbTnARDY/EpC3ZW15SpMuc/dr1KhWQHgoQX5kVW1Wt8zgqREAJJCQ5KuPKDA==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-crop': '>=0.3.5' - '@jimp/plugin-resize': '>=0.3.5' - '@jimp/plugin-scale': '>=0.3.5' - - '@jimp/plugin-crop@0.10.3': - resolution: {integrity: sha512-nB7HgOjjl9PgdHr076xZ3Sr6qHYzeBYBs9qvs3tfEEUeYMNnvzgCCGtUl6eMakazZFCMk3mhKmcB9zQuHFOvkg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-displace@0.10.3': - resolution: {integrity: sha512-8t3fVKCH5IVqI4lewe4lFFjpxxr69SQCz5/tlpDLQZsrNScNJivHdQ09zljTrVTCSgeCqQJIKgH2Q7Sk/pAZ0w==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-dither@0.10.3': - resolution: {integrity: sha512-JCX/oNSnEg1kGQ8ffZ66bEgQOLCY3Rn+lrd6v1jjLy/mn9YVZTMsxLtGCXpiCDC2wG/KTmi4862ysmP9do9dAQ==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-fisheye@0.10.3': - resolution: {integrity: sha512-RRZb1wqe+xdocGcFtj2xHU7sF7xmEZmIa6BmrfSchjyA2b32TGPWKnP3qyj7p6LWEsXn+19hRYbjfyzyebPElQ==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-flip@0.10.3': - resolution: {integrity: sha512-0epbi8XEzp0wmSjoW9IB0iMu0yNF17aZOxLdURCN3Zr+8nWPs5VNIMqSVa1Y62GSyiMDpVpKF/ITiXre+EqrPg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-rotate': '>=0.3.5' - - '@jimp/plugin-gaussian@0.10.3': - resolution: {integrity: sha512-25eHlFbHUDnMMGpgRBBeQ2AMI4wsqCg46sue0KklI+c2BaZ+dGXmJA5uT8RTOrt64/K9Wz5E+2n7eBnny4dfpQ==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-invert@0.10.3': - resolution: {integrity: sha512-effYSApWY/FbtlzqsKXlTLkgloKUiHBKjkQnqh5RL4oQxh/33j6aX+HFdDyQKtsXb8CMd4xd7wyiD2YYabTa0g==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-mask@0.10.3': - resolution: {integrity: sha512-twrg8q8TIhM9Z6Jcu9/5f+OCAPaECb0eKrrbbIajJqJ3bCUlj5zbfgIhiQIzjPJ6KjpnFPSqHQfHkU1Vvk/nVw==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-normalize@0.10.3': - resolution: {integrity: sha512-xkb5eZI/mMlbwKkDN79+1/t/+DBo8bBXZUMsT4gkFgMRKNRZ6NQPxlv1d3QpRzlocsl6UMxrHnhgnXdLAcgrXw==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-print@0.10.3': - resolution: {integrity: sha512-wjRiI6yjXsAgMe6kVjizP+RgleUCLkH256dskjoNvJzmzbEfO7xQw9g6M02VET+emnbY0CO83IkrGm2q43VRyg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-blit': '>=0.3.5' - - '@jimp/plugin-resize@0.10.3': - resolution: {integrity: sha512-rf8YmEB1d7Sg+g4LpqF0Mp+dfXfb6JFJkwlAIWPUOR7lGsPWALavEwTW91c0etEdnp0+JB9AFpy6zqq7Lwkq6w==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/plugin-rotate@0.10.3': - resolution: {integrity: sha512-YXLlRjm18fkW9MOHUaVAxWjvgZM851ofOipytz5FyKp4KZWDLk+dZK1JNmVmK7MyVmAzZ5jsgSLhIgj+GgN0Eg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-blit': '>=0.3.5' - '@jimp/plugin-crop': '>=0.3.5' - '@jimp/plugin-resize': '>=0.3.5' - - '@jimp/plugin-scale@0.10.3': - resolution: {integrity: sha512-5DXD7x7WVcX1gUgnlFXQa8F+Q3ThRYwJm+aesgrYvDOY+xzRoRSdQvhmdd4JEEue3lyX44DvBSgCIHPtGcEPaw==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-resize': '>=0.3.5' - - '@jimp/plugin-shadow@0.10.3': - resolution: {integrity: sha512-/nkFXpt2zVcdP4ETdkAUL0fSzyrC5ZFxdcphbYBodqD7fXNqChS/Un1eD4xCXWEpW8cnG9dixZgQgStjywH0Mg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-blur': '>=0.3.5' - '@jimp/plugin-resize': '>=0.3.5' - - '@jimp/plugin-threshold@0.10.3': - resolution: {integrity: sha512-Dzh0Yq2wXP2SOnxcbbiyA4LJ2luwrdf1MghNIt9H+NX7B+IWw/N8qA2GuSm9n4BPGSLluuhdAWJqHcTiREriVA==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - '@jimp/plugin-color': '>=0.8.0' - '@jimp/plugin-resize': '>=0.8.0' - - '@jimp/plugins@0.10.3': - resolution: {integrity: sha512-jTT3/7hOScf0EIKiAXmxwayHhryhc1wWuIe3FrchjDjr9wgIGNN2a7XwCgPl3fML17DXK1x8EzDneCdh261bkw==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/png@0.10.3': - resolution: {integrity: sha512-YKqk/dkl+nGZxSYIDQrqhmaP8tC3IK8H7dFPnnzFVvbhDnyYunqBZZO3SaZUKTichClRw8k/CjBhbc+hifSGWg==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/tiff@0.10.3': - resolution: {integrity: sha512-7EsJzZ5Y/EtinkBGuwX3Bi4S+zgbKouxjt9c82VJTRJOQgLWsE/RHqcyRCOQBhHAZ9QexYmDz34medfLKdoX0g==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/types@0.10.3': - resolution: {integrity: sha512-XGmBakiHZqseSWr/puGN+CHzx0IKBSpsKlmEmsNV96HKDiP6eu8NSnwdGCEq2mmIHe0JNcg1hqg59hpwtQ7Tiw==} - peerDependencies: - '@jimp/custom': '>=0.3.5' - - '@jimp/utils@0.10.3': - resolution: {integrity: sha512-VcSlQhkil4ReYmg1KkN+WqHyYfZ2XfZxDsKAHSfST1GEz/RQHxKZbX+KhFKtKflnL0F4e6DlNQj3vznMNXCR2w==} - - '@joshwooding/vite-plugin-react-docgen-typescript@0.3.0': - resolution: {integrity: sha512-2D6y7fNvFmsLmRt6UCOFJPvFoPMJGT0Uh1Wg0RaigUp7kdQPs6yYn8Dmx6GZkOH/NW0yMTwRz/p0SRMMRo50vA==} - peerDependencies: - typescript: '>= 4.3.x' - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@jsonjoy.com/base64@1.1.2': - resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pack@1.2.0': - resolution: {integrity: sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/util@1.5.0': - resolution: {integrity: sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jspm/core@2.1.0': - resolution: {integrity: sha512-3sRl+pkyFY/kLmHl0cgHiFp2xEqErA8N3ECjMs7serSUBmoJ70lBa0PG5t0IM6WJgdZNyyI0R8YFfi5wM8+mzg==} - - '@juggle/resize-observer@3.3.1': - resolution: {integrity: sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw==} - - '@juggle/resize-observer@3.4.0': - resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} - - '@mapbox/node-pre-gyp@1.0.11': - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true - - '@mdx-js/react@2.3.0': - resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} - peerDependencies: - react: ^18.2.0 - - '@module-federation/error-codes@0.11.2': - resolution: {integrity: sha512-ik1Qnn0I+WyEdprTck9WGlH41vGsVdUg8cfO+ZM02qOb2cZm5Vu3SlxGAobj6g7uAj0g8yINnd7h7Dci40BxQA==} - - '@module-federation/runtime-core@0.11.2': - resolution: {integrity: sha512-dia5kKybi6MFU0s5PgglJwN27k7n9Sf69Cy5xZ4BWaP0qlaXTsxHKO0PECHNt2Pt8jDdyU29sQ4DwAQfxpnXJQ==} - - '@module-federation/runtime-tools@0.11.2': - resolution: {integrity: sha512-4MJTGAxVq6vxQRkTtTlH7Mm9AVqgn0X9kdu+7RsL7T/qU+jeYsbrntN2CWG3GVVA8r5JddXyTI1iJ0VXQZLV1w==} - - '@module-federation/runtime@0.11.2': - resolution: {integrity: sha512-Ya9u/L6z2LvhgpqxuKCB7LcigIIRf1BbaxAZIH7mzbq/A7rZtTP7v+73E433jvgiAlbAfPSZkeoYGele6hfRwA==} - - '@module-federation/sdk@0.11.2': - resolution: {integrity: sha512-SBFe5xOamluT900J4AGBx+2/kCH/JbfqXoUwPSAC6PRzb8Y7LB0posnOGzmqYsLZXT37vp3d6AmJDsVoajDqxw==} - - '@module-federation/webpack-bundler-runtime@0.11.2': - resolution: {integrity: sha512-WdwIE6QF+MKs/PdVu0cKPETF743JB9PZ62/qf7Uo3gU4fjsUMc37RnbJZ/qB60EaHHfjwp1v6NnhZw1r4eVsnw==} - - '@monaco-editor/loader@1.5.0': - resolution: {integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==} - - '@monaco-editor/react@4.7.0': - resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==} - peerDependencies: - monaco-editor: '>= 0.25.0 < 1' - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - '@msgpack/msgpack@2.8.0': - resolution: {integrity: sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==} - engines: {node: '>= 10'} - - '@ndelangen/get-tarball@3.0.9': - resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@npmcli/fs@2.1.2': - resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - '@npmcli/move-file@2.0.1': - resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This functionality has been moved to @npmcli/fs - - '@nxg-org/mineflayer-auto-jump@0.7.18': - resolution: {integrity: sha512-O/nRCyWrRwFpcCXXSJhmt844c4a8KhkK4OJPAOKSc63tExIIQU/sipHgjgpy0B+gVDjSmLMPYXe71CN0W327Wg==} - - '@nxg-org/mineflayer-physics-util@1.8.10': - resolution: {integrity: sha512-JGIJEPauVmqoBFQ0I8ZtbaYo3mKn2N00srnDrWkCEt1qozyZWie4sYR0khjjwYubFCljMoWtoEA0+DLsHZLNFg==} - - '@nxg-org/mineflayer-tracker@1.3.0': - resolution: {integrity: sha512-HINrv51l2aZ/lDrcL77gSWDvf3Z3trd6kdiifXitCMDNdBT0FpWnXq9bi5Fr7yPpFGQ3fqGUIq5DQYYY84E9IA==} - - '@nxg-org/mineflayer-trajectories@1.2.0': - resolution: {integrity: sha512-yTDHn96fyWLKwdHdOGIrnt8nss4SJmxXwJn101o7aNI4sgdnUmwaX4FoNbmrEa9eZn6IwxaXIxDf+fJmKj9RIw==} - - '@nxg-org/mineflayer-util-plugin@1.8.4': - resolution: {integrity: sha512-hPaCZxU0Aq+gUSi/l6x7n32hUG6bnDugAMoQXD2dFE/gyNkmRSpmgH5+Y6G41w3H8P3Nl++upGCOlaxvZ7RuoA==} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@popperjs/core@2.11.8': - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - - '@radix-ui/number@1.0.1': - resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} - - '@radix-ui/primitive@1.0.1': - resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} - - '@radix-ui/primitive@1.1.1': - resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} - - '@radix-ui/react-arrow@1.0.3': - resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-collection@1.0.3': - resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-collection@1.1.2': - resolution: {integrity: sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-compose-refs@1.0.1': - resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-compose-refs@1.1.1': - resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-context@1.0.1': - resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-context@1.1.1': - resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-direction@1.0.1': - resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-direction@1.1.0': - resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dismissable-layer@1.0.4': - resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-focus-guards@1.0.1': - resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-focus-scope@1.0.3': - resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-id@1.0.1': - resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-id@1.1.0': - resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-popper@1.1.2': - resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-portal@1.0.3': - resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-primitive@1.0.3': - resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-primitive@2.0.2': - resolution: {integrity: sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-roving-focus@1.1.2': - resolution: {integrity: sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-select@1.2.2': - resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-separator@1.1.2': - resolution: {integrity: sha512-oZfHcaAp2Y6KFBX6I5P1u7CQoy4lheCGiYj+pGFrHy8E/VNRb5E39TkTr3JrV520csPBTZjkuKFdEsjS5EUNKQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-slot@1.0.2': - resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-slot@1.1.2': - resolution: {integrity: sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-toggle-group@1.1.2': - resolution: {integrity: sha512-JBm6s6aVG/nwuY5eadhU2zDi/IwYS0sDM5ZWb4nymv/hn3hZdkw+gENn0LP4iY1yCd7+bgJaCwueMYJIU3vk4A==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-toggle@1.1.2': - resolution: {integrity: sha512-lntKchNWx3aCHuWKiDY+8WudiegQvBpDRAYL8dKLRvKEH8VOpl0XX6SSU/bUBqIRJbcTy4+MW06Wv8vgp10rzQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-toolbar@1.1.2': - resolution: {integrity: sha512-wT20eQ7ScFk+kBMDmHp+lMk18cgxhu35b2Bn5deUcPxiVwfn5vuZgi7NGcHu8ocdkinahmp4FaSZysKDyRVPWQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-use-callback-ref@1.0.1': - resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-callback-ref@1.1.0': - resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-controllable-state@1.0.1': - resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-controllable-state@1.1.0': - resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-escape-keydown@1.0.3': - resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-layout-effect@1.0.1': - resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-layout-effect@1.1.0': - resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-previous@1.0.1': - resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-rect@1.0.1': - resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-size@1.0.1': - resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-visually-hidden@1.0.3': - resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^18.2.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/rect@1.0.1': - resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} - - '@react-oauth/google@0.12.1': - resolution: {integrity: sha512-qagsy22t+7UdkYAiT5ZhfM4StXi9PPNvw0zuwNmabrWyMKddczMtBIOARflbaIj+wHiQjnMAsZmzsUYuXeyoSg==} - peerDependencies: - react: ^18.2.0 - react-dom: '>=16.8.0' - - '@rollup/plugin-babel@5.3.1': - resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} - engines: {node: '>= 10.0.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@types/babel__core': ^7.1.9 - rollup: ^1.20.0||^2.0.0 - peerDependenciesMeta: - '@types/babel__core': - optional: true - - '@rollup/plugin-node-resolve@15.3.1': - resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/plugin-replace@2.4.2': - resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} - peerDependencies: - rollup: ^1.20.0 || ^2.0.0 - - '@rollup/plugin-terser@0.4.4': - resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/pluginutils@3.1.0': - resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} - engines: {node: '>= 8.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 - - '@rollup/pluginutils@5.1.4': - resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/rollup-android-arm-eabi@4.34.9': - resolution: {integrity: sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.34.9': - resolution: {integrity: sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.34.9': - resolution: {integrity: sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.34.9': - resolution: {integrity: sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.34.9': - resolution: {integrity: sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.34.9': - resolution: {integrity: sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.34.9': - resolution: {integrity: sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.34.9': - resolution: {integrity: sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.34.9': - resolution: {integrity: sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.34.9': - resolution: {integrity: sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-loongarch64-gnu@4.34.9': - resolution: {integrity: sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-powerpc64le-gnu@4.34.9': - resolution: {integrity: sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.34.9': - resolution: {integrity: sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.34.9': - resolution: {integrity: sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.34.9': - resolution: {integrity: sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.34.9': - resolution: {integrity: sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-win32-arm64-msvc@4.34.9': - resolution: {integrity: sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.34.9': - resolution: {integrity: sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.34.9': - resolution: {integrity: sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==} - cpu: [x64] - os: [win32] - - '@rsbuild/core@1.3.5': - resolution: {integrity: sha512-Fn6nJ4YvLO2UtFcoSPxgJoiUdS0Iix7X1BsyZ+DCj3SGpVCxp3Td9x58F5uhcRraMZFPB91wvcS/OabYwT3N2w==} - engines: {node: '>=16.7.0'} - hasBin: true - - '@rsbuild/plugin-node-polyfill@1.3.0': - resolution: {integrity: sha512-KvckyUg9wq3F1Iv/y4+mlcnO/E7vDklvMY7kF6CxnUYImroQVw/EDS0zDezkPvcm7aKTH5b0Jaa0iIcTNFzhVw==} - peerDependencies: - '@rsbuild/core': 1.x - peerDependenciesMeta: - '@rsbuild/core': - optional: true - - '@rsbuild/plugin-react@1.2.0': - resolution: {integrity: sha512-TXd0cvcLPF7OrO215vlGSyRXD6Fc3KQWhFuXFKOtRYp+C1Vc9oeW0GopUIStv2pI2/xtv2XX8GOAdJsnsc6lkA==} - peerDependencies: - '@rsbuild/core': 1.x - - '@rsbuild/plugin-type-check@1.2.1': - resolution: {integrity: sha512-PtbjeMqDQy8IiPDTuaj8ZmvR42b0AsRq6RUF6wxa8dDsOzD0Dl1GcvemVGCto+/Dh8frLUmnlWF+T8riBw5rtA==} - peerDependencies: - '@rsbuild/core': 1.x - peerDependenciesMeta: - '@rsbuild/core': - optional: true - - '@rsbuild/plugin-typed-css-modules@1.0.2': - resolution: {integrity: sha512-QX376pBXWeBrZBvYLP2HGGrHiWA5O0SDHwRoBNto5BqYDXhi6y+Eol2Hb/cY+h2ARKZVanMfUiJRABULOJ/FCQ==} - peerDependencies: - '@rsbuild/core': 1.x || ^1.0.1-beta.0 - peerDependenciesMeta: - '@rsbuild/core': - optional: true - - '@rspack/binding-darwin-arm64@1.3.3': - resolution: {integrity: sha512-vbzEdpRCZl5+HXWsVjzSDqB9ZVIlqldV+udHp4YDD8qiwdQznVaBZke0eMzZ7kaInqRPsZ+UHQuVk6JaH/JkMQ==} - cpu: [arm64] - os: [darwin] - - '@rspack/binding-darwin-x64@1.3.3': - resolution: {integrity: sha512-OXtY2s4nlYtUXkeJt8TQKKNIcN7PI8yDq0nqI75OfJoS4u1ZmRXJ8IMeSALLo8I+xD2RAF79tf7yhM/Y/AaiKQ==} - cpu: [x64] - os: [darwin] - - '@rspack/binding-linux-arm64-gnu@1.3.3': - resolution: {integrity: sha512-Lluq3RLYzyCMdXr/HyALKEPGsr+196x8Ccuy5AmIRosOdWuwtSiomSRH1Ka8REUFNHfYy5y9SzfmIZo/E0QEmg==} - cpu: [arm64] - os: [linux] - - '@rspack/binding-linux-arm64-musl@1.3.3': - resolution: {integrity: sha512-PIsicXWjOqzmoOutUqxpMNkCoKo+8/wxDyKxHFeu+5WIAxVFphe2d3H5qvEjc2MasWSdRmAVn9XiuIj2LIXFzA==} - cpu: [arm64] - os: [linux] - - '@rspack/binding-linux-x64-gnu@1.3.3': - resolution: {integrity: sha512-BtksK73ZFdny2T/wU1x0kxBF4ruYUUArZDyeGfpO+vd/1nNYqzzdhGvOksKmtdvsO38ETr2gZ9+XZyr1vpy9uQ==} - cpu: [x64] - os: [linux] - - '@rspack/binding-linux-x64-musl@1.3.3': - resolution: {integrity: sha512-jx86CxkTmyBz/eHDqZp1mCqBwY+UTEtaPlPoWFyGkJUR5ey6nQnxS+fhG34Rqz63chW+q/afwpGNGyALYdgc8g==} - cpu: [x64] - os: [linux] - - '@rspack/binding-win32-arm64-msvc@1.3.3': - resolution: {integrity: sha512-uXAdDzajFToVrH3fCNVDP/uKQ9i5FQjJc2aYxsnhS9Su/CZB+UQsOecbq6MnIN2s0B9GBKBG8QdQEtS3RtC6Hg==} - cpu: [arm64] - os: [win32] - - '@rspack/binding-win32-ia32-msvc@1.3.3': - resolution: {integrity: sha512-VBE6XsJ3IiAlozAywAIxAZ1Aqc2QVnEwBo0gP9998KkwL7wxB6Bg/OJnPbH3Q0ZaNWAQViC99rPC+5hSIdeSxw==} - cpu: [ia32] - os: [win32] - - '@rspack/binding-win32-x64-msvc@1.3.3': - resolution: {integrity: sha512-rOsNz4/DFgSENjEh0t9kFn89feuXK14/9wbmmFlT8VMpYOCcj4tKcAHjWg+Nzzj4FL+NSOC/81SrUF9J+C2R7w==} - cpu: [x64] - os: [win32] - - '@rspack/binding@1.3.3': - resolution: {integrity: sha512-zdwJ801tyC8k+Gu5RjNoc7bEtX0MgJzzVv9qpaMwcAUfUfwZgCzXPTqcGMDoNI+Z47Fw59/2fKCmgZhZn60AgA==} - - '@rspack/core@1.3.3': - resolution: {integrity: sha512-+mXVlFcYr0tWezZfJ/gR0fj8njRc7pzEMtTFa2NO5cfsNAKPF/SXm4rb55kfa63r0b3U3N7f2nKrJG9wyG7zMQ==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@rspack/tracing': ^1.x - '@swc/helpers': '>=0.5.1' - peerDependenciesMeta: - '@rspack/tracing': - optional: true - '@swc/helpers': - optional: true - - '@rspack/lite-tapable@1.0.1': - resolution: {integrity: sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==} - engines: {node: '>=16.0.0'} - - '@rspack/plugin-react-refresh@1.2.0': - resolution: {integrity: sha512-DTsbtggCfsiXE5QQtYMS8rKfEF8GIjwPDbgIT6Kg8BlAjpJY4jT5IisyhfIi7YOT3d5RIvu60iFB6Kr9sSMsnA==} - peerDependencies: - react-refresh: '>=0.10.0 <1.0.0' - webpack-hot-middleware: 2.x - peerDependenciesMeta: - webpack-hot-middleware: - optional: true - - '@rushstack/eslint-patch@1.10.5': - resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} - - '@sideway/address@4.1.5': - resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} - - '@sideway/formula@3.0.1': - resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} - - '@sideway/pinpoint@2.0.0': - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - - '@socket.io/component-emitter@3.1.2': - resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - - '@storybook/addon-actions@7.6.20': - resolution: {integrity: sha512-c/GkEQ2U9BC/Ew/IMdh+zvsh4N6y6n7Zsn2GIhJgcu9YEAa5aF2a9/pNgEGBMOABH959XE8DAOMERw/5qiLR8g==} - - '@storybook/addon-backgrounds@7.6.20': - resolution: {integrity: sha512-a7ukoaXT42vpKsMxkseIeO3GqL0Zst2IxpCTq5dSlXiADrcemSF/8/oNpNW9C4L6F1Zdt+WDtECXslEm017FvQ==} - - '@storybook/addon-controls@7.6.20': - resolution: {integrity: sha512-06ZT5Ce1sZW52B0s6XuokwjkKO9GqHlTUHvuflvd8wifxKlCmRvNUxjBvwh+ccGJ49ZS73LbMSLFgtmBEkCxbg==} - - '@storybook/addon-docs@7.6.20': - resolution: {integrity: sha512-XNfYRhbxH5JP7B9Lh4W06PtMefNXkfpV39Gaoih5HuqngV3eoSL4RikZYOMkvxRGQ738xc6axySU3+JKcP1OZg==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/addon-essentials@7.6.20': - resolution: {integrity: sha512-hCupSOiJDeOxJKZSgH0x5Mb2Xqii6mps21g5hpxac1XjhQtmGflShxi/xOHhK3sNqrbgTSbScfpUP3hUlZO/2Q==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/addon-highlight@7.6.20': - resolution: {integrity: sha512-7/x7xFdFyqCki5Dm3uBePldUs9l98/WxJ7rTHQuYqlX7kASwyN5iXPzuhmMRUhlMm/6G6xXtLabIpzwf1sFurA==} - - '@storybook/addon-links@7.6.20': - resolution: {integrity: sha512-iomSnBD90CA4MinesYiJkFX2kb3P1Psd/a1Y0ghlFEsHD4uMId9iT6sx2s16DYMja0SlPkrbWYnGukqaCjZpRw==} - peerDependencies: - react: ^18.2.0 - peerDependenciesMeta: - react: - optional: true - - '@storybook/addon-measure@7.6.20': - resolution: {integrity: sha512-i2Iq08bGfI7gZbG6Lb8uF/L287tnaGUR+2KFEmdBjH6+kgjWLiwfpanoPQpy4drm23ar0gUjX+L3Ri03VI5/Xg==} - - '@storybook/addon-outline@7.6.20': - resolution: {integrity: sha512-TdsIQZf/TcDsGoZ1XpO+9nBc4OKqcMIzY4SrI8Wj9dzyFLQ37s08gnZr9POci8AEv62NTUOVavsxcafllkzqDQ==} - - '@storybook/addon-toolbars@7.6.20': - resolution: {integrity: sha512-5Btg4i8ffWTDHsU72cqxC8nIv9N3E3ObJAc6k0llrmPBG/ybh3jxmRfs8fNm44LlEXaZ5qrK/petsXX3UbpIFg==} - - '@storybook/addon-viewport@7.6.20': - resolution: {integrity: sha512-i8mIw8BjLWAVHEQsOTE6UPuEGQvJDpsu1XZnOCkpfTfPMz73m+3td/PmLG7mMT2wPnLu9IZncKLCKTAZRbt/YQ==} - - '@storybook/blocks@7.6.20': - resolution: {integrity: sha512-xADKGEOJWkG0UD5jbY4mBXRlmj2C+CIupDL0/hpzvLvwobxBMFPKZIkcZIMvGvVnI/Ui+tJxQxLSuJ5QsPthUw==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/builder-manager@7.6.20': - resolution: {integrity: sha512-e2GzpjLaw6CM/XSmc4qJRzBF8GOoOyotyu3JrSPTYOt4RD8kjUsK4QlismQM1DQRu8i39aIexxmRbiJyD74xzQ==} - - '@storybook/builder-vite@7.6.20': - resolution: {integrity: sha512-q3vf8heE7EaVYTWlm768ewaJ9lh6v/KfoPPeHxXxzSstg4ByP9kg4E1mrfAo/l6broE9E9zo3/Q4gsM/G/rw8Q==} - peerDependencies: - '@preact/preset-vite': '*' - typescript: '>= 4.3.x' - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 - vite-plugin-glimmerx: '*' - peerDependenciesMeta: - '@preact/preset-vite': - optional: true - typescript: - optional: true - vite-plugin-glimmerx: - optional: true - - '@storybook/channels@7.6.20': - resolution: {integrity: sha512-4hkgPSH6bJclB2OvLnkZOGZW1WptJs09mhQ6j6qLjgBZzL/ZdD6priWSd7iXrmPiN5TzUobkG4P4Dp7FjkiO7A==} - - '@storybook/cli@7.6.20': - resolution: {integrity: sha512-ZlP+BJyqg7HlnXf7ypjG2CKMI/KVOn03jFIiClItE/jQfgR6kRFgtjRU7uajh427HHfjv9DRiur8nBzuO7vapA==} - hasBin: true - - '@storybook/client-logger@7.6.20': - resolution: {integrity: sha512-NwG0VIJQCmKrSaN5GBDFyQgTAHLNishUPLW1NrzqTDNAhfZUoef64rPQlinbopa0H4OXmlB+QxbQIb3ubeXmSQ==} - - '@storybook/codemod@7.6.20': - resolution: {integrity: sha512-8vmSsksO4XukNw0TmqylPmk7PxnfNfE21YsxFa7mnEBmEKQcZCQsNil4ZgWfG0IzdhTfhglAN4r++Ew0WE+PYA==} - - '@storybook/components@7.6.20': - resolution: {integrity: sha512-0d8u4m558R+W5V+rseF/+e9JnMciADLXTpsILrG+TBhwECk0MctIWW18bkqkujdCm8kDZr5U2iM/5kS1Noy7Ug==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/core-client@7.6.20': - resolution: {integrity: sha512-upQuQQinLmlOPKcT8yqXNtwIucZ4E4qegYZXH5HXRWoLAL6GQtW7sUVSIuFogdki8OXRncr/dz8OA+5yQyYS4w==} - - '@storybook/core-common@7.6.20': - resolution: {integrity: sha512-8H1zPWPjcmeD4HbDm4FDD0WLsfAKGVr566IZ4hG+h3iWVW57II9JW9MLBtiR2LPSd8u7o0kw64lwRGmtCO1qAw==} - - '@storybook/core-events@7.6.20': - resolution: {integrity: sha512-tlVDuVbDiNkvPDFAu+0ou3xBBYbx9zUURQz4G9fAq0ScgBOs/bpzcRrFb4mLpemUViBAd47tfZKdH4MAX45KVQ==} - - '@storybook/core-server@7.6.20': - resolution: {integrity: sha512-qC5BdbqqwMLTdCwMKZ1Hbc3+3AaxHYWLiJaXL9e8s8nJw89xV8c8l30QpbJOGvcDmsgY6UTtXYaJ96OsTr7MrA==} - - '@storybook/csf-plugin@7.6.20': - resolution: {integrity: sha512-dzBzq0dN+8WLDp6NxYS4G7BCe8+vDeDRBRjHmM0xb0uJ6xgQViL8SDplYVSGnk3bXE/1WmtvyRzQyTffBnaj9Q==} - - '@storybook/csf-tools@7.6.20': - resolution: {integrity: sha512-rwcwzCsAYh/m/WYcxBiEtLpIW5OH1ingxNdF/rK9mtGWhJxXRDV8acPkFrF8rtFWIVKoOCXu5USJYmc3f2gdYQ==} - - '@storybook/csf@0.1.13': - resolution: {integrity: sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q==} - - '@storybook/docs-mdx@0.1.0': - resolution: {integrity: sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==} - - '@storybook/docs-tools@7.6.20': - resolution: {integrity: sha512-Bw2CcCKQ5xGLQgtexQsI1EGT6y5epoFzOINi0FSTGJ9Wm738nRp5LH3dLk1GZLlywIXcYwOEThb2pM+pZeRQxQ==} - - '@storybook/global@5.0.0': - resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - - '@storybook/manager-api@7.6.20': - resolution: {integrity: sha512-gOB3m8hO3gBs9cBoN57T7jU0wNKDh+hi06gLcyd2awARQlAlywnLnr3s1WH5knih6Aq+OpvGBRVKkGLOkaouCQ==} - - '@storybook/manager@7.6.20': - resolution: {integrity: sha512-0Cf6WN0t7yEG2DR29tN5j+i7H/TH5EfPppg9h9/KiQSoFHk+6KLoy2p5do94acFU+Ro4+zzxvdCGbcYGKuArpg==} - - '@storybook/mdx2-csf@1.1.0': - resolution: {integrity: sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==} - - '@storybook/node-logger@7.6.20': - resolution: {integrity: sha512-l2i4qF1bscJkOplNffcRTsgQWYR7J51ewmizj5YrTM8BK6rslWT1RntgVJWB1RgPqvx6VsCz1gyP3yW1oKxvYw==} - - '@storybook/postinstall@7.6.20': - resolution: {integrity: sha512-AN4WPeNma2xC2/K/wP3I/GMbBUyeSGD3+86ZFFJFO1QmE/Zea6E+1aVlTd1iKHQUcNkZ9bZTrqkhPGVYx10pIw==} - - '@storybook/preview-api@7.6.20': - resolution: {integrity: sha512-3ic2m9LDZEPwZk02wIhNc3n3rNvbi7VDKn52hDXfAxnL5EYm7yDICAkaWcVaTfblru2zn0EDJt7ROpthscTW5w==} - - '@storybook/preview@7.6.20': - resolution: {integrity: sha512-cxYlZ5uKbCYMHoFpgleZqqGWEnqHrk5m5fT8bYSsDsdQ+X5wPcwI/V+v8dxYAdQcMphZVIlTjo6Dno9WG8qmVA==} - - '@storybook/react-dom-shim@7.6.20': - resolution: {integrity: sha512-SRvPDr9VWcS24ByQOVmbfZ655y5LvjXRlsF1I6Pr9YZybLfYbu3L5IicfEHT4A8lMdghzgbPFVQaJez46DTrkg==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/react-vite@7.6.20': - resolution: {integrity: sha512-uKuBFyGPZxpfR8vpDU/2OE9v7iTaxwL7ldd7k1swYd1rTSAPacTnEHSMl1R5AjUhkdI7gRmGN9q7qiVfK2XJCA==} - engines: {node: '>=16'} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 - - '@storybook/react@7.6.20': - resolution: {integrity: sha512-i5tKNgUbTNwlqBWGwPveDhh9ktlS0wGtd97A1ZgKZc3vckLizunlAFc7PRC1O/CMq5PTyxbuUb4RvRD2jWKwDA==} - engines: {node: '>=16.0.0'} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@storybook/router@7.6.20': - resolution: {integrity: sha512-mCzsWe6GrH47Xb1++foL98Zdek7uM5GhaSlrI7blWVohGa0qIUYbfJngqR4ZsrXmJeeEvqowobh+jlxg3IJh+w==} - - '@storybook/telemetry@7.6.20': - resolution: {integrity: sha512-dmAOCWmOscYN6aMbhCMmszQjoycg7tUPRVy2kTaWg6qX10wtMrvEtBV29W4eMvqdsoRj5kcvoNbzRdYcWBUOHQ==} - - '@storybook/theming@7.6.20': - resolution: {integrity: sha512-iT1pXHkSkd35JsCte6Qbanmprx5flkqtSHC6Gi6Umqoxlg9IjiLPmpHbaIXzoC06DSW93hPj5Zbi1lPlTvRC7Q==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/types@7.6.20': - resolution: {integrity: sha512-GncdY3x0LpbhmUAAJwXYtJDUQEwfF175gsjH0/fxPkxPoV7Sef9TM41jQLJW/5+6TnZoCZP/+aJZTJtq3ni23Q==} - - '@stylistic/eslint-plugin@2.13.0': - resolution: {integrity: sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.40.0' - - '@surma/rollup-plugin-off-main-thread@2.2.3': - resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} - - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - - '@tweenjs/tween.js@18.6.4': - resolution: {integrity: sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ==} - - '@tweenjs/tween.js@20.0.3': - resolution: {integrity: sha512-SYUe1UgY5HM05EB4+0B4arq2IPjvyzKXoklXKxSYrc2IFxGm1cBrqg5XbiB5uwbs0xY5j+rj986NAJMM0KZaUw==} - - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - - '@types/babel__traverse@7.20.6': - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} - - '@types/chai-subset@1.3.6': - resolution: {integrity: sha512-m8lERkkQj+uek18hXOZuec3W/fCRTrU4hrnXjH3qhHy96ytuPaPiWGgu7sJb7tZxZonO75vYAjCvpe/e4VUwRw==} - peerDependencies: - '@types/chai': <5.2.0 - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/cors@2.8.17': - resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} - - '@types/cross-spawn@6.0.6': - resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} - - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - - '@types/detect-port@1.3.5': - resolution: {integrity: sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==} - - '@types/diff-match-patch@1.0.36': - resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} - - '@types/doctrine@0.0.3': - resolution: {integrity: sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==} - - '@types/doctrine@0.0.9': - resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} - - '@types/draco3d@1.4.10': - resolution: {integrity: sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==} - - '@types/ejs@3.1.5': - resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} - - '@types/emscripten@1.40.0': - resolution: {integrity: sha512-MD2JJ25S4tnjnhjWyalMS6K6p0h+zQV6+Ylm+aGbiS8tSn/aHLSGNzBgduj6FB4zH0ax2GRMGYi/8G1uOxhXWA==} - - '@types/escodegen@0.0.6': - resolution: {integrity: sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==} - - '@types/estree@0.0.39': - resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} - - '@types/estree@0.0.51': - resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} - - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - - '@types/express-serve-static-core@4.19.6': - resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} - - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} - - '@types/find-cache-dir@3.2.1': - resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} - - '@types/gapi@0.0.47': - resolution: {integrity: sha512-/ZsLuq6BffMgbKMtZyDZ8vwQvTyKhKQ1G2K6VyWCgtHHhfSSXbk4+4JwImZiTjWNXfI2q1ZStAwFFHSkNoTkHA==} - - '@types/glob@7.2.0': - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - - '@types/graceful-fs@4.1.9': - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - - '@types/http-cache-semantics@4.0.4': - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - - '@types/js-cookie@2.2.7': - resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/linkify-it@5.0.0': - resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} - - '@types/lodash-es@4.17.12': - resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} - - '@types/lodash@4.17.16': - resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==} - - '@types/markdown-it@14.1.2': - resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} - - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - - '@types/mdurl@2.0.0': - resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - - '@types/mdx@2.0.13': - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} - - '@types/mime-types@2.1.4': - resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} - - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - - '@types/minimatch@5.1.2': - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - - '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - - '@types/node-fetch@2.6.12': - resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} - - '@types/node-rsa@1.1.4': - resolution: {integrity: sha512-dB0ECel6JpMnq5ULvpUTunx3yNm8e/dIkv8Zu9p2c8me70xIRUUG3q+qXRwcSf9rN3oqamv4116iHy90dJGRpA==} - - '@types/node@14.18.63': - resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} - - '@types/node@18.19.79': - resolution: {integrity: sha512-90K8Oayimbctc5zTPHPfZloc/lGVs7f3phUAAMcTgEPtg8kKquGZDERC8K4vkBYkQQh48msiYUslYtxTWvqcAg==} - - '@types/node@22.13.9': - resolution: {integrity: sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==} - - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - - '@types/offscreencanvas@2019.7.3': - resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} - - '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - - '@types/pretty-hrtime@1.0.3': - resolution: {integrity: sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==} - - '@types/prop-types@15.7.14': - resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - - '@types/qs@6.9.18': - resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/rbush@3.0.4': - resolution: {integrity: sha512-knSt9cCW8jj1ZSFcFeBZaX++OucmfPxxHiRwTahZfJlnQsek7O0bazTJHWD2RVj9LEoejUYF2de3/stf+QXcXw==} - - '@types/react-dom@18.3.5': - resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} - peerDependencies: - '@types/react': ^18.0.0 - - '@types/react-transition-group@4.4.12': - resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} - peerDependencies: - '@types/react': '*' - - '@types/react@18.3.18': - resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} - - '@types/readable-stream@4.0.18': - resolution: {integrity: sha512-21jK/1j+Wg+7jVw1xnSwy/2Q1VgVjWuFssbYGTREPUBeZ+rqVFl2udq0IkxzPC0ZhOzVceUbyIACFZKLqKEBlA==} - - '@types/resolve@1.20.2': - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - - '@types/resolve@1.20.6': - resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} - - '@types/sat@0.0.31': - resolution: {integrity: sha512-P4SVw79XheP1p92useDVpLYYOUQ6lpw2L7IdQz4dD23DZ8DiC1STgPOh72hjR5IZJBPQbzlICAbmjCKbwyYuxg==} - - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} - - '@types/sinonjs__fake-timers@8.1.1': - resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} - - '@types/sizzle@2.3.9': - resolution: {integrity: sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==} - - '@types/stats.js@0.17.3': - resolution: {integrity: sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==} - - '@types/three@0.154.0': - resolution: {integrity: sha512-IioqpGhch6FdLDh4zazRn3rXHj6Vn2nVOziJdXVbJFi9CaI65LtP9qqUtpzbsHK2Ezlox8NtsLNHSw3AQzucjA==} - - '@types/three@0.156.0': - resolution: {integrity: sha512-733bXDSRdlrxqOmQuOmfC1UBRuJ2pREPk8sWnx9MtIJEVDQMx8U0NQO5MVVaOrjzDPyLI+cFPim2X/ss9v0+LQ==} - - '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - - '@types/ua-parser-js@0.7.39': - resolution: {integrity: sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==} - - '@types/unist@2.0.11': - resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - - '@types/uuid@9.0.8': - resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - - '@types/wait-on@5.3.4': - resolution: {integrity: sha512-EBsPjFMrFlMbbUFf9D1Fp+PAB2TwmUn7a3YtHyD9RLuTIk1jDd8SxXVAoez2Ciy+8Jsceo2MYEYZzJ/DvorOKw==} - - '@types/webxr@0.5.21': - resolution: {integrity: sha512-geZIAtLzjGmgY2JUi6VxXdCrTb99A7yP49lxLr2Nm/uIK0PkkxcEi4OGhoGDO4pxCf3JwGz2GiJL2Ej4K2bKaA==} - - '@types/wicg-file-system-access@2023.10.5': - resolution: {integrity: sha512-e9kZO9kCdLqT2h9Tw38oGv9UNzBBWaR1MzuAavxPcsV/7FJ3tWbU6RI3uB+yKIDPGLkGVbplS52ub0AcRLvrhA==} - - '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - - '@types/yargs@17.0.33': - resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - - '@typescript-eslint/eslint-plugin@6.1.0': - resolution: {integrity: sha512-qg7Bm5TyP/I7iilGyp6DRqqkt8na00lI6HbjWZObgk3FFSzH5ypRwAHXJhJkwiRtTcfn+xYQIMOR5kJgpo6upw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@6.21.0': - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@6.1.0': - resolution: {integrity: sha512-AxjgxDn27hgPpe2rQe19k0tXw84YCOsjDJ2r61cIebq1t+AIxbgiXKvD4999Wk49GVaAcdJ/d49FYel+Pp3jjw==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/scope-manager@8.26.0': - resolution: {integrity: sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/type-utils@6.1.0': - resolution: {integrity: sha512-kFXBx6QWS1ZZ5Ni89TyT1X9Ag6RXVIVhqDs0vZE/jUeWlBv/ixq2diua6G7ece6+fXw3TvNRxP77/5mOMusx2w==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@6.1.0': - resolution: {integrity: sha512-+Gfd5NHCpDoHDOaU/yIF3WWRI2PcBRKKpP91ZcVbL0t5tQpqYWBs3z/GGhvU+EV1D0262g9XCnyqQh19prU0JQ==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/types@8.26.0': - resolution: {integrity: sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@6.1.0': - resolution: {integrity: sha512-nUKAPWOaP/tQjU1IQw9sOPCDavs/iU5iYLiY/6u7gxS7oKQoi4aUxXS1nrrVGTyBBaGesjkcwwHkbkiD5eBvcg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/typescript-estree@8.26.0': - resolution: {integrity: sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/utils@6.1.0': - resolution: {integrity: sha512-wp652EogZlKmQoMS5hAvWqRKplXvkuOnNzZSE0PVvsKjpexd/XznRVHAtrfHFYmqaJz0DFkjlDsGYC9OXw+OhQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - - '@typescript-eslint/utils@8.26.0': - resolution: {integrity: sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/visitor-keys@6.1.0': - resolution: {integrity: sha512-yQeh+EXhquh119Eis4k0kYhj9vmFzNpbhM3LftWQVwqVjipCkwHBQOZutcYW+JVkjtTG9k8nrZU1UoNedPDd1A==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/visitor-keys@8.26.0': - resolution: {integrity: sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - - '@vitejs/plugin-react@3.1.0': - resolution: {integrity: sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.1.0-beta.0 - - '@vitest/expect@0.34.6': - resolution: {integrity: sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==} - - '@vitest/runner@0.34.6': - resolution: {integrity: sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==} - - '@vitest/snapshot@0.34.6': - resolution: {integrity: sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==} - - '@vitest/spy@0.34.6': - resolution: {integrity: sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==} - - '@vitest/utils@0.34.6': - resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} - - '@xboxreplay/errors@0.1.0': - resolution: {integrity: sha512-Tgz1d/OIPDWPeyOvuL5+aai5VCcqObhPnlI3skQuf80GVF3k1I0lPCnGC+8Cm5PV9aLBT5m8qPcJoIUQ2U4y9g==} - - '@xboxreplay/xboxlive-auth@3.3.3': - resolution: {integrity: sha512-j0AU8pW10LM8O68CTZ5QHnvOjSsnPICy0oQcP7zyM7eWkDQ/InkiQiirQKsPn1XRYDl4ccNu0WM582s3UKwcBg==} - - '@xmcl/asm@1.0.1': - resolution: {integrity: sha512-7vCVgm1E1IZ2cujiitFk9550Vgu2XAOn1ff90di638fMmTK0XkFMXKsSR/nGZmYKt+XiTMI/0B3TvreqbVjOug==} - engines: {node: '>=16'} - - '@xmcl/core@2.13.0': - resolution: {integrity: sha512-1BslEWUr234zZZTq9Q3QDm8APReYx7phy6PY5fodiztwblYbgipsd89vfx+Qvjc1xWpGtjei0AvxubUDeMFTgA==} - engines: {node: '>=16.0'} - - '@xmcl/file-transfer@1.0.6': - resolution: {integrity: sha512-WVnCTyHTqUUIMsqgGnkmQqov9/qxKWWBj+wjn6pMotpCJHu3gKkLqVoD76IQeTgUBIoh5sGgGbYMZmpRlqCGzw==} - engines: {node: '>=16.0'} - - '@xmcl/forge-site-parser@2.0.9': - resolution: {integrity: sha512-OHKG2KYE+F6TSeOQmymuGoqEifxbJb3w3X/hmxMNeqtewiYukJldPmKO559ZFnZnOuMQEnr+X0dMbTQwWs5dFg==} - engines: {node: '>=16'} - - '@xmcl/installer@5.4.0': - resolution: {integrity: sha512-Y4UK6WWogDdgvcAUQnUPoJidlkuVQP5dSV5QueJhKeEJAA3lmGklwV8Dp8z0/92ITQ45OBsB7g08qV3eec4G6w==} - engines: {node: '>=16.0'} - - '@xmcl/task@4.1.0': - resolution: {integrity: sha512-5Gqo/gltcenXTvRUz3H1Q2tNw9wWbOjeOVd9TeRNtBAOaKmdTD7iMhOIbdei71BSZ9FkVEhcUjO+PL+y+WNHoQ==} - - '@xmcl/text-component@2.1.3': - resolution: {integrity: sha512-LdUZgC5+8F23J2ZkZi7aZb87QBNfxwJqhUyts8YBQYwxQPwei20TOBm2hr69euoAeDo7NDfbLXssD4mUvsAS0Q==} - engines: {node: '>=16'} - - '@xmcl/unzip@2.1.2': - resolution: {integrity: sha512-Lm/eg/e0/p+sfj/RT2QDpsBAf39DZqQ3+XvX1JXZPb64wnjwOf8CGU1WPv6BseEcJ5CMOpm0s2NyrEQD04y0UQ==} - engines: {node: '>=16'} - peerDependencies: - yauzl: ^2.10.0 - - '@xobotyi/scrollbar-width@1.9.5': - resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} - - '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15': - resolution: {integrity: sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==} - engines: {node: '>=14.15.0'} - peerDependencies: - esbuild: '>=0.10.0' - - '@yarnpkg/fslib@2.10.3': - resolution: {integrity: sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==} - engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} - - '@yarnpkg/libzip@2.3.0': - resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} - engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} - - '@zardoy/flying-squid@0.0.104': - resolution: {integrity: sha512-jGhQ7fn7o8UN+mUwZbt9674D37YLuBi+Au4TwKcopCA6huIQdHTFNl2e+0ZSTI5mnhN+NpyVoR3vmtH6L58vHQ==} - engines: {node: '>=8'} - hasBin: true - - '@zardoy/flying-squid@0.0.49': - resolution: {integrity: sha512-Kt4wr5/R+44tcLU9gjuNG2an9weWeKEpIoKXfsgJN2GGQqdnbd5nBpxfGDdgZ9aMdFugsVW8BsyPZNhj9vbMXA==} - engines: {node: '>=8'} - hasBin: true - - '@zardoy/maxrects-packer@2.7.4': - resolution: {integrity: sha512-ZIDcSdtSg6EhKFxGYWCcTnA/0YVbpixBL+psUS6ncw4IvdDF5hWauMU3XeCfYwrT/88QFgAq/Pafxt+P9OJyoQ==} - - '@zardoy/react-util@0.2.7': - resolution: {integrity: sha512-LJOml3y8wa5OxvNgDKMceP7kaFHkw2nX9y/RQGMv2sijTEnc4gCd3yNtc4fibu1PFWZlupb6UvsNe45o7UwElg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - '@nextui-org/react': ^2.4.6 - react: ^18.2.0 - react-dom: '>=18.0.0' - peerDependenciesMeta: - '@nextui-org/react': - optional: true - - '@zardoy/utils@0.0.11': - resolution: {integrity: sha512-d6xBnSFCOa98HcL52xSBflJKjKpxfRhtr1eVexy89YujeCHSQhUMmSz9h07xyrulfW60k9tSeYH5reuqoh4l4w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - Base64@0.2.1: - resolution: {integrity: sha512-reGEWshDmTDQDsCec/HduOO9Wyj6yMOupMfhIf3ugN1TDlK2NQW4DDJSqNNtp380SNcvRfXtO8HSCQot0d0SMw==} - - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn-walk@7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} - - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - - acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} - engines: {node: '>=0.4.0'} - hasBin: true - - address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} - - adm-zip@0.5.16: - resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} - engines: {node: '>=12.0'} - - aes-js@3.1.2: - resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} - - after@0.8.2: - resolution: {integrity: sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==} - - agent-base@5.1.1: - resolution: {integrity: sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==} - engines: {node: '>= 6.0.0'} - - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - - animejs@3.2.1: - resolution: {integrity: sha512-sWno3ugFryK5nhiDm/2BKeFCpZv7vzerWUcUPyAZLDhMek3+S/p418ldZJbJXo5ZUOpfm2kP2XRO4NJcULMy9A==} - - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - any-base@1.1.0: - resolution: {integrity: sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==} - - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - - anymatch@2.0.0: - resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - apache-crypt@1.2.6: - resolution: {integrity: sha512-072WetlM4blL8PREJVeY+WHiUh1R5VNt2HfceGS8aKqttPHcmqE5pkKuXPz/ULmJOFkc8Hw3kfKl6vy7Qka6DA==} - engines: {node: '>=8'} - - apache-md5@1.1.8: - resolution: {integrity: sha512-FCAJojipPn0bXjuEpjOOOMN8FZDkxfWWp4JGN9mifU2IhxvKyXZYqpzPHdnTSUpmPDy+tsslB6Z1g+Vg6nVbYA==} - engines: {node: '>=8'} - - app-root-dir@1.0.2: - resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} - - aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - - arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - - are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - - are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - aria-hidden@1.2.4: - resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} - engines: {node: '>=10'} - - arr-diff@4.0.0: - resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} - engines: {node: '>=0.10.0'} - - arr-flatten@1.1.0: - resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} - engines: {node: '>=0.10.0'} - - arr-union@3.1.0: - resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} - engines: {node: '>=0.10.0'} - - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} - - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - - array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array-unique@0.3.2: - resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} - engines: {node: '>=0.10.0'} - - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} - - array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} - - arraybuffer.slice@0.0.7: - resolution: {integrity: sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - asn1.js@4.10.1: - resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} - - asn1@0.2.3: - resolution: {integrity: sha512-6i37w/+EhlWlGUJff3T/Q8u1RGmP5wgbiwYnOnbOqvtrPxT63/sYFyP9RcpxtxGymtfA075IvmOnL7ycNOWl3w==} - - asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - - assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - - assert@2.1.0: - resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - assign-symbols@1.0.0: - resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} - engines: {node: '>=0.10.0'} - - ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} - - astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - - async-each@1.0.6: - resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} - - async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} - - async-limiter@1.0.1: - resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} - - async@2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} - - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - - atob@2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - - aws4@1.13.2: - resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - - axios@0.21.4: - resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} - - axios@1.8.2: - resolution: {integrity: sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==} - - babel-core@7.0.0-bridge.0: - resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - - babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} - - babel-plugin-polyfill-corejs2@0.4.12: - resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-corejs3@0.11.1: - resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-regenerator@0.6.3: - resolution: {integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - backo2@1.0.2: - resolution: {integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==} - - bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base64-arraybuffer@0.1.4: - resolution: {integrity: sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==} - engines: {node: '>= 0.6.0'} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - base64id@2.0.0: - resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} - engines: {node: ^4.5.0 || >= 5.9} - - base@0.11.2: - resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} - engines: {node: '>=0.10.0'} - - basic-auth@2.0.1: - resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} - engines: {node: '>= 0.8'} - - batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - - bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - - bcryptjs@2.4.3: - resolution: {integrity: sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==} - - better-opn@3.0.2: - resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} - engines: {node: '>=12.0.0'} - - big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} - - binary-extensions@1.13.1: - resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} - engines: {node: '>=0.10.0'} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bit-twiddle@1.0.2: - resolution: {integrity: sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==} - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - blob-util@2.0.2: - resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==} - - blob@0.0.5: - resolution: {integrity: sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==} - - bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - - bmp-js@0.1.0: - resolution: {integrity: sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==} - - bn.js@4.12.1: - resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} - - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - - bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@2.3.2: - resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} - engines: {node: '>=0.10.0'} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - brorand@1.1.0: - resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - - browser-assert@1.2.1: - resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} - - browserfs@https://codeload.github.com/zardoy/browserfs/tar.gz/ab58ae8ef00e3a31db01909e365e6cb5188436e0: - resolution: {tarball: https://codeload.github.com/zardoy/browserfs/tar.gz/ab58ae8ef00e3a31db01909e365e6cb5188436e0} - version: 2.0.0 - engines: {node: '>= 18'} - - browserfs@https://codeload.github.com/zardoy/browserfs/tar.gz/e60ca69e74888e057a96a468afe1d62347d3f56f: - resolution: {tarball: https://codeload.github.com/zardoy/browserfs/tar.gz/e60ca69e74888e057a96a468afe1d62347d3f56f} - version: 2.0.0-zardoy - - browserify-aes@1.2.0: - resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - - browserify-cipher@1.0.1: - resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} - - browserify-des@1.0.2: - resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} - - browserify-rsa@4.1.1: - resolution: {integrity: sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==} - engines: {node: '>= 0.10'} - - browserify-sign@4.2.3: - resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} - engines: {node: '>= 0.12'} - - browserify-zlib@0.1.4: - resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} - - browserify-zlib@0.2.0: - resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} - - browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - - buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - - buffer-equal@0.0.1: - resolution: {integrity: sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==} - engines: {node: '>=0.4.0'} - - buffer-equal@1.0.1: - resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} - engines: {node: '>=0.4'} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer-xor@1.0.3: - resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - - builtin-status-codes@3.0.0: - resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} - - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - - cacache@16.1.3: - resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - cache-base@1.0.1: - resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} - engines: {node: '>=0.10.0'} - - cachedir@2.4.0: - resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==} - engines: {node: '>=6'} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - - camelcase-keys@7.0.2: - resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==} - engines: {node: '>=12'} - - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - caniuse-lite@1.0.30001713: - resolution: {integrity: sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==} - - canvas@2.11.2: - resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} - engines: {node: '>=6'} - - capital-case@1.0.4: - resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} - - caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - - centra@2.7.0: - resolution: {integrity: sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} - - change-case@5.4.4: - resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} - - character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - - charenc@0.0.2: - resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - check-more-types@2.24.0: - resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} - engines: {node: '>= 0.8.0'} - - chokidar@2.1.8: - resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - - cipher-base@1.0.6: - resolution: {integrity: sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==} - engines: {node: '>= 0.10'} - - citty@0.1.6: - resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} - - class-utils@0.3.6: - resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} - engines: {node: '>=0.10.0'} - - classnames@2.5.1: - resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} - - clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} - - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - - cli-table3@0.6.5: - resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} - engines: {node: 10.* || >= 12.*} - - cli-truncate@2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - - clsx@1.1.1: - resolution: {integrity: sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==} - engines: {node: '>=6'} - - collection-visit@1.0.0: - resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} - engines: {node: '>=0.10.0'} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - colors@1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - commander@5.1.0: - resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} - engines: {node: '>= 6'} - - commander@6.2.1: - resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} - engines: {node: '>= 6'} - - common-tags@1.8.2: - resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} - engines: {node: '>=4.0.0'} - - commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - - component-bind@1.0.0: - resolution: {integrity: sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==} - - component-emitter@1.2.1: - resolution: {integrity: sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==} - - component-emitter@1.3.1: - resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - - component-inherit@0.0.3: - resolution: {integrity: sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==} - - compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - - compression@1.8.0: - resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} - engines: {node: '>= 0.8.0'} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} - - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - - confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} - - connect@3.7.0: - resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} - engines: {node: '>= 0.10.0'} - - consola@3.4.0: - resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} - engines: {node: ^14.18.0 || >=16.10.0} - - console-browserify@1.2.0: - resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} - - console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - - constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} - - constants-browserify@1.0.0: - resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} - - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - contro-max@0.1.9: - resolution: {integrity: sha512-zH9FB60EzhHKublD92d11QuarYRTdYci5rvDgwDr5XXwUqae5mr6IgzXGcr78T2odnO/Aeqmrf32RDwJIl5GfQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - - cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - - cookie@0.7.1: - resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} - engines: {node: '>= 0.6'} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - - copy-descriptor@0.1.1: - resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} - engines: {node: '>=0.10.0'} - - copy-to-clipboard@3.3.3: - resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} - - core-js-compat@3.41.0: - resolution: {integrity: sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==} - - core-js@3.41.0: - resolution: {integrity: sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==} - - core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - - corser@2.0.1: - resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==} - engines: {node: '>= 0.4.0'} - - cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} - - create-ecdh@4.0.4: - resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} - - create-hash@1.2.0: - resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} - - create-hmac@1.1.7: - resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} - - crelt@1.0.6: - resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} - - cross-spawn@6.0.6: - resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} - engines: {node: '>=4.8'} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - crypt@0.0.2: - resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} - - crypto-browserify@3.12.1: - resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} - engines: {node: '>= 0.10'} - - crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} - - css-in-js-utils@3.1.0: - resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} - - css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} - - css-tree@1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} - - css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - cypress-esbuild-preprocessor@1.0.2: - resolution: {integrity: sha512-JsFnm6fBQt/OEzstknJ1KLMTuUERUaG0ZB9fk0KdNUlZqxaVEoQ9/pFvKmqRfzUe2y00cWD++ptccQA4tNAAlQ==} - - cypress-plugin-snapshots@1.4.4: - resolution: {integrity: sha512-rijq3RTEZNtxQA4KCUwjXinmE1Ww+z6cQW0B14iodFM/HlX5LN16XT/2QS3X1nUXRKt0QdTrAC5MQfMUrjBkSQ==} - engines: {node: '>=8.2.1'} - peerDependencies: - cypress: ^4.5.0 - - cypress@10.11.0: - resolution: {integrity: sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA==} - engines: {node: '>=12.0.0'} - hasBin: true - - dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} - - data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} - - dayjs@1.11.13: - resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - - debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@3.1.0: - resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.1.1: - resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} - deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - - decamelize@5.0.1: - resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==} - engines: {node: '>=10'} - - decode-named-character-reference@1.1.0: - resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} - - decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} - - decompress-response@4.2.1: - resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} - engines: {node: '>=8'} - - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - - deepslate@0.23.5: - resolution: {integrity: sha512-FjBBbuPUI1Y/dXtUc4WiCJSA7s7yRAXepD7qWRF6wX5m/q7AVRauMEShu8lphRvqCtJyxcYFZmISwX5OOH/tWw==} - - default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} - - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - define-property@0.2.5: - resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} - engines: {node: '>=0.10.0'} - - define-property@1.0.0: - resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} - engines: {node: '>=0.10.0'} - - define-property@2.0.2: - resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} - engines: {node: '>=0.10.0'} - - defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - - del@6.1.1: - resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} - engines: {node: '>=10'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - - depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - derive-valtio@0.1.0: - resolution: {integrity: sha512-OCg2UsLbXK7GmmpzMXhYkdO64vhJ1ROUUGaTFyHjVwEdMEcTTRj7W1TxLbSBxdY8QLBPCcp66MTyaSy0RpO17A==} - peerDependencies: - valtio: '*' - - des.js@1.1.0: - resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} - - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - detect-collisions@7.0.5: - resolution: {integrity: sha512-RiebSYJ9Vok1uVm57bxpI69EO2ySK1rdcHpRv28IDBh/wgaF8wxjoZJV7mmqz8MOKioLwMHvcMyP1R0CLZ+RbA==} - - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} - - detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - - detect-package-manager@2.0.1: - resolution: {integrity: sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==} - engines: {node: '>=12'} - - detect-port@1.6.1: - resolution: {integrity: sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==} - engines: {node: '>= 4.0.0'} - hasBin: true - - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - - diamond-square@https://codeload.github.com/zardoy/diamond-square/tar.gz/cfaad2d1d5909fdfa63c8cc7bc05fb5e87782d71: - resolution: {tarball: https://codeload.github.com/zardoy/diamond-square/tar.gz/cfaad2d1d5909fdfa63c8cc7bc05fb5e87782d71} - version: 1.3.0 - - diff-match-patch@1.0.5: - resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} - - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - diff2html@2.12.2: - resolution: {integrity: sha512-G/Zn1KyG/OeC+67N/P26WHsQpjrjUiRyWGvg29ypy3MxSsBmF0bzsU/Irq70i2UAg+f/MzmLx4v/Nkt01TOU3g==} - engines: {node: '>=4'} - - diff@2.2.3: - resolution: {integrity: sha512-9wfm3RLzMp/PyTFWuw9liEzdlxsdGixCW0ZTU1XDmtlAkvpVXTPGF8KnfSs0hm3BPbg19OrUPPsRkHXoREpP1g==} - engines: {node: '>=0.3.1'} - - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - - diffie-hellman@5.0.3: - resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - discontinuous-range@1.0.0: - resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==} - - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} - - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - - dom-walk@0.1.2: - resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} - - domain-browser@5.7.0: - resolution: {integrity: sha512-edTFu0M/7wO1pXY6GDxVNVW086uqwWYIHP98txhcPyV995X21JIH2DtYp33sQJOupYoXKe9RwTw2Ya2vWaquTQ==} - engines: {node: '>=4'} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - - domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - - dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - - dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} - engines: {node: '>=12'} - - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} - engines: {node: '>=12'} - - draco3d@1.5.7: - resolution: {integrity: sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - - duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - - ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true - - electron-to-chromium@1.5.113: - resolution: {integrity: sha512-wjT2O4hX+wdWPJ76gWSkMhcHAV2PTMX+QetUCPYEdCIe+cxmgzzSSiGRCKW8nuh4mwKZlpv0xvoW7OF2X+wmHg==} - - elliptic@6.6.1: - resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} - - emit-then@2.0.0: - resolution: {integrity: sha512-y5JHnrygHnCndtqVHHDhCr0ZzzWHK5RBTczWRlGSIR5UnGHBXuxpoaE0UB5E82qym8ma2dI799wDSSJN2e4VSg==} - engines: {node: '>=5'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - - endian-toggle@0.0.0: - resolution: {integrity: sha512-ShfqhXeHRE4TmggSlHXG8CMGIcsOsqDw/GcoPcosToE59Rm9e4aXaMhEQf2kPBsBRrKem1bbOAv5gOKnkliMFQ==} - - engine.io-client@3.5.4: - resolution: {integrity: sha512-ydc8uuMMDxC5KCKNJN3zZKYJk2sgyTuTZQ7Aj1DJSsLKAcizA/PzWivw8fZMIjJVBo2CJOYzntv4FSjY/Lr//g==} - - engine.io-client@6.6.3: - resolution: {integrity: sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==} - - engine.io-parser@2.2.1: - resolution: {integrity: sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==} - - engine.io-parser@5.2.3: - resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} - engines: {node: '>=10.0.0'} - - engine.io@3.6.2: - resolution: {integrity: sha512-C4JjGQZLY3kWlIDx0BQNKizbrfpb7NahxDztGdN5jrPK2ghmXiNDN+E/t0JzDeNRZxPVaszxEng42Pmj27X/0w==} - engines: {node: '>=8.0.0'} - - engine.io@6.6.4: - resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} - engines: {node: '>=10.2.0'} - - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - - envinfo@7.14.0: - resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} - engines: {node: '>=4'} - hasBin: true - - err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - - eruda@3.4.1: - resolution: {integrity: sha512-RmaO5yD97URY/9Q0lye3cmmNPoXNKreeePIw7c/zllbscR92CjGFZFuQ70+0fLIvLcKW3Xha8DS8NFhmeNbEBQ==} - - es-abstract@1.23.9: - resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} - engines: {node: '>= 0.4'} - - es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-iterator-helpers@1.2.1: - resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} - engines: {node: '>= 0.4'} - - es-module-lexer@0.9.3: - resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - esbuild-plugin-alias@0.2.1: - resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} - - esbuild-plugin-polyfill-node@0.3.0: - resolution: {integrity: sha512-SHG6CKUfWfYyYXGpW143NEZtcVVn8S/WHcEOxk62LuDXnY4Zpmc+WmxJKN6GMTgTClXJXhEM5KQlxKY6YjbucQ==} - peerDependencies: - esbuild: '*' - - esbuild-register@3.6.0: - resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} - peerDependencies: - esbuild: '>=0.12 <1' - - esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} - hasBin: true - - esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - - esbuild@0.25.0: - resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} - engines: {node: '>=18'} - hasBin: true - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - - eslint-config-prettier@8.10.0: - resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-config-xo-react@0.27.0: - resolution: {integrity: sha512-wiV215xQIn71XZyyVfaOXHaFpR1B14IJttwOjMi/eqUK1s+ojJdHr7eHqTLaGUfh6FKgWha1QNwePlIXx7mBUg==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=8.6.0' - eslint-plugin-react: '>=7.29.0' - eslint-plugin-react-hooks: '>=4.3.0' - - eslint-config-xo-typescript@1.0.1: - resolution: {integrity: sha512-vPQssnRSUgBFOEfB/KY12CXwltwFSn4RSCfa+w7gjBC2PFQ7Yfgmyei+1XUZ3K+8LRGef2NMJUcxts7PldhDjg==} - engines: {node: '>=16'} - peerDependencies: - '@typescript-eslint/eslint-plugin': '>=6.0.0' - '@typescript-eslint/parser': '>=6.0.0' - eslint: '>=8.0.0' - typescript: '>=4.7' - - eslint-config-xo@0.43.1: - resolution: {integrity: sha512-azv1L2PysRA0NkZOgbndUpN+581L7wPqkgJOgxxw3hxwXAbJgD6Hqb/SjHRiACifXt/AvxCzE/jIKFAlI7XjvQ==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=8.27.0' - - eslint-config-zardoy@0.2.17: - resolution: {integrity: sha512-d31WsjyVSQqHbzTpBSmH96+nw5gwY2yhDbZatU89gr+U8ou1FRUkJSApYJUgmcINt8AQocj1RDDAVYmVSILZgQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - eslint: ^8.5.0 - eslint-plugin-vue: ^8.4.1 - typescript: ^4.5.2 - vue-eslint-parser: ^8.2.0 - peerDependenciesMeta: - eslint-plugin-vue: - optional: true - vue-eslint-parser: - optional: true - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-module-utils@2.12.0: - resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-es@3.0.1: - resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=4.19.1' - - eslint-plugin-eslint-comments@3.2.0: - resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} - engines: {node: '>=6.5.0'} - peerDependencies: - eslint: '>=4.19.1' - - eslint-plugin-import@2.27.5: - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-node@11.1.0: - resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=5.16.0' - - eslint-plugin-react-hooks@5.2.0: - resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - - eslint-plugin-react@7.37.4: - resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - - eslint-plugin-sonarjs@0.19.0: - resolution: {integrity: sha512-6+s5oNk5TFtVlbRxqZN7FIGmjdPCYQKaTzFPmqieCmsU1kBYDzndTeQav0xtQNwZJWu5awWfTGe8Srq9xFOGnw==} - engines: {node: '>=14'} - peerDependencies: - eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - - eslint-plugin-unicorn@48.0.0: - resolution: {integrity: sha512-8fk/v3p1ro34JSVDBEmtOq6EEQRpMR0iTir79q69KnXFZ6DJyPkT3RAi+ZoTqhQMdDSpGh8BGR68ne1sP5cnAA==} - engines: {node: '>=16'} - peerDependencies: - eslint: '>=8.44.0' - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-utils@2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} - - eslint-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - estree-walker@1.0.1: - resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} - - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - event-stream@3.3.4: - resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} - - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - - eventemitter2@6.4.7: - resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} - - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - - execa@4.1.0: - resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} - engines: {node: '>=10'} - - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - executable@4.1.1: - resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} - engines: {node: '>=4'} - - exif-parser@0.1.12: - resolution: {integrity: sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==} - - exit-hook@2.2.1: - resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} - engines: {node: '>=6'} - - expand-brackets@2.1.4: - resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} - engines: {node: '>=0.10.0'} - - expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - - exponential-backoff@3.1.2: - resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} - - express-ws@4.0.0: - resolution: {integrity: sha512-KEyUw8AwRET2iFjFsI1EJQrJ/fHeGiJtgpYgEWG3yDv4l/To/m3a2GaYfeGyB3lsWdvbesjF5XCMx+SVBgAAYw==} - engines: {node: '>=4.5.0'} - peerDependencies: - express: ^4.0.0 || ^5.0.0-alpha.1 - - express@4.21.2: - resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} - engines: {node: '>= 0.10.0'} - - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - - extend-shallow@3.0.2: - resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} - engines: {node: '>=0.10.0'} - - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - extglob@2.0.4: - resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} - engines: {node: '>=0.10.0'} - - extract-zip@1.7.0: - resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} - hasBin: true - - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - - extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fast-shallow-equal@1.0.0: - resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} - - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - - fastest-stable-stringify@2.0.2: - resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} - - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - - faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} - - fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - - fetch-retry@5.0.6: - resolution: {integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==} - - fflate@0.6.10: - resolution: {integrity: sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==} - - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - file-system-cache@2.3.0: - resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} - - file-type@9.0.0: - resolution: {integrity: sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==} - engines: {node: '>=6'} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - - filesize@10.1.6: - resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==} - engines: {node: '>= 10.4.0'} - - fill-range@4.0.0: - resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} - engines: {node: '>=0.10.0'} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - finalhandler@1.1.2: - resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} - engines: {node: '>= 0.8'} - - finalhandler@1.3.1: - resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} - engines: {node: '>= 0.8'} - - find-cache-dir@2.1.0: - resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} - engines: {node: '>=6'} - - find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} - - find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - - find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flatmap@0.0.3: - resolution: {integrity: sha512-OuR+o7kHVe+x9RtIujPay7Uw3bvDZBZFSBXClEphZuSDLmZTqMdclasf4vFSsogC8baDz0eaC2NdO/2dlXHBKQ==} - - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - - flow-parser@0.263.0: - resolution: {integrity: sha512-F0Tr7SUvZ4BQYglFOkr8rCTO5FPjCwMhm/6i57h40F80Oz/hzzkqte4lGO0vGJ7THQonuXcTyYqCdKkAwt5d2w==} - engines: {node: '>=0.4.0'} - - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - - for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} - - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - - forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - - form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} - - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} - engines: {node: '>= 6'} - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fragment-cache@0.2.1: - resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} - engines: {node: '>=0.10.0'} - - framer-motion@12.9.2: - resolution: {integrity: sha512-R0O3Jdqbfwywpm45obP+8sTgafmdEcUoShQTAV+rB5pi+Y1Px/FYL5qLLRe5tPtBdN1J4jos7M+xN2VV2oEAbQ==} - peerDependencies: - '@emotion/is-prop-valid': '*' - react: ^18.2.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@emotion/is-prop-valid': - optional: true - react: - optional: true - react-dom: - optional: true - - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} - - from@0.1.7: - resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} - - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - - fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} - - fs-extra@11.3.0: - resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} - engines: {node: '>=14.14'} - - fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - - fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@1.2.13: - resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} - engines: {node: '>= 4.0'} - os: [darwin] - deprecated: Upgrade to fsevents v2 to mitigate potential security issues - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - - gauge@4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - - get-npm-tarball-url@2.1.0: - resolution: {integrity: sha512-ro+DiMu5DXgRBabqXupW38h7WPZ9+Ad8UjwhvsmmN8w1sU7ab0nzAXvVZ4kqYg57OrqomRtJvepX5/xvFKNtjA==} - engines: {node: '>=12.17'} - - get-own-enumerable-property-symbols@3.0.2: - resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} - - get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - - get-port@5.1.1: - resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} - engines: {node: '>=8'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} - - get-tsconfig@4.10.0: - resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} - - get-value@2.0.6: - resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} - engines: {node: '>=0.10.0'} - - getos@3.2.1: - resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} - - getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} - - giget@1.2.5: - resolution: {integrity: sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug==} - hasBin: true - - github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - - github-slugger@1.5.0: - resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} - - gl-matrix@3.4.3: - resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} - - gl@6.0.2: - resolution: {integrity: sha512-yBbfpChOtFvg5D+KtMaBFvj6yt3vUnheNAH+UrQH2TfDB8kr0tERdL0Tjhe0W7xJ6jR6ftQBluTZR9jXUnKe8g==} - engines: {node: '>=14.0.0'} - - glob-parent@3.1.0: - resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob-promise@4.2.2: - resolution: {integrity: sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==} - engines: {node: '>=12'} - peerDependencies: - glob: ^7.1.6 - - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - - global-dirs@3.0.1: - resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} - engines: {node: '>=10'} - - global@4.4.0: - resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - glsl-tokenizer@2.1.5: - resolution: {integrity: sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - gunzip-maybe@1.4.2: - resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} - hasBin: true - - gzip-size@7.0.0: - resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true - - hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - - has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} - - has-binary2@1.0.3: - resolution: {integrity: sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==} - - has-cors@1.1.0: - resolution: {integrity: sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - - has-value@0.3.1: - resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} - engines: {node: '>=0.10.0'} - - has-value@1.0.0: - resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} - engines: {node: '>=0.10.0'} - - has-values@0.1.4: - resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} - engines: {node: '>=0.10.0'} - - has-values@1.0.0: - resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} - engines: {node: '>=0.10.0'} - - has@1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} - engines: {node: '>= 0.4.0'} - - hash-base@3.0.5: - resolution: {integrity: sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==} - engines: {node: '>= 0.10'} - - hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - header-case@2.0.4: - resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} - - hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - - hogan.js@3.0.2: - resolution: {integrity: sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==} - hasBin: true - - hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - - hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - - html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} - engines: {node: '>=12'} - - html-entities@2.6.0: - resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} - - html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} - engines: {node: '>=8'} - - http-auth@3.1.3: - resolution: {integrity: sha512-Jbx0+ejo2IOx+cRUYAGS1z6RGc6JfYUNkysZM4u4Sfk1uLlGv814F7/PIjQQAuThLdAWxb74JMGd5J8zex1VQg==} - engines: {node: '>=4.6.1'} - - http-browserify@1.7.0: - resolution: {integrity: sha512-Irf/LJXmE3cBzU1eaR4+NEX6bmVLqt1wkmDiA7kBwH7zmb0D8kBAXsDmQ88hhj/qv9iEZKlyGx/hrMcFi8sOHw==} - - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - - http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} - - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - - http-parser-js@0.5.9: - resolution: {integrity: sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==} - - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - - http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} - - http-server@14.1.1: - resolution: {integrity: sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==} - engines: {node: '>=12'} - hasBin: true - - http-signature@1.3.6: - resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==} - engines: {node: '>=0.10'} - - https-browserify@1.0.0: - resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} - - https-proxy-agent@4.0.0: - resolution: {integrity: sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==} - engines: {node: '>= 6.0.0'} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - human-signals@1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} - - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - hyperdyperid@1.2.0: - resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} - engines: {node: '>=10.18'} - - hyphenate-style-name@1.1.0: - resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - idb@7.1.1: - resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - image-size@0.7.5: - resolution: {integrity: sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==} - engines: {node: '>=6.9.0'} - hasBin: true - - immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - - import-meta-resolve@3.1.1: - resolution: {integrity: sha512-qeywsE/KC3w9Fd2ORrRDUw6nS/nLwZpXgfrOc2IILvZYnCaEMd+D56Vfg9k4G29gIeVi3XKql1RQatME8iYsiw==} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - indent-string@5.0.0: - resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} - engines: {node: '>=12'} - - indexof@0.0.1: - resolution: {integrity: sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==} - - infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - ini@2.0.0: - resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} - engines: {node: '>=10'} - - inline-style-prefixer@7.0.1: - resolution: {integrity: sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==} - - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} - - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - is-absolute-url@3.0.3: - resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} - engines: {node: '>=8'} - - is-accessor-descriptor@1.0.1: - resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} - engines: {node: '>= 0.10'} - - is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} - - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - - is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} - - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - - is-binary-path@1.0.1: - resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} - engines: {node: '>=0.10.0'} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} - - is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - - is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true - - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - - is-data-descriptor@1.0.1: - resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} - engines: {node: '>= 0.4'} - - is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} - - is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} - - is-deflate@1.0.0: - resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} - - is-descriptor@0.1.7: - resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} - engines: {node: '>= 0.4'} - - is-descriptor@1.0.3: - resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} - engines: {node: '>= 0.4'} - - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - - is-extendable@1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-function@1.0.2: - resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} - - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} - engines: {node: '>= 0.4'} - - is-glob@3.1.0: - resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} - engines: {node: '>=0.10.0'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-gzip@1.0.0: - resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} - engines: {node: '>=0.10.0'} - - is-installed-globally@0.4.0: - resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} - engines: {node: '>=10'} - - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - - is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - - is-nan@1.3.2: - resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} - - is-number@3.0.0: - resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-obj@1.0.1: - resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} - engines: {node: '>=0.10.0'} - - is-path-cwd@2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} - engines: {node: '>=6'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - - is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - - is-regexp@1.0.0: - resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} - engines: {node: '>=0.10.0'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} - - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} - - is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} - - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - - is-wsl@1.1.0: - resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} - engines: {node: '>=4'} - - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - - isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - - isarray@2.0.1: - resolution: {integrity: sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isobject@2.1.0: - resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} - engines: {node: '>=0.10.0'} - - isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - - isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - - iterator.prototype@1.1.5: - resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} - engines: {node: '>= 0.4'} - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jake@10.9.2: - resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} - engines: {node: '>=10'} - hasBin: true - - jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jimp@0.10.3: - resolution: {integrity: sha512-meVWmDMtyUG5uYjFkmzu0zBgnCvvxwWNi27c4cg55vWNVC9ES4Lcwb+ogx+uBBQE3Q+dLKjXaLl0JVW+nUNwbQ==} - - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} - hasBin: true - - joi@17.13.3: - resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} - - jpeg-js@0.3.7: - resolution: {integrity: sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ==} - - js-base64@2.6.4: - resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} - - js-cookie@2.2.1: - resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - - jscodeshift@0.15.2: - resolution: {integrity: sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==} - hasBin: true - peerDependencies: - '@babel/preset-env': ^7.1.6 - peerDependenciesMeta: - '@babel/preset-env': - optional: true - - jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - - jsonpointer@5.0.1: - resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} - engines: {node: '>=0.10.0'} - - jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} - - jsprim@2.0.2: - resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} - engines: {'0': node >=0.6.0} - - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - - jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - - jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} - - jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} - - kind-of@4.0.0: - resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} - engines: {node: '>=0.10.0'} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - lazy-ass@1.6.0: - resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==} - engines: {node: '> 0.8'} - - lazy-universal-dotenv@4.0.0: - resolution: {integrity: sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==} - engines: {node: '>=14.0.0'} - - leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - - lil-gui@0.17.0: - resolution: {integrity: sha512-MVBHmgY+uEbmJNApAaPbtvNh1RCAeMnKym82SBjtp5rODTYKWtM+MXHCifLe2H2Ti1HuBGBtK/5SyG4ShQ3pUQ==} - - lil-gui@0.18.2: - resolution: {integrity: sha512-DgdrLy3/KGC0PiQLKgOcJMPItP4xY4iWgJ9+91Zaxfr8GCTmMps05QS9w9jW7yspILlbscbquwjOwxmWnSx5Uw==} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - - listr2@3.14.0: - resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==} - engines: {node: '>=10.0.0'} - peerDependencies: - enquirer: '>= 2.3.0 < 3' - peerDependenciesMeta: - enquirer: - optional: true - - live-server@1.2.2: - resolution: {integrity: sha512-t28HXLjITRGoMSrCOv4eZ88viHaBVIjKjdI5PO92Vxlu+twbk6aE0t7dVIaz6ZWkjPilYFV6OSdMYl9ybN2B4w==} - engines: {node: '>=0.10.0'} - hasBin: true - - load-bmfont@1.4.2: - resolution: {integrity: sha512-qElWkmjW9Oq1F9EI5Gt7aD9zcdHb9spJCW1L/dmPf7KzCCEJxq8nhHz5eCgI9aMf7vrG/wyaCqdsI+Iy9ZTlog==} - - load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} - - local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} - - locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - - lodash.compact@3.0.1: - resolution: {integrity: sha512-2ozeiPi+5eBXW1CLtzjk8XQFhQOEMwwfxblqeq6EGyTxZJ1bPATqilY0e6g2SLQpP4KuMeuioBhEnWz5Pr7ICQ==} - - lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - - lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. - - lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - - lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - - lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - - lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - - lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - - lodash.reduce@4.6.0: - resolution: {integrity: sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==} - - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - log-update@4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} - - long@5.3.1: - resolution: {integrity: sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==} - - longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - - macaddress@0.5.3: - resolution: {integrity: sha512-vGBKTA+jwM4KgjGZ+S/8/Mkj9rWzePyGY6jManXPGhiWu63RYwW8dKPyk5koP+8qNVhPhHgFa1y/MJ4wrjsNrg==} - - magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - - magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} - engines: {node: '>=12'} - - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - - make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - - make-fetch-happen@10.2.1: - resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - - map-cache@0.2.2: - resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} - engines: {node: '>=0.10.0'} - - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - - map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - - map-or-similar@1.5.0: - resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} - - map-stream@0.1.0: - resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} - - map-visit@1.0.0: - resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} - engines: {node: '>=0.10.0'} - - markdown-it@14.1.0: - resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} - hasBin: true - - markdown-to-jsx@7.7.4: - resolution: {integrity: sha512-1bSfXyBKi+EYS3YY+e0Csuxf8oZ3decdfhOav/Z7Wrk89tjudyL5FOmwZQUoy0/qVXGUl+6Q3s2SWtpDEWITfQ==} - engines: {node: '>= 10'} - peerDependencies: - react: ^18.2.0 - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - mc-assets@0.2.62: - resolution: {integrity: sha512-RYZeD1+joNlPuUpi+tIWkbP0ieVJr+R6IFkI6/8juhSxx9zE4osoSmteybrfspGm8A6u+YbbY1epqRKEMwVR6Q==} - engines: {node: '>=18.0.0'} - - mc-bridge@0.1.3: - resolution: {integrity: sha512-H9jPt2xEU77itC27dSz3qazHYqN9qVsv4HgMPozg7RqQ1uwgXmEa+ojKIlDtXf/TLJsG6Kv4EbzGa8a1Wh72uA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - minecraft-data: 3.98.0 - - mcraft-fun-mineflayer@0.1.23: - resolution: {integrity: sha512-qmI1rQQ0Ro5zJdi99rClWLF+mS9JZffgNX2vyWWesS3Hsk3Xblp/8swYTJKHSaFpNgzkVfXV92fEIrBqeH6iKA==} - version: 0.1.23 - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - '@roamhq/wrtc': '*' - mineflayer: '>=4.x' - peerDependenciesMeta: - '@roamhq/wrtc': - optional: true - - md5-file@4.0.0: - resolution: {integrity: sha512-UC0qFwyAjn4YdPpKaDNw6gNxRf7Mcx7jC1UGCY4boCzgvU2Aoc1mOGzTtrjjLKhM5ivsnhoKpQVxKPp+1j1qwg==} - engines: {node: '>=6.0'} - hasBin: true - - md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} - - md5@2.3.0: - resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} - - mdast-util-definitions@4.0.0: - resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} - - mdast-util-from-markdown@2.0.2: - resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} - - mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - - mdast-util-to-markdown@2.1.2: - resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} - - mdast-util-to-string@1.1.0: - resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} - - mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - - mdn-data@2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} - - mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - - memfs@4.17.0: - resolution: {integrity: sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==} - engines: {node: '>= 4.0.0'} - - memoize-one@6.0.0: - resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} - - memoizerific@1.11.3: - resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} - - memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} - - meow@10.1.5: - resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - merge@1.2.1: - resolution: {integrity: sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==} - - meshoptimizer@0.18.1: - resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==} - - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - - micromark-core-commonmark@2.0.3: - resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} - - micromark-factory-destination@2.0.1: - resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - - micromark-factory-label@2.0.1: - resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - - micromark-factory-space@2.0.1: - resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} - - micromark-factory-title@2.0.1: - resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - - micromark-factory-whitespace@2.0.1: - resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - - micromark-util-chunked@2.0.1: - resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - - micromark-util-classify-character@2.0.1: - resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - - micromark-util-combine-extensions@2.0.1: - resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - - micromark-util-decode-numeric-character-reference@2.0.2: - resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - - micromark-util-decode-string@2.0.1: - resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} - - micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - - micromark-util-html-tag-name@2.0.1: - resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - - micromark-util-normalize-identifier@2.0.1: - resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - - micromark-util-resolve-all@2.0.1: - resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - - micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - - micromark-util-subtokenize@2.1.0: - resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} - - micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - - micromark-util-types@2.0.2: - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - - micromark@4.0.2: - resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} - - micromatch@3.1.10: - resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} - engines: {node: '>=0.10.0'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - miller-rabin@4.0.1: - resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} - hasBin: true - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mime-types@3.0.1: - resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} - engines: {node: '>= 0.6'} - - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - - mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-response@2.1.0: - resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} - engines: {node: '>=8'} - - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - - min-document@2.19.0: - resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} - - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - - minecraft-data@3.98.0: - resolution: {integrity: sha512-JAPqJ/TZoxMUlAPPdWUh1v5wdqvYGFSZ4rW9bUtmaKBkGpomDSjw4V02ocBqbxKJvcTtmc5nM/LfN9/0DDqHrQ==} - - minecraft-folder-path@1.2.0: - resolution: {integrity: sha512-qaUSbKWoOsH9brn0JQuBhxNAzTDMwrOXorwuRxdJKKKDYvZhtml+6GVCUrY5HRiEsieBEjCUnhVpDuQiKsiFaw==} - - minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/89c33d396f3fde4804c71f4be3c203ade1833b41: - resolution: {tarball: https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/89c33d396f3fde4804c71f4be3c203ade1833b41} - version: 1.0.1 - - minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/bf89f7e86526c54d8c43f555d8f6dfa4948fd2d9: - resolution: {tarball: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/bf89f7e86526c54d8c43f555d8f6dfa4948fd2d9} - version: 1.62.0 - engines: {node: '>=22'} - - minecraft-wrap@1.6.0: - resolution: {integrity: sha512-A1GjIR72x9H9cEaxAQsXZe5uhw7CPgq1pGwYkdbPe6mQraePinmj/jRIuntXYWEKrYamwQFT3igIafA+PEG11w==} - hasBin: true - - minecrafthawkeye@1.3.9: - resolution: {integrity: sha512-YIDHTvljQjsJH4cEcbF02/ehNRUrbzEiL/quQmdEU8ruv69R4bwHqmBB8O9FyhpQgNppmNTs3pK8h4J0/MYGpQ==} - - mineflayer-item-map-downloader@https://codeload.github.com/zardoy/mineflayer-item-map-downloader/tar.gz/a8d210ecdcf78dd082fa149a96e1612cc9747824: - resolution: {tarball: https://codeload.github.com/zardoy/mineflayer-item-map-downloader/tar.gz/a8d210ecdcf78dd082fa149a96e1612cc9747824} - version: 1.2.0 - - mineflayer-mouse@0.1.21: - resolution: {integrity: sha512-1XTVuw3twIrEcqQ1QRSB8NcStIUEZ+tbxiAG6rOrN/9M4thhtlS5PTJzFdmdrcYgWEBLvuOdJszaKE5zFfiXhg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/dd3b1ff38506d6f72d90e8444186e4e75fe82659: - resolution: {tarball: https://codeload.github.com/zardoy/mineflayer/tar.gz/dd3b1ff38506d6f72d90e8444186e4e75fe82659} - version: 8.0.0 - engines: {node: '>=22'} - - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - - minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} - - minipass-fetch@2.1.2: - resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} - - minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - - minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - - mixin-deep@1.3.2: - resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} - engines: {node: '>=0.10.0'} - - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - - mkdirp@0.3.0: - resolution: {integrity: sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==} - deprecated: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - - mkdirp@2.1.6: - resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} - engines: {node: '>=10'} - hasBin: true - - mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} - - mojangson@2.0.4: - resolution: {integrity: sha512-HYmhgDjr1gzF7trGgvcC/huIg2L8FsVbi/KacRe6r1AswbboGVZDS47SOZlomPuMWvZLas8m9vuHHucdZMwTmQ==} - - monaco-editor@0.52.2: - resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} - - moo@0.5.2: - resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} - - morgan@1.10.0: - resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} - engines: {node: '>= 0.8.0'} - - motion-dom@12.9.1: - resolution: {integrity: sha512-xqXEwRLDYDTzOgXobSoWtytRtGlf7zdkRfFbrrdP7eojaGQZ5Go4OOKtgnx7uF8sAkfr1ZjMvbCJSCIT2h6fkQ==} - - motion-utils@12.8.3: - resolution: {integrity: sha512-GYVauZEbca8/zOhEiYOY9/uJeedYQld6co/GJFKOy//0c/4lDqk0zB549sBYqqV2iMuX+uHrY1E5zd8A2L+1Lw==} - - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - - nan@2.22.2: - resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==} - - nano-css@5.6.2: - resolution: {integrity: sha512-+6bHaC8dSDGALM1HJjOHVXpuastdu2xFoZlC77Jh4cg+33Zcgm+Gxd+1xsnpZK14eyHObSp82+ll5y3SX75liw==} - peerDependencies: - react: ^18.2.0 - react-dom: '*' - - nanoid@3.3.9: - resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - nanomatch@1.2.13: - resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} - engines: {node: '>=0.10.0'} - - napi-build-utils@2.0.0: - resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - nearley@2.20.1: - resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} - hasBin: true - - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} - engines: {node: '>= 0.6'} - - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/e754999ffdea67853bc9b10553b5e9908b40f618: - resolution: {tarball: https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/e754999ffdea67853bc9b10553b5e9908b40f618} - version: 0.2.4 - - nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - - no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - - node-abi@3.74.0: - resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} - engines: {node: '>=10'} - - node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} - - node-canvas-webgl@0.3.0: - resolution: {integrity: sha512-wDRCTEE2TCqKDeSef5cNgtLv8kgjRlnFN3aYgB9yni0kHRNnKBSSP93lT8VIV5GuMWiy5KNXBU0ilyWL5wTvFg==} - - node-dir@0.1.17: - resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} - engines: {node: '>= 0.10.5'} - - node-fetch-native@1.6.6: - resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp@9.4.1: - resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} - engines: {node: ^12.13 || ^14.13 || >=16} - hasBin: true - - node-gzip@1.1.2: - resolution: {integrity: sha512-ZB6zWpfZHGtxZnPMrJSKHVPrRjURoUzaDbLFj3VO70mpLTW5np96vXyHwft4Id0o+PYIzgDkBUjIzaNHhQ8srw==} - - node-html-parser@6.1.13: - resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} - - node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - - node-rsa@0.4.2: - resolution: {integrity: sha512-Bvso6Zi9LY4otIZefYrscsUpo2mUpiAVIEmSZV2q41sP8tHZoert3Yu6zv4f/RXJqMNZQKCtnhDugIuCma23YA==} - - node-rsa@1.1.1: - resolution: {integrity: sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==} - - nopt@1.0.10: - resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} - hasBin: true - - nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true - - nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true - - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - - normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} - - normalize-path@2.1.1: - resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} - engines: {node: '>=0.10.0'} - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - npm-run-all@4.1.5: - resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} - engines: {node: '>= 4'} - hasBin: true - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - deprecated: This package is no longer supported. - - npmlog@6.0.2: - resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - - nypm@0.5.4: - resolution: {integrity: sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA==} - engines: {node: ^14.16.0 || >=16.10.0} - hasBin: true - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-copy@0.1.0: - resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object-visit@1.0.1: - resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} - engines: {node: '>=0.10.0'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.pick@1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} - - object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} - - omggif@1.0.10: - resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} - - on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} - - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - - opener@1.5.2: - resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} - hasBin: true - - opn@6.0.0: - resolution: {integrity: sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ==} - engines: {node: '>=8'} - deprecated: The package has been renamed to `open` - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - - orderedmap@2.1.1: - resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} - - os-browserify@0.3.0: - resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} - - ospath@1.2.2: - resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} - - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} - - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - - pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - - pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - - pako@2.1.0: - resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} - - param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-asn1@5.1.7: - resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} - engines: {node: '>= 0.10'} - - parse-bmfont-ascii@1.0.6: - resolution: {integrity: sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==} - - parse-bmfont-binary@1.0.6: - resolution: {integrity: sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==} - - parse-bmfont-xml@1.1.6: - resolution: {integrity: sha512-0cEliVMZEhrFDwMh4SxIyVJpqYoOWDJ9P895tFuS+XuNzI5UBmBk5U5O4KuJdTnZpSBI4LFA2+ZiJaiwfSwlMA==} - - parse-headers@2.0.5: - resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} - - parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - parseqs@0.0.6: - resolution: {integrity: sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==} - - parseuri@0.0.6: - resolution: {integrity: sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==} - - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - - pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - - pascalcase@0.1.1: - resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} - engines: {node: '>=0.10.0'} - - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - - path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} - - path-dirname@1.0.2: - resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} - - path-exists-cli@2.0.0: - resolution: {integrity: sha512-qGr0A87KYCznmvabblxyxnzA/MtPZ28wH+4SCMP4tjTFAbzqwvs5xpUZExAYzq5OgHe5vIswzdH5iosCb8YF/Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - - path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - - path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - pause-stream@0.0.11: - resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} - - pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} - - peek-stream@1.1.3: - resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} - - peerjs-js-binarypack@2.1.0: - resolution: {integrity: sha512-YIwCC+pTzp3Bi8jPI9UFKO0t0SLo6xALnHkiNt/iUFmUUZG0fEEmEyFKvjsDKweiFitzHRyhuh6NvyJZ4nNxMg==} - engines: {node: '>= 14.0.0'} - - peerjs@1.5.4: - resolution: {integrity: sha512-yFsoLMnurJKlQbx6kVSBpOp+AlNldY1JQS2BrSsHLKCZnq6t7saHleuHM5svuLNbQkUJXHLF3sKOJB1K0xulOw==} - engines: {node: '>= 14'} - - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - - performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - - phin@2.9.3: - resolution: {integrity: sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - phin@3.7.1: - resolution: {integrity: sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ==} - engines: {node: '>= 8'} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - - pidtree@0.3.1: - resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} - engines: {node: '>=0.10'} - hasBin: true - - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - - pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - - pixelarticons@1.8.1: - resolution: {integrity: sha512-4taoDCleft9RtzVHLA73VDnRBwJNqlwbW8ShO6S0G9b+bM5ArGe1MVFW9xpromuPvQgVUYCSjRxNAQuNtADqyA==} - - pixelmatch@4.0.2: - resolution: {integrity: sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==} - hasBin: true - - pkg-dir@3.0.0: - resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} - engines: {node: '>=6'} - - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - - pkg-dir@5.0.0: - resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} - engines: {node: '>=10'} - - pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - - pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - - pngjs@3.4.0: - resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} - engines: {node: '>=4.0.0'} - - polished@4.3.1: - resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} - engines: {node: '>=10'} - - poly-decomp@0.3.0: - resolution: {integrity: sha512-hWeBxGzPYiybmI4548Fca7Up/0k1qS5+79cVHI9+H33dKya5YNb9hxl0ZnDaDgvrZSuYFBhkCK/HOnqN7gefkQ==} - - portfinder@1.0.33: - resolution: {integrity: sha512-+2jndHT63cL5MdQOwDm9OT2dIe11zVpjV+0GGRXdtO1wpPxv260NfVqoEXtYAi/shanmm3W4+yLduIe55ektTw==} - engines: {node: '>= 0.12.0'} - - posix-character-classes@0.1.1: - resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} - engines: {node: '>=0.10.0'} - - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} - engines: {node: ^10 || ^12 || >=14} - - potpack@1.0.2: - resolution: {integrity: sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==} - - prebuild-install@7.1.3: - resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} - engines: {node: '>=10'} - hasBin: true - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier@1.19.1: - resolution: {integrity: sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==} - engines: {node: '>=4'} - hasBin: true - - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} - - pretty-bytes@6.1.1: - resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} - engines: {node: ^14.13.1 || >=16.0.0} - - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - pretty-hrtime@1.0.3: - resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} - engines: {node: '>= 0.8'} - - prismarine-auth@2.7.0: - resolution: {integrity: sha512-L8wTF6sdtnN6hViPNy+Nx39a8iQBwR5iO92AWCiym5cSXp/92pmnuwnTdcmNDWyqq6zY4hbibVGYhgLA1Ox8sQ==} - - prismarine-biome@1.3.0: - resolution: {integrity: sha512-GY6nZxq93mTErT7jD7jt8YS1aPrOakbJHh39seYsJFXvueIOdHAmW16kYQVrTVMW5MlWLQVxV/EquRwOgr4MnQ==} - peerDependencies: - minecraft-data: 3.98.0 - prismarine-registry: ^1.1.0 - - prismarine-block@https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9: - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9} - version: 1.21.0 - - prismarine-chat@1.11.0: - resolution: {integrity: sha512-VJT/MWYB3qoiznUhrgvSQh76YFpzpCZpY85kJKxHLbd3UVoM0wsfs43Eg8dOltiZG92wc5/DTMLlT07TEeoa9w==} - - prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/c5feac83b61d95feb4d4f22c063dacfb8c192a9f: - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/c5feac83b61d95feb4d4f22c063dacfb8c192a9f} - version: 1.38.1 - engines: {node: '>=14'} - - prismarine-entity@2.5.0: - resolution: {integrity: sha512-nRPCawUwf9r3iKqi4I7mZRlir1Ix+DffWYdWq6p/KNnmiXve+xHE5zv8XCdhZlUmOshugHv5ONl9o6ORAkCNIA==} - - prismarine-item@1.17.0: - resolution: {integrity: sha512-wN1OjP+f+Uvtjo3KzeCkVSy96CqZ8yG7cvuvlGwcYupQ6ct7LtNkubHp0AHuLMJ0vbbfAC0oZ2bWOgI1DYp8WA==} - - prismarine-nbt@2.7.0: - resolution: {integrity: sha512-Du9OLQAcCj3y29YtewOJbbV4ARaSUEJiTguw0PPQbPBy83f+eCyDRkyBpnXTi/KPyEpgYCzsjGzElevLpFoYGQ==} - - prismarine-physics@https://codeload.github.com/zardoy/prismarine-physics/tar.gz/353e25b800149393f40539ec381218be44cbb03b: - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-physics/tar.gz/353e25b800149393f40539ec381218be44cbb03b} - version: 1.9.0 - - prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/1d548fac63fe977c8281f0a9a522b37e4d92d0b7: - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/1d548fac63fe977c8281f0a9a522b37e4d92d0b7} - version: 2.8.0 - - prismarine-realms@1.3.2: - resolution: {integrity: sha512-5apl9Ru8veTj5q2OozRc4GZOuSIcs3yY4UEtALiLKHstBe8bRw8vNlaz4Zla3jsQ8yP/ul1b1IJINTRbocuA6g==} - - prismarine-recipe@1.3.1: - resolution: {integrity: sha512-xfa9E9ACoaDi+YzNQ+nk8kWSIqt5vSZOOCHIT+dTXscf/dng2HaJ/59uwe1D/jvOkAd2OvM6RRJM6fFe0q/LDA==} - peerDependencies: - prismarine-registry: ^1.4.0 - - prismarine-registry@1.11.0: - resolution: {integrity: sha512-uTvWE+bILxYv4i5MrrlxPQ0KYWINv1DJ3P2570GLC8uCdByDiDLBFfVyk4BrqOZBlDBft9CnaJMeOsC1Ly1iXw==} - - prismarine-schematic@1.2.3: - resolution: {integrity: sha512-Mwpn43vEHhm3aw3cPhJjWqztkW+nX+QLajDHlTask8lEOTGl1WmpvFja4iwiws4GIvaC8x0Foptf4uvDsnjrAg==} - - prismarine-windows@2.9.0: - resolution: {integrity: sha512-fm4kOLjGFPov7TEJRmXHoiPabxIQrG36r2mDjlNxfkcLfMHFb3/1ML6mp4iRQa7wL0GK4DIAyiBqCWoeWDxARg==} - - prismarine-world@https://codeload.github.com/zardoy/prismarine-world/tar.gz/ab2146c9933eef3247c3f64446de4ccc2c484c7c: - resolution: {tarball: https://codeload.github.com/zardoy/prismarine-world/tar.gz/ab2146c9933eef3247c3f64446de4ccc2c484c7c} - version: 3.6.3 - engines: {node: '>=8.0.0'} - - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - - process@https://codeload.github.com/PrismarineJS/node-process/tar.gz/380d0b4f4c86f1b65b216c311bf00431f314e88e: - resolution: {tarball: https://codeload.github.com/PrismarineJS/node-process/tar.gz/380d0b4f4c86f1b65b216c311bf00431f314e88e} - version: 0.11.10 - engines: {node: '>= 0.6.0'} - - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - - promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - - promise-queue@2.2.5: - resolution: {integrity: sha512-p/iXrPSVfnqPft24ZdNNLECw/UrtLTpT3jpAAMzl/o5/rDsGCPo3/CQS2611flL6LkoEJ3oQZw7C8Q80ZISXRQ==} - engines: {node: '>= 0.8.0'} - - promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - - prosemirror-commands@1.7.0: - resolution: {integrity: sha512-6toodS4R/Aah5pdsrIwnTYPEjW70SlO5a66oo5Kk+CIrgJz3ukOoS+FYDGqvQlAX5PxoGWDX1oD++tn5X3pyRA==} - - prosemirror-dropcursor@1.8.1: - resolution: {integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==} - - prosemirror-example-setup@1.2.3: - resolution: {integrity: sha512-+hXZi8+xbFvYM465zZH3rdZ9w7EguVKmUYwYLZjIJIjPK+I0nPTwn8j0ByW2avchVczRwZmOJGNvehblyIerSQ==} - - prosemirror-gapcursor@1.3.2: - resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==} - - prosemirror-history@1.4.1: - resolution: {integrity: sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==} - - prosemirror-inputrules@1.4.0: - resolution: {integrity: sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==} - - prosemirror-keymap@1.2.2: - resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} - - prosemirror-markdown@1.13.1: - resolution: {integrity: sha512-Sl+oMfMtAjWtlcZoj/5L/Q39MpEnVZ840Xo330WJWUvgyhNmLBLN7MsHn07s53nG/KImevWHSE6fEj4q/GihHw==} - - prosemirror-menu@1.2.4: - resolution: {integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==} - - prosemirror-model@1.24.1: - resolution: {integrity: sha512-YM053N+vTThzlWJ/AtPtF1j0ebO36nvbmDy4U7qA2XQB8JVaQp1FmB9Jhrps8s+z+uxhhVTny4m20ptUvhk0Mg==} - - prosemirror-schema-list@1.5.1: - resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} - - prosemirror-state@1.4.3: - resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} - - prosemirror-transform@1.10.3: - resolution: {integrity: sha512-Nhh/+1kZGRINbEHmVu39oynhcap4hWTs/BlU7NnxWj3+l0qi8I1mu67v6mMdEe/ltD8hHvU4FV6PHiCw2VSpMw==} - - prosemirror-view@1.38.1: - resolution: {integrity: sha512-4FH/uM1A4PNyrxXbD+RAbAsf0d/mM0D/wAKSVVWK7o0A9Q/oOXJBrw786mBf2Vnrs/Edly6dH6Z2gsb7zWwaUw==} - - protodef-validator@1.4.0: - resolution: {integrity: sha512-2y2coBolqCEuk5Kc3QwO7ThR+/7TZiOit4FrpAgl+vFMvq8w76nDhh09z08e2NQOdrgPLsN2yzXsvRvtADgUZQ==} - hasBin: true - - protodef@1.18.0: - resolution: {integrity: sha512-jO64lkzkh0dYc0AVWCU/GzCKwqhFFIz1kfEz0NBf0RUuRNcmvgKbopabJdfZ6W8NvALdySUXgEhvKDZPhdBwrg==} - engines: {node: '>=14'} - - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - - proxy-compare@2.5.1: - resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} - - proxy-compare@2.6.0: - resolution: {integrity: sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw==} - - proxy-from-env@1.0.0: - resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - proxy-middleware@0.15.0: - resolution: {integrity: sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==} - engines: {node: '>=0.8.0'} - - psl@1.15.0: - resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - - public-encrypt@4.0.3: - resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} - - pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} - - pumpify@1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} - - punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} - - punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - puppeteer-core@2.1.1: - resolution: {integrity: sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==} - engines: {node: '>=8.16.0'} - - qrcode.react@3.2.0: - resolution: {integrity: sha512-YietHHltOHA4+l5na1srdaMx4sVSOjV9tamHs+mwiLWAMr6QVACRUw1Neax5CptFILcNoITctJY0Ipyn5enQ8g==} - peerDependencies: - react: ^18.2.0 - - qs@6.10.4: - resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==} - engines: {node: '>=0.6'} - - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} - - qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} - engines: {node: '>=0.6'} - - querystring-es3@0.2.1: - resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} - engines: {node: '>=0.4.x'} - - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - - quickselect@2.0.0: - resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} - - railroad-diagrams@1.0.0: - resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} - - rambda@6.9.0: - resolution: {integrity: sha512-yosVdGg1hNGkXPzqGiOYNEpXKjEOxzUCg2rB0l+NKdyCaSf4z+i5ojbN0IqDSezMMf71YEglI+ZUTgTffn5afw==} - - rambda@9.4.2: - resolution: {integrity: sha512-++euMfxnl7OgaEKwXh9QqThOjMeta2HH001N1v4mYQzBjJBnmXBh2BCK6dZAbICFVXOFUVD3xFG0R3ZPU0mxXw==} - - ramda@0.29.0: - resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} - - randexp@0.4.6: - resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==} - engines: {node: '>=0.12'} - - random-seed@0.3.0: - resolution: {integrity: sha512-y13xtn3kcTlLub3HKWXxJNeC2qK4mB59evwZ5EkeRlolx+Bp2ztF7LbcZmyCnOqlHQrLnfuNbi1sVmm9lPDlDA==} - engines: {node: '>= 0.6.0'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - randomfill@1.0.4: - resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} - - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - range@0.0.3: - resolution: {integrity: sha512-OxK2nY2bmeEB4NxoBraQIBOOeOIxoBvm6yt8MA1kLappgkG3SyLf173iOtT5woWycrtESDD2g0Nl2yt8YPoUnw==} - engines: {node: '>=0.8'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - - rbush@3.0.1: - resolution: {integrity: sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==} - - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - - react-colorful@5.6.1: - resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} - peerDependencies: - react: ^18.2.0 - react-dom: '>=16.8.0' - - react-docgen-typescript@2.2.2: - resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} - peerDependencies: - typescript: '>= 4.3.x' - - react-docgen@7.1.1: - resolution: {integrity: sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg==} - engines: {node: '>=16.14.0'} - - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.2.0 - - react-element-to-jsx-string@15.0.0: - resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} - peerDependencies: - react: ^18.2.0 - react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 - - react-fast-compare@3.2.2: - resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} - - react-hook-form@7.54.2: - resolution: {integrity: sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: ^18.2.0 - - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - react-is@18.1.0: - resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} - - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - - react-popper@2.3.0: - resolution: {integrity: sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==} - peerDependencies: - '@popperjs/core': ^2.0.0 - react: ^18.2.0 - react-dom: ^16.8.0 || ^17 || ^18 - - react-portal@4.2.1: - resolution: {integrity: sha512-fE9kOBagwmTXZ3YGRYb4gcMy+kSA+yLO0xnPankjRlfBv4uCpFXqKPfkpsGQQR15wkZ9EssnvTOl1yMzbkxhPQ==} - peerDependencies: - react: ^18.2.0 - react-dom: ^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0 - - react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} - engines: {node: '>=0.10.0'} - - react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} - engines: {node: '>=0.10.0'} - - react-remove-scroll-bar@2.3.8: - resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-remove-scroll@2.5.5: - resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-select@5.10.1: - resolution: {integrity: sha512-roPEZUL4aRZDx6DcsD+ZNreVl+fM8VsKn0Wtex1v4IazH60ILp5xhdlp464IsEAlJdXeD+BhDAFsBVMfvLQueA==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - react-style-singleton@2.2.3: - resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-transition-group@4.4.5: - resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} - peerDependencies: - react: ^18.2.0 - react-dom: '>=16.6.0' - - react-universal-interface@0.6.2: - resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} - peerDependencies: - react: ^18.2.0 - tslib: '*' - - react-use-measure@2.1.1: - resolution: {integrity: sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==} - peerDependencies: - react: ^18.2.0 - react-dom: '>=16.13' - - react-use@17.3.1: - resolution: {integrity: sha512-hs7+tS4rRm1QLHPfanLCqXIi632tP4V7Sai1ENUP2WTufU6am++tU9uSw9YrNCFqbABiEv0ndKU1XCUcfu2tXA==} - peerDependencies: - react: ^18.2.0 - react-dom: ^16.8.0 || ^17.0.0 - - react-zoom-pan-pinch@3.4.4: - resolution: {integrity: sha512-lGTu7D9lQpYEQ6sH+NSlLA7gicgKRW8j+D/4HO1AbSV2POvKRFzdWQ8eI0r3xmOsl4dYQcY+teV6MhULeg1xBw==} - engines: {node: '>=8', npm: '>=5'} - peerDependencies: - react: ^18.2.0 - react-dom: '*' - - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} - - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - - read-pkg-up@8.0.0: - resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==} - engines: {node: '>=12'} - - read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} - - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - - read-pkg@6.0.0: - resolution: {integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==} - engines: {node: '>=12'} - - readable-stream@1.0.34: - resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} - - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readable-stream@4.7.0: - resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - readdirp@2.2.1: - resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} - engines: {node: '>=0.10'} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - readline@1.3.0: - resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} - - recast@0.23.11: - resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} - engines: {node: '>= 4'} - - redent@4.0.0: - resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} - engines: {node: '>=12'} - - reduce-configs@1.1.0: - resolution: {integrity: sha512-DQxy6liNadHfrLahZR7lMdc227NYVaQZhY5FMsxLEjX8X0SCuH+ESHSLCoz2yDZFq1/CLMDOAHdsEHwOEXKtvg==} - - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} - - regenerate-unicode-properties@10.2.0: - resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} - engines: {node: '>=4'} - - regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - - regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - - regex-not@1.0.2: - resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} - engines: {node: '>=0.10.0'} - - regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - - regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - - regexpu-core@6.2.0: - resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} - engines: {node: '>=4'} - - regjsgen@0.8.0: - resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - - regjsparser@0.10.0: - resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} - hasBin: true - - regjsparser@0.12.0: - resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} - hasBin: true - - remark-external-links@8.0.0: - resolution: {integrity: sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==} - - remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - - remark-slug@6.1.0: - resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} - - remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - - remark@15.0.1: - resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} - - remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - - repeat-element@1.1.4: - resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} - engines: {node: '>=0.10.0'} - - repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - - request-progress@3.0.0: - resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - - resize-observer-polyfill@1.5.1: - resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - resolve-url@0.2.1: - resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} - deprecated: https://github.com/lydell/resolve-url#deprecated - - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true - - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - - ret@0.1.15: - resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} - engines: {node: '>=0.12'} - - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - - rimraf@2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rimraf@5.0.10: - resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} - hasBin: true - - ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - - rollup@2.79.2: - resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} - engines: {node: '>=10.0.0'} - hasBin: true - - rollup@3.29.5: - resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - - rollup@4.34.9: - resolution: {integrity: sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - rope-sequence@1.3.4: - resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} - - rtl-css-js@1.16.1: - resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} - - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - - safe-regex@1.1.0: - resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - sanitize-filename@1.6.3: - resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} - - sat@0.9.0: - resolution: {integrity: sha512-mxdv5RZJO4tdMnUURGU3gAMcnDUEwcNJwE+lPO0/V+rBeDvFLH3wEZEOR0fH7cTN0zQaNxBEbHnyQL9DzupwQQ==} - - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - - screenfull@5.2.0: - resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} - engines: {node: '>=0.10.0'} - - sdp@3.2.0: - resolution: {integrity: sha512-d7wDPgDV3DDiqulJjKiV2865wKsJ34YI+NDREbm+FySq6WuKOikwyNQcm+doLAZ1O6ltdO0SeKle2xMpN3Brgw==} - - secure-compare@3.0.1: - resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} - - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} - engines: {node: '>=10'} - hasBin: true - - send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} - engines: {node: '>= 0.8.0'} - - send@1.2.0: - resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} - engines: {node: '>= 18'} - - sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} - - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - - serve-index@1.9.1: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} - engines: {node: '>= 0.8.0'} - - serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} - engines: {node: '>= 0.8.0'} - - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - set-harmonic-interval@1.0.1: - resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} - engines: {node: '>=6.9'} - - set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} - - set-value@2.0.1: - resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} - engines: {node: '>=0.10.0'} - - setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - - setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true - - shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - - sharp@0.30.7: - resolution: {integrity: sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==} - engines: {node: '>=12.13.0'} - - sharp@0.33.5: - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shell-quote@1.8.2: - resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} - engines: {node: '>= 0.4'} - - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - simple-get@3.1.1: - resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} - - simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - skinview-utils@0.7.1: - resolution: {integrity: sha512-4eLrMqR526ehlZbsd8SuZ/CHpS9GiH0xUMoV+PYlJVi95ZFz5HJu7Spt5XYa72DRS7wgt5qquvHZf0XZJgmu9Q==} - - skinview3d@3.1.0: - resolution: {integrity: sha512-L+HXXAP4qYjLcY3YHasXKie9KXQpv/mPTMxgLOEd+hVQRdQkPs5xdWaKuOmlZY8UnyZzecQM7yrWRzgT/e7HZw==} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slice-ansi@3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} - - slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - - smob@1.5.0: - resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} - - snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - - snapdragon-node@2.1.1: - resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} - engines: {node: '>=0.10.0'} - - snapdragon-util@3.0.1: - resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} - engines: {node: '>=0.10.0'} - - snapdragon@0.8.2: - resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} - engines: {node: '>=0.10.0'} - - socket.io-adapter@1.1.2: - resolution: {integrity: sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==} - - socket.io-adapter@2.5.5: - resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} - - socket.io-client@2.5.0: - resolution: {integrity: sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==} - - socket.io-client@4.8.1: - resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} - engines: {node: '>=10.0.0'} - - socket.io-parser@3.3.4: - resolution: {integrity: sha512-z/pFQB3x+EZldRRzORYW1vwVO8m/3ILkswtnpoeU6Ve3cbMWkmHEWDAVJn4QJtchiiFTo5j7UG2QvwxvaA9vow==} - - socket.io-parser@3.4.3: - resolution: {integrity: sha512-1rE4dZN3kCI/E5wixd393hmbqa78vVpkKmnEJhLeWoS/C5hbFYAbcSfnWoaVH43u9ToUVtzKjguxEZq+1XZfCQ==} - engines: {node: '>=10.0.0'} - - socket.io-parser@4.2.4: - resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} - engines: {node: '>=10.0.0'} - - socket.io@2.5.1: - resolution: {integrity: sha512-eaTE4tBKRD6RFoetquMbxgvcpvoDtRyIlkIMI/SMK2bsKvbENTsDeeu4GJ/z9c90yOWxB7b/eC+yKLPbHnH6bA==} - - socket.io@4.8.1: - resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} - engines: {node: '>=10.2.0'} - - socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} - - socks@2.8.4: - resolution: {integrity: sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - source-map-resolve@0.5.3: - resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map-url@0.4.1: - resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} - deprecated: See https://github.com/lydell/source-map-url#deprecated - - source-map@0.5.6: - resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} - engines: {node: '>=0.10.0'} - - source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - deprecated: The work that was done in this beta branch won't be included in future versions - - sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - - space-separated-tokens@1.1.5: - resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} - - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.21: - resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} - - split-string@3.1.0: - resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} - engines: {node: '>=0.10.0'} - - split@0.3.3: - resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - - sshpk@1.18.0: - resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} - engines: {node: '>=0.10.0'} - hasBin: true - - ssri@9.0.1: - resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - stack-generator@2.0.10: - resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} - - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - - stackframe@1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - - stacktrace-gps@3.1.2: - resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} - - stacktrace-js@2.0.2: - resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} - - state-local@1.0.7: - resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} - - static-extend@0.1.2: - resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} - engines: {node: '>=0.10.0'} - - stats-gl@1.0.7: - resolution: {integrity: sha512-vZI82CjefSxLC1bjw36z28v0+QE9rJKymGlXtfWu+ipW70ZEAwa4EbO4LxluAfLfpqiaAS04NzpYBRLDeAwYWQ==} - - stats.js@0.17.0: - resolution: {integrity: sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==} - - statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} - - std-env@3.8.1: - resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} - - stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} - - store2@2.14.4: - resolution: {integrity: sha512-srTItn1GOvyvOycgxjAnPA63FZNwy0PTyUBFMHRM+hVFltAeoh0LmNBz9SZqUS9mMqGk8rfyWyXn3GH5ReJ8Zw==} - - storybook@7.6.20: - resolution: {integrity: sha512-Wt04pPTO71pwmRmsgkyZhNo4Bvdb/1pBAMsIFb9nQLykEdzzpXjvingxFFvdOG4nIowzwgxD+CLlyRqVJqnATw==} - hasBin: true - - stream-browserify@3.0.0: - resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} - - stream-combiner@0.0.4: - resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} - - stream-http@3.2.0: - resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} - - stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - - strict-event-emitter-types@2.0.0: - resolution: {integrity: sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} - engines: {node: '>= 0.4'} - - string.prototype.padend@3.1.6: - resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} - engines: {node: '>= 0.4'} - - string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - - string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - stringify-object@3.3.0: - resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} - engines: {node: '>=4'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-comments@2.0.1: - resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} - engines: {node: '>=10'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - - strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} - engines: {node: '>=12'} - - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - strip-literal@1.3.0: - resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} - - stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - - stylis@4.3.6: - resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - synchronous-promise@2.0.17: - resolution: {integrity: sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==} - - systeminformation@5.25.11: - resolution: {integrity: sha512-jI01fn/t47rrLTQB0FTlMCC+5dYx8o0RRF+R4BPiUNsvg5OdY0s9DKMFmJGrx5SwMZQ4cag0Gl6v8oycso9b/g==} - engines: {node: '>=8.0.0'} - os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] - hasBin: true - - tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - - tar-fs@2.1.2: - resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - - telejson@7.2.0: - resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} - - temp-dir@2.0.0: - resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} - engines: {node: '>=8'} - - temp@0.8.4: - resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} - engines: {node: '>=6.0.0'} - - tempy@0.6.0: - resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} - engines: {node: '>=10'} - - tempy@1.0.1: - resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} - engines: {node: '>=10'} - - terser@5.39.0: - resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} - engines: {node: '>=10'} - hasBin: true - - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - - thingies@1.21.0: - resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} - engines: {node: '>=10.18'} - peerDependencies: - tslib: ^2 - - three-stdlib@2.35.14: - resolution: {integrity: sha512-kpCaEg59M9usFTgHC+YZNKvx7nMoLI2zQxZBV8pjoNW6vNZmGyXpaLBL09A2oLCsS3KepgMFkOuk6lRoebTNvA==} - peerDependencies: - three: 0.154.0 - - three.meshline@1.4.0: - resolution: {integrity: sha512-A8IsiMrWP8zmHisGDAJ76ZD7t/dOF/oCe/FUKNE6Bu01ZYEx8N6IlU/1Plb2aOZtAuWM2A8s8qS3hvY0OFuvOw==} - - three@0.154.0: - resolution: {integrity: sha512-Uzz8C/5GesJzv8i+Y2prEMYUwodwZySPcNhuJUdsVMH2Yn4Nm8qlbQe6qRN5fOhg55XB0WiLfTPBxVHxpE60ug==} - - throttle-debounce@3.0.1: - resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} - engines: {node: '>=10'} - - throttleit@1.0.1: - resolution: {integrity: sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==} - - through2@0.6.5: - resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} - - through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - timers-browserify@2.0.12: - resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} - engines: {node: '>=0.6.0'} - - timm@1.7.1: - resolution: {integrity: sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==} - - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - - tinycolor2@1.6.0: - resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - - tinypool@0.7.0: - resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} - engines: {node: '>=14.0.0'} - - tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} - - title-case@3.0.3: - resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} - - tmp@0.2.3: - resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} - engines: {node: '>=14.14'} - - tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - - to-array@0.1.4: - resolution: {integrity: sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==} - - to-object-path@0.3.0: - resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} - engines: {node: '>=0.10.0'} - - to-regex-range@2.1.1: - resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} - engines: {node: '>=0.10.0'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - to-regex@3.0.2: - resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} - engines: {node: '>=0.10.0'} - - tocbot@4.35.0: - resolution: {integrity: sha512-i8FoSaP3u60D94e/dtzCk23PIEBnc/l8XqvlK4g8gUCa9XFY4RmyMLYP6X+yN+ljcEijFbmCtNHtBoeTsQkCPg==} - - toggle-selection@1.0.6: - resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - - tree-dump@1.0.2: - resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - trim-newlines@4.1.1: - resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} - engines: {node: '>=12'} - - trough@2.2.0: - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - - truncate-utf8-bytes@1.0.2: - resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - - ts-api-utils@1.4.3: - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - - ts-api-utils@2.0.1: - resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - - ts-checker-rspack-plugin@1.1.1: - resolution: {integrity: sha512-BlpPqnfAmV0TcDg58H+1qV8Zb57ilv0x+ajjnxrVQ6BWgC8HzAdc+TycqDOJ4sZZYIV+hywQGozZFGklzbCR6A==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@rspack/core': ^1.0.0 - typescript: '>=3.8.0' - peerDependenciesMeta: - '@rspack/core': - optional: true - - ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - - ts-easing@0.2.0: - resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - tsx@4.19.3: - resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} - engines: {node: '>=18.0.0'} - hasBin: true - - tty-browserify@0.0.1: - resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} - - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - - tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - type-fest@0.16.0: - resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} - engines: {node: '>=10'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - - type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - - type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} - - typed-emitter@1.4.0: - resolution: {integrity: sha512-weBmoo3HhpKGgLBOYwe8EB31CzDFuaK7CCL+axXhUYhn4jo6DSkHnbefboCF5i4DQ2aMFe0C/FdTWcPdObgHyg==} - - typed-emitter@2.1.0: - resolution: {integrity: sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==} - - typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} - engines: {node: '>=14.17'} - hasBin: true - - ua-parser-js@1.0.40: - resolution: {integrity: sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==} - hasBin: true - - uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - - ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} - - uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} - hasBin: true - - uint4@0.1.2: - resolution: {integrity: sha512-lhEx78gdTwFWG+mt6cWAZD/R6qrIj0TTBeH5xwyuDJyswLNlGe+KVlUPQ6+mx5Ld332pS0AMUTo9hIly7YsWxQ==} - - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} - - undici@6.0.1: - resolution: {integrity: sha512-eZFYQLeS9BiXpsU0cuFhCwfeda2MnC48EVmmOz/eCjsTgmyTdaHdVsPSC/kwC2GtW2e0uH0HIPbadf3/bRWSxw==} - engines: {node: '>=18.0'} - - unicode-canonical-property-names-ecmascript@2.0.1: - resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} - engines: {node: '>=4'} - - unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} - - unicode-match-property-value-ecmascript@2.2.0: - resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} - engines: {node: '>=4'} - - unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} - - unidiff@1.0.2: - resolution: {integrity: sha512-2sbEzki5fBmjgAqoafwxRenfMcumMlmVAoJDwYJa3CI4ZVugkdR6qjTw5sVsl29/4JfBBXhWEAd5ars8nRdqXg==} - - unified@11.0.5: - resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - - union-value@1.0.1: - resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} - engines: {node: '>=0.10.0'} - - union@0.5.0: - resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} - engines: {node: '>= 0.8.0'} - - unique-filename@2.0.1: - resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - unique-slug@3.0.0: - resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} - - unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} - - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} - - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - - unist-util-visit@2.0.3: - resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} - - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - - unix-crypt-td-js@1.1.4: - resolution: {integrity: sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - unplugin@1.16.1: - resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} - engines: {node: '>=14.0.0'} - - unset-value@1.0.0: - resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} - engines: {node: '>=0.10.0'} - - untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - - upath@1.2.0: - resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} - engines: {node: '>=4'} - - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} - - upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - urix@0.1.0: - resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} - deprecated: Please see https://github.com/lydell/urix#deprecated - - url-join@4.0.1: - resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} - - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - - url@0.11.4: - resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} - engines: {node: '>= 0.4'} - - use-callback-ref@1.3.3: - resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - use-deep-compare@1.3.0: - resolution: {integrity: sha512-94iG+dEdEP/Sl3WWde+w9StIunlV8Dgj+vkt5wTwMoFQLaijiEZSXXy8KtcStpmEDtIptRJiNeD4ACTtVvnIKA==} - peerDependencies: - react: ^18.2.0 - - use-isomorphic-layout-effect@1.2.0: - resolution: {integrity: sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - use-resize-observer@9.1.0: - resolution: {integrity: sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==} - peerDependencies: - react: ^18.2.0 - react-dom: 16.8.0 - 18 - - use-sidecar@1.1.3: - resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - - use-sync-external-store@1.2.0: - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} - peerDependencies: - react: ^18.2.0 - - use-typed-event-listener@4.0.2: - resolution: {integrity: sha512-AhjRw+qg5t7OWg7en2Q4XDCdi2iyhALFl71tITL3FeZqt/jD1Qa6KnbH/UolARtID1Gd0IElizbCgolv3ZbUFA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - peerDependencies: - react: ^18.2.0 - typescript: '>=4.1.2' - peerDependenciesMeta: - typescript: - optional: true - - use@3.1.1: - resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} - engines: {node: '>=0.10.0'} - - utf8-byte-length@1.0.5: - resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} - - utif@2.0.1: - resolution: {integrity: sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - - uuid-1345@1.0.2: - resolution: {integrity: sha512-bA5zYZui+3nwAc0s3VdGQGBfbVsJLVX7Np7ch2aqcEWFi5lsAEcmO3+lx3djM1npgpZI8KY2FITZ2uYTnYUYyw==} - - uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - - valtio@1.11.2: - resolution: {integrity: sha512-1XfIxnUXzyswPAPXo1P3Pdx2mq/pIqZICkWN60Hby0d9Iqb+MEIpqgYVlbflvHdrp2YR/q3jyKWRPJJ100yxaw==} - engines: {node: '>=12.20.0'} - peerDependencies: - '@types/react': '>=16.8' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - - valtio@1.13.2: - resolution: {integrity: sha512-Qik0o+DSy741TmkqmRfjq+0xpZBXi/Y6+fXZLn0xNF1z/waFMbE3rkivv5Zcf9RrMUp6zswf2J7sbh2KBlba5A==} - engines: {node: '>=12.20.0'} - peerDependencies: - '@types/react': '>=16.8' - react: ^18.2.0 - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - vec3@0.1.10: - resolution: {integrity: sha512-Sr1U3mYtMqCOonGd3LAN9iqy0qF6C+Gjil92awyK/i2OwiUo9bm7PnLgFpafymun50mOjnDcg4ToTgRssrlTcw==} - - verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} - - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - - vite-node@0.34.6: - resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} - engines: {node: '>=v14.18.0'} - hasBin: true - - vite@4.5.9: - resolution: {integrity: sha512-qK9W4xjgD3gXbC0NmdNFFnVFLMWSNiR3swj957yutwzzN16xF/E7nmtAyp1rT9hviDroQANjE4HK3H4WqWdFtw==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - - vite@6.2.1: - resolution: {integrity: sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - vitest@0.34.6: - resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} - engines: {node: '>=v14.18.0'} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - happy-dom: '*' - jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true - - vm-browserify@1.1.2: - resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} - - w3c-keyname@2.2.8: - resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} - - wait-on@7.2.0: - resolution: {integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==} - engines: {node: '>=12.0.0'} - hasBin: true - - walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - - warning@4.0.3: - resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} - - watchpack@2.4.2: - resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} - engines: {node: '>=10.13.0'} - - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - - webpack-virtual-modules@0.6.2: - resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - - webrtc-adapter@9.0.1: - resolution: {integrity: sha512-1AQO+d4ElfVSXyzNVTOewgGT/tAomwwztX/6e3totvyyzXPvXIIuUUjAmyZGbKBKbZOXauuJooZm3g6IuFuiNQ==} - engines: {node: '>=6.0.0', npm: '>=3.10.0'} - - websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} - - websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - - whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} - - whatwg-fetch@3.6.20: - resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} - - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.18: - resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} - - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} - hasBin: true - - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - - workbox-background-sync@7.3.0: - resolution: {integrity: sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==} - - workbox-broadcast-update@7.3.0: - resolution: {integrity: sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==} - - workbox-build@7.3.0: - resolution: {integrity: sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==} - engines: {node: '>=16.0.0'} - - workbox-cacheable-response@7.3.0: - resolution: {integrity: sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==} - - workbox-core@7.3.0: - resolution: {integrity: sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==} - - workbox-expiration@7.3.0: - resolution: {integrity: sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==} - - workbox-google-analytics@7.3.0: - resolution: {integrity: sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==} - - workbox-navigation-preload@7.3.0: - resolution: {integrity: sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==} - - workbox-precaching@7.3.0: - resolution: {integrity: sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==} - - workbox-range-requests@7.3.0: - resolution: {integrity: sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==} - - workbox-recipes@7.3.0: - resolution: {integrity: sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==} - - workbox-routing@7.3.0: - resolution: {integrity: sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==} - - workbox-strategies@7.3.0: - resolution: {integrity: sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==} - - workbox-streams@7.3.0: - resolution: {integrity: sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==} - - workbox-sw@7.3.0: - resolution: {integrity: sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==} - - workbox-window@7.3.0: - resolution: {integrity: sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==} - - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - write-file-atomic@2.4.3: - resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} - - write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - ws@5.2.4: - resolution: {integrity: sha512-fFCejsuC8f9kOSu9FYaOw8CdO68O3h5v0lg4p74o8JqWpwTf9tniOD+nOB78aWoVSS6WptVUmDrp/KPsMVBWFQ==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@6.2.3: - resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.1: - resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - xhr@2.6.0: - resolution: {integrity: sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==} - - xml-parse-from-string@1.0.1: - resolution: {integrity: sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==} - - xml2js@0.5.0: - resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} - engines: {node: '>=4.0.0'} - - xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - - xmlhttprequest-ssl@1.6.3: - resolution: {integrity: sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==} - engines: {node: '>=0.4.0'} - - xmlhttprequest-ssl@2.1.2: - resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} - engines: {node: '>=0.4.0'} - - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - - xxhash-wasm@0.4.2: - resolution: {integrity: sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - - yaml@2.7.0: - resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} - engines: {node: '>= 14'} - hasBin: true - - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - - yazl@2.5.1: - resolution: {integrity: sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==} - - yeast@0.1.2: - resolution: {integrity: sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==} - - yggdrasil@1.7.0: - resolution: {integrity: sha512-QBIo5fiNd7688G3FqXXYGr36uyrYzczlNuzpWFy2zL3+R+3KT2lF+wFxm51synfA3l3z6IBiGOc1/EVXWCYY1Q==} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - yocto-queue@1.2.0: - resolution: {integrity: sha512-KHBC7z61OJeaMGnF3wqNZj+GGNXOyypZviiKpQeiHirG5Ib1ImwcLBH70rbMSkKfSmUNBsdf2PwaEJtKvgmkNw==} - engines: {node: '>=12.20'} - - zod@3.24.2: - resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} - - zustand@3.6.5: - resolution: {integrity: sha512-/WfLJuXiEJimt61KGMHebrFBwckkCHGhAgVXTgPQHl6IMzjqm6MREb1OnDSnCRiSmRdhgdFCctceg6tSm79hiw==} - engines: {node: '>=12.7.0'} - peerDependencies: - react: ^18.2.0 - peerDependenciesMeta: - react: - optional: true - - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - -snapshots: - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@apideck/better-ajv-errors@0.3.6(ajv@8.17.1)': - dependencies: - ajv: 8.17.1 - json-schema: 0.4.0 - jsonpointer: 5.0.1 - leven: 3.1.0 - - '@aw-web-design/x-default-browser@1.4.126': - dependencies: - default-browser-id: 3.0.0 - - '@azure/msal-common@14.16.0': {} - - '@azure/msal-node@2.16.2': - dependencies: - '@azure/msal-common': 14.16.0 - jsonwebtoken: 9.0.2 - uuid: 8.3.2 - - '@babel/code-frame@7.26.2': - dependencies: - '@babel/helper-validator-identifier': 7.25.9 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.26.8': {} - - '@babel/core@7.26.9': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helpers': 7.26.9 - '@babel/parser': 7.26.9 - '@babel/template': 7.26.9 - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 - convert-source-map: 2.0.0 - debug: 4.4.0(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.26.9': - dependencies: - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.1.0 - - '@babel/helper-annotate-as-pure@7.25.9': - dependencies: - '@babel/types': 7.26.9 - - '@babel/helper-compilation-targets@7.26.5': - dependencies: - '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-create-class-features-plugin@7.26.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.9) - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.26.9 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-create-regexp-features-plugin@7.26.3(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-annotate-as-pure': 7.25.9 - regexpu-core: 6.2.0 - semver: 6.3.1 - - '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - debug: 4.4.1 - lodash.debounce: 4.0.8 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - - '@babel/helper-member-expression-to-functions@7.25.9': - dependencies: - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.25.9': - dependencies: - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.9 - transitivePeerDependencies: - - supports-color - - '@babel/helper-optimise-call-expression@7.25.9': - dependencies: - '@babel/types': 7.26.9 - - '@babel/helper-plugin-utils@7.26.5': {} - - '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.26.9 - transitivePeerDependencies: - - supports-color - - '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.26.9 - transitivePeerDependencies: - - supports-color - - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - dependencies: - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 - transitivePeerDependencies: - - supports-color - - '@babel/helper-string-parser@7.25.9': {} - - '@babel/helper-validator-identifier@7.25.9': {} - - '@babel/helper-validator-option@7.25.9': {} - - '@babel/helper-wrap-function@7.25.9': - dependencies: - '@babel/template': 7.26.9 - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 - transitivePeerDependencies: - - supports-color - - '@babel/helpers@7.26.9': - dependencies: - '@babel/template': 7.26.9 - '@babel/types': 7.26.9 - - '@babel/parser@7.26.9': - dependencies: - '@babel/types': 7.26.9 - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.9) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - - '@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.9) - '@babel/traverse': 7.26.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.9) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.9) - '@babel/traverse': 7.26.9 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/template': 7.26.9 - - '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-flow-strip-types@7.26.5(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.9) - - '@babel/plugin-transform-for-of@7.26.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.9) - - '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.9) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - regenerator-transform: 0.15.2 - - '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-template-literals@7.26.8(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-typeof-symbol@7.26.7(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-typescript@7.26.8(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.26.9(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.9) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.9) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/preset-env@7.26.9(@babel/core@7.26.9)': - dependencies: - '@babel/compat-data': 7.26.8 - '@babel/core': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.9) - '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.9) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.9) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.9) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.9) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.9) - '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.9) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.9) - '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-for-of': 7.26.9(@babel/core@7.26.9) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.9) - '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.9) - '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.9) - '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-template-literals': 7.26.8(@babel/core@7.26.9) - '@babel/plugin-transform-typeof-symbol': 7.26.7(@babel/core@7.26.9) - '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.9) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.9) - babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.9) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.9) - babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.9) - core-js-compat: 3.41.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/preset-flow@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-transform-flow-strip-types': 7.26.5(@babel/core@7.26.9) - - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/types': 7.26.9 - esutils: 2.0.3 - - '@babel/preset-typescript@7.26.0(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.9) - '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.9) - transitivePeerDependencies: - - supports-color - - '@babel/register@7.25.9(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - clone-deep: 4.0.1 - find-cache-dir: 2.1.0 - make-dir: 2.1.0 - pirates: 4.0.6 - source-map-support: 0.5.21 - - '@babel/runtime@7.26.9': - dependencies: - regenerator-runtime: 0.14.1 - - '@babel/template@7.26.9': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 - - '@babel/traverse@7.26.9': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.9 - '@babel/parser': 7.26.9 - '@babel/template': 7.26.9 - '@babel/types': 7.26.9 - debug: 4.4.1 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.26.9': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - - '@base2/pretty-print-object@1.0.1': {} - - '@colors/colors@1.5.0': - optional: true - - '@cypress/request@2.88.12': - dependencies: - aws-sign2: 0.7.0 - aws4: 1.13.2 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - http-signature: 1.3.6 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - performance-now: 2.1.0 - qs: 6.10.4 - safe-buffer: 5.2.1 - tough-cookie: 4.1.4 - tunnel-agent: 0.6.0 - uuid: 8.3.2 - optional: true - - '@cypress/xvfb@1.2.4(supports-color@8.1.1)': - dependencies: - debug: 3.2.7(supports-color@8.1.1) - lodash.once: 4.1.1 - transitivePeerDependencies: - - supports-color - optional: true - - '@dimaka/interface@0.0.3-alpha.0(@babel/core@7.26.9)(@popperjs/core@2.11.8)(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@emotion/css': 11.5.0(@babel/core@7.26.9) - '@juggle/resize-observer': 3.3.1 - animejs: 3.2.1 - clsx: 1.1.1 - react: 18.3.1 - react-popper: 2.3.0(@popperjs/core@2.11.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-portal: 4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-use: 17.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-use-measure: 2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - valtio: 1.11.2(@types/react@18.3.18)(react@18.3.1) - zustand: 3.6.5(react@18.3.1) - transitivePeerDependencies: - - '@babel/core' - - '@popperjs/core' - - '@types/react' - - react-dom - - supports-color - - '@discoveryjs/json-ext@0.5.7': {} - - '@emnapi/runtime@1.3.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@emotion/babel-plugin@11.13.5': - dependencies: - '@babel/helper-module-imports': 7.25.9 - '@babel/runtime': 7.26.9 - '@emotion/hash': 0.9.2 - '@emotion/memoize': 0.9.0 - '@emotion/serialize': 1.3.3 - babel-plugin-macros: 3.1.0 - convert-source-map: 1.9.0 - escape-string-regexp: 4.0.0 - find-root: 1.1.0 - source-map: 0.5.7 - stylis: 4.2.0 - transitivePeerDependencies: - - supports-color - - '@emotion/cache@11.14.0': - dependencies: - '@emotion/memoize': 0.9.0 - '@emotion/sheet': 1.4.0 - '@emotion/utils': 1.4.2 - '@emotion/weak-memoize': 0.4.0 - stylis: 4.2.0 - - '@emotion/css@11.5.0(@babel/core@7.26.9)': - dependencies: - '@emotion/babel-plugin': 11.13.5 - '@emotion/cache': 11.14.0 - '@emotion/serialize': 1.3.3 - '@emotion/sheet': 1.4.0 - '@emotion/utils': 1.4.2 - optionalDependencies: - '@babel/core': 7.26.9 - transitivePeerDependencies: - - supports-color - - '@emotion/hash@0.9.2': {} - - '@emotion/memoize@0.9.0': {} - - '@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - '@emotion/babel-plugin': 11.13.5 - '@emotion/cache': 11.14.0 - '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) - '@emotion/utils': 1.4.2 - '@emotion/weak-memoize': 0.4.0 - hoist-non-react-statics: 3.3.2 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - transitivePeerDependencies: - - supports-color - - '@emotion/serialize@1.3.3': - dependencies: - '@emotion/hash': 0.9.2 - '@emotion/memoize': 0.9.0 - '@emotion/unitless': 0.10.0 - '@emotion/utils': 1.4.2 - csstype: 3.1.3 - - '@emotion/sheet@1.4.0': {} - - '@emotion/unitless@0.10.0': {} - - '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@18.3.1)': - dependencies: - react: 18.3.1 - - '@emotion/utils@1.4.2': {} - - '@emotion/weak-memoize@0.4.0': {} - - '@esbuild/aix-ppc64@0.19.12': - optional: true - - '@esbuild/aix-ppc64@0.25.0': - optional: true - - '@esbuild/android-arm64@0.18.20': - optional: true - - '@esbuild/android-arm64@0.19.12': - optional: true - - '@esbuild/android-arm64@0.25.0': - optional: true - - '@esbuild/android-arm@0.18.20': - optional: true - - '@esbuild/android-arm@0.19.12': - optional: true - - '@esbuild/android-arm@0.25.0': - optional: true - - '@esbuild/android-x64@0.18.20': - optional: true - - '@esbuild/android-x64@0.19.12': - optional: true - - '@esbuild/android-x64@0.25.0': - optional: true - - '@esbuild/darwin-arm64@0.18.20': - optional: true - - '@esbuild/darwin-arm64@0.19.12': - optional: true - - '@esbuild/darwin-arm64@0.25.0': - optional: true - - '@esbuild/darwin-x64@0.18.20': - optional: true - - '@esbuild/darwin-x64@0.19.12': - optional: true - - '@esbuild/darwin-x64@0.25.0': - optional: true - - '@esbuild/freebsd-arm64@0.18.20': - optional: true - - '@esbuild/freebsd-arm64@0.19.12': - optional: true - - '@esbuild/freebsd-arm64@0.25.0': - optional: true - - '@esbuild/freebsd-x64@0.18.20': - optional: true - - '@esbuild/freebsd-x64@0.19.12': - optional: true - - '@esbuild/freebsd-x64@0.25.0': - optional: true - - '@esbuild/linux-arm64@0.18.20': - optional: true - - '@esbuild/linux-arm64@0.19.12': - optional: true - - '@esbuild/linux-arm64@0.25.0': - optional: true - - '@esbuild/linux-arm@0.18.20': - optional: true - - '@esbuild/linux-arm@0.19.12': - optional: true - - '@esbuild/linux-arm@0.25.0': - optional: true - - '@esbuild/linux-ia32@0.18.20': - optional: true - - '@esbuild/linux-ia32@0.19.12': - optional: true - - '@esbuild/linux-ia32@0.25.0': - optional: true - - '@esbuild/linux-loong64@0.18.20': - optional: true - - '@esbuild/linux-loong64@0.19.12': - optional: true - - '@esbuild/linux-loong64@0.25.0': - optional: true - - '@esbuild/linux-mips64el@0.18.20': - optional: true - - '@esbuild/linux-mips64el@0.19.12': - optional: true - - '@esbuild/linux-mips64el@0.25.0': - optional: true - - '@esbuild/linux-ppc64@0.18.20': - optional: true - - '@esbuild/linux-ppc64@0.19.12': - optional: true - - '@esbuild/linux-ppc64@0.25.0': - optional: true - - '@esbuild/linux-riscv64@0.18.20': - optional: true - - '@esbuild/linux-riscv64@0.19.12': - optional: true - - '@esbuild/linux-riscv64@0.25.0': - optional: true - - '@esbuild/linux-s390x@0.18.20': - optional: true - - '@esbuild/linux-s390x@0.19.12': - optional: true - - '@esbuild/linux-s390x@0.25.0': - optional: true - - '@esbuild/linux-x64@0.18.20': - optional: true - - '@esbuild/linux-x64@0.19.12': - optional: true - - '@esbuild/linux-x64@0.25.0': - optional: true - - '@esbuild/netbsd-arm64@0.25.0': - optional: true - - '@esbuild/netbsd-x64@0.18.20': - optional: true - - '@esbuild/netbsd-x64@0.19.12': - optional: true - - '@esbuild/netbsd-x64@0.25.0': - optional: true - - '@esbuild/openbsd-arm64@0.25.0': - optional: true - - '@esbuild/openbsd-x64@0.18.20': - optional: true - - '@esbuild/openbsd-x64@0.19.12': - optional: true - - '@esbuild/openbsd-x64@0.25.0': - optional: true - - '@esbuild/sunos-x64@0.18.20': - optional: true - - '@esbuild/sunos-x64@0.19.12': - optional: true - - '@esbuild/sunos-x64@0.25.0': - optional: true - - '@esbuild/win32-arm64@0.18.20': - optional: true - - '@esbuild/win32-arm64@0.19.12': - optional: true - - '@esbuild/win32-arm64@0.25.0': - optional: true - - '@esbuild/win32-ia32@0.18.20': - optional: true - - '@esbuild/win32-ia32@0.19.12': - optional: true - - '@esbuild/win32-ia32@0.25.0': - optional: true - - '@esbuild/win32-x64@0.18.20': - optional: true - - '@esbuild/win32-x64@0.19.12': - optional: true - - '@esbuild/win32-x64@0.25.0': - optional: true - - '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.12.1': {} - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.4.0(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.57.1': {} - - '@fal-works/esbuild-plugin-global-externals@2.1.2': {} - - '@fastify/busboy@2.1.1': {} - - '@floating-ui/core@1.6.9': - dependencies: - '@floating-ui/utils': 0.2.9 - - '@floating-ui/dom@1.6.13': - dependencies: - '@floating-ui/core': 1.6.9 - '@floating-ui/utils': 0.2.9 - - '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/dom': 1.6.13 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@floating-ui/react@0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@floating-ui/utils': 0.2.9 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - tabbable: 6.2.0 - - '@floating-ui/utils@0.2.9': {} - - '@gar/promisify@1.1.3': - optional: true - - '@hapi/hoek@9.3.0': {} - - '@hapi/topo@5.1.0': - dependencies: - '@hapi/hoek': 9.3.0 - - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.3': {} - - '@img/sharp-darwin-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.4 - optional: true - - '@img/sharp-darwin-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.4 - optional: true - - '@img/sharp-libvips-darwin-arm64@1.0.4': - optional: true - - '@img/sharp-libvips-darwin-x64@1.0.4': - optional: true - - '@img/sharp-libvips-linux-arm64@1.0.4': - optional: true - - '@img/sharp-libvips-linux-arm@1.0.5': - optional: true - - '@img/sharp-libvips-linux-s390x@1.0.4': - optional: true - - '@img/sharp-libvips-linux-x64@1.0.4': - optional: true - - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - optional: true - - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - optional: true - - '@img/sharp-linux-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.4 - optional: true - - '@img/sharp-linux-arm@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.5 - optional: true - - '@img/sharp-linux-s390x@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.4 - optional: true - - '@img/sharp-linux-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.4 - optional: true - - '@img/sharp-linuxmusl-arm64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - optional: true - - '@img/sharp-linuxmusl-x64@0.33.5': - optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - optional: true - - '@img/sharp-wasm32@0.33.5': - dependencies: - '@emnapi/runtime': 1.3.1 - optional: true - - '@img/sharp-win32-ia32@0.33.5': - optional: true - - '@img/sharp-win32-x64@0.33.5': - optional: true - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@istanbuljs/load-nyc-config@1.1.0': - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - - '@istanbuljs/schema@0.1.3': {} - - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - - '@jest/transform@29.7.0': - dependencies: - '@babel/core': 7.26.9 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.8 - pirates: 4.0.6 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - - '@jest/types@29.6.3': - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 22.13.9 - '@types/yargs': 17.0.33 - chalk: 4.1.2 - - '@jimp/bmp@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/utils': 0.10.3 - bmp-js: 0.1.0 - core-js: 3.41.0 - optional: true - - '@jimp/core@0.10.3(debug@4.4.0)': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/utils': 0.10.3 - any-base: 1.1.0 - buffer: 6.0.3 - core-js: 3.41.0 - exif-parser: 0.1.12 - file-type: 9.0.0 - load-bmfont: 1.4.2(debug@4.4.0) - mkdirp: 0.5.6 - phin: 2.9.3 - pixelmatch: 4.0.2 - tinycolor2: 1.6.0 - transitivePeerDependencies: - - debug - optional: true - - '@jimp/custom@0.10.3(debug@4.4.0)': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/core': 0.10.3(debug@4.4.0) - core-js: 3.41.0 - transitivePeerDependencies: - - debug - optional: true - - '@jimp/gif@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - omggif: 1.0.10 - optional: true - - '@jimp/jpeg@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - jpeg-js: 0.3.7 - optional: true - - '@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugin-blur@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugin-circle@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugin-color@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - tinycolor2: 1.6.0 - optional: true - - '@jimp/plugin-contain@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-scale@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/plugin-blit': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-scale': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugin-cover@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-scale@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/plugin-crop': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-scale': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugin-displace@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugin-dither@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugin-fisheye@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugin-flip@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-rotate@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/plugin-rotate': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugin-gaussian@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugin-invert@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugin-mask@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugin-normalize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugin-print@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(debug@4.4.0)': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/plugin-blit': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - load-bmfont: 1.4.2(debug@4.4.0) - transitivePeerDependencies: - - debug - optional: true - - '@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugin-rotate@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/plugin-blit': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-crop': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugin-scale@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugin-shadow@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-blur@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/plugin-blur': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugin-threshold@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-color@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/plugin-color': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - optional: true - - '@jimp/plugins@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(debug@4.4.0)': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/plugin-blit': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-blur': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-circle': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-color': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-contain': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-scale@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))) - '@jimp/plugin-cover': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-scale@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))) - '@jimp/plugin-crop': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-displace': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-dither': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-fisheye': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-flip': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-rotate@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))) - '@jimp/plugin-gaussian': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-invert': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-mask': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-normalize': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-print': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(debug@4.4.0) - '@jimp/plugin-resize': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/plugin-rotate': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-blit@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-crop@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))) - '@jimp/plugin-scale': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))) - '@jimp/plugin-shadow': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-blur@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))) - '@jimp/plugin-threshold': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(@jimp/plugin-color@0.10.3(@jimp/custom@0.10.3(debug@4.4.0)))(@jimp/plugin-resize@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))) - core-js: 3.41.0 - timm: 1.7.1 - transitivePeerDependencies: - - debug - optional: true - - '@jimp/png@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/utils': 0.10.3 - core-js: 3.41.0 - pngjs: 3.4.0 - optional: true - - '@jimp/tiff@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - core-js: 3.41.0 - utif: 2.0.1 - optional: true - - '@jimp/types@0.10.3(@jimp/custom@0.10.3(debug@4.4.0))': - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/bmp': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/gif': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/jpeg': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/png': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - '@jimp/tiff': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - core-js: 3.41.0 - timm: 1.7.1 - optional: true - - '@jimp/utils@0.10.3': - dependencies: - '@babel/runtime': 7.26.9 - core-js: 3.41.0 - regenerator-runtime: 0.13.11 - optional: true - - '@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@5.5.4)(vite@6.2.1(@types/node@22.13.9)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))': - dependencies: - glob: 7.2.3 - glob-promise: 4.2.2(glob@7.2.3) - magic-string: 0.27.0 - react-docgen-typescript: 2.2.2(typescript@5.5.4) - vite: 6.2.1(@types/node@22.13.9)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) - optionalDependencies: - typescript: 5.5.4 - - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/source-map@0.3.6': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/json-pack@1.2.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) - '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) - hyperdyperid: 1.2.0 - thingies: 1.21.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/util@1.5.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jspm/core@2.1.0': {} - - '@juggle/resize-observer@3.3.1': {} - - '@juggle/resize-observer@3.4.0': {} - - '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': - dependencies: - detect-libc: 2.0.3 - https-proxy-agent: 5.0.1 - make-dir: 3.1.0 - node-fetch: 2.7.0(encoding@0.1.13) - nopt: 5.0.0 - npmlog: 5.0.1 - rimraf: 3.0.2 - semver: 7.7.1 - tar: 6.2.1 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - '@mdx-js/react@2.3.0(react@18.3.1)': - dependencies: - '@types/mdx': 2.0.13 - '@types/react': 18.3.18 - react: 18.3.1 - - '@module-federation/error-codes@0.11.2': {} - - '@module-federation/runtime-core@0.11.2': - dependencies: - '@module-federation/error-codes': 0.11.2 - '@module-federation/sdk': 0.11.2 - - '@module-federation/runtime-tools@0.11.2': - dependencies: - '@module-federation/runtime': 0.11.2 - '@module-federation/webpack-bundler-runtime': 0.11.2 - - '@module-federation/runtime@0.11.2': - dependencies: - '@module-federation/error-codes': 0.11.2 - '@module-federation/runtime-core': 0.11.2 - '@module-federation/sdk': 0.11.2 - - '@module-federation/sdk@0.11.2': {} - - '@module-federation/webpack-bundler-runtime@0.11.2': - dependencies: - '@module-federation/runtime': 0.11.2 - '@module-federation/sdk': 0.11.2 - - '@monaco-editor/loader@1.5.0': - dependencies: - state-local: 1.0.7 - - '@monaco-editor/react@4.7.0(monaco-editor@0.52.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@monaco-editor/loader': 1.5.0 - monaco-editor: 0.52.2 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@msgpack/msgpack@2.8.0': {} - - '@ndelangen/get-tarball@3.0.9': - dependencies: - gunzip-maybe: 1.4.2 - pump: 3.0.2 - tar-fs: 2.1.2 - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 - - '@npmcli/fs@2.1.2': - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.7.1 - optional: true - - '@npmcli/move-file@2.0.1': - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - optional: true - - '@nxg-org/mineflayer-auto-jump@0.7.18': - dependencies: - '@nxg-org/mineflayer-physics-util': 1.8.10 - strict-event-emitter-types: 2.0.0 - - '@nxg-org/mineflayer-physics-util@1.8.10': - dependencies: - '@nxg-org/mineflayer-util-plugin': 1.8.4 - - '@nxg-org/mineflayer-tracker@1.3.0(encoding@0.1.13)': - dependencies: - '@nxg-org/mineflayer-physics-util': 1.8.10 - '@nxg-org/mineflayer-trajectories': 1.2.0(encoding@0.1.13) - '@nxg-org/mineflayer-util-plugin': 1.8.4 - transitivePeerDependencies: - - encoding - - supports-color - - '@nxg-org/mineflayer-trajectories@1.2.0(encoding@0.1.13)': - dependencies: - '@nxg-org/mineflayer-util-plugin': 1.8.4 - minecraft-data: 3.98.0 - mineflayer: https://codeload.github.com/zardoy/mineflayer/tar.gz/dd3b1ff38506d6f72d90e8444186e4e75fe82659(encoding@0.1.13) - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 - prismarine-item: 1.17.0 - prismarine-physics: https://codeload.github.com/zardoy/prismarine-physics/tar.gz/353e25b800149393f40539ec381218be44cbb03b - vec3: 0.1.10 - transitivePeerDependencies: - - encoding - - supports-color - - '@nxg-org/mineflayer-util-plugin@1.8.4': {} - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@popperjs/core@2.11.8': {} - - '@radix-ui/number@1.0.1': - dependencies: - '@babel/runtime': 7.26.9 - - '@radix-ui/primitive@1.0.1': - dependencies: - '@babel/runtime': 7.26.9 - - '@radix-ui/primitive@1.1.1': {} - - '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - - '@radix-ui/react-collection@1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - - '@radix-ui/react-collection@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - - '@radix-ui/react-compose-refs@1.0.1(@types/react@18.3.18)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-compose-refs@1.1.1(@types/react@18.3.18)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-context@1.0.1(@types/react@18.3.18)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-context@1.1.1(@types/react@18.3.18)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-direction@1.0.1(@types/react@18.3.18)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-direction@1.1.0(@types/react@18.3.18)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - - '@radix-ui/react-focus-guards@1.0.1(@types/react@18.3.18)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - - '@radix-ui/react-id@1.0.1(@types/react@18.3.18)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-id@1.1.0(@types/react@18.3.18)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-popper@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/rect': 1.0.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - - '@radix-ui/react-portal@1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - - '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - - '@radix-ui/react-primitive@2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-slot': 1.1.2(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - - '@radix-ui/react-roving-focus@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - - '@radix-ui/react-select@1.2.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - '@radix-ui/number': 1.0.1 - '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-context': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-direction': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.0.2(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - aria-hidden: 1.2.4 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.5.5(@types/react@18.3.18)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - - '@radix-ui/react-separator@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - - '@radix-ui/react-slot@1.0.2(@types/react@18.3.18)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-slot@1.1.2(@types/react@18.3.18)(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-toggle-group@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-toggle': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - - '@radix-ui/react-toggle@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - - '@radix-ui/react-toolbar@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-separator': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-toggle-group': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - - '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.3.18)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.18)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.3.18)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.18)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.3.18)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.3.18)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.18)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-use-previous@1.0.1(@types/react@18.3.18)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-use-rect@1.0.1(@types/react@18.3.18)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - '@radix-ui/rect': 1.0.1 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-use-size@1.0.1(@types/react@18.3.18)(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.3.18)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - '@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@babel/runtime': 7.26.9 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - '@types/react-dom': 18.3.5(@types/react@18.3.18) - - '@radix-ui/rect@1.0.1': - dependencies: - '@babel/runtime': 7.26.9 - - '@react-oauth/google@0.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@rollup/plugin-babel@5.3.1(@babel/core@7.26.9)(@types/babel__core@7.20.5)(rollup@2.79.2)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-imports': 7.25.9 - '@rollup/pluginutils': 3.1.0(rollup@2.79.2) - rollup: 2.79.2 - optionalDependencies: - '@types/babel__core': 7.20.5 - transitivePeerDependencies: - - supports-color - - '@rollup/plugin-node-resolve@15.3.1(rollup@2.79.2)': - dependencies: - '@rollup/pluginutils': 5.1.4(rollup@2.79.2) - '@types/resolve': 1.20.2 - deepmerge: 4.3.1 - is-module: 1.0.0 - resolve: 1.22.10 - optionalDependencies: - rollup: 2.79.2 - - '@rollup/plugin-replace@2.4.2(rollup@2.79.2)': - dependencies: - '@rollup/pluginutils': 3.1.0(rollup@2.79.2) - magic-string: 0.25.9 - rollup: 2.79.2 - - '@rollup/plugin-terser@0.4.4(rollup@2.79.2)': - dependencies: - serialize-javascript: 6.0.2 - smob: 1.5.0 - terser: 5.39.0 - optionalDependencies: - rollup: 2.79.2 - - '@rollup/pluginutils@3.1.0(rollup@2.79.2)': - dependencies: - '@types/estree': 0.0.39 - estree-walker: 1.0.1 - picomatch: 2.3.1 - rollup: 2.79.2 - - '@rollup/pluginutils@5.1.4(rollup@2.79.2)': - dependencies: - '@types/estree': 1.0.6 - estree-walker: 2.0.2 - picomatch: 4.0.2 - optionalDependencies: - rollup: 2.79.2 - - '@rollup/rollup-android-arm-eabi@4.34.9': - optional: true - - '@rollup/rollup-android-arm64@4.34.9': - optional: true - - '@rollup/rollup-darwin-arm64@4.34.9': - optional: true - - '@rollup/rollup-darwin-x64@4.34.9': - optional: true - - '@rollup/rollup-freebsd-arm64@4.34.9': - optional: true - - '@rollup/rollup-freebsd-x64@4.34.9': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.34.9': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.34.9': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.34.9': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.34.9': - optional: true - - '@rollup/rollup-linux-loongarch64-gnu@4.34.9': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.34.9': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.34.9': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.34.9': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.34.9': - optional: true - - '@rollup/rollup-linux-x64-musl@4.34.9': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.34.9': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.34.9': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.34.9': - optional: true - - '@rsbuild/core@1.3.5': - dependencies: - '@rspack/core': 1.3.3(@swc/helpers@0.5.15) - '@rspack/lite-tapable': 1.0.1 - '@swc/helpers': 0.5.15 - core-js: 3.41.0 - jiti: 2.4.2 - transitivePeerDependencies: - - '@rspack/tracing' - - '@rsbuild/plugin-node-polyfill@1.3.0(@rsbuild/core@1.3.5)': - dependencies: - assert: 2.1.0 - browserify-zlib: 0.2.0 - buffer: 6.0.3 - console-browserify: 1.2.0 - constants-browserify: 1.0.0 - crypto-browserify: 3.12.1 - domain-browser: 5.7.0 - events: 3.3.0 - https-browserify: 1.0.0 - os-browserify: 0.3.0 - path-browserify: 1.0.1 - process: 0.11.10 - punycode: 2.3.1 - querystring-es3: 0.2.1 - readable-stream: 4.7.0 - stream-browserify: 3.0.0 - stream-http: 3.2.0 - string_decoder: 1.3.0 - timers-browserify: 2.0.12 - tty-browserify: 0.0.1 - url: 0.11.4 - util: 0.12.5 - vm-browserify: 1.1.2 - optionalDependencies: - '@rsbuild/core': 1.3.5 - - '@rsbuild/plugin-react@1.2.0(@rsbuild/core@1.3.5)': - dependencies: - '@rsbuild/core': 1.3.5 - '@rspack/plugin-react-refresh': 1.2.0(react-refresh@0.17.0) - react-refresh: 0.17.0 - transitivePeerDependencies: - - webpack-hot-middleware - - '@rsbuild/plugin-type-check@1.2.1(@rsbuild/core@1.3.5)(@rspack/core@1.3.3(@swc/helpers@0.5.15))(typescript@5.5.4)': - dependencies: - deepmerge: 4.3.1 - json5: 2.2.3 - reduce-configs: 1.1.0 - ts-checker-rspack-plugin: 1.1.1(@rspack/core@1.3.3(@swc/helpers@0.5.15))(typescript@5.5.4) - optionalDependencies: - '@rsbuild/core': 1.3.5 - transitivePeerDependencies: - - '@rspack/core' - - typescript - - '@rsbuild/plugin-typed-css-modules@1.0.2(@rsbuild/core@1.3.5)': - optionalDependencies: - '@rsbuild/core': 1.3.5 - - '@rspack/binding-darwin-arm64@1.3.3': - optional: true - - '@rspack/binding-darwin-x64@1.3.3': - optional: true - - '@rspack/binding-linux-arm64-gnu@1.3.3': - optional: true - - '@rspack/binding-linux-arm64-musl@1.3.3': - optional: true - - '@rspack/binding-linux-x64-gnu@1.3.3': - optional: true - - '@rspack/binding-linux-x64-musl@1.3.3': - optional: true - - '@rspack/binding-win32-arm64-msvc@1.3.3': - optional: true - - '@rspack/binding-win32-ia32-msvc@1.3.3': - optional: true - - '@rspack/binding-win32-x64-msvc@1.3.3': - optional: true - - '@rspack/binding@1.3.3': - optionalDependencies: - '@rspack/binding-darwin-arm64': 1.3.3 - '@rspack/binding-darwin-x64': 1.3.3 - '@rspack/binding-linux-arm64-gnu': 1.3.3 - '@rspack/binding-linux-arm64-musl': 1.3.3 - '@rspack/binding-linux-x64-gnu': 1.3.3 - '@rspack/binding-linux-x64-musl': 1.3.3 - '@rspack/binding-win32-arm64-msvc': 1.3.3 - '@rspack/binding-win32-ia32-msvc': 1.3.3 - '@rspack/binding-win32-x64-msvc': 1.3.3 - - '@rspack/core@1.3.3(@swc/helpers@0.5.15)': - dependencies: - '@module-federation/runtime-tools': 0.11.2 - '@rspack/binding': 1.3.3 - '@rspack/lite-tapable': 1.0.1 - caniuse-lite: 1.0.30001713 - optionalDependencies: - '@swc/helpers': 0.5.15 - - '@rspack/lite-tapable@1.0.1': {} - - '@rspack/plugin-react-refresh@1.2.0(react-refresh@0.17.0)': - dependencies: - error-stack-parser: 2.1.4 - html-entities: 2.6.0 - react-refresh: 0.17.0 - - '@rushstack/eslint-patch@1.10.5': {} - - '@sideway/address@4.1.5': - dependencies: - '@hapi/hoek': 9.3.0 - - '@sideway/formula@3.0.1': {} - - '@sideway/pinpoint@2.0.0': {} - - '@sinclair/typebox@0.27.8': {} - - '@socket.io/component-emitter@3.1.2': {} - - '@storybook/addon-actions@7.6.20': - dependencies: - '@storybook/core-events': 7.6.20 - '@storybook/global': 5.0.0 - '@types/uuid': 9.0.8 - dequal: 2.0.3 - polished: 4.3.1 - uuid: 9.0.1 - - '@storybook/addon-backgrounds@7.6.20': - dependencies: - '@storybook/global': 5.0.0 - memoizerific: 1.11.3 - ts-dedent: 2.2.0 - - '@storybook/addon-controls@7.6.20(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@storybook/blocks': 7.6.20(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - lodash: 4.17.21 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - encoding - - react - - react-dom - - supports-color - - '@storybook/addon-docs@7.6.20(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@jest/transform': 29.7.0 - '@mdx-js/react': 2.3.0(react@18.3.1) - '@storybook/blocks': 7.6.20(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/client-logger': 7.6.20 - '@storybook/components': 7.6.20(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/csf-plugin': 7.6.20 - '@storybook/csf-tools': 7.6.20 - '@storybook/global': 5.0.0 - '@storybook/mdx2-csf': 1.1.0 - '@storybook/node-logger': 7.6.20 - '@storybook/postinstall': 7.6.20 - '@storybook/preview-api': 7.6.20 - '@storybook/react-dom-shim': 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/theming': 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/types': 7.6.20 - fs-extra: 11.3.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - remark-external-links: 8.0.0 - remark-slug: 6.1.0 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - encoding - - supports-color - - '@storybook/addon-essentials@7.6.20(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@storybook/addon-actions': 7.6.20 - '@storybook/addon-backgrounds': 7.6.20 - '@storybook/addon-controls': 7.6.20(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/addon-docs': 7.6.20(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/addon-highlight': 7.6.20 - '@storybook/addon-measure': 7.6.20 - '@storybook/addon-outline': 7.6.20 - '@storybook/addon-toolbars': 7.6.20 - '@storybook/addon-viewport': 7.6.20 - '@storybook/core-common': 7.6.20(encoding@0.1.13) - '@storybook/manager-api': 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/node-logger': 7.6.20 - '@storybook/preview-api': 7.6.20 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - encoding - - supports-color - - '@storybook/addon-highlight@7.6.20': - dependencies: - '@storybook/global': 5.0.0 - - '@storybook/addon-links@7.6.20(react@18.3.1)': - dependencies: - '@storybook/csf': 0.1.13 - '@storybook/global': 5.0.0 - ts-dedent: 2.2.0 - optionalDependencies: - react: 18.3.1 - - '@storybook/addon-measure@7.6.20': - dependencies: - '@storybook/global': 5.0.0 - tiny-invariant: 1.3.3 - - '@storybook/addon-outline@7.6.20': - dependencies: - '@storybook/global': 5.0.0 - ts-dedent: 2.2.0 - - '@storybook/addon-toolbars@7.6.20': {} - - '@storybook/addon-viewport@7.6.20': - dependencies: - memoizerific: 1.11.3 - - '@storybook/blocks@7.6.20(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@storybook/channels': 7.6.20 - '@storybook/client-logger': 7.6.20 - '@storybook/components': 7.6.20(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/core-events': 7.6.20 - '@storybook/csf': 0.1.13 - '@storybook/docs-tools': 7.6.20(encoding@0.1.13) - '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/preview-api': 7.6.20 - '@storybook/theming': 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/types': 7.6.20 - '@types/lodash': 4.17.16 - color-convert: 2.0.1 - dequal: 2.0.3 - lodash: 4.17.21 - markdown-to-jsx: 7.7.4(react@18.3.1) - memoizerific: 1.11.3 - polished: 4.3.1 - react: 18.3.1 - react-colorful: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react-dom: 18.3.1(react@18.3.1) - telejson: 7.2.0 - tocbot: 4.35.0 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - encoding - - supports-color - - '@storybook/builder-manager@7.6.20(encoding@0.1.13)': - dependencies: - '@fal-works/esbuild-plugin-global-externals': 2.1.2 - '@storybook/core-common': 7.6.20(encoding@0.1.13) - '@storybook/manager': 7.6.20 - '@storybook/node-logger': 7.6.20 - '@types/ejs': 3.1.5 - '@types/find-cache-dir': 3.2.1 - '@yarnpkg/esbuild-plugin-pnp': 3.0.0-rc.15(esbuild@0.18.20) - browser-assert: 1.2.1 - ejs: 3.1.10 - esbuild: 0.18.20 - esbuild-plugin-alias: 0.2.1 - express: 4.21.2 - find-cache-dir: 3.3.2 - fs-extra: 11.3.0 - process: 0.11.10 - util: 0.12.5 - transitivePeerDependencies: - - encoding - - supports-color - - '@storybook/builder-vite@7.6.20(encoding@0.1.13)(typescript@5.5.4)(vite@6.2.1(@types/node@22.13.9)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))': - dependencies: - '@storybook/channels': 7.6.20 - '@storybook/client-logger': 7.6.20 - '@storybook/core-common': 7.6.20(encoding@0.1.13) - '@storybook/csf-plugin': 7.6.20 - '@storybook/node-logger': 7.6.20 - '@storybook/preview': 7.6.20 - '@storybook/preview-api': 7.6.20 - '@storybook/types': 7.6.20 - '@types/find-cache-dir': 3.2.1 - browser-assert: 1.2.1 - es-module-lexer: 0.9.3 - express: 4.21.2 - find-cache-dir: 3.3.2 - fs-extra: 11.3.0 - magic-string: 0.30.17 - rollup: 3.29.5 - vite: 6.2.1(@types/node@22.13.9)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - encoding - - supports-color - - '@storybook/channels@7.6.20': - dependencies: - '@storybook/client-logger': 7.6.20 - '@storybook/core-events': 7.6.20 - '@storybook/global': 5.0.0 - qs: 6.14.0 - telejson: 7.2.0 - tiny-invariant: 1.3.3 - - '@storybook/cli@7.6.20(encoding@0.1.13)': - dependencies: - '@babel/core': 7.26.9 - '@babel/preset-env': 7.26.9(@babel/core@7.26.9) - '@babel/types': 7.26.9 - '@ndelangen/get-tarball': 3.0.9 - '@storybook/codemod': 7.6.20 - '@storybook/core-common': 7.6.20(encoding@0.1.13) - '@storybook/core-events': 7.6.20 - '@storybook/core-server': 7.6.20(encoding@0.1.13) - '@storybook/csf-tools': 7.6.20 - '@storybook/node-logger': 7.6.20 - '@storybook/telemetry': 7.6.20(encoding@0.1.13) - '@storybook/types': 7.6.20 - '@types/semver': 7.5.8 - '@yarnpkg/fslib': 2.10.3 - '@yarnpkg/libzip': 2.3.0 - chalk: 4.1.2 - commander: 6.2.1 - cross-spawn: 7.0.6 - detect-indent: 6.1.0 - envinfo: 7.14.0 - execa: 5.1.1 - express: 4.21.2 - find-up: 5.0.0 - fs-extra: 11.3.0 - get-npm-tarball-url: 2.1.0 - get-port: 5.1.1 - giget: 1.2.5 - globby: 11.1.0 - jscodeshift: 0.15.2(@babel/preset-env@7.26.9(@babel/core@7.26.9)) - leven: 3.1.0 - ora: 5.4.1 - prettier: 2.8.8 - prompts: 2.4.2 - puppeteer-core: 2.1.1 - read-pkg-up: 7.0.1 - semver: 7.7.1 - strip-json-comments: 3.1.1 - tempy: 1.0.1 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - - '@storybook/client-logger@7.6.20': - dependencies: - '@storybook/global': 5.0.0 - - '@storybook/codemod@7.6.20': - dependencies: - '@babel/core': 7.26.9 - '@babel/preset-env': 7.26.9(@babel/core@7.26.9) - '@babel/types': 7.26.9 - '@storybook/csf': 0.1.13 - '@storybook/csf-tools': 7.6.20 - '@storybook/node-logger': 7.6.20 - '@storybook/types': 7.6.20 - '@types/cross-spawn': 6.0.6 - cross-spawn: 7.0.6 - globby: 11.1.0 - jscodeshift: 0.15.2(@babel/preset-env@7.26.9(@babel/core@7.26.9)) - lodash: 4.17.21 - prettier: 2.8.8 - recast: 0.23.11 - transitivePeerDependencies: - - supports-color - - '@storybook/components@7.6.20(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-select': 1.2.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-toolbar': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/client-logger': 7.6.20 - '@storybook/csf': 0.1.13 - '@storybook/global': 5.0.0 - '@storybook/theming': 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/types': 7.6.20 - memoizerific: 1.11.3 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - use-resize-observer: 9.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - util-deprecate: 1.0.2 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - '@storybook/core-client@7.6.20': - dependencies: - '@storybook/client-logger': 7.6.20 - '@storybook/preview-api': 7.6.20 - - '@storybook/core-common@7.6.20(encoding@0.1.13)': - dependencies: - '@storybook/core-events': 7.6.20 - '@storybook/node-logger': 7.6.20 - '@storybook/types': 7.6.20 - '@types/find-cache-dir': 3.2.1 - '@types/node': 18.19.79 - '@types/node-fetch': 2.6.12 - '@types/pretty-hrtime': 1.0.3 - chalk: 4.1.2 - esbuild: 0.18.20 - esbuild-register: 3.6.0(esbuild@0.18.20) - file-system-cache: 2.3.0 - find-cache-dir: 3.3.2 - find-up: 5.0.0 - fs-extra: 11.3.0 - glob: 10.4.5 - handlebars: 4.7.8 - lazy-universal-dotenv: 4.0.0 - node-fetch: 2.7.0(encoding@0.1.13) - picomatch: 2.3.1 - pkg-dir: 5.0.0 - pretty-hrtime: 1.0.3 - resolve-from: 5.0.0 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - encoding - - supports-color - - '@storybook/core-events@7.6.20': - dependencies: - ts-dedent: 2.2.0 - - '@storybook/core-server@7.6.20(encoding@0.1.13)': - dependencies: - '@aw-web-design/x-default-browser': 1.4.126 - '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-manager': 7.6.20(encoding@0.1.13) - '@storybook/channels': 7.6.20 - '@storybook/core-common': 7.6.20(encoding@0.1.13) - '@storybook/core-events': 7.6.20 - '@storybook/csf': 0.1.13 - '@storybook/csf-tools': 7.6.20 - '@storybook/docs-mdx': 0.1.0 - '@storybook/global': 5.0.0 - '@storybook/manager': 7.6.20 - '@storybook/node-logger': 7.6.20 - '@storybook/preview-api': 7.6.20 - '@storybook/telemetry': 7.6.20(encoding@0.1.13) - '@storybook/types': 7.6.20 - '@types/detect-port': 1.3.5 - '@types/node': 18.19.79 - '@types/pretty-hrtime': 1.0.3 - '@types/semver': 7.5.8 - better-opn: 3.0.2 - chalk: 4.1.2 - cli-table3: 0.6.5 - compression: 1.8.0 - detect-port: 1.6.1 - express: 4.21.2 - fs-extra: 11.3.0 - globby: 11.1.0 - lodash: 4.17.21 - open: 8.4.2 - pretty-hrtime: 1.0.3 - prompts: 2.4.2 - read-pkg-up: 7.0.1 - semver: 7.7.1 - telejson: 7.2.0 - tiny-invariant: 1.3.3 - ts-dedent: 2.2.0 - util: 0.12.5 - util-deprecate: 1.0.2 - watchpack: 2.4.2 - ws: 8.18.1 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - - '@storybook/csf-plugin@7.6.20': - dependencies: - '@storybook/csf-tools': 7.6.20 - unplugin: 1.16.1 - transitivePeerDependencies: - - supports-color - - '@storybook/csf-tools@7.6.20': - dependencies: - '@babel/generator': 7.26.9 - '@babel/parser': 7.26.9 - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 - '@storybook/csf': 0.1.13 - '@storybook/types': 7.6.20 - fs-extra: 11.3.0 - recast: 0.23.11 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - supports-color - - '@storybook/csf@0.1.13': - dependencies: - type-fest: 2.19.0 - - '@storybook/docs-mdx@0.1.0': {} - - '@storybook/docs-tools@7.6.20(encoding@0.1.13)': - dependencies: - '@storybook/core-common': 7.6.20(encoding@0.1.13) - '@storybook/preview-api': 7.6.20 - '@storybook/types': 7.6.20 - '@types/doctrine': 0.0.3 - assert: 2.1.0 - doctrine: 3.0.0 - lodash: 4.17.21 - transitivePeerDependencies: - - encoding - - supports-color - - '@storybook/global@5.0.0': {} - - '@storybook/manager-api@7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@storybook/channels': 7.6.20 - '@storybook/client-logger': 7.6.20 - '@storybook/core-events': 7.6.20 - '@storybook/csf': 0.1.13 - '@storybook/global': 5.0.0 - '@storybook/router': 7.6.20 - '@storybook/theming': 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/types': 7.6.20 - dequal: 2.0.3 - lodash: 4.17.21 - memoizerific: 1.11.3 - store2: 2.14.4 - telejson: 7.2.0 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - react - - react-dom - - '@storybook/manager@7.6.20': {} - - '@storybook/mdx2-csf@1.1.0': {} - - '@storybook/node-logger@7.6.20': {} - - '@storybook/postinstall@7.6.20': {} - - '@storybook/preview-api@7.6.20': - dependencies: - '@storybook/channels': 7.6.20 - '@storybook/client-logger': 7.6.20 - '@storybook/core-events': 7.6.20 - '@storybook/csf': 0.1.13 - '@storybook/global': 5.0.0 - '@storybook/types': 7.6.20 - '@types/qs': 6.9.18 - dequal: 2.0.3 - lodash: 4.17.21 - memoizerific: 1.11.3 - qs: 6.14.0 - synchronous-promise: 2.0.17 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - - '@storybook/preview@7.6.20': {} - - '@storybook/react-dom-shim@7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@storybook/react-vite@7.6.20(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@2.79.2)(typescript@5.5.4)(vite@6.2.1(@types/node@22.13.9)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))': - dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@5.5.4)(vite@6.2.1(@types/node@22.13.9)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)) - '@rollup/pluginutils': 5.1.4(rollup@2.79.2) - '@storybook/builder-vite': 7.6.20(encoding@0.1.13)(typescript@5.5.4)(vite@6.2.1(@types/node@22.13.9)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)) - '@storybook/react': 7.6.20(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4) - '@vitejs/plugin-react': 3.1.0(vite@6.2.1(@types/node@22.13.9)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0)) - magic-string: 0.30.17 - react: 18.3.1 - react-docgen: 7.1.1 - react-dom: 18.3.1(react@18.3.1) - vite: 6.2.1(@types/node@22.13.9)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) - transitivePeerDependencies: - - '@preact/preset-vite' - - encoding - - rollup - - supports-color - - typescript - - vite-plugin-glimmerx - - '@storybook/react@7.6.20(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)': - dependencies: - '@storybook/client-logger': 7.6.20 - '@storybook/core-client': 7.6.20 - '@storybook/docs-tools': 7.6.20(encoding@0.1.13) - '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.6.20 - '@storybook/react-dom-shim': 7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/types': 7.6.20 - '@types/escodegen': 0.0.6 - '@types/estree': 0.0.51 - '@types/node': 18.19.79 - acorn: 7.4.1 - acorn-jsx: 5.3.2(acorn@7.4.1) - acorn-walk: 7.2.0 - escodegen: 2.1.0 - html-tags: 3.3.1 - lodash: 4.17.21 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-element-to-jsx-string: 15.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - ts-dedent: 2.2.0 - type-fest: 2.19.0 - util-deprecate: 1.0.2 - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - encoding - - supports-color - - '@storybook/router@7.6.20': - dependencies: - '@storybook/client-logger': 7.6.20 - memoizerific: 1.11.3 - qs: 6.14.0 - - '@storybook/telemetry@7.6.20(encoding@0.1.13)': - dependencies: - '@storybook/client-logger': 7.6.20 - '@storybook/core-common': 7.6.20(encoding@0.1.13) - '@storybook/csf-tools': 7.6.20 - chalk: 4.1.2 - detect-package-manager: 2.0.1 - fetch-retry: 5.0.6 - fs-extra: 11.3.0 - read-pkg-up: 7.0.1 - transitivePeerDependencies: - - encoding - - supports-color - - '@storybook/theming@7.6.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) - '@storybook/client-logger': 7.6.20 - '@storybook/global': 5.0.0 - memoizerific: 1.11.3 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@storybook/types@7.6.20': - dependencies: - '@storybook/channels': 7.6.20 - '@types/babel__core': 7.20.5 - '@types/express': 4.17.21 - file-system-cache: 2.3.0 - - '@stylistic/eslint-plugin@2.13.0(eslint@8.57.1)(typescript@5.5.4)': - dependencies: - '@typescript-eslint/utils': 8.26.0(eslint@8.57.1)(typescript@5.5.4) - eslint: 8.57.1 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 - estraverse: 5.3.0 - picomatch: 4.0.2 - transitivePeerDependencies: - - supports-color - - typescript - - '@surma/rollup-plugin-off-main-thread@2.2.3': - dependencies: - ejs: 3.1.10 - json5: 2.2.3 - magic-string: 0.25.9 - string.prototype.matchall: 4.0.12 - - '@swc/helpers@0.5.15': - dependencies: - tslib: 2.8.1 - - '@tootallnate/once@2.0.0': {} - - '@tweenjs/tween.js@18.6.4': {} - - '@tweenjs/tween.js@20.0.3': {} - - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 - '@types/babel__generator': 7.6.8 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 - - '@types/babel__generator@7.6.8': - dependencies: - '@babel/types': 7.26.9 - - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 - - '@types/babel__traverse@7.20.6': - dependencies: - '@babel/types': 7.26.9 - - '@types/body-parser@1.19.5': - dependencies: - '@types/connect': 3.4.38 - '@types/node': 22.13.9 - - '@types/chai-subset@1.3.6(@types/chai@4.3.20)': - dependencies: - '@types/chai': 4.3.20 - - '@types/chai@4.3.20': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.13.9 - - '@types/cors@2.8.17': - dependencies: - '@types/node': 22.13.9 - - '@types/cross-spawn@6.0.6': - dependencies: - '@types/node': 22.13.9 - - '@types/debug@4.1.12': - dependencies: - '@types/ms': 2.1.0 - - '@types/detect-port@1.3.5': {} - - '@types/diff-match-patch@1.0.36': {} - - '@types/doctrine@0.0.3': {} - - '@types/doctrine@0.0.9': {} - - '@types/draco3d@1.4.10': {} - - '@types/ejs@3.1.5': {} - - '@types/emscripten@1.40.0': {} - - '@types/escodegen@0.0.6': {} - - '@types/estree@0.0.39': {} - - '@types/estree@0.0.51': {} - - '@types/estree@1.0.6': {} - - '@types/express-serve-static-core@4.19.6': - dependencies: - '@types/node': 22.13.9 - '@types/qs': 6.9.18 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 - - '@types/express@4.17.21': - dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.6 - '@types/qs': 6.9.18 - '@types/serve-static': 1.15.7 - - '@types/find-cache-dir@3.2.1': {} - - '@types/gapi@0.0.47': {} - - '@types/glob@7.2.0': - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 22.13.9 - - '@types/graceful-fs@4.1.9': - dependencies: - '@types/node': 22.13.9 - - '@types/http-cache-semantics@4.0.4': {} - - '@types/http-errors@2.0.4': {} - - '@types/istanbul-lib-coverage@2.0.6': {} - - '@types/istanbul-lib-report@3.0.3': - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - - '@types/istanbul-reports@3.0.4': - dependencies: - '@types/istanbul-lib-report': 3.0.3 - - '@types/js-cookie@2.2.7': {} - - '@types/json-schema@7.0.15': {} - - '@types/json5@0.0.29': {} - - '@types/linkify-it@5.0.0': {} - - '@types/lodash-es@4.17.12': - dependencies: - '@types/lodash': 4.17.16 - - '@types/lodash@4.17.16': {} - - '@types/markdown-it@14.1.2': - dependencies: - '@types/linkify-it': 5.0.0 - '@types/mdurl': 2.0.0 - - '@types/mdast@4.0.4': - dependencies: - '@types/unist': 3.0.3 - - '@types/mdurl@2.0.0': {} - - '@types/mdx@2.0.13': {} - - '@types/mime-types@2.1.4': {} - - '@types/mime@1.3.5': {} - - '@types/minimatch@5.1.2': {} - - '@types/minimist@1.2.5': {} - - '@types/ms@2.1.0': {} - - '@types/node-fetch@2.6.12': - dependencies: - '@types/node': 22.13.9 - form-data: 4.0.2 - - '@types/node-rsa@1.1.4': - dependencies: - '@types/node': 22.13.9 - - '@types/node@14.18.63': - optional: true - - '@types/node@18.19.79': - dependencies: - undici-types: 5.26.5 - - '@types/node@22.13.9': - dependencies: - undici-types: 6.20.0 - - '@types/normalize-package-data@2.4.4': {} - - '@types/offscreencanvas@2019.7.3': {} - - '@types/parse-json@4.0.2': {} - - '@types/pretty-hrtime@1.0.3': {} - - '@types/prop-types@15.7.14': {} - - '@types/qs@6.9.18': {} - - '@types/range-parser@1.2.7': {} - - '@types/rbush@3.0.4': {} - - '@types/react-dom@18.3.5(@types/react@18.3.18)': - dependencies: - '@types/react': 18.3.18 - - '@types/react-transition-group@4.4.12(@types/react@18.3.18)': - dependencies: - '@types/react': 18.3.18 - - '@types/react@18.3.18': - dependencies: - '@types/prop-types': 15.7.14 - csstype: 3.1.3 - - '@types/readable-stream@4.0.18': - dependencies: - '@types/node': 22.13.9 - safe-buffer: 5.1.2 - - '@types/resolve@1.20.2': {} - - '@types/resolve@1.20.6': {} - - '@types/sat@0.0.31': {} - - '@types/semver@7.5.8': {} - - '@types/send@0.17.4': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 22.13.9 - - '@types/serve-static@1.15.7': - dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 22.13.9 - '@types/send': 0.17.4 - - '@types/sinonjs__fake-timers@8.1.1': - optional: true - - '@types/sizzle@2.3.9': - optional: true - - '@types/stats.js@0.17.3': {} - - '@types/three@0.154.0': - dependencies: - '@tweenjs/tween.js': 18.6.4 - '@types/stats.js': 0.17.3 - '@types/webxr': 0.5.21 - fflate: 0.6.10 - lil-gui: 0.17.0 - meshoptimizer: 0.18.1 - - '@types/three@0.156.0': - dependencies: - '@types/stats.js': 0.17.3 - '@types/webxr': 0.5.21 - fflate: 0.6.10 - meshoptimizer: 0.18.1 - - '@types/trusted-types@2.0.7': {} - - '@types/ua-parser-js@0.7.39': {} - - '@types/unist@2.0.11': {} - - '@types/unist@3.0.3': {} - - '@types/uuid@9.0.8': {} - - '@types/wait-on@5.3.4': - dependencies: - '@types/node': 22.13.9 - - '@types/webxr@0.5.21': {} - - '@types/wicg-file-system-access@2023.10.5': {} - - '@types/yargs-parser@21.0.3': {} - - '@types/yargs@17.0.33': - dependencies: - '@types/yargs-parser': 21.0.3 - - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 22.13.9 - - '@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 6.1.0 - '@typescript-eslint/type-utils': 6.1.0(eslint@8.57.1)(typescript@5.5.4) - '@typescript-eslint/utils': 6.1.0(eslint@8.57.1)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 6.1.0 - debug: 4.4.0(supports-color@8.1.1) - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - natural-compare-lite: 1.4.0 - semver: 7.7.1 - ts-api-utils: 1.4.3(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.5.4)': - dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.0(supports-color@8.1.1) - eslint: 8.57.1 - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@6.1.0': - dependencies: - '@typescript-eslint/types': 6.1.0 - '@typescript-eslint/visitor-keys': 6.1.0 - - '@typescript-eslint/scope-manager@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - - '@typescript-eslint/scope-manager@8.26.0': - dependencies: - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/visitor-keys': 8.26.0 - - '@typescript-eslint/type-utils@6.1.0(eslint@8.57.1)(typescript@5.5.4)': - dependencies: - '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.5.4) - '@typescript-eslint/utils': 6.1.0(eslint@8.57.1)(typescript@5.5.4) - debug: 4.4.1 - eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@6.1.0': {} - - '@typescript-eslint/types@6.21.0': {} - - '@typescript-eslint/types@8.26.0': {} - - '@typescript-eslint/typescript-estree@6.1.0(typescript@5.5.4)': - dependencies: - '@typescript-eslint/types': 6.1.0 - '@typescript-eslint/visitor-keys': 6.1.0 - debug: 4.4.1 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.7.1 - ts-api-utils: 1.4.3(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.4)': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.1 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.7.1 - ts-api-utils: 1.4.3(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.26.0(typescript@5.5.4)': - dependencies: - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/visitor-keys': 8.26.0 - debug: 4.4.1 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 2.0.1(typescript@5.5.4) - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@6.1.0(eslint@8.57.1)(typescript@5.5.4)': - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 6.1.0 - '@typescript-eslint/types': 6.1.0 - '@typescript-eslint/typescript-estree': 6.1.0(typescript@5.5.4) - eslint: 8.57.1 - semver: 7.7.1 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@8.26.0(eslint@8.57.1)(typescript@5.5.4)': - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.26.0 - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.5.4) - eslint: 8.57.1 - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@6.1.0': - dependencies: - '@typescript-eslint/types': 6.1.0 - eslint-visitor-keys: 3.4.3 - - '@typescript-eslint/visitor-keys@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 - - '@typescript-eslint/visitor-keys@8.26.0': - dependencies: - '@typescript-eslint/types': 8.26.0 - eslint-visitor-keys: 4.2.0 - - '@ungap/structured-clone@1.3.0': {} - - '@vitejs/plugin-react@3.1.0(vite@6.2.1(@types/node@22.13.9)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0))': - dependencies: - '@babel/core': 7.26.9 - '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.9) - magic-string: 0.27.0 - react-refresh: 0.14.2 - vite: 6.2.1(@types/node@22.13.9)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0) - transitivePeerDependencies: - - supports-color - - '@vitest/expect@0.34.6': - dependencies: - '@vitest/spy': 0.34.6 - '@vitest/utils': 0.34.6 - chai: 4.5.0 - - '@vitest/runner@0.34.6': - dependencies: - '@vitest/utils': 0.34.6 - p-limit: 4.0.0 - pathe: 1.1.2 - - '@vitest/snapshot@0.34.6': - dependencies: - magic-string: 0.30.17 - pathe: 1.1.2 - pretty-format: 29.7.0 - - '@vitest/spy@0.34.6': - dependencies: - tinyspy: 2.2.1 - - '@vitest/utils@0.34.6': - dependencies: - diff-sequences: 29.6.3 - loupe: 2.3.7 - pretty-format: 29.7.0 - - '@xboxreplay/errors@0.1.0': {} - - '@xboxreplay/xboxlive-auth@3.3.3(debug@4.4.0)': - dependencies: - '@xboxreplay/errors': 0.1.0 - axios: 0.21.4(debug@4.4.0) - transitivePeerDependencies: - - debug - - '@xmcl/asm@1.0.1': {} - - '@xmcl/core@2.13.0(yauzl@2.10.0)': - dependencies: - '@xmcl/unzip': 2.1.2(yauzl@2.10.0) - transitivePeerDependencies: - - yauzl - - '@xmcl/file-transfer@1.0.6': - dependencies: - '@types/http-cache-semantics': 4.0.4 - http-cache-semantics: 4.1.1 - undici: 6.0.1 - - '@xmcl/forge-site-parser@2.0.9': - dependencies: - node-html-parser: 6.1.13 - - '@xmcl/installer@5.4.0': - dependencies: - '@xmcl/asm': 1.0.1 - '@xmcl/core': 2.13.0(yauzl@2.10.0) - '@xmcl/file-transfer': 1.0.6 - '@xmcl/forge-site-parser': 2.0.9 - '@xmcl/task': 4.1.0 - '@xmcl/unzip': 2.1.2(yauzl@2.10.0) - undici: 6.0.1 - yauzl: 2.10.0 - yazl: 2.5.1 - - '@xmcl/task@4.1.0': {} - - '@xmcl/text-component@2.1.3': {} - - '@xmcl/unzip@2.1.2(yauzl@2.10.0)': - dependencies: - '@types/yauzl': 2.10.3 - yauzl: 2.10.0 - - '@xobotyi/scrollbar-width@1.9.5': {} - - '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.18.20)': - dependencies: - esbuild: 0.18.20 - tslib: 2.8.1 - - '@yarnpkg/fslib@2.10.3': - dependencies: - '@yarnpkg/libzip': 2.3.0 - tslib: 1.14.1 - - '@yarnpkg/libzip@2.3.0': - dependencies: - '@types/emscripten': 1.40.0 - tslib: 1.14.1 - - '@zardoy/flying-squid@0.0.104(encoding@0.1.13)': - dependencies: - '@tootallnate/once': 2.0.0 - chalk: 5.4.1 - change-case: 4.1.2 - diamond-square: https://codeload.github.com/zardoy/diamond-square/tar.gz/cfaad2d1d5909fdfa63c8cc7bc05fb5e87782d71 - emit-then: 2.0.0 - exit-hook: 2.2.1 - flatmap: 0.0.3 - long: 5.3.1 - mc-bridge: 0.1.3(minecraft-data@3.98.0) - minecraft-data: 3.98.0 - minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/bf89f7e86526c54d8c43f555d8f6dfa4948fd2d9(patch_hash=4ebdae314c68d01ce7879445c0b8bde5f90373abba8b66ed00d42e7a5f542f8b)(encoding@0.1.13) - mkdirp: 2.1.6 - node-gzip: 1.1.2 - node-rsa: 1.1.1 - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/c5feac83b61d95feb4d4f22c063dacfb8c192a9f(minecraft-data@3.98.0) - prismarine-entity: 2.5.0 - prismarine-item: 1.17.0 - prismarine-nbt: 2.7.0 - prismarine-provider-anvil: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/1d548fac63fe977c8281f0a9a522b37e4d92d0b7(minecraft-data@3.98.0) - prismarine-windows: 2.9.0 - prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/ab2146c9933eef3247c3f64446de4ccc2c484c7c - rambda: 9.4.2 - random-seed: 0.3.0 - range: 0.0.3 - readline: 1.3.0 - sanitize-filename: 1.6.3 - typed-emitter: 1.4.0 - uuid-1345: 1.0.2 - vec3: 0.1.10 - yaml: 2.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - encoding - - supports-color - - '@zardoy/flying-squid@0.0.49(encoding@0.1.13)': - dependencies: - '@tootallnate/once': 2.0.0 - chalk: 5.4.1 - change-case: 4.1.2 - diamond-square: https://codeload.github.com/zardoy/diamond-square/tar.gz/cfaad2d1d5909fdfa63c8cc7bc05fb5e87782d71 - emit-then: 2.0.0 - exit-hook: 2.2.1 - flatmap: 0.0.3 - long: 5.3.1 - minecraft-data: 3.98.0 - minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/bf89f7e86526c54d8c43f555d8f6dfa4948fd2d9(patch_hash=4ebdae314c68d01ce7879445c0b8bde5f90373abba8b66ed00d42e7a5f542f8b)(encoding@0.1.13) - mkdirp: 2.1.6 - node-gzip: 1.1.2 - node-rsa: 1.1.1 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/c5feac83b61d95feb4d4f22c063dacfb8c192a9f(minecraft-data@3.98.0) - prismarine-entity: 2.5.0 - prismarine-item: 1.17.0 - prismarine-nbt: 2.7.0 - prismarine-provider-anvil: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/1d548fac63fe977c8281f0a9a522b37e4d92d0b7(minecraft-data@3.98.0) - prismarine-windows: 2.9.0 - prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/ab2146c9933eef3247c3f64446de4ccc2c484c7c - rambda: 9.4.2 - random-seed: 0.3.0 - range: 0.0.3 - readline: 1.3.0 - sanitize-filename: 1.6.3 - typed-emitter: 1.4.0 - uuid-1345: 1.0.2 - vec3: 0.1.10 - yaml: 2.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - encoding - - supports-color - - '@zardoy/maxrects-packer@2.7.4': {} - - '@zardoy/react-util@0.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - classnames: 2.5.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-hook-form: 7.54.2(react@18.3.1) - - '@zardoy/utils@0.0.11': - dependencies: - escape-string-regexp: 4.0.0 - lodash.compact: 3.0.1 - rambda: 6.9.0 - type-fest: 2.19.0 - - Base64@0.2.1: {} - - abbrev@1.1.1: - optional: true - - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - acorn-jsx@5.3.2(acorn@7.4.1): - dependencies: - acorn: 7.4.1 - - acorn-jsx@5.3.2(acorn@8.14.1): - dependencies: - acorn: 8.14.1 - - acorn-walk@7.2.0: {} - - acorn-walk@8.3.4: - dependencies: - acorn: 8.14.1 - - acorn@7.4.1: {} - - acorn@8.14.1: {} - - address@1.2.2: {} - - adm-zip@0.5.16: {} - - aes-js@3.1.2: {} - - after@0.8.2: - optional: true - - agent-base@5.1.1: {} - - agent-base@6.0.2: - dependencies: - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - optional: true - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - optional: true - - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - animejs@3.2.1: {} - - ansi-colors@4.1.3: - optional: true - - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - optional: true - - ansi-regex@5.0.1: {} - - ansi-regex@6.1.0: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@5.2.0: {} - - ansi-styles@6.2.1: {} - - any-base@1.1.0: - optional: true - - any-promise@1.3.0: {} - - anymatch@2.0.0: - dependencies: - micromatch: 3.1.10 - normalize-path: 2.1.1 - transitivePeerDependencies: - - supports-color - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - apache-crypt@1.2.6: - dependencies: - unix-crypt-td-js: 1.1.4 - - apache-md5@1.1.8: {} - - app-root-dir@1.0.2: {} - - aproba@2.0.0: - optional: true - - arch@2.2.0: - optional: true - - are-we-there-yet@2.0.0: - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - optional: true - - are-we-there-yet@3.0.1: - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - optional: true - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - - aria-hidden@1.2.4: - dependencies: - tslib: 2.8.1 - - arr-diff@4.0.0: {} - - arr-flatten@1.1.0: {} - - arr-union@3.1.0: {} - - array-buffer-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 - - array-flatten@1.1.1: {} - - array-includes@3.1.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - - array-includes@3.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - math-intrinsics: 1.1.0 - - array-union@2.1.0: {} - - array-unique@0.3.2: {} - - array.prototype.findlast@1.2.5: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - - array.prototype.flat@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-shim-unscopables: 1.1.0 - - array.prototype.flatmap@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-shim-unscopables: 1.1.0 - - array.prototype.tosorted@1.1.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-shim-unscopables: 1.1.0 - - arraybuffer.prototype.slice@1.0.4: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 - - arraybuffer.slice@0.0.7: - optional: true - - arrify@1.0.1: {} - - asn1.js@4.10.1: - dependencies: - bn.js: 4.12.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - - asn1@0.2.3: {} - - asn1@0.2.6: - dependencies: - safer-buffer: 2.1.2 - - assert-plus@1.0.0: - optional: true - - assert@2.1.0: - dependencies: - call-bind: 1.0.8 - is-nan: 1.3.2 - object-is: 1.1.6 - object.assign: 4.1.7 - util: 0.12.5 - - assertion-error@1.1.0: {} - - assign-symbols@1.0.0: {} - - ast-types@0.16.1: - dependencies: - tslib: 2.8.1 - - astral-regex@2.0.0: - optional: true - - async-each@1.0.6: {} - - async-function@1.0.0: {} - - async-limiter@1.0.1: {} - - async@2.6.4: - dependencies: - lodash: 4.17.21 - - async@3.2.6: {} - - asynckit@0.4.0: {} - - at-least-node@1.0.0: {} - - atob@2.1.2: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.1.0 - - aws-sign2@0.7.0: - optional: true - - aws4@1.13.2: - optional: true - - axios@0.21.4(debug@4.4.0): - dependencies: - follow-redirects: 1.15.9(debug@4.4.0) - transitivePeerDependencies: - - debug - - axios@1.8.2(debug@4.4.0): - dependencies: - follow-redirects: 1.15.9(debug@4.4.0) - form-data: 4.0.2 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - babel-core@7.0.0-bridge.0(@babel/core@7.26.9): - dependencies: - '@babel/core': 7.26.9 - - babel-plugin-istanbul@6.1.1: - dependencies: - '@babel/helper-plugin-utils': 7.26.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-macros@3.1.0: - dependencies: - '@babel/runtime': 7.26.9 - cosmiconfig: 7.1.0 - resolve: 1.22.10 - - babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.9): - dependencies: - '@babel/compat-data': 7.26.8 - '@babel/core': 7.26.9 - '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.9) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.9): - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.9) - core-js-compat: 3.41.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.9): - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.9) - transitivePeerDependencies: - - supports-color - - backo2@1.0.2: - optional: true - - bail@2.0.2: {} - - balanced-match@1.0.2: {} - - base64-arraybuffer@0.1.4: - optional: true - - base64-js@1.5.1: {} - - base64id@2.0.0: {} - - base@0.11.2: - dependencies: - cache-base: 1.0.1 - class-utils: 0.3.6 - component-emitter: 1.3.1 - define-property: 1.0.0 - isobject: 3.0.1 - mixin-deep: 1.3.2 - pascalcase: 0.1.1 - - basic-auth@2.0.1: - dependencies: - safe-buffer: 5.1.2 - - batch@0.6.1: {} - - bcrypt-pbkdf@1.0.2: - dependencies: - tweetnacl: 0.14.5 - optional: true - - bcryptjs@2.4.3: {} - - better-opn@3.0.2: - dependencies: - open: 8.4.2 - - big-integer@1.6.52: {} - - binary-extensions@1.13.1: {} - - binary-extensions@2.3.0: {} - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - optional: true - - bit-twiddle@1.0.2: - optional: true - - bl@4.1.0: - dependencies: - buffer: 6.0.3 - inherits: 2.0.4 - readable-stream: 3.6.2 - - blob-util@2.0.2: - optional: true - - blob@0.0.5: - optional: true - - bluebird@3.7.2: - optional: true - - bmp-js@0.1.0: - optional: true - - bn.js@4.12.1: {} - - bn.js@5.2.1: {} - - body-parser@1.20.3: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.13.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - boolbase@1.0.0: {} - - bplist-parser@0.2.0: - dependencies: - big-integer: 1.6.52 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@2.3.2: - dependencies: - arr-flatten: 1.1.0 - array-unique: 0.3.2 - extend-shallow: 2.0.1 - fill-range: 4.0.0 - isobject: 3.0.1 - repeat-element: 1.1.4 - snapdragon: 0.8.2 - snapdragon-node: 2.1.1 - split-string: 3.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - brorand@1.1.0: {} - - browser-assert@1.2.1: {} - - browserfs@https://codeload.github.com/zardoy/browserfs/tar.gz/ab58ae8ef00e3a31db01909e365e6cb5188436e0: {} - - browserfs@https://codeload.github.com/zardoy/browserfs/tar.gz/e60ca69e74888e057a96a468afe1d62347d3f56f: - dependencies: - async: 2.6.4 - - browserify-aes@1.2.0: - dependencies: - buffer-xor: 1.0.3 - cipher-base: 1.0.6 - create-hash: 1.2.0 - evp_bytestokey: 1.0.3 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - browserify-cipher@1.0.1: - dependencies: - browserify-aes: 1.2.0 - browserify-des: 1.0.2 - evp_bytestokey: 1.0.3 - - browserify-des@1.0.2: - dependencies: - cipher-base: 1.0.6 - des.js: 1.1.0 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - browserify-rsa@4.1.1: - dependencies: - bn.js: 5.2.1 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - - browserify-sign@4.2.3: - dependencies: - bn.js: 5.2.1 - browserify-rsa: 4.1.1 - create-hash: 1.2.0 - create-hmac: 1.1.7 - elliptic: 6.6.1 - hash-base: 3.0.5 - inherits: 2.0.4 - parse-asn1: 5.1.7 - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - - browserify-zlib@0.1.4: - dependencies: - pako: 0.2.9 - - browserify-zlib@0.2.0: - dependencies: - pako: 1.0.11 - - browserslist@4.24.4: - dependencies: - caniuse-lite: 1.0.30001713 - electron-to-chromium: 1.5.113 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.4) - - bser@2.1.1: - dependencies: - node-int64: 0.4.0 - - buffer-crc32@0.2.13: {} - - buffer-equal-constant-time@1.0.1: {} - - buffer-equal@0.0.1: - optional: true - - buffer-equal@1.0.1: {} - - buffer-from@1.1.2: {} - - buffer-xor@1.0.3: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - builtin-modules@3.3.0: {} - - builtin-status-codes@3.0.0: {} - - bytes@3.1.2: {} - - cac@6.7.14: {} - - cacache@16.1.3: - dependencies: - '@npmcli/fs': 2.1.2 - '@npmcli/move-file': 2.0.1 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 8.1.0 - infer-owner: 1.0.4 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 9.0.1 - tar: 6.2.1 - unique-filename: 2.0.1 - transitivePeerDependencies: - - bluebird - optional: true - - cache-base@1.0.1: - dependencies: - collection-visit: 1.0.0 - component-emitter: 1.3.1 - get-value: 2.0.6 - has-value: 1.0.0 - isobject: 3.0.1 - set-value: 2.0.1 - to-object-path: 0.3.0 - union-value: 1.0.1 - unset-value: 1.0.0 - - cachedir@2.4.0: - optional: true - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - callsites@3.1.0: {} - - camel-case@4.1.2: - dependencies: - pascal-case: 3.1.2 - tslib: 2.8.1 - - camelcase-keys@7.0.2: - dependencies: - camelcase: 6.3.0 - map-obj: 4.3.0 - quick-lru: 5.1.1 - type-fest: 1.4.0 - - camelcase@5.3.1: {} - - camelcase@6.3.0: {} - - caniuse-lite@1.0.30001713: {} - - canvas@2.11.2(encoding@0.1.13): - dependencies: - '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) - nan: 2.22.2 - simple-get: 3.1.1 - transitivePeerDependencies: - - encoding - - supports-color - optional: true - - capital-case@1.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.8.1 - upper-case-first: 2.0.2 - - caseless@0.12.0: - optional: true - - centra@2.7.0(debug@4.4.0): - dependencies: - follow-redirects: 1.15.9(debug@4.4.0) - transitivePeerDependencies: - - debug - optional: true - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - change-case@4.1.2: - dependencies: - camel-case: 4.1.2 - capital-case: 1.0.4 - constant-case: 3.0.4 - dot-case: 3.0.4 - header-case: 2.0.4 - no-case: 3.0.4 - param-case: 3.0.4 - pascal-case: 3.1.2 - path-case: 3.0.4 - sentence-case: 3.0.4 - snake-case: 3.0.4 - tslib: 2.8.1 - - change-case@5.4.4: {} - - character-entities@2.0.2: {} - - charenc@0.0.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - check-more-types@2.24.0: - optional: true - - chokidar@2.1.8: - dependencies: - anymatch: 2.0.0 - async-each: 1.0.6 - braces: 2.3.2 - glob-parent: 3.1.0 - inherits: 2.0.4 - is-binary-path: 1.0.1 - is-glob: 4.0.3 - normalize-path: 3.0.0 - path-is-absolute: 1.0.1 - readdirp: 2.2.1 - upath: 1.2.0 - optionalDependencies: - fsevents: 1.2.13 - transitivePeerDependencies: - - supports-color - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - chownr@1.1.4: {} - - chownr@2.0.0: {} - - ci-info@3.9.0: {} - - cipher-base@1.0.6: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - - citty@0.1.6: - dependencies: - consola: 3.4.0 - - class-utils@0.3.6: - dependencies: - arr-union: 3.1.0 - define-property: 0.2.5 - isobject: 3.0.1 - static-extend: 0.1.2 - - classnames@2.5.1: {} - - clean-regexp@1.0.0: - dependencies: - escape-string-regexp: 1.0.5 - - clean-stack@2.2.0: {} - - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - - cli-spinners@2.9.2: {} - - cli-table3@0.6.5: - dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 - - cli-truncate@2.1.0: - dependencies: - slice-ansi: 3.0.0 - string-width: 4.2.3 - optional: true - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - clone-deep@4.0.1: - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - - clone@1.0.4: {} - - clsx@1.1.1: {} - - collection-visit@1.0.0: - dependencies: - map-visit: 1.0.0 - object-visit: 1.0.1 - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.3: {} - - color-name@1.1.4: {} - - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - - color-support@1.1.3: - optional: true - - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - - colorette@2.0.20: - optional: true - - colors@1.4.0: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - commander@2.20.3: {} - - commander@5.1.0: - optional: true - - commander@6.2.1: {} - - common-tags@1.8.2: {} - - commondir@1.0.1: {} - - component-bind@1.0.0: - optional: true - - component-emitter@1.2.1: - optional: true - - component-emitter@1.3.1: {} - - component-inherit@0.0.3: - optional: true - - compressible@2.0.18: - dependencies: - mime-db: 1.54.0 - - compression@1.8.0: - dependencies: - bytes: 3.1.2 - compressible: 2.0.18 - debug: 2.6.9 - negotiator: 0.6.4 - on-headers: 1.0.2 - safe-buffer: 5.2.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - concat-map@0.0.1: {} - - concat-stream@1.6.2: - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - typedarray: 0.0.6 - - confbox@0.1.8: {} - - confusing-browser-globals@1.0.11: {} - - connect@3.7.0: - dependencies: - debug: 2.6.9 - finalhandler: 1.1.2 - parseurl: 1.3.3 - utils-merge: 1.0.1 - transitivePeerDependencies: - - supports-color - - consola@3.4.0: {} - - console-browserify@1.2.0: {} - - console-control-strings@1.1.0: - optional: true - - constant-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.8.1 - upper-case: 2.0.2 - - constants-browserify@1.0.0: {} - - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - - contro-max@0.1.9(typescript@5.5.4): - dependencies: - events: 3.3.0 - lodash-es: 4.17.21 - typed-emitter: 2.1.0 - optionalDependencies: - react: 18.3.1 - use-typed-event-listener: 4.0.2(react@18.3.1)(typescript@5.5.4) - transitivePeerDependencies: - - typescript - - convert-source-map@1.9.0: {} - - convert-source-map@2.0.0: {} - - cookie-signature@1.0.6: {} - - cookie@0.4.2: - optional: true - - cookie@0.7.1: {} - - cookie@0.7.2: {} - - copy-descriptor@0.1.1: {} - - copy-to-clipboard@3.3.3: - dependencies: - toggle-selection: 1.0.6 - - core-js-compat@3.41.0: - dependencies: - browserslist: 4.24.4 - - core-js@3.41.0: {} - - core-util-is@1.0.2: - optional: true - - core-util-is@1.0.3: {} - - cors@2.8.5: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - - corser@2.0.1: {} - - cosmiconfig@7.1.0: - dependencies: - '@types/parse-json': 4.0.2 - import-fresh: 3.3.1 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - - create-ecdh@4.0.4: - dependencies: - bn.js: 4.12.1 - elliptic: 6.6.1 - - create-hash@1.2.0: - dependencies: - cipher-base: 1.0.6 - inherits: 2.0.4 - md5.js: 1.3.5 - ripemd160: 2.0.2 - sha.js: 2.4.11 - - create-hmac@1.1.7: - dependencies: - cipher-base: 1.0.6 - create-hash: 1.2.0 - inherits: 2.0.4 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 - - crelt@1.0.6: {} - - cross-spawn@6.0.6: - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - crypt@0.0.2: {} - - crypto-browserify@3.12.1: - dependencies: - browserify-cipher: 1.0.1 - browserify-sign: 4.2.3 - create-ecdh: 4.0.4 - create-hash: 1.2.0 - create-hmac: 1.1.7 - diffie-hellman: 5.0.3 - hash-base: 3.0.5 - inherits: 2.0.4 - pbkdf2: 3.1.2 - public-encrypt: 4.0.3 - randombytes: 2.1.0 - randomfill: 1.0.4 - - crypto-random-string@2.0.0: {} - - css-in-js-utils@3.1.0: - dependencies: - hyphenate-style-name: 1.1.0 - - css-select@5.1.0: - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 5.0.3 - domutils: 3.2.2 - nth-check: 2.1.1 - - css-tree@1.1.3: - dependencies: - mdn-data: 2.0.14 - source-map: 0.6.1 - - css-what@6.1.0: {} - - csstype@3.1.3: {} - - cypress-esbuild-preprocessor@1.0.2: {} - - cypress-plugin-snapshots@1.4.4(cypress@10.11.0)(debug@4.4.0): - dependencies: - cypress: 10.11.0 - diff2html: 2.12.2 - fs-extra: 7.0.1 - image-size: 0.7.5 - jimp: 0.10.3(debug@4.4.0) - js-base64: 2.6.4 - lodash: 4.17.21 - pixelmatch: 4.0.2 - pngjs: 3.4.0 - prettier: 1.19.1 - rimraf: 2.7.1 - sanitize-filename: 1.6.3 - socket.io: 2.5.1 - socket.io-client: 2.5.0 - source-map-support: 0.5.21 - unidiff: 1.0.2 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - optional: true - - cypress@10.11.0: - dependencies: - '@cypress/request': 2.88.12 - '@cypress/xvfb': 1.2.4(supports-color@8.1.1) - '@types/node': 14.18.63 - '@types/sinonjs__fake-timers': 8.1.1 - '@types/sizzle': 2.3.9 - arch: 2.2.0 - blob-util: 2.0.2 - bluebird: 3.7.2 - buffer: 6.0.3 - cachedir: 2.4.0 - chalk: 4.1.2 - check-more-types: 2.24.0 - cli-cursor: 3.1.0 - cli-table3: 0.6.5 - commander: 5.1.0 - common-tags: 1.8.2 - dayjs: 1.11.13 - debug: 4.4.0(supports-color@8.1.1) - enquirer: 2.4.1 - eventemitter2: 6.4.7 - execa: 4.1.0 - executable: 4.1.1 - extract-zip: 2.0.1(supports-color@8.1.1) - figures: 3.2.0 - fs-extra: 9.1.0 - getos: 3.2.1 - is-ci: 3.0.1 - is-installed-globally: 0.4.0 - lazy-ass: 1.6.0 - listr2: 3.14.0(enquirer@2.4.1) - lodash: 4.17.21 - log-symbols: 4.1.0 - minimist: 1.2.8 - ospath: 1.2.2 - pretty-bytes: 5.6.0 - proxy-from-env: 1.0.0 - request-progress: 3.0.0 - semver: 7.7.1 - supports-color: 8.1.1 - tmp: 0.2.3 - untildify: 4.0.0 - yauzl: 2.10.0 - optional: true - - dashdash@1.14.1: - dependencies: - assert-plus: 1.0.0 - optional: true - - data-view-buffer@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-offset@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - dayjs@1.11.13: - optional: true - - debounce@1.2.1: {} - - debug@2.6.9: - dependencies: - ms: 2.0.0 - - debug@3.1.0: - dependencies: - ms: 2.0.0 - optional: true - - debug@3.2.7(supports-color@8.1.1): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 8.1.1 - - debug@4.1.1: - dependencies: - ms: 2.1.3 - optional: true - - debug@4.3.7: - dependencies: - ms: 2.1.3 - - debug@4.4.0(supports-color@8.1.1): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 8.1.1 - - debug@4.4.1: - dependencies: - ms: 2.1.3 - - decamelize-keys@1.1.1: - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - - decamelize@1.2.0: {} - - decamelize@5.0.1: {} - - decode-named-character-reference@1.1.0: - dependencies: - character-entities: 2.0.2 - - decode-uri-component@0.2.2: {} - - decompress-response@4.2.1: - dependencies: - mimic-response: 2.1.0 - optional: true - - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - deep-extend@0.6.0: {} - - deep-is@0.1.4: {} - - deepmerge@4.3.1: {} - - deepslate@0.23.5: - dependencies: - gl-matrix: 3.4.3 - md5: 2.3.0 - pako: 2.1.0 - - default-browser-id@3.0.0: - dependencies: - bplist-parser: 0.2.0 - untildify: 4.0.0 - - defaults@1.0.4: - dependencies: - clone: 1.0.4 - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - - define-lazy-prop@2.0.0: {} - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - define-property@0.2.5: - dependencies: - is-descriptor: 0.1.7 - - define-property@1.0.0: - dependencies: - is-descriptor: 1.0.3 - - define-property@2.0.2: - dependencies: - is-descriptor: 1.0.3 - isobject: 3.0.1 - - defu@6.1.4: {} - - del@6.1.1: - dependencies: - globby: 11.1.0 - graceful-fs: 4.2.11 - is-glob: 4.0.3 - is-path-cwd: 2.2.0 - is-path-inside: 3.0.3 - p-map: 4.0.0 - rimraf: 3.0.2 - slash: 3.0.0 - - delayed-stream@1.0.0: {} - - delegates@1.0.0: - optional: true - - depd@1.1.2: {} - - depd@2.0.0: {} - - dequal@2.0.3: {} - - derive-valtio@0.1.0(valtio@1.13.2(@types/react@18.3.18)(react@18.3.1)): - dependencies: - valtio: 1.13.2(@types/react@18.3.18)(react@18.3.1) - - des.js@1.1.0: - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - - destroy@1.2.0: {} - - detect-collisions@7.0.5: - dependencies: - '@types/rbush': 3.0.4 - '@types/sat': 0.0.31 - poly-decomp: 0.3.0 - rbush: 3.0.1 - sat: 0.9.0 - - detect-indent@6.1.0: {} - - detect-libc@2.0.3: {} - - detect-node-es@1.1.0: {} - - detect-package-manager@2.0.1: - dependencies: - execa: 5.1.1 - - detect-port@1.6.1: - dependencies: - address: 1.2.2 - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - - devlop@1.1.0: - dependencies: - dequal: 2.0.3 - - diamond-square@https://codeload.github.com/zardoy/diamond-square/tar.gz/cfaad2d1d5909fdfa63c8cc7bc05fb5e87782d71: - dependencies: - minecraft-data: 3.98.0 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/c5feac83b61d95feb4d4f22c063dacfb8c192a9f(minecraft-data@3.98.0) - prismarine-registry: 1.11.0 - random-seed: 0.3.0 - vec3: 0.1.10 - - diff-match-patch@1.0.5: {} - - diff-sequences@29.6.3: {} - - diff2html@2.12.2: - dependencies: - diff: 4.0.2 - hogan.js: 3.0.2 - merge: 1.2.1 - whatwg-fetch: 3.6.20 - optional: true - - diff@2.2.3: - optional: true - - diff@4.0.2: - optional: true - - diffie-hellman@5.0.3: - dependencies: - bn.js: 4.12.1 - miller-rabin: 4.0.1 - randombytes: 2.1.0 - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - discontinuous-range@1.0.0: {} - - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - dom-helpers@5.2.1: - dependencies: - '@babel/runtime': 7.26.9 - csstype: 3.1.3 - - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - - dom-walk@0.1.2: - optional: true - - domain-browser@5.7.0: {} - - domelementtype@2.3.0: {} - - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 - - domutils@3.2.2: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - - dot-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.8.1 - - dotenv-expand@10.0.0: {} - - dotenv@16.4.7: {} - - draco3d@1.5.7: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - duplexer@0.1.2: {} - - duplexify@3.7.1: - dependencies: - end-of-stream: 1.4.4 - inherits: 2.0.4 - readable-stream: 2.3.8 - stream-shift: 1.0.3 - - eastasianwidth@0.2.0: {} - - ecc-jsbn@0.1.2: - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - optional: true - - ecdsa-sig-formatter@1.0.11: - dependencies: - safe-buffer: 5.2.1 - - ee-first@1.1.1: {} - - ejs@3.1.10: - dependencies: - jake: 10.9.2 - - electron-to-chromium@1.5.113: {} - - elliptic@6.6.1: - dependencies: - bn.js: 4.12.1 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - - emit-then@2.0.0: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - encodeurl@1.0.2: {} - - encodeurl@2.0.0: {} - - encoding@0.1.13: - dependencies: - iconv-lite: 0.6.3 - optional: true - - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - - endian-toggle@0.0.0: {} - - engine.io-client@3.5.4: - dependencies: - component-emitter: 1.3.1 - component-inherit: 0.0.3 - debug: 3.1.0 - engine.io-parser: 2.2.1 - has-cors: 1.1.0 - indexof: 0.0.1 - parseqs: 0.0.6 - parseuri: 0.0.6 - ws: 7.5.10 - xmlhttprequest-ssl: 1.6.3 - yeast: 0.1.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - optional: true - - engine.io-client@6.6.3: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.7 - engine.io-parser: 5.2.3 - ws: 8.17.1 - xmlhttprequest-ssl: 2.1.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - engine.io-parser@2.2.1: - dependencies: - after: 0.8.2 - arraybuffer.slice: 0.0.7 - base64-arraybuffer: 0.1.4 - blob: 0.0.5 - has-binary2: 1.0.3 - optional: true - - engine.io-parser@5.2.3: {} - - engine.io@3.6.2: - dependencies: - accepts: 1.3.8 - base64id: 2.0.0 - cookie: 0.4.2 - debug: 4.1.1 - engine.io-parser: 2.2.1 - ws: 7.5.10 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - optional: true - - engine.io@6.6.4: - dependencies: - '@types/cors': 2.8.17 - '@types/node': 22.13.9 - accepts: 1.3.8 - base64id: 2.0.0 - cookie: 0.7.2 - cors: 2.8.5 - debug: 4.3.7 - engine.io-parser: 5.2.3 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - enquirer@2.4.1: - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - optional: true - - entities@4.5.0: {} - - env-paths@2.2.1: - optional: true - - envinfo@7.14.0: {} - - err-code@2.0.3: - optional: true - - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - - error-stack-parser@2.1.4: - dependencies: - stackframe: 1.3.4 - - eruda@3.4.1: {} - - es-abstract@1.23.9: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-regex: 1.2.1 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.18 - - es-abstract@1.24.0: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-iterator-helpers@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-set-tostringtag: 2.1.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - iterator.prototype: 1.1.5 - safe-array-concat: 1.1.3 - - es-module-lexer@0.9.3: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.1.0: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - esbuild-plugin-alias@0.2.1: {} - - esbuild-plugin-polyfill-node@0.3.0(esbuild@0.19.12): - dependencies: - '@jspm/core': 2.1.0 - esbuild: 0.19.12 - import-meta-resolve: 3.1.1 - - esbuild-register@3.6.0(esbuild@0.18.20): - dependencies: - debug: 4.4.0(supports-color@8.1.1) - esbuild: 0.18.20 - transitivePeerDependencies: - - supports-color - - esbuild@0.18.20: - optionalDependencies: - '@esbuild/android-arm': 0.18.20 - '@esbuild/android-arm64': 0.18.20 - '@esbuild/android-x64': 0.18.20 - '@esbuild/darwin-arm64': 0.18.20 - '@esbuild/darwin-x64': 0.18.20 - '@esbuild/freebsd-arm64': 0.18.20 - '@esbuild/freebsd-x64': 0.18.20 - '@esbuild/linux-arm': 0.18.20 - '@esbuild/linux-arm64': 0.18.20 - '@esbuild/linux-ia32': 0.18.20 - '@esbuild/linux-loong64': 0.18.20 - '@esbuild/linux-mips64el': 0.18.20 - '@esbuild/linux-ppc64': 0.18.20 - '@esbuild/linux-riscv64': 0.18.20 - '@esbuild/linux-s390x': 0.18.20 - '@esbuild/linux-x64': 0.18.20 - '@esbuild/netbsd-x64': 0.18.20 - '@esbuild/openbsd-x64': 0.18.20 - '@esbuild/sunos-x64': 0.18.20 - '@esbuild/win32-arm64': 0.18.20 - '@esbuild/win32-ia32': 0.18.20 - '@esbuild/win32-x64': 0.18.20 - - esbuild@0.19.12: - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - - esbuild@0.25.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.0 - '@esbuild/android-arm': 0.25.0 - '@esbuild/android-arm64': 0.25.0 - '@esbuild/android-x64': 0.25.0 - '@esbuild/darwin-arm64': 0.25.0 - '@esbuild/darwin-x64': 0.25.0 - '@esbuild/freebsd-arm64': 0.25.0 - '@esbuild/freebsd-x64': 0.25.0 - '@esbuild/linux-arm': 0.25.0 - '@esbuild/linux-arm64': 0.25.0 - '@esbuild/linux-ia32': 0.25.0 - '@esbuild/linux-loong64': 0.25.0 - '@esbuild/linux-mips64el': 0.25.0 - '@esbuild/linux-ppc64': 0.25.0 - '@esbuild/linux-riscv64': 0.25.0 - '@esbuild/linux-s390x': 0.25.0 - '@esbuild/linux-x64': 0.25.0 - '@esbuild/netbsd-arm64': 0.25.0 - '@esbuild/netbsd-x64': 0.25.0 - '@esbuild/openbsd-arm64': 0.25.0 - '@esbuild/openbsd-x64': 0.25.0 - '@esbuild/sunos-x64': 0.25.0 - '@esbuild/win32-arm64': 0.25.0 - '@esbuild/win32-ia32': 0.25.0 - '@esbuild/win32-x64': 0.25.0 - - escalade@3.2.0: {} - - escape-html@1.0.3: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@4.0.0: {} - - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - - eslint-config-prettier@8.10.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-config-xo-react@0.27.0(eslint-plugin-react-hooks@5.2.0(eslint@8.57.1))(eslint-plugin-react@7.37.4(eslint@8.57.1))(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - eslint-plugin-react: 7.37.4(eslint@8.57.1) - eslint-plugin-react-hooks: 5.2.0(eslint@8.57.1) - - eslint-config-xo-typescript@1.0.1(@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4))(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4): - dependencies: - '@typescript-eslint/eslint-plugin': 6.1.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.5.4) - eslint: 8.57.1 - typescript: 5.5.4 - - eslint-config-xo@0.43.1(eslint@8.57.1): - dependencies: - confusing-browser-globals: 1.0.11 - eslint: 8.57.1 - - eslint-config-zardoy@0.2.17(eslint-plugin-react-hooks@5.2.0(eslint@8.57.1))(eslint-plugin-react@7.37.4(eslint@8.57.1))(eslint@8.57.1)(typescript@5.5.4): - dependencies: - '@rushstack/eslint-patch': 1.10.5 - '@typescript-eslint/eslint-plugin': 6.1.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.5.4) - eslint: 8.57.1 - eslint-config-prettier: 8.10.0(eslint@8.57.1) - eslint-config-xo: 0.43.1(eslint@8.57.1) - eslint-config-xo-react: 0.27.0(eslint-plugin-react-hooks@5.2.0(eslint@8.57.1))(eslint-plugin-react@7.37.4(eslint@8.57.1))(eslint@8.57.1) - eslint-config-xo-typescript: 1.0.1(@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4))(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1)(typescript@5.5.4) - eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.1) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1) - eslint-plugin-node: 11.1.0(eslint@8.57.1) - eslint-plugin-sonarjs: 0.19.0(eslint@8.57.1) - eslint-plugin-unicorn: 48.0.0(eslint@8.57.1) - typescript: 5.5.4 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - eslint-plugin-react - - eslint-plugin-react-hooks - - supports-color - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7(supports-color@8.1.1) - is-core-module: 2.16.1 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): - dependencies: - debug: 3.2.7(supports-color@8.1.1) - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.5.4) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-plugin-es@3.0.1(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - eslint-utils: 2.1.0 - regexpp: 3.2.0 - - eslint-plugin-eslint-comments@3.2.0(eslint@8.57.1): - dependencies: - escape-string-regexp: 1.0.5 - eslint: 8.57.1 - ignore: 5.3.2 - - eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.5.4))(eslint@8.57.1): - dependencies: - array-includes: 3.1.8 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7(supports-color@8.1.1) - doctrine: 2.1.0 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) - has: 1.0.4 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.values: 1.2.1 - resolve: 1.22.10 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.5.4) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-node@11.1.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - eslint-plugin-es: 3.0.1(eslint@8.57.1) - eslint-utils: 2.1.0 - ignore: 5.3.2 - minimatch: 3.1.2 - resolve: 1.22.10 - semver: 6.3.1 - - eslint-plugin-react-hooks@5.2.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-react@7.37.4(eslint@8.57.1): - dependencies: - array-includes: 3.1.9 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.3 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.2.1 - eslint: 8.57.1 - estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.9 - object.fromentries: 2.0.8 - object.values: 1.2.1 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.12 - string.prototype.repeat: 1.0.0 - - eslint-plugin-sonarjs@0.19.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-unicorn@48.0.0(eslint@8.57.1): - dependencies: - '@babel/helper-validator-identifier': 7.25.9 - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - ci-info: 3.9.0 - clean-regexp: 1.0.0 - eslint: 8.57.1 - esquery: 1.6.0 - indent-string: 4.0.0 - is-builtin-module: 3.2.1 - jsesc: 3.1.0 - lodash: 4.17.21 - pluralize: 8.0.0 - read-pkg-up: 7.0.1 - regexp-tree: 0.1.27 - regjsparser: 0.10.0 - semver: 7.7.1 - strip-indent: 3.0.0 - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-utils@2.1.0: - dependencies: - eslint-visitor-keys: 1.3.0 - - eslint-visitor-keys@1.3.0: {} - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@4.2.0: {} - - eslint@8.57.1: - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.0(supports-color@8.1.1) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - espree@10.3.0: - dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 4.2.0 - - espree@9.6.1: - dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 3.4.3 - - esprima@4.0.1: {} - - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - - estree-walker@1.0.1: {} - - estree-walker@2.0.2: {} - - esutils@2.0.3: {} - - etag@1.8.1: {} - - event-stream@3.3.4: - dependencies: - duplexer: 0.1.2 - from: 0.1.7 - map-stream: 0.1.0 - pause-stream: 0.0.11 - split: 0.3.3 - stream-combiner: 0.0.4 - through: 2.3.8 - - event-target-shim@5.0.1: {} - - eventemitter2@6.4.7: - optional: true - - eventemitter3@4.0.7: {} - - events@3.3.0: {} - - evp_bytestokey@1.0.3: - dependencies: - md5.js: 1.3.5 - safe-buffer: 5.2.1 - - execa@4.1.0: - dependencies: - cross-spawn: 7.0.6 - get-stream: 5.2.0 - human-signals: 1.1.1 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - optional: true - - execa@5.1.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - executable@4.1.1: - dependencies: - pify: 2.3.0 - optional: true - - exif-parser@0.1.12: - optional: true - - exit-hook@2.2.1: {} - - expand-brackets@2.1.4: - dependencies: - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - posix-character-classes: 0.1.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - expand-template@2.0.3: {} - - exponential-backoff@3.1.2: - optional: true - - express-ws@4.0.0(express@4.21.2): - dependencies: - express: 4.21.2 - ws: 5.2.4 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - express@4.21.2: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.3 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.1 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.1 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.12 - proxy-addr: 2.0.7 - qs: 6.13.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.0 - serve-static: 1.16.2 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - extend-shallow@2.0.1: - dependencies: - is-extendable: 0.1.1 - - extend-shallow@3.0.2: - dependencies: - assign-symbols: 1.0.0 - is-extendable: 1.0.1 - - extend@3.0.2: {} - - extglob@2.0.4: - dependencies: - array-unique: 0.3.2 - define-property: 1.0.0 - expand-brackets: 2.1.4 - extend-shallow: 2.0.1 - fragment-cache: 0.2.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - extract-zip@1.7.0: - dependencies: - concat-stream: 1.6.2 - debug: 2.6.9 - mkdirp: 0.5.6 - yauzl: 2.10.0 - transitivePeerDependencies: - - supports-color - - extract-zip@2.0.1(supports-color@8.1.1): - dependencies: - debug: 4.4.0(supports-color@8.1.1) - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - - extsprintf@1.3.0: - optional: true - - fast-deep-equal@3.1.3: {} - - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fast-shallow-equal@1.0.0: {} - - fast-uri@3.0.6: {} - - fastest-stable-stringify@2.0.2: {} - - fastq@1.19.1: - dependencies: - reusify: 1.1.0 - - faye-websocket@0.11.4: - dependencies: - websocket-driver: 0.7.4 - - fb-watchman@2.0.2: - dependencies: - bser: 2.1.1 - - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - - fetch-retry@5.0.6: {} - - fflate@0.6.10: {} - - figures@3.2.0: - dependencies: - escape-string-regexp: 1.0.5 - optional: true - - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - - file-system-cache@2.3.0: - dependencies: - fs-extra: 11.1.1 - ramda: 0.29.0 - - file-type@9.0.0: - optional: true - - file-uri-to-path@1.0.0: - optional: true - - filelist@1.0.4: - dependencies: - minimatch: 5.1.6 - - filesize@10.1.6: {} - - fill-range@4.0.0: - dependencies: - extend-shallow: 2.0.1 - is-number: 3.0.0 - repeat-string: 1.6.1 - to-regex-range: 2.1.1 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - finalhandler@1.1.2: - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.3.0 - parseurl: 1.3.3 - statuses: 1.5.0 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - finalhandler@1.3.1: - dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - find-cache-dir@2.1.0: - dependencies: - commondir: 1.0.1 - make-dir: 2.1.0 - pkg-dir: 3.0.0 - - find-cache-dir@3.3.2: - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 - - find-root@1.1.0: {} - - find-up@3.0.0: - dependencies: - locate-path: 3.0.0 - - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@3.2.0: - dependencies: - flatted: 3.3.3 - keyv: 4.5.4 - rimraf: 3.0.2 - - flatmap@0.0.3: {} - - flatted@3.3.3: {} - - flow-parser@0.263.0: {} - - follow-redirects@1.15.9(debug@4.4.0): - optionalDependencies: - debug: 4.4.0(supports-color@8.1.1) - - for-each@0.3.5: - dependencies: - is-callable: 1.2.7 - - for-in@1.0.2: {} - - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - forever-agent@0.6.1: - optional: true - - form-data@2.3.3: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - optional: true - - form-data@4.0.2: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - mime-types: 2.1.35 - - forwarded@0.2.0: {} - - fragment-cache@0.2.1: - dependencies: - map-cache: 0.2.2 - - framer-motion@12.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - motion-dom: 12.9.1 - motion-utils: 12.8.3 - tslib: 2.8.1 - optionalDependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - fresh@0.5.2: {} - - fresh@2.0.0: {} - - from@0.1.7: {} - - fs-constants@1.0.0: {} - - fs-extra@11.1.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-extra@11.3.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-extra@7.0.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - optional: true - - fs-extra@9.1.0: - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - - fs.realpath@1.0.0: {} - - fsevents@1.2.13: - dependencies: - bindings: 1.5.0 - nan: 2.22.2 - optional: true - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - function.prototype.name@1.1.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 - - functions-have-names@1.2.3: {} - - gauge@3.0.2: - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - optional: true - - gauge@4.0.4: - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - optional: true - - gensync@1.0.0-beta.2: {} - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-nonce@1.0.1: {} - - get-npm-tarball-url@2.1.0: {} - - get-own-enumerable-property-symbols@3.0.2: {} - - get-package-type@0.1.0: {} - - get-port@5.1.1: {} - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - get-stream@5.2.0: - dependencies: - pump: 3.0.2 - - get-stream@6.0.1: {} - - get-symbol-description@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - - get-tsconfig@4.10.0: - dependencies: - resolve-pkg-maps: 1.0.0 - - get-value@2.0.6: {} - - getos@3.2.1: - dependencies: - async: 3.2.6 - optional: true - - getpass@0.1.7: - dependencies: - assert-plus: 1.0.0 - optional: true - - giget@1.2.5: - dependencies: - citty: 0.1.6 - consola: 3.4.0 - defu: 6.1.4 - node-fetch-native: 1.6.6 - nypm: 0.5.4 - pathe: 2.0.3 - tar: 6.2.1 - - github-from-package@0.0.0: {} - - github-slugger@1.5.0: {} - - gl-matrix@3.4.3: {} - - gl@6.0.2: - dependencies: - bindings: 1.5.0 - bit-twiddle: 1.0.2 - glsl-tokenizer: 2.1.5 - nan: 2.22.2 - node-abi: 3.74.0 - node-gyp: 9.4.1 - prebuild-install: 7.1.3 - transitivePeerDependencies: - - bluebird - - supports-color - optional: true - - glob-parent@3.1.0: - dependencies: - is-glob: 3.1.0 - path-dirname: 1.0.2 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob-promise@4.2.2(glob@7.2.3): - dependencies: - '@types/glob': 7.2.0 - glob: 7.2.3 - - glob-to-regexp@0.4.1: {} - - glob@10.4.5: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - optional: true - - global-dirs@3.0.1: - dependencies: - ini: 2.0.0 - optional: true - - global@4.4.0: - dependencies: - min-document: 2.19.0 - process: 0.11.10 - optional: true - - globals@11.12.0: {} - - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - - glsl-tokenizer@2.1.5: - dependencies: - through2: 0.6.5 - optional: true - - gopd@1.2.0: {} - - graceful-fs@4.2.11: {} - - graphemer@1.4.0: {} - - gunzip-maybe@1.4.2: - dependencies: - browserify-zlib: 0.1.4 - is-deflate: 1.0.0 - is-gzip: 1.0.0 - peek-stream: 1.1.3 - pumpify: 1.5.1 - through2: 2.0.5 - - gzip-size@7.0.0: - dependencies: - duplexer: 0.1.2 - - handlebars@4.7.8: - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.19.3 - - hard-rejection@2.1.0: {} - - has-bigints@1.1.0: {} - - has-binary2@1.0.3: - dependencies: - isarray: 2.0.1 - optional: true - - has-cors@1.1.0: - optional: true - - has-flag@3.0.0: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - has-unicode@2.0.1: - optional: true - - has-value@0.3.1: - dependencies: - get-value: 2.0.6 - has-values: 0.1.4 - isobject: 2.1.0 - - has-value@1.0.0: - dependencies: - get-value: 2.0.6 - has-values: 1.0.0 - isobject: 3.0.1 - - has-values@0.1.4: {} - - has-values@1.0.0: - dependencies: - is-number: 3.0.0 - kind-of: 4.0.0 - - has@1.0.4: {} - - hash-base@3.0.5: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - - hash.js@1.1.7: - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - he@1.2.0: {} - - header-case@2.0.4: - dependencies: - capital-case: 1.0.4 - tslib: 2.8.1 - - hmac-drbg@1.0.1: - dependencies: - hash.js: 1.1.7 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - - hogan.js@3.0.2: - dependencies: - mkdirp: 0.3.0 - nopt: 1.0.10 - optional: true - - hoist-non-react-statics@3.3.2: - dependencies: - react-is: 16.13.1 - - hosted-git-info@2.8.9: {} - - hosted-git-info@4.1.0: - dependencies: - lru-cache: 6.0.0 - - html-encoding-sniffer@3.0.0: - dependencies: - whatwg-encoding: 2.0.0 - - html-entities@2.6.0: {} - - html-tags@3.3.1: {} - - http-auth@3.1.3: - dependencies: - apache-crypt: 1.2.6 - apache-md5: 1.1.8 - bcryptjs: 2.4.3 - uuid: 3.4.0 - - http-browserify@1.7.0: - dependencies: - Base64: 0.2.1 - inherits: 2.0.4 - - http-cache-semantics@4.1.1: {} - - http-errors@1.6.3: - dependencies: - depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: 1.5.0 - - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - - http-parser-js@0.5.9: {} - - http-proxy-agent@5.0.0: - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - optional: true - - http-proxy@1.18.1(debug@4.4.0): - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.9(debug@4.4.0) - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - - http-server@14.1.1(debug@4.4.0): - dependencies: - basic-auth: 2.0.1 - chalk: 4.1.2 - corser: 2.0.1 - he: 1.2.0 - html-encoding-sniffer: 3.0.0 - http-proxy: 1.18.1(debug@4.4.0) - mime: 1.6.0 - minimist: 1.2.8 - opener: 1.5.2 - portfinder: 1.0.33 - secure-compare: 3.0.1 - union: 0.5.0 - url-join: 4.0.1 - transitivePeerDependencies: - - debug - - supports-color - - http-signature@1.3.6: - dependencies: - assert-plus: 1.0.0 - jsprim: 2.0.2 - sshpk: 1.18.0 - optional: true - - https-browserify@1.0.0: {} - - https-proxy-agent@4.0.0: - dependencies: - agent-base: 5.1.1 - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.1 - transitivePeerDependencies: - - supports-color - optional: true - - human-signals@1.1.1: - optional: true - - human-signals@2.1.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - optional: true - - hyperdyperid@1.2.0: {} - - hyphenate-style-name@1.1.0: {} - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - - idb@7.1.1: {} - - ieee754@1.2.1: {} - - ignore@5.3.2: {} - - image-size@0.7.5: - optional: true - - immediate@3.0.6: {} - - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - import-meta-resolve@3.1.1: {} - - imurmurhash@0.1.4: {} - - indent-string@4.0.0: {} - - indent-string@5.0.0: {} - - indexof@0.0.1: - optional: true - - infer-owner@1.0.4: - optional: true - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.3: {} - - inherits@2.0.4: {} - - ini@1.3.8: {} - - ini@2.0.0: - optional: true - - inline-style-prefixer@7.0.1: - dependencies: - css-in-js-utils: 3.1.0 - - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 - - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 - optional: true - - ipaddr.js@1.9.1: {} - - is-absolute-url@3.0.3: {} - - is-accessor-descriptor@1.0.1: - dependencies: - hasown: 2.0.2 - - is-arguments@1.2.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - - is-arrayish@0.2.1: {} - - is-arrayish@0.3.2: {} - - is-async-function@2.1.1: - dependencies: - async-function: 1.0.0 - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-bigint@1.1.0: - dependencies: - has-bigints: 1.1.0 - - is-binary-path@1.0.1: - dependencies: - binary-extensions: 1.13.1 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-boolean-object@1.2.2: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-buffer@1.1.6: {} - - is-builtin-module@3.2.1: - dependencies: - builtin-modules: 3.3.0 - - is-callable@1.2.7: {} - - is-ci@3.0.1: - dependencies: - ci-info: 3.9.0 - optional: true - - is-core-module@2.16.1: - dependencies: - hasown: 2.0.2 - - is-data-descriptor@1.0.1: - dependencies: - hasown: 2.0.2 - - is-data-view@1.0.2: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-typed-array: 1.1.15 - - is-date-object@1.1.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-deflate@1.0.0: {} - - is-descriptor@0.1.7: - dependencies: - is-accessor-descriptor: 1.0.1 - is-data-descriptor: 1.0.1 - - is-descriptor@1.0.3: - dependencies: - is-accessor-descriptor: 1.0.1 - is-data-descriptor: 1.0.1 - - is-docker@2.2.1: {} - - is-extendable@0.1.1: {} - - is-extendable@1.0.1: - dependencies: - is-plain-object: 2.0.4 - - is-extglob@2.1.1: {} - - is-finalizationregistry@1.1.1: - dependencies: - call-bound: 1.0.4 - - is-fullwidth-code-point@3.0.0: {} - - is-function@1.0.2: - optional: true - - is-generator-function@1.1.0: - dependencies: - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-glob@3.1.0: - dependencies: - is-extglob: 2.1.1 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-gzip@1.0.0: {} - - is-installed-globally@0.4.0: - dependencies: - global-dirs: 3.0.1 - is-path-inside: 3.0.3 - optional: true - - is-interactive@1.0.0: {} - - is-lambda@1.0.1: - optional: true - - is-map@2.0.3: {} - - is-module@1.0.0: {} - - is-nan@1.3.2: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - - is-negative-zero@2.0.3: {} - - is-number-object@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-number@3.0.0: - dependencies: - kind-of: 3.2.2 - - is-number@7.0.0: {} - - is-obj@1.0.1: {} - - is-path-cwd@2.2.0: {} - - is-path-inside@3.0.3: {} - - is-plain-obj@1.1.0: {} - - is-plain-obj@4.1.0: {} - - is-plain-object@2.0.4: - dependencies: - isobject: 3.0.1 - - is-plain-object@5.0.0: {} - - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - is-regexp@1.0.0: {} - - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.4 - - is-stream@2.0.1: {} - - is-string@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-symbol@1.1.1: - dependencies: - call-bound: 1.0.4 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.18 - - is-typedarray@1.0.0: - optional: true - - is-unicode-supported@0.1.0: {} - - is-weakmap@2.0.2: {} - - is-weakref@1.1.1: - dependencies: - call-bound: 1.0.4 - - is-weakset@2.0.4: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - - is-windows@1.0.2: {} - - is-wsl@1.1.0: {} - - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - - isarray@0.0.1: - optional: true - - isarray@1.0.0: {} - - isarray@2.0.1: - optional: true - - isarray@2.0.5: {} - - isexe@2.0.0: {} - - isobject@2.1.0: - dependencies: - isarray: 1.0.0 - - isobject@3.0.1: {} - - isstream@0.1.2: - optional: true - - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-instrument@5.2.1: - dependencies: - '@babel/core': 7.26.9 - '@babel/parser': 7.26.9 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - iterator.prototype@1.1.5: - dependencies: - define-data-property: 1.1.4 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - has-symbols: 1.1.0 - set-function-name: 2.0.2 - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jake@10.9.2: - dependencies: - async: 3.2.6 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - - jest-haste-map@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.9 - '@types/node': 22.13.9 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 - micromatch: 4.0.8 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - - jest-regex-util@29.6.3: {} - - jest-util@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.13.9 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - - jest-worker@29.7.0: - dependencies: - '@types/node': 22.13.9 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - jimp@0.10.3(debug@4.4.0): - dependencies: - '@babel/runtime': 7.26.9 - '@jimp/custom': 0.10.3(debug@4.4.0) - '@jimp/plugins': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0))(debug@4.4.0) - '@jimp/types': 0.10.3(@jimp/custom@0.10.3(debug@4.4.0)) - core-js: 3.41.0 - regenerator-runtime: 0.13.11 - transitivePeerDependencies: - - debug - optional: true - - jiti@2.4.2: {} - - joi@17.13.3: - dependencies: - '@hapi/hoek': 9.3.0 - '@hapi/topo': 5.1.0 - '@sideway/address': 4.1.5 - '@sideway/formula': 3.0.1 - '@sideway/pinpoint': 2.0.0 - - jpeg-js@0.3.7: - optional: true - - js-base64@2.6.4: - optional: true - - js-cookie@2.2.1: {} - - js-tokens@4.0.0: {} - - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsbn@0.1.1: - optional: true - - jsbn@1.1.0: - optional: true - - jscodeshift@0.15.2(@babel/preset-env@7.26.9(@babel/core@7.26.9)): - dependencies: - '@babel/core': 7.26.9 - '@babel/parser': 7.26.9 - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.9) - '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.9) - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.9) - '@babel/preset-flow': 7.25.9(@babel/core@7.26.9) - '@babel/preset-typescript': 7.26.0(@babel/core@7.26.9) - '@babel/register': 7.25.9(@babel/core@7.26.9) - babel-core: 7.0.0-bridge.0(@babel/core@7.26.9) - chalk: 4.1.2 - flow-parser: 0.263.0 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - neo-async: 2.6.2 - node-dir: 0.1.17 - recast: 0.23.11 - temp: 0.8.4 - write-file-atomic: 2.4.3 - optionalDependencies: - '@babel/preset-env': 7.26.9(@babel/core@7.26.9) - transitivePeerDependencies: - - supports-color - - jsesc@0.5.0: {} - - jsesc@3.0.2: {} - - jsesc@3.1.0: {} - - json-buffer@3.0.1: {} - - json-parse-better-errors@1.0.2: {} - - json-parse-even-better-errors@2.3.1: {} - - json-schema-traverse@0.4.1: {} - - json-schema-traverse@1.0.0: {} - - json-schema@0.4.0: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - - json5@2.2.3: {} - - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 - optional: true - - jsonfile@6.1.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - - jsonpointer@5.0.1: {} - - jsonwebtoken@9.0.2: - dependencies: - jws: 3.2.2 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 7.7.1 - - jsprim@2.0.2: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - optional: true - - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.9 - array.prototype.flat: 1.3.3 - object.assign: 4.1.7 - object.values: 1.2.1 - - jszip@3.10.1: - dependencies: - lie: 3.3.0 - pako: 1.0.11 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - - jwa@1.4.1: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - - jws@3.2.2: - dependencies: - jwa: 1.4.1 - safe-buffer: 5.2.1 - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - kind-of@3.2.2: - dependencies: - is-buffer: 1.1.6 - - kind-of@4.0.0: - dependencies: - is-buffer: 1.1.6 - - kind-of@6.0.3: {} - - kleur@3.0.3: {} - - lazy-ass@1.6.0: - optional: true - - lazy-universal-dotenv@4.0.0: - dependencies: - app-root-dir: 1.0.2 - dotenv: 16.4.7 - dotenv-expand: 10.0.0 - - leven@3.1.0: {} - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - lie@3.3.0: - dependencies: - immediate: 3.0.6 - - lil-gui@0.17.0: {} - - lil-gui@0.18.2: {} - - lines-and-columns@1.2.4: {} - - linkify-it@5.0.0: - dependencies: - uc.micro: 2.1.0 - - listr2@3.14.0(enquirer@2.4.1): - dependencies: - cli-truncate: 2.1.0 - colorette: 2.0.20 - log-update: 4.0.0 - p-map: 4.0.0 - rfdc: 1.4.1 - rxjs: 7.8.2 - through: 2.3.8 - wrap-ansi: 7.0.0 - optionalDependencies: - enquirer: 2.4.1 - optional: true - - live-server@1.2.2: - dependencies: - chokidar: 2.1.8 - colors: 1.4.0 - connect: 3.7.0 - cors: 2.8.5 - event-stream: 3.3.4 - faye-websocket: 0.11.4 - http-auth: 3.1.3 - morgan: 1.10.0 - object-assign: 4.1.1 - opn: 6.0.0 - proxy-middleware: 0.15.0 - send: 1.2.0 - serve-index: 1.9.1 - transitivePeerDependencies: - - supports-color - - load-bmfont@1.4.2(debug@4.4.0): - dependencies: - buffer-equal: 0.0.1 - mime: 1.6.0 - parse-bmfont-ascii: 1.0.6 - parse-bmfont-binary: 1.0.6 - parse-bmfont-xml: 1.1.6 - phin: 3.7.1(debug@4.4.0) - xhr: 2.6.0 - xtend: 4.0.2 - transitivePeerDependencies: - - debug - optional: true - - load-json-file@4.0.0: - dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 - - local-pkg@0.4.3: {} - - locate-path@3.0.0: - dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 - - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash-es@4.17.21: {} - - lodash.compact@3.0.1: {} - - lodash.debounce@4.0.8: {} - - lodash.get@4.4.2: {} - - lodash.includes@4.3.0: {} - - lodash.isboolean@3.0.3: {} - - lodash.isinteger@4.0.4: {} - - lodash.isnumber@3.0.3: {} - - lodash.isplainobject@4.0.6: {} - - lodash.isstring@4.0.1: {} - - lodash.merge@4.6.2: {} - - lodash.once@4.1.1: {} - - lodash.reduce@4.6.0: {} - - lodash.sortby@4.7.0: {} - - lodash@4.17.21: {} - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - log-update@4.0.0: - dependencies: - ansi-escapes: 4.3.2 - cli-cursor: 3.1.0 - slice-ansi: 4.0.0 - wrap-ansi: 6.2.0 - optional: true - - long@5.3.1: {} - - longest-streak@3.1.0: {} - - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - lower-case@2.0.2: - dependencies: - tslib: 2.8.1 - - lru-cache@10.4.3: {} - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - - lru-cache@7.18.3: - optional: true - - macaddress@0.5.3: {} - - magic-string@0.25.9: - dependencies: - sourcemap-codec: 1.4.8 - - magic-string@0.27.0: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - - magic-string@0.30.17: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - - make-dir@2.1.0: - dependencies: - pify: 4.0.1 - semver: 5.7.2 - - make-dir@3.1.0: - dependencies: - semver: 6.3.1 - - make-fetch-happen@10.2.1: - dependencies: - agentkeepalive: 4.6.0 - cacache: 16.1.3 - http-cache-semantics: 4.1.1 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 2.1.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.4 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 9.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - optional: true - - makeerror@1.0.12: - dependencies: - tmpl: 1.0.5 - - map-cache@0.2.2: {} - - map-obj@1.0.1: {} - - map-obj@4.3.0: {} - - map-or-similar@1.5.0: {} - - map-stream@0.1.0: {} - - map-visit@1.0.0: - dependencies: - object-visit: 1.0.1 - - markdown-it@14.1.0: - dependencies: - argparse: 2.0.1 - entities: 4.5.0 - linkify-it: 5.0.0 - mdurl: 2.0.0 - punycode.js: 2.3.1 - uc.micro: 2.1.0 - - markdown-to-jsx@7.7.4(react@18.3.1): - dependencies: - react: 18.3.1 - - math-intrinsics@1.1.0: {} - - mc-assets@0.2.62: - dependencies: - maxrects-packer: '@zardoy/maxrects-packer@2.7.4' - zod: 3.24.2 - - mc-bridge@0.1.3(minecraft-data@3.98.0): - dependencies: - minecraft-data: 3.98.0 - - mcraft-fun-mineflayer@0.1.23(encoding@0.1.13)(mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/dd3b1ff38506d6f72d90e8444186e4e75fe82659(encoding@0.1.13)): - dependencies: - '@zardoy/flying-squid': 0.0.49(encoding@0.1.13) - exit-hook: 2.2.1 - minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/bf89f7e86526c54d8c43f555d8f6dfa4948fd2d9(patch_hash=4ebdae314c68d01ce7879445c0b8bde5f90373abba8b66ed00d42e7a5f542f8b)(encoding@0.1.13) - mineflayer: https://codeload.github.com/zardoy/mineflayer/tar.gz/dd3b1ff38506d6f72d90e8444186e4e75fe82659(encoding@0.1.13) - prismarine-item: 1.17.0 - ws: 8.18.1 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - - md5-file@4.0.0: {} - - md5.js@1.3.5: - dependencies: - hash-base: 3.0.5 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - md5@2.3.0: - dependencies: - charenc: 0.0.2 - crypt: 0.0.2 - is-buffer: 1.1.6 - - mdast-util-definitions@4.0.0: - dependencies: - unist-util-visit: 2.0.3 - - mdast-util-from-markdown@2.0.2: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - decode-named-character-reference: 1.1.0 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.2 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-decode-string: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - - mdast-util-phrasing@4.1.0: - dependencies: - '@types/mdast': 4.0.4 - unist-util-is: 6.0.0 - - mdast-util-to-markdown@2.1.2: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.1.0 - mdast-util-to-string: 4.0.0 - micromark-util-classify-character: 2.0.1 - micromark-util-decode-string: 2.0.1 - unist-util-visit: 5.0.0 - zwitch: 2.0.4 - - mdast-util-to-string@1.1.0: {} - - mdast-util-to-string@4.0.0: - dependencies: - '@types/mdast': 4.0.4 - - mdn-data@2.0.14: {} - - mdurl@2.0.0: {} - - media-typer@0.3.0: {} - - memfs@4.17.0: - dependencies: - '@jsonjoy.com/json-pack': 1.2.0(tslib@2.8.1) - '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) - tree-dump: 1.0.2(tslib@2.8.1) - tslib: 2.8.1 - - memoize-one@6.0.0: {} - - memoizerific@1.11.3: - dependencies: - map-or-similar: 1.5.0 - - memorystream@0.3.1: {} - - meow@10.1.5: - dependencies: - '@types/minimist': 1.2.5 - camelcase-keys: 7.0.2 - decamelize: 5.0.1 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 8.0.0 - redent: 4.0.0 - trim-newlines: 4.1.1 - type-fest: 1.4.0 - yargs-parser: 20.2.9 - - merge-descriptors@1.0.3: {} - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - merge@1.2.1: - optional: true - - meshoptimizer@0.18.1: {} - - methods@1.1.2: {} - - micromark-core-commonmark@2.0.3: - dependencies: - decode-named-character-reference: 1.1.0 - devlop: 1.1.0 - micromark-factory-destination: 2.0.1 - micromark-factory-label: 2.0.1 - micromark-factory-space: 2.0.1 - micromark-factory-title: 2.0.1 - micromark-factory-whitespace: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-html-tag-name: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-destination@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-label@2.0.1: - dependencies: - devlop: 1.1.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-space@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-types: 2.0.2 - - micromark-factory-title@2.0.1: - dependencies: - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-whitespace@2.0.1: - dependencies: - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-character@2.1.1: - dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-chunked@2.0.1: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-classify-character@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-combine-extensions@2.0.1: - dependencies: - micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-decode-numeric-character-reference@2.0.2: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-decode-string@2.0.1: - dependencies: - decode-named-character-reference: 1.1.0 - micromark-util-character: 2.1.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-symbol: 2.0.1 - - micromark-util-encode@2.0.1: {} - - micromark-util-html-tag-name@2.0.1: {} - - micromark-util-normalize-identifier@2.0.1: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-resolve-all@2.0.1: - dependencies: - micromark-util-types: 2.0.2 - - micromark-util-sanitize-uri@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 - - micromark-util-subtokenize@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-symbol@2.0.1: {} - - micromark-util-types@2.0.2: {} - - micromark@4.0.2: - dependencies: - '@types/debug': 4.1.12 - debug: 4.4.1 - decode-named-character-reference: 1.1.0 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-combine-extensions: 2.0.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-encode: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - transitivePeerDependencies: - - supports-color - - micromatch@3.1.10: - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - braces: 2.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - extglob: 2.0.4 - fragment-cache: 0.2.1 - kind-of: 6.0.3 - nanomatch: 1.2.13 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - miller-rabin@4.0.1: - dependencies: - bn.js: 4.12.1 - brorand: 1.1.0 - - mime-db@1.52.0: {} - - mime-db@1.54.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime-types@3.0.1: - dependencies: - mime-db: 1.54.0 - - mime@1.6.0: {} - - mime@2.6.0: {} - - mimic-fn@2.1.0: {} - - mimic-response@2.1.0: - optional: true - - mimic-response@3.1.0: {} - - min-document@2.19.0: - dependencies: - dom-walk: 0.1.2 - optional: true - - min-indent@1.0.1: {} - - minecraft-data@3.98.0: {} - - minecraft-folder-path@1.2.0: {} - - minecraft-inventory-gui@https://codeload.github.com/zardoy/minecraft-inventory-gui/tar.gz/89c33d396f3fde4804c71f4be3c203ade1833b41(@types/react@18.3.18)(react@18.3.1): - dependencies: - valtio: 1.13.2(@types/react@18.3.18)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - react - - minecraft-protocol@https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/bf89f7e86526c54d8c43f555d8f6dfa4948fd2d9(patch_hash=4ebdae314c68d01ce7879445c0b8bde5f90373abba8b66ed00d42e7a5f542f8b)(encoding@0.1.13): - dependencies: - '@types/node-rsa': 1.1.4 - '@types/readable-stream': 4.0.18 - aes-js: 3.1.2 - buffer-equal: 1.0.1 - debug: 4.4.0(supports-color@8.1.1) - endian-toggle: 0.0.0 - lodash.merge: 4.6.2 - minecraft-data: 3.98.0 - minecraft-folder-path: 1.2.0 - node-fetch: 2.7.0(encoding@0.1.13) - node-rsa: 0.4.2 - prismarine-auth: 2.7.0 - prismarine-chat: 1.11.0 - prismarine-nbt: 2.7.0 - prismarine-realms: 1.3.2(encoding@0.1.13) - protodef: 1.18.0 - readable-stream: 4.7.0 - uuid-1345: 1.0.2 - yggdrasil: 1.7.0(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - supports-color - - minecraft-wrap@1.6.0(encoding@0.1.13): - dependencies: - adm-zip: 0.5.16 - debug: 4.4.0(supports-color@8.1.1) - es6-promisify: 5.0.0 - extract-zip: 2.0.1(supports-color@8.1.1) - flatmap: 0.0.3 - md5-file: 4.0.0 - minecraft-folder-path: 1.2.0 - mkdirp: 0.5.6 - mz: 2.7.0 - node-fetch: 2.7.0(encoding@0.1.13) - promise-queue: 2.2.5 - rimraf: 3.0.2 - yggdrasil: 1.7.0(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - supports-color - - minecrafthawkeye@1.3.9: - dependencies: - detect-collisions: 7.0.5 - uuid: 9.0.1 - vec3: 0.1.10 - - mineflayer-item-map-downloader@https://codeload.github.com/zardoy/mineflayer-item-map-downloader/tar.gz/a8d210ecdcf78dd082fa149a96e1612cc9747824(patch_hash=a731ebbace2d8790c973ab3a5ba33494a6e9658533a9710dd8ba36f86db061ad)(encoding@0.1.13): - dependencies: - mineflayer: https://codeload.github.com/zardoy/mineflayer/tar.gz/dd3b1ff38506d6f72d90e8444186e4e75fe82659(encoding@0.1.13) - sharp: 0.30.7 - transitivePeerDependencies: - - encoding - - supports-color - - mineflayer-mouse@0.1.21: - dependencies: - change-case: 5.4.4 - debug: 4.4.1 - prismarine-item: 1.17.0 - prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/ab2146c9933eef3247c3f64446de4ccc2c484c7c - transitivePeerDependencies: - - supports-color - - mineflayer@https://codeload.github.com/zardoy/mineflayer/tar.gz/dd3b1ff38506d6f72d90e8444186e4e75fe82659(encoding@0.1.13): - dependencies: - '@nxg-org/mineflayer-physics-util': 1.8.10 - minecraft-data: 3.98.0 - minecraft-protocol: https://codeload.github.com/PrismarineJS/node-minecraft-protocol/tar.gz/bf89f7e86526c54d8c43f555d8f6dfa4948fd2d9(patch_hash=4ebdae314c68d01ce7879445c0b8bde5f90373abba8b66ed00d42e7a5f542f8b)(encoding@0.1.13) - prismarine-biome: 1.3.0(minecraft-data@3.98.0)(prismarine-registry@1.11.0) - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 - prismarine-chat: 1.11.0 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/c5feac83b61d95feb4d4f22c063dacfb8c192a9f(minecraft-data@3.98.0) - prismarine-entity: 2.5.0 - prismarine-item: 1.17.0 - prismarine-nbt: 2.7.0 - prismarine-physics: https://codeload.github.com/zardoy/prismarine-physics/tar.gz/353e25b800149393f40539ec381218be44cbb03b - prismarine-recipe: 1.3.1(prismarine-registry@1.11.0) - prismarine-registry: 1.11.0 - prismarine-windows: 2.9.0 - prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/ab2146c9933eef3247c3f64446de4ccc2c484c7c - protodef: 1.18.0 - typed-emitter: 1.4.0 - vec3: 0.1.10 - transitivePeerDependencies: - - encoding - - supports-color - - minimalistic-assert@1.0.1: {} - - minimalistic-crypto-utils@1.0.1: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 - - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.1 - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.1 - - minimist-options@4.1.0: - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - - minimist@1.2.8: {} - - minipass-collect@1.0.2: - dependencies: - minipass: 3.3.6 - optional: true - - minipass-fetch@2.1.2: - dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - optional: true - - minipass-flush@1.0.5: - dependencies: - minipass: 3.3.6 - optional: true - - minipass-pipeline@1.2.4: - dependencies: - minipass: 3.3.6 - optional: true - - minipass-sized@1.0.3: - dependencies: - minipass: 3.3.6 - optional: true - - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@5.0.0: {} - - minipass@7.1.2: {} - - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - - mixin-deep@1.3.2: - dependencies: - for-in: 1.0.2 - is-extendable: 1.0.1 - - mkdirp-classic@0.5.3: {} - - mkdirp@0.3.0: - optional: true - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mkdirp@1.0.4: {} - - mkdirp@2.1.6: {} - - mlly@1.7.4: - dependencies: - acorn: 8.14.1 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.5.4 - - mojangson@2.0.4: - dependencies: - nearley: 2.20.1 - - monaco-editor@0.52.2: {} - - moo@0.5.2: {} - - morgan@1.10.0: - dependencies: - basic-auth: 2.0.1 - debug: 2.6.9 - depd: 2.0.0 - on-finished: 2.3.0 - on-headers: 1.0.2 - transitivePeerDependencies: - - supports-color - - motion-dom@12.9.1: - dependencies: - motion-utils: 12.8.3 - - motion-utils@12.8.3: {} - - ms@2.0.0: {} - - ms@2.1.3: {} - - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - - nan@2.22.2: - optional: true - - nano-css@5.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - css-tree: 1.1.3 - csstype: 3.1.3 - fastest-stable-stringify: 2.0.2 - inline-style-prefixer: 7.0.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - rtl-css-js: 1.16.1 - stacktrace-js: 2.0.2 - stylis: 4.3.6 - - nanoid@3.3.9: {} - - nanomatch@1.2.13: - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - fragment-cache: 0.2.1 - is-windows: 1.0.2 - kind-of: 6.0.3 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - - napi-build-utils@2.0.0: {} - - natural-compare-lite@1.4.0: {} - - natural-compare@1.4.0: {} - - nearley@2.20.1: - dependencies: - commander: 2.20.3 - moo: 0.5.2 - railroad-diagrams: 1.0.0 - randexp: 0.4.6 - - negotiator@0.6.3: {} - - negotiator@0.6.4: {} - - neo-async@2.6.2: {} - - net-browserify@https://codeload.github.com/zardoy/prismarinejs-net-browserify/tar.gz/e754999ffdea67853bc9b10553b5e9908b40f618: - dependencies: - body-parser: 1.20.3 - express: 4.21.2 - express-ws: 4.0.0(express@4.21.2) - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - nice-try@1.0.5: {} - - no-case@3.0.4: - dependencies: - lower-case: 2.0.2 - tslib: 2.8.1 - - node-abi@3.74.0: - dependencies: - semver: 7.7.1 - - node-addon-api@5.1.0: {} - - node-canvas-webgl@0.3.0(encoding@0.1.13): - dependencies: - canvas: 2.11.2(encoding@0.1.13) - gl: 6.0.2 - transitivePeerDependencies: - - bluebird - - encoding - - supports-color - optional: true - - node-dir@0.1.17: - dependencies: - minimatch: 3.1.2 - - node-fetch-native@1.6.6: {} - - node-fetch@2.7.0(encoding@0.1.13): - dependencies: - whatwg-url: 5.0.0 - optionalDependencies: - encoding: 0.1.13 - - node-gyp@9.4.1: - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - make-fetch-happen: 10.2.1 - nopt: 6.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.7.1 - tar: 6.2.1 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - - supports-color - optional: true - - node-gzip@1.1.2: {} - - node-html-parser@6.1.13: - dependencies: - css-select: 5.1.0 - he: 1.2.0 - - node-int64@0.4.0: {} - - node-releases@2.0.19: {} - - node-rsa@0.4.2: - dependencies: - asn1: 0.2.3 - - node-rsa@1.1.1: - dependencies: - asn1: 0.2.6 - - nopt@1.0.10: - dependencies: - abbrev: 1.1.1 - optional: true - - nopt@5.0.0: - dependencies: - abbrev: 1.1.1 - optional: true - - nopt@6.0.0: - dependencies: - abbrev: 1.1.1 - optional: true - - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.10 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - - normalize-package-data@3.0.3: - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.16.1 - semver: 7.7.1 - validate-npm-package-license: 3.0.4 - - normalize-path@2.1.1: - dependencies: - remove-trailing-separator: 1.1.0 - - normalize-path@3.0.0: {} - - npm-run-all@4.1.5: - dependencies: - ansi-styles: 3.2.1 - chalk: 2.4.2 - cross-spawn: 6.0.6 - memorystream: 0.3.1 - minimatch: 3.1.2 - pidtree: 0.3.1 - read-pkg: 3.0.0 - shell-quote: 1.8.2 - string.prototype.padend: 3.1.6 - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - npmlog@5.0.1: - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - optional: true - - npmlog@6.0.2: - dependencies: - are-we-there-yet: 3.0.1 - console-control-strings: 1.1.0 - gauge: 4.0.4 - set-blocking: 2.0.0 - optional: true - - nth-check@2.1.1: - dependencies: - boolbase: 1.0.0 - - nypm@0.5.4: - dependencies: - citty: 0.1.6 - consola: 3.4.0 - pathe: 2.0.3 - pkg-types: 1.3.1 - tinyexec: 0.3.2 - ufo: 1.5.4 - - object-assign@4.1.1: {} - - object-copy@0.1.0: - dependencies: - copy-descriptor: 0.1.1 - define-property: 0.2.5 - kind-of: 3.2.2 - - object-inspect@1.13.4: {} - - object-is@1.1.6: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - - object-keys@1.1.1: {} - - object-visit@1.0.1: - dependencies: - isobject: 3.0.1 - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - object.entries@1.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - - object.pick@1.3.0: - dependencies: - isobject: 3.0.1 - - object.values@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - omggif@1.0.10: - optional: true - - on-finished@2.3.0: - dependencies: - ee-first: 1.1.1 - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - on-headers@1.0.2: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - - opener@1.5.2: {} - - opn@6.0.0: - dependencies: - is-wsl: 1.1.0 - - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - ora@5.4.1: - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - - orderedmap@2.1.1: {} - - os-browserify@0.3.0: {} - - ospath@1.2.2: - optional: true - - own-keys@1.0.1: - dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-limit@4.0.0: - dependencies: - yocto-queue: 1.2.0 - - p-locate@3.0.0: - dependencies: - p-limit: 2.3.0 - - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - p-map@4.0.0: - dependencies: - aggregate-error: 3.1.0 - - p-try@2.2.0: {} - - package-json-from-dist@1.0.1: {} - - pako@0.2.9: {} - - pako@1.0.11: {} - - pako@2.1.0: {} - - param-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.8.1 - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-asn1@5.1.7: - dependencies: - asn1.js: 4.10.1 - browserify-aes: 1.2.0 - evp_bytestokey: 1.0.3 - hash-base: 3.0.5 - pbkdf2: 3.1.2 - safe-buffer: 5.2.1 - - parse-bmfont-ascii@1.0.6: - optional: true - - parse-bmfont-binary@1.0.6: - optional: true - - parse-bmfont-xml@1.1.6: - dependencies: - xml-parse-from-string: 1.0.1 - xml2js: 0.5.0 - optional: true - - parse-headers@2.0.5: - optional: true - - parse-json@4.0.0: - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.26.2 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - parseqs@0.0.6: - optional: true - - parseuri@0.0.6: - optional: true - - parseurl@1.3.3: {} - - pascal-case@3.1.2: - dependencies: - no-case: 3.0.4 - tslib: 2.8.1 - - pascalcase@0.1.1: {} - - path-browserify@1.0.1: {} - - path-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.8.1 - - path-dirname@1.0.2: {} - - path-exists-cli@2.0.0: - dependencies: - meow: 10.1.5 - path-exists: 5.0.0 - - path-exists@3.0.0: {} - - path-exists@4.0.0: {} - - path-exists@5.0.0: {} - - path-is-absolute@1.0.1: {} - - path-key@2.0.1: {} - - path-key@3.1.1: {} - - path-parse@1.0.7: {} - - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - - path-to-regexp@0.1.12: {} - - path-type@3.0.0: - dependencies: - pify: 3.0.0 - - path-type@4.0.0: {} - - pathe@1.1.2: {} - - pathe@2.0.3: {} - - pathval@1.1.1: {} - - pause-stream@0.0.11: - dependencies: - through: 2.3.8 - - pbkdf2@3.1.2: - dependencies: - create-hash: 1.2.0 - create-hmac: 1.1.7 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 - - peek-stream@1.1.3: - dependencies: - buffer-from: 1.1.2 - duplexify: 3.7.1 - through2: 2.0.5 - - peerjs-js-binarypack@2.1.0: {} - - peerjs@1.5.4: - dependencies: - '@msgpack/msgpack': 2.8.0 - eventemitter3: 4.0.7 - peerjs-js-binarypack: 2.1.0 - webrtc-adapter: 9.0.1 - - pend@1.2.0: {} - - performance-now@2.1.0: - optional: true - - phin@2.9.3: - optional: true - - phin@3.7.1(debug@4.4.0): - dependencies: - centra: 2.7.0(debug@4.4.0) - transitivePeerDependencies: - - debug - optional: true - - picocolors@1.1.1: {} - - picomatch@2.3.1: {} - - picomatch@4.0.2: {} - - pidtree@0.3.1: {} - - pify@2.3.0: - optional: true - - pify@3.0.0: {} - - pify@4.0.1: {} - - pirates@4.0.6: {} - - pixelarticons@1.8.1(patch_hash=533230072bc402f425c86abd3d0356fe087b14cab2a254d93f419b083f2d8dfa): {} - - pixelmatch@4.0.2: - dependencies: - pngjs: 3.4.0 - optional: true - - pkg-dir@3.0.0: - dependencies: - find-up: 3.0.0 - - pkg-dir@4.2.0: - dependencies: - find-up: 4.1.0 - - pkg-dir@5.0.0: - dependencies: - find-up: 5.0.0 - - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.7.4 - pathe: 2.0.3 - - pluralize@8.0.0: {} - - pngjs@3.4.0: - optional: true - - polished@4.3.1: - dependencies: - '@babel/runtime': 7.26.9 - - poly-decomp@0.3.0: {} - - portfinder@1.0.33: - dependencies: - async: 2.6.4 - debug: 3.2.7(supports-color@8.1.1) - mkdirp: 0.5.6 - transitivePeerDependencies: - - supports-color - - posix-character-classes@0.1.1: {} - - possible-typed-array-names@1.1.0: {} - - postcss@8.5.3: - dependencies: - nanoid: 3.3.9 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - potpack@1.0.2: {} - - prebuild-install@7.1.3: - dependencies: - detect-libc: 2.0.3 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 2.0.0 - node-abi: 3.74.0 - pump: 3.0.2 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.2 - tunnel-agent: 0.6.0 - - prelude-ls@1.2.1: {} - - prettier@1.19.1: - optional: true - - prettier@2.8.8: {} - - pretty-bytes@5.6.0: {} - - pretty-bytes@6.1.1: {} - - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 - - pretty-hrtime@1.0.3: {} - - prismarine-auth@2.7.0: - dependencies: - '@azure/msal-node': 2.16.2 - '@xboxreplay/xboxlive-auth': 3.3.3(debug@4.4.0) - debug: 4.4.0(supports-color@8.1.1) - smart-buffer: 4.2.0 - uuid-1345: 1.0.2 - transitivePeerDependencies: - - supports-color - - prismarine-biome@1.3.0(minecraft-data@3.98.0)(prismarine-registry@1.11.0): - dependencies: - minecraft-data: 3.98.0 - prismarine-registry: 1.11.0 - - prismarine-block@https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9: - dependencies: - minecraft-data: 3.98.0 - prismarine-biome: 1.3.0(minecraft-data@3.98.0)(prismarine-registry@1.11.0) - prismarine-chat: 1.11.0 - prismarine-item: 1.17.0 - prismarine-nbt: 2.7.0 - prismarine-registry: 1.11.0 - - prismarine-chat@1.11.0: - dependencies: - mojangson: 2.0.4 - prismarine-nbt: 2.7.0 - prismarine-registry: 1.11.0 - - prismarine-chunk@https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/c5feac83b61d95feb4d4f22c063dacfb8c192a9f(minecraft-data@3.98.0): - dependencies: - prismarine-biome: 1.3.0(minecraft-data@3.98.0)(prismarine-registry@1.11.0) - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 - prismarine-nbt: 2.7.0 - prismarine-registry: 1.11.0 - smart-buffer: 4.2.0 - uint4: 0.1.2 - vec3: 0.1.10 - xxhash-wasm: 0.4.2 - transitivePeerDependencies: - - minecraft-data - - prismarine-entity@2.5.0: - dependencies: - prismarine-chat: 1.11.0 - prismarine-item: 1.17.0 - prismarine-registry: 1.11.0 - vec3: 0.1.10 - - prismarine-item@1.17.0: - dependencies: - prismarine-nbt: 2.7.0 - prismarine-registry: 1.11.0 - - prismarine-nbt@2.7.0: - dependencies: - protodef: 1.18.0 - - prismarine-physics@https://codeload.github.com/zardoy/prismarine-physics/tar.gz/353e25b800149393f40539ec381218be44cbb03b: - dependencies: - minecraft-data: 3.98.0 - prismarine-nbt: 2.7.0 - vec3: 0.1.10 - - prismarine-provider-anvil@https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/1d548fac63fe977c8281f0a9a522b37e4d92d0b7(minecraft-data@3.98.0): - dependencies: - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 - prismarine-chunk: https://codeload.github.com/zardoy/prismarine-chunk/tar.gz/c5feac83b61d95feb4d4f22c063dacfb8c192a9f(minecraft-data@3.98.0) - prismarine-nbt: 2.7.0 - prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/ab2146c9933eef3247c3f64446de4ccc2c484c7c - uint4: 0.1.2 - vec3: 0.1.10 - transitivePeerDependencies: - - minecraft-data - - prismarine-realms@1.3.2(encoding@0.1.13): - dependencies: - debug: 4.4.0(supports-color@8.1.1) - node-fetch: 2.7.0(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - supports-color - - prismarine-recipe@1.3.1(prismarine-registry@1.11.0): - dependencies: - prismarine-registry: 1.11.0 - - prismarine-registry@1.11.0: - dependencies: - minecraft-data: 3.98.0 - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 - prismarine-nbt: 2.7.0 - - prismarine-schematic@1.2.3: - dependencies: - minecraft-data: 3.98.0 - prismarine-block: https://codeload.github.com/zardoy/prismarine-block/tar.gz/853c559bff2b402863ee9a75b125a3ca320838f9 - prismarine-nbt: 2.7.0 - prismarine-world: https://codeload.github.com/zardoy/prismarine-world/tar.gz/ab2146c9933eef3247c3f64446de4ccc2c484c7c - vec3: 0.1.10 - - prismarine-windows@2.9.0: - dependencies: - prismarine-item: 1.17.0 - prismarine-registry: 1.11.0 - typed-emitter: 2.1.0 - - prismarine-world@https://codeload.github.com/zardoy/prismarine-world/tar.gz/ab2146c9933eef3247c3f64446de4ccc2c484c7c: - dependencies: - vec3: 0.1.10 - - process-nextick-args@2.0.1: {} - - process@0.11.10: {} - - process@https://codeload.github.com/PrismarineJS/node-process/tar.gz/380d0b4f4c86f1b65b216c311bf00431f314e88e: {} - - progress@2.0.3: {} - - promise-inflight@1.0.1: - optional: true - - promise-queue@2.2.5: {} - - promise-retry@2.0.1: - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - optional: true - - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - - prosemirror-commands@1.7.0: - dependencies: - prosemirror-model: 1.24.1 - prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.3 - - prosemirror-dropcursor@1.8.1: - dependencies: - prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.3 - prosemirror-view: 1.38.1 - - prosemirror-example-setup@1.2.3: - dependencies: - prosemirror-commands: 1.7.0 - prosemirror-dropcursor: 1.8.1 - prosemirror-gapcursor: 1.3.2 - prosemirror-history: 1.4.1 - prosemirror-inputrules: 1.4.0 - prosemirror-keymap: 1.2.2 - prosemirror-menu: 1.2.4 - prosemirror-schema-list: 1.5.1 - prosemirror-state: 1.4.3 - - prosemirror-gapcursor@1.3.2: - dependencies: - prosemirror-keymap: 1.2.2 - prosemirror-model: 1.24.1 - prosemirror-state: 1.4.3 - prosemirror-view: 1.38.1 - - prosemirror-history@1.4.1: - dependencies: - prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.3 - prosemirror-view: 1.38.1 - rope-sequence: 1.3.4 - - prosemirror-inputrules@1.4.0: - dependencies: - prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.3 - - prosemirror-keymap@1.2.2: - dependencies: - prosemirror-state: 1.4.3 - w3c-keyname: 2.2.8 - - prosemirror-markdown@1.13.1: - dependencies: - '@types/markdown-it': 14.1.2 - markdown-it: 14.1.0 - prosemirror-model: 1.24.1 - - prosemirror-menu@1.2.4: - dependencies: - crelt: 1.0.6 - prosemirror-commands: 1.7.0 - prosemirror-history: 1.4.1 - prosemirror-state: 1.4.3 - - prosemirror-model@1.24.1: - dependencies: - orderedmap: 2.1.1 - - prosemirror-schema-list@1.5.1: - dependencies: - prosemirror-model: 1.24.1 - prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.3 - - prosemirror-state@1.4.3: - dependencies: - prosemirror-model: 1.24.1 - prosemirror-transform: 1.10.3 - prosemirror-view: 1.38.1 - - prosemirror-transform@1.10.3: - dependencies: - prosemirror-model: 1.24.1 - - prosemirror-view@1.38.1: - dependencies: - prosemirror-model: 1.24.1 - prosemirror-state: 1.4.3 - prosemirror-transform: 1.10.3 - - protodef-validator@1.4.0: - dependencies: - ajv: 6.12.6 - - protodef@1.18.0: - dependencies: - lodash.get: 4.4.2 - lodash.reduce: 4.6.0 - protodef-validator: 1.4.0 - readable-stream: 4.7.0 - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - proxy-compare@2.5.1: {} - - proxy-compare@2.6.0: {} - - proxy-from-env@1.0.0: - optional: true - - proxy-from-env@1.1.0: {} - - proxy-middleware@0.15.0: {} - - psl@1.15.0: - dependencies: - punycode: 2.3.1 - optional: true - - public-encrypt@4.0.3: - dependencies: - bn.js: 4.12.1 - browserify-rsa: 4.1.1 - create-hash: 1.2.0 - parse-asn1: 5.1.7 - randombytes: 2.1.0 - safe-buffer: 5.2.1 - - pump@2.0.1: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - - pump@3.0.2: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - - pumpify@1.5.1: - dependencies: - duplexify: 3.7.1 - inherits: 2.0.4 - pump: 2.0.1 - - punycode.js@2.3.1: {} - - punycode@1.4.1: {} - - punycode@2.3.1: {} - - puppeteer-core@2.1.1: - dependencies: - '@types/mime-types': 2.1.4 - debug: 4.4.1 - extract-zip: 1.7.0 - https-proxy-agent: 4.0.0 - mime: 2.6.0 - mime-types: 2.1.35 - progress: 2.0.3 - proxy-from-env: 1.1.0 - rimraf: 2.7.1 - ws: 6.2.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - qrcode.react@3.2.0(react@18.3.1): - dependencies: - react: 18.3.1 - - qs@6.10.4: - dependencies: - side-channel: 1.1.0 - optional: true - - qs@6.13.0: - dependencies: - side-channel: 1.1.0 - - qs@6.14.0: - dependencies: - side-channel: 1.1.0 - - querystring-es3@0.2.1: {} - - querystringify@2.2.0: - optional: true - - queue-microtask@1.2.3: {} - - quick-lru@5.1.1: {} - - quickselect@2.0.0: {} - - railroad-diagrams@1.0.0: {} - - rambda@6.9.0: {} - - rambda@9.4.2: {} - - ramda@0.29.0: {} - - randexp@0.4.6: - dependencies: - discontinuous-range: 1.0.0 - ret: 0.1.15 - - random-seed@0.3.0: - dependencies: - json-stringify-safe: 5.0.1 - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - randomfill@1.0.4: - dependencies: - randombytes: 2.1.0 - safe-buffer: 5.2.1 - - range-parser@1.2.1: {} - - range@0.0.3: {} - - raw-body@2.5.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - rbush@3.0.1: - dependencies: - quickselect: 2.0.0 - - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - - react-colorful@5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - react-docgen-typescript@2.2.2(typescript@5.5.4): - dependencies: - typescript: 5.5.4 - - react-docgen@7.1.1: - dependencies: - '@babel/core': 7.26.9 - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.6 - '@types/doctrine': 0.0.9 - '@types/resolve': 1.20.6 - doctrine: 3.0.0 - resolve: 1.22.10 - strip-indent: 4.0.0 - transitivePeerDependencies: - - supports-color - - react-dom@18.3.1(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - - react-element-to-jsx-string@15.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@base2/pretty-print-object': 1.0.1 - is-plain-object: 5.0.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-is: 18.1.0 - - react-fast-compare@3.2.2: {} - - react-hook-form@7.54.2(react@18.3.1): - dependencies: - react: 18.3.1 - - react-is@16.13.1: {} - - react-is@18.1.0: {} - - react-is@18.3.1: {} - - react-popper@2.3.0(@popperjs/core@2.11.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@popperjs/core': 2.11.8 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-fast-compare: 3.2.2 - warning: 4.0.3 - - react-portal@4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - react-refresh@0.14.2: {} - - react-refresh@0.17.0: {} - - react-remove-scroll-bar@2.3.8(@types/react@18.3.18)(react@18.3.1): - dependencies: - react: 18.3.1 - react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) - tslib: 2.8.1 - optionalDependencies: - '@types/react': 18.3.18 - - react-remove-scroll@2.5.5(@types/react@18.3.18)(react@18.3.1): - dependencies: - react: 18.3.1 - react-remove-scroll-bar: 2.3.8(@types/react@18.3.18)(react@18.3.1) - react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) - tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@18.3.18)(react@18.3.1) - use-sidecar: 1.1.3(@types/react@18.3.18)(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - - react-select@5.10.1(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.26.9 - '@emotion/cache': 11.14.0 - '@emotion/react': 11.14.0(@types/react@18.3.18)(react@18.3.1) - '@floating-ui/dom': 1.6.13 - '@types/react-transition-group': 4.4.12(@types/react@18.3.18) - memoize-one: 6.0.0 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - use-isomorphic-layout-effect: 1.2.0(@types/react@18.3.18)(react@18.3.1) - transitivePeerDependencies: - - '@types/react' - - supports-color - - react-style-singleton@2.2.3(@types/react@18.3.18)(react@18.3.1): - dependencies: - get-nonce: 1.0.1 - react: 18.3.1 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 18.3.18 - - react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@babel/runtime': 7.26.9 - dom-helpers: 5.2.1 - loose-envify: 1.4.0 - prop-types: 15.8.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - react-universal-interface@0.6.2(react@18.3.1)(tslib@2.8.1): - dependencies: - react: 18.3.1 - tslib: 2.8.1 - - react-use-measure@2.1.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - debounce: 1.2.1 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - react-use@17.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@types/js-cookie': 2.2.7 - '@xobotyi/scrollbar-width': 1.9.5 - copy-to-clipboard: 3.3.3 - fast-deep-equal: 3.1.3 - fast-shallow-equal: 1.0.0 - js-cookie: 2.2.1 - nano-css: 5.6.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-universal-interface: 0.6.2(react@18.3.1)(tslib@2.8.1) - resize-observer-polyfill: 1.5.1 - screenfull: 5.2.0 - set-harmonic-interval: 1.0.1 - throttle-debounce: 3.0.1 - ts-easing: 0.2.0 - tslib: 2.8.1 - - react-zoom-pan-pinch@3.4.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - react@18.3.1: - dependencies: - loose-envify: 1.4.0 - - read-pkg-up@7.0.1: - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - - read-pkg-up@8.0.0: - dependencies: - find-up: 5.0.0 - read-pkg: 6.0.0 - type-fest: 1.4.0 - - read-pkg@3.0.0: - dependencies: - load-json-file: 4.0.0 - normalize-package-data: 2.5.0 - path-type: 3.0.0 - - read-pkg@5.2.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - - read-pkg@6.0.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 3.0.3 - parse-json: 5.2.0 - type-fest: 1.4.0 - - readable-stream@1.0.34: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - optional: true - - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - readable-stream@4.7.0: - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - - readdirp@2.2.1: - dependencies: - graceful-fs: 4.2.11 - micromatch: 3.1.10 - readable-stream: 2.3.8 - transitivePeerDependencies: - - supports-color - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - readline@1.3.0: {} - - recast@0.23.11: - dependencies: - ast-types: 0.16.1 - esprima: 4.0.1 - source-map: 0.6.1 - tiny-invariant: 1.3.3 - tslib: 2.8.1 - - redent@4.0.0: - dependencies: - indent-string: 5.0.0 - strip-indent: 4.0.0 - - reduce-configs@1.1.0: {} - - reflect.getprototypeof@1.0.10: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 - - regenerate-unicode-properties@10.2.0: - dependencies: - regenerate: 1.4.2 - - regenerate@1.4.2: {} - - regenerator-runtime@0.13.11: - optional: true - - regenerator-runtime@0.14.1: {} - - regenerator-transform@0.15.2: - dependencies: - '@babel/runtime': 7.26.9 - - regex-not@1.0.2: - dependencies: - extend-shallow: 3.0.2 - safe-regex: 1.1.0 - - regexp-tree@0.1.27: {} - - regexp.prototype.flags@1.5.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 - set-function-name: 2.0.2 - - regexpp@3.2.0: {} - - regexpu-core@6.2.0: - dependencies: - regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.0 - regjsgen: 0.8.0 - regjsparser: 0.12.0 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.0 - - regjsgen@0.8.0: {} - - regjsparser@0.10.0: - dependencies: - jsesc: 0.5.0 - - regjsparser@0.12.0: - dependencies: - jsesc: 3.0.2 - - remark-external-links@8.0.0: - dependencies: - extend: 3.0.2 - is-absolute-url: 3.0.3 - mdast-util-definitions: 4.0.0 - space-separated-tokens: 1.1.5 - unist-util-visit: 2.0.3 - - remark-parse@11.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.2 - micromark-util-types: 2.0.2 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color - - remark-slug@6.1.0: - dependencies: - github-slugger: 1.5.0 - mdast-util-to-string: 1.1.0 - unist-util-visit: 2.0.3 - - remark-stringify@11.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-to-markdown: 2.1.2 - unified: 11.0.5 - - remark@15.0.1: - dependencies: - '@types/mdast': 4.0.4 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color - - remove-trailing-separator@1.1.0: {} - - repeat-element@1.1.4: {} - - repeat-string@1.6.1: {} - - request-progress@3.0.0: - dependencies: - throttleit: 1.0.1 - optional: true - - require-directory@2.1.1: {} - - require-from-string@2.0.2: {} - - requires-port@1.0.0: {} - - resize-observer-polyfill@1.5.1: {} - - resolve-from@4.0.0: {} - - resolve-from@5.0.0: {} - - resolve-pkg-maps@1.0.0: {} - - resolve-url@0.2.1: {} - - resolve@1.22.10: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - resolve@2.0.0-next.5: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - ret@0.1.15: {} - - retry@0.12.0: - optional: true - - reusify@1.1.0: {} - - rfdc@1.4.1: - optional: true - - rimraf@2.6.3: - dependencies: - glob: 7.2.3 - - rimraf@2.7.1: - dependencies: - glob: 7.2.3 - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - rimraf@5.0.10: - dependencies: - glob: 10.4.5 - - ripemd160@2.0.2: - dependencies: - hash-base: 3.0.5 - inherits: 2.0.4 - - rollup@2.79.2: - optionalDependencies: - fsevents: 2.3.3 - - rollup@3.29.5: - optionalDependencies: - fsevents: 2.3.3 - - rollup@4.34.9: - dependencies: - '@types/estree': 1.0.6 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.34.9 - '@rollup/rollup-android-arm64': 4.34.9 - '@rollup/rollup-darwin-arm64': 4.34.9 - '@rollup/rollup-darwin-x64': 4.34.9 - '@rollup/rollup-freebsd-arm64': 4.34.9 - '@rollup/rollup-freebsd-x64': 4.34.9 - '@rollup/rollup-linux-arm-gnueabihf': 4.34.9 - '@rollup/rollup-linux-arm-musleabihf': 4.34.9 - '@rollup/rollup-linux-arm64-gnu': 4.34.9 - '@rollup/rollup-linux-arm64-musl': 4.34.9 - '@rollup/rollup-linux-loongarch64-gnu': 4.34.9 - '@rollup/rollup-linux-powerpc64le-gnu': 4.34.9 - '@rollup/rollup-linux-riscv64-gnu': 4.34.9 - '@rollup/rollup-linux-s390x-gnu': 4.34.9 - '@rollup/rollup-linux-x64-gnu': 4.34.9 - '@rollup/rollup-linux-x64-musl': 4.34.9 - '@rollup/rollup-win32-arm64-msvc': 4.34.9 - '@rollup/rollup-win32-ia32-msvc': 4.34.9 - '@rollup/rollup-win32-x64-msvc': 4.34.9 - fsevents: 2.3.3 - - rope-sequence@1.3.4: {} - - rtl-css-js@1.16.1: - dependencies: - '@babel/runtime': 7.26.9 - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - rxjs@7.8.2: - dependencies: - tslib: 2.8.1 - - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - - safe-buffer@5.1.2: {} - - safe-buffer@5.2.1: {} - - safe-push-apply@1.0.0: - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 - - safe-regex@1.1.0: - dependencies: - ret: 0.1.15 - - safer-buffer@2.1.2: {} - - sanitize-filename@1.6.3: - dependencies: - truncate-utf8-bytes: 1.0.2 - - sat@0.9.0: {} - - sax@1.4.1: - optional: true - - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - - screenfull@5.2.0: {} - - sdp@3.2.0: {} - - secure-compare@3.0.1: {} - - semver@5.7.2: {} - - semver@6.3.1: {} - - semver@7.7.1: {} - - send@0.19.0: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - - send@1.2.0: - dependencies: - debug: 4.4.1 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.0 - mime-types: 3.0.1 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - sentence-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.8.1 - upper-case-first: 2.0.2 - - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 - - serve-index@1.9.1: - dependencies: - accepts: 1.3.8 - batch: 0.6.1 - debug: 2.6.9 - escape-html: 1.0.3 - http-errors: 1.6.3 - mime-types: 2.1.35 - parseurl: 1.3.3 - transitivePeerDependencies: - - supports-color - - serve-static@1.16.2: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.0 - transitivePeerDependencies: - - supports-color - - set-blocking@2.0.0: - optional: true - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - set-harmonic-interval@1.0.1: {} - - set-proto@1.0.0: - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - - set-value@2.0.1: - dependencies: - extend-shallow: 2.0.1 - is-extendable: 0.1.1 - is-plain-object: 2.0.4 - split-string: 3.1.0 - - setimmediate@1.0.5: {} - - setprototypeof@1.1.0: {} - - setprototypeof@1.2.0: {} - - sha.js@2.4.11: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - - shallow-clone@3.0.1: - dependencies: - kind-of: 6.0.3 - - sharp@0.30.7: - dependencies: - color: 4.2.3 - detect-libc: 2.0.3 - node-addon-api: 5.1.0 - prebuild-install: 7.1.3 - semver: 7.7.1 - simple-get: 4.0.1 - tar-fs: 2.1.2 - tunnel-agent: 0.6.0 - - sharp@0.33.5: - dependencies: - color: 4.2.3 - detect-libc: 2.0.3 - semver: 7.7.1 - optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.5 - '@img/sharp-darwin-x64': 0.33.5 - '@img/sharp-libvips-darwin-arm64': 1.0.4 - '@img/sharp-libvips-darwin-x64': 1.0.4 - '@img/sharp-libvips-linux-arm': 1.0.5 - '@img/sharp-libvips-linux-arm64': 1.0.4 - '@img/sharp-libvips-linux-s390x': 1.0.4 - '@img/sharp-libvips-linux-x64': 1.0.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - '@img/sharp-linux-arm': 0.33.5 - '@img/sharp-linux-arm64': 0.33.5 - '@img/sharp-linux-s390x': 0.33.5 - '@img/sharp-linux-x64': 0.33.5 - '@img/sharp-linuxmusl-arm64': 0.33.5 - '@img/sharp-linuxmusl-x64': 0.33.5 - '@img/sharp-wasm32': 0.33.5 - '@img/sharp-win32-ia32': 0.33.5 - '@img/sharp-win32-x64': 0.33.5 - optional: true - - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@1.0.0: {} - - shebang-regex@3.0.0: {} - - shell-quote@1.8.2: {} - - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - - siginfo@2.0.0: {} - - signal-exit@3.0.7: {} - - signal-exit@4.1.0: {} - - simple-concat@1.0.1: {} - - simple-get@3.1.1: - dependencies: - decompress-response: 4.2.1 - once: 1.4.0 - simple-concat: 1.0.1 - optional: true - - simple-get@4.0.1: - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - - sisteransi@1.0.5: {} - - skinview-utils@0.7.1: {} - - skinview3d@3.1.0: - dependencies: - '@types/three': 0.156.0 - skinview-utils: 0.7.1 - three: 0.154.0 - - slash@3.0.0: {} - - slice-ansi@3.0.0: - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - optional: true - - slice-ansi@4.0.0: - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - optional: true - - smart-buffer@4.2.0: {} - - smob@1.5.0: {} - - snake-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.8.1 - - snapdragon-node@2.1.1: - dependencies: - define-property: 1.0.0 - isobject: 3.0.1 - snapdragon-util: 3.0.1 - - snapdragon-util@3.0.1: - dependencies: - kind-of: 3.2.2 - - snapdragon@0.8.2: - dependencies: - base: 0.11.2 - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - map-cache: 0.2.2 - source-map: 0.5.7 - source-map-resolve: 0.5.3 - use: 3.1.1 - transitivePeerDependencies: - - supports-color - - socket.io-adapter@1.1.2: - optional: true - - socket.io-adapter@2.5.5: - dependencies: - debug: 4.3.7 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - socket.io-client@2.5.0: - dependencies: - backo2: 1.0.2 - component-bind: 1.0.0 - component-emitter: 1.3.1 - debug: 3.1.0 - engine.io-client: 3.5.4 - has-binary2: 1.0.3 - indexof: 0.0.1 - parseqs: 0.0.6 - parseuri: 0.0.6 - socket.io-parser: 3.3.4 - to-array: 0.1.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - optional: true - - socket.io-client@4.8.1: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.7 - engine.io-client: 6.6.3 - socket.io-parser: 4.2.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - socket.io-parser@3.3.4: - dependencies: - component-emitter: 1.3.1 - debug: 3.1.0 - isarray: 2.0.1 - transitivePeerDependencies: - - supports-color - optional: true - - socket.io-parser@3.4.3: - dependencies: - component-emitter: 1.2.1 - debug: 4.1.1 - isarray: 2.0.1 - transitivePeerDependencies: - - supports-color - optional: true - - socket.io-parser@4.2.4: - dependencies: - '@socket.io/component-emitter': 3.1.2 - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - - socket.io@2.5.1: - dependencies: - debug: 4.1.1 - engine.io: 3.6.2 - has-binary2: 1.0.3 - socket.io-adapter: 1.1.2 - socket.io-client: 2.5.0 - socket.io-parser: 3.4.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - optional: true - - socket.io@4.8.1: - dependencies: - accepts: 1.3.8 - base64id: 2.0.0 - cors: 2.8.5 - debug: 4.3.7 - engine.io: 6.6.4 - socket.io-adapter: 2.5.5 - socket.io-parser: 4.2.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - socks-proxy-agent@7.0.0: - dependencies: - agent-base: 6.0.2 - debug: 4.4.1 - socks: 2.8.4 - transitivePeerDependencies: - - supports-color - optional: true - - socks@2.8.4: - dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 - optional: true - - source-map-js@1.2.1: {} - - source-map-resolve@0.5.3: - dependencies: - atob: 2.1.2 - decode-uri-component: 0.2.2 - resolve-url: 0.2.1 - source-map-url: 0.4.1 - urix: 0.1.0 - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map-url@0.4.1: {} - - source-map@0.5.6: {} - - source-map@0.5.7: {} - - source-map@0.6.1: {} - - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 - - sourcemap-codec@1.4.8: {} - - space-separated-tokens@1.1.5: {} - - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.21 - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.21 - - spdx-license-ids@3.0.21: {} - - split-string@3.1.0: - dependencies: - extend-shallow: 3.0.2 - - split@0.3.3: - dependencies: - through: 2.3.8 - - sprintf-js@1.0.3: {} - - sprintf-js@1.1.3: - optional: true - - sshpk@1.18.0: - dependencies: - asn1: 0.2.6 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - optional: true - - ssri@9.0.1: - dependencies: - minipass: 3.3.6 - optional: true - - stack-generator@2.0.10: - dependencies: - stackframe: 1.3.4 - - stackback@0.0.2: {} - - stackframe@1.3.4: {} - - stacktrace-gps@3.1.2: - dependencies: - source-map: 0.5.6 - stackframe: 1.3.4 - - stacktrace-js@2.0.2: - dependencies: - error-stack-parser: 2.1.4 - stack-generator: 2.0.10 - stacktrace-gps: 3.1.2 - - state-local@1.0.7: {} - - static-extend@0.1.2: - dependencies: - define-property: 0.2.5 - object-copy: 0.1.0 - - stats-gl@1.0.7: {} - - stats.js@0.17.0: {} - - statuses@1.5.0: {} - - statuses@2.0.1: {} - - statuses@2.0.2: {} - - std-env@3.8.1: {} - - stop-iteration-iterator@1.1.0: - dependencies: - es-errors: 1.3.0 - internal-slot: 1.1.0 - - store2@2.14.4: {} - - storybook@7.6.20(encoding@0.1.13): - dependencies: - '@storybook/cli': 7.6.20(encoding@0.1.13) - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - - stream-browserify@3.0.0: - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - - stream-combiner@0.0.4: - dependencies: - duplexer: 0.1.2 - - stream-http@3.2.0: - dependencies: - builtin-status-codes: 3.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - xtend: 4.0.2 - - stream-shift@1.0.3: {} - - strict-event-emitter-types@2.0.0: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - string.prototype.matchall@4.0.12: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - regexp.prototype.flags: 1.5.4 - set-function-name: 2.0.2 - side-channel: 1.1.0 - - string.prototype.padend@3.1.6: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-object-atoms: 1.1.1 - - string.prototype.repeat@1.0.0: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.24.0 - - string.prototype.trim@1.2.10: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 - - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - string_decoder@0.10.31: - optional: true - - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - stringify-object@3.3.0: - dependencies: - get-own-enumerable-property-symbols: 3.0.2 - is-obj: 1.0.1 - is-regexp: 1.0.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 - - strip-bom@3.0.0: {} - - strip-comments@2.0.1: {} - - strip-final-newline@2.0.0: {} - - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - - strip-indent@4.0.0: - dependencies: - min-indent: 1.0.1 - - strip-json-comments@2.0.1: {} - - strip-json-comments@3.1.1: {} - - strip-literal@1.3.0: - dependencies: - acorn: 8.14.1 - - stylis@4.2.0: {} - - stylis@4.3.6: {} - - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - synchronous-promise@2.0.17: {} - - systeminformation@5.25.11: - optional: true - - tabbable@6.2.0: {} - - tar-fs@2.1.2: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.2 - tar-stream: 2.2.0 - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - - telejson@7.2.0: - dependencies: - memoizerific: 1.11.3 - - temp-dir@2.0.0: {} - - temp@0.8.4: - dependencies: - rimraf: 2.6.3 - - tempy@0.6.0: - dependencies: - is-stream: 2.0.1 - temp-dir: 2.0.0 - type-fest: 0.16.0 - unique-string: 2.0.0 - - tempy@1.0.1: - dependencies: - del: 6.1.1 - is-stream: 2.0.1 - temp-dir: 2.0.0 - type-fest: 0.16.0 - unique-string: 2.0.0 - - terser@5.39.0: - dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.14.1 - commander: 2.20.3 - source-map-support: 0.5.21 - - test-exclude@6.0.0: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - - text-table@0.2.0: {} - - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - - thingies@1.21.0(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - - three-stdlib@2.35.14(three@0.154.0): - dependencies: - '@types/draco3d': 1.4.10 - '@types/offscreencanvas': 2019.7.3 - '@types/webxr': 0.5.21 - draco3d: 1.5.7 - fflate: 0.6.10 - potpack: 1.0.2 - three: 0.154.0 - - three.meshline@1.4.0: {} - - three@0.154.0: {} - - throttle-debounce@3.0.1: {} - - throttleit@1.0.1: - optional: true - - through2@0.6.5: - dependencies: - readable-stream: 1.0.34 - xtend: 4.0.2 - optional: true - - through2@2.0.5: - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - - through@2.3.8: {} - - timers-browserify@2.0.12: - dependencies: - setimmediate: 1.0.5 - - timm@1.7.1: - optional: true - - tiny-invariant@1.3.3: {} - - tinybench@2.9.0: {} - - tinycolor2@1.6.0: - optional: true - - tinyexec@0.3.2: {} - - tinypool@0.7.0: {} - - tinyspy@2.2.1: {} - - title-case@3.0.3: - dependencies: - tslib: 2.8.1 - - tmp@0.2.3: - optional: true - - tmpl@1.0.5: {} - - to-array@0.1.4: - optional: true - - to-object-path@0.3.0: - dependencies: - kind-of: 3.2.2 - - to-regex-range@2.1.1: - dependencies: - is-number: 3.0.0 - repeat-string: 1.6.1 - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - to-regex@3.0.2: - dependencies: - define-property: 2.0.2 - extend-shallow: 3.0.2 - regex-not: 1.0.2 - safe-regex: 1.1.0 - - tocbot@4.35.0: {} - - toggle-selection@1.0.6: {} - - toidentifier@1.0.1: {} - - tough-cookie@4.1.4: - dependencies: - psl: 1.15.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - optional: true - - tr46@0.0.3: {} - - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - - tree-dump@1.0.2(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - - trim-newlines@4.1.1: {} - - trough@2.2.0: {} - - truncate-utf8-bytes@1.0.2: - dependencies: - utf8-byte-length: 1.0.5 - - ts-api-utils@1.4.3(typescript@5.5.4): - dependencies: - typescript: 5.5.4 - - ts-api-utils@2.0.1(typescript@5.5.4): - dependencies: - typescript: 5.5.4 - - ts-checker-rspack-plugin@1.1.1(@rspack/core@1.3.3(@swc/helpers@0.5.15))(typescript@5.5.4): - dependencies: - '@babel/code-frame': 7.26.2 - '@rspack/lite-tapable': 1.0.1 - chokidar: 3.6.0 - memfs: 4.17.0 - minimatch: 9.0.5 - picocolors: 1.1.1 - typescript: 5.5.4 - optionalDependencies: - '@rspack/core': 1.3.3(@swc/helpers@0.5.15) - - ts-dedent@2.2.0: {} - - ts-easing@0.2.0: {} - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tslib@1.14.1: {} - - tslib@2.8.1: {} - - tsx@4.19.3: - dependencies: - esbuild: 0.25.0 - get-tsconfig: 4.10.0 - optionalDependencies: - fsevents: 2.3.3 - - tty-browserify@0.0.1: {} - - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - - tweetnacl@0.14.5: - optional: true - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-detect@4.1.0: {} - - type-fest@0.16.0: {} - - type-fest@0.20.2: {} - - type-fest@0.21.3: - optional: true - - type-fest@0.6.0: {} - - type-fest@0.8.1: {} - - type-fest@1.4.0: {} - - type-fest@2.19.0: {} - - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - - typed-array-buffer@1.0.3: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - - typed-array-byte-offset@1.0.4: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 - - typed-array-length@1.0.7: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.1.0 - reflect.getprototypeof: 1.0.10 - - typed-emitter@1.4.0: {} - - typed-emitter@2.1.0: - optionalDependencies: - rxjs: 7.8.2 - - typedarray@0.0.6: {} - - typescript@5.5.4: {} - - ua-parser-js@1.0.40: {} - - uc.micro@2.1.0: {} - - ufo@1.5.4: {} - - uglify-js@3.19.3: - optional: true - - uint4@0.1.2: {} - - unbox-primitive@1.1.0: - dependencies: - call-bound: 1.0.4 - has-bigints: 1.1.0 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 - - undici-types@5.26.5: {} - - undici-types@6.20.0: {} - - undici@6.0.1: - dependencies: - '@fastify/busboy': 2.1.1 - - unicode-canonical-property-names-ecmascript@2.0.1: {} - - unicode-match-property-ecmascript@2.0.0: - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.1 - unicode-property-aliases-ecmascript: 2.1.0 - - unicode-match-property-value-ecmascript@2.2.0: {} - - unicode-property-aliases-ecmascript@2.1.0: {} - - unidiff@1.0.2: - dependencies: - diff: 2.2.3 - optional: true - - unified@11.0.5: - dependencies: - '@types/unist': 3.0.3 - bail: 2.0.2 - devlop: 1.1.0 - extend: 3.0.2 - is-plain-obj: 4.1.0 - trough: 2.2.0 - vfile: 6.0.3 - - union-value@1.0.1: - dependencies: - arr-union: 3.1.0 - get-value: 2.0.6 - is-extendable: 0.1.1 - set-value: 2.0.1 - - union@0.5.0: - dependencies: - qs: 6.14.0 - - unique-filename@2.0.1: - dependencies: - unique-slug: 3.0.0 - optional: true - - unique-slug@3.0.0: - dependencies: - imurmurhash: 0.1.4 - optional: true - - unique-string@2.0.0: - dependencies: - crypto-random-string: 2.0.0 - - unist-util-is@4.1.0: {} - - unist-util-is@6.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-stringify-position@4.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-visit-parents@3.1.1: - dependencies: - '@types/unist': 2.0.11 - unist-util-is: 4.1.0 - - unist-util-visit-parents@6.0.1: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - - unist-util-visit@2.0.3: - dependencies: - '@types/unist': 2.0.11 - unist-util-is: 4.1.0 - unist-util-visit-parents: 3.1.1 - - unist-util-visit@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - - universalify@0.1.2: - optional: true - - universalify@0.2.0: - optional: true - - universalify@2.0.1: {} - - unix-crypt-td-js@1.1.4: {} - - unpipe@1.0.0: {} - - unplugin@1.16.1: - dependencies: - acorn: 8.14.1 - webpack-virtual-modules: 0.6.2 - - unset-value@1.0.0: - dependencies: - has-value: 0.3.1 - isobject: 3.0.1 - - untildify@4.0.0: {} - - upath@1.2.0: {} - - update-browserslist-db@1.1.3(browserslist@4.24.4): - dependencies: - browserslist: 4.24.4 - escalade: 3.2.0 - picocolors: 1.1.1 - - upper-case-first@2.0.2: - dependencies: - tslib: 2.8.1 - - upper-case@2.0.2: - dependencies: - tslib: 2.8.1 - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - urix@0.1.0: {} - - url-join@4.0.1: {} - - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - optional: true - - url@0.11.4: - dependencies: - punycode: 1.4.1 - qs: 6.14.0 - - use-callback-ref@1.3.3(@types/react@18.3.18)(react@18.3.1): - dependencies: - react: 18.3.1 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 18.3.18 - - use-deep-compare@1.3.0(react@18.3.1): - dependencies: - dequal: 2.0.3 - react: 18.3.1 - - use-isomorphic-layout-effect@1.2.0(@types/react@18.3.18)(react@18.3.1): - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.18 - - use-resize-observer@9.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@juggle/resize-observer': 3.4.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - use-sidecar@1.1.3(@types/react@18.3.18)(react@18.3.1): - dependencies: - detect-node-es: 1.1.0 - react: 18.3.1 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 18.3.18 - - use-sync-external-store@1.2.0(react@18.3.1): - dependencies: - react: 18.3.1 - - use-typed-event-listener@4.0.2(react@18.3.1)(typescript@5.5.4): - dependencies: - '@babel/runtime': 7.26.9 - react: 18.3.1 - use-deep-compare: 1.3.0(react@18.3.1) - optionalDependencies: - typescript: 5.5.4 - - use@3.1.1: {} - - utf8-byte-length@1.0.5: {} - - utif@2.0.1: - dependencies: - pako: 1.0.11 - optional: true - - util-deprecate@1.0.2: {} - - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.2.0 - is-generator-function: 1.1.0 - is-typed-array: 1.1.15 - which-typed-array: 1.1.18 - - utils-merge@1.0.1: {} - - uuid-1345@1.0.2: - dependencies: - macaddress: 0.5.3 - - uuid@3.4.0: {} - - uuid@8.3.2: {} - - uuid@9.0.1: {} - - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - - valtio@1.11.2(@types/react@18.3.18)(react@18.3.1): - dependencies: - proxy-compare: 2.5.1 - use-sync-external-store: 1.2.0(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - react: 18.3.1 - - valtio@1.13.2(@types/react@18.3.18)(react@18.3.1): - dependencies: - derive-valtio: 0.1.0(valtio@1.13.2(@types/react@18.3.18)(react@18.3.1)) - proxy-compare: 2.6.0 - use-sync-external-store: 1.2.0(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.18 - react: 18.3.1 - - vary@1.1.2: {} - - vec3@0.1.10: {} - - verror@1.10.0: - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.3.0 - optional: true - - vfile-message@4.0.2: - dependencies: - '@types/unist': 3.0.3 - unist-util-stringify-position: 4.0.0 - - vfile@6.0.3: - dependencies: - '@types/unist': 3.0.3 - vfile-message: 4.0.2 - - vite-node@0.34.6(@types/node@22.13.9)(terser@5.39.0): - dependencies: - cac: 6.7.14 - debug: 4.4.0(supports-color@8.1.1) - mlly: 1.7.4 - pathe: 1.1.2 - picocolors: 1.1.1 - vite: 4.5.9(@types/node@22.13.9)(terser@5.39.0) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - - vite@4.5.9(@types/node@22.13.9)(terser@5.39.0): - dependencies: - esbuild: 0.18.20 - postcss: 8.5.3 - rollup: 3.29.5 - optionalDependencies: - '@types/node': 22.13.9 - fsevents: 2.3.3 - terser: 5.39.0 - - vite@6.2.1(@types/node@22.13.9)(jiti@2.4.2)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.0): - dependencies: - esbuild: 0.25.0 - postcss: 8.5.3 - rollup: 4.34.9 - optionalDependencies: - '@types/node': 22.13.9 - fsevents: 2.3.3 - jiti: 2.4.2 - terser: 5.39.0 - tsx: 4.19.3 - yaml: 2.7.0 - - vitest@0.34.6(terser@5.39.0): - dependencies: - '@types/chai': 4.3.20 - '@types/chai-subset': 1.3.6(@types/chai@4.3.20) - '@types/node': 22.13.9 - '@vitest/expect': 0.34.6 - '@vitest/runner': 0.34.6 - '@vitest/snapshot': 0.34.6 - '@vitest/spy': 0.34.6 - '@vitest/utils': 0.34.6 - acorn: 8.14.1 - acorn-walk: 8.3.4 - cac: 6.7.14 - chai: 4.5.0 - debug: 4.4.0(supports-color@8.1.1) - local-pkg: 0.4.3 - magic-string: 0.30.17 - pathe: 1.1.2 - picocolors: 1.1.1 - std-env: 3.8.1 - strip-literal: 1.3.0 - tinybench: 2.9.0 - tinypool: 0.7.0 - vite: 4.5.9(@types/node@22.13.9)(terser@5.39.0) - vite-node: 0.34.6(@types/node@22.13.9)(terser@5.39.0) - why-is-node-running: 2.3.0 - transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - - vm-browserify@1.1.2: {} - - w3c-keyname@2.2.8: {} - - wait-on@7.2.0(debug@4.4.0): - dependencies: - axios: 1.8.2(debug@4.4.0) - joi: 17.13.3 - lodash: 4.17.21 - minimist: 1.2.8 - rxjs: 7.8.2 - transitivePeerDependencies: - - debug - - walker@1.0.8: - dependencies: - makeerror: 1.0.12 - - warning@4.0.3: - dependencies: - loose-envify: 1.4.0 - - watchpack@2.4.2: - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - - wcwidth@1.0.1: - dependencies: - defaults: 1.0.4 - - webidl-conversions@3.0.1: {} - - webidl-conversions@4.0.2: {} - - webpack-virtual-modules@0.6.2: {} - - webrtc-adapter@9.0.1: - dependencies: - sdp: 3.2.0 - - websocket-driver@0.7.4: - dependencies: - http-parser-js: 0.5.9 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - - websocket-extensions@0.1.4: {} - - whatwg-encoding@2.0.0: - dependencies: - iconv-lite: 0.6.3 - - whatwg-fetch@3.6.20: - optional: true - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - - which-boxed-primitive@1.1.1: - dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.2 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 - - which-builtin-type@1.2.1: - dependencies: - call-bound: 1.0.4 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.1.1 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 - is-regex: 1.2.1 - is-weakref: 1.1.1 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.18 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.4 - - which-typed-array@1.1.18: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - - which-typed-array@1.1.19: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - - which@1.3.1: - dependencies: - isexe: 2.0.0 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - why-is-node-running@2.3.0: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - - wide-align@1.1.5: - dependencies: - string-width: 4.2.3 - optional: true - - word-wrap@1.2.5: {} - - wordwrap@1.0.0: {} - - workbox-background-sync@7.3.0: - dependencies: - idb: 7.1.1 - workbox-core: 7.3.0 - - workbox-broadcast-update@7.3.0: - dependencies: - workbox-core: 7.3.0 - - workbox-build@7.3.0(@types/babel__core@7.20.5): - dependencies: - '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) - '@babel/core': 7.26.9 - '@babel/preset-env': 7.26.9(@babel/core@7.26.9) - '@babel/runtime': 7.26.9 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.26.9)(@types/babel__core@7.20.5)(rollup@2.79.2) - '@rollup/plugin-node-resolve': 15.3.1(rollup@2.79.2) - '@rollup/plugin-replace': 2.4.2(rollup@2.79.2) - '@rollup/plugin-terser': 0.4.4(rollup@2.79.2) - '@surma/rollup-plugin-off-main-thread': 2.2.3 - ajv: 8.17.1 - common-tags: 1.8.2 - fast-json-stable-stringify: 2.1.0 - fs-extra: 9.1.0 - glob: 7.2.3 - lodash: 4.17.21 - pretty-bytes: 5.6.0 - rollup: 2.79.2 - source-map: 0.8.0-beta.0 - stringify-object: 3.3.0 - strip-comments: 2.0.1 - tempy: 0.6.0 - upath: 1.2.0 - workbox-background-sync: 7.3.0 - workbox-broadcast-update: 7.3.0 - workbox-cacheable-response: 7.3.0 - workbox-core: 7.3.0 - workbox-expiration: 7.3.0 - workbox-google-analytics: 7.3.0 - workbox-navigation-preload: 7.3.0 - workbox-precaching: 7.3.0 - workbox-range-requests: 7.3.0 - workbox-recipes: 7.3.0 - workbox-routing: 7.3.0 - workbox-strategies: 7.3.0 - workbox-streams: 7.3.0 - workbox-sw: 7.3.0 - workbox-window: 7.3.0 - transitivePeerDependencies: - - '@types/babel__core' - - supports-color - - workbox-cacheable-response@7.3.0: - dependencies: - workbox-core: 7.3.0 - - workbox-core@7.3.0: {} - - workbox-expiration@7.3.0: - dependencies: - idb: 7.1.1 - workbox-core: 7.3.0 - - workbox-google-analytics@7.3.0: - dependencies: - workbox-background-sync: 7.3.0 - workbox-core: 7.3.0 - workbox-routing: 7.3.0 - workbox-strategies: 7.3.0 - - workbox-navigation-preload@7.3.0: - dependencies: - workbox-core: 7.3.0 - - workbox-precaching@7.3.0: - dependencies: - workbox-core: 7.3.0 - workbox-routing: 7.3.0 - workbox-strategies: 7.3.0 - - workbox-range-requests@7.3.0: - dependencies: - workbox-core: 7.3.0 - - workbox-recipes@7.3.0: - dependencies: - workbox-cacheable-response: 7.3.0 - workbox-core: 7.3.0 - workbox-expiration: 7.3.0 - workbox-precaching: 7.3.0 - workbox-routing: 7.3.0 - workbox-strategies: 7.3.0 - - workbox-routing@7.3.0: - dependencies: - workbox-core: 7.3.0 - - workbox-strategies@7.3.0: - dependencies: - workbox-core: 7.3.0 - - workbox-streams@7.3.0: - dependencies: - workbox-core: 7.3.0 - workbox-routing: 7.3.0 - - workbox-sw@7.3.0: {} - - workbox-window@7.3.0: - dependencies: - '@types/trusted-types': 2.0.7 - workbox-core: 7.3.0 - - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - optional: true - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - wrappy@1.0.2: {} - - write-file-atomic@2.4.3: - dependencies: - graceful-fs: 4.2.11 - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - - write-file-atomic@4.0.2: - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - - ws@5.2.4: - dependencies: - async-limiter: 1.0.1 - - ws@6.2.3: - dependencies: - async-limiter: 1.0.1 - - ws@7.5.10: - optional: true - - ws@8.17.1: {} - - ws@8.18.1: {} - - xhr@2.6.0: - dependencies: - global: 4.4.0 - is-function: 1.0.2 - parse-headers: 2.0.5 - xtend: 4.0.2 - optional: true - - xml-parse-from-string@1.0.1: - optional: true - - xml2js@0.5.0: - dependencies: - sax: 1.4.1 - xmlbuilder: 11.0.1 - optional: true - - xmlbuilder@11.0.1: - optional: true - - xmlhttprequest-ssl@1.6.3: - optional: true - - xmlhttprequest-ssl@2.1.2: {} - - xtend@4.0.2: {} - - xxhash-wasm@0.4.2: {} - - y18n@5.0.8: {} - - yallist@3.1.1: {} - - yallist@4.0.0: {} - - yaml@1.10.2: {} - - yaml@2.7.0: {} - - yargs-parser@20.2.9: {} - - yargs-parser@21.1.1: {} - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - - yazl@2.5.1: - dependencies: - buffer-crc32: 0.2.13 - - yeast@0.1.2: - optional: true - - yggdrasil@1.7.0(encoding@0.1.13): - dependencies: - node-fetch: 2.7.0(encoding@0.1.13) - uuid: 8.3.2 - transitivePeerDependencies: - - encoding - - yocto-queue@0.1.0: {} - - yocto-queue@1.2.0: {} - - zod@3.24.2: {} - - zustand@3.6.5(react@18.3.1): - optionalDependencies: - react: 18.3.1 - - zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index 5de14962..00000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,4 +0,0 @@ -packages: - - "." - - "renderer" - - "renderer/viewer/sign-renderer/" diff --git a/prismarine-viewer/README.MD b/prismarine-viewer/README.MD deleted file mode 100644 index 7273a338..00000000 --- a/prismarine-viewer/README.MD +++ /dev/null @@ -1,5 +0,0 @@ -# Prismarine Viewer - -Renamed to `renderer`. - -For more info see [CONTRIBUTING.md](../CONTRIBUTING.md). diff --git a/renderer/.npmrc b/renderer/.npmrc deleted file mode 100644 index 3c6e1f1a..00000000 --- a/renderer/.npmrc +++ /dev/null @@ -1,3 +0,0 @@ -public-hoist-pattern=* -shell-emulator=true -package-lock=false diff --git a/renderer/buildMesherConfig.mjs b/renderer/buildMesherConfig.mjs deleted file mode 100644 index 2c867222..00000000 --- a/renderer/buildMesherConfig.mjs +++ /dev/null @@ -1 +0,0 @@ -export const dynamicMcDataFiles = ['blocks', 'blockCollisionShapes', 'biomes', 'version'] diff --git a/renderer/buildMesherWorker.mjs b/renderer/buildMesherWorker.mjs deleted file mode 100644 index d88297a5..00000000 --- a/renderer/buildMesherWorker.mjs +++ /dev/null @@ -1,141 +0,0 @@ -//@ts-check -import { context } from 'esbuild' -import { build } from 'esbuild' -import { polyfillNode } from 'esbuild-plugin-polyfill-node' -import path from 'path' -import { fileURLToPath } from 'url' -import fs from 'fs' -import { dynamicMcDataFiles } from './buildMesherConfig.mjs' -import { mesherSharedPlugins } from '../scripts/esbuildPlugins.mjs' - -const allowedBundleFiles = ['legacy', 'versions', 'protocolVersions', 'features'] - -const __dirname = path.dirname(fileURLToPath(new URL(import.meta.url))) - -const watch = process.argv.includes('-w') - -/** @type {import('esbuild').BuildOptions} */ -const buildOptions = { - bundle: true, - banner: { - js: `globalThis.global = globalThis;process = {env: {}, versions: {} };`, - }, - platform: 'browser', - entryPoints: [path.join(__dirname, './viewer/lib/mesher/mesher.ts')], - minify: !watch, - logLevel: 'info', - drop: !watch ? [ - 'debugger' - ] : [], - sourcemap: 'linked', - target: watch ? undefined : ['ios14'], - write: false, - metafile: true, - outdir: path.join(__dirname, './dist'), - define: { - 'process.env.BROWSER': '"true"', - }, - loader: { - '.png': 'dataurl', - '.obj': 'text' - }, - plugins: [ - ...mesherSharedPlugins, - { - name: 'external-json', - setup(build) { - build.onResolve({ filter: /\.json$/ }, args => { - const fileName = args.path.split('/').pop().replace('.json', '') - if (args.resolveDir.includes('minecraft-data')) { - if (args.path.replaceAll('\\', '/').endsWith('bedrock/common/protocolVersions.json')) { - return - } - if (args.path.includes('bedrock')) { - return { path: args.path, namespace: 'empty-file', } - } - if (dynamicMcDataFiles.includes(fileName)) { - return { - path: args.path, - namespace: 'mc-data', - } - } - if (!allowedBundleFiles.includes(fileName)) { - return { path: args.path, namespace: 'empty-file', } - } - } - }) - build.onResolve({ - filter: /^zlib$/, - }, ({ path }) => { - return { - path, - namespace: 'empty-file', - } - }) - build.onLoad({ - filter: /.*/, - namespace: 'empty-file', - }, () => { - return { contents: 'module.exports = undefined', loader: 'js' } - }) - build.onLoad({ - namespace: 'mc-data', - filter: /.*/, - }, async ({ path }) => { - const fileName = path.split(/[\\\/]/).pop().replace('.json', '') - return { - contents: `module.exports = globalThis.mcData["${fileName}"]`, - loader: 'js', - resolveDir: process.cwd(), - } - }) - build.onResolve({ - filter: /^esbuild-data$/, - }, () => { - return { - path: 'esbuild-data', - namespace: 'esbuild-data', - } - }) - build.onLoad({ - filter: /.*/, - namespace: 'esbuild-data', - }, () => { - const data = { - // todo always use latest - tints: 'require("minecraft-data/minecraft-data/data/pc/1.16.2/tints.json")' - } - return { - contents: `module.exports = {${Object.entries(data).map(([key, code]) => `${key}: ${code}`).join(', ')}}`, - loader: 'js', - resolveDir: process.cwd(), - } - }) - build.onEnd(({ metafile, outputFiles }) => { - if (!metafile) return - fs.mkdirSync(path.join(__dirname, './dist'), { recursive: true }) - fs.writeFileSync(path.join(__dirname, './dist/metafile.json'), JSON.stringify(metafile)) - for (const outDir of ['../dist/', './dist/']) { - for (const outputFile of outputFiles) { - if (outDir === '../dist/' && outputFile.path.endsWith('.map')) { - // skip writing & browser loading sourcemap there, worker debugging should be done in playground - // continue - } - const writePath = path.join(__dirname, outDir, path.basename(outputFile.path)) - fs.mkdirSync(path.dirname(writePath), { recursive: true }) - fs.writeFileSync(writePath, outputFile.text) - } - } - }) - } - }, - polyfillNode(), - ], -} - -if (watch) { - const ctx = await context(buildOptions) - await ctx.watch() -} else { - await build(buildOptions) -} diff --git a/renderer/package.json b/renderer/package.json deleted file mode 100644 index 10049f4f..00000000 --- a/renderer/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "renderer", - "version": "1.25.0", - "description": "Web based viewer", - "main": "index.js", - "scripts": {}, - "author": "PrismarineJS", - "license": "MIT", - "standard": { - "ignore": [ - "examples/electron/", - "examples/exporter/", - "examples/standalone/", - "examples/web_client/" - ] - }, - "dependencies": { - "@tweenjs/tween.js": "^20.0.3", - "assert": "^2.0.0", - "buffer": "^6.0.3", - "filesize": "^10.0.12", - "fs-extra": "^11.0.0", - "lil-gui": "^0.18.2", - "minecraft-wrap": "^1.3.0", - "minecrafthawkeye": "^1.3.6", - "prismarine-block": "^1.7.3", - "prismarine-chunk": "^1.22.0", - "prismarine-schematic": "^1.2.0", - "renderer": "link:./", - "process": "^0.11.10", - "socket.io": "^4.0.0", - "socket.io-client": "^4.0.0", - "three-stdlib": "^2.26.11", - "three.meshline": "^1.3.0", - "tsx": "^4.7.0", - "vec3": "^0.1.7" - }, - "optionalDependencies": { - "canvas": "^2.11.2", - "node-canvas-webgl": "^0.3.0" - }, - "devDependencies": { - "live-server": "^1.2.2" - } -} diff --git a/renderer/playground.html b/renderer/playground.html deleted file mode 100644 index 258426fe..00000000 --- a/renderer/playground.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - Renderer Playground - - - - - -
- - diff --git a/renderer/playground/allEntitiesDebug.ts b/renderer/playground/allEntitiesDebug.ts deleted file mode 100644 index 5bc56ca6..00000000 --- a/renderer/playground/allEntitiesDebug.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { EntityMesh, rendererSpecialHandled, EntityDebugFlags } from '../viewer/three/entity/EntityMesh' - -export const displayEntitiesDebugList = (version: string) => { - // Create results container - const container = document.createElement('div') - container.style.cssText = ` - position: fixed; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - max-height: 90vh; - overflow-y: auto; - background: rgba(0,0,0,0.8); - color: white; - padding: 20px; - border-radius: 8px; - font-family: monospace; - min-width: 400px; - z-index: 1000; - ` - document.body.appendChild(container) - - // Add title - const title = document.createElement('h2') - title.textContent = 'Minecraft Entity Support' - title.style.cssText = 'margin-top: 0; text-align: center;' - container.appendChild(title) - - // Test entities - const results: Array<{ - entity: string; - supported: boolean; - type?: 'obj' | 'bedrock' | 'special'; - mappedFrom?: string; - textureMap?: boolean; - errors?: string[]; - }> = [] - const { mcData } = window - const entityNames = Object.keys(mcData.entitiesArray.reduce((acc, entity) => { - acc[entity.name] = true - return acc - }, {})) - - // Add loading indicator - const loading = document.createElement('div') - loading.textContent = 'Testing entities...' - loading.style.textAlign = 'center' - container.appendChild(loading) - - for (const entity of entityNames) { - const debugFlags: EntityDebugFlags = {} - - if (rendererSpecialHandled.includes(entity)) { - results.push({ - entity, - supported: true, - type: 'special', - }) - continue - } - - try { - - const { mesh: entityMesh } = new EntityMesh(version, entity, undefined, {}, debugFlags) - // find the most distant pos child - window.objects ??= {} - window.objects[entity] = entityMesh - - results.push({ - entity, - supported: !!debugFlags.type || rendererSpecialHandled.includes(entity), - type: debugFlags.type, - mappedFrom: debugFlags.tempMap, - textureMap: debugFlags.textureMap, - errors: debugFlags.errors - }) - } catch (e) { - console.error(e) - results.push({ - entity, - supported: false, - mappedFrom: debugFlags.tempMap - }) - } - } - - // Remove loading indicator - loading.remove() - - const createSection = (title: string, items: any[], filter: (item: any) => boolean) => { - const section = document.createElement('div') - section.style.marginBottom = '20px' - - const sectionTitle = document.createElement('h3') - sectionTitle.textContent = title - sectionTitle.style.textAlign = 'center' - section.appendChild(sectionTitle) - - const list = document.createElement('ul') - list.style.cssText = 'padding-left: 20px; list-style-type: none; margin: 0;' - - const filteredItems = items.filter(filter) - for (const item of filteredItems) { - const listItem = document.createElement('li') - listItem.style.cssText = 'line-height: 1.4; margin: 8px 0;' - - const entityName = document.createElement('strong') - entityName.style.cssText = 'user-select: text;-webkit-user-select: text;' - entityName.textContent = item.entity - listItem.appendChild(entityName) - - let text = '' - if (item.mappedFrom) { - text += ` -> ${item.mappedFrom}` - } - if (item.type) { - text += ` - ${item.type}` - } - if (item.textureMap) { - text += ' ⚠️' - } - if (item.errors) { - text += ' ❌' - } - - listItem.appendChild(document.createTextNode(text)) - list.appendChild(listItem) - } - - section.appendChild(list) - return { section, count: filteredItems.length } - } - - // Sort results - bedrock first - results.sort((a, b) => { - if (a.type === 'bedrock' && b.type !== 'bedrock') return -1 - if (a.type !== 'bedrock' && b.type === 'bedrock') return 1 - return a.entity.localeCompare(b.entity) - }) - - // Add sections - const sections = [ - { - title: '❌ Unsupported Entities', - filter: (r: any) => !r.supported && !r.mappedFrom - }, - { - title: '⚠️ Partially Supported Entities', - filter: (r: any) => r.mappedFrom - }, - { - title: '✅ Supported Entities', - filter: (r: any) => r.supported && !r.mappedFrom - } - ] - - for (const { title, filter } of sections) { - const { section, count } = createSection(title, results, filter) - if (count > 0) { - container.appendChild(section) - } - } - - // log object with errors per entity - const errors = results.filter(r => r.errors).map(r => ({ - entity: r.entity, - errors: r.errors - })) - console.log(errors) -} diff --git a/renderer/playground/baseScene.ts b/renderer/playground/baseScene.ts deleted file mode 100644 index b9e7791d..00000000 --- a/renderer/playground/baseScene.ts +++ /dev/null @@ -1,414 +0,0 @@ -//@ts-nocheck -import { Vec3 } from 'vec3' -import * as THREE from 'three' -import '../../src/getCollisionShapes' -import { IndexedData } from 'minecraft-data' -import BlockLoader from 'prismarine-block' -import blockstatesModels from 'mc-assets/dist/blockStatesModels.json' -import ChunkLoader from 'prismarine-chunk' -import WorldLoader from 'prismarine-world' - -//@ts-expect-error -import { OrbitControls } from 'three/addons/controls/OrbitControls.js' -// eslint-disable-next-line import/no-named-as-default -import GUI from 'lil-gui' -import _ from 'lodash' -import { toMajorVersion } from '../../src/utils' -import { WorldDataEmitter } from '../viewer' -import { Viewer } from '../viewer/lib/viewer' -import { BlockNames } from '../../src/mcDataTypes' -import { initWithRenderer, statsEnd, statsStart } from '../../src/topRightStats' -import { defaultWorldRendererConfig } from '../viewer/lib/worldrendererCommon' -import { getSyncWorld } from './shared' - -window.THREE = THREE - -export class BasePlaygroundScene { - continuousRender = false - stopRender = false - guiParams = {} - viewDistance = 0 - targetPos = new Vec3(2, 90, 2) - params = {} as Record - paramOptions = {} as Partial> - version = new URLSearchParams(window.location.search).get('version') || globalThis.includedVersions.at(-1) - Chunk: typeof import('prismarine-chunk/types/index').PCChunk - Block: typeof import('prismarine-block').Block - ignoreResize = false - enableCameraControls = true // not finished - enableCameraOrbitControl = true - gui = new GUI() - onParamUpdate = {} as Record void> - alwaysIgnoreQs = [] as string[] - skipUpdateQs = false - controls: any - windowHidden = false - world: ReturnType - - _worldConfig = defaultWorldRendererConfig - get worldConfig () { - return this._worldConfig - } - set worldConfig (value) { - this._worldConfig = value - viewer.world.config = value - } - - constructor () { - void this.initData().then(() => { - this.addKeyboardShortcuts() - }) - } - - onParamsUpdate (paramName: string, object: any) {} - updateQs (paramName: string, valueSet: any) { - if (this.skipUpdateQs) return - const newQs = new URLSearchParams(window.location.search) - // if (oldQs.get('scene')) { - // newQs.set('scene', oldQs.get('scene')!) - // } - for (const [key, value] of Object.entries({ [paramName]: valueSet })) { - if (typeof value === 'function' || this.params.skipQs?.includes(key) || this.alwaysIgnoreQs.includes(key)) continue - if (value) { - newQs.set(key, value) - } else { - newQs.delete(key) - } - } - window.history.replaceState({}, '', `${window.location.pathname}?${newQs.toString()}`) - } - - // async initialSetup () {} - renderFinish () { - this.render() - } - - initGui () { - const qs = new URLSearchParams(window.location.search) - for (const key of Object.keys(this.params)) { - const value = qs.get(key) - if (!value) continue - const parsed = /^-?\d+$/.test(value) ? Number(value) : value === 'true' ? true : value === 'false' ? false : value - this.params[key] = parsed - } - - for (const param of Object.keys(this.params)) { - const option = this.paramOptions[param] - if (option?.hide) continue - this.gui.add(this.params, param, option?.options ?? option?.min, option?.max) - } - if (window.innerHeight < 700) { - this.gui.open(false) - } else { - // const observer = new MutationObserver(() => { - // this.gui.domElement.classList.remove('transition') - // }) - // observer.observe(this.gui.domElement, { - // attributes: true, - // attributeFilter: ['class'], - // }) - setTimeout(() => { - this.gui.domElement.classList.remove('transition') - }, 500) - } - - this.gui.onChange(({ property, object }) => { - if (object === this.params) { - this.onParamUpdate[property]?.() - this.onParamsUpdate(property, object) - const value = this.params[property] - if (this.paramOptions[property]?.reloadOnChange && (typeof value === 'boolean' || this.paramOptions[property].options)) { - setTimeout(() => { - window.location.reload() - }) - } - this.updateQs(property, value) - } else { - this.onParamsUpdate(property, object) - } - }) - } - - // mainChunk: import('prismarine-chunk/types/index').PCChunk - - // overridables - setupWorld () { } - sceneReset () {} - - // eslint-disable-next-line max-params - addWorldBlock (xOffset: number, yOffset: number, zOffset: number, blockName: BlockNames, properties?: Record) { - if (xOffset > 16 || yOffset > 16 || zOffset > 16) throw new Error('Offset too big') - const block = - properties ? - this.Block.fromProperties(loadedData.blocksByName[blockName].id, properties ?? {}, 0) : - this.Block.fromStateId(loadedData.blocksByName[blockName].defaultState, 0) - this.world.setBlock(this.targetPos.offset(xOffset, yOffset, zOffset), block) - } - - resetCamera () { - const { targetPos } = this - this.controls?.target.set(targetPos.x + 0.5, targetPos.y + 0.5, targetPos.z + 0.5) - - const cameraPos = targetPos.offset(2, 2, 2) - const pitch = THREE.MathUtils.degToRad(-45) - const yaw = THREE.MathUtils.degToRad(45) - viewer.camera.rotation.set(pitch, yaw, 0, 'ZYX') - viewer.camera.lookAt(targetPos.x + 0.5, targetPos.y + 0.5, targetPos.z + 0.5) - viewer.camera.position.set(cameraPos.x + 0.5, cameraPos.y + 0.5, cameraPos.z + 0.5) - this.controls?.update() - } - - async initData () { - await window._LOAD_MC_DATA() - const mcData: IndexedData = require('minecraft-data')(this.version) - window.loadedData = window.mcData = mcData - - this.Chunk = (ChunkLoader as any)(this.version) - this.Block = (BlockLoader as any)(this.version) - - const world = getSyncWorld(this.version) - world.setBlockStateId(this.targetPos, 0) - this.world = world - - this.initGui() - - const worldView = new WorldDataEmitter(world, this.viewDistance, this.targetPos) - worldView.addWaitTime = 0 - window.worldView = worldView - - // Create three.js context, add to page - const renderer = new THREE.WebGLRenderer({ alpha: true, ...localStorage['renderer'] }) - renderer.setPixelRatio(window.devicePixelRatio || 1) - renderer.setSize(window.innerWidth, window.innerHeight) - - // Create viewer - const viewer = new Viewer(renderer, this.worldConfig) - window.viewer = viewer - window.world = window.viewer.world - const isWebgpu = false - const promises = [] as Array> - if (isWebgpu) { - // promises.push(initWebgpuRenderer(() => { }, true, true)) // todo - } else { - initWithRenderer(renderer.domElement) - renderer.domElement.id = 'viewer-canvas' - document.body.appendChild(renderer.domElement) - } - viewer.addChunksBatchWaitTime = 0 - viewer.world.blockstatesModels = blockstatesModels - viewer.entities.setDebugMode('basic') - viewer.setVersion(this.version) - viewer.entities.onSkinUpdate = () => { - viewer.render() - } - viewer.world.mesherConfig.enableLighting = false - await Promise.all(promises) - this.setupWorld() - - viewer.connect(worldView) - - await worldView.init(this.targetPos) - - if (this.enableCameraControls) { - const { targetPos } = this - const canvas = document.querySelector('#viewer-canvas') - const controls = this.enableCameraOrbitControl ? new OrbitControls(viewer.camera, canvas) : undefined - this.controls = controls - - this.resetCamera() - - // #region camera rotation param - const cameraSet = this.params.camera || localStorage.camera - if (cameraSet) { - const [x, y, z, rx, ry] = cameraSet.split(',').map(Number) - viewer.camera.position.set(x, y, z) - viewer.camera.rotation.set(rx, ry, 0, 'ZYX') - this.controls?.update() - } - const throttledCamQsUpdate = _.throttle(() => { - const { camera } = viewer - // params.camera = `${camera.rotation.x.toFixed(2)},${camera.rotation.y.toFixed(2)}` - // this.updateQs() - localStorage.camera = [ - camera.position.x.toFixed(2), - camera.position.y.toFixed(2), - camera.position.z.toFixed(2), - camera.rotation.x.toFixed(2), - camera.rotation.y.toFixed(2), - ].join(',') - }, 200) - if (this.controls) { - this.controls.addEventListener('change', () => { - throttledCamQsUpdate() - this.render() - }) - } else { - setInterval(() => { - throttledCamQsUpdate() - }, 200) - } - // #endregion - } - - if (!this.enableCameraOrbitControl) { - // mouse - let mouseMoveCounter = 0 - const mouseMove = (e: PointerEvent) => { - if ((e.target as HTMLElement).closest('.lil-gui')) return - if (e.buttons === 1 || e.pointerType === 'touch') { - mouseMoveCounter++ - viewer.camera.rotation.x -= e.movementY / 100 - //viewer.camera. - viewer.camera.rotation.y -= e.movementX / 100 - if (viewer.camera.rotation.x < -Math.PI / 2) viewer.camera.rotation.x = -Math.PI / 2 - if (viewer.camera.rotation.x > Math.PI / 2) viewer.camera.rotation.x = Math.PI / 2 - - // yaw += e.movementY / 20; - // pitch += e.movementX / 20; - } - if (e.buttons === 2) { - viewer.camera.position.set(0, 0, 0) - } - } - setInterval(() => { - // updateTextEvent(`Mouse Events: ${mouseMoveCounter}`) - mouseMoveCounter = 0 - }, 1000) - window.addEventListener('pointermove', mouseMove) - } - - // await this.initialSetup() - this.onResize() - window.addEventListener('resize', () => this.onResize()) - void viewer.waitForChunksToRender().then(async () => { - this.renderFinish() - }) - - viewer.world.renderUpdateEmitter.addListener('update', () => { - this.render() - }) - - this.loop() - } - - loop () { - if (this.continuousRender && !this.windowHidden) { - this.render(true) - requestAnimationFrame(() => this.loop()) - } - } - - render (fromLoop = false) { - if (!fromLoop && this.continuousRender) return - if (this.stopRender) return - statsStart() - viewer.render() - statsEnd() - } - - addKeyboardShortcuts () { - document.addEventListener('keydown', (e) => { - if (!e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey) { - if (e.code === 'KeyR') { - this.controls?.reset() - this.resetCamera() - } - if (e.code === 'KeyE') { // refresh block (main) - worldView!.setBlockStateId(this.targetPos, this.world.getBlockStateId(this.targetPos)) - } - if (e.code === 'KeyF') { // reload all chunks - this.sceneReset() - worldView!.unloadAllChunks() - void worldView!.init(this.targetPos) - } - } - }) - document.addEventListener('visibilitychange', () => { - this.windowHidden = document.visibilityState === 'hidden' - }) - document.addEventListener('blur', () => { - this.windowHidden = true - }) - document.addEventListener('focus', () => { - this.windowHidden = false - }) - - const updateKeys = () => { - if (pressedKeys.has('ControlLeft') || pressedKeys.has('MetaLeft')) { - return - } - // if (typeof viewer === 'undefined') return - // Create a vector that points in the direction the camera is looking - const direction = new THREE.Vector3(0, 0, 0) - if (pressedKeys.has('KeyW')) { - direction.z = -0.5 - } - if (pressedKeys.has('KeyS')) { - direction.z += 0.5 - } - if (pressedKeys.has('KeyA')) { - direction.x -= 0.5 - } - if (pressedKeys.has('KeyD')) { - direction.x += 0.5 - } - - - if (pressedKeys.has('ShiftLeft')) { - viewer.camera.position.y -= 0.5 - } - if (pressedKeys.has('Space')) { - viewer.camera.position.y += 0.5 - } - direction.applyQuaternion(viewer.camera.quaternion) - direction.y = 0 - - if (pressedKeys.has('ShiftLeft')) { - direction.y *= 2 - direction.x *= 2 - direction.z *= 2 - } - // Add the vector to the camera's position to move the camera - viewer.camera.position.add(direction.normalize()) - this.controls?.update() - this.render() - } - setInterval(updateKeys, 1000 / 30) - - const pressedKeys = new Set() - const keys = (e) => { - const { code } = e - const pressed = e.type === 'keydown' - if (pressed) { - pressedKeys.add(code) - } else { - pressedKeys.delete(code) - } - } - - window.addEventListener('keydown', keys) - window.addEventListener('keyup', keys) - window.addEventListener('blur', (e) => { - for (const key of pressedKeys) { - keys(new KeyboardEvent('keyup', { code: key })) - } - }) - } - - onResize () { - if (this.ignoreResize) return - - const { camera, renderer } = viewer - viewer.camera.aspect = window.innerWidth / window.innerHeight - viewer.camera.updateProjectionMatrix() - renderer.setSize(window.innerWidth, window.innerHeight) - - this.render() - } -} diff --git a/renderer/playground/playground.ts b/renderer/playground/playground.ts deleted file mode 100644 index de201d8f..00000000 --- a/renderer/playground/playground.ts +++ /dev/null @@ -1,12 +0,0 @@ -if (!new URL(location.href).searchParams.get('playground')) location.href = '/?playground=true' -// import { BasePlaygroundScene } from './baseScene' -// import { playgroundGlobalUiState } from './playgroundUi' -// import * as scenes from './scenes' - -// const qsScene = new URLSearchParams(window.location.search).get('scene') -// const Scene: typeof BasePlaygroundScene = qsScene ? scenes[qsScene] : scenes.main -// playgroundGlobalUiState.scenes = ['main', 'railsCobweb', 'floorRandom', 'lightingStarfield', 'transparencyIssue', 'entities', 'frequentUpdates', 'slabsOptimization', 'allEntities'] -// playgroundGlobalUiState.selected = qsScene ?? 'main' - -// const scene = new Scene() -// globalThis.scene = scene diff --git a/renderer/playground/playgroundUi.tsx b/renderer/playground/playgroundUi.tsx deleted file mode 100644 index ed183d78..00000000 --- a/renderer/playground/playgroundUi.tsx +++ /dev/null @@ -1,175 +0,0 @@ -import { renderToDom } from '@zardoy/react-util' -import { useEffect } from 'react' -import { proxy, useSnapshot } from 'valtio' -import { LeftTouchArea, RightTouchArea, useInterfaceState } from '@dimaka/interface' -import { css } from '@emotion/css' -import { Vec3 } from 'vec3' -import useLongPress from '../../src/react/useLongPress' -import { isMobile } from '../viewer/lib/simpleUtils' - -export const playgroundGlobalUiState = proxy({ - scenes: [] as string[], - selected: '', - selectorOpened: false, - actions: {} as Record void>, -}) - -renderToDom() - -function Playground () { - useEffect(() => { - const style = document.createElement('style') - style.innerHTML = /* css */ ` - .lil-gui { - top: 60px !important; - right: 0 !important; - } - ` - document.body.appendChild(style) - return () => { - style.remove() - } - }, []) - - return
- - - -
-} - -function SceneSelector () { - const mobile = isMobile() - const { scenes, selected } = useSnapshot(playgroundGlobalUiState) - const longPressEvents = useLongPress(() => { - playgroundGlobalUiState.selectorOpened = true - }, () => { }) - - return
- {scenes.map(scene =>
{ - const qs = new URLSearchParams(window.location.search) - qs.set('scene', scene) - location.search = qs.toString() - }} - >{scene}
)} -
-} - -const ActionsSelector = () => { - const { actions, selectorOpened } = useSnapshot(playgroundGlobalUiState) - - if (!selectorOpened) return null - return
{Object.entries({ - ...actions, - 'Close' () { - playgroundGlobalUiState.selectorOpened = false - } - }).map(([name, action]) =>
{ - action() - playgroundGlobalUiState.selectorOpened = false - }} - >{name}
)}
-} - -const Controls = () => { - // todo setting - const usingTouch = navigator.maxTouchPoints > 0 - - useEffect(() => { - window.addEventListener('touchstart', (e) => { - e.preventDefault() - }) - - const pressedKeys = new Set() - useInterfaceState.setState({ - isFlying: false, - uiCustomization: { - touchButtonSize: 40, - }, - updateCoord ([coord, state]) { - const vec3 = new Vec3(0, 0, 0) - vec3[coord] = state - let key: string | undefined - if (vec3.z < 0) key = 'KeyW' - if (vec3.z > 0) key = 'KeyS' - if (vec3.y > 0) key = 'Space' - if (vec3.y < 0) key = 'ShiftLeft' - if (vec3.x < 0) key = 'KeyA' - if (vec3.x > 0) key = 'KeyD' - if (key) { - if (!pressedKeys.has(key)) { - pressedKeys.add(key) - window.dispatchEvent(new KeyboardEvent('keydown', { code: key })) - } - } - for (const k of pressedKeys) { - if (k !== key) { - window.dispatchEvent(new KeyboardEvent('keyup', { code: k })) - pressedKeys.delete(k) - } - } - } - }) - }, []) - - if (!usingTouch) return null - return ( -
div { - pointer-events: auto; - } - `} - > - -
- -
- ) -} diff --git a/renderer/playground/scenes/allEntities.ts b/renderer/playground/scenes/allEntities.ts deleted file mode 100644 index 281af807..00000000 --- a/renderer/playground/scenes/allEntities.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { BasePlaygroundScene } from '../baseScene' -import { EntityDebugFlags, EntityMesh, rendererSpecialHandled } from '../../viewer/three/entity/EntityMesh' -import { displayEntitiesDebugList } from '../allEntitiesDebug' - -export default class AllEntities extends BasePlaygroundScene { - continuousRender = false - enableCameraControls = false - - async initData () { - await super.initData() - displayEntitiesDebugList(this.version) - } -} diff --git a/renderer/playground/scenes/entities.ts b/renderer/playground/scenes/entities.ts deleted file mode 100644 index 5b5d0582..00000000 --- a/renderer/playground/scenes/entities.ts +++ /dev/null @@ -1,37 +0,0 @@ -//@ts-nocheck -import * as THREE from 'three' -import { Vec3 } from 'vec3' -import { BasePlaygroundScene } from '../baseScene' -import { WorldRendererThree } from '../../viewer/three/worldrendererThree' - -export default class extends BasePlaygroundScene { - continuousRender = true - - override initGui (): void { - this.params = { - starfield: false, - entity: 'player', - count: 4 - } - } - - override renderFinish (): void { - if (this.params.starfield) { - ;(viewer.world as WorldRendererThree).scene.background = new THREE.Color(0x00_00_00) - ;(viewer.world as WorldRendererThree).starField.enabled = true - ;(viewer.world as WorldRendererThree).starField.addToScene() - } - - for (let i = 0; i < this.params.count; i++) { - for (let j = 0; j < this.params.count; j++) { - for (let k = 0; k < this.params.count; k++) { - viewer.entities.update({ - id: i * 1000 + j * 100 + k, - name: this.params.entity, - pos: this.targetPos.offset(i, j, k) - } as any, {}) - } - } - } - } -} diff --git a/renderer/playground/scenes/floorRandom.ts b/renderer/playground/scenes/floorRandom.ts deleted file mode 100644 index c6d2ccf1..00000000 --- a/renderer/playground/scenes/floorRandom.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { BasePlaygroundScene } from '../baseScene' - -export default class RailsCobwebScene extends BasePlaygroundScene { - viewDistance = 5 - continuousRender = true - - override initGui (): void { - this.params = { - squareSize: 50 - } - - super.initGui() - } - - setupWorld () { - const squareSize = this.params.squareSize ?? 30 - const maxSquareSize = this.viewDistance * 16 * 2 - if (squareSize > maxSquareSize) throw new Error(`Square size too big, max is ${maxSquareSize}`) - // const fullBlocks = loadedData.blocksArray.map(x => x.name) - const fullBlocks = loadedData.blocksArray.filter(block => { - const b = this.Block.fromStateId(block.defaultState, 0) - if (b.shapes?.length !== 1) return false - const shape = b.shapes[0] - return shape[0] === 0 && shape[1] === 0 && shape[2] === 0 && shape[3] === 1 && shape[4] === 1 && shape[5] === 1 - }) - for (let x = -squareSize; x <= squareSize; x++) { - for (let z = -squareSize; z <= squareSize; z++) { - const i = Math.abs(x + z) * squareSize - worldView!.world.setBlock(this.targetPos.offset(x, 0, z), this.Block.fromStateId(fullBlocks[i % fullBlocks.length].defaultState, 0)) - } - } - } -} diff --git a/renderer/playground/scenes/frequentUpdates.ts b/renderer/playground/scenes/frequentUpdates.ts deleted file mode 100644 index caaf7207..00000000 --- a/renderer/playground/scenes/frequentUpdates.ts +++ /dev/null @@ -1,148 +0,0 @@ -//@ts-nocheck -import { Vec3 } from 'vec3' -import { BasePlaygroundScene } from '../baseScene' - -export default class extends BasePlaygroundScene { - viewDistance = 5 - continuousRender = true - - override initGui (): void { - this.params = { - testActive: false, - testUpdatesPerSecond: 10, - testInitialUpdate: false, - stopGeometryUpdate: false, - manualTest: () => { - this.updateBlock() - }, - testNeighborUpdates: () => { - this.testNeighborUpdates() - } - } - - super.initGui() - } - - lastUpdatedOffset = 0 - lastUpdatedId = 2 - updateBlock () { - const x = this.lastUpdatedOffset % 16 - const z = Math.floor(this.lastUpdatedOffset / 16) - const y = 90 - worldView!.setBlockStateId(new Vec3(x, y, z), this.lastUpdatedId++) - this.lastUpdatedOffset++ - if (this.lastUpdatedOffset > 16 * 16) this.lastUpdatedOffset = 0 - if (this.lastUpdatedId > 500) this.lastUpdatedId = 1 - } - - testNeighborUpdates () { - viewer.world.setBlockStateId(new Vec3(15, 95, 15), 1) - viewer.world.setBlockStateId(new Vec3(0, 95, 15), 1) - viewer.world.setBlockStateId(new Vec3(15, 95, 0), 1) - viewer.world.setBlockStateId(new Vec3(0, 95, 0), 1) - - viewer.world.setBlockStateId(new Vec3(16, 95, 15), 1) - viewer.world.setBlockStateId(new Vec3(-1, 95, 15), 1) - viewer.world.setBlockStateId(new Vec3(15, 95, -1), 1) - viewer.world.setBlockStateId(new Vec3(-1, 95, 0), 1) - setTimeout(() => { - viewer.world.setBlockStateId(new Vec3(16, 96, 16), 1) - viewer.world.setBlockStateId(new Vec3(-1, 96, 16), 1) - viewer.world.setBlockStateId(new Vec3(16, 96, -1), 1) - viewer.world.setBlockStateId(new Vec3(-1, 96, -1), 1) - }, 3000) - } - - setupTimer () { - // this.stopRender = true - - let lastTime = 0 - const tick = () => { - viewer.world.debugStopGeometryUpdate = this.params.stopGeometryUpdate - const updateEach = 1000 / this.params.testUpdatesPerSecond - requestAnimationFrame(tick) - if (!this.params.testActive) return - const updateCount = Math.floor(performance.now() - lastTime) / updateEach - for (let i = 0; i < updateCount; i++) { - this.updateBlock() - } - lastTime = performance.now() - } - - requestAnimationFrame(tick) - - // const limit = 1000 - // const limit = 100 - // const limit = 1 - // const updatedChunks = new Set() - // const updatedBlocks = new Set() - // let lastSecond = 0 - // setInterval(() => { - // const second = Math.floor(performance.now() / 1000) - // if (lastSecond !== second) { - // lastSecond = second - // updatedChunks.clear() - // updatedBlocks.clear() - // } - // const isEven = second % 2 === 0 - // if (updatedBlocks.size > limit) { - // return - // } - // const changeBlock = (x, z) => { - // const chunkKey = `${Math.floor(x / 16)},${Math.floor(z / 16)}` - // const key = `${x},${z}` - // if (updatedBlocks.has(chunkKey)) return - - // updatedChunks.add(chunkKey) - // worldView!.world.setBlock(this.targetPos.offset(x, 0, z), this.Block.fromStateId(isEven ? 2 : 3, 0)) - // updatedBlocks.add(key) - // } - // const { squareSize } = this.params - // const xStart = -squareSize - // const zStart = -squareSize - // const xEnd = squareSize - // const zEnd = squareSize - // for (let x = xStart; x <= xEnd; x += 16) { - // for (let z = zStart; z <= zEnd; z += 16) { - // const key = `${x},${z}` - // if (updatedChunks.has(key)) continue - // changeBlock(x, z) - // return - // } - // } - // for (let x = xStart; x <= xEnd; x += 16) { - // for (let z = zStart; z <= zEnd; z += 16) { - // const key = `${x},${z}` - // if (updatedChunks.has(key)) continue - // changeBlock(x, z) - // return - // } - // } - // }, 1) - } - - setupWorld () { - this.worldConfig.showChunkBorders = true - - const maxSquareRadius = this.viewDistance * 16 - // const fullBlocks = loadedData.blocksArray.map(x => x.name) - const squareSize = maxSquareRadius - for (let x = -squareSize; x <= squareSize; x++) { - for (let z = -squareSize; z <= squareSize; z++) { - const i = Math.abs(x + z) * squareSize - worldView!.world.setBlock(this.targetPos.offset(x, 0, z), this.Block.fromStateId(1, 0)) - } - } - let done = false - viewer.world.renderUpdateEmitter.on('update', () => { - if (!viewer.world.allChunksFinished || done) return - done = true - this.setupTimer() - }) - setTimeout(() => { - if (this.params.testInitialUpdate) { - this.updateBlock() - } - }) - } -} diff --git a/renderer/playground/scenes/index.ts b/renderer/playground/scenes/index.ts deleted file mode 100644 index bf881812..00000000 --- a/renderer/playground/scenes/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -// export { default as rotation } from './rotation' -export { default as main } from './main' -export { default as railsCobweb } from './railsCobweb' -export { default as floorRandom } from './floorRandom' -export { default as lightingStarfield } from './lightingStarfield' -export { default as transparencyIssue } from './transparencyIssue' -export { default as rotationIssue } from './rotationIssue' -export { default as entities } from './entities' -export { default as frequentUpdates } from './frequentUpdates' -export { default as slabsOptimization } from './slabsOptimization' -export { default as allEntities } from './allEntities' diff --git a/renderer/playground/scenes/lightingStarfield.ts b/renderer/playground/scenes/lightingStarfield.ts deleted file mode 100644 index eec0a7d3..00000000 --- a/renderer/playground/scenes/lightingStarfield.ts +++ /dev/null @@ -1,40 +0,0 @@ -//@ts-nocheck -import * as THREE from 'three' -import { Vec3 } from 'vec3' -import { BasePlaygroundScene } from '../baseScene' -import { WorldRendererThree } from '../../viewer/three/worldrendererThree' - -export default class extends BasePlaygroundScene { - continuousRender = true - - override setupWorld (): void { - viewer.world.mesherConfig.enableLighting = true - viewer.world.mesherConfig.skyLight = 0 - this.addWorldBlock(0, 0, 0, 'stone') - this.addWorldBlock(0, 0, 1, 'stone') - this.addWorldBlock(1, 0, 0, 'stone') - this.addWorldBlock(1, 0, 1, 'stone') - // chess like - worldView?.world.setBlockLight(this.targetPos.offset(0, 1, 0), 15) - worldView?.world.setBlockLight(this.targetPos.offset(0, 1, 1), 0) - worldView?.world.setBlockLight(this.targetPos.offset(1, 1, 0), 0) - worldView?.world.setBlockLight(this.targetPos.offset(1, 1, 1), 15) - } - - override renderFinish (): void { - viewer.scene.background = new THREE.Color(0x00_00_00) - // starfield and test entities - ;(viewer.world as WorldRendererThree).starField.enabled = true - ;(viewer.world as WorldRendererThree).starField.addToScene() - viewer.entities.update({ - id: 0, - name: 'player', - pos: this.targetPos.clone() - } as any, {}) - viewer.entities.update({ - id: 1, - name: 'creeper', - pos: this.targetPos.offset(1, 0, 0) - } as any, {}) - } -} diff --git a/renderer/playground/scenes/main.ts b/renderer/playground/scenes/main.ts deleted file mode 100644 index 64925f61..00000000 --- a/renderer/playground/scenes/main.ts +++ /dev/null @@ -1,314 +0,0 @@ -//@ts-nocheck -// eslint-disable-next-line import/no-named-as-default -import GUI, { Controller } from 'lil-gui' -import * as THREE from 'three' -import JSZip from 'jszip' -import { BasePlaygroundScene } from '../baseScene' -import { TWEEN_DURATION } from '../../viewer/three/entities' -import { EntityMesh } from '../../viewer/three/entity/EntityMesh' - -class MainScene extends BasePlaygroundScene { - // eslint-disable-next-line @typescript-eslint/no-useless-constructor - constructor (...args) { - //@ts-expect-error - super(...args) - } - - override initGui (): void { - // initial values - this.params = { - version: globalThis.includedVersions.at(-1), - skipQs: '', - block: '', - metadata: 0, - supportBlock: false, - entity: '', - removeEntity () { - this.entity = '' - }, - entityRotate: false, - camera: '', - playSound () { }, - blockIsomorphicRenderBundle () { }, - modelVariant: 0 - } - this.metadataGui = this.gui.add(this.params, 'metadata') - this.paramOptions = { - version: { - options: globalThis.includedVersions, - hide: false - }, - block: { - options: mcData.blocksArray.map(b => b.name).sort((a, b) => a.localeCompare(b)) - }, - entity: { - options: mcData.entitiesArray.map(b => b.name).sort((a, b) => a.localeCompare(b)) - }, - camera: { - hide: true, - } - } - super.initGui() - } - - blockProps = {} - metadataFolder: GUI | undefined - metadataGui: Controller - - override onParamUpdate = { - version () { - // if (initialUpdate) return - // viewer.world.texturesVersion = params.version - // viewer.world.updateTexturesData() - // todo warning - }, - block: () => { - this.blockProps = {} - this.metadataFolder?.destroy() - const block = mcData.blocksByName[this.params.block] - if (!block) return - console.log('block', block.name) - const props = new this.Block(block.id, 0, 0).getProperties() - const { states } = mcData.blocksByStateId[this.getBlock()?.minStateId] ?? {} - this.metadataFolder = this.gui.addFolder('metadata') - if (states) { - for (const state of states) { - let defaultValue: string | number | boolean - if (state.values) { // int, enum - defaultValue = state.values[0] - } else { - switch (state.type) { - case 'bool': - defaultValue = false - break - case 'int': - defaultValue = 0 - break - case 'direction': - defaultValue = 'north' - break - - default: - continue - } - } - this.blockProps[state.name] = defaultValue - if (state.values) { - this.metadataFolder.add(this.blockProps, state.name, state.values) - } else { - this.metadataFolder.add(this.blockProps, state.name) - } - } - } else { - for (const [name, value] of Object.entries(props)) { - this.blockProps[name] = value - this.metadataFolder.add(this.blockProps, name) - } - } - console.log('props', this.blockProps) - this.metadataFolder.open() - }, - entity: () => { - this.continuousRender = this.params.entity === 'player' - this.entityUpdateShared() - if (!this.params.entity) return - if (this.params.entity === 'player') { - viewer.entities.updatePlayerSkin('id', viewer.entities.entities.id.username, undefined, true, true) - viewer.entities.playAnimation('id', 'running') - } - // let prev = false - // setInterval(() => { - // viewer.entities.playAnimation('id', prev ? 'running' : 'idle') - // prev = !prev - // }, 1000) - - EntityMesh.getStaticData(this.params.entity) - // entityRotationFolder.destroy() - // entityRotationFolder = gui.addFolder('entity metadata') - // entityRotationFolder.add(params, 'entityRotate') - // entityRotationFolder.open() - }, - supportBlock: () => { - viewer.setBlockStateId(this.targetPos.offset(0, -1, 0), this.params.supportBlock ? 1 : 0) - }, - modelVariant: () => { - viewer.world.mesherConfig.debugModelVariant = this.params.modelVariant === 0 ? undefined : [this.params.modelVariant] - } - } - - entityUpdateShared () { - viewer.entities.clear() - if (!this.params.entity) return - worldView!.emit('entity', { - id: 'id', name: this.params.entity, pos: this.targetPos.offset(0.5, 1, 0.5), width: 1, height: 1, username: localStorage.testUsername, yaw: Math.PI, pitch: 0 - }) - const enableSkeletonDebug = (obj) => { - const { children, isSkeletonHelper } = obj - if (!Array.isArray(children)) return - if (isSkeletonHelper) { - obj.visible = true - return - } - for (const child of children) { - if (typeof child === 'object') enableSkeletonDebug(child) - } - } - enableSkeletonDebug(viewer.entities.entities['id']) - setTimeout(() => { - viewer.render() - }, TWEEN_DURATION) - } - - blockIsomorphicRenderBundle () { - const { renderer } = viewer - - const canvas = renderer.domElement - const onlyCurrent = !confirm('Ok - render all blocks, Cancel - render only current one') - const sizeRaw = prompt('Size', '512') - if (!sizeRaw) return - const size = parseInt(sizeRaw, 10) - // const size = 512 - - this.ignoreResize = true - canvas.width = size - canvas.height = size - renderer.setSize(size, size) - - viewer.camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 10) - viewer.scene.background = null - - const rad = THREE.MathUtils.degToRad(-120) - viewer.directionalLight.position.set( - Math.cos(rad), - Math.sin(rad), - 0.2 - ).normalize() - viewer.directionalLight.intensity = 1 - - const cameraPos = this.targetPos.offset(2, 2, 2) - const pitch = THREE.MathUtils.degToRad(-30) - const yaw = THREE.MathUtils.degToRad(45) - viewer.camera.rotation.set(pitch, yaw, 0, 'ZYX') - // viewer.camera.lookAt(center.x + 0.5, center.y + 0.5, center.z + 0.5) - viewer.camera.position.set(cameraPos.x + 1, cameraPos.y + 0.5, cameraPos.z + 1) - - const allBlocks = mcData.blocksArray.map(b => b.name) - // const allBlocks = ['stone', 'warped_slab'] - - let blockCount = 1 - let blockName = allBlocks[0] - - const updateBlock = () => { - // viewer.setBlockStateId(targetPos, mcData.blocksByName[blockName].minStateId) - this.params.block = blockName - // todo cleanup (introduce getDefaultState) - // TODO - // onUpdate.block() - // applyChanges(false, true) - } - void viewer.waitForChunksToRender().then(async () => { - // wait for next macro task - await new Promise(resolve => { - setTimeout(resolve, 0) - }) - if (onlyCurrent) { - viewer.render() - onWorldUpdate() - } else { - // will be called on every render update - viewer.world.renderUpdateEmitter.addListener('update', onWorldUpdate) - updateBlock() - } - }) - - const zip = new JSZip() - zip.file('description.txt', 'Generated with mcraft.fun/playground') - - const end = async () => { - // download zip file - - const a = document.createElement('a') - const blob = await zip.generateAsync({ type: 'blob' }) - const dataUrlZip = URL.createObjectURL(blob) - a.href = dataUrlZip - a.download = 'blocks_render.zip' - a.click() - URL.revokeObjectURL(dataUrlZip) - console.log('end') - - viewer.world.renderUpdateEmitter.removeListener('update', onWorldUpdate) - } - - async function onWorldUpdate () { - // await new Promise(resolve => { - // setTimeout(resolve, 50) - // }) - const dataUrl = canvas.toDataURL('image/png') - - zip.file(`${blockName}.png`, dataUrl.split(',')[1], { base64: true }) - - if (onlyCurrent) { - end() - } else { - nextBlock() - } - } - const nextBlock = async () => { - blockName = allBlocks[blockCount++] - console.log(allBlocks.length, '/', blockCount, blockName) - if (blockCount % 5 === 0) { - await new Promise(resolve => { - setTimeout(resolve, 100) - }) - } - if (blockName) { - updateBlock() - } else { - end() - } - } - } - - getBlock () { - return mcData.blocksByName[this.params.block || 'air'] - } - - // applyChanges (metadataUpdate = false, skipQs = false) { - override onParamsUpdate (paramName: string, object: any) { - const metadataUpdate = paramName === 'metadata' - - const blockId = this.getBlock()?.id - let block: import('prismarine-block').Block - if (metadataUpdate) { - block = new this.Block(blockId, 0, this.params.metadata) - Object.assign(this.blockProps, block.getProperties()) - for (const _child of this.metadataFolder!.children) { - const child = _child as import('lil-gui').Controller - child.updateDisplay() - } - } else { - try { - block = this.Block.fromProperties(blockId ?? -1, this.blockProps, 0) - } catch (err) { - console.error(err) - block = this.Block.fromStateId(0, 0) - } - } - - worldView!.setBlockStateId(this.targetPos, block.stateId ?? 0) - console.log('up stateId', block.stateId) - this.params.metadata = block.metadata - this.metadataGui.updateDisplay() - } - - override renderFinish () { - for (const update of Object.values(this.onParamUpdate)) { - // update(true) - update() - } - this.onParamsUpdate('', {}) - this.gui.openAnimated() - } -} - -export default MainScene diff --git a/renderer/playground/scenes/railsCobweb.ts b/renderer/playground/scenes/railsCobweb.ts deleted file mode 100644 index bc1c271a..00000000 --- a/renderer/playground/scenes/railsCobweb.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { BasePlaygroundScene } from '../baseScene' - -export default class RailsCobwebScene extends BasePlaygroundScene { - setupWorld () { - this.addWorldBlock(0, 0, 0, 'cobweb') - this.addWorldBlock(0, -1, 0, 'cobweb') - this.addWorldBlock(1, -1, 0, 'cobweb') - this.addWorldBlock(1, 0, 0, 'cobweb') - - this.addWorldBlock(0, 0, 1, 'powered_rail', { shape: 'north_south', waterlogged: false }) - this.addWorldBlock(0, 0, 2, 'powered_rail', { shape: 'ascending_south', waterlogged: false }) - this.addWorldBlock(0, 1, 3, 'powered_rail', { shape: 'north_south', waterlogged: false }) - } -} diff --git a/renderer/playground/scenes/rotationIssue.ts b/renderer/playground/scenes/rotationIssue.ts deleted file mode 100644 index 2c56876a..00000000 --- a/renderer/playground/scenes/rotationIssue.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { BasePlaygroundScene } from '../baseScene' - -export default class RotationIssueScene extends BasePlaygroundScene { - setupWorld () { - // todo - } -} diff --git a/renderer/playground/scenes/slabsOptimization.ts b/renderer/playground/scenes/slabsOptimization.ts deleted file mode 100644 index 9035a777..00000000 --- a/renderer/playground/scenes/slabsOptimization.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { BasePlaygroundScene } from '../baseScene' - -export default class extends BasePlaygroundScene { - expectedNumberOfFaces = 30 - - setupWorld () { - this.addWorldBlock(0, 1, 0, 'stone_slab') - this.addWorldBlock(0, 0, 0, 'stone') - this.addWorldBlock(0, -1, 0, 'stone_slab', { type: 'top', waterlogged: false }) - this.addWorldBlock(0, -1, -1, 'stone_slab', { type: 'top', waterlogged: false }) - this.addWorldBlock(0, -1, 1, 'stone_slab', { type: 'top', waterlogged: false }) - this.addWorldBlock(-1, -1, 0, 'stone_slab', { type: 'top', waterlogged: false }) - this.addWorldBlock(1, -1, 0, 'stone_slab', { type: 'top', waterlogged: false }) - } -} diff --git a/renderer/playground/scenes/transparencyIssue.ts b/renderer/playground/scenes/transparencyIssue.ts deleted file mode 100644 index 9ce1b967..00000000 --- a/renderer/playground/scenes/transparencyIssue.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { BasePlaygroundScene } from '../baseScene' - -export default class extends BasePlaygroundScene { - setupWorld () { - this.addWorldBlock(0, 0, 0, 'water') - this.addWorldBlock(0, 1, 0, 'lime_stained_glass') - this.addWorldBlock(0, 0, -1, 'lime_stained_glass') - this.addWorldBlock(0, -1, 0, 'lime_stained_glass') - this.addWorldBlock(0, -1, -1, 'stone') - } -} diff --git a/renderer/playground/shared.ts b/renderer/playground/shared.ts deleted file mode 100644 index 9d12fae9..00000000 --- a/renderer/playground/shared.ts +++ /dev/null @@ -1,79 +0,0 @@ -import WorldLoader, { world } from 'prismarine-world' -import ChunkLoader from 'prismarine-chunk' - -export type BlockFaceType = { - side: number - textureIndex: number - tint?: [number, number, number] - isTransparent?: boolean - - // for testing - face?: string - neighbor?: string - light?: number -} - -export type BlockType = { - faces: BlockFaceType[] - - // for testing - block: string -} - -export const makeError = (str: string) => { - reportError?.(str) -} -export const makeErrorCritical = (str: string) => { - throw new Error(str) -} - -export const getSyncWorld = (version: string): world.WorldSync => { - const World = (WorldLoader as any)(version) - const Chunk = (ChunkLoader as any)(version) - - const world = new World(version).sync - - const methods = getAllMethods(world) - for (const method of methods) { - if (method.startsWith('set') && method !== 'setColumn') { - const oldMethod = world[method].bind(world) - world[method] = (...args) => { - const arg = args[0] - if (arg.x !== undefined && !world.getColumnAt(arg)) { - world.setColumn(Math.floor(arg.x / 16), Math.floor(arg.z / 16), new Chunk(undefined as any)) - } - oldMethod(...args) - } - } - } - - return world -} - -function getAllMethods (obj) { - const methods = new Set() - let currentObj = obj - - do { - for (const name of Object.getOwnPropertyNames(currentObj)) { - if (typeof obj[name] === 'function' && name !== 'constructor') { - methods.add(name) - } - } - } while ((currentObj = Object.getPrototypeOf(currentObj))) - - return [...methods] as string[] -} - -export const delayedIterator = async (arr: T[], delay: number, exec: (item: T, index: number) => Promise, chunkSize = 1) => { - // if delay is 0 then don't use setTimeout - for (let i = 0; i < arr.length; i += chunkSize) { - if (delay) { - // eslint-disable-next-line no-await-in-loop - await new Promise(resolve => { - setTimeout(resolve, delay) - }) - } - await exec(arr[i], i) - } -} diff --git a/renderer/rsbuild.config.ts b/renderer/rsbuild.config.ts deleted file mode 100644 index 2b40e79c..00000000 --- a/renderer/rsbuild.config.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { defineConfig, mergeRsbuildConfig, RsbuildPluginAPI } from '@rsbuild/core'; -import supportedVersions from '../src/supportedVersions.mjs' -import childProcess from 'child_process' -import path, { dirname, join } from 'path' -import { pluginReact } from '@rsbuild/plugin-react'; -import { pluginNodePolyfill } from '@rsbuild/plugin-node-polyfill'; -import fs from 'fs' -import fsExtra from 'fs-extra' -import { appAndRendererSharedConfig, rspackViewerConfig } from './rsbuildSharedConfig'; - -const mcDataPath = join(__dirname, '../generated/minecraft-data-optimized.json') - -// if (!fs.existsSync('./playground/textures')) { -// fsExtra.copySync('node_modules/mc-assets/dist/other-textures/latest/entity', './playground/textures/entity') -// } - -if (!fs.existsSync(mcDataPath)) { - childProcess.execSync('tsx ./scripts/makeOptimizedMcData.mjs', { stdio: 'inherit', cwd: path.join(__dirname, '..') }) -} - -export default mergeRsbuildConfig( - appAndRendererSharedConfig(), - defineConfig({ - html: { - template: join(__dirname, './playground.html'), - }, - output: { - cleanDistPath: false, - distPath: { - root: join(__dirname, './dist'), - }, - }, - server: { - port: 9090, - }, - source: { - entry: { - index: join(__dirname, './playground/playground.ts') - }, - define: { - 'globalThis.includedVersions': JSON.stringify(supportedVersions), - }, - }, - plugins: [ - { - name: 'test', - setup (build: RsbuildPluginAPI) { - const prep = async () => { - fsExtra.copySync(join(__dirname, '../node_modules/mc-assets/dist/other-textures/latest/entity'), join(__dirname, './dist/textures/entity')) - } - build.onBeforeBuild(async () => { - await prep() - }) - build.onBeforeStartDevServer(() => prep()) - }, - }, - ], - }) -) diff --git a/renderer/rsbuildSharedConfig.ts b/renderer/rsbuildSharedConfig.ts deleted file mode 100644 index 45da30b1..00000000 --- a/renderer/rsbuildSharedConfig.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { defineConfig, ModifyRspackConfigUtils } from '@rsbuild/core'; -import { pluginNodePolyfill } from '@rsbuild/plugin-node-polyfill'; -import { pluginReact } from '@rsbuild/plugin-react'; -import path from 'path' -import fs from 'fs' - -export const appAndRendererSharedConfig = () => defineConfig({ - dev: { - progressBar: true, - writeToDisk: true, - watchFiles: { - paths: [ - path.join(__dirname, './dist/webgpuRendererWorker.js'), - path.join(__dirname, './dist/mesher.js'), - ] - }, - }, - output: { - polyfill: 'usage', - // 50kb limit for data uri - dataUriLimit: 50 * 1024, - assetPrefix: './', - }, - source: { - alias: { - fs: path.join(__dirname, `../src/shims/fs.js`), - http: 'http-browserify', - stream: 'stream-browserify', - net: 'net-browserify', - 'minecraft-protocol$': 'minecraft-protocol/src/index.js', - 'buffer$': 'buffer', - // avoid bundling, not used on client side - 'prismarine-auth': path.join(__dirname, `../src/shims/prismarineAuthReplacement.ts`), - perf_hooks: path.join(__dirname, `../src/shims/perf_hooks_replacement.js`), - crypto: path.join(__dirname, `../src/shims/crypto.js`), - dns: path.join(__dirname, `../src/shims/dns.js`), - yggdrasil: path.join(__dirname, `../src/shims/yggdrasilReplacement.ts`), - 'three$': 'three/src/Three.js', - 'stats.js$': 'stats.js/src/Stats.js', - }, - define: { - 'process.platform': '"browser"', - }, - decorators: { - version: 'legacy', // default is a lie - }, - }, - server: { - htmlFallback: false, - // publicDir: false, - headers: { - // enable shared array buffer - 'Cross-Origin-Opener-Policy': 'same-origin', - 'Cross-Origin-Embedder-Policy': 'require-corp', - }, - open: process.env.OPEN_BROWSER === 'true', - }, - plugins: [ - pluginReact(), - pluginNodePolyfill() - ], - tools: { - rspack (config, helpers) { - const packageJson = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'), 'utf8')) - const hasFileProtocol = Object.values(packageJson.pnpm.overrides).some((dep) => (dep as string).startsWith('file:')) - if (hasFileProtocol) { - // enable node_modules watching - config.watchOptions.ignored = /\.git/ - } - rspackViewerConfig(config, helpers) - } - }, -}) - -export const rspackViewerConfig = (config, { appendPlugins, addRules, rspack }: ModifyRspackConfigUtils) => { - appendPlugins(new rspack.NormalModuleReplacementPlugin(/data|prismarine-physics/, (resource) => { - let absolute: string - const request = resource.request.replaceAll('\\', '/') - absolute = path.join(resource.context, request).replaceAll('\\', '/') - if (request.includes('minecraft-data/data/pc/1.') || request.includes('prismarine-physics')) { - console.log('Error: incompatible resource', request, 'from', resource.contextInfo.issuer) - process.exit(1) - // throw new Error(`${resource.request} was requested by ${resource.contextInfo.issuer}`) - } - if (absolute.endsWith('/minecraft-data/data.js')) { - resource.request = path.join(__dirname, `../src/shims/minecraftData.ts`) - } - if (absolute.endsWith('/minecraft-data/data/bedrock/common/legacy.json')) { - resource.request = path.join(__dirname, `../src/shims/empty.ts`) - } - if (absolute.endsWith('/minecraft-data/data/pc/common/legacy.json')) { - resource.request = path.join(__dirname, `../src/preflatMap.json`) - } - })) - addRules([ - { - test: /\.obj$/, - type: 'asset/source', - }, - { - test: /\.wgsl$/, - type: 'asset/source', - }, - { - test: /\.mp3$/, - type: 'asset/source', - }, - { - test: /\.txt$/, - type: 'asset/source', - }, - { - test: /\.log$/, - type: 'asset/source', - } - ]) - config.ignoreWarnings = [ - /the request of a dependency is an expression/, - /Unsupported pseudo class or element: xr-overlay/ - ] - if (process.env.SINGLE_FILE_BUILD === 'true') { - config.module!.parser!.javascript!.dynamicImportMode = 'eager' - } -} diff --git a/renderer/viewer/.gitignore b/renderer/viewer/.gitignore deleted file mode 100644 index 7ae1b2cd..00000000 --- a/renderer/viewer/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -public/* -!public/.empty \ No newline at end of file diff --git a/renderer/viewer/baseGraphicsBackend.ts b/renderer/viewer/baseGraphicsBackend.ts deleted file mode 100644 index 486c930f..00000000 --- a/renderer/viewer/baseGraphicsBackend.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { proxy } from 'valtio' -import { NonReactiveState, RendererReactiveState } from '../../src/appViewer' - -export const getDefaultRendererState = (): { - reactive: RendererReactiveState - nonReactive: NonReactiveState -} => { - return { - reactive: proxy({ - world: { - chunksLoaded: new Set(), - heightmaps: new Map(), - allChunksLoaded: true, - mesherWork: false, - intersectMedia: null - }, - renderer: '', - preventEscapeMenu: false - }), - nonReactive: { - world: { - chunksLoaded: new Set(), - chunksTotalNumber: 0, - } - } - } -} diff --git a/renderer/viewer/common/utils.ts b/renderer/viewer/common/utils.ts deleted file mode 100644 index 958273f3..00000000 --- a/renderer/viewer/common/utils.ts +++ /dev/null @@ -1,18 +0,0 @@ -export const versionToNumber = (ver: string) => { - const [x, y = '0', z = '0'] = ver.split('.') - return +`${x.padStart(2, '0')}${y.padStart(2, '0')}${z.padStart(2, '0')}` -} - -export const versionToMajor = (version: string) => { - const [x, y = '0'] = version.split('.') - return `${x.padStart(2, '0')}.${y.padStart(2, '0')}` -} - -export const versionsMapToMajor = (versionsMap: Record) => { - const majorVersions = {} as Record - for (const [ver, data] of Object.entries(versionsMap)) { - const major = versionToMajor(ver) - majorVersions[major] = data - } - return majorVersions -} diff --git a/renderer/viewer/lib/DebugGui.ts b/renderer/viewer/lib/DebugGui.ts deleted file mode 100644 index f296c873..00000000 --- a/renderer/viewer/lib/DebugGui.ts +++ /dev/null @@ -1,174 +0,0 @@ -// eslint-disable-next-line import/no-named-as-default -import GUI from 'lil-gui' - -export interface ParamMeta { - min?: number - max?: number - step?: number -} - -export class DebugGui { - private gui: GUI - private readonly storageKey: string - private target: any - private readonly params: string[] - private readonly paramsMeta: Record - private _visible = false // Default to not visible - private readonly initialValues: Record = {} // Store initial values - private initialized = false - - constructor (id: string, target: any, params?: string[], paramsMeta?: Record) { - this.gui = new GUI() - this.storageKey = `debug_params_${id}` - this.target = target - this.paramsMeta = paramsMeta ?? {} - this.params = params ?? Object.keys(target) - - // Store initial values - for (const param of this.params) { - this.initialValues[param] = target[param] - } - - // Hide by default - this.gui.domElement.style.display = 'none' - } - - // Initialize and show the GUI - activate () { - if (!this.initialized) { - this.loadSavedValues() - this.setupControls() - this.initialized = true - } - this.show() - return this - } - - // Getter for visibility - get visible (): boolean { - return this._visible - } - - // Setter for visibility - set visible (value: boolean) { - this._visible = value - this.gui.domElement.style.display = value ? 'block' : 'none' - this.saveVisibility() - } - - private loadSavedValues () { - try { - const saved = localStorage.getItem(this.storageKey) - if (saved) { - const values = JSON.parse(saved) - // Apply saved values to target - for (const param of this.params) { - if (param in values) { - const value = values[param] - if (value !== null) { - this.target[param] = value - } - } - } - } - } catch (e) { - console.warn('Failed to load debug values:', e) - } - } - - private saveValues (deleteKey = false) { - try { - const values = {} - for (const param of this.params) { - values[param] = this.target[param] - } - if (deleteKey) { - localStorage.removeItem(this.storageKey) - } else { - localStorage.setItem(this.storageKey, JSON.stringify(values)) - } - } catch (e) { - console.warn('Failed to save debug values:', e) - } - } - - private saveVisibility () { - try { - localStorage.setItem(`${this.storageKey}_visible`, this._visible.toString()) - } catch (e) { - console.warn('Failed to save debug visibility:', e) - } - } - - private setupControls () { - // Add visibility toggle at the top - this.gui.add(this, 'visible').name('Show Controls') - this.gui.add({ resetAll: () => { - for (const param of this.params) { - this.target[param] = this.initialValues[param] - } - this.saveValues(true) - this.gui.destroy() - this.gui = new GUI() - this.setupControls() - } }, 'resetAll').name('Reset All Parameters') - - for (const param of this.params) { - const value = this.target[param] - const meta = this.paramsMeta[param] ?? {} - - if (typeof value === 'number') { - // For numbers, use meta values or calculate reasonable defaults - const min = meta.min ?? value - Math.abs(value * 2) - const max = meta.max ?? value + Math.abs(value * 2) - const step = meta.step ?? Math.abs(value) / 100 - - this.gui.add(this.target, param, min, max, step) - .onChange(() => this.saveValues()) - } else if (typeof value === 'boolean') { - // For booleans, create a checkbox - this.gui.add(this.target, param) - .onChange(() => this.saveValues()) - } else if (typeof value === 'string' && ['x', 'y', 'z'].includes(param)) { - // Special case for xyz coordinates - const min = meta.min ?? -10 - const max = meta.max ?? 10 - const step = meta.step ?? 0.1 - - this.gui.add(this.target, param, min, max, step) - .onChange(() => this.saveValues()) - } else if (Array.isArray(value)) { - // For arrays, create a dropdown - this.gui.add(this.target, param, value) - .onChange(() => this.saveValues()) - } - } - } - - // Method to manually trigger save - save () { - this.saveValues() - this.saveVisibility() - } - - // Method to destroy the GUI and clean up - destroy () { - this.saveVisibility() - this.gui.destroy() - } - - // Toggle visibility - toggle () { - this.visible = !this.visible - } - - // Show the GUI - show () { - this.visible = true - } - - // Hide the GUI - hide () { - this.visible = false - } -} diff --git a/renderer/viewer/lib/animationController.ts b/renderer/viewer/lib/animationController.ts deleted file mode 100644 index 329d0e24..00000000 --- a/renderer/viewer/lib/animationController.ts +++ /dev/null @@ -1,85 +0,0 @@ -import * as tweenJs from '@tweenjs/tween.js' - -export class AnimationController { - private currentAnimation: tweenJs.Group | null = null - private isAnimating = false - private cancelRequested = false - private completionCallbacks: Array<() => void> = [] - private currentCancelCallback: (() => void) | null = null - - /** Main method */ - async startAnimation (createAnimation: () => tweenJs.Group, onCancelled?: () => void): Promise { - if (this.isAnimating) { - await this.cancelCurrentAnimation() - } - - return new Promise((resolve) => { - this.isAnimating = true - this.cancelRequested = false - this.currentCancelCallback = onCancelled ?? null - this.currentAnimation = createAnimation() - - this.completionCallbacks.push(() => { - this.isAnimating = false - this.currentAnimation = null - resolve() - }) - }) - } - - /** Main method */ - async cancelCurrentAnimation (): Promise { - if (!this.isAnimating) return - - if (this.currentCancelCallback) { - const callback = this.currentCancelCallback - this.currentCancelCallback = null - callback() - } - - return new Promise((resolve) => { - this.cancelRequested = true - this.completionCallbacks.push(() => { - resolve() - }) - }) - } - - animationCycleFinish () { - if (this.cancelRequested) this.forceFinish() - } - - forceFinish (callComplete = true) { - if (!this.isAnimating) return - - if (this.currentAnimation) { - for (const tween of this.currentAnimation.getAll()) tween.stop() - this.currentAnimation.removeAll() - this.currentAnimation = null - } - - this.isAnimating = false - this.cancelRequested = false - - const callbacks = [...this.completionCallbacks] - this.completionCallbacks = [] - if (callComplete) { - for (const cb of callbacks) cb() - } - } - - /** Required method */ - update () { - if (this.currentAnimation) { - this.currentAnimation.update() - } - } - - get isActive () { - return this.isAnimating - } - - get shouldCancel () { - return this.cancelRequested - } -} diff --git a/renderer/viewer/lib/basePlayerState.ts b/renderer/viewer/lib/basePlayerState.ts deleted file mode 100644 index 9cf1350a..00000000 --- a/renderer/viewer/lib/basePlayerState.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { ItemSelector } from 'mc-assets/dist/itemDefinitions' -import { GameMode, Team } from 'mineflayer' -import { proxy } from 'valtio' -import type { HandItemBlock } from '../three/holdingBlock' - -export type MovementState = 'NOT_MOVING' | 'WALKING' | 'SPRINTING' | 'SNEAKING' -export type ItemSpecificContextProperties = Partial> -export type CameraPerspective = 'first_person' | 'third_person_back' | 'third_person_front' - -export type BlockShape = { position: any; width: any; height: any; depth: any; } -export type BlocksShapes = BlockShape[] - -// edit src/mineflayer/playerState.ts for implementation of player state from mineflayer -export const getInitialPlayerState = () => proxy({ - playerSkin: undefined as string | undefined, - inWater: false, - waterBreathing: false, - backgroundColor: [0, 0, 0] as [number, number, number], - ambientLight: 0, - directionalLight: 0, - eyeHeight: 0, - gameMode: undefined as GameMode | undefined, - lookingAtBlock: undefined as { - x: number - y: number - z: number - face?: number - shapes: BlocksShapes - } | undefined, - diggingBlock: undefined as { - x: number - y: number - z: number - stage: number - face?: number - mergedShape: BlockShape | undefined - } | undefined, - movementState: 'NOT_MOVING' as MovementState, - onGround: true, - sneaking: false, - flying: false, - sprinting: false, - itemUsageTicks: 0, - username: '', - onlineMode: false, - lightingDisabled: false, - shouldHideHand: false, - heldItemMain: undefined as HandItemBlock | undefined, - heldItemOff: undefined as HandItemBlock | undefined, - perspective: 'first_person' as CameraPerspective, - onFire: false, - - cameraSpectatingEntity: undefined as number | undefined, - - team: undefined as Team | undefined, -}) - -export const getPlayerStateUtils = (reactive: PlayerStateReactive) => ({ - isSpectator () { - return reactive.gameMode === 'spectator' - }, - isSpectatingEntity () { - return reactive.cameraSpectatingEntity !== undefined && reactive.gameMode === 'spectator' - }, - isThirdPerson () { - if ((this as PlayerStateUtils).isSpectatingEntity()) return false - return reactive.perspective === 'third_person_back' || reactive.perspective === 'third_person_front' - } -}) - -export const getInitialPlayerStateRenderer = () => ({ - reactive: getInitialPlayerState() -}) - -export type PlayerStateReactive = ReturnType -export type PlayerStateUtils = ReturnType - -export type PlayerStateRenderer = PlayerStateReactive - -export const getItemSelector = (playerState: PlayerStateRenderer, specificProperties: ItemSpecificContextProperties, item?: import('prismarine-item').Item) => { - return { - ...specificProperties, - 'minecraft:date': new Date(), - // "minecraft:context_dimension": bot.entityp, - // 'minecraft:time': bot.time.timeOfDay / 24_000, - } -} diff --git a/renderer/viewer/lib/cameraBobbing.ts b/renderer/viewer/lib/cameraBobbing.ts deleted file mode 100644 index 6bf32c76..00000000 --- a/renderer/viewer/lib/cameraBobbing.ts +++ /dev/null @@ -1,94 +0,0 @@ -export class CameraBobbing { - private walkDistance = 0 - private prevWalkDistance = 0 - private bobAmount = 0 - private prevBobAmount = 0 - private readonly gameTimer = new GameTimer() - - // eslint-disable-next-line max-params - constructor ( - private readonly BOB_FREQUENCY: number = Math.PI, // How fast the bob cycles - private readonly BOB_BASE_AMPLITUDE: number = 0.5, // Base amplitude of the bob - private readonly VERTICAL_MULTIPLIER: number = 1, // Vertical movement multiplier - private readonly ROTATION_MULTIPLIER_Z: number = 3, // Roll rotation multiplier - private readonly ROTATION_MULTIPLIER_X: number = 5 // Pitch rotation multiplier - ) {} - - // Call this when player is moving - public updateWalkDistance (distance: number): void { - this.prevWalkDistance = this.walkDistance - this.walkDistance = distance - } - - // Call this when player is moving to update bob amount - public updateBobAmount (isMoving: boolean): void { - const targetBob = isMoving ? 1 : 0 - this.prevBobAmount = this.bobAmount - - // Update timing - const ticks = this.gameTimer.update() - const deltaTime = ticks / 20 // Convert ticks to seconds assuming 20 TPS - - // Smooth transition for bob amount - const bobDelta = (targetBob - this.bobAmount) * Math.min(1, deltaTime * 10) - this.bobAmount += bobDelta - } - - // Call this in your render/animation loop - public getBobbing (): { position: { x: number, y: number }, rotation: { x: number, z: number } } { - // Interpolate walk distance - const walkDist = this.prevWalkDistance + - (this.walkDistance - this.prevWalkDistance) * this.gameTimer.partialTick - - // Interpolate bob amount - const bob = this.prevBobAmount + - (this.bobAmount - this.prevBobAmount) * this.gameTimer.partialTick - - // Calculate total distance for bob cycle - const totalDist = -(walkDist * this.BOB_FREQUENCY) - - // Calculate offsets - const xOffset = Math.sin(totalDist) * bob * this.BOB_BASE_AMPLITUDE - const yOffset = -Math.abs(Math.cos(totalDist) * bob) * this.VERTICAL_MULTIPLIER - - // Calculate rotations (in radians) - const zRot = (Math.sin(totalDist) * bob * this.ROTATION_MULTIPLIER_Z) * (Math.PI / 180) - const xRot = (Math.abs(Math.cos(totalDist - 0.2) * bob) * this.ROTATION_MULTIPLIER_X) * (Math.PI / 180) - - return { - position: { x: xOffset, y: yOffset }, - rotation: { x: xRot, z: zRot } - } - } -} - -class GameTimer { - private readonly msPerTick: number - private lastMs: number - public partialTick = 0 - - constructor (tickRate = 20) { - this.msPerTick = 1000 / tickRate - this.lastMs = performance.now() - } - - update (): number { - const currentMs = performance.now() - const deltaSinceLastTick = currentMs - this.lastMs - - // Calculate how much of a tick has passed - const tickDelta = deltaSinceLastTick / this.msPerTick - this.lastMs = currentMs - - // Add to accumulated partial ticks - this.partialTick += tickDelta - - // Get whole number of ticks that should occur - const wholeTicks = Math.floor(this.partialTick) - - // Keep the remainder as the new partial tick - this.partialTick -= wholeTicks - - return wholeTicks - } -} diff --git a/renderer/viewer/lib/cleanupDecorator.ts b/renderer/viewer/lib/cleanupDecorator.ts deleted file mode 100644 index 79b35828..00000000 --- a/renderer/viewer/lib/cleanupDecorator.ts +++ /dev/null @@ -1,29 +0,0 @@ -export function buildCleanupDecorator (cleanupMethod: string) { - return function () { - return function (_target: { snapshotInitialValues }, propertyKey: string) { - const target = _target as any - // Store the initial value of the property - if (!target._snapshotMethodPatched) { - target.snapshotInitialValues = function () { - this._initialValues = {} - for (const key of target._toCleanup) { - this._initialValues[key] = this[key] - } - } - target._snapshotMethodPatched = true - } - (target._toCleanup ??= []).push(propertyKey) - if (!target._cleanupPatched) { - const originalMethod = target[cleanupMethod] - target[cleanupMethod] = function () { - for (const key of target._toCleanup) { - this[key] = this._initialValues[key] - } - // eslint-disable-next-line prefer-rest-params - Reflect.apply(originalMethod, this, arguments) - } - } - target._cleanupPatched = true - } - } -} diff --git a/renderer/viewer/lib/createPlayerObject.ts b/renderer/viewer/lib/createPlayerObject.ts deleted file mode 100644 index 836c8062..00000000 --- a/renderer/viewer/lib/createPlayerObject.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { PlayerObject, PlayerAnimation } from 'skinview3d' -import * as THREE from 'three' -import { WalkingGeneralSwing } from '../three/entity/animations' -import { loadSkinImage, stevePngUrl } from './utils/skins' - -export type PlayerObjectType = PlayerObject & { - animation?: PlayerAnimation - realPlayerUuid: string - realUsername: string -} - -export function createPlayerObject (options: { - username?: string - uuid?: string - scale?: number -}): { - playerObject: PlayerObjectType - wrapper: THREE.Group - } { - const wrapper = new THREE.Group() - const playerObject = new PlayerObject() as PlayerObjectType - - playerObject.realPlayerUuid = options.uuid ?? '' - playerObject.realUsername = options.username ?? '' - playerObject.position.set(0, 16, 0) - - // fix issues with starfield - playerObject.traverse((obj) => { - if (obj instanceof THREE.Mesh && obj.material instanceof THREE.MeshStandardMaterial) { - obj.material.transparent = true - } - }) - - wrapper.add(playerObject as any) - const scale = options.scale ?? (1 / 16) - wrapper.scale.set(scale, scale, scale) - wrapper.rotation.set(0, Math.PI, 0) - - // Set up animation - playerObject.animation = new WalkingGeneralSwing() - ;(playerObject.animation as WalkingGeneralSwing).isMoving = false - playerObject.animation.update(playerObject, 0) - - return { playerObject, wrapper } -} - -export const applySkinToPlayerObject = async (playerObject: PlayerObjectType, skinUrl: string) => { - return loadSkinImage(skinUrl || stevePngUrl).then(({ canvas }) => { - const skinTexture = new THREE.CanvasTexture(canvas) - skinTexture.magFilter = THREE.NearestFilter - skinTexture.minFilter = THREE.NearestFilter - skinTexture.needsUpdate = true - playerObject.skin.map = skinTexture as any - }).catch(console.error) -} diff --git a/renderer/viewer/lib/guiRenderer.ts b/renderer/viewer/lib/guiRenderer.ts deleted file mode 100644 index 709941dc..00000000 --- a/renderer/viewer/lib/guiRenderer.ts +++ /dev/null @@ -1,282 +0,0 @@ -// Import placeholders - replace with actual imports for your environment -import { ItemRenderer, Identifier, ItemStack, NbtString, Structure, StructureRenderer, ItemRendererResources, BlockDefinition, BlockModel, TextureAtlas, Resources, ItemModel } from 'deepslate' -import { mat4, vec3 } from 'gl-matrix' -import { AssetsParser } from 'mc-assets/dist/assetsParser' -import { getLoadedImage, versionToNumber } from 'mc-assets/dist/utils' -import { BlockModel as BlockModelMcAssets, AtlasParser } from 'mc-assets' -import { getLoadedBlockstatesStore, getLoadedModelsStore } from 'mc-assets/dist/stores' -import { makeTextureAtlas } from 'mc-assets/dist/atlasCreator' -import { proxy, ref } from 'valtio' -import { getItemDefinition } from 'mc-assets/dist/itemDefinitions' - -export const getNonFullBlocksModels = () => { - let version = appViewer.resourcesManager.currentResources!.version ?? 'latest' - if (versionToNumber(version) < versionToNumber('1.13')) version = '1.13' - const itemsDefinitions = appViewer.resourcesManager.itemsDefinitionsStore.data.latest - const blockModelsResolved = {} as Record - const itemsModelsResolved = {} as Record - const fullBlocksWithNonStandardDisplay = [] as string[] - const handledItemsWithDefinitions = new Set() - const assetsParser = new AssetsParser(version, getLoadedBlockstatesStore(appViewer.resourcesManager.currentResources!.blockstatesModels), getLoadedModelsStore(appViewer.resourcesManager.currentResources!.blockstatesModels)) - - const standardGuiDisplay = { - 'rotation': [ - 30, - 225, - 0 - ], - 'translation': [ - 0, - 0, - 0 - ], - 'scale': [ - 0.625, - 0.625, - 0.625 - ] - } - - const arrEqual = (a: number[], b: number[]) => a.length === b.length && a.every((x, i) => x === b[i]) - const addModelIfNotFullblock = (name: string, model: BlockModelMcAssets) => { - if (blockModelsResolved[name]) return - if (!model?.elements?.length) return - const isFullBlock = model.elements.length === 1 && arrEqual(model.elements[0].from, [0, 0, 0]) && arrEqual(model.elements[0].to, [16, 16, 16]) - if (isFullBlock) return - const hasBetterPrerender = assetsParser.blockModelsStore.data.latest[`item/${name}`]?.textures?.['layer0']?.startsWith('invsprite_') - if (hasBetterPrerender) return - model['display'] ??= {} - model['display']['gui'] ??= standardGuiDisplay - blockModelsResolved[name] = model - } - - for (const [name, definition] of Object.entries(itemsDefinitions)) { - const item = getItemDefinition(appViewer.resourcesManager.itemsDefinitionsStore, { - version, - name, - properties: { - 'minecraft:display_context': 'gui', - }, - }) - if (item) { - const { resolvedModel } = assetsParser.getResolvedModelsByModel((item.special ? name : item.model).replace('minecraft:', '')) ?? {} - if (resolvedModel) { - handledItemsWithDefinitions.add(name) - } - if (resolvedModel?.elements) { - let hasStandardDisplay = true - if (resolvedModel['display']?.gui) { - hasStandardDisplay = - arrEqual(resolvedModel['display'].gui.rotation, standardGuiDisplay.rotation) - && arrEqual(resolvedModel['display'].gui.translation, standardGuiDisplay.translation) - && arrEqual(resolvedModel['display'].gui.scale, standardGuiDisplay.scale) - } - - addModelIfNotFullblock(name, resolvedModel) - - if (!blockModelsResolved[name] && !hasStandardDisplay) { - fullBlocksWithNonStandardDisplay.push(name) - } - const notSideLight = resolvedModel['gui_light'] && resolvedModel['gui_light'] !== 'side' - if (!hasStandardDisplay || notSideLight) { - blockModelsResolved[name] = resolvedModel - } - } - if (!blockModelsResolved[name] && item.tints && resolvedModel) { - resolvedModel['tints'] = item.tints - if (resolvedModel.elements) { - blockModelsResolved[name] = resolvedModel - } else { - itemsModelsResolved[name] = resolvedModel - } - } - } - } - - for (const [name, blockstate] of Object.entries(appViewer.resourcesManager.currentResources!.blockstatesModels.blockstates.latest)) { - if (handledItemsWithDefinitions.has(name)) { - continue - } - const resolvedModel = assetsParser.getResolvedModelFirst({ name: name.replace('minecraft:', ''), properties: {} }, true) - if (resolvedModel) { - addModelIfNotFullblock(name, resolvedModel[0]) - } - } - - return { - blockModelsResolved, - itemsModelsResolved - } -} - -// customEvents.on('gameLoaded', () => { -// const res = getNonFullBlocksModels() -// }) - -const RENDER_SIZE = 64 - -const generateItemsGui = async (models: Record, isItems = false) => { - const { currentResources } = appViewer.resourcesManager - const imgBitmap = isItems ? currentResources!.itemsAtlasImage : currentResources!.blocksAtlasImage - const canvasTemp = document.createElement('canvas') - canvasTemp.width = imgBitmap.width - canvasTemp.height = imgBitmap.height - canvasTemp.style.imageRendering = 'pixelated' - const ctx = canvasTemp.getContext('2d')! - ctx.imageSmoothingEnabled = false - ctx.drawImage(imgBitmap, 0, 0) - - const atlasParser = isItems ? appViewer.resourcesManager.itemsAtlasParser : appViewer.resourcesManager.blocksAtlasParser - const textureAtlas = new TextureAtlas( - ctx.getImageData(0, 0, imgBitmap.width, imgBitmap.height), - Object.fromEntries(Object.entries(atlasParser.atlas.latest.textures).map(([key, value]) => { - return [key, [ - value.u, - value.v, - (value.u + (value.su ?? atlasParser.atlas.latest.suSv)), - (value.v + (value.sv ?? atlasParser.atlas.latest.suSv)), - ]] as [string, [number, number, number, number]] - })) - ) - - const PREVIEW_ID = Identifier.parse('preview:preview') - const PREVIEW_DEFINITION = new BlockDefinition({ '': { model: PREVIEW_ID.toString() } }, undefined) - - let textureWasRequested = false - let modelData: any - let currentModelName: string | undefined - const resources: ItemRendererResources = { - getBlockModel (id) { - if (id.equals(PREVIEW_ID)) { - return BlockModel.fromJson(modelData ?? {}) - } - return null - }, - getTextureUV (texture) { - textureWasRequested = true - return textureAtlas.getTextureUV(texture.toString().replace('minecraft:', '').replace('block/', '').replace('item/', '').replace('blocks/', '').replace('items/', '') as any) - }, - getTextureAtlas () { - return textureAtlas.getTextureAtlas() - }, - getItemComponents (id) { - return new Map() - }, - getItemModel (id) { - // const isSpecial = currentModelName === 'shield' || currentModelName === 'conduit' || currentModelName === 'trident' - const isSpecial = false - if (id.equals(PREVIEW_ID)) { - return ItemModel.fromJson({ - type: isSpecial ? 'minecraft:special' : 'minecraft:model', - model: isSpecial ? { - type: currentModelName, - } : PREVIEW_ID.toString(), - base: PREVIEW_ID.toString(), - tints: modelData?.tints, - }) - } - return null - }, - } - - const canvas = document.createElement('canvas') - canvas.width = RENDER_SIZE - canvas.height = RENDER_SIZE - const gl = canvas.getContext('webgl2', { preserveDrawingBuffer: true }) - if (!gl) { - throw new Error('Cannot get WebGL2 context') - } - - function resetGLContext (gl) { - gl.clearColor(0, 0, 0, 0) - gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT) - } - - // const includeOnly = ['powered_repeater', 'wooden_door'] - const includeOnly = [] as string[] - - const images: Record = {} - const item = new ItemStack(PREVIEW_ID, 1, new Map(Object.entries({ - 'minecraft:item_model': new NbtString(PREVIEW_ID.toString()), - }))) - const renderer = new ItemRenderer(gl, item, resources, { display_context: 'gui' }) - const missingTextures = new Set() - for (const [modelName, model] of Object.entries(models)) { - textureWasRequested = false - if (includeOnly.length && !includeOnly.includes(modelName)) continue - - const patchMissingTextures = () => { - for (const element of model.elements ?? []) { - for (const [faceName, face] of Object.entries(element.faces)) { - if (face.texture.startsWith('#')) { - missingTextures.add(`${modelName} ${faceName}: ${face.texture}`) - face.texture = 'block/unknown' - } - } - } - } - patchMissingTextures() - // TODO eggs - - modelData = model - currentModelName = modelName - resetGLContext(gl) - if (!modelData) continue - renderer.setItem(item, { display_context: 'gui' }) - renderer.drawItem() - if (!textureWasRequested) continue - const url = canvas.toDataURL() - // eslint-disable-next-line no-await-in-loop - const img = await getLoadedImage(url) - images[modelName] = img - } - - if (missingTextures.size) { - console.warn(`[guiRenderer] Missing textures in ${[...missingTextures].join(', ')}`) - } - - return images -} - -/** - * @mainThread - */ -const generateAtlas = async (images: Record) => { - const atlas = makeTextureAtlas({ - input: Object.keys(images), - tileSize: RENDER_SIZE, - getLoadedImage (name) { - return { - image: images[name], - } - }, - }) - - // const atlasParser = new AtlasParser({ latest: atlas.json }, atlas.canvas.toDataURL()) - // const a = document.createElement('a') - // a.href = await atlasParser.createDebugImage(true) - // a.download = 'blocks_atlas.png' - // a.click() - - appViewer.resourcesManager.currentResources!.guiAtlas = { - json: atlas.json, - image: await createImageBitmap(atlas.canvas), - } - - return atlas -} - -export const generateGuiAtlas = async () => { - const { blockModelsResolved, itemsModelsResolved } = getNonFullBlocksModels() - - // Generate blocks atlas - console.time('generate blocks gui atlas') - const blockImages = await generateItemsGui(blockModelsResolved, false) - console.timeEnd('generate blocks gui atlas') - console.time('generate items gui atlas') - const itemImages = await generateItemsGui(itemsModelsResolved, true) - console.timeEnd('generate items gui atlas') - await generateAtlas({ ...blockImages, ...itemImages }) - appViewer.resourcesManager.currentResources!.guiAtlasVersion++ - // await generateAtlas(blockImages) -} diff --git a/renderer/viewer/lib/mesher/mesher.ts b/renderer/viewer/lib/mesher/mesher.ts deleted file mode 100644 index a063d77f..00000000 --- a/renderer/viewer/lib/mesher/mesher.ts +++ /dev/null @@ -1,239 +0,0 @@ -import { Vec3 } from 'vec3' -import { World } from './world' -import { getSectionGeometry, setBlockStatesData as setMesherData } from './models' -import { BlockStateModelInfo } from './shared' -import { INVISIBLE_BLOCKS } from './worldConstants' - -globalThis.structuredClone ??= (value) => JSON.parse(JSON.stringify(value)) - -if (module.require) { - // If we are in a node environement, we need to fake some env variables - const r = module.require - const { parentPort } = r('worker_threads') - global.self = parentPort - global.postMessage = (value, transferList) => { parentPort.postMessage(value, transferList) } - global.performance = r('perf_hooks').performance -} - -let workerIndex = 0 -let world: World -let dirtySections = new Map() -let allDataReady = false - -function sectionKey (x, y, z) { - return `${x},${y},${z}` -} - -const batchMessagesLimit = 100 - -let queuedMessages = [] as any[] -let queueWaiting = false -const postMessage = (data, transferList = []) => { - queuedMessages.push({ data, transferList }) - if (queuedMessages.length > batchMessagesLimit) { - drainQueue(0, batchMessagesLimit) - } - if (queueWaiting) return - queueWaiting = true - setTimeout(() => { - queueWaiting = false - drainQueue(0, queuedMessages.length) - }) -} - -function drainQueue (from, to) { - const messages = queuedMessages.slice(from, to) - global.postMessage(messages.map(m => m.data), messages.flatMap(m => m.transferList) as unknown as string) - queuedMessages = queuedMessages.slice(to) -} - -function setSectionDirty (pos, value = true) { - const x = Math.floor(pos.x / 16) * 16 - const y = Math.floor(pos.y / 16) * 16 - const z = Math.floor(pos.z / 16) * 16 - const key = sectionKey(x, y, z) - if (!value) { - dirtySections.delete(key) - postMessage({ type: 'sectionFinished', key, workerIndex }) - return - } - - const chunk = world.getColumn(x, z) - if (chunk?.getSection(pos)) { - dirtySections.set(key, (dirtySections.get(key) || 0) + 1) - } else { - postMessage({ type: 'sectionFinished', key, workerIndex }) - } -} - -const softCleanup = () => { - // clean block cache and loaded chunks - world = new World(world.config.version) - globalThis.world = world -} - -const handleMessage = data => { - const globalVar: any = globalThis - - if (data.type === 'mcData') { - globalVar.mcData = data.mcData - globalVar.loadedData = data.mcData - } - - if (data.config) { - if (data.type === 'mesherData' && world) { - // reset models - world.blockCache = {} - world.erroredBlockModel = undefined - } - - world ??= new World(data.config.version) - world.config = { ...world.config, ...data.config } - globalThis.world = world - globalThis.Vec3 = Vec3 - } - - switch (data.type) { - case 'mesherData': { - setMesherData(data.blockstatesModels, data.blocksAtlas, data.config.outputFormat === 'webgpu') - allDataReady = true - workerIndex = data.workerIndex - - break - } - case 'dirty': { - const loc = new Vec3(data.x, data.y, data.z) - setSectionDirty(loc, data.value) - - break - } - case 'chunk': { - world.addColumn(data.x, data.z, data.chunk) - if (data.customBlockModels) { - const chunkKey = `${data.x},${data.z}` - world.customBlockModels.set(chunkKey, data.customBlockModels) - } - break - } - case 'unloadChunk': { - world.removeColumn(data.x, data.z) - world.customBlockModels.delete(`${data.x},${data.z}`) - if (Object.keys(world.columns).length === 0) softCleanup() - break - } - case 'blockUpdate': { - const loc = new Vec3(data.pos.x, data.pos.y, data.pos.z).floored() - if (data.stateId !== undefined && data.stateId !== null) { - world?.setBlockStateId(loc, data.stateId) - } - - const chunkKey = `${Math.floor(loc.x / 16) * 16},${Math.floor(loc.z / 16) * 16}` - if (data.customBlockModels) { - world?.customBlockModels.set(chunkKey, data.customBlockModels) - } - break - } - case 'reset': { - world = undefined as any - // blocksStates = null - dirtySections = new Map() - // todo also remove cached - globalVar.mcData = null - globalVar.loadedData = null - allDataReady = false - - break - } - case 'getCustomBlockModel': { - const pos = new Vec3(data.pos.x, data.pos.y, data.pos.z) - const chunkKey = `${Math.floor(pos.x / 16) * 16},${Math.floor(pos.z / 16) * 16}` - const customBlockModel = world.customBlockModels.get(chunkKey)?.[`${pos.x},${pos.y},${pos.z}`] - global.postMessage({ type: 'customBlockModel', chunkKey, customBlockModel }) - break - } - case 'getHeightmap': { - const heightmap = new Uint8Array(256) - - const blockPos = new Vec3(0, 0, 0) - for (let z = 0; z < 16; z++) { - for (let x = 0; x < 16; x++) { - const blockX = x + data.x - const blockZ = z + data.z - blockPos.x = blockX - blockPos.z = blockZ - blockPos.y = world.config.worldMaxY - let block = world.getBlock(blockPos) - while (block && INVISIBLE_BLOCKS.has(block.name) && blockPos.y > world.config.worldMinY) { - blockPos.y -= 1 - block = world.getBlock(blockPos) - } - const index = z * 16 + x - heightmap[index] = block ? blockPos.y : 0 - } - } - postMessage({ type: 'heightmap', key: `${Math.floor(data.x / 16)},${Math.floor(data.z / 16)}`, heightmap }) - - break - } - // No default - } -} - -// eslint-disable-next-line no-restricted-globals -- TODO -self.onmessage = ({ data }) => { - if (Array.isArray(data)) { - // eslint-disable-next-line unicorn/no-array-for-each - data.forEach(handleMessage) - return - } - - handleMessage(data) -} - -setInterval(() => { - if (world === null || !allDataReady) return - - if (dirtySections.size === 0) return - // console.log(sections.length + ' dirty sections') - - // const start = performance.now() - for (const key of dirtySections.keys()) { - const [x, y, z] = key.split(',').map(v => parseInt(v, 10)) - const chunk = world.getColumn(x, z) - let processTime = 0 - if (chunk?.getSection(new Vec3(x, y, z))) { - const start = performance.now() - const geometry = getSectionGeometry(x, y, z, world) - const transferable = [geometry.positions?.buffer, geometry.normals?.buffer, geometry.colors?.buffer, geometry.uvs?.buffer].filter(Boolean) - //@ts-expect-error - postMessage({ type: 'geometry', key, geometry, workerIndex }, transferable) - processTime = performance.now() - start - } else { - // console.info('[mesher] Missing section', x, y, z) - } - const dirtyTimes = dirtySections.get(key) - if (!dirtyTimes) throw new Error('dirtySections.get(key) is falsy') - for (let i = 0; i < dirtyTimes; i++) { - postMessage({ type: 'sectionFinished', key, workerIndex, processTime }) - processTime = 0 - } - dirtySections.delete(key) - } - - // Send new block state model info if any - if (world.blockStateModelInfo.size > 0) { - const newBlockStateInfo: Record = {} - for (const [cacheKey, info] of world.blockStateModelInfo) { - if (!world.sentBlockStateModels.has(cacheKey)) { - newBlockStateInfo[cacheKey] = info - world.sentBlockStateModels.add(cacheKey) - } - } - if (Object.keys(newBlockStateInfo).length > 0) { - postMessage({ type: 'blockStateModelInfo', info: newBlockStateInfo }) - } - } - - // const time = performance.now() - start - // console.log(`Processed ${sections.length} sections in ${time} ms (${time / sections.length} ms/section)`) -}, 50) diff --git a/renderer/viewer/lib/mesher/models.ts b/renderer/viewer/lib/mesher/models.ts deleted file mode 100644 index aca47e15..00000000 --- a/renderer/viewer/lib/mesher/models.ts +++ /dev/null @@ -1,745 +0,0 @@ -import { Vec3 } from 'vec3' -import worldBlockProvider, { WorldBlockProvider } from 'mc-assets/dist/worldBlockProvider' -import legacyJson from '../../../../src/preflatMap.json' -import { BlockType } from '../../../playground/shared' -import { World, BlockModelPartsResolved, WorldBlock as Block, WorldBlock } from './world' -import { BlockElement, buildRotationMatrix, elemFaces, matmul3, matmulmat3, vecadd3, vecsub3 } from './modelsGeometryCommon' -import { INVISIBLE_BLOCKS } from './worldConstants' -import { MesherGeometryOutput, HighestBlockInfo } from './shared' - - -let blockProvider: WorldBlockProvider - -const tints: any = {} -let needTiles = false - -let tintsData -try { - tintsData = require('esbuild-data').tints -} catch (err) { - tintsData = require('minecraft-data/minecraft-data/data/pc/1.16.2/tints.json') -} -for (const key of Object.keys(tintsData)) { - tints[key] = prepareTints(tintsData[key]) -} - -type Tiles = { - [blockPos: string]: BlockType -} - -function prepareTints (tints) { - const map = new Map() - const defaultValue = tintToGl(tints.default) - for (let { keys, color } of tints.data) { - color = tintToGl(color) - for (const key of keys) { - map.set(`${key}`, color) - } - } - return new Proxy(map, { - get (target, key) { - return target.has(key) ? target.get(key) : defaultValue - } - }) -} - -const calculatedBlocksEntries = Object.entries(legacyJson.clientCalculatedBlocks) -export function preflatBlockCalculation (block: Block, world: World, position: Vec3) { - const type = calculatedBlocksEntries.find(([name, blocks]) => blocks.includes(block.name))?.[0] - if (!type) return - switch (type) { - case 'directional': { - const isSolidConnection = !block.name.includes('redstone') && !block.name.includes('tripwire') - const neighbors = [ - world.getBlock(position.offset(0, 0, 1)), - world.getBlock(position.offset(0, 0, -1)), - world.getBlock(position.offset(1, 0, 0)), - world.getBlock(position.offset(-1, 0, 0)) - ] - // set needed props to true: east:'false',north:'false',south:'false',west:'false' - const props = {} - let changed = false - for (const [i, neighbor] of neighbors.entries()) { - const isConnectedToSolid = isSolidConnection ? (neighbor && !neighbor.transparent) : false - if (isConnectedToSolid || neighbor?.name === block.name) { - props[['south', 'north', 'east', 'west'][i]] = 'true' - changed = true - } - } - return changed ? props : undefined - } - // case 'gate_in_wall': {} - case 'block_snowy': { - const aboveIsSnow = world.getBlock(position.offset(0, 1, 0))?.name === 'snow' - if (aboveIsSnow) { - return { - snowy: `${aboveIsSnow}` - } - } else { - return - } - } - case 'door': { - // upper half matches lower in - const { half } = block.getProperties() - if (half === 'upper') { - // copy other properties - const lower = world.getBlock(position.offset(0, -1, 0)) - if (lower?.name === block.name) { - return { - ...lower.getProperties(), - half: 'upper' - } - } - } - } - } -} - -function tintToGl (tint) { - const r = (tint >> 16) & 0xff - const g = (tint >> 8) & 0xff - const b = tint & 0xff - return [r / 255, g / 255, b / 255] -} - -function getLiquidRenderHeight (world: World, block: WorldBlock | null, type: number, pos: Vec3, isWater: boolean, isRealWater: boolean) { - if ((isWater && !isRealWater) || (block && isBlockWaterlogged(block))) return 8 / 9 - if (!block || block.type !== type) return 1 / 9 - if (block.metadata === 0) { // source block - const blockAbove = world.getBlock(pos.offset(0, 1, 0)) - if (blockAbove && blockAbove.type === type) return 1 - return 8 / 9 - } - return ((block.metadata >= 8 ? 8 : 7 - block.metadata) + 1) / 9 -} - - -const isCube = (block: Block) => { - if (!block || block.transparent) return false - if (block.isCube) return true - if (!block.models?.length || block.models.length !== 1) return false - // all variants - return block.models[0].every(v => v.elements.every(e => { - return e.from[0] === 0 && e.from[1] === 0 && e.from[2] === 0 && e.to[0] === 16 && e.to[1] === 16 && e.to[2] === 16 - })) -} - -const getVec = (v: Vec3, dir: Vec3) => { - for (const coord of ['x', 'y', 'z']) { - if (Math.abs(dir[coord]) > 0) v[coord] = 0 - } - return v.plus(dir) -} - -function renderLiquid (world: World, cursor: Vec3, texture: any | undefined, type: number, biome: string, water: boolean, attr: MesherGeometryOutput, isRealWater: boolean) { - const heights: number[] = [] - for (let z = -1; z <= 1; z++) { - for (let x = -1; x <= 1; x++) { - const pos = cursor.offset(x, 0, z) - heights.push(getLiquidRenderHeight(world, world.getBlock(pos), type, pos, water, isRealWater)) - } - } - const cornerHeights = [ - Math.max(Math.max(heights[0], heights[1]), Math.max(heights[3], heights[4])), - Math.max(Math.max(heights[1], heights[2]), Math.max(heights[4], heights[5])), - Math.max(Math.max(heights[3], heights[4]), Math.max(heights[6], heights[7])), - Math.max(Math.max(heights[4], heights[5]), Math.max(heights[7], heights[8])) - ] - - // eslint-disable-next-line guard-for-in - for (const face in elemFaces) { - const { dir, corners, mask1, mask2 } = elemFaces[face] - const isUp = dir[1] === 1 - - const neighborPos = cursor.offset(...dir as [number, number, number]) - const neighbor = world.getBlock(neighborPos) - if (!neighbor) continue - if (neighbor.type === type || (water && (neighbor.name === 'water' || isBlockWaterlogged(neighbor)))) continue - if (isCube(neighbor) && !isUp) continue - - let tint = [1, 1, 1] - if (water) { - let m = 1 // Fake lighting to improve lisibility - if (Math.abs(dir[0]) > 0) m = 0.6 - else if (Math.abs(dir[2]) > 0) m = 0.8 - tint = tints.water[biome] - tint = [tint[0] * m, tint[1] * m, tint[2] * m] - } - - if (needTiles) { - const tiles = attr.tiles as Tiles - tiles[`${cursor.x},${cursor.y},${cursor.z}`] ??= { - block: 'water', - faces: [], - } - tiles[`${cursor.x},${cursor.y},${cursor.z}`].faces.push({ - face, - neighbor: `${neighborPos.x},${neighborPos.y},${neighborPos.z}`, - side: 0, // todo - textureIndex: 0, - // texture: eFace.texture.name, - }) - } - - const { u } = texture - const { v } = texture - const { su } = texture - const { sv } = texture - - // Get base light value for the face - const baseLight = world.getLight(neighborPos, undefined, undefined, water ? 'water' : 'lava') / 15 - - for (const pos of corners) { - const height = cornerHeights[pos[2] * 2 + pos[0]] - const OFFSET = 0.0001 - attr.t_positions!.push( - (pos[0] ? 1 - OFFSET : OFFSET) + (cursor.x & 15) - 8, - (pos[1] ? height - OFFSET : OFFSET) + (cursor.y & 15) - 8, - (pos[2] ? 1 - OFFSET : OFFSET) + (cursor.z & 15) - 8 - ) - attr.t_normals!.push(...dir) - attr.t_uvs!.push(pos[3] * su + u, pos[4] * sv * (pos[1] ? 1 : height) + v) - - let cornerLightResult = baseLight - if (world.config.smoothLighting) { - const dx = pos[0] * 2 - 1 - const dy = pos[1] * 2 - 1 - const dz = pos[2] * 2 - 1 - const cornerDir: [number, number, number] = [dx, dy, dz] - const side1Dir: [number, number, number] = [dx * mask1[0], dy * mask1[1], dz * mask1[2]] - const side2Dir: [number, number, number] = [dx * mask2[0], dy * mask2[1], dz * mask2[2]] - - const dirVec = new Vec3(...dir as [number, number, number]) - - const side1LightDir = getVec(new Vec3(...side1Dir), dirVec) - const side1Light = world.getLight(cursor.plus(side1LightDir)) / 15 - const side2DirLight = getVec(new Vec3(...side2Dir), dirVec) - const side2Light = world.getLight(cursor.plus(side2DirLight)) / 15 - const cornerLightDir = getVec(new Vec3(...cornerDir), dirVec) - const cornerLight = world.getLight(cursor.plus(cornerLightDir)) / 15 - // interpolate - const lights = [side1Light, side2Light, cornerLight, baseLight] - cornerLightResult = lights.reduce((acc, cur) => acc + cur, 0) / lights.length - } - - // Apply light value to tint - attr.t_colors!.push(tint[0] * cornerLightResult, tint[1] * cornerLightResult, tint[2] * cornerLightResult) - } - } -} - -const identicalCull = (currentElement: BlockElement, neighbor: Block, direction: Vec3) => { - const dirStr = `${direction.x},${direction.y},${direction.z}` - const lookForOppositeSide = { - '0,1,0': 'down', - '0,-1,0': 'up', - '1,0,0': 'east', - '-1,0,0': 'west', - '0,0,1': 'south', - '0,0,-1': 'north', - }[dirStr]! - const elemCompareForm = { - '0,1,0': (e: BlockElement) => `${e.from[0]},${e.from[2]}:${e.to[0]},${e.to[2]}`, - '0,-1,0': (e: BlockElement) => `${e.to[0]},${e.to[2]}:${e.from[0]},${e.from[2]}`, - '1,0,0': (e: BlockElement) => `${e.from[2]},${e.from[1]}:${e.to[2]},${e.to[1]}`, - '-1,0,0': (e: BlockElement) => `${e.to[2]},${e.to[1]}:${e.from[2]},${e.from[1]}`, - '0,0,1': (e: BlockElement) => `${e.from[1]},${e.from[2]}:${e.to[1]},${e.to[2]}`, - '0,0,-1': (e: BlockElement) => `${e.to[1]},${e.to[2]}:${e.from[1]},${e.from[2]}`, - }[dirStr]! - const elementEdgeValidator = { - '0,1,0': (e: BlockElement) => currentElement.from[1] === 0 && e.to[2] === 16, - '0,-1,0': (e: BlockElement) => currentElement.from[1] === 0 && e.to[2] === 16, - '1,0,0': (e: BlockElement) => currentElement.from[0] === 0 && e.to[1] === 16, - '-1,0,0': (e: BlockElement) => currentElement.from[0] === 0 && e.to[1] === 16, - '0,0,1': (e: BlockElement) => currentElement.from[2] === 0 && e.to[0] === 16, - '0,0,-1': (e: BlockElement) => currentElement.from[2] === 0 && e.to[0] === 16, - }[dirStr]! - const useVar = 0 - const models = neighbor.models?.map(m => m[useVar] ?? m[0]) ?? [] - // TODO we should support it! rewrite with optimizing general pipeline - if (models.some(m => m.x || m.y || m.z)) return - return models.every(model => { - return (model.elements ?? []).every(element => { - // todo check alfa on texture - return !!(element.faces[lookForOppositeSide]?.cullface && elemCompareForm(currentElement) === elemCompareForm(element) && elementEdgeValidator(element)) - }) - }) -} - -let needSectionRecomputeOnChange = false - -function renderElement (world: World, cursor: Vec3, element: BlockElement, doAO: boolean, attr: MesherGeometryOutput, globalMatrix: any, globalShift: any, block: Block, biome: string) { - const position = cursor - // const key = `${position.x},${position.y},${position.z}` - // if (!globalThis.allowedBlocks.includes(key)) return - const cullIfIdentical = block.name.includes('glass') || block.name.includes('ice') - - // eslint-disable-next-line guard-for-in - for (const face in element.faces) { - const eFace = element.faces[face] - const { corners, mask1, mask2, side } = elemFaces[face] - const dir = matmul3(globalMatrix, elemFaces[face].dir) - - if (eFace.cullface) { - const neighbor = world.getBlock(cursor.plus(new Vec3(...dir)), blockProvider, {}) - if (neighbor) { - if (cullIfIdentical && neighbor.stateId === block.stateId) continue - if (!neighbor.transparent && (isCube(neighbor) || identicalCull(element, neighbor, new Vec3(...dir)))) continue - } else { - needSectionRecomputeOnChange = true - // continue - } - } - - const minx = element.from[0] - const miny = element.from[1] - const minz = element.from[2] - const maxx = element.to[0] - const maxy = element.to[1] - const maxz = element.to[2] - - const texture = eFace.texture as any - const { u } = texture - const { v } = texture - const { su } = texture - const { sv } = texture - - const ndx = Math.floor(attr.positions.length / 3) - - let tint = [1, 1, 1] - if (eFace.tintindex !== undefined) { - if (eFace.tintindex === 0) { - if (block.name === 'redstone_wire') { - tint = tints.redstone[`${block.getProperties().power}`] - } else if (block.name === 'birch_leaves' || - block.name === 'spruce_leaves' || - block.name === 'lily_pad') { - tint = tints.constant[block.name] - } else if (block.name.includes('leaves') || block.name === 'vine') { - tint = tints.foliage[biome] - } else { - tint = tints.grass[biome] - } - } - } - - // UV rotation - let r = eFace.rotation || 0 - if (face === 'down') { - r += 180 - } - const uvcs = Math.cos(r * Math.PI / 180) - const uvsn = -Math.sin(r * Math.PI / 180) - - let localMatrix = null as any - let localShift = null as any - - if (element.rotation && !needTiles) { - // Rescale support for block model rotations - localMatrix = buildRotationMatrix( - element.rotation.axis, - element.rotation.angle - ) - - localShift = vecsub3( - element.rotation.origin, - matmul3( - localMatrix, - element.rotation.origin - ) - ) - - // Apply rescale if specified - if (element.rotation.rescale) { - const FIT_TO_BLOCK_SCALE_MULTIPLIER = 2 - Math.sqrt(2) - const angleRad = element.rotation.angle * Math.PI / 180 - const scale = Math.abs(Math.sin(angleRad)) * FIT_TO_BLOCK_SCALE_MULTIPLIER - - // Get axis vector components (1 for the rotation axis, 0 for others) - const axisX = element.rotation.axis === 'x' ? 1 : 0 - const axisY = element.rotation.axis === 'y' ? 1 : 0 - const axisZ = element.rotation.axis === 'z' ? 1 : 0 - - // Create scale matrix: scale = (1 - axisComponent) * scaleFactor + 1 - const scaleMatrix = [ - [(1 - axisX) * scale + 1, 0, 0], - [0, (1 - axisY) * scale + 1, 0], - [0, 0, (1 - axisZ) * scale + 1] - ] - - // Apply scaling to the transformation matrix - localMatrix = matmulmat3(localMatrix, scaleMatrix) - - // Recalculate shift with the new matrix - localShift = vecsub3( - element.rotation.origin, - matmul3( - localMatrix, - element.rotation.origin - ) - ) - } - } - - const aos: number[] = [] - const neighborPos = position.plus(new Vec3(...dir)) - // 10% - const baseLight = world.getLight(neighborPos, undefined, undefined, block.name) / 15 - for (const pos of corners) { - let vertex = [ - (pos[0] ? maxx : minx), - (pos[1] ? maxy : miny), - (pos[2] ? maxz : minz) - ] - - if (!needTiles) { // 10% - vertex = vecadd3(matmul3(localMatrix, vertex), localShift) - vertex = vecadd3(matmul3(globalMatrix, vertex), globalShift) - vertex = vertex.map(v => v / 16) - - attr.positions.push( - vertex[0] + (cursor.x & 15) - 8, - vertex[1] + (cursor.y & 15) - 8, - vertex[2] + (cursor.z & 15) - 8 - ) - - attr.normals.push(...dir) - - const baseu = (pos[3] - 0.5) * uvcs - (pos[4] - 0.5) * uvsn + 0.5 - const basev = (pos[3] - 0.5) * uvsn + (pos[4] - 0.5) * uvcs + 0.5 - attr.uvs.push(baseu * su + u, basev * sv + v) - } - - let light = 1 - const { smoothLighting } = world.config - // const smoothLighting = true - if (doAO) { - const dx = pos[0] * 2 - 1 - const dy = pos[1] * 2 - 1 - const dz = pos[2] * 2 - 1 - const cornerDir = matmul3(globalMatrix, [dx, dy, dz]) - const side1Dir = matmul3(globalMatrix, [dx * mask1[0], dy * mask1[1], dz * mask1[2]]) - const side2Dir = matmul3(globalMatrix, [dx * mask2[0], dy * mask2[1], dz * mask2[2]]) - const side1 = world.getBlock(cursor.offset(...side1Dir)) - const side2 = world.getBlock(cursor.offset(...side2Dir)) - const corner = world.getBlock(cursor.offset(...cornerDir)) - - let cornerLightResult = baseLight * 15 - - if (smoothLighting) { - const dirVec = new Vec3(...dir) - const getVec = (v: Vec3) => { - for (const coord of ['x', 'y', 'z']) { - if (Math.abs(dirVec[coord]) > 0) v[coord] = 0 - } - return v.plus(dirVec) - } - const side1LightDir = getVec(new Vec3(...side1Dir)) - const side1Light = world.getLight(cursor.plus(side1LightDir)) - const side2DirLight = getVec(new Vec3(...side2Dir)) - const side2Light = world.getLight(cursor.plus(side2DirLight)) - const cornerLightDir = getVec(new Vec3(...cornerDir)) - const cornerLight = world.getLight(cursor.plus(cornerLightDir)) - // interpolate - const lights = [side1Light, side2Light, cornerLight, baseLight * 15] - cornerLightResult = lights.reduce((acc, cur) => acc + cur, 0) / lights.length - } - - const side1Block = world.shouldMakeAo(side1) ? 1 : 0 - const side2Block = world.shouldMakeAo(side2) ? 1 : 0 - const cornerBlock = world.shouldMakeAo(corner) ? 1 : 0 - - // TODO: correctly interpolate ao light based on pos (evaluate once for each corner of the block) - - const ao = (side1Block && side2Block) ? 0 : (3 - (side1Block + side2Block + cornerBlock)) - // todo light should go upper on lower blocks - light = (ao + 1) / 4 * (cornerLightResult / 15) - aos.push(ao) - } - - if (!needTiles) { - attr.colors.push(tint[0] * light, tint[1] * light, tint[2] * light) - } - } - - const lightWithColor = [baseLight * tint[0], baseLight * tint[1], baseLight * tint[2]] as [number, number, number] - - if (needTiles) { - const tiles = attr.tiles as Tiles - tiles[`${cursor.x},${cursor.y},${cursor.z}`] ??= { - block: block.name, - faces: [], - } - const needsOnlyOneFace = false - const isTilesEmpty = tiles[`${cursor.x},${cursor.y},${cursor.z}`].faces.length < 1 - if (isTilesEmpty || !needsOnlyOneFace) { - tiles[`${cursor.x},${cursor.y},${cursor.z}`].faces.push({ - face, - side, - textureIndex: eFace.texture.tileIndex, - neighbor: `${neighborPos.x},${neighborPos.y},${neighborPos.z}`, - light: baseLight, - tint: lightWithColor, - //@ts-expect-error debug prop - texture: eFace.texture.debugName || block.name, - } satisfies BlockType['faces'][number]) - } - } - - if (!needTiles) { - if (doAO && aos[0] + aos[3] >= aos[1] + aos[2]) { - attr.indices[attr.indicesCount++] = ndx - attr.indices[attr.indicesCount++] = ndx + 3 - attr.indices[attr.indicesCount++] = ndx + 2 - attr.indices[attr.indicesCount++] = ndx - attr.indices[attr.indicesCount++] = ndx + 1 - attr.indices[attr.indicesCount++] = ndx + 3 - } else { - attr.indices[attr.indicesCount++] = ndx - attr.indices[attr.indicesCount++] = ndx + 1 - attr.indices[attr.indicesCount++] = ndx + 2 - attr.indices[attr.indicesCount++] = ndx + 2 - attr.indices[attr.indicesCount++] = ndx + 1 - attr.indices[attr.indicesCount++] = ndx + 3 - } - } - } -} - -const ALWAYS_WATERLOGGED = new Set([ - 'seagrass', - 'tall_seagrass', - 'kelp', - 'kelp_plant', - 'bubble_column' -]) -const isBlockWaterlogged = (block: Block) => { - return block.getProperties().waterlogged === true || block.getProperties().waterlogged === 'true' || ALWAYS_WATERLOGGED.has(block.name) -} - -let unknownBlockModel: BlockModelPartsResolved -export function getSectionGeometry (sx: number, sy: number, sz: number, world: World) { - let delayedRender = [] as Array<() => void> - - const attr: MesherGeometryOutput = { - sx: sx + 8, - sy: sy + 8, - sz: sz + 8, - positions: [], - normals: [], - colors: [], - uvs: [], - t_positions: [], - t_normals: [], - t_colors: [], - t_uvs: [], - indices: [], - indicesCount: 0, // Track current index position - using32Array: true, - tiles: {}, - // todo this can be removed here - heads: {}, - signs: {}, - // isFull: true, - hadErrors: false, - blocksCount: 0 - } - - const cursor = new Vec3(0, 0, 0) - for (cursor.y = sy; cursor.y < sy + 16; cursor.y++) { - for (cursor.z = sz; cursor.z < sz + 16; cursor.z++) { - for (cursor.x = sx; cursor.x < sx + 16; cursor.x++) { - let block = world.getBlock(cursor, blockProvider, attr)! - if (INVISIBLE_BLOCKS.has(block.name)) continue - if ((block.name.includes('_sign') || block.name === 'sign') && !world.config.disableSignsMapsSupport) { - const key = `${cursor.x},${cursor.y},${cursor.z}` - const props: any = block.getProperties() - const facingRotationMap = { - 'north': 2, - 'south': 0, - 'west': 1, - 'east': 3 - } - const isWall = block.name.endsWith('wall_sign') || block.name.endsWith('wall_hanging_sign') - const isHanging = block.name.endsWith('hanging_sign') - attr.signs[key] = { - isWall, - isHanging, - rotation: isWall ? facingRotationMap[props.facing] : +props.rotation - } - } else if (block.name === 'player_head' || block.name === 'player_wall_head') { - const key = `${cursor.x},${cursor.y},${cursor.z}` - const props: any = block.getProperties() - const facingRotationMap = { - 'north': 0, - 'south': 2, - 'west': 3, - 'east': 1 - } - const isWall = block.name === 'player_wall_head' - attr.heads[key] = { - isWall, - rotation: isWall ? facingRotationMap[props.facing] : +props.rotation - } - } - const biome = block.biome.name - - if (world.preflat) { // 10% perf - const patchProperties = preflatBlockCalculation(block, world, cursor) - if (patchProperties) { - block._originalProperties ??= block._properties - block._properties = { ...block._originalProperties, ...patchProperties } - if (block.models && JSON.stringify(block._originalProperties) !== JSON.stringify(block._properties)) { - // recompute models - block.models = undefined - block = world.getBlock(cursor, blockProvider, attr)! - } - } else { - block._properties = block._originalProperties ?? block._properties - block._originalProperties = undefined - } - } - - const isWaterlogged = isBlockWaterlogged(block) - if (block.name === 'water' || isWaterlogged) { - const pos = cursor.clone() - // eslint-disable-next-line @typescript-eslint/no-loop-func - delayedRender.push(() => { - renderLiquid(world, pos, blockProvider.getTextureInfo('water_still'), block.type, biome, true, attr, !isWaterlogged) - }) - attr.blocksCount++ - } else if (block.name === 'lava') { - renderLiquid(world, cursor, blockProvider.getTextureInfo('lava_still'), block.type, biome, false, attr, false) - attr.blocksCount++ - } - if (block.name !== 'water' && block.name !== 'lava' && !INVISIBLE_BLOCKS.has(block.name)) { - // cache - let { models } = block - - models ??= unknownBlockModel - - const firstForceVar = world.config.debugModelVariant?.[0] - let part = 0 - for (const modelVars of models ?? []) { - const pos = cursor.clone() - // const variantRuntime = mod(Math.floor(pos.x / 16) + Math.floor(pos.y / 16) + Math.floor(pos.z / 16), modelVars.length) - const variantRuntime = 0 - const useVariant = world.config.debugModelVariant?.[part] ?? firstForceVar ?? variantRuntime - part++ - const model = modelVars[useVariant] ?? modelVars[0] - if (!model) continue - - // #region 10% - let globalMatrix = null as any - let globalShift = null as any - for (const axis of ['x', 'y', 'z'] as const) { - if (axis in model) { - globalMatrix = globalMatrix ? - matmulmat3(globalMatrix, buildRotationMatrix(axis, -(model[axis] ?? 0))) : - buildRotationMatrix(axis, -(model[axis] ?? 0)) - } - } - if (globalMatrix) { - globalShift = [8, 8, 8] - globalShift = vecsub3(globalShift, matmul3(globalMatrix, globalShift)) - } - // #endregion - - for (const element of model.elements ?? []) { - const ao = model.ao ?? true - if (block.transparent) { - const pos = cursor.clone() - delayedRender.push(() => { - renderElement(world, pos, element, ao, attr, globalMatrix, globalShift, block, biome) - }) - } else { - // 60% - renderElement(world, cursor, element, ao, attr, globalMatrix, globalShift, block, biome) - } - } - } - if (part > 0) attr.blocksCount++ - } - } - } - } - - for (const render of delayedRender) { - render() - } - delayedRender = [] - - let ndx = attr.positions.length / 3 - for (let i = 0; i < attr.t_positions!.length / 12; i++) { - attr.indices[attr.indicesCount++] = ndx - attr.indices[attr.indicesCount++] = ndx + 1 - attr.indices[attr.indicesCount++] = ndx + 2 - attr.indices[attr.indicesCount++] = ndx + 2 - attr.indices[attr.indicesCount++] = ndx + 1 - attr.indices[attr.indicesCount++] = ndx + 3 - // back face - attr.indices[attr.indicesCount++] = ndx - attr.indices[attr.indicesCount++] = ndx + 2 - attr.indices[attr.indicesCount++] = ndx + 1 - attr.indices[attr.indicesCount++] = ndx + 2 - attr.indices[attr.indicesCount++] = ndx + 3 - attr.indices[attr.indicesCount++] = ndx + 1 - ndx += 4 - } - - attr.positions.push(...attr.t_positions!) - attr.normals.push(...attr.t_normals!) - attr.colors.push(...attr.t_colors!) - attr.uvs.push(...attr.t_uvs!) - - delete attr.t_positions - delete attr.t_normals - delete attr.t_colors - delete attr.t_uvs - - attr.positions = new Float32Array(attr.positions) as any - attr.normals = new Float32Array(attr.normals) as any - attr.colors = new Float32Array(attr.colors) as any - attr.uvs = new Float32Array(attr.uvs) as any - attr.using32Array = arrayNeedsUint32(attr.indices) - if (attr.using32Array) { - attr.indices = new Uint32Array(attr.indices) - } else { - attr.indices = new Uint16Array(attr.indices) - } - - if (needTiles) { - delete attr.positions - delete attr.normals - delete attr.colors - delete attr.uvs - } - - return attr -} - -// copied from three.js -function arrayNeedsUint32 (array) { - - // assumes larger values usually on last - - for (let i = array.length - 1; i >= 0; -- i) { - - if (array[i] >= 65_535) return true // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565 - - } - - return false - -} - -export const setBlockStatesData = (blockstatesModels, blocksAtlas: any, _needTiles = false, useUnknownBlockModel = true, version = 'latest') => { - blockProvider = worldBlockProvider(blockstatesModels, blocksAtlas, version) - globalThis.blockProvider = blockProvider - if (useUnknownBlockModel) { - unknownBlockModel = blockProvider.getAllResolvedModels0_1({ name: 'unknown', properties: {} }) - } - - needTiles = _needTiles -} diff --git a/renderer/viewer/lib/mesher/modelsGeometryCommon.ts b/renderer/viewer/lib/mesher/modelsGeometryCommon.ts deleted file mode 100644 index 3df20556..00000000 --- a/renderer/viewer/lib/mesher/modelsGeometryCommon.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { BlockModelPartsResolved } from './world' - -export type BlockElement = NonNullable[0] - - -export function buildRotationMatrix (axis, degree) { - const radians = degree / 180 * Math.PI - const cos = Math.cos(radians) - const sin = Math.sin(radians) - - const axis0 = { x: 0, y: 1, z: 2 }[axis] - const axis1 = (axis0 + 1) % 3 - const axis2 = (axis0 + 2) % 3 - - const matrix = [ - [0, 0, 0], - [0, 0, 0], - [0, 0, 0] - ] - - matrix[axis0][axis0] = 1 - matrix[axis1][axis1] = cos - matrix[axis1][axis2] = -sin - matrix[axis2][axis1] = +sin - matrix[axis2][axis2] = cos - - return matrix -} - -export function vecadd3 (a, b) { - if (!b) return a - return [a[0] + b[0], a[1] + b[1], a[2] + b[2]] -} - -export function vecsub3 (a, b) { - if (!b) return a - return [a[0] - b[0], a[1] - b[1], a[2] - b[2]] -} - -export function matmul3 (matrix, vector): [number, number, number] { - if (!matrix) return vector - return [ - matrix[0][0] * vector[0] + matrix[0][1] * vector[1] + matrix[0][2] * vector[2], - matrix[1][0] * vector[0] + matrix[1][1] * vector[1] + matrix[1][2] * vector[2], - matrix[2][0] * vector[0] + matrix[2][1] * vector[1] + matrix[2][2] * vector[2] - ] -} - -export function matmulmat3 (a, b) { - const te = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] - - const a11 = a[0][0]; const a12 = a[1][0]; const a13 = a[2][0] - const a21 = a[0][1]; const a22 = a[1][1]; const a23 = a[2][1] - const a31 = a[0][2]; const a32 = a[1][2]; const a33 = a[2][2] - - const b11 = b[0][0]; const b12 = b[1][0]; const b13 = b[2][0] - const b21 = b[0][1]; const b22 = b[1][1]; const b23 = b[2][1] - const b31 = b[0][2]; const b32 = b[1][2]; const b33 = b[2][2] - - te[0][0] = a11 * b11 + a12 * b21 + a13 * b31 - te[1][0] = a11 * b12 + a12 * b22 + a13 * b32 - te[2][0] = a11 * b13 + a12 * b23 + a13 * b33 - - te[0][1] = a21 * b11 + a22 * b21 + a23 * b31 - te[1][1] = a21 * b12 + a22 * b22 + a23 * b32 - te[2][1] = a21 * b13 + a22 * b23 + a23 * b33 - - te[0][2] = a31 * b11 + a32 * b21 + a33 * b31 - te[1][2] = a31 * b12 + a32 * b22 + a33 * b32 - te[2][2] = a31 * b13 + a32 * b23 + a33 * b33 - - return te -} - -export const elemFaces = { - up: { - dir: [0, 1, 0], - mask1: [1, 1, 0], - mask2: [0, 1, 1], - corners: [ - [0, 1, 1, 0, 1], - [1, 1, 1, 1, 1], - [0, 1, 0, 0, 0], - [1, 1, 0, 1, 0] - ] - }, - down: { - dir: [0, -1, 0], - mask1: [1, 1, 0], - mask2: [0, 1, 1], - corners: [ - [1, 0, 1, 0, 1], - [0, 0, 1, 1, 1], - [1, 0, 0, 0, 0], - [0, 0, 0, 1, 0] - ] - }, - east: { - dir: [1, 0, 0], - mask1: [1, 1, 0], - mask2: [1, 0, 1], - corners: [ - [1, 1, 1, 0, 0], - [1, 0, 1, 0, 1], - [1, 1, 0, 1, 0], - [1, 0, 0, 1, 1] - ] - }, - west: { - dir: [-1, 0, 0], - mask1: [1, 1, 0], - mask2: [1, 0, 1], - corners: [ - [0, 1, 0, 0, 0], - [0, 0, 0, 0, 1], - [0, 1, 1, 1, 0], - [0, 0, 1, 1, 1] - ] - }, - north: { - dir: [0, 0, -1], - mask1: [1, 0, 1], - mask2: [0, 1, 1], - corners: [ - [1, 0, 0, 1, 1], - [0, 0, 0, 0, 1], - [1, 1, 0, 1, 0], - [0, 1, 0, 0, 0] - ] - }, - south: { - dir: [0, 0, 1], - mask1: [1, 0, 1], - mask2: [0, 1, 1], - corners: [ - [0, 0, 1, 0, 1], - [1, 0, 1, 1, 1], - [0, 1, 1, 0, 0], - [1, 1, 1, 1, 0] - ] - } -} diff --git a/renderer/viewer/lib/mesher/shared.ts b/renderer/viewer/lib/mesher/shared.ts deleted file mode 100644 index 230db6b9..00000000 --- a/renderer/viewer/lib/mesher/shared.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { BlockType } from '../../../playground/shared' - -// only here for easier testing -export const defaultMesherConfig = { - version: '', - worldMaxY: 256, - worldMinY: 0, - enableLighting: true, - skyLight: 15, - smoothLighting: true, - outputFormat: 'threeJs' as 'threeJs' | 'webgpu', - // textureSize: 1024, // for testing - debugModelVariant: undefined as undefined | number[], - clipWorldBelowY: undefined as undefined | number, - disableSignsMapsSupport: false -} - -export type CustomBlockModels = { - [blockPosKey: string]: string // blockPosKey is "x,y,z" -> model name -} - -export type MesherConfig = typeof defaultMesherConfig - -export type MesherGeometryOutput = { - sx: number, - sy: number, - sz: number, - // resulting: float32array - positions: any, - normals: any, - colors: any, - uvs: any, - t_positions?: number[], - t_normals?: number[], - t_colors?: number[], - t_uvs?: number[], - - indices: Uint32Array | Uint16Array | number[], - indicesCount: number, - using32Array: boolean, - tiles: Record, - heads: Record, - signs: Record, - // isFull: boolean - hadErrors: boolean - blocksCount: number - customBlockModels?: CustomBlockModels -} - -export interface MesherMainEvents { - geometry: { type: 'geometry'; key: string; geometry: MesherGeometryOutput; workerIndex: number }; - sectionFinished: { type: 'sectionFinished'; key: string; workerIndex: number; processTime?: number }; - blockStateModelInfo: { type: 'blockStateModelInfo'; info: Record }; - heightmap: { type: 'heightmap'; key: string; heightmap: Uint8Array }; -} - -export type MesherMainEvent = MesherMainEvents[keyof MesherMainEvents] - -export type HighestBlockInfo = { y: number, stateId: number | undefined, biomeId: number | undefined } - -export type BlockStateModelInfo = { - cacheKey: string - issues: string[] - modelNames: string[] - conditions: string[] -} - -export const getBlockAssetsCacheKey = (stateId: number, modelNameOverride?: string) => { - return modelNameOverride ? `${stateId}:${modelNameOverride}` : String(stateId) -} diff --git a/renderer/viewer/lib/mesher/standaloneRenderer.ts b/renderer/viewer/lib/mesher/standaloneRenderer.ts deleted file mode 100644 index 3d468dce..00000000 --- a/renderer/viewer/lib/mesher/standaloneRenderer.ts +++ /dev/null @@ -1,270 +0,0 @@ -/* eslint-disable @stylistic/function-call-argument-newline */ -import { Vec3 } from 'vec3' -import { Block } from 'prismarine-block' -import { IndexedData } from 'minecraft-data' -import * as THREE from 'three' -import { BlockModelPartsResolved } from './world' -import { BlockElement, buildRotationMatrix, elemFaces, matmul3, matmulmat3, vecadd3, vecsub3 } from './modelsGeometryCommon' - -type NeighborSide = 'up' | 'down' | 'east' | 'west' | 'north' | 'south' - -function tintToGl (tint) { - const r = (tint >> 16) & 0xff - const g = (tint >> 8) & 0xff - const b = tint & 0xff - return [r / 255, g / 255, b / 255] -} - -type Neighbors = Partial> -function renderElement (element: BlockElement, doAO: boolean, attr, globalMatrix, globalShift, block: Block | undefined, biome: string, neighbors: Neighbors) { - const cursor = new Vec3(0, 0, 0) - - // const key = `${position.x},${position.y},${position.z}` - // if (!globalThis.allowedBlocks.includes(key)) return - // const cullIfIdentical = block.name.indexOf('glass') >= 0 - - // eslint-disable-next-line guard-for-in - for (const face in element.faces) { - const eFace = element.faces[face] - const { corners, mask1, mask2 } = elemFaces[face] - const dir = matmul3(globalMatrix, elemFaces[face].dir) - - if (eFace.cullface) { - if (neighbors[face]) continue - } - - const minx = element.from[0] - const miny = element.from[1] - const minz = element.from[2] - const maxx = element.to[0] - const maxy = element.to[1] - const maxz = element.to[2] - - const texture = eFace.texture as any - const { u } = texture - const { v } = texture - const { su } = texture - const { sv } = texture - - const ndx = Math.floor(attr.positions.length / 3) - - let tint = [1, 1, 1] - if (eFace.tintindex !== undefined) { - if (eFace.tintindex === 0) { - // TODO - // if (block.name === 'redstone_wire') { - // tint = tints.redstone[`${block.getProperties().power}`] - // } else if (block.name === 'birch_leaves' || - // block.name === 'spruce_leaves' || - // block.name === 'lily_pad') { - // tint = tints.constant[block.name] - // } else if (block.name.includes('leaves') || block.name === 'vine') { - // tint = tints.foliage[biome] - // } else { - // tint = tints.grass[biome] - // } - const grassTint = [145 / 255, 189 / 255, 89 / 255] - tint = grassTint - } - } - - // UV rotation - const r = eFace.rotation || 0 - const uvcs = Math.cos(r * Math.PI / 180) - const uvsn = -Math.sin(r * Math.PI / 180) - - let localMatrix = null as any - let localShift = null as any - - if (element.rotation) { - // todo do we support rescale? - localMatrix = buildRotationMatrix( - element.rotation.axis, - element.rotation.angle - ) - - localShift = vecsub3( - element.rotation.origin, - matmul3( - localMatrix, - element.rotation.origin - ) - ) - } - - const aos: number[] = [] - // const neighborPos = position.plus(new Vec3(...dir)) - // const baseLight = world.getLight(neighborPos, undefined, undefined, block.name) / 15 - const baseLight = 1 - for (const pos of corners) { - let vertex = [ - (pos[0] ? maxx : minx), - (pos[1] ? maxy : miny), - (pos[2] ? maxz : minz) - ] - - vertex = vecadd3(matmul3(localMatrix, vertex), localShift) - vertex = vecadd3(matmul3(globalMatrix, vertex), globalShift) - vertex = vertex.map(v => v / 16) - - attr.positions.push( - vertex[0]/* + (cursor.x & 15) - 8 */, - vertex[1]/* + (cursor.y & 15) x */, - vertex[2]/* + (cursor.z & 15) - 8 */ - ) - - attr.normals.push(...dir) - - const baseu = (pos[3] - 0.5) * uvcs - (pos[4] - 0.5) * uvsn + 0.5 - const basev = (pos[3] - 0.5) * uvsn + (pos[4] - 0.5) * uvcs + 0.5 - attr.uvs.push(baseu * su + u, basev * sv + v) - - let light = 1 - if (doAO) { - const cornerLightResult = 15 - - const side1Block = 0 - const side2Block = 0 - const cornerBlock = 0 - - const ao = (side1Block && side2Block) ? 0 : (3 - (side1Block + side2Block + cornerBlock)) - // todo light should go upper on lower blocks - light = (ao + 1) / 4 * (cornerLightResult / 15) - aos.push(ao) - } - - attr.colors.push(baseLight * tint[0] * light, baseLight * tint[1] * light, baseLight * tint[2] * light) - } - - // if (needTiles) { - // attr.tiles[`${cursor.x},${cursor.y},${cursor.z}`] ??= { - // block: block.name, - // faces: [], - // } - // attr.tiles[`${cursor.x},${cursor.y},${cursor.z}`].faces.push({ - // face, - // neighbor: `${neighborPos.x},${neighborPos.y},${neighborPos.z}`, - // light: baseLight - // // texture: eFace.texture.name, - // }) - // } - - if (doAO && aos[0] + aos[3] >= aos[1] + aos[2]) { - attr.indices.push( - - ndx, ndx + 3, ndx + 2, - ndx, ndx + 1, ndx + 3 - ) - } else { - attr.indices.push( - - ndx, ndx + 1, ndx + 2, - ndx + 2, ndx + 1, ndx + 3 - ) - } - } -} - -export const renderBlockThreeAttr = (models: BlockModelPartsResolved, block: Block | undefined, biome: string, mcData: IndexedData, variants = [], neighbors: Neighbors = {}) => { - const sx = 0 - const sy = 0 - const sz = 0 - - const attr = { - sx: sx + 0.5, - sy: sy + 0.5, - sz: sz + 0.5, - positions: [], - normals: [], - colors: [], - uvs: [], - t_positions: [], - t_normals: [], - t_colors: [], - t_uvs: [], - indices: [], - tiles: {}, - } as Record - - for (const [i, modelVars] of models.entries()) { - const model = modelVars[variants[i]] ?? modelVars[0] - if (!model) continue - let globalMatrix = null as any - let globalShift = null as any - for (const axis of ['x', 'y', 'z'] as const) { - if (axis in model) { - if (globalMatrix) { globalMatrix = matmulmat3(globalMatrix, buildRotationMatrix(axis, -(model[axis] ?? 0))) } else { globalMatrix = buildRotationMatrix(axis, -(model[axis] ?? 0)) } - } - } - if (globalMatrix) { - globalShift = [8, 8, 8] - globalShift = vecsub3(globalShift, matmul3(globalMatrix, globalShift)) - } - - const ao = model.ao ?? true - - for (const element of model.elements ?? []) { - renderElement(element, ao, attr, globalMatrix, globalShift, block, biome, neighbors) - } - } - - let ndx = attr.positions.length / 3 - for (let i = 0; i < attr.t_positions.length / 12; i++) { - attr.indices.push( - ndx, ndx + 1, ndx + 2, ndx + 2, ndx + 1, ndx + 3, - // back face - ndx, ndx + 2, ndx + 1, ndx + 2, ndx + 3, ndx + 1 - ) - ndx += 4 - } - - attr.positions.push(...attr.t_positions) - attr.normals.push(...attr.t_normals) - attr.colors.push(...attr.t_colors) - attr.uvs.push(...attr.t_uvs) - - delete attr.t_positions - delete attr.t_normals - delete attr.t_colors - delete attr.t_uvs - - attr.positions = new Float32Array(attr.positions) as any - attr.normals = new Float32Array(attr.normals) as any - attr.colors = new Float32Array(attr.colors) as any - attr.uvs = new Float32Array(attr.uvs) as any - - return attr -} - -export const renderBlockThree = (...args: Parameters) => { - const attr = renderBlockThreeAttr(...args) - const data = { - geometry: attr - } - - const geometry = new THREE.BufferGeometry() - geometry.setAttribute('position', new THREE.BufferAttribute(data.geometry.positions, 3)) - geometry.setAttribute('normal', new THREE.BufferAttribute(data.geometry.normals, 3)) - geometry.setAttribute('color', new THREE.BufferAttribute(data.geometry.colors, 3)) - geometry.setAttribute('uv', new THREE.BufferAttribute(data.geometry.uvs, 2)) - geometry.setIndex(data.geometry.indices) - geometry.name = 'block-geometry' - - return geometry -} - -export const getThreeBlockModelGroup = (material: THREE.Material, ...args: Parameters) => { - const geometry = renderBlockThree(...args) - const mesh = new THREE.Mesh(geometry, material) - mesh.position.set(-0.5, -0.5, -0.5) - const group = new THREE.Group() - group.add(mesh) - group.rotation.set(0, -THREE.MathUtils.degToRad(90), 0, 'ZYX') - globalThis.mesh = group - return group - // return new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), new THREE.MeshPhongMaterial({ color: 0x00_00_ff, transparent: true, opacity: 0.5 })) -} - -export const setBlockPosition = (object: THREE.Object3D, position: { x: number, y: number, z: number }) => { - object.position.set(position.x + 0.5, position.y + 0.5, position.z + 0.5) -} diff --git a/renderer/viewer/lib/mesher/test/mesherTester.ts b/renderer/viewer/lib/mesher/test/mesherTester.ts deleted file mode 100644 index e75d803d..00000000 --- a/renderer/viewer/lib/mesher/test/mesherTester.ts +++ /dev/null @@ -1,76 +0,0 @@ -import ChunkLoader, { PCChunk } from 'prismarine-chunk' -import { Vec3 } from 'vec3' -import MinecraftData from 'minecraft-data' -import blocksAtlasesJson from 'mc-assets/dist/blocksAtlases.json' -import { World as MesherWorld } from '../world' -import { setBlockStatesData, getSectionGeometry } from '../models' - -export const setup = (version, initialBlocks: Array<[number[], string]>) => { - const mcData = MinecraftData(version) - const blockStatesModels = require(`mc-assets/dist/blockStatesModels.json`) - const mesherWorld = new MesherWorld(version) - const Chunk = ChunkLoader(version) - const chunk1 = new Chunk(undefined as any) - - const pos = new Vec3(2, 5, 2) - for (const [addPos, name] of initialBlocks) { - chunk1.setBlockStateId(pos.offset(addPos[0], addPos[1], addPos[2]), mcData.blocksByName[name].defaultState) - } - - const getGeometry = () => { - const sectionGeometry = getSectionGeometry(0, 0, 0, mesherWorld) - const centerFaces = sectionGeometry.tiles[`${pos.x},${pos.y},${pos.z}`]?.faces.length ?? 0 - const totalTiles = Object.values(sectionGeometry.tiles).reduce((acc, val: any) => acc + val.faces.length, 0) - const centerTileNeighbors = Object.entries(sectionGeometry.tiles).reduce((acc, [key, val]: any) => { - return acc + val.faces.filter((face: any) => face.neighbor === `${pos.x},${pos.y},${pos.z}`).length - }, 0) - return { - centerFaces, - totalTiles, - centerTileNeighbors, - faces: sectionGeometry.tiles[`${pos.x},${pos.y},${pos.z}`]?.faces ?? [], - attr: sectionGeometry - } - } - - setBlockStatesData(blockStatesModels, blocksAtlasesJson, true, false, version) - const reload = () => { - mesherWorld.removeColumn(0, 0) - mesherWorld.addColumn(0, 0, chunk1.toJson()) - } - reload() - - const getLights = () => { - return Object.fromEntries(getGeometry().faces.map(({ face, light }) => ([face, (light ?? 0) * 15 - 2]))) - } - - const setLight = (x: number, y: number, z: number, val = 0) => { - // create columns first - chunk1.setBlockLight(pos.offset(x, y, z), 15) - chunk1.setSkyLight(pos.offset(x, y, z), 15) - chunk1.setBlockLight(pos.offset(x, y, z), val) - chunk1.setSkyLight(pos.offset(x, y, z), 0) - } - - return { - mesherWorld, - setLight, - getLights, - getGeometry, - pos, - mcData, - reload, - chunk: chunk1 as PCChunk - } -} - -// surround it -const addPositions = [ - // [[0, 0, 0], 'diamond_block'], - [[1, 0, 0], 'stone'], - [[-1, 0, 0], 'stone'], - [[0, 1, 0], 'stone'], - [[0, -1, 0], 'stone'], - [[0, 0, 1], 'stone'], - [[0, 0, -1], 'stone'], -] diff --git a/renderer/viewer/lib/mesher/test/playground.ts b/renderer/viewer/lib/mesher/test/playground.ts deleted file mode 100644 index 0441dd60..00000000 --- a/renderer/viewer/lib/mesher/test/playground.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { BlockNames } from '../../../../../src/mcDataTypes' -import { setup } from './mesherTester' - -const addPositions = [ - // [[0, 0, 0], 'diamond_block'], - [[1, 0, 0], 'stone'], - [[-1, 0, 0], 'stone'], - [[0, 1, 0], 'stone'], - [[0, -1, 0], 'stone'], - [[0, 0, 1], 'stone'], - [[0, 0, -1], 'stone'], -] as const - -const { mesherWorld, getGeometry, pos, mcData } = setup('1.21.1', addPositions as any) - -// mesherWorld.setBlockStateId(pos, 712) -// mesherWorld.setBlockStateId(pos, mcData.blocksByName.stone_slab.defaultState) -mesherWorld.setBlockStateId(pos, 11_225) - -console.log(getGeometry().centerTileNeighbors) diff --git a/renderer/viewer/lib/mesher/test/tests.test.ts b/renderer/viewer/lib/mesher/test/tests.test.ts deleted file mode 100644 index 2c3dc6a5..00000000 --- a/renderer/viewer/lib/mesher/test/tests.test.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { test, expect } from 'vitest' -import supportedVersions from '../../../../../src/supportedVersions.mjs' -import { INVISIBLE_BLOCKS } from '../worldConstants' -import { setup } from './mesherTester' - -const lastVersion = supportedVersions.at(-1) - -const addPositions = [ - // [[0, 0, 0], 'diamond_block'], - // [[1, 0, 0], 'stone'], - // [[-1, 0, 0], 'stone'], - // [[0, 1, 0], 'stone'], - // [[0, -1, 0], 'stone'], - // [[0, 0, 1], 'stone'], - // [[0, 0, -1], 'stone'], -] as const - -test('Known blocks are not rendered', () => { - const { mesherWorld, getGeometry, pos, mcData } = setup(lastVersion, addPositions as any) - const ignoreAsExpected = new Set([...INVISIBLE_BLOCKS, 'water', 'lava']) - - let time = 0 - let times = 0 - const missingBlocks = {}/* as {[number, number]} */ - const erroredBlocks = {}/* as {[number, number]} */ - for (const block of mcData.blocksArray) { - if (ignoreAsExpected.has(block.name)) continue - // if (block.maxStateId! - block.minStateId! > 100) continue - // for (let i = block.minStateId!; i <= block.maxStateId!; i++) { - for (let i = block.defaultState; i <= block.defaultState; i++) { - // if (block.transparent) continue - mesherWorld.setBlockStateId(pos, i) - const start = performance.now() - const { centerFaces, totalTiles, centerTileNeighbors, attr } = getGeometry() - time += performance.now() - start - times++ - if (centerFaces === 0) { - const objAdd = attr.hadErrors ? erroredBlocks : missingBlocks - if (objAdd[block.name]) continue - objAdd[block.name] = true - // invalidBlocks[block.name] = [i - block.defaultState!, centerTileNeighbors] - // console.log('INVALID', block.name, centerTileNeighbors, i - block.minStateId) - } - } - } - console.log('Checking blocks of version', lastVersion) - console.log('Average time', time / times) - // should be fixed, but to avoid regressions & for visibility - // TODO resolve creaking_heart issue (1.21.3) - expect(missingBlocks).toMatchInlineSnapshot(` - { - "structure_void": true, - } - `) - expect(erroredBlocks).toMatchInlineSnapshot('{}') -}) diff --git a/renderer/viewer/lib/mesher/world.ts b/renderer/viewer/lib/mesher/world.ts deleted file mode 100644 index f2757ae6..00000000 --- a/renderer/viewer/lib/mesher/world.ts +++ /dev/null @@ -1,270 +0,0 @@ -import Chunks from 'prismarine-chunk' -import mcData from 'minecraft-data' -import { Block } from 'prismarine-block' -import { Vec3 } from 'vec3' -import { WorldBlockProvider } from 'mc-assets/dist/worldBlockProvider' -import moreBlockDataGeneratedJson from '../moreBlockDataGenerated.json' -import legacyJson from '../../../../src/preflatMap.json' -import { defaultMesherConfig, CustomBlockModels, BlockStateModelInfo, getBlockAssetsCacheKey } from './shared' -import { INVISIBLE_BLOCKS } from './worldConstants' - -const ignoreAoBlocks = Object.keys(moreBlockDataGeneratedJson.noOcclusions) - -function columnKey (x, z) { - return `${x},${z}` -} - -function isCube (shapes) { - if (!shapes || shapes.length !== 1) return false - const shape = shapes[0] - return shape[0] === 0 && shape[1] === 0 && shape[2] === 0 && shape[3] === 1 && shape[4] === 1 && shape[5] === 1 -} - -export type BlockModelPartsResolved = ReturnType - -export type WorldBlock = Omit & { - // todo - isCube: boolean - /** cache */ - models?: BlockModelPartsResolved | null - _originalProperties?: Record - _properties?: Record -} - -export class World { - config = defaultMesherConfig - Chunk: typeof import('prismarine-chunk/types/index').PCChunk - columns = {} as { [key: string]: import('prismarine-chunk/types/index').PCChunk } - blockCache = {} - biomeCache: { [id: number]: mcData.Biome } - preflat: boolean - erroredBlockModel?: BlockModelPartsResolved - customBlockModels = new Map() // chunkKey -> blockModels - sentBlockStateModels = new Set() - blockStateModelInfo = new Map() - - constructor (version) { - this.Chunk = Chunks(version) as any - this.biomeCache = mcData(version).biomes - this.preflat = !mcData(version).supportFeature('blockStateId') - this.config.version = version - } - - getLight (pos: Vec3, isNeighbor = false, skipMoreChecks = false, curBlockName = '') { - // for easier testing - if (!(pos instanceof Vec3)) pos = new Vec3(...pos as [number, number, number]) - const { enableLighting, skyLight } = this.config - if (!enableLighting) return 15 - // const key = `${pos.x},${pos.y},${pos.z}` - // if (lightsCache.has(key)) return lightsCache.get(key) - const column = this.getColumnByPos(pos) - if (!column || !hasChunkSection(column, pos)) return 15 - let result = Math.min( - 15, - Math.max( - column.getBlockLight(posInChunk(pos)), - Math.min(skyLight, column.getSkyLight(posInChunk(pos))) - ) + 2 - ) - // lightsCache.set(key, result) - if (result === 2 && [this.getBlock(pos)?.name ?? '', curBlockName].some(x => /_stairs|slab|glass_pane/.exec(x)) && !skipMoreChecks) { // todo this is obviously wrong - const lights = [ - this.getLight(pos.offset(0, 1, 0), undefined, true), - this.getLight(pos.offset(0, -1, 0), undefined, true), - this.getLight(pos.offset(0, 0, 1), undefined, true), - this.getLight(pos.offset(0, 0, -1), undefined, true), - this.getLight(pos.offset(1, 0, 0), undefined, true), - this.getLight(pos.offset(-1, 0, 0), undefined, true) - ].filter(x => x !== 2) - if (lights.length) { - const min = Math.min(...lights) - result = min - } - } - if (isNeighbor && result === 2) result = 15 // TODO - return result - } - - addColumn (x, z, json) { - const chunk = this.Chunk.fromJson(json) - this.columns[columnKey(x, z)] = chunk as any - return chunk - } - - removeColumn (x, z) { - delete this.columns[columnKey(x, z)] - } - - getColumn (x, z) { - return this.columns[columnKey(x, z)] - } - - setBlockStateId (pos: Vec3, stateId) { - if (stateId === undefined) throw new Error('stateId is undefined') - const key = columnKey(Math.floor(pos.x / 16) * 16, Math.floor(pos.z / 16) * 16) - - const column = this.columns[key] - // null column means chunk not loaded - if (!column) return false - - column.setBlockStateId(posInChunk(pos.floored()), stateId) - - return true - } - - getColumnByPos (pos: Vec3) { - return this.getColumn(Math.floor(pos.x / 16) * 16, Math.floor(pos.z / 16) * 16) - } - - getBlock (pos: Vec3, blockProvider?: WorldBlockProvider, attr?: { hadErrors?: boolean }): WorldBlock | null { - // for easier testing - if (!(pos instanceof Vec3)) pos = new Vec3(...pos as [number, number, number]) - const key = columnKey(Math.floor(pos.x / 16) * 16, Math.floor(pos.z / 16) * 16) - const blockPosKey = `${pos.x},${pos.y},${pos.z}` - const modelOverride = this.customBlockModels.get(key)?.[blockPosKey] - - const column = this.columns[key] - // null column means chunk not loaded - if (!column) return null - - const loc = pos.floored() - const locInChunk = posInChunk(loc) - const stateId = column.getBlockStateId(locInChunk) - - const cacheKey = getBlockAssetsCacheKey(stateId, modelOverride) - - if (!this.blockCache[cacheKey]) { - const b = column.getBlock(locInChunk) as unknown as WorldBlock - if (modelOverride) { - b.name = modelOverride - } - b.isCube = isCube(b.shapes) - this.blockCache[cacheKey] = b - Object.defineProperty(b, 'position', { - get () { - throw new Error('position is not reliable, use pos parameter instead of block.position') - } - }) - if (this.preflat) { - b._properties = {} - - const namePropsStr = legacyJson.blocks[b.type + ':' + b.metadata] || findClosestLegacyBlockFallback(b.type, b.metadata, pos) - if (namePropsStr) { - b.name = namePropsStr.split('[')[0] - const propsStr = namePropsStr.split('[')?.[1]?.split(']') - if (propsStr) { - const newProperties = Object.fromEntries(propsStr.join('').split(',').map(x => { - let [key, val] = x.split('=') - if (!isNaN(val)) val = parseInt(val, 10) - return [key, val] - })) - b._properties = newProperties - } - } - } - } - - const block: WorldBlock = this.blockCache[cacheKey] - - if (block.models === undefined && blockProvider) { - if (!attr) throw new Error('attr is required') - const props = block.getProperties() - - try { - // fixme - if (this.preflat) { - if (block.name === 'cobblestone_wall') { - props.up = 'true' - for (const key of ['north', 'south', 'east', 'west']) { - const val = props[key] - if (val === 'false' || val === 'true') { - props[key] = val === 'true' ? 'low' : 'none' - } - } - } - } - - const useFallbackModel = !!(this.preflat || modelOverride) - const issues = [] as string[] - const resolvedModelNames = [] as string[] - const resolvedConditions = [] as string[] - block.models = blockProvider.getAllResolvedModels0_1( - { - name: block.name, - properties: props, - }, - useFallbackModel, - issues, - resolvedModelNames, - resolvedConditions - )! - - // Track block state model info - if (!this.sentBlockStateModels.has(cacheKey)) { - this.blockStateModelInfo.set(cacheKey, { - cacheKey, - issues, - modelNames: resolvedModelNames, - conditions: resolvedConditions - }) - } - - if (!block.models.length) { - if (block.name !== 'water' && block.name !== 'lava' && !INVISIBLE_BLOCKS.has(block.name)) { - console.debug('[mesher] block to render not found', block.name, props) - } - block.models = null - } - - if (block.models && modelOverride) { - const model = block.models[0] - block.transparent = model[0]?.['transparent'] ?? block.transparent - } - } catch (err) { - this.erroredBlockModel ??= blockProvider.getAllResolvedModels0_1({ name: 'errored', properties: {} }) - block.models ??= this.erroredBlockModel - console.error(`Critical assets error. Unable to get block model for ${block.name}[${JSON.stringify(props)}]: ` + err.message, err.stack) - attr.hadErrors = true - } - } - - if (block.name === 'flowing_water') block.name = 'water' - if (block.name === 'flowing_lava') block.name = 'lava' - if (block.name === 'bubble_column') block.name = 'water' // TODO need to distinguish between water and bubble column - // block.position = loc // it overrides position of all currently loaded blocks - //@ts-expect-error - block.biome = this.biomeCache[column.getBiome(locInChunk)] ?? this.biomeCache[1] ?? this.biomeCache[0] - if (block.name === 'redstone_ore') block.transparent = false - return block - } - - shouldMakeAo (block: WorldBlock | null) { - return block?.isCube && !ignoreAoBlocks.includes(block.name) - } -} - -const findClosestLegacyBlockFallback = (id, metadata, pos) => { - console.warn(`[mesher] Unknown block with ${id}:${metadata} at ${pos}, falling back`) // todo has known issues - for (const [key, value] of Object.entries(legacyJson.blocks)) { - const [idKey, meta] = key.split(':') - if (idKey === id) return value - } - return null -} - -// todo export in chunk instead -const hasChunkSection = (column, pos) => { - if (column._getSection) return column._getSection(pos) - if (column.skyLightSections) { - return column.skyLightSections[getLightSectionIndex(pos, column.minY)] || column.blockLightSections[getLightSectionIndex(pos, column.minY)] - } - if (column.sections) return column.sections[pos.y >> 4] -} - -function posInChunk (pos) { - return new Vec3(Math.floor(pos.x) & 15, Math.floor(pos.y), Math.floor(pos.z) & 15) -} - -function getLightSectionIndex (pos, minY = 0) { - return Math.floor((pos.y - minY) / 16) + 1 -} diff --git a/renderer/viewer/lib/mesher/worldConstants.ts b/renderer/viewer/lib/mesher/worldConstants.ts deleted file mode 100644 index 6aa0e0fc..00000000 --- a/renderer/viewer/lib/mesher/worldConstants.ts +++ /dev/null @@ -1 +0,0 @@ -export const INVISIBLE_BLOCKS = new Set(['air', 'void_air', 'cave_air', 'barrier', 'light', 'moving_piston']) diff --git a/renderer/viewer/lib/mesherlogReader.ts b/renderer/viewer/lib/mesherlogReader.ts deleted file mode 100644 index 0f1e74c0..00000000 --- a/renderer/viewer/lib/mesherlogReader.ts +++ /dev/null @@ -1,131 +0,0 @@ -/* eslint-disable no-await-in-loop */ -import { Vec3 } from 'vec3' - -// import log from '../../../../../Downloads/mesher (2).log' -import { WorldRendererCommon } from './worldrendererCommon' -const log = '' - - -export class MesherLogReader { - chunksToReceive: Array<{ - x: number - z: number - chunkLength: number - }> = [] - messagesQueue: Array<{ - fromWorker: boolean - workerIndex: number - message: any - }> = [] - - sectionFinishedToReceive = null as { - messagesLeft: string[] - resolve: () => void - } | null - replayStarted = false - - constructor (private readonly worldRenderer: WorldRendererCommon) { - this.parseMesherLog() - } - - chunkReceived (x: number, z: number, chunkLength: number) { - // remove existing chunks with same x and z - const existingChunkIndex = this.chunksToReceive.findIndex(chunk => chunk.x === x && chunk.z === z) - if (existingChunkIndex === -1) { - // console.error('Chunk not found', x, z) - } else { - // warn if chunkLength is different - if (this.chunksToReceive[existingChunkIndex].chunkLength !== chunkLength) { - // console.warn('Chunk length mismatch', x, z, this.chunksToReceive[existingChunkIndex].chunkLength, chunkLength) - } - // remove chunk - this.chunksToReceive = this.chunksToReceive.filter((chunk, index) => chunk.x !== x || chunk.z !== z) - } - this.maybeStartReplay() - } - - async maybeStartReplay () { - if (this.chunksToReceive.length !== 0 || this.replayStarted) return - const lines = log.split('\n') - console.log('starting replay') - this.replayStarted = true - const waitForWorkersMessages = async () => { - if (!this.sectionFinishedToReceive) return - await new Promise(resolve => { - this.sectionFinishedToReceive!.resolve = resolve - }) - } - - for (const line of lines) { - if (line.includes('dispatchMessages dirty')) { - await waitForWorkersMessages() - this.worldRenderer.stopMesherMessagesProcessing = true - const message = JSON.parse(line.slice(line.indexOf('{'), line.lastIndexOf('}') + 1)) - if (!message.value) continue - const index = line.split(' ')[1] - const type = line.split(' ')[3] - // console.log('sending message', message.x, message.y, message.z) - this.worldRenderer.forceCallFromMesherReplayer = true - this.worldRenderer.setSectionDirty(new Vec3(message.x, message.y, message.z), message.value) - this.worldRenderer.forceCallFromMesherReplayer = false - } - if (line.includes('-> blockUpdate')) { - await waitForWorkersMessages() - this.worldRenderer.stopMesherMessagesProcessing = true - const message = JSON.parse(line.slice(line.indexOf('{'), line.lastIndexOf('}') + 1)) - this.worldRenderer.forceCallFromMesherReplayer = true - this.worldRenderer.setBlockStateIdInner(new Vec3(message.pos.x, message.pos.y, message.pos.z), message.stateId) - this.worldRenderer.forceCallFromMesherReplayer = false - } - - if (line.includes(' sectionFinished ')) { - if (!this.sectionFinishedToReceive) { - console.log('starting worker message processing validating') - this.worldRenderer.stopMesherMessagesProcessing = false - this.sectionFinishedToReceive = { - messagesLeft: [], - resolve: () => { - this.sectionFinishedToReceive = null - } - } - } - const parts = line.split(' ') - const coordsPart = parts.find(part => part.split(',').length === 3) - if (!coordsPart) throw new Error(`no coords part found ${line}`) - const [x, y, z] = coordsPart.split(',').map(Number) - this.sectionFinishedToReceive.messagesLeft.push(`${x},${y},${z}`) - } - } - } - - workerMessageReceived (type: string, message: any) { - if (type === 'sectionFinished') { - const { key } = message - if (!this.sectionFinishedToReceive) { - console.warn(`received sectionFinished message but no sectionFinishedToReceive ${key}`) - return - } - - const idx = this.sectionFinishedToReceive.messagesLeft.indexOf(key) - if (idx === -1) { - console.warn(`received sectionFinished message for non-outstanding section ${key}`) - return - } - this.sectionFinishedToReceive.messagesLeft.splice(idx, 1) - if (this.sectionFinishedToReceive.messagesLeft.length === 0) { - this.sectionFinishedToReceive.resolve() - } - } - } - - parseMesherLog () { - const lines = log.split('\n') - for (const line of lines) { - if (line.startsWith('-> chunk')) { - const chunk = JSON.parse(line.slice('-> chunk'.length)) - this.chunksToReceive.push(chunk) - continue - } - } - } -} diff --git a/renderer/viewer/lib/moreBlockDataGenerated.json b/renderer/viewer/lib/moreBlockDataGenerated.json deleted file mode 100644 index a2ca2087..00000000 --- a/renderer/viewer/lib/moreBlockDataGenerated.json +++ /dev/null @@ -1,714 +0,0 @@ -{ - "lightLevels": { - "lava": 15, - "brown_mushroom": 1, - "torch": 14, - "wall_torch": 14, - "fire": 15, - "soul_fire": 10, - "soul_torch": 10, - "soul_wall_torch": 10, - "glowstone": 15, - "nether_portal": 11, - "jack_o_lantern": 15, - "enchanting_table": 7, - "brewing_stand": 1, - "lava_cauldron": 15, - "end_portal": 15, - "end_portal_frame": 1, - "dragon_egg": 1, - "ender_chest": 7, - "beacon": 15, - "sea_lantern": 15, - "end_rod": 14, - "end_gateway": 15, - "magma_block": 3, - "conduit": 15, - "lantern": 15, - "soul_lantern": 10, - "shroomlight": 15, - "crying_obsidian": 10, - "amethyst_cluster": 5, - "large_amethyst_bud": 4, - "medium_amethyst_bud": 2, - "small_amethyst_bud": 1, - "sculk_sensor": 1, - "sculk_catalyst": 6, - "ochre_froglight": 15, - "verdant_froglight": 15, - "pearlescent_froglight": 15 - }, - "noOcclusions": { - "mangrove_roots": true, - "oak_leaves": true, - "spruce_leaves": true, - "birch_leaves": true, - "jungle_leaves": true, - "acacia_leaves": true, - "cherry_leaves": true, - "dark_oak_leaves": true, - "mangrove_leaves": true, - "azalea_leaves": true, - "flowering_azalea_leaves": true, - "glass": true, - "white_bed": true, - "orange_bed": true, - "magenta_bed": true, - "light_blue_bed": true, - "yellow_bed": true, - "lime_bed": true, - "pink_bed": true, - "gray_bed": true, - "light_gray_bed": true, - "cyan_bed": true, - "purple_bed": true, - "blue_bed": true, - "brown_bed": true, - "green_bed": true, - "red_bed": true, - "black_bed": true, - "moving_piston": true, - "spawner": true, - "oak_door": true, - "ladder": true, - "iron_door": true, - "ice": true, - "white_stained_glass": true, - "orange_stained_glass": true, - "magenta_stained_glass": true, - "light_blue_stained_glass": true, - "yellow_stained_glass": true, - "lime_stained_glass": true, - "pink_stained_glass": true, - "gray_stained_glass": true, - "light_gray_stained_glass": true, - "cyan_stained_glass": true, - "purple_stained_glass": true, - "blue_stained_glass": true, - "brown_stained_glass": true, - "green_stained_glass": true, - "red_stained_glass": true, - "black_stained_glass": true, - "oak_trapdoor": true, - "spruce_trapdoor": true, - "birch_trapdoor": true, - "jungle_trapdoor": true, - "acacia_trapdoor": true, - "cherry_trapdoor": true, - "dark_oak_trapdoor": true, - "mangrove_trapdoor": true, - "bamboo_trapdoor": true, - "iron_bars": true, - "chain": true, - "glass_pane": true, - "lily_pad": true, - "brewing_stand": true, - "cauldron": true, - "dragon_egg": true, - "cocoa": true, - "beacon": true, - "hopper": true, - "white_stained_glass_pane": true, - "orange_stained_glass_pane": true, - "magenta_stained_glass_pane": true, - "light_blue_stained_glass_pane": true, - "yellow_stained_glass_pane": true, - "lime_stained_glass_pane": true, - "pink_stained_glass_pane": true, - "gray_stained_glass_pane": true, - "light_gray_stained_glass_pane": true, - "cyan_stained_glass_pane": true, - "purple_stained_glass_pane": true, - "blue_stained_glass_pane": true, - "brown_stained_glass_pane": true, - "green_stained_glass_pane": true, - "red_stained_glass_pane": true, - "black_stained_glass_pane": true, - "slime_block": true, - "barrier": true, - "light": true, - "iron_trapdoor": true, - "spruce_door": true, - "birch_door": true, - "jungle_door": true, - "acacia_door": true, - "cherry_door": true, - "dark_oak_door": true, - "mangrove_door": true, - "bamboo_door": true, - "end_rod": true, - "chorus_plant": true, - "chorus_flower": true, - "frosted_ice": true, - "turtle_egg": true, - "sniffer_egg": true, - "sea_pickle": true, - "conduit": true, - "bamboo": true, - "lantern": true, - "soul_lantern": true, - "campfire": true, - "soul_campfire": true, - "crimson_trapdoor": true, - "warped_trapdoor": true, - "crimson_door": true, - "warped_door": true, - "honey_block": true, - "candle": true, - "white_candle": true, - "orange_candle": true, - "magenta_candle": true, - "light_blue_candle": true, - "yellow_candle": true, - "lime_candle": true, - "pink_candle": true, - "gray_candle": true, - "light_gray_candle": true, - "cyan_candle": true, - "purple_candle": true, - "blue_candle": true, - "brown_candle": true, - "green_candle": true, - "red_candle": true, - "black_candle": true, - "amethyst_cluster": true, - "tinted_glass": true, - "lightning_rod": true, - "pointed_dripstone": true, - "azalea": true, - "flowering_azalea": true, - "frogspawn": true, - "decorated_pot": true - }, - "colors": { - "stone": "rgb(112, 112, 112)", - "granite": "rgb(151, 109, 77)", - "polished_granite": "rgb(151, 109, 77)", - "diorite": "rgb(255, 252, 245)", - "polished_diorite": "rgb(255, 252, 245)", - "andesite": "rgb(112, 112, 112)", - "polished_andesite": "rgb(112, 112, 112)", - "grass_block": "rgb(127, 178, 56)", - "dirt": "rgb(151, 109, 77)", - "coarse_dirt": "rgb(151, 109, 77)", - "podzol": "rgb(129, 86, 49)", - "cobblestone": "rgb(112, 112, 112)", - "oak_planks": "rgb(143, 119, 72)", - "spruce_planks": "rgb(129, 86, 49)", - "birch_planks": "rgb(247, 233, 163)", - "jungle_planks": "rgb(151, 109, 77)", - "acacia_planks": "rgb(216, 127, 51)", - "cherry_planks": "rgb(209, 177, 161)", - "dark_oak_planks": "rgb(102, 76, 51)", - "mangrove_planks": "rgb(153, 51, 51)", - "bamboo_planks": "rgb(229, 229, 51)", - "bamboo_mosaic": "rgb(229, 229, 51)", - "oak_sapling": "rgb(0, 124, 0)", - "spruce_sapling": "rgb(0, 124, 0)", - "birch_sapling": "rgb(0, 124, 0)", - "jungle_sapling": "rgb(0, 124, 0)", - "acacia_sapling": "rgb(0, 124, 0)", - "cherry_sapling": "rgb(242, 127, 165)", - "dark_oak_sapling": "rgb(0, 124, 0)", - "mangrove_propagule": "rgb(0, 124, 0)", - "bedrock": "rgb(112, 112, 112)", - "water": "rgb(64, 64, 255)", - "lava": "rgb(255, 0, 0)", - "sand": "rgb(247, 233, 163)", - "suspicious_sand": "rgb(247, 233, 163)", - "red_sand": "rgb(216, 127, 51)", - "gravel": "rgb(112, 112, 112)", - "suspicious_gravel": "rgb(112, 112, 112)", - "gold_ore": "rgb(112, 112, 112)", - "deepslate_gold_ore": "rgb(100, 100, 100)", - "iron_ore": "rgb(112, 112, 112)", - "deepslate_iron_ore": "rgb(100, 100, 100)", - "coal_ore": "rgb(112, 112, 112)", - "deepslate_coal_ore": "rgb(100, 100, 100)", - "nether_gold_ore": "rgb(112, 2, 0)", - "mangrove_roots": "rgb(129, 86, 49)", - "muddy_mangrove_roots": "rgb(129, 86, 49)", - "oak_wood": "rgb(143, 119, 72)", - "spruce_wood": "rgb(129, 86, 49)", - "birch_wood": "rgb(247, 233, 163)", - "jungle_wood": "rgb(151, 109, 77)", - "acacia_wood": "rgb(76, 76, 76)", - "cherry_wood": "rgb(57, 41, 35)", - "dark_oak_wood": "rgb(102, 76, 51)", - "mangrove_wood": "rgb(153, 51, 51)", - "stripped_oak_wood": "rgb(143, 119, 72)", - "stripped_spruce_wood": "rgb(129, 86, 49)", - "stripped_birch_wood": "rgb(247, 233, 163)", - "stripped_jungle_wood": "rgb(151, 109, 77)", - "stripped_acacia_wood": "rgb(216, 127, 51)", - "stripped_cherry_wood": "rgb(160, 77, 78)", - "stripped_dark_oak_wood": "rgb(102, 76, 51)", - "oak_leaves": "rgb(0, 124, 0)", - "spruce_leaves": "rgb(0, 124, 0)", - "birch_leaves": "rgb(0, 124, 0)", - "jungle_leaves": "rgb(0, 124, 0)", - "acacia_leaves": "rgb(0, 124, 0)", - "cherry_leaves": "rgb(242, 127, 165)", - "dark_oak_leaves": "rgb(0, 124, 0)", - "mangrove_leaves": "rgb(0, 124, 0)", - "azalea_leaves": "rgb(0, 124, 0)", - "flowering_azalea_leaves": "rgb(0, 124, 0)", - "sponge": "rgb(229, 229, 51)", - "wet_sponge": "rgb(229, 229, 51)", - "lapis_ore": "rgb(112, 112, 112)", - "deepslate_lapis_ore": "rgb(100, 100, 100)", - "lapis_block": "rgb(74, 128, 255)", - "dispenser": "rgb(112, 112, 112)", - "sandstone": "rgb(247, 233, 163)", - "chiseled_sandstone": "rgb(247, 233, 163)", - "cut_sandstone": "rgb(247, 233, 163)", - "note_block": "rgb(143, 119, 72)", - "sticky_piston": "rgb(112, 112, 112)", - "cobweb": "rgb(199, 199, 199)", - "grass": "rgb(0, 124, 0)", - "fern": "rgb(0, 124, 0)", - "dead_bush": "rgb(143, 119, 72)", - "seagrass": "rgb(64, 64, 255)", - "tall_seagrass": "rgb(64, 64, 255)", - "piston": "rgb(112, 112, 112)", - "piston_head": "rgb(112, 112, 112)", - "white_wool": "rgb(255, 255, 255)", - "orange_wool": "rgb(216, 127, 51)", - "magenta_wool": "rgb(178, 76, 216)", - "light_blue_wool": "rgb(102, 153, 216)", - "yellow_wool": "rgb(229, 229, 51)", - "lime_wool": "rgb(127, 204, 25)", - "pink_wool": "rgb(242, 127, 165)", - "gray_wool": "rgb(76, 76, 76)", - "light_gray_wool": "rgb(153, 153, 153)", - "cyan_wool": "rgb(76, 127, 153)", - "purple_wool": "rgb(127, 63, 178)", - "blue_wool": "rgb(51, 76, 178)", - "brown_wool": "rgb(102, 76, 51)", - "green_wool": "rgb(102, 127, 51)", - "red_wool": "rgb(153, 51, 51)", - "black_wool": "rgb(25, 25, 25)", - "moving_piston": "rgb(112, 112, 112)", - "dandelion": "rgb(0, 124, 0)", - "torchflower": "rgb(0, 124, 0)", - "poppy": "rgb(0, 124, 0)", - "blue_orchid": "rgb(0, 124, 0)", - "allium": "rgb(0, 124, 0)", - "azure_bluet": "rgb(0, 124, 0)", - "red_tulip": "rgb(0, 124, 0)", - "orange_tulip": "rgb(0, 124, 0)", - "white_tulip": "rgb(0, 124, 0)", - "pink_tulip": "rgb(0, 124, 0)", - "oxeye_daisy": "rgb(0, 124, 0)", - "cornflower": "rgb(0, 124, 0)", - "wither_rose": "rgb(0, 124, 0)", - "lily_of_the_valley": "rgb(0, 124, 0)", - "brown_mushroom": "rgb(102, 76, 51)", - "red_mushroom": "rgb(153, 51, 51)", - "gold_block": "rgb(250, 238, 77)", - "iron_block": "rgb(167, 167, 167)", - "bricks": "rgb(153, 51, 51)", - "tnt": "rgb(255, 0, 0)", - "bookshelf": "rgb(143, 119, 72)", - "chiseled_bookshelf": "rgb(143, 119, 72)", - "mossy_cobblestone": "rgb(112, 112, 112)", - "obsidian": "rgb(25, 25, 25)", - "fire": "rgb(255, 0, 0)", - "soul_fire": "rgb(102, 153, 216)", - "spawner": "rgb(112, 112, 112)", - "chest": "rgb(143, 119, 72)", - "diamond_ore": "rgb(112, 112, 112)", - "deepslate_diamond_ore": "rgb(100, 100, 100)", - "diamond_block": "rgb(92, 219, 213)", - "crafting_table": "rgb(143, 119, 72)", - "wheat": "rgb(0, 124, 0)", - "farmland": "rgb(151, 109, 77)", - "furnace": "rgb(112, 112, 112)", - "oak_sign": "rgb(143, 119, 72)", - "birch_sign": "rgb(247, 233, 163)", - "acacia_sign": "rgb(216, 127, 51)", - "oak_wall_sign": "rgb(143, 119, 72)", - "birch_wall_sign": "rgb(247, 233, 163)", - "acacia_wall_sign": "rgb(216, 127, 51)", - "birch_hanging_sign": "rgb(247, 233, 163)", - "acacia_hanging_sign": "rgb(216, 127, 51)", - "cherry_hanging_sign": "rgb(160, 77, 78)", - "crimson_hanging_sign": "rgb(148, 63, 97)", - "warped_hanging_sign": "rgb(58, 142, 140)", - "bamboo_hanging_sign": "rgb(229, 229, 51)", - "spruce_wall_hanging_sign": "rgb(143, 119, 72)", - "birch_wall_hanging_sign": "rgb(247, 233, 163)", - "acacia_wall_hanging_sign": "rgb(216, 127, 51)", - "cherry_wall_hanging_sign": "rgb(160, 77, 78)", - "crimson_wall_hanging_sign": "rgb(148, 63, 97)", - "warped_wall_hanging_sign": "rgb(58, 142, 140)", - "bamboo_wall_hanging_sign": "rgb(229, 229, 51)", - "stone_pressure_plate": "rgb(112, 112, 112)", - "iron_door": "rgb(167, 167, 167)", - "redstone_ore": "rgb(112, 112, 112)", - "deepslate_redstone_ore": "rgb(100, 100, 100)", - "snow": "rgb(255, 255, 255)", - "ice": "rgb(160, 160, 255)", - "snow_block": "rgb(255, 255, 255)", - "cactus": "rgb(0, 124, 0)", - "clay": "rgb(164, 168, 184)", - "sugar_cane": "rgb(0, 124, 0)", - "jukebox": "rgb(151, 109, 77)", - "pumpkin": "rgb(216, 127, 51)", - "netherrack": "rgb(112, 2, 0)", - "soul_sand": "rgb(102, 76, 51)", - "soul_soil": "rgb(102, 76, 51)", - "basalt": "rgb(25, 25, 25)", - "polished_basalt": "rgb(25, 25, 25)", - "glowstone": "rgb(247, 233, 163)", - "carved_pumpkin": "rgb(216, 127, 51)", - "jack_o_lantern": "rgb(216, 127, 51)", - "oak_trapdoor": "rgb(143, 119, 72)", - "spruce_trapdoor": "rgb(129, 86, 49)", - "birch_trapdoor": "rgb(247, 233, 163)", - "jungle_trapdoor": "rgb(151, 109, 77)", - "acacia_trapdoor": "rgb(216, 127, 51)", - "cherry_trapdoor": "rgb(209, 177, 161)", - "dark_oak_trapdoor": "rgb(102, 76, 51)", - "mangrove_trapdoor": "rgb(153, 51, 51)", - "bamboo_trapdoor": "rgb(229, 229, 51)", - "stone_bricks": "rgb(112, 112, 112)", - "mossy_stone_bricks": "rgb(112, 112, 112)", - "cracked_stone_bricks": "rgb(112, 112, 112)", - "chiseled_stone_bricks": "rgb(112, 112, 112)", - "mud_bricks": "rgb(135, 107, 98)", - "infested_stone": "rgb(164, 168, 184)", - "infested_cobblestone": "rgb(164, 168, 184)", - "infested_stone_bricks": "rgb(164, 168, 184)", - "infested_mossy_stone_bricks": "rgb(164, 168, 184)", - "infested_cracked_stone_bricks": "rgb(164, 168, 184)", - "infested_chiseled_stone_bricks": "rgb(164, 168, 184)", - "brown_mushroom_block": "rgb(151, 109, 77)", - "red_mushroom_block": "rgb(153, 51, 51)", - "mushroom_stem": "rgb(199, 199, 199)", - "melon": "rgb(127, 204, 25)", - "attached_pumpkin_stem": "rgb(0, 124, 0)", - "attached_melon_stem": "rgb(0, 124, 0)", - "pumpkin_stem": "rgb(0, 124, 0)", - "melon_stem": "rgb(0, 124, 0)", - "vine": "rgb(0, 124, 0)", - "glow_lichen": "rgb(127, 167, 150)", - "mycelium": "rgb(127, 63, 178)", - "lily_pad": "rgb(0, 124, 0)", - "nether_bricks": "rgb(112, 2, 0)", - "nether_brick_fence": "rgb(112, 2, 0)", - "nether_wart": "rgb(153, 51, 51)", - "enchanting_table": "rgb(153, 51, 51)", - "brewing_stand": "rgb(167, 167, 167)", - "cauldron": "rgb(112, 112, 112)", - "end_portal": "rgb(25, 25, 25)", - "end_portal_frame": "rgb(102, 127, 51)", - "end_stone": "rgb(247, 233, 163)", - "dragon_egg": "rgb(25, 25, 25)", - "cocoa": "rgb(0, 124, 0)", - "emerald_ore": "rgb(112, 112, 112)", - "deepslate_emerald_ore": "rgb(100, 100, 100)", - "ender_chest": "rgb(112, 112, 112)", - "emerald_block": "rgb(0, 217, 58)", - "command_block": "rgb(102, 76, 51)", - "beacon": "rgb(92, 219, 213)", - "carrots": "rgb(0, 124, 0)", - "potatoes": "rgb(0, 124, 0)", - "anvil": "rgb(167, 167, 167)", - "chipped_anvil": "rgb(167, 167, 167)", - "damaged_anvil": "rgb(167, 167, 167)", - "trapped_chest": "rgb(143, 119, 72)", - "light_weighted_pressure_plate": "rgb(250, 238, 77)", - "heavy_weighted_pressure_plate": "rgb(167, 167, 167)", - "daylight_detector": "rgb(143, 119, 72)", - "redstone_block": "rgb(255, 0, 0)", - "nether_quartz_ore": "rgb(112, 2, 0)", - "hopper": "rgb(112, 112, 112)", - "quartz_block": "rgb(255, 252, 245)", - "chiseled_quartz_block": "rgb(255, 252, 245)", - "quartz_pillar": "rgb(255, 252, 245)", - "dropper": "rgb(112, 112, 112)", - "white_terracotta": "rgb(209, 177, 161)", - "orange_terracotta": "rgb(159, 82, 36)", - "magenta_terracotta": "rgb(149, 87, 108)", - "light_blue_terracotta": "rgb(112, 108, 138)", - "yellow_terracotta": "rgb(186, 133, 36)", - "lime_terracotta": "rgb(103, 117, 53)", - "pink_terracotta": "rgb(160, 77, 78)", - "gray_terracotta": "rgb(57, 41, 35)", - "light_gray_terracotta": "rgb(135, 107, 98)", - "cyan_terracotta": "rgb(87, 92, 92)", - "purple_terracotta": "rgb(122, 73, 88)", - "blue_terracotta": "rgb(76, 62, 92)", - "brown_terracotta": "rgb(76, 50, 35)", - "green_terracotta": "rgb(76, 82, 42)", - "red_terracotta": "rgb(142, 60, 46)", - "black_terracotta": "rgb(37, 22, 16)", - "slime_block": "rgb(127, 178, 56)", - "iron_trapdoor": "rgb(167, 167, 167)", - "prismarine": "rgb(76, 127, 153)", - "prismarine_bricks": "rgb(92, 219, 213)", - "dark_prismarine": "rgb(92, 219, 213)", - "prismarine_slab": "rgb(76, 127, 153)", - "prismarine_brick_slab": "rgb(92, 219, 213)", - "dark_prismarine_slab": "rgb(92, 219, 213)", - "sea_lantern": "rgb(255, 252, 245)", - "hay_block": "rgb(229, 229, 51)", - "white_carpet": "rgb(255, 255, 255)", - "orange_carpet": "rgb(216, 127, 51)", - "magenta_carpet": "rgb(178, 76, 216)", - "light_blue_carpet": "rgb(102, 153, 216)", - "yellow_carpet": "rgb(229, 229, 51)", - "lime_carpet": "rgb(127, 204, 25)", - "pink_carpet": "rgb(242, 127, 165)", - "gray_carpet": "rgb(76, 76, 76)", - "light_gray_carpet": "rgb(153, 153, 153)", - "cyan_carpet": "rgb(76, 127, 153)", - "purple_carpet": "rgb(127, 63, 178)", - "blue_carpet": "rgb(51, 76, 178)", - "brown_carpet": "rgb(102, 76, 51)", - "green_carpet": "rgb(102, 127, 51)", - "red_carpet": "rgb(153, 51, 51)", - "black_carpet": "rgb(25, 25, 25)", - "terracotta": "rgb(216, 127, 51)", - "coal_block": "rgb(25, 25, 25)", - "packed_ice": "rgb(160, 160, 255)", - "sunflower": "rgb(0, 124, 0)", - "lilac": "rgb(0, 124, 0)", - "rose_bush": "rgb(0, 124, 0)", - "peony": "rgb(0, 124, 0)", - "tall_grass": "rgb(0, 124, 0)", - "large_fern": "rgb(0, 124, 0)", - "white_banner": "rgb(143, 119, 72)", - "orange_banner": "rgb(143, 119, 72)", - "magenta_banner": "rgb(143, 119, 72)", - "light_blue_banner": "rgb(143, 119, 72)", - "yellow_banner": "rgb(143, 119, 72)", - "lime_banner": "rgb(143, 119, 72)", - "pink_banner": "rgb(143, 119, 72)", - "gray_banner": "rgb(143, 119, 72)", - "light_gray_banner": "rgb(143, 119, 72)", - "cyan_banner": "rgb(143, 119, 72)", - "purple_banner": "rgb(143, 119, 72)", - "blue_banner": "rgb(143, 119, 72)", - "brown_banner": "rgb(143, 119, 72)", - "green_banner": "rgb(143, 119, 72)", - "red_banner": "rgb(143, 119, 72)", - "black_banner": "rgb(143, 119, 72)", - "white_wall_banner": "rgb(143, 119, 72)", - "orange_wall_banner": "rgb(143, 119, 72)", - "magenta_wall_banner": "rgb(143, 119, 72)", - "light_blue_wall_banner": "rgb(143, 119, 72)", - "yellow_wall_banner": "rgb(143, 119, 72)", - "lime_wall_banner": "rgb(143, 119, 72)", - "pink_wall_banner": "rgb(143, 119, 72)", - "gray_wall_banner": "rgb(143, 119, 72)", - "light_gray_wall_banner": "rgb(143, 119, 72)", - "cyan_wall_banner": "rgb(143, 119, 72)", - "purple_wall_banner": "rgb(143, 119, 72)", - "blue_wall_banner": "rgb(143, 119, 72)", - "brown_wall_banner": "rgb(143, 119, 72)", - "green_wall_banner": "rgb(143, 119, 72)", - "red_wall_banner": "rgb(143, 119, 72)", - "black_wall_banner": "rgb(143, 119, 72)", - "red_sandstone": "rgb(216, 127, 51)", - "chiseled_red_sandstone": "rgb(216, 127, 51)", - "cut_red_sandstone": "rgb(216, 127, 51)", - "oak_slab": "rgb(143, 119, 72)", - "spruce_slab": "rgb(129, 86, 49)", - "birch_slab": "rgb(247, 233, 163)", - "jungle_slab": "rgb(151, 109, 77)", - "acacia_slab": "rgb(216, 127, 51)", - "cherry_slab": "rgb(209, 177, 161)", - "dark_oak_slab": "rgb(102, 76, 51)", - "mangrove_slab": "rgb(153, 51, 51)", - "bamboo_slab": "rgb(229, 229, 51)", - "bamboo_mosaic_slab": "rgb(229, 229, 51)", - "stone_slab": "rgb(112, 112, 112)", - "smooth_stone_slab": "rgb(112, 112, 112)", - "sandstone_slab": "rgb(247, 233, 163)", - "cut_sandstone_slab": "rgb(247, 233, 163)", - "petrified_oak_slab": "rgb(143, 119, 72)", - "cobblestone_slab": "rgb(112, 112, 112)", - "brick_slab": "rgb(153, 51, 51)", - "stone_brick_slab": "rgb(112, 112, 112)", - "mud_brick_slab": "rgb(135, 107, 98)", - "nether_brick_slab": "rgb(112, 2, 0)", - "quartz_slab": "rgb(255, 252, 245)", - "red_sandstone_slab": "rgb(216, 127, 51)", - "cut_red_sandstone_slab": "rgb(216, 127, 51)", - "purpur_slab": "rgb(178, 76, 216)", - "smooth_stone": "rgb(112, 112, 112)", - "smooth_sandstone": "rgb(247, 233, 163)", - "smooth_quartz": "rgb(255, 252, 245)", - "smooth_red_sandstone": "rgb(216, 127, 51)", - "chorus_plant": "rgb(127, 63, 178)", - "chorus_flower": "rgb(127, 63, 178)", - "purpur_block": "rgb(178, 76, 216)", - "purpur_pillar": "rgb(178, 76, 216)", - "end_stone_bricks": "rgb(247, 233, 163)", - "torchflower_crop": "rgb(0, 124, 0)", - "pitcher_crop": "rgb(0, 124, 0)", - "pitcher_plant": "rgb(0, 124, 0)", - "beetroots": "rgb(0, 124, 0)", - "dirt_path": "rgb(151, 109, 77)", - "end_gateway": "rgb(25, 25, 25)", - "repeating_command_block": "rgb(127, 63, 178)", - "chain_command_block": "rgb(102, 127, 51)", - "frosted_ice": "rgb(160, 160, 255)", - "magma_block": "rgb(112, 2, 0)", - "nether_wart_block": "rgb(153, 51, 51)", - "red_nether_bricks": "rgb(112, 2, 0)", - "bone_block": "rgb(247, 233, 163)", - "observer": "rgb(112, 112, 112)", - "kelp": "rgb(64, 64, 255)", - "kelp_plant": "rgb(64, 64, 255)", - "dried_kelp_block": "rgb(102, 127, 51)", - "turtle_egg": "rgb(247, 233, 163)", - "sniffer_egg": "rgb(153, 51, 51)", - "dead_tube_coral_block": "rgb(76, 76, 76)", - "dead_brain_coral_block": "rgb(76, 76, 76)", - "dead_bubble_coral_block": "rgb(76, 76, 76)", - "dead_fire_coral_block": "rgb(76, 76, 76)", - "dead_horn_coral_block": "rgb(76, 76, 76)", - "tube_coral_block": "rgb(51, 76, 178)", - "brain_coral_block": "rgb(242, 127, 165)", - "bubble_coral_block": "rgb(127, 63, 178)", - "fire_coral_block": "rgb(153, 51, 51)", - "horn_coral_block": "rgb(229, 229, 51)", - "dead_tube_coral": "rgb(76, 76, 76)", - "dead_brain_coral": "rgb(76, 76, 76)", - "dead_bubble_coral": "rgb(76, 76, 76)", - "dead_fire_coral": "rgb(76, 76, 76)", - "dead_horn_coral": "rgb(76, 76, 76)", - "tube_coral": "rgb(51, 76, 178)", - "brain_coral": "rgb(242, 127, 165)", - "bubble_coral": "rgb(127, 63, 178)", - "fire_coral": "rgb(153, 51, 51)", - "horn_coral": "rgb(229, 229, 51)", - "dead_tube_coral_fan": "rgb(76, 76, 76)", - "dead_brain_coral_fan": "rgb(76, 76, 76)", - "dead_bubble_coral_fan": "rgb(76, 76, 76)", - "dead_fire_coral_fan": "rgb(76, 76, 76)", - "dead_horn_coral_fan": "rgb(76, 76, 76)", - "tube_coral_fan": "rgb(51, 76, 178)", - "brain_coral_fan": "rgb(242, 127, 165)", - "bubble_coral_fan": "rgb(127, 63, 178)", - "fire_coral_fan": "rgb(153, 51, 51)", - "horn_coral_fan": "rgb(229, 229, 51)", - "dead_tube_coral_wall_fan": "rgb(76, 76, 76)", - "dead_brain_coral_wall_fan": "rgb(76, 76, 76)", - "dead_bubble_coral_wall_fan": "rgb(76, 76, 76)", - "dead_fire_coral_wall_fan": "rgb(76, 76, 76)", - "dead_horn_coral_wall_fan": "rgb(76, 76, 76)", - "tube_coral_wall_fan": "rgb(51, 76, 178)", - "brain_coral_wall_fan": "rgb(242, 127, 165)", - "bubble_coral_wall_fan": "rgb(127, 63, 178)", - "fire_coral_wall_fan": "rgb(153, 51, 51)", - "horn_coral_wall_fan": "rgb(229, 229, 51)", - "sea_pickle": "rgb(102, 127, 51)", - "blue_ice": "rgb(160, 160, 255)", - "conduit": "rgb(92, 219, 213)", - "bamboo_sapling": "rgb(143, 119, 72)", - "bamboo": "rgb(0, 124, 0)", - "bubble_column": "rgb(64, 64, 255)", - "scaffolding": "rgb(247, 233, 163)", - "loom": "rgb(143, 119, 72)", - "barrel": "rgb(143, 119, 72)", - "smoker": "rgb(112, 112, 112)", - "blast_furnace": "rgb(112, 112, 112)", - "cartography_table": "rgb(143, 119, 72)", - "fletching_table": "rgb(143, 119, 72)", - "grindstone": "rgb(167, 167, 167)", - "lectern": "rgb(143, 119, 72)", - "smithing_table": "rgb(143, 119, 72)", - "stonecutter": "rgb(112, 112, 112)", - "bell": "rgb(250, 238, 77)", - "lantern": "rgb(167, 167, 167)", - "soul_lantern": "rgb(167, 167, 167)", - "campfire": "rgb(129, 86, 49)", - "soul_campfire": "rgb(129, 86, 49)", - "sweet_berry_bush": "rgb(0, 124, 0)", - "warped_hyphae": "rgb(86, 44, 62)", - "stripped_warped_hyphae": "rgb(86, 44, 62)", - "warped_nylium": "rgb(22, 126, 134)", - "warped_fungus": "rgb(76, 127, 153)", - "warped_wart_block": "rgb(20, 180, 133)", - "warped_roots": "rgb(76, 127, 153)", - "nether_sprouts": "rgb(76, 127, 153)", - "crimson_hyphae": "rgb(92, 25, 29)", - "stripped_crimson_hyphae": "rgb(92, 25, 29)", - "crimson_nylium": "rgb(189, 48, 49)", - "crimson_fungus": "rgb(112, 2, 0)", - "shroomlight": "rgb(153, 51, 51)", - "weeping_vines": "rgb(112, 2, 0)", - "weeping_vines_plant": "rgb(112, 2, 0)", - "twisting_vines": "rgb(76, 127, 153)", - "twisting_vines_plant": "rgb(76, 127, 153)", - "crimson_roots": "rgb(112, 2, 0)", - "crimson_planks": "rgb(148, 63, 97)", - "warped_planks": "rgb(58, 142, 140)", - "structure_block": "rgb(153, 153, 153)", - "jigsaw": "rgb(153, 153, 153)", - "composter": "rgb(143, 119, 72)", - "target": "rgb(255, 252, 245)", - "bee_nest": "rgb(229, 229, 51)", - "beehive": "rgb(143, 119, 72)", - "honey_block": "rgb(216, 127, 51)", - "honeycomb_block": "rgb(216, 127, 51)", - "netherite_block": "rgb(25, 25, 25)", - "ancient_debris": "rgb(25, 25, 25)", - "crying_obsidian": "rgb(25, 25, 25)", - "respawn_anchor": "rgb(25, 25, 25)", - "lodestone": "rgb(167, 167, 167)", - "blackstone": "rgb(25, 25, 25)", - "polished_blackstone_pressure_plate": "rgb(25, 25, 25)", - "chiseled_nether_bricks": "rgb(112, 2, 0)", - "cracked_nether_bricks": "rgb(112, 2, 0)", - "amethyst_block": "rgb(127, 63, 178)", - "budding_amethyst": "rgb(127, 63, 178)", - "amethyst_cluster": "rgb(127, 63, 178)", - "tuff": "rgb(57, 41, 35)", - "calcite": "rgb(209, 177, 161)", - "tinted_glass": "rgb(76, 76, 76)", - "powder_snow": "rgb(255, 255, 255)", - "sculk_sensor": "rgb(76, 127, 153)", - "sculk": "rgb(25, 25, 25)", - "sculk_vein": "rgb(25, 25, 25)", - "sculk_catalyst": "rgb(25, 25, 25)", - "sculk_shrieker": "rgb(25, 25, 25)", - "oxidized_copper": "rgb(22, 126, 134)", - "weathered_copper": "rgb(58, 142, 140)", - "exposed_copper": "rgb(135, 107, 98)", - "copper_block": "rgb(216, 127, 51)", - "deepslate_copper_ore": "rgb(100, 100, 100)", - "lightning_rod": "rgb(216, 127, 51)", - "pointed_dripstone": "rgb(76, 50, 35)", - "dripstone_block": "rgb(76, 50, 35)", - "cave_vines": "rgb(0, 124, 0)", - "cave_vines_plant": "rgb(0, 124, 0)", - "spore_blossom": "rgb(0, 124, 0)", - "azalea": "rgb(0, 124, 0)", - "flowering_azalea": "rgb(0, 124, 0)", - "moss_carpet": "rgb(102, 127, 51)", - "pink_petals": "rgb(0, 124, 0)", - "moss_block": "rgb(102, 127, 51)", - "big_dripleaf": "rgb(0, 124, 0)", - "big_dripleaf_stem": "rgb(0, 124, 0)", - "small_dripleaf": "rgb(0, 124, 0)", - "hanging_roots": "rgb(151, 109, 77)", - "rooted_dirt": "rgb(151, 109, 77)", - "mud": "rgb(87, 92, 92)", - "deepslate": "rgb(100, 100, 100)", - "infested_deepslate": "rgb(100, 100, 100)", - "raw_iron_block": "rgb(216, 175, 147)", - "raw_copper_block": "rgb(216, 127, 51)", - "raw_gold_block": "rgb(250, 238, 77)", - "ochre_froglight": "rgb(247, 233, 163)", - "verdant_froglight": "rgb(127, 167, 150)", - "pearlescent_froglight": "rgb(242, 127, 165)", - "frogspawn": "rgb(64, 64, 255)", - "reinforced_deepslate": "rgb(100, 100, 100)", - "decorated_pot": "rgb(142, 60, 46)" - } -} diff --git a/renderer/viewer/lib/simpleUtils.ts b/renderer/viewer/lib/simpleUtils.ts deleted file mode 100644 index 2d0b6255..00000000 --- a/renderer/viewer/lib/simpleUtils.ts +++ /dev/null @@ -1,35 +0,0 @@ -export async function getBufferFromStream (stream) { - return new Promise((resolve, reject) => { - let buffer = Buffer.from([]) - stream.on('data', buf => { - buffer = Buffer.concat([buffer, buf]) - }) - stream.on('end', () => resolve(buffer)) - stream.on('error', reject) - }) -} - -export function openURL (url, newTab = true) { - if (newTab) { - window.open(url, '_blank', 'noopener,noreferrer') - } else { - window.open(url, '_self') - } -} - -export const isMobile = () => { - return window.matchMedia('(pointer: coarse)').matches || navigator.userAgent.includes('Mobile') -} - -export function chunkPos (pos: { x: number, z: number }) { - const x = Math.floor(pos.x / 16) - const z = Math.floor(pos.z / 16) - return [x, z] -} - -export function sectionPos (pos: { x: number, y: number, z: number }) { - const x = Math.floor(pos.x / 16) - const y = Math.floor(pos.y / 16) - const z = Math.floor(pos.z / 16) - return [x, y, z] -} diff --git a/renderer/viewer/lib/smoothSwitcher.ts b/renderer/viewer/lib/smoothSwitcher.ts deleted file mode 100644 index 74eb1171..00000000 --- a/renderer/viewer/lib/smoothSwitcher.ts +++ /dev/null @@ -1,168 +0,0 @@ -import * as tweenJs from '@tweenjs/tween.js' -import { AnimationController } from './animationController' - -export type StateProperties = Record -export type StateGetterFn = () => StateProperties -export type StateSetterFn = (property: string, value: number) => void - -// Speed in units per second for each property type -const DEFAULT_SPEEDS = { - x: 3000, // pixels/units per second - y: 3000, - z: 3000, - rotation: Math.PI, // radians per second - scale: 1, // scale units per second - default: 3000 // default speed for unknown properties -} - -export class SmoothSwitcher { - private readonly animationController = new AnimationController() - // private readonly currentState: StateProperties = {} - private readonly defaultState: StateProperties - private readonly speeds: Record - public currentStateName = '' - public transitioningToStateName = '' - - constructor ( - public getState: StateGetterFn, - public setState: StateSetterFn, - speeds?: Partial> - ) { - - // Initialize speeds with defaults and overrides - this.speeds = { ...DEFAULT_SPEEDS } - if (speeds) { - Object.assign(this.speeds, speeds) - } - - // Store initial values - this.defaultState = this.getState() - } - - /** - * Calculate transition duration based on the largest property change - */ - private calculateDuration (newState: Partial): number { - let maxDuration = 0 - const currentState = this.getState() - - for (const [key, targetValue] of Object.entries(newState)) { - const currentValue = currentState[key] - const diff = Math.abs(targetValue! - currentValue) - const speed = this.getPropertySpeed(key) - const duration = (diff / speed) * 1000 // Convert to milliseconds - - maxDuration = Math.max(maxDuration, duration) - } - - // Ensure minimum duration of 50ms and maximum of 2000ms - return Math.min(Math.max(maxDuration, 200), 2000) - } - - private getPropertySpeed (property: string): number { - // Check for specific property speed - if (property in this.speeds) { - return this.speeds[property] - } - - // Check for property type (rotation, scale, etc.) - if (property.toLowerCase().includes('rotation')) return this.speeds.rotation - if (property.toLowerCase().includes('scale')) return this.speeds.scale - if (property.toLowerCase() === 'x' || property.toLowerCase() === 'y' || property.toLowerCase() === 'z') { - return this.speeds[property] - } - - return this.speeds.default - } - - /** - * Start a transition to a new state - * @param newState Partial state - only need to specify properties that change - * @param easing Easing function to use - */ - startTransition ( - newState: Partial, - stateName?: string, - onEnd?: () => void, - easing: (amount: number) => number = tweenJs.Easing.Linear.None, - onCancelled?: () => void - ): void { - if (this.isTransitioning) { - this.animationController.forceFinish(false) - } - - this.transitioningToStateName = stateName ?? '' - const state = this.getState() - - const duration = this.calculateDuration(newState) - // console.log('duration', duration, JSON.stringify(state), JSON.stringify(newState)) - - void this.animationController.startAnimation(() => { - const group = new tweenJs.Group() - new tweenJs.Tween(state, group) - .to(newState, duration) - .easing(easing) - .onUpdate((obj) => { - for (const key of Object.keys(obj)) { - this.setState(key, obj[key]) - } - }) - .onComplete(() => { - this.animationController.forceFinish() - this.currentStateName = this.transitioningToStateName - this.transitioningToStateName = '' - onEnd?.() - }) - .start() - return group - }, onCancelled) - } - - /** - * Reset to default state - */ - reset (): void { - this.startTransition(this.defaultState) - } - - - /** - * Update the animation (should be called in your render/update loop) - */ - update (): void { - this.animationController.update() - } - - /** - * Force finish the current transition - */ - forceFinish (): void { - this.animationController.forceFinish() - } - - /** - * Start a new transition to the specified state - */ - transitionTo ( - newState: Partial, - stateName?: string, - onEnd?: () => void, - onCancelled?: () => void - ): void { - this.startTransition(newState, stateName, onEnd, tweenJs.Easing.Linear.None, onCancelled) - } - - /** - * Get the current value of a property - */ - getCurrentValue (property: string): number { - return this.getState()[property] - } - - /** - * Check if currently transitioning - */ - get isTransitioning (): boolean { - return this.animationController.isActive - } -} diff --git a/renderer/viewer/lib/ui/newStats.ts b/renderer/viewer/lib/ui/newStats.ts deleted file mode 100644 index 4a1b0a0f..00000000 --- a/renderer/viewer/lib/ui/newStats.ts +++ /dev/null @@ -1,112 +0,0 @@ -/* eslint-disable unicorn/prefer-dom-node-text-content */ -const rightOffset = 0 - -const stats = {} - -let lastY = 40 -export const addNewStat = (id: string, width = 80, x = rightOffset, y = lastY) => { - const pane = document.createElement('div') - pane.style.position = 'fixed' - pane.style.top = `${y ?? lastY}px` - pane.style.right = `${x}px` - // gray bg - pane.style.backgroundColor = 'rgba(0, 0, 0, 0.7)' - pane.style.color = 'white' - pane.style.padding = '2px' - pane.style.fontFamily = 'monospace' - pane.style.fontSize = '12px' - pane.style.zIndex = '100' - pane.style.pointerEvents = 'none' - document.body.appendChild(pane) - stats[id] = pane - if (y === undefined && x === rightOffset) { // otherwise it's a custom position - // rightOffset += width - lastY += 20 - } - - return { - updateText (text: string) { - if (pane.innerText === text) return - pane.innerText = text - }, - setVisibility (visible: boolean) { - pane.style.display = visible ? 'block' : 'none' - } - } -} - -export const addNewStat2 = (id: string, { top, bottom, right, left, displayOnlyWhenWider }: { top?: number, bottom?: number, right?: number, left?: number, displayOnlyWhenWider?: number }) => { - if (top === undefined && bottom === undefined) top = 0 - const pane = document.createElement('div') - pane.style.position = 'fixed' - if (top !== undefined) { - pane.style.top = `${top}px` - } - if (bottom !== undefined) { - pane.style.bottom = `${bottom}px` - } - if (left !== undefined) { - pane.style.left = `${left}px` - } - if (right !== undefined) { - pane.style.right = `${right}px` - } - // gray bg - pane.style.backgroundColor = 'rgba(0, 0, 0, 0.7)' - pane.style.color = 'white' - pane.style.padding = '2px' - pane.style.fontFamily = 'monospace' - pane.style.fontSize = '12px' - pane.style.zIndex = '10000' - pane.style.pointerEvents = 'none' - document.body.appendChild(pane) - stats[id] = pane - - const resizeCheck = () => { - if (!displayOnlyWhenWider) return - pane.style.display = window.innerWidth > displayOnlyWhenWider ? 'block' : 'none' - } - window.addEventListener('resize', resizeCheck) - resizeCheck() - - return { - updateText (text: string) { - pane.innerText = text - }, - setVisibility (visible: boolean) { - pane.style.display = visible ? 'block' : 'none' - } - } -} - -export const updateStatText = (id, text) => { - if (!stats[id]) return - stats[id].innerText = text -} - -export const updatePanesVisibility = (visible: boolean) => { - // eslint-disable-next-line guard-for-in - for (const id in stats) { - stats[id].style.display = visible ? 'block' : 'none' - } -} - -export const removeAllStats = () => { - // eslint-disable-next-line guard-for-in - for (const id in stats) { - removeStat(id) - } -} - -export const removeStat = (id) => { - if (!stats[id]) return - stats[id].remove() - delete stats[id] -} - -if (typeof customEvents !== 'undefined') { - customEvents.on('gameLoaded', () => { - const chunksLoaded = addNewStat('chunks-loaded', 80, 0, 0) - const chunksTotal = addNewStat('chunks-read', 80, 0, 0) - }) -} diff --git a/renderer/viewer/lib/utils.ts b/renderer/viewer/lib/utils.ts deleted file mode 100644 index f471aa9d..00000000 --- a/renderer/viewer/lib/utils.ts +++ /dev/null @@ -1,57 +0,0 @@ -export const loadScript = async function (scriptSrc: string, highPriority = true): Promise { - const existingScript = document.querySelector(`script[src="${scriptSrc}"]`) - if (existingScript) { - return existingScript - } - - return new Promise((resolve, reject) => { - const scriptElement = document.createElement('script') - scriptElement.src = scriptSrc - - if (highPriority) { - scriptElement.fetchPriority = 'high' - } - scriptElement.async = true - - scriptElement.addEventListener('load', () => { - resolve(scriptElement) - }) - - scriptElement.onerror = (error) => { - reject(new Error(typeof error === 'string' ? error : (error as any).message)) - scriptElement.remove() - } - - document.head.appendChild(scriptElement) - }) -} - -const detectFullOffscreenCanvasSupport = () => { - if (typeof OffscreenCanvas === 'undefined') return false - try { - const canvas = new OffscreenCanvas(1, 1) - // Try to get a WebGL context - this will fail on iOS where only 2D is supported (iOS 16) - const gl = canvas.getContext('webgl2') || canvas.getContext('webgl') - return gl !== null - } catch (e) { - return false - } -} - -const hasFullOffscreenCanvasSupport = detectFullOffscreenCanvasSupport() - -export const createCanvas = (width: number, height: number): OffscreenCanvas => { - if (hasFullOffscreenCanvasSupport) { - return new OffscreenCanvas(width, height) - } - const canvas = document.createElement('canvas') - canvas.width = width - canvas.height = height - return canvas as unknown as OffscreenCanvas // todo-low -} - -export async function loadImageFromUrl (imageUrl: string): Promise { - const response = await fetch(imageUrl) - const blob = await response.blob() - return createImageBitmap(blob) -} diff --git a/renderer/viewer/lib/utils/proxy.ts b/renderer/viewer/lib/utils/proxy.ts deleted file mode 100644 index d30ceb7e..00000000 --- a/renderer/viewer/lib/utils/proxy.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { subscribeKey } from 'valtio/utils' - -// eslint-disable-next-line max-params -export function watchProperty, K> (asyncGetter: (value: T[keyof T]) => Promise, valtioProxy: T, key: keyof T, readySetter: (res: K) => void, cleanup?: (res: K) => void) { - let i = 0 - let lastRes: K | undefined - const request = async () => { - const req = ++i - const res = await asyncGetter(valtioProxy[key]) - if (req === i) { - if (lastRes) { - cleanup?.(lastRes) - } - readySetter(res) - lastRes = res - } else { - // rejected - cleanup?.(res) - } - } - void request() - return subscribeKey(valtioProxy, key, request) -} diff --git a/renderer/viewer/lib/utils/skins.ts b/renderer/viewer/lib/utils/skins.ts deleted file mode 100644 index 3163702c..00000000 --- a/renderer/viewer/lib/utils/skins.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { loadSkinToCanvas } from 'skinview-utils' -import { createCanvas, loadImageFromUrl } from '../utils' - -export { default as stevePngUrl } from 'mc-assets/dist/other-textures/latest/entity/player/wide/steve.png' - -const config = { - apiEnabled: true, -} - -export const setSkinsConfig = (newConfig: Partial) => { - Object.assign(config, newConfig) -} - -export async function loadSkinFromUsername (username: string, type: 'skin' | 'cape'): Promise { - if (!config.apiEnabled) return - - if (type === 'cape') return - const url = `https://playerdb.co/api/player/minecraft/${username}` - const response = await fetch(url) - if (!response.ok) return - - const data: { - data: { - player: { - skin_texture: string - } - } - } = await response.json() - return data.data.player.skin_texture -} - -export const parseSkinTexturesValue = (value: string) => { - const decodedData: { - textures: { - SKIN: { - url: string - } - } - } = JSON.parse(Buffer.from(value, 'base64').toString()) - return decodedData.textures?.SKIN?.url -} - -export async function loadSkinImage (skinUrl: string): Promise<{ canvas: OffscreenCanvas, image: ImageBitmap }> { - if (!skinUrl.startsWith('data:')) { - skinUrl = await fetchAndConvertBase64Skin(skinUrl.replace('http://', 'https://')) - } - - const image = await loadImageFromUrl(skinUrl) - const skinCanvas = createCanvas(64, 64) - loadSkinToCanvas(skinCanvas, image) - return { canvas: skinCanvas, image } -} - -const fetchAndConvertBase64Skin = async (skinUrl: string) => { - const response = await fetch(skinUrl, { }) - const arrayBuffer = await response.arrayBuffer() - const base64 = Buffer.from(arrayBuffer).toString('base64') - return `data:image/png;base64,${base64}` -} diff --git a/renderer/viewer/lib/workerProxy.ts b/renderer/viewer/lib/workerProxy.ts deleted file mode 100644 index 2b38dca9..00000000 --- a/renderer/viewer/lib/workerProxy.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { proxy, getVersion, subscribe } from 'valtio' - -export function createWorkerProxy void | Promise>> (handlers: T, channel?: MessagePort): { __workerProxy: T } { - const target = channel ?? globalThis - target.addEventListener('message', (event: any) => { - const { type, args, msgId } = event.data - if (handlers[type]) { - const result = handlers[type](...args) - if (result instanceof Promise) { - void result.then((result) => { - target.postMessage({ - type: 'result', - msgId, - args: [result] - }) - }) - } - } - }) - return null as any -} - -/** - * in main thread - * ```ts - * // either: - * import type { importedTypeWorkerProxy } from './worker' - * // or: - * type importedTypeWorkerProxy = import('./worker').importedTypeWorkerProxy - * - * const workerChannel = useWorkerProxy(worker) - * ``` - */ -export const useWorkerProxy = void> }> (worker: Worker | MessagePort, autoTransfer = true): T['__workerProxy'] & { - transfer: (...args: Transferable[]) => T['__workerProxy'] -} => { - let messageId = 0 - // in main thread - return new Proxy({} as any, { - get (target, prop) { - if (prop === 'transfer') { - return (...transferable: Transferable[]) => { - return new Proxy({}, { - get (target, prop) { - return (...args: any[]) => { - worker.postMessage({ - type: prop, - args, - }, transferable) - } - } - }) - } - } - return (...args: any[]) => { - const msgId = messageId++ - const transfer = autoTransfer ? args.filter(arg => { - return arg instanceof ArrayBuffer || arg instanceof MessagePort - || (typeof ImageBitmap !== 'undefined' && arg instanceof ImageBitmap) - || (typeof OffscreenCanvas !== 'undefined' && arg instanceof OffscreenCanvas) - || (typeof ImageData !== 'undefined' && arg instanceof ImageData) - }) : [] - worker.postMessage({ - type: prop, - msgId, - args, - }, transfer) - return { - // eslint-disable-next-line unicorn/no-thenable - then (onfulfilled: (value: any) => void) { - const handler = ({ data }: MessageEvent): void => { - if (data.type === 'result' && data.msgId === msgId) { - onfulfilled(data.args[0]) - worker.removeEventListener('message', handler as EventListener) - } - } - worker.addEventListener('message', handler as EventListener) - } - } - } - } - }) -} - -// const workerProxy = createWorkerProxy({ -// startRender (canvas: HTMLCanvasElement) { -// }, -// }) - -// const worker = useWorkerProxy(null, workerProxy) - -// worker. diff --git a/renderer/viewer/lib/worldDataEmitter.ts b/renderer/viewer/lib/worldDataEmitter.ts deleted file mode 100644 index dfbdb35c..00000000 --- a/renderer/viewer/lib/worldDataEmitter.ts +++ /dev/null @@ -1,431 +0,0 @@ -/* eslint-disable guard-for-in */ - -// todo refactor into its own commons module -import { EventEmitter } from 'events' -import { generateSpiralMatrix, ViewRect } from 'flying-squid/dist/utils' -import { Vec3 } from 'vec3' -import { BotEvents } from 'mineflayer' -import { proxy } from 'valtio' -import TypedEmitter from 'typed-emitter' -import { Biome } from 'minecraft-data' -import { delayedIterator } from '../../playground/shared' -import { chunkPos } from './simpleUtils' - -export type ChunkPosKey = string // like '16,16' -type ChunkPos = { x: number, z: number } // like { x: 16, z: 16 } - -export type WorldDataEmitterEvents = { - chunkPosUpdate: (data: { pos: Vec3 }) => void - blockUpdate: (data: { pos: Vec3, stateId: number }) => void - entity: (data: any) => void - entityMoved: (data: any) => void - playerEntity: (data: any) => void - time: (data: number) => void - renderDistance: (viewDistance: number) => void - blockEntities: (data: Record | { blockEntities: Record }) => void - markAsLoaded: (data: { x: number, z: number }) => void - unloadChunk: (data: { x: number, z: number }) => void - loadChunk: (data: { x: number, z: number, chunk: string, blockEntities: any, worldConfig: any, isLightUpdate: boolean }) => void - updateLight: (data: { pos: Vec3 }) => void - onWorldSwitch: () => void - end: () => void - biomeUpdate: (data: { biome: Biome }) => void - biomeReset: () => void -} - -export class WorldDataEmitterWorker extends (EventEmitter as new () => TypedEmitter) { - static readonly restorerName = 'WorldDataEmitterWorker' -} - -export class WorldDataEmitter extends (EventEmitter as new () => TypedEmitter) { - spiralNumber = 0 - gotPanicLastTime = false - panicChunksReload = () => {} - loadedChunks: Record - private inLoading = false - private chunkReceiveTimes: number[] = [] - private lastChunkReceiveTime = 0 - public lastChunkReceiveTimeAvg = 0 - private panicTimeout?: NodeJS.Timeout - readonly lastPos: Vec3 - private eventListeners: Record = {} - private readonly emitter: WorldDataEmitter - debugChunksInfo: Record - // blockUpdates: number - }> = {} - - waitingSpiralChunksLoad = {} as Record void> - - addWaitTime = 1 - /* config */ keepChunksDistance = 0 - /* config */ isPlayground = false - /* config */ allowPositionUpdate = true - - constructor (public world: typeof __type_bot['world'], public viewDistance: number, position: Vec3 = new Vec3(0, 0, 0)) { - // eslint-disable-next-line constructor-super - super() - this.loadedChunks = {} - this.lastPos = new Vec3(0, 0, 0).update(position) - // todo - this.emitter = this - } - - setBlockStateId (position: Vec3, stateId: number) { - const val = this.world.setBlockStateId(position, stateId) as Promise | void - if (val) throw new Error('setBlockStateId returned promise (not supported)') - // const chunkX = Math.floor(position.x / 16) - // const chunkZ = Math.floor(position.z / 16) - // if (!this.loadedChunks[`${chunkX},${chunkZ}`] && !this.waitingSpiralChunksLoad[`${chunkX},${chunkZ}`]) { - // void this.loadChunk({ x: chunkX, z: chunkZ }) - // return - // } - - this.emit('blockUpdate', { pos: position, stateId }) - } - - updateViewDistance (viewDistance: number) { - this.viewDistance = viewDistance - this.emitter.emit('renderDistance', viewDistance) - } - - listenToBot (bot: typeof __type_bot) { - const entitiesObjectData = new Map() - bot._client.prependListener('spawn_entity', (data) => { - if (data.objectData && data.entityId !== undefined) { - entitiesObjectData.set(data.entityId, data.objectData) - } - }) - - const emitEntity = (e, name = 'entity') => { - if (!e) return - if (e === bot.entity) { - if (name === 'entity') { - this.emitter.emit('playerEntity', e) - } - return - } - if (!e.name) return // mineflayer received update for not spawned entity - e.objectData = entitiesObjectData.get(e.id) - this.emitter.emit(name as any, { - ...e, - pos: e.position, - username: e.username, - team: bot.teamMap[e.username] || bot.teamMap[e.uuid], - // set debugTree (obj) { - // e.debugTree = obj - // } - }) - } - - this.eventListeners = { - // 'move': botPosition, - entitySpawn (e: any) { - if (e.name === 'item_frame' || e.name === 'glow_item_frame') { - // Item frames use block positions in the protocol, not their center. Fix that. - e.position.translate(0.5, 0.5, 0.5) - } - emitEntity(e) - }, - entityUpdate (e: any) { - emitEntity(e) - }, - entityEquip (e: any) { - emitEntity(e) - }, - entityMoved (e: any) { - emitEntity(e, 'entityMoved') - }, - entityGone: (e: any) => { - this.emitter.emit('entity', { id: e.id, delete: true }) - }, - chunkColumnLoad: (pos: Vec3) => { - const now = performance.now() - if (this.lastChunkReceiveTime) { - this.chunkReceiveTimes.push(now - this.lastChunkReceiveTime) - } - this.lastChunkReceiveTime = now - - if (this.waitingSpiralChunksLoad[`${pos.x},${pos.z}`]) { - this.waitingSpiralChunksLoad[`${pos.x},${pos.z}`](true) - delete this.waitingSpiralChunksLoad[`${pos.x},${pos.z}`] - } else if (this.loadedChunks[`${pos.x},${pos.z}`]) { - void this.loadChunk(pos, false, 'Received another chunkColumnLoad event while already loaded') - } - this.chunkProgress() - }, - chunkColumnUnload: (pos: Vec3) => { - this.unloadChunk(pos) - }, - blockUpdate: (oldBlock: any, newBlock: any) => { - const stateId = newBlock.stateId ?? ((newBlock.type << 4) | newBlock.metadata) - this.emitter.emit('blockUpdate', { pos: oldBlock.position, stateId }) - }, - time: () => { - this.emitter.emit('time', bot.time.timeOfDay) - }, - end: () => { - this.emitter.emit('end') - }, - // when dimension might change - login: () => { - void this.updatePosition(bot.entity.position, true) - this.emitter.emit('playerEntity', bot.entity) - }, - respawn: () => { - void this.updatePosition(bot.entity.position, true) - this.emitter.emit('playerEntity', bot.entity) - this.emitter.emit('onWorldSwitch') - }, - } satisfies Partial - - - bot._client.on('update_light', ({ chunkX, chunkZ }) => { - const chunkPos = new Vec3(chunkX * 16, 0, chunkZ * 16) - if (!this.waitingSpiralChunksLoad[`${chunkX},${chunkZ}`] && this.loadedChunks[`${chunkX},${chunkZ}`]) { - void this.loadChunk(chunkPos, true, 'update_light') - } - }) - - for (const [evt, listener] of Object.entries(this.eventListeners)) { - bot.on(evt as any, listener) - } - - for (const id in bot.entities) { - const e = bot.entities[id] - try { - emitEntity(e) - } catch (err) { - // reportError?.(err) - console.error('error processing entity', err) - } - } - } - - emitterGotConnected () { - this.emitter.emit('blockEntities', new Proxy({}, { - get (_target, posKey, receiver) { - if (typeof posKey !== 'string') return - const [x, y, z] = posKey.split(',').map(Number) - return bot.world.getBlock(new Vec3(x, y, z))?.entity - }, - })) - } - - removeListenersFromBot (bot: import('mineflayer').Bot) { - for (const [evt, listener] of Object.entries(this.eventListeners)) { - bot.removeListener(evt as any, listener) - } - } - - async init (pos: Vec3) { - this.updateViewDistance(this.viewDistance) - this.emitter.emit('chunkPosUpdate', { pos }) - if (bot?.time?.timeOfDay) { - this.emitter.emit('time', bot.time.timeOfDay) - } - if (bot?.entity) { - this.emitter.emit('playerEntity', bot.entity) - } - this.emitterGotConnected() - const [botX, botZ] = chunkPos(pos) - - const positions = generateSpiralMatrix(this.viewDistance).map(([x, z]) => new Vec3((botX + x) * 16, 0, (botZ + z) * 16)) - - this.lastPos.update(pos) - await this._loadChunks(positions, pos) - } - - chunkProgress () { - if (this.panicTimeout) clearTimeout(this.panicTimeout) - if (this.chunkReceiveTimes.length >= 5) { - const avgReceiveTime = this.chunkReceiveTimes.reduce((a, b) => a + b, 0) / this.chunkReceiveTimes.length - this.lastChunkReceiveTimeAvg = avgReceiveTime - const timeoutDelay = avgReceiveTime * 2 + 1000 // 2x average + 1 second - - // Clear any existing timeout - if (this.panicTimeout) clearTimeout(this.panicTimeout) - - // Set new timeout for panic reload - this.panicTimeout = setTimeout(() => { - if (!this.gotPanicLastTime && this.inLoading) { - console.warn('Chunk loading seems stuck, triggering panic reload') - this.gotPanicLastTime = true - this.panicChunksReload() - } - }, timeoutDelay) - } - } - - async _loadChunks (positions: Vec3[], centerPos: Vec3) { - this.spiralNumber++ - const { spiralNumber } = this - // stop loading previous chunks - for (const pos of Object.keys(this.waitingSpiralChunksLoad)) { - this.waitingSpiralChunksLoad[pos](false) - delete this.waitingSpiralChunksLoad[pos] - } - - let continueLoading = true - this.inLoading = true - await delayedIterator(positions, this.addWaitTime, async (pos) => { - if (!continueLoading || this.loadedChunks[`${pos.x},${pos.z}`]) return - - // Wait for chunk to be available from server - if (!this.world.getColumnAt(pos)) { - continueLoading = await new Promise(resolve => { - this.waitingSpiralChunksLoad[`${pos.x},${pos.z}`] = resolve - }) - } - if (!continueLoading) return - await this.loadChunk(pos, undefined, `spiral ${spiralNumber} from ${centerPos.x},${centerPos.z}`) - this.chunkProgress() - }) - if (this.panicTimeout) clearTimeout(this.panicTimeout) - this.inLoading = false - this.gotPanicLastTime = false - this.chunkReceiveTimes = [] - this.lastChunkReceiveTime = 0 - } - - readdDebug () { - const clonedLoadedChunks = { ...this.loadedChunks } - this.unloadAllChunks() - console.time('readdDebug') - for (const loadedChunk in clonedLoadedChunks) { - const [x, z] = loadedChunk.split(',').map(Number) - void this.loadChunk(new Vec3(x, 0, z)) - } - const interval = setInterval(() => { - if (appViewer.rendererState.world.allChunksLoaded) { - clearInterval(interval) - console.timeEnd('readdDebug') - } - }, 100) - } - - // debugGotChunkLatency = [] as number[] - // lastTime = 0 - - async loadChunk (pos: ChunkPos, isLightUpdate = false, reason = 'spiral') { - const [botX, botZ] = chunkPos(this.lastPos) - - const dx = Math.abs(botX - Math.floor(pos.x / 16)) - const dz = Math.abs(botZ - Math.floor(pos.z / 16)) - if (dx <= this.viewDistance && dz <= this.viewDistance) { - // eslint-disable-next-line @typescript-eslint/await-thenable -- todo allow to use async world provider but not sure if needed - const column = await this.world.getColumnAt(pos['y'] ? pos as Vec3 : new Vec3(pos.x, 0, pos.z)) - if (column) { - // const latency = Math.floor(performance.now() - this.lastTime) - // this.debugGotChunkLatency.push(latency) - // this.lastTime = performance.now() - // todo optimize toJson data, make it clear why it is used - const chunk = column.toJson() - // TODO: blockEntities - const worldConfig = { - minY: column['minY'] ?? 0, - worldHeight: column['worldHeight'] ?? 256, - } - //@ts-expect-error - this.emitter.emit('loadChunk', { x: pos.x, z: pos.z, chunk, blockEntities: column.blockEntities, worldConfig, isLightUpdate }) - this.loadedChunks[`${pos.x},${pos.z}`] = true - - this.debugChunksInfo[`${pos.x},${pos.z}`] ??= { - loads: [] - } - this.debugChunksInfo[`${pos.x},${pos.z}`].loads.push({ - dataLength: chunk.length, - reason, - time: Date.now(), - }) - } else if (this.isPlayground) { // don't allow in real worlds pre-flag chunks as loaded to avoid race condition when the chunk might still be loading. In playground it's assumed we always pre-load all chunks first - this.emitter.emit('markAsLoaded', { x: pos.x, z: pos.z }) - } - } else { - // console.debug('skipped loading chunk', dx, dz, '>', this.viewDistance) - } - } - - unloadAllChunks () { - for (const coords of Object.keys(this.loadedChunks)) { - const [x, z] = coords.split(',').map(Number) - this.unloadChunk({ x, z }) - } - } - - unloadChunk (pos: ChunkPos) { - this.emitter.emit('unloadChunk', { x: pos.x, z: pos.z }) - delete this.loadedChunks[`${pos.x},${pos.z}`] - delete this.debugChunksInfo[`${pos.x},${pos.z}`] - } - - lastBiomeId: number | null = null - - udpateBiome (pos: Vec3) { - try { - const biomeId = this.world.getBiome(pos) - if (biomeId !== this.lastBiomeId) { - this.lastBiomeId = biomeId - const biomeData = loadedData.biomes[biomeId] - if (biomeData) { - this.emitter.emit('biomeUpdate', { - biome: biomeData - }) - } else { - // unknown biome - this.emitter.emit('biomeReset') - } - } - } catch (e) { - console.error('error updating biome', e) - } - } - - lastPosCheck: Vec3 | null = null - async updatePosition (pos: Vec3, force = false) { - if (!this.allowPositionUpdate) return - const posFloored = pos.floored() - if (!force && this.lastPosCheck && this.lastPosCheck.equals(posFloored)) return - this.lastPosCheck = posFloored - - this.udpateBiome(pos) - - const [lastX, lastZ] = chunkPos(this.lastPos) - const [botX, botZ] = chunkPos(pos) - if (lastX !== botX || lastZ !== botZ || force) { - this.emitter.emit('chunkPosUpdate', { pos }) - - // unload chunks that are no longer in view - const newViewToUnload = new ViewRect(botX, botZ, this.viewDistance + this.keepChunksDistance) - const chunksToUnload: Vec3[] = [] - for (const coords of Object.keys(this.loadedChunks)) { - const x = parseInt(coords.split(',')[0], 10) - const z = parseInt(coords.split(',')[1], 10) - const p = new Vec3(x, 0, z) - const [chunkX, chunkZ] = chunkPos(p) - if (!newViewToUnload.contains(chunkX, chunkZ)) { - chunksToUnload.push(p) - } - } - for (const p of chunksToUnload) { - this.unloadChunk(p) - } - - // load new chunks - const positions = generateSpiralMatrix(this.viewDistance).map(([x, z]) => { - const pos = new Vec3((botX + x) * 16, 0, (botZ + z) * 16) - if (!this.loadedChunks[`${pos.x},${pos.z}`]) return pos - return undefined! - }).filter(a => !!a) - this.lastPos.update(pos) - void this._loadChunks(positions, pos) - } else { - this.emitter.emit('chunkPosUpdate', { pos }) // todo-low - this.lastPos.update(pos) - } - } -} diff --git a/renderer/viewer/lib/worldrendererCommon.ts b/renderer/viewer/lib/worldrendererCommon.ts deleted file mode 100644 index 4140e3fa..00000000 --- a/renderer/viewer/lib/worldrendererCommon.ts +++ /dev/null @@ -1,1087 +0,0 @@ -/* eslint-disable guard-for-in */ -import { EventEmitter } from 'events' -import { Vec3 } from 'vec3' -import mcDataRaw from 'minecraft-data/data.js' // note: using alias -import TypedEmitter from 'typed-emitter' -import { WorldBlockProvider } from 'mc-assets/dist/worldBlockProvider' -import { generateSpiralMatrix } from 'flying-squid/dist/utils' -import { subscribeKey } from 'valtio/utils' -import { proxy } from 'valtio' -import { dynamicMcDataFiles } from '../../buildMesherConfig.mjs' -import type { ResourcesManagerTransferred } from '../../../src/resourcesManager' -import { DisplayWorldOptions, GraphicsInitOptions, RendererReactiveState } from '../../../src/appViewer' -import { SoundSystem } from '../three/threeJsSound' -import { buildCleanupDecorator } from './cleanupDecorator' -import { HighestBlockInfo, CustomBlockModels, BlockStateModelInfo, getBlockAssetsCacheKey, MesherConfig, MesherMainEvent } from './mesher/shared' -import { chunkPos } from './simpleUtils' -import { addNewStat, removeAllStats, updatePanesVisibility, updateStatText } from './ui/newStats' -import { WorldDataEmitterWorker } from './worldDataEmitter' -import { getPlayerStateUtils, PlayerStateReactive, PlayerStateRenderer, PlayerStateUtils } from './basePlayerState' -import { MesherLogReader } from './mesherlogReader' -import { setSkinsConfig } from './utils/skins' - -function mod (x, n) { - return ((x % n) + n) % n -} - -const toMajorVersion = version => { - const [a, b] = (String(version)).split('.') - return `${a}.${b}` -} - -export const worldCleanup = buildCleanupDecorator('resetWorld') - -export const defaultWorldRendererConfig = { - // Debug settings - showChunkBorders: false, - enableDebugOverlay: false, - - // Performance settings - mesherWorkers: 4, - addChunksBatchWaitTime: 200, - _experimentalSmoothChunkLoading: true, - _renderByChunks: false, - - // Rendering engine settings - dayCycle: true, - smoothLighting: true, - enableLighting: true, - starfield: true, - defaultSkybox: true, - renderEntities: true, - extraBlockRenderers: true, - foreground: true, - fov: 75, - volume: 1, - - // Camera visual related settings - showHand: false, - viewBobbing: false, - renderEars: true, - highlightBlockColor: 'blue', - - // Player models - fetchPlayerSkins: true, - skinTexturesProxy: undefined as string | undefined, - - // VR settings - vrSupport: true, - vrPageGameRendering: true, - - // World settings - clipWorldBelowY: undefined as number | undefined, - isPlayground: false -} - -export type WorldRendererConfig = typeof defaultWorldRendererConfig - -export abstract class WorldRendererCommon { - worldReadyResolvers = Promise.withResolvers() - worldReadyPromise = this.worldReadyResolvers.promise - timeOfTheDay = 0 - worldSizeParams = { minY: 0, worldHeight: 256 } - reactiveDebugParams = proxy({ - stopRendering: false, - chunksRenderAboveOverride: undefined as number | undefined, - chunksRenderAboveEnabled: false, - chunksRenderBelowOverride: undefined as number | undefined, - chunksRenderBelowEnabled: false, - chunksRenderDistanceOverride: undefined as number | undefined, - chunksRenderDistanceEnabled: false, - disableEntities: false, - // disableParticles: false - }) - - active = false - - // #region CHUNK & SECTIONS TRACKING - @worldCleanup() - loadedChunks = {} as Record // data is added for these chunks and they might be still processing - - @worldCleanup() - finishedChunks = {} as Record // these chunks are fully loaded into the world (scene) - - @worldCleanup() - finishedSections = {} as Record // these sections are fully loaded into the world (scene) - - @worldCleanup() - // loading sections (chunks) - sectionsWaiting = new Map() - - @worldCleanup() - queuedChunks = new Set() - queuedFunctions = [] as Array<() => void> - // #endregion - - renderUpdateEmitter = new EventEmitter() as unknown as TypedEmitter<{ - dirty (pos: Vec3, value: boolean): void - update (/* pos: Vec3, value: boolean */): void - chunkFinished (key: string): void - heightmap (key: string, heightmap: Uint8Array): void - }> - customTexturesDataUrl = undefined as string | undefined - workers: any[] = [] - viewerChunkPosition?: Vec3 - lastCamUpdate = 0 - droppedFpsPercentage = 0 - initialChunkLoadWasStartedIn: number | undefined - initialChunksLoad = true - enableChunksLoadDelay = false - texturesVersion?: string - viewDistance = -1 - chunksLength = 0 - allChunksFinished = false - messageQueue: any[] = [] - isProcessingQueue = false - ONMESSAGE_TIME_LIMIT = 30 // ms - - handleResize = () => { } - highestBlocksByChunks = new Map() - blockEntities = {} - - workersProcessAverageTime = 0 - workersProcessAverageTimeCount = 0 - maxWorkersProcessTime = 0 - geometryReceiveCount = {} as Record - allLoadedIn: undefined | number - onWorldSwitched = [] as Array<() => void> - renderTimeMax = 0 - renderTimeAvg = 0 - renderTimeAvgCount = 0 - edgeChunks = {} as Record - lastAddChunk = null as null | { - timeout: any - x: number - z: number - } - neighborChunkUpdates = true - lastChunkDistance = 0 - debugStopGeometryUpdate = false - - protocolCustomBlocks = new Map() - - @worldCleanup() - blockStateModelInfo = new Map() - - abstract outputFormat: 'threeJs' | 'webgpu' - worldBlockProvider: WorldBlockProvider - soundSystem: SoundSystem | undefined - - abstract changeBackgroundColor (color: [number, number, number]): void - - worldRendererConfig: WorldRendererConfig - playerStateReactive: PlayerStateReactive - playerStateUtils: PlayerStateUtils - reactiveState: RendererReactiveState - mesherLogReader: MesherLogReader | undefined - forceCallFromMesherReplayer = false - stopMesherMessagesProcessing = false - - abortController = new AbortController() - lastRendered = 0 - renderingActive = true - geometryReceiveCountPerSec = 0 - mesherLogger = { - contents: [] as string[], - active: new URL(location.href).searchParams.get('mesherlog') === 'true' - } - currentRenderedFrames = 0 - fpsAverage = 0 - lastFps = 0 - fpsWorst = undefined as number | undefined - fpsSamples = 0 - mainThreadRendering = true - backendInfoReport = '-' - chunksFullInfo = '-' - workerCustomHandleTime = 0 - - get version () { - return this.displayOptions.version - } - - get displayAdvancedStats () { - return (this.initOptions.config.statsVisible ?? 0) > 1 - } - - constructor (public readonly resourcesManager: ResourcesManagerTransferred, public displayOptions: DisplayWorldOptions, public initOptions: GraphicsInitOptions) { - this.snapshotInitialValues() - this.worldRendererConfig = displayOptions.inWorldRenderingConfig - this.playerStateReactive = displayOptions.playerStateReactive - this.playerStateUtils = getPlayerStateUtils(this.playerStateReactive) - this.reactiveState = displayOptions.rendererState - // this.mesherLogReader = new MesherLogReader(this) - this.renderUpdateEmitter.on('update', () => { - const loadedChunks = Object.keys(this.finishedChunks).length - updateStatText('loaded-chunks', `${loadedChunks}/${this.chunksLength} chunks (${this.lastChunkDistance}/${this.viewDistance})`) - }) - - addNewStat('downloaded-chunks', 100, 140, 20) - - this.connect(this.displayOptions.worldView) - - const interval = setInterval(() => { - this.geometryReceiveCountPerSec = Object.values(this.geometryReceiveCount).reduce((acc, curr) => acc + curr, 0) - this.geometryReceiveCount = {} - updatePanesVisibility(this.displayAdvancedStats) - this.updateChunksStats() - if (this.mainThreadRendering) { - this.fpsUpdate() - } - }, 500) - this.abortController.signal.addEventListener('abort', () => { - clearInterval(interval) - }) - } - - fpsUpdate () { - this.fpsSamples++ - this.fpsAverage = (this.fpsAverage * (this.fpsSamples - 1) + this.currentRenderedFrames) / this.fpsSamples - if (this.fpsWorst === undefined) { - this.fpsWorst = this.currentRenderedFrames - } else { - this.fpsWorst = Math.min(this.fpsWorst, this.currentRenderedFrames) - } - this.lastFps = this.currentRenderedFrames - this.currentRenderedFrames = 0 - } - - logWorkerWork (message: string | (() => string)) { - if (!this.mesherLogger.active) return - this.mesherLogger.contents.push(typeof message === 'function' ? message() : message) - } - - async init () { - if (this.active) throw new Error('WorldRendererCommon is already initialized') - - await Promise.all([ - this.resetWorkers(), - (async () => { - if (this.resourcesManager.currentResources?.allReady) { - await this.updateAssetsData() - } - })() - ]) - - this.resourcesManager.on('assetsTexturesUpdated', async () => { - if (!this.active) return - await this.updateAssetsData() - }) - - this.watchReactivePlayerState() - this.watchReactiveConfig() - this.worldReadyResolvers.resolve() - } - - snapshotInitialValues () { } - - wasChunkSentToWorker (chunkKey: string) { - return this.loadedChunks[chunkKey] - } - - async getHighestBlocks (chunkKey: string) { - return this.highestBlocksByChunks.get(chunkKey) - } - - updateCustomBlock (chunkKey: string, blockPos: string, model: string) { - this.protocolCustomBlocks.set(chunkKey, { - ...this.protocolCustomBlocks.get(chunkKey), - [blockPos]: model - }) - this.logWorkerWork(() => `-> updateCustomBlock ${chunkKey} ${blockPos} ${model} ${this.wasChunkSentToWorker(chunkKey)}`) - if (this.wasChunkSentToWorker(chunkKey)) { - const [x, y, z] = blockPos.split(',').map(Number) - this.setBlockStateId(new Vec3(x, y, z), undefined) - } - } - - async getBlockInfo (blockPos: { x: number, y: number, z: number }, stateId: number) { - const chunkKey = `${Math.floor(blockPos.x / 16) * 16},${Math.floor(blockPos.z / 16) * 16}` - const customBlockName = this.protocolCustomBlocks.get(chunkKey)?.[`${blockPos.x},${blockPos.y},${blockPos.z}`] - const cacheKey = getBlockAssetsCacheKey(stateId, customBlockName) - const modelInfo = this.blockStateModelInfo.get(cacheKey) - return { - customBlockName, - modelInfo - } - } - - initWorkers (numWorkers = this.worldRendererConfig.mesherWorkers) { - // init workers - for (let i = 0; i < numWorkers + 1; i++) { - const worker = initMesherWorker((data) => { - if (Array.isArray(data)) { - this.messageQueue.push(...data) - } else { - this.messageQueue.push(data) - } - void this.processMessageQueue('worker') - }) - this.workers.push(worker) - } - } - - onReactivePlayerStateUpdated(key: T, callback: (value: PlayerStateReactive[T]) => void, initial = true) { - if (initial) { - callback(this.playerStateReactive[key]) - } - subscribeKey(this.playerStateReactive, key, callback) - } - - onReactiveConfigUpdated(key: T, callback: (value: typeof this.worldRendererConfig[T]) => void) { - callback(this.worldRendererConfig[key]) - subscribeKey(this.worldRendererConfig, key, callback) - } - - onReactiveDebugUpdated(key: T, callback: (value: typeof this.reactiveDebugParams[T]) => void) { - callback(this.reactiveDebugParams[key]) - subscribeKey(this.reactiveDebugParams, key, callback) - } - - watchReactivePlayerState () { - this.onReactivePlayerStateUpdated('backgroundColor', (value) => { - this.changeBackgroundColor(value) - }) - } - - watchReactiveConfig () { - this.onReactiveConfigUpdated('fetchPlayerSkins', (value) => { - setSkinsConfig({ apiEnabled: value }) - }) - } - - async processMessageQueue (source: string) { - if (this.isProcessingQueue || this.messageQueue.length === 0) return - this.logWorkerWork(`# ${source} processing queue`) - if (this.lastRendered && performance.now() - this.lastRendered > this.ONMESSAGE_TIME_LIMIT && this.worldRendererConfig._experimentalSmoothChunkLoading && this.renderingActive) { - const start = performance.now() - await new Promise(resolve => { - requestAnimationFrame(resolve) - }) - this.logWorkerWork(`# processing got delayed by ${performance.now() - start}ms`) - } - this.isProcessingQueue = true - - const startTime = performance.now() - let processedCount = 0 - - while (this.messageQueue.length > 0) { - const processingStopped = this.stopMesherMessagesProcessing - if (!processingStopped) { - const data = this.messageQueue.shift()! - this.handleMessage(data) - processedCount++ - } - - // Check if we've exceeded the time limit - if (processingStopped || (performance.now() - startTime > this.ONMESSAGE_TIME_LIMIT && this.renderingActive && this.worldRendererConfig._experimentalSmoothChunkLoading)) { - // If we have more messages and exceeded time limit, schedule next batch - if (this.messageQueue.length > 0) { - requestAnimationFrame(async () => { - this.isProcessingQueue = false - void this.processMessageQueue('queue-delay') - }) - return - } - break - } - } - - this.isProcessingQueue = false - } - - handleMessage (rawData: any) { - const data = rawData as MesherMainEvent - if (!this.active) return - this.mesherLogReader?.workerMessageReceived(data.type, data) - if (data.type !== 'geometry' || !this.debugStopGeometryUpdate) { - const start = performance.now() - this.handleWorkerMessage(data as WorkerReceive) - this.workerCustomHandleTime += performance.now() - start - } - if (data.type === 'geometry') { - this.logWorkerWork(() => `-> ${data.workerIndex} geometry ${data.key} ${JSON.stringify({ dataSize: JSON.stringify(data).length })}`) - this.geometryReceiveCount[data.workerIndex] ??= 0 - this.geometryReceiveCount[data.workerIndex]++ - const chunkCoords = data.key.split(',').map(Number) - this.lastChunkDistance = Math.max(...this.getDistance(new Vec3(chunkCoords[0], 0, chunkCoords[2]))) - } - if (data.type === 'sectionFinished') { // on after load & unload section - this.logWorkerWork(`<- ${data.workerIndex} sectionFinished ${data.key} ${JSON.stringify({ processTime: data.processTime })}`) - if (!this.sectionsWaiting.has(data.key)) throw new Error(`sectionFinished event for non-outstanding section ${data.key}`) - this.sectionsWaiting.set(data.key, this.sectionsWaiting.get(data.key)! - 1) - if (this.sectionsWaiting.get(data.key) === 0) { - this.sectionsWaiting.delete(data.key) - this.finishedSections[data.key] = true - } - - const chunkCoords = data.key.split(',').map(Number) - const chunkKey = `${chunkCoords[0]},${chunkCoords[2]}` - if (this.loadedChunks[chunkKey]) { // ensure chunk data was added, not a neighbor chunk update - let loaded = true - for (let y = this.worldMinYRender; y < this.worldSizeParams.worldHeight; y += 16) { - if (!this.finishedSections[`${chunkCoords[0]},${y},${chunkCoords[2]}`]) { - loaded = false - break - } - } - if (loaded) { - // CHUNK FINISHED - this.finishedChunks[chunkKey] = true - this.reactiveState.world.chunksLoaded.add(`${Math.floor(chunkCoords[0] / 16)},${Math.floor(chunkCoords[2] / 16)}`) - this.renderUpdateEmitter.emit(`chunkFinished`, `${chunkCoords[0]},${chunkCoords[2]}`) - this.checkAllFinished() - // merge highest blocks by sections into highest blocks by chunks - // for (let y = this.worldMinYRender; y < this.worldSizeParams.worldHeight; y += 16) { - // const sectionKey = `${chunkCoords[0]},${y},${chunkCoords[2]}` - // for (let x = 0; x < 16; x++) { - // for (let z = 0; z < 16; z++) { - // const posInsideKey = `${chunkCoords[0] + x},${chunkCoords[2] + z}` - // let block = null as HighestBlockInfo | null - // const highestBlock = this.highestBlocksBySections[sectionKey]?.[posInsideKey] - // if (!highestBlock) continue - // if (!block || highestBlock.y > block.y) { - // block = highestBlock - // } - // if (block) { - // this.highestBlocksByChunks[chunkKey] ??= {} - // this.highestBlocksByChunks[chunkKey][posInsideKey] = block - // } - // } - // } - // delete this.highestBlocksBySections[sectionKey] - // } - } - } - - this.renderUpdateEmitter.emit('update') - if (data.processTime) { - this.workersProcessAverageTimeCount++ - this.workersProcessAverageTime = ((this.workersProcessAverageTime * (this.workersProcessAverageTimeCount - 1)) + data.processTime) / this.workersProcessAverageTimeCount - this.maxWorkersProcessTime = Math.max(this.maxWorkersProcessTime, data.processTime) - } - } - - if (data.type === 'blockStateModelInfo') { - for (const [cacheKey, info] of Object.entries(data.info)) { - this.blockStateModelInfo.set(cacheKey, info) - } - } - - if (data.type === 'heightmap') { - this.reactiveState.world.heightmaps.set(data.key, new Uint8Array(data.heightmap)) - } - } - - downloadMesherLog () { - const a = document.createElement('a') - a.href = 'data:text/plain;charset=utf-8,' + encodeURIComponent(this.mesherLogger.contents.join('\n')) - a.download = 'mesher.log' - a.click() - } - - checkAllFinished () { - if (this.sectionsWaiting.size === 0) { - this.reactiveState.world.mesherWork = false - } - // todo check exact surrounding chunks - const allFinished = Object.keys(this.finishedChunks).length >= this.chunksLength - if (allFinished) { - this.allChunksLoaded?.() - this.allChunksFinished = true - this.allLoadedIn ??= Date.now() - this.initialChunkLoadWasStartedIn! - } - this.updateChunksStats() - } - - changeHandSwingingState (isAnimationPlaying: boolean, isLeftHand: boolean): void { } - - abstract handleWorkerMessage (data: WorkerReceive): void - - abstract updateCamera (pos: Vec3 | null, yaw: number, pitch: number): void - - abstract render (): void - - /** - * Optionally update data that are depedendent on the viewer position - */ - updatePosDataChunk? (key: string): void - - allChunksLoaded? (): void - - timeUpdated? (newTime: number): void - - biomeUpdated? (biome: any): void - - biomeReset? (): void - - updateViewerPosition (pos: Vec3) { - this.viewerChunkPosition = pos - for (const [key, value] of Object.entries(this.loadedChunks)) { - if (!value) continue - this.updatePosDataChunk?.(key) - } - } - - sendWorkers (message: WorkerSend) { - for (const worker of this.workers) { - worker.postMessage(message) - } - } - - getDistance (posAbsolute: Vec3) { - const [botX, botZ] = chunkPos(this.viewerChunkPosition!) - const dx = Math.abs(botX - Math.floor(posAbsolute.x / 16)) - const dz = Math.abs(botZ - Math.floor(posAbsolute.z / 16)) - return [dx, dz] as [number, number] - } - - abstract updateShowChunksBorder (value: boolean): void - - resetWorld () { - // destroy workers - for (const worker of this.workers) { - worker.terminate() - } - this.workers = [] - } - - async resetWorkers () { - this.resetWorld() - - // for workers in single file build - if (typeof document !== 'undefined' && document?.readyState === 'loading') { - await new Promise(resolve => { - document.addEventListener('DOMContentLoaded', resolve) - }) - } - - this.initWorkers() - this.active = true - - this.sendMesherMcData() - } - - getMesherConfig (): MesherConfig { - let skyLight = 15 - const timeOfDay = this.timeOfTheDay - if (timeOfDay < 0 || timeOfDay > 24_000) { - // - } else if (timeOfDay <= 6000 || timeOfDay >= 18_000) { - skyLight = 15 - } else if (timeOfDay > 6000 && timeOfDay < 12_000) { - skyLight = 15 - ((timeOfDay - 6000) / 6000) * 15 - } else if (timeOfDay >= 12_000 && timeOfDay < 18_000) { - skyLight = ((timeOfDay - 12_000) / 6000) * 15 - } - - skyLight = Math.floor(skyLight) - return { - version: this.version, - enableLighting: this.worldRendererConfig.enableLighting, - skyLight, - smoothLighting: this.worldRendererConfig.smoothLighting, - outputFormat: this.outputFormat, - // textureSize: this.resourcesManager.currentResources!.blocksAtlasParser.atlas.latest.width, - debugModelVariant: undefined, - clipWorldBelowY: this.worldRendererConfig.clipWorldBelowY, - disableSignsMapsSupport: !this.worldRendererConfig.extraBlockRenderers, - worldMinY: this.worldMinYRender, - worldMaxY: this.worldMinYRender + this.worldSizeParams.worldHeight, - } - } - - sendMesherMcData () { - const allMcData = mcDataRaw.pc[this.version] ?? mcDataRaw.pc[toMajorVersion(this.version)] - const mcData = { - version: JSON.parse(JSON.stringify(allMcData.version)) - } - for (const key of dynamicMcDataFiles) { - mcData[key] = allMcData[key] - } - - for (const worker of this.workers) { - worker.postMessage({ type: 'mcData', mcData, config: this.getMesherConfig() }) - } - this.logWorkerWork('# mcData sent') - } - - async updateAssetsData () { - const resources = this.resourcesManager.currentResources - - if (this.workers.length === 0) throw new Error('workers not initialized yet') - for (const [i, worker] of this.workers.entries()) { - const { blockstatesModels } = resources - - worker.postMessage({ - type: 'mesherData', - workerIndex: i, - blocksAtlas: { - latest: resources.blocksAtlasJson - }, - blockstatesModels, - config: this.getMesherConfig(), - }) - } - - this.logWorkerWork('# mesherData sent') - console.log('textures loaded') - } - - get worldMinYRender () { - return Math.floor(Math.max(this.worldSizeParams.minY, this.worldRendererConfig.clipWorldBelowY ?? -Infinity) / 16) * 16 - } - - updateChunksStats () { - const loadedChunks = Object.keys(this.finishedChunks) - this.displayOptions.nonReactiveState.world.chunksLoaded = new Set(loadedChunks) - this.displayOptions.nonReactiveState.world.chunksTotalNumber = this.chunksLength - this.reactiveState.world.allChunksLoaded = this.allChunksFinished - - const text = `Q: ${this.messageQueue.length} ${Object.keys(this.loadedChunks).length}/${Object.keys(this.finishedChunks).length}/${this.chunksLength} chunks (${this.workers.length}:${this.workersProcessAverageTime.toFixed(0)}ms/${this.geometryReceiveCountPerSec}ss/${this.allLoadedIn?.toFixed(1) ?? '-'}s)` - this.chunksFullInfo = text - updateStatText('downloaded-chunks', text) - } - - addColumn (x: number, z: number, chunk: any, isLightUpdate: boolean) { - if (!this.active) return - if (this.workers.length === 0) throw new Error('workers not initialized yet') - this.initialChunksLoad = false - this.initialChunkLoadWasStartedIn ??= Date.now() - this.loadedChunks[`${x},${z}`] = true - this.updateChunksStats() - - const chunkKey = `${x},${z}` - const customBlockModels = this.protocolCustomBlocks.get(chunkKey) - - for (const worker of this.workers) { - worker.postMessage({ - type: 'chunk', - x, - z, - chunk, - customBlockModels: customBlockModels || undefined - }) - } - this.workers[0].postMessage({ - type: 'getHeightmap', - x, - z, - }) - this.logWorkerWork(() => `-> chunk ${JSON.stringify({ x, z, chunkLength: chunk.length, customBlockModelsLength: customBlockModels ? Object.keys(customBlockModels).length : 0 })}`) - this.mesherLogReader?.chunkReceived(x, z, chunk.length) - for (let y = this.worldMinYRender; y < this.worldSizeParams.worldHeight; y += 16) { - const loc = new Vec3(x, y, z) - this.setSectionDirty(loc) - if (this.neighborChunkUpdates && (!isLightUpdate || this.worldRendererConfig.smoothLighting)) { - this.setSectionDirty(loc.offset(-16, 0, 0)) - this.setSectionDirty(loc.offset(16, 0, 0)) - this.setSectionDirty(loc.offset(0, 0, -16)) - this.setSectionDirty(loc.offset(0, 0, 16)) - } - } - } - - markAsLoaded (x, z) { - this.loadedChunks[`${x},${z}`] = true - this.finishedChunks[`${x},${z}`] = true - this.logWorkerWork(`-> markAsLoaded ${JSON.stringify({ x, z })}`) - this.checkAllFinished() - } - - removeColumn (x, z) { - delete this.loadedChunks[`${x},${z}`] - for (const worker of this.workers) { - worker.postMessage({ type: 'unloadChunk', x, z }) - } - this.logWorkerWork(`-> unloadChunk ${JSON.stringify({ x, z })}`) - delete this.finishedChunks[`${x},${z}`] - this.allChunksFinished = Object.keys(this.finishedChunks).length === this.chunksLength - if (Object.keys(this.finishedChunks).length === 0) { - this.allLoadedIn = undefined - this.initialChunkLoadWasStartedIn = undefined - } - for (let y = this.worldSizeParams.minY; y < this.worldSizeParams.worldHeight; y += 16) { - this.setSectionDirty(new Vec3(x, y, z), false) - delete this.finishedSections[`${x},${y},${z}`] - } - this.highestBlocksByChunks.delete(`${x},${z}`) - - this.updateChunksStats() - - if (Object.keys(this.loadedChunks).length === 0) { - this.mesherLogger.contents = [] - this.logWorkerWork('# all chunks unloaded. New log started') - void this.mesherLogReader?.maybeStartReplay() - } - } - - setBlockStateId (pos: Vec3, stateId: number | undefined, needAoRecalculation = true) { - const set = async () => { - const sectionX = Math.floor(pos.x / 16) * 16 - const sectionZ = Math.floor(pos.z / 16) * 16 - if (this.queuedChunks.has(`${sectionX},${sectionZ}`)) { - await new Promise(resolve => { - this.queuedFunctions.push(() => { - resolve() - }) - }) - } - if (!this.loadedChunks[`${sectionX},${sectionZ}`]) { - // console.debug('[should be unreachable] setBlockStateId called for unloaded chunk', pos) - } - this.setBlockStateIdInner(pos, stateId, needAoRecalculation) - } - void set() - } - - updateEntity (e: any, isUpdate = false) { } - - abstract updatePlayerEntity? (e: any): void - - lightUpdate (chunkX: number, chunkZ: number) { } - - connect (worldView: WorldDataEmitterWorker) { - const worldEmitter = worldView - - worldEmitter.on('entity', (e) => { - this.updateEntity(e, false) - }) - worldEmitter.on('entityMoved', (e) => { - this.updateEntity(e, true) - }) - worldEmitter.on('playerEntity', (e) => { - this.updatePlayerEntity?.(e) - }) - - let currentLoadChunkBatch = null as { - timeout - data - } | null - worldEmitter.on('loadChunk', ({ x, z, chunk, worldConfig, isLightUpdate }) => { - this.worldSizeParams = worldConfig - this.queuedChunks.add(`${x},${z}`) - const args = [x, z, chunk, isLightUpdate] - if (!currentLoadChunkBatch) { - // add a setting to use debounce instead - currentLoadChunkBatch = { - data: [], - timeout: setTimeout(() => { - for (const args of currentLoadChunkBatch!.data) { - this.queuedChunks.delete(`${args[0]},${args[1]}`) - this.addColumn(...args as Parameters) - } - for (const fn of this.queuedFunctions) { - fn() - } - this.queuedFunctions = [] - currentLoadChunkBatch = null - }, this.worldRendererConfig.addChunksBatchWaitTime) - } - } - currentLoadChunkBatch.data.push(args) - }) - // todo remove and use other architecture instead so data flow is clear - worldEmitter.on('blockEntities', (blockEntities) => { - this.blockEntities = blockEntities - }) - - worldEmitter.on('unloadChunk', ({ x, z }) => { - this.removeColumn(x, z) - }) - - worldEmitter.on('blockUpdate', ({ pos, stateId }) => { - this.setBlockStateId(new Vec3(pos.x, pos.y, pos.z), stateId) - }) - - worldEmitter.on('chunkPosUpdate', ({ pos }) => { - this.updateViewerPosition(pos) - }) - - worldEmitter.on('end', () => { - this.worldStop?.() - }) - - - worldEmitter.on('renderDistance', (d) => { - this.viewDistance = d - this.chunksLength = d === 0 ? 1 : generateSpiralMatrix(d).length - }) - - worldEmitter.on('renderDistance', (d) => { - this.viewDistance = d - this.chunksLength = d === 0 ? 1 : generateSpiralMatrix(d).length - this.allChunksFinished = Object.keys(this.finishedChunks).length === this.chunksLength - }) - - worldEmitter.on('markAsLoaded', ({ x, z }) => { - this.markAsLoaded(x, z) - }) - - worldEmitter.on('updateLight', ({ pos }) => { - this.lightUpdate(pos.x, pos.z) - }) - - worldEmitter.on('onWorldSwitch', () => { - for (const fn of this.onWorldSwitched) { - try { - fn() - } catch (e) { - setTimeout(() => { - console.log('[Renderer Backend] Error in onWorldSwitched:') - throw e - }, 0) - } - } - }) - - worldEmitter.on('time', (timeOfDay) => { - if (!this.worldRendererConfig.dayCycle) return - this.timeUpdated?.(timeOfDay) - - this.timeOfTheDay = timeOfDay - - // if (this.worldRendererConfig.skyLight === skyLight) return - // this.worldRendererConfig.skyLight = skyLight - // if (this instanceof WorldRendererThree) { - // (this).rerenderAllChunks?.() - // } - }) - - worldEmitter.on('biomeUpdate', ({ biome }) => { - this.biomeUpdated?.(biome) - }) - - worldEmitter.on('biomeReset', () => { - this.biomeReset?.() - }) - } - - setBlockStateIdInner (pos: Vec3, stateId: number | undefined, needAoRecalculation = true) { - const chunkKey = `${Math.floor(pos.x / 16) * 16},${Math.floor(pos.z / 16) * 16}` - const blockPosKey = `${pos.x},${pos.y},${pos.z}` - const customBlockModels = this.protocolCustomBlocks.get(chunkKey) || {} - - for (const worker of this.workers) { - worker.postMessage({ - type: 'blockUpdate', - pos, - stateId, - customBlockModels - }) - } - this.logWorkerWork(`-> blockUpdate ${JSON.stringify({ pos, stateId, customBlockModels })}`) - this.setSectionDirty(pos, true, true) - if (this.neighborChunkUpdates) { - if ((pos.x & 15) === 0) this.setSectionDirty(pos.offset(-16, 0, 0), true, true) - if ((pos.x & 15) === 15) this.setSectionDirty(pos.offset(16, 0, 0), true, true) - if ((pos.y & 15) === 0) this.setSectionDirty(pos.offset(0, -16, 0), true, true) - if ((pos.y & 15) === 15) this.setSectionDirty(pos.offset(0, 16, 0), true, true) - if ((pos.z & 15) === 0) this.setSectionDirty(pos.offset(0, 0, -16), true, true) - if ((pos.z & 15) === 15) this.setSectionDirty(pos.offset(0, 0, 16), true, true) - - if (needAoRecalculation) { - // top view neighbors - if ((pos.x & 15) === 0 && (pos.z & 15) === 0) this.setSectionDirty(pos.offset(-16, 0, -16), true, true) - if ((pos.x & 15) === 15 && (pos.z & 15) === 0) this.setSectionDirty(pos.offset(16, 0, -16), true, true) - if ((pos.x & 15) === 0 && (pos.z & 15) === 15) this.setSectionDirty(pos.offset(-16, 0, 16), true, true) - if ((pos.x & 15) === 15 && (pos.z & 15) === 15) this.setSectionDirty(pos.offset(16, 0, 16), true, true) - - // side view neighbors (but ignore updates above) - // z view neighbors - if ((pos.x & 15) === 0 && (pos.y & 15) === 0) this.setSectionDirty(pos.offset(-16, -16, 0), true, true) - if ((pos.x & 15) === 15 && (pos.y & 15) === 0) this.setSectionDirty(pos.offset(16, -16, 0), true, true) - - // x view neighbors - if ((pos.z & 15) === 0 && (pos.y & 15) === 0) this.setSectionDirty(pos.offset(0, -16, -16), true, true) - if ((pos.z & 15) === 15 && (pos.y & 15) === 0) this.setSectionDirty(pos.offset(0, -16, 16), true, true) - - // x & z neighbors - if ((pos.y & 15) === 0 && (pos.x & 15) === 0 && (pos.z & 15) === 0) this.setSectionDirty(pos.offset(-16, -16, -16), true, true) - if ((pos.y & 15) === 0 && (pos.x & 15) === 15 && (pos.z & 15) === 0) this.setSectionDirty(pos.offset(16, -16, -16), true, true) - if ((pos.y & 15) === 0 && (pos.x & 15) === 0 && (pos.z & 15) === 15) this.setSectionDirty(pos.offset(-16, -16, 16), true, true) - if ((pos.y & 15) === 0 && (pos.x & 15) === 15 && (pos.z & 15) === 15) this.setSectionDirty(pos.offset(16, -16, 16), true, true) - } - } - } - - abstract worldStop? () - - queueAwaited = false - toWorkerMessagesQueue = {} as { [workerIndex: string]: any[] } - - getWorkerNumber (pos: Vec3, updateAction = false) { - if (updateAction) { - const key = `${Math.floor(pos.x / 16) * 16},${Math.floor(pos.y / 16) * 16},${Math.floor(pos.z / 16) * 16}` - const cantUseChangeWorker = this.sectionsWaiting.get(key) && !this.finishedSections[key] - if (!cantUseChangeWorker) return 0 - } - - const hash = mod(Math.floor(pos.x / 16) + Math.floor(pos.y / 16) + Math.floor(pos.z / 16), this.workers.length - 1) - return hash + 1 - } - - async debugGetWorkerCustomBlockModel (pos: Vec3) { - const data = [] as Array> - for (const worker of this.workers) { - data.push(new Promise((resolve) => { - worker.addEventListener('message', (e) => { - if (e.data.type === 'customBlockModel') { - resolve(e.data.customBlockModel) - } - }) - })) - worker.postMessage({ - type: 'getCustomBlockModel', - pos - }) - } - return Promise.all(data) - } - - setSectionDirty (pos: Vec3, value = true, useChangeWorker = false) { // value false is used for unloading chunks - if (!this.forceCallFromMesherReplayer && this.mesherLogReader) return - - if (this.viewDistance === -1) throw new Error('viewDistance not set') - this.reactiveState.world.mesherWork = true - const distance = this.getDistance(pos) - // todo shouldnt we check loadedChunks instead? - if (!this.workers.length || distance[0] > this.viewDistance || distance[1] > this.viewDistance) return - const key = `${Math.floor(pos.x / 16) * 16},${Math.floor(pos.y / 16) * 16},${Math.floor(pos.z / 16) * 16}` - // if (this.sectionsOutstanding.has(key)) return - this.renderUpdateEmitter.emit('dirty', pos, value) - // Dispatch sections to workers based on position - // This guarantees uniformity accross workers and that a given section - // is always dispatched to the same worker - const hash = this.getWorkerNumber(pos, useChangeWorker && this.mesherLogger.active) - this.sectionsWaiting.set(key, (this.sectionsWaiting.get(key) ?? 0) + 1) - if (this.forceCallFromMesherReplayer) { - this.workers[hash].postMessage({ - type: 'dirty', - x: pos.x, - y: pos.y, - z: pos.z, - value, - config: this.getMesherConfig(), - }) - } else { - this.toWorkerMessagesQueue[hash] ??= [] - this.toWorkerMessagesQueue[hash].push({ - // this.workers[hash].postMessage({ - type: 'dirty', - x: pos.x, - y: pos.y, - z: pos.z, - value, - config: this.getMesherConfig(), - }) - this.dispatchMessages() - } - } - - dispatchMessages () { - if (this.queueAwaited) return - this.queueAwaited = true - setTimeout(() => { - // group messages and send as one - for (const workerIndex in this.toWorkerMessagesQueue) { - const worker = this.workers[Number(workerIndex)] - worker.postMessage(this.toWorkerMessagesQueue[workerIndex]) - for (const message of this.toWorkerMessagesQueue[workerIndex]) { - this.logWorkerWork(`-> ${workerIndex} dispatchMessages ${message.type} ${JSON.stringify({ x: message.x, y: message.y, z: message.z, value: message.value })}`) - } - } - this.toWorkerMessagesQueue = {} - this.queueAwaited = false - }) - } - - // Listen for chunk rendering updates emitted if a worker finished a render and resolve if the number - // of sections not rendered are 0 - async waitForChunksToRender () { - return new Promise((resolve, reject) => { - if ([...this.sectionsWaiting].length === 0) { - resolve() - return - } - - const updateHandler = () => { - if (this.sectionsWaiting.size === 0) { - this.renderUpdateEmitter.removeListener('update', updateHandler) - resolve() - } - } - this.renderUpdateEmitter.on('update', updateHandler) - }) - } - - async waitForChunkToLoad (pos: Vec3) { - return new Promise((resolve, reject) => { - const key = `${Math.floor(pos.x / 16) * 16},${Math.floor(pos.z / 16) * 16}` - if (this.loadedChunks[key]) { - resolve() - return - } - const updateHandler = () => { - if (this.loadedChunks[key]) { - this.renderUpdateEmitter.removeListener('update', updateHandler) - resolve() - } - } - this.renderUpdateEmitter.on('update', updateHandler) - }) - } - - destroy () { - // Stop all workers - for (const worker of this.workers) { - worker.terminate() - } - this.workers = [] - - // Stop and destroy sound system - if (this.soundSystem) { - this.soundSystem.destroy() - this.soundSystem = undefined - } - - this.active = false - - this.renderUpdateEmitter.removeAllListeners() - this.abortController.abort() - removeAllStats() - } -} - -export const initMesherWorker = (onGotMessage: (data: any) => void) => { - // Node environment needs an absolute path, but browser needs the url of the file - const workerName = 'mesher.js' - - let worker: any - if (process.env.SINGLE_FILE_BUILD) { - const workerCode = document.getElementById('mesher-worker-code')!.textContent! - const blob = new Blob([workerCode], { type: 'text/javascript' }) - worker = new Worker(window.URL.createObjectURL(blob)) - } else { - worker = new Worker(workerName) - } - - worker.onmessage = ({ data }) => { - onGotMessage(data) - } - if (worker.on) worker.on('message', (data) => { worker.onmessage({ data }) }) - return worker -} - -export const meshersSendMcData = (workers: Worker[], version: string, addData = {} as Record) => { - const allMcData = mcDataRaw.pc[version] ?? mcDataRaw.pc[toMajorVersion(version)] - const mcData = { - version: JSON.parse(JSON.stringify(allMcData.version)) - } - for (const key of dynamicMcDataFiles) { - mcData[key] = allMcData[key] - } - - for (const worker of workers) { - worker.postMessage({ type: 'mcData', mcData, ...addData }) - } -} diff --git a/renderer/viewer/sign-renderer/index.html b/renderer/viewer/sign-renderer/index.html deleted file mode 100644 index 671ad05f..00000000 --- a/renderer/viewer/sign-renderer/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - %VITE_NAME% - - - - -
test
- - - - diff --git a/renderer/viewer/sign-renderer/index.ts b/renderer/viewer/sign-renderer/index.ts deleted file mode 100644 index f14b9b4c..00000000 --- a/renderer/viewer/sign-renderer/index.ts +++ /dev/null @@ -1,216 +0,0 @@ -import type { ChatMessage } from 'prismarine-chat' -import { createCanvas } from '../lib/utils' - -type SignBlockEntity = { - Color?: string - GlowingText?: 0 | 1 - Text1?: string - Text2?: string - Text3?: string - Text4?: string -} | { - // todo - is_waxed?: 0 | 1 - front_text: { - color: string - messages: string[] - // todo - has_glowing_text?: 0 | 1 - } - // todo - // back_text: {} -} - -type JsonEncodedType = string | null | Record - -const parseSafe = (text: string, task: string) => { - try { - return JSON.parse(text) - } catch (e) { - console.warn(`Failed to parse ${task}`, e) - return null - } -} - -const LEGACY_COLORS = { - black: '#000000', - dark_blue: '#0000AA', - dark_green: '#00AA00', - dark_aqua: '#00AAAA', - dark_red: '#AA0000', - dark_purple: '#AA00AA', - gold: '#FFAA00', - gray: '#AAAAAA', - dark_gray: '#555555', - blue: '#5555FF', - green: '#55FF55', - aqua: '#55FFFF', - red: '#FF5555', - light_purple: '#FF55FF', - yellow: '#FFFF55', - white: '#FFFFFF', -} - -export const renderSign = ( - blockEntity: SignBlockEntity, - isHanging: boolean, - PrismarineChat: typeof ChatMessage, - ctxHook = (ctx) => { }, - canvasCreator = (width, height): OffscreenCanvas => { return createCanvas(width, height) } -) => { - // todo don't use texture rendering, investigate the font rendering when possible - // or increase factor when needed - const factor = 40 - const fontSize = 1.6 * factor - const signboardY = [16, 9] - const heightOffset = signboardY[0] - signboardY[1] - const heightScalar = heightOffset / 16 - // todo the text should be clipped based on it's render width (needs investigate) - - const texts = 'front_text' in blockEntity ? /* > 1.20 */ blockEntity.front_text.messages : [ - blockEntity.Text1, - blockEntity.Text2, - blockEntity.Text3, - blockEntity.Text4 - ] - - if (!texts.some((text) => text !== 'null')) { - return undefined - } - - const canvas = canvasCreator(16 * factor, heightOffset * factor) - - const _ctx = canvas.getContext('2d')! - - ctxHook(_ctx) - const defaultColor = ('front_text' in blockEntity ? blockEntity.front_text.color : blockEntity.Color) || 'black' - for (const [lineNum, text] of texts.slice(0, 4).entries()) { - if (text === 'null') continue - renderComponent(text, PrismarineChat, canvas, fontSize, defaultColor, fontSize * (lineNum + 1) + (isHanging ? 0 : -8)) - } - return canvas -} - -export const renderComponent = ( - text: JsonEncodedType | string | undefined, - PrismarineChat: typeof ChatMessage, - canvas: OffscreenCanvas, - fontSize: number, - defaultColor: string, - offset = 0 -) => { - // todo: in pre flatenning it seems the format was not json - const parsed = typeof text === 'string' && (text?.startsWith('{') || text?.startsWith('"')) ? parseSafe(text ?? '""', 'sign text') : text - if (!parsed || (typeof parsed !== 'object' && typeof parsed !== 'string')) return - // todo fix type - - const ctx = canvas.getContext('2d')! - if (!ctx) throw new Error('Could not get 2d context') - ctx.imageSmoothingEnabled = false - ctx.font = `${fontSize}px mojangles` - - type Formatting = { - color: string | undefined - underlined: boolean | undefined - strikethrough: boolean | undefined - bold: boolean | undefined - italic: boolean | undefined - } - - type Message = ChatMessage & Formatting & { text: string } - - const message = new PrismarineChat(parsed) as Message - - const toRenderCanvas: Array<{ - fontStyle: string - fillStyle: string - underlineStyle: boolean - strikeStyle: boolean - offset: number - text: string - }> = [] - let visibleFormatting = false - let plainText = '' - let textOffset = offset - const textWidths: number[] = [] - - const renderText = (component: Message, parentFormatting?: Formatting | undefined) => { - const { text } = component - const formatting = { - color: component.color ?? parentFormatting?.color, - underlined: component.underlined ?? parentFormatting?.underlined, - strikethrough: component.strikethrough ?? parentFormatting?.strikethrough, - bold: component.bold ?? parentFormatting?.bold, - italic: component.italic ?? parentFormatting?.italic - } - visibleFormatting = visibleFormatting || formatting.underlined || formatting.strikethrough || false - if (text?.includes('\n')) { - for (const line of text.split('\n')) { - addTextPart(line, formatting) - textOffset += fontSize - plainText = '' - } - } else if (text) { - addTextPart(text, formatting) - } - if (component.extra) { - for (const child of component.extra) { - renderText(child as Message, formatting) - } - } - } - - const addTextPart = (text: string, formatting: Formatting) => { - plainText += text - textWidths[textOffset] = ctx.measureText(plainText).width - let color = formatting.color ?? defaultColor - if (!color.startsWith('#')) { - color = LEGACY_COLORS[color.toLowerCase()] || color - } - toRenderCanvas.push({ - fontStyle: `${formatting.bold ? 'bold' : ''} ${formatting.italic ? 'italic' : ''}`, - fillStyle: color, - underlineStyle: formatting.underlined ?? false, - strikeStyle: formatting.strikethrough ?? false, - offset: textOffset, - text - }) - } - - renderText(message) - - // skip rendering empty lines - if (!visibleFormatting && !message.toString().trim()) return - - let renderedWidth = 0 - let previousOffsetY = 0 - for (const { fillStyle, fontStyle, underlineStyle, strikeStyle, offset: offsetY, text } of toRenderCanvas) { - if (previousOffsetY !== offsetY) { - renderedWidth = 0 - } - previousOffsetY = offsetY - ctx.fillStyle = fillStyle - ctx.textRendering = 'optimizeLegibility' - ctx.font = `${fontStyle} ${fontSize}px mojangles` - const textWidth = textWidths[offsetY] ?? ctx.measureText(text).width - const offsetX = (canvas.width - textWidth) / 2 + renderedWidth - ctx.fillText(text, offsetX, offsetY) - if (strikeStyle) { - ctx.lineWidth = fontSize / 8 - ctx.strokeStyle = fillStyle - ctx.beginPath() - ctx.moveTo(offsetX, offsetY - ctx.lineWidth * 2.5) - ctx.lineTo(offsetX + ctx.measureText(text).width, offsetY - ctx.lineWidth * 2.5) - ctx.stroke() - } - if (underlineStyle) { - ctx.lineWidth = fontSize / 8 - ctx.strokeStyle = fillStyle - ctx.beginPath() - ctx.moveTo(offsetX, offsetY + ctx.lineWidth) - ctx.lineTo(offsetX + ctx.measureText(text).width, offsetY + ctx.lineWidth) - ctx.stroke() - } - renderedWidth += ctx.measureText(text).width - } -} diff --git a/renderer/viewer/sign-renderer/noop.js b/renderer/viewer/sign-renderer/noop.js deleted file mode 100644 index 4ba52ba2..00000000 --- a/renderer/viewer/sign-renderer/noop.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = {} diff --git a/renderer/viewer/sign-renderer/package.json b/renderer/viewer/sign-renderer/package.json deleted file mode 100644 index 7715417a..00000000 --- a/renderer/viewer/sign-renderer/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "sign-renderer", - "version": "0.0.0", - "private": true, - "license": "MIT", - "main": "index.ts", - "scripts": { - "start": "vite" - }, - "dependencies": { - "vite": "^4.4.9" - } -} diff --git a/renderer/viewer/sign-renderer/playground.ts b/renderer/viewer/sign-renderer/playground.ts deleted file mode 100644 index a7438092..00000000 --- a/renderer/viewer/sign-renderer/playground.ts +++ /dev/null @@ -1,38 +0,0 @@ -import PrismarineChatLoader from 'prismarine-chat' -import { renderSign } from '.' - -const PrismarineChat = PrismarineChatLoader({ language: {} } as any) - -const img = new Image() -img.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAMCAYAAAB4MH11AAABbElEQVR4AY3BQY6cMBBA0Q+yQZZVi+ndcJVcKGfMgegdvShKVtuokzGSWwwiUd7rfv388Vst0UgMXCobmgsSA5VaQmKgUks0EgNHji8SA9W8GJCQwVNpLhzJ4KFs4B1HEgPVvBiQkMFTaS44tYTEQDXdIkfiHbuyobmguaDPFzIWGrWExEA13SJH4h1uzS/WbPyvroM1v6jWbFRrNv7GfX5EdmXjzTvUEjJ4zjQXjiQGdmXjzTvUEjJ4HF/UEt/kQqW5UEkMzIshY08jg6dRS3yTC5XmgpsXY7pFztQSEgPNJCNv3lGpJVSfTLfImVpCYsB1HdwfxpU1G9eeNF0H94dxZc2G+/yI7MoG3vEv82LI2NNIDLyVDbzjzFE2mnkxZOy5IoNnkpFGc2FXNpp5MWTsOXJ4h1qikrGnkhjYlY1m1icy9lQSA+TCzjvUEpWMPZXEwK5suPvDOFuzcdZ1sOYX1ZqNas3GlTUbzR+jQbEAcs8ZQAAAAABJRU5ErkJggg==' - -await new Promise(resolve => { - img.onload = () => resolve() -}) - -const blockEntity = { - 'GlowingText': 0, - 'Color': 'black', - 'Text4': '{"text":""}', - 'Text3': '{"text":""}', - 'Text2': '{"text":""}', - 'Text1': '{"extra":[{"color":"dark_green","text":"Minecraft "},{"text":"Tools"}],"text":""}' -} as const - -await document.fonts.load('1em mojangles') - -const canvas = renderSign(blockEntity, false, PrismarineChat, (ctx) => { - ctx.drawImage(img, 0, 0, ctx.canvas.width, ctx.canvas.height) -}, (width, height) => { - const canvas = document.createElement('canvas') - canvas.width = width - canvas.height = height - return canvas as unknown as OffscreenCanvas -}) as unknown as HTMLCanvasElement - -if (canvas) { - canvas.style.imageRendering = 'pixelated' - document.body.appendChild(canvas) -} else { - console.log('Render skipped') -} diff --git a/renderer/viewer/sign-renderer/tests.test.ts b/renderer/viewer/sign-renderer/tests.test.ts deleted file mode 100644 index ab268849..00000000 --- a/renderer/viewer/sign-renderer/tests.test.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { test, expect } from 'vitest' -import PrismarineChatLoader from 'prismarine-chat' -import { renderSign } from '.' - -const PrismarineChat = PrismarineChatLoader({ language: {} } as any) -let ctxTexts = [] as any[] - -global.document = { - createElement () { - return { - getContext () { - return { - fillText (text, x, y) { - ctxTexts.push({ text, x, y }) - }, - measureText () { return 0 } - } - } - } - } -} as any - -const render = (entity) => { - ctxTexts = [] - renderSign(entity, true, PrismarineChat) - return ctxTexts.map(({ text, y }) => [y / 64, text]) -} - -test('sign renderer', () => { - let blockEntity = { - 'GlowingText': 0, - 'Color': 'black', - 'Text4': '{"text":""}', - 'Text3': '{"text":""}', - 'Text2': '{"text":""}', - 'Text1': '{"extra":[{"color":"dark_green","text":"Minecraft "},{"text":"Tools"}],"text":""}' - } as any - expect(render(blockEntity)).toMatchInlineSnapshot(` - [ - [ - 1, - "Minecraft ", - ], - [ - 1, - "Tools", - ], - ] - `) - - blockEntity = { // pre flatenning - 'Text1': 'Welcome to', - 'Text2': '', - 'Text3': 'null', - 'Text4': '"Version 2.1"', - } as const - expect(render(blockEntity)).toMatchInlineSnapshot(` - [ - [ - 1, - "Welcome to", - ], - [ - 4, - "Version 2.1", - ], - ] - `) -}) diff --git a/renderer/viewer/sign-renderer/vite.config.ts b/renderer/viewer/sign-renderer/vite.config.ts deleted file mode 100644 index aebfc20c..00000000 --- a/renderer/viewer/sign-renderer/vite.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig } from 'vite' - -export default defineConfig({ - resolve: { - alias: { - 'prismarine-registry': './noop.js', - 'prismarine-nbt': './noop.js' - }, - }, -}) diff --git a/renderer/viewer/three/appShared.ts b/renderer/viewer/three/appShared.ts deleted file mode 100644 index 5be9e10b..00000000 --- a/renderer/viewer/three/appShared.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { BlockModel } from 'mc-assets/dist/types' -import { ItemSpecificContextProperties, PlayerStateRenderer } from 'renderer/viewer/lib/basePlayerState' -import { GeneralInputItem, getItemModelName } from '../../../src/mineflayer/items' -import { ResourcesManager, ResourcesManagerTransferred } from '../../../src/resourcesManager' -import { renderSlot } from './renderSlot' - -export const getItemUv = (item: Record, specificProps: ItemSpecificContextProperties, resourcesManager: ResourcesManagerTransferred, playerState: PlayerStateRenderer): { - u: number - v: number - su: number - sv: number - renderInfo?: ReturnType - // texture: ImageBitmap - modelName: string -} | { - resolvedModel: BlockModel - modelName: string -} => { - const resources = resourcesManager.currentResources - if (!resources) throw new Error('Resources not loaded') - const idOrName = item.itemId ?? item.blockId ?? item.name - const { blockState } = item - try { - const name = - blockState - ? loadedData.blocksByStateId[blockState]?.name - : typeof idOrName === 'number' ? loadedData.items[idOrName]?.name : idOrName - if (!name) throw new Error(`Item not found: ${idOrName}`) - - const model = getItemModelName({ - ...item, - name, - } as GeneralInputItem, specificProps, resourcesManager, playerState) - - const renderInfo = renderSlot({ - modelName: model, - }, resourcesManager, false, true) - - if (!renderInfo) throw new Error(`Failed to get render info for item ${name}`) - - const img = renderInfo.texture === 'blocks' ? resources.blocksAtlasImage : resources.itemsAtlasImage - - if (renderInfo.blockData) { - return { - resolvedModel: renderInfo.blockData.resolvedModel, - modelName: renderInfo.modelName! - } - } - if (renderInfo.slice) { - // Get slice coordinates from either block or item texture - const [x, y, w, h] = renderInfo.slice - const [u, v, su, sv] = [x / img.width, y / img.height, (w / img.width), (h / img.height)] - return { - u, v, su, sv, - renderInfo, - // texture: img, - modelName: renderInfo.modelName! - } - } - - throw new Error(`Invalid render info for item ${name}`) - } catch (err) { - reportError?.(err) - // Return default UV coordinates for missing texture - return { - u: 0, - v: 0, - su: 16 / resources.blocksAtlasImage.width, - sv: 16 / resources.blocksAtlasImage.width, - // texture: resources.blocksAtlasImage, - modelName: 'missing' - } - } -} diff --git a/renderer/viewer/three/cameraShake.ts b/renderer/viewer/three/cameraShake.ts deleted file mode 100644 index 7b159509..00000000 --- a/renderer/viewer/three/cameraShake.ts +++ /dev/null @@ -1,120 +0,0 @@ -import * as THREE from 'three' -import { WorldRendererThree } from './worldrendererThree' - -export class CameraShake { - private rollAngle = 0 - private get damageRollAmount () { return 5 } - private get damageAnimDuration () { return 200 } - private rollAnimation?: { startTime: number, startRoll: number, targetRoll: number, duration: number, returnToZero?: boolean } - private basePitch = 0 - private baseYaw = 0 - - constructor (public worldRenderer: WorldRendererThree, public onRenderCallbacks: Array<() => void>) { - onRenderCallbacks.push(() => { - this.update() - }) - } - - setBaseRotation (pitch: number, yaw: number) { - this.basePitch = pitch - this.baseYaw = yaw - this.update() - } - - getBaseRotation () { - return { pitch: this.basePitch, yaw: this.baseYaw } - } - - shakeFromDamage (yaw?: number) { - // Add roll animation - const startRoll = this.rollAngle - const targetRoll = startRoll + (yaw ?? (Math.random() < 0.5 ? -1 : 1)) * this.damageRollAmount - - this.rollAnimation = { - startTime: performance.now(), - startRoll, - targetRoll, - duration: this.damageAnimDuration / 2 - } - } - - update () { - if (this.worldRenderer.playerStateUtils.isSpectatingEntity()) { - // Remove any shaking when spectating - this.rollAngle = 0 - this.rollAnimation = undefined - } - // Update roll animation - if (this.rollAnimation) { - const now = performance.now() - const elapsed = now - this.rollAnimation.startTime - const progress = Math.min(elapsed / this.rollAnimation.duration, 1) - - if (this.rollAnimation.returnToZero) { - // Ease back to zero - this.rollAngle = this.rollAnimation.startRoll * (1 - this.easeInOut(progress)) - if (progress === 1) { - this.rollAnimation = undefined - } - } else { - // Initial roll - this.rollAngle = this.rollAnimation.startRoll + (this.rollAnimation.targetRoll - this.rollAnimation.startRoll) * this.easeOut(progress) - if (progress === 1) { - // Start return to zero animation - this.rollAnimation = { - startTime: now, - startRoll: this.rollAngle, - targetRoll: 0, - duration: this.damageAnimDuration / 2, - returnToZero: true - } - } - } - } - - const camera = this.worldRenderer.cameraObject - - if (this.worldRenderer.cameraGroupVr) { - // For VR camera, only apply yaw rotation - const yawQuat = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), this.baseYaw) - camera.setRotationFromQuaternion(yawQuat) - } else { - // For regular camera, apply all rotations - // Add tiny offsets to prevent z-fighting at ideal angles (90, 180, 270 degrees) - const pitchOffset = this.addAntiZfightingOffset(this.basePitch) - const yawOffset = this.addAntiZfightingOffset(this.baseYaw) - - const pitchQuat = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), pitchOffset) - const yawQuat = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), yawOffset) - const rollQuat = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), THREE.MathUtils.degToRad(this.rollAngle)) - // Combine rotations in the correct order: pitch -> yaw -> roll - const finalQuat = yawQuat.multiply(pitchQuat).multiply(rollQuat) - camera.setRotationFromQuaternion(finalQuat) - } - } - - private easeOut (t: number): number { - return 1 - (1 - t) * (1 - t) - } - - private easeInOut (t: number): number { - return t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2 - } - - private addAntiZfightingOffset (angle: number): number { - const offset = 0.001 // Very small offset in radians (about 0.057 degrees) - - // Check if the angle is close to ideal angles (0, π/2, π, 3π/2) - const normalizedAngle = ((angle % (Math.PI * 2)) + Math.PI * 2) % (Math.PI * 2) - const tolerance = 0.01 // Tolerance for considering an angle "ideal" - - if (Math.abs(normalizedAngle) < tolerance || - Math.abs(normalizedAngle - Math.PI / 2) < tolerance || - Math.abs(normalizedAngle - Math.PI) < tolerance || - Math.abs(normalizedAngle - 3 * Math.PI / 2) < tolerance) { - return angle + offset - } - - return angle - } -} diff --git a/renderer/viewer/three/documentRenderer.ts b/renderer/viewer/three/documentRenderer.ts deleted file mode 100644 index a5dc060d..00000000 --- a/renderer/viewer/three/documentRenderer.ts +++ /dev/null @@ -1,328 +0,0 @@ -import * as THREE from 'three' -import Stats from 'stats.js' -import StatsGl from 'stats-gl' -import * as tween from '@tweenjs/tween.js' -import { GraphicsBackendConfig, GraphicsInitOptions } from '../../../src/appViewer' -import { WorldRendererConfig } from '../lib/worldrendererCommon' - -export class DocumentRenderer { - canvas: HTMLCanvasElement | OffscreenCanvas - readonly renderer: THREE.WebGLRenderer - private animationFrameId?: number - private timeoutId?: number - private lastRenderTime = 0 - - private previousCanvasWidth = 0 - private previousCanvasHeight = 0 - private currentWidth = 0 - private currentHeight = 0 - - private renderedFps = 0 - private fpsInterval: any - private readonly stats: TopRightStats | undefined - private paused = false - disconnected = false - preRender = () => { } - render = (sizeChanged: boolean) => { } - postRender = () => { } - sizeChanged = () => { } - droppedFpsPercentage: number - config: GraphicsBackendConfig - onRender = [] as Array<(sizeChanged: boolean) => void> - inWorldRenderingConfig: WorldRendererConfig | undefined - - constructor (initOptions: GraphicsInitOptions, public externalCanvas?: OffscreenCanvas) { - this.config = initOptions.config - - // Handle canvas creation/transfer based on context - if (externalCanvas) { - this.canvas = externalCanvas - } else { - this.addToPage() - } - - try { - this.renderer = new THREE.WebGLRenderer({ - canvas: this.canvas, - preserveDrawingBuffer: true, - logarithmicDepthBuffer: true, - powerPreference: this.config.powerPreference - }) - } catch (err) { - initOptions.callbacks.displayCriticalError(new Error(`Failed to create WebGL context, not possible to render (restart browser): ${err.message}`)) - throw err - } - this.renderer.outputColorSpace = THREE.LinearSRGBColorSpace - if (!externalCanvas) { - this.updatePixelRatio() - } - this.sizeUpdated() - // Initialize previous dimensions - this.previousCanvasWidth = this.canvas.width - this.previousCanvasHeight = this.canvas.height - - const supportsWebGL2 = 'WebGL2RenderingContext' in window - // Only initialize stats and DOM-related features in main thread - if (!externalCanvas && supportsWebGL2) { - this.stats = new TopRightStats(this.canvas as HTMLCanvasElement, this.config.statsVisible) - this.setupFpsTracking() - } - - this.startRenderLoop() - } - - updatePixelRatio () { - let pixelRatio = window.devicePixelRatio || 1 // todo this value is too high on ios, need to check, probably we should use avg, also need to make it configurable - if (!this.renderer.capabilities.isWebGL2) { - pixelRatio = 1 // webgl1 has issues with high pixel ratio (sometimes screen is clipped) - } - this.renderer.setPixelRatio(pixelRatio) - } - - sizeUpdated () { - this.renderer.setSize(this.currentWidth, this.currentHeight, false) - } - - private addToPage () { - this.canvas = addCanvasToPage() - this.updateCanvasSize() - } - - updateSizeExternal (newWidth: number, newHeight: number, pixelRatio: number) { - this.currentWidth = newWidth - this.currentHeight = newHeight - this.renderer.setPixelRatio(pixelRatio) - this.sizeUpdated() - } - - private updateCanvasSize () { - if (!this.externalCanvas) { - const innnerWidth = window.innerWidth - const innnerHeight = window.innerHeight - if (this.currentWidth !== innnerWidth) { - this.currentWidth = innnerWidth - } - if (this.currentHeight !== innnerHeight) { - this.currentHeight = innnerHeight - } - } - } - - private setupFpsTracking () { - let max = 0 - this.fpsInterval = setInterval(() => { - if (max > 0) { - this.droppedFpsPercentage = this.renderedFps / max - } - max = Math.max(this.renderedFps, max) - this.renderedFps = 0 - }, 1000) - } - - private startRenderLoop () { - const animate = () => { - if (this.disconnected) return - - if (this.config.timeoutRendering) { - this.timeoutId = setTimeout(animate, this.config.fpsLimit ? 1000 / this.config.fpsLimit : 0) as unknown as number - } else { - this.animationFrameId = requestAnimationFrame(animate) - } - - if (this.paused || (this.renderer.xr.isPresenting && !this.inWorldRenderingConfig?.vrPageGameRendering)) return - - // Handle FPS limiting - if (this.config.fpsLimit) { - const now = performance.now() - const elapsed = now - this.lastRenderTime - const fpsInterval = 1000 / this.config.fpsLimit - - if (elapsed < fpsInterval) { - return - } - - this.lastRenderTime = now - (elapsed % fpsInterval) - } - - let sizeChanged = false - this.updateCanvasSize() - if (this.previousCanvasWidth !== this.currentWidth || this.previousCanvasHeight !== this.currentHeight) { - this.previousCanvasWidth = this.currentWidth - this.previousCanvasHeight = this.currentHeight - this.sizeUpdated() - sizeChanged = true - } - - this.frameRender(sizeChanged) - - // Update stats visibility each frame (main thread only) - if (this.config.statsVisible !== undefined) { - this.stats?.setVisibility(this.config.statsVisible) - } - } - - animate() - } - - frameRender (sizeChanged: boolean) { - this.preRender() - this.stats?.markStart() - tween.update() - if (!globalThis.freezeRender) { - this.render(sizeChanged) - } - for (const fn of this.onRender) { - fn(sizeChanged) - } - this.renderedFps++ - this.stats?.markEnd() - this.postRender() - } - - setPaused (paused: boolean) { - this.paused = paused - } - - dispose () { - this.disconnected = true - if (this.animationFrameId) { - cancelAnimationFrame(this.animationFrameId) - } - if (this.timeoutId) { - clearTimeout(this.timeoutId) - } - if (this.canvas instanceof HTMLCanvasElement) { - this.canvas.remove() - } - clearInterval(this.fpsInterval) - this.stats?.dispose() - this.renderer.dispose() - } -} - -class TopRightStats { - private readonly stats: Stats - private readonly stats2: Stats - private readonly statsGl: StatsGl - private total = 0 - private readonly denseMode: boolean - - constructor (private readonly canvas: HTMLCanvasElement, initialStatsVisible = 0) { - this.stats = new Stats() - this.stats2 = new Stats() - this.statsGl = new StatsGl({ minimal: true }) - this.stats2.showPanel(2) - this.denseMode = process.env.NODE_ENV === 'production' || window.innerHeight < 500 - - this.initStats() - this.setVisibility(initialStatsVisible) - } - - private addStat (dom: HTMLElement, size = 80) { - dom.style.position = 'absolute' - if (this.denseMode) dom.style.height = '12px' - dom.style.overflow = 'hidden' - dom.style.left = '' - dom.style.top = '0' - dom.style.right = `${this.total}px` - dom.style.width = '80px' - dom.style.zIndex = '1' - dom.style.opacity = '0.8' - document.body.appendChild(dom) - this.total += size - } - - private initStats () { - const hasRamPanel = this.stats2.dom.children.length === 3 - - this.addStat(this.stats.dom) - if (process.env.NODE_ENV === 'development' && document.exitPointerLock) { - this.stats.dom.style.top = '' - this.stats.dom.style.bottom = '0' - } - if (hasRamPanel) { - this.addStat(this.stats2.dom) - } - - this.statsGl.init(this.canvas) - this.statsGl.container.style.display = 'flex' - this.statsGl.container.style.justifyContent = 'flex-end' - - let i = 0 - for (const _child of this.statsGl.container.children) { - const child = _child as HTMLElement - if (i++ === 0) { - child.style.display = 'none' - } - child.style.position = '' - } - } - - setVisibility (level: number) { - const visible = level > 0 - if (visible) { - this.stats.dom.style.display = 'block' - this.stats2.dom.style.display = level >= 2 ? 'block' : 'none' - this.statsGl.container.style.display = level >= 2 ? 'block' : 'none' - } else { - this.stats.dom.style.display = 'none' - this.stats2.dom.style.display = 'none' - this.statsGl.container.style.display = 'none' - } - } - - markStart () { - this.stats.begin() - this.stats2.begin() - this.statsGl.begin() - } - - markEnd () { - this.stats.end() - this.stats2.end() - this.statsGl.end() - } - - dispose () { - this.stats.dom.remove() - this.stats2.dom.remove() - this.statsGl.container.remove() - } -} - -const addCanvasToPage = () => { - const canvas = document.createElement('canvas') - canvas.id = 'viewer-canvas' - document.body.appendChild(canvas) - return canvas -} - -export const addCanvasForWorker = () => { - const canvas = addCanvasToPage() - const transferred = canvas.transferControlToOffscreen() - let removed = false - let onSizeChanged = (w, h) => { } - let oldSize = { width: 0, height: 0 } - const checkSize = () => { - if (removed) return - if (oldSize.width !== window.innerWidth || oldSize.height !== window.innerHeight) { - onSizeChanged(window.innerWidth, window.innerHeight) - oldSize = { width: window.innerWidth, height: window.innerHeight } - } - requestAnimationFrame(checkSize) - } - requestAnimationFrame(checkSize) - return { - canvas: transferred, - destroy () { - removed = true - canvas.remove() - }, - onSizeChanged (cb: (width: number, height: number) => void) { - onSizeChanged = cb - }, - get size () { - return { width: window.innerWidth, height: window.innerHeight } - } - } -} diff --git a/renderer/viewer/three/entities.ts b/renderer/viewer/three/entities.ts deleted file mode 100644 index fad30182..00000000 --- a/renderer/viewer/three/entities.ts +++ /dev/null @@ -1,1493 +0,0 @@ -//@ts-check -import { UnionToIntersection } from 'type-fest' -import nbt from 'prismarine-nbt' -import * as TWEEN from '@tweenjs/tween.js' -import * as THREE from 'three' -import { PlayerAnimation, PlayerObject } from 'skinview3d' -import { inferModelType, loadCapeToCanvas, loadEarsToCanvasFromSkin } from 'skinview-utils' -// todo replace with url -import { degreesToRadians } from '@nxg-org/mineflayer-tracker/lib/mathUtils' -import { NameTagObject } from 'skinview3d/libs/nametag' -import { flat, fromFormattedString } from '@xmcl/text-component' -import mojangson from 'mojangson' -import { snakeCase } from 'change-case' -import { Item } from 'prismarine-item' -import { isEntityAttackable } from 'mineflayer-mouse/dist/attackableEntity' -import { Team } from 'mineflayer' -import PrismarineChatLoader from 'prismarine-chat' -import { EntityMetadataVersions } from '../../../src/mcDataTypes' -import { ItemSpecificContextProperties } from '../lib/basePlayerState' -import { loadSkinFromUsername, loadSkinImage, stevePngUrl } from '../lib/utils/skins' -import { renderComponent } from '../sign-renderer' -import { createCanvas } from '../lib/utils' -import { PlayerObjectType } from '../lib/createPlayerObject' -import { getBlockMeshFromModel } from './holdingBlock' -import { createItemMesh } from './itemMesh' -import * as Entity from './entity/EntityMesh' -import { getMesh } from './entity/EntityMesh' -import { WalkingGeneralSwing } from './entity/animations' -import { disposeObject, loadTexture, loadThreeJsTextureFromUrl } from './threeJsUtils' -import { armorModel, armorTextures, elytraTexture } from './entity/armorModels' -import { WorldRendererThree } from './worldrendererThree' - -export const steveTexture = loadThreeJsTextureFromUrl(stevePngUrl) - -export const TWEEN_DURATION = 120 - -function convert2sComplementToHex (complement: number) { - if (complement < 0) { - complement = (0xFF_FF_FF_FF + complement + 1) >>> 0 - } - return complement.toString(16) -} - -function toRgba (color: string | undefined) { - if (color === undefined) { - return undefined - } - if (parseInt(color, 10) === 0) { - return 'rgba(0, 0, 0, 0)' - } - const hex = convert2sComplementToHex(parseInt(color, 10)) - if (hex.length === 8) { - return `#${hex.slice(2, 8)}${hex.slice(0, 2)}` - } else { - return `#${hex}` - } -} - -function toQuaternion (quaternion: any, defaultValue?: THREE.Quaternion) { - if (quaternion === undefined) { - return defaultValue - } - if (quaternion instanceof THREE.Quaternion) { - return quaternion - } - if (Array.isArray(quaternion)) { - return new THREE.Quaternion(quaternion[0], quaternion[1], quaternion[2], quaternion[3]) - } - return new THREE.Quaternion(quaternion.x, quaternion.y, quaternion.z, quaternion.w) -} - -function poseToEuler (pose: any, defaultValue?: THREE.Euler) { - if (pose === undefined) { - return defaultValue ?? new THREE.Euler() - } - if (pose instanceof THREE.Euler) { - return pose - } - if (pose['yaw'] !== undefined && pose['pitch'] !== undefined && pose['roll'] !== undefined) { - // Convert Minecraft pitch, yaw, roll definitions to our angle system - return new THREE.Euler(-degreesToRadians(pose.pitch), -degreesToRadians(pose.yaw), degreesToRadians(pose.roll), 'ZYX') - } - if (pose['x'] !== undefined && pose['y'] !== undefined && pose['z'] !== undefined) { - return new THREE.Euler(pose.z, pose.y, pose.x, 'ZYX') - } - if (Array.isArray(pose)) { - return new THREE.Euler(pose[0], pose[1], pose[2]) - } - return defaultValue ?? new THREE.Euler() -} - -function getUsernameTexture ({ - username, - nameTagBackgroundColor = 'rgba(0, 0, 0, 0.3)', - nameTagTextOpacity = 255 -}: any, { fontFamily = 'mojangles' }: any, version: string) { - const canvas = createCanvas(64, 64) - - const PrismarineChat = PrismarineChatLoader(version) - - const ctx = canvas.getContext('2d') - if (!ctx) throw new Error('Could not get 2d context') - - const fontSize = 48 - const padding = 5 - ctx.font = `${fontSize}px ${fontFamily}` - - const plainLines = String(typeof username === 'string' ? username : new PrismarineChat(username).toString()).split('\n') - let textWidth = 0 - for (const line of plainLines) { - const width = ctx.measureText(line).width + padding * 2 - if (width > textWidth) textWidth = width - } - - canvas.width = textWidth - canvas.height = (fontSize + padding) * plainLines.length - - ctx.fillStyle = nameTagBackgroundColor - ctx.fillRect(0, 0, canvas.width, canvas.height) - - ctx.globalAlpha = nameTagTextOpacity / 255 - - renderComponent(username, PrismarineChat, canvas, fontSize, 'white', -padding + fontSize) - - ctx.globalAlpha = 1 - - return canvas -} - -const addNametag = (entity, options: { fontFamily: string }, mesh, version: string) => { - for (const c of mesh.children) { - if (c.name === 'nametag') { - c.removeFromParent() - } - } - if (entity.username !== undefined) { - const canvas = getUsernameTexture(entity, options, version) - const tex = new THREE.Texture(canvas) - tex.needsUpdate = true - let nameTag: THREE.Object3D - if (entity.nameTagFixed) { - const geometry = new THREE.PlaneGeometry() - const material = new THREE.MeshBasicMaterial({ map: tex }) - material.transparent = true - nameTag = new THREE.Mesh(geometry, material) - nameTag.rotation.set(entity.pitch, THREE.MathUtils.degToRad(entity.yaw + 180), 0) - nameTag.position.y += entity.height + 0.3 - } else { - const spriteMat = new THREE.SpriteMaterial({ map: tex }) - nameTag = new THREE.Sprite(spriteMat) - nameTag.position.y += entity.height + 0.6 - } - nameTag.renderOrder = 1000 - nameTag.scale.set(canvas.width * 0.005, canvas.height * 0.005, 1) - if (entity.nameTagRotationRight) { - nameTag.applyQuaternion(entity.nameTagRotationRight) - } - if (entity.nameTagScale) { - nameTag.scale.multiply(entity.nameTagScale) - } - if (entity.nameTagRotationLeft) { - nameTag.applyQuaternion(entity.nameTagRotationLeft) - } - if (entity.nameTagTranslation) { - nameTag.position.add(entity.nameTagTranslation) - } - nameTag.name = 'nametag' - - mesh.add(nameTag) - return nameTag - } -} - -// todo cleanup -const nametags = {} - -const isFirstUpperCase = (str) => str.charAt(0) === str.charAt(0).toUpperCase() - -function getEntityMesh (entity: import('prismarine-entity').Entity & { delete?: any; pos?: any; name?: any }, world: WorldRendererThree, options: { fontFamily: string }, overrides) { - if (entity.name) { - try { - // https://github.com/PrismarineJS/prismarine-viewer/pull/410 - const entityName = (isFirstUpperCase(entity.name) ? snakeCase(entity.name) : entity.name).toLowerCase() - const e = new Entity.EntityMesh('1.16.4', entityName, world, overrides) - - if (e.mesh) { - addNametag(entity, options, e.mesh, world.version) - return e.mesh - } - } catch (err) { - reportError?.(err) - } - } - - if (!isEntityAttackable(loadedData, entity)) return - const geometry = new THREE.BoxGeometry(entity.width, entity.height, entity.width) - geometry.translate(0, entity.height / 2, 0) - const material = new THREE.MeshBasicMaterial({ color: 0xff_00_ff }) - const cube = new THREE.Mesh(geometry, material) - const nametagCount = (nametags[entity.name] = (nametags[entity.name] || 0) + 1) - if (nametagCount < 6) { - addNametag({ - username: entity.name, - height: entity.height, - }, options, cube, world.version) - } - return cube -} - -export type SceneEntity = THREE.Object3D & { - playerObject?: PlayerObjectType - username?: string - uuid?: string - additionalCleanup?: () => void - originalEntity: import('prismarine-entity').Entity & { delete?; pos?, name, team?: Team } -} - -export class Entities { - entities = {} as Record - playerEntity: SceneEntity | null = null // Special entity for the player in third person - entitiesOptions = { - fontFamily: 'mojangles' - } - debugMode: string - onSkinUpdate: () => void - clock = new THREE.Clock() - currentlyRendering = true - cachedMapsImages = {} as Record - itemFrameMaps = {} as Record>> - - get entitiesByName (): Record { - const byName: Record = {} - for (const entity of Object.values(this.entities)) { - if (!entity['realName']) continue - byName[entity['realName']] = byName[entity['realName']] || [] - byName[entity['realName']].push(entity) - } - return byName - } - - get entitiesRenderingCount (): number { - return Object.values(this.entities).filter(entity => entity.visible).length - } - - getDebugString (): string { - const totalEntities = Object.keys(this.entities).length - const visibleEntities = this.entitiesRenderingCount - - const playerEntities = Object.values(this.entities).filter(entity => entity.playerObject) - const visiblePlayerEntities = playerEntities.filter(entity => entity.visible) - - return `${visibleEntities}/${totalEntities} ${visiblePlayerEntities.length}/${playerEntities.length}` - } - - constructor (public worldRenderer: WorldRendererThree) { - this.debugMode = 'none' - this.onSkinUpdate = () => { } - this.watchResourcesUpdates() - } - - handlePlayerEntity (playerData: SceneEntity['originalEntity']) { - // Create player entity if it doesn't exist - if (!this.playerEntity) { - // Create the player entity similar to how normal entities are created - const group = new THREE.Group() as unknown as SceneEntity - group.originalEntity = { ...playerData, name: 'player' } as SceneEntity['originalEntity'] - - const wrapper = new THREE.Group() - const playerObject = this.setupPlayerObject(playerData, wrapper, {}) - group.playerObject = playerObject - group.add(wrapper) - - group.name = 'player_entity' - this.playerEntity = group - this.worldRenderer.scene.add(group) - - void this.updatePlayerSkin(playerData.id, playerData.username, playerData.uuid ?? undefined, stevePngUrl) - } - - // Update position and rotation - if (playerData.position) { - this.playerEntity.position.set(playerData.position.x, playerData.position.y, playerData.position.z) - } - if (playerData.yaw !== undefined) { - this.playerEntity.rotation.y = playerData.yaw - } - - this.updateEntityEquipment(this.playerEntity, playerData) - } - - clear () { - for (const mesh of Object.values(this.entities)) { - this.worldRenderer.scene.remove(mesh) - disposeObject(mesh) - } - this.entities = {} - - // Clean up player entity - if (this.playerEntity) { - this.worldRenderer.scene.remove(this.playerEntity) - disposeObject(this.playerEntity) - this.playerEntity = null - } - } - - reloadEntities () { - for (const entity of Object.values(this.entities)) { - // update all entities textures like held items, armour, etc - // todo update entity textures itself - this.update({ ...entity.originalEntity, delete: true, } as SceneEntity['originalEntity'], {}) - this.update(entity.originalEntity, {}) - } - } - - watchResourcesUpdates () { - this.worldRenderer.resourcesManager.on('assetsTexturesUpdated', () => this.reloadEntities()) - this.worldRenderer.resourcesManager.on('assetsInventoryReady', () => this.reloadEntities()) - } - - setDebugMode (mode: string, entity: THREE.Object3D | null = null) { - this.debugMode = mode - for (const mesh of entity ? [entity] : Object.values(this.entities)) { - const boxHelper = mesh.children.find(c => c.name === 'debug')! - boxHelper.visible = false - if (this.debugMode === 'basic') { - boxHelper.visible = true - } - // todo advanced - } - } - - setRendering (rendering: boolean, entity: THREE.Object3D | null = null) { - this.currentlyRendering = rendering - for (const ent of entity ? [entity] : Object.values(this.entities)) { - if (rendering) { - if (!this.worldRenderer.scene.children.includes(ent)) this.worldRenderer.scene.add(ent) - } else { - this.worldRenderer.scene.remove(ent) - } - } - } - - render () { - const renderEntitiesConfig = this.worldRenderer.worldRendererConfig.renderEntities - if (renderEntitiesConfig !== this.currentlyRendering) { - this.setRendering(renderEntitiesConfig) - } - - const dt = this.clock.getDelta() - const botPos = this.worldRenderer.viewerChunkPosition - const VISIBLE_DISTANCE = 10 * 10 - - // Update regular entities - for (const [entityId, entity] of [...Object.entries(this.entities), ['player_entity', this.playerEntity] as [string, SceneEntity | null]]) { - if (!entity) continue - const { playerObject } = entity - - // Update animations - if (playerObject?.animation) { - playerObject.animation.update(playerObject, dt) - } - - // Update visibility based on distance and chunk load status - if (botPos && entity.position) { - const dx = entity.position.x - botPos.x - const dy = entity.position.y - botPos.y - const dz = entity.position.z - botPos.z - const distanceSquared = dx * dx + dy * dy + dz * dz - - // Entity is visible if within 20 blocks OR in a finished chunk - entity.visible = !!(distanceSquared < VISIBLE_DISTANCE || this.worldRenderer.shouldObjectVisible(entity)) - - this.maybeRenderPlayerSkin(entityId) - } - - if (entity.visible) { - // Update armor positions - this.syncArmorPositions(entity) - } - - if (entityId === 'player_entity') { - entity.visible = this.worldRenderer.playerStateUtils.isThirdPerson() - - if (entity.visible) { - // sync - const yOffset = this.worldRenderer.playerStateReactive.eyeHeight - const pos = this.worldRenderer.cameraObject.position.clone().add(new THREE.Vector3(0, -yOffset, 0)) - entity.position.set(pos.x, pos.y, pos.z) - - const rotation = this.worldRenderer.cameraShake.getBaseRotation() - entity.rotation.set(0, rotation.yaw, 0) - - // Sync head rotation - entity.traverse((c) => { - if (c.name === 'head') { - c.rotation.set(-rotation.pitch, 0, 0) - } - }) - } - } - } - } - - private syncArmorPositions (entity: SceneEntity) { - if (!entity.playerObject) return - - // todo-low use property access for less loop iterations (small performance gain) - entity.traverse((armor) => { - if (!armor.name.startsWith('geometry_armor_')) return - - const { skin } = entity.playerObject! - - switch (armor.name) { - case 'geometry_armor_head': - // Head armor sync - if (armor.children[0]?.children[0]) { - armor.children[0].children[0].rotation.set( - -skin.head.rotation.x, - skin.head.rotation.y, - skin.head.rotation.z, - skin.head.rotation.order - ) - } - break - - case 'geometry_armor_legs': - // Legs armor sync - if (armor.children[0]) { - // Left leg - if (armor.children[0].children[2]) { - armor.children[0].children[2].rotation.set( - -skin.leftLeg.rotation.x, - skin.leftLeg.rotation.y, - skin.leftLeg.rotation.z, - skin.leftLeg.rotation.order - ) - } - // Right leg - if (armor.children[0].children[1]) { - armor.children[0].children[1].rotation.set( - -skin.rightLeg.rotation.x, - skin.rightLeg.rotation.y, - skin.rightLeg.rotation.z, - skin.rightLeg.rotation.order - ) - } - } - break - - case 'geometry_armor_feet': - // Boots armor sync - if (armor.children[0]) { - // Right boot - if (armor.children[0].children[0]) { - armor.children[0].children[0].rotation.set( - -skin.rightLeg.rotation.x, - skin.rightLeg.rotation.y, - skin.rightLeg.rotation.z, - skin.rightLeg.rotation.order - ) - } - // Left boot (reversed Z rotation) - if (armor.children[0].children[1]) { - armor.children[0].children[1].rotation.set( - -skin.leftLeg.rotation.x, - skin.leftLeg.rotation.y, - -skin.leftLeg.rotation.z, - skin.leftLeg.rotation.order - ) - } - } - break - } - }) - } - - getPlayerObject (entityId: string | number) { - if (this.playerEntity?.originalEntity.id === entityId) return this.playerEntity?.playerObject - const playerObject = this.entities[entityId]?.playerObject - return playerObject - } - - uuidPerSkinUrlsCache = {} as Record - - private isCanvasBlank (canvas: HTMLCanvasElement): boolean { - return !canvas.getContext('2d') - ?.getImageData(0, 0, canvas.width, canvas.height).data - .some(channel => channel !== 0) - } - - // todo true/undefined doesnt reset the skin to the default one - // eslint-disable-next-line max-params - async updatePlayerSkin (entityId: string | number, username: string | undefined, uuidCache: string | undefined, skinUrl: string | true, capeUrl: string | true | undefined = undefined) { - const isCustomSkin = skinUrl !== stevePngUrl - if (isCustomSkin) { - this.loadedSkinEntityIds.add(String(entityId)) - } - if (uuidCache) { - if (typeof skinUrl === 'string' || typeof capeUrl === 'string') this.uuidPerSkinUrlsCache[uuidCache] = {} - if (typeof skinUrl === 'string') this.uuidPerSkinUrlsCache[uuidCache].skinUrl = skinUrl - if (typeof capeUrl === 'string') this.uuidPerSkinUrlsCache[uuidCache].capeUrl = capeUrl - if (skinUrl === true) { - skinUrl = this.uuidPerSkinUrlsCache[uuidCache]?.skinUrl ?? skinUrl - } - capeUrl ??= this.uuidPerSkinUrlsCache[uuidCache]?.capeUrl - } - - const playerObject = this.getPlayerObject(entityId) - if (!playerObject) return - - if (skinUrl === true) { - if (!username) return - const newSkinUrl = await loadSkinFromUsername(username, 'skin') - if (!this.getPlayerObject(entityId)) return - if (!newSkinUrl) return - skinUrl = newSkinUrl - } - - if (typeof skinUrl !== 'string') throw new Error('Invalid skin url') - const renderEars = this.worldRenderer.worldRendererConfig.renderEars || username === 'deadmau5' - void this.loadAndApplySkin(entityId, skinUrl, renderEars).then(async () => { - if (capeUrl) { - if (capeUrl === true && username) { - const newCapeUrl = await loadSkinFromUsername(username, 'cape') - if (!this.getPlayerObject(entityId)) return - if (!newCapeUrl) return - capeUrl = newCapeUrl - } - if (typeof capeUrl === 'string') { - void this.loadAndApplyCape(entityId, capeUrl) - } - } - }) - - - playerObject.cape.visible = false - if (!capeUrl) { - playerObject.backEquipment = null - playerObject.elytra.map = null - if (playerObject.cape.map) { - playerObject.cape.map.dispose() - } - playerObject.cape.map = null - } - } - - private async loadAndApplySkin (entityId: string | number, skinUrl: string, renderEars: boolean) { - let playerObject = this.getPlayerObject(entityId) - if (!playerObject) return - - try { - let playerCustomSkinImage: ImageBitmap | undefined - - playerObject = this.getPlayerObject(entityId) - if (!playerObject) return - - let skinTexture: THREE.Texture - let skinCanvas: OffscreenCanvas - if (skinUrl === stevePngUrl) { - skinTexture = await steveTexture - const canvas = createCanvas(64, 64) - const ctx = canvas.getContext('2d') - if (!ctx) throw new Error('Failed to get context') - ctx.drawImage(skinTexture.image, 0, 0) - skinCanvas = canvas - } else { - const { canvas, image } = await loadSkinImage(skinUrl) - playerCustomSkinImage = image - skinTexture = new THREE.CanvasTexture(canvas) - skinCanvas = canvas - } - - skinTexture.magFilter = THREE.NearestFilter - skinTexture.minFilter = THREE.NearestFilter - skinTexture.needsUpdate = true - playerObject.skin.map = skinTexture as any - playerObject.skin.modelType = inferModelType(skinCanvas) - - let earsCanvas: HTMLCanvasElement | undefined - if (!playerCustomSkinImage) { - renderEars = false - } else if (renderEars) { - earsCanvas = document.createElement('canvas') - loadEarsToCanvasFromSkin(earsCanvas, playerCustomSkinImage) - renderEars = !this.isCanvasBlank(earsCanvas) - } - if (renderEars) { - const earsTexture = new THREE.CanvasTexture(earsCanvas!) - earsTexture.magFilter = THREE.NearestFilter - earsTexture.minFilter = THREE.NearestFilter - earsTexture.needsUpdate = true - //@ts-expect-error - playerObject.ears.map = earsTexture - playerObject.ears.visible = true - } else { - playerObject.ears.map = null - playerObject.ears.visible = false - } - this.onSkinUpdate?.() - } catch (error) { - console.error('Error loading skin:', error) - } - } - - private async loadAndApplyCape (entityId: string | number, capeUrl: string) { - let playerObject = this.getPlayerObject(entityId) - if (!playerObject) return - - try { - const { canvas: capeCanvas, image: capeImage } = await loadSkinImage(capeUrl) - - playerObject = this.getPlayerObject(entityId) - if (!playerObject) return - - loadCapeToCanvas(capeCanvas, capeImage) - const capeTexture = new THREE.CanvasTexture(capeCanvas) - capeTexture.magFilter = THREE.NearestFilter - capeTexture.minFilter = THREE.NearestFilter - capeTexture.needsUpdate = true - //@ts-expect-error - playerObject.cape.map = capeTexture - playerObject.cape.visible = true - //@ts-expect-error - playerObject.elytra.map = capeTexture - this.onSkinUpdate?.() - - if (!playerObject.backEquipment) { - playerObject.backEquipment = 'cape' - } - } catch (error) { - console.error('Error loading cape:', error) - } - } - - debugSwingArm () { - const playerObject = Object.values(this.entities).find(entity => entity.playerObject?.animation instanceof WalkingGeneralSwing) - if (!playerObject) return - (playerObject.playerObject!.animation as WalkingGeneralSwing).swingArm() - } - - playAnimation (entityPlayerId, animation: 'walking' | 'running' | 'oneSwing' | 'idle' | 'crouch' | 'crouchWalking') { - // TODO CLEANUP! - // Handle special player entity ID for bot entity in third person - if (entityPlayerId === 'player_entity' && this.playerEntity?.playerObject) { - const { playerObject } = this.playerEntity - if (animation === 'oneSwing') { - if (!(playerObject.animation instanceof WalkingGeneralSwing)) throw new Error('Expected WalkingGeneralSwing') - playerObject.animation.swingArm() - return - } - - if (playerObject.animation instanceof WalkingGeneralSwing) { - playerObject.animation.switchAnimationCallback = () => { - if (!(playerObject.animation instanceof WalkingGeneralSwing)) throw new Error('Expected WalkingGeneralSwing') - playerObject.animation.isMoving = animation === 'walking' || animation === 'running' || animation === 'crouchWalking' - playerObject.animation.isRunning = animation === 'running' - playerObject.animation.isCrouched = animation === 'crouch' || animation === 'crouchWalking' - } - } - return - } - - // Handle regular entities - const playerObject = this.getPlayerObject(entityPlayerId) - if (playerObject) { - if (animation === 'oneSwing') { - if (!(playerObject.animation instanceof WalkingGeneralSwing)) throw new Error('Expected WalkingGeneralSwing') - playerObject.animation.swingArm() - return - } - - if (playerObject.animation instanceof WalkingGeneralSwing) { - playerObject.animation.switchAnimationCallback = () => { - if (!(playerObject.animation instanceof WalkingGeneralSwing)) throw new Error('Expected WalkingGeneralSwing') - playerObject.animation.isMoving = animation === 'walking' || animation === 'running' || animation === 'crouchWalking' - playerObject.animation.isRunning = animation === 'running' - playerObject.animation.isCrouched = animation === 'crouch' || animation === 'crouchWalking' - } - } - return - } - - // Handle player entity (for third person view) - fallback for backwards compatibility - if (this.playerEntity?.playerObject) { - const { playerObject: playerEntityObject } = this.playerEntity - if (animation === 'oneSwing') { - if (!(playerEntityObject.animation instanceof WalkingGeneralSwing)) throw new Error('Expected WalkingGeneralSwing') - playerEntityObject.animation.swingArm() - return - } - - if (playerEntityObject.animation instanceof WalkingGeneralSwing) { - playerEntityObject.animation.switchAnimationCallback = () => { - if (!(playerEntityObject.animation instanceof WalkingGeneralSwing)) throw new Error('Expected WalkingGeneralSwing') - playerEntityObject.animation.isMoving = animation === 'walking' || animation === 'running' || animation === 'crouchWalking' - playerEntityObject.animation.isRunning = animation === 'running' - playerEntityObject.animation.isCrouched = animation === 'crouch' || animation === 'crouchWalking' - } - } - } - } - - parseEntityLabel (jsonLike) { - if (!jsonLike) return - try { - if (jsonLike.type === 'string') { - return jsonLike.value - } - const parsed = typeof jsonLike === 'string' ? mojangson.simplify(mojangson.parse(jsonLike)) : nbt.simplify(jsonLike) - const text = flat(parsed).map(this.textFromComponent) - return text.join('') - } catch (err) { - return jsonLike - } - } - - private textFromComponent (component) { - return typeof component === 'string' ? component : component.text ?? '' - } - - getItemMesh (item, specificProps: ItemSpecificContextProperties, faceCamera = false, previousModel?: string) { - if (!item.nbt && item.nbtData) item.nbt = item.nbtData - const textureUv = this.worldRenderer.getItemRenderData(item, specificProps) - if (previousModel && previousModel === textureUv?.modelName) return undefined - - if (textureUv && 'resolvedModel' in textureUv) { - const mesh = getBlockMeshFromModel(this.worldRenderer.material, textureUv.resolvedModel, textureUv.modelName, this.worldRenderer.resourcesManager.currentResources.worldBlockProvider!) - let SCALE = 1 - if (specificProps['minecraft:display_context'] === 'ground') { - SCALE = 0.5 - } else if (specificProps['minecraft:display_context'] === 'thirdperson') { - SCALE = 6 - } - mesh.scale.set(SCALE, SCALE, SCALE) - const outerGroup = new THREE.Group() - outerGroup.add(mesh) - return { - mesh: outerGroup, - isBlock: true, - modelName: textureUv.modelName, - } - } - - // Render proper 3D model for items - if (textureUv) { - const textureThree = textureUv.renderInfo?.texture === 'blocks' ? this.worldRenderer.material.map! : this.worldRenderer.itemsTexture - const { u, v, su, sv } = textureUv - const sizeX = su ?? 1 // su is actually width - const sizeY = sv ?? 1 // sv is actually height - - // Use the new unified item mesh function - const result = createItemMesh(textureThree, { - u, - v, - sizeX, - sizeY - }, { - faceCamera, - use3D: !faceCamera, // Only use 3D for non-camera-facing items - }) - - let SCALE = 1 - if (specificProps['minecraft:display_context'] === 'ground') { - SCALE = 0.5 - } else if (specificProps['minecraft:display_context'] === 'thirdperson') { - SCALE = 6 - } - result.mesh.scale.set(SCALE, SCALE, SCALE) - - return { - mesh: result.mesh, - isBlock: false, - modelName: textureUv.modelName, - cleanup: result.cleanup - } - } - } - - setVisible (mesh: THREE.Object3D, visible: boolean) { - //mesh.visible = visible - //TODO: Fix workaround for visibility setting - if (visible) { - mesh.scale.set(1, 1, 1) - } else { - mesh.scale.set(0, 0, 0) - } - } - - update (entity: SceneEntity['originalEntity'], overrides) { - const isPlayerModel = entity.name === 'player' - if (entity.name === 'zombie_villager' || entity.name === 'husk') { - overrides.texture = `textures/1.16.4/entity/${entity.name === 'zombie_villager' ? 'zombie_villager/zombie_villager.png' : `zombie/${entity.name}.png`}` - } - if (entity.name === 'glow_item_frame') { - if (!overrides.textures) overrides.textures = [] - overrides.textures['background'] = 'block:glow_item_frame' - } - // this can be undefined in case where packet entity_destroy was sent twice (so it was already deleted) - let e = this.entities[entity.id] - const justAdded = !e - - if (entity.delete) { - if (!e) return - if (e.additionalCleanup) e.additionalCleanup() - e.traverse(c => { - if (c['additionalCleanup']) c['additionalCleanup']() - }) - this.onRemoveEntity(entity) - this.worldRenderer.scene.remove(e) - disposeObject(e) - // todo dispose textures as well ? - delete this.entities[entity.id] - return - } - - let mesh: THREE.Object3D | undefined - if (e === undefined) { - const group = new THREE.Group() as unknown as SceneEntity - group.originalEntity = entity - if (entity.name === 'item' || entity.name === 'tnt' || entity.name === 'falling_block' || entity.name === 'snowball' - || entity.name === 'egg' || entity.name === 'ender_pearl' || entity.name === 'experience_bottle' - || entity.name === 'splash_potion' || entity.name === 'lingering_potion') { - const item = entity.name === 'tnt' || entity.type === 'projectile' - ? { name: entity.name } - : entity.name === 'falling_block' - ? { blockState: entity['objectData'] } - : entity.metadata?.find((m: any) => typeof m === 'object' && m?.itemCount) - if (item) { - const object = this.getItemMesh(item, { - 'minecraft:display_context': 'ground', - }, entity.type === 'projectile') - if (object) { - mesh = object.mesh - if (entity.name === 'item' || entity.type === 'projectile') { - mesh.scale.set(0.5, 0.5, 0.5) - mesh.position.set(0, entity.name === 'item' ? 0.2 : 0.1, 0) - } else { - mesh.scale.set(2, 2, 2) - mesh.position.set(0, 0.5, 0) - } - // set faces - // mesh.position.set(targetPos.x + 0.5 + 2, targetPos.y + 0.5, targetPos.z + 0.5) - // viewer.scene.add(mesh) - if (entity.name === 'item') { - const clock = new THREE.Clock() - mesh.onBeforeRender = () => { - const delta = clock.getDelta() - mesh!.rotation.y += delta - } - } - - // TNT blinking - // if (entity.name === 'tnt') { - // let lastBlink = 0 - // const blinkInterval = 500 // ms between blinks - // mesh.onBeforeRender = () => { - // const now = Date.now() - // if (now - lastBlink > blinkInterval) { - // lastBlink = now - // mesh.traverse((child) => { - // if (child instanceof THREE.Mesh) { - // const material = child.material as THREE.MeshLambertMaterial - // material.color.set(material.color?.equals(new THREE.Color(0xff_ff_ff)) - // ? new THREE.Color(0xff_00_00) - // : new THREE.Color(0xff_ff_ff)) - // } - // }) - // } - // } - // } - - group.additionalCleanup = () => { - // important: avoid texture memory leak and gpu slowdown - if (object.cleanup) { - object.cleanup() - } - } - } - } - } else if (isPlayerModel) { - const wrapper = new THREE.Group() - const playerObject = this.setupPlayerObject(entity, wrapper, overrides) - group.playerObject = playerObject - mesh = wrapper - - if (entity.username) { - const nametag = addNametag(entity, { fontFamily: 'mojangles' }, wrapper, this.worldRenderer.version) - if (nametag) { - nametag.position.y = playerObject.position.y + playerObject.scale.y * 16 + 3 - nametag.scale.multiplyScalar(12) - } - } - } else { - mesh = getEntityMesh(entity, this.worldRenderer, this.entitiesOptions, { ...overrides, customModel: entity['customModel'] }) - } - if (!mesh) return - mesh.name = 'mesh' - // set initial position so there are no weird jumps update after - const pos = entity.pos ?? entity.position - group.position.set(pos.x, pos.y, pos.z) - - // todo use width and height instead - const boxHelper = new THREE.BoxHelper( - mesh, - entity.type === 'hostile' ? 0xff_00_00 : - entity.type === 'mob' ? 0x00_ff_00 : - entity.type === 'player' ? 0x00_00_ff : - 0xff_a5_00, - ) - boxHelper.name = 'debug' - group.add(mesh) - group.add(boxHelper) - boxHelper.visible = false - this.worldRenderer.scene.add(group) - - e = group - e.name = 'entity' - e['realName'] = entity.name - this.entities[entity.id] = e - - this.onAddEntity(entity) - - if (isPlayerModel) { - void this.updatePlayerSkin(entity.id, entity.username, overrides?.texture ? entity.uuid : undefined, overrides?.texture || stevePngUrl) - } - this.setDebugMode(this.debugMode, group) - this.setRendering(this.currentlyRendering, group) - } else { - mesh = e.children.find(c => c.name === 'mesh') - } - - // Update equipment - this.updateEntityEquipment(e, entity) - - const meta = getGeneralEntitiesMetadata(entity) - - const isInvisible = ((entity.metadata?.[0] ?? 0) as unknown as number) & 0x20 || (this.worldRenderer.playerStateReactive.cameraSpectatingEntity === entity.id && this.worldRenderer.playerStateUtils.isSpectator()) - for (const child of mesh!.children ?? []) { - if (child.name !== 'nametag') { - child.visible = !isInvisible - } - } - // --- - // set baby size - if (meta.baby) { - e.scale.set(0.5, 0.5, 0.5) - } else { - e.scale.set(1, 1, 1) - } - // entity specific meta - const textDisplayMeta = getSpecificEntityMetadata('text_display', entity) - const displayTextRaw = textDisplayMeta?.text || meta.custom_name_visible && meta.custom_name - if (entity.name !== 'player' && displayTextRaw) { - const nameTagFixed = textDisplayMeta && (textDisplayMeta.billboard_render_constraints === 'fixed' || !textDisplayMeta.billboard_render_constraints) - const nameTagBackgroundColor = (textDisplayMeta && (parseInt(textDisplayMeta.style_flags, 10) & 0x04) === 0) ? toRgba(textDisplayMeta.background_color) : undefined - let nameTagTextOpacity: any - if (textDisplayMeta?.text_opacity) { - const rawOpacity = parseInt(textDisplayMeta?.text_opacity, 10) - nameTagTextOpacity = rawOpacity > 0 ? rawOpacity : 256 - rawOpacity - } - addNametag( - { ...entity, username: typeof displayTextRaw === 'string' ? mojangson.simplify(mojangson.parse(displayTextRaw)) : nbt.simplify(displayTextRaw), - nameTagBackgroundColor, nameTagTextOpacity, nameTagFixed, - nameTagScale: textDisplayMeta?.scale, nameTagTranslation: textDisplayMeta && (textDisplayMeta.translation || new THREE.Vector3(0, 0, 0)), - nameTagRotationLeft: toQuaternion(textDisplayMeta?.left_rotation), nameTagRotationRight: toQuaternion(textDisplayMeta?.right_rotation) }, - this.entitiesOptions, - mesh, - this.worldRenderer.version - ) - } - - const armorStandMeta = getSpecificEntityMetadata('armor_stand', entity) - if (armorStandMeta) { - const isSmall = (parseInt(armorStandMeta.client_flags, 10) & 0x01) !== 0 - const hasArms = (parseInt(armorStandMeta.client_flags, 10) & 0x04) !== 0 - const hasBasePlate = (parseInt(armorStandMeta.client_flags, 10) & 0x08) === 0 - const isMarker = (parseInt(armorStandMeta.client_flags, 10) & 0x10) !== 0 - mesh!.castShadow = !isMarker - mesh!.receiveShadow = !isMarker - if (isSmall) { - e.scale.set(0.5, 0.5, 0.5) - } else { - e.scale.set(1, 1, 1) - } - e.traverse(c => { - switch (c.name) { - case 'bone_baseplate': - this.setVisible(c, hasBasePlate) - c.rotation.y = -e.rotation.y - break - case 'bone_head': - if (armorStandMeta.head_pose) { - c.setRotationFromEuler(poseToEuler(armorStandMeta.head_pose)) - } - break - case 'bone_body': - if (armorStandMeta.body_pose) { - c.setRotationFromEuler(poseToEuler(armorStandMeta.body_pose)) - } - break - case 'bone_rightarm': - if (c.parent?.name !== 'bone_armor') { - this.setVisible(c, hasArms) - } - if (armorStandMeta.left_arm_pose) { - c.setRotationFromEuler(poseToEuler(armorStandMeta.left_arm_pose)) - } else { - c.setRotationFromEuler(poseToEuler({ 'yaw': -10, 'pitch': -10, 'roll': 0 })) - } - break - case 'bone_leftarm': - if (c.parent?.name !== 'bone_armor') { - this.setVisible(c, hasArms) - } - if (armorStandMeta.right_arm_pose) { - c.setRotationFromEuler(poseToEuler(armorStandMeta.right_arm_pose)) - } else { - c.setRotationFromEuler(poseToEuler({ 'yaw': 10, 'pitch': -10, 'roll': 0 })) - } - break - case 'bone_rightleg': - if (armorStandMeta.left_leg_pose) { - c.setRotationFromEuler(poseToEuler(armorStandMeta.left_leg_pose)) - } else { - c.setRotationFromEuler(poseToEuler({ 'yaw': -1, 'pitch': -1, 'roll': 0 })) - } - break - case 'bone_leftleg': - if (armorStandMeta.right_leg_pose) { - c.setRotationFromEuler(poseToEuler(armorStandMeta.right_leg_pose)) - } else { - c.setRotationFromEuler(poseToEuler({ 'yaw': 1, 'pitch': 1, 'roll': 0 })) - } - break - } - }) - } - - // todo handle map, map_chunks events - let itemFrameMeta = getSpecificEntityMetadata('item_frame', entity) - if (!itemFrameMeta) { - itemFrameMeta = getSpecificEntityMetadata('glow_item_frame', entity) - } - if (itemFrameMeta) { - // TODO: fix type - // todo! fix errors in mc-data (no entities data prior 1.18.2) - const item = (itemFrameMeta?.item ?? entity.metadata?.[8]) as any as { itemId, blockId, components, nbtData: { value: { map: { value: number } } } } - mesh!.scale.set(1, 1, 1) - mesh!.position.set(0, 0, -0.5) - - e.rotation.x = -entity.pitch - e.children.find(c => { - if (c.name.startsWith('map_')) { - disposeObject(c) - const existingMapNumber = parseInt(c.name.split('_')[1], 10) - this.itemFrameMaps[existingMapNumber] = this.itemFrameMaps[existingMapNumber]?.filter(mesh => mesh !== c) - if (c instanceof THREE.Mesh) { - c.material?.map?.dispose() - } - return true - } else if (c.name === 'item') { - disposeObject(c) - return true - } - return false - })?.removeFromParent() - - if (item && (item.itemId ?? item.blockId ?? 0) !== 0) { - // Get rotation from metadata, default to 0 if not present - // Rotation is stored in 45° increments (0-7) for items, 90° increments (0-3) for maps - const rotation = (itemFrameMeta.rotation as any as number) ?? 0 - const mapNumber = item.nbtData?.value?.map?.value ?? item.components?.find(x => x.type === 'map_id')?.data - if (mapNumber) { - // TODO: Use proper larger item frame model when a map exists - mesh!.scale.set(16 / 12, 16 / 12, 1) - // Handle map rotation (4 possibilities, 90° increments) - this.addMapModel(e, mapNumber, rotation) - } else { - // Handle regular item rotation (8 possibilities, 45° increments) - const itemMesh = this.getItemMesh(item, { - 'minecraft:display_context': 'fixed', - }) - if (itemMesh) { - itemMesh.mesh.position.set(0, 0, -0.05) - // itemMesh.mesh.position.set(0, 0, 0.43) - if (itemMesh.isBlock) { - itemMesh.mesh.scale.set(0.25, 0.25, 0.25) - } else { - itemMesh.mesh.scale.set(0.5, 0.5, 0.5) - } - // Rotate 180° around Y axis first - itemMesh.mesh.rotateY(Math.PI) - // Then apply the 45° increment rotation - itemMesh.mesh.rotateZ(-rotation * Math.PI / 4) - itemMesh.mesh.name = 'item' - e.add(itemMesh.mesh) - } - } - } - } - - if (entity.username !== undefined) { - e.username = entity.username - } - - this.updateNameTagVisibility(e) - - this.updateEntityPosition(entity, justAdded, overrides) - } - - updateEntityPosition (entity: import('prismarine-entity').Entity, justAdded: boolean, overrides: { rotation?: { head?: { y: number, x: number } } }) { - const e = this.entities[entity.id] - if (!e) return - const ANIMATION_DURATION = justAdded ? 0 : TWEEN_DURATION - if (entity.position) { - new TWEEN.Tween(e.position).to({ x: entity.position.x, y: entity.position.y, z: entity.position.z }, ANIMATION_DURATION).start() - } - if (entity.yaw) { - const da = (entity.yaw - e.rotation.y) % (Math.PI * 2) - const dy = 2 * da % (Math.PI * 2) - da - new TWEEN.Tween(e.rotation).to({ y: e.rotation.y + dy }, ANIMATION_DURATION).start() - } - - if (e?.playerObject && overrides?.rotation?.head) { - const { playerObject } = e - const headRotationDiff = overrides.rotation.head.y ? overrides.rotation.head.y - entity.yaw : 0 - playerObject.skin.head.rotation.y = -headRotationDiff - playerObject.skin.head.rotation.x = overrides.rotation.head.x ? - overrides.rotation.head.x : 0 - } - } - - onAddEntity (entity: import('prismarine-entity').Entity) { - } - - loadedSkinEntityIds = new Set() - maybeRenderPlayerSkin (entityId: string) { - let mesh = this.entities[entityId] - if (entityId === 'player_entity') { - mesh = this.playerEntity! - entityId = this.playerEntity?.originalEntity.id as any - } - if (!mesh) return - if (!mesh.playerObject) return - if (!mesh.visible) return - - const MAX_DISTANCE_SKIN_LOAD = 128 - const cameraPos = this.worldRenderer.cameraObject.position - const distance = mesh.position.distanceTo(cameraPos) - if (distance < MAX_DISTANCE_SKIN_LOAD && distance < (this.worldRenderer.viewDistance * 16)) { - if (this.loadedSkinEntityIds.has(String(entityId))) return - void this.updatePlayerSkin(entityId, mesh.playerObject.realUsername, mesh.playerObject.realPlayerUuid, true, true) - } - } - - playerPerAnimation = {} as Record - onRemoveEntity (entity: import('prismarine-entity').Entity) { - this.loadedSkinEntityIds.delete(entity.id.toString()) - } - - updateMap (mapNumber: string | number, data: string) { - this.cachedMapsImages[mapNumber] = data - let itemFrameMeshes = this.itemFrameMaps[mapNumber] - if (!itemFrameMeshes) return - itemFrameMeshes = itemFrameMeshes.filter(mesh => mesh.parent) - this.itemFrameMaps[mapNumber] = itemFrameMeshes - if (itemFrameMeshes) { - for (const mesh of itemFrameMeshes) { - mesh.material.map = this.loadMap(data) - mesh.material.needsUpdate = true - mesh.visible = true - } - } - } - - updateNameTagVisibility (entity: SceneEntity) { - const playerTeam = this.worldRenderer.playerStateReactive.team - const entityTeam = entity.originalEntity.team - const nameTagVisibility = entityTeam?.nameTagVisibility || 'always' - const showNameTag = nameTagVisibility === 'always' || - (nameTagVisibility === 'hideForOwnTeam' && entityTeam?.team !== playerTeam?.team) || - (nameTagVisibility === 'hideForOtherTeams' && (entityTeam?.team === playerTeam?.team || playerTeam === undefined)) - entity.traverse(c => { - if (c.name === 'nametag') { - c.visible = showNameTag - } - }) - } - - addMapModel (entityMesh: THREE.Object3D, mapNumber: number, rotation: number) { - const imageData = this.cachedMapsImages?.[mapNumber] - let texture: THREE.Texture | null = null - if (imageData) { - texture = this.loadMap(imageData) - } - const parameters = { - transparent: true, - alphaTest: 0.1, - } - if (texture) { - parameters['map'] = texture - } - const material = new THREE.MeshLambertMaterial(parameters) - - const mapMesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), material) - - mapMesh.rotation.set(0, Math.PI, 0) - entityMesh.add(mapMesh) - let isInvisible = true - entityMesh.traverseVisible(c => { - if (c.name === 'geometry_frame') { - isInvisible = false - } - }) - if (isInvisible) { - mapMesh.position.set(0, 0, 0.499) - } else { - mapMesh.position.set(0, 0, 0.437) - } - // Apply 90° increment rotation for maps (0-3) - mapMesh.rotateZ(Math.PI * 2 - rotation * Math.PI / 2) - mapMesh.name = `map_${mapNumber}` - - if (!texture) { - mapMesh.visible = false - } - - if (!this.itemFrameMaps[mapNumber]) { - this.itemFrameMaps[mapNumber] = [] - } - this.itemFrameMaps[mapNumber].push(mapMesh) - } - - loadMap (data: any) { - const texture = new THREE.TextureLoader().load(data) - if (texture) { - texture.magFilter = THREE.NearestFilter - texture.minFilter = THREE.NearestFilter - texture.needsUpdate = true - } - return texture - } - - addItemModel (entityMesh: SceneEntity, hand: 'left' | 'right', item: Item, isPlayer = false) { - const bedrockParentName = `bone_${hand}item` - const itemName = `custom_item_${hand}` - - // remove existing item - entityMesh.traverse(c => { - if (c.name === itemName) { - c.removeFromParent() - if (c['additionalCleanup']) c['additionalCleanup']() - } - }) - if (!item) return - - const itemObject = this.getItemMesh(item, { - 'minecraft:display_context': 'thirdperson', - }) - if (itemObject?.mesh) { - entityMesh.traverse(c => { - if (c.name.toLowerCase() === bedrockParentName || c.name === `${hand}Arm`) { - const group = new THREE.Object3D() - group['additionalCleanup'] = () => { - // important: avoid texture memory leak and gpu slowdown - if (itemObject.cleanup) { - itemObject.cleanup() - } - } - const itemMesh = itemObject.mesh - group.rotation.z = -Math.PI / 16 - if (itemObject.isBlock) { - group.rotation.y = Math.PI / 4 - } else { - itemMesh.rotation.z = -Math.PI / 4 - group.rotation.y = Math.PI / 2 - group.scale.multiplyScalar(2) - } - - // if player, move item below and forward a bit - if (isPlayer) { - group.position.y = -8 - group.position.z = 5 - group.position.x = hand === 'left' ? 1 : -1 - group.rotation.x = Math.PI - } - - group.add(itemMesh) - - group.name = itemName - c.add(group) - } - }) - } - } - - handleDamageEvent (entityId, damageAmount) { - const entityMesh = this.entities[entityId]?.children.find(c => c.name === 'mesh') - if (entityMesh) { - entityMesh.traverse((child) => { - if (child instanceof THREE.Mesh && child.material.clone) { - const clonedMaterial = child.material.clone() - clonedMaterial.dispose() - child.material = child.material.clone() - const originalColor = child.material.color.clone() - child.material.color.set(0xff_00_00) - new TWEEN.Tween(child.material.color) - .to(originalColor, 500) - .start() - } - }) - } - } - - raycastSceneDebug () { - // return any object from scene. raycast from camera - const raycaster = new THREE.Raycaster() - raycaster.setFromCamera(new THREE.Vector2(0, 0), this.worldRenderer.camera) - const intersects = raycaster.intersectObjects(this.worldRenderer.scene.children) - return intersects[0]?.object - } - - private setupPlayerObject (entity: SceneEntity['originalEntity'], wrapper: THREE.Group, overrides: { texture?: string }): PlayerObjectType { - const playerObject = new PlayerObject() as PlayerObjectType - playerObject.realPlayerUuid = entity.uuid ?? '' - playerObject.realUsername = entity.username ?? '' - playerObject.position.set(0, 16, 0) - - // fix issues with starfield - playerObject.traverse((obj) => { - if (obj instanceof THREE.Mesh && obj.material instanceof THREE.MeshStandardMaterial) { - obj.material.transparent = true - } - }) - - wrapper.add(playerObject as any) - const scale = 1 / 16 - wrapper.scale.set(scale, scale, scale) - wrapper.rotation.set(0, Math.PI, 0) - - // Set up animation - playerObject.animation = new WalkingGeneralSwing() - //@ts-expect-error - playerObject.animation.isMoving = false - - return playerObject - } - - private updateEntityEquipment (entityMesh: SceneEntity, entity: SceneEntity['originalEntity']) { - if (!entityMesh || !entity.equipment) return - - const isPlayer = entity.type === 'player' - this.addItemModel(entityMesh, isPlayer ? 'right' : 'left', entity.equipment[0], isPlayer) - this.addItemModel(entityMesh, isPlayer ? 'left' : 'right', entity.equipment[1], isPlayer) - addArmorModel(this.worldRenderer, entityMesh, 'feet', entity.equipment[2]) - addArmorModel(this.worldRenderer, entityMesh, 'legs', entity.equipment[3], 2) - addArmorModel(this.worldRenderer, entityMesh, 'chest', entity.equipment[4]) - addArmorModel(this.worldRenderer, entityMesh, 'head', entity.equipment[5]) - - // Update player-specific equipment - if (isPlayer && entityMesh.playerObject) { - const { playerObject } = entityMesh - playerObject.backEquipment = entity.equipment.some((item) => item?.name === 'elytra') ? 'elytra' : 'cape' - if (playerObject.backEquipment === 'elytra') { - void this.loadAndApplyCape(entity.id, elytraTexture) - } - if (playerObject.cape.map === null) { - playerObject.cape.visible = false - } - } - } -} - -function getGeneralEntitiesMetadata (entity: { name; metadata }): Partial> { - const entityData = loadedData.entitiesByName[entity.name] - return new Proxy({}, { - get (target, p, receiver) { - if (typeof p !== 'string' || !entityData) return - const index = entityData.metadataKeys?.indexOf(p) - return entity.metadata?.[index ?? -1] - }, - }) -} - -function getSpecificEntityMetadata (name: T, entity): EntityMetadataVersions[T] | undefined { - if (entity.name !== name) return - return getGeneralEntitiesMetadata(entity) as any -} - -function addArmorModel (worldRenderer: WorldRendererThree, entityMesh: THREE.Object3D, slotType: string, item: Item, layer = 1, overlay = false) { - if (!item) { - removeArmorModel(entityMesh, slotType) - return - } - const itemParts = item.name.split('_') - let texturePath - const isPlayerHead = slotType === 'head' && item.name === 'player_head' - if (isPlayerHead) { - removeArmorModel(entityMesh, slotType) - if (item.nbt) { - const itemNbt = nbt.simplify(item.nbt) - try { - let textureData - if (itemNbt.SkullOwner) { - textureData = itemNbt.SkullOwner.Properties.textures[0]?.Value - } else { - textureData = itemNbt['minecraft:profile']?.Properties?.find(p => p.name === 'textures')?.value - } - if (textureData) { - const decodedData = JSON.parse(Buffer.from(textureData, 'base64').toString()) - texturePath = decodedData.textures?.SKIN?.url - const { skinTexturesProxy } = this.worldRenderer.worldRendererConfig - if (skinTexturesProxy) { - texturePath = texturePath?.replace('http://textures.minecraft.net/', skinTexturesProxy) - .replace('https://textures.minecraft.net/', skinTexturesProxy) - } - } - } catch (err) { - console.error('Error decoding player head texture:', err) - } - } else { - texturePath = stevePngUrl - } - } - const armorMaterial = itemParts[0] - if (!texturePath) { - // TODO: Support mirroring on certain parts of the model - const armorTextureName = `${armorMaterial}_layer_${layer}${overlay ? '_overlay' : ''}` - texturePath = worldRenderer.resourcesManager.currentResources.customTextures.armor?.textures[armorTextureName]?.src ?? armorTextures[armorTextureName] - } - if (!texturePath || !armorModel[slotType]) { - removeArmorModel(entityMesh, slotType) - return - } - - const meshName = `geometry_armor_${slotType}${overlay ? '_overlay' : ''}` - let mesh = entityMesh.children.findLast(c => c.name === meshName) as THREE.Mesh - let material - if (mesh) { - material = mesh.material - void loadTexture(texturePath, texture => { - texture.magFilter = THREE.NearestFilter - texture.minFilter = THREE.NearestFilter - texture.flipY = false - texture.wrapS = THREE.MirroredRepeatWrapping - texture.wrapT = THREE.MirroredRepeatWrapping - material.map = texture - }) - } else { - mesh = getMesh(worldRenderer, texturePath, armorModel[slotType]) - // // enable debug mode to see the mesh - // mesh.traverse(c => { - // if (c instanceof THREE.Mesh) { - // c.material.wireframe = true - // } - // }) - if (slotType === 'head') { - // avoid z-fighting with the head - mesh.children[0].position.y += 0.01 - } - mesh.name = meshName - material = mesh.material - if (!isPlayerHead) { - material.side = THREE.DoubleSide - } - } - if (armorMaterial === 'leather' && !overlay) { - const color = (item.nbt?.value as any)?.display?.value?.color?.value - if (color) { - const r = color >> 16 & 0xff - const g = color >> 8 & 0xff - const b = color & 0xff - material.color.setRGB(r / 255, g / 255, b / 255) - } else { - material.color.setHex(0xB5_6D_51) // default brown color - } - addArmorModel(worldRenderer, entityMesh, slotType, item, layer, true) - } else { - material.color.setHex(0xFF_FF_FF) - } - const group = new THREE.Object3D() - group.name = `armor_${slotType}${overlay ? '_overlay' : ''}` - group.add(mesh) - - entityMesh.add(mesh) -} - -function removeArmorModel (entityMesh: THREE.Object3D, slotType: string) { - for (const c of entityMesh.children) { - if (c.name === `geometry_armor_${slotType}` || c.name === `geometry_armor_${slotType}_overlay`) { - c.removeFromParent() - } - } -} diff --git a/renderer/viewer/three/entity/EntityMesh.ts b/renderer/viewer/three/entity/EntityMesh.ts deleted file mode 100644 index 229da6d5..00000000 --- a/renderer/viewer/three/entity/EntityMesh.ts +++ /dev/null @@ -1,550 +0,0 @@ -import * as THREE from 'three' -import { OBJLoader } from 'three-stdlib' -import huskPng from 'mc-assets/dist/other-textures/latest/entity/zombie/husk.png' -import { Vec3 } from 'vec3' -import ocelotPng from '../../../../node_modules/mc-assets/dist/other-textures/latest/entity/cat/ocelot.png' -import arrowTexture from '../../../../node_modules/mc-assets/dist/other-textures/1.21.2/entity/projectiles/arrow.png' -import spectralArrowTexture from '../../../../node_modules/mc-assets/dist/other-textures/1.21.2/entity/projectiles/spectral_arrow.png' -import tippedArrowTexture from '../../../../node_modules/mc-assets/dist/other-textures/1.21.2/entity/projectiles/tipped_arrow.png' -import { loadTexture } from '../threeJsUtils' -import { WorldRendererThree } from '../worldrendererThree' -import entities from './entities.json' -import { externalModels } from './objModels' -import externalTexturesJson from './externalTextures.json' - -interface ElemFace { - dir: [number, number, number] - u0: [number, number, number] - v0: [number, number, number] - u1: [number, number, number] - v1: [number, number, number] - corners: Array<[number, number, number, number, number]> -} - -interface GeoData { - positions: number[] - normals: number[] - uvs: number[] - indices: number[] - skinIndices: number[] - skinWeights: number[] -} - -interface JsonBone { - name: string - pivot?: [number, number, number] - bind_pose_rotation?: [number, number, number] - rotation?: [number, number, number] - parent?: string - cubes?: JsonCube[] - mirror?: boolean -} - -interface JsonCube { - origin: [number, number, number] - size: [number, number, number] - uv: [number, number] - inflate?: number - rotation?: [number, number, number] -} - -interface JsonModel { - texturewidth?: number - textureheight?: number - bones: JsonBone[] -} - -interface EntityOverrides { - textures?: Record - rotation?: Record -} - -const elemFaces: Record = { - up: { - dir: [0, 1, 0], - u0: [0, 0, 1], - v0: [0, 0, 0], - u1: [1, 0, 1], - v1: [0, 0, 1], - corners: [ - [0, 1, 1, 0, 0], - [1, 1, 1, 1, 0], - [0, 1, 0, 0, 1], - [1, 1, 0, 1, 1] - ] - }, - down: { - dir: [0, -1, 0], - u0: [1, 0, 1], - v0: [0, 0, 0], - u1: [2, 0, 1], - v1: [0, 0, 1], - corners: [ - [1, 0, 1, 0, 0], - [0, 0, 1, 1, 0], - [1, 0, 0, 0, 1], - [0, 0, 0, 1, 1] - ] - }, - east: { - dir: [1, 0, 0], - u0: [0, 0, 0], - v0: [0, 0, 1], - u1: [0, 0, 1], - v1: [0, 1, 1], - corners: [ - [1, 1, 1, 0, 0], - [1, 0, 1, 0, 1], - [1, 1, 0, 1, 0], - [1, 0, 0, 1, 1] - ] - }, - west: { - dir: [-1, 0, 0], - u0: [1, 0, 1], - v0: [0, 0, 1], - u1: [1, 0, 2], - v1: [0, 1, 1], - corners: [ - [0, 1, 0, 0, 0], - [0, 0, 0, 0, 1], - [0, 1, 1, 1, 0], - [0, 0, 1, 1, 1] - ] - }, - north: { - dir: [0, 0, -1], - u0: [0, 0, 1], - v0: [0, 0, 1], - u1: [1, 0, 1], - v1: [0, 1, 1], - corners: [ - [1, 0, 0, 0, 1], - [0, 0, 0, 1, 1], - [1, 1, 0, 0, 0], - [0, 1, 0, 1, 0] - ] - }, - south: { - dir: [0, 0, 1], - u0: [1, 0, 2], - v0: [0, 0, 1], - u1: [2, 0, 2], - v1: [0, 1, 1], - corners: [ - [0, 0, 1, 0, 1], - [1, 0, 1, 1, 1], - [0, 1, 1, 0, 0], - [1, 1, 1, 1, 0] - ] - } -} - -function dot (a: number[], b: number[]): number { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] -} - -function addCube ( - attr: GeoData, - boneId: number, - bone: THREE.Bone, - cube: JsonCube, - sameTextureForAllFaces = false, - texWidth = 64, - texHeight = 64, - mirror = false, - errors: string[] = [] -): void { - const cubeRotation = new THREE.Euler(0, 0, 0) - if (cube.rotation) { - cubeRotation.x = -cube.rotation[0] * Math.PI / 180 - cubeRotation.y = -cube.rotation[1] * Math.PI / 180 - cubeRotation.z = -cube.rotation[2] * Math.PI / 180 - } - for (const { dir, corners, u0, v0, u1, v1 } of Object.values(elemFaces)) { - const ndx = Math.floor(attr.positions.length / 3) - - const eastOrWest = dir[0] !== 0 - const faceUvs: number[] = [] - for (const pos of corners) { - let u: number - let v: number - if (sameTextureForAllFaces) { - u = (cube.uv[0] + pos[3] * cube.size[0]) / texWidth - v = (cube.uv[1] + pos[4] * cube.size[1]) / texHeight - } else { - u = (cube.uv[0] + dot(pos[3] ? u1 : u0, cube.size)) / texWidth - v = (cube.uv[1] + dot(pos[4] ? v1 : v0, cube.size)) / texHeight - } - // if (isNaN(u) || isNaN(v)) { - // errors.push(`NaN u: ${u}, v: ${v}`) - // continue - // } - // if (u < 0 || u > 1 || v < 0 || v > 1) { - // errors.push(`u: ${u}, v: ${v} out of range`) - // continue - // } - - const posX = eastOrWest && mirror ? pos[0] ^ 1 : pos[0] - const posY = pos[1] - const posZ = eastOrWest && mirror ? pos[2] ^ 1 : pos[2] - const inflate = cube.inflate ?? 0 - let vecPos = new THREE.Vector3( - cube.origin[0] + posX * cube.size[0] + (posX ? inflate : -inflate), - cube.origin[1] + posY * cube.size[1] + (posY ? inflate : -inflate), - cube.origin[2] + posZ * cube.size[2] + (posZ ? inflate : -inflate) - ) - - vecPos = vecPos.applyEuler(cubeRotation) - vecPos = vecPos.sub(bone.position) - vecPos = vecPos.applyEuler(bone.rotation) - vecPos = vecPos.add(bone.position) - - attr.positions.push(vecPos.x, vecPos.y, vecPos.z) - attr.normals.push(dir[0], dir[1], dir[2]) - faceUvs.push(u, v) - attr.skinIndices.push(boneId, 0, 0, 0) - attr.skinWeights.push(1, 0, 0, 0) - } - - if (mirror) { - for (let i = 0; i + 1 < corners.length; i += 2) { - const faceIndex = i * 2 - const tempFaceUvs = faceUvs.slice(faceIndex, faceIndex + 4) - faceUvs[faceIndex] = tempFaceUvs[2] - faceUvs[faceIndex + 1] = tempFaceUvs[eastOrWest ? 1 : 3] - faceUvs[faceIndex + 2] = tempFaceUvs[0] - faceUvs[faceIndex + 3] = tempFaceUvs[eastOrWest ? 3 : 1] - } - } - attr.uvs.push(...faceUvs) - - attr.indices.push(ndx, ndx + 1, ndx + 2, ndx + 2, ndx + 1, ndx + 3) - } -} - -export function getMesh ( - worldRenderer: WorldRendererThree | undefined, - texture: string, - jsonModel: JsonModel, - overrides: EntityOverrides = {}, - debugFlags: EntityDebugFlags = {} -): THREE.SkinnedMesh { - let textureWidth = jsonModel.texturewidth ?? 64 - let textureHeight = jsonModel.textureheight ?? 64 - let textureOffset: number[] | undefined - const useBlockTexture = texture.startsWith('block:') - const blocksTexture = worldRenderer?.material.map - if (useBlockTexture) { - if (!worldRenderer) throw new Error('worldRenderer is required for block textures') - const blockName = texture.slice(6) - const textureInfo = worldRenderer.resourcesManager.currentResources.blocksAtlasJson.textures[blockName] - if (textureInfo) { - textureWidth = blocksTexture?.image.width ?? textureWidth - textureHeight = blocksTexture?.image.height ?? textureHeight - // todo support su/sv - textureOffset = [textureInfo.u, textureInfo.v] - } else { - console.error(`Unknown block ${blockName}`) - } - } - - const bones: Record = {} - - const geoData: GeoData = { - positions: [], - normals: [], - uvs: [], - indices: [], - skinIndices: [], - skinWeights: [] - } - let i = 0 - for (const jsonBone of jsonModel.bones) { - const bone = new THREE.Bone() - if (jsonBone.pivot) { - bone.position.x = jsonBone.pivot[0] - bone.position.y = jsonBone.pivot[1] - bone.position.z = jsonBone.pivot[2] - } - if (jsonBone.bind_pose_rotation) { - bone.rotation.x = -jsonBone.bind_pose_rotation[0] * Math.PI / 180 - bone.rotation.y = -jsonBone.bind_pose_rotation[1] * Math.PI / 180 - bone.rotation.z = -jsonBone.bind_pose_rotation[2] * Math.PI / 180 - } else if (jsonBone.rotation) { - bone.rotation.x = -jsonBone.rotation[0] * Math.PI / 180 - bone.rotation.y = -jsonBone.rotation[1] * Math.PI / 180 - bone.rotation.z = -jsonBone.rotation[2] * Math.PI / 180 - } - if (overrides.rotation?.[jsonBone.name]) { - bone.rotation.x -= (overrides.rotation[jsonBone.name].x ?? 0) * Math.PI / 180 - bone.rotation.y -= (overrides.rotation[jsonBone.name].y ?? 0) * Math.PI / 180 - bone.rotation.z -= (overrides.rotation[jsonBone.name].z ?? 0) * Math.PI / 180 - } - bone.name = `bone_${jsonBone.name}` - bones[jsonBone.name] = bone - - if (jsonBone.cubes) { - for (const cube of jsonBone.cubes) { - const errors: string[] = [] - addCube(geoData, i, bone, cube, useBlockTexture, textureWidth, textureHeight, jsonBone.mirror, errors) - if (errors.length) { - debugFlags.errors ??= [] - debugFlags.errors.push(...errors.map(error => `Bone ${jsonBone.name}: ${error}`)) - } - } - } - i++ - } - - const rootBones: THREE.Object3D[] = [] - for (const jsonBone of jsonModel.bones) { - if (jsonBone.parent && bones[jsonBone.parent]) { - bones[jsonBone.parent].add(bones[jsonBone.name]) - } else { - rootBones.push(bones[jsonBone.name]) - } - } - - const skeleton = new THREE.Skeleton(Object.values(bones)) - - const geometry = new THREE.BufferGeometry() - geometry.setAttribute('position', new THREE.Float32BufferAttribute(geoData.positions, 3)) - geometry.setAttribute('normal', new THREE.Float32BufferAttribute(geoData.normals, 3)) - geometry.setAttribute('uv', new THREE.Float32BufferAttribute(geoData.uvs, 2)) - geometry.setAttribute('skinIndex', new THREE.Uint16BufferAttribute(geoData.skinIndices, 4)) - geometry.setAttribute('skinWeight', new THREE.Float32BufferAttribute(geoData.skinWeights, 4)) - geometry.setIndex(geoData.indices) - - const material = new THREE.MeshLambertMaterial({ transparent: true, alphaTest: 0.1 }) - const mesh = new THREE.SkinnedMesh(geometry, material) - mesh.add(...rootBones) - mesh.bind(skeleton) - mesh.scale.set(1 / 16, 1 / 16, 1 / 16) - - if (textureOffset) { - // todo(memory) dont clone - const loadedTexture = blocksTexture!.clone() - loadedTexture.offset.set(textureOffset[0], textureOffset[1]) - loadedTexture.needsUpdate = true - material.map = loadedTexture - } else { - void loadTexture(texture, loadedTexture => { - if (material.map) { - // texture is already loaded - return - } - loadedTexture.magFilter = THREE.NearestFilter - loadedTexture.minFilter = THREE.NearestFilter - loadedTexture.flipY = false - loadedTexture.wrapS = THREE.RepeatWrapping - loadedTexture.wrapT = THREE.RepeatWrapping - material.map = loadedTexture - }, () => { - // This callback runs after the texture is fully loaded - const actualWidth = material.map!.image.width - if (actualWidth && textureWidth !== actualWidth) { - material.map!.repeat.x = textureWidth / actualWidth - } - const actualHeight = material.map!.image.height - if (actualHeight && textureHeight !== actualHeight) { - material.map!.repeat.y = textureHeight / actualHeight - } - material.needsUpdate = true - }) - } - - return mesh -} - -export const rendererSpecialHandled = ['item_frame', 'item', 'player'] - -type EntityMapping = { - pattern: string | RegExp - target: string -} - -const temporaryMappings: EntityMapping[] = [ - // Exact matches - { pattern: 'furnace_minecart', target: 'minecart' }, - { pattern: 'spawner_minecart', target: 'minecart' }, - { pattern: 'chest_minecart', target: 'minecart' }, - { pattern: 'hopper_minecart', target: 'minecart' }, - { pattern: 'command_block_minecart', target: 'minecart' }, - { pattern: 'tnt_minecart', target: 'minecart' }, - { pattern: 'glow_item_frame', target: 'item_frame' }, - { pattern: 'glow_squid', target: 'squid' }, - { pattern: 'trader_llama', target: 'llama' }, - { pattern: 'chest_boat', target: 'boat' }, - { pattern: 'spectral_arrow', target: 'arrow' }, - { pattern: 'husk', target: 'zombie' }, - { pattern: 'zombie_horse', target: 'horse' }, - { pattern: 'donkey', target: 'horse' }, - { pattern: 'skeleton_horse', target: 'horse' }, - { pattern: 'mule', target: 'horse' }, - { pattern: 'ocelot', target: 'cat' }, - // Regex patterns - { pattern: /_minecraft$/, target: 'minecraft' }, - { pattern: /_boat$/, target: 'boat' }, - { pattern: /_raft$/, target: 'boat' }, - { pattern: /_horse$/, target: 'horse' }, - { pattern: /_zombie$/, target: 'zombie' }, - { pattern: /_arrow$/, target: 'zombie' }, -] - -function getEntityMapping (type: string): string | undefined { - for (const mapping of temporaryMappings) { - if (typeof mapping.pattern === 'string') { - if (mapping.pattern === type) return mapping.target - } else if (mapping.pattern.test(type)) { return mapping.target } - } - return undefined -} - -const getEntity = (name: string) => { - return entities[name] -} - -const scaleEntity: Record = { - zombie: 1.85, - husk: 1.85, - arrow: 0.0025 -} - -const offsetEntity: Record = { - zombie: new Vec3(0, 1, 0), - husk: new Vec3(0, 1, 0), - boat: new Vec3(0, -1, 0), - arrow: new Vec3(0, -0.9, 0) -} - -interface EntityGeometry { - geometry: Array<{ - name: string; - [key: string]: any; - }>; -} - -export type EntityDebugFlags = { - type?: 'obj' | 'bedrock' - tempMap?: string - textureMap?: boolean - errors?: string[] - isHardcodedTexture?: boolean -} - -export class EntityMesh { - mesh: THREE.Object3D - - constructor ( - version: string, - type: string, - worldRenderer?: WorldRendererThree, - overrides: EntityOverrides = {}, - debugFlags: EntityDebugFlags = {} - ) { - const originalType = type - const mappedValue = getEntityMapping(type) - if (mappedValue) { - type = mappedValue - debugFlags.tempMap = mappedValue - } - - if (externalModels[type]) { - const objLoader = new OBJLoader() - const texturePathMap = { - 'zombie_horse': `textures/${version}/entity/horse/horse_zombie.png`, - 'husk': huskPng, - 'skeleton_horse': `textures/${version}/entity/horse/horse_skeleton.png`, - 'donkey': `textures/${version}/entity/horse/donkey.png`, - 'mule': `textures/${version}/entity/horse/mule.png`, - 'ocelot': ocelotPng, - 'arrow': arrowTexture, - 'spectral_arrow': spectralArrowTexture, - 'tipped_arrow': tippedArrowTexture - } - const tempTextureMap = texturePathMap[originalType] || texturePathMap[type] - if (tempTextureMap) { - debugFlags.textureMap = true - } - const texturePath = tempTextureMap || externalTexturesJson[type] - if (externalTexturesJson[type]) { - debugFlags.isHardcodedTexture = true - } - if (!texturePath) throw new Error(`No texture for ${type}`) - const texture = new THREE.TextureLoader().load(texturePath) - texture.minFilter = THREE.NearestFilter - texture.magFilter = THREE.NearestFilter - const material = new THREE.MeshBasicMaterial({ - map: texture, - transparent: true, - alphaTest: 0.1 - }) - const obj = objLoader.parse(externalModels[type]) - const scale = scaleEntity[originalType] || scaleEntity[type] - if (scale) obj.scale.set(scale, scale, scale) - const offset = offsetEntity[originalType] - if (offset) obj.position.set(offset.x, offset.y, offset.z) - obj.traverse((child) => { - if (child instanceof THREE.Mesh) { - child.material = material - // todo - if (child.name === 'Head layer') child.visible = false - if (child.name === 'Head' && overrides.rotation?.head) { // todo - child.rotation.x -= (overrides.rotation.head.x ?? 0) * Math.PI / 180 - child.rotation.y -= (overrides.rotation.head.y ?? 0) * Math.PI / 180 - child.rotation.z -= (overrides.rotation.head.z ?? 0) * Math.PI / 180 - } - } - }) - this.mesh = obj - debugFlags.type = 'obj' - return - } - - if (originalType === 'arrow') { - // overrides.textures = { - // 'default': testArrow, - // ...overrides.textures, - // } - } - - const e = getEntity(type) - if (!e) { - // if (knownNotHandled.includes(type)) return - // throw new Error(`Unknown entity ${type}`) - return - } - - this.mesh = new THREE.Object3D() - for (const [name, jsonModel] of Object.entries(e.geometry)) { - const texture = overrides.textures?.[name] ?? e.textures[name] - if (!texture) continue - // console.log(JSON.stringify(jsonModel, null, 2)) - const mesh = getMesh(worldRenderer, - texture.endsWith('.png') || texture.startsWith('data:image/') || texture.startsWith('block:') - ? texture : texture + '.png', - jsonModel, - overrides, - debugFlags) - mesh.name = `geometry_${name}` - this.mesh.add(mesh) - } - debugFlags.type = 'bedrock' - } - - static getStaticData (name: string): { boneNames: string[] } { - name = getEntityMapping(name) || name - if (externalModels[name]) { - return { - boneNames: [] // todo - } - } - const e = getEntity(name) as EntityGeometry - if (!e) throw new Error(`Unknown entity ${name}`) - return { - boneNames: Object.values(e.geometry).flatMap(x => x.name) - } - } -} -globalThis.EntityMesh = EntityMesh diff --git a/renderer/viewer/three/entity/animations.js b/renderer/viewer/three/entity/animations.js deleted file mode 100644 index 3295556f..00000000 --- a/renderer/viewer/three/entity/animations.js +++ /dev/null @@ -1,171 +0,0 @@ -//@ts-check -import { PlayerAnimation } from 'skinview3d' - -export class WalkingGeneralSwing extends PlayerAnimation { - - switchAnimationCallback - - isRunning = false - isMoving = true - isCrouched = false - - _startArmSwing - - swingArm() { - this._startArmSwing = this.progress - } - - animate(player) { - // Multiply by animation's natural speed - let t = 0 - const updateT = () => { - if (!this.isMoving) { - t = 0 - return - } - if (this.isRunning) { - t = this.progress * 10 + Math.PI * 0.5 - } else { - t = this.progress * 8 - } - } - updateT() - let reset = false - - croughAnimation(player, this.isCrouched) - - if ((this.isRunning ? Math.cos(t) : Math.sin(t)) < 0.01) { - if (this.switchAnimationCallback) { - reset = true - this.progress = 0 - updateT() - } - } - - if (this.isRunning) { - // Leg swing with larger amplitude - player.skin.leftLeg.rotation.x = Math.cos(t + Math.PI) * 1.3 - player.skin.rightLeg.rotation.x = Math.cos(t) * 1.3 - } else { - // Leg swing - player.skin.leftLeg.rotation.x = Math.sin(t) * 0.5 - player.skin.rightLeg.rotation.x = Math.sin(t + Math.PI) * 0.5 - } - - if (this._startArmSwing) { - const tHand = (this.progress - this._startArmSwing) * 18 + Math.PI * 0.5 - // player.skin.rightArm.rotation.x = Math.cos(tHand) * 1.5 - // const basicArmRotationZ = Math.PI * 0.1 - // player.skin.rightArm.rotation.z = Math.cos(t + Math.PI) * 0.3 - basicArmRotationZ - HitAnimation.animate((this.progress - this._startArmSwing), player, this.isMoving) - - if (tHand > Math.PI + Math.PI) { - this._startArmSwing = null - player.skin.rightArm.rotation.z = 0 - } - } - - if (this.isRunning) { - player.skin.leftArm.rotation.x = Math.cos(t) * 1.5 - if (!this._startArmSwing) { - player.skin.rightArm.rotation.x = Math.cos(t + Math.PI) * 1.5 - } - const basicArmRotationZ = Math.PI * 0.1 - player.skin.leftArm.rotation.z = Math.cos(t) * 0.1 + basicArmRotationZ - if (!this._startArmSwing) { - player.skin.rightArm.rotation.z = Math.cos(t + Math.PI) * 0.1 - basicArmRotationZ - } - } else { - // Arm swing - player.skin.leftArm.rotation.x = Math.sin(t + Math.PI) * 0.5 - if (!this._startArmSwing) { - player.skin.rightArm.rotation.x = Math.sin(t) * 0.5 - } - const basicArmRotationZ = Math.PI * 0.02 - player.skin.leftArm.rotation.z = Math.cos(t) * 0.03 + basicArmRotationZ - if (!this._startArmSwing) { - player.skin.rightArm.rotation.z = Math.cos(t + Math.PI) * 0.03 - basicArmRotationZ - } - } - - if (this.isRunning) { - player.rotation.z = Math.cos(t + Math.PI) * 0.01 - } - if (this.isRunning) { - const basicCapeRotationX = Math.PI * 0.3 - player.cape.rotation.x = Math.sin(t * 2) * 0.1 + basicCapeRotationX - } else { - // Always add an angle for cape around the x axis - const basicCapeRotationX = Math.PI * 0.06 - player.cape.rotation.x = Math.sin(t / 1.5) * 0.06 + basicCapeRotationX - } - - if (reset) { - this.switchAnimationCallback() - this.switchAnimationCallback = null - } - } -} - -const HitAnimation = { - animate(progress, player, isMovingOrRunning) { - const t = progress * 18 - player.skin.rightArm.rotation.x = -0.453_786_055_2 * 2 + 2 * Math.sin(t + Math.PI) * 0.3 - - if (!isMovingOrRunning) { - const basicArmRotationZ = 0.01 * Math.PI + 0.06 - player.skin.rightArm.rotation.z = -Math.cos(t) * 0.403 + basicArmRotationZ - player.skin.body.rotation.y = -Math.cos(t) * 0.06 - player.skin.leftArm.rotation.x = Math.sin(t + Math.PI) * 0.077 - player.skin.leftArm.rotation.z = -Math.cos(t) * 0.015 + 0.13 - 0.05 - player.skin.leftArm.position.z = Math.cos(t) * 0.3 - player.skin.leftArm.position.x = 5 - Math.cos(t) * 0.05 - } - }, -} - -const croughAnimation = (player, isCrouched) => { - const erp = 0 - - // let pr = this.progress * 8; - let pr = isCrouched ? 1 : 0 - const showProgress = false - if (showProgress) { - pr = Math.floor(pr) - } - player.skin.body.rotation.x = 0.453_786_055_2 * Math.abs(Math.sin((pr * Math.PI) / 2)) - player.skin.body.position.z = - 1.325_618_1 * Math.abs(Math.sin((pr * Math.PI) / 2)) - 3.450_031_037_7 * Math.abs(Math.sin((pr * Math.PI) / 2)) - player.skin.body.position.y = -6 - 2.103_677_462 * Math.abs(Math.sin((pr * Math.PI) / 2)) - player.cape.position.y = 8 - 1.851_236_166_577_372 * Math.abs(Math.sin((pr * Math.PI) / 2)) - player.cape.rotation.x = (10.8 * Math.PI) / 180 + 0.294_220_265_771 * Math.abs(Math.sin((pr * Math.PI) / 2)) - player.cape.position.z = - -2 + 3.786_619_432 * Math.abs(Math.sin((pr * Math.PI) / 2)) - 3.450_031_037_7 * Math.abs(Math.sin((pr * Math.PI) / 2)) - player.elytra.position.x = player.cape.position.x - player.elytra.position.y = player.cape.position.y - player.elytra.position.z = player.cape.position.z - player.elytra.rotation.x = player.cape.rotation.x - (10.8 * Math.PI) / 180 - // const pr1 = this.progress / this.speed; - const pr1 = 1 - if (Math.abs(Math.sin((pr * Math.PI) / 2)) === 1) { - player.elytra.leftWing.rotation.z = - 0.261_799_44 + 0.458_200_6 * Math.abs(Math.sin((Math.min(pr1 - erp, 1) * Math.PI) / 2)) - player.elytra.updateRightWing() - } else if (isCrouched !== undefined) { - player.elytra.leftWing.rotation.z = - 0.72 - 0.458_200_6 * Math.abs(Math.sin((Math.min(pr1 - erp, 1) * Math.PI) / 2)) - player.elytra.updateRightWing() - } - player.skin.head.position.y = -3.618_325_234_674 * Math.abs(Math.sin((pr * Math.PI) / 2)) - player.skin.leftArm.position.z = - 3.618_325_234_674 * Math.abs(Math.sin((pr * Math.PI) / 2)) - 3.450_031_037_7 * Math.abs(Math.sin((pr * Math.PI) / 2)) - player.skin.rightArm.position.z = player.skin.leftArm.position.z - player.skin.leftArm.rotation.x = 0.410_367_746_202 * Math.abs(Math.sin((pr * Math.PI) / 2)) - player.skin.rightArm.rotation.x = player.skin.leftArm.rotation.x - player.skin.leftArm.rotation.z = 0.1 - player.skin.rightArm.rotation.z = -player.skin.leftArm.rotation.z - player.skin.leftArm.position.y = -2 - 2.539_433_18 * Math.abs(Math.sin((pr * Math.PI) / 2)) - player.skin.rightArm.position.y = player.skin.leftArm.position.y - player.skin.rightLeg.position.z = -3.450_031_037_7 * Math.abs(Math.sin((pr * Math.PI) / 2)) - player.skin.leftLeg.position.z = player.skin.rightLeg.position.z -} diff --git a/renderer/viewer/three/entity/armorModels.json b/renderer/viewer/three/entity/armorModels.json deleted file mode 100644 index d7a77d4c..00000000 --- a/renderer/viewer/three/entity/armorModels.json +++ /dev/null @@ -1,204 +0,0 @@ -{ - "skull": { - "bones": [ - { - "name": "head", - "pivot": [0, 12, 0], - "cubes": [ - { - "origin": [-4, 0, -4], - "size": [8, 8, 8], - "uv": [0, 0], - "inflate": 1 - } - ] - }, - { - "name": "overlay", - "parent": "head", - "pivot": [0, 12, 0], - "cubes": [ - { - "origin": [-4, 0, -4], - "size": [8, 8, 8], - "uv": [32, 0], - "inflate": 1.2 - } - ] - } - ], - "visible_bounds_width": 1.5, - "visible_bounds_offset": [0, 0.5, 0], - "texturewidth": 64, - "textureheight": 32 - }, - "head": { - "bones": [ - {"name": "armor", "pivot": [0, 12, 0]}, - { - "name": "head", - "parent": "armor", - "pivot": [0, 12, 0], - "cubes": [ - { - "origin": [-4, 23, -4], - "size": [8, 8, 8], - "uv": [0, 0], - "inflate": 1 - } - ] - }, - { - "name": "overlay", - "parent": "head", - "pivot": [0, 12, 0], - "cubes": [ - { - "origin": [-4, 23, -4], - "size": [8, 8, 8], - "uv": [32, 0], - "inflate": 1.2 - } - ] - } - ], - "visible_bounds_width": 1.5, - "visible_bounds_offset": [0, 0.5, 0], - "texturewidth": 64, - "textureheight": 32 - }, - "chest": { - "bones": [ - {"name": "armor", "pivot": [0, 12, 0]}, - { - "name": "body", - "parent": "armor", - "pivot": [0, 13, 0], - "cubes": [ - { - "origin": [-4, 12, -2], - "size": [8, 12, 4], - "uv": [16, 16], - "inflate": 1 - } - ] - }, - { - "name": "leftarm", - "parent": "armor", - "pivot": [5, 10, 0], - "cubes": [ - { - "origin": [4, 12, -2], - "size": [4, 12, 4], - "uv": [40, 16], - "inflate": 0.85 - } - ] - }, - { - "name": "rightarm", - "parent": "armor", - "pivot": [-5, 10, 0], - "cubes": [ - { - "origin": [-8, 12, -2], - "size": [4, 12, 4], - "uv": [40, 16], - "inflate": 0.85 - } - ], - "mirror": true - } - ], - "visible_bounds_width": 1.5, - "visible_bounds_offset": [0, 0.5, 0], - "texturewidth": 64, - "textureheight": 32 - }, - "legs": { - "bones": [ - {"name": "armor", "pivot": [0, 12, 0]}, - { - "name": "body", - "parent": "armor", - "pivot": [0, 13, 0], - "cubes": [ - { - "origin": [-4, 12, -2], - "size": [8, 12, 4], - "uv": [16, 16], - "inflate": 0.5 - } - ] - }, - { - "name": "leftleg", - "parent": "armor", - "pivot": [1.9, 1, 0], - "cubes": [ - { - "origin": [-0.1, 0, -2], - "size": [4, 12, 4], - "uv": [0, 16], - "inflate": 0.5 - } - ] - }, - { - "name": "rightleg", - "parent": "armor", - "pivot": [-1.9, 1, 0], - "cubes": [ - { - "origin": [-3.9, 0, -2.01], - "size": [4, 12, 4], - "uv": [0, 16], - "inflate": 0.5 - } - ], - "mirror": true - } - ], - "visible_bounds_width": 1.5, - "visible_bounds_offset": [0, 0.5, 0], - "texturewidth": 64, - "textureheight": 32 - }, - "feet": { - "bones": [ - {"name": "armor", "pivot": [0, 12, 0]}, - { - "name": "leftleg", - "parent": "armor", - "pivot": [1.9, 1, 0], - "cubes": [ - { - "origin": [-0.1, 0, -2], - "size": [4, 12, 4], - "uv": [0, 16], - "inflate": 0.8 - } - ] - }, - { - "name": "rightleg", - "parent": "armor", - "pivot": [-1.9, 1, 0], - "cubes": [ - { - "origin": [-3.9, 0.01, -2.01], - "size": [4, 12, 4], - "uv": [0, 16], - "inflate": 0.8 - } - ], - "mirror": true - } - ], - "visible_bounds_width": 1.5, - "visible_bounds_offset": [0, 0.5, 0], - "texturewidth": 64, - "textureheight": 32 - } -} \ No newline at end of file diff --git a/renderer/viewer/three/entity/armorModels.ts b/renderer/viewer/three/entity/armorModels.ts deleted file mode 100644 index 3681344c..00000000 --- a/renderer/viewer/three/entity/armorModels.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { default as chainmailLayer1 } from 'mc-assets/dist/other-textures/latest/models/armor/chainmail_layer_1.png' -import { default as chainmailLayer2 } from 'mc-assets/dist/other-textures/latest/models/armor/chainmail_layer_2.png' -import { default as diamondLayer1 } from 'mc-assets/dist/other-textures/latest/models/armor/diamond_layer_1.png' -import { default as diamondLayer2 } from 'mc-assets/dist/other-textures/latest/models/armor/diamond_layer_2.png' -import { default as goldenLayer1 } from 'mc-assets/dist/other-textures/latest/models/armor/gold_layer_1.png' -import { default as goldenLayer2 } from 'mc-assets/dist/other-textures/latest/models/armor/gold_layer_2.png' -import { default as ironLayer1 } from 'mc-assets/dist/other-textures/latest/models/armor/iron_layer_1.png' -import { default as ironLayer2 } from 'mc-assets/dist/other-textures/latest/models/armor/iron_layer_2.png' -import { default as leatherLayer1 } from 'mc-assets/dist/other-textures/latest/models/armor/leather_layer_1.png' -import { default as leatherLayer1Overlay } from 'mc-assets/dist/other-textures/latest/models/armor/leather_layer_1_overlay.png' -import { default as leatherLayer2 } from 'mc-assets/dist/other-textures/latest/models/armor/leather_layer_2.png' -import { default as leatherLayer2Overlay } from 'mc-assets/dist/other-textures/latest/models/armor/leather_layer_2_overlay.png' -import { default as netheriteLayer1 } from 'mc-assets/dist/other-textures/latest/models/armor/netherite_layer_1.png' -import { default as netheriteLayer2 } from 'mc-assets/dist/other-textures/latest/models/armor/netherite_layer_2.png' -import { default as turtleLayer1 } from 'mc-assets/dist/other-textures/latest/models/armor/turtle_layer_1.png' - -export { default as elytraTexture } from 'mc-assets/dist/other-textures/latest/entity/elytra.png' -export { default as armorModel } from './armorModels.json' - -export const armorTextures = { - 'leather_layer_1': leatherLayer1, - 'leather_layer_1_overlay': leatherLayer1Overlay, - 'leather_layer_2': leatherLayer2, - 'leather_layer_2_overlay': leatherLayer2Overlay, - 'chainmail_layer_1': chainmailLayer1, - 'chainmail_layer_2': chainmailLayer2, - 'iron_layer_1': ironLayer1, - 'iron_layer_2': ironLayer2, - 'diamond_layer_1': diamondLayer1, - 'diamond_layer_2': diamondLayer2, - 'golden_layer_1': goldenLayer1, - 'golden_layer_2': goldenLayer2, - 'netherite_layer_1': netheriteLayer1, - 'netherite_layer_2': netheriteLayer2, - 'turtle_layer_1': turtleLayer1 -} diff --git a/renderer/viewer/three/entity/entities.json b/renderer/viewer/three/entity/entities.json deleted file mode 100644 index feca5dc7..00000000 --- a/renderer/viewer/three/entity/entities.json +++ /dev/null @@ -1,6230 +0,0 @@ -{ - "armor_stand": { - "identifier": "minecraft:armor_stand", - "min_engine_version": "1.8.0", - "materials": {"default": "armor_stand"}, - "textures": {"default": "textures/entity/armorstand/wood"}, - "geometry": { - "default": { - "bones": [ - { - "name": "baseplate", - "parent": "waist", - "cubes": [ - {"origin": [-6, 0, -6], "size": [12, 1, 12], "uv": [0, 32]} - ] - }, - {"name": "waist", "pivot": [0, 12, 0]}, - { - "name": "body", - "parent": "waist", - "pivot": [0, 13, 0], - "cubes": [ - {"origin": [-6, 21, -1.5], "size": [12, 3, 3], "uv": [0, 26]}, - {"origin": [-3, 14, -1], "size": [2, 7, 2], "uv": [16, 0]}, - {"origin": [1, 14, -1], "size": [2, 7, 2], "uv": [48, 16]}, - {"origin": [-4, 12, -1], "size": [8, 2, 2], "uv": [0, 48]} - ] - }, - { - "name": "head", - "parent": "waist", - "pivot": [0, 12, 0], - "cubes": [{"origin": [-1, 24, -1], "size": [2, 7, 2], "uv": [0, 0]}] - }, - { - "name": "hat", - "parent": "head", - "pivot": [0, 12, 0], - "cubes": [ - {"origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [32, 0]} - ] - }, - { - "name": "leftarm", - "parent": "waist", - "mirror": true, - "pivot": [5, 10, 0], - "cubes": [ - {"origin": [5, 12, -1], "size": [2, 12, 2], "uv": [32, 16]} - ] - }, - {"name": "leftitem", "parent": "leftarm", "pivot": [1, -9, -5]}, - { - "name": "leftleg", - "parent": "waist", - "mirror": true, - "pivot": [1.9, 1, 0], - "cubes": [ - {"origin": [0.9, 1, -1], "size": [2, 11, 2], "uv": [40, 16]} - ] - }, - { - "name": "rightarm", - "parent": "waist", - "pivot": [-5, 10, 0], - "cubes": [ - {"origin": [-7, 12, -1], "size": [2, 12, 2], "uv": [24, 0]} - ] - }, - {"name": "rightitem", "parent": "rightarm", "pivot": [-1, -9, -5]}, - { - "name": "rightleg", - "parent": "waist", - "pivot": [-1.9, 1, 0], - "cubes": [ - {"origin": [-2.9, 1, -1], "size": [2, 11, 2], "uv": [8, 0]} - ] - } - ], - "visible_bounds_width": 1.5, - "visible_bounds_offset": [0, 0.5, 0], - "texturewidth": 64, - "textureheight": 64 - } - }, - "render_controllers": ["controller.render.armor_stand"], - "enable_attachables": true - }, - "arrow": { - "identifier": "minecraft:arrow", - "materials": {"default": "arrow"}, - "textures": {"default": "textures/entity/arrow"}, - "geometry": { - "default": { - "bones": [ - { - "name": "body", - "pivot": [0, 1, 0], - "cubes": [ - { - "origin": [0, -2.5, -3], - "rotation": [0, 0, 45], - "size": [0, 5, 16], - "uv": {"east": {"uv": [0, 0]}} - }, - { - "origin": [0, -2.5, -3], - "rotation": [0, 0, -45], - "size": [0, 5, 16], - "uv": {"east": {"uv": [0, 0]}} - }, - { - "origin": [-2.5, -2.5, 12], - "rotation": [0, 0, 45], - "size": [5, 5, 0], - "uv": {"south": {"uv": [0, 5]}} - } - ] - } - ], - "texturewidth": 32, - "textureheight": 32 - } - }, - "render_controllers": ["controller.render.arrow"] - }, - "bat": { - "identifier": "minecraft:bat", - "materials": {"default": "bat"}, - "textures": {"default": "textures/entity/bat"}, - "geometry": { - "default": { - "visible_bounds_width": 1, - "visible_bounds_height": 1, - "visible_bounds_offset": [0, 0.5, 0], - "bones": [ - { - "name": "head", - "pivot": [0, 24, 0], - "cubes": [{"origin": [-3, 21, -3], "size": [6, 6, 6], "uv": [0, 0]}] - }, - { - "name": "rightEar", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 26, -2], "size": [3, 4, 1], "uv": [24, 0]} - ], - "parent": "head" - }, - { - "name": "leftEar", - "mirror": true, - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [1, 26, -2], "size": [3, 4, 1], "uv": [24, 0]} - ], - "parent": "head" - }, - { - "name": "body", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-3, 8, -3], "size": [6, 12, 6], "uv": [0, 16]}, - {"origin": [-5, -8, 0], "size": [10, 16, 1], "uv": [0, 34]} - ] - }, - { - "name": "rightWing", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-12, 7, 1.5], "size": [10, 16, 1], "uv": [42, 0]} - ], - "parent": "body" - }, - { - "name": "rightWingTip", - "pivot": [-12, 23, 1.5], - "cubes": [ - {"origin": [-20, 10, 1.5], "size": [8, 12, 1], "uv": [24, 16]} - ], - "parent": "rightWing" - }, - { - "name": "leftWing", - "mirror": true, - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [2, 7, 1.5], "size": [10, 16, 1], "uv": [42, 0]} - ], - "parent": "body" - }, - { - "name": "leftWingTip", - "mirror": true, - "pivot": [12, 23, 1.5], - "cubes": [ - {"origin": [12, 10, 1.5], "size": [8, 12, 1], "uv": [24, 16]} - ], - "parent": "leftWing" - } - ] - } - }, - "render_controllers": ["controller.render.bat"], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 18} - }, - "bee": { - "identifier": "minecraft:bee", - "materials": {"default": "bee"}, - "textures": { - "default": "textures/entity/bee/bee", - "angry": "textures/entity/bee/bee_angry", - "nectar": "textures/entity/bee/bee_nectar", - "angry_nectar": "textures/entity/bee/bee_angry_nectar" - }, - "geometry": { - "default": { - "texturewidth": 64, - "textureheight": 64, - "visible_bounds_width": 1.5, - "visible_bounds_height": 1.5, - "visible_bounds_offset": [0, 0.25, 0], - "bones": [ - { - "name": "body", - "pivot": [0.5, 5, 0], - "cubes": [ - {"origin": [-3, 2, -5], "size": [7, 7, 10], "uv": [0, 0]}, - {"origin": [2, 7, -8], "size": [1, 2, 3], "uv": [2, 0]}, - {"origin": [-2, 7, -8], "size": [1, 2, 3], "uv": [2, 3]} - ], - "locators": {"lead": [0, 4, -1]} - }, - { - "name": "stinger", - "parent": "body", - "pivot": [0.5, 6, 1], - "cubes": [{"origin": [0.5, 5, 5], "size": [0, 1, 2], "uv": [26, 7]}] - }, - { - "name": "rightwing_bone", - "parent": "body", - "pivot": [-1, 9, -3], - "rotation": [15, -15, 0], - "cubes": [ - {"origin": [-10, 9, -3], "size": [9, 0, 6], "uv": [0, 18]} - ] - }, - { - "name": "leftwing_bone", - "parent": "body", - "pivot": [2, 9, -3], - "rotation": [15, 15, 0], - "cubes": [{"origin": [2, 9, -3], "size": [9, 0, 6], "uv": [9, 24]}] - }, - { - "name": "leg_front", - "parent": "body", - "pivot": [2, 2, -2], - "cubes": [{"origin": [-3, 0, -2], "size": [7, 2, 0], "uv": [26, 1]}] - }, - { - "name": "leg_mid", - "parent": "body", - "pivot": [2, 2, 0], - "cubes": [{"origin": [-3, 0, 0], "size": [7, 2, 0], "uv": [26, 3]}] - }, - { - "name": "leg_back", - "parent": "body", - "pivot": [2, 2, 2], - "cubes": [{"origin": [-3, 0, 2], "size": [7, 2, 0], "uv": [26, 5]}] - } - ] - } - }, - "particle_effects": {"nectar_dripping": "minecraft:nectar_drip_particle"}, - "render_controllers": ["controller.render.bee"], - "spawn_egg": {"texture": "egg_bee", "texture_index": 0} - }, - "cave_spider": { - "identifier": "minecraft:cave_spider", - "min_engine_version": "1.8.0", - "materials": {"default": "spider", "invisible": "spider_invisible"}, - "textures": {"default": "textures/entity/spider/cave_spider"}, - "geometry": { - "default": { - "visible_bounds_width": 2, - "visible_bounds_height": 1, - "visible_bounds_offset": [0, 0.5, 0], - "texturewidth": 64, - "textureheight": 32, - "bones": [ - { - "name": "head", - "pivot": [0, 9, -3], - "cubes": [ - {"origin": [-4, 5, -11], "size": [8, 8, 8], "uv": [32, 4]} - ], - "parent": "body0" - }, - { - "name": "body0", - "pivot": [0, 9, 0], - "cubes": [{"origin": [-3, 6, -3], "size": [6, 6, 6], "uv": [0, 0]}] - }, - { - "name": "body1", - "pivot": [0, 9, 9], - "cubes": [ - {"origin": [-5, 5, 3], "size": [10, 8, 12], "uv": [0, 12]} - ], - "parent": "body0" - }, - { - "name": "leg0", - "pivot": [-4, 9, 2], - "cubes": [ - {"origin": [-19, 8, 1], "size": [16, 2, 2], "uv": [18, 0]} - ], - "parent": "body0" - }, - { - "name": "leg1", - "pivot": [4, 9, 2], - "cubes": [{"origin": [3, 8, 1], "size": [16, 2, 2], "uv": [18, 0]}], - "parent": "body0" - }, - { - "name": "leg2", - "pivot": [-4, 9, 1], - "cubes": [ - {"origin": [-19, 8, 0], "size": [16, 2, 2], "uv": [18, 0]} - ], - "parent": "body0" - }, - { - "name": "leg3", - "pivot": [4, 9, 1], - "cubes": [{"origin": [3, 8, 0], "size": [16, 2, 2], "uv": [18, 0]}], - "parent": "body0" - }, - { - "name": "leg4", - "pivot": [-4, 9, 0], - "cubes": [ - {"origin": [-19, 8, -1], "size": [16, 2, 2], "uv": [18, 0]} - ], - "parent": "body0" - }, - { - "name": "leg5", - "pivot": [4, 9, 0], - "cubes": [ - {"origin": [3, 8, -1], "size": [16, 2, 2], "uv": [18, 0]} - ], - "parent": "body0" - }, - { - "name": "leg6", - "pivot": [-4, 9, -1], - "cubes": [ - {"origin": [-19, 8, -2], "size": [16, 2, 2], "uv": [18, 0]} - ], - "parent": "body0" - }, - { - "name": "leg7", - "pivot": [4, 9, -1], - "cubes": [ - {"origin": [3, 8, -2], "size": [16, 2, 2], "uv": [18, 0]} - ], - "parent": "body0" - } - ] - } - }, - "render_controllers": ["controller.render.spider"], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 22} - }, - "chest_minecart": { - "identifier": "minecraft:chest_minecart", - "min_engine_version": "1.8.0", - "materials": {"default": "minecart"}, - "textures": {"default": "textures/entity/minecart"}, - "geometry": { - "default": { - "bones": [ - { - "name": "bottom", - "pivot": [0, 6, 0], - "cubes": [ - { - "origin": [-10, -6.5, -1], - "size": [20, 16, 2], - "rotation": [90, 0, 0], - "uv": [0, 10] - } - ] - }, - { - "name": "back", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-17, 2.5, -1], - "size": [16, 8, 2], - "rotation": [0, 270, 0], - "uv": [0, 0] - } - ], - "parent": "bottom" - }, - { - "name": "front", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [1, 2.5, -1], - "size": [16, 8, 2], - "rotation": [0, 90, 0], - "uv": [0, 0] - } - ], - "parent": "bottom" - }, - { - "name": "right", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-8, 2.5, -8], - "size": [16, 8, 2], - "rotation": [0, 180, 0], - "uv": [0, 0] - } - ], - "parent": "bottom" - }, - { - "name": "left", - "pivot": [0, 0, 0], - "cubes": [ - {"origin": [-8, 2.5, 6], "size": [16, 8, 2], "uv": [0, 0]} - ], - "parent": "bottom" - } - ], - "texturewidth": 64, - "textureheight": 32 - } - }, - "render_controllers": ["controller.render.minecart"] - }, - "command_block_minecart": { - "identifier": "minecraft:command_block_minecart", - "min_engine_version": "1.8.0", - "materials": {"default": "minecart"}, - "textures": {"default": "textures/entity/minecart"}, - "geometry": { - "default": { - "bones": [ - { - "name": "bottom", - "pivot": [0, 6, 0], - "cubes": [ - { - "origin": [-10, -6.5, -1], - "size": [20, 16, 2], - "rotation": [90, 0, 0], - "uv": [0, 10] - } - ] - }, - { - "name": "back", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-17, 2.5, -1], - "size": [16, 8, 2], - "rotation": [0, 270, 0], - "uv": [0, 0] - } - ], - "parent": "bottom" - }, - { - "name": "front", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [1, 2.5, -1], - "size": [16, 8, 2], - "rotation": [0, 90, 0], - "uv": [0, 0] - } - ], - "parent": "bottom" - }, - { - "name": "right", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-8, 2.5, -8], - "size": [16, 8, 2], - "rotation": [0, 180, 0], - "uv": [0, 0] - } - ], - "parent": "bottom" - }, - { - "name": "left", - "pivot": [0, 0, 0], - "cubes": [ - {"origin": [-8, 2.5, 6], "size": [16, 8, 2], "uv": [0, 0]} - ], - "parent": "bottom" - } - ], - "texturewidth": 64, - "textureheight": 32 - } - }, - "render_controllers": ["controller.render.minecart"] - }, - "cow": { - "identifier": "minecraft:cow", - "min_engine_version": "1.8.0", - "materials": {"default": "cow"}, - "textures": {"default": "textures/entity/cow/cow"}, - "geometry": { - "default": { - "visible_bounds_width": 2, - "visible_bounds_height": 1.75, - "visible_bounds_offset": [0, 0.75, 0], - "texturewidth": 64, - "textureheight": 32, - "bones": [ - { - "name": "body", - "pivot": [0, 19, 2], - "bind_pose_rotation": [90, 0, 0], - "cubes": [ - {"origin": [-6, 11, -5], "size": [12, 18, 10], "uv": [18, 4]}, - {"origin": [-2, 11, -6], "size": [4, 6, 1], "uv": [52, 0]} - ] - }, - { - "name": "head", - "parent": "body", - "pivot": [0, 20, -8], - "locators": {"lead": [0, 20, -8]}, - "cubes": [ - {"origin": [-4, 16, -14], "size": [8, 8, 6], "uv": [0, 0]}, - {"origin": [-5, 22, -12], "size": [1, 3, 1], "uv": [22, 0]}, - {"origin": [4, 22, -12], "size": [1, 3, 1], "uv": [22, 0]} - ] - }, - { - "name": "leg0", - "parent": "body", - "pivot": [-4, 12, 7], - "cubes": [{"origin": [-6, 0, 5], "size": [4, 12, 4], "uv": [0, 16]}] - }, - { - "name": "leg1", - "parent": "body", - "mirror": true, - "pivot": [4, 12, 7], - "cubes": [{"origin": [2, 0, 5], "size": [4, 12, 4], "uv": [0, 16]}] - }, - { - "name": "leg2", - "parent": "body", - "pivot": [-4, 12, -6], - "cubes": [ - {"origin": [-6, 0, -7], "size": [4, 12, 4], "uv": [0, 16]} - ] - }, - { - "name": "leg3", - "parent": "body", - "mirror": true, - "pivot": [4, 12, -6], - "cubes": [{"origin": [2, 0, -7], "size": [4, 12, 4], "uv": [0, 16]}] - } - ] - } - }, - "render_controllers": ["controller.render.cow"], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 1} - }, - "dragon_fireball": { - "identifier": "minecraft:dragon_fireball", - "materials": {"default": "fireball"}, - "textures": {"default": "textures/entity/enderdragon/dragon_fireball"}, - "geometry": { - "default": { - "bones": [ - { - "name": "body", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-8, -4, 0], - "size": [16, 16, 0], - "uv": {"south": {"uv": [0, 0]}} - } - ] - } - ], - "texturewidth": 16, - "textureheight": 16 - } - }, - "render_controllers": ["controller.render.fireball"] - }, - "drowned": { - "identifier": "minecraft:drowned", - "min_engine_version": "1.16.0", - "materials": {"default": "drowned"}, - "textures": {"default": "textures/entity/zombie/drowned"}, - "geometry": { - "default": { - "bones": [ - { - "name": "body", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]} - ] - }, - { - "name": "jacket", - "parent": "body", - "pivot": [0, 24, 0], - "cubes": [ - { - "origin": [-4, 12, -2], - "size": [8, 12, 4], - "uv": [16, 32], - "inflate": 0.5 - } - ] - }, - { - "name": "head", - "parent": "body", - "pivot": [0, 24, 0], - "cubes": [ - { - "origin": [-4, 24, -4], - "size": [8, 8, 8], - "uv": [0, 0], - "inflate": 0.5 - } - ] - }, - { - "name": "hat", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - { - "origin": [-4, 24, -4], - "size": [8, 8, 8], - "uv": [32, 0], - "inflate": 1 - } - ] - }, - { - "name": "rightArm", - "parent": "body", - "pivot": [-5, 22, 0], - "cubes": [ - {"origin": [-7, 12, -2], "size": [4, 12, 4], "uv": [0, 16]} - ] - }, - { - "name": "leftArm", - "parent": "body", - "pivot": [5, 22, 0], - "cubes": [ - { - "origin": [4, 12, -2], - "size": [4, 12, 4], - "uv": [40, 16], - "mirror": true - } - ] - }, - { - "name": "rightSleeve", - "parent": "rightArm", - "pivot": [-5, 22, 0], - "cubes": [ - { - "origin": [-7, 12, -2], - "size": [4, 12, 4], - "uv": [48, 48], - "inflate": 0.5 - } - ] - }, - { - "name": "leftSleeve", - "parent": "leftArm", - "pivot": [5, 22, 0], - "cubes": [ - { - "origin": [4, 12, -2], - "size": [4, 12, 4], - "uv": [40, 32], - "inflate": 0.5, - "mirror": true - } - ] - }, - { - "name": "rightLeg", - "parent": "body", - "pivot": [-1.9, 12, 0], - "cubes": [ - {"origin": [-4.05, 0, -2], "size": [4, 12, 4], "uv": [16, 48]} - ] - }, - { - "name": "leftLeg", - "parent": "body", - "pivot": [1.9, 12, 0], - "cubes": [ - { - "origin": [0.05, 0, -2], - "size": [4, 12, 4], - "uv": [32, 48], - "mirror": true - } - ] - }, - { - "name": "rightPants", - "parent": "rightLeg", - "pivot": [-1.9, 12, 0], - "cubes": [ - { - "origin": [-4.25, 0, -2], - "size": [4, 12, 4], - "uv": [0, 48], - "inflate": 0.25 - } - ] - }, - { - "name": "leftPants", - "parent": "leftLeg", - "pivot": [1.9, 12, 0], - "cubes": [ - { - "origin": [0.25, 0, -2], - "size": [4, 12, 4], - "uv": [0, 32], - "inflate": 0.25, - "mirror": true - } - ] - }, - {"name": "waist", "parent": "body", "pivot": [0, 12, 0]}, - {"name": "rightItem", "parent": "rightArm", "pivot": [-1, -45, -5]}, - {"name": "leftItem", "parent": "leftArm", "pivot": [1, -45, -5]} - ], - "visible_bounds_width": 2.5, - "visible_bounds_height": 2.5, - "visible_bounds_offset": [0, 1.25, 0], - "texturewidth": 64, - "textureheight": 64 - } - }, - "render_controllers": ["controller.render.drowned"], - "enable_attachables": true, - "spawn_egg": {"texture": "spawn_egg", "texture_index": 48} - }, - "egg": { - "identifier": "minecraft:egg", - "materials": {"default": "egg"}, - "textures": {"default": "textures/items/egg"}, - "geometry": { - "default": { - "bones": [ - { - "name": "body", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-8, -8, 0], - "size": [16, 16, 0], - "uv": [0, 0], - "rotation": [0, 0, 0] - } - ] - } - ], - "texturewidth": 16, - "textureheight": 16 - } - }, - "render_controllers": ["controller.render.item_sprite"] - }, - "elder_guardian": { - "identifier": "minecraft:elder_guardian", - "min_engine_version": "1.8.0", - "materials": {"default": "guardian", "ghost": "guardian_ghost"}, - "textures": { - "default": "textures/entity/guardian", - "elder": "textures/entity/guardian_elder", - "beam": "textures/entity/guardian_beam" - }, - "geometry": { - "default": { - "visible_bounds_width": 3.5, - "visible_bounds_height": 2, - "visible_bounds_offset": [0, 0.5, 0], - "texturewidth": 64, - "textureheight": 64, - "bones": [ - { - "name": "head", - "pivot": [0, 0, 0], - "mirror": true, - "cubes": [ - { - "mirror": false, - "origin": [-6, 2, -8], - "size": [12, 12, 16], - "uv": [0, 0] - }, - { - "mirror": false, - "origin": [-8, 2, -6], - "size": [2, 12, 12], - "uv": [0, 28] - }, - {"origin": [6, 2, -6], "size": [2, 12, 12], "uv": [0, 28]}, - {"origin": [-6, 14, -6], "size": [12, 2, 12], "uv": [16, 40]}, - {"origin": [-6, 0, -6], "size": [12, 2, 12], "uv": [16, 40]} - ] - }, - { - "name": "eye", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [{"origin": [-1, 6, 0], "size": [2, 2, 1], "uv": [8, 0]}] - }, - { - "name": "tailpart0", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [{"origin": [-2, 6, 7], "size": [4, 4, 8], "uv": [40, 0]}] - }, - { - "name": "tailpart1", - "parent": "tailpart0", - "pivot": [0, 24, 0], - "cubes": [{"origin": [0, 7, 0], "size": [3, 3, 7], "uv": [0, 54]}] - }, - { - "name": "tailpart2", - "parent": "tailpart1", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [0, 8, 0], "size": [2, 2, 6], "uv": [41, 32]}, - {"origin": [1, 4.5, 3], "size": [1, 9, 9], "uv": [25, 19]} - ] - }, - { - "name": "spikepart0", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart1", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart2", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart3", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart4", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart5", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart6", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart7", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart8", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart9", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart10", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart11", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - } - ] - }, - "ghost": { - "visible_bounds_width": 3.5, - "visible_bounds_height": 2, - "visible_bounds_offset": [0, 0.5, 0], - "texturewidth": 64, - "textureheight": 64, - "bones": [ - { - "name": "head", - "pivot": [0, 24, 0], - "mirror": true, - "cubes": [ - { - "mirror": false, - "origin": [-6, 2, -8], - "size": [12, 12, 16], - "uv": [0, 0] - }, - { - "mirror": false, - "origin": [-8, 2, -6], - "size": [2, 12, 12], - "uv": [0, 28] - }, - {"origin": [6, 2, -6], "size": [2, 12, 12], "uv": [0, 28]}, - {"origin": [-6, 14, -6], "size": [12, 2, 12], "uv": [16, 40]}, - {"origin": [-6, 0, -6], "size": [12, 2, 12], "uv": [16, 40]} - ] - }, - { - "name": "eye", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [{"origin": [-1, 7, 0], "size": [2, 2, 1], "uv": [8, 0]}] - }, - { - "name": "tailpart0", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [{"origin": [-2, 6, 7], "size": [4, 4, 8], "uv": [40, 0]}] - }, - { - "name": "tailpart1", - "parent": "tailpart0", - "pivot": [0, 24, 0], - "cubes": [{"origin": [0, 7, 0], "size": [3, 3, 7], "uv": [0, 54]}] - }, - { - "name": "tailpart2", - "parent": "tailpart1", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [0, 8, 0], "size": [2, 2, 6], "uv": [41, 32]}, - {"origin": [1, 4.5, 3], "size": [1, 9, 9], "uv": [25, 19]} - ] - }, - { - "name": "spikepart0", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart1", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart2", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart3", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart4", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart5", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart6", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart7", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart8", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart9", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart10", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - }, - { - "name": "spikepart11", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-1, 19.5, -1], "size": [2, 9, 2], "uv": [0, 0]} - ] - } - ] - } - }, - "render_controllers": ["controller.render.guardian"], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 36} - }, - "eye_of_ender": { - "identifier": "minecraft:eye_of_ender_signal", - "materials": {"default": "eye_of_ender_signal"}, - "textures": {"default": "textures/items/ender_eye"}, - "geometry": { - "default": { - "bones": [ - { - "name": "body", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-8, -8, 0], - "size": [16, 16, 0], - "uv": [0, 0], - "rotation": [0, 0, 0] - } - ] - } - ], - "texturewidth": 16, - "textureheight": 16 - } - }, - "render_controllers": ["controller.render.item_sprite"] - }, - "ender_pearl": { - "identifier": "minecraft:ender_pearl", - "materials": {"default": "ender_pearl"}, - "textures": {"default": "textures/items/ender_pearl"}, - "geometry": { - "default": { - "bones": [ - { - "name": "body", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-8, -8, 0], - "size": [16, 16, 0], - "uv": [0, 0], - "rotation": [0, 0, 0] - } - ] - } - ], - "texturewidth": 16, - "textureheight": 16 - } - }, - "render_controllers": ["controller.render.item_sprite"] - }, - "evoker_fangs": { - "identifier": "minecraft:evocation_fang", - "materials": {"default": "fang"}, - "textures": {"default": "textures/entity/illager/evoker_fangs"}, - "geometry": { - "default": { - "visible_bounds_width": 1.5, - "visible_bounds_height": 3, - "visible_bounds_offset": [0, 1.5, 0], - "texturewidth": 64, - "textureheight": 32, - "bones": [ - { - "name": "upper_jaw", - "parent": "base", - "pivot": [0, 11, 0], - "cubes": [ - { - "origin": [-1.5, 0, -4], - "size": [4, 14, 8], - "uv": [40, 0], - "inflate": 0.01 - } - ] - }, - { - "name": "lower_jaw", - "parent": "base", - "pivot": [0, 11, 0], - "bind_pose_rotation": [0, 180, 0], - "cubes": [ - {"origin": [-1.5, 0, -4], "size": [4, 14, 8], "uv": [40, 0]} - ] - }, - { - "name": "base", - "pivot": [0, 0, 0], - "bind_pose_rotation": [0, 90, 0], - "cubes": [ - {"origin": [-5, 0, -5], "size": [10, 12, 10], "uv": [0, 0]} - ] - } - ] - } - }, - "render_controllers": ["controller.render.evocation_fang"] - }, - "evoker": { - "identifier": "minecraft:evocation_illager", - "min_engine_version": "1.8.0", - "materials": {"default": "evoker"}, - "textures": {"default": "textures/entity/illager/evoker"}, - "geometry": { - "default": { - "visible_bounds_width": 1.5, - "visible_bounds_height": 2.5, - "visible_bounds_offset": [0, 1.25, 0], - "texturewidth": 64, - "textureheight": 64, - "bones": [ - { - "name": "head", - "parent": "body", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 24, -4], "size": [8, 10, 8], "uv": [0, 0]} - ] - }, - { - "name": "nose", - "parent": "head", - "pivot": [0, 26, 0], - "cubes": [ - {"origin": [-1, 23, -6], "size": [2, 4, 2], "uv": [24, 0]} - ] - }, - { - "name": "body", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 12, -3], "size": [8, 12, 6], "uv": [16, 20]}, - { - "origin": [-4, 6, -3], - "size": [8, 18, 6], - "uv": [0, 38], - "inflate": 0.5 - } - ] - }, - { - "name": "arms", - "parent": "body", - "pivot": [0, 22, 0], - "cubes": [ - {"origin": [-8, 16, -2], "size": [4, 8, 4], "uv": [44, 22]}, - {"origin": [4, 16, -2], "size": [4, 8, 4], "uv": [44, 22]}, - {"origin": [-4, 16, -2], "size": [8, 4, 4], "uv": [40, 38]} - ] - }, - { - "name": "leg0", - "parent": "body", - "pivot": [-2, 12, 0], - "cubes": [ - {"origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} - ] - }, - { - "name": "leg1", - "parent": "body", - "pivot": [2, 12, 0], - "mirror": true, - "cubes": [{"origin": [0, 0, -2], "size": [4, 12, 4], "uv": [0, 22]}] - }, - { - "name": "rightArm", - "parent": "body", - "pivot": [-5, 22, 0], - "locators": {"right_hand": [-6, 12, 0]}, - "cubes": [ - {"origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 46]} - ] - }, - { - "name": "rightItem", - "pivot": [-5.5, 16, 0.5], - "neverRender": true, - "parent": "rightArm" - }, - { - "name": "leftArm", - "parent": "body", - "pivot": [5, 22, 0], - "locators": {"left_hand": [6, 12, 0]}, - "mirror": true, - "cubes": [ - {"origin": [4, 12, -2], "size": [4, 12, 4], "uv": [40, 46]} - ] - } - ] - } - }, - "particle_effects": {"spell": "minecraft:evoker_spell"}, - "render_controllers": ["controller.render.evoker"], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 40} - }, - "experience_bottle": { - "identifier": "minecraft:xp_bottle", - "materials": {"default": "xp_bottle"}, - "textures": { - "default": "textures/items/experience_bottle", - "enchanted": "textures/misc/enchanted_item_glint" - }, - "geometry": { - "default": { - "bones": [ - { - "name": "body", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-8, -8, 0], - "size": [16, 16, 0], - "uv": [0, 0], - "rotation": [0, 0, 0] - } - ] - } - ], - "texturewidth": 16, - "textureheight": 16 - } - }, - "render_controllers": ["controller.render.experience_bottle"] - }, - "experience_orb": { - "identifier": "minecraft:xp_orb", - "materials": {"default": "experience_orb"}, - "textures": {"default": "textures/entity/experience_orb"}, - "geometry": { - "default": { - "bones": [ - { - "name": "body", - "pivot": [8, 8, 0], - "cubes": [ - { - "origin": [0, 0, 0], - "size": [16, 16, 0], - "uv": {"south": {"uv": [0, 0]}} - } - ] - } - ], - "texturewidth": 64, - "textureheight": 64 - } - }, - "render_controllers": ["controller.render.experience_orb"] - }, - "fireball": { - "identifier": "minecraft:fireball", - "materials": {"default": "fireball"}, - "textures": {"default": "textures/items/fire_charge"}, - "geometry": { - "default": { - "bones": [ - { - "name": "body", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-8, -4, 0], - "size": [16, 16, 0], - "uv": {"south": {"uv": [0, 0]}} - } - ] - } - ], - "texturewidth": 16, - "textureheight": 16 - } - }, - "render_controllers": ["controller.render.fireball"] - }, - "firework_rocket": { - "identifier": "minecraft:fireworks_rocket", - "materials": {"default": "fireworks_rocket"}, - "textures": {"default": "textures/entity/fireworks"}, - "geometry": { - "default": { - "bones": [ - { - "name": "body", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-8, -8, 0], - "rotation": [0, 90, 0], - "size": [16, 16, 0], - "uv": {"north": {"uv": [0, 0]}} - }, - { - "origin": [-8, -8, 0], - "rotation": [90, 90, 0], - "size": [16, 16, 0], - "uv": {"north": {"uv": [0, 0]}} - } - ] - } - ], - "texturewidth": 32, - "textureheight": 32 - } - }, - "render_controllers": ["controller.render.fireworks_rocket"] - }, - "fishing_bobber": { - "identifier": "minecraft:fishing_hook", - "materials": {"default": "fishing_hook"}, - "textures": {"default": "textures/entity/fishing_hook"}, - "geometry": { - "default": { - "bones": [ - { - "name": "body", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-1.5, -1.5, -1.5], - "size": [3, 3, 3], - "rotation": [0, 0, 180], - "uv": { - "up": {"uv": [0, 0]}, - "down": {"uv": [3, 0]}, - "south": {"uv": [9, 0], "uv_size": [-3, 3]}, - "north": {"uv": [9, 0]}, - "east": {"uv": [12, 0]}, - "west": {"uv": [15, 0]} - } - }, - { - "origin": [0, -4.5, -0.5], - "size": [0, 3, 3], - "uv": {"east": {"uv": [18, 0]}} - }, - { - "origin": [0, 1.5, -1.5], - "size": [0, 3, 3], - "uv": {"east": {"uv": [21, 0]}} - }, - { - "origin": [-1.5, 1.5, 0], - "size": [3, 3, 0], - "uv": {"north": {"uv": [21, 0]}} - } - ] - } - ], - "texturewidth": 24, - "textureheight": 3 - } - }, - "render_controllers": ["controller.render.fishing_hook"] - }, - "hoglin": { - "identifier": "minecraft:hoglin", - "materials": {"default": "hoglin"}, - "textures": {"default": "textures/entity/hoglin/hoglin"}, - "geometry": { - "default": { - "bones": [ - { - "name": "body", - "pivot": [0, 19, -3], - "cubes": [ - { - "origin": [-8, 11, -7], - "size": [16, 14, 26], - "inflate": 0.02, - "uv": [1, 1] - }, - { - "origin": [0, 22, -10], - "size": [0, 10, 19], - "inflate": 0.02, - "uv": [90, 33] - } - ], - "locators": {"lead": [0, 20, -5]} - }, - { - "name": "head", - "parent": "body", - "pivot": [0, 22, -5], - "rotation": [50, 0, 0], - "cubes": [ - {"origin": [-7, 21, -24], "size": [14, 6, 19], "uv": [61, 1]}, - {"origin": [-8, 22, -19], "size": [2, 11, 2], "uv": [1, 13]}, - {"origin": [6, 22, -19], "size": [2, 11, 2], "uv": [1, 13]} - ] - }, - { - "name": "right_ear", - "parent": "head", - "pivot": [-7, 27, -7], - "rotation": [0, 0, -50], - "cubes": [ - {"origin": [-13, 26, -10], "size": [6, 1, 4], "uv": [1, 1]} - ] - }, - { - "name": "left_ear", - "parent": "head", - "pivot": [7, 27, -7], - "rotation": [0, 0, 50], - "cubes": [{"origin": [7, 26, -10], "size": [6, 1, 4], "uv": [1, 6]}] - }, - { - "name": "leg_back_right", - "pivot": [6, 8, 17], - "cubes": [ - {"origin": [-8, 0, 13], "size": [5, 11, 5], "uv": [21, 45]} - ] - }, - { - "name": "leg_back_left", - "pivot": [-6, 8, 17], - "cubes": [{"origin": [3, 0, 13], "size": [5, 11, 5], "uv": [0, 45]}] - }, - { - "name": "leg_front_right", - "pivot": [-6, 12, -3], - "cubes": [ - {"origin": [-8, 0, -6], "size": [6, 14, 6], "uv": [66, 42]} - ] - }, - { - "name": "leg_front_left", - "pivot": [6, 12, -3], - "cubes": [ - {"origin": [2, 0, -6], "size": [6, 14, 6], "uv": [41, 42]} - ] - } - ], - "visible_bounds_width": 4, - "visible_bounds_height": 3, - "visible_bounds_offset": [0, 1.5, 0], - "texturewidth": 128, - "textureheight": 64 - } - }, - "spawn_egg": {"base_color": "#C66E55", "overlay_color": "#5f6464"}, - "render_controllers": ["controller.render.hoglin"] - }, - "hopper_minecart": { - "identifier": "minecraft:hopper_minecart", - "min_engine_version": "1.8.0", - "materials": {"default": "minecart"}, - "textures": {"default": "textures/entity/minecart"}, - "geometry": { - "default": { - "bones": [ - { - "name": "bottom", - "pivot": [0, 6, 0], - "cubes": [ - { - "origin": [-10, -6.5, -1], - "size": [20, 16, 2], - "rotation": [90, 0, 0], - "uv": [0, 10] - } - ] - }, - { - "name": "back", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-17, 2.5, -1], - "size": [16, 8, 2], - "rotation": [0, 270, 0], - "uv": [0, 0] - } - ], - "parent": "bottom" - }, - { - "name": "front", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [1, 2.5, -1], - "size": [16, 8, 2], - "rotation": [0, 90, 0], - "uv": [0, 0] - } - ], - "parent": "bottom" - }, - { - "name": "right", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-8, 2.5, -8], - "size": [16, 8, 2], - "rotation": [0, 180, 0], - "uv": [0, 0] - } - ], - "parent": "bottom" - }, - { - "name": "left", - "pivot": [0, 0, 0], - "cubes": [ - {"origin": [-8, 2.5, 6], "size": [16, 8, 2], "uv": [0, 0]} - ], - "parent": "bottom" - } - ], - "texturewidth": 64, - "textureheight": 32 - } - }, - "render_controllers": ["controller.render.minecart"] - }, - "husk": { - "identifier": "minecraft:husk", - "min_engine_version": "1.8.0", - "materials": {"default": "husk"}, - "textures": {"default": "textures/entity/zombie/husk"}, - "geometry": { - "default": { - "visible_bounds_width": 1.5, - "visible_bounds_height": 2.5, - "visible_bounds_offset": [0, 1.25, 0], - "texturewidth": 64, - "textureheight": 32, - "bones": [ - { - "name": "body", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]} - ], - "parent": "waist" - }, - {"name": "waist", "neverRender": true, "pivot": [0, 12, 0]}, - { - "name": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [0, 0]} - ], - "parent": "body" - }, - { - "name": "hat", - "pivot": [0, 24, 0], - "cubes": [ - { - "origin": [-4, 24, -4], - "size": [8, 8, 8], - "uv": [32, 0], - "inflate": 0.5 - } - ], - "neverRender": true, - "parent": "head" - }, - { - "name": "rightArm", - "pivot": [-5, 22, 0], - "cubes": [ - {"origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 16]} - ], - "parent": "body" - }, - { - "name": "rightItem", - "pivot": [-1, -45, -5], - "neverRender": true, - "parent": "rightArm" - }, - { - "name": "leftArm", - "pivot": [5, 22, 0], - "cubes": [ - {"origin": [4, 12, -2], "size": [4, 12, 4], "uv": [40, 16]} - ], - "mirror": true, - "parent": "body" - }, - { - "name": "leftItem", - "pivot": [1, -45, -5], - "neverRender": true, - "parent": "leftArm" - }, - { - "name": "rightLeg", - "pivot": [-1.9, 12, 0], - "cubes": [ - {"origin": [-3.9, 0, -2], "size": [4, 12, 4], "uv": [0, 16]} - ], - "parent": "body" - }, - { - "name": "leftLeg", - "pivot": [1.9, 12, 0], - "cubes": [ - {"origin": [-0.1, 0, -2], "size": [4, 12, 4], "uv": [0, 16]} - ], - "mirror": true, - "parent": "body" - } - ] - } - }, - "scripts": { - "pre_animation": [ - "variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;" - ] - }, - "animations": { - "humanoid_big_head": {"loop": true, "bones": {"head": {"scale": 1.4}}}, - "look_at_target_default": { - "loop": true, - "bones": { - "head": { - "relative_to": {"rotation": "entity"}, - "rotation": [ - "query.target_x_rotation", - "query.target_y_rotation", - 0 - ] - } - } - }, - "look_at_target_gliding": { - "loop": true, - "bones": {"head": {"rotation": [-45, "query.target_y_rotation", 0]}} - }, - "look_at_target_swimming": { - "loop": true, - "bones": { - "head": { - "rotation": [ - "math.lerp(query.target_x_rotation, -45.0, variable.swim_amount)", - "query.target_y_rotation", - 0 - ] - } - } - }, - "move": { - "loop": true, - "bones": { - "leftarm": {"rotation": ["variable.tcos0", 0, 0]}, - "leftleg": {"rotation": ["variable.tcos0 * -1.4", 0, 0]}, - "rightarm": {"rotation": ["-variable.tcos0", 0, 0]}, - "rightleg": {"rotation": ["variable.tcos0 * 1.4", 0, 0]} - } - }, - "riding.arms": { - "loop": true, - "bones": { - "leftarm": {"rotation": [-36, 0, 0]}, - "rightarm": {"rotation": [-36, 0, 0]} - } - }, - "riding.legs": { - "loop": true, - "bones": { - "leftleg": {"rotation": ["-72.0 - this", "-18.0 - this", "-this"]}, - "rightleg": {"rotation": ["-72.0 - this", "18.0 - this", "-this"]} - } - }, - "holding": { - "loop": true, - "bones": { - "leftarm": { - "rotation": [ - "variable.is_holding_left ? (-this * 0.5 - 18.0) : 0.0", - 0, - 0 - ] - }, - "rightarm": { - "rotation": [ - "variable.is_holding_right ? (-this * 0.5 - 18.0) : 0.0", - 0, - 0 - ] - } - } - }, - "brandish_spear": { - "loop": true, - "bones": { - "rightarm": { - "rotation": [ - "this * -0.5 - 157.5 - 22.5 * variable.charge_amount", - "-this", - 0 - ] - } - } - }, - "charging": { - "loop": true, - "bones": { - "rightarm": { - "rotation": ["22.5 * variable.charge_amount - this", "-this", 0] - } - } - }, - "attack.rotations": { - "loop": true, - "bones": { - "body": { - "rotation": [ - 0, - "math.sin(math.sqrt(variable.attack_time) * 360) * 11.46 - this", - 0 - ] - }, - "leftarm": { - "rotation": [ - "math.sin(math.sqrt(variable.attack_time) * 360) * 11.46", - 0, - 0 - ] - }, - "rightarm": { - "rotation": [ - "math.sin(1.0 - math.pow(1.0 - variable.attack_time, 3.0) * 180.0) * (variable.is_brandishing_spear ? -1.0 : 1.0 )", - "variable.is_brandishing_spear ? 0.0 : (math.sin(math.sqrt(variable.attack_time) * 360) * 11.46) * 2.0", - 0 - ] - } - } - }, - "sneaking": { - "loop": true, - "bones": { - "body": {"rotation": ["0.5 - this", 0, 0]}, - "head": {"position": [0, 1, 0]}, - "leftarm": {"rotation": [72, 0, 0]}, - "leftleg": {"position": [0, -3, 4]}, - "rightarm": {"rotation": [72, 0, 0]}, - "rightleg": {"position": [0, -3, 4]} - } - }, - "bob": { - "loop": true, - "bones": { - "leftarm": { - "rotation": [ - 0, - 0, - "((math.cos(query.life_time * 103.2) * 2.865) + 2.865) *-1.0" - ] - }, - "rightarm": { - "rotation": [ - 0, - 0, - "(math.cos(query.life_time * 103.2) * 2.865) + 2.865" - ] - } - } - }, - "damage_nearby_mobs": { - "loop": true, - "bones": { - "leftarm": {"rotation": ["-45.0-this", "-this", "-this"]}, - "leftleg": {"rotation": ["45.0-this", "-this", "-this"]}, - "rightarm": {"rotation": ["45.0-this", "-this", "-this"]}, - "rightleg": {"rotation": ["-45.0-this", "-this", "-this"]} - } - }, - "bow_and_arrow": { - "loop": true, - "bones": { - "leftarm": { - "rotation": [ - "query.target_x_rotation - 90.0 - math.sin(query.life_time * 76.8) * 2.865 - this", - "query.target_y_rotation + 28.65", - "-(math.cos(query.life_time * 103.2) * 2.865) - 2.865" - ] - }, - "rightarm": { - "rotation": [ - "query.target_x_rotation - 90.0 + math.sin(query.life_time * 76.8) * 2.865 - this", - "query.target_y_rotation - 5.73", - "(math.cos(query.life_time * 103.2) * 2.865) + 2.865" - ] - } - } - }, - "use_item_progress": { - "loop": true, - "bones": { - "rightarm": { - "rotation": [ - "variable.use_item_startup_progress * -60.0 + variable.use_item_interval_progress * 11.25", - "variable.use_item_startup_progress * -22.5 + variable.use_item_interval_progress * 11.25", - "variable.use_item_startup_progress * -5.625 + variable.use_item_interval_progress * 11.25" - ] - } - } - }, - "zombie_attack_bare_hand": { - "loop": true, - "bones": { - "leftarm": { - "rotation": [ - "-90.0 - ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4) - (math.sin(query.life_time * 76.776372) * 2.865) - this", - "5.73 - ((math.sin(variable.attack_time * 180.0) * 57.3) * 0.6) - this", - "math.cos(query.life_time * 103.13244) * -2.865 - 2.865 - this" - ] - }, - "rightarm": { - "rotation": [ - "90.0 * (variable.is_brandishing_spear - 1.0) - ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4) + (math.sin(query.life_time * 76.776372) * 2.865) - this", - "(math.sin(variable.attack_time * 180.0) * 57.3) * 0.6 - 5.73 - this", - "math.cos(query.life_time * 103.13244) * 2.865 + 2.865 - this" - ] - } - } - }, - "swimming": { - "loop": true, - "bones": { - "body": { - "position": [ - 0, - "variable.swim_amount * -10.0 - this", - "variable.swim_amount * 9.0 - this" - ], - "rotation": [ - "variable.swim_amount * (90.0 + query.target_x_rotation)", - 0, - 0 - ] - }, - "leftarm": { - "rotation": [ - "math.lerp(this, -180.0, variable.swim_amount) - (variable.swim_amount * ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4)) - (variable.swim_amount * (math.sin(query.life_time * 76.776372) * 2.865)) - this", - "math.lerp(this, 14.325, variable.swim_amount) - this", - "math.lerp(this, 14.325, variable.swim_amount) - (variable.swim_amount * (math.cos(query.life_time * 103.13244) * 2.865 + 2.865)) - this" - ] - }, - "leftleg": { - "rotation": [ - "math.lerp(this, math.cos(query.life_time * 390.0 + 180.0) * 0.3, variable.swim_amount)", - 0, - 0 - ] - }, - "rightarm": { - "rotation": [ - "math.lerp(this, -180.0, variable.swim_amount) - (variable.swim_amount * ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4)) + (variable.swim_amount * (math.sin(query.life_time * 76.776372) * 2.865)) - this", - "math.lerp(this, 14.325, variable.swim_amount) - this", - "math.lerp(this, -14.325, variable.swim_amount) + (variable.swim_amount * (math.cos(query.life_time * 103.13244) * 2.865 + 2.865)) - this" - ] - }, - "rightleg": { - "rotation": [ - "math.lerp(this, math.cos(query.life_time * 390.0) * 0.3, variable.swim_amount)", - 0, - 0 - ] - } - } - } - }, - "animation_controllers": { - "humanoid_baby_big_head": { - "initial_state": "default", - "states": { - "baby": { - "animations": ["humanoid_big_head"], - "transitions": [{"default": "!query.is_baby"}] - }, - "default": {"transitions": [{"baby": "query.is_baby"}]} - } - }, - "look_at_target": { - "initial_state": "default", - "states": { - "default": { - "animations": ["look_at_target_default"], - "transitions": [ - {"gliding": "query.is_gliding"}, - {"swimming": "query.is_swimming"} - ] - }, - "gliding": { - "animations": ["look_at_target_gliding"], - "transitions": [ - {"swimming": "query.is_swimming"}, - {"default": "!query.is_gliding"} - ] - }, - "swimming": { - "animations": ["look_at_target_swimming"], - "transitions": [ - {"gliding": "query.is_gliding"}, - {"default": "!query.is_swimming"} - ] - } - } - }, - "move": { - "initial_state": "default", - "states": {"default": {"animations": ["move"]}} - }, - "riding": { - "initial_state": "default", - "states": { - "default": {"transitions": [{"riding": "query.is_riding"}]}, - "riding": { - "animations": ["riding.arms", "riding.legs"], - "transitions": [{"default": "!query.is_riding"}] - } - } - }, - "holding": { - "initial_state": "default", - "states": {"default": {"animations": ["holding"]}} - }, - "brandish_spear": { - "initial_state": "default", - "states": { - "brandish_spear": { - "animations": ["brandish_spear"], - "transitions": [{"default": "!variable.is_brandishing_spear"}] - }, - "default": { - "transitions": [{"brandish_spear": "variable.is_brandishing_spear"}] - } - } - }, - "charging": { - "initial_state": "default", - "states": { - "charging": { - "animations": ["charging"], - "transitions": [{"default": "!query.is_charging"}] - }, - "default": {"transitions": [{"charging": "query.is_charging"}]} - } - }, - "attack": { - "initial_state": "default", - "states": { - "attacking": { - "animations": ["attack.rotations"], - "transitions": [{"default": "variable.attack_time < 0.0"}] - }, - "default": { - "transitions": [{"attacking": "variable.attack_time >= 0.0"}] - } - } - }, - "sneaking": { - "initial_state": "default", - "states": { - "default": {"transitions": [{"sneaking": "query.is_sneaking"}]}, - "sneaking": { - "animations": ["sneaking"], - "transitions": [{"default": "!query.is_sneaking"}] - } - } - }, - "bob": { - "initial_state": "default", - "states": {"default": {"animations": ["bob"]}} - }, - "damage_nearby_mobs": { - "initial_state": "default", - "states": { - "damage_nearby_mobs": { - "animations": ["damage_nearby_mobs"], - "transitions": [{"default": "!variable.damage_nearby_mobs"}] - }, - "default": { - "transitions": [ - {"damage_nearby_mobs": "variable.damage_nearby_mobs"} - ] - } - } - }, - "bow_and_arrow": { - "initial_state": "default", - "states": { - "bow_and_arrow": { - "animations": ["bow_and_arrow"], - "transitions": [{"default": "!query.has_target"}] - }, - "default": {"transitions": [{"bow_and_arrow": "query.has_target"}]} - } - }, - "use_item_progress": { - "initial_state": "default", - "states": { - "default": { - "transitions": [ - { - "use_item_progress": "( variable.use_item_interval_progress > 0.0 ) || ( variable.use_item_startup_progress > 0.0 )" - } - ] - }, - "use_item_progress": { - "animations": ["use_item_progress"], - "transitions": [ - { - "default": "( variable.use_item_interval_progress <= 0.0 ) && ( variable.use_item_startup_progress <= 0.0 )" - } - ] - } - } - }, - "zombie_attack_bare_hand": { - "initial_state": "default", - "states": { - "default": { - "transitions": [{"is_bare_hand": "variable.is_holding_left != 1.0"}] - }, - "is_bare_hand": { - "animations": ["zombie_attack_bare_hand"], - "transitions": [{"default": "variable.is_holding_left == 1.0"}] - } - } - }, - "swimming": { - "initial_state": "default", - "states": { - "default": { - "transitions": [{"is_swimming": "variable.swim_amount > 0.0"}] - }, - "is_swimming": { - "animations": ["swimming"], - "transitions": [{"default": "variable.swim_amount <= 0.0"}] - } - } - } - }, - "render_controllers": ["controller.render.husk"], - "enable_attachables": true, - "spawn_egg": {"texture": "spawn_egg", "texture_index": 28} - }, - "iron_golem": { - "identifier": "minecraft:iron_golem", - "materials": {"default": "iron_golem"}, - "textures": {"default": "textures/entity/iron_golem/iron_golem"}, - "geometry": { - "default": { - "visible_bounds_width": 3, - "visible_bounds_height": 3, - "visible_bounds_offset": [0, 1.5, 0], - "texturewidth": 128, - "textureheight": 128, - "bones": [ - { - "name": "body", - "pivot": [0, 31, 0], - "cubes": [ - {"origin": [-9, 21, -6], "size": [18, 12, 11], "uv": [0, 40]}, - { - "origin": [-4.5, 16, -3], - "size": [9, 5, 6], - "uv": [0, 70], - "inflate": 0.5 - } - ] - }, - { - "name": "head", - "parent": "body", - "pivot": [0, 31, -2], - "locators": {"lead": [0, 31, -2]}, - "cubes": [ - {"origin": [-4, 33, -7.5], "size": [8, 10, 8], "uv": [0, 0]}, - {"origin": [-1, 32, -9.5], "size": [2, 4, 2], "uv": [24, 0]} - ] - }, - { - "name": "arm0", - "parent": "body", - "pivot": [0, 31, 0], - "cubes": [ - {"origin": [-13, 3.5, -3], "size": [4, 30, 6], "uv": [60, 21]} - ] - }, - { - "name": "arm1", - "parent": "body", - "pivot": [0, 31, 0], - "cubes": [ - {"origin": [9, 3.5, -3], "size": [4, 30, 6], "uv": [60, 58]} - ] - }, - { - "name": "leg0", - "parent": "body", - "pivot": [-4, 13, 0], - "cubes": [ - {"origin": [-7.5, 0, -3], "size": [6, 16, 5], "uv": [37, 0]} - ] - }, - { - "name": "leg1", - "parent": "body", - "mirror": true, - "pivot": [5, 13, 0], - "cubes": [ - {"origin": [1.5, 0, -3], "size": [6, 16, 5], "uv": [60, 0]} - ] - } - ] - } - }, - "render_controllers": ["controller.render.iron_golem"] - }, - "item_frame": { - "identifier": "minecraft:item_frame", - "materials": {"default": "item_frame"}, - "textures": { - "background": "block:item_frame", - "frame": "block:oak_planks" - }, - "geometry": { - "background": { - "bones": [ - { - "name": "base" - }, - { - "name": "background", - "parent": "base", - "rotation": [0, 180, 0], - "pivot": [0, 0, 0], - "cubes": [ - {"origin": [-5, -5, -8], "size": [10, 10, 0.5], "uv": [3, 3]} - ] - } - ], - "texturewidth": 16, - "textureheight": 16 - }, - "frame": { - "bones": [ - { - "name": "frame", - "parent": "base", - "rotation": [0, 180, 0], - "pivot": [0, 0, 0], - "cubes": [ - {"origin": [-6, -6, -8], "size": [12, 1, 1], "uv": [2, 2]}, - {"origin": [-6, 5, -8], "size": [12, 1, 1], "uv": [2, 13]}, - {"origin": [-6, -5, -8], "size": [1, 10, 1], "uv": [2, 3]}, - {"origin": [5, -5, -8], "size": [1, 10, 1], "uv": [13, 3]} - ] - } - ], - "texturewidth": 16, - "textureheight": 16 - } - }, - "render_controllers": ["controller.render.item_frame"] - }, - "leash_knot": { - "identifier": "minecraft:leash_knot", - "materials": {"default": "leash_knot"}, - "textures": {"default": "textures/entity/lead_knot"}, - "geometry": { - "default": { - "bones": [ - { - "name": "knot", - "rotation": [0, 180, 0], - "cubes": [{"origin": [5, 6, 5], "size": [6, 8, 6], "uv": [0, 0]}] - } - ], - "texturewidth": 32, - "textureheight": 32 - } - }, - "render_controllers": ["controller.render.leash_knot"] - }, - "llama_spit": { - "identifier": "minecraft:llama_spit", - "materials": {"default": "llama_spit"}, - "textures": {"default": "textures/entity/llama/spit"}, - "geometry": { - "default": { - "visible_bounds_width": 1, - "visible_bounds_height": 1, - "visible_bounds_offset": [0, 0.5, 0], - "texturewidth": 64, - "textureheight": 64, - "bones": [ - { - "name": "body", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 22, 0], "size": [2, 2, 2], "uv": [0, 0]}, - {"origin": [0, 26, 0], "size": [2, 2, 2], "uv": [0, 0]}, - {"origin": [0, 22, -4], "size": [2, 2, 2], "uv": [0, 0]}, - {"origin": [0, 22, 0], "size": [2, 2, 2], "uv": [0, 0]}, - {"origin": [2, 22, 0], "size": [2, 2, 2], "uv": [0, 0]}, - {"origin": [0, 20, 0], "size": [2, 2, 2], "uv": [0, 0]}, - {"origin": [0, 22, 2], "size": [2, 2, 2], "uv": [0, 0]} - ] - } - ] - } - }, - "render_controllers": ["controller.render.llama_spit"] - }, - "magma_cube": { - "identifier": "minecraft:magma_cube", - "materials": {"default": "magma_cube"}, - "textures": {"default": "textures/entity/slime/magmacube"}, - "geometry": { - "default": { - "visible_bounds_width": 2.5, - "visible_bounds_height": 5, - "visible_bounds_offset": [0, 2.5, 0], - "texturewidth": 64, - "textureheight": 32, - "bones": [ - { - "name": "bodyCube_0", - "parent": "insideCube", - "pivot": [0, 24, 0], - "cubes": [{"origin": [-4, 7, -4], "size": [8, 1, 8], "uv": [0, 0]}] - }, - { - "name": "bodyCube_1", - "parent": "insideCube", - "pivot": [0, 24, 0], - "cubes": [{"origin": [-4, 6, -4], "size": [8, 1, 8], "uv": [0, 1]}] - }, - { - "name": "bodyCube_2", - "parent": "insideCube", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 5, -4], "size": [8, 1, 8], "uv": [24, 10]} - ] - }, - { - "name": "bodyCube_3", - "parent": "insideCube", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 4, -4], "size": [8, 1, 8], "uv": [24, 19]} - ] - }, - { - "name": "bodyCube_4", - "parent": "insideCube", - "pivot": [0, 24, 0], - "cubes": [{"origin": [-4, 3, -4], "size": [8, 1, 8], "uv": [0, 4]}] - }, - { - "name": "bodyCube_5", - "parent": "insideCube", - "pivot": [0, 24, 0], - "cubes": [{"origin": [-4, 2, -4], "size": [8, 1, 8], "uv": [0, 5]}] - }, - { - "name": "bodyCube_6", - "parent": "insideCube", - "pivot": [0, 24, 0], - "cubes": [{"origin": [-4, 1, -4], "size": [8, 1, 8], "uv": [0, 6]}] - }, - { - "name": "bodyCube_7", - "parent": "insideCube", - "pivot": [0, 24, 0], - "cubes": [{"origin": [-4, 0, -4], "size": [8, 1, 8], "uv": [0, 7]}] - }, - { - "name": "insideCube", - "pivot": [0, 0, 0], - "cubes": [{"origin": [-2, 2, -2], "size": [4, 4, 4], "uv": [0, 16]}] - } - ] - } - }, - "render_controllers": ["controller.render.magma_cube"], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 20} - }, - "mooshroom": { - "identifier": "minecraft:mooshroom", - "min_engine_version": "1.8.0", - "materials": {"default": "mooshroom"}, - "textures": { - "default": "textures/entity/cow/red_mooshroom", - "brown": "textures/entity/cow/brown_mooshroom" - }, - "geometry": { - "default": { - "visible_bounds_width": 2, - "visible_bounds_height": 2, - "visible_bounds_offset": [0, 1, 0], - "texturewidth": 64, - "textureheight": 32, - "bones": [ - { - "name": "body", - "pivot": [0, 19, 2], - "bind_pose_rotation": [90, 0, 0], - "cubes": [ - {"origin": [-6, 11, -5], "size": [12, 18, 10], "uv": [18, 4]}, - {"origin": [-2, 11, -6], "size": [4, 6, 1], "uv": [52, 0]} - ] - }, - { - "name": "head", - "pivot": [0, 20, -8], - "locators": {"lead": [0, 20, -8]}, - "cubes": [ - {"origin": [-4, 16, -14], "size": [8, 8, 6], "uv": [0, 0]}, - {"origin": [-5, 22, -12], "size": [1, 3, 1], "uv": [22, 0]}, - {"origin": [4, 22, -12], "size": [1, 3, 1], "uv": [22, 0]} - ] - }, - { - "name": "leg0", - "parent": "body", - "pivot": [-4, 12, 7], - "cubes": [{"origin": [-6, 0, 5], "size": [4, 12, 4], "uv": [0, 16]}] - }, - { - "name": "leg1", - "parent": "body", - "mirror": true, - "pivot": [4, 12, 7], - "cubes": [{"origin": [2, 0, 5], "size": [4, 12, 4], "uv": [0, 16]}] - }, - { - "name": "leg2", - "parent": "body", - "pivot": [-4, 12, -6], - "cubes": [ - {"origin": [-6, 0, -7], "size": [4, 12, 4], "uv": [0, 16]} - ] - }, - { - "name": "leg3", - "parent": "body", - "mirror": true, - "pivot": [4, 12, -6], - "cubes": [{"origin": [2, 0, -7], "size": [4, 12, 4], "uv": [0, 16]}] - } - ] - } - }, - "render_controllers": ["controller.render.mooshroom"], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 5} - }, - "panda": { - "identifier": "minecraft:panda", - "materials": {"default": "panda"}, - "textures": { - "default": "textures/entity/panda/panda", - "lazy": "textures/entity/panda/lazy_panda", - "worried": "textures/entity/panda/worried_panda", - "playful": "textures/entity/panda/playful_panda", - "brown": "textures/entity/panda/brown_panda", - "weak": "textures/entity/panda/weak_panda", - "aggressive": "textures/entity/panda/aggressive_panda" - }, - "geometry": { - "default": { - "texturewidth": 64, - "textureheight": 64, - "bones": [ - { - "name": "head", - "parent": "body", - "pivot": [0, 12.5, -17], - "locators": {"lead": [0, 14, -16]}, - "cubes": [ - {"origin": [-6.5, 7.5, -21], "size": [13, 10, 9], "uv": [0, 6]}, - {"origin": [-3.5, 7.5, -23], "size": [7, 5, 2], "uv": [45, 16]}, - {"origin": [-8.5, 16.5, -18], "size": [5, 4, 1], "uv": [52, 25]}, - {"origin": [3.5, 16.5, -18], "size": [5, 4, 1], "uv": [52, 25]} - ] - }, - { - "name": "body", - "pivot": [0, 14, 0], - "bind_pose_rotation": [90, 0, 0], - "cubes": [ - {"origin": [-9.5, 1, -6.5], "size": [19, 26, 13], "uv": [0, 25]} - ] - }, - { - "name": "leg0", - "parent": "body", - "pivot": [-5.5, 9, 9], - "cubes": [ - {"origin": [-8.5, 0, 6], "size": [6, 9, 6], "uv": [40, 0]} - ] - }, - { - "name": "leg1", - "parent": "body", - "pivot": [5.5, 9, 9], - "cubes": [{"origin": [2.5, 0, 6], "size": [6, 9, 6], "uv": [40, 0]}] - }, - { - "name": "leg2", - "parent": "body", - "pivot": [-5.5, 9, -9], - "cubes": [ - {"origin": [-8.5, 0, -12], "size": [6, 9, 6], "uv": [40, 0]} - ] - }, - { - "name": "leg3", - "parent": "body", - "pivot": [5.5, 9, -9], - "cubes": [ - {"origin": [2.5, 0, -12], "size": [6, 9, 6], "uv": [40, 0]} - ] - } - ] - } - }, - "render_controllers": ["controller.render.panda"], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 54} - }, - "phantom": { - "identifier": "minecraft:phantom", - "materials": {"default": "phantom", "invisible": "phantom_invisible"}, - "textures": {"default": "textures/entity/phantom"}, - "geometry": { - "default": { - "texturewidth": 64, - "textureheight": 64, - "bones": [ - { - "name": "body", - "pivot": [0, 24, 0], - "bind_pose_rotation": [0, 0, 0], - "cubes": [{"origin": [-3, 23, -8], "size": [5, 3, 9], "uv": [0, 8]}] - }, - { - "name": "wing0", - "pivot": [2, 26, -8], - "bind_pose_rotation": [0, 0, 5.7], - "cubes": [ - {"origin": [2, 24, -8], "size": [6, 2, 9], "uv": [23, 12]} - ], - "parent": "body" - }, - { - "name": "wingtip0", - "pivot": [8, 26, -8], - "bind_pose_rotation": [0, 0, 5.7], - "locators": {"left_wing": [21, 26, 0]}, - "cubes": [ - {"origin": [8, 25, -8], "size": [13, 1, 9], "uv": [16, 24]} - ], - "parent": "wing0" - }, - { - "name": "wing1", - "pivot": [-3, 26, -8], - "bind_pose_rotation": [0, 0, -5.7], - "mirror": true, - "cubes": [ - {"origin": [-9, 24, -8], "size": [6, 2, 9], "uv": [23, 12]} - ], - "parent": "body" - }, - { - "name": "wingtip1", - "pivot": [-9, 24, -8], - "bind_pose_rotation": [0, 0, -5.7], - "locators": {"right_wing": [-22, 24, 0]}, - "mirror": true, - "cubes": [ - {"origin": [-22, 25, -8], "size": [13, 1, 9], "uv": [16, 24]} - ], - "parent": "wing1" - }, - { - "name": "head", - "pivot": [0, 23, -7], - "bind_pose_rotation": [11.5, 0, 0], - "cubes": [ - {"origin": [-4, 22, -12], "size": [7, 3, 5], "uv": [0, 0]} - ], - "parent": "body" - }, - { - "name": "tail", - "pivot": [0, 26, 1], - "bind_pose_rotation": [0, 0, 0], - "cubes": [ - {"origin": [-2, 24, 1], "size": [3, 2, 6], "uv": [3, 20]} - ], - "parent": "body" - }, - { - "name": "tailtip", - "pivot": [0, 25.5, 7], - "bind_pose_rotation": [0, 0, 0], - "cubes": [ - {"origin": [-1, 24.5, 7], "size": [1, 1, 6], "uv": [4, 29]} - ], - "parent": "tail" - } - ] - } - }, - "particle_effects": {"wing_dust": "minecraft:phantom_trail_particle"}, - "sound_effects": {"flap": "mob.phantom.flap"}, - "render_controllers": ["controller.render.phantom"], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 51} - }, - "pig": { - "identifier": "minecraft:pig", - "min_engine_version": "1.8.0", - "materials": {"default": "pig"}, - "textures": { - "default": "textures/entity/pig/pig", - "saddled": "textures/entity/pig/pig_saddle" - }, - "geometry": { - "default": { - "visible_bounds_width": 2, - "visible_bounds_height": 1.5, - "visible_bounds_offset": [0, 0.5, 0], - "texturewidth": 64, - "textureheight": 32, - "bones": [ - { - "name": "body", - "pivot": [0, 13, 2], - "bind_pose_rotation": [90, 0, 0], - "cubes": [ - {"origin": [-5, 7, -5], "size": [10, 16, 8], "uv": [28, 8]} - ] - }, - { - "name": "head", - "parent": "body", - "pivot": [0, 12, -6], - "locators": {"lead": [0, 14, -6]}, - "cubes": [ - {"origin": [-4, 8, -14], "size": [8, 8, 8], "uv": [0, 0]}, - {"origin": [-2, 9, -15], "size": [4, 3, 1], "uv": [16, 16]} - ] - }, - { - "name": "leg0", - "parent": "body", - "pivot": [-3, 6, 7], - "cubes": [{"origin": [-5, 0, 5], "size": [4, 6, 4], "uv": [0, 16]}] - }, - { - "name": "leg1", - "parent": "body", - "mirror": true, - "pivot": [3, 6, 7], - "cubes": [{"origin": [1, 0, 5], "size": [4, 6, 4], "uv": [0, 16]}] - }, - { - "name": "leg2", - "parent": "body", - "pivot": [-3, 6, -5], - "cubes": [{"origin": [-5, 0, -7], "size": [4, 6, 4], "uv": [0, 16]}] - }, - { - "name": "leg3", - "parent": "body", - "mirror": true, - "pivot": [3, 6, -5], - "cubes": [{"origin": [1, 0, -7], "size": [4, 6, 4], "uv": [0, 16]}] - } - ] - } - }, - "render_controllers": ["controller.render.pig"], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 2} - }, - "piglin_brute": { - "identifier": "minecraft:piglin_brute", - "materials": {"default": "piglin_brute"}, - "textures": {"default": "textures/entity/piglin/piglin_brute"}, - "geometry": { - "default": { - "bones": [ - { - "name": "body", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]}, - { - "origin": [-4, 12, -2], - "size": [8, 12, 4], - "uv": [16, 32], - "inflate": 0.25 - } - ] - }, - { - "name": "head", - "parent": "body", - "pivot": [0, 24, 0], - "cubes": [ - { - "origin": [-5, 24, -4], - "size": [10, 8, 8], - "uv": [0, 0], - "inflate": -0.02 - }, - {"origin": [-2, 24, -5], "size": [4, 4, 1], "uv": [31, 1]}, - {"origin": [2, 24, -5], "size": [1, 2, 1], "uv": [2, 4]}, - {"origin": [-3, 24, -5], "size": [1, 2, 1], "uv": [2, 0]} - ], - "inflate": -0.02 - }, - { - "name": "leftear", - "parent": "head", - "pivot": [5, 30, 0], - "rotation": [0, 0, -30], - "cubes": [{"origin": [4, 25, -2], "size": [1, 5, 4], "uv": [51, 6]}] - }, - { - "name": "rightear", - "parent": "head", - "pivot": [-5, 30, 0], - "rotation": [0, 0, 30], - "cubes": [ - {"origin": [-5, 25, -2], "size": [1, 5, 4], "uv": [39, 6]} - ] - }, - {"name": "hat", "parent": "head", "pivot": [0, 24, 0]}, - { - "name": "rightarm", - "parent": "body", - "pivot": [-5, 22, 0], - "cubes": [ - {"origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 16]}, - { - "origin": [-8, 12, -2], - "size": [4, 12, 4], - "uv": [40, 32], - "inflate": 0.25 - } - ] - }, - {"name": "rightItem", "parent": "rightarm", "pivot": [-1, -45, -5]}, - { - "name": "leftarm", - "parent": "body", - "pivot": [5, 22, 0], - "cubes": [ - {"origin": [4, 12, -2], "size": [4, 12, 4], "uv": [32, 48]}, - { - "origin": [4, 12, -2], - "size": [4, 12, 4], - "uv": [48, 48], - "inflate": 0.25 - } - ] - }, - {"name": "leftItem", "parent": "leftArm", "pivot": [1, -45, -5]}, - { - "name": "rightleg", - "parent": "body", - "pivot": [-1.9, 12, 0], - "cubes": [ - {"origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 16]}, - { - "origin": [-4, 0, -2], - "size": [4, 12, 4], - "uv": [0, 32], - "inflate": 0.25 - } - ] - }, - { - "name": "leftleg", - "parent": "body", - "pivot": [1.9, 12, 0], - "cubes": [ - {"origin": [0, 0, -2], "size": [4, 12, 4], "uv": [16, 48]}, - { - "origin": [0, 0, -2], - "size": [4, 12, 4], - "uv": [0, 48], - "inflate": 0.25 - } - ] - } - ], - "visible_bounds_width": 2, - "visible_bounds_height": 2, - "visible_bounds_offset": [0, 1, 0], - "texturewidth": 64, - "textureheight": 64 - } - }, - "spawn_egg": {"base_color": "#592A10", "overlay_color": "#F9F3A4"}, - "render_controllers": ["controller.render.piglin_brute"], - "enable_attachables": true - }, - "polar_bear": { - "identifier": "minecraft:polar_bear", - "materials": {"default": "polar_bear"}, - "textures": {"default": "textures/entity/bear/polarbear"}, - "geometry": { - "default": { - "visible_bounds_width": 3, - "visible_bounds_height": 2, - "visible_bounds_offset": [0, 0.5, 0], - "texturewidth": 128, - "textureheight": 64, - "bones": [ - { - "name": "head", - "parent": "body", - "pivot": [0, 14, -16], - "locators": {"lead": [0, 14, -16]}, - "mirror": true, - "cubes": [ - { - "mirror": false, - "origin": [-3.5, 10, -19], - "size": [7, 7, 7], - "uv": [0, 0] - }, - { - "mirror": false, - "origin": [-2.5, 10, -22], - "size": [5, 3, 3], - "uv": [0, 44] - }, - { - "mirror": false, - "origin": [-4.5, 16, -17], - "size": [2, 2, 1], - "uv": [26, 0] - }, - {"origin": [2.5, 16, -17], "size": [2, 2, 1], "uv": [26, 0]} - ] - }, - { - "name": "body", - "pivot": [-2, 15, 12], - "bind_pose_rotation": [90, 0, 0], - "cubes": [ - {"origin": [-7, 14, 5], "size": [14, 14, 11], "uv": [0, 19]}, - {"origin": [-6, 28, 5], "size": [12, 12, 10], "uv": [39, 0]} - ] - }, - { - "name": "leg0", - "parent": "body", - "pivot": [-4.5, 10, 6], - "cubes": [ - {"origin": [-6.5, 0, 4], "size": [4, 10, 8], "uv": [50, 22]} - ] - }, - { - "name": "leg1", - "parent": "body", - "pivot": [4.5, 10, 6], - "cubes": [ - {"origin": [2.5, 0, 4], "size": [4, 10, 8], "uv": [50, 22]} - ] - }, - { - "name": "leg2", - "parent": "body", - "pivot": [-3.5, 10, -8], - "cubes": [ - {"origin": [-5.5, 0, -10], "size": [4, 10, 6], "uv": [50, 40]} - ] - }, - { - "name": "leg3", - "parent": "body", - "pivot": [3.5, 10, -8], - "cubes": [ - {"origin": [1.5, 0, -10], "size": [4, 10, 6], "uv": [50, 40]} - ] - } - ] - } - }, - "render_controllers": ["controller.render.polarbear"], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 37} - }, - "pufferfish": { - "identifier": "minecraft:pufferfish", - "min_engine_version": "1.8.0", - "materials": {"default": "pufferfish"}, - "textures": {"default": "textures/entity/fish/pufferfish"}, - "geometry": { - "default": { - "visible_bounds_width": 0.5, - "visible_bounds_height": 0.5, - "texturewidth": 32, - "textureheight": 32, - "bones": [ - { - "name": "body", - "cubes": [ - {"origin": [-1.5, 0, -1.5], "size": [3, 2, 3], "uv": [0, 27]}, - {"origin": [0.5, 2, -1.5], "size": [1, 1, 1], "uv": [24, 6]}, - {"origin": [-1.5, 2, -1.5], "size": [1, 1, 1], "uv": [28, 6]} - ], - "locators": {"lead": [0, 0, 0]} - }, - { - "name": "tailfin", - "parent": "body", - "cubes": [ - {"origin": [-1.5, 1, 1.5], "size": [3, 0, 3], "uv": [-3, 0]} - ] - }, - { - "name": "leftFin", - "parent": "body", - "pivot": [6.5, 5, 0.5], - "cubes": [ - { - "origin": [1.5, 0, -1.5], - "size": [1, 1, 2], - "uv": [25, 0], - "mirror": true - } - ] - }, - { - "name": "rightFin", - "parent": "body", - "pivot": [-6.5, 5, 0.5], - "cubes": [ - {"origin": [-2.5, 0, -1.5], "size": [1, 1, 2], "uv": [25, 0]} - ] - } - ] - }, - "mid": { - "visible_bounds_width": 0.5, - "visible_bounds_height": 0.5, - "texturewidth": 32, - "textureheight": 32, - "bones": [ - { - "name": "body", - "cubes": [ - {"origin": [-2.5, 1, -2.5], "size": [5, 5, 5], "uv": [12, 22]} - ] - }, - { - "name": "leftFin", - "parent": "body", - "pivot": [2.5, 5, 0.5], - "cubes": [ - {"origin": [2.5, 4, -1.5], "size": [2, 1, 2], "uv": [24, 3]} - ] - }, - { - "name": "rightFin", - "parent": "body", - "pivot": [-2.5, 5, 0.5], - "cubes": [ - {"origin": [-4.5, 4, -1.5], "size": [2, 1, 2], "uv": [24, 0]} - ] - }, - { - "name": "spines_top_front", - "parent": "body", - "bind_pose_rotation": [45, 0, 0], - "pivot": [0, 6, -2.5], - "cubes": [ - {"origin": [-2.5, 6, -2.5], "size": [5, 1, 0], "uv": [19, 17]} - ] - }, - { - "name": "spines_top_back", - "parent": "body", - "bind_pose_rotation": [-45, 0, 0], - "pivot": [0, 6, 2.5], - "cubes": [ - {"origin": [-2.5, 6, 2.5], "size": [5, 1, 0], "uv": [11, 17]} - ] - }, - { - "name": "spines_bottom_front", - "parent": "body", - "bind_pose_rotation": [-45, 0, 0], - "pivot": [0, 1, -2.5], - "cubes": [ - {"origin": [-2.5, 0, -2.5], "size": [5, 1, 0], "uv": [18, 20]} - ] - }, - { - "name": "spines_bottom_back", - "parent": "body", - "bind_pose_rotation": [45, 0, 0], - "pivot": [0, 1, 2.5], - "rotation": [45, 0, 0], - "cubes": [ - {"origin": [-2.5, 0, 2.5], "size": [5, 1, 0], "uv": [18, 20]} - ] - }, - { - "name": "spines_left_front", - "parent": "body", - "bind_pose_rotation": [0, 45, 0], - "pivot": [2.5, 0, -2.5], - "rotation": [0, 45, 0], - "cubes": [ - {"origin": [2.5, 1, -2.5], "size": [1, 5, 0], "uv": [1, 17]} - ] - }, - { - "name": "spines_left_back", - "parent": "body", - "bind_pose_rotation": [0, -45, 0], - "pivot": [2.5, 0, 2.5], - "rotation": [0, -45, 0], - "cubes": [ - {"origin": [2.5, 1, 2.5], "size": [1, 5, 0], "uv": [1, 17]} - ] - }, - { - "name": "spines_right_front", - "parent": "body", - "bind_pose_rotation": [0, -45, 0], - "pivot": [-2.5, 0, -2.5], - "rotation": [0, -45, 0], - "cubes": [ - {"origin": [-3.5, 1, -2.5], "size": [1, 5, 0], "uv": [5, 17]} - ] - }, - { - "name": "spines_right_back", - "parent": "body", - "bind_pose_rotation": [0, 45, 0], - "pivot": [-2.5, 0, 2.5], - "rotation": [0, 45, 0], - "cubes": [ - {"origin": [-3.5, 1, 2.5], "size": [1, 5, 0], "uv": [9, 17]} - ] - } - ] - }, - "large": { - "visible_bounds_width": 0.5, - "visible_bounds_height": 0.5, - "texturewidth": 32, - "textureheight": 32, - "bones": [ - { - "name": "body", - "cubes": [{"origin": [-4, 0, -4], "size": [8, 8, 8], "uv": [0, 0]}] - }, - { - "name": "leftFin", - "parent": "body", - "pivot": [4, 7, 1], - "cubes": [ - {"origin": [4, 6, -2.9904], "size": [2, 1, 2], "uv": [24, 3]} - ] - }, - { - "name": "rightFin", - "parent": "body", - "pivot": [-4, 7, 1], - "cubes": [ - {"origin": [-5.9968, 6, -2.992], "size": [2, 1, 2], "uv": [24, 0]} - ] - }, - { - "name": "spines_top_front", - "parent": "body", - "pivot": [-4, 8, -4], - "bind_pose_rotation": [45, 0, 0], - "cubes": [ - {"origin": [-4, 8, -4], "size": [8, 1, 1], "uv": [14, 16]} - ] - }, - { - "name": "spines_top_mid", - "parent": "body", - "pivot": [0, 8, 0], - "cubes": [{"origin": [-4, 8, 0], "size": [8, 1, 1], "uv": [14, 16]}] - }, - { - "name": "spines_top_back", - "parent": "body", - "pivot": [0, 8, 4], - "bind_pose_rotation": [-45, 0, 0], - "cubes": [{"origin": [-4, 8, 4], "size": [8, 1, 1], "uv": [14, 16]}] - }, - { - "name": "spines_bottom_front", - "parent": "body", - "pivot": [0, 0, -4], - "bind_pose_rotation": [-45, 0, 0], - "cubes": [ - {"origin": [-4, -1, -4], "size": [8, 1, 1], "uv": [14, 19]} - ] - }, - { - "name": "spines_bottom_mid", - "parent": "body", - "pivot": [0, -1, 0], - "cubes": [ - {"origin": [-4, -1, 0], "size": [8, 1, 1], "uv": [14, 19]} - ] - }, - { - "name": "spines_bottom_back", - "parent": "body", - "pivot": [0, 0, 4], - "bind_pose_rotation": [45, 0, 0], - "cubes": [ - {"origin": [-4, -1, 4], "size": [8, 1, 1], "uv": [14, 19]} - ] - }, - { - "name": "spines_left_front", - "parent": "body", - "pivot": [4, 0, -4], - "bind_pose_rotation": [0, 45, 0], - "cubes": [{"origin": [4, 0, -4], "size": [1, 8, 1], "uv": [0, 16]}] - }, - { - "name": "spines_left_mid", - "parent": "body", - "pivot": [4, 0, 0], - "cubes": [ - { - "origin": [4, 0, 0], - "size": [1, 8, 1], - "uv": [4, 16], - "mirror": true - } - ] - }, - { - "name": "spines_left_back", - "parent": "body", - "pivot": [4, 0, 4], - "bind_pose_rotation": [0, -45, 0], - "cubes": [ - { - "origin": [4, 0, 4], - "size": [1, 8, 1], - "uv": [8, 16], - "mirror": true - } - ] - }, - { - "name": "spines_right_front", - "parent": "body", - "pivot": [-4, 0, -4], - "bind_pose_rotation": [0, -45, 0], - "cubes": [{"origin": [-5, 0, -4], "size": [1, 8, 1], "uv": [4, 16]}] - }, - { - "name": "spines_right_mid", - "parent": "body", - "pivot": [-4, 0, 0], - "cubes": [{"origin": [-5, 0, 0], "size": [1, 8, 1], "uv": [8, 16]}] - }, - { - "name": "spines_right_back", - "parent": "body", - "pivot": [-4, 0, 4], - "bind_pose_rotation": [0, 45, 0], - "cubes": [{"origin": [-5, 0, 4], "size": [1, 8, 1], "uv": [8, 16]}] - } - ] - } - }, - "render_controllers": [ - {"controller.render.pufferfish.small": "query.variant == 0"}, - {"controller.render.pufferfish.medium": "query.variant == 1"}, - {"controller.render.pufferfish.large": "query.variant == 2"} - ], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 46} - }, - "rabbit": { - "identifier": "minecraft:rabbit", - "min_engine_version": "1.8.0", - "materials": {"default": "rabbit"}, - "textures": { - "brown": "textures/entity/rabbit/brown", - "white": "textures/entity/rabbit/white", - "black": "textures/entity/rabbit/black", - "white_splotched": "textures/entity/rabbit/white_splotched", - "gold": "textures/entity/rabbit/gold", - "salt": "textures/entity/rabbit/salt", - "toast": "textures/entity/rabbit/toast" - }, - "geometry": { - "default": { - "visible_bounds_width": 1, - "visible_bounds_height": 1, - "visible_bounds_offset": [0, 0.5, 0], - "texturewidth": 64, - "textureheight": 32, - "bones": [ - { - "name": "rearFootLeft", - "pivot": [3, 6.5, 3.7], - "mirror": true, - "parent": "body", - "cubes": [{"origin": [2, 0, 0], "size": [2, 1, 7], "uv": [8, 24]}] - }, - { - "name": "rearFootRight", - "pivot": [-3, 6.5, 3.7], - "mirror": true, - "parent": "body", - "cubes": [{"origin": [-4, 0, 0], "size": [2, 1, 7], "uv": [26, 24]}] - }, - { - "name": "haunchLeft", - "pivot": [3, 6.5, 3.7], - "bind_pose_rotation": [-20, 0, 0], - "mirror": true, - "parent": "body", - "cubes": [ - {"origin": [2, 2.5, 3.7], "size": [2, 4, 5], "uv": [16, 15]} - ] - }, - { - "name": "haunchRight", - "pivot": [-3, 6.5, 3.7], - "bind_pose_rotation": [-20, 0, 0], - "mirror": true, - "parent": "body", - "cubes": [ - {"origin": [-4, 2.5, 3.7], "size": [2, 4, 5], "uv": [30, 15]} - ] - }, - { - "name": "body", - "pivot": [0, 5, 8], - "bind_pose_rotation": [-20, 0, 0], - "mirror": true, - "cubes": [{"origin": [-3, 2, -2], "size": [6, 5, 10], "uv": [0, 0]}] - }, - { - "name": "frontLegLeft", - "pivot": [3, 7, -1], - "bind_pose_rotation": [-10, 0, 0], - "mirror": true, - "parent": "body", - "cubes": [{"origin": [2, 0, -2], "size": [2, 7, 2], "uv": [8, 15]}] - }, - { - "name": "frontLegRight", - "pivot": [-3, 7, -1], - "bind_pose_rotation": [-10, 0, 0], - "mirror": true, - "parent": "body", - "cubes": [{"origin": [-4, 0, -2], "size": [2, 7, 2], "uv": [0, 15]}] - }, - { - "name": "head", - "pivot": [0, 8, -1], - "locators": {"lead": [0, 8, -1]}, - "mirror": true, - "parent": "body", - "cubes": [ - {"origin": [-2.5, 8, -6], "size": [5, 4, 5], "uv": [32, 0]} - ] - }, - { - "name": "earRight", - "pivot": [0, 8, -1], - "bind_pose_rotation": [0, -15, 0], - "mirror": true, - "parent": "body", - "cubes": [ - {"origin": [-2.5, 12, -2], "size": [2, 5, 1], "uv": [58, 0]} - ] - }, - { - "name": "earLeft", - "pivot": [0, 8, -1], - "bind_pose_rotation": [0, 15, 0], - "mirror": true, - "parent": "body", - "cubes": [ - {"origin": [0.5, 12, -2], "size": [2, 5, 1], "uv": [52, 0]} - ] - }, - { - "name": "tail", - "pivot": [0, 4, 7], - "bind_pose_rotation": [-20, 0, 0], - "mirror": true, - "parent": "body", - "cubes": [ - {"origin": [-1.5, 2.5, 7], "size": [3, 3, 2], "uv": [52, 6]} - ] - }, - { - "name": "nose", - "pivot": [0, 8, -1], - "mirror": true, - "parent": "body", - "cubes": [ - {"origin": [-0.5, 9.5, -6.5], "size": [1, 1, 1], "uv": [32, 9]} - ] - } - ] - } - }, - "render_controllers": ["controller.render.rabbit"], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 24} - }, - "ravager": { - "identifier": "minecraft:ravager", - "textures": {"default": "textures/entity/illager/ravager"}, - "materials": {"default": "ravager"}, - "geometry": { - "default": { - "bones": [ - { - "pivot": [0, 19, 2], - "rotation": [90, 0, 0], - "cubes": [ - {"origin": [-7, 10, -2], "size": [14, 16, 20], "uv": [0, 55]}, - {"origin": [-6, -3, -2], "size": [12, 13, 18], "uv": [0, 91]} - ], - "name": "body" - }, - { - "pivot": [0, 15, -10], - "cubes": [ - {"origin": [-8, 13, -24], "size": [16, 3, 16], "uv": [0, 36]} - ], - "name": "mouth", - "parent": "head" - }, - { - "pivot": [0, 20, -20], - "cubes": [ - {"origin": [-5, 21, -10], "size": [10, 10, 18], "uv": [68, 73]} - ], - "name": "neck" - }, - { - "locators": {"stun": [0, 32, -15]}, - "pivot": [0, 28, -10], - "cubes": [ - {"origin": [-8, 14, -24], "size": [16, 20, 16], "uv": [0, 0]}, - {"origin": [-2, 12, -28], "size": [4, 8, 4], "uv": [0, 0]} - ], - "name": "head", - "parent": "neck" - }, - { - "pivot": [-12, 30, 22], - "cubes": [ - {"origin": [-12, 0, 17], "size": [8, 37, 8], "uv": [96, 0]} - ], - "name": "leg0" - }, - { - "pivot": [4, 30, 22], - "cubes": [ - {"origin": [4, 0, 17], "size": [8, 37, 8], "uv": [96, 0]} - ], - "name": "leg1" - }, - { - "pivot": [-4, 26, -4], - "cubes": [ - {"origin": [-12, 0, -8], "size": [8, 37, 8], "uv": [64, 0]} - ], - "name": "leg2" - }, - { - "pivot": [-4, 26, -4], - "cubes": [ - {"origin": [4, 0, -8], "size": [8, 37, 8], "uv": [64, 0]} - ], - "name": "leg3" - }, - { - "pivot": [-5, 27, -19], - "rotation": [60, 0, 0], - "cubes": [ - {"origin": [-10, 27, -20], "size": [2, 14, 4], "uv": [74, 55]}, - {"origin": [8, 27, -20], "size": [2, 14, 4], "uv": [74, 55]} - ], - "name": "horns", - "parent": "head" - } - ], - "texturewidth": 128, - "textureheight": 128, - "visible_bounds_width": 4, - "visible_bounds_height": 3.5, - "visible_bounds_offset": [0, 1.25, 0] - } - }, - "render_controllers": ["controller.render.ravager"], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 57}, - "particle_effects": {"stun_particles": "minecraft:stunned_emitter"} - }, - "salmon": { - "identifier": "minecraft:salmon", - "materials": {"default": "salmon"}, - "textures": {"default": "textures/entity/fish/salmon"}, - "geometry": { - "default": { - "visible_bounds_width": 0.5, - "visible_bounds_height": 0.5, - "visible_bounds_offset": [0, 0.5, 0], - "texturewidth": 32, - "textureheight": 32, - "bones": [ - { - "name": "body_front", - "pivot": [0, 0, -4], - "cubes": [ - {"origin": [-1.5, 3.5, -4], "size": [3, 5, 8], "uv": [0, 0]} - ] - }, - { - "name": "body_back", - "parent": "body_front", - "pivot": [0, 0, 4], - "cubes": [ - {"origin": [-1.5, 3.5, 4], "size": [3, 5, 8], "uv": [0, 13]} - ] - }, - { - "name": "dorsal_front", - "parent": "body_front", - "pivot": [0, 5, 2], - "cubes": [{"origin": [0, 8.5, 2], "size": [0, 2, 2], "uv": [4, 2]}] - }, - { - "name": "dorsal_back", - "parent": "body_back", - "pivot": [0, 5, 4], - "cubes": [{"origin": [0, 8.5, 4], "size": [0, 2, 3], "uv": [2, 3]}] - }, - { - "name": "tailfin", - "parent": "body_back", - "pivot": [0, 0, 12], - "cubes": [ - {"origin": [0, 3.5, 12], "size": [0, 5, 6], "uv": [20, 10]} - ] - }, - { - "name": "head", - "parent": "body_front", - "pivot": [0, 3, -4], - "locators": {"lead": [0, 3, -4]}, - "cubes": [ - {"origin": [-1, 4.5, -7], "size": [2, 4, 3], "uv": [22, 0]} - ] - }, - { - "name": "leftFin", - "parent": "body_front", - "pivot": [1.5, 1, -4], - "rotation": [0, 0, 35], - "cubes": [ - { - "origin": [-0.50752, 3.86703, -4], - "size": [2, 0, 2], - "uv": [2, 0] - } - ] - }, - { - "name": "rightFin", - "parent": "body_front", - "pivot": [-1.5, 1, -4], - "rotation": [0, 0, -35], - "cubes": [ - { - "origin": [-1.49258, 3.86703, -4], - "size": [2, 0, 2], - "uv": [-2, 0] - } - ] - } - ] - } - }, - "render_controllers": ["controller.render.salmon"], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 47} - }, - "shulker_bullet": { - "identifier": "minecraft:shulker_bullet", - "materials": {"default": "shulker_bullet"}, - "textures": {"default": "textures/entity/shulker/spark"}, - "geometry": { - "default": { - "texturewidth": 64, - "textureheight": 32, - "bones": [ - { - "name": "body", - "pivot": [0, 0, 0], - "cubes": [ - {"origin": [-4, -4, -1], "size": [8, 8, 2], "uv": [0, 0]}, - {"origin": [-1, -4, -4], "size": [2, 8, 8], "uv": [0, 10]}, - {"origin": [-4, -1, -4], "size": [8, 2, 8], "uv": [20, 0]} - ] - } - ] - } - }, - "render_controllers": ["controller.render.shulker_bullet"] - }, - "silverfish": { - "identifier": "minecraft:silverfish", - "materials": {"default": "silverfish", "body_layer": "silverfish_layers"}, - "textures": {"default": "textures/entity/silverfish"}, - "geometry": { - "default": { - "visible_bounds_width": 1.5, - "visible_bounds_height": 1, - "visible_bounds_offset": [0, 0.5, 0], - "texturewidth": 64, - "textureheight": 32, - "bones": [ - { - "name": "bodyPart_0", - "parent": "bodyPart_2", - "pivot": [0, 2, -3.5], - "cubes": [ - {"origin": [-1.5, 0, -4.5], "size": [3, 2, 2], "uv": [0, 0]} - ] - }, - { - "name": "bodyPart_1", - "parent": "bodyPart_2", - "pivot": [0, 3, -1.5], - "cubes": [ - {"origin": [-2, 0, -2.5], "size": [4, 3, 2], "uv": [0, 4]} - ] - }, - { - "name": "bodyPart_2", - "pivot": [0, 4, 1], - "cubes": [ - {"origin": [-3, 0, -0.5], "size": [6, 4, 3], "uv": [0, 9]} - ] - }, - { - "name": "bodyPart_3", - "parent": "bodyPart_2", - "pivot": [0, 3, 4], - "cubes": [ - {"origin": [-1.5, 0, 2.5], "size": [3, 3, 3], "uv": [0, 16]} - ] - }, - { - "name": "bodyPart_4", - "parent": "bodyPart_2", - "pivot": [0, 2, 7], - "cubes": [ - {"origin": [-1, 0, 5.5], "size": [2, 2, 3], "uv": [0, 22]} - ] - }, - { - "name": "bodyPart_5", - "parent": "bodyPart_2", - "pivot": [0, 1, 9.5], - "cubes": [ - {"origin": [-1, 0, 8.5], "size": [2, 1, 2], "uv": [11, 0]} - ] - }, - { - "name": "bodyPart_6", - "parent": "bodyPart_2", - "pivot": [0, 1, 11.5], - "cubes": [ - {"origin": [-0.5, 0, 10.5], "size": [1, 1, 2], "uv": [13, 4]} - ] - }, - { - "name": "bodyLayer_0", - "parent": "bodyPart_2", - "pivot": [0, 8, 1], - "cubes": [ - {"origin": [-5, 0, -0.5], "size": [10, 8, 3], "uv": [20, 0]} - ] - }, - { - "name": "bodyLayer_1", - "parent": "bodyPart_4", - "pivot": [0, 4, 7], - "cubes": [ - {"origin": [-3, 0, 5.5], "size": [6, 4, 3], "uv": [20, 11]} - ] - }, - { - "name": "bodyLayer_2", - "parent": "bodyPart_1", - "pivot": [0, 5, -1.5], - "cubes": [ - {"origin": [-3, 0, -3], "size": [6, 5, 2], "uv": [20, 18]} - ] - } - ] - } - }, - "render_controllers": ["controller.render.silverfish"], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 8} - }, - "skeleton": { - "identifier": "minecraft:skeleton", - "min_engine_version": "1.8.0", - "materials": {"default": "skeleton"}, - "textures": {"default": "textures/entity/skeleton/skeleton"}, - "geometry": { - "default": { - "texturewidth": 64, - "textureheight": 32, - "visible_bounds_width": 2, - "visible_bounds_height": 2, - "visible_bounds_offset": [0, 1, 0], - "bones": [ - { - "name": "body", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]} - ], - "parent": "waist" - }, - {"name": "waist", "pivot": [0, 12, 0]}, - { - "name": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [0, 0]} - ], - "parent": "body" - }, - { - "name": "hat", - "pivot": [0, 24, 0], - "cubes": [ - { - "origin": [-4, 24, -4], - "size": [8, 8, 8], - "uv": [32, 0], - "inflate": 0.5 - } - ], - "neverRender": true, - "parent": "head" - }, - { - "name": "rightArm", - "pivot": [-5, 22, 0], - "cubes": [ - {"origin": [-6, 12, -1], "size": [2, 12, 2], "uv": [40, 16]} - ], - "parent": "body" - }, - { - "name": "rightItem", - "pivot": [-1, -45, -5], - "neverRender": true, - "parent": "rightArm" - }, - { - "name": "leftArm", - "pivot": [5, 22, 0], - "cubes": [ - {"origin": [4, 12, -1], "size": [2, 12, 2], "uv": [40, 16]} - ], - "mirror": true, - "parent": "body" - }, - { - "name": "leftItem", - "pivot": [1, -45, -5], - "neverRender": true, - "parent": "leftArm" - }, - { - "name": "rightLeg", - "pivot": [-2, 12, 0], - "cubes": [ - {"origin": [-3, 0, -1], "size": [2, 12, 2], "uv": [0, 16]} - ], - "parent": "body" - }, - { - "name": "leftLeg", - "pivot": [2, 12, 0], - "cubes": [ - {"origin": [1, 0, -1], "size": [2, 12, 2], "uv": [0, 16]} - ], - "mirror": true, - "parent": "body" - } - ] - } - }, - "spawn_egg": {"texture": "spawn_egg", "texture_index": 9}, - "render_controllers": ["controller.render.skeleton"], - "enable_attachables": true - }, - "skeleton_horse": { - "identifier": "minecraft:skeleton_horse", - "textures": { - "base_brown": "textures/entity/horse/horse_brown", - "base_white": "textures/entity/horse/horse_white", - "base_chestnut": "textures/entity/horse/horse_chestnut", - "base_creamy": "textures/entity/horse/horse_creamy", - "base_black": "textures/entity/horse/horse_black", - "base_gray": "textures/entity/horse/horse_gray", - "base_darkbrown": "textures/entity/horse/horse_darkbrown", - "markings_none": "textures/entity/horse/horse_markings_none", - "markings_white": "textures/entity/horse/horse_markings_white", - "markings_whitefield": "textures/entity/horse/horse_markings_whitefield", - "markings_whitedots": "textures/entity/horse/horse_markings_whitedots", - "markings_blackdots": "textures/entity/horse/horse_markings_blackdots", - "mule": "textures/entity/horse/mule", - "donkey": "textures/entity/horse/donkey", - "skeleton": "textures/entity/horse/horse_skeleton", - "zombie": "textures/entity/horse/horse_zombie", - "armor_none": "textures/entity/horse/armor/horse_armor_none", - "armor_leather": "textures/entity/horse/armor/horse_armor_leather", - "armor_iron": "textures/entity/horse/armor/horse_armor_iron", - "armor_gold": "textures/entity/horse/armor/horse_armor_gold", - "armor_diamond": "textures/entity/horse/armor/horse_armor_diamond" - }, - "geometry": { - "default": { - "visible_bounds_width": 2, - "visible_bounds_height": 3, - "visible_bounds_offset": [0, 1, 0], - "texturewidth": 128, - "textureheight": 128, - "bones": [ - { - "name": "Body", - "pivot": [0, 13, 9], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [-5, 11, -10], "size": [10, 10, 24], "uv": [0, 34]} - ] - }, - { - "name": "TailA", - "pivot": [0, 21, 14], - "rotation": [-65, 0, 0], - "cubes": [ - {"origin": [-1, 20, 14], "size": [2, 2, 3], "uv": [44, 0]} - ] - }, - { - "name": "TailB", - "pivot": [0, 21, 14], - "rotation": [-65, 0, 0], - "cubes": [ - {"origin": [-1.5, 19, 17], "size": [3, 4, 7], "uv": [38, 7]} - ] - }, - { - "name": "TailC", - "pivot": [0, 21, 14], - "rotation": [-80.34, 0, 0], - "cubes": [ - {"origin": [-1.5, 21.5, 23], "size": [3, 4, 7], "uv": [24, 3]} - ] - }, - { - "name": "Leg1A", - "pivot": [4, 15, 11], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [1.5, 8, 8.5], "size": [4, 9, 5], "uv": [78, 29]} - ] - }, - { - "name": "Leg1B", - "pivot": [4, 8, 11], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [2, 3, 9.5], "size": [3, 5, 3], "uv": [78, 43]} - ] - }, - { - "name": "Leg1C", - "pivot": [4, 8, 11], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [1.5, -0.1, 9], "size": [4, 3, 4], "uv": [78, 51]} - ] - }, - { - "name": "Leg2A", - "pivot": [-4, 15, 11], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [-5.5, 8, 8.5], "size": [4, 9, 5], "uv": [96, 29]} - ] - }, - { - "name": "Leg2B", - "pivot": [-4, 8, 11], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [-5, 3, 9.5], "size": [3, 5, 3], "uv": [96, 43]} - ] - }, - { - "name": "Leg2C", - "pivot": [-4, 8, 11], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [-5.5, -0.1, 9], "size": [4, 3, 4], "uv": [96, 51]} - ] - }, - { - "name": "Leg3A", - "pivot": [4, 15, -8], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [2.1, 8, -10.1], "size": [3, 8, 4], "uv": [44, 29]} - ] - }, - { - "name": "Leg3B", - "pivot": [4, 8, -8], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [2.1, 3, -9.6], "size": [3, 5, 3], "uv": [44, 41]} - ] - }, - { - "name": "Leg3C", - "pivot": [4, 8, -8], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [1.6, -0.1, -10.1], "size": [4, 3, 4], "uv": [44, 51]} - ] - }, - { - "name": "Leg4A", - "pivot": [-4, 15, -8], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [-5.1, 8, -10.1], "size": [3, 8, 4], "uv": [60, 29]} - ] - }, - { - "name": "Leg4B", - "pivot": [-4, 8, -8], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [-5.1, 3, -9.6], "size": [3, 5, 3], "uv": [60, 41]} - ] - }, - { - "name": "Leg4C", - "pivot": [-4, 8, -8], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [-5.6, -0.1, -10.1], "size": [4, 3, 4], "uv": [60, 51]} - ] - }, - { - "name": "Head", - "pivot": [0, 20, -10], - "rotation": [30, 0, 0], - "cubes": [ - {"origin": [-2.5, 25, -11.5], "size": [5, 5, 7], "uv": [0, 0]} - ] - }, - { - "name": "UMouth", - "pivot": [0, 20.05, -10], - "rotation": [30, 0, 0], - "cubes": [ - {"origin": [-2, 27.05, -17], "size": [4, 3, 6], "uv": [24, 18]} - ] - }, - { - "name": "LMouth", - "pivot": [0, 20, -10], - "rotation": [30, 0, 0], - "cubes": [ - {"origin": [-2, 25, -16.5], "size": [4, 2, 5], "uv": [24, 27]} - ] - }, - { - "name": "Ear1", - "pivot": [0, 20, -10], - "rotation": [30, 0, 0], - "cubes": [ - {"origin": [0.45, 29, -6], "size": [2, 3, 1], "uv": [0, 0]} - ] - }, - { - "name": "Ear2", - "pivot": [0, 20, -10], - "rotation": [30, 0, 0], - "cubes": [ - {"origin": [-2.45, 29, -6], "size": [2, 3, 1], "uv": [0, 0]} - ] - }, - { - "name": "MuleEarL", - "pivot": [0, 20, -10], - "rotation": [30, 0, 15], - "cubes": [ - {"origin": [-2, 29, -6], "size": [2, 7, 1], "uv": [0, 12]} - ] - }, - { - "name": "MuleEarR", - "pivot": [0, 20, -10], - "rotation": [30, 0, -15], - "cubes": [{"origin": [0, 29, -6], "size": [2, 7, 1], "uv": [0, 12]}] - }, - { - "name": "Neck", - "pivot": [0, 20, -10], - "rotation": [30, 0, 0], - "cubes": [ - {"origin": [-2.05, 15.8, -12], "size": [4, 14, 8], "uv": [0, 12]} - ] - }, - { - "name": "Bag1", - "pivot": [-7.5, 21, 10], - "rotation": [0, 90, 0], - "cubes": [ - {"origin": [-10.5, 13, 10], "size": [8, 8, 3], "uv": [0, 34]} - ] - }, - { - "name": "Bag2", - "pivot": [4.5, 21, 10], - "rotation": [0, 90, 0], - "cubes": [ - {"origin": [1.5, 13, 10], "size": [8, 8, 3], "uv": [0, 47]} - ] - }, - { - "name": "Saddle", - "pivot": [0, 22, 2], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [-5, 21, -1], "size": [10, 1, 8], "uv": [80, 0]} - ] - }, - { - "name": "SaddleB", - "pivot": [0, 22, 2], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [-1.5, 22, -1], "size": [3, 1, 2], "uv": [106, 9]} - ] - }, - { - "name": "SaddleC", - "pivot": [0, 22, 2], - "rotation": [0, 0, 0], - "cubes": [{"origin": [-4, 22, 5], "size": [8, 1, 2], "uv": [80, 9]}] - }, - { - "name": "SaddleL2", - "pivot": [5, 21, 2], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [4.5, 13, 1], "size": [1, 2, 2], "uv": [74, 0]} - ] - }, - { - "name": "SaddleL", - "pivot": [5, 21, 2], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [4.5, 15, 1.5], "size": [1, 6, 1], "uv": [70, 0]} - ] - }, - { - "name": "SaddleR2", - "pivot": [-5, 21, 2], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [-5.5, 13, 1], "size": [1, 2, 2], "uv": [74, 4]} - ] - }, - { - "name": "SaddleR", - "pivot": [-5, 21, 2], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [-5.5, 15, 1.5], "size": [1, 6, 1], "uv": [80, 0]} - ] - }, - { - "name": "SaddleMouthL", - "pivot": [0, 20, -10], - "rotation": [30, 0, 0], - "cubes": [ - {"origin": [1.5, 26, -14], "size": [1, 2, 2], "uv": [74, 13]} - ] - }, - { - "name": "SaddleMouthR", - "pivot": [0, 20, -10], - "rotation": [30, 0, 0], - "cubes": [ - {"origin": [-2.5, 26, -14], "size": [1, 2, 2], "uv": [74, 13]} - ] - }, - { - "name": "SaddleMouthLine", - "pivot": [0, 20, -10], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [2.6, 23, -16], "size": [0, 3, 16], "uv": [44, 10]} - ] - }, - { - "name": "SaddleMouthLineR", - "pivot": [0, 20, -10], - "rotation": [0, 0, 0], - "cubes": [ - {"origin": [-2.6, 23, -16], "size": [0, 3, 16], "uv": [44, 5]} - ] - }, - { - "name": "Mane", - "pivot": [0, 20, -10], - "rotation": [30, 0, 0], - "cubes": [ - {"origin": [-1, 15.5, -5], "size": [2, 16, 4], "uv": [58, 0]} - ] - }, - { - "name": "HeadSaddle", - "pivot": [0, 20, -10], - "rotation": [30, 0, 0], - "cubes": [ - { - "origin": [-2.5, 25.1, -17], - "size": [5, 5, 12], - "uv": [80, 12], - "inflate": 0.05 - } - ] - } - ] - } - }, - "spawn_egg": {"texture": "spawn_egg", "texture_index": 32} - }, - "slime": { - "identifier": "minecraft:slime", - "materials": {"default": "slime", "outer": "slime_outer"}, - "textures": {"default": "textures/entity/slime/slime"}, - "geometry": { - "default": { - "visible_bounds_width": 5, - "visible_bounds_height": 2, - "visible_bounds_offset": [0, 1, 0], - "texturewidth": 64, - "textureheight": 32, - "bones": [ - { - "name": "cube", - "pivot": [0, 24, 0], - "cubes": [{"origin": [-3, 1, -3], "size": [6, 6, 6], "uv": [0, 16]}] - }, - { - "name": "eye0", - "parent": "cube", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-3.3, 4, -3.5], "size": [2, 2, 2], "uv": [32, 0]} - ] - }, - { - "name": "eye1", - "parent": "cube", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [1.3, 4, -3.5], "size": [2, 2, 2], "uv": [32, 4]} - ] - }, - { - "name": "mouth", - "parent": "cube", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [0, 2, -3.5], "size": [1, 1, 1], "uv": [32, 8]} - ] - } - ] - }, - "armor": { - "visible_bounds_width": 1, - "visible_bounds_height": 1, - "visible_bounds_offset": [0, 0.5, 0], - "texturewidth": 64, - "textureheight": 32, - "bones": [ - { - "name": "cube", - "pivot": [0, 24, 0], - "cubes": [{"origin": [-4, 0, -4], "size": [8, 8, 8], "uv": [0, 0]}] - }, - { - "name": "eye0", - "parent": "cube", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-3.3, 4, -3.5], "size": [2, 2, 2], "uv": [32, 0]} - ] - }, - { - "name": "eye1", - "parent": "cube", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [1.3, 4, -3.5], "size": [2, 2, 2], "uv": [32, 4]} - ] - }, - { - "name": "mouth", - "parent": "cube", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [0, 2, -3.5], "size": [1, 1, 1], "uv": [32, 8]} - ] - } - ] - } - }, - "render_controllers": [ - "controller.render.slime", - "controller.render.slime_armor" - ], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 10} - }, - "small_fireball": { - "identifier": "minecraft:small_fireball", - "materials": {"default": "fireball"}, - "textures": {"default": "textures/items/fire_charge"}, - "geometry": { - "default": { - "bones": [ - { - "name": "body", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-8, -4, 0], - "size": [16, 16, 0], - "uv": {"south": {"uv": [0, 0]}} - } - ] - } - ], - "texturewidth": 16, - "textureheight": 16 - } - }, - "render_controllers": ["controller.render.fireball"] - }, - "snow_golem": { - "identifier": "minecraft:snow_golem", - "min_engine_version": "1.8.0", - "materials": {"default": "snow_golem", "head": "snow_golem_pumpkin"}, - "textures": {"default": "textures/entity/snow_golem"}, - "geometry": { - "default": { - "visible_bounds_width": 1, - "visible_bounds_height": 2, - "visible_bounds_offset": [0, 1, 0], - "bones": [ - { - "name": "head", - "parent": "piece1", - "pivot": [0, 20, 0], - "locators": {"lead": [0, 20, 0]}, - "cubes": [ - { - "origin": [-4, 20, -4], - "size": [8, 8, 8], - "uv": [0, 0], - "inflate": -0.5 - } - ] - }, - { - "name": "arm1", - "parent": "piece1", - "pivot": [0, 18, 0], - "bind_pose_rotation": [0, 0, 57.3], - "cubes": [ - { - "origin": [1, 20, -1], - "size": [12, 2, 2], - "uv": [32, 0], - "inflate": -0.5 - } - ] - }, - { - "name": "arm2", - "parent": "piece1", - "pivot": [0, 18, 0], - "bind_pose_rotation": [0, 180, -57.3], - "cubes": [ - { - "origin": [1, 20, -1], - "size": [12, 2, 2], - "uv": [32, 0], - "inflate": -0.5 - } - ] - }, - { - "name": "piece1", - "parent": "piece2", - "pivot": [0, 11, 0], - "cubes": [ - { - "origin": [-5, 11, -5], - "size": [10, 10, 10], - "uv": [0, 16], - "inflate": -0.5 - } - ] - }, - { - "name": "piece2", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-6, 0, -6], - "size": [12, 12, 12], - "uv": [0, 36], - "inflate": -0.5 - } - ] - } - ] - } - }, - "render_controllers": ["controller.render.snowgolem"] - }, - "snowball": { - "identifier": "minecraft:snowball", - "materials": {"default": "snowball"}, - "textures": {"default": "textures/items/snowball"}, - "geometry": { - "default": { - "bones": [ - { - "name": "body", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-8, -8, 0], - "size": [16, 16, 0], - "uv": [0, 0], - "rotation": [0, 0, 0] - } - ] - } - ], - "texturewidth": 16, - "textureheight": 16 - } - }, - "render_controllers": ["controller.render.item_sprite"] - }, - "potion": { - "identifier": "minecraft:splash_potion", - "materials": {"default": "splash_potion_enchanted"}, - "textures": { - "moveSlowdown": "textures/items/potion_bottle_splash_moveSlowdown", - "moveSpeed": "textures/items/potion_bottle_splash_moveSpeed", - "digSlowdown": "textures/items/potion_bottle_splash_digSlowdown", - "digSpeed": "textures/items/potion_bottle_splash_digSpeed", - "damageBoost": "textures/items/potion_bottle_splash_damageBoost", - "heal": "textures/items/potion_bottle_splash_heal", - "harm": "textures/items/potion_bottle_splash_harm", - "jump": "textures/items/potion_bottle_splash_jump", - "confusion": "textures/items/potion_bottle_splash_confusion", - "regeneration": "textures/items/potion_bottle_splash_regeneration", - "resistance": "textures/items/potion_bottle_splash_resistance", - "fireResistance": "textures/items/potion_bottle_splash_fireResistance", - "waterBreathing": "textures/items/potion_bottle_splash_waterBreathing", - "invisibility": "textures/items/potion_bottle_splash_invisibility", - "blindness": "textures/items/potion_bottle_splash_blindness", - "nightVision": "textures/items/potion_bottle_splash_nightVision", - "hunger": "textures/items/potion_bottle_splash_hunger", - "weakness": "textures/items/potion_bottle_splash_weakness", - "poison": "textures/items/potion_bottle_splash_poison", - "wither": "textures/items/potion_bottle_splash_wither", - "healthBoost": "textures/items/potion_bottle_splash_healthBoost", - "absorption": "textures/items/potion_bottle_splash_absorption", - "saturation": "textures/items/potion_bottle_splash_saturation", - "levitation": "textures/items/potion_bottle_splash_levitation", - "turtleMaster": "textures/items/potion_bottle_splash_turtleMaster", - "slowFall": "textures/items/potion_bottle_splash_slowFall", - "default": "textures/items/potion_bottle_splash", - "enchanted": "textures/misc/enchanted_item_glint" - }, - "geometry": { - "default": { - "bones": [ - { - "name": "body", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-8, -8, 0], - "size": [16, 16, 0], - "uv": [0, 0], - "rotation": [0, 0, 0] - } - ] - } - ], - "texturewidth": 16, - "textureheight": 16 - } - }, - "render_controllers": ["controller.render.splash_potion"] - }, - "squid": { - "identifier": "minecraft:squid", - "materials": {"default": "squid"}, - "textures": {"default": "textures/entity/squid"}, - "geometry": { - "default": { - "visible_bounds_width": 3, - "visible_bounds_height": 2, - "visible_bounds_offset": [0, 0.5, 0], - "texturewidth": 64, - "textureheight": 32, - "bones": [ - { - "name": "body", - "cubes": [ - {"origin": [-6, -8, -6], "size": [12, 16, 12], "uv": [0, 0]} - ] - }, - { - "name": "tentacle1", - "parent": "body", - "pivot": [5, -7, 0], - "cubes": [ - {"origin": [4, -25, -1], "size": [2, 18, 2], "uv": [48, 0]} - ], - "rotation": [0, 90, 0] - }, - { - "name": "tentacle2", - "parent": "body", - "pivot": [3.5, -7, 3.5], - "cubes": [ - {"origin": [2.5, -25, 2.5], "size": [2, 18, 2], "uv": [48, 0]} - ], - "rotation": [0, 45, 0] - }, - { - "name": "tentacle3", - "parent": "body", - "pivot": [0, -7, 5], - "cubes": [ - {"origin": [-1, -25, 4], "size": [2, 18, 2], "uv": [48, 0]} - ], - "rotation": [0, 0, 0] - }, - { - "name": "tentacle4", - "parent": "body", - "pivot": [-3.5, -7, 3.5], - "cubes": [ - {"origin": [-4.5, -25, 2.5], "size": [2, 18, 2], "uv": [48, 0]} - ], - "rotation": [0, -45, 0] - }, - { - "name": "tentacle5", - "parent": "body", - "pivot": [-5, -7, 0], - "cubes": [ - {"origin": [-6, -25, -1], "size": [2, 18, 2], "uv": [48, 0]} - ], - "rotation": [0, -90, 0] - }, - { - "name": "tentacle6", - "parent": "body", - "pivot": [-3.5, -7, -3.5], - "cubes": [ - {"origin": [-4.5, -25, -4.5], "size": [2, 18, 2], "uv": [48, 0]} - ], - "rotation": [0, -135, 0] - }, - { - "name": "tentacle7", - "parent": "body", - "pivot": [0, -7, -5], - "cubes": [ - {"origin": [-1, -25, -6], "size": [2, 18, 2], "uv": [48, 0]} - ], - "rotation": [0, -180, 0] - }, - { - "name": "tentacle8", - "parent": "body", - "pivot": [3.5, -7, -3.5], - "cubes": [ - {"origin": [2.5, -25, -4.5], "size": [2, 18, 2], "uv": [48, 0]} - ], - "rotation": [0, -225, 0] - } - ] - } - }, - "render_controllers": ["controller.render.squid"], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 15} - }, - "stray": { - "identifier": "minecraft:stray", - "min_engine_version": "1.8.0", - "materials": {"default": "stray", "overlay": "stray_clothes"}, - "textures": { - "default": "textures/entity/skeleton/stray", - "overlay": "textures/entity/skeleton/stray_overlay" - }, - "geometry": { - "default": { - "visible_bounds_width": 1.5, - "visible_bounds_height": 2, - "visible_bounds_offset": [0, 1, 0], - "texturewidth": 64, - "textureheight": 32, - "bones": [ - { - "name": "body", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]} - ], - "parent": "waist" - }, - {"name": "waist", "pivot": [0, 12, 0]}, - { - "name": "head", - "pivot": [0, 24, 0], - "locators": {"lead": [0, 24, 0]}, - "cubes": [ - {"origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [0, 0]} - ], - "parent": "body" - }, - { - "name": "hat", - "pivot": [0, 24, 0], - "cubes": [ - { - "origin": [-4, 24, -4], - "size": [8, 8, 8], - "uv": [32, 0], - "inflate": 0.5 - } - ], - "neverRender": true, - "parent": "head" - }, - { - "name": "rightArm", - "pivot": [-5, 22, 0], - "cubes": [ - {"origin": [-6, 12, -1], "size": [2, 12, 2], "uv": [40, 16]} - ], - "parent": "body" - }, - { - "name": "rightItem", - "pivot": [-1, -45, -5], - "neverRender": true, - "parent": "rightArm" - }, - { - "name": "leftArm", - "pivot": [5, 22, 0], - "cubes": [ - {"origin": [4, 12, -1], "size": [2, 12, 2], "uv": [40, 16]} - ], - "mirror": true, - "parent": "body" - }, - { - "name": "leftItem", - "pivot": [1, -45, -5], - "neverRender": true, - "parent": "leftArm" - }, - { - "name": "rightLeg", - "pivot": [-2, 12, 0], - "cubes": [ - {"origin": [-3, 0, -1], "size": [2, 12, 2], "uv": [0, 16]} - ], - "parent": "body" - }, - { - "name": "leftLeg", - "pivot": [2, 12, 0], - "cubes": [ - {"origin": [1, 0, -1], "size": [2, 12, 2], "uv": [0, 16]} - ], - "mirror": true, - "parent": "body" - } - ] - }, - "overlay": { - "visible_bounds_width": 2, - "visible_bounds_height": 2, - "visible_bounds_offset": [0, 1, 0], - "texturewidth": 64, - "textureheight": 32, - "bones": [ - { - "name": "body", - "parent": "waist", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]} - ], - "inflate": 0.25 - }, - {"name": "waist", "neverRender": true, "pivot": [0, 12, 0]}, - { - "name": "head", - "parent": "body", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [0, 0]} - ], - "inflate": 0.25 - }, - { - "name": "hat", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - { - "origin": [-4, 24, -4], - "size": [8, 8, 8], - "uv": [32, 0], - "inflate": 0.5 - } - ], - "neverRender": true - }, - { - "name": "rightArm", - "parent": "body", - "pivot": [-5, 22, 0], - "cubes": [ - {"origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 16]} - ], - "inflate": 0.25 - }, - { - "name": "rightItem", - "parent": "rightArm", - "pivot": [-6, 15, 1], - "neverRender": true - }, - { - "name": "leftArm", - "parent": "body", - "pivot": [5, 22, 0], - "cubes": [ - {"origin": [4, 12, -2], "size": [4, 12, 4], "uv": [40, 16]} - ], - "mirror": true, - "inflate": 0.25 - }, - { - "name": "rightLeg", - "parent": "body", - "pivot": [-1.9, 12, 0], - "cubes": [ - {"origin": [-3.9, 0, -2], "size": [4, 12, 4], "uv": [0, 16]} - ], - "inflate": 0.25 - }, - { - "name": "leftLeg", - "parent": "body", - "pivot": [1.9, 12, 0], - "cubes": [ - {"origin": [-0.1, 0, -2], "size": [4, 12, 4], "uv": [0, 16]} - ], - "inflate": 0.25, - "mirror": true - } - ] - } - }, - "spawn_egg": {"texture": "spawn_egg", "texture_index": 27}, - "render_controllers": [ - "controller.render.stray_clothes", - "controller.render.stray" - ], - "enable_attachables": true - }, - "strider": { - "identifier": "minecraft:strider", - "materials": {"default": "strider"}, - "textures": { - "default": "textures/entity/strider/strider", - "saddled": "textures/entity/strider/strider", - "suffocated": "textures/entity/strider/strider_cold", - "suffocated_saddled": "textures/entity/strider/strider_cold" - }, - "geometry": { - "default": { - "bones": [ - { - "name": "right_leg", - "pivot": [-4, 16, 0], - "cubes": [ - {"origin": [-6, 0, -2], "size": [4, 16, 4], "uv": [0, 32]} - ] - }, - { - "name": "left_leg", - "pivot": [4, 16, 0], - "cubes": [{"origin": [2, 0, -2], "size": [4, 16, 4], "uv": [0, 55]}] - }, - { - "name": "body", - "pivot": [0, 16, 0], - "cubes": [ - {"origin": [-8, 14, -8], "size": [16, 14, 16], "uv": [0, 0]} - ], - "locators": {"lead": [0, 15, -1]} - }, - { - "name": "bristle5", - "parent": "body", - "pivot": [8, 19, 0], - "cubes": [ - { - "origin": [8, 19, -8], - "size": [12, 0, 16], - "pivot": [8, 19, 0], - "rotation": [0, 0, 70], - "uv": [16, 65] - } - ] - }, - { - "name": "bristle4", - "parent": "body", - "pivot": [8, 24, 0], - "cubes": [ - { - "origin": [8, 24, -8], - "size": [12, 0, 16], - "pivot": [8, 24, 0], - "rotation": [0, 0, 65], - "uv": [16, 49] - } - ] - }, - { - "name": "bristle3", - "parent": "body", - "pivot": [8, 28, 0], - "cubes": [ - { - "origin": [8, 28, -8], - "size": [12, 0, 16], - "pivot": [8, 28, 0], - "rotation": [0, 0, 50], - "uv": [16, 33] - } - ] - }, - { - "name": "bristle2", - "parent": "body", - "pivot": [-8, 28, 0], - "cubes": [ - { - "origin": [-20, 28, -8], - "size": [12, 0, 16], - "pivot": [-8, 28, 0], - "rotation": [0, 0, -50], - "uv": [16, 33], - "mirror": true - } - ] - }, - { - "name": "bristle1", - "parent": "body", - "pivot": [-8, 24, 0], - "cubes": [ - { - "origin": [-20, 24, -8], - "size": [12, 0, 16], - "pivot": [-8, 24, 0], - "rotation": [0, 0, -65], - "uv": [16, 49], - "mirror": true - } - ] - }, - { - "name": "bristle0", - "parent": "body", - "pivot": [-8, 19, 0], - "cubes": [ - { - "origin": [-20, 19, -8], - "size": [12, 0, 16], - "pivot": [-8, 19, 0], - "rotation": [0, 0, -70], - "uv": [16, 65], - "mirror": true - } - ] - } - ], - "visible_bounds_width": 3, - "visible_bounds_height": 2, - "visible_bounds_offset": [0, 1, 0], - "texturewidth": 64, - "textureheight": 128 - } - }, - "spawn_egg": {"base_color": "#9c3436", "overlay_color": "#4d494d"}, - "render_controllers": ["controller.render.strider"] - }, - "text_display": { - "identifier": "minecraft:text_display", - "geometry": {} - }, - "trident": { - "identifier": "minecraft:thrown_trident", - "textures": { - "default": "textures/entity/trident", - "loyalty_rope": "textures/entity/lead_knot" - }, - "geometry": { - "default": { - "texturewidth": 32, - "textureheight": 32, - "bones": [ - { - "name": "pole", - "pivot": [0, 24, 0], - "cubes": [ - { - "origin": [-0.5, -3, -0.5], - "size": [1, 31, 1], - "inflate": 0.01, - "uv": [0, 0] - }, - {"origin": [-1.5, 22, -0.5], "size": [3, 2, 1], "uv": [4, 0]}, - {"origin": [-2.5, 23, -0.5], "size": [1, 4, 1], "uv": [4, 3]}, - {"origin": [1.5, 23, -0.5], "size": [1, 4, 1], "uv": [4, 3]} - ] - } - ] - } - } - }, - "tnt_minecart": { - "identifier": "minecraft:tnt_minecart", - "min_engine_version": "1.8.0", - "materials": {"default": "minecart"}, - "textures": {"default": "textures/entity/minecart"}, - "geometry": { - "default": { - "bones": [ - { - "name": "bottom", - "pivot": [0, 6, 0], - "cubes": [ - { - "origin": [-10, -6.5, -1], - "size": [20, 16, 2], - "rotation": [90, 0, 0], - "uv": [0, 10] - } - ] - }, - { - "name": "back", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-17, 2.5, -1], - "size": [16, 8, 2], - "rotation": [0, 270, 0], - "uv": [0, 0] - } - ], - "parent": "bottom" - }, - { - "name": "front", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [1, 2.5, -1], - "size": [16, 8, 2], - "rotation": [0, 90, 0], - "uv": [0, 0] - } - ], - "parent": "bottom" - }, - { - "name": "right", - "pivot": [0, 0, 0], - "cubes": [ - { - "origin": [-8, 2.5, -8], - "size": [16, 8, 2], - "rotation": [0, 180, 0], - "uv": [0, 0] - } - ], - "parent": "bottom" - }, - { - "name": "left", - "pivot": [0, 0, 0], - "cubes": [ - {"origin": [-8, 2.5, 6], "size": [16, 8, 2], "uv": [0, 0]} - ], - "parent": "bottom" - } - ], - "texturewidth": 64, - "textureheight": 32 - } - }, - "render_controllers": ["controller.render.minecart"] - }, - "tropical_fish": { - "identifier": "minecraft:tropicalfish", - "materials": {"default": "tropicalfish"}, - "textures": { - "typeA": "textures/entity/fish/tropical_a", - "typeB": "textures/entity/fish/tropical_b", - "aPattern1": "textures/entity/fish/tropical_a_pattern_1", - "aPattern2": "textures/entity/fish/tropical_a_pattern_2", - "aPattern3": "textures/entity/fish/tropical_a_pattern_3", - "aPattern4": "textures/entity/fish/tropical_a_pattern_4", - "aPattern5": "textures/entity/fish/tropical_a_pattern_5", - "aPattern6": "textures/entity/fish/tropical_a_pattern_6", - "bPattern1": "textures/entity/fish/tropical_b_pattern_1", - "bPattern2": "textures/entity/fish/tropical_b_pattern_2", - "bPattern3": "textures/entity/fish/tropical_b_pattern_3", - "bPattern4": "textures/entity/fish/tropical_b_pattern_4", - "bPattern5": "textures/entity/fish/tropical_b_pattern_5", - "bPattern6": "textures/entity/fish/tropical_b_pattern_6" - }, - "geometry": { - "typeA": { - "visible_bounds_width": 0.5, - "visible_bounds_height": 0.5, - "bones": [ - { - "pivot": [-0.5, 0, 0], - "cubes": [ - {"origin": [-1, 0, -3], "size": [2, 3, 6], "uv": [0, 0]}, - {"origin": [0, 3, -2.9992], "size": [0, 4, 6], "uv": [10, -6]} - ], - "name": "body" - }, - { - "pivot": [0, 0, 3], - "cubes": [{"origin": [0, 0, 3], "size": [0, 3, 4], "uv": [24, -4]}], - "name": "tailfin", - "parent": "body" - }, - { - "pivot": [0.5, 0, 1], - "bind_pose_rotation": [0, -35, 0], - "cubes": [ - {"origin": [0.336, 0, -0.10594], "size": [2, 2, 0], "uv": [2, 12]} - ], - "name": "leftFin", - "parent": "body" - }, - { - "pivot": [-0.5, 0, 1], - "bind_pose_rotation": [0, 35, 0], - "cubes": [ - { - "origin": [-2.336, 0, -0.10594], - "size": [2, 2, 0], - "uv": [2, 16] - } - ], - "name": "rightFin", - "parent": "body" - } - ], - "texturewidth": 32, - "textureheight": 32 - }, - "typeB": { - "visible_bounds_width": 0.5, - "visible_bounds_height": 0.5, - "bones": [ - { - "pivot": [-0.5, 0, 0], - "cubes": [ - {"origin": [-1, 0, -0.0008], "size": [2, 6, 6], "uv": [0, 20]}, - {"origin": [0, -5, -0.0008], "size": [0, 5, 6], "uv": [20, 21]}, - {"origin": [0, 6, -0.0008], "size": [0, 5, 6], "uv": [20, 10]} - ], - "name": "body" - }, - { - "pivot": [0, 0, 6], - "cubes": [ - {"origin": [0, 0.0008, 6], "size": [0, 6, 5], "uv": [21, 16]} - ], - "name": "tailfin", - "parent": "body" - }, - { - "pivot": [0.5, 0, 1], - "bind_pose_rotation": [0, -35, 0], - "cubes": [ - { - "origin": [2.05673, 0, 2.35152], - "size": [2, 2, 0], - "uv": [2, 12] - } - ], - "name": "leftFin", - "parent": "body" - }, - { - "pivot": [-0.5, 0, 1], - "bind_pose_rotation": [0, 35, 0], - "cubes": [ - { - "origin": [-4.05673, 0, 2.35152], - "size": [2, 2, 0], - "uv": [2, 16] - } - ], - "name": "rightFin", - "parent": "body" - } - ], - "texturewidth": 32, - "textureheight": 32 - } - }, - "render_controllers": ["controller.render.tropicalfish"], - "spawn_egg": {"texture": "spawn_egg", "texture_index": 44} - }, - "vindicator": { - "identifier": "minecraft:vindicator", - "min_engine_version": "1.8.0", - "materials": {"default": "vindicator"}, - "textures": {"default": "textures/entity/illager/vindicator"}, - "geometry": { - "default": { - "visible_bounds_width": 1.5, - "visible_bounds_height": 2.5, - "visible_bounds_offset": [0, 1.25, 0], - "texturewidth": 64, - "textureheight": 64, - "bones": [ - { - "name": "head", - "parent": "body", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 24, -4], "size": [8, 10, 8], "uv": [0, 0]} - ] - }, - { - "name": "nose", - "parent": "head", - "pivot": [0, 26, 0], - "cubes": [ - {"origin": [-1, 23, -6], "size": [2, 4, 2], "uv": [24, 0]} - ] - }, - { - "name": "body", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 12, -3], "size": [8, 12, 6], "uv": [16, 20]}, - { - "origin": [-4, 6, -3], - "size": [8, 18, 6], - "uv": [0, 38], - "inflate": 0.5 - } - ] - }, - { - "name": "arms", - "parent": "body", - "pivot": [0, 22, 0], - "cubes": [ - {"origin": [-8, 16, -2], "size": [4, 8, 4], "uv": [44, 22]}, - {"origin": [4, 16, -2], "size": [4, 8, 4], "uv": [44, 22]}, - {"origin": [-4, 16, -2], "size": [8, 4, 4], "uv": [40, 38]} - ] - }, - { - "name": "leg0", - "parent": "body", - "pivot": [-2, 12, 0], - "cubes": [ - {"origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} - ] - }, - { - "name": "leg1", - "parent": "body", - "pivot": [2, 12, 0], - "mirror": true, - "cubes": [{"origin": [0, 0, -2], "size": [4, 12, 4], "uv": [0, 22]}] - }, - { - "name": "rightArm", - "parent": "body", - "pivot": [-5, 22, 0], - "cubes": [ - {"origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 46]} - ] - }, - { - "name": "rightItem", - "pivot": [-5.5, 16, 0.5], - "neverRender": true, - "parent": "rightArm" - }, - { - "name": "leftArm", - "parent": "body", - "pivot": [5, 22, 0], - "mirror": true, - "cubes": [ - {"origin": [4, 12, -2], "size": [4, 12, 4], "uv": [40, 46]} - ] - } - ] - } - }, - "spawn_egg": {"texture": "spawn_egg", "texture_index": 39}, - "render_controllers": ["controller.render.vindicator"], - "enable_attachables": true - }, - "wandering_trader": { - "identifier": "minecraft:wandering_trader", - "materials": {"default": "wandering_trader"}, - "textures": {"default": "textures/entity/wandering_trader"}, - "geometry": { - "default": { - "visible_bounds_width": 1.5, - "visible_bounds_height": 2.5, - "visible_bounds_offset": [0, 1.25, 0], - "bones": [ - { - "name": "head", - "parent": "body", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 24, -4], "size": [8, 10, 8], "uv": [0, 0]} - ] - }, - { - "name": "helmet", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - { - "origin": [-4, 24, -4], - "size": [8, 10, 8], - "uv": [32, 0], - "inflate": 0.5 - } - ] - }, - { - "name": "brim", - "parent": "head", - "pivot": [0, 24, 0], - "bind_pose_rotation": [-90, 0, 0], - "cubes": [ - { - "origin": [-8, 16, -6], - "size": [16, 16, 1], - "uv": [30, 47], - "inflate": 0.1 - } - ] - }, - { - "name": "nose", - "parent": "head", - "pivot": [0, 26, 0], - "cubes": [ - {"origin": [-1, 23, -6], "size": [2, 4, 2], "uv": [24, 0]} - ] - }, - { - "name": "body", - "locators": {"lead_hold": [0, 40, 0]}, - "cubes": [ - {"origin": [-4, 12, -3], "size": [8, 12, 6], "uv": [16, 20]}, - { - "origin": [-4, 6, -3], - "size": [8, 18, 6], - "uv": [0, 38], - "inflate": 0.5 - } - ] - }, - { - "name": "arms", - "parent": "body", - "pivot": [0, 22, 0], - "cubes": [ - {"origin": [-4, 16, -2], "size": [8, 4, 4], "uv": [40, 38]}, - {"origin": [-8, 16, -2], "size": [4, 8, 4], "uv": [44, 22]}, - { - "origin": [4, 16, -2], - "size": [4, 8, 4], - "uv": [44, 22], - "mirror": true - } - ] - }, - {"name": "held_item", "parent": "arms", "pivot": [0, 0, 0]}, - { - "name": "leg0", - "parent": "body", - "pivot": [-2, 12, 0], - "cubes": [ - {"origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 22]} - ] - }, - { - "name": "leg1", - "parent": "body", - "pivot": [2, 12, 0], - "cubes": [ - { - "origin": [0, 0, -2], - "size": [4, 12, 4], - "uv": [0, 22], - "mirror": true - } - ] - } - ] - } - }, - "render_controllers": ["controller.render.wandering_trader"], - "spawn_egg": {"texture": "spawn_egg_wandering_trader"} - }, - "wither": { - "identifier": "minecraft:wither", - "min_engine_version": "1.8.0", - "materials": {"default": "wither_boss", "armor": "wither_boss_armor"}, - "textures": { - "default": "textures/entity/wither/wither", - "armor_white": "textures/entity/wither/wither_armor", - "armor_blue": "textures/entity/wither/wither_armor", - "invulnerable": "textures/entity/wither/wither_invulnerable" - }, - "geometry": { - "default": { - "visible_bounds_width": 3, - "visible_bounds_height": 4, - "visible_bounds_offset": [0, 2, 0], - "texturewidth": 64, - "textureheight": 64, - "bones": [ - { - "name": "upperBodyPart1", - "cubes": [ - {"origin": [-10, 17.1, -0.5], "size": [20, 3, 3], "uv": [0, 16]} - ] - }, - { - "name": "upperBodyPart2", - "parent": "upperBodyPart1", - "pivot": [-2, 17.1, -0.5], - "cubes": [ - {"origin": [-2, 7.1, -0.5], "size": [3, 10, 3], "uv": [0, 22]}, - {"origin": [-6, 13.6, 0], "size": [11, 2, 2], "uv": [24, 22]}, - {"origin": [-6, 11.1, 0], "size": [11, 2, 2], "uv": [24, 22]}, - {"origin": [-6, 8.6, 0], "size": [11, 2, 2], "uv": [24, 22]} - ] - }, - { - "name": "upperBodyPart3", - "parent": "upperBodyPart2", - "pivot": [0, 24, 0], - "cubes": [{"origin": [0, 18, 0], "size": [3, 6, 3], "uv": [12, 22]}] - }, - { - "name": "head1", - "parent": "upperBodyPart1", - "pivot": [0, 20, 0], - "cubes": [{"origin": [-4, 20, -4], "size": [8, 8, 8], "uv": [0, 0]}] - }, - { - "name": "head2", - "parent": "upperBodyPart1", - "pivot": [-9, 18, -1], - "cubes": [ - {"origin": [-12, 18, -4], "size": [6, 6, 6], "uv": [32, 0]} - ] - }, - { - "name": "head3", - "parent": "upperBodyPart1", - "pivot": [9, 18, -1], - "cubes": [{"origin": [6, 18, -4], "size": [6, 6, 6], "uv": [32, 0]}] - } - ] - }, - "armor": { - "visible_bounds_width": 3, - "visible_bounds_height": 4, - "visible_bounds_offset": [0, 2, 0], - "texturewidth": 64, - "textureheight": 64, - "bones": [ - { - "name": "upperBodyPart1", - "cubes": [ - {"origin": [-10, 17.1, -0.5], "size": [20, 3, 3], "uv": [0, 16]} - ], - "inflate": 2 - }, - { - "name": "upperBodyPart2", - "parent": "upperBodyPart1", - "pivot": [-2, 17.1, -0.5], - "cubes": [ - {"origin": [-2, 7.1, -0.5], "size": [3, 10, 3], "uv": [0, 22]}, - {"origin": [-6, 13.6, 0], "size": [11, 2, 2], "uv": [24, 22]}, - {"origin": [-6, 11.1, 0], "size": [11, 2, 2], "uv": [24, 22]}, - {"origin": [-6, 8.6, 0], "size": [11, 2, 2], "uv": [24, 22]} - ], - "inflate": 2 - }, - { - "name": "upperBodyPart3", - "parent": "upperBodyPart2", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [0, 18, 0], "size": [3, 6, 3], "uv": [12, 22]} - ], - "inflate": 2 - }, - { - "name": "head1", - "parent": "upperBodyPart1", - "pivot": [0, 20, 0], - "cubes": [ - {"origin": [-4, 20, -4], "size": [8, 8, 8], "uv": [0, 0]} - ], - "inflate": 2 - }, - { - "name": "head2", - "parent": "upperBodyPart1", - "pivot": [-9, 18, -1], - "cubes": [ - {"origin": [-12, 18, -4], "size": [6, 6, 6], "uv": [32, 0]} - ], - "inflate": 2 - }, - { - "name": "head3", - "parent": "upperBodyPart1", - "pivot": [9, 18, -1], - "cubes": [ - {"origin": [6, 18, -4], "size": [6, 6, 6], "uv": [32, 0]} - ], - "inflate": 2 - } - ] - } - }, - "render_controllers": [ - "controller.render.wither_boss", - "controller.render.wither_boss_armor_white", - "controller.render.wither_boss_armor_blue" - ] - }, - "wither_skeleton": { - "identifier": "minecraft:wither_skeleton", - "min_engine_version": "1.8.0", - "materials": {"default": "skeleton"}, - "textures": {"default": "textures/entity/skeleton/wither_skeleton"}, - "geometry": { - "default": { - "texturewidth": 64, - "textureheight": 32, - "visible_bounds_width": 1.5, - "visible_bounds_height": 3, - "visible_bounds_offset": [0, 1.5, 0], - "bones": [ - { - "name": "body", - "parent": "waist", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]} - ] - }, - {"name": "waist", "pivot": [0, 12, 0]}, - { - "name": "head", - "parent": "body", - "pivot": [0, 24, 0], - "cubes": [{"origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [0, 0]}] - }, - { - "name": "hat", - "parent": "head", - "pivot": [0, 24, 0], - "cubes": [ - { - "origin": [-4, 24, -4], - "size": [8, 8, 8], - "uv": [32, 0], - "inflate": 0.5 - } - ], - "neverRender": true - }, - { - "name": "rightArm", - "parent": "body", - "pivot": [-5, 22, 0], - "cubes": [ - {"origin": [-6, 12, -1], "size": [2, 12, 2], "uv": [40, 16]} - ] - }, - { - "name": "rightItem", - "parent": "rightArm", - "pivot": [-1, -45, -5], - "neverRender": true - }, - { - "name": "leftArm", - "parent": "body", - "pivot": [5, 22, 0], - "cubes": [ - {"origin": [4, 12, -1], "size": [2, 12, 2], "uv": [40, 16]} - ], - "mirror": true - }, - { - "name": "leftItem", - "parent": "leftArm", - "pivot": [1, -45, -5], - "neverRender": true - }, - { - "name": "rightLeg", - "parent": "body", - "pivot": [-2, 12, 0], - "cubes": [ - {"origin": [-3, 0, -1], "size": [2, 12, 2], "uv": [0, 16]} - ] - }, - { - "name": "leftLeg", - "parent": "body", - "pivot": [2, 12, 0], - "cubes": [ - {"origin": [1, 0, -1], "size": [2, 12, 2], "uv": [0, 16]} - ], - "mirror": true - } - ] - } - }, - "render_controllers": ["controller.render.wither_skeleton"], - "enable_attachables": true, - "spawn_egg": {"texture": "spawn_egg", "texture_index": 29} - }, - "wither_skull": { - "identifier": "minecraft:wither_skull", - "materials": {"default": "wither_skull"}, - "textures": {"default": "textures/entity/wither/wither"}, - "geometry": { - "default": { - "bones": [ - { - "name": "head", - "cubes": [{"origin": [-4, 0, -4], "size": [8, 8, 8], "uv": [0, 35]}] - } - ], - "visible_bounds_width": 1, - "visible_bounds_height": 1, - "texturewidth": 64, - "textureheight": 64 - } - }, - "render_controllers": ["controller.render.wither_skull"] - }, - "zoglin": { - "identifier": "minecraft:zoglin", - "materials": {"default": "zoglin"}, - "textures": {"default": "textures/entity/hoglin/zoglin"}, - "geometry": { - "default": { - "bones": [ - { - "name": "body", - "pivot": [0, 19, -3], - "cubes": [ - { - "origin": [-8, 11, -7], - "size": [16, 14, 26], - "inflate": 0.02, - "uv": [1, 1] - }, - { - "origin": [0, 22, -10], - "size": [0, 10, 19], - "inflate": 0.02, - "uv": [90, 33] - } - ], - "locators": {"lead": [0, 20, -5]} - }, - { - "name": "head", - "parent": "body", - "pivot": [0, 22, -5], - "rotation": [50, 0, 0], - "cubes": [ - {"origin": [-7, 21, -24], "size": [14, 6, 19], "uv": [61, 1]}, - {"origin": [-8, 22, -19], "size": [2, 11, 2], "uv": [1, 13]}, - {"origin": [6, 22, -19], "size": [2, 11, 2], "uv": [1, 13]} - ] - }, - { - "name": "right_ear", - "parent": "head", - "pivot": [-7, 27, -7], - "rotation": [0, 0, -50], - "cubes": [ - {"origin": [-13, 26, -10], "size": [6, 1, 4], "uv": [1, 1]} - ] - }, - { - "name": "left_ear", - "parent": "head", - "pivot": [7, 27, -7], - "rotation": [0, 0, 50], - "cubes": [{"origin": [7, 26, -10], "size": [6, 1, 4], "uv": [1, 6]}] - }, - { - "name": "leg_back_right", - "pivot": [6, 8, 17], - "cubes": [ - {"origin": [-8, 0, 13], "size": [5, 11, 5], "uv": [21, 45]} - ] - }, - { - "name": "leg_back_left", - "pivot": [-6, 8, 17], - "cubes": [{"origin": [3, 0, 13], "size": [5, 11, 5], "uv": [0, 45]}] - }, - { - "name": "leg_front_right", - "pivot": [-6, 12, -3], - "cubes": [ - {"origin": [-8, 0, -6], "size": [6, 14, 6], "uv": [66, 42]} - ] - }, - { - "name": "leg_front_left", - "pivot": [6, 12, -3], - "cubes": [ - {"origin": [2, 0, -6], "size": [6, 14, 6], "uv": [41, 42]} - ] - } - ], - "visible_bounds_width": 4, - "visible_bounds_height": 3, - "visible_bounds_offset": [0, 1.5, 0], - "texturewidth": 128, - "textureheight": 64 - } - }, - "spawn_egg": {"base_color": "#c66e55", "overlay_color": "#e6e6e6"}, - "render_controllers": ["controller.render.zoglin"] - }, - "zombie": { - "identifier": "minecraft:zombie", - "min_engine_version": "1.8.0", - "materials": {"default": "zombie"}, - "textures": {"default": "textures/entity/zombie/zombie"}, - "geometry": { - "default": { - "visible_bounds_width": 2, - "visible_bounds_height": 2, - "visible_bounds_offset": [0, 1, 0], - "texturewidth": 64, - "textureheight": 32, - "bones": [ - { - "name": "body", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]} - ], - "parent": "waist" - }, - {"name": "waist", "neverRender": true, "pivot": [0, 12, 0]}, - { - "name": "head", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [0, 0]} - ], - "parent": "body" - }, - { - "name": "hat", - "pivot": [0, 24, 0], - "cubes": [ - { - "origin": [-4, 24, -4], - "size": [8, 8, 8], - "uv": [32, 0], - "inflate": 0.5 - } - ], - "neverRender": true, - "parent": "head" - }, - { - "name": "rightArm", - "pivot": [-5, 22, 0], - "cubes": [ - {"origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 16]} - ], - "parent": "body" - }, - { - "name": "rightItem", - "pivot": [-1, -45, -5], - "neverRender": true, - "parent": "rightArm" - }, - { - "name": "leftArm", - "pivot": [5, 22, 0], - "cubes": [ - {"origin": [4, 12, -2], "size": [4, 12, 4], "uv": [40, 16]} - ], - "mirror": true, - "parent": "body" - }, - { - "name": "leftItem", - "pivot": [1, -45, -5], - "neverRender": true, - "parent": "leftArm" - }, - { - "name": "rightLeg", - "pivot": [-1.9, 12, 0], - "cubes": [ - {"origin": [-3.9, 0, -2], "size": [4, 12, 4], "uv": [0, 16]} - ], - "parent": "body" - }, - { - "name": "leftLeg", - "pivot": [1.9, 12, 0], - "cubes": [ - {"origin": [-0.1, 0, -2], "size": [4, 12, 4], "uv": [0, 16]} - ], - "mirror": true, - "parent": "body" - } - ] - } - }, - "spawn_egg": {"texture": "spawn_egg", "texture_index": 12}, - "scripts": { - "pre_animation": [ - "variable.tcos0 = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed / variable.gliding_speed_value) * 57.3;" - ] - }, - "animations": { - "humanoid_big_head": {"loop": true, "bones": {"head": {"scale": 1.4}}}, - "look_at_target_default": { - "loop": true, - "bones": { - "head": { - "relative_to": {"rotation": "entity"}, - "rotation": [ - "query.target_x_rotation", - "query.target_y_rotation", - 0 - ] - } - } - }, - "look_at_target_gliding": { - "loop": true, - "bones": {"head": {"rotation": [-45, "query.target_y_rotation", 0]}} - }, - "look_at_target_swimming": { - "loop": true, - "bones": { - "head": { - "rotation": [ - "math.lerp(query.target_x_rotation, -45.0, variable.swim_amount)", - "query.target_y_rotation", - 0 - ] - } - } - }, - "move": { - "loop": true, - "bones": { - "leftarm": {"rotation": ["variable.tcos0", 0, 0]}, - "leftleg": {"rotation": ["variable.tcos0 * -1.4", 0, 0]}, - "rightarm": {"rotation": ["-variable.tcos0", 0, 0]}, - "rightleg": {"rotation": ["variable.tcos0 * 1.4", 0, 0]} - } - }, - "riding.arms": { - "loop": true, - "bones": { - "leftarm": {"rotation": [-36, 0, 0]}, - "rightarm": {"rotation": [-36, 0, 0]} - } - }, - "riding.legs": { - "loop": true, - "bones": { - "leftleg": {"rotation": ["-72.0 - this", "-18.0 - this", "-this"]}, - "rightleg": {"rotation": ["-72.0 - this", "18.0 - this", "-this"]} - } - }, - "holding": { - "loop": true, - "bones": { - "leftarm": { - "rotation": [ - "variable.is_holding_left ? (-this * 0.5 - 18.0) : 0.0", - 0, - 0 - ] - }, - "rightarm": { - "rotation": [ - "variable.is_holding_right ? (-this * 0.5 - 18.0) : 0.0", - 0, - 0 - ] - } - } - }, - "brandish_spear": { - "loop": true, - "bones": { - "rightarm": { - "rotation": [ - "this * -0.5 - 157.5 - 22.5 * variable.charge_amount", - "-this", - 0 - ] - } - } - }, - "charging": { - "loop": true, - "bones": { - "rightarm": { - "rotation": ["22.5 * variable.charge_amount - this", "-this", 0] - } - } - }, - "attack.rotations": { - "loop": true, - "bones": { - "body": { - "rotation": [ - 0, - "math.sin(math.sqrt(variable.attack_time) * 360) * 11.46 - this", - 0 - ] - }, - "leftarm": { - "rotation": [ - "math.sin(math.sqrt(variable.attack_time) * 360) * 11.46", - 0, - 0 - ] - }, - "rightarm": { - "rotation": [ - "math.sin(1.0 - math.pow(1.0 - variable.attack_time, 3.0) * 180.0) * (variable.is_brandishing_spear ? -1.0 : 1.0 )", - "variable.is_brandishing_spear ? 0.0 : (math.sin(math.sqrt(variable.attack_time) * 360) * 11.46) * 2.0", - 0 - ] - } - } - }, - "sneaking": { - "loop": true, - "bones": { - "body": {"rotation": ["0.5 - this", 0, 0]}, - "head": {"position": [0, 1, 0]}, - "leftarm": {"rotation": [72, 0, 0]}, - "leftleg": {"position": [0, -3, 4]}, - "rightarm": {"rotation": [72, 0, 0]}, - "rightleg": {"position": [0, -3, 4]} - } - }, - "bob": { - "loop": true, - "bones": { - "leftarm": { - "rotation": [ - 0, - 0, - "((math.cos(query.life_time * 103.2) * 2.865) + 2.865) *-1.0" - ] - }, - "rightarm": { - "rotation": [ - 0, - 0, - "(math.cos(query.life_time * 103.2) * 2.865) + 2.865" - ] - } - } - }, - "damage_nearby_mobs": { - "loop": true, - "bones": { - "leftarm": {"rotation": ["-45.0-this", "-this", "-this"]}, - "leftleg": {"rotation": ["45.0-this", "-this", "-this"]}, - "rightarm": {"rotation": ["45.0-this", "-this", "-this"]}, - "rightleg": {"rotation": ["-45.0-this", "-this", "-this"]} - } - }, - "bow_and_arrow": { - "loop": true, - "bones": { - "leftarm": { - "rotation": [ - "query.target_x_rotation - 90.0 - math.sin(query.life_time * 76.8) * 2.865 - this", - "query.target_y_rotation + 28.65", - "-(math.cos(query.life_time * 103.2) * 2.865) - 2.865" - ] - }, - "rightarm": { - "rotation": [ - "query.target_x_rotation - 90.0 + math.sin(query.life_time * 76.8) * 2.865 - this", - "query.target_y_rotation - 5.73", - "(math.cos(query.life_time * 103.2) * 2.865) + 2.865" - ] - } - } - }, - "use_item_progress": { - "loop": true, - "bones": { - "rightarm": { - "rotation": [ - "variable.use_item_startup_progress * -60.0 + variable.use_item_interval_progress * 11.25", - "variable.use_item_startup_progress * -22.5 + variable.use_item_interval_progress * 11.25", - "variable.use_item_startup_progress * -5.625 + variable.use_item_interval_progress * 11.25" - ] - } - } - }, - "zombie_attack_bare_hand": { - "loop": true, - "bones": { - "leftarm": { - "rotation": [ - "-90.0 - ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4) - (math.sin(query.life_time * 76.776372) * 2.865) - this", - "5.73 - ((math.sin(variable.attack_time * 180.0) * 57.3) * 0.6) - this", - "math.cos(query.life_time * 103.13244) * -2.865 - 2.865 - this" - ] - }, - "rightarm": { - "rotation": [ - "90.0 * (variable.is_brandishing_spear - 1.0) - ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4) + (math.sin(query.life_time * 76.776372) * 2.865) - this", - "(math.sin(variable.attack_time * 180.0) * 57.3) * 0.6 - 5.73 - this", - "math.cos(query.life_time * 103.13244) * 2.865 + 2.865 - this" - ] - } - } - }, - "swimming": { - "loop": true, - "bones": { - "body": { - "position": [ - 0, - "variable.swim_amount * -10.0 - this", - "variable.swim_amount * 9.0 - this" - ], - "rotation": [ - "variable.swim_amount * (90.0 + query.target_x_rotation)", - 0, - 0 - ] - }, - "leftarm": { - "rotation": [ - "math.lerp(this, -180.0, variable.swim_amount) - (variable.swim_amount * ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4)) - (variable.swim_amount * (math.sin(query.life_time * 76.776372) * 2.865)) - this", - "math.lerp(this, 14.325, variable.swim_amount) - this", - "math.lerp(this, 14.325, variable.swim_amount) - (variable.swim_amount * (math.cos(query.life_time * 103.13244) * 2.865 + 2.865)) - this" - ] - }, - "leftleg": { - "rotation": [ - "math.lerp(this, math.cos(query.life_time * 390.0 + 180.0) * 0.3, variable.swim_amount)", - 0, - 0 - ] - }, - "rightarm": { - "rotation": [ - "math.lerp(this, -180.0, variable.swim_amount) - (variable.swim_amount * ((math.sin(variable.attack_time * 180.0) * 57.3) * 1.2 - (math.sin((1.0 - (1.0 - variable.attack_time) * (1.0 - variable.attack_time)) * 180.0) * 57.3) * 0.4)) + (variable.swim_amount * (math.sin(query.life_time * 76.776372) * 2.865)) - this", - "math.lerp(this, 14.325, variable.swim_amount) - this", - "math.lerp(this, -14.325, variable.swim_amount) + (variable.swim_amount * (math.cos(query.life_time * 103.13244) * 2.865 + 2.865)) - this" - ] - }, - "rightleg": { - "rotation": [ - "math.lerp(this, math.cos(query.life_time * 390.0) * 0.3, variable.swim_amount)", - 0, - 0 - ] - } - } - } - }, - "animation_controllers": { - "humanoid_baby_big_head": { - "initial_state": "default", - "states": { - "baby": { - "animations": ["humanoid_big_head"], - "transitions": [{"default": "!query.is_baby"}] - }, - "default": {"transitions": [{"baby": "query.is_baby"}]} - } - }, - "look_at_target": { - "initial_state": "default", - "states": { - "default": { - "animations": ["look_at_target_default"], - "transitions": [ - {"gliding": "query.is_gliding"}, - {"swimming": "query.is_swimming"} - ] - }, - "gliding": { - "animations": ["look_at_target_gliding"], - "transitions": [ - {"swimming": "query.is_swimming"}, - {"default": "!query.is_gliding"} - ] - }, - "swimming": { - "animations": ["look_at_target_swimming"], - "transitions": [ - {"gliding": "query.is_gliding"}, - {"default": "!query.is_swimming"} - ] - } - } - }, - "move": { - "initial_state": "default", - "states": {"default": {"animations": ["move"]}} - }, - "riding": { - "initial_state": "default", - "states": { - "default": {"transitions": [{"riding": "query.is_riding"}]}, - "riding": { - "animations": ["riding.arms", "riding.legs"], - "transitions": [{"default": "!query.is_riding"}] - } - } - }, - "holding": { - "initial_state": "default", - "states": {"default": {"animations": ["holding"]}} - }, - "brandish_spear": { - "initial_state": "default", - "states": { - "brandish_spear": { - "animations": ["brandish_spear"], - "transitions": [{"default": "!variable.is_brandishing_spear"}] - }, - "default": { - "transitions": [{"brandish_spear": "variable.is_brandishing_spear"}] - } - } - }, - "charging": { - "initial_state": "default", - "states": { - "charging": { - "animations": ["charging"], - "transitions": [{"default": "!query.is_charging"}] - }, - "default": {"transitions": [{"charging": "query.is_charging"}]} - } - }, - "attack": { - "initial_state": "default", - "states": { - "attacking": { - "animations": ["attack.rotations"], - "transitions": [{"default": "variable.attack_time < 0.0"}] - }, - "default": { - "transitions": [{"attacking": "variable.attack_time >= 0.0"}] - } - } - }, - "sneaking": { - "initial_state": "default", - "states": { - "default": {"transitions": [{"sneaking": "query.is_sneaking"}]}, - "sneaking": { - "animations": ["sneaking"], - "transitions": [{"default": "!query.is_sneaking"}] - } - } - }, - "bob": { - "initial_state": "default", - "states": {"default": {"animations": ["bob"]}} - }, - "damage_nearby_mobs": { - "initial_state": "default", - "states": { - "damage_nearby_mobs": { - "animations": ["damage_nearby_mobs"], - "transitions": [{"default": "!variable.damage_nearby_mobs"}] - }, - "default": { - "transitions": [ - {"damage_nearby_mobs": "variable.damage_nearby_mobs"} - ] - } - } - }, - "bow_and_arrow": { - "initial_state": "default", - "states": { - "bow_and_arrow": { - "animations": ["bow_and_arrow"], - "transitions": [{"default": "!query.has_target"}] - }, - "default": {"transitions": [{"bow_and_arrow": "query.has_target"}]} - } - }, - "use_item_progress": { - "initial_state": "default", - "states": { - "default": { - "transitions": [ - { - "use_item_progress": "( variable.use_item_interval_progress > 0.0 ) || ( variable.use_item_startup_progress > 0.0 )" - } - ] - }, - "use_item_progress": { - "animations": ["use_item_progress"], - "transitions": [ - { - "default": "( variable.use_item_interval_progress <= 0.0 ) && ( variable.use_item_startup_progress <= 0.0 )" - } - ] - } - } - }, - "zombie_attack_bare_hand": { - "initial_state": "default", - "states": { - "default": { - "transitions": [{"is_bare_hand": "variable.is_holding_left != 1.0"}] - }, - "is_bare_hand": { - "animations": ["zombie_attack_bare_hand"], - "transitions": [{"default": "variable.is_holding_left == 1.0"}] - } - } - }, - "swimming": { - "initial_state": "default", - "states": { - "default": { - "transitions": [{"is_swimming": "variable.swim_amount > 0.0"}] - }, - "is_swimming": { - "animations": ["swimming"], - "transitions": [{"default": "variable.swim_amount <= 0.0"}] - } - } - } - }, - "render_controllers": ["controller.render.zombie"], - "enable_attachables": true - }, - "zombified_piglin": { - "identifier": "minecraft:zombie_pigman", - "min_engine_version": "1.8.0", - "materials": {"default": "zombie"}, - "textures": {"default": "textures/entity/piglin/zombified_piglin"}, - "geometry": { - "default": { - "bones": [ - { - "name": "body", - "pivot": [0, 24, 0], - "cubes": [ - {"origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]}, - { - "origin": [-4, 12, -2], - "size": [8, 12, 4], - "uv": [16, 32], - "inflate": 0.25 - } - ] - }, - { - "name": "head", - "parent": "body", - "pivot": [0, 24, 0], - "cubes": [ - { - "origin": [-5, 24, -4], - "size": [10, 8, 8], - "uv": [0, 0], - "inflate": -0.02 - }, - {"origin": [-2, 24, -5], "size": [4, 4, 1], "uv": [31, 1]}, - {"origin": [2, 24, -5], "size": [1, 2, 1], "uv": [2, 4]}, - {"origin": [-3, 24, -5], "size": [1, 2, 1], "uv": [2, 0]} - ], - "inflate": -0.02 - }, - { - "name": "leftear", - "parent": "head", - "pivot": [5, 30, 0], - "rotation": [0, 0, -30], - "cubes": [{"origin": [4, 25, -2], "size": [1, 5, 4], "uv": [51, 6]}] - }, - { - "name": "rightear", - "parent": "head", - "pivot": [-5, 30, 0], - "rotation": [0, 0, 30], - "cubes": [ - {"origin": [-5, 25, -2], "size": [1, 5, 4], "uv": [39, 6]} - ] - }, - {"name": "hat", "parent": "head", "pivot": [0, 24, 0]}, - { - "name": "rightarm", - "parent": "body", - "pivot": [-5, 22, 0], - "cubes": [ - {"origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 16]}, - { - "origin": [-8, 12, -2], - "size": [4, 12, 4], - "uv": [40, 32], - "inflate": 0.25 - } - ] - }, - {"name": "rightItem", "parent": "rightarm", "pivot": [-1, -45, -5]}, - { - "name": "leftarm", - "parent": "body", - "pivot": [5, 22, 0], - "cubes": [ - {"origin": [4, 12, -2], "size": [4, 12, 4], "uv": [32, 48]}, - { - "origin": [4, 12, -2], - "size": [4, 12, 4], - "uv": [48, 48], - "inflate": 0.25 - } - ] - }, - {"name": "leftItem", "parent": "leftArm", "pivot": [1, -45, -5]}, - { - "name": "rightleg", - "parent": "body", - "pivot": [-1.9, 12, 0], - "cubes": [ - {"origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 16]}, - { - "origin": [-4, 0, -2], - "size": [4, 12, 4], - "uv": [0, 32], - "inflate": 0.25 - } - ] - }, - { - "name": "leftleg", - "parent": "body", - "pivot": [1.9, 12, 0], - "cubes": [ - {"origin": [0, 0, -2], "size": [4, 12, 4], "uv": [16, 48]}, - { - "origin": [0, 0, -2], - "size": [4, 12, 4], - "uv": [0, 48], - "inflate": 0.25 - } - ] - } - ], - "visible_bounds_width": 2, - "visible_bounds_height": 2, - "visible_bounds_offset": [0, 1, 0], - "texturewidth": 64, - "textureheight": 64 - } - }, - "spawn_egg": {"texture": "spawn_egg", "texture_index": 13}, - "render_controllers": ["controller.render.zombie_pigman"], - "enable_attachables": true - } -} \ No newline at end of file diff --git a/renderer/viewer/three/entity/exportedModels.js b/renderer/viewer/three/entity/exportedModels.js deleted file mode 100644 index fde9391f..00000000 --- a/renderer/viewer/three/entity/exportedModels.js +++ /dev/null @@ -1,38 +0,0 @@ -export { default as allay } from './models/allay.obj' -export { default as axolotl } from './models/axolotl.obj' -export { default as blaze } from './models/blaze.obj' -export { default as camel } from './models/camel.obj' -export { default as cat } from './models/cat.obj' -export { default as chicken } from './models/chicken.obj' -export { default as cod } from './models/cod.obj' -export { default as creeper } from './models/creeper.obj' -export { default as dolphin } from './models/dolphin.obj' -export { default as ender_dragon } from './models/ender_dragon.obj' -export { default as enderman } from './models/enderman.obj' -export { default as endermite } from './models/endermite.obj' -export { default as fox } from './models/fox.obj' -export { default as frog } from './models/frog.obj' -export { default as ghast } from './models/ghast.obj' -export { default as goat } from './models/goat.obj' -export { default as guardian } from './models/guardian.obj' -export { default as horse } from './models/horse.obj' -export { default as llama } from './models/llama.obj' -export { default as minecart } from './models/minecart.obj' -export { default as parrot } from './models/parrot.obj' -export { default as piglin } from './models/piglin.obj' -export { default as pillager } from './models/pillager.obj' -export { default as rabbit } from './models/rabbit.obj' -export { default as sheep } from './models/sheep.obj' -export { default as arrow } from './models/arrow.obj' -export { default as shulker } from './models/shulker.obj' -export { default as sniffer } from './models/sniffer.obj' -export { default as spider } from './models/spider.obj' -export { default as tadpole } from './models/tadpole.obj' -export { default as turtle } from './models/turtle.obj' -export { default as vex } from './models/vex.obj' -export { default as villager } from './models/villager.obj' -export { default as warden } from './models/warden.obj' -export { default as witch } from './models/witch.obj' -export { default as wolf } from './models/wolf.obj' -export { default as zombie_villager } from './models/zombie_villager.obj' -export { default as boat } from './models/boat.obj' diff --git a/renderer/viewer/three/entity/externalTextures.json b/renderer/viewer/three/entity/externalTextures.json deleted file mode 100644 index 82ad82a8..00000000 --- a/renderer/viewer/three/entity/externalTextures.json +++ /dev/null @@ -1 +0,0 @@ -{"allay":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAV1BMVEUAAAA4jNkuh9Ypg9FBnNpCm9r///+c/P+A/P9k+/9N8/hM6f9Q2f8+5eo94PdG0P821+4s1ewiz/8syf8ox/8bxPNNq+wQwf8os+hCnNpCm9oep9s0h8D7j8AOAAAABnRSTlMAoKCg3PODq/XXAAAA60lEQVR42tWP0W7DIAxFb9OtwdA6xQ3rzZL//84BD0nRljzsZdqxZCx8hLio3Lz4GwtYMWLDi4jnPM+vwogNKTTC43Elr6vgRMQ1wvM5ktsbvRPXN38wGxKHMmnI9M65vgxavwsg2WCpCvlSg6iqlCF4ceKbFEGZVC+5NFFXYUtxZzILl1xmiffoxUcA5DUHKULZp6iqsQzU6KNWYcxBUMnp8A2mwWxAhTPR0qRYFs6sDT+zTMZpWj5pO8L0wamexJ9xXvm10J27rrQ94dSdOqC0PSFXPV4JRuwRzIxGHMB38O14j4N9Wf4/vgDzpRGDwkNeQQAAAABJRU5ErkJggg==","axolotl":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAP1BMVEUAAACvsv+zsPmmqv+nn/+GkPXWhCt+iOyBb+d1b/9odutodOyTWuRbb+NlZfS0W0xsV+JpVuNNWc82QZ86AGw+Ir4cAAAAAXRSTlMAQObYZgAAAUdJREFUeNrtk9FugzAMRXG4twFS1jbl/791cbJUQnuAmE2VKk5cKpDukeNA9zeAhP4mwDlgahdAEoDm1dAukIzmlXaB/HBcUGbQJCBkBejgkMrt3j5WeYGD0iAglkXkehVZFlBQ2b0FkKjtE2CjIIYEUfIhESdMCUyWoyBFZPZI+Nks8OUs/f7kXSsLgCxwiRbBl9YRgddazcC5lhnc/T1VFdQObDMIwdJBRQQhYNWBTTCXYzR0AMZIyOy9c373FuQFGXLJLzYFEJQvQSHKgwKwJQAF1BWqIBC6hNlKbAg0GPXyjDHkeqoj6iVAn4DdP/NQhuHxsAr6HroAswB52QUcySTgeGQGg3J8lPY55h7Q9705XQdpEgwaHXVhtHZQX6Whew+X+mfldsn5W3fEYM9fVjfm/pXShd1g38UrdvuIGZycnJy8kW/CDQ5IMRlUUgAAAABJRU5ErkJggg==","blaze":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAAJ1BMVEUAAAD//////4T/+Ef/1Sj8shf8lgDReACrdQGLNAFsMQBfAgExDgs044iSAAAAAXRSTlMAQObYZgAAAPdJREFUeNrdzzFuAjEQheH3vNR4xtCkibyQA4CSCyAlfZocIjdKm4sFxAHwGKVmQo21Ts9X//IbE1evBfpBjG9ozXDlJZkKTkAr4IpShNVkMjiJ7wuUkwEJhcAmAzFGNcTJoFisJZph6heJiG7xDLT4XKRC4KiubvSf24kY6hiLnVPMVfE+NhPbo2Y3YVBfPA2/Q3PkchGGx++H4yZvd3GdNrjBr32FeDzPUdN88Mvn7QRHHiSX9SkMwnxYNTdkq7sDlMsLkZHRBEwBGaBpKnQ6GqsVegLIfrDOfOkGI0W7gQTN6JhJQlcYCOm+oJyjHyD+F7jg7v0B5TtIgi1mkx4AAAAASUVORK5CYII=","boat":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABABAMAAAAg+GJMAAAAG1BMVEX///8AAADCbT+6YzetXTKgVjCZUCuPTCqIRyg96zNeAAAAAnRSTlMAAHaTzTgAAAPOSURBVHja7VTLbus2EBX6XOcPimGzL3jG7rbIzChdFjap3GUB65Fl0ZtY/oFr67NLqoljFVDkRXFXOZZnQI/nmOYcnqL4se/7U59xyGGy+qtI+OanHDdWvOLmEkXxnWp1DKZqj43mVB2jakiroH+8EfhZgu8t2BdVC/opWCbKq6hppfbbG8F2juApxqp9RRPDp+G0f112hyF9/9tfxr+wmiF4NvZE6VmNMdyfWoAB3oHRHs4ENrsDgzYChcYc4/3eHhq1YFWOXfr+D3/mrjueIdhHgVgVhMcYu2c1a/dRY473ZwKPGYLh6Df0MzndjvFxeFoDW1glOT4Q2n6/81TcydwOyqHvhqHfH3I6NN3jcBoSDmM6Oq2GUxAqUM5OQTjEIGBhtm28b7Sq2pgnGWJbslWJ/cnP6+C5jGKKlUXvaePrh7axJmjT1ow1r7ns0kZOvpAwt4PSOyFHxBpFtL6vYQIBx6oxq1zZJ4IvVGy2s2NkgEO0ynYcY7yvg2pVNe1zp0lh+RD7/u9EMDvGath3w6k7jOkxH2I/5AMc0/HcJavZMToLEI0rckSrx+GztcGsqncQcHfuWtmskG69c3TriDlaFbvPNUSwEw5V0/bnLtLZMSqiCrOM2wgP+1A2eYSat/G2A8YcgVngChaj5G3kyxSqJ2vbRrBrD+cux7O3cXKd4+/T69z4HZFLj3u5tGvXTwmKuEXGCv0rLn9COELBlfqXSxvlvwS0oYxbGl5xSbDsieS33hP8ypG/cyBP7C/qy54I2TFUsE5xJyrKpVzUlz0RWgsEWiprrQLWUi/qy57Y79Ohp6frcsro2ov6sidSAI8GagJhAURxUV/2RG1ijM/pXcUzLurLnlhgOyeDjGVPzDqYymBSd/owHM+eOKMDAmHlHYknELtJnfvDcIz6jici7FjApQlqQGUtk/qv2RFbfccTEWqooDRkGUxUkHGbCfYyeuK8DrqzDCYqyKC+Hw9x3hMpMNYKmIIFIuBJfdkTsw4eJjKY1Jc9sQBGJbykfoJUX/TEgjw2BHKgjSM/TJDqi55I3rmNzwyUkvPkSQj5gzvv6GbZEzH6ADgK1xCDCtISlhJUbpY9EVFWdVSwxUY4WgDXMQgHrsHxCk9sX+ygzcjpctneLCL7gVhAaRaE2QRQBpeM8TXfOPWDf6VwVsN5GRe6l3VwDYHztElvuJQchgmuIaCEDdFForu3dAUBtpIHBnAevKmkzAJAa6heRTB2ytgBE6juFGBBLSwzXf+zDsaBrwUQiAnALChFwIB+DR28X/4g+CD4ILgW/wAFIWww3uybGQAAAABJRU5ErkJggg==","camel":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAATlBMVEUAAAD8w2n1ul3prUrbnz3xi1ywmYjLkzfrdTmoilu4gieqg0Scf1DaZiyMcEV/b2OnTiFtX0h3XTNfUj5VSENfSCN/ORlJPzBRIQwvKBwTHWK4AAAAAXRSTlMAQObYZgAACApJREFUeNrtmItiqzYMho2kE7VeKbRJGX3/F110sQ0xlNC0y85Z/6aJLwJ92EYWhBC6U4iil5fjy0uYCppGPmEiRIyRtSBFkVVYC66maQCbs8JH+iuYDgngeDxuAwAwovQhInA0GpAazwAauBbgcAgGcBTNAUBOBLPrB0A+awrAaADMMwDYAkjmXQb4+wIAFQDDkgAQHKCWHnYNgGsdABpYBXgCYI58K0BUMRMicTRlAAQAXAbAx8dHfGLmpxUAaK4D4OwfkLkCwBpAqZ6ezgBPT1Iu/fsXoQOwAAAgOYH6yLeZFKQOJut8fX17ent9XQcAhD0ARAhYAAQH3t7ftfb+/gZClwHwTZgeXx8RpfxpgOcCQITqQ1YBJ4DJCCQAdIDz9aukgPjZNWBBJ68AI5DpiIEIVFEEKmEUFAyAKCswf8PyGsAtgBeLu+5fgG0VEHEQbwXA2QhFFNbUFBkANHMB6HVlgGMGkHa3YDIAZUKKMZIUzL+OwToAFE+N/+UmrQBOASTurgGgE5Ao+Qe7F8KaAJNrkTlzlLME3ucwE4QMgJCngIg5gBO4Y/sxrQMgpqtEQkLU7wwiVflUQ8h2E6iIWKRxAI1A/8mmAUQY1qReHbdIWmDWWgGwDjupSVQFVIfyXQq4FBdXMok9Nub+LPk2AA4I6ZILCC7dBSuZxB4b88zEImIDELcZIJWJkJAqgKVMYo+N+0ciGwsFmM5ALhLLnwJsbeQ7bAyAAIGYMgAnAiz+mVj11QDqH4EsCjrAljYziWJj3RyLagAktI8RMIUtbWQSRZHZt9lVAGZxTc+EhEZA2wBLmQQvAcy7DbkGiM9Hfubjc0S3C5uqMwmRpjIi9Hs7+AAROYAQ14P0fDw+H+XrYiAbFTBYQc/pIqLLTEIVfBNSC+JQ+tVadX2sUvcKAAbARUQXmYRfMjg0s1bNf14FeuD1sUq2J2iQUH8b4qnoMpMg8RIaE5OIA3m3E7AYXR+rfGdH39fTNfjv5UaOZxUAJhuB1A0GIEbboaIApG1U3bh/MoIagAjnI7AEQLQHAETEBCIFiHJmKyxlEgVANJkCQAMQo+tjlR+ZvHjcIbddzCTyIiRi4ckGnnCL0YeximcAlkawpRWN+08El5mENTqAj1SIeiw5tk3iZqwqAN7MYuMAZQSWMwmPAzGyAzAno+VoWcWq2RSgYzFj0/gApDNVmYSYCTSILZtN7k0cXAPMY5V8pgBGpABGkgGqTIItnRWB+YuBrBOdwGxmmscq8zGZAo4mRmjm/mOVSVhCb4rmTwDIbdhBLwDqWGWMDhCTHIBUalllEjOAyOs2M1WhQk1qgPouWM4kygjYFPDEhsxmH8D6CCxmEtMRiGs2M63HqnoNlEUgzcuZBJp0KtdsZlqPVfVd4P6dYDmTQJPBrtjMNI9VVSByaPYRyABmVCsDmMK2qlhVRULzawCRZkbogvwE0yBKgeQ3Nc9VAUxiVQ3gCbcGy2ozcgDKTzBi5G8TGqloq1mU73ChKlaJlwwAYHcOAfgUuOYAVN4IEBIgkdZUVACkWAOUWFUBgG2HbJsh1GtAz5sB0F9pIBFpbQ7gPVc/GdUJSfJfRiCfFwHBLpKJDZkQtZUEUcTWVwOsxyqwlIwtJQOOsQxAAdA29a5dFEk5jcHaDICjnfv6JyN7s4SMoIk5c0kIHIAFwNeQHipOSBxZFcVWARij7bY1wHqsUv+AhKAEpH3qRWTH6hVb3GPx7GKeNiMjl8fXfU9GnhVL0c5WQvEXyV+q6o8WSoMWbQq0XDq1Vo5LQv/dCeDnqAWz54LKJru/GcCvL6uUPVsldD+1XTm4AEDYI7DrnF0hpjKQrzzKLTgbIRsbx4MI+wHyO8lyJSAVL4p/JQD3KJ354ss7TDsuWh/uBGgAmTC/1wWgNOeAFE2EkNYEJTutMEKzC2BcADACBPRNldK6xwkApnuCiqH5NwABjwSwBTDUAHIK9sQIPLpaK6ImSfKFmJ9Bix0xa6t2ap8W9gHYhHuMRf2j6GsCiSPbh9DnPLqVZyZgrQAOJwUK6+pXXrJH4pxykzqBRgGSCHWWtS9bMkWwPduWMpMVkrP24eGh7YfhQwDf6/NG6/Eb9cxS1T9m5UTpy3Zi6f49qfWJrC67d79tGyrZLehZrCgngQAYI6f9V+v5CTbb6wSopO5coVb7IAr/ltqhFw1t+D7p/I6iUGsYx2GQr3A/Cdmt8on73DgO/RDuqr7t/1yAdq3WnSqAr/dSolldO5xuXgPbXsqOWtcOh677srtgWK2N7sTVjaXYnU5fEwfavu+G3gdRCl3ft63GnrYagTtEwjVqL/SC+uvXL8Gt274PSgfMh6w19Uttfy7AMPbmYRyG3jQstX3n9jOI9Ne11BZ+9KMf/eh30tj37XkLa/t+vBdAa7oXwJABhh+A/yVAOw69J3L9MPbjXGFRnrkmm9t0dpnTmHFsLxKNsKgzrxCb5a0AYXKGuzzq3x+gHwpL/wPwA/AD8F+OA22/0fW7ArTTveCjzait6KquT6mf7oYfbUb9sLGMvjsfuD/AuNH13QDDuNF1f4D7Pxd0J1F3pycjf4vbHQ4b8aKqjEPvMzDus9zWNoCfd7C3bTst9wMMVWWv5e37Xl3ZtvxjAA790FWn3WN5O8DYySry17ujlK0STKk+mqUbjl/22qAbxlM57eTNbnKQ62JZUL3/9kDUnfur8LnD8vZANI5V/L7J0r12G4XqtFXFtd/Sx32j8N0Ap9N24R/eOq3aGiGdPwAAAABJRU5ErkJggg==","cat":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAMAAACVQ462AAAATlBMVEXv9O3r8Oj72bPW1sz71Wf2ymD1yF7ywFnxv1jvt1Pqq0uvdh57bWJjSy9KMBc6Kh0RDxgAAADq6urOzs6vr7C+c3NanRJWU18kJDEcGCdfq47cAAAAEnRSTlMAAAAAAAAAAAAAAAAAAAAAAACVcz0/AAABUUlEQVR42t3T3VrCMAyA4Yi1SmtlSxSS+79Rkz6R0dEywTO/0rPyPst+IFhiMSJyAW+amJBFA08EEWBeBQtQ/1BKuRuY5yAusACo4ABSBUpFxbsCPkJKDgiLgAktANYYOFhyDlxQgFCFbUA6VaGg9lsAj3LExmBCi1i8MdDNBWJ5GBDmFmBhFuE7ANQWgInVY+q8B8wh58w8gy2rBxASIRJ2gVwBOOf3oAFQ6wL1kP0QeQU0AhRdIb5eAe+15V1vAWqB/X4E2PgrADtA3O/XgJ3WTSDeCJi8zcc4eAo+QroBsC7hC4AMOAspxGQNAUZdTDwAtkdAQrTdALQAMYX4FkIYA1VwoNZ+CynqCLeuIOSkAYyAqRZjFyDNAe8FytIOLuoCNv3hkLPtkP3k8xNc1RthZ6YiPwAMmmoAHUC028DGCKevkwg8DnxafwDmO/uHwDebkIAap1EwrQAAAABJRU5ErkJggg==","chicken":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAALVBMVEUAAAD////i4uL85XDT09PhzGLGxsbgu2nTrlrQqT/Bk0OWcjRjVkH/AAAAAADtfCsnAAAAAXRSTlMAQObYZgAAAO9JREFUeNrtzMFJxFAQxvFZrGAewaMwwxQg2IA7fMzZElQecxZswHZc7CAd2MM72IlJVoXEbATP+7998OMj2kmHW6LXQ9/T0AUt25UuB/D+dgQ317+AXLZ7OgxN4vmJ5vGxforGXhbgSj9ElFqjrxYXomN+GriqmqG1H3E3B7DmQN0A0Wpk0laqKlw2gKv9AdycbRNE1dgA1SOy0hTWQCIrgqaUlnGBqkLY4aeAq0FYfT/OFRBQVGERWQddAKh7ZuFVUCwqorow8166jgVzoBaZWV2FRZS5iM2BYwKwBzEfjJSYg/zOIx7hDk86948+AcUmS5dD8ZFCAAAAAElFTkSuQmCC","cod":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAJFBMVEX///8AAADr2sPWxa3KtJXCqIW2lmusiVmScVqEZVEiHyYAAAB2QJV6AAAAAnRSTlMAAHaTzTgAAACbSURBVHja7coxCsJAEIXh5w18RSRiZQT7sAS8Rgyz2kbYIN5CiDBbx8CewHM6QS3sLf1hivl4yMc626+ZCgKQzENVF6eSsaCVkRCRfCiZhFYwcM4t+13SqFdOwS6/Vw+5HA3qFyz7beOqriX9ezFsKmlcySn4lFKMMQiJGYWwR9VQyTnGmggh3M7eeyGBQ0u4TwZkR/C7P/weVk/OOkCzBdD8ogAAAABJRU5ErkJggg==","creeper":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAK2klEQVR42tWZ61NU5/3And+L3zTNdDpT08Q0NiamOtFG8cJlQa4uy22vsCzLLrssgtw0KooIMcaqFFFRXOSiQjA11lwIVRF1QRBW7gIuy9H1pLgpM9SZ/hmf7j4zzXT6Jn1jkTPzzNlzec6e7+f53s+yn9piOzdzwltJp3SdNrmZW1IHKc5E+ufvUDJhJndYR4/UTa5Pw8ePrWQ1mrjp/5qhhT76JRfLlvoWcXYzceei+EMAws7v06n070R9LpXxF0NktKSjuR1L7/wtSr3ZHBgsYNDfi8Gp5Za3gw7/1aUPIHkwjLSxKAytGg5KBZT1FOD3+/nkWTH75uwMzQ0w9sJNXk86X/nbyT5lpuqvhWSPJnFL/mrpAyh6bMI+osPUmEnetA7bPS0j824OeXdS6DbR4+ui23MDSZKYm5sT+3JvPoYuJU2e00sfQHrfdpTd4bh9A0LVi3stQsiqsV3sdtnF7wOTeZQ/ykeWZbzyY/IeGnDUOrgndy59AHG1CmxuHa1yPabmDF68eEHB5wVitXd2Z9Ev9XJkdhelXTYBQ1+nE5B2XilgcL536QPoePInrnmvsOz6MrT3NUzNj2NxWshx5uBodmB2ZmHo2c7M/BTGJgPWhmwRKfZM5nBwomDpAzD0a9gxYhQAXr/6Os8XvhcAhuUB0j/X4BjWUThnxNRjRD0Ry26fhYzzBg75Cyh/UPjqA1DPxKC/r6Td24RjVI+lJ42cOgtFY1nYh/Rcf/wFy7/9JZruBNrH24Wa1/gP8tn0XrTONEpnzOwbzaPl6VkB6Xe33iWpbjslwxby+4w898/hGDSwtzdPRI978i0+9lnZNW1FU5+2+ICyHqSgP6PjrHSUlBYV2t446qQTJN2PEgnQusa1ATAWElzh7H1UiKYhhTK/ncJ+k4Cx566D5AYl9z33gwDEuC13cGikhPl/PMfRZse90EvpkF1cW92+msrJQgrdWVzw1LL4Kt6ow+fz0em/ykXpnMj24k/GEn8+AMBTTvJoOKsy30KRvZlG+SzmS1m8q1sRPBYrWnilUHj/q1NX2dS1id989zY51VbMrZlIPi+H/1rMoYDArmnXj4CyhtScnq1h73j+4gOonCrih4UfMHuTyXmqpsN/DZd8gxb5LK2yE81UjBA4cCvFMyaSb0eK329FvUGVpzioDQJE/qwRi5TG9/5nYv7oC7fQkE/9JVQMltAr32PFzTf4xdev0/aojdimGJTuMP6vbdnPFhWAozsDkcpOWcXqKFyh2CU16uloqqUjnJZOUOgy0yTXs1L/Br/VvMmw5CblrIpcr4bM7kQhaPXf9lPeJ7RBCH3YU0qLVMdl2UnR7WwkeZY94zmUDxaKOsLQoqPoSebia0DecDoXZScJDbECwPKOX5E3qSX+dhjX59r4s9RK+kWdUPnA7WKsMq2gWDYxKPWxe9gmkh/9ZQ2Vo6UiTzgwvYMDDwuCgor0WFevERlj0YgZe4udPc9zMM4oGZOHFh9AbJOCK1Ije6d2EXVRQeaFDOJubqXaW0mDp0ZUdcVXi4Tg/z4c/QbSL2nRtKcKDbjmacXozMDeamP/QD4LCwtMShMMzw1gv2wjsS6Bsgc7xPlPPKWYXSkBGDYWXwMmdUEBRIJz1ddMu9yMsS+RG95vSGlMEit94m9lwuYbpT8Gzwsz2FYfQcmMGePkdjq912iW64MOVAh9yF3K7LwHq9PKvhk7H89YSW8w0Om/hnu+lz0PczFeNlA1Xfzq5QkZl/W0+xqEEzwmVfG+6h10Bi3bdfEoDKH8ZPXYmIA07xUFkk/2sacvlztyJ9f9X9Ar3eVLbyvai6lBkxCmUDCQyRVvCxVPCnCM6BYfSDAiqM7Fc9RTToOnmhXhb/KB4X00VdtZqfk1PzU/GDojzmyiyXdK+ABbgw31hWTOeY6z85kRw8x2kTdc9jYQcS6MzR3riHVFcdxXRlpf7OIDyD2Zy+GZErJGE0U4eztlOaEV61hr+oBVmrf5qfnbasJIm1BgH1YzK3kplIzYn6gxNOsolI0YHii5LrdRIBkJda1HRJ7eUHIGNDxaGFl8ADMLjyj63sTO/mBr6yve177DyqS3eCN0Oe9pVvxXGmCYiiPTpcITeNa+GRtlQ/kk1Megn44ht19H91xHAHAqb327nJQBFbWzxznmKRcR438ucLCo2ekxYvWoaXhaJ1bkva53yK4145YG+HjQjqYrhpOeCmESyV0Rwjeo7ilI7FaIVpnyYSiq4fDgPSJ9zn6YSlqtikfSGFGHN+NwGfjUWymumbtTRNTR9SuxdxuELyiczRDzj3krhSPdULWWNRnvCT/00gEE/1T7OJbtfwnn/PRJRNX3zWtY2yzMyjNknTeyz72DW/6vWd3+Hkc8VWgbU4WPiOvcjOF4CiFHP+DDPatIP5HGGtNqdrgzyGjS81R+QpgplKQj0XQG5oef28oV2RmYnyaSqdIHVlE3FDxLF6F395kS1ls/JGT/GrRNqQLuSwegcaZSMGIUL7Kx6SNCLm3gnq+LHZKBfRO5jM8PiZfXt2tYdWOlKIxCT29AUb+VyMBQnNmMyqUQqx92KoSPLOuprDuIZTKZ5PEoATTqQhgfFa0XYfCy9zza5lRMLUZszTnoz2pxPDBQefIgIZaPSL+kF5mpfUaDeiLm5QMom3Dw2Q+7eDo/i31Wzac/lOJocbB/No+Do0V4pRmsj1Ip8ZsIrRMtcsJPhwiBoxtCUT0MReOJFoVT5piSbF8qCls4m459yLbbm1D3JbHy9pusav0NIbYNNEunSGxMEN2irM+NZE4mElUTgq3GROa0EtOTJIQZ3n0b2+D/ICzW/r2C8gGRw1Mynv2vUPfjfmruEbl9OvIHM0W1eFE+i84TTfL9SCIDKq19vA3lnQihrmXj+aJrvKM+jy2V61HsD/mxAoy5t4XMaj364ymEVq8npGINH5jfZeOxNWwIqHxNYH6mW0VKb7S4/2df/D9bKta/fACHRoqxNdkEgP8QXuwDQxRE6XeVYvWD3wlSxxSo7oRR7SkXDdOw2hDhwAwXdFhdapHsZLgTOSkd5bWm1/j5n36OqnubmK9siEM7GUuyK1oci/mnN4lnJThjSOmKxdFsI6T2Q2Euy171LbIhTAgfcIoilT4tHSHmeAQR9VuFUOrxSKJrtlBRVyaupbQkkv/AyA3pujCbmEZFsM8gntEr3+XIuU+IyozC2mrmxvy3rz6AkKO/I++4GdWJSNLOxPJZ9RFR5YkGi+xENxVN0QML+2p2EXl0I6b7SSKcJl5IQDsdzw6fnrGFIYzjCcIciqrz6Jr/jpvSN8Fy/NUHYO7WCJtd17saU18SJdUFRBzfgPlJkugFnJKOkuPS0OG9TuSRjYSUrWVPTQlrzKtRnNhA6IH1VJ05yMZAKN1YsVZohmNCg8GTENSqVx/Altu/FwA2XQph273NQq1//+lq1u17H6fvlHBusefFt0VsPTp0dRoRYYyTcaJeUN0JF98RExpjUN6NEB2prEklCbe2cmwpAPjll78QAPJHLWxoWidyg8SuSMrO7KLs5G76JBc5ly3onGrS7kYJh2rxpKC8E0Z8QxTGVl0QlACnu6BG2RxP/M2tXJMuBfsRS6CtPhZNm+wU9noyMAKrJjrK33ivEGLdyOHnxRQ8y0DfrAmGUfElKfNuUgBUGFkziZgmVQzIvaIBUx+A853vS5J6FOI40Rn30gH8ExZbYyyH/1DEAAAAAElFTkSuQmCC","dolphin":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAP1BMVEX///+wwc2In7V8gp1ZV3NXVHBIRWP////D0uO/0Nu9y92wxNmwwc2lutCmuc2dssmSo7qKmrGAhqJrcY4ICR+8V/49AAAAB3RSTlMAAAAAAAAAVWTqWAAAAc1JREFUeNrt1GGPokAMxvFRz9sd2+kz5fb7f9ZrmYECnuDmkn3FL0oaSf8RJaT7iB6Pz8/Hg3J3u91+mzRCITtVIJwNS3JcUzMHSlkErtfr3fQAPQxB8uhVYPAA5xHf3fQNSguU6eSLwJ9hHXBpROTXR5S7F4GcLTBd5ioQP9BuwJF4gWU/wAt2tumBpnQRINoEhGUORIHeDggE0gJlWgLKPHUvLkEEqLUCIhZAVQXsaCoAP2q38yMG1Y8vdcOg7utD9VsBFgNf9zfEcO7eCuTMvdG3bb0X+K3AL3sDzGmlFNpVZskB22xxR9sRENkGUAqA4rDWPoqPk+OngIaKWdVnaVAVo2pDBKotGl+KQhurUa1zQAQjMRHICywCE3/vSrq2h0+/8KnDvC5s95m5D6ntR4BZLpfL+BgRv7WEKKY0Y03d3UWALZ5GlLMAkjPFdBQgskCOQKbl4ThQiEoEQHlEiGkRwItA3OsKalsa07cCg+/51hBTBGQvIIJxTWHUJ0Bk/V8AEXsKpD3M8Ux1ywCI8F5AwJD/CAhUtBUkFYeNMvlXQABVf3kCHgBq1YVagQgcid2N6tIxEWGXZ+ykScdie4En6XQ6nU6n00/7C3s4RNq7Xn9vAAAAAElFTkSuQmCC","ender_dragon":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAAAdVBMVEUAAADgefqKioqFhYV9fX17e3t2dnZ0dHRwcHBpaWliYmJdXV3MAPpXV1dNTU1LS0tHR0eWALwjIyMiIiIhISEgICAcHBwbGxsaGhoYGBgXFxcWFhYREREQEBAPDw8ODg4NDQ0MDAwLCwsKCgoJCQkICAgDAwM0IucAAAAAAXRSTlMAQObYZgAAEQRJREFUeNrtXYt22ygTdm13JSVxnKa/XQsS+1/U7fs/4goj9AkNFyFF9lqHOWcOFwFWycx8DAzqStHb2/5N5Rjn3Mfh9uH+GAc0rG+YRvZ92+/3zQCMH49HyadjnWfgaz2zt1dt6j4MZcknlT82KVP9rykI46g+jKlx9JhH/WzQBOBdkdYcmoDX11eVK0v5spp52S+72/v6oV71USmIjiPbkL4+ouOU5fC++7e3RqQ5/3U6nTQz3i+T9u0zVz/an3OZmkTac0b7DiDefYfhfZ+f3/bNAJhzLXxG2dPe7Mdc9eAViI7DWL8/GzQB5B0G9f3+/e0VAxiC2Ct72qMt6ddpU5aSf/9Tp9YXhxKRvkMnAL+FvFf493me/yXTmk3B47xftrRHW+7oB3aKIhX4vnINRQH8FvKevvvn3fPzfves0rc96wsi65Y5c7fnui0sP2Xmtt4hJRqKAuTd/X1fX9+enl53T69Pu9c6/xpCAdKetoUAU4YozoUCx0gUkIK8e3veve32V6EOoQBpT9oSAQ5bcqAAVSgw6RsYh3PaN0yc+VFgqNV1oYP/d8F8LAqopRQQB78bohgUAPHSKrTIe/rTcaajgEIZyquhRFAgYMUNy08t8GBLjvZQqDCCjPRHfMT8gmhZw6OtzQIPteSkPeMsqq8UeL3+N/0T7WMcdbvAWroVvkZ4ugLuWMNTxHD5AmEUgBKRvnGW/0RQaRCahASItrcKrdMX8K7hz5+y3fmslAh5WR/qSy1/D5WQJ1ZzGjtQgEWigHz++SnbfZ6hRDIv67197ejDnPm+1WyEBRZTCxKHEnTL2sqr8iAUQL13Aj4+ZJuPMwRY5mV9AEF8/git91hfziPKsPbUgY32BajAc24ohacv8UGQD/sFjBGr7y8zj68AjvcFjn2B56yvFGEE4SyQp+OUPUsbLJe+8iRfAAIPhYJSDEOQkuYpQlELCuZmmYXLHGV3u/Ca3BB4KNsgFHCgD3chFDU+YBbaEXK297YLr+cNgdfLGCgF42wYCtjzzMj7JqAcXSY+RBwKGAIPxPk4y/TjQ+aHoIADlcoACritN6fP3eVwvW+JRVFgOFutvQuhIlCAWnn6PJSnKKLGNPf9+8se9RwCDAe3aav3/Hvv7LT8zIVEAatOygQVSF/aDsx99UABn3JBsPFbkXnfTgyPKMPaU0sbjQ4WX4AHlAt9I/O+nRgWUYa1j/AFOEMf3jkEO/z8+fPw+fmzTj/PMv9TtjMPyGQf9Ee9f/1PEcG3E1OS8jH0fJgvgDZ2Pry/vx8+Pt7r9OMs8+94FmSMH3wfigJEwMaiAicWeIgv8CUnwp73CfsC/jV8EBWmngswhrbmya4qrwaQC4kGnRGUx5CVD6BCOe1cwIoy4NizAIJEwR0hzkO+QBgVgALxvgDHb3KO8azto30BO1qFUCBq7U9QINYX4F1rzsjvk/ZhXyCICBEoAKvqKyNfxvsC2FWSqf8cItoXsL93wBfg5FzAW55yOgwU0P1Jv0koQPNhX4BY+cCOUSQKcCsKYIlDfn8CCnDkZ/cFqNUdfC5Q6rYqlTwWBfA+9N2G7gixoC/gbR+upyig26oU449BgbBvQscM7viwAAqwqBghigIYkyEfiwK+9T9Fq8Bp8CTfgCJCwKqT8caiAP1dZz7mNDiqDOaDT4cZ6TcuLkhxB0lUvlUAKJr/XGC8L0DahX2BMApFRIdGMEEB/9o/phyut59GXwUUB3NN3oYa1v6aL79fvtX08vuCfmELGtr3D5V9J7OE+dTTaEv/E9fvggmIiAnCDg22HM2yFmpSPsWcDmPMSez1Ay6/f9Qz8PLj9wXt4mJq4tlhgX2Rosdmza9OpOXuT9O33g1SYzZl/RtqPFX2IsDl95+Xmv5ABeYnxuN8AXraXPNB5g8HxsOn097fryfgz48ff/5ABeanoC8QRBFZdzgef177hHwRf4ySnABJUIH5KTJSFKEYunz89vKtrCfgndeZkxGfZEMd724QJuB2KhARKQp0gDLU7b69vHxjdVmmsmwokM83wO8DBRTdUgVid4QCvkew7PMDMAE3VIHoc4H6Gay7HVXa/KBIVTjTnQkorZeCZqDoSFEWPC0m7QMogDU+IypALgVNp6mRojTmqM9xkarGCbNHBfb7t/08KFCOOh3WbenSCu08t9ZAxpbqpaXSci9iBhXwRIp6bpOZVp6zv1++XenlbziwQAke9iVaZcIEoJ1xNXQGIrsuodghRnyD/7cTwGzPwyjQKgEmgFmvhs5BFmsfE95wFdx2AkrynJQH+jI3RYH4GCFttS0ogOcnLtsj5UphRvLMKECtvbt+KlPnupeXKcrN786IAlxbc2LZ4QCjfvLveeKDfM9mQ4FYYfwK1OEaLbhCCSgVFFKVgSi7nQMFIFzL5vwvoIBzLQ22L2/6yxXkewrQllEPNhQETBSIXN6x+wLYByQoIC1/w9/z799l2jKx4kGO3P8fOW58jBEmQCpCixby2X632z0rllc9ZaoYiIAdnTDHWfsZxrX7AtgINU+A9b1oxfv6wr9MFQMRYFXjOLzzM8O4dl8AG6GGsrb3op92kl+fnpA3EIFHCGZ05Od4Hnz3mGMj1NiR0uv/mq9Cv9upVNZJJhsakRze+WFjxou/e8yxD0iiQeX6/8r6wr/MNzx5AsL7/5PGDZ8u0wnovkvkXeHx7LLWI1Eg/u5xdxeIRZwqT0WB8K0xNse4nHkmgESDRuzoRHH86XA8D480xQQQFIg/HY7nQIxQNMdHmmICjLV/5I5OPIdjhOZBF88E4Ddxihymuaz1SHSJjzS9tIQ+ZXkrFOCc+erH8/BIU0wA+vDZUSAcEToZXRz1ngnAVyJiUOD+vsD0GCPKYRS4my8wHV3GsedwcwYUwFp+RnRB3FIvL1OUm34zTABQ4Ia+AE6PZblU7ciuFNqGUYHx/6gv4KgfqwSeff15doQmjutEgTn29WGxSaiCbzuzbdf202M0ZYwJwcT4qMNYxju0bQ3hn2Vf/5F4tRQq8jy/Jbtf5F4TkGVZsV5nRbZeb400U7yuy0hlXf1cporrtiiD67p2PFlux1y5KF/dh/Jiu91sY7koxvZzv8j5cp8J2Gw3m2gucvSLYvffObvTBChhjeZsbD+3Ll7uMwNFAQGN4KLYjuvnfhFxPt8PBa4CmteMNM9VCguuhF/mNyhL1v2R5i33FCf3TsDlTihwIw6gQHW5qRLkRVHckakqbPLL+ZYykOcFEVZVhjDX9aYAq7LuhzpDYVR7jKvHqp/pvpuCqsI6u07AzeyAWsJgKRPF6De2P1WFbSEuUgluJQOFtuajUCAvSP+paLDNxVnJwG2EQAuzSuMY/fLR/ekEZGoCbmUJCr1WHyHA8Bmy0f2pESwqqQAt3wAF1JoeKeWu0KKueV6nqp9uo/2DXh2UBfVWFKjU3x88Nwrk92MrCmACuiyyOR1lup8/th1o3CfVgQImVxCWeYhzXGr3neaq57gY4z3kwyV6FUXqaU1RwGRR5Le4bIVQ57HtQKwTJh0Ik6AoQBVgK2aERZxKt1ue4XYq9YZ6tFu07jAJLwqAi21ezWsMGfb/h/y/A1y3DyoV2loVxo8CUIBNLmaeAOz/D/lqNGNBoeb4PwY8n2DxokCrDFmRiZn9A4Ro+4XVvEXmRQFczm8mIBYFKq0AVaEUYzUjDd3v56fP0+nMuEoDKMBlO8QnxaKAAALM5yTHfyHi83j6lNZdpj4UkG0YMz7CG4kCmIB1pvJzWf/eF+RUeiy59W7wx/H0IZ+pNLy0AkeiQNVRgKK65me2/jTlnLY/n36dT1ynY/+HmQEo0KY56mb74gSzp5zR9ufj8fPEdEqe98Mh8OFeogwBFKhaBUDdbF+c6N8Ndlr5o/yHf5yOOqWC3wusM1AAS6IwClTnJs23SgHmUQJ8PxQRpShTK3+6Wn/5TKVkPBKSwTinF2+4BwVyZQTFWaVy61DnZxABXHbvpviiHJkAZf2POiXjkfBqxjgNtmMeFMhEdwKqrFaAJi95FhSAcJKUTICy/keVuifACPMgwXoe9NAWX7QK0HOQ57hrDOG0pNzgX8r6OwPkIPhUGRBs50WBQnSWwUIqgMzPJQP4fqghpCgz8zulR2X9G8FGvSqbH/6iyqDrvCjQnYAq0+UOz+cDQEibMvmwbvn+fn5//zi805giy9VNxCupZ1AwDwps8wp+gCi2hWjy4Bm+OGFYf5SpgB8On4fD+X+H2WKLtptcSPTXCmDdIfpSFIDAQrBRXt2atutMQAGyNSxAl79wAmCpCRrAgb0hba7LnkohQNEoxIXwl/oCuE9A0eD2E4BlDxTAwnPtBDFmpqtb03otJ4AoAOUZfAFYf6SrGxJQwKUAMxyaEetPfIFbEVBAI0C+zYXKO/gLUQDWH+X7oYBWAHJGMIMlcPkAGh3uggJOBai+XhFg9a07QvdCgSrPN9oxBtvl4ct8AaAByndCAYUAPQWoxHkGRMA9gM7llxLpXVDAqgAV8hae6X7CfVBAK0AXAUSFvJUXcFcAKFBk6x4CIO/iL70rsJYp4v91GQFx9rsCTRtLH5nirkAIBVRMTgHhh0Ps5i++K1D062Q8EOoQF4Tn6Icx0Eazjg51nhGokGMshwSEf7YVwT3ignBoxlkPBZQCZLAAs04ABPm2XGK5VfZRYFszwiQG8mj9b4QbAq7TDRXg4vq8fdYKOSJF0V6PSxRL/fu4Wm5Rf2Obb4AA4NmMoD/mX+fRRrMZAm0wqeu1y+VvKuFXitBDASBADE9BgHswCZ6bSMXqYWiWJdclXz0AwQHXwo/8NMf7XGWrhyGOHaiym5/y97+IB1IB1u44cY78pO3Xy1k8hgpgG7YRfuQnbL+qSNLVw1DZuXyP/PjtVxVH9Ego0J4/MI78r5EqoDdLHh4Fjmyk8Csu1quHoc7/VgNFsKFAXvgPwbq+QL5dPQx1LT/jyNvcdGHf+dN14HyzegwCCjQHcMjTlhkOxgIssgdSgXYJBEVwBM5Vg53iqnggFYAjjAs69kM4kefYCveyKB5DBXAY16IA8rSlvCk2cAIeDQUQko38ilJVbYYpQfVQKMAh/MhbD+EuQ5VAPBQKsDYWyVgOWScASrAsFEDgnPejXLgsQ4X+cVEAjjAzlkP2pa5UAuvf/IFRABGprJt3TEC2tiqBiECBx90R6t4Y84ZKVA/qC4R2hJSji8C5LlcPjgLUKXZMwEXYY4Wqx0OB+A/v6ltjuDQDFgQFFkjN39oaMSoeDgUm7PhcQxKEdwLWqyVS5+6wvjgDrggKLI4MK69DJlBHUGBxZH5CZZ1lFVUCoMACqbfU2RZm4Fy1eBQw/975dtPzC8TSUYDs+vRukImFo0DfAaaxQ9WyUYB8Skd9+lB0jd+iUcCy9ZnJIDohMAGLRgG6CySaL74JKMGCUcD2PSlRIIiuKwP5ElHAuv9fNZ8nr4SxHMq2C1QB6xmAqAoVrVlV3fpiszwVcG2BV81HaSvRrdssRgXCEyD0h3AF6rL18lTAfRBWVSqcGbtEoi6vFkbecyDRfM1ZwE9YhAqEJwBwqC6piKa8PBSA1ZepfUmEXaJqcShgGD0hnEuiTS6qhaEAJiAwCXpJVIgFooB9CVSZdZW+pFJVS0MBt/UX5pKouZAiFoYCDutP7w8LfNt/USjgjweqKlGRJdECUMCvANQoYkmk0GABKhAxAdRBXgIKhBXA6yCvFkDYCYxhoRzkVaJEiRIlSpQoUaJEiRIlSpQoUaJEiRIlSpQoUaJEiRIlSpQoUaJEiRIlSpQoUaJEiRIlSpQoUaJEiRIlSpQo0X+M/gVoPrkgKWtroAAAAABJRU5ErkJggg==","enderman":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAAABGdBTUEAALGPC/xhBQAAAY5JREFUaN7lWNESgzAI8yv8/z/tXjZPHSShYitb73rXedo1AQJ0WchY17WhudQZ7TS18Qb5AXtY/yUBO8tXIaCRqRNwXlcgwDJgmAALfBUP8AjYEdHnAZUIAGdvPy+CnobJIVw9DVIPEABawuEyyvYx1sMIMP8fAbUO7ukBImZmCCEP2AhglnRip8vio7MIxYEsaVkdeYNjYfbN/BBA1twP9AxpB0qlMwj48gBP5Ji1rXc8nfBImk6A5+KqShNwdTwgKy0xYRzdS4yoY651W8EDRwGVJEDVITGtjiEAaEBq3o4SwGqRVAKsdVYIsAzDCACV6VwCFMBCpqLvgudzQ6CnjL5afmeX4pdE0LIQuYCBzZbQfT4rC6COUQGn9B3MQ28pSIxDSDdNrKdQSZJ7lDurMeZm6iEjKVENh8cQgBowBFK5gEHhsO3xFA/oKXp6vg8RoHaD2QRkiaDnAYcZAcB+E6GTRVAhQCVJyVImKOUiBLW3KL4jzU2POHp64RIQ/ADO6D6Ry1gl9tlN1Xm+AK8s2jHadDijAAAAAElFTkSuQmCC","endermite":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAYAAACinX6EAAADR0lEQVRo3u2Y61ITQRCF5wGsEhESCrkloiEhITctQG4xiQQRuRuIKPrH93+Etr8OHQOloPyQbJKu6prNzu5mz+nuMz0bwpWtL+7LVqkl69lzWU5tS3IiJ9NjL+TZ0+cyF89I6LJ66di8+qoZ5mLpkIhnuqfD6KO4+e/stvse1OqFc9EXk1rpSCAD4G1Pysx46hoBq4Vv5mvZZpifzBuYvyXgtvseDHi9qF44k7N4yXwzeyicf1dsaTY0ZDW9K5WlExvVw1buOOg1YS2zF/TeUM03yaDwdun0Gvju47vuezDTP5dq/pMBfZP+YOPyy4bsvv5u55mnJJhTANKzQO5rRBaQ5fmqFBKbUkxWZGXhvUW/VmgaaH5TFmTGXFfd3kzz21K/501T3qKoGWCCSCbUVBNUtKwcOKeiJRNPZiU+MmOORiS6BDKSBADcvHjeIcEBVwqnspE9MgIgBLCTowkjITYyLVNj8zIbW2D+j7Xf80bd4lrvDv6fMyCSte/WKH0xEfMRcXPA1Hwlf3JnBiCKCOLG4kHnOZExIs8L+0gpAN6WR40+vQHgOefNEeBjj6esR/AMWEvvGQn+nChlgC53TfGRqOOoP/2BAlMCdkTB6crwWbZLF7Y6+HWsIlzLvGZA5zlRygB7YR8BbYAU+Eb2wIBxjHMe8FzD0klvwDzHdo0e+3MiQwAR5YV99PpfvVr7iaodZz7K/soP6w+cAL8G4LaXUIL8OZEigKj62O78diy9yQCAA5RmiPTmOgjgHPNEnBaZ+5wAnhMlAtidtZc7dYRONynmCjIoAUEjHzTyJpAInp3XJRPRY2QViKwRsc3cUafOKQGEDWdOI29LG0RBAOA18qb27AsgJNIEmKJfEcCIOwnUsjY7oa+NKLt6m+Jn2moPAZBDc0Oa9zMBmtotaZS/At7qmpRWAsgOAx+pxuY+GWDKXbwwEm7u7yHCxY7a7zv7BbxljupbVuimiBECEDxteoyIvrOd8qUBZROk67+pPEABTjZo+9sBjx70tfnX3tRUOSQnsmHgbCV/aV9t+Vw9M54aPAL4Xk8GaDfYG5+s/1MjZILHqE2Q7ev53Ra/Zuj7PgDxAyhC6B80BqoPGNrQhja0Qbaf/P4PM3XaxMkAAAAASUVORK5CYII=","fox":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAgBAMAAACm+uYvAAAAJ1BMVEWAgIAAAAD59PTn2dPVtp/nj0G0j4PifCHMaSCwUSKOPyRWPzQGBA4kh8LGAAAAAnRSTlMAAHaTzTgAAAGUSURBVHjahdAxb9NAFAfw8wRIDLkFEsSCG4kMHVAzwAiV5W9gXUdA1omugPWOEdpwzxthaP2qLhnrD9ClHaKuvQ/Vv2OnrZuhf1myrJ/+vvdO6YcZ8p/4jdZqoKLB87AchKCQqA9X2+F1HJa3sNuCUv/3ZfRV/q3hMP4E0A8DSABN46knV1prUYm4FJGK/d4KyJgyTfP74FZQZOZvkiSfG2AA86xYwyHg4x0U9AgUtAlDZiYibvN7Mknyb5PJeKxGVQelIPM4RjVG1Ahl7CF41XU9j8e3IG77bfb9yssJYKHXAWCf5kctoIwnArySra3pdLqzI3UD7RwK0f0cTD/cAS7rwL5TK0D5HjzJfmK7TYhedoBPDCsiHfgf4b0LQWvnOE9S9n5WuAaSXazVgO/AFRn1piIuARUTGQNQEtTg2ekyAghAmAz1wXXgjSGAVFwPWU4WOPyXTeyx95R1cAaQhSZyNrWeiIoWShkB5gDObcpEM9qEfAXG9MC50ua2whlmD3ARzu2Ly+vzL5pZjuy+MPvC3QC9wfXEFSoo+QAAAABJRU5ErkJggg==","frog":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAQlBMVEUAAAD9trb/ioq+rWqxnl+mkE9/oFjlXl5zlktjkC6NdEVWgCLMPj5NgDBGaypJax46Whk3VBkxRhRGKiktJi0uHRCwcSzMAAAAAXRSTlMAQObYZgAAAadJREFUeNrFleFShDAMhBEoZ1x1Qz3f/1VtQm9qgVoZf7h0pqWXr2k2M8eQJMBwSSJSvStpow0sUmdgCHMIbEQTIgCo5CMkzNM0zaEBgPf7x0SNUfUBhHmeQwOoiq4zTPOUhk32BF+VomvAlDAPT1jY+LRxXrQlqA638G3lHkKQxFL0i501vxzus2WIyunjfidUYwb8uClU98mr7CyRFGwrh4ecUwABj61Iwlt15zcwSeHjAGgS379fILxTk+I2mt0gCRmyXpNs5qeJZ4BQKQW43ToABITgEgAU4DaOt58Bwp/fAxChlAzj0zj2gOcKGK8Brh6wyBmw6bv9SCMpAybfy408ZPB4UlUpAp/pBAEbBTiqZO7V4Nm1NESU/BFYdsDSBaQCpAvIDpAWUOwnSBDwSSTt2foUICT7SqVPjx3qaeOUsHBTjOoiAdrr0BCEGK5Ilg7wtwwgrEj3ZKXscnM9AFRCBO5JZE0IGc/+xbIpCV53v8eVjQ9K3qdgV1zro8hrtuIKkC3Cr53dPFIqcxG9EjaPTIPb1DGpVmlEaUNHa924dfgHfQFwmyc0LyT5NwAAAABJRU5ErkJggg==","ghast":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAAIVBMVEUAAAD////5+fnw8PDl5OTk4uLd2trYzMydmZlzc3NLSkr5ldknAAAAAXRSTlMAQObYZgAAAYdJREFUeNp9ksGN2zAQRdmDO5iBfN95JlWAgeRuAkLOZuRNzgrcQYLdBoJVOoirjCmRYDYy8i//wIc/n+Q4J7gs6YgdJxFRBBNXVQENRE8yZZG187sKkEIGLi/z/HL5D/Blvt3mH+8Ay044ZgBeb3e90QDVCkz94QFgpbGugOmvDPy2vxNYgMPnDFCAloCoLgDXqf9wfJBgKwAfU/+M8S9AGQH9MXzDSskGYJQRgcMEurkmDSCxfSiABtCeegsssuJbQETFTKS6q6r/v/FOl/1wXSrRtQOESDh1F6aeZG12mKBvC6N9Bq6nBtA8xApM5vCJRxpXAAdgEfg6f/80/wS8wggrMCwjbCl33T09Zw+6dqolB5/Yw45p9xRAORMiaB2hQLTRlLSWHNTXBHICwD6Jv0Qg3E3CGTDWLffOJ7B9NFkTRP1ZYbTRkyCaUxiS6TCyaBhNwwgoOQGcMsp+RBRe38CE4axrhxhKAlYqALmEEqIpRA9D+SwTikQpt1n93R5IcTOKi/wBKsTOnkkgxrkAAAAASUVORK5CYII=","goat":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAMFBMVEUAAAD////6+vrw7+zq597b1cLArJCenp6ciHaDg4OFcmF0c3NXV1dNTU1APj40MzImjJ+xAAAAAXRSTlMAQObYZgAAA5JJREFUeNqNk71u7EQUx0eb9YqKZ4jOeFPchjAze4s0rObDQrcy9ngU3QKixDNaueAFaChIFFHQR4IGci2078ADoER5g0g8ANqKHs7YeONsyIqf5HP88fP5j3dt8r+ZAAOokPxVQaDgvc/J9Q8bgsQ24oCnlFehfVWYUMrAuT0CMAZVE8JpCFer8O1HfRtFCKVUFdbeVRVuZ7O+jSfQOGEdqkrHKwm2XQHAhRYFaYzOk76Nn0Kg0GCEBW2O8lnfxk8hMCK0rjJSSrNM+razBtc0vtAppOnhpG9PQlJFmjbYAiTY5bRvO4IL+BS1qWqXJ33bFVzjv7z//f5h88fHfXsREXxOxuwKIbhd4YDSyiDaDpQUAXb4TNAaBdxiQQGQ4+H5U7CZ1kbXeL0rRQqAznZCFDDC1tZWOpbzFCPE0wQKtdHZ5/H277pSUEjnczYIBxSsMVGwUbBRoGNhmrLaZeZdVdf2g4mlECk9eiuXg7Dg/tQZ8+Gytu+rWC4WgtIL9SRIu3KZD5d1cFkshRGpkmqISLLitlmFq6v2arXKYvk5M9qWehBmzrbfN6v21za2WG5xSbW3+fN3nkrgez9Myrgkw9DQ/c3h681WONCCA+wRJlQoyvcJAJwPE3zmry79zIbTlcuHCEbVdpE2tb62iTSZM8ttBJdCkZ4UZG3lRKZHRh+OItgQYebSGj0t7Fzb5RAhmIRBcM464xPvTf20BsqVGtbw5/2P95vN8NoPEamiQP4TCsAAIMUe97oXmo/d7rQCzijITq2QYiSkwAAFilWim9LT6+vrchwRBd7BUKAvBQZM/itIBhyi8CyCoUGV4lwA7okXE1IZ71NKCRFn6fnuBCrRUFpbISSTUnUTKoA363Uv8KKUkluFApOqKBcVMhbUpCykKpVdCCnL4sAQJKF8K9hJXZbleSEW87K059OcRIQ+GYR8mkxre14sjua2TqakF7R+txVwYELK6fz4GDseJwhRNApbEjIlx8tlMhwlREIU9sDYyX4B2Jsd4eGGjPnk79eF7v1N/+oaQnpuvrm5ITPnvD9be8Uov+DATXMLKem5++nujiSZ83W+/oqDMJVm9LP3t1yMJySLrC5z/wUHjjD6aeX5gvQ8/vb4SMjbk18u4mdhBLLQzjmddZ9dTvBTuCekyZOWtHi+MsY4pLWOEGqEJJuHzYaQszyZkbZFpaNt16EhhLuFIhuEoDF78ZP9A0Obf2KBegjhAAAAAElFTkSuQmCC","guardian":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAhFBMVEX///+rjEZQjnQtWUcAAADX1c/Y1cvX1czX1MzX08vW083X08rW08vX0snW0snV0crAuq7Auq3Auaq+ua3dkET/gi+DpZy5k2Syk0/wdyjecipqlYPsZCqFhmBmiYDLZSNdf3XeSSh4dVCmXCxOeWbUQSDKPBxBcVpkW1BgVko5ZVJ5CxKoxgN0AAAABXRSTlMAAAAAAMJrBrEAAAOASURBVHjapZaJcttIDAW5lvfIHtnLYiLDee4kzwsL+///F45I66AkW467akSoIHRhhjOkuq5bLper4fL/wHAhiscBItiMIYSgm+j76GOga1xdXXWD4PNy2epHQ9q1HrAz0+mneCswfeB+K/i8Wi6HsZoEA4vFojtP4E1vO8GmvvWw5QUBEd4TrFabBj53F9LbEfZOcLt8WN2ubi8WTEu7J1g9DPUPt5cLPBM83N3e3g2C6+tu4PqYmaCPxk5w99/9XRsvCaLR9+G0Y8ID3f3916/DuO8azwmMgTA4WuQWp7uvEy8KYFObOQpsR4K7S4kJ7Izod1MYaSvwetoivk2wWAyCGR4PUNmZbawHnOWLBTQeqxgZj3PBWQEHbhPRD2TfrlNuOqCmPQs2I6M/I0hCAleAgtwKNrmeMhIux1lBLwklknpy1l0rbfXinMD0SEDTxDwXLlVt2tubwrrbY02fNZFxlEMoKpB2gsfDHz2G/fev735+/6/NcU6yC0lxVtDbv7z78aff39s6EiRylRFxdgoB//z25x/v/kKa5ygD0T778/tAYMCS5rmKsoTKz9wFYRc4kee3OBU0byJtBZr9SFkViAqsnG8yQGpDz0whWqmi0DynPU4eJmy6xUDLffz06UueP+xnBMkueXPz4UvW9ws+thZEveaBkmV2325ubj59gXqFgPV6r4OhhQ9DD4cCIZ0XPK7Xj/MO8lDgFwWzNcjZDBC6cArddBcOkcyld6Htgx+6GXq+g2z6Z8HivEDPCSyxGchInN3K50A22Iim8ZNAESnFgKTjg5URaEyiAZA4mEK4CtPcCs97rngqEukcW5gJsgzGZTEThBKaYaynEjutQ0FRxs4T5z8kmbGF5nJVumYCtdo28NFDVEjpafZ22lQWsw5Mtmo4fg8IcE6fzjKm8EwALrBPvQckV1S5QrgYMDYHAoHBzjqeQogKRVRIY49ZTjQT2K288NEiQiE1C5AeV6o83wdNXRiYC4KUhFNIZELl0SLKgKn2oflG0saaaMCYsdOZYCQlceo9gJTQrttvB4JdOAVItCcTgl0sYIqRnuKUOBJk2i1pp/fi9BS3a/va4nK6uxqReqHFq7naCix5X3B9kiNB9yToUzJvEVi8SSBDvlXwpjVAAl19h6BX3wNm2ng4/SqB3MCVU5T1OgGokfb0/LVpczpVfuqPyjdt8tQvCjuwWwAAAABJRU5ErkJggg==","horse":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAh1BMVEUAAAD///+lpaWGhoareS2nbh92dnZxcXGPaR1jY2OKVS6AXCJyVBp2SShRUVFvQh9hOh1FPC9ZMxc2NDdOLBM2MCZTJQ5OIgsrKi1JHwkqJR0/Gwg6GAUhHiEfHBcuEwQpDwMjEQcmDQEiDgMbDQUcCAAZBgAPBwMNBgMQAgAIAAABAQEAAAAaegGbAAAAAXRSTlMAQObYZgAABHpJREFUeNqllouaojgQhTOzuurYitKsNCS7pR1lF2fe//n21CUBvMznN3MISYVQP5VKEN0LKitT6Z6rKovNZlMUm6KsnCtgVlVRpbFduYMw8qIKq0zlDkAgd+WrgNKqDNiIilcBmwXXi6rAPARQKOD1CCqroNVWAd++IYJfBVQ7+IOwq55M+PmF1WKLUlRlWRRlWRUPAbufXNiutihlIRE8m8KiwjLxQqHCWVaLtJgFlr6sxqtfoYstURQvRQBgwcAxgB/GusvY8wvVo8HX9Tog+IASRTfbetp9Dqjr3wL4+nCofYxEU8BisX3anQLgf/CRoOjqEELycCuzcvex6voARKQQKGImaPJWUmPoPpb41xQgIplJ3jvuJQXOQTAAKcCErTdspPtljMT5R+w1/CPbZB03SPfv47cRLl9+IHYR1T++AKEdDO7/Ev2TWqci6G8U7XiJAM6ASASeuKOA5Xw2my/b1I4AHyjaCd5z1BFCg04g7WCwnWoCiNEAsnJZ3LPufgh9ZCbA+8fH+yQRCB1Rj7Wftfv5DKHP25Hpa68FHnzYLmDdAdoW5etXhD4yzZGLVAZgZFAAP2e5tAiW6z//WC/bkalugpDWpnA6Se7uALP523qmUzDT3P10CieIRi/yev325vZwBA2lHZleUiA1ceN42U7fz+fvJ1kPKAN0/RFPOzLFjbimyC0DTud/z+f/zifyQnCm9qE83EicI/lIEQA6nUUAgKAAn0VpfxiY/YiiFhwOPichIAuyMl4BbB/QC1GVART1iAQBENAogOS9NACccaCPYQtBAeFGznSAyBLQNPIDpYBAcQLYrlar7Ttqad+3E0CMY4AiAKABcDwenQn29YrmBgAnTgNcFZEB4RlA36JHABQFxEcR9N3n8fjZ9RNAfpsBgIQShEB3EbA/E6QT4x0gzyFQAlxVvZYLnAG5TACQ8Q2AIhEIub/KgdKhvly6z8/ucuFbWYEoeC/mQWQNACFCaDq4dz28u65Hm3IgN3ueqnxf1c8A0wjgBoB4d5DlIEWARFoEYwQ6CMAAcNPH94zIOZBlgz8RI2ALoc4QW0YMX3sGcLniHHIAwS2IP9zNURGyjBkAP10CnNMcjJJoADFqi0AUCF62kHzc5MBLEjUJFoFUDEhz0EejdGxMc+DtwyxmbRGg4CAK9tGSh+dqkgOLIJg3BAMCwFNMe/k60ZCDNIc8AwPAm68TO0O3gCEH+isfIEFoIoM0zKXhbcTbi9OanIMUAE2SCJjNLAPIwdFOFOSg7zkHtvJp8sZLyyjmeEwb7/PX0Y23b9PoLmzYsMVoGrXQGgMyf4/Dwc67rpGmwc2ocBm12kIffic9hEpax3Zjg3Kr5L6BakHZ7jSKAOEScGraXEAl4UkcHDp8feOZYIZctBswPV0ye/0AgDSGPMXGs4TTsKFJys8PqvRXLAihEQQqGPII8UTRAGVA86H+pAcMRyR7WEOGPGTQZECNDcsgsYJVLnLrs9hBx1hqycUkHrUvqxgONt9iUv+p7ocjlD66/wNdcSNfhkmkngAAAABJRU5ErkJggg==","llama":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABACAMAAADlCI9NAAAAVFBMVEUAAAD868b14rjx3K/v2anr057jypXMqX7EonmlpaW6mnOvkW2liWaGhoareS2nbh92dnaiayOPaR2AXCJyVBpjUT1FPC9BOy82MCYzKSMqJR0fHBcP+iOkAAAAAXRSTlMAQObYZgAAA3lJREFUeNrtV0t22zAMJDAg+0ulxm7URr3/PYsPmUiMXja0vPJYJMbyAiOAGjynN7ACCmVkPO0AButlC1ueRnEkgBydAHBA45afIICJ8bEG/htvdhHRcI4APIGU7wVAauUB4wJiUX6OgAIymjaACLNLEBjPxJRZTjkDh4Ag5EHEuCUvym8pgOgTAZFWdw3Gc4EU3LQCpPhEQJbs2TXGpxTbbyygKNIhcom8UpRVbiwNQxS0AytEuvaqMs+YlWz4jQQwMdEL8wuRUgaaAIFyhkjN27ILwgvcjIhsx5AAZiL+8kWDUiiqAHddAL0AAM2TiWvVBgXw9x9PTz++814Ac61H2SFMUAFiplq2dAaYTctRC/RCawCFbQ1B4oFaopwC4OZ9uwJ49+HpowWg0QqAHCgVKdCsf18CEYn7cWbIdx61QQf3AhQQRc67FrgEA9roHK0AVXQCwIAAbj8NSt2R2xvC8R6eI6COYOwFZEEMZmlngGm0BYi3Gf0hjFZDcu58KH7xJhA5GRmCBLCjFpRqTGK3cHgEAGZhrkYA8Fjx+etXIl1MtaDOkgCsS7JsBcRcZF+ul2ngDEROejUBrxTgGuMQKnojMgAMRdWMsRYwRSt1cSy/m9gSSVbsBCjEhHH1oiEfgCVn9h3vb3bMl3oCvABdE9pAYpACAxUAwTP7jhbIQvJBAM3fIfttqS4wZkQIv4+AoI0nWP2lHEDCDaoCDAgQ1ONskQXuL4ibSRD171sQXYCA6ykEBgRYqpAB1tWiHD/U8tfxr8U0imimeNoMiImp3+VtIG3cebnM0zRf1hbTKCQjQ0R0N6Iri4SoQwFrhzSKLJLjgywwgqzL4wcBy3vplf65SRcsP8xbxFjRLS7lBwKmdZknLf28bmgaQv2H4SEr8Ri8pN6ZlnXV69u31eNyky54Ul1xOQ1eckm9M9ljX66/fl4vq9Hn5+d5uAKezD7FVv1W99Q7k2Wd5t/XaV6DXqZpVEDpbCZvQuqdabHE02xZGx0X8AlS70xLvP/zrPGdpvPQO9N6hFMF9M50bxw4033RO9PRMDoVvTMdDaNT0TvT0TA6Fb0zbSbQcpcu9M7kE8hH0LqhZwrosJlAm7mU7od47FmH0Bpz6eev6+XuAqbpMmt0ev2t9J4CZheg17qh6X6ICTSHDzR6TwHrIdIDDzzwwAMPjOA/NfpDB1xAY2EAAAAASUVORK5CYII=","minecart":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAMAAACVQ462AAAAM1BMVEUAAADBxMW2ubqvsrOprq+epKaUl5iMkJKFiYt1g4ludXlsdHhham5SVVZNUVI/QkMaGx04QmSDAAAAAXRSTlMAQObYZgAAATFJREFUeNrtk9FuwyAMRVMa7jWzwf3/rx3QLmsiOlpV2lOPk+BYypFRzLIs53A6hXA617sSzsurEABTSkRPsLxGAIEYI0ACiCAC4tqp5fbARGApJavRsLoggLHGyrWvmAoOIPSWtiamgmw7MgIhcQuAM0G+U+TcBERcY+wNgJwJPO9wBAq3Blo+E+wM7ghSIRqkVGaCPV3w9RsTQUVAMRMC+MlkUHusISVfLlkoW8ZRbRmTRFXNTG9YZ1wdCoTqXsy8dNysuJtQ7Z6JoBTV0rlmrk3gB0zHW2gCU7XS6ZlrugrKxp+Ccuyg3ATljscC0eLtM/d+aX+tVfOy46GAQwGfFsiwA5HnBRwK+O4W/k/w/m+U4SDJ84MkMhxlmY7y8TCVGy8fpsR+WnXDGuPq8mHIN8fuL8tkDiT4AAAAAElFTkSuQmCC","parrot":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAP1BMVEUAAAD/////7nn/6j3/5TPGxsa7u7vZra23t7ewsLCoqKienp6ZmZmWlpaRkZGQkJD3cwmGhoYlJSUPDw8AAAD7udxiAAAAAXRSTlMAQObYZgAAANJJREFUeNrN0tEKwjAMBdDGxpnbZqtx/v+32jYMN9QKPnkhYdBDk0EDHSIQ0CGBDkEV/pFgahtgBhxEZu7nSGj1Ajg6SAmpVQe4M98hgHCMVUAgqklbObgyXwGhXczUWlXg10Z+bj/4i3X19gra1KJrDfVGakcARdFyqyEHS353w35J2oGiBRO8++miqrU2MJdZIN6pJy+Lz3Cgs04yeaees6qeByMypZQo548jLDdl9mnE8D18B+EyBiG4+AGMduBwCi2/g+BiAAJ/BTwEW/4XPABsMA1LwNN2rAAAAABJRU5ErkJggg==","piglin":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAWlBMVEUAAAD/gID/////7aj/5bX12iryuobMzIPCwnTooHTVlXreihzJgmWHh1e6ZkWtVTKiWTplXEOhPjiESzOXQyKNNQ1rOSR6JiF2Kw08OS5TKxpgIwo6GgwhHhyEOBusAAAAAnRSTlMABHH+CSEAAAKgSURBVHja7ZZxU9swDMXDWAMSRspwYiDQ7/81pyd5Vzzf3Oz4t78GRU2kF9m5Hm8y7h8sMM34zMQrcKZj3BvTRHMVoHVVJwRm41n1eSDwYFSB2QW0AoG4psY0JgRAK5BeiV7TWCD2wLt7AXkhehE1Du1BL6CPKT0quL4HgMgFxIBAy6xt3hICsYniHBRIzET+6Ij1jxg3/NUyXxEwiK0wiITZBJC3And3d10uzCzKjOkNOzGrX6wKJoUVpiTJQ5MbVseyqpX9SEQWmHUV+4obhI8LQCd5aHJDBALCRLIaQuRfWSRhBK51M7bKQ5MbqwpLjAyB5Kmw6AoFToZAgNCE0OQQMIXEGHkFtU3UUsUU9XX6DnlocgNNql4HvEuRAzWO/Kx342xMFXbibWwb81TJOS+oOyQg9reK8mafqbLkJR8UEFEW3nRjzDBV8nJwAgGs1qoY5DKB0QrEukrJZc9BcXz7S6AiolspC8AMIJeLQME9xC9JJppL3FmKen/J1moPsOhFzfi4gXNZvMuKdiL0xmPLVjBaHTBiK1DQH8lealfyB1mIsbEqIABcBETQKjiDYsRi84I0WwYp6yeilFgSp/iFBgJVSMchBeTsR82RVgFiCIAJgMRkihBn/w0XI9ZS+/GxtK1LXyaQVnkHn3acLDhlh6TIkQms6s05/Tw9vQUfJzs+3v45Aa4mXCTCCnh3nj73T0wQOY6oQyT080WAqcKO70H2F9tsQq3zpzdLOJ/P7+/nX+84I8SqvT//2QKEv+umGzdu3ABH/cLAFxwVGPuC4xMs353AGAmM/ELvC8b0fqHzBUN6v9D7gjG9X+h8wZjeL3S+YEzvFzpfMKb3C91/5TG9XxD5zgTy3xP0fqHzBWN6v9D5gjG9X7jmC34DNs5yRa6KJBYAAAAASUVORK5CYII=","pillager":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAflBMVEWnra0CAgIAAAD////Hzs6Trq2VoKCVnJyVm5uTmZmQlpaOk5OLkZGKkJCIjo6EiYlmh4VzeXlwdXVobm5nbm5SWFhQVlYyZjx2QypfNiEmR0daLzg5Ojk5OTlPKxlLJi0fNjYqKikeKio+Hg8lJSU2GB4yFwkeHRwjEBQUFBN24XvqAAAAA3RSTlMAAAD6dsTeAAACP0lEQVR42u2VYZOaMBCG1TOCDUYQemeqRDEq8v//YN9laQYckaAzbT/ckyPEmXsfdhlnnUwbwlBKGS7CBjmZfn6m6WQ6G2DiBHUegrTmFUHIpGeQSorT9fcEixANvCt4rwVm4V5ig7/AvQRJ+AuQQPOSgjjwzYHPw4Im267AnaW3wIXbdxINC9zDZUPbADwEHMnztZTrPOc467wEa+SJc54vl3l+bgqADPgJJHf78SXl1wd/oDgb1sMCeg4yifqxXC5Vwk93DAsSMoBE/QQqkZxPEvrDNSxIWJGyIOW4Y1gwG+BfCS4Nt4YXBJso2ngLTsBe7bUlQB6GMQLkrYfAvwJq4Z0KYEDeR3C6QzOGBEb/wQCtRwjMZbVabQ7G5Qk/weFCa3fYIb874Nxa/YLj0QkuN1r49/0eEZxbq1dw/AWDp8C/haLwbMGa7XarjTa2UwGWXwXNW7a6Zqu7EQ8BPfoKDDSEfcJDAYWtIQlTMBVvXR4KIDaoHApotLmWTFWUZVGVXXoEhquHgS4nAF6C2Qi+Bd8CYi60ibIoe1mAvAmy4C2BzWB4XSCszdDDaAGHxVzE2jCxGC2IYyHimAcOBPFoAWY34MFJuxMU+5pyPhei5PPDCcRD9niiHaP34AQlJg+oRFGIqgA9A6Q9XGlrC0oSxKCi/FiBfcJdC27R5gQ49662gN8VV0ibE7jCUOWzH5KiNrgOuwJXEZ7aJ7jd4QT3pfa1oJTKAqWCDPcsU9noL5IKAhUFUaRqAvX/TKTfnHu1gRak8lQAAAAASUVORK5CYII=","rabbit":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAAMFBMVEUAAAD02ezy2Ovx1unxzue0pZSkjXOUgWKUfWKLdVp7aUpqWUFjVENhU0NZTDtSSDkNYhzDAAAAAXRSTlMAQObYZgAAAYBJREFUeNp10L1uE0EUxfERBdhQ0PAivAFPgUJHFT5ewC7TBJ8LBW4i3TM0VEgz09B6ptiOV+ARkjJt5GJyNbubtZLdv7zro52fJWtdq5aqENe3prV37vl2v959dK2SCsERQBrYwtoNwOdAP4AVrAsDZ7iUAWSG6B/AZtsAvsgl6VqBjGkEL84/NcAPvBoBlSnFfmL37z/Exxi/xj8x9kBVUsptBsX1DRjtCIAbUkjqSptZYflSyikA0HVdm8dM0pdaK87x7WwC9qTNZ+/ckH7G1Xv7RVCIj+3emXrzdgT0geJczaH9JcKnarlHGSDhoynOg2PJQYUqPpVuDtRjUVGIip3PAedrf7kVLtz0NYXarkUAEBBgGQgVBBeBMlKC+kUQfLQPEyGK3WYLi3RT2adDyr7kYAAbWD6dgpJKLnYr2UBfKqegDh0jx2JH96TVz9tpzLX+MYJf8+Bl+juNuV7FEeQFcPg9jbleH/YDuNvPA3s+jcd9L+1FqEiqVlZMZ/eZmCL8uK8JdAAAAABJRU5ErkJggg==","sheep":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAMAAACVQ462AAAAM1BMVEX////w+fz49vUAAAD////49vXs7Oze3t7S0tL/uLjmlJTAnoa3lHuviGtXRjoICAgAAABdC2QvAAAABHRSTlMAAAAAs5NmmgAAAhFJREFUeNqdkgFy2zAMBOMqONC+hdv/v7YRqCSMPO0kvpFEUhKWwBEv29Rl5MgcUo7U5dDLf7Qdep9cFNJINeEpQCoyx8id8BxgSJHaAXoOIMWRQ16+oUfAyNSMH08BRg5lu/jDDC6HUhEjMzWGfgQYmRE5QhkairGv1PVo/GoFNrKjsLG3bX/7AZA0rjcL25R8u3YpzZgAsANbwvEI2H/lhn6/2q9/xI02oouZAFsIBTZRnAHz90psqKzUrrYz3wEdCzZlcwJ0sVIm12v1Yq73awKEsNMCYThnoOP863ar2Qf79mN/vpvIYWBgsk6Af+tyQaCQcTFnDso29vcAKDG2yxZ0KCaDFTBad7hvb/MVICTseZloK3ohFg+0jcwGDOmUQSJCJjFB0DxhFsCmdq4z0DkDu2MKBcZWBUQQWkvYs8j7m8bYthWAbRVk2SSeHRGmlhKUYx567piHDKiykacHiTAWZmnlJnS8RmoFkBK2FdgUvYjp62Jib69j+ArQh22JwGkC265PQG/erT8fK+AwHkOY6JEG+hPgclFlCoxZASZQKKd5CMsWRCwmGibDprBXgA0gCQKZBgWBlwzALkw15wxIEhMVMtjOjo71FIr5CSj8FYCxQVHYCQSAzdrKmIIy9aaTB02WfZwfIthhImLxwEf9xT48tDImpveRBFAErCUUZeZNA76lD8B9VdX9p4C/n54rtHuYBiAAAAAASUVORK5CYII=","shulker":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAzFBMVEWOYI4AAAD////m8K3h6KjT1ZrHw426tnmzr3GsqGujdqOjdKOjcqOec56ecp6ecZ6ecJ6ebp6ebZ6Xa5eXapeXaZeXZ5eXZpeXZZePZ4+PZo+PZY+PZI+OZI6PY4+OY46OYY6OYI6MYYyMYIyMXoyJYImHYYeJX4mHYIeHX4eHXoeHXIeHW4d/XH+BWoF/W3+BWYF/Wn9/WX9/WH9/V39/Vn93V3d3VXd3VHd3Und3UHdwUHBwT3BwTnBuT25wTHBuTG5uS25uSm4AAADM1DMFAAAAAnRSTlMAAHaTzTgAAASDSURBVHja5ZN/e5s2EMdpk2Xrthg8dKfYuMVet4U7sTr86CRskuL2/b+nnUiN/Xh7nhT2574guNOdPjoJEby6ULFYlEWSbGtp5Sr5ayM6xnr7QsFlR9I4JtswuYbZunITBOc5LwMWlhGZpOUKjK1HAwpCpTWAQq2U4v1oQM3gpQBiRMzay/iLgJUlRAWAKBi2xWjA0rGK1R2AFga5ajSgYI34fAMCP44H0B0opTQqQEQevweJywCw3wJUxpWjAe8aAwBKAfR7UE/YAwC8Q+URCBOWUFKMKlaACCJqzw+SmJtv+Iy50szSSEPWlKMBya5h43ZM1nJmXTEaYIu6bauybevicV9V7Yu/c7EMk+JduCyW0bJIwmybhCtvl8l8IbGsTEKxZ6tiEa2KJJK45C3mSz9uu5xlwdKxJUeWHTnecbtyxpkdu9yxv/ZLlzXkjDXea8w+OeY6FovaYE6NQdMwsDOKXBlJBMUG6t/lTOiaLSuWnMyVoXEEvS9viQeJ7Q8/+AuQWqkIUWkQyYPalTWAIF3gZSSegyiOAaVTKiiNQp+qfBa7emsQlEIEgdyxqwqGGJWSBNCKmqrIUAN6Oorv6iBxJI4IY60cp0njfQ+RHsebd45RpMUFbWm9sKRVjH4IgvhBRE5s6YoRFdsqMo1CD9DyMk01zy0o6NNjJFuGPl8jgC+LXOUrSDdp2jdQ1EoF6dr78lTQ70mart9u0rdpisD7lSXx5ZIbNbfB1sBwOEK/5uzkz8X/kzE9+rfUFIWBwZ/5Cu6dSQeAy9f3jk6+zHYvbQBak0r+egA43gRzY0/E3FUh2VMCuTLkZohHZMsod+sBmLsy+N09nBJ+/dDeu4chIfztw/7efThN8P7h031zlv/+YR9441Kbr/L2oTscum64uxf/xkt1xCLKmTNmw58nALr80PX6fOj4MAXAncmNlxgvL2Fz4XZ5ZwTiJSR+Gg/gjg7S2AjniSdUIOP6S9afT1qCr5sOxhdiDjQNcJDLc7ibAqDOPLEcJpnfs0YDpOp+C5npMKkCX7c/SE9yC2LCUc46zpmIc8PUTQHQ8U96kuckALHpb5GhlwGXv3Mnkqll+v7570d5dhtGURRGx85ZeBvezue3Rz+chdE8nIdDfC7ZMmQAhICgENNhACoFZ/6tUggAp3iM+hgPnhMkrPTwBSONWqtzICAinIAQK1QDwBMV4NkMMwRBxCfAnfZTDBP8on3B6hmwXcoKNUAMAD8nW1Mns9DPqATy07L4Y5tE8xkoP0D9uCqzIpHFgxaiBolnQWIpZkdgHGtyvF5YFtsAO5ZG6dLbO4O0Y2QrccnLXQ7kqI8HBTfsZIQ8M0u23LKTniZrSHrJlaWxfUTiufRVEheW5R1Jy3ZlsEyrtkzL9mNayPvjp9W6eqylr07rtko/7pO0fpT4XmJttSnbZVpLbvlYie/7vh6k6+urq+vrm5s3b25uXo3SEXAl+i+Aq17/V4Df/3Ndf9W3A64uNBbw/T/0Q68RS/B6/eXq6svrZ/u7XiMBNzd+CycDjhs5BfA3y7f3PUOzujsAAAAASUVORK5CYII=","sniffer":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAMAAABlApw1AAAAe1BMVEUAAAD83VH6yTfyuCrpsSvopSHfnzHejyfUjifRgR/GeRxFnYrDchU4jXspiGCqVAilVAEsc02SQQBXUDOTMR1xQQIdXTwcWzpKNE6BIRhbNglENCUTRzM8LEREKxFxExMPNCosIjdgDQ0kHi5QCAgaGSJBCAg8BwYIBwb3shenAAAAAXRSTlMAQObYZgAADgFJREFUeNrUmYGK4zgMhsPOsjdXXz0nanSIBgSmsPP+T3jSL3vTpl2oZ8zA/iO7iexQfYkVJZ3ll2QZkSxDygTl7M0MO96WeSrzZ29C8J0CoUP5TwLop5+JmbHr9qcAxOnPlFNC/L7hni8AUFEzEXx+GIBAkJMbCLBv3dcAaA0K/RQAzj9n4hBRSl8BIB57xUX4BEDP34Tw13Vl38lzllA1aa1iQph3AN0wFBvG1PR0Em83UAPgSORZAOoAimVeRO8BTBuAxMRBgLaCiF0rgodrEoCqtfIQQKV68OgB4NOKqmN7e/ouBIJMfQXZ1iyAfgGKI5QiOwB1QFGn9KFSYiKu2whALwW8sotSItMkAJOWokXsb5ee/14LAEV8IgCMbqAS4w7q8ZNvpGmPEjXWgwOg3QH80wQAAUApVUcAPNi0ZbDjoBbMAnArovIAAOH/bfJP5ERRlQCw9nwSk4shoowVNBcAyVlEdgAe/V+QMSAnYmKkwEgSE0MoAQYAojkAEYloUSToYr10u8UBgCDZawXCSBLHbXSrAXlSIdOKtaBSIrZFkMtF3ORutogWMxw0UAeoZQG3KmzNNQcg7qOlRGwO4MLHPUBpAAqAsdtoLCEGQZ6XA205e7gBUEK/AShugkMG6gARGBzAtzhPzIGzqrcAKLog9q57gJMNquls9iwAzna/BHib5Hk5UFnVGpdTEQ4AifX/GIAcgM/K6vZsHYhnoUzxJMF5Yg6sFsyZz0ynwkbBixhAtzsAOREXa+uZ7Rg9P7+EyOLfnuXMMQ+Az35eiE7MJwIA9BDAZpgRTqOhrwN1gBjLHwQzC9nKq5k1IjfcKcPkQRKzh0GYv7oGrkBUAiJnpxSeKQCrmTWPjRi1Svub8AMAXnxWO2Yd+1nFjNjk/cQl5IZI2P5Mx2vdAVgjHIYDR96JuT8MrZRBNPVnFY1ibDoSHekI+aa7xMZM/XWyWFuG1OPPCbUYKQDNA8BrMervkV394fEo8KLaAaB8CIBM2ysZT63EoUu9VFEVKXTjpyLurjZ+EdXiANZ0GVKkAJtBUY3zbICL4o3gdtkf1VeQXmIcO2UcIOInQ9hqGTnERABT9fjr7gpUD7peXCpGGBAyCNCV8tVLGdFsgJ/v7++Vb/xczfezYhjVIQDKaBL36AlJQKbJSwghimjVHYB63Ii/4vyL9zIOgCrGxCZcgZxoNkC9SK1COwBy58WH1XMYJW4cIH6V4Owk222IaCZA/LZCfLjxH5hKURsLACSwyihALJh4FGoinr2EUAiE395u/G9vLCgDDoBKp6Ki4wAhZm9GMj0HtIpZUT78uPH/OLAagJq5cAeSMpzErv5fDYbINBVAxUyUX7/f+L+/srsV1m6j4wC7+FES4JoHICoIkO4ACH7YJ26j/aW4P1TkaJMBrNHh9cb/eqAYCBMkgo4/C0ENotPMBnA7PQA4dQL0Ju8iAuu6bQ506LcOE9qMjtEpuudq5HocxG1rP/d6DaosAFj2AsAicuuN0NJN9BFjSi3qRH3pJ+s6wAbtI9ahx5xwowVBp06mvoeWcp++bBI0XvbiGNljEQAShWUEQXBkAgVCii/GFELXGKkPEGIjdOChcAZ2bOFM4ZDmQSMCwF7/PeFxUdxVMuf2PUwRnltbAJxSe+5n32cMpGDckiHFVpvXnRFj3qgzYyYAURAjguWjwtqwxpnCEGNzEJMLcBhhsj46XJk4ID6BFdMwBbg5BoOBOWM8INsARwTLA728fHv5Fnp5+S0AvgYhrejjuxHrytjj/lUYCQ/C4P/buQLdxHEg6tOqQidVp1XlXcUnegOG8v+feDPvzcjUC6E6jiyR/MD2eDx23nOSkinb/StsHwc8ZYZchGMQy5nDZNDFTaLQiwJI/w9KSFfAHcSjpQkwFdxWPmvy0wp81YYAOra+z4CL9JOD7pYiIXDL32ZjPreFmhmO5qIAsNc3SroCW9DKVmGsIUBbsIgXzg530Gp2GnmMw0W+W51iq5nTAlQsDUr2uC3l+8SrAv7Q96wA23uUrbGgCnLE2tQTbqRhIGDRcXLIQf0gF2o8Tg1EgCpX4eUUS5LBdQGKWQE4LPdnt/25gxoFyJMLHKiCJiQFeRgM4V6EgHCAMSrnzfmxbWSQLsDoA9pcFbClAJDZ7rY7XVE9O/XY2maYR99oYOCtheS5o/AwZKctJ7lyko6ZfuX4qoYZAYEZAT93WIynd7fb8SDkrYYKgh6G6csMeHAhNEnqcso78MJczuBk620pwH3mxOozAn78YDUngIspYQowAtZssXbQVS8ogpaWXRMDAwVjmE8BocHnoPLLUGNQqYcMrlxCP/5RAVrNCdhCgPMA1S14g0ATAGkmwApqbTkKpwXvUGMmunBDE31UprX54KTczwJe+OkFgDsqx7eXl5dvhBovKdlC2ECuqS8DxZjH+ZkvBCCQfpDh+YEb7Lgi9Pl0W9gFWIOFQ4DHpwawCwF/K3etAOd9jpTIE5vA9XxF2CBGBtFHTaahnQ6XxWUoQJu2LLiTdrhgeJP+K8AM6/qbhQcKJQpW9NKPxj1scF2xAwHhjmWbbW92wky3wH8oEf/UoIELJrDpjtIqepq3NbTaNG1SC2bT+oDPbwJQbgsAe+CCADNiXevEYYNH6o5Pf0qNS2PujRnWwB8zYKcu8IsCXtsJOBeAozQ7liIdVBy2DtugQDcMKAxvapPQY1RzekALZ+frAl4hYHV4VfgVtFoBfhOs9AzwJuZNsE4BTcFaz8Am8Oxn4AUPEgQeRLVyfFOkp8cGj2sQYZkMKoU/CG3S0wP8jbG/zYRFBekeHK/hxoyK+nRiBcwIMHxrAHcAI8sLOIUA8q+oZwRsyF8LDLTom7HZLCxA6SrlWo0zXtbTdk7A5kU1WIFBG4C5tABSrmAP5tU6dUbA29v3t+/Ea8A6bwqtlhZQlbdBOZuOit6sgD83DXECoq9jiwvAnmsDS1/szF1CvOKt2mjRl3q05j2x+E0cCtyIakYAuBLNao7fIICcz5Xc/jEK6h04sLCAuGxi86vf0fP3wMs16F2wuADSjh8+VlV8DtyB5QXwJJgA415Px1UJ4AcxuFtrAvQcrEeAsSZOZvNCqisSUMHbysls3MurFKCGk1+XgHiO45XTPgnWJEAVYP9XK6BCAF/AmgTUyud/sraGZr06gTh87Pf7j8Ot8SUE8CcnBbACbgj4AMGPW+OLC9AX6i8IOOwPIDg7vkhKGfdu+zxbq4D4PMM5uCngY69lfnwJAeBfIYJJPdrjVwQctMyOLyaAF77y9gz/hBlrEQCYBNzJJ1SqZTUCTiFAAe5QcUGASKD4X3WrwVZKTcl6Itlgbkf28AcKwHZHTsNaXfWCgCJaSpUslSQzRIjakhLEhIAsXfiDBVQXoIjUrKYOtRSQrdz2agKUP95G0HpmZXorzkyEP1KAopJ71HhdEJCLsa7YXxNQQT0IuhkCuvDHCUAOHNR9/y8LkKysRaoYNSWX1UMfBUAOBQiIl7Pwh6aU53t/RFHzVwFTybWITGKscYnUXE2AekwA5Ey55GwxXfgiH2TVf9F+OR+YJgEfazNqmQpYqq0E1aHsJ1Tq6cIf/kHGnz0w6zUB0/tk1TsrItqUaPbjEfLYS4g7j7u5XhXwbqze9/aQ9m6PaXs6+FaCaLvxFvHIDzLfeW3OBZxSh73ioMQUe9SHw77h1vhjP4lP8SRH9rwd1pKRnU4UYFCz3c9rycj460SQR6knltNaEho8uCm0QaGh9f8r4PjbcUdG9qwCbucDQ8AQcIYkAaZgx1xylSJMA/xxujL9ysdaIjYz4gkEFGZYkYJV5VbRtnwAQ1VbG9BOgYDyNAJAKVKwyIeVa2RkUOQRFGA+lPIEAvjHwpGCWSN+1eR6JkC9TZ+F12cS0FIwI4Wrp4rkWkIA0y8IKFDqAuQJBEyfUjAjVa1SW4VRwDQh7+QoxCK70d70BAK6FExJ2Q6raS9JJnDy9EsgzBO0yZpnEDCfcc1nbM8hYD7jms/YnkDAnRnZEwi4LyN7AgF3ZGTPI+D+hKZquRv1gmMhAVKlHRQVCiEsdNGu0mLQa4u02WIVl+vWaebdGZlgISmSj8VZFKfUaMlRxDgUuNRGYQyYlljEZ6BUEQx08yCMS4rF3ZkPFKlS8Y3CMevCYMEDoKKnHAuOntVmX8AAMRpdciyi8SSJ8Vw4A3Wsgy2BWXCgewVk4VNsrrnosGSxlruVcbBiY6JOi0O/GAPGwJPbIsovixGDomzUz+dlJc2hmtWucrcAiedvAQ01+gSoCMZQaWhLhjyG+6z1xYyqm5f90RluKVaSiEBJN8HDU+r5Kc75ZR5fEI2oLgGKb6icAIhgNz1GUEq+nFF188icywnFJ7CR0k/w8JR6fkUUpfEzF95cvHQJUOyLR4I0nB4TIq5lVKXNQ8soLkqG/n++9BNcSkq/8IPexg/ljHifAMUgCXCH23dUFKK+axlVE1C4vjXm6QT8MsHDU+r5UUDwcxE1CwOKXEqAGMLrvvtKC/2ZjEpSmwcCGUs1UqmfMPmEJqDnVz7zYzKUtJeqCNrUJ0AJK2UdlZos9bBAxKAvNRZpGVViRiWf5iUcVC1zqrtop0vBhJmWiIZPRadHspbzVDWqS9DsHsEbRpLENkmxo4JHUfY2bg0iBPQZ4/1UIEttwbxibnvJ+Tx40YMGsJPUpWCeaakFn8ZaSlYmqyf1tAStgN/yWOA7sgWwwHdky+D+78gGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBtaCfwE/iN7wd4XgKAAAAABJRU5ErkJggg==","spider":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAAKlBMVEUAAACSiX+MgndgVEhPRTxHPjWoDg49NC0yKyYmIBsmHxoaFA88AgIiAADotIQjAAAAAXRSTlMAQObYZgAAAgpJREFUeNp10rFu1EAQBuB7B8RDUCIs0tB5rUuUNAivfBKvkI5b/eNLyVkzg6hQYGfyAkn6oDwAFUUqUvA4rHTGthTlb7b4P+3urHZV4uqqsuKbHdNNz3S9A5V1NUVIVW0leQfOCuQvhNzTDJhF3W6RlUvJV5R7przjBSBxu5KbHmV73OJaUc7DBDIVIKs5zuSU4nSIkYotgSUox25z0GAtfe+qk+GWN0PCARhI1fgwyJhjpOb7QDQBN0DVJ9BRiJmhB8CQAlhlAfZNaxAfb8ziwuSLQeqmrdx8BMJi0qsvBrms6hP3AuZIFxNYRJBj6L5W9d8UYg8SGcGmjSlRFuOB1/vqz7v6mLYbcscIEoYOAjNLoB+/6urtbwarGabB2q4juBnR5dnj+fnZ4wlDM2QEbQhdVHXOoLr69PBwVFfM0sNmgEE9g5Ve34U3dTh9IcZu/0Gsw2atboDL6f37u48vL+7E4c4jaD80YU2ult0v/NvP01d+707CGMG2DVVH5uNrPk0a2oog7vYM4G1qgN6FngEAgZmc8aQKMTSBgY62KbShCwIKaTODGPhztU6csA11FTgJQhNpBuGoNM2QIGDsQx0ktfF4ARKDIiKYmUAhdMZtxzIDYN+g5xLJVO4Aw8BYAG9L7waQeiaQGwlIZ5ARu9g7a9Yc0wYFK+kCeAbgDvfegdK7qyy+4z9b0kGP3NmJngAAAABJRU5ErkJggg==","tadpole":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAFVBMVEUAAABtUz1jSTNTOSNJLxlEKhQWCgDfr9AwAAAAAXRSTlMAQObYZgAAADdJREFUeNpjYGAyCglgAAFGRVcHMINNzMgARBuliSUZGQEZzkZGxsHODNiAs6KwA5RlYsBAOQAAqGUGQPKmAvcAAAAASUVORK5CYII=","turtle":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAABABAMAAAAg+GJMAAAAMFBMVEUAAAD////K0JHCt4ComnNHv0qUi2OCiFQ/pEI4jTopfUkwcj8gakMlZDMbWzExMTA/pVLKAAAAAXRSTlMAQObYZgAABDNJREFUeNqd1s9r40YUB/DAZr1Z3JT+By2S6XnRiJyD9ZjmtBRSUbWnQITMQlgKXeJL6aGxlpltD2VZjKY2uRW2JodAlxAxm9DD4satYnKuI7OH0qUkEfQ/6Iwk/7isrNnvSUb2h5n3pHlekqkG9AVC60vvnLuEPJsCDxMRL01pYIWQ1hRwo+T6leeBixUA234MsJV98Cxdxx5YFuDSwG3b/tzFX8nLigtoDZngpdlSAHYbOYCMmoZMBaAa+LaIQ0/i+GKpsm1ouqYhFYARCRCWAZamGcLACkD4ITn+nvzXyQCUAWvlgdWQBQGlrBNLYFn8WO7BVABGTQ/Aa56kQAUAtBoAzgHl3DI0rV4XVVQDVvyWtT4FdE0dcDbr9yaAbiJ1wN80Pkqv7riWoWsIGmrAXX9Py4BbKN2CjhQBsolmQE0dWAlaZlaDZWTUTFNDpirwDNazGnhQr2mAVWsQMjf7cgWQ2IJuYjWgGoZTwHIxbIMqwHl7AmCrpmMFYBkAHhx5YfpSt971ZL7tt8yC35Y5Vfdq97JLxoiFkNwBqJyq5Ds9B8IgIIQ89lzLQGZ5wHmqTQBGbZ+0AOmarius4CnKAR4y33E+Qyapm6R8DeietZ4DzJft2CAy5YcjbYEEKp5nU992GKEAIMu4VRLotPGP2aWF0AZlbQCsMl2rnaMJQEQC9gIZCFQAfvTgMAd8/wvKfpU9MKHkXCSs7fE2iGx8uuQ4NmX8uGVstJA5edpNE0q/W7IHtHNMZPIVpPMaewtr8tYuWHJezwD1pPN6rRiocnbm22TQ4SPO/2XsivOLOcAwFgNhNyBdxnnMTznrnPITNWCV8796vd6IixE75pyfxvEMSOf1x8XAe6PLg2ESHYwuo+RG7CJOrn+b3kznNS4G7kT9YZIk/eh3r/FtEg2T5lzT5bxetIJlgETkbxDBjWbTA1ifA3StEKiOX0H28oDIcMSvB75t0+jqMAd0ExUC798IADdFdgVwniSsG9hOl+2/zu6n8xoXrSDuAzSaMi7g81HI6B+93oCyw5IPUvXkDVgZsA2f3PAwePLcdnpkBtQWAWNAzTRfm/djzsgvsgbPaX5EyHm9CHCnwMOYd3uB/Ov600EOuHJee4VFvGx4GbDb2ImTq5eBWAHp8kkR5bzGBcDqOJqtYGcYhzSSXRjQvAbpvMaFW7h8NAW+kTVwRBfOnEkN0nldCPB5YCQAW3Th5ylQcQGKpr0EmtMapMCXogZPJFCQghXsR2kbD4blANmFeUB0IRgQ26FnndclAdkFKwdAdiH44YyQSD6JpSK70NjNa9DciTlnpBtFAe2UB8YwXcF9CTCxggErD8RvADLgkXiZRjzsMkK7jJcFVuN/5l7nm3icRCFjL4fJRdkuXPfngCi54uxP1hEzonQX4v7sRMLnMefhfpIwXrAFhXyw4P7/kgmYSeJwxJwAAAAASUVORK5CYII=","vex":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAMFBMVEUAAABthJtgeY9Ta4H////z+Pzg6fHG2eqivNWUrMOGn7eCl6t5kqp6j6RthJtgcoMKluMvAAAABHRSTlMAoKCgEjok+wAAAPlJREFUeNq1yL1Kw1AAhuE3hxYrRYm5gmivQL0Hwa1LnAtCFpdOjuKY4KBjfnYhIUPWEnIBhgxZRSjHC8hp3KWxkg5ndfD5pu8FDqNAKQkwKXIE9Fuj3zCQjECYDCaPs4tOQP9pDME4B1MAbIwTgJEwv2yixPcCPw2igGkcljlZ3YfP33WSJTB9yhG25HaJPLUBtkCdvl5fpVlVVRy3ntdQZW+eX6e77UIcNqAke0eq+JCgGvam4apoUGqtHtC067K9Q1O+l2WMJl9RvPAnl7+0L5Ao9NBB16GxZpZloTGFeWYC47l7DzrXcUF3sHTQjW9YoHMW4zn/5QeNK1xt8XQSVQAAAABJRU5ErkJggg==","villager":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAbFBMVEX///++iGy3gnKze2J6enpra2thYWFUVFRUU1NISElMODM9LSkAAAD///++iGy3gnKUj4m1e2eze2KBfXl/e3eja01vbWqQXkNjYmAAlhFUU1N1Ry93QjVcQjpISElMODM9LSkzJBEjIyMjGBTjk4HHAAAADXRSTlMAAAAAAAAAAAAAAAAA7Uh4SAAAAn9JREFUeNrtlN1ymzAQRm3cuG5C9oMFJIW0idu+/zt2/wieiTNAk0ufgdEKs0cryWJXB0RguUEO1/Xzc871Irs3AViTQdnYLgAzGfmPkFnT9V4tiAI+IyCB/19AVgA+KyCaF9FZL3iDlfUCAl0AjpYmFgWagjkJfjNCtCwgml7niyrmcJ0gho7mQkDrBJALsAhwyYY1IAP4bahgdmKFgBme8PjE/PRI3mMGG1gWxMpnE3GetmFiWQA/yJl/CpzJutggYAYYIjAyQfu8XlAv8DWCb5sFqW2Btk2llJSKctwqIAFJ8oVFQRL+ChcCEKGlKwJSQLRfENBHFYCMZYG+2F6tAOauFgRtC8K1RYSdVqhgd6eCUmIUxTtdKknySXchOYOQEhkAmNmm4YJ5FPWM0nRdbKNGZRxHH2KElx8CRmWCvu+7roxd17nADE1qhdR0RfP1mQZMbAqwnxcT9KnYS5Lc903Tq0U6jVTt+Xo5SesWCUMvIheUMvh5GnwqqpKUJPU0jUSik57jnyswABWgitMYU2MjZlw0X9ppDbpOTMSkwCCQCXw+FBe4uGGUdehGy3950ScaEC4/duwCaWHPorEdGSM/0mMRRlKYogD2bZzGZvuJIa+/SFIQYfCjqvb7w6EKDiYAGe5h4DU4/3o9ezSzF94JGK4IC84Tr+d3PHzwTbTqvQVkqjMlSEa5KjhYLUElPJxOD8r9/cmjGQJxJmMgQVN2B0UCbUxxPJ2+OyI4BnfKEcAwxF95mARL1BcAnJmcTIRqq0DzQsCZwJsEUIgGFUCIKmiTQEceZsGwRlBPQGHY3EOQB2Jalz9XAB11crFWUH+Sm+AmuAlugi8T/AM2/NtEbUTDnAAAAABJRU5ErkJggg==","warden":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAAOVBMVEUAAADR1ra7w5sp3+uir4aBmYhudXsAkpVAV2wFYl0HSFcDQVAXKC8GLjcLISoRGyERFRoNEhcFBBJsUoYuAAAAAXRSTlMAQObYZgAABmJJREFUeNrtmuti4ygMhWMChEYrjtn3f9iVEG7r4E7iSyf7wyfcbGetzxIixTuXbyqloICdiCHDJV1+U0UEgFNiAOUdAIZApObfBlAUoLwToBCVE+B1gNvl+laA6+12e68HPoTgvXOAru8FYNrpgbJCAJwIgLHwhW4Sgo8jAfCjcSMIzgXAnJGZSO1f9wFgydiP4pS4fSNnMX+Rx98JIMLUQNQYRD0Mknog2bnMdDXrh4UAOQPIZl/GvWuiGwYXJ4DL5VgAZKDkYhqBRwIwwCKA8dKqTCkE9xoAGkAZpf+QRjQHADjF4NQDLsTEwHOApBFb4QELey7lH+WwwyZoZX0gUQiJ0XtgfxZkoHa1GQuQH6YhGCyyCDwHsOdf4YEMMz9qJ70AzASNwTBoBPAKAKWwDgBoIBMA5vYtBhaBg0LQA4xFalaGDsAYRHYexwNkmGGhGBUDetQgMF8Jf2EOQAHQ7FehmwPMthIy/9YcUAoNv3R2+F2wRLQk/J05kAH1/fJK2BCZJ7DjFiJ8AejwwxC+AeDLCRwCl1cBSAnW/hjZ43+OUeZCSrDR8SHof45nMhb1gI4PBFgnMBvYGwC6deBoEd3vdyKWXkV/cVdmMrMiae/0FgC6VQQpSSj+OgCpWhDoHSEww1MM3uIBc32bjG/wgJrV5qZNeg5wvdyOzgJqifCaB2Rjfj02BDf6ss89QG//4/A5UC3fTU8BrnRo5IkSiexAC7VLVuyKXZo8QHwAADMR852ll08temCH2lpzl5rbN5pZ3Znf6MJ7AVRZpPeXponaqczI+mFmaUi/ALQkUAIizvsAckaWCjVXTRXpqvSoIGsjKmUc60mUCUCccBGEvI+gAMVqwchjgRRoq6q2pVfr9Vt6AANoDNe9LjDrKjNq4uW3JbDuG4BoL8BMI1jUUCZBy3e9fscVAFkbsCUFN5zZrs2EXwIwcfm3Sga9+r3i9Ot5EAAKq3ETd6Ff+CO52uf7/TAAyLOrxA8ovZjLXLY47gdosTb7ED0Q9CHIfwTI2zwwFuR6Tya2tyUwtv4d5aTpd2N+rz6BV2zNOAOQjtHfrP9/SXcmsU/fAHLptAoAmAYvzQF7fuJFD5jwIkC/De4VQ4gdgKbhPATo77BqRbTUIlr8DjP3bCYsjfMWAHusZYBhGLAUjHYSHcEKgH5164XBDeoF1K6UUYuJWejMNApg/VYAspndS9+Vs5c6DMkNbNlrzz4MSqUCSs6zNWMdABPRTyEIzg1JanCDspSmUXn0pDkggwhZR2s9MLY58GMIvHMuSaMM3g0oTc6FWmoIMiElUK72sSEE9/pZBhCrUaowBO8FIFdsOCcnXfUAQCknKZSBzZPwfuflEHjnozdzMm4GgODkggFkCi47KYHyawBLGc3Mi6tYEKvRe6cgUgGU0QCC90JQjIBCILP/IsD4sNhC0n0aPgL4GAQgSgkegHlAD/Tajr8Jx5bKDiySdEdjmANEr7a8lz7FYAAZiDGFmLYDmMRsqinupbo4OGEA8xwgBIEQ6z5SSp8eoETKsBnAHGBWw+CEw2kfKtFsIUoxqAvEGFEitOCBiUmv7fPA4LyYFPmkzZTb83e/lNT3UQZMjGICM4goxk0AaE+BwfsghoUjSpXeSTcHYOIkDDFxYhFKExh6aSMAGoDzwUz66M0Z0rnwAKBOSMykNjGFD9UJnDYCQM1XAK8Q3kfp1BnehzkAbNdO0j2+zFYA3gegGeakSO8FQKsM5wBgUbVf9FPy7I/6zQBjBQiaSGK7proUn2JI84mFwlLkU83PNEpFv7au8UBKFH2qa11QBrVOibqdNOx5l7QdoGAEJSIxqg4IMUWtxMRzgF77AQosgjbF1XBIOohEBH4GMFq7C6CJRYlTrHlGHLUB49c98Imv1kgYki1zicGMsgQAaw8DaAJQ85wsz2p5uIVZBSxk+A4xO8gbtmY1FQtamjPAsDs+TlilrC0BBqHVrphpbN6cVpMsH0jBwn/MRAARMZqj6hAytEFZElbvDdGs9wD0RL3/Ta9Mwp5jtLrln4Pgs8ULAE+0CmASNkzCowBW7w27hQ3WaYP1AP3e8DkAFt9NWIatA9i0NyyosGDriqV5aWmOVQD93lCV/3yPKYlrpdKl+RqATXtDeqI1ACv3hsfrx73hqVOnTp06derUqVOnTp06derU/1n/AR0CP3Q2vq+HAAAAAElFTkSuQmCC","witch":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAACACAMAAACMX59YAAAAmVBMVEUAAAD///+2qJWrn42rnYmmmoijlIOgkoCPj4+YiXeWdliWdFcltDWUc1Z6d3eAcl6PbFNra2uQXkN6XnBhYWFoWUwMixp1Ry8vaDVaTTZMTExHT0hQQy0/Pz9IPCc6OjpANSQkQCg1Lh0dPAkxKRwoKCgsKRg2F1guJxonJiYwFE0YKRoTLgEeHh4oEEIdCy8REREVByUKDAvCurIkAAAAAXRSTlMAQObYZgAAA1lJREFUeNrtloFS2kAQhiPphVJbKVq10XDG2Ba4mjvx/R+u/+5yR1U0d2SqYyefgcuO+T/2NoYxyw4PMyLPlVL5KN+gsuz8/Pg46+bw65dPtEoeginjBdFAkAvTEkwVxen1eoJRjg30FfTbgjAKQ0wlD0NQTEKQNq98ntcANhU3fQkVile1talogRJBkQsiIFG3QPnrVQHkNBhAt8BHCgKFxBURJSh8/hcjFeULECXwMzs4KYqTAwpLXgxFtwBXkWM6/gDGU0kHugUTMoDpeHx6Oh5PleQnExy0dAsmrICAmUp8S/ZeKQum/BFIFUyYWIEGP0GMYAEM+OeCgnkVQQNqCJrlcqlBDXBWqVGuKlSE1lVZVpW2wAtoeSxoWEB1XZVaKV2WqEBVleCBwNEaBFoEsm4Epaa3RgQlTvHmSGCQdxCYIKglWEOAbpdNAxclaoR8hWZwOGedgcABWkVQe0ENFY4lIIFmgVQaabw4CPzKglrX/MkNTuigAJpmQaUbrl4WIMXD07JKhHagMfiGigYmHFXVIahl9UNssANUAGdIw7FTgMslSAMAItAiCDpsCT/ZLubzppHcfD4D4tFVSV1UGwHycOwWXMwR/Hg0w3JBAuwaR83AQhORHtDjbgGYHc1mtH4DMjbN1DpUPKnseRZ+eRFjrbPWGKx88vev4gQGOQPYZJIFoQO7swNZXsSGLTzpYNEpcIA7gEHOxRY7RBFgBs4L/BycW6P0HaBar52VLxz7tAMJiUC6ySwiEBiZMucd8oR5IkAqCMS1EVi+2iwMFw5hEUTAAkuC2xsIaENUCdEC9EICRGy6wPEMsGkvWKcK1jKDrcAlbmENgoArt7/A7CFwDwRuDwFP0W+BJ5J+GyEwj+6CSRQYEZitgH6iBU4ExgtMssAaayCgR5QqK/8B2PgtWMsCePhhIB+wCX8H4PYGQdKJAG9JHYjAypNhKQ0ShshXs8DtIXCISMECrliYpbEK3AcSBS2zv6C9Y9pB8IaC/rfRkyZYRfKsoI0kspGOzrtuQdtHcEe8R0H/GfS/C23gd/uYNMH19+u9BFcbLs8+n11ePSSpgxU6WLUeea6TJsiz2xd88tsJ+m8h9osj+gvl3QnA6j7rBQ+uD9z2wMDAwMDAwH/EH571WWMJHeH4AAAAAElFTkSuQmCC","wolf":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAMAAACVQ462AAAAw1BMVEXt5+jk3t/c3Nzf2dnW0NHKxsfIwsO3t7ferIWzs7Nu1Je3q6WhoaGdnU10oIaBgYEatVh+dnBegyJlZi1iWkAodi5WVlZUVFRERERHQjs+PTBENiY5ODVDNSWAAHY/MCQzMzMtLSg1Kh8sLCo0KR4ZGRkAAAD////k2Nnd2tvV0NDTz8/Kx8jJwcLBvr7UtaTOr5bEq5ywqqefmpaalZGnj36ajIiVhnmheFuUe2iBdm2Mb1JJQjk5PD85ODUtLSgSFBY76smzAAAAJ3RSTlMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAi/HzzAAADR0lEQVR42s2UbXfbNgyF6Wli41WZqm3NtkQOZ3ZVwwCFbShO6r6k/v+/ahdwtjOp/dJvvZT5gqP7HAC2GYZhWFDBYBIilsvLy5Ty8HsPiY4yirIQBgtfX1/HLlbD/xUcQIXh51JI1ut1TumiXyz6SKKkAi4AzEQGCLH7AhCpFDxMmBmAlNIffYw9MlMgPewrAPDHKWCxiAtmEFjYyogIrNd//frixU8/lyKIF4htdUAIsxIETiEAfMPGQRmDC0HzGt1Xz6AKUwAXJxC8VAgkb+TgIgIacV//7UE1K8Fsb477/fGN+Q1HAFw9e5auErZi5KcVANcsA+D3H+7vP+yFvA9CvBZhr8qmU4dP9Ukx3AzABP/DAwjE9hbGb1TcYnYCynCOksJYpwCR/cM9QfcPe3lSApWwAgJ5AbazPhhqCkgpvdwddnjOzlLKOZnEatH/CKKEgJ0w5CuA7WHrgL8dkNMVLMKj18BWxegBIgVHZQrIOb/cHDYO+CGfAIl1VMHjDYRvFATYQ9hMAb9Am08bJHF2dg6Z/wqq+9j3nf3wYmhjFWOoY+xirOowBWw3Nzc3R3w22+1utz0fHqFl09Z919e1WAqS61hBDsA6B4Bg/g36cNidP5bySKVtYmeDCkSr6nl8jiy6PkYsU8Dh+Omk4+EEIHosVFV17LouFhKlEioQapj7LoZYTwE2NaucXl9cvLa9XwSLUHW9DaERDayRd4ghdH++whzngM+f373LKwA+fnz/dvCLIIaqRgv6qGKAEJxQhVcd0ghfBSQHvH2P0I8h4O3Tt6Cqo+riZK8i9MV98HThcVZMQsyDiLVO7CjYEGYqSlSFAABYUwDx6T/YwEesTANWOIRxNCuRFLZWLtGqpmmW7QxAzGZdqllUDFBOAMvA9pgVuTRt2yyXmOYZCDOsjYqjeGAqEBPEBSIERkCaJue2BWbeA7jwcYACMbAl4CWI+NYBVAyQVmkOuNPxTvVubAUWJZQAJxh2ZAD8RKNyaVv7r+c5AH6MUbMKwW5NZKtamP26RgiPjkwruLMxpgBhvr29ZTEAmwsAtq3gMdbpNDIjfSBWaTUFrFJOVlvGQHrAm9XNPmEAwCqc7UWbpoDh2/WdAf4B+LQj08eGOFAAAAAASUVORK5CYII=","zombie":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAclBMVEUAAAAAzMyPj495nGVxlVtvlVxtlVtnkFYAr69ph1Z6d3cAqKgAnp5ae0gAmZlra2tXdUdOezZhYWFIdTJJcTVWScwAf39KaS0+aS07Yi9MTExGOqU2WiUAaGg4UiYAW1s/Pz86MYkwKHImIVsoKCgaGho5R/XAAAAAAXRSTlMAQObYZgAAAkJJREFUeNrtk2FzmzAMhpPNm+0akmjVqFRGEsPy///iXtnlml27laRfeWwswZ0eI3NsZkRFVWwUdHMrIqzKitKC3C4gVjhgOQLVOwQEAcvdAmViwZQiuKOFsj2J3i1gZWEVrAqEbxaIlkHMAni5QK15VRSpwTI/UFuYFnx/q2ZCQYyMEq5PSKWMJW8gZSv//av75rneqcJFxMqLemdiiq1zLraR6llimEtk2fdnpvZycfFyaeGScggkqKclLQjqWShG1RhR/XIKCEgWtCByLJs96tOTPiIROoogMhEvO0QWqf+AWqXdsQIEWfhP/AS/wXy//VXYji/Mz8N2G5iIPxYcC28EW0CsnxOwqnyqhTf/yQhy3/fjNE096Lru1CRl0dR0oGlSCAn5bteZYI7vCcYiGIYuhUa1CQH5kFIAVRbAHP8S9FeCoQhC2XgAKSDB8h9BroIMQc79aRhOwQwoqzkyTMt3Ke3m+CrIVWAxwzacTiZIRQBCgwyXgAgEtGAzk/tcdh6R2ETNkEyAOSCfBcykLjovyuy9j68CVPUAS4lWZB3AkQa8b1WlJMzqW9eykvhD9O8IkM1foR5Bg3wwlzlQJ967loQ0Ru+vD7EKMjJggnJsuKosYZpA2TsXiVnjdQvnsxVa+fm8B93QdbanlRUBkoBFWMk574RF/PUbPJ9R+OVhj/BsgnEap1xIoZsmyO1EcyYI0IFXQTz4+CoA+4f93uIPAMHYF3JTcyRokkmodbFVEo6HeNisrKysrKysrPyDP68WY0lh7YK7AAAAAElFTkSuQmCC","zombie_villager":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAt1BMVEVskkNwbWdVczVjW1tWYC5jVC9IYC4/WChUSSg4TSM4OyExPSUuNyQAAAD///+Iqlt3oEd2kk9skkOCe3RyhFFmij9ffzdwbWdedUVXdUdVczVjW1tUZkBOazBgXjhOaC1HZTdQVzdUTU1PUTNBWSiZKys/WChcQjpURypDTCQ4TSNKPj42TCpJQSRMODNCNzcxRB8vQh44OyExPSUsPRw7MTEyNyQqOSE9LSk2MiAzJBEgKxgjIyNApSiHAAAADnRSTlMAAAAAAAAAAAAAAAAAAKroblcAAAMeSURBVHja7dF/X9s2EMfxrGs3oGtxHXTSztIuE+mtyG1+2HNKxp7/49pXIoHSUhxe65/52E6cmHs7MpMXuxxR3p0iFF6+3Gz+vPztlxdP9AZN9h8IfQ1c/vEMgMkgItV/kYbN5upys/nw4dWhAOarGkS4Ay6vthmYfL8HAHNViD2w3VxdbbfPAGoMV1VVuz2w/fTpeUBt6ro6r4yWwtnZycnJ2dmrgwHMwqjODbmADgeIqrx6Q5XBKvALSlRyOCZjAJM5ZyJig0dgKkN3sw4HjwMEwTAFNlRfuIpDnkIF4DAOMAsRgGAMuYvzEBwmQRTG0SGAGlYX5hfv8AjfzYMT54QzwJ4OAkRFHc//Kc2ZhJQ9xvHCBwDCAkGE3r4P4f1bkuxB9ThRFR4FNCVFqQ9zFHp8wr7OX616XBsFUt+vUwbmf6M5ZtI6rYHgwqpfrQ4BUhb6eanv0rpba5dS32G8GwdOT1+f5iYjjQG/PvmHTwE/o5/Q5EFWhVnUNnc9FxBCfChgUd91/et7gDGu9AjgyNHnm8833wIQvgDoe7+A6to9CnQQvgQYgDwCmLqmGwhjS1Bh4scAMiQPgCZnse2zdmqbiHkS2Qm2URG11iEict47T6gAbRObaNvYNjhpbIyxzIsw42War8a4U/M8Nod5vQdibNs4DC0MGzNgpzGlJEiTLfMQUIwYNo68I3WexO2BdgCgQ3awNVlJuzrcGpP5FVkhckCIRLGLuwVaTaopJLyBGuK9gPmptRbfNFMc1qozZfFCglQKoIgDOeagA7Ym3zEOXa7MN1gASBBRlQwZQ96JOBwF4MCeidg5puQ4YMELPNgO5UeXsWVEgAYVJlMALkIBKIAAwHnH0SI8FE2xybddYr5tmzZFJAwAeWYIorcACzE5KC4wBwDLYVgu24gwPeR57KlFHpN1XRsiZgehACKz2wUJ+xnOF7uu/1pcL77Kq6caZUD2/0ZFAk9zM9XrfYvrb1L1TPXvNbFnhwqQEPOKZbVKaZW0aWIpvy+bZVOypUYT7vFx9tGz9zOcFuDN/+gIHIEjcASOwBH44cB/1lQM4ZNhKecAAAAASUVORK5CYII="} \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/allay.obj b/renderer/viewer/three/entity/models/allay.obj deleted file mode 100644 index 69765c22..00000000 --- a/renderer/viewer/three/entity/models/allay.obj +++ /dev/null @@ -1,325 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o head -v 0.15625 0.5631249999999999 0.15625 -v 0.15625 0.5631249999999999 -0.15625 -v 0.15625 0.250625 0.15625 -v 0.15625 0.250625 -0.15625 -v -0.15625 0.5631249999999999 -0.15625 -v -0.15625 0.5631249999999999 0.15625 -v -0.15625 0.250625 -0.15625 -v -0.15625 0.250625 0.15625 -vt 0.15625 0.84375 -vt 0.3125 0.84375 -vt 0.3125 0.6875 -vt 0.15625 0.6875 -vt 0 0.84375 -vt 0.15625 0.84375 -vt 0.15625 0.6875 -vt 0 0.6875 -vt 0.46875 0.84375 -vt 0.625 0.84375 -vt 0.625 0.6875 -vt 0.46875 0.6875 -vt 0.3125 0.84375 -vt 0.46875 0.84375 -vt 0.46875 0.6875 -vt 0.3125 0.6875 -vt 0.3125 0.84375 -vt 0.15625 0.84375 -vt 0.15625 1 -vt 0.3125 1 -vt 0.46875 1 -vt 0.3125 1 -vt 0.3125 0.84375 -vt 0.46875 0.84375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b432e290-ff98-8fcb-61cd-b0f5c289cd94 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o body -v 0.09375 0.25 0.0625 -v 0.09375 0.25 -0.0625 -v 0.09375 0 0.0625 -v 0.09375 0 -0.0625 -v -0.09375 0.25 -0.0625 -v -0.09375 0.25 0.0625 -v -0.09375 0 -0.0625 -v -0.09375 0 0.0625 -vt 0.0625 0.625 -vt 0.15625 0.625 -vt 0.15625 0.5 -vt 0.0625 0.5 -vt 0 0.625 -vt 0.0625 0.625 -vt 0.0625 0.5 -vt 0 0.5 -vt 0.21875 0.625 -vt 0.3125 0.625 -vt 0.3125 0.5 -vt 0.21875 0.5 -vt 0.15625 0.625 -vt 0.21875 0.625 -vt 0.21875 0.5 -vt 0.15625 0.5 -vt 0.15625 0.625 -vt 0.0625 0.625 -vt 0.0625 0.6875 -vt 0.15625 0.6875 -vt 0.25 0.6875 -vt 0.15625 0.6875 -vt 0.15625 0.625 -vt 0.25 0.625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b432e290-ff98-8fcb-61cd-b0f5c289cd94 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o body -v 0.08125000000000004 0.23750000000000004 0.050000000000000044 -v 0.08125000000000004 0.23750000000000004 -0.04999999999999999 -v 0.08125000000000004 -0.04999999999999999 0.050000000000000044 -v 0.08125000000000004 -0.04999999999999999 -0.04999999999999999 -v -0.08124999999999999 0.23750000000000004 -0.04999999999999999 -v -0.08124999999999999 0.23750000000000004 0.050000000000000044 -v -0.08124999999999999 -0.04999999999999999 -0.04999999999999999 -v -0.08124999999999999 -0.04999999999999999 0.050000000000000044 -vt 0.0625 0.4375 -vt 0.15625 0.4375 -vt 0.15625 0.28125 -vt 0.0625 0.28125 -vt 0 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.28125 -vt 0 0.28125 -vt 0.21875 0.4375 -vt 0.3125 0.4375 -vt 0.3125 0.28125 -vt 0.21875 0.28125 -vt 0.15625 0.4375 -vt 0.21875 0.4375 -vt 0.21875 0.28125 -vt 0.15625 0.28125 -vt 0.15625 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.5 -vt 0.15625 0.5 -vt 0.25 0.5 -vt 0.15625 0.5 -vt 0.15625 0.4375 -vt 0.25 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b432e290-ff98-8fcb-61cd-b0f5c289cd94 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o right_arm -v 0.15625 0.25 0.0625 -v 0.15625 0.25 -0.0625 -v 0.15625 0 0.0625 -v 0.15625 0 -0.0625 -v 0.09375 0.25 -0.0625 -v 0.09375 0.25 0.0625 -v 0.09375 0 -0.0625 -v 0.09375 0 0.0625 -vt 0.78125 0.9375 -vt 0.8125 0.9375 -vt 0.8125 0.8125 -vt 0.78125 0.8125 -vt 0.71875 0.9375 -vt 0.78125 0.9375 -vt 0.78125 0.8125 -vt 0.71875 0.8125 -vt 0.875 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0.8125 -vt 0.875 0.8125 -vt 0.8125 0.9375 -vt 0.875 0.9375 -vt 0.875 0.8125 -vt 0.8125 0.8125 -vt 0.8125 0.9375 -vt 0.78125 0.9375 -vt 0.78125 1 -vt 0.8125 1 -vt 0.84375 1 -vt 0.8125 1 -vt 0.8125 0.9375 -vt 0.84375 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b432e290-ff98-8fcb-61cd-b0f5c289cd94 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o left_arm -v -0.09375 0.25 0.0625 -v -0.09375 0.25 -0.0625 -v -0.09375 0 0.0625 -v -0.09375 0 -0.0625 -v -0.15625 0.25 -0.0625 -v -0.15625 0.25 0.0625 -v -0.15625 0 -0.0625 -v -0.15625 0 0.0625 -vt 0.78125 0.75 -vt 0.8125 0.75 -vt 0.8125 0.625 -vt 0.78125 0.625 -vt 0.71875 0.75 -vt 0.78125 0.75 -vt 0.78125 0.625 -vt 0.71875 0.625 -vt 0.875 0.75 -vt 0.90625 0.75 -vt 0.90625 0.625 -vt 0.875 0.625 -vt 0.8125 0.75 -vt 0.875 0.75 -vt 0.875 0.625 -vt 0.8125 0.625 -vt 0.8125 0.75 -vt 0.78125 0.75 -vt 0.78125 0.8125 -vt 0.8125 0.8125 -vt 0.84375 0.8125 -vt 0.8125 0.8125 -vt 0.8125 0.75 -vt 0.84375 0.75 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b432e290-ff98-8fcb-61cd-b0f5c289cd94 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o left_wing -v -0.03125 0.1875 0.5625 -v -0.03125 0.1875 0.0625 -v -0.03125 -0.125 0.5625 -v -0.03125 -0.125 0.0625 -v -0.03125 0.1875 0.0625 -v -0.03125 0.1875 0.5625 -v -0.03125 -0.125 0.0625 -v -0.03125 -0.125 0.5625 -vt 0.75 0.3125 -vt 0.75 0.3125 -vt 0.75 0.15625 -vt 0.75 0.15625 -vt 1 0.3125 -vt 0.75 0.3125 -vt 0.75 0.15625 -vt 1 0.15625 -vt 1 0.3125 -vt 1 0.3125 -vt 1 0.15625 -vt 1 0.15625 -vt 0.75 0.3125 -vt 0.5 0.3125 -vt 0.5 0.15625 -vt 0.75 0.15625 -vt 0.75 0.3125 -vt 0.75 0.3125 -vt 0.75 0.5625 -vt 0.75 0.5625 -vt 0.75 0.5625 -vt 0.75 0.5625 -vt 0.75 0.3125 -vt 0.75 0.3125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b432e290-ff98-8fcb-61cd-b0f5c289cd94 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o right_wing -v 0.03125 0.1875 0.5625 -v 0.03125 0.1875 0.0625 -v 0.03125 -0.125 0.5625 -v 0.03125 -0.125 0.0625 -v 0.03125 0.1875 0.0625 -v 0.03125 0.1875 0.5625 -v 0.03125 -0.125 0.0625 -v 0.03125 -0.125 0.5625 -vt 0.75 0.3125 -vt 0.75 0.3125 -vt 0.75 0.15625 -vt 0.75 0.15625 -vt 0.5 0.3125 -vt 0.75 0.3125 -vt 0.75 0.15625 -vt 0.5 0.15625 -vt 1 0.3125 -vt 1 0.3125 -vt 1 0.15625 -vt 1 0.15625 -vt 0.75 0.3125 -vt 1 0.3125 -vt 1 0.15625 -vt 0.75 0.15625 -vt 0.75 0.3125 -vt 0.75 0.3125 -vt 0.75 0.5625 -vt 0.75 0.5625 -vt 0.75 0.5625 -vt 0.75 0.5625 -vt 0.75 0.3125 -vt 0.75 0.3125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b432e290-ff98-8fcb-61cd-b0f5c289cd94 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/arrow.obj b/renderer/viewer/three/entity/models/arrow.obj deleted file mode 100644 index 469dd6cd..00000000 --- a/renderer/viewer/three/entity/models/arrow.obj +++ /dev/null @@ -1,60 +0,0 @@ -# Aspose.3D Wavefront OBJ Exporter -# Copyright 2004-2024 Aspose Pty Ltd. -# File created: 02/12/2025 20:01:28 - -mtllib material.lib -g Arrow - -# -# object Arrow -# - -v -160 8.146034E-06 50 -v 160 8.146034E-06 50 -v -160 -8.146034E-06 -50 -v 160 -8.146034E-06 -50 -v -160 -50 1.1920929E-05 -v 160 -50 1.1920929E-05 -v -160 50 -1.1920929E-05 -v 160 50 -1.1920929E-05 -v -140 -49.999992 50.000008 -v -140 50.000008 49.999992 -v -140 -50.000008 -49.999992 -v -140 49.999992 -50.000008 -# 12 vertices - -vn 0 1 -1.6292068E-07 -vn 0 1 -1.6292068E-07 -vn 0 1 -1.6292068E-07 -vn 0 1 -1.6292068E-07 -vn 0 3.1391647E-07 1 -vn 0 3.1391647E-07 1 -vn 0 3.1391647E-07 1 -vn 0 3.1391647E-07 1 -vn -1 0 0 -vn -1 0 0 -vn -1 0 0 -vn -1 0 0 -# 12 vertex normals - -vt 0 0.84375 0 -vt 0.5 1 0 -vt 0.5 1 0 -vt 0.5 0.84375 0 -vt 0 1 0 -vt 0.15625 0.84375 0 -vt 0.15625 0.6875 0 -vt 0 0.84375 0 -vt 0.5 0.84375 0 -vt 0 1 0 -vt 0 0.6875 0 -vt 0 0.84375 0 -# 12 texture coords - -usemtl Arrow -s 1 -f 1/1/1 2/9/2 4/2/3 3/10/4 -f 5/8/5 6/4/6 8/3/7 7/5/8 -f 9/11/9 10/7/10 12/6/11 11/12/12 -#3 polygons - diff --git a/renderer/viewer/three/entity/models/axolotl.obj b/renderer/viewer/three/entity/models/axolotl.obj deleted file mode 100644 index 706474b3..00000000 --- a/renderer/viewer/three/entity/models/axolotl.obj +++ /dev/null @@ -1,509 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o body -v 0.25 0.25 0.3125 -v 0.25 0.25 -0.3125 -v 0.25 0 0.3125 -v 0.25 0 -0.3125 -v -0.25 0.25 -0.3125 -v -0.25 0.25 0.3125 -v -0.25 0 -0.3125 -v -0.25 0 0.3125 -vt 0.15625 0.671875 -vt 0.28125 0.671875 -vt 0.28125 0.609375 -vt 0.15625 0.609375 -vt 0 0.671875 -vt 0.15625 0.671875 -vt 0.15625 0.609375 -vt 0 0.609375 -vt 0.4375 0.671875 -vt 0.5625 0.671875 -vt 0.5625 0.609375 -vt 0.4375 0.609375 -vt 0.28125 0.671875 -vt 0.4375 0.671875 -vt 0.4375 0.609375 -vt 0.28125 0.609375 -vt 0.28125 0.671875 -vt 0.15625 0.671875 -vt 0.15625 0.828125 -vt 0.28125 0.828125 -vt 0.40625 0.828125 -vt 0.28125 0.828125 -vt 0.28125 0.671875 -vt 0.40625 0.671875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o body -v 0 0.3125 0.25 -v 0 0.3125 -0.3125 -v 0 0 0.25 -v 0 0 -0.3125 -v 0 0.3125 -0.3125 -v 0 0.3125 0.25 -v 0 0 -0.3125 -v 0 0 0.25 -vt 0.171875 0.59375 -vt 0.171875 0.59375 -vt 0.171875 0.515625 -vt 0.171875 0.515625 -vt 0.03125 0.59375 -vt 0.171875 0.59375 -vt 0.171875 0.515625 -vt 0.03125 0.515625 -vt 0.3125 0.59375 -vt 0.3125 0.59375 -vt 0.3125 0.515625 -vt 0.3125 0.515625 -vt 0.171875 0.59375 -vt 0.3125 0.59375 -vt 0.3125 0.515625 -vt 0.171875 0.515625 -vt 0.171875 0.59375 -vt 0.171875 0.59375 -vt 0.171875 0.734375 -vt 0.171875 0.734375 -vt 0.171875 0.734375 -vt 0.171875 0.734375 -vt 0.171875 0.59375 -vt 0.171875 0.59375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o right_arm -v 0.25 0.0625 -0.375 -v 0.25 0.0625 -0.375 -v 0.5625 0.0625 -0.375 -v 0.5625 0.0625 -0.375 -v 0.25 0.0625 -0.1875 -v 0.25 0.0625 -0.1875 -v 0.5625 0.0625 -0.1875 -v 0.5625 0.0625 -0.1875 -vt 0.03125 0.796875 -vt 0.078125 0.796875 -vt 0.078125 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.796875 -vt 0.03125 0.796875 -vt 0.03125 0.71875 -vt 0.03125 0.71875 -vt 0.078125 0.796875 -vt 0.125 0.796875 -vt 0.125 0.71875 -vt 0.078125 0.71875 -vt 0.078125 0.796875 -vt 0.078125 0.796875 -vt 0.078125 0.71875 -vt 0.078125 0.71875 -vt 0.078125 0.796875 -vt 0.03125 0.796875 -vt 0.03125 0.796875 -vt 0.078125 0.796875 -vt 0.125 0.796875 -vt 0.078125 0.796875 -vt 0.078125 0.796875 -vt 0.125 0.796875 -vn -2.220446049250313e-16 -1 -2.220446049250313e-16 -vn 4.930380657631324e-32 2.220446049250313e-16 -1 -vn 2.220446049250313e-16 1 2.220446049250313e-16 -vn -4.930380657631324e-32 -2.220446049250313e-16 1 -vn -1 2.220446049250313e-16 4.930380657631324e-32 -vn 1 -2.220446049250313e-16 -4.930380657631324e-32 -usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o right_leg -v 0.25 0.0625 0.3125 -v 0.25 0.0625 0.3125 -v 0.5625 0.0625 0.3125 -v 0.5625 0.0625 0.3125 -v 0.25 0.0625 0.125 -v 0.25 0.0625 0.125 -v 0.5625 0.0625 0.125 -v 0.5625 0.0625 0.125 -vt 0.03125 0.796875 -vt 0.078125 0.796875 -vt 0.078125 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.796875 -vt 0.03125 0.796875 -vt 0.03125 0.71875 -vt 0.03125 0.71875 -vt 0.078125 0.796875 -vt 0.125 0.796875 -vt 0.125 0.71875 -vt 0.078125 0.71875 -vt 0.078125 0.796875 -vt 0.078125 0.796875 -vt 0.078125 0.71875 -vt 0.078125 0.71875 -vt 0.078125 0.796875 -vt 0.03125 0.796875 -vt 0.03125 0.796875 -vt 0.078125 0.796875 -vt 0.125 0.796875 -vt 0.078125 0.796875 -vt 0.078125 0.796875 -vt 0.125 0.796875 -vn 2.220446049250313e-16 1 -2.220446049250313e-16 -vn 4.930380657631324e-32 2.220446049250313e-16 1 -vn -2.220446049250313e-16 -1 2.220446049250313e-16 -vn -4.930380657631324e-32 -2.220446049250313e-16 -1 -vn -1 2.220446049250313e-16 -4.930380657631324e-32 -vn 1 -2.220446049250313e-16 4.930380657631324e-32 -usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o left_arm -v -0.25 0.0625 -0.1875 -v -0.25 0.0625 -0.1875 -v -0.5625 0.0625 -0.1875 -v -0.5625 0.0625 -0.1875 -v -0.25 0.0625 -0.375 -v -0.25 0.0625 -0.375 -v -0.5625 0.0625 -0.375 -v -0.5625 0.0625 -0.375 -vt 0.03125 0.796875 -vt 0.078125 0.796875 -vt 0.078125 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.796875 -vt 0.03125 0.796875 -vt 0.03125 0.71875 -vt 0.03125 0.71875 -vt 0.078125 0.796875 -vt 0.125 0.796875 -vt 0.125 0.71875 -vt 0.078125 0.71875 -vt 0.078125 0.796875 -vt 0.078125 0.796875 -vt 0.078125 0.71875 -vt 0.078125 0.71875 -vt 0.078125 0.796875 -vt 0.03125 0.796875 -vt 0.03125 0.796875 -vt 0.078125 0.796875 -vt 0.125 0.796875 -vt 0.078125 0.796875 -vt 0.078125 0.796875 -vt 0.125 0.796875 -vn 2.220446049250313e-16 -1 -2.220446049250313e-16 -vn 4.930380657631324e-32 -2.220446049250313e-16 1 -vn -2.220446049250313e-16 1 2.220446049250313e-16 -vn -4.930380657631324e-32 2.220446049250313e-16 -1 -vn 1 2.220446049250313e-16 4.930380657631324e-32 -vn -1 -2.220446049250313e-16 -4.930380657631324e-32 -usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o left_leg -v -0.25 0.0625 0.125 -v -0.25 0.0625 0.125 -v -0.5625 0.0625 0.125 -v -0.5625 0.0625 0.125 -v -0.25 0.0625 0.3125 -v -0.25 0.0625 0.3125 -v -0.5625 0.0625 0.3125 -v -0.5625 0.0625 0.3125 -vt 0.03125 0.796875 -vt 0.078125 0.796875 -vt 0.078125 0.71875 -vt 0.03125 0.71875 -vt 0.03125 0.796875 -vt 0.03125 0.796875 -vt 0.03125 0.71875 -vt 0.03125 0.71875 -vt 0.078125 0.796875 -vt 0.125 0.796875 -vt 0.125 0.71875 -vt 0.078125 0.71875 -vt 0.078125 0.796875 -vt 0.078125 0.796875 -vt 0.078125 0.71875 -vt 0.078125 0.71875 -vt 0.078125 0.796875 -vt 0.03125 0.796875 -vt 0.03125 0.796875 -vt 0.078125 0.796875 -vt 0.125 0.796875 -vt 0.078125 0.796875 -vt 0.078125 0.796875 -vt 0.125 0.796875 -vn -2.220446049250313e-16 1 -2.220446049250313e-16 -vn 4.930380657631324e-32 -2.220446049250313e-16 -1 -vn 2.220446049250313e-16 -1 2.220446049250313e-16 -vn -4.930380657631324e-32 2.220446049250313e-16 1 -vn 1 2.220446049250313e-16 -4.930380657631324e-32 -vn -1 -2.220446049250313e-16 4.930380657631324e-32 -usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o tail -v 0 0.3125 1 -v 0 0.3125 0.25 -v 0 0 1 -v 0 0 0.25 -v 0 0.3125 0.25 -v 0 0.3125 1 -v 0 0 0.25 -v 0 0 1 -vt 0.21875 0.515625 -vt 0.21875 0.515625 -vt 0.21875 0.4375 -vt 0.21875 0.4375 -vt 0.03125 0.515625 -vt 0.21875 0.515625 -vt 0.21875 0.4375 -vt 0.03125 0.4375 -vt 0.40625 0.515625 -vt 0.40625 0.515625 -vt 0.40625 0.4375 -vt 0.40625 0.4375 -vt 0.21875 0.515625 -vt 0.40625 0.515625 -vt 0.40625 0.4375 -vt 0.21875 0.4375 -vt 0.21875 0.515625 -vt 0.21875 0.515625 -vt 0.21875 0.703125 -vt 0.21875 0.703125 -vt 0.21875 0.703125 -vt 0.21875 0.703125 -vt 0.21875 0.515625 -vt 0.21875 0.515625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o head -v 0.25 0.3125 -0.3125 -v 0.25 0.3125 -0.625 -v 0.25 0 -0.3125 -v 0.25 0 -0.625 -v -0.25 0.3125 -0.625 -v -0.25 0.3125 -0.3125 -v -0.25 0 -0.625 -v -0.25 0 -0.3125 -vt 0.078125 0.90625 -vt 0.203125 0.90625 -vt 0.203125 0.828125 -vt 0.078125 0.828125 -vt 0 0.90625 -vt 0.078125 0.90625 -vt 0.078125 0.828125 -vt 0 0.828125 -vt 0.28125 0.90625 -vt 0.40625 0.90625 -vt 0.40625 0.828125 -vt 0.28125 0.828125 -vt 0.203125 0.90625 -vt 0.28125 0.90625 -vt 0.28125 0.828125 -vt 0.203125 0.828125 -vt 0.203125 0.90625 -vt 0.078125 0.90625 -vt 0.078125 0.984375 -vt 0.203125 0.984375 -vt 0.328125 0.984375 -vt 0.203125 0.984375 -vt 0.203125 0.90625 -vt 0.328125 0.90625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o left_gills -v -0.25 0.4375 -0.375 -v -0.25 0.4375 -0.375 -v -0.25 0 -0.375 -v -0.25 0 -0.375 -v -0.4375 0.4375 -0.375 -v -0.4375 0.4375 -0.375 -v -0.4375 0 -0.375 -v -0.4375 0 -0.375 -vt 0.171875 0.375 -vt 0.21875 0.375 -vt 0.21875 0.265625 -vt 0.171875 0.265625 -vt 0.171875 0.375 -vt 0.171875 0.375 -vt 0.171875 0.265625 -vt 0.171875 0.265625 -vt 0.21875 0.375 -vt 0.265625 0.375 -vt 0.265625 0.265625 -vt 0.21875 0.265625 -vt 0.21875 0.375 -vt 0.21875 0.375 -vt 0.21875 0.265625 -vt 0.21875 0.265625 -vt 0.21875 0.375 -vt 0.171875 0.375 -vt 0.171875 0.375 -vt 0.21875 0.375 -vt 0.265625 0.375 -vt 0.21875 0.375 -vt 0.21875 0.375 -vt 0.265625 0.375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o right_gills -v 0.4375 0.4375 -0.375 -v 0.4375 0.4375 -0.375 -v 0.4375 0 -0.375 -v 0.4375 0 -0.375 -v 0.25 0.4375 -0.375 -v 0.25 0.4375 -0.375 -v 0.25 0 -0.375 -v 0.25 0 -0.375 -vt 0 0.375 -vt 0.046875 0.375 -vt 0.046875 0.265625 -vt 0 0.265625 -vt 0 0.375 -vt 0 0.375 -vt 0 0.265625 -vt 0 0.265625 -vt 0.046875 0.375 -vt 0.09375 0.375 -vt 0.09375 0.265625 -vt 0.046875 0.265625 -vt 0.046875 0.375 -vt 0.046875 0.375 -vt 0.046875 0.265625 -vt 0.046875 0.265625 -vt 0.046875 0.375 -vt 0 0.375 -vt 0 0.375 -vt 0.046875 0.375 -vt 0.09375 0.375 -vt 0.046875 0.375 -vt 0.046875 0.375 -vt 0.09375 0.375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o top_gills -v 0.25 0.5 -0.375 -v 0.25 0.5 -0.375 -v 0.25 0.3125 -0.375 -v 0.25 0.3125 -0.375 -v -0.25 0.5 -0.375 -v -0.25 0.5 -0.375 -v -0.25 0.3125 -0.375 -v -0.25 0.3125 -0.375 -vt 0.046875 0.421875 -vt 0.171875 0.421875 -vt 0.171875 0.375 -vt 0.046875 0.375 -vt 0.046875 0.421875 -vt 0.046875 0.421875 -vt 0.046875 0.375 -vt 0.046875 0.375 -vt 0.171875 0.421875 -vt 0.296875 0.421875 -vt 0.296875 0.375 -vt 0.171875 0.375 -vt 0.171875 0.421875 -vt 0.171875 0.421875 -vt 0.171875 0.375 -vt 0.171875 0.375 -vt 0.171875 0.421875 -vt 0.046875 0.421875 -vt 0.046875 0.421875 -vt 0.171875 0.421875 -vt 0.296875 0.421875 -vt 0.171875 0.421875 -vt 0.171875 0.421875 -vt 0.296875 0.421875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_eacaae49-c631-7fce-d186-9315d408fc43 -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/blaze.obj b/renderer/viewer/three/entity/models/blaze.obj deleted file mode 100644 index d4037c53..00000000 --- a/renderer/viewer/three/entity/models/blaze.obj +++ /dev/null @@ -1,601 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o upperBodyParts0 -v -0.5 1.625 -0.0625 -v -0.5 1.625 -0.1875 -v -0.5 1.125 -0.0625 -v -0.5 1.125 -0.1875 -v -0.625 1.625 -0.1875 -v -0.625 1.625 -0.0625 -v -0.625 1.125 -0.1875 -v -0.625 1.125 -0.0625 -vt 0.03125 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.1875 -vt 0.03125 0.1875 -vt 0 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.1875 -vt 0 0.1875 -vt 0.09375 0.4375 -vt 0.125 0.4375 -vt 0.125 0.1875 -vt 0.09375 0.1875 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vt 0.09375 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.5 -vt 0.0625 0.5 -vt 0.09375 0.5 -vt 0.0625 0.5 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o upperBodyParts1 -v 0.625 1.625 0.1875 -v 0.625 1.625 0.0625 -v 0.625 1.125 0.1875 -v 0.625 1.125 0.0625 -v 0.5 1.625 0.0625 -v 0.5 1.625 0.1875 -v 0.5 1.125 0.0625 -v 0.5 1.125 0.1875 -vt 0.03125 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.1875 -vt 0.03125 0.1875 -vt 0 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.1875 -vt 0 0.1875 -vt 0.09375 0.4375 -vt 0.125 0.4375 -vt 0.125 0.1875 -vt 0.09375 0.1875 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vt 0.09375 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.5 -vt 0.0625 0.5 -vt 0.09375 0.5 -vt 0.0625 0.5 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o upperBodyParts2 -v -0.0625 1.625 0.625 -v -0.0625 1.625 0.5 -v -0.0625 1.125 0.625 -v -0.0625 1.125 0.5 -v -0.1875 1.625 0.5 -v -0.1875 1.625 0.625 -v -0.1875 1.125 0.5 -v -0.1875 1.125 0.625 -vt 0.03125 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.1875 -vt 0.03125 0.1875 -vt 0 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.1875 -vt 0 0.1875 -vt 0.09375 0.4375 -vt 0.125 0.4375 -vt 0.125 0.1875 -vt 0.09375 0.1875 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vt 0.09375 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.5 -vt 0.0625 0.5 -vt 0.09375 0.5 -vt 0.0625 0.5 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o upperBodyParts3 -v 0.1875 1.625 -0.5 -v 0.1875 1.625 -0.625 -v 0.1875 1.125 -0.5 -v 0.1875 1.125 -0.625 -v 0.0625 1.625 -0.625 -v 0.0625 1.625 -0.5 -v 0.0625 1.125 -0.625 -v 0.0625 1.125 -0.5 -vt 0.03125 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.1875 -vt 0.03125 0.1875 -vt 0 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.1875 -vt 0 0.1875 -vt 0.09375 0.4375 -vt 0.125 0.4375 -vt 0.125 0.1875 -vt 0.09375 0.1875 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vt 0.09375 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.5 -vt 0.0625 0.5 -vt 0.09375 0.5 -vt 0.0625 0.5 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o upperBodyParts4 -v -0.3125 1.125 0.0625 -v -0.3125 1.125 -0.0625 -v -0.3125 0.625 0.0625 -v -0.3125 0.625 -0.0625 -v -0.4375 1.125 -0.0625 -v -0.4375 1.125 0.0625 -v -0.4375 0.625 -0.0625 -v -0.4375 0.625 0.0625 -vt 0.03125 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.1875 -vt 0.03125 0.1875 -vt 0 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.1875 -vt 0 0.1875 -vt 0.09375 0.4375 -vt 0.125 0.4375 -vt 0.125 0.1875 -vt 0.09375 0.1875 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vt 0.09375 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.5 -vt 0.0625 0.5 -vt 0.09375 0.5 -vt 0.0625 0.5 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o upperBodyParts5 -v 0.4375 1.125 0.0625 -v 0.4375 1.125 -0.0625 -v 0.4375 0.625 0.0625 -v 0.4375 0.625 -0.0625 -v 0.3125 1.125 -0.0625 -v 0.3125 1.125 0.0625 -v 0.3125 0.625 -0.0625 -v 0.3125 0.625 0.0625 -vt 0.03125 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.1875 -vt 0.03125 0.1875 -vt 0 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.1875 -vt 0 0.1875 -vt 0.09375 0.4375 -vt 0.125 0.4375 -vt 0.125 0.1875 -vt 0.09375 0.1875 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vt 0.09375 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.5 -vt 0.0625 0.5 -vt 0.09375 0.5 -vt 0.0625 0.5 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o upperBodyParts6 -v 0.0625 1.125 0.4375 -v 0.0625 1.125 0.3125 -v 0.0625 0.625 0.4375 -v 0.0625 0.625 0.3125 -v -0.0625 1.125 0.3125 -v -0.0625 1.125 0.4375 -v -0.0625 0.625 0.3125 -v -0.0625 0.625 0.4375 -vt 0.03125 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.1875 -vt 0.03125 0.1875 -vt 0 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.1875 -vt 0 0.1875 -vt 0.09375 0.4375 -vt 0.125 0.4375 -vt 0.125 0.1875 -vt 0.09375 0.1875 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vt 0.09375 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.5 -vt 0.0625 0.5 -vt 0.09375 0.5 -vt 0.0625 0.5 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o upperBodyParts7 -v 0.0625 1.125 -0.3125 -v 0.0625 1.125 -0.4375 -v 0.0625 0.625 -0.3125 -v 0.0625 0.625 -0.4375 -v -0.0625 1.125 -0.4375 -v -0.0625 1.125 -0.3125 -v -0.0625 0.625 -0.4375 -v -0.0625 0.625 -0.3125 -vt 0.03125 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.1875 -vt 0.03125 0.1875 -vt 0 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.1875 -vt 0 0.1875 -vt 0.09375 0.4375 -vt 0.125 0.4375 -vt 0.125 0.1875 -vt 0.09375 0.1875 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vt 0.09375 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.5 -vt 0.0625 0.5 -vt 0.09375 0.5 -vt 0.0625 0.5 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o upperBodyParts8 -v -0.1875 0.5 0.25 -v -0.1875 0.5 0.125 -v -0.1875 0 0.25 -v -0.1875 0 0.125 -v -0.3125 0.5 0.125 -v -0.3125 0.5 0.25 -v -0.3125 0 0.125 -v -0.3125 0 0.25 -vt 0.03125 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.1875 -vt 0.03125 0.1875 -vt 0 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.1875 -vt 0 0.1875 -vt 0.09375 0.4375 -vt 0.125 0.4375 -vt 0.125 0.1875 -vt 0.09375 0.1875 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vt 0.09375 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.5 -vt 0.0625 0.5 -vt 0.09375 0.5 -vt 0.0625 0.5 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o upperBodyParts9 -v 0.3125 0.5 -0.125 -v 0.3125 0.5 -0.25 -v 0.3125 0 -0.125 -v 0.3125 0 -0.25 -v 0.1875 0.5 -0.25 -v 0.1875 0.5 -0.125 -v 0.1875 0 -0.25 -v 0.1875 0 -0.125 -vt 0.03125 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.1875 -vt 0.03125 0.1875 -vt 0 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.1875 -vt 0 0.1875 -vt 0.09375 0.4375 -vt 0.125 0.4375 -vt 0.125 0.1875 -vt 0.09375 0.1875 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vt 0.09375 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.5 -vt 0.0625 0.5 -vt 0.09375 0.5 -vt 0.0625 0.5 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o upperBodyParts10 -v 0.25 0.5 0.3125 -v 0.25 0.5 0.1875 -v 0.25 0 0.3125 -v 0.25 0 0.1875 -v 0.125 0.5 0.1875 -v 0.125 0.5 0.3125 -v 0.125 0 0.1875 -v 0.125 0 0.3125 -vt 0.03125 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.1875 -vt 0.03125 0.1875 -vt 0 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.1875 -vt 0 0.1875 -vt 0.09375 0.4375 -vt 0.125 0.4375 -vt 0.125 0.1875 -vt 0.09375 0.1875 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vt 0.09375 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.5 -vt 0.0625 0.5 -vt 0.09375 0.5 -vt 0.0625 0.5 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 -o upperBodyParts11 -v -0.125 0.5 -0.1875 -v -0.125 0.5 -0.3125 -v -0.125 0 -0.1875 -v -0.125 0 -0.3125 -v -0.25 0.5 -0.3125 -v -0.25 0.5 -0.1875 -v -0.25 0 -0.3125 -v -0.25 0 -0.1875 -vt 0.03125 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.1875 -vt 0.03125 0.1875 -vt 0 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.1875 -vt 0 0.1875 -vt 0.09375 0.4375 -vt 0.125 0.4375 -vt 0.125 0.1875 -vt 0.09375 0.1875 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vt 0.09375 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.5 -vt 0.0625 0.5 -vt 0.09375 0.5 -vt 0.0625 0.5 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f -f 92/268/67 95/267/67 93/266/67 90/265/67 -f 91/272/68 92/271/68 90/270/68 89/269/68 -f 96/276/69 91/275/69 89/274/69 94/273/69 -f 95/280/70 96/279/70 94/278/70 93/277/70 -f 94/284/71 89/283/71 90/282/71 93/281/71 -f 95/288/72 92/287/72 91/286/72 96/285/72 -o Head -v 0.25 1.75 0.25 -v 0.25 1.75 -0.25 -v 0.25 1.25 0.25 -v 0.25 1.25 -0.25 -v -0.25 1.75 -0.25 -v -0.25 1.75 0.25 -v -0.25 1.25 -0.25 -v -0.25 1.25 0.25 -vt 0.125 0.75 -vt 0.25 0.75 -vt 0.25 0.5 -vt 0.125 0.5 -vt 0 0.75 -vt 0.125 0.75 -vt 0.125 0.5 -vt 0 0.5 -vt 0.375 0.75 -vt 0.5 0.75 -vt 0.5 0.5 -vt 0.375 0.5 -vt 0.25 0.75 -vt 0.375 0.75 -vt 0.375 0.5 -vt 0.25 0.5 -vt 0.25 0.75 -vt 0.125 0.75 -vt 0.125 1 -vt 0.25 1 -vt 0.375 1 -vt 0.25 1 -vt 0.25 0.75 -vt 0.375 0.75 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e49346a5-14a5-1082-ba30-5d05bc57359f -f 100/292/73 103/291/73 101/290/73 98/289/73 -f 99/296/74 100/295/74 98/294/74 97/293/74 -f 104/300/75 99/299/75 97/298/75 102/297/75 -f 103/304/76 104/303/76 102/302/76 101/301/76 -f 102/308/77 97/307/77 98/306/77 101/305/77 -f 103/312/78 100/311/78 99/310/78 104/309/78 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/boat.obj b/renderer/viewer/three/entity/models/boat.obj deleted file mode 100644 index 72b2ca2a..00000000 --- a/renderer/viewer/three/entity/models/boat.obj +++ /dev/null @@ -1,417 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o bottom -v 0.875 1.3125000000000002 -0.5 -v 0.875 1.1250000000000002 -0.5 -v 0.875 1.3125 0.5 -v 0.875 1.125 0.5 -v -0.875 1.1250000000000002 -0.5 -v -0.875 1.3125000000000002 -0.5 -v -0.875 1.125 0.5 -v -0.875 1.3125 0.5 -vt 0.2421875 0.953125 -vt 0.0234375 0.953125 -vt 0.0234375 0.703125 -vt 0.2421875 0.703125 -vt 0.265625 0.953125 -vt 0.2421875 0.953125 -vt 0.2421875 0.703125 -vt 0.265625 0.703125 -vt 0.484375 0.953125 -vt 0.265625 0.953125 -vt 0.265625 0.703125 -vt 0.484375 0.703125 -vt 0.0234375 0.953125 -vt 0 0.953125 -vt 0 0.703125 -vt 0.0234375 0.703125 -vt 0.0234375 0.953125 -vt 0.2421875 0.953125 -vt 0.2421875 1 -vt 0.0234375 1 -vt 0.2421875 1 -vt 0.4609375 1 -vt 0.4609375 0.953125 -vt 0.2421875 0.953125 -vn 0 -1 -2.220446049250313e-16 -vn 1 0 0 -vn 0 1 2.220446049250313e-16 -vn -1 0 0 -vn 0 2.220446049250313e-16 -1 -vn 0 -2.220446049250313e-16 1 -usemtl m_e12ce080-c1e9-6394-d577-2c59cc23ff2d -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o front -v -0.9999999999999999 1.6875 0.5 -v -0.8749999999999999 1.6875 0.5 -v -0.9999999999999999 1.3125 0.5 -v -0.8749999999999999 1.3125 0.5 -v -0.8750000000000001 1.6875 -0.5 -v -1 1.6875 -0.5 -v -0.8750000000000001 1.3125 -0.5 -v -1 1.3125 -0.5 -vt 0.140625 0.546875 -vt 0.015625 0.546875 -vt 0.015625 0.453125 -vt 0.140625 0.453125 -vt 0.15625 0.546875 -vt 0.140625 0.546875 -vt 0.140625 0.453125 -vt 0.15625 0.453125 -vt 0.28125 0.546875 -vt 0.15625 0.546875 -vt 0.15625 0.453125 -vt 0.28125 0.453125 -vt 0.015625 0.546875 -vt 0 0.546875 -vt 0 0.453125 -vt 0.015625 0.453125 -vt 0.015625 0.546875 -vt 0.140625 0.546875 -vt 0.140625 0.578125 -vt 0.015625 0.578125 -vt 0.140625 0.578125 -vt 0.265625 0.578125 -vt 0.265625 0.546875 -vt 0.140625 0.546875 -vn 1 0 -2.220446049250313e-16 -vn 2.220446049250313e-16 0 1 -vn -1 0 2.220446049250313e-16 -vn -2.220446049250313e-16 0 -1 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e12ce080-c1e9-6394-d577-2c59cc23ff2d -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o back -v 1 1.6875 -0.5625 -v 0.875 1.6875 -0.5625 -v 1 1.3125 -0.5625 -v 0.875 1.3125 -0.5625 -v 0.875 1.6875 0.5625 -v 1 1.6875 0.5625 -v 0.875 1.3125 0.5625 -v 1 1.3125 0.5625 -vt 0.15625 0.671875 -vt 0.015625 0.671875 -vt 0.015625 0.578125 -vt 0.15625 0.578125 -vt 0.171875 0.671875 -vt 0.15625 0.671875 -vt 0.15625 0.578125 -vt 0.171875 0.578125 -vt 0.3125 0.671875 -vt 0.171875 0.671875 -vt 0.171875 0.578125 -vt 0.3125 0.578125 -vt 0.015625 0.671875 -vt 0 0.671875 -vt 0 0.578125 -vt 0.015625 0.578125 -vt 0.015625 0.671875 -vt 0.15625 0.671875 -vt 0.15625 0.703125 -vt 0.015625 0.703125 -vt 0.15625 0.703125 -vt 0.296875 0.703125 -vt 0.296875 0.671875 -vt 0.15625 0.671875 -vn -1 0 -2.220446049250313e-16 -vn 2.220446049250313e-16 0 -1 -vn 1 0 2.220446049250313e-16 -vn -2.220446049250313e-16 0 1 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e12ce080-c1e9-6394-d577-2c59cc23ff2d -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o right -v -0.875 1.6875 -0.6250000000000001 -v -0.875 1.6875 -0.5000000000000001 -v -0.875 1.3125 -0.6250000000000001 -v -0.875 1.3125 -0.5000000000000001 -v 0.875 1.6875 -0.4999999999999999 -v 0.875 1.6875 -0.6249999999999999 -v 0.875 1.3125 -0.4999999999999999 -v 0.875 1.3125 -0.6249999999999999 -vt 0.234375 0.421875 -vt 0.015625 0.421875 -vt 0.015625 0.328125 -vt 0.234375 0.328125 -vt 0.25 0.421875 -vt 0.234375 0.421875 -vt 0.234375 0.328125 -vt 0.25 0.328125 -vt 0.46875 0.421875 -vt 0.25 0.421875 -vt 0.25 0.328125 -vt 0.46875 0.328125 -vt 0.015625 0.421875 -vt 0 0.421875 -vt 0 0.328125 -vt 0.015625 0.328125 -vt 0.015625 0.421875 -vt 0.234375 0.421875 -vt 0.234375 0.453125 -vt 0.015625 0.453125 -vt 0.234375 0.453125 -vt 0.453125 0.453125 -vt 0.453125 0.421875 -vt 0.234375 0.421875 -vn -1.2246467991473532e-16 0 1 -vn -1 0 -1.2246467991473532e-16 -vn 1.2246467991473532e-16 0 -1 -vn 1 0 1.2246467991473532e-16 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e12ce080-c1e9-6394-d577-2c59cc23ff2d -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o left -v 0.875 1.6875 0.625 -v 0.875 1.6875 0.5 -v 0.875 1.3125 0.625 -v 0.875 1.3125 0.5 -v -0.875 1.6875 0.5 -v -0.875 1.6875 0.625 -v -0.875 1.3125 0.5 -v -0.875 1.3125 0.625 -vt 0.234375 0.296875 -vt 0.015625 0.296875 -vt 0.015625 0.203125 -vt 0.234375 0.203125 -vt 0.25 0.296875 -vt 0.234375 0.296875 -vt 0.234375 0.203125 -vt 0.25 0.203125 -vt 0.46875 0.296875 -vt 0.25 0.296875 -vt 0.25 0.203125 -vt 0.46875 0.203125 -vt 0.015625 0.296875 -vt 0 0.296875 -vt 0 0.203125 -vt 0.015625 0.203125 -vt 0.015625 0.296875 -vt 0.234375 0.296875 -vt 0.234375 0.328125 -vt 0.015625 0.328125 -vt 0.234375 0.328125 -vt 0.453125 0.328125 -vt 0.453125 0.296875 -vt 0.234375 0.296875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e12ce080-c1e9-6394-d577-2c59cc23ff2d -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o paddle_left -v 0.21875 1.4135015877365276 1.2703323467065926 -v 0.21875 1.9760015877365271 0.29605376744909906 -v 0.21875 1.3052484122634724 1.2078323467065926 -v 0.21875 1.8677484122634724 0.23355376744909906 -v 0.09375 1.9760015877365271 0.29605376744909906 -v 0.09375 1.4135015877365276 1.2703323467065926 -v 0.09375 1.8677484122634724 0.23355376744909906 -v 0.09375 1.3052484122634724 1.2078323467065926 -vt 0.640625 0.71875 -vt 0.625 0.71875 -vt 0.625 0.6875 -vt 0.640625 0.6875 -vt 0.78125 0.71875 -vt 0.640625 0.71875 -vt 0.640625 0.6875 -vt 0.78125 0.6875 -vt 0.796875 0.71875 -vt 0.78125 0.71875 -vt 0.78125 0.6875 -vt 0.796875 0.6875 -vt 0.625 0.71875 -vt 0.484375 0.71875 -vt 0.484375 0.6875 -vt 0.625 0.6875 -vt 0.625 0.71875 -vt 0.640625 0.71875 -vt 0.640625 1 -vt 0.625 1 -vt 0.640625 1 -vt 0.65625 1 -vt 0.65625 0.71875 -vt 0.640625 0.71875 -vn 0 0.49999999999999994 -0.8660254037844387 -vn 1 0 0 -vn 0 -0.49999999999999994 0.8660254037844387 -vn -1 0 0 -vn 0 0.8660254037844387 0.49999999999999994 -vn 0 -0.8660254037844387 -0.49999999999999994 -usemtl m_e12ce080-c1e9-6394-d577-2c59cc23ff2d -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o paddle_left -v 0.156875 1.4821313509461098 1.5264621099161748 -v 0.156875 1.7008813509461098 1.147575995760483 -v 0.156875 1.1573718245269453 1.3389621099161748 -v 0.156875 1.3761218245269453 0.960075995760483 -v 0.09437499999999999 1.7008813509461098 1.147575995760483 -v 0.09437499999999999 1.4821313509461098 1.5264621099161748 -v 0.09437499999999999 1.3761218245269453 0.960075995760483 -v 0.09437499999999999 1.1573718245269453 1.3389621099161748 -vt 0.546875 0.890625 -vt 0.5390625 0.890625 -vt 0.5390625 0.796875 -vt 0.546875 0.796875 -vt 0.6015625 0.890625 -vt 0.546875 0.890625 -vt 0.546875 0.796875 -vt 0.6015625 0.796875 -vt 0.609375 0.890625 -vt 0.6015625 0.890625 -vt 0.6015625 0.796875 -vt 0.609375 0.796875 -vt 0.5390625 0.890625 -vt 0.484375 0.890625 -vt 0.484375 0.796875 -vt 0.5390625 0.796875 -vt 0.5390625 0.890625 -vt 0.546875 0.890625 -vt 0.546875 1 -vt 0.5390625 1 -vt 0.546875 1 -vt 0.5546875 1 -vt 0.5546875 0.890625 -vt 0.546875 0.890625 -vn 0 0.49999999999999994 -0.8660254037844387 -vn 1 0 0 -vn 0 -0.49999999999999994 0.8660254037844387 -vn -1 0 0 -vn 0 0.8660254037844387 0.49999999999999994 -vn 0 -0.8660254037844387 -0.49999999999999994 -usemtl m_e12ce080-c1e9-6394-d577-2c59cc23ff2d -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o paddle_right -v 0.09374999999999989 1.4135015877365273 -1.2703323467065928 -v 0.09375 1.9760015877365271 -0.29605376744909917 -v 0.09374999999999989 1.3052484122634724 -1.2078323467065928 -v 0.09375 1.8677484122634724 -0.23355376744909917 -v 0.21875 1.9760015877365271 -0.29605376744909917 -v 0.2187499999999999 1.4135015877365273 -1.2703323467065928 -v 0.21875 1.8677484122634724 -0.23355376744909917 -v 0.21875 1.3052484122634724 -1.2078323467065928 -vt 0.640625 0.40625 -vt 0.625 0.40625 -vt 0.625 0.375 -vt 0.640625 0.375 -vt 0.78125 0.40625 -vt 0.640625 0.40625 -vt 0.640625 0.375 -vt 0.78125 0.375 -vt 0.796875 0.40625 -vt 0.78125 0.40625 -vt 0.78125 0.375 -vt 0.796875 0.375 -vt 0.625 0.40625 -vt 0.484375 0.40625 -vt 0.484375 0.375 -vt 0.625 0.375 -vt 0.625 0.40625 -vt 0.640625 0.40625 -vt 0.640625 0.6875 -vt 0.625 0.6875 -vt 0.640625 0.6875 -vt 0.65625 0.6875 -vt 0.65625 0.40625 -vt 0.640625 0.40625 -vn 1.0605752387249069e-16 0.49999999999999994 0.8660254037844387 -vn -1 -1.848892746611746e-32 1.224646799147353e-16 -vn -1.0605752387249069e-16 -0.49999999999999994 -0.8660254037844387 -vn 1 1.848892746611746e-32 -1.224646799147353e-16 -vn -6.123233995736765e-17 0.8660254037844388 -0.49999999999999994 -vn 6.123233995736765e-17 -0.8660254037844388 0.49999999999999994 -usemtl m_e12ce080-c1e9-6394-d577-2c59cc23ff2d -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o paddle_right -v 0.09437499999999988 1.4821313509461096 -1.526462109916175 -v 0.09437499999999988 1.7008813509461094 -1.1475759957604832 -v 0.09437499999999988 1.157371824526945 -1.338962109916175 -v 0.09437499999999988 1.376121824526945 -0.9600759957604832 -v 0.15687499999999988 1.7008813509461094 -1.1475759957604832 -v 0.15687499999999988 1.4821313509461096 -1.526462109916175 -v 0.15687499999999988 1.376121824526945 -0.9600759957604832 -v 0.15687499999999988 1.157371824526945 -1.338962109916175 -vt 0.546875 0.578125 -vt 0.5390625 0.578125 -vt 0.5390625 0.484375 -vt 0.546875 0.484375 -vt 0.6015625 0.578125 -vt 0.546875 0.578125 -vt 0.546875 0.484375 -vt 0.6015625 0.484375 -vt 0.609375 0.578125 -vt 0.6015625 0.578125 -vt 0.6015625 0.484375 -vt 0.609375 0.484375 -vt 0.5390625 0.578125 -vt 0.484375 0.578125 -vt 0.484375 0.484375 -vt 0.5390625 0.484375 -vt 0.5390625 0.578125 -vt 0.546875 0.578125 -vt 0.546875 0.6875 -vt 0.5390625 0.6875 -vt 0.546875 0.6875 -vt 0.5546875 0.6875 -vt 0.5546875 0.578125 -vt 0.546875 0.578125 -vn 1.0605752387249069e-16 0.49999999999999994 0.8660254037844387 -vn -1 -1.848892746611746e-32 1.224646799147353e-16 -vn -1.0605752387249069e-16 -0.49999999999999994 -0.8660254037844387 -vn 1 1.848892746611746e-32 -1.224646799147353e-16 -vn -6.123233995736765e-17 0.8660254037844388 -0.49999999999999994 -vn 6.123233995736765e-17 -0.8660254037844388 0.49999999999999994 -usemtl m_e12ce080-c1e9-6394-d577-2c59cc23ff2d -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/camel.obj b/renderer/viewer/three/entity/models/camel.obj deleted file mode 100644 index 8c8f050a..00000000 --- a/renderer/viewer/three/entity/models/camel.obj +++ /dev/null @@ -1,1061 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o body -v 0.46875 2 0.8125 -v 0.46875 2 -0.875 -v 0.46875 1.25 0.8125 -v 0.46875 1.25 -0.875 -v -0.46875 2 -0.875 -v -0.46875 2 0.8125 -v -0.46875 1.25 -0.875 -v -0.46875 1.25 0.8125 -vt 0.2109375 0.59375 -vt 0.328125 0.59375 -vt 0.328125 0.5 -vt 0.2109375 0.5 -vt 0 0.59375 -vt 0.2109375 0.59375 -vt 0.2109375 0.5 -vt 0 0.5 -vt 0.5390625 0.59375 -vt 0.65625 0.59375 -vt 0.65625 0.5 -vt 0.5390625 0.5 -vt 0.328125 0.59375 -vt 0.5390625 0.59375 -vt 0.5390625 0.5 -vt 0.328125 0.5 -vt 0.328125 0.59375 -vt 0.2109375 0.59375 -vt 0.2109375 0.8046875 -vt 0.328125 0.8046875 -vt 0.4453125 0.8046875 -vt 0.328125 0.8046875 -vt 0.328125 0.59375 -vt 0.4453125 0.59375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o saddle layer -v 0.2875 2.31875 0.31875 -v 0.2875 2.31875 -0.38125 -v 0.2875 1.99375 0.31875 -v 0.2875 1.99375 -0.38125 -v -0.2875 2.31875 -0.38125 -v -0.2875 2.31875 0.31875 -v -0.2875 1.99375 -0.38125 -v -0.2875 1.99375 0.31875 -vt 0.6640625 0.4140625 -vt 0.734375 0.4140625 -vt 0.734375 0.375 -vt 0.6640625 0.375 -vt 0.578125 0.4140625 -vt 0.6640625 0.4140625 -vt 0.6640625 0.375 -vt 0.578125 0.375 -vt 0.8203125 0.4140625 -vt 0.890625 0.4140625 -vt 0.890625 0.375 -vt 0.8203125 0.375 -vt 0.734375 0.4140625 -vt 0.8203125 0.4140625 -vt 0.8203125 0.375 -vt 0.734375 0.375 -vt 0.734375 0.4140625 -vt 0.6640625 0.4140625 -vt 0.6640625 0.5 -vt 0.734375 0.5 -vt 0.8046875 0.5 -vt 0.734375 0.5 -vt 0.734375 0.4140625 -vt 0.8046875 0.4140625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o saddle layer -v 0.22499999999999998 2.50625 0.31875 -v 0.22499999999999998 2.50625 -0.38125 -v 0.22499999999999998 2.30625 0.31875 -v 0.22499999999999998 2.30625 -0.38125 -v -0.22499999999999998 2.50625 -0.38125 -v -0.22499999999999998 2.50625 0.31875 -v -0.22499999999999998 2.30625 -0.38125 -v -0.22499999999999998 2.30625 0.31875 -vt 0.8046875 0.0234375 -vt 0.859375 0.0234375 -vt 0.859375 0 -vt 0.8046875 0 -vt 0.71875 0.0234375 -vt 0.8046875 0.0234375 -vt 0.8046875 0 -vt 0.71875 0 -vt 0.9453125 0.0234375 -vt 1 0.0234375 -vt 1 0 -vt 0.9453125 0 -vt 0.859375 0.0234375 -vt 0.9453125 0.0234375 -vt 0.9453125 0 -vt 0.859375 0 -vt 0.859375 0.0234375 -vt 0.8046875 0.0234375 -vt 0.8046875 0.109375 -vt 0.859375 0.109375 -vt 0.9140625 0.109375 -vt 0.859375 0.109375 -vt 0.859375 0.0234375 -vt 0.9140625 0.0234375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o saddle layer -v 0.475 2.00625 0.8187500000000001 -v 0.475 2.00625 -0.88125 -v 0.475 1.24375 0.8187500000000001 -v 0.475 1.24375 -0.88125 -v -0.475 2.00625 -0.88125 -v -0.475 2.00625 0.8187500000000001 -v -0.475 1.24375 -0.88125 -v -0.475 1.24375 0.8187500000000001 -vt 0.2109375 0.09375 -vt 0.328125 0.09375 -vt 0.328125 0 -vt 0.2109375 0 -vt 0 0.09375 -vt 0.2109375 0.09375 -vt 0.2109375 0 -vt 0 0 -vt 0.5390625 0.09375 -vt 0.65625 0.09375 -vt 0.65625 0 -vt 0.5390625 0 -vt 0.328125 0.09375 -vt 0.5390625 0.09375 -vt 0.5390625 0 -vt 0.328125 0 -vt 0.328125 0.09375 -vt 0.2109375 0.09375 -vt 0.2109375 0.3046875 -vt 0.328125 0.3046875 -vt 0.4453125 0.3046875 -vt 0.328125 0.3046875 -vt 0.328125 0.09375 -vt 0.4453125 0.09375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o tail -v -0.09375 1.8125 0.8125 -v -0.09375 1.8125 0.8125 -v -0.09375 0.9375 0.8125 -v -0.09375 0.9375 0.8125 -v 0.09375 1.8125 0.8125 -v 0.09375 1.8125 0.8125 -v 0.09375 0.9375 0.8125 -v 0.09375 0.9375 0.8125 -vt 0.953125 1 -vt 0.9765625 1 -vt 0.9765625 0.890625 -vt 0.953125 0.890625 -vt 0.953125 1 -vt 0.953125 1 -vt 0.953125 0.890625 -vt 0.953125 0.890625 -vt 0.9765625 1 -vt 1 1 -vt 1 0.890625 -vt 0.9765625 0.890625 -vt 0.9765625 1 -vt 0.9765625 1 -vt 0.9765625 0.890625 -vt 0.9765625 0.890625 -vt 0.9765625 1 -vt 0.953125 1 -vt 0.953125 1 -vt 0.9765625 1 -vt 1 1 -vt 0.9765625 1 -vt 0.9765625 1 -vt 1 1 -vn 1.2246467991473532e-16 0 1 -vn -1 0 1.2246467991473532e-16 -vn -1.2246467991473532e-16 0 -1 -vn 1 0 -1.2246467991473532e-16 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o head -v 0.21875 1.875 -0.375 -v 0.21875 1.875 -1.5625 -v 0.21875 1.375 -0.375 -v 0.21875 1.375 -1.5625 -v -0.21875 1.875 -1.5625 -v -0.21875 1.875 -0.375 -v -0.21875 1.375 -1.5625 -v -0.21875 1.375 -0.375 -vt 0.6171875 0.6640625 -vt 0.671875 0.6640625 -vt 0.671875 0.6015625 -vt 0.6171875 0.6015625 -vt 0.46875 0.6640625 -vt 0.6171875 0.6640625 -vt 0.6171875 0.6015625 -vt 0.46875 0.6015625 -vt 0.8203125 0.6640625 -vt 0.875 0.6640625 -vt 0.875 0.6015625 -vt 0.8203125 0.6015625 -vt 0.671875 0.6640625 -vt 0.8203125 0.6640625 -vt 0.8203125 0.6015625 -vt 0.671875 0.6015625 -vt 0.671875 0.6640625 -vt 0.6171875 0.6640625 -vt 0.6171875 0.8125 -vt 0.671875 0.8125 -vt 0.7265625 0.8125 -vt 0.671875 0.8125 -vt 0.671875 0.6640625 -vt 0.7265625 0.6640625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o head -v 0.21875 2.75 -1.125 -v 0.21875 2.75 -1.5625 -v 0.21875 1.875 -1.125 -v 0.21875 1.875 -1.5625 -v -0.21875 2.75 -1.5625 -v -0.21875 2.75 -1.125 -v -0.21875 1.875 -1.5625 -v -0.21875 1.875 -1.125 -vt 0.21875 0.9453125 -vt 0.2734375 0.9453125 -vt 0.2734375 0.8359375 -vt 0.21875 0.8359375 -vt 0.1640625 0.9453125 -vt 0.21875 0.9453125 -vt 0.21875 0.8359375 -vt 0.1640625 0.8359375 -vt 0.328125 0.9453125 -vt 0.3828125 0.9453125 -vt 0.3828125 0.8359375 -vt 0.328125 0.8359375 -vt 0.2734375 0.9453125 -vt 0.328125 0.9453125 -vt 0.328125 0.8359375 -vt 0.2734375 0.8359375 -vt 0.2734375 0.9453125 -vt 0.21875 0.9453125 -vt 0.21875 1 -vt 0.2734375 1 -vt 0.328125 1 -vt 0.2734375 1 -vt 0.2734375 0.9453125 -vt 0.328125 0.9453125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o head -v 0.15625 2.75 -1.5625 -v 0.15625 2.75 -1.9375 -v 0.15625 2.4375 -1.5625 -v 0.15625 2.4375 -1.9375 -v -0.15625 2.75 -1.9375 -v -0.15625 2.75 -1.5625 -v -0.15625 2.4375 -1.9375 -v -0.15625 2.4375 -1.5625 -vt 0.4375 0.953125 -vt 0.4765625 0.953125 -vt 0.4765625 0.9140625 -vt 0.4375 0.9140625 -vt 0.390625 0.953125 -vt 0.4375 0.953125 -vt 0.4375 0.9140625 -vt 0.390625 0.9140625 -vt 0.5234375 0.953125 -vt 0.5625 0.953125 -vt 0.5625 0.9140625 -vt 0.5234375 0.9140625 -vt 0.4765625 0.953125 -vt 0.5234375 0.953125 -vt 0.5234375 0.9140625 -vt 0.4765625 0.9140625 -vt 0.4765625 0.953125 -vt 0.4375 0.953125 -vt 0.4375 1 -vt 0.4765625 1 -vt 0.515625 1 -vt 0.4765625 1 -vt 0.4765625 0.953125 -vt 0.515625 0.953125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o bridle layer -v 0.22499999999999998 1.88125 -0.36875 -v 0.22499999999999998 1.88125 -1.56875 -v 0.22499999999999998 1.36875 -0.36875 -v 0.22499999999999998 1.36875 -1.56875 -v -0.22499999999999998 1.88125 -1.56875 -v -0.22499999999999998 1.88125 -0.36875 -v -0.22499999999999998 1.36875 -1.56875 -v -0.22499999999999998 1.36875 -0.36875 -vt 0.6171875 0.171875 -vt 0.671875 0.171875 -vt 0.671875 0.109375 -vt 0.6171875 0.109375 -vt 0.46875 0.171875 -vt 0.6171875 0.171875 -vt 0.6171875 0.109375 -vt 0.46875 0.109375 -vt 0.8203125 0.171875 -vt 0.875 0.171875 -vt 0.875 0.109375 -vt 0.8203125 0.109375 -vt 0.671875 0.171875 -vt 0.8203125 0.171875 -vt 0.8203125 0.109375 -vt 0.671875 0.109375 -vt 0.671875 0.171875 -vt 0.6171875 0.171875 -vt 0.6171875 0.3203125 -vt 0.671875 0.3203125 -vt 0.7265625 0.3203125 -vt 0.671875 0.3203125 -vt 0.671875 0.171875 -vt 0.7265625 0.171875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o bridle layer -v 0.22499999999999998 2.75625 -1.11875 -v 0.22499999999999998 2.75625 -1.56875 -v 0.22499999999999998 1.86875 -1.11875 -v 0.22499999999999998 1.86875 -1.56875 -v -0.22499999999999998 2.75625 -1.56875 -v -0.22499999999999998 2.75625 -1.11875 -v -0.22499999999999998 1.86875 -1.56875 -v -0.22499999999999998 1.86875 -1.11875 -vt 0.21875 0.4453125 -vt 0.2734375 0.4453125 -vt 0.2734375 0.3359375 -vt 0.21875 0.3359375 -vt 0.1640625 0.4453125 -vt 0.21875 0.4453125 -vt 0.21875 0.3359375 -vt 0.1640625 0.3359375 -vt 0.328125 0.4453125 -vt 0.3828125 0.4453125 -vt 0.3828125 0.3359375 -vt 0.328125 0.3359375 -vt 0.2734375 0.4453125 -vt 0.328125 0.4453125 -vt 0.328125 0.3359375 -vt 0.2734375 0.3359375 -vt 0.2734375 0.4453125 -vt 0.21875 0.4453125 -vt 0.21875 0.5 -vt 0.2734375 0.5 -vt 0.328125 0.5 -vt 0.2734375 0.5 -vt 0.2734375 0.4453125 -vt 0.328125 0.4453125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o bridle layer -v 0.16249999999999998 2.75625 -1.5625 -v 0.16249999999999998 2.75625 -1.9500000000000002 -v 0.16249999999999998 2.43125 -1.5625 -v 0.16249999999999998 2.43125 -1.9500000000000002 -v -0.16249999999999998 2.75625 -1.9500000000000002 -v -0.16249999999999998 2.75625 -1.5625 -v -0.16249999999999998 2.43125 -1.9500000000000002 -v -0.16249999999999998 2.43125 -1.5625 -vt 0.4375 0.453125 -vt 0.4765625 0.453125 -vt 0.4765625 0.4140625 -vt 0.4375 0.4140625 -vt 0.390625 0.453125 -vt 0.4375 0.453125 -vt 0.4375 0.4140625 -vt 0.390625 0.4140625 -vt 0.5234375 0.453125 -vt 0.5625 0.453125 -vt 0.5625 0.4140625 -vt 0.5234375 0.4140625 -vt 0.4765625 0.453125 -vt 0.5234375 0.453125 -vt 0.5234375 0.4140625 -vt 0.4765625 0.4140625 -vt 0.4765625 0.453125 -vt 0.4375 0.453125 -vt 0.4375 0.5 -vt 0.4765625 0.5 -vt 0.515625 0.5 -vt 0.4765625 0.5 -vt 0.4765625 0.453125 -vt 0.515625 0.453125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 -o bridle -v -0.15625 2.625 -1.625 -v -0.15625 2.625 -1.75 -v -0.15625 2.5 -1.625 -v -0.15625 2.5 -1.75 -v -0.21875 2.625 -1.75 -v -0.21875 2.625 -1.625 -v -0.21875 2.5 -1.75 -v -0.21875 2.5 -1.625 -vt 0.59375 0.4375 -vt 0.6015625 0.4375 -vt 0.6015625 0.421875 -vt 0.59375 0.421875 -vt 0.578125 0.4375 -vt 0.59375 0.4375 -vt 0.59375 0.421875 -vt 0.578125 0.421875 -vt 0.6171875 0.4375 -vt 0.625 0.4375 -vt 0.625 0.421875 -vt 0.6171875 0.421875 -vt 0.6015625 0.4375 -vt 0.6171875 0.4375 -vt 0.6171875 0.421875 -vt 0.6015625 0.421875 -vt 0.6015625 0.4375 -vt 0.59375 0.4375 -vt 0.59375 0.453125 -vt 0.6015625 0.453125 -vt 0.609375 0.453125 -vt 0.6015625 0.453125 -vt 0.6015625 0.4375 -vt 0.609375 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 92/268/67 95/267/67 93/266/67 90/265/67 -f 91/272/68 92/271/68 90/270/68 89/269/68 -f 96/276/69 91/275/69 89/274/69 94/273/69 -f 95/280/70 96/279/70 94/278/70 93/277/70 -f 94/284/71 89/283/71 90/282/71 93/281/71 -f 95/288/72 92/287/72 91/286/72 96/285/72 -o bridle -v 0.21875 2.625 -1.625 -v 0.21875 2.625 -1.75 -v 0.21875 2.5 -1.625 -v 0.21875 2.5 -1.75 -v 0.15625 2.625 -1.75 -v 0.15625 2.625 -1.625 -v 0.15625 2.5 -1.75 -v 0.15625 2.5 -1.625 -vt 0.6015625 0.4375 -vt 0.59375 0.4375 -vt 0.59375 0.421875 -vt 0.6015625 0.421875 -vt 0.6171875 0.4375 -vt 0.6015625 0.4375 -vt 0.6015625 0.421875 -vt 0.6171875 0.421875 -vt 0.625 0.4375 -vt 0.6171875 0.4375 -vt 0.6171875 0.421875 -vt 0.625 0.421875 -vt 0.59375 0.4375 -vt 0.578125 0.4375 -vt 0.578125 0.421875 -vt 0.59375 0.421875 -vt 0.59375 0.4375 -vt 0.6015625 0.4375 -vt 0.6015625 0.453125 -vt 0.59375 0.453125 -vt 0.6015625 0.453125 -vt 0.609375 0.453125 -vt 0.609375 0.4375 -vt 0.6015625 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 100/292/73 103/291/73 101/290/73 98/289/73 -f 99/296/74 100/295/74 98/294/74 97/293/74 -f 104/300/75 99/299/75 97/298/75 102/297/75 -f 103/304/76 104/303/76 102/302/76 101/301/76 -f 102/308/77 97/307/77 98/306/77 101/305/77 -f 103/312/78 100/311/78 99/310/78 104/309/78 -o left_ear -v -0.1875 2.71875 -1.15625 -v -0.1875 2.71875 -1.28125 -v -0.1875 2.65625 -1.15625 -v -0.1875 2.65625 -1.28125 -v -0.375 2.71875 -1.28125 -v -0.375 2.71875 -1.15625 -v -0.375 2.65625 -1.28125 -v -0.375 2.65625 -1.15625 -vt 0.3671875 0.984375 -vt 0.390625 0.984375 -vt 0.390625 0.9765625 -vt 0.3671875 0.9765625 -vt 0.3515625 0.984375 -vt 0.3671875 0.984375 -vt 0.3671875 0.9765625 -vt 0.3515625 0.9765625 -vt 0.40625 0.984375 -vt 0.4296875 0.984375 -vt 0.4296875 0.9765625 -vt 0.40625 0.9765625 -vt 0.390625 0.984375 -vt 0.40625 0.984375 -vt 0.40625 0.9765625 -vt 0.390625 0.9765625 -vt 0.390625 0.984375 -vt 0.3671875 0.984375 -vt 0.3671875 1 -vt 0.390625 1 -vt 0.4140625 1 -vt 0.390625 1 -vt 0.390625 0.984375 -vt 0.4140625 0.984375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 108/316/79 111/315/79 109/314/79 106/313/79 -f 107/320/80 108/319/80 106/318/80 105/317/80 -f 112/324/81 107/323/81 105/322/81 110/321/81 -f 111/328/82 112/327/82 110/326/82 109/325/82 -f 110/332/83 105/331/83 106/330/83 109/329/83 -f 111/336/84 108/335/84 107/334/84 112/333/84 -o right_ear -v 0.375 2.71875 -1.15625 -v 0.375 2.71875 -1.28125 -v 0.375 2.65625 -1.15625 -v 0.375 2.65625 -1.28125 -v 0.1875 2.71875 -1.28125 -v 0.1875 2.71875 -1.15625 -v 0.1875 2.65625 -1.28125 -v 0.1875 2.65625 -1.15625 -vt 0.5390625 0.984375 -vt 0.5625 0.984375 -vt 0.5625 0.9765625 -vt 0.5390625 0.9765625 -vt 0.5234375 0.984375 -vt 0.5390625 0.984375 -vt 0.5390625 0.9765625 -vt 0.5234375 0.9765625 -vt 0.578125 0.984375 -vt 0.6015625 0.984375 -vt 0.6015625 0.9765625 -vt 0.578125 0.9765625 -vt 0.5625 0.984375 -vt 0.578125 0.984375 -vt 0.578125 0.9765625 -vt 0.5625 0.9765625 -vt 0.5625 0.984375 -vt 0.5390625 0.984375 -vt 0.5390625 1 -vt 0.5625 1 -vt 0.5859375 1 -vt 0.5625 1 -vt 0.5625 0.984375 -vt 0.5859375 0.984375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 116/340/85 119/339/85 117/338/85 114/337/85 -f 115/344/86 116/343/86 114/342/86 113/341/86 -f 120/348/87 115/347/87 113/346/87 118/345/87 -f 119/352/88 120/351/88 118/350/88 117/349/88 -f 118/356/89 113/355/89 114/354/89 117/353/89 -f 119/360/90 116/359/90 115/358/90 120/357/90 -o reins layer -v -0.23125 2.5625 -0.75 -v -0.23125 2.5625 -1.6875 -v -0.23125 2.125 -0.75 -v -0.23125 2.125 -1.6875 -v -0.23125 2.5625 -1.6875 -v -0.23125 2.5625 -0.75 -v -0.23125 2.125 -1.6875 -v -0.23125 2.125 -0.75 -vt 0.8828125 0.5546875 -vt 0.8828125 0.5546875 -vt 0.8828125 0.5 -vt 0.8828125 0.5 -vt 0.765625 0.5546875 -vt 0.8828125 0.5546875 -vt 0.8828125 0.5 -vt 0.765625 0.5 -vt 1 0.5546875 -vt 1 0.5546875 -vt 1 0.5 -vt 1 0.5 -vt 0.8828125 0.5546875 -vt 1 0.5546875 -vt 1 0.5 -vt 0.8828125 0.5 -vt 0.8828125 0.5546875 -vt 0.8828125 0.5546875 -vt 0.8828125 0.671875 -vt 0.8828125 0.671875 -vt 0.8828125 0.671875 -vt 0.8828125 0.671875 -vt 0.8828125 0.5546875 -vt 0.8828125 0.5546875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 124/364/91 127/363/91 125/362/91 122/361/91 -f 123/368/92 124/367/92 122/366/92 121/365/92 -f 128/372/93 123/371/93 121/370/93 126/369/93 -f 127/376/94 128/375/94 126/374/94 125/373/94 -f 126/380/95 121/379/95 122/378/95 125/377/95 -f 127/384/96 124/383/96 123/382/96 128/381/96 -o reins layer -v 0.23124999999999996 2.5625 -0.75 -v 0.23124999999999996 2.5625 -0.75 -v 0.23124999999999996 2.125 -0.75 -v 0.23124999999999996 2.125 -0.75 -v -0.23125 2.5625 -0.75 -v -0.23125 2.5625 -0.75 -v -0.23125 2.125 -0.75 -v -0.23125 2.125 -0.75 -vt 0.65625 0.5546875 -vt 0.7109375 0.5546875 -vt 0.7109375 0.5 -vt 0.65625 0.5 -vt 0.65625 0.5546875 -vt 0.65625 0.5546875 -vt 0.65625 0.5 -vt 0.65625 0.5 -vt 0.7109375 0.5546875 -vt 0.765625 0.5546875 -vt 0.765625 0.5 -vt 0.7109375 0.5 -vt 0.7109375 0.5546875 -vt 0.7109375 0.5546875 -vt 0.7109375 0.5 -vt 0.7109375 0.5 -vt 0.7109375 0.5546875 -vt 0.65625 0.5546875 -vt 0.65625 0.5546875 -vt 0.7109375 0.5546875 -vt 0.765625 0.5546875 -vt 0.7109375 0.5546875 -vt 0.7109375 0.5546875 -vt 0.765625 0.5546875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 132/388/97 135/387/97 133/386/97 130/385/97 -f 131/392/98 132/391/98 130/390/98 129/389/98 -f 136/396/99 131/395/99 129/394/99 134/393/99 -f 135/400/100 136/399/100 134/398/100 133/397/100 -f 134/404/101 129/403/101 130/402/101 133/401/101 -f 135/408/102 132/407/102 131/406/102 136/405/102 -o reins layer -v 0.23124999999999996 2.5625 -0.75 -v 0.23124999999999996 2.5625 -1.6875 -v 0.23124999999999996 2.125 -0.75 -v 0.23124999999999996 2.125 -1.6875 -v 0.23124999999999996 2.5625 -1.6875 -v 0.23124999999999996 2.5625 -0.75 -v 0.23124999999999996 2.125 -1.6875 -v 0.23124999999999996 2.125 -0.75 -vt 0.8828125 0.5546875 -vt 0.8828125 0.5546875 -vt 0.8828125 0.5 -vt 0.8828125 0.5 -vt 0.765625 0.5546875 -vt 0.8828125 0.5546875 -vt 0.8828125 0.5 -vt 0.765625 0.5 -vt 1 0.5546875 -vt 1 0.5546875 -vt 1 0.5 -vt 1 0.5 -vt 0.8828125 0.5546875 -vt 1 0.5546875 -vt 1 0.5 -vt 0.8828125 0.5 -vt 0.8828125 0.5546875 -vt 0.8828125 0.5546875 -vt 0.8828125 0.671875 -vt 0.8828125 0.671875 -vt 0.8828125 0.671875 -vt 0.8828125 0.671875 -vt 0.8828125 0.5546875 -vt 0.8828125 0.5546875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 140/412/103 143/411/103 141/410/103 138/409/103 -f 139/416/104 140/415/104 138/414/104 137/413/104 -f 144/420/105 139/419/105 137/418/105 142/417/105 -f 143/424/106 144/423/106 142/422/106 141/421/106 -f 142/428/107 137/427/107 138/426/107 141/425/107 -f 143/432/108 140/431/108 139/430/108 144/429/108 -o hump -v 0.28125 2.3125 0.3125 -v 0.28125 2.3125 -0.375 -v 0.28125 2 0.3125 -v 0.28125 2 -0.375 -v -0.28125 2.3125 -0.375 -v -0.28125 2.3125 0.3125 -v -0.28125 2 -0.375 -v -0.28125 2 0.3125 -vt 0.6640625 0.9140625 -vt 0.734375 0.9140625 -vt 0.734375 0.875 -vt 0.6640625 0.875 -vt 0.578125 0.9140625 -vt 0.6640625 0.9140625 -vt 0.6640625 0.875 -vt 0.578125 0.875 -vt 0.8203125 0.9140625 -vt 0.890625 0.9140625 -vt 0.890625 0.875 -vt 0.8203125 0.875 -vt 0.734375 0.9140625 -vt 0.8203125 0.9140625 -vt 0.8203125 0.875 -vt 0.734375 0.875 -vt 0.734375 0.9140625 -vt 0.6640625 0.9140625 -vt 0.6640625 1 -vt 0.734375 1 -vt 0.8046875 1 -vt 0.734375 1 -vt 0.734375 0.9140625 -vt 0.8046875 0.9140625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 148/436/109 151/435/109 149/434/109 146/433/109 -f 147/440/110 148/439/110 146/438/110 145/437/110 -f 152/444/111 147/443/111 145/442/111 150/441/111 -f 151/448/112 152/447/112 150/446/112 149/445/112 -f 150/452/113 145/451/113 146/450/113 149/449/113 -f 151/456/114 148/455/114 147/454/114 152/453/114 -o right_front_leg -v 0.4625 1.3125 -0.5 -v 0.4625 1.3125 -0.8125 -v 0.4625 0 -0.5 -v 0.4625 0 -0.8125 -v 0.15000000000000002 1.3125 -0.8125 -v 0.15000000000000002 1.3125 -0.5 -v 0.15000000000000002 0 -0.8125 -v 0.15000000000000002 0 -0.5 -vt 0.0390625 0.7578125 -vt 0.078125 0.7578125 -vt 0.078125 0.59375 -vt 0.0390625 0.59375 -vt 0 0.7578125 -vt 0.0390625 0.7578125 -vt 0.0390625 0.59375 -vt 0 0.59375 -vt 0.1171875 0.7578125 -vt 0.15625 0.7578125 -vt 0.15625 0.59375 -vt 0.1171875 0.59375 -vt 0.078125 0.7578125 -vt 0.1171875 0.7578125 -vt 0.1171875 0.59375 -vt 0.078125 0.59375 -vt 0.078125 0.7578125 -vt 0.0390625 0.7578125 -vt 0.0390625 0.796875 -vt 0.078125 0.796875 -vt 0.1171875 0.796875 -vt 0.078125 0.796875 -vt 0.078125 0.7578125 -vt 0.1171875 0.7578125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 156/460/115 159/459/115 157/458/115 154/457/115 -f 155/464/116 156/463/116 154/462/116 153/461/116 -f 160/468/117 155/467/117 153/466/117 158/465/117 -f 159/472/118 160/471/118 158/470/118 157/469/118 -f 158/476/119 153/475/119 154/474/119 157/473/119 -f 159/480/120 156/479/120 155/478/120 160/477/120 -o left_front_leg -v -0.15000000000000002 1.3125 -0.5 -v -0.15000000000000002 1.3125 -0.8125 -v -0.15000000000000002 0 -0.5 -v -0.15000000000000002 0 -0.8125 -v -0.4625 1.3125 -0.8125 -v -0.4625 1.3125 -0.5 -v -0.4625 0 -0.8125 -v -0.4625 0 -0.5 -vt 0.0390625 0.9609375 -vt 0.078125 0.9609375 -vt 0.078125 0.796875 -vt 0.0390625 0.796875 -vt 0 0.9609375 -vt 0.0390625 0.9609375 -vt 0.0390625 0.796875 -vt 0 0.796875 -vt 0.1171875 0.9609375 -vt 0.15625 0.9609375 -vt 0.15625 0.796875 -vt 0.1171875 0.796875 -vt 0.078125 0.9609375 -vt 0.1171875 0.9609375 -vt 0.1171875 0.796875 -vt 0.078125 0.796875 -vt 0.078125 0.9609375 -vt 0.0390625 0.9609375 -vt 0.0390625 1 -vt 0.078125 1 -vt 0.1171875 1 -vt 0.078125 1 -vt 0.078125 0.9609375 -vt 0.1171875 0.9609375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 164/484/121 167/483/121 165/482/121 162/481/121 -f 163/488/122 164/487/122 162/486/122 161/485/122 -f 168/492/123 163/491/123 161/490/123 166/489/123 -f 167/496/124 168/495/124 166/494/124 165/493/124 -f 166/500/125 161/499/125 162/498/125 165/497/125 -f 167/504/126 164/503/126 163/502/126 168/501/126 -o left_hind_leg -v -0.15000000000000002 1.3125 0.75 -v -0.15000000000000002 1.3125 0.4375 -v -0.15000000000000002 0 0.75 -v -0.15000000000000002 0 0.4375 -v -0.4625 1.3125 0.4375 -v -0.4625 1.3125 0.75 -v -0.4625 0 0.4375 -v -0.4625 0 0.75 -vt 0.4921875 0.8359375 -vt 0.53125 0.8359375 -vt 0.53125 0.671875 -vt 0.4921875 0.671875 -vt 0.453125 0.8359375 -vt 0.4921875 0.8359375 -vt 0.4921875 0.671875 -vt 0.453125 0.671875 -vt 0.5703125 0.8359375 -vt 0.609375 0.8359375 -vt 0.609375 0.671875 -vt 0.5703125 0.671875 -vt 0.53125 0.8359375 -vt 0.5703125 0.8359375 -vt 0.5703125 0.671875 -vt 0.53125 0.671875 -vt 0.53125 0.8359375 -vt 0.4921875 0.8359375 -vt 0.4921875 0.875 -vt 0.53125 0.875 -vt 0.5703125 0.875 -vt 0.53125 0.875 -vt 0.53125 0.8359375 -vt 0.5703125 0.8359375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 172/508/127 175/507/127 173/506/127 170/505/127 -f 171/512/128 172/511/128 170/510/128 169/509/128 -f 176/516/129 171/515/129 169/514/129 174/513/129 -f 175/520/130 176/519/130 174/518/130 173/517/130 -f 174/524/131 169/523/131 170/522/131 173/521/131 -f 175/528/132 172/527/132 171/526/132 176/525/132 -o right_hind_leg -v 0.4625 1.3125 0.75 -v 0.4625 1.3125 0.4375 -v 0.4625 0 0.75 -v 0.4625 0 0.4375 -v 0.15000000000000002 1.3125 0.4375 -v 0.15000000000000002 1.3125 0.75 -v 0.15000000000000002 0 0.4375 -v 0.15000000000000002 0 0.75 -vt 0.7734375 0.8359375 -vt 0.8125 0.8359375 -vt 0.8125 0.671875 -vt 0.7734375 0.671875 -vt 0.734375 0.8359375 -vt 0.7734375 0.8359375 -vt 0.7734375 0.671875 -vt 0.734375 0.671875 -vt 0.8515625 0.8359375 -vt 0.890625 0.8359375 -vt 0.890625 0.671875 -vt 0.8515625 0.671875 -vt 0.8125 0.8359375 -vt 0.8515625 0.8359375 -vt 0.8515625 0.671875 -vt 0.8125 0.671875 -vt 0.8125 0.8359375 -vt 0.7734375 0.8359375 -vt 0.7734375 0.875 -vt 0.8125 0.875 -vt 0.8515625 0.875 -vt 0.8125 0.875 -vt 0.8125 0.8359375 -vt 0.8515625 0.8359375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_ef8cbfee-18ba-edcd-78d9-3f4313675f2e -f 180/532/133 183/531/133 181/530/133 178/529/133 -f 179/536/134 180/535/134 178/534/134 177/533/134 -f 184/540/135 179/539/135 177/538/135 182/537/135 -f 183/544/136 184/543/136 182/542/136 181/541/136 -f 182/548/137 177/547/137 178/546/137 181/545/137 -f 183/552/138 180/551/138 179/550/138 184/549/138 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/cat.obj b/renderer/viewer/three/entity/models/cat.obj deleted file mode 100644 index 8067b5c6..00000000 --- a/renderer/viewer/three/entity/models/cat.obj +++ /dev/null @@ -1,509 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o body -v 0.125 0.625 -0.4375 -v 0.125 0.2500000000000001 -0.4375 -v 0.125 0.625 0.5625 -v 0.125 0.2499999999999999 0.5625 -v -0.125 0.2500000000000001 -0.4375 -v -0.125 0.625 -0.4375 -v -0.125 0.2499999999999999 0.5625 -v -0.125 0.625 0.5625 -vt 0.40625 0.8125 -vt 0.46875 0.8125 -vt 0.46875 0.3125 -vt 0.40625 0.3125 -vt 0.3125 0.8125 -vt 0.40625 0.8125 -vt 0.40625 0.3125 -vt 0.3125 0.3125 -vt 0.5625 0.8125 -vt 0.625 0.8125 -vt 0.625 0.3125 -vt 0.5625 0.3125 -vt 0.46875 0.8125 -vt 0.5625 0.8125 -vt 0.5625 0.3125 -vt 0.46875 0.3125 -vt 0.46875 0.8125 -vt 0.40625 0.8125 -vt 0.40625 1 -vt 0.46875 1 -vt 0.53125 1 -vt 0.46875 1 -vt 0.46875 0.8125 -vt 0.53125 0.8125 -vn 0 -1 -2.220446049250313e-16 -vn 1 0 0 -vn 0 1 2.220446049250313e-16 -vn -1 0 0 -vn 0 2.220446049250313e-16 -1 -vn 0 -2.220446049250313e-16 1 -usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o head -v 0.15625 0.6875 -0.4375 -v 0.15625 0.6875 -0.75 -v 0.15625 0.4375 -0.4375 -v 0.15625 0.4375 -0.75 -v -0.15625 0.6875 -0.75 -v -0.15625 0.6875 -0.4375 -v -0.15625 0.4375 -0.75 -v -0.15625 0.4375 -0.4375 -vt 0.078125 0.84375 -vt 0.15625 0.84375 -vt 0.15625 0.71875 -vt 0.078125 0.71875 -vt 0 0.84375 -vt 0.078125 0.84375 -vt 0.078125 0.71875 -vt 0 0.71875 -vt 0.234375 0.84375 -vt 0.3125 0.84375 -vt 0.3125 0.71875 -vt 0.234375 0.71875 -vt 0.15625 0.84375 -vt 0.234375 0.84375 -vt 0.234375 0.71875 -vt 0.15625 0.71875 -vt 0.15625 0.84375 -vt 0.078125 0.84375 -vt 0.078125 1 -vt 0.15625 1 -vt 0.234375 1 -vt 0.15625 1 -vt 0.15625 0.84375 -vt 0.234375 0.84375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o head -v 0.09375 0.5634762499999999 -0.6875 -v 0.09375 0.5634762499999999 -0.8125 -v 0.09375 0.43847625 -0.6875 -v 0.09375 0.43847625 -0.8125 -v -0.09375 0.5634762499999999 -0.8125 -v -0.09375 0.5634762499999999 -0.6875 -v -0.09375 0.43847625 -0.8125 -v -0.09375 0.43847625 -0.6875 -vt 0.03125 0.1875 -vt 0.078125 0.1875 -vt 0.078125 0.125 -vt 0.03125 0.125 -vt 0 0.1875 -vt 0.03125 0.1875 -vt 0.03125 0.125 -vt 0 0.125 -vt 0.109375 0.1875 -vt 0.15625 0.1875 -vt 0.15625 0.125 -vt 0.109375 0.125 -vt 0.078125 0.1875 -vt 0.109375 0.1875 -vt 0.109375 0.125 -vt 0.078125 0.125 -vt 0.078125 0.1875 -vt 0.03125 0.1875 -vt 0.03125 0.25 -vt 0.078125 0.25 -vt 0.125 0.25 -vt 0.078125 0.25 -vt 0.078125 0.1875 -vt 0.125 0.1875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o head -v 0.125 0.75 -0.4375 -v 0.125 0.75 -0.5625 -v 0.125 0.6875 -0.4375 -v 0.125 0.6875 -0.5625 -v 0.0625 0.75 -0.5625 -v 0.0625 0.75 -0.4375 -v 0.0625 0.6875 -0.5625 -v 0.0625 0.6875 -0.4375 -vt 0.03125 0.625 -vt 0.046875 0.625 -vt 0.046875 0.59375 -vt 0.03125 0.59375 -vt 0 0.625 -vt 0.03125 0.625 -vt 0.03125 0.59375 -vt 0 0.59375 -vt 0.078125 0.625 -vt 0.09375 0.625 -vt 0.09375 0.59375 -vt 0.078125 0.59375 -vt 0.046875 0.625 -vt 0.078125 0.625 -vt 0.078125 0.59375 -vt 0.046875 0.59375 -vt 0.046875 0.625 -vt 0.03125 0.625 -vt 0.03125 0.6875 -vt 0.046875 0.6875 -vt 0.0625 0.6875 -vt 0.046875 0.6875 -vt 0.046875 0.625 -vt 0.0625 0.625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o head -v -0.0625 0.75 -0.4375 -v -0.0625 0.75 -0.5625 -v -0.0625 0.6875 -0.4375 -v -0.0625 0.6875 -0.5625 -v -0.125 0.75 -0.5625 -v -0.125 0.75 -0.4375 -v -0.125 0.6875 -0.5625 -v -0.125 0.6875 -0.4375 -vt 0.125 0.625 -vt 0.140625 0.625 -vt 0.140625 0.59375 -vt 0.125 0.59375 -vt 0.09375 0.625 -vt 0.125 0.625 -vt 0.125 0.59375 -vt 0.09375 0.59375 -vt 0.171875 0.625 -vt 0.1875 0.625 -vt 0.1875 0.59375 -vt 0.171875 0.59375 -vt 0.140625 0.625 -vt 0.171875 0.625 -vt 0.171875 0.59375 -vt 0.140625 0.59375 -vt 0.140625 0.625 -vt 0.125 0.625 -vt 0.125 0.6875 -vt 0.140625 0.6875 -vt 0.15625 0.6875 -vt 0.140625 0.6875 -vt 0.140625 0.625 -vt 0.15625 0.625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o tail1 -v 0.03125 0.6066941738241591 0.5441941738241594 -v 0.03125 0.5625 0.5 -v 0.03125 0.2531407832308854 0.8977475644174331 -v 0.03125 0.20894660940672616 0.853553390593274 -v -0.03125 0.5625 0.5 -v -0.03125 0.6066941738241591 0.5441941738241594 -v -0.03125 0.20894660940672616 0.853553390593274 -v -0.03125 0.2531407832308854 0.8977475644174331 -vt 0.015625 0.5 -vt 0.03125 0.5 -vt 0.03125 0.25 -vt 0.015625 0.25 -vt 0 0.5 -vt 0.015625 0.5 -vt 0.015625 0.25 -vt 0 0.25 -vt 0.046875 0.5 -vt 0.0625 0.5 -vt 0.0625 0.25 -vt 0.046875 0.25 -vt 0.03125 0.5 -vt 0.046875 0.5 -vt 0.046875 0.25 -vt 0.03125 0.25 -vt 0.03125 0.5 -vt 0.015625 0.5 -vt 0.015625 0.53125 -vt 0.03125 0.53125 -vt 0.046875 0.53125 -vt 0.03125 0.53125 -vt 0.03125 0.5 -vt 0.046875 0.5 -vn 0 -0.7071067811865476 -0.7071067811865475 -vn 1 0 0 -vn 0 0.7071067811865476 0.7071067811865475 -vn -1 0 0 -vn 0 0.7071067811865475 -0.7071067811865476 -vn 0 -0.7071067811865475 0.7071067811865476 -usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o tail2 -v 0.03125 0.27144660940672627 0.8535533905932737 -v 0.03125 0.20894660940672627 0.8535533905932737 -v 0.03125 0.2714466094067264 1.3535533905932737 -v 0.03125 0.20894660940672638 1.3535533905932737 -v -0.03125 0.20894660940672627 0.8535533905932737 -v -0.03125 0.27144660940672627 0.8535533905932737 -v -0.03125 0.20894660940672638 1.3535533905932737 -v -0.03125 0.2714466094067264 1.3535533905932737 -vt 0.078125 0.5 -vt 0.09375 0.5 -vt 0.09375 0.25 -vt 0.078125 0.25 -vt 0.0625 0.5 -vt 0.078125 0.5 -vt 0.078125 0.25 -vt 0.0625 0.25 -vt 0.109375 0.5 -vt 0.125 0.5 -vt 0.125 0.25 -vt 0.109375 0.25 -vt 0.09375 0.5 -vt 0.109375 0.5 -vt 0.109375 0.25 -vt 0.09375 0.25 -vt 0.09375 0.5 -vt 0.078125 0.5 -vt 0.078125 0.53125 -vt 0.09375 0.53125 -vt 0.109375 0.53125 -vt 0.09375 0.53125 -vt 0.09375 0.5 -vt 0.109375 0.5 -vn 0 -1 2.220446049250313e-16 -vn 1 0 0 -vn 0 1 -2.220446049250313e-16 -vn -1 0 0 -vn 0 -2.220446049250313e-16 -1 -vn 0 2.220446049250313e-16 1 -usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o backLegL -v -0.006249999999999978 0.375 0.5 -v -0.006249999999999978 0.375 0.375 -v -0.006249999999999978 0 0.5 -v -0.006249999999999978 0 0.375 -v -0.13124999999999998 0.375 0.375 -v -0.13124999999999998 0.375 0.5 -v -0.13124999999999998 0 0.375 -v -0.13124999999999998 0 0.5 -vt 0.15625 0.53125 -vt 0.1875 0.53125 -vt 0.1875 0.34375 -vt 0.15625 0.34375 -vt 0.125 0.53125 -vt 0.15625 0.53125 -vt 0.15625 0.34375 -vt 0.125 0.34375 -vt 0.21875 0.53125 -vt 0.25 0.53125 -vt 0.25 0.34375 -vt 0.21875 0.34375 -vt 0.1875 0.53125 -vt 0.21875 0.53125 -vt 0.21875 0.34375 -vt 0.1875 0.34375 -vt 0.1875 0.53125 -vt 0.15625 0.53125 -vt 0.15625 0.59375 -vt 0.1875 0.59375 -vt 0.21875 0.59375 -vt 0.1875 0.59375 -vt 0.1875 0.53125 -vt 0.21875 0.53125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o backLegR -v 0.13124999999999998 0.375 0.5 -v 0.13124999999999998 0.375 0.375 -v 0.13124999999999998 0 0.5 -v 0.13124999999999998 0 0.375 -v 0.006249999999999978 0.375 0.375 -v 0.006249999999999978 0.375 0.5 -v 0.006249999999999978 0 0.375 -v 0.006249999999999978 0 0.5 -vt 0.15625 0.53125 -vt 0.1875 0.53125 -vt 0.1875 0.34375 -vt 0.15625 0.34375 -vt 0.125 0.53125 -vt 0.15625 0.53125 -vt 0.15625 0.34375 -vt 0.125 0.34375 -vt 0.21875 0.53125 -vt 0.25 0.53125 -vt 0.25 0.34375 -vt 0.21875 0.34375 -vt 0.1875 0.53125 -vt 0.21875 0.53125 -vt 0.21875 0.34375 -vt 0.1875 0.34375 -vt 0.1875 0.53125 -vt 0.15625 0.53125 -vt 0.15625 0.59375 -vt 0.1875 0.59375 -vt 0.21875 0.59375 -vt 0.1875 0.59375 -vt 0.1875 0.53125 -vt 0.21875 0.53125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o frontLegL -v -0.012500000000000011 0.6375 -0.1875 -v -0.012500000000000011 0.6375 -0.3125 -v -0.012500000000000011 0.012499999999999956 -0.1875 -v -0.012500000000000011 0.012499999999999956 -0.3125 -v -0.1375 0.6375 -0.3125 -v -0.1375 0.6375 -0.1875 -v -0.1375 0.012499999999999956 -0.3125 -v -0.1375 0.012499999999999956 -0.1875 -vt 0.65625 0.9375 -vt 0.6875 0.9375 -vt 0.6875 0.625 -vt 0.65625 0.625 -vt 0.625 0.9375 -vt 0.65625 0.9375 -vt 0.65625 0.625 -vt 0.625 0.625 -vt 0.71875 0.9375 -vt 0.75 0.9375 -vt 0.75 0.625 -vt 0.71875 0.625 -vt 0.6875 0.9375 -vt 0.71875 0.9375 -vt 0.71875 0.625 -vt 0.6875 0.625 -vt 0.6875 0.9375 -vt 0.65625 0.9375 -vt 0.65625 1 -vt 0.6875 1 -vt 0.71875 1 -vt 0.6875 1 -vt 0.6875 0.9375 -vt 0.71875 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o frontLegR -v 0.13749999999999996 0.6375 -0.1875 -v 0.13749999999999996 0.6375 -0.3125 -v 0.13749999999999996 0.012499999999999956 -0.1875 -v 0.13749999999999996 0.012499999999999956 -0.3125 -v 0.012499999999999956 0.6375 -0.3125 -v 0.012499999999999956 0.6375 -0.1875 -v 0.012499999999999956 0.012499999999999956 -0.3125 -v 0.012499999999999956 0.012499999999999956 -0.1875 -vt 0.65625 0.9375 -vt 0.6875 0.9375 -vt 0.6875 0.625 -vt 0.65625 0.625 -vt 0.625 0.9375 -vt 0.65625 0.9375 -vt 0.65625 0.625 -vt 0.625 0.625 -vt 0.71875 0.9375 -vt 0.75 0.9375 -vt 0.75 0.625 -vt 0.71875 0.625 -vt 0.6875 0.9375 -vt 0.71875 0.9375 -vt 0.71875 0.625 -vt 0.6875 0.625 -vt 0.6875 0.9375 -vt 0.65625 0.9375 -vt 0.65625 1 -vt 0.6875 1 -vt 0.71875 1 -vt 0.6875 1 -vt 0.6875 0.9375 -vt 0.71875 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_2ee28436-932f-1f18-8613-04d9bd8d8ca4 -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/chicken.obj b/renderer/viewer/three/entity/models/chicken.obj deleted file mode 100644 index ec873ffd..00000000 --- a/renderer/viewer/three/entity/models/chicken.obj +++ /dev/null @@ -1,371 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o body -v 0.1875 0.6875 -0.25 -v 0.1875 0.3125 -0.25 -v 0.1875 0.6875 0.25 -v 0.1875 0.3125 0.25 -v -0.1875 0.3125 -0.25 -v -0.1875 0.6875 -0.25 -v -0.1875 0.3125 0.25 -v -0.1875 0.6875 0.25 -vt 0.09375 0.53125 -vt 0.1875 0.53125 -vt 0.1875 0.28125 -vt 0.09375 0.28125 -vt 0 0.53125 -vt 0.09375 0.53125 -vt 0.09375 0.28125 -vt 0 0.28125 -vt 0.28125 0.53125 -vt 0.375 0.53125 -vt 0.375 0.28125 -vt 0.28125 0.28125 -vt 0.1875 0.53125 -vt 0.28125 0.53125 -vt 0.28125 0.28125 -vt 0.1875 0.28125 -vt 0.1875 0.53125 -vt 0.09375 0.53125 -vt 0.09375 0.71875 -vt 0.1875 0.71875 -vt 0.28125 0.71875 -vt 0.1875 0.71875 -vt 0.1875 0.53125 -vt 0.28125 0.53125 -vn 0 -1 -2.220446049250313e-16 -vn 1 0 0 -vn 0 1 2.220446049250313e-16 -vn -1 0 0 -vn 0 2.220446049250313e-16 -1 -vn 0 -2.220446049250313e-16 1 -usemtl m_a3a58acf-2885-3588-3386-06528bca041b -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o head -v 0.125 0.9375 -0.1875 -v 0.125 0.9375 -0.375 -v 0.125 0.5625 -0.1875 -v 0.125 0.5625 -0.375 -v -0.125 0.9375 -0.375 -v -0.125 0.9375 -0.1875 -v -0.125 0.5625 -0.375 -v -0.125 0.5625 -0.1875 -vt 0.046875 0.90625 -vt 0.109375 0.90625 -vt 0.109375 0.71875 -vt 0.046875 0.71875 -vt 0 0.90625 -vt 0.046875 0.90625 -vt 0.046875 0.71875 -vt 0 0.71875 -vt 0.15625 0.90625 -vt 0.21875 0.90625 -vt 0.21875 0.71875 -vt 0.15625 0.71875 -vt 0.109375 0.90625 -vt 0.15625 0.90625 -vt 0.15625 0.71875 -vt 0.109375 0.71875 -vt 0.109375 0.90625 -vt 0.046875 0.90625 -vt 0.046875 1 -vt 0.109375 1 -vt 0.171875 1 -vt 0.109375 1 -vt 0.109375 0.90625 -vt 0.171875 0.90625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_a3a58acf-2885-3588-3386-06528bca041b -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o comb -v 0.0625 0.6875 -0.3125 -v 0.0625 0.6875 -0.4375 -v 0.0625 0.5625 -0.3125 -v 0.0625 0.5625 -0.4375 -v -0.0625 0.6875 -0.4375 -v -0.0625 0.6875 -0.3125 -v -0.0625 0.5625 -0.4375 -v -0.0625 0.5625 -0.3125 -vt 0.25 0.8125 -vt 0.28125 0.8125 -vt 0.28125 0.75 -vt 0.25 0.75 -vt 0.21875 0.8125 -vt 0.25 0.8125 -vt 0.25 0.75 -vt 0.21875 0.75 -vt 0.3125 0.8125 -vt 0.34375 0.8125 -vt 0.34375 0.75 -vt 0.3125 0.75 -vt 0.28125 0.8125 -vt 0.3125 0.8125 -vt 0.3125 0.75 -vt 0.28125 0.75 -vt 0.28125 0.8125 -vt 0.25 0.8125 -vt 0.25 0.875 -vt 0.28125 0.875 -vt 0.3125 0.875 -vt 0.28125 0.875 -vt 0.28125 0.8125 -vt 0.3125 0.8125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_a3a58acf-2885-3588-3386-06528bca041b -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o beak -v 0.125 0.8224431423663936 -0.35273540157455374 -v 0.125 0.8333376102098509 -0.4772597388360219 -v 0.125 0.6979188051049254 -0.363629869418011 -v 0.125 0.7088132729483827 -0.4881542066794792 -v -0.125 0.8333376102098509 -0.4772597388360219 -v -0.125 0.8224431423663936 -0.35273540157455374 -v -0.125 0.7088132729483827 -0.4881542066794792 -v -0.125 0.6979188051049254 -0.363629869418011 -vt 0.25 0.9375 -vt 0.3125 0.9375 -vt 0.3125 0.875 -vt 0.25 0.875 -vt 0.21875 0.9375 -vt 0.25 0.9375 -vt 0.25 0.875 -vt 0.21875 0.875 -vt 0.34375 0.9375 -vt 0.40625 0.9375 -vt 0.40625 0.875 -vt 0.34375 0.875 -vt 0.3125 0.9375 -vt 0.34375 0.9375 -vt 0.34375 0.875 -vt 0.3125 0.875 -vt 0.3125 0.9375 -vt 0.25 0.9375 -vt 0.25 1 -vt 0.3125 1 -vt 0.375 1 -vt 0.3125 1 -vt 0.3125 0.9375 -vt 0.375 0.9375 -vn 0 0.08715574274765818 -0.9961946980917455 -vn 1 0 0 -vn 0 -0.08715574274765818 0.9961946980917455 -vn -1 0 0 -vn 0 0.9961946980917455 0.08715574274765818 -vn 0 -0.9961946980917455 -0.08715574274765818 -usemtl m_a3a58acf-2885-3588-3386-06528bca041b -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o leg0 -v 0.1875 0.3125 0.0625 -v 0.1875 0.3125 -0.125 -v 0.1875 0 0.0625 -v 0.1875 0 -0.125 -v 0 0.3125 -0.125 -v 0 0.3125 0.0625 -v 0 0 -0.125 -v 0 0 0.0625 -vt 0.453125 0.90625 -vt 0.5 0.90625 -vt 0.5 0.75 -vt 0.453125 0.75 -vt 0.40625 0.90625 -vt 0.453125 0.90625 -vt 0.453125 0.75 -vt 0.40625 0.75 -vt 0.546875 0.90625 -vt 0.59375 0.90625 -vt 0.59375 0.75 -vt 0.546875 0.75 -vt 0.5 0.90625 -vt 0.546875 0.90625 -vt 0.546875 0.75 -vt 0.5 0.75 -vt 0.5 0.90625 -vt 0.453125 0.90625 -vt 0.453125 1 -vt 0.5 1 -vt 0.546875 1 -vt 0.5 1 -vt 0.5 0.90625 -vt 0.546875 0.90625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_a3a58acf-2885-3588-3386-06528bca041b -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o leg1 -v 0 0.3125 0.0625 -v 0 0.3125 -0.125 -v 0 0 0.0625 -v 0 0 -0.125 -v -0.1875 0.3125 -0.125 -v -0.1875 0.3125 0.0625 -v -0.1875 0 -0.125 -v -0.1875 0 0.0625 -vt 0.453125 0.90625 -vt 0.5 0.90625 -vt 0.5 0.75 -vt 0.453125 0.75 -vt 0.40625 0.90625 -vt 0.453125 0.90625 -vt 0.453125 0.75 -vt 0.40625 0.75 -vt 0.546875 0.90625 -vt 0.59375 0.90625 -vt 0.59375 0.75 -vt 0.546875 0.75 -vt 0.5 0.90625 -vt 0.546875 0.90625 -vt 0.546875 0.75 -vt 0.5 0.75 -vt 0.5 0.90625 -vt 0.453125 0.90625 -vt 0.453125 1 -vt 0.5 1 -vt 0.546875 1 -vt 0.5 1 -vt 0.5 0.90625 -vt 0.546875 0.90625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_a3a58acf-2885-3588-3386-06528bca041b -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o wing0 -v 0.25 0.6875 0.1875 -v 0.25 0.6875 -0.1875 -v 0.25 0.4375 0.1875 -v 0.25 0.4375 -0.1875 -v 0.1875 0.6875 -0.1875 -v 0.1875 0.6875 0.1875 -v 0.1875 0.4375 -0.1875 -v 0.1875 0.4375 0.1875 -vt 0.46875 0.40625 -vt 0.484375 0.40625 -vt 0.484375 0.28125 -vt 0.46875 0.28125 -vt 0.375 0.40625 -vt 0.46875 0.40625 -vt 0.46875 0.28125 -vt 0.375 0.28125 -vt 0.578125 0.40625 -vt 0.59375 0.40625 -vt 0.59375 0.28125 -vt 0.578125 0.28125 -vt 0.484375 0.40625 -vt 0.578125 0.40625 -vt 0.578125 0.28125 -vt 0.484375 0.28125 -vt 0.484375 0.40625 -vt 0.46875 0.40625 -vt 0.46875 0.59375 -vt 0.484375 0.59375 -vt 0.5 0.59375 -vt 0.484375 0.59375 -vt 0.484375 0.40625 -vt 0.5 0.40625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_a3a58acf-2885-3588-3386-06528bca041b -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o wing1 -v -0.1875 0.6875 0.1875 -v -0.1875 0.6875 -0.1875 -v -0.1875 0.4375 0.1875 -v -0.1875 0.4375 -0.1875 -v -0.25 0.6875 -0.1875 -v -0.25 0.6875 0.1875 -v -0.25 0.4375 -0.1875 -v -0.25 0.4375 0.1875 -vt 0.46875 0.40625 -vt 0.484375 0.40625 -vt 0.484375 0.28125 -vt 0.46875 0.28125 -vt 0.375 0.40625 -vt 0.46875 0.40625 -vt 0.46875 0.28125 -vt 0.375 0.28125 -vt 0.578125 0.40625 -vt 0.59375 0.40625 -vt 0.59375 0.28125 -vt 0.578125 0.28125 -vt 0.484375 0.40625 -vt 0.578125 0.40625 -vt 0.578125 0.28125 -vt 0.484375 0.28125 -vt 0.484375 0.40625 -vt 0.46875 0.40625 -vt 0.46875 0.59375 -vt 0.484375 0.59375 -vt 0.5 0.59375 -vt 0.484375 0.59375 -vt 0.484375 0.40625 -vt 0.5 0.40625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_a3a58acf-2885-3588-3386-06528bca041b -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/cod.obj b/renderer/viewer/three/entity/models/cod.obj deleted file mode 100644 index 2b469b8b..00000000 --- a/renderer/viewer/three/entity/models/cod.obj +++ /dev/null @@ -1,371 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o body -v 0.0625 0.25 0.5 -v 0.0625 0.25 0.0625 -v 0.0625 0 0.5 -v 0.0625 0 0.0625 -v -0.0625 0.25 0.0625 -v -0.0625 0.25 0.5 -v -0.0625 0 0.0625 -v -0.0625 0 0.5 -vt 0.21875 0.78125 -vt 0.28125 0.78125 -vt 0.28125 0.65625 -vt 0.21875 0.65625 -vt 0 0.78125 -vt 0.21875 0.78125 -vt 0.21875 0.65625 -vt 0 0.65625 -vt 0.5 0.78125 -vt 0.5625 0.78125 -vt 0.5625 0.65625 -vt 0.5 0.65625 -vt 0.28125 0.78125 -vt 0.5 0.78125 -vt 0.5 0.65625 -vt 0.28125 0.65625 -vt 0.28125 0.78125 -vt 0.21875 0.78125 -vt 0.21875 1 -vt 0.28125 1 -vt 0.34375 1 -vt 0.28125 1 -vt 0.28125 0.78125 -vt 0.34375 0.78125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_92191bde-46b9-ba2f-846b-1e3ee628119f -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o body -v 0 0.3125 0.375 -v 0 0.3125 0 -v 0 0.25 0.375 -v 0 0.25 0 -v 0 0.3125 0 -v 0 0.3125 0.375 -v 0 0.25 0 -v 0 0.25 0.375 -vt 0.8125 1 -vt 0.8125 1 -vt 0.8125 0.96875 -vt 0.8125 0.96875 -vt 0.625 1 -vt 0.8125 1 -vt 0.8125 0.96875 -vt 0.625 0.96875 -vt 1 1 -vt 1 1 -vt 1 0.96875 -vt 1 0.96875 -vt 0.8125 1 -vt 1 1 -vt 1 0.96875 -vt 0.8125 0.96875 -vt 0.8125 1 -vt 0.8125 1 -vt 0.8125 1.1875 -vt 0.8125 1.1875 -vt 0.8125 1.1875 -vt 0.8125 1.1875 -vt 0.8125 1 -vt 0.8125 1 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_92191bde-46b9-ba2f-846b-1e3ee628119f -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o body -v 0 0 0.3125 -v 0 0 0.1875 -v 0 -0.0625 0.3125 -v 0 -0.0625 0.1875 -v 0 0 0.1875 -v 0 0 0.3125 -v 0 -0.0625 0.1875 -v 0 -0.0625 0.3125 -vt 0.75 0.96875 -vt 0.75 0.96875 -vt 0.75 0.9375 -vt 0.75 0.9375 -vt 0.6875 0.96875 -vt 0.75 0.96875 -vt 0.75 0.9375 -vt 0.6875 0.9375 -vt 0.8125 0.96875 -vt 0.8125 0.96875 -vt 0.8125 0.9375 -vt 0.8125 0.9375 -vt 0.75 0.96875 -vt 0.8125 0.96875 -vt 0.8125 0.9375 -vt 0.75 0.9375 -vt 0.75 0.96875 -vt 0.75 0.96875 -vt 0.75 1.03125 -vt 0.75 1.03125 -vt 0.75 1.03125 -vt 0.75 1.03125 -vt 0.75 0.96875 -vt 0.75 0.96875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_92191bde-46b9-ba2f-846b-1e3ee628119f -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o head -v 0.062450000000000006 0.25005 -0.125 -v 0.062450000000000006 0.25005 -0.1875 -v 0.062450000000000006 0.06255 -0.125 -v 0.062450000000000006 0.06255 -0.1875 -v -0.06255 0.25005 -0.1875 -v -0.06255 0.25005 -0.125 -v -0.06255 0.06255 -0.1875 -v -0.06255 0.06255 -0.125 -vt 0.03125 0.96875 -vt 0.09375 0.96875 -vt 0.09375 0.875 -vt 0.03125 0.875 -vt 0 0.96875 -vt 0.03125 0.96875 -vt 0.03125 0.875 -vt 0 0.875 -vt 0.125 0.96875 -vt 0.1875 0.96875 -vt 0.1875 0.875 -vt 0.125 0.875 -vt 0.09375 0.96875 -vt 0.125 0.96875 -vt 0.125 0.875 -vt 0.09375 0.875 -vt 0.09375 0.96875 -vt 0.03125 0.96875 -vt 0.03125 1 -vt 0.09375 1 -vt 0.15625 1 -vt 0.09375 1 -vt 0.09375 0.96875 -vt 0.15625 0.96875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_92191bde-46b9-ba2f-846b-1e3ee628119f -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o head -v 0.0625 0.25 0.0625 -v 0.0625 0.25 -0.125 -v 0.0625 0 0.0625 -v 0.0625 0 -0.125 -v -0.0625 0.25 -0.125 -v -0.0625 0.25 0.0625 -v -0.0625 0 -0.125 -v -0.0625 0 0.0625 -vt 0.4375 0.90625 -vt 0.5 0.90625 -vt 0.5 0.78125 -vt 0.4375 0.78125 -vt 0.34375 0.90625 -vt 0.4375 0.90625 -vt 0.4375 0.78125 -vt 0.34375 0.78125 -vt 0.59375 0.90625 -vt 0.65625 0.90625 -vt 0.65625 0.78125 -vt 0.59375 0.78125 -vt 0.5 0.90625 -vt 0.59375 0.90625 -vt 0.59375 0.78125 -vt 0.5 0.78125 -vt 0.5 0.90625 -vt 0.4375 0.90625 -vt 0.4375 1 -vt 0.5 1 -vt 0.5625 1 -vt 0.5 1 -vt 0.5 0.90625 -vt 0.5625 0.90625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_92191bde-46b9-ba2f-846b-1e3ee628119f -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o leftFin -v -0.0625 0.0625 0.125 -v -0.0625 0.0625 0 -v -0.026651472728059622 0.011302997231938061 0.125 -v -0.026651472728059622 0.011302997231938061 0 -v -0.164894005536124 -0.009197054543880756 0 -v -0.164894005536124 -0.009197054543880756 0.125 -v -0.12904547826418356 -0.06039405731194275 0 -v -0.12904547826418356 -0.06039405731194275 0.125 -vt 0.8125 0.8125 -vt 0.875 0.8125 -vt 0.875 0.78125 -vt 0.8125 0.78125 -vt 0.75 0.8125 -vt 0.8125 0.8125 -vt 0.8125 0.78125 -vt 0.75 0.78125 -vt 0.9375 0.8125 -vt 1 0.8125 -vt 1 0.78125 -vt 0.9375 0.78125 -vt 0.875 0.8125 -vt 0.9375 0.8125 -vt 0.9375 0.78125 -vt 0.875 0.78125 -vt 0.875 0.8125 -vt 0.8125 0.8125 -vt 0.8125 0.875 -vt 0.875 0.875 -vt 0.9375 0.875 -vt 0.875 0.875 -vt 0.875 0.8125 -vt 0.9375 0.8125 -vn 0 0 -1 -vn 0.8191520442889918 0.573576436351046 0 -vn 0 0 1 -vn -0.8191520442889918 -0.573576436351046 0 -vn -0.573576436351046 0.8191520442889918 0 -vn 0.573576436351046 -0.8191520442889918 0 -usemtl m_92191bde-46b9-ba2f-846b-1e3ee628119f -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o rightFin -v 0.164894005536124 -0.009197054543880756 0.125 -v 0.164894005536124 -0.009197054543880756 0 -v 0.12904547826418356 -0.06039405731194275 0.125 -v 0.12904547826418356 -0.06039405731194275 0 -v 0.0625 0.0625 0 -v 0.0625 0.0625 0.125 -v 0.026651472728059566 0.011302997231938061 0 -v 0.026651472728059566 0.011302997231938061 0.125 -vt 0.8125 0.90625 -vt 0.875 0.90625 -vt 0.875 0.875 -vt 0.8125 0.875 -vt 0.75 0.90625 -vt 0.8125 0.90625 -vt 0.8125 0.875 -vt 0.75 0.875 -vt 0.9375 0.90625 -vt 1 0.90625 -vt 1 0.875 -vt 0.9375 0.875 -vt 0.875 0.90625 -vt 0.9375 0.90625 -vt 0.9375 0.875 -vt 0.875 0.875 -vt 0.875 0.90625 -vt 0.8125 0.90625 -vt 0.8125 0.96875 -vt 0.875 0.96875 -vt 0.9375 0.96875 -vt 0.875 0.96875 -vt 0.875 0.90625 -vt 0.9375 0.90625 -vn 0 0 -1 -vn 0.8191520442889918 -0.573576436351046 0 -vn 0 0 1 -vn -0.8191520442889918 0.573576436351046 0 -vn 0.573576436351046 0.8191520442889918 0 -vn -0.573576436351046 -0.8191520442889918 0 -usemtl m_92191bde-46b9-ba2f-846b-1e3ee628119f -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o tailfin -v 0 0.25 0.875 -v 0 0.25 0.5 -v 0 0 0.875 -v 0 0 0.5 -v 0 0.25 0.5 -v 0 0.25 0.875 -v 0 0 0.5 -v 0 0 0.875 -vt 0.8125 0.78125 -vt 0.8125 0.78125 -vt 0.8125 0.65625 -vt 0.8125 0.65625 -vt 0.625 0.78125 -vt 0.8125 0.78125 -vt 0.8125 0.65625 -vt 0.625 0.65625 -vt 1 0.78125 -vt 1 0.78125 -vt 1 0.65625 -vt 1 0.65625 -vt 0.8125 0.78125 -vt 1 0.78125 -vt 1 0.65625 -vt 0.8125 0.65625 -vt 0.8125 0.78125 -vt 0.8125 0.78125 -vt 0.8125 0.96875 -vt 0.8125 0.96875 -vt 0.8125 0.96875 -vt 0.8125 0.96875 -vt 0.8125 0.78125 -vt 0.8125 0.78125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_92191bde-46b9-ba2f-846b-1e3ee628119f -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/creeper.obj b/renderer/viewer/three/entity/models/creeper.obj deleted file mode 100644 index 2e68c50e..00000000 --- a/renderer/viewer/three/entity/models/creeper.obj +++ /dev/null @@ -1,279 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o Body -v 0.25 1.125 0.125 -v 0.25 1.125 -0.125 -v 0.25 0.375 0.125 -v 0.25 0.375 -0.125 -v -0.25 1.125 -0.125 -v -0.25 1.125 0.125 -v -0.25 0.375 -0.125 -v -0.25 0.375 0.125 -vt 0.3125 0.375 -vt 0.4375 0.375 -vt 0.4375 0 -vt 0.3125 0 -vt 0.25 0.375 -vt 0.3125 0.375 -vt 0.3125 0 -vt 0.25 0 -vt 0.5 0.375 -vt 0.625 0.375 -vt 0.625 0 -vt 0.5 0 -vt 0.4375 0.375 -vt 0.5 0.375 -vt 0.5 0 -vt 0.4375 0 -vt 0.4375 0.375 -vt 0.3125 0.375 -vt 0.3125 0.5 -vt 0.4375 0.5 -vt 0.5625 0.5 -vt 0.4375 0.5 -vt 0.4375 0.375 -vt 0.5625 0.375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_5d56b934-8e1a-577b-049f-fb19876a8641 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o Head -v 0.25 1.625 0.25 -v 0.25 1.625 -0.25 -v 0.25 1.125 0.25 -v 0.25 1.125 -0.25 -v -0.25 1.625 -0.25 -v -0.25 1.625 0.25 -v -0.25 1.125 -0.25 -v -0.25 1.125 0.25 -vt 0.125 0.75 -vt 0.25 0.75 -vt 0.25 0.5 -vt 0.125 0.5 -vt 0 0.75 -vt 0.125 0.75 -vt 0.125 0.5 -vt 0 0.5 -vt 0.375 0.75 -vt 0.5 0.75 -vt 0.5 0.5 -vt 0.375 0.5 -vt 0.25 0.75 -vt 0.375 0.75 -vt 0.375 0.5 -vt 0.25 0.5 -vt 0.25 0.75 -vt 0.125 0.75 -vt 0.125 1 -vt 0.25 1 -vt 0.375 1 -vt 0.25 1 -vt 0.25 0.75 -vt 0.375 0.75 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_5d56b934-8e1a-577b-049f-fb19876a8641 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o leg0 -v 0.25 0.375 0.375 -v 0.25 0.375 0.125 -v 0.25 0 0.375 -v 0.25 0 0.125 -v 0 0.375 0.125 -v 0 0.375 0.375 -v 0 0 0.125 -v 0 0 0.375 -vt 0.0625 0.375 -vt 0.125 0.375 -vt 0.125 0.1875 -vt 0.0625 0.1875 -vt 0 0.375 -vt 0.0625 0.375 -vt 0.0625 0.1875 -vt 0 0.1875 -vt 0.1875 0.375 -vt 0.25 0.375 -vt 0.25 0.1875 -vt 0.1875 0.1875 -vt 0.125 0.375 -vt 0.1875 0.375 -vt 0.1875 0.1875 -vt 0.125 0.1875 -vt 0.125 0.375 -vt 0.0625 0.375 -vt 0.0625 0.5 -vt 0.125 0.5 -vt 0.1875 0.5 -vt 0.125 0.5 -vt 0.125 0.375 -vt 0.1875 0.375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_5d56b934-8e1a-577b-049f-fb19876a8641 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o leg1 -v 0 0.375 0.375 -v 0 0.375 0.125 -v 0 0 0.375 -v 0 0 0.125 -v -0.25 0.375 0.125 -v -0.25 0.375 0.375 -v -0.25 0 0.125 -v -0.25 0 0.375 -vt 0.0625 0.375 -vt 0.125 0.375 -vt 0.125 0.1875 -vt 0.0625 0.1875 -vt 0 0.375 -vt 0.0625 0.375 -vt 0.0625 0.1875 -vt 0 0.1875 -vt 0.1875 0.375 -vt 0.25 0.375 -vt 0.25 0.1875 -vt 0.1875 0.1875 -vt 0.125 0.375 -vt 0.1875 0.375 -vt 0.1875 0.1875 -vt 0.125 0.1875 -vt 0.125 0.375 -vt 0.0625 0.375 -vt 0.0625 0.5 -vt 0.125 0.5 -vt 0.1875 0.5 -vt 0.125 0.5 -vt 0.125 0.375 -vt 0.1875 0.375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_5d56b934-8e1a-577b-049f-fb19876a8641 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o leg2 -v 0.25 0.375 -0.125 -v 0.25 0.375 -0.375 -v 0.25 0 -0.125 -v 0.25 0 -0.375 -v 0 0.375 -0.375 -v 0 0.375 -0.125 -v 0 0 -0.375 -v 0 0 -0.125 -vt 0.0625 0.375 -vt 0.125 0.375 -vt 0.125 0.1875 -vt 0.0625 0.1875 -vt 0 0.375 -vt 0.0625 0.375 -vt 0.0625 0.1875 -vt 0 0.1875 -vt 0.1875 0.375 -vt 0.25 0.375 -vt 0.25 0.1875 -vt 0.1875 0.1875 -vt 0.125 0.375 -vt 0.1875 0.375 -vt 0.1875 0.1875 -vt 0.125 0.1875 -vt 0.125 0.375 -vt 0.0625 0.375 -vt 0.0625 0.5 -vt 0.125 0.5 -vt 0.1875 0.5 -vt 0.125 0.5 -vt 0.125 0.375 -vt 0.1875 0.375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_5d56b934-8e1a-577b-049f-fb19876a8641 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o leg3 -v 0 0.375 -0.125 -v 0 0.375 -0.375 -v 0 0 -0.125 -v 0 0 -0.375 -v -0.25 0.375 -0.375 -v -0.25 0.375 -0.125 -v -0.25 0 -0.375 -v -0.25 0 -0.125 -vt 0.0625 0.375 -vt 0.125 0.375 -vt 0.125 0.1875 -vt 0.0625 0.1875 -vt 0 0.375 -vt 0.0625 0.375 -vt 0.0625 0.1875 -vt 0 0.1875 -vt 0.1875 0.375 -vt 0.25 0.375 -vt 0.25 0.1875 -vt 0.1875 0.1875 -vt 0.125 0.375 -vt 0.1875 0.375 -vt 0.1875 0.1875 -vt 0.125 0.1875 -vt 0.125 0.375 -vt 0.0625 0.375 -vt 0.0625 0.5 -vt 0.125 0.5 -vt 0.1875 0.5 -vt 0.125 0.5 -vt 0.125 0.375 -vt 0.1875 0.375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_5d56b934-8e1a-577b-049f-fb19876a8641 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/dolphin.obj b/renderer/viewer/three/entity/models/dolphin.obj deleted file mode 100644 index 478ce015..00000000 --- a/renderer/viewer/three/entity/models/dolphin.obj +++ /dev/null @@ -1,371 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o body -v 0.25 0.4375 0.625 -v 0.25 0.4375 -0.1875 -v 0.25 0 0.625 -v 0.25 0 -0.1875 -v -0.25 0.4375 -0.1875 -v -0.25 0.4375 0.625 -v -0.25 0 -0.1875 -v -0.25 0 0.625 -vt 0.546875 0.796875 -vt 0.671875 0.796875 -vt 0.671875 0.6875 -vt 0.546875 0.6875 -vt 0.34375 0.796875 -vt 0.546875 0.796875 -vt 0.546875 0.6875 -vt 0.34375 0.6875 -vt 0.875 0.796875 -vt 1 0.796875 -vt 1 0.6875 -vt 0.875 0.6875 -vt 0.671875 0.796875 -vt 0.875 0.796875 -vt 0.875 0.6875 -vt 0.671875 0.6875 -vt 0.671875 0.796875 -vt 0.546875 0.796875 -vt 0.546875 1 -vt 0.671875 1 -vt 0.796875 1 -vt 0.671875 1 -vt 0.671875 0.796875 -vt 0.796875 0.796875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_84be203d-dd47-5073-42d4-8589a81aedb5 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o head -v 0.25 0.4375 -0.1875 -v 0.25 0.4375 -0.5625 -v 0.25 0 -0.1875 -v 0.25 0 -0.5625 -v -0.25 0.4375 -0.5625 -v -0.25 0.4375 -0.1875 -v -0.25 0 -0.5625 -v -0.25 0 -0.1875 -vt 0.09375 0.90625 -vt 0.21875 0.90625 -vt 0.21875 0.796875 -vt 0.09375 0.796875 -vt 0 0.90625 -vt 0.09375 0.90625 -vt 0.09375 0.796875 -vt 0 0.796875 -vt 0.3125 0.90625 -vt 0.4375 0.90625 -vt 0.4375 0.796875 -vt 0.3125 0.796875 -vt 0.21875 0.90625 -vt 0.3125 0.90625 -vt 0.3125 0.796875 -vt 0.21875 0.796875 -vt 0.21875 0.90625 -vt 0.09375 0.90625 -vt 0.09375 1 -vt 0.21875 1 -vt 0.34375 1 -vt 0.21875 1 -vt 0.21875 0.90625 -vt 0.34375 0.90625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_84be203d-dd47-5073-42d4-8589a81aedb5 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o nose -v 0.0625 0.125 -0.5625 -v 0.0625 0.125 -0.8125 -v 0.0625 0 -0.5625 -v 0.0625 0 -0.8125 -v -0.0625 0.125 -0.8125 -v -0.0625 0.125 -0.5625 -v -0.0625 0 -0.8125 -v -0.0625 0 -0.5625 -vt 0.0625 0.734375 -vt 0.09375 0.734375 -vt 0.09375 0.703125 -vt 0.0625 0.703125 -vt 0 0.734375 -vt 0.0625 0.734375 -vt 0.0625 0.703125 -vt 0 0.703125 -vt 0.15625 0.734375 -vt 0.1875 0.734375 -vt 0.1875 0.703125 -vt 0.15625 0.703125 -vt 0.09375 0.734375 -vt 0.15625 0.734375 -vt 0.15625 0.703125 -vt 0.09375 0.703125 -vt 0.09375 0.734375 -vt 0.0625 0.734375 -vt 0.0625 0.796875 -vt 0.09375 0.796875 -vt 0.125 0.796875 -vt 0.09375 0.796875 -vt 0.09375 0.734375 -vt 0.125 0.734375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_84be203d-dd47-5073-42d4-8589a81aedb5 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o tail -v 0.125 0.25743308235954887 1.3237397711116625 -v 0.125 0.31735265549856384 0.6388559161735876 -v 0.125 -0.0538777607941216 1.2965036015030194 -v 0.125 0.006041812344893427 0.6116197465649442 -v -0.125 0.31735265549856384 0.6388559161735876 -v -0.125 0.25743308235954887 1.3237397711116625 -v -0.125 0.006041812344893427 0.6116197465649442 -v -0.125 -0.0538777607941216 1.2965036015030194 -vt 0.171875 0.53125 -vt 0.234375 0.53125 -vt 0.234375 0.453125 -vt 0.171875 0.453125 -vt 0 0.53125 -vt 0.171875 0.53125 -vt 0.171875 0.453125 -vt 0 0.453125 -vt 0.40625 0.53125 -vt 0.46875 0.53125 -vt 0.46875 0.453125 -vt 0.40625 0.453125 -vt 0.234375 0.53125 -vt 0.40625 0.53125 -vt 0.40625 0.453125 -vt 0.234375 0.453125 -vt 0.234375 0.53125 -vt 0.171875 0.53125 -vt 0.171875 0.703125 -vt 0.234375 0.703125 -vt 0.296875 0.703125 -vt 0.234375 0.703125 -vt 0.234375 0.53125 -vt 0.296875 0.53125 -vn 0 0.08715574274765818 -0.9961946980917455 -vn 1 0 0 -vn 0 -0.08715574274765818 0.9961946980917455 -vn -1 0 0 -vn 0 0.9961946980917455 0.08715574274765818 -vn 0 -0.9961946980917455 -0.08715574274765818 -usemtl m_84be203d-dd47-5073-42d4-8589a81aedb5 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o tail_fin -v 0.3125 0.06737675474652305 1.559379883370239 -v 0.3125 0.15173340012547243 1.1939911090757758 -v 0.3125 0.006478625697445839 1.5453204424737472 -v 0.3125 0.09083527107639522 1.1799316681792842 -v -0.3125 0.15173340012547243 1.1939911090757758 -v -0.3125 0.06737675474652305 1.559379883370239 -v -0.3125 0.09083527107639522 1.1799316681792842 -v -0.3125 0.006478625697445839 1.5453204424737472 -vt 0.390625 0.59375 -vt 0.546875 0.59375 -vt 0.546875 0.578125 -vt 0.390625 0.578125 -vt 0.296875 0.59375 -vt 0.390625 0.59375 -vt 0.390625 0.578125 -vt 0.296875 0.578125 -vt 0.640625 0.59375 -vt 0.796875 0.59375 -vt 0.796875 0.578125 -vt 0.640625 0.578125 -vt 0.546875 0.59375 -vt 0.640625 0.59375 -vt 0.640625 0.578125 -vt 0.546875 0.578125 -vt 0.546875 0.59375 -vt 0.390625 0.59375 -vt 0.390625 0.6875 -vt 0.546875 0.6875 -vt 0.703125 0.6875 -vt 0.546875 0.6875 -vt 0.546875 0.59375 -vt 0.703125 0.59375 -vn 0 0.224951054343865 -0.9743700647852354 -vn 1 0 0 -vn 0 -0.224951054343865 0.9743700647852354 -vn -1 0 0 -vn 0 0.9743700647852354 0.224951054343865 -vn 0 -0.9743700647852354 -0.224951054343865 -usemtl m_84be203d-dd47-5073-42d4-8589a81aedb5 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o back_fin -v 0.03125 0.7045071448143734 0.22503005919760444 -v 0.03125 0.4338742061317362 0.06878005919760444 -v 0.03125 0.5795071448143734 0.44153641014371414 -v 0.03125 0.3088742061317362 0.28528641014371414 -v -0.03125 0.4338742061317362 0.06878005919760444 -v -0.03125 0.7045071448143734 0.22503005919760444 -v -0.03125 0.3088742061317362 0.28528641014371414 -v -0.03125 0.5795071448143734 0.44153641014371414 -vt 0.875 0.921875 -vt 0.890625 0.921875 -vt 0.890625 0.859375 -vt 0.875 0.859375 -vt 0.796875 0.921875 -vt 0.875 0.921875 -vt 0.875 0.859375 -vt 0.796875 0.859375 -vt 0.96875 0.921875 -vt 0.984375 0.921875 -vt 0.984375 0.859375 -vt 0.96875 0.859375 -vt 0.890625 0.921875 -vt 0.96875 0.921875 -vt 0.96875 0.859375 -vt 0.890625 0.859375 -vt 0.890625 0.921875 -vt 0.875 0.921875 -vt 0.875 1 -vt 0.890625 1 -vt 0.90625 1 -vt 0.890625 1 -vt 0.890625 0.921875 -vt 0.90625 0.921875 -vn 0 -0.8660254037844386 -0.5000000000000001 -vn 1 0 0 -vn 0 0.8660254037844386 0.5000000000000001 -vn -1 0 0 -vn 0 0.5000000000000001 -0.8660254037844386 -vn 0 -0.5000000000000001 0.8660254037844386 -usemtl m_84be203d-dd47-5073-42d4-8589a81aedb5 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o left_fin -v -0.5939081233075358 0.0007485675108518386 0.11737888892342419 -v -0.25118856264048317 0.1055284523428025 -0.13356080198015846 -v -0.456779654809827 0.04267294763203877 0.32216689999567216 -v -0.11406009414277446 0.14745283246398944 0.07122720909208935 -v -0.2329153310953121 0.04575940509511278 -0.13356080198015846 -v -0.5756348917623646 -0.05902047973683788 0.11737888892342419 -v -0.09578686259760338 0.08768378521629971 0.07122720909208935 -v -0.438506423264656 -0.01709609961565095 0.32216689999567216 -vt 0.859375 0.578125 -vt 0.875 0.578125 -vt 0.875 0.515625 -vt 0.859375 0.515625 -vt 0.75 0.578125 -vt 0.859375 0.578125 -vt 0.859375 0.515625 -vt 0.75 0.515625 -vt 0.984375 0.578125 -vt 1 0.578125 -vt 1 0.515625 -vt 0.984375 0.515625 -vt 0.875 0.578125 -vt 0.984375 0.578125 -vt 0.984375 0.515625 -vt 0.875 0.515625 -vt 0.875 0.578125 -vt 0.859375 0.578125 -vt 0.859375 0.6875 -vt 0.875 0.6875 -vt 0.890625 0.6875 -vt 0.875 0.6875 -vt 0.875 0.578125 -vt 0.890625 0.578125 -vn 0.7833589958104059 0.23949687961588728 -0.5735764363510463 -vn -0.2923717047227367 0.9563047559630355 -8.326672684688674e-17 -vn -0.7833589958104059 -0.23949687961588728 0.5735764363510463 -vn 0.2923717047227367 -0.9563047559630355 8.326672684688674e-17 -vn -0.5485138739908348 -0.16769752048474773 -0.8191520442889918 -vn 0.5485138739908348 0.16769752048474773 0.8191520442889918 -usemtl m_84be203d-dd47-5073-42d4-8589a81aedb5 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o left_fin -v 0.5756348917623646 -0.05902047973683788 0.11737888892342419 -v 0.23291533109531204 0.04575940509511278 -0.13356080198015846 -v 0.43850642326465605 -0.01709609961565095 0.32216689999567216 -v 0.09578686259760338 0.08768378521629971 0.07122720909208935 -v 0.25118856264048317 0.1055284523428025 -0.13356080198015846 -v 0.5939081233075358 0.0007485675108518386 0.11737888892342419 -v 0.1140600941427744 0.14745283246398944 0.07122720909208935 -v 0.4567796548098271 0.04267294763203877 0.32216689999567216 -vt 0.875 0.578125 -vt 0.859375 0.578125 -vt 0.859375 0.515625 -vt 0.875 0.515625 -vt 0.984375 0.578125 -vt 0.875 0.578125 -vt 0.875 0.515625 -vt 0.984375 0.515625 -vt 1 0.578125 -vt 0.984375 0.578125 -vt 0.984375 0.515625 -vt 1 0.515625 -vt 0.859375 0.578125 -vt 0.75 0.578125 -vt 0.75 0.515625 -vt 0.859375 0.515625 -vt 0.859375 0.578125 -vt 0.875 0.578125 -vt 0.875 0.6875 -vt 0.859375 0.6875 -vt 0.875 0.6875 -vt 0.890625 0.6875 -vt 0.890625 0.578125 -vt 0.875 0.578125 -vn -0.7833589958104059 0.23949687961588728 -0.5735764363510463 -vn -0.2923717047227367 -0.9563047559630355 8.326672684688674e-17 -vn 0.7833589958104059 -0.23949687961588728 0.5735764363510463 -vn 0.2923717047227367 0.9563047559630355 -8.326672684688674e-17 -vn 0.5485138739908348 -0.16769752048474773 -0.8191520442889918 -vn -0.5485138739908348 0.16769752048474773 0.8191520442889918 -usemtl m_84be203d-dd47-5073-42d4-8589a81aedb5 -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/ender_dragon.obj b/renderer/viewer/three/entity/models/ender_dragon.obj deleted file mode 100644 index 84c909a9..00000000 --- a/renderer/viewer/three/entity/models/ender_dragon.obj +++ /dev/null @@ -1,2993 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o neck -v 0.3125 0.7488108431536706 -0.47276383039135683 -v 0.3125 0.803283182370957 -1.0953855166986979 -v 0.3125 0.1261891568463296 -0.5272361696086432 -v 0.3125 0.18066149606361592 -1.1498578559159842 -v -0.3125 0.803283182370957 -1.0953855166986979 -v -0.3125 0.7488108431536706 -0.47276383039135683 -v -0.3125 0.18066149606361592 -1.1498578559159842 -v -0.3125 0.1261891568463296 -0.5272361696086432 -vt 0.7890625 0.5546875 -vt 0.828125 0.5546875 -vt 0.828125 0.515625 -vt 0.7890625 0.515625 -vt 0.75 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.515625 -vt 0.75 0.515625 -vt 0.8671875 0.5546875 -vt 0.90625 0.5546875 -vt 0.90625 0.515625 -vt 0.8671875 0.515625 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vt 0.8671875 0.515625 -vt 0.828125 0.515625 -vt 0.828125 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.59375 -vt 0.828125 0.59375 -vt 0.8671875 0.59375 -vt 0.828125 0.59375 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vn 0 0.08715574274765818 -0.9961946980917455 -vn 1 0 0 -vn 0 -0.08715574274765818 0.9961946980917455 -vn -1 0 0 -vn 0 0.9961946980917455 0.08715574274765818 -vn 0 -0.9961946980917455 -0.08715574274765818 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o neck -v 0.0625 1.0087539855200642 -0.5754992319659105 -v 0.0625 1.041437389050436 -0.9490722437503151 -v 0.0625 0.7597053109971279 -0.597288167652825 -v 0.0625 0.7923887145274997 -0.9708611794372296 -v -0.0625 1.041437389050436 -0.9490722437503151 -v -0.0625 1.0087539855200642 -0.5754992319659105 -v -0.0625 0.7923887145274997 -0.9708611794372296 -v -0.0625 0.7597053109971279 -0.597288167652825 -vt 0.2109375 0.9765625 -vt 0.21875 0.9765625 -vt 0.21875 0.9609375 -vt 0.2109375 0.9609375 -vt 0.1875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 0.9609375 -vt 0.1875 0.9609375 -vt 0.2421875 0.9765625 -vt 0.25 0.9765625 -vt 0.25 0.9609375 -vt 0.2421875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2421875 0.9765625 -vt 0.2421875 0.9609375 -vt 0.21875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 1 -vt 0.21875 1 -vt 0.2265625 1 -vt 0.21875 1 -vt 0.21875 0.9765625 -vt 0.2265625 0.9765625 -vn 0 0.08715574274765818 -0.9961946980917455 -vn 1 0 0 -vn 0 -0.08715574274765818 0.9961946980917455 -vn -1 0 0 -vn 0 0.9961946980917455 0.08715574274765818 -vn 0 -0.9961946980917455 -0.08715574274765818 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o neck -v 0.3125 0.8044723392172863 -1.1226216863073408 -v 0.3125 0.8044723392172863 -1.7476216863073408 -v 0.3125 0.17947233921728634 -1.1226216863073408 -v 0.3125 0.17947233921728634 -1.7476216863073408 -v -0.3125 0.8044723392172863 -1.7476216863073408 -v -0.3125 0.8044723392172863 -1.1226216863073408 -v -0.3125 0.17947233921728634 -1.7476216863073408 -v -0.3125 0.17947233921728634 -1.1226216863073408 -vt 0.7890625 0.5546875 -vt 0.828125 0.5546875 -vt 0.828125 0.515625 -vt 0.7890625 0.515625 -vt 0.75 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.515625 -vt 0.75 0.515625 -vt 0.8671875 0.5546875 -vt 0.90625 0.5546875 -vt 0.90625 0.515625 -vt 0.8671875 0.515625 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vt 0.8671875 0.515625 -vt 0.828125 0.515625 -vt 0.828125 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.59375 -vt 0.828125 0.59375 -vt 0.8671875 0.59375 -vt 0.828125 0.59375 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o neck -v 0.0625 1.0544723392172863 -1.2476216863073408 -v 0.0625 1.0544723392172863 -1.6226216863073408 -v 0.0625 0.8044723392172863 -1.2476216863073408 -v 0.0625 0.8044723392172863 -1.6226216863073408 -v -0.0625 1.0544723392172863 -1.6226216863073408 -v -0.0625 1.0544723392172863 -1.2476216863073408 -v -0.0625 0.8044723392172863 -1.6226216863073408 -v -0.0625 0.8044723392172863 -1.2476216863073408 -vt 0.2109375 0.9765625 -vt 0.21875 0.9765625 -vt 0.21875 0.9609375 -vt 0.2109375 0.9609375 -vt 0.1875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 0.9609375 -vt 0.1875 0.9609375 -vt 0.2421875 0.9765625 -vt 0.25 0.9765625 -vt 0.25 0.9609375 -vt 0.2421875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2421875 0.9765625 -vt 0.2421875 0.9609375 -vt 0.21875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 1 -vt 0.21875 1 -vt 0.2265625 1 -vt 0.21875 1 -vt 0.21875 0.9765625 -vt 0.2265625 0.9765625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o neck -v 0.3125 0.803283182370957 -1.774857855915984 -v 0.3125 0.7488108431536706 -2.3974795422233246 -v 0.3125 0.18066149606361592 -1.7203855166986977 -v 0.3125 0.12618915684632948 -2.3430072030060387 -v -0.3125 0.7488108431536706 -2.3974795422233246 -v -0.3125 0.803283182370957 -1.774857855915984 -v -0.3125 0.12618915684632948 -2.3430072030060387 -v -0.3125 0.18066149606361592 -1.7203855166986977 -vt 0.7890625 0.5546875 -vt 0.828125 0.5546875 -vt 0.828125 0.515625 -vt 0.7890625 0.515625 -vt 0.75 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.515625 -vt 0.75 0.515625 -vt 0.8671875 0.5546875 -vt 0.90625 0.5546875 -vt 0.90625 0.515625 -vt 0.8671875 0.515625 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vt 0.8671875 0.515625 -vt 0.828125 0.515625 -vt 0.828125 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.59375 -vt 0.828125 0.59375 -vt 0.8671875 0.59375 -vt 0.828125 0.59375 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vn 0 -0.08715574274765818 -0.9961946980917455 -vn 1 0 0 -vn 0 0.08715574274765818 0.9961946980917455 -vn -1 0 0 -vn 0 0.9961946980917455 -0.08715574274765818 -vn 0 -0.9961946980917455 0.08715574274765818 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o neck -v 0.0625 1.041437389050436 -1.9211711288643667 -v 0.0625 1.0087539855200642 -2.2947441406487714 -v 0.0625 0.7923887145274997 -1.8993821931774522 -v 0.0625 0.7597053109971279 -2.272955204961857 -v -0.0625 1.0087539855200642 -2.2947441406487714 -v -0.0625 1.041437389050436 -1.9211711288643667 -v -0.0625 0.7597053109971279 -2.272955204961857 -v -0.0625 0.7923887145274997 -1.8993821931774522 -vt 0.2109375 0.9765625 -vt 0.21875 0.9765625 -vt 0.21875 0.9609375 -vt 0.2109375 0.9609375 -vt 0.1875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 0.9609375 -vt 0.1875 0.9609375 -vt 0.2421875 0.9765625 -vt 0.25 0.9765625 -vt 0.25 0.9609375 -vt 0.2421875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2421875 0.9765625 -vt 0.2421875 0.9609375 -vt 0.21875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 1 -vt 0.21875 1 -vt 0.2265625 1 -vt 0.21875 1 -vt 0.21875 0.9765625 -vt 0.2265625 0.9765625 -vn 0 -0.08715574274765818 -0.9961946980917455 -vn 1 0 0 -vn 0 0.08715574274765818 0.9961946980917455 -vn -1 0 0 -vn 0 0.9961946980917455 -0.08715574274765818 -vn 0 -0.9961946980917455 0.08715574274765818 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o neck -v 0.3125 0.7452524228163151 -2.424508428135597 -v 0.3125 0.6367223117744836 -3.0400132737682273 -v 0.3125 0.1297475771836849 -2.315978317093766 -v 0.3125 0.02121746614185338 -2.931483162726396 -v -0.3125 0.6367223117744836 -3.0400132737682273 -v -0.3125 0.7452524228163151 -2.424508428135597 -v -0.3125 0.02121746614185338 -2.931483162726396 -v -0.3125 0.1297475771836849 -2.315978317093766 -vt 0.7890625 0.5546875 -vt 0.828125 0.5546875 -vt 0.828125 0.515625 -vt 0.7890625 0.515625 -vt 0.75 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.515625 -vt 0.75 0.515625 -vt 0.8671875 0.5546875 -vt 0.90625 0.5546875 -vt 0.90625 0.515625 -vt 0.8671875 0.515625 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vt 0.8671875 0.515625 -vt 0.828125 0.515625 -vt 0.828125 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.59375 -vt 0.828125 0.59375 -vt 0.8671875 0.59375 -vt 0.828125 0.59375 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vn 0 -0.17364817766693036 -0.9848077530122081 -vn 1 0 0 -vn 0 0.17364817766693036 0.9848077530122081 -vn -1 0 0 -vn 0 0.9848077530122081 -0.17364817766693036 -vn 0 -0.9848077530122081 0.17364817766693036 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o neck -v 0.0625 0.9697483388610009 -2.591021441678856 -v 0.0625 0.9046302722359019 -2.960324349058434 -v 0.0625 0.7235464006079488 -2.5476093972621237 -v 0.0625 0.6584283339828498 -2.9169123046417016 -v -0.0625 0.9046302722359019 -2.960324349058434 -v -0.0625 0.9697483388610009 -2.591021441678856 -v -0.0625 0.6584283339828498 -2.9169123046417016 -v -0.0625 0.7235464006079488 -2.5476093972621237 -vt 0.2109375 0.9765625 -vt 0.21875 0.9765625 -vt 0.21875 0.9609375 -vt 0.2109375 0.9609375 -vt 0.1875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 0.9609375 -vt 0.1875 0.9609375 -vt 0.2421875 0.9765625 -vt 0.25 0.9765625 -vt 0.25 0.9609375 -vt 0.2421875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2421875 0.9765625 -vt 0.2421875 0.9609375 -vt 0.21875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 1 -vt 0.21875 1 -vt 0.2265625 1 -vt 0.21875 1 -vt 0.21875 0.9765625 -vt 0.2265625 0.9765625 -vn 0 -0.17364817766693036 -0.9848077530122081 -vn 1 0 0 -vn 0 0.17364817766693036 0.9848077530122081 -vn -1 0 0 -vn 0 0.9848077530122081 -0.17364817766693036 -vn 0 -0.9848077530122081 0.17364817766693036 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o neck -v 0.3125 0.6308217096735025 -3.0666291698418497 -v 0.3125 0.469059806484427 -3.670332811272517 -v 0.3125 0.027118068242834803 -2.904867266652774 -v 0.3125 -0.13464383494624066 -3.5085709080834415 -v -0.3125 0.469059806484427 -3.670332811272517 -v -0.3125 0.6308217096735025 -3.0666291698418497 -v -0.3125 -0.13464383494624066 -3.5085709080834415 -v -0.3125 0.027118068242834803 -2.904867266652774 -vt 0.7890625 0.5546875 -vt 0.828125 0.5546875 -vt 0.828125 0.515625 -vt 0.7890625 0.515625 -vt 0.75 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.515625 -vt 0.75 0.515625 -vt 0.8671875 0.5546875 -vt 0.90625 0.5546875 -vt 0.90625 0.515625 -vt 0.8671875 0.515625 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vt 0.8671875 0.515625 -vt 0.828125 0.515625 -vt 0.828125 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.59375 -vt 0.828125 0.59375 -vt 0.8671875 0.59375 -vt 0.828125 0.59375 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vn 0 -0.25881904510252074 -0.9659258262890683 -vn 1 0 0 -vn 0 0.25881904510252074 0.9659258262890683 -vn -1 0 0 -vn 0 0.9659258262890683 -0.25881904510252074 -vn 0 -0.9659258262890683 0.25881904510252074 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o neck -v 0.0625 0.8399507856079544 -3.252074659403613 -v 0.0625 0.7428936436945093 -3.6142968442620136 -v 0.0625 0.5984693290356873 -3.187369898127983 -v 0.0625 0.5014121871222421 -3.5495920829863836 -v -0.0625 0.7428936436945093 -3.6142968442620136 -v -0.0625 0.8399507856079544 -3.252074659403613 -v -0.0625 0.5014121871222421 -3.5495920829863836 -v -0.0625 0.5984693290356873 -3.187369898127983 -vt 0.2109375 0.9765625 -vt 0.21875 0.9765625 -vt 0.21875 0.9609375 -vt 0.2109375 0.9609375 -vt 0.1875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 0.9609375 -vt 0.1875 0.9609375 -vt 0.2421875 0.9765625 -vt 0.25 0.9765625 -vt 0.25 0.9609375 -vt 0.2421875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2421875 0.9765625 -vt 0.2421875 0.9609375 -vt 0.21875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 1 -vt 0.21875 1 -vt 0.2265625 1 -vt 0.21875 1 -vt 0.21875 0.9765625 -vt 0.2265625 0.9765625 -vn 0 -0.25881904510252074 -0.9659258262890683 -vn 1 0 0 -vn 0 0.25881904510252074 0.9659258262890683 -vn -1 0 0 -vn 0 0.9659258262890683 -0.25881904510252074 -vn 0 -0.9659258262890683 0.25881904510252074 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o head -v 0.375 -0.07332885084174778 -4.433059161823504 -v 0.375 -0.41534899416741644 -5.372751782609413 -v 0.375 -0.3669827948373441 -4.326177867034232 -v 0.375 -0.7090029381630127 -5.265870487820141 -v -0.375 -0.41534899416741644 -5.372751782609413 -v -0.375 -0.07332885084174778 -4.433059161823504 -v -0.375 -0.7090029381630127 -5.265870487820141 -v -0.375 -0.3669827948373441 -4.326177867034232 -vt 0.75 0.765625 -vt 0.796875 0.765625 -vt 0.796875 0.74609375 -vt 0.75 0.74609375 -vt 0.6875 0.765625 -vt 0.75 0.765625 -vt 0.75 0.74609375 -vt 0.6875 0.74609375 -vt 0.859375 0.765625 -vt 0.90625 0.765625 -vt 0.90625 0.74609375 -vt 0.859375 0.74609375 -vt 0.796875 0.765625 -vt 0.859375 0.765625 -vt 0.859375 0.74609375 -vt 0.796875 0.74609375 -vt 0.796875 0.765625 -vt 0.75 0.765625 -vt 0.75 0.828125 -vt 0.796875 0.828125 -vt 0.84375 0.828125 -vt 0.796875 0.828125 -vt 0.796875 0.765625 -vt 0.84375 0.765625 -vn 0 -0.34202014332566877 -0.9396926207859084 -vn 1 0 0 -vn 0 0.34202014332566877 0.9396926207859084 -vn -1 0 0 -vn 0 0.9396926207859084 -0.34202014332566877 -vn 0 -0.9396926207859084 0.34202014332566877 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 -o head -v 0.5 0.6370542961620473 -3.760461931340814 -v 0.5 0.2950341528363787 -4.7001545521267225 -v 0.5 -0.3026383246238611 -3.418441788015145 -v 0.5 -0.6446584679495297 -4.358134408801053 -v -0.5 0.2950341528363787 -4.7001545521267225 -v -0.5 0.6370542961620473 -3.760461931340814 -v -0.5 -0.6446584679495297 -4.358134408801053 -v -0.5 -0.3026383246238611 -3.418441788015145 -vt 0.5 0.8203125 -vt 0.5625 0.8203125 -vt 0.5625 0.7578125 -vt 0.5 0.7578125 -vt 0.4375 0.8203125 -vt 0.5 0.8203125 -vt 0.5 0.7578125 -vt 0.4375 0.7578125 -vt 0.625 0.8203125 -vt 0.6875 0.8203125 -vt 0.6875 0.7578125 -vt 0.625 0.7578125 -vt 0.5625 0.8203125 -vt 0.625 0.8203125 -vt 0.625 0.7578125 -vt 0.5625 0.7578125 -vt 0.5625 0.8203125 -vt 0.5 0.8203125 -vt 0.5 0.8828125 -vt 0.5625 0.8828125 -vt 0.625 0.8828125 -vt 0.5625 0.8828125 -vt 0.5625 0.8203125 -vt 0.625 0.8203125 -vn 0 -0.34202014332566877 -0.9396926207859084 -vn 1 0 0 -vn 0 0.34202014332566877 0.9396926207859084 -vn -1 0 0 -vn 0 0.9396926207859084 -0.34202014332566877 -vn 0 -0.9396926207859084 0.34202014332566877 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 92/268/67 95/267/67 93/266/67 90/265/67 -f 91/272/68 92/271/68 90/270/68 89/269/68 -f 96/276/69 91/275/69 89/274/69 94/273/69 -f 95/280/70 96/279/70 94/278/70 93/277/70 -f 94/284/71 89/283/71 90/282/71 93/281/71 -f 95/288/72 92/287/72 91/286/72 96/285/72 -o head -v 0.3125 0.7864724155271074 -4.080890122368709 -v 0.3125 0.6582148617799817 -4.433274855163424 -v 0.3125 0.5515492603306302 -3.9953850865372913 -v 0.3125 0.42329170658350446 -4.347769819332006 -v 0.1875 0.6582148617799817 -4.433274855163424 -v 0.1875 0.7864724155271074 -4.080890122368709 -v 0.1875 0.42329170658350446 -4.347769819332006 -v 0.1875 0.5515492603306302 -3.9953850865372913 -vt 0.03125 0.9765625 -vt 0.0234375 0.9765625 -vt 0.0234375 0.9609375 -vt 0.03125 0.9609375 -vt 0.0546875 0.9765625 -vt 0.03125 0.9765625 -vt 0.03125 0.9609375 -vt 0.0546875 0.9609375 -vt 0.0625 0.9765625 -vt 0.0546875 0.9765625 -vt 0.0546875 0.9609375 -vt 0.0625 0.9609375 -vt 0.0234375 0.9765625 -vt 0 0.9765625 -vt 0 0.9609375 -vt 0.0234375 0.9609375 -vt 0.0234375 0.9765625 -vt 0.03125 0.9765625 -vt 0.03125 1 -vt 0.0234375 1 -vt 0.03125 1 -vt 0.0390625 1 -vt 0.0390625 0.9765625 -vt 0.03125 0.9765625 -vn 0 -0.34202014332566877 -0.9396926207859084 -vn 1 0 0 -vn 0 0.34202014332566877 0.9396926207859084 -vn -1 0 0 -vn 0 0.9396926207859084 -0.34202014332566877 -vn 0 -0.9396926207859084 0.34202014332566877 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 100/292/73 103/291/73 101/290/73 98/289/73 -f 99/296/74 100/295/74 98/294/74 97/293/74 -f 104/300/75 99/299/75 97/298/75 102/297/75 -f 103/304/76 104/303/76 102/302/76 101/301/76 -f 102/308/77 97/307/77 98/306/77 101/305/77 -f 103/312/78 100/311/78 99/310/78 104/309/78 -o head -v 0.3125 -0.16962986282205206 -5.063119567730405 -v 0.3125 -0.2551348986534694 -5.298042722926883 -v 0.3125 -0.28709144042029067 -5.020367049814697 -v 0.3125 -0.372596476251708 -5.255290205011175 -v 0.1875 -0.2551348986534694 -5.298042722926883 -v 0.1875 -0.16962986282205206 -5.063119567730405 -v 0.1875 -0.372596476251708 -5.255290205011175 -v 0.1875 -0.28709144042029067 -5.020367049814697 -vt 0.4609375 0.984375 -vt 0.453125 0.984375 -vt 0.453125 0.9765625 -vt 0.4609375 0.9765625 -vt 0.4765625 0.984375 -vt 0.4609375 0.984375 -vt 0.4609375 0.9765625 -vt 0.4765625 0.9765625 -vt 0.484375 0.984375 -vt 0.4765625 0.984375 -vt 0.4765625 0.9765625 -vt 0.484375 0.9765625 -vt 0.453125 0.984375 -vt 0.4375 0.984375 -vt 0.4375 0.9765625 -vt 0.453125 0.9765625 -vt 0.453125 0.984375 -vt 0.4609375 0.984375 -vt 0.4609375 1 -vt 0.453125 1 -vt 0.4609375 1 -vt 0.46875 1 -vt 0.46875 0.984375 -vt 0.4609375 0.984375 -vn 0 -0.34202014332566877 -0.9396926207859084 -vn 1 0 0 -vn 0 0.34202014332566877 0.9396926207859084 -vn -1 0 0 -vn 0 0.9396926207859084 -0.34202014332566877 -vn 0 -0.9396926207859084 0.34202014332566877 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 108/316/79 111/315/79 109/314/79 106/313/79 -f 107/320/80 108/319/80 106/318/80 105/317/80 -f 112/324/81 107/323/81 105/322/81 110/321/81 -f 111/328/82 112/327/82 110/326/82 109/325/82 -f 110/332/83 105/331/83 106/330/83 109/329/83 -f 111/336/84 108/335/84 107/334/84 112/333/84 -o head -v -0.1875 0.7864724155271074 -4.080890122368709 -v -0.1875 0.6582148617799817 -4.433274855163424 -v -0.1875 0.5515492603306302 -3.9953850865372913 -v -0.1875 0.42329170658350446 -4.347769819332006 -v -0.3125 0.6582148617799817 -4.433274855163424 -v -0.3125 0.7864724155271074 -4.080890122368709 -v -0.3125 0.42329170658350446 -4.347769819332006 -v -0.3125 0.5515492603306302 -3.9953850865372913 -vt 0.0234375 0.9765625 -vt 0.03125 0.9765625 -vt 0.03125 0.9609375 -vt 0.0234375 0.9609375 -vt 0 0.9765625 -vt 0.0234375 0.9765625 -vt 0.0234375 0.9609375 -vt 0 0.9609375 -vt 0.0546875 0.9765625 -vt 0.0625 0.9765625 -vt 0.0625 0.9609375 -vt 0.0546875 0.9609375 -vt 0.03125 0.9765625 -vt 0.0546875 0.9765625 -vt 0.0546875 0.9609375 -vt 0.03125 0.9609375 -vt 0.03125 0.9765625 -vt 0.0234375 0.9765625 -vt 0.0234375 1 -vt 0.03125 1 -vt 0.0390625 1 -vt 0.03125 1 -vt 0.03125 0.9765625 -vt 0.0390625 0.9765625 -vn 0 -0.34202014332566877 -0.9396926207859084 -vn 1 0 0 -vn 0 0.34202014332566877 0.9396926207859084 -vn -1 0 0 -vn 0 0.9396926207859084 -0.34202014332566877 -vn 0 -0.9396926207859084 0.34202014332566877 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 116/340/85 119/339/85 117/338/85 114/337/85 -f 115/344/86 116/343/86 114/342/86 113/341/86 -f 120/348/87 115/347/87 113/346/87 118/345/87 -f 119/352/88 120/351/88 118/350/88 117/349/88 -f 118/356/89 113/355/89 114/354/89 117/353/89 -f 119/360/90 116/359/90 115/358/90 120/357/90 -o head -v -0.1875 -0.16962986282205206 -5.063119567730405 -v -0.1875 -0.2551348986534694 -5.298042722926883 -v -0.1875 -0.28709144042029067 -5.020367049814697 -v -0.1875 -0.372596476251708 -5.255290205011175 -v -0.3125 -0.2551348986534694 -5.298042722926883 -v -0.3125 -0.16962986282205206 -5.063119567730405 -v -0.3125 -0.372596476251708 -5.255290205011175 -v -0.3125 -0.28709144042029067 -5.020367049814697 -vt 0.453125 0.984375 -vt 0.4609375 0.984375 -vt 0.4609375 0.9765625 -vt 0.453125 0.9765625 -vt 0.4375 0.984375 -vt 0.453125 0.984375 -vt 0.453125 0.9765625 -vt 0.4375 0.9765625 -vt 0.4765625 0.984375 -vt 0.484375 0.984375 -vt 0.484375 0.9765625 -vt 0.4765625 0.9765625 -vt 0.4609375 0.984375 -vt 0.4765625 0.984375 -vt 0.4765625 0.9765625 -vt 0.4609375 0.9765625 -vt 0.4609375 0.984375 -vt 0.453125 0.984375 -vt 0.453125 1 -vt 0.4609375 1 -vt 0.46875 1 -vt 0.4609375 1 -vt 0.4609375 0.984375 -vt 0.46875 0.984375 -vn 0 -0.34202014332566877 -0.9396926207859084 -vn 1 0 0 -vn 0 0.34202014332566877 0.9396926207859084 -vn -1 0 0 -vn 0 0.9396926207859084 -0.34202014332566877 -vn 0 -0.9396926207859084 0.34202014332566877 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 124/364/91 127/363/91 125/362/91 122/361/91 -f 123/368/92 124/367/92 122/366/92 121/365/92 -f 128/372/93 123/371/93 121/370/93 126/369/93 -f 127/376/94 128/375/94 126/374/94 125/373/94 -f 126/380/95 121/379/95 122/378/95 125/377/95 -f 127/384/96 124/383/96 123/382/96 128/381/96 -o jaw -v 0.375 -0.3814550631514302 -4.318644081003175 -v 0.375 -0.9550314995024762 -5.137796125292168 -v 0.375 -0.5862430742236779 -4.175249971915413 -v 0.375 -1.159819510574724 -4.994402016204406 -v -0.375 -0.9550314995024762 -5.137796125292168 -v -0.375 -0.3814550631514302 -4.318644081003175 -v -0.375 -1.159819510574724 -4.994402016204406 -v -0.375 -0.5862430742236779 -4.175249971915413 -vt 0.75 0.68359375 -vt 0.796875 0.68359375 -vt 0.796875 0.66796875 -vt 0.75 0.66796875 -vt 0.6875 0.68359375 -vt 0.75 0.68359375 -vt 0.75 0.66796875 -vt 0.6875 0.66796875 -vt 0.859375 0.68359375 -vt 0.90625 0.68359375 -vt 0.90625 0.66796875 -vt 0.859375 0.66796875 -vt 0.796875 0.68359375 -vt 0.859375 0.68359375 -vt 0.859375 0.66796875 -vt 0.796875 0.66796875 -vt 0.796875 0.68359375 -vt 0.75 0.68359375 -vt 0.75 0.74609375 -vt 0.796875 0.74609375 -vt 0.84375 0.74609375 -vt 0.796875 0.74609375 -vt 0.796875 0.68359375 -vt 0.84375 0.68359375 -vn 0 -0.5735764363510462 -0.8191520442889919 -vn 1 0 0 -vn 0 0.5735764363510462 0.8191520442889919 -vn -1 0 0 -vn 0 0.8191520442889919 -0.5735764363510462 -vn 0 -0.8191520442889919 0.5735764363510462 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 132/388/97 135/387/97 133/386/97 130/385/97 -f 131/392/98 132/391/98 130/390/98 129/389/98 -f 136/396/99 131/395/99 129/394/99 134/393/99 -f 135/400/100 136/399/100 134/398/100 133/397/100 -f 134/404/101 129/403/101 130/402/101 133/401/101 -f 135/408/102 132/407/102 131/406/102 136/405/102 -o body -v 0.75 1.25 3.5 -v 0.75 1.25 -0.5 -v 0.75 -0.25 3.5 -v 0.75 -0.25 -0.5 -v -0.75 1.25 -0.5 -v -0.75 1.25 3.5 -v -0.75 -0.25 -0.5 -v -0.75 -0.25 3.5 -vt 0.25 0.75 -vt 0.34375 0.75 -vt 0.34375 0.65625 -vt 0.25 0.65625 -vt 0 0.75 -vt 0.25 0.75 -vt 0.25 0.65625 -vt 0 0.65625 -vt 0.59375 0.75 -vt 0.6875 0.75 -vt 0.6875 0.65625 -vt 0.59375 0.65625 -vt 0.34375 0.75 -vt 0.59375 0.75 -vt 0.59375 0.65625 -vt 0.34375 0.65625 -vt 0.34375 0.75 -vt 0.25 0.75 -vt 0.25 1 -vt 0.34375 1 -vt 0.4375 1 -vt 0.34375 1 -vt 0.34375 0.75 -vt 0.4375 0.75 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 140/412/103 143/411/103 141/410/103 138/409/103 -f 139/416/104 140/415/104 138/414/104 137/413/104 -f 144/420/105 139/419/105 137/418/105 142/417/105 -f 143/424/106 144/423/106 142/422/106 141/421/106 -f 142/428/107 137/427/107 138/426/107 141/425/107 -f 143/432/108 140/431/108 139/430/108 144/429/108 -o body -v 0.0625 1.625 0.625 -v 0.0625 1.625 -0.125 -v 0.0625 1.25 0.625 -v 0.0625 1.25 -0.125 -v -0.0625 1.625 -0.125 -v -0.0625 1.625 0.625 -v -0.0625 1.25 -0.125 -v -0.0625 1.25 0.625 -vt 0.90625 0.74609375 -vt 0.9140625 0.74609375 -vt 0.9140625 0.72265625 -vt 0.90625 0.72265625 -vt 0.859375 0.74609375 -vt 0.90625 0.74609375 -vt 0.90625 0.72265625 -vt 0.859375 0.72265625 -vt 0.9609375 0.74609375 -vt 0.96875 0.74609375 -vt 0.96875 0.72265625 -vt 0.9609375 0.72265625 -vt 0.9140625 0.74609375 -vt 0.9609375 0.74609375 -vt 0.9609375 0.72265625 -vt 0.9140625 0.72265625 -vt 0.9140625 0.74609375 -vt 0.90625 0.74609375 -vt 0.90625 0.79296875 -vt 0.9140625 0.79296875 -vt 0.921875 0.79296875 -vt 0.9140625 0.79296875 -vt 0.9140625 0.74609375 -vt 0.921875 0.74609375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 148/436/109 151/435/109 149/434/109 146/433/109 -f 147/440/110 148/439/110 146/438/110 145/437/110 -f 152/444/111 147/443/111 145/442/111 150/441/111 -f 151/448/112 152/447/112 150/446/112 149/445/112 -f 150/452/113 145/451/113 146/450/113 149/449/113 -f 151/456/114 148/455/114 147/454/114 152/453/114 -o body -v 0.0625 1.625 1.875 -v 0.0625 1.625 1.125 -v 0.0625 1.25 1.875 -v 0.0625 1.25 1.125 -v -0.0625 1.625 1.125 -v -0.0625 1.625 1.875 -v -0.0625 1.25 1.125 -v -0.0625 1.25 1.875 -vt 0.90625 0.74609375 -vt 0.9140625 0.74609375 -vt 0.9140625 0.72265625 -vt 0.90625 0.72265625 -vt 0.859375 0.74609375 -vt 0.90625 0.74609375 -vt 0.90625 0.72265625 -vt 0.859375 0.72265625 -vt 0.9609375 0.74609375 -vt 0.96875 0.74609375 -vt 0.96875 0.72265625 -vt 0.9609375 0.72265625 -vt 0.9140625 0.74609375 -vt 0.9609375 0.74609375 -vt 0.9609375 0.72265625 -vt 0.9140625 0.72265625 -vt 0.9140625 0.74609375 -vt 0.90625 0.74609375 -vt 0.90625 0.79296875 -vt 0.9140625 0.79296875 -vt 0.921875 0.79296875 -vt 0.9140625 0.79296875 -vt 0.9140625 0.74609375 -vt 0.921875 0.74609375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 156/460/115 159/459/115 157/458/115 154/457/115 -f 155/464/116 156/463/116 154/462/116 153/461/116 -f 160/468/117 155/467/117 153/466/117 158/465/117 -f 159/472/118 160/471/118 158/470/118 157/469/118 -f 158/476/119 153/475/119 154/474/119 157/473/119 -f 159/480/120 156/479/120 155/478/120 160/477/120 -o body -v 0.0625 1.625 3.125 -v 0.0625 1.625 2.375 -v 0.0625 1.25 3.125 -v 0.0625 1.25 2.375 -v -0.0625 1.625 2.375 -v -0.0625 1.625 3.125 -v -0.0625 1.25 2.375 -v -0.0625 1.25 3.125 -vt 0.90625 0.74609375 -vt 0.9140625 0.74609375 -vt 0.9140625 0.72265625 -vt 0.90625 0.72265625 -vt 0.859375 0.74609375 -vt 0.90625 0.74609375 -vt 0.90625 0.72265625 -vt 0.859375 0.72265625 -vt 0.9609375 0.74609375 -vt 0.96875 0.74609375 -vt 0.96875 0.72265625 -vt 0.9609375 0.72265625 -vt 0.9140625 0.74609375 -vt 0.9609375 0.74609375 -vt 0.9609375 0.72265625 -vt 0.9140625 0.72265625 -vt 0.9140625 0.74609375 -vt 0.90625 0.74609375 -vt 0.90625 0.79296875 -vt 0.9140625 0.79296875 -vt 0.921875 0.79296875 -vt 0.9140625 0.79296875 -vt 0.9140625 0.74609375 -vt 0.921875 0.74609375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 164/484/121 167/483/121 165/482/121 162/481/121 -f 163/488/122 164/487/122 162/486/122 161/485/122 -f 168/492/123 163/491/123 161/490/123 166/489/123 -f 167/496/124 168/495/124 166/494/124 165/493/124 -f 166/500/125 161/499/125 162/498/125 165/497/125 -f 167/504/126 164/503/126 163/502/126 168/501/126 -o wing -v 4.0582975240428985 2.024698766671211 0.9789705600873082 -v 4.143802559874316 2.039775611474734 0.48656668358120414 -v 4.1451216128763635 1.5322948901651068 0.9789705600873082 -v 4.230626648707781 1.5473717349686296 0.48656668358120414 -v 0.7493404734989761 1.4412403606548134 -0.12120193825305198 -v 0.6638354376675588 1.4261635158512906 0.37120193825305203 -v 0.8361645623324412 0.9488364841487094 -0.12120193825305198 -v 0.7506595265010241 0.9337596393451866 0.37120193825305203 -vt 0.46875 0.625 -vt 0.6875 0.625 -vt 0.6875 0.59375 -vt 0.46875 0.59375 -vt 0.4375 0.625 -vt 0.46875 0.625 -vt 0.46875 0.59375 -vt 0.4375 0.59375 -vt 0.71875 0.625 -vt 0.9375 0.625 -vt 0.9375 0.59375 -vt 0.71875 0.59375 -vt 0.6875 0.625 -vt 0.71875 0.625 -vt 0.71875 0.59375 -vt 0.6875 0.59375 -vt 0.6875 0.625 -vt 0.46875 0.625 -vt 0.46875 0.65625 -vt 0.6875 0.65625 -vt 0.90625 0.65625 -vt 0.6875 0.65625 -vt 0.6875 0.625 -vt 0.90625 0.625 -vn 0.17101007166283433 0.030153689607045803 -0.984807753012208 -vn 0.9698463103929543 0.17101007166283436 0.17364817766693036 -vn -0.17101007166283433 -0.030153689607045803 0.984807753012208 -vn -0.9698463103929543 -0.17101007166283436 -0.17364817766693036 -vn -0.17364817766693033 0.984807753012208 0 -vn 0.17364817766693033 -0.984807753012208 0 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 172/508/127 175/507/127 173/506/127 170/505/127 -f 171/512/128 172/511/128 170/510/128 169/509/128 -f 176/516/129 171/515/129 169/514/129 174/513/129 -f 175/520/130 176/519/130 174/518/130 173/517/130 -f 174/524/131 169/523/131 170/522/131 173/521/131 -f 175/528/132 172/527/132 171/526/132 176/525/132 -o wing -v 3.5249413191357313 1.677431666078797 4.303420761460185 -v 4.123690332545229 1.7830072718154657 0.8553626162261914 -v 3.525158379357814 1.6762006563875311 4.303420761460185 -v 4.123907392767313 1.7817762621242004 0.8553626162261914 -v 0.7280159382818976 1.184258258405967 0.24737693416985151 -v 0.12926692487239855 1.0786826526692979 3.695435079403845 -v 0.728232998503981 1.1830272487147016 0.24737693416985151 -v 0.12948398509448222 1.0774516429780323 3.695435079403845 -vt 0 0.4375 -vt 0.21875 0.4375 -vt 0.21875 0.4375 -vt 0 0.4375 -vt -0.21875 0.4375 -vt 0 0.4375 -vt 0 0.4375 -vt -0.21875 0.4375 -vt 0.4375 0.4375 -vt 0.65625 0.4375 -vt 0.65625 0.4375 -vt 0.4375 0.4375 -vt 0.21875 0.4375 -vt 0.4375 0.4375 -vt 0.4375 0.4375 -vt 0.21875 0.4375 -vt 0.21875 0.4375 -vt 0 0.4375 -vt 0 0.65625 -vt 0.21875 0.65625 -vt 0.4375 0.65625 -vt 0.21875 0.65625 -vt 0.21875 0.4375 -vt 0.4375 0.4375 -vn 0.17101007166283433 0.030153689607045803 -0.984807753012208 -vn 0.9698463103929543 0.17101007166283436 0.17364817766693036 -vn -0.17101007166283433 -0.030153689607045803 0.984807753012208 -vn -0.9698463103929543 -0.17101007166283436 -0.17364817766693036 -vn -0.17364817766693033 0.984807753012208 0 -vn 0.17364817766693033 -0.984807753012208 0 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 180/532/133 183/531/133 181/530/133 178/529/133 -f 179/536/134 180/535/134 178/534/134 177/533/134 -f 184/540/135 179/539/135 177/538/135 182/537/135 -f 183/544/136 184/543/136 182/542/136 181/541/136 -f 182/548/137 177/547/137 178/546/137 181/545/137 -f 183/552/138 180/551/138 179/550/138 184/549/138 -o wingtip -v 7.541772295535269 1.2888090706299558 1.4344091768703897 -v 7.584524813450978 1.2963474930317171 1.1882072386173377 -v 7.499639529805786 1.0428327037253111 1.4195613832169185 -v 7.542392047721496 1.0503711261270725 1.1733594449638665 -v 4.186904728197936 1.912792645473123 0.6170915495344658 -v 4.144152210282227 1.9052542230713616 0.8632934877875178 -v 4.144771962468453 1.6668162785684784 0.6022437558809948 -v 4.102019444552744 1.659277856166717 0.8484456941340466 -vt 0.453125 0.453125 -vt 0.671875 0.453125 -vt 0.671875 0.4375 -vt 0.453125 0.4375 -vt 0.4375 0.453125 -vt 0.453125 0.453125 -vt 0.453125 0.4375 -vt 0.4375 0.4375 -vt 0.6875 0.453125 -vt 0.90625 0.453125 -vt 0.90625 0.4375 -vt 0.6875 0.4375 -vt 0.671875 0.453125 -vt 0.6875 0.453125 -vt 0.6875 0.4375 -vt 0.671875 0.4375 -vt 0.671875 0.453125 -vt 0.453125 0.453125 -vt 0.453125 0.46875 -vt 0.671875 0.46875 -vt 0.890625 0.46875 -vt 0.671875 0.46875 -vt 0.671875 0.453125 -vt 0.890625 0.453125 -vn 0.17101007166283436 0.0301536896070458 -0.9848077530122081 -vn 0.9707485957865836 -0.1761271864118303 0.16317591116653485 -vn -0.17101007166283436 -0.0301536896070458 0.9848077530122081 -vn -0.9707485957865836 0.1761271864118303 -0.16317591116653485 -vn 0.16853106291793427 0.9839054676185789 0.059391174613884684 -vn -0.16853106291793427 -0.9839054676185789 -0.059391174613884684 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 188/556/139 191/555/139 189/554/139 186/553/139 -f 187/560/140 188/559/140 186/558/140 185/557/140 -f 192/564/141 187/563/141 185/562/141 190/561/141 -f 191/568/142 192/567/142 190/566/142 189/565/142 -f 190/572/143 185/571/143 186/570/143 189/569/143 -f 191/576/144 188/575/144 187/574/144 192/573/144 -o wingtip -v 6.922775830342509 1.060768988922723 4.874567024860628 -v 7.521524843752008 1.1663445946593922 1.4265088796266343 -v 6.922565166513862 1.0595391070881996 4.874492785892361 -v 7.521314179923362 1.165114712824869 1.426434640658367 -v 4.122691322754232 1.7830099060838132 0.855189220654804 -v 3.523942309344733 1.677434300347144 4.303247365888798 -v 4.122480658925585 1.7817800242492896 0.8551149816865367 -v 3.5237316455160856 1.6762044185126204 4.30317312692053 -vt 0 0.21875 -vt 0.21875 0.21875 -vt 0.21875 0.21875 -vt 0 0.21875 -vt -0.21875 0.21875 -vt 0 0.21875 -vt 0 0.21875 -vt -0.21875 0.21875 -vt 0.4375 0.21875 -vt 0.65625 0.21875 -vt 0.65625 0.21875 -vt 0.4375 0.21875 -vt 0.21875 0.21875 -vt 0.4375 0.21875 -vt 0.4375 0.21875 -vt 0.21875 0.21875 -vt 0.21875 0.21875 -vt 0 0.21875 -vt 0 0.4375 -vt 0.21875 0.4375 -vt 0.4375 0.4375 -vt 0.21875 0.4375 -vt 0.21875 0.21875 -vt 0.4375 0.21875 -vn 0.17101007166283436 0.0301536896070458 -0.9848077530122081 -vn 0.9707485957865836 -0.1761271864118303 0.16317591116653485 -vn -0.17101007166283436 -0.0301536896070458 0.9848077530122081 -vn -0.9707485957865836 0.1761271864118303 -0.16317591116653485 -vn 0.16853106291793427 0.9839054676185789 0.059391174613884684 -vn -0.16853106291793427 -0.9839054676185789 -0.059391174613884684 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 196/580/145 199/579/145 197/578/145 194/577/145 -f 195/584/146 196/583/146 194/582/146 193/581/146 -f 200/588/147 195/587/147 193/586/147 198/585/147 -f 199/592/148 200/591/148 198/590/148 197/589/148 -f 198/596/149 193/595/149 194/594/149 197/593/149 -f 199/600/150 196/599/150 195/598/150 200/597/150 -o wing1 -v -0.6638354376675588 1.4261635158512906 0.37120193825305203 -v -0.749340473498976 1.4412403606548134 -0.12120193825305198 -v -0.7506595265010241 0.9337596393451866 0.37120193825305203 -v -0.8361645623324412 0.9488364841487094 -0.12120193825305198 -v -4.143802559874316 2.039775611474734 0.48656668358120414 -v -4.0582975240428985 2.024698766671211 0.9789705600873082 -v -4.230626648707781 1.5473717349686296 0.48656668358120414 -v -4.1451216128763635 1.5322948901651068 0.9789705600873082 -vt 0.6875 0.625 -vt 0.46875 0.625 -vt 0.46875 0.59375 -vt 0.6875 0.59375 -vt 0.71875 0.625 -vt 0.6875 0.625 -vt 0.6875 0.59375 -vt 0.71875 0.59375 -vt 0.9375 0.625 -vt 0.71875 0.625 -vt 0.71875 0.59375 -vt 0.9375 0.59375 -vt 0.46875 0.625 -vt 0.4375 0.625 -vt 0.4375 0.59375 -vt 0.46875 0.59375 -vt 0.46875 0.625 -vt 0.6875 0.625 -vt 0.6875 0.65625 -vt 0.46875 0.65625 -vt 0.6875 0.65625 -vt 0.90625 0.65625 -vt 0.90625 0.625 -vt 0.6875 0.625 -vn -0.17101007166283433 0.030153689607045803 -0.984807753012208 -vn 0.9698463103929543 -0.17101007166283436 -0.17364817766693036 -vn 0.17101007166283433 -0.030153689607045803 0.984807753012208 -vn -0.9698463103929543 0.17101007166283436 0.17364817766693036 -vn 0.17364817766693033 0.984807753012208 0 -vn -0.17364817766693033 -0.984807753012208 0 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 204/604/151 207/603/151 205/602/151 202/601/151 -f 203/608/152 204/607/152 202/606/152 201/605/152 -f 208/612/153 203/611/153 201/610/153 206/609/153 -f 207/616/154 208/615/154 206/614/154 205/613/154 -f 206/620/155 201/619/155 202/618/155 205/617/155 -f 207/624/156 204/623/156 203/622/156 208/621/156 -o wing1 -v -0.1292669248723986 1.0786826526692979 3.695435079403845 -v -0.7280159382818975 1.184258258405967 0.24737693416985151 -v -0.12948398509448228 1.0774516429780323 3.695435079403845 -v -0.7282329985039812 1.1830272487147016 0.24737693416985151 -v -4.123690332545229 1.7830072718154657 0.8553626162261914 -v -3.524941319135731 1.677431666078797 4.303420761460185 -v -4.123907392767313 1.7817762621242004 0.8553626162261914 -v -3.5251583793578143 1.6762006563875311 4.303420761460185 -vt 0.21875 0.4375 -vt 0 0.4375 -vt 0 0.4375 -vt 0.21875 0.4375 -vt 0.4375 0.4375 -vt 0.21875 0.4375 -vt 0.21875 0.4375 -vt 0.4375 0.4375 -vt 0.65625 0.4375 -vt 0.4375 0.4375 -vt 0.4375 0.4375 -vt 0.65625 0.4375 -vt 0 0.4375 -vt -0.21875 0.4375 -vt -0.21875 0.4375 -vt 0 0.4375 -vt 0 0.4375 -vt 0.21875 0.4375 -vt 0.21875 0.65625 -vt 0 0.65625 -vt 0.21875 0.65625 -vt 0.4375 0.65625 -vt 0.4375 0.4375 -vt 0.21875 0.4375 -vn -0.17101007166283433 0.030153689607045803 -0.984807753012208 -vn 0.9698463103929543 -0.17101007166283436 -0.17364817766693036 -vn 0.17101007166283433 -0.030153689607045803 0.984807753012208 -vn -0.9698463103929543 0.17101007166283436 0.17364817766693036 -vn 0.17364817766693033 0.984807753012208 0 -vn -0.17364817766693033 -0.984807753012208 0 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 212/628/157 215/627/157 213/626/157 210/625/157 -f 211/632/158 212/631/158 210/630/158 209/629/158 -f 216/636/159 211/635/159 209/634/159 214/633/159 -f 215/640/160 216/639/160 214/638/160 213/637/160 -f 214/644/161 209/643/161 210/642/161 213/641/161 -f 215/648/162 212/647/162 211/646/162 216/645/162 -o wingtip1 -v -4.144152210282227 1.9052542230713616 0.8632934877875178 -v -4.186904728197936 1.912792645473123 0.6170915495344658 -v -4.102019444552744 1.659277856166717 0.8484456941340466 -v -4.144771962468453 1.6668162785684784 0.6022437558809948 -v -7.584524813450978 1.2963474930317171 1.1882072386173377 -v -7.541772295535269 1.2888090706299558 1.4344091768703897 -v -7.542392047721495 1.0503711261270725 1.1733594449638665 -v -7.499639529805786 1.0428327037253111 1.4195613832169185 -vt 0.671875 0.453125 -vt 0.453125 0.453125 -vt 0.453125 0.4375 -vt 0.671875 0.4375 -vt 0.6875 0.453125 -vt 0.671875 0.453125 -vt 0.671875 0.4375 -vt 0.6875 0.4375 -vt 0.90625 0.453125 -vt 0.6875 0.453125 -vt 0.6875 0.4375 -vt 0.90625 0.4375 -vt 0.453125 0.453125 -vt 0.4375 0.453125 -vt 0.4375 0.4375 -vt 0.453125 0.4375 -vt 0.453125 0.453125 -vt 0.671875 0.453125 -vt 0.671875 0.46875 -vt 0.453125 0.46875 -vt 0.671875 0.46875 -vt 0.890625 0.46875 -vt 0.890625 0.453125 -vt 0.671875 0.453125 -vn -0.17101007166283436 0.0301536896070458 -0.9848077530122081 -vn 0.9707485957865836 0.1761271864118303 -0.16317591116653485 -vn 0.17101007166283436 -0.0301536896070458 0.9848077530122081 -vn -0.9707485957865836 -0.1761271864118303 0.16317591116653485 -vn -0.16853106291793427 0.9839054676185789 0.059391174613884684 -vn 0.16853106291793427 -0.9839054676185789 -0.059391174613884684 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 220/652/163 223/651/163 221/650/163 218/649/163 -f 219/656/164 220/655/164 218/654/164 217/653/164 -f 224/660/165 219/659/165 217/658/165 222/657/165 -f 223/664/166 224/663/166 222/662/166 221/661/166 -f 222/668/167 217/667/167 218/666/167 221/665/167 -f 223/672/168 220/671/168 219/670/168 224/669/168 -o wingtip1 -v -3.523942309344733 1.677434300347144 4.303247365888798 -v -4.122691322754232 1.7830099060838132 0.855189220654804 -v -3.5237316455160856 1.6762044185126204 4.30317312692053 -v -4.122480658925585 1.7817800242492896 0.8551149816865367 -v -7.521524843752008 1.1663445946593922 1.4265088796266343 -v -6.922775830342509 1.060768988922723 4.874567024860628 -v -7.521314179923361 1.165114712824869 1.426434640658367 -v -6.922565166513862 1.0595391070881996 4.874492785892361 -vt 0.21875 0.21875 -vt 0 0.21875 -vt 0 0.21875 -vt 0.21875 0.21875 -vt 0.4375 0.21875 -vt 0.21875 0.21875 -vt 0.21875 0.21875 -vt 0.4375 0.21875 -vt 0.65625 0.21875 -vt 0.4375 0.21875 -vt 0.4375 0.21875 -vt 0.65625 0.21875 -vt 0 0.21875 -vt -0.21875 0.21875 -vt -0.21875 0.21875 -vt 0 0.21875 -vt 0 0.21875 -vt 0.21875 0.21875 -vt 0.21875 0.4375 -vt 0 0.4375 -vt 0.21875 0.4375 -vt 0.4375 0.4375 -vt 0.4375 0.21875 -vt 0.21875 0.21875 -vn -0.17101007166283436 0.0301536896070458 -0.9848077530122081 -vn 0.9707485957865836 0.1761271864118303 -0.16317591116653485 -vn 0.17101007166283436 -0.0301536896070458 0.9848077530122081 -vn -0.9707485957865836 -0.1761271864118303 0.16317591116653485 -vn -0.16853106291793427 0.9839054676185789 0.059391174613884684 -vn 0.16853106291793427 -0.9839054676185789 -0.059391174613884684 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 228/676/169 231/675/169 229/674/169 226/673/169 -f 227/680/170 228/679/170 226/678/170 225/677/170 -f 232/684/171 227/683/171 225/682/171 230/681/171 -f 231/688/172 232/687/172 230/686/172 229/685/172 -f 230/692/173 225/691/173 226/690/173 229/689/173 -f 231/696/174 228/695/174 227/694/174 232/693/174 -o rearleg -v 1.5 1.0580127018922192 2.6584936490538906 -v 1.5 0.1919872981077808 2.1584936490538906 -v 1.5 0.05801270189221919 4.390544456622768 -v 1.5 -0.8080127018922196 3.8905444566227683 -v 0.5 0.1919872981077808 2.1584936490538906 -v 0.5 1.0580127018922192 2.6584936490538906 -v 0.5 -0.8080127018922196 3.8905444566227683 -v 0.5 0.05801270189221919 4.390544456622768 -vt 0.0625 0.9375 -vt 0.125 0.9375 -vt 0.125 0.8125 -vt 0.0625 0.8125 -vt 0 0.9375 -vt 0.0625 0.9375 -vt 0.0625 0.8125 -vt 0 0.8125 -vt 0.1875 0.9375 -vt 0.25 0.9375 -vt 0.25 0.8125 -vt 0.1875 0.8125 -vt 0.125 0.9375 -vt 0.1875 0.9375 -vt 0.1875 0.8125 -vt 0.125 0.8125 -vt 0.125 0.9375 -vt 0.0625 0.9375 -vt 0.0625 1 -vt 0.125 1 -vt 0.1875 1 -vt 0.125 1 -vt 0.125 0.9375 -vt 0.1875 0.9375 -vn 0 -0.8660254037844386 -0.5000000000000001 -vn 1 0 0 -vn 0 0.8660254037844386 0.5000000000000001 -vn -1 0 0 -vn 0 0.5000000000000001 -0.8660254037844386 -vn 0 -0.5000000000000001 0.8660254037844386 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 236/700/175 239/699/175 237/698/175 234/697/175 -f 235/704/176 236/703/176 234/702/176 233/701/176 -f 240/708/177 235/707/177 233/706/177 238/705/177 -f 239/712/178 240/711/178 238/710/178 237/709/178 -f 238/716/179 233/715/179 234/714/179 237/713/179 -f 239/720/180 236/719/180 235/718/180 240/717/180 -o rearlegtip -v 1.375 -0.009562569109802244 4.19903062623141 -v 1.375 -0.7567085926786117 4.133663819170667 -v 1.375 -0.18387405460511896 6.191420022414902 -v 1.375 -0.9310200781739284 6.126053215354158 -v 0.625 -0.7567085926786117 4.133663819170667 -v 0.625 -0.009562569109802244 4.19903062623141 -v 0.625 -0.9310200781739284 6.126053215354158 -v 0.625 -0.18387405460511896 6.191420022414902 -vt 0.8125 0.953125 -vt 0.859375 0.953125 -vt 0.859375 0.828125 -vt 0.8125 0.828125 -vt 0.765625 0.953125 -vt 0.8125 0.953125 -vt 0.8125 0.828125 -vt 0.765625 0.828125 -vt 0.90625 0.953125 -vt 0.953125 0.953125 -vt 0.953125 0.828125 -vt 0.90625 0.828125 -vt 0.859375 0.953125 -vt 0.90625 0.953125 -vt 0.90625 0.828125 -vt 0.859375 0.828125 -vt 0.859375 0.953125 -vt 0.8125 0.953125 -vt 0.8125 1 -vt 0.859375 1 -vt 0.90625 1 -vt 0.859375 1 -vt 0.859375 0.953125 -vt 0.90625 0.953125 -vn 0 -0.9961946980917455 -0.0871557427476583 -vn 1 0 0 -vn 0 0.9961946980917455 0.0871557427476583 -vn -1 0 0 -vn 0 0.0871557427476583 -0.9961946980917455 -vn 0 -0.0871557427476583 0.9961946980917455 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 244/724/181 247/723/181 245/722/181 242/721/181 -f 243/728/182 244/727/182 242/726/182 241/725/182 -f 248/732/183 243/731/183 241/730/183 246/729/183 -f 247/736/184 248/735/184 246/734/184 245/733/184 -f 246/740/185 241/739/185 242/738/185 245/737/185 -f 247/744/186 244/743/186 243/742/186 248/741/186 -o rearfoot -v 1.5625 -0.42819812424051307 5.992592482541166 -v 1.5625 -1.5772647889189804 6.956773897070976 -v 1.5625 -0.187152770608062 6.279859148710783 -v 1.5625 -1.3362194352865284 7.244040563240592 -v 0.4375 -1.5772647889189804 6.956773897070976 -v 0.4375 -0.42819812424051307 5.992592482541166 -v 0.4375 -1.3362194352865284 7.244040563240592 -v 0.4375 -0.187152770608062 6.279859148710783 -vt 0.53125 0.90625 -vt 0.6015625 0.90625 -vt 0.6015625 0.8828125 -vt 0.53125 0.8828125 -vt 0.4375 0.90625 -vt 0.53125 0.90625 -vt 0.53125 0.8828125 -vt 0.4375 0.8828125 -vt 0.6953125 0.90625 -vt 0.765625 0.90625 -vt 0.765625 0.8828125 -vt 0.6953125 0.8828125 -vt 0.6015625 0.90625 -vt 0.6953125 0.90625 -vt 0.6953125 0.8828125 -vt 0.6015625 0.8828125 -vt 0.6015625 0.90625 -vt 0.53125 0.90625 -vt 0.53125 1 -vt 0.6015625 1 -vt 0.671875 1 -vt 0.6015625 1 -vt 0.6015625 0.90625 -vt 0.671875 0.90625 -vn 0 -0.766044443118978 0.6427876096865393 -vn 1 0 0 -vn 0 0.766044443118978 -0.6427876096865393 -vn -1 0 0 -vn 0 -0.6427876096865393 -0.766044443118978 -vn 0 0.6427876096865393 0.766044443118978 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 252/748/187 255/747/187 253/746/187 250/745/187 -f 251/752/188 252/751/188 250/750/188 249/749/188 -f 256/756/189 251/755/189 249/754/189 254/753/189 -f 255/760/190 256/759/190 254/758/190 253/757/190 -f 254/764/191 249/763/191 250/762/191 253/761/191 -f 255/768/192 252/767/192 251/766/192 256/765/192 -o rearleg1 -v -0.5 1.0580127018922192 2.6584936490538906 -v -0.5 0.1919872981077808 2.1584936490538906 -v -0.5 0.05801270189221919 4.390544456622768 -v -0.5 -0.8080127018922196 3.8905444566227683 -v -1.5 0.1919872981077808 2.1584936490538906 -v -1.5 1.0580127018922192 2.6584936490538906 -v -1.5 -0.8080127018922196 3.8905444566227683 -v -1.5 0.05801270189221919 4.390544456622768 -vt 0.125 0.9375 -vt 0.0625 0.9375 -vt 0.0625 0.8125 -vt 0.125 0.8125 -vt 0.1875 0.9375 -vt 0.125 0.9375 -vt 0.125 0.8125 -vt 0.1875 0.8125 -vt 0.25 0.9375 -vt 0.1875 0.9375 -vt 0.1875 0.8125 -vt 0.25 0.8125 -vt 0.0625 0.9375 -vt 0 0.9375 -vt 0 0.8125 -vt 0.0625 0.8125 -vt 0.0625 0.9375 -vt 0.125 0.9375 -vt 0.125 1 -vt 0.0625 1 -vt 0.125 1 -vt 0.1875 1 -vt 0.1875 0.9375 -vt 0.125 0.9375 -vn 0 -0.8660254037844386 -0.5000000000000001 -vn 1 0 0 -vn 0 0.8660254037844386 0.5000000000000001 -vn -1 0 0 -vn 0 0.5000000000000001 -0.8660254037844386 -vn 0 -0.5000000000000001 0.8660254037844386 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 260/772/193 263/771/193 261/770/193 258/769/193 -f 259/776/194 260/775/194 258/774/194 257/773/194 -f 264/780/195 259/779/195 257/778/195 262/777/195 -f 263/784/196 264/783/196 262/782/196 261/781/196 -f 262/788/197 257/787/197 258/786/197 261/785/197 -f 263/792/198 260/791/198 259/790/198 264/789/198 -o rearlegtip -v -0.625 -0.009562569109802244 4.19903062623141 -v -0.625 -0.7567085926786117 4.133663819170667 -v -0.625 -0.18387405460511896 6.191420022414902 -v -0.625 -0.9310200781739284 6.126053215354158 -v -1.375 -0.7567085926786117 4.133663819170667 -v -1.375 -0.009562569109802244 4.19903062623141 -v -1.375 -0.9310200781739284 6.126053215354158 -v -1.375 -0.18387405460511896 6.191420022414902 -vt 0.859375 0.953125 -vt 0.8125 0.953125 -vt 0.8125 0.828125 -vt 0.859375 0.828125 -vt 0.90625 0.953125 -vt 0.859375 0.953125 -vt 0.859375 0.828125 -vt 0.90625 0.828125 -vt 0.953125 0.953125 -vt 0.90625 0.953125 -vt 0.90625 0.828125 -vt 0.953125 0.828125 -vt 0.8125 0.953125 -vt 0.765625 0.953125 -vt 0.765625 0.828125 -vt 0.8125 0.828125 -vt 0.8125 0.953125 -vt 0.859375 0.953125 -vt 0.859375 1 -vt 0.8125 1 -vt 0.859375 1 -vt 0.90625 1 -vt 0.90625 0.953125 -vt 0.859375 0.953125 -vn 0 -0.9961946980917455 -0.0871557427476583 -vn 1 0 0 -vn 0 0.9961946980917455 0.0871557427476583 -vn -1 0 0 -vn 0 0.0871557427476583 -0.9961946980917455 -vn 0 -0.0871557427476583 0.9961946980917455 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 268/796/199 271/795/199 269/794/199 266/793/199 -f 267/800/200 268/799/200 266/798/200 265/797/200 -f 272/804/201 267/803/201 265/802/201 270/801/201 -f 271/808/202 272/807/202 270/806/202 269/805/202 -f 270/812/203 265/811/203 266/810/203 269/809/203 -f 271/816/204 268/815/204 267/814/204 272/813/204 -o rearfoot -v -0.4375 -0.42819812424051307 5.992592482541166 -v -0.4375 -1.5772647889189804 6.956773897070976 -v -0.4375 -0.187152770608062 6.279859148710783 -v -0.4375 -1.3362194352865284 7.244040563240592 -v -1.5625 -1.5772647889189804 6.956773897070976 -v -1.5625 -0.42819812424051307 5.992592482541166 -v -1.5625 -1.3362194352865284 7.244040563240592 -v -1.5625 -0.187152770608062 6.279859148710783 -vt 0.6015625 0.90625 -vt 0.53125 0.90625 -vt 0.53125 0.8828125 -vt 0.6015625 0.8828125 -vt 0.6953125 0.90625 -vt 0.6015625 0.90625 -vt 0.6015625 0.8828125 -vt 0.6953125 0.8828125 -vt 0.765625 0.90625 -vt 0.6953125 0.90625 -vt 0.6953125 0.8828125 -vt 0.765625 0.8828125 -vt 0.53125 0.90625 -vt 0.4375 0.90625 -vt 0.4375 0.8828125 -vt 0.53125 0.8828125 -vt 0.53125 0.90625 -vt 0.6015625 0.90625 -vt 0.6015625 1 -vt 0.53125 1 -vt 0.6015625 1 -vt 0.671875 1 -vt 0.671875 0.90625 -vt 0.6015625 0.90625 -vn 0 -0.766044443118978 0.6427876096865393 -vn 1 0 0 -vn 0 0.766044443118978 -0.6427876096865393 -vn -1 0 0 -vn 0 -0.6427876096865393 -0.766044443118978 -vn 0 0.6427876096865393 0.766044443118978 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 276/820/205 279/819/205 277/818/205 274/817/205 -f 275/824/206 276/823/206 274/822/206 273/821/206 -f 280/828/207 275/827/207 273/826/207 278/825/207 -f 279/832/208 280/831/208 278/830/208 277/829/208 -f 278/836/209 273/835/209 274/834/209 277/833/209 -f 279/840/210 276/839/210 275/838/210 280/837/210 -o frontleg -v 1 0.5822315121943373 0.004077618676012307 -v 1 0.1290776186760123 -0.20723151219433733 -v 1 -0.05169588041671158 1.3635392992309874 -v 1 -0.5048497739350366 1.1522301683606377 -v 0.5 0.1290776186760123 -0.20723151219433733 -v 0.5 0.5822315121943373 0.004077618676012307 -v 0.5 -0.5048497739350366 1.1522301683606377 -v 0.5 -0.05169588041671158 1.3635392992309874 -vt 0.46875 0.5625 -vt 0.5 0.5625 -vt 0.5 0.46875 -vt 0.46875 0.46875 -vt 0.4375 0.5625 -vt 0.46875 0.5625 -vt 0.46875 0.46875 -vt 0.4375 0.46875 -vt 0.53125 0.5625 -vt 0.5625 0.5625 -vt 0.5625 0.46875 -vt 0.53125 0.46875 -vt 0.5 0.5625 -vt 0.53125 0.5625 -vt 0.53125 0.46875 -vt 0.5 0.46875 -vt 0.5 0.5625 -vt 0.46875 0.5625 -vt 0.46875 0.59375 -vt 0.5 0.59375 -vt 0.53125 0.59375 -vt 0.5 0.59375 -vt 0.5 0.5625 -vt 0.53125 0.5625 -vn 0 -0.90630778703665 -0.4226182617406993 -vn 1 0 0 -vn 0 0.90630778703665 0.4226182617406993 -vn -1 0 0 -vn 0 0.4226182617406993 -0.90630778703665 -vn 0 -0.4226182617406993 0.90630778703665 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 284/844/211 287/843/211 285/842/211 282/841/211 -f 283/848/212 284/847/212 282/846/212 281/845/212 -f 288/852/213 283/851/213 281/850/213 286/849/213 -f 287/856/214 288/855/214 286/854/214 285/853/214 -f 286/860/215 281/859/215 282/858/215 285/857/215 -f 287/864/216 284/863/216 283/862/216 288/861/216 -o frontlegtip -v 0.9375 -0.10149613187923717 1.346273081444131 -v 0.9375 -0.3666611748241926 1.0811080384991758 -v 0.9375 -1.1621563036590583 2.4069332532239525 -v 0.9375 -1.4273213466040136 2.141768210278997 -v 0.5625 -0.3666611748241926 1.0811080384991758 -v 0.5625 -0.10149613187923717 1.346273081444131 -v 0.5625 -1.4273213466040136 2.141768210278997 -v 0.5625 -1.1621563036590583 2.4069332532239525 -vt 0.90625 0.4375 -vt 0.9296875 0.4375 -vt 0.9296875 0.34375 -vt 0.90625 0.34375 -vt 0.8828125 0.4375 -vt 0.90625 0.4375 -vt 0.90625 0.34375 -vt 0.8828125 0.34375 -vt 0.953125 0.4375 -vt 0.9765625 0.4375 -vt 0.9765625 0.34375 -vt 0.953125 0.34375 -vt 0.9296875 0.4375 -vt 0.953125 0.4375 -vt 0.953125 0.34375 -vt 0.9296875 0.34375 -vt 0.9296875 0.4375 -vt 0.90625 0.4375 -vt 0.90625 0.4609375 -vt 0.9296875 0.4609375 -vt 0.953125 0.4609375 -vt 0.9296875 0.4609375 -vt 0.9296875 0.4375 -vt 0.953125 0.4375 -vn 0 -0.7071067811865477 -0.7071067811865474 -vn 1 0 0 -vn 0 0.7071067811865477 0.7071067811865474 -vn -1 0 0 -vn 0 0.7071067811865474 -0.7071067811865477 -vn 0 -0.7071067811865474 0.7071067811865477 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 292/868/217 295/867/217 293/866/217 290/865/217 -f 291/872/218 292/871/218 290/870/218 289/869/218 -f 296/876/219 291/875/219 289/874/219 294/873/219 -f 295/880/220 296/879/220 294/878/220 293/877/220 -f 294/884/221 289/883/221 290/882/221 293/881/221 -f 295/888/222 292/887/222 291/886/222 296/885/222 -o frontfoot -v 1 -1.0005446513073766 2.2301565579273155 -v 1 -2.0005446513073766 2.2301565579273155 -v 1 -1.0005446513073766 2.4801565579273155 -v 1 -2.0005446513073766 2.4801565579273155 -v 0.5 -2.0005446513073766 2.2301565579273155 -v 0.5 -1.0005446513073766 2.2301565579273155 -v 0.5 -2.0005446513073766 2.4801565579273155 -v 0.5 -1.0005446513073766 2.4801565579273155 -vt 0.625 0.53125 -vt 0.65625 0.53125 -vt 0.65625 0.515625 -vt 0.625 0.515625 -vt 0.5625 0.53125 -vt 0.625 0.53125 -vt 0.625 0.515625 -vt 0.5625 0.515625 -vt 0.71875 0.53125 -vt 0.75 0.53125 -vt 0.75 0.515625 -vt 0.71875 0.515625 -vt 0.65625 0.53125 -vt 0.71875 0.53125 -vt 0.71875 0.515625 -vt 0.65625 0.515625 -vt 0.65625 0.53125 -vt 0.625 0.53125 -vt 0.625 0.59375 -vt 0.65625 0.59375 -vt 0.6875 0.59375 -vt 0.65625 0.59375 -vt 0.65625 0.53125 -vt 0.6875 0.53125 -vn 0 -1 2.7755575615628914e-16 -vn 1 0 0 -vn 0 1 -2.7755575615628914e-16 -vn -1 0 0 -vn 0 -2.7755575615628914e-16 -1 -vn 0 2.7755575615628914e-16 1 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 300/892/223 303/891/223 301/890/223 298/889/223 -f 299/896/224 300/895/224 298/894/224 297/893/224 -f 304/900/225 299/899/225 297/898/225 302/897/225 -f 303/904/226 304/903/226 302/902/226 301/901/226 -f 302/908/227 297/907/227 298/906/227 301/905/227 -f 303/912/228 300/911/228 299/910/228 304/909/228 -o frontleg1 -v -0.5 0.5822315121943373 0.004077618676012307 -v -0.5 0.1290776186760123 -0.20723151219433733 -v -0.5 -0.05169588041671158 1.3635392992309874 -v -0.5 -0.5048497739350366 1.1522301683606377 -v -1 0.1290776186760123 -0.20723151219433733 -v -1 0.5822315121943373 0.004077618676012307 -v -1 -0.5048497739350366 1.1522301683606377 -v -1 -0.05169588041671158 1.3635392992309874 -vt 0.5 0.5625 -vt 0.46875 0.5625 -vt 0.46875 0.46875 -vt 0.5 0.46875 -vt 0.53125 0.5625 -vt 0.5 0.5625 -vt 0.5 0.46875 -vt 0.53125 0.46875 -vt 0.5625 0.5625 -vt 0.53125 0.5625 -vt 0.53125 0.46875 -vt 0.5625 0.46875 -vt 0.46875 0.5625 -vt 0.4375 0.5625 -vt 0.4375 0.46875 -vt 0.46875 0.46875 -vt 0.46875 0.5625 -vt 0.5 0.5625 -vt 0.5 0.59375 -vt 0.46875 0.59375 -vt 0.5 0.59375 -vt 0.53125 0.59375 -vt 0.53125 0.5625 -vt 0.5 0.5625 -vn 0 -0.90630778703665 -0.4226182617406993 -vn 1 0 0 -vn 0 0.90630778703665 0.4226182617406993 -vn -1 0 0 -vn 0 0.4226182617406993 -0.90630778703665 -vn 0 -0.4226182617406993 0.90630778703665 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 308/916/229 311/915/229 309/914/229 306/913/229 -f 307/920/230 308/919/230 306/918/230 305/917/230 -f 312/924/231 307/923/231 305/922/231 310/921/231 -f 311/928/232 312/927/232 310/926/232 309/925/232 -f 310/932/233 305/931/233 306/930/233 309/929/233 -f 311/936/234 308/935/234 307/934/234 312/933/234 -o frontlegtip -v -0.5625 -0.10149613187923717 1.346273081444131 -v -0.5625 -0.3666611748241926 1.0811080384991758 -v -0.5625 -1.1621563036590583 2.4069332532239525 -v -0.5625 -1.4273213466040136 2.141768210278997 -v -0.9375 -0.3666611748241926 1.0811080384991758 -v -0.9375 -0.10149613187923717 1.346273081444131 -v -0.9375 -1.4273213466040136 2.141768210278997 -v -0.9375 -1.1621563036590583 2.4069332532239525 -vt 0.9296875 0.4375 -vt 0.90625 0.4375 -vt 0.90625 0.34375 -vt 0.9296875 0.34375 -vt 0.953125 0.4375 -vt 0.9296875 0.4375 -vt 0.9296875 0.34375 -vt 0.953125 0.34375 -vt 0.9765625 0.4375 -vt 0.953125 0.4375 -vt 0.953125 0.34375 -vt 0.9765625 0.34375 -vt 0.90625 0.4375 -vt 0.8828125 0.4375 -vt 0.8828125 0.34375 -vt 0.90625 0.34375 -vt 0.90625 0.4375 -vt 0.9296875 0.4375 -vt 0.9296875 0.4609375 -vt 0.90625 0.4609375 -vt 0.9296875 0.4609375 -vt 0.953125 0.4609375 -vt 0.953125 0.4375 -vt 0.9296875 0.4375 -vn 0 -0.7071067811865477 -0.7071067811865474 -vn 1 0 0 -vn 0 0.7071067811865477 0.7071067811865474 -vn -1 0 0 -vn 0 0.7071067811865474 -0.7071067811865477 -vn 0 -0.7071067811865474 0.7071067811865477 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 316/940/235 319/939/235 317/938/235 314/937/235 -f 315/944/236 316/943/236 314/942/236 313/941/236 -f 320/948/237 315/947/237 313/946/237 318/945/237 -f 319/952/238 320/951/238 318/950/238 317/949/238 -f 318/956/239 313/955/239 314/954/239 317/953/239 -f 319/960/240 316/959/240 315/958/240 320/957/240 -o frontfoot -v -0.5 -1.0005446513073766 2.2301565579273155 -v -0.5 -2.0005446513073766 2.2301565579273155 -v -0.5 -1.0005446513073766 2.4801565579273155 -v -0.5 -2.0005446513073766 2.4801565579273155 -v -1 -2.0005446513073766 2.2301565579273155 -v -1 -1.0005446513073766 2.2301565579273155 -v -1 -2.0005446513073766 2.4801565579273155 -v -1 -1.0005446513073766 2.4801565579273155 -vt 0.65625 0.53125 -vt 0.625 0.53125 -vt 0.625 0.515625 -vt 0.65625 0.515625 -vt 0.71875 0.53125 -vt 0.65625 0.53125 -vt 0.65625 0.515625 -vt 0.71875 0.515625 -vt 0.75 0.53125 -vt 0.71875 0.53125 -vt 0.71875 0.515625 -vt 0.75 0.515625 -vt 0.625 0.53125 -vt 0.5625 0.53125 -vt 0.5625 0.515625 -vt 0.625 0.515625 -vt 0.625 0.53125 -vt 0.65625 0.53125 -vt 0.65625 0.59375 -vt 0.625 0.59375 -vt 0.65625 0.59375 -vt 0.6875 0.59375 -vt 0.6875 0.53125 -vt 0.65625 0.53125 -vn 0 -1 2.7755575615628914e-16 -vn 1 0 0 -vn 0 1 -2.7755575615628914e-16 -vn -1 0 0 -vn 0 -2.7755575615628914e-16 -1 -vn 0 2.7755575615628914e-16 1 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 324/964/241 327/963/241 325/962/241 322/961/241 -f 323/968/242 324/967/242 322/966/242 321/965/242 -f 328/972/243 323/971/243 321/970/243 326/969/243 -f 327/976/244 328/975/244 326/974/244 325/973/244 -f 326/980/245 321/979/245 322/978/245 325/977/245 -f 327/984/246 324/983/246 323/982/246 328/981/246 -o tail -v 0.3125 1.1875 4.125 -v 0.3125 1.1875 3.5 -v 0.3125 0.5625 4.125 -v 0.3125 0.5625 3.5 -v -0.3125 1.1875 3.5 -v -0.3125 1.1875 4.125 -v -0.3125 0.5625 3.5 -v -0.3125 0.5625 4.125 -vt 0.7890625 0.5546875 -vt 0.828125 0.5546875 -vt 0.828125 0.515625 -vt 0.7890625 0.515625 -vt 0.75 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.515625 -vt 0.75 0.515625 -vt 0.8671875 0.5546875 -vt 0.90625 0.5546875 -vt 0.90625 0.515625 -vt 0.8671875 0.515625 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vt 0.8671875 0.515625 -vt 0.828125 0.515625 -vt 0.828125 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.59375 -vt 0.828125 0.59375 -vt 0.8671875 0.59375 -vt 0.828125 0.59375 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 332/988/247 335/987/247 333/986/247 330/985/247 -f 331/992/248 332/991/248 330/990/248 329/989/248 -f 336/996/249 331/995/249 329/994/249 334/993/249 -f 335/1000/250 336/999/250 334/998/250 333/997/250 -f 334/1004/251 329/1003/251 330/1002/251 333/1001/251 -f 335/1008/252 332/1007/252 331/1006/252 336/1005/252 -o tail -v 0.0625 1.4375 4 -v 0.0625 1.4375 3.625 -v 0.0625 1.1875 4 -v 0.0625 1.1875 3.625 -v -0.0625 1.4375 3.625 -v -0.0625 1.4375 4 -v -0.0625 1.1875 3.625 -v -0.0625 1.1875 4 -vt 0.2109375 0.9765625 -vt 0.21875 0.9765625 -vt 0.21875 0.9609375 -vt 0.2109375 0.9609375 -vt 0.1875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 0.9609375 -vt 0.1875 0.9609375 -vt 0.2421875 0.9765625 -vt 0.25 0.9765625 -vt 0.25 0.9609375 -vt 0.2421875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2421875 0.9765625 -vt 0.2421875 0.9609375 -vt 0.21875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 1 -vt 0.21875 1 -vt 0.2265625 1 -vt 0.21875 1 -vt 0.21875 0.9765625 -vt 0.2265625 0.9765625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 340/1012/253 343/1011/253 341/1010/253 338/1009/253 -f 339/1016/254 340/1015/254 338/1014/254 337/1013/254 -f 344/1020/255 339/1019/255 337/1018/255 342/1017/255 -f 343/1024/256 344/1023/256 342/1022/256 341/1021/256 -f 342/1028/257 337/1027/257 338/1026/257 341/1025/257 -f 343/1032/258 340/1031/258 339/1030/258 344/1029/258 -o tail -v 0.3125 1.1983601587596744 4.744450932461093 -v 0.3125 1.1874524047363721 4.119546122988348 -v 0.3125 0.5734553492869299 4.755358686484396 -v 0.3125 0.5625475952636276 4.130453877011651 -v -0.3125 1.1874524047363721 4.119546122988348 -v -0.3125 1.1983601587596744 4.744450932461093 -v -0.3125 0.5625475952636276 4.130453877011651 -v -0.3125 0.5734553492869299 4.755358686484396 -vt 0.7890625 0.5546875 -vt 0.828125 0.5546875 -vt 0.828125 0.515625 -vt 0.7890625 0.515625 -vt 0.75 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.515625 -vt 0.75 0.515625 -vt 0.8671875 0.5546875 -vt 0.90625 0.5546875 -vt 0.90625 0.515625 -vt 0.8671875 0.515625 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vt 0.8671875 0.515625 -vt 0.828125 0.515625 -vt 0.828125 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.59375 -vt 0.828125 0.59375 -vt 0.8671875 0.59375 -vt 0.828125 0.59375 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vn 0 -0.01745240643728351 -0.9998476951563913 -vn 1 0 0 -vn 0 0.01745240643728351 0.9998476951563913 -vn -1 0 0 -vn 0 0.9998476951563913 -0.01745240643728351 -vn 0 -0.9998476951563913 0.01745240643728351 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 348/1036/259 351/1035/259 349/1034/259 346/1033/259 -f 347/1040/260 348/1039/260 346/1038/260 345/1037/260 -f 352/1044/261 347/1043/261 345/1042/261 350/1041/261 -f 351/1048/262 352/1047/262 350/1046/262 349/1045/262 -f 350/1052/263 345/1051/263 346/1050/263 349/1049/263 -f 351/1056/264 348/1055/264 347/1054/264 352/1053/264 -o tail -v 0.0625 1.4461405317441118 4.615106868957223 -v 0.0625 1.4395958793301304 4.240163983273576 -v 0.0625 1.196178607955014 4.619469970566544 -v 0.0625 1.1896339555410327 4.244527084882897 -v -0.0625 1.4395958793301304 4.240163983273576 -v -0.0625 1.4461405317441118 4.615106868957223 -v -0.0625 1.1896339555410327 4.244527084882897 -v -0.0625 1.196178607955014 4.619469970566544 -vt 0.2109375 0.9765625 -vt 0.21875 0.9765625 -vt 0.21875 0.9609375 -vt 0.2109375 0.9609375 -vt 0.1875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 0.9609375 -vt 0.1875 0.9609375 -vt 0.2421875 0.9765625 -vt 0.25 0.9765625 -vt 0.25 0.9609375 -vt 0.2421875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2421875 0.9765625 -vt 0.2421875 0.9609375 -vt 0.21875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 1 -vt 0.21875 1 -vt 0.2265625 1 -vt 0.21875 1 -vt 0.21875 0.9765625 -vt 0.2265625 0.9765625 -vn 0 -0.01745240643728351 -0.9998476951563913 -vn 1 0 0 -vn 0 0.01745240643728351 0.9998476951563913 -vn -1 0 0 -vn 0 0.9998476951563913 -0.01745240643728351 -vn 0 -0.9998476951563913 0.01745240643728351 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 356/1060/265 359/1059/265 357/1058/265 354/1057/265 -f 355/1064/266 356/1063/266 354/1062/266 353/1061/266 -f 360/1068/267 355/1067/267 353/1066/267 358/1065/267 -f 359/1072/268 360/1071/268 358/1070/268 357/1069/268 -f 358/1076/269 353/1075/269 354/1074/269 357/1073/269 -f 359/1080/270 356/1079/270 355/1078/270 360/1077/270 -o tail -v 0.3125 1.2200295729058328 5.363617983640148 -v 0.3125 1.1982173874667696 4.738998716753213 -v 0.3125 0.595410306018898 5.385430169079211 -v 0.3125 0.5735981205798348 4.760810902192276 -v -0.3125 1.1982173874667696 4.738998716753213 -v -0.3125 1.2200295729058328 5.363617983640148 -v -0.3125 0.5735981205798348 4.760810902192276 -v -0.3125 0.595410306018898 5.385430169079211 -vt 0.7890625 0.5546875 -vt 0.828125 0.5546875 -vt 0.828125 0.515625 -vt 0.7890625 0.515625 -vt 0.75 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.515625 -vt 0.75 0.515625 -vt 0.8671875 0.5546875 -vt 0.90625 0.5546875 -vt 0.90625 0.515625 -vt 0.8671875 0.515625 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vt 0.8671875 0.515625 -vt 0.828125 0.515625 -vt 0.828125 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.59375 -vt 0.828125 0.59375 -vt 0.8671875 0.59375 -vt 0.828125 0.59375 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vn 0 -0.03489949670250097 -0.9993908270190958 -vn 1 0 0 -vn 0 0.03489949670250097 0.9993908270190958 -vn -1 0 0 -vn 0 0.9993908270190958 -0.03489949670250097 -vn 0 -0.9993908270190958 0.03489949670250097 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 364/1084/271 367/1083/271 365/1082/271 362/1081/271 -f 363/1088/272 364/1087/272 362/1086/272 361/1085/272 -f 368/1092/273 363/1091/273 361/1090/273 366/1089/273 -f 367/1096/274 368/1095/274 366/1094/274 365/1093/274 -f 366/1100/275 361/1099/275 362/1098/275 365/1097/275 -f 367/1104/276 364/1103/276 363/1102/276 368/1101/276 -o tail -v 0.0625 1.465514842572794 5.229969256087136 -v 0.0625 1.4524275313093562 4.855197695954975 -v 0.0625 1.21566713581802 5.238694130262761 -v 0.0625 1.2025798245545822 4.8639225701306 -v -0.0625 1.4524275313093562 4.855197695954975 -v -0.0625 1.465514842572794 5.229969256087136 -v -0.0625 1.2025798245545822 4.8639225701306 -v -0.0625 1.21566713581802 5.238694130262761 -vt 0.2109375 0.9765625 -vt 0.21875 0.9765625 -vt 0.21875 0.9609375 -vt 0.2109375 0.9609375 -vt 0.1875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 0.9609375 -vt 0.1875 0.9609375 -vt 0.2421875 0.9765625 -vt 0.25 0.9765625 -vt 0.25 0.9609375 -vt 0.2421875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2421875 0.9765625 -vt 0.2421875 0.9609375 -vt 0.21875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 1 -vt 0.21875 1 -vt 0.2265625 1 -vt 0.21875 1 -vt 0.21875 0.9765625 -vt 0.2265625 0.9765625 -vn 0 -0.03489949670250097 -0.9993908270190958 -vn 1 0 0 -vn 0 0.03489949670250097 0.9993908270190958 -vn -1 0 0 -vn 0 0.9993908270190958 -0.03489949670250097 -vn 0 -0.9993908270190958 0.03489949670250097 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 372/1108/277 375/1107/277 373/1106/277 370/1105/277 -f 371/1112/278 372/1111/278 370/1110/278 369/1109/278 -f 376/1116/279 371/1115/279 369/1114/279 374/1113/279 -f 375/1120/280 376/1119/280 374/1118/280 373/1117/280 -f 374/1124/281 369/1123/281 370/1122/281 373/1121/281 -f 375/1128/282 372/1127/282 371/1126/282 376/1125/282 -o tail -v 0.3125 1.2525016417250097 5.982312549255369 -v 0.3125 1.2197916690731698 5.35816909003376 -v 0.3125 0.628358182503401 6.015022521907208 -v 0.3125 0.5956482098515612 5.3908790626856 -v -0.3125 1.2197916690731698 5.35816909003376 -v -0.3125 1.2525016417250097 5.982312549255369 -v -0.3125 0.5956482098515612 5.3908790626856 -v -0.3125 0.628358182503401 6.015022521907208 -vt 0.7890625 0.5546875 -vt 0.828125 0.5546875 -vt 0.828125 0.515625 -vt 0.7890625 0.515625 -vt 0.75 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.515625 -vt 0.75 0.515625 -vt 0.8671875 0.5546875 -vt 0.90625 0.5546875 -vt 0.90625 0.515625 -vt 0.8671875 0.515625 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vt 0.8671875 0.515625 -vt 0.828125 0.515625 -vt 0.828125 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.59375 -vt 0.828125 0.59375 -vt 0.8671875 0.59375 -vt 0.828125 0.59375 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vn 0 -0.05233595624294383 -0.9986295347545739 -vn 1 0 0 -vn 0 0.05233595624294383 0.9986295347545739 -vn -1 0 0 -vn 0 0.9986295347545739 -0.05233595624294383 -vn 0 -0.9986295347545739 0.05233595624294383 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 380/1132/283 383/1131/283 381/1130/283 378/1129/283 -f 379/1136/284 380/1135/284 378/1134/284 377/1133/284 -f 384/1140/285 379/1139/285 377/1138/285 382/1137/285 -f 383/1144/286 384/1143/286 382/1142/286 381/1141/286 -f 382/1148/287 377/1147/287 378/1146/287 381/1145/287 -f 383/1152/288 380/1151/288 379/1150/288 384/1149/288 -o tail -v 0.0625 1.4956170308832855 5.844399868350311 -v 0.0625 1.4759910472921813 5.469913792817346 -v 0.0625 1.245959647194642 5.857483857411047 -v 0.0625 1.2263336636035378 5.482997781878082 -v -0.0625 1.4759910472921813 5.469913792817346 -v -0.0625 1.4956170308832855 5.844399868350311 -v -0.0625 1.2263336636035378 5.482997781878082 -v -0.0625 1.245959647194642 5.857483857411047 -vt 0.2109375 0.9765625 -vt 0.21875 0.9765625 -vt 0.21875 0.9609375 -vt 0.2109375 0.9609375 -vt 0.1875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 0.9609375 -vt 0.1875 0.9609375 -vt 0.2421875 0.9765625 -vt 0.25 0.9765625 -vt 0.25 0.9609375 -vt 0.2421875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2421875 0.9765625 -vt 0.2421875 0.9609375 -vt 0.21875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 1 -vt 0.21875 1 -vt 0.2265625 1 -vt 0.21875 1 -vt 0.21875 0.9765625 -vt 0.2265625 0.9765625 -vn 0 -0.05233595624294383 -0.9986295347545739 -vn 1 0 0 -vn 0 0.05233595624294383 0.9986295347545739 -vn -1 0 0 -vn 0 0.9986295347545739 -0.05233595624294383 -vn 0 -0.9986295347545739 0.05233595624294383 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 388/1156/289 391/1155/289 389/1154/289 386/1153/289 -f 387/1160/290 388/1159/290 386/1158/290 385/1157/290 -f 392/1164/291 387/1163/291 385/1162/291 390/1161/291 -f 391/1168/292 392/1167/292 390/1166/292 389/1165/292 -f 390/1172/293 385/1171/293 386/1170/293 389/1169/293 -f 391/1176/294 388/1175/294 387/1174/294 392/1173/294 -o tail -v 0.3125 1.3062130944851622 6.594053052279986 -v 0.3125 1.2517407552678759 5.971431365972645 -v 0.3125 0.6835914081778212 6.648525391497273 -v 0.3125 0.6291190689605348 6.025903705189932 -v -0.3125 1.2517407552678759 5.971431365972645 -v -0.3125 1.3062130944851622 6.594053052279986 -v -0.3125 0.6291190689605348 6.025903705189932 -v -0.3125 0.6835914081778212 6.648525391497273 -vt 0.7890625 0.5546875 -vt 0.828125 0.5546875 -vt 0.828125 0.515625 -vt 0.7890625 0.515625 -vt 0.75 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.515625 -vt 0.75 0.515625 -vt 0.8671875 0.5546875 -vt 0.90625 0.5546875 -vt 0.90625 0.515625 -vt 0.8671875 0.515625 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vt 0.8671875 0.515625 -vt 0.828125 0.515625 -vt 0.828125 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.59375 -vt 0.828125 0.59375 -vt 0.8671875 0.59375 -vt 0.828125 0.59375 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vn 0 -0.08715574274765817 -0.9961946980917457 -vn 1 0 0 -vn 0 0.08715574274765817 0.9961946980917457 -vn -1 0 0 -vn 0 0.9961946980917457 -0.08715574274765817 -vn 0 -0.9961946980917457 0.08715574274765817 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 396/1180/295 399/1179/295 397/1178/295 394/1177/295 -f 395/1184/296 396/1183/296 394/1182/296 393/1181/296 -f 400/1188/297 395/1187/297 393/1186/297 398/1185/297 -f 399/1192/298 400/1191/298 398/1190/298 397/1189/298 -f 398/1196/299 393/1195/299 394/1194/299 397/1193/299 -f 399/1200/300 396/1199/300 395/1198/300 400/1197/300 -o tail -v 0.0625 1.544367301164641 6.447739779331603 -v 0.0625 1.5116838976342697 6.074166767547199 -v 0.0625 1.295318626641705 6.469528715018518 -v 0.0625 1.2626352231113331 6.095955703234114 -v -0.0625 1.5116838976342697 6.074166767547199 -v -0.0625 1.544367301164641 6.447739779331603 -v -0.0625 1.2626352231113331 6.095955703234114 -v -0.0625 1.295318626641705 6.469528715018518 -vt 0.2109375 0.9765625 -vt 0.21875 0.9765625 -vt 0.21875 0.9609375 -vt 0.2109375 0.9609375 -vt 0.1875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 0.9609375 -vt 0.1875 0.9609375 -vt 0.2421875 0.9765625 -vt 0.25 0.9765625 -vt 0.25 0.9609375 -vt 0.2421875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2421875 0.9765625 -vt 0.2421875 0.9609375 -vt 0.21875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 1 -vt 0.21875 1 -vt 0.2265625 1 -vt 0.21875 1 -vt 0.21875 0.9765625 -vt 0.2265625 0.9765625 -vn 0 -0.08715574274765817 -0.9961946980917457 -vn 1 0 0 -vn 0 0.08715574274765817 0.9961946980917457 -vn -1 0 0 -vn 0 0.9961946980917457 -0.08715574274765817 -vn 0 -0.9961946980917457 0.08715574274765817 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 404/1204/301 407/1203/301 405/1202/301 402/1201/301 -f 403/1208/302 404/1207/302 402/1206/302 401/1205/302 -f 408/1212/303 403/1211/303 401/1210/303 406/1209/303 -f 407/1216/304 408/1215/304 406/1214/304 405/1213/304 -f 406/1220/305 401/1219/305 402/1218/305 405/1217/305 -f 407/1224/306 404/1223/306 403/1222/306 408/1221/306 -o tail -v 0.3125 1.3913442109132734 7.196715170802091 -v 0.3125 1.304361022813232 6.577797627838609 -v 0.3125 0.772426667949792 7.283698358902132 -v 0.3125 0.6854434798497508 6.66478081593865 -v -0.3125 1.304361022813232 6.577797627838609 -v -0.3125 1.3913442109132734 7.196715170802091 -v -0.3125 0.6854434798497508 6.66478081593865 -v -0.3125 0.772426667949792 7.283698358902132 -vt 0.7890625 0.5546875 -vt 0.828125 0.5546875 -vt 0.828125 0.515625 -vt 0.7890625 0.515625 -vt 0.75 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.515625 -vt 0.75 0.515625 -vt 0.8671875 0.5546875 -vt 0.90625 0.5546875 -vt 0.90625 0.515625 -vt 0.8671875 0.515625 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vt 0.8671875 0.515625 -vt 0.828125 0.515625 -vt 0.828125 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.59375 -vt 0.828125 0.59375 -vt 0.8671875 0.59375 -vt 0.828125 0.59375 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vn 0 -0.13917310096006544 -0.9902680687415704 -vn 1 0 0 -vn 0 0.13917310096006544 0.9902680687415704 -vn -1 0 0 -vn 0 0.9902680687415704 -0.13917310096006544 -vn 0 -0.9902680687415704 0.13917310096006544 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 412/1228/307 415/1227/307 413/1226/307 410/1225/307 -f 411/1232/308 412/1231/308 410/1230/308 409/1229/308 -f 416/1236/309 411/1235/309 409/1234/309 414/1233/309 -f 415/1240/310 416/1239/310 414/1238/310 413/1237/310 -f 414/1244/311 409/1243/311 410/1242/311 413/1241/311 -f 415/1248/312 412/1247/312 411/1246/312 416/1245/312 -o tail -v 0.0625 1.6215145904786574 7.038138386969378 -v 0.0625 1.5693246776186331 6.666787861191289 -v 0.0625 1.373947573293265 7.0729316622093945 -v 0.0625 1.3217576604332402 6.701581136431305 -v -0.0625 1.5693246776186331 6.666787861191289 -v -0.0625 1.6215145904786574 7.038138386969378 -v -0.0625 1.3217576604332402 6.701581136431305 -v -0.0625 1.373947573293265 7.0729316622093945 -vt 0.2109375 0.9765625 -vt 0.21875 0.9765625 -vt 0.21875 0.9609375 -vt 0.2109375 0.9609375 -vt 0.1875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 0.9609375 -vt 0.1875 0.9609375 -vt 0.2421875 0.9765625 -vt 0.25 0.9765625 -vt 0.25 0.9609375 -vt 0.2421875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2421875 0.9765625 -vt 0.2421875 0.9609375 -vt 0.21875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 1 -vt 0.21875 1 -vt 0.2265625 1 -vt 0.21875 1 -vt 0.21875 0.9765625 -vt 0.2265625 0.9765625 -vn 0 -0.13917310096006544 -0.9902680687415704 -vn 1 0 0 -vn 0 0.13917310096006544 0.9902680687415704 -vn -1 0 0 -vn 0 0.9902680687415704 -0.13917310096006544 -vn 0 -0.9902680687415704 0.13917310096006544 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 420/1252/313 423/1251/313 421/1250/313 418/1249/313 -f 419/1256/314 420/1255/314 418/1254/314 417/1253/314 -f 424/1260/315 419/1259/315 417/1258/315 422/1257/315 -f 423/1264/316 424/1263/316 422/1262/316 421/1261/316 -f 422/1268/317 417/1267/317 418/1266/317 421/1265/317 -f 423/1272/318 420/1271/318 419/1270/318 424/1269/318 -o tail -v 0.3125 1.507899556369268 7.79409594345173 -v 0.3125 1.3886439342589278 7.180578953796941 -v 0.3125 0.894382566714478 7.9133515655620705 -v 0.3125 0.7751269446041376 7.299834575907282 -v -0.3125 1.3886439342589278 7.180578953796941 -v -0.3125 1.507899556369268 7.79409594345173 -v -0.3125 0.7751269446041376 7.299834575907282 -v -0.3125 0.894382566714478 7.9133515655620705 -vt 0.7890625 0.5546875 -vt 0.828125 0.5546875 -vt 0.828125 0.515625 -vt 0.7890625 0.515625 -vt 0.75 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.515625 -vt 0.75 0.515625 -vt 0.8671875 0.5546875 -vt 0.90625 0.5546875 -vt 0.90625 0.515625 -vt 0.8671875 0.515625 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vt 0.8671875 0.515625 -vt 0.828125 0.515625 -vt 0.828125 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.59375 -vt 0.828125 0.59375 -vt 0.8671875 0.59375 -vt 0.828125 0.59375 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vn 0 -0.1908089953765448 -0.981627183447664 -vn 1 0 0 -vn 0 0.1908089953765448 0.981627183447664 -vn -1 0 0 -vn 0 0.981627183447664 -0.1908089953765448 -vn 0 -0.981627183447664 0.1908089953765448 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 428/1276/319 431/1275/319 429/1274/319 426/1273/319 -f 427/1280/320 428/1279/320 426/1278/320 425/1277/320 -f 432/1284/321 427/1283/321 425/1282/321 430/1281/321 -f 431/1288/322 432/1287/322 430/1286/322 429/1285/322 -f 430/1292/323 425/1291/323 426/1290/323 429/1289/323 -f 431/1296/324 428/1295/324 427/1294/324 432/1293/324 -o tail -v 0.0625 1.7294552278091162 7.623690296676635 -v 0.0625 1.6579018545429118 7.255580102883762 -v 0.0625 1.4840484319472 7.6713925455207725 -v 0.0625 1.4124950586809957 7.303282351727899 -v -0.0625 1.6579018545429118 7.255580102883762 -v -0.0625 1.7294552278091162 7.623690296676635 -v -0.0625 1.4124950586809957 7.303282351727899 -v -0.0625 1.4840484319472 7.6713925455207725 -vt 0.2109375 0.9765625 -vt 0.21875 0.9765625 -vt 0.21875 0.9609375 -vt 0.2109375 0.9609375 -vt 0.1875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 0.9609375 -vt 0.1875 0.9609375 -vt 0.2421875 0.9765625 -vt 0.25 0.9765625 -vt 0.25 0.9609375 -vt 0.2421875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2421875 0.9765625 -vt 0.2421875 0.9609375 -vt 0.21875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 1 -vt 0.21875 1 -vt 0.2265625 1 -vt 0.21875 1 -vt 0.21875 0.9765625 -vt 0.2265625 0.9765625 -vn 0 -0.1908089953765448 -0.981627183447664 -vn 1 0 0 -vn 0 0.1908089953765448 0.981627183447664 -vn -1 0 0 -vn 0 0.981627183447664 -0.1908089953765448 -vn 0 -0.981627183447664 0.1908089953765448 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 436/1300/325 439/1299/325 437/1298/325 434/1297/325 -f 435/1304/326 436/1303/326 434/1302/326 433/1301/326 -f 440/1308/327 435/1307/327 433/1306/327 438/1305/327 -f 439/1312/328 440/1311/328 438/1310/328 437/1309/328 -f 438/1316/329 433/1315/329 434/1314/329 437/1313/329 -f 439/1320/330 436/1319/330 435/1318/330 440/1317/330 -o tail -v 0.3125 1.6367569935322868 8.40009360158498 -v 0.3125 1.506812186771187 7.788751351126351 -v 0.3125 1.025414743073658 8.53003840834608 -v 0.3125 0.8954699363125587 7.918696157887451 -v -0.3125 1.506812186771187 7.788751351126351 -v -0.3125 1.6367569935322868 8.40009360158498 -v -0.3125 0.8954699363125587 7.918696157887451 -v -0.3125 1.025414743073658 8.53003840834608 -vt 0.7890625 0.5546875 -vt 0.828125 0.5546875 -vt 0.828125 0.515625 -vt 0.7890625 0.515625 -vt 0.75 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.515625 -vt 0.75 0.515625 -vt 0.8671875 0.5546875 -vt 0.90625 0.5546875 -vt 0.90625 0.515625 -vt 0.8671875 0.515625 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vt 0.8671875 0.515625 -vt 0.828125 0.515625 -vt 0.828125 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.59375 -vt 0.828125 0.59375 -vt 0.8671875 0.59375 -vt 0.828125 0.59375 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vn 0 -0.20791169081775934 -0.9781476007338057 -vn 1 0 0 -vn 0 0.20791169081775934 0.9781476007338057 -vn -1 0 0 -vn 0 0.9781476007338057 -0.20791169081775934 -vn 0 -0.9781476007338057 0.20791169081775934 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 444/1324/331 447/1323/331 445/1322/331 442/1321/331 -f 443/1328/332 444/1327/332 442/1326/332 441/1325/332 -f 448/1332/333 443/1331/333 441/1330/333 446/1329/333 -f 447/1336/334 448/1335/334 446/1334/334 445/1333/334 -f 446/1340/335 441/1339/335 442/1338/335 445/1337/335 -f 447/1344/336 444/1343/336 443/1342/336 448/1341/336 -o tail -v 0.0625 1.8553049323635182 8.225847228788815 -v 0.0625 1.7773380483068584 7.8590418785136364 -v 0.0625 1.6107680321800668 8.277825151493253 -v 0.0625 1.532801148123407 7.911019801218078 -v -0.0625 1.7773380483068584 7.8590418785136364 -v -0.0625 1.8553049323635182 8.225847228788815 -v -0.0625 1.532801148123407 7.911019801218078 -v -0.0625 1.6107680321800668 8.277825151493253 -vt 0.2109375 0.9765625 -vt 0.21875 0.9765625 -vt 0.21875 0.9609375 -vt 0.2109375 0.9609375 -vt 0.1875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 0.9609375 -vt 0.1875 0.9609375 -vt 0.2421875 0.9765625 -vt 0.25 0.9765625 -vt 0.25 0.9609375 -vt 0.2421875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2421875 0.9765625 -vt 0.2421875 0.9609375 -vt 0.21875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 1 -vt 0.21875 1 -vt 0.2265625 1 -vt 0.21875 1 -vt 0.21875 0.9765625 -vt 0.2265625 0.9765625 -vn 0 -0.20791169081775934 -0.9781476007338057 -vn 1 0 0 -vn 0 0.20791169081775934 0.9781476007338057 -vn -1 0 0 -vn 0 0.9781476007338057 -0.20791169081775934 -vn 0 -0.9781476007338057 0.20791169081775934 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 452/1348/337 455/1347/337 453/1346/337 450/1345/337 -f 451/1352/338 452/1351/338 450/1350/338 449/1349/338 -f 456/1356/339 451/1355/339 449/1354/339 454/1353/339 -f 455/1360/340 456/1359/340 454/1358/340 453/1357/340 -f 454/1364/341 449/1363/341 450/1362/341 453/1361/341 -f 455/1368/342 452/1367/342 451/1366/342 456/1365/342 -o tail -v 0.3125 1.7570999852407079 9.018955183565149 -v 0.3125 1.6378443631303679 8.405438193910358 -v 0.3125 1.143582995585918 9.13821080567549 -v 0.3125 1.0243273734755776 8.524693816020699 -v -0.3125 1.6378443631303679 8.405438193910358 -v -0.3125 1.7570999852407079 9.018955183565149 -v -0.3125 1.0243273734755776 8.524693816020699 -v -0.3125 1.143582995585918 9.13821080567549 -vt 0.7890625 0.5546875 -vt 0.828125 0.5546875 -vt 0.828125 0.515625 -vt 0.7890625 0.515625 -vt 0.75 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.515625 -vt 0.75 0.515625 -vt 0.8671875 0.5546875 -vt 0.90625 0.5546875 -vt 0.90625 0.515625 -vt 0.8671875 0.515625 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vt 0.8671875 0.515625 -vt 0.828125 0.515625 -vt 0.828125 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.59375 -vt 0.828125 0.59375 -vt 0.8671875 0.59375 -vt 0.828125 0.59375 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vn 0 -0.1908089953765448 -0.981627183447664 -vn 1 0 0 -vn 0 0.1908089953765448 0.981627183447664 -vn -1 0 0 -vn 0 0.981627183447664 -0.1908089953765448 -vn 0 -0.981627183447664 0.1908089953765448 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 460/1372/343 463/1371/343 461/1370/343 458/1369/343 -f 459/1376/344 460/1375/344 458/1374/344 457/1373/344 -f 464/1380/345 459/1379/345 457/1378/345 462/1377/345 -f 463/1384/346 464/1383/346 462/1382/346 461/1381/346 -f 462/1388/347 457/1387/347 458/1386/347 461/1385/347 -f 463/1392/348 460/1391/348 459/1390/348 464/1389/348 -o tail -v 0.0625 1.978655656680556 8.848549536790054 -v 0.0625 1.9071022834143516 8.480439342997181 -v 0.0625 1.73324886081864 8.89625178563419 -v 0.0625 1.6616954875524357 8.528141591841317 -v -0.0625 1.9071022834143516 8.480439342997181 -v -0.0625 1.978655656680556 8.848549536790054 -v -0.0625 1.6616954875524357 8.528141591841317 -v -0.0625 1.73324886081864 8.89625178563419 -vt 0.2109375 0.9765625 -vt 0.21875 0.9765625 -vt 0.21875 0.9609375 -vt 0.2109375 0.9609375 -vt 0.1875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 0.9609375 -vt 0.1875 0.9609375 -vt 0.2421875 0.9765625 -vt 0.25 0.9765625 -vt 0.25 0.9609375 -vt 0.2421875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2421875 0.9765625 -vt 0.2421875 0.9609375 -vt 0.21875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 1 -vt 0.21875 1 -vt 0.2265625 1 -vt 0.21875 1 -vt 0.21875 0.9765625 -vt 0.2265625 0.9765625 -vn 0 -0.1908089953765448 -0.981627183447664 -vn 1 0 0 -vn 0 0.1908089953765448 0.981627183447664 -vn -1 0 0 -vn 0 0.981627183447664 -0.1908089953765448 -vn 0 -0.981627183447664 0.1908089953765448 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 468/1396/349 471/1395/349 469/1394/349 466/1393/349 -f 467/1400/350 468/1399/350 466/1398/350 465/1397/350 -f 472/1404/351 467/1403/351 465/1402/351 470/1401/351 -f 471/1408/352 472/1407/352 470/1406/352 469/1405/352 -f 470/1412/353 465/1411/353 466/1410/353 469/1409/353 -f 471/1416/354 468/1415/354 467/1414/354 472/1413/354 -o tail -v 0.3125 1.8567656374994383 9.64700243716721 -v 0.3125 1.7589940968492939 9.029697224295248 -v 0.3125 1.239460424627477 9.744773977817353 -v 0.3125 1.1416888839773327 9.127468764945391 -v -0.3125 1.7589940968492939 9.029697224295248 -v -0.3125 1.8567656374994383 9.64700243716721 -v -0.3125 1.1416888839773327 9.127468764945391 -v -0.3125 1.239460424627477 9.744773977817353 -vt 0.7890625 0.5546875 -vt 0.828125 0.5546875 -vt 0.828125 0.515625 -vt 0.7890625 0.515625 -vt 0.75 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.515625 -vt 0.75 0.515625 -vt 0.8671875 0.5546875 -vt 0.90625 0.5546875 -vt 0.90625 0.515625 -vt 0.8671875 0.515625 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vt 0.8671875 0.515625 -vt 0.828125 0.515625 -vt 0.828125 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.59375 -vt 0.828125 0.59375 -vt 0.8671875 0.59375 -vt 0.828125 0.59375 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vn 0 -0.15643446504023087 -0.9876883405951378 -vn 1 0 0 -vn 0 0.15643446504023087 0.9876883405951378 -vn -1 0 0 -vn 0 0.9876883405951378 -0.15643446504023087 -vn 0 -0.9876883405951378 0.15643446504023087 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 476/1420/355 479/1419/355 477/1418/355 474/1417/355 -f 475/1424/356 476/1423/356 474/1422/356 473/1421/356 -f 480/1428/357 475/1427/357 473/1426/357 478/1425/357 -f 479/1432/358 480/1431/358 478/1430/358 477/1429/358 -f 478/1436/359 473/1435/359 474/1434/359 477/1433/359 -f 479/1440/360 476/1439/360 475/1438/360 480/1437/360 -o tail -v 0.0625 2.084133414518194 9.484432778332758 -v 0.0625 2.025470490128107 9.114049650609582 -v 0.0625 1.8372113293694095 9.523541394592817 -v 0.0625 1.7785484049793228 9.15315826686964 -v -0.0625 2.025470490128107 9.114049650609582 -v -0.0625 2.084133414518194 9.484432778332758 -v -0.0625 1.7785484049793228 9.15315826686964 -v -0.0625 1.8372113293694095 9.523541394592817 -vt 0.2109375 0.9765625 -vt 0.21875 0.9765625 -vt 0.21875 0.9609375 -vt 0.2109375 0.9609375 -vt 0.1875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 0.9609375 -vt 0.1875 0.9609375 -vt 0.2421875 0.9765625 -vt 0.25 0.9765625 -vt 0.25 0.9609375 -vt 0.2421875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2421875 0.9765625 -vt 0.2421875 0.9609375 -vt 0.21875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 1 -vt 0.21875 1 -vt 0.2265625 1 -vt 0.21875 1 -vt 0.21875 0.9765625 -vt 0.2265625 0.9765625 -vn 0 -0.15643446504023087 -0.9876883405951378 -vn 1 0 0 -vn 0 0.15643446504023087 0.9876883405951378 -vn -1 0 0 -vn 0 0.9876883405951378 -0.15643446504023087 -vn 0 -0.9876883405951378 0.15643446504023087 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 484/1444/361 487/1443/361 485/1442/361 482/1441/361 -f 483/1448/362 484/1447/362 482/1446/362 481/1445/362 -f 488/1452/363 483/1451/363 481/1450/363 486/1449/363 -f 487/1456/364 488/1455/364 486/1454/364 485/1453/364 -f 486/1460/365 481/1459/365 482/1458/365 485/1457/365 -f 487/1464/366 484/1463/366 483/1462/366 488/1461/366 -o tail -v 0.3125 1.924231412908326 10.284799247326308 -v 0.3125 1.858901123366043 9.663223062721139 -v 0.3125 1.3026552283031554 10.350129536868593 -v 0.3125 1.237324938760872 9.728553352263424 -v -0.3125 1.858901123366043 9.663223062721139 -v -0.3125 1.924231412908326 10.284799247326308 -v -0.3125 1.237324938760872 9.728553352263424 -v -0.3125 1.3026552283031554 10.350129536868593 -vt 0.7890625 0.5546875 -vt 0.828125 0.5546875 -vt 0.828125 0.515625 -vt 0.7890625 0.515625 -vt 0.75 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.515625 -vt 0.75 0.515625 -vt 0.8671875 0.5546875 -vt 0.90625 0.5546875 -vt 0.90625 0.515625 -vt 0.8671875 0.515625 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vt 0.8671875 0.515625 -vt 0.828125 0.515625 -vt 0.828125 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.59375 -vt 0.828125 0.59375 -vt 0.8671875 0.59375 -vt 0.828125 0.59375 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vn 0 -0.10452846326765347 -0.9945218953682733 -vn 1 0 0 -vn 0 0.10452846326765347 0.9945218953682733 -vn -1 0 0 -vn 0 0.9945218953682733 -0.10452846326765347 -vn 0 -0.9945218953682733 0.10452846326765347 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 492/1468/367 495/1467/367 493/1466/367 490/1465/367 -f 491/1472/368 492/1471/368 490/1470/368 489/1469/368 -f 496/1476/369 491/1475/369 489/1474/369 494/1473/369 -f 495/1480/370 496/1479/370 494/1478/370 493/1477/370 -f 494/1484/371 489/1483/371 490/1482/371 493/1481/371 -f 495/1488/372 492/1487/372 491/1486/372 496/1485/372 -o tail -v 0.0625 2.159795828841938 10.134351894588363 -v 0.0625 2.120597655116568 9.76140618382526 -v 0.0625 1.91116535499987 10.160484010405275 -v 0.0625 1.8719671812745 9.787538299642172 -v -0.0625 2.120597655116568 9.76140618382526 -v -0.0625 2.159795828841938 10.134351894588363 -v -0.0625 1.8719671812745 9.787538299642172 -v -0.0625 1.91116535499987 10.160484010405275 -vt 0.2109375 0.9765625 -vt 0.21875 0.9765625 -vt 0.21875 0.9609375 -vt 0.2109375 0.9609375 -vt 0.1875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 0.9609375 -vt 0.1875 0.9609375 -vt 0.2421875 0.9765625 -vt 0.25 0.9765625 -vt 0.25 0.9609375 -vt 0.2421875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2421875 0.9765625 -vt 0.2421875 0.9609375 -vt 0.21875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 1 -vt 0.21875 1 -vt 0.2265625 1 -vt 0.21875 1 -vt 0.21875 0.9765625 -vt 0.2265625 0.9765625 -vn 0 -0.10452846326765347 -0.9945218953682733 -vn 1 0 0 -vn 0 0.10452846326765347 0.9945218953682733 -vn -1 0 0 -vn 0 0.9945218953682733 -0.10452846326765347 -vn 0 -0.9945218953682733 0.10452846326765347 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 500/1492/373 503/1491/373 501/1490/373 498/1489/373 -f 499/1496/374 500/1495/374 498/1494/374 497/1493/374 -f 504/1500/375 499/1499/375 497/1498/375 502/1497/375 -f 503/1504/376 504/1503/376 502/1502/376 501/1501/376 -f 502/1508/377 497/1507/377 498/1506/377 501/1505/377 -f 503/1512/378 500/1511/378 499/1510/378 504/1509/378 -o tail -v 0.3125 1.958225022868385 10.92525286499314 -v 0.3125 1.9255150502165446 10.301109405771532 -v 0.3125 1.3340815636467762 10.957962837644981 -v 0.3125 1.3013715909949364 10.333819378423373 -v -0.3125 1.9255150502165446 10.301109405771532 -v -0.3125 1.958225022868385 10.92525286499314 -v -0.3125 1.3013715909949364 10.333819378423373 -v -0.3125 1.3340815636467762 10.957962837644981 -vt 0.7890625 0.5546875 -vt 0.828125 0.5546875 -vt 0.828125 0.515625 -vt 0.7890625 0.515625 -vt 0.75 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.515625 -vt 0.75 0.515625 -vt 0.8671875 0.5546875 -vt 0.90625 0.5546875 -vt 0.90625 0.515625 -vt 0.8671875 0.515625 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vt 0.8671875 0.515625 -vt 0.828125 0.515625 -vt 0.828125 0.5546875 -vt 0.7890625 0.5546875 -vt 0.7890625 0.59375 -vt 0.828125 0.59375 -vt 0.8671875 0.59375 -vt 0.828125 0.59375 -vt 0.828125 0.5546875 -vt 0.8671875 0.5546875 -vn 0 -0.05233595624294385 -0.998629534754574 -vn 1 0 0 -vn 0 0.05233595624294385 0.998629534754574 -vn -1 0 0 -vn 0 0.998629534754574 -0.05233595624294385 -vn 0 -0.998629534754574 0.05233595624294385 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 508/1516/379 511/1515/379 509/1514/379 506/1513/379 -f 507/1520/380 508/1519/380 506/1518/380 505/1517/380 -f 512/1524/381 507/1523/381 505/1522/381 510/1521/381 -f 511/1528/382 512/1527/382 510/1526/382 509/1525/382 -f 510/1532/383 505/1531/383 506/1530/383 509/1529/383 -f 511/1536/384 508/1535/384 507/1534/384 512/1533/384 -o tail -v 0.0625 2.20134041202666 10.787340184088084 -v 0.0625 2.1817144284355567 10.412854108555118 -v 0.0625 1.9516830283380169 10.80042417314882 -v 0.0625 1.9320570447469132 10.425938097615854 -v -0.0625 2.1817144284355567 10.412854108555118 -v -0.0625 2.20134041202666 10.787340184088084 -v -0.0625 1.9320570447469132 10.425938097615854 -v -0.0625 1.9516830283380169 10.80042417314882 -vt 0.2109375 0.9765625 -vt 0.21875 0.9765625 -vt 0.21875 0.9609375 -vt 0.2109375 0.9609375 -vt 0.1875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 0.9609375 -vt 0.1875 0.9609375 -vt 0.2421875 0.9765625 -vt 0.25 0.9765625 -vt 0.25 0.9609375 -vt 0.2421875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2421875 0.9765625 -vt 0.2421875 0.9609375 -vt 0.21875 0.9609375 -vt 0.21875 0.9765625 -vt 0.2109375 0.9765625 -vt 0.2109375 1 -vt 0.21875 1 -vt 0.2265625 1 -vt 0.21875 1 -vt 0.21875 0.9765625 -vt 0.2265625 0.9765625 -vn 0 -0.05233595624294385 -0.998629534754574 -vn 1 0 0 -vn 0 0.05233595624294385 0.998629534754574 -vn -1 0 0 -vn 0 0.998629534754574 -0.05233595624294385 -vn 0 -0.998629534754574 0.05233595624294385 -usemtl m_e48612ca-0475-df4f-6d9d-44f43691817f -f 516/1540/385 519/1539/385 517/1538/385 514/1537/385 -f 515/1544/386 516/1543/386 514/1542/386 513/1541/386 -f 520/1548/387 515/1547/387 513/1546/387 518/1545/387 -f 519/1552/388 520/1551/388 518/1550/388 517/1549/388 -f 518/1556/389 513/1555/389 514/1554/389 517/1553/389 -f 519/1560/390 516/1559/390 515/1558/390 520/1557/390 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/enderman.obj b/renderer/viewer/three/entity/models/enderman.obj deleted file mode 100644 index 6b405674..00000000 --- a/renderer/viewer/three/entity/models/enderman.obj +++ /dev/null @@ -1,325 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o Head -v 0.21875 2.96875 0.21875 -v 0.21875 2.96875 -0.21875 -v 0.21875 2.53125 0.21875 -v 0.21875 2.53125 -0.21875 -v -0.21875 2.96875 -0.21875 -v -0.21875 2.96875 0.21875 -v -0.21875 2.53125 -0.21875 -v -0.21875 2.53125 0.21875 -vt 0.125 0.75 -vt 0.25 0.75 -vt 0.25 0.5 -vt 0.125 0.5 -vt 0 0.75 -vt 0.125 0.75 -vt 0.125 0.5 -vt 0 0.5 -vt 0.375 0.75 -vt 0.5 0.75 -vt 0.5 0.5 -vt 0.375 0.5 -vt 0.25 0.75 -vt 0.375 0.75 -vt 0.375 0.5 -vt 0.25 0.5 -vt 0.25 0.75 -vt 0.125 0.75 -vt 0.125 1 -vt 0.25 1 -vt 0.375 1 -vt 0.25 1 -vt 0.25 0.75 -vt 0.375 0.75 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_981d8dac-1361-c897-71b0-9983b6b479fc -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o Head layer -v 0.21875 2.84375 0.21875 -v 0.21875 2.84375 -0.21875 -v 0.21875 2.40625 0.21875 -v 0.21875 2.40625 -0.21875 -v -0.21875 2.84375 -0.21875 -v -0.21875 2.84375 0.21875 -v -0.21875 2.40625 -0.21875 -v -0.21875 2.40625 0.21875 -vt 0.125 0.25 -vt 0.25 0.25 -vt 0.25 0 -vt 0.125 0 -vt 0 0.25 -vt 0.125 0.25 -vt 0.125 0 -vt 0 0 -vt 0.375 0.25 -vt 0.5 0.25 -vt 0.5 0 -vt 0.375 0 -vt 0.25 0.25 -vt 0.375 0.25 -vt 0.375 0 -vt 0.25 0 -vt 0.25 0.25 -vt 0.125 0.25 -vt 0.125 0.5 -vt 0.25 0.5 -vt 0.375 0.5 -vt 0.25 0.5 -vt 0.25 0.25 -vt 0.375 0.25 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_981d8dac-1361-c897-71b0-9983b6b479fc -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o Body -v 0.25 2.375 0.125 -v 0.25 2.375 -0.125 -v 0.25 1.625 0.125 -v 0.25 1.625 -0.125 -v -0.25 2.375 -0.125 -v -0.25 2.375 0.125 -v -0.25 1.625 -0.125 -v -0.25 1.625 0.125 -vt 0.5625 0.375 -vt 0.6875 0.375 -vt 0.6875 0 -vt 0.5625 0 -vt 0.5 0.375 -vt 0.5625 0.375 -vt 0.5625 0 -vt 0.5 0 -vt 0.75 0.375 -vt 0.875 0.375 -vt 0.875 0 -vt 0.75 0 -vt 0.6875 0.375 -vt 0.75 0.375 -vt 0.75 0 -vt 0.6875 0 -vt 0.6875 0.375 -vt 0.5625 0.375 -vt 0.5625 0.5 -vt 0.6875 0.5 -vt 0.8125 0.5 -vt 0.6875 0.5 -vt 0.6875 0.375 -vt 0.8125 0.375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_981d8dac-1361-c897-71b0-9983b6b479fc -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o RightArm -v 0.375 2.375 0.0625 -v 0.375 2.375 -0.0625 -v 0.375 0.5 0.0625 -v 0.375 0.5 -0.0625 -v 0.25 2.375 -0.0625 -v 0.25 2.375 0.0625 -v 0.25 0.5 -0.0625 -v 0.25 0.5 0.0625 -vt 0.90625 0.9375 -vt 0.9375 0.9375 -vt 0.9375 0 -vt 0.90625 0 -vt 0.875 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0 -vt 0.875 0 -vt 0.96875 0.9375 -vt 1 0.9375 -vt 1 0 -vt 0.96875 0 -vt 0.9375 0.9375 -vt 0.96875 0.9375 -vt 0.96875 0 -vt 0.9375 0 -vt 0.9375 0.9375 -vt 0.90625 0.9375 -vt 0.90625 1 -vt 0.9375 1 -vt 0.96875 1 -vt 0.9375 1 -vt 0.9375 0.9375 -vt 0.96875 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_981d8dac-1361-c897-71b0-9983b6b479fc -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o LeftArm -v -0.25 2.375 0.0625 -v -0.25 2.375 -0.0625 -v -0.25 0.5 0.0625 -v -0.25 0.5 -0.0625 -v -0.375 2.375 -0.0625 -v -0.375 2.375 0.0625 -v -0.375 0.5 -0.0625 -v -0.375 0.5 0.0625 -vt 0.9375 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0 -vt 0.9375 0 -vt 0.96875 0.9375 -vt 0.9375 0.9375 -vt 0.9375 0 -vt 0.96875 0 -vt 1 0.9375 -vt 0.96875 0.9375 -vt 0.96875 0 -vt 1 0 -vt 0.90625 0.9375 -vt 0.875 0.9375 -vt 0.875 0 -vt 0.90625 0 -vt 0.90625 0.9375 -vt 0.9375 0.9375 -vt 0.9375 1 -vt 0.90625 1 -vt 0.9375 1 -vt 0.96875 1 -vt 0.96875 0.9375 -vt 0.9375 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_981d8dac-1361-c897-71b0-9983b6b479fc -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o RightLeg -v 0.1875 1.625 0.0625 -v 0.1875 1.625 -0.0625 -v 0.1875 -0.25 0.0625 -v 0.1875 -0.25 -0.0625 -v 0.0625 1.625 -0.0625 -v 0.0625 1.625 0.0625 -v 0.0625 -0.25 -0.0625 -v 0.0625 -0.25 0.0625 -vt 0.90625 0.9375 -vt 0.9375 0.9375 -vt 0.9375 0 -vt 0.90625 0 -vt 0.875 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0 -vt 0.875 0 -vt 0.96875 0.9375 -vt 1 0.9375 -vt 1 0 -vt 0.96875 0 -vt 0.9375 0.9375 -vt 0.96875 0.9375 -vt 0.96875 0 -vt 0.9375 0 -vt 0.9375 0.9375 -vt 0.90625 0.9375 -vt 0.90625 1 -vt 0.9375 1 -vt 0.96875 1 -vt 0.9375 1 -vt 0.9375 0.9375 -vt 0.96875 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_981d8dac-1361-c897-71b0-9983b6b479fc -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o LeftLeg -v -0.0625 1.625 0.0625 -v -0.0625 1.625 -0.0625 -v -0.0625 -0.25 0.0625 -v -0.0625 -0.25 -0.0625 -v -0.1875 1.625 -0.0625 -v -0.1875 1.625 0.0625 -v -0.1875 -0.25 -0.0625 -v -0.1875 -0.25 0.0625 -vt 0.9375 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0 -vt 0.9375 0 -vt 0.96875 0.9375 -vt 0.9375 0.9375 -vt 0.9375 0 -vt 0.96875 0 -vt 1 0.9375 -vt 0.96875 0.9375 -vt 0.96875 0 -vt 1 0 -vt 0.90625 0.9375 -vt 0.875 0.9375 -vt 0.875 0 -vt 0.90625 0 -vt 0.90625 0.9375 -vt 0.9375 0.9375 -vt 0.9375 1 -vt 0.90625 1 -vt 0.9375 1 -vt 0.96875 1 -vt 0.96875 0.9375 -vt 0.9375 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_981d8dac-1361-c897-71b0-9983b6b479fc -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/endermite.obj b/renderer/viewer/three/entity/models/endermite.obj deleted file mode 100644 index 595376cd..00000000 --- a/renderer/viewer/three/entity/models/endermite.obj +++ /dev/null @@ -1,187 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o section_2 -v 0.09375 0.1875 0.21875 -v 0.09375 0.1875 0.15625 -v 0.09375 0 0.21875 -v 0.09375 0 0.15625 -v -0.09375 0.1875 0.15625 -v -0.09375 0.1875 0.21875 -v -0.09375 0 0.15625 -v -0.09375 0 0.21875 -vt 0.015625 0.53125 -vt 0.0625 0.53125 -vt 0.0625 0.4375 -vt 0.015625 0.4375 -vt 0 0.53125 -vt 0.015625 0.53125 -vt 0.015625 0.4375 -vt 0 0.4375 -vt 0.078125 0.53125 -vt 0.125 0.53125 -vt 0.125 0.4375 -vt 0.078125 0.4375 -vt 0.0625 0.53125 -vt 0.078125 0.53125 -vt 0.078125 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.53125 -vt 0.015625 0.53125 -vt 0.015625 0.5625 -vt 0.0625 0.5625 -vt 0.109375 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.53125 -vt 0.109375 0.53125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_50f00cc5-283b-b301-14d6-d02da334960b -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o section_0 -v 0.125 0.1875 -0.15000000000000002 -v 0.125 0.1875 -0.275 -v 0.125 0 -0.15000000000000002 -v 0.125 0 -0.275 -v -0.125 0.1875 -0.275 -v -0.125 0.1875 -0.15000000000000002 -v -0.125 0 -0.275 -v -0.125 0 -0.15000000000000002 -vt 0.03125 0.9375 -vt 0.09375 0.9375 -vt 0.09375 0.84375 -vt 0.03125 0.84375 -vt 0 0.9375 -vt 0.03125 0.9375 -vt 0.03125 0.84375 -vt 0 0.84375 -vt 0.125 0.9375 -vt 0.1875 0.9375 -vt 0.1875 0.84375 -vt 0.125 0.84375 -vt 0.09375 0.9375 -vt 0.125 0.9375 -vt 0.125 0.84375 -vt 0.09375 0.84375 -vt 0.09375 0.9375 -vt 0.03125 0.9375 -vt 0.03125 1 -vt 0.09375 1 -vt 0.15625 1 -vt 0.09375 1 -vt 0.09375 0.9375 -vt 0.15625 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_50f00cc5-283b-b301-14d6-d02da334960b -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o section_1 -v 0.1875 0.25 0.16249999999999998 -v 0.1875 0.25 -0.15000000000000002 -v 0.1875 0 0.16249999999999998 -v 0.1875 0 -0.15000000000000002 -v -0.1875 0.25 -0.15000000000000002 -v -0.1875 0.25 0.16249999999999998 -v -0.1875 0 -0.15000000000000002 -v -0.1875 0 0.16249999999999998 -vt 0.078125 0.6875 -vt 0.171875 0.6875 -vt 0.171875 0.5625 -vt 0.078125 0.5625 -vt 0 0.6875 -vt 0.078125 0.6875 -vt 0.078125 0.5625 -vt 0 0.5625 -vt 0.25 0.6875 -vt 0.34375 0.6875 -vt 0.34375 0.5625 -vt 0.25 0.5625 -vt 0.171875 0.6875 -vt 0.25 0.6875 -vt 0.25 0.5625 -vt 0.171875 0.5625 -vt 0.171875 0.6875 -vt 0.078125 0.6875 -vt 0.078125 0.84375 -vt 0.171875 0.84375 -vt 0.265625 0.84375 -vt 0.171875 0.84375 -vt 0.171875 0.6875 -vt 0.265625 0.6875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_50f00cc5-283b-b301-14d6-d02da334960b -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o section_3 -v 0.03125 0.125 0.28125 -v 0.03125 0.125 0.21875 -v 0.03125 0 0.28125 -v 0.03125 0 0.21875 -v -0.03125 0.125 0.21875 -v -0.03125 0.125 0.28125 -v -0.03125 0 0.21875 -v -0.03125 0 0.28125 -vt 0.015625 0.40625 -vt 0.03125 0.40625 -vt 0.03125 0.34375 -vt 0.015625 0.34375 -vt 0 0.40625 -vt 0.015625 0.40625 -vt 0.015625 0.34375 -vt 0 0.34375 -vt 0.046875 0.40625 -vt 0.0625 0.40625 -vt 0.0625 0.34375 -vt 0.046875 0.34375 -vt 0.03125 0.40625 -vt 0.046875 0.40625 -vt 0.046875 0.34375 -vt 0.03125 0.34375 -vt 0.03125 0.40625 -vt 0.015625 0.40625 -vt 0.015625 0.4375 -vt 0.03125 0.4375 -vt 0.046875 0.4375 -vt 0.03125 0.4375 -vt 0.03125 0.40625 -vt 0.046875 0.40625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_50f00cc5-283b-b301-14d6-d02da334960b -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/fox.obj b/renderer/viewer/three/entity/models/fox.obj deleted file mode 100644 index a0645b37..00000000 --- a/renderer/viewer/three/entity/models/fox.obj +++ /dev/null @@ -1,463 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o body -v 0.1875 0.6875 -0.1875 -v 0.1875 0.3125 -0.1875 -v 0.1875 0.6875 0.5 -v 0.1875 0.3124999999999999 0.5 -v -0.1875 0.3125 -0.1875 -v -0.1875 0.6875 -0.1875 -v -0.1875 0.3124999999999999 0.5 -v -0.1875 0.6875 0.5 -vt 0.625 0.34375 -vt 0.75 0.34375 -vt 0.75 0 -vt 0.625 0 -vt 0.5 0.34375 -vt 0.625 0.34375 -vt 0.625 0 -vt 0.5 0 -vt 0.875 0.34375 -vt 1 0.34375 -vt 1 0 -vt 0.875 0 -vt 0.75 0.34375 -vt 0.875 0.34375 -vt 0.875 0 -vt 0.75 0 -vt 0.75 0.34375 -vt 0.625 0.34375 -vt 0.625 0.53125 -vt 0.75 0.53125 -vt 0.875 0.53125 -vt 0.75 0.53125 -vt 0.75 0.34375 -vt 0.875 0.34375 -vn 0 -1 -2.220446049250313e-16 -vn 1 0 0 -vn 0 1 2.220446049250313e-16 -vn -1 0 0 -vn 0 2.220446049250313e-16 -1 -vn 0 -2.220446049250313e-16 1 -usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o head -v 0.25 0.625 -0.1875 -v 0.25 0.625 -0.5625 -v 0.25 0.25 -0.1875 -v 0.25 0.25 -0.5625 -v -0.25 0.625 -0.5625 -v -0.25 0.625 -0.1875 -v -0.25 0.25 -0.5625 -v -0.25 0.25 -0.1875 -vt 0.14583333333333334 0.65625 -vt 0.3125 0.65625 -vt 0.3125 0.46875 -vt 0.14583333333333334 0.46875 -vt 0.020833333333333332 0.65625 -vt 0.14583333333333334 0.65625 -vt 0.14583333333333334 0.46875 -vt 0.020833333333333332 0.46875 -vt 0.4375 0.65625 -vt 0.6041666666666666 0.65625 -vt 0.6041666666666666 0.46875 -vt 0.4375 0.46875 -vt 0.3125 0.65625 -vt 0.4375 0.65625 -vt 0.4375 0.46875 -vt 0.3125 0.46875 -vt 0.3125 0.65625 -vt 0.14583333333333334 0.65625 -vt 0.14583333333333334 0.84375 -vt 0.3125 0.84375 -vt 0.4791666666666667 0.84375 -vt 0.3125 0.84375 -vt 0.3125 0.65625 -vt 0.4791666666666667 0.65625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o head -v 0.25 0.75 -0.4375 -v 0.25 0.75 -0.5 -v 0.25 0.625 -0.4375 -v 0.25 0.625 -0.5 -v 0.125 0.75 -0.5 -v 0.125 0.75 -0.4375 -v 0.125 0.625 -0.5 -v 0.125 0.625 -0.4375 -vt 0.1875 0.9375 -vt 0.22916666666666666 0.9375 -vt 0.22916666666666666 0.875 -vt 0.1875 0.875 -vt 0.16666666666666666 0.9375 -vt 0.1875 0.9375 -vt 0.1875 0.875 -vt 0.16666666666666666 0.875 -vt 0.25 0.9375 -vt 0.2916666666666667 0.9375 -vt 0.2916666666666667 0.875 -vt 0.25 0.875 -vt 0.22916666666666666 0.9375 -vt 0.25 0.9375 -vt 0.25 0.875 -vt 0.22916666666666666 0.875 -vt 0.22916666666666666 0.9375 -vt 0.1875 0.9375 -vt 0.1875 0.96875 -vt 0.22916666666666666 0.96875 -vt 0.2708333333333333 0.96875 -vt 0.22916666666666666 0.96875 -vt 0.22916666666666666 0.9375 -vt 0.2708333333333333 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o head -v -0.125 0.75 -0.4375 -v -0.125 0.75 -0.5 -v -0.125 0.625 -0.4375 -v -0.125 0.625 -0.5 -v -0.25 0.75 -0.5 -v -0.25 0.75 -0.4375 -v -0.25 0.625 -0.5 -v -0.25 0.625 -0.4375 -vt 0.3333333333333333 0.9375 -vt 0.375 0.9375 -vt 0.375 0.875 -vt 0.3333333333333333 0.875 -vt 0.3125 0.9375 -vt 0.3333333333333333 0.9375 -vt 0.3333333333333333 0.875 -vt 0.3125 0.875 -vt 0.3958333333333333 0.9375 -vt 0.4375 0.9375 -vt 0.4375 0.875 -vt 0.3958333333333333 0.875 -vt 0.375 0.9375 -vt 0.3958333333333333 0.9375 -vt 0.3958333333333333 0.875 -vt 0.375 0.875 -vt 0.375 0.9375 -vt 0.3333333333333333 0.9375 -vt 0.3333333333333333 0.96875 -vt 0.375 0.96875 -vt 0.4166666666666667 0.96875 -vt 0.375 0.96875 -vt 0.375 0.9375 -vt 0.4166666666666667 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o head -v 0.125 0.375 -0.5625 -v 0.125 0.375 -0.75 -v 0.125 0.25 -0.5625 -v 0.125 0.25 -0.75 -v -0.125 0.375 -0.75 -v -0.125 0.375 -0.5625 -v -0.125 0.25 -0.75 -v -0.125 0.25 -0.5625 -vt 0.1875 0.34375 -vt 0.2708333333333333 0.34375 -vt 0.2708333333333333 0.28125 -vt 0.1875 0.28125 -vt 0.125 0.34375 -vt 0.1875 0.34375 -vt 0.1875 0.28125 -vt 0.125 0.28125 -vt 0.3333333333333333 0.34375 -vt 0.4166666666666667 0.34375 -vt 0.4166666666666667 0.28125 -vt 0.3333333333333333 0.28125 -vt 0.2708333333333333 0.34375 -vt 0.3333333333333333 0.34375 -vt 0.3333333333333333 0.28125 -vt 0.2708333333333333 0.28125 -vt 0.2708333333333333 0.34375 -vt 0.1875 0.34375 -vt 0.1875 0.4375 -vt 0.2708333333333333 0.4375 -vt 0.3541666666666667 0.4375 -vt 0.2708333333333333 0.4375 -vt 0.2708333333333333 0.34375 -vt 0.3541666666666667 0.34375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o leg0 -v 0.18781249999999994 0.375 0.4375 -v 0.18781249999999994 0.375 0.3125 -v 0.18781249999999994 0 0.4375 -v 0.18781249999999994 0 0.3125 -v 0.06281249999999994 0.375 0.3125 -v 0.06281249999999994 0.375 0.4375 -v 0.06281249999999994 0 0.3125 -v 0.06281249999999994 0 0.4375 -vt 0.3125 0.1875 -vt 0.3541666666666667 0.1875 -vt 0.3541666666666667 0 -vt 0.3125 0 -vt 0.2708333333333333 0.1875 -vt 0.3125 0.1875 -vt 0.3125 0 -vt 0.2708333333333333 0 -vt 0.3958333333333333 0.1875 -vt 0.4375 0.1875 -vt 0.4375 0 -vt 0.3958333333333333 0 -vt 0.3541666666666667 0.1875 -vt 0.3958333333333333 0.1875 -vt 0.3958333333333333 0 -vt 0.3541666666666667 0 -vt 0.3541666666666667 0.1875 -vt 0.3125 0.1875 -vt 0.3125 0.25 -vt 0.3541666666666667 0.25 -vt 0.3958333333333333 0.25 -vt 0.3541666666666667 0.25 -vt 0.3541666666666667 0.1875 -vt 0.3958333333333333 0.1875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o leg1 -v -0.0628125 0.375 0.4375 -v -0.0628125 0.375 0.3125 -v -0.0628125 0 0.4375 -v -0.0628125 0 0.3125 -v -0.1878125 0.375 0.3125 -v -0.1878125 0.375 0.4375 -v -0.1878125 0 0.3125 -v -0.1878125 0 0.4375 -vt 0.125 0.1875 -vt 0.16666666666666666 0.1875 -vt 0.16666666666666666 0 -vt 0.125 0 -vt 0.08333333333333333 0.1875 -vt 0.125 0.1875 -vt 0.125 0 -vt 0.08333333333333333 0 -vt 0.20833333333333334 0.1875 -vt 0.25 0.1875 -vt 0.25 0 -vt 0.20833333333333334 0 -vt 0.16666666666666666 0.1875 -vt 0.20833333333333334 0.1875 -vt 0.20833333333333334 0 -vt 0.16666666666666666 0 -vt 0.16666666666666666 0.1875 -vt 0.125 0.1875 -vt 0.125 0.25 -vt 0.16666666666666666 0.25 -vt 0.20833333333333334 0.25 -vt 0.16666666666666666 0.25 -vt 0.16666666666666666 0.1875 -vt 0.20833333333333334 0.1875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o leg2 -v 0.18781249999999994 0.375 0 -v 0.18781249999999994 0.375 -0.125 -v 0.18781249999999994 0 0 -v 0.18781249999999994 0 -0.125 -v 0.06281249999999994 0.375 -0.125 -v 0.06281249999999994 0.375 0 -v 0.06281249999999994 0 -0.125 -v 0.06281249999999994 0 0 -vt 0.3125 0.1875 -vt 0.3541666666666667 0.1875 -vt 0.3541666666666667 0 -vt 0.3125 0 -vt 0.2708333333333333 0.1875 -vt 0.3125 0.1875 -vt 0.3125 0 -vt 0.2708333333333333 0 -vt 0.3958333333333333 0.1875 -vt 0.4375 0.1875 -vt 0.4375 0 -vt 0.3958333333333333 0 -vt 0.3541666666666667 0.1875 -vt 0.3958333333333333 0.1875 -vt 0.3958333333333333 0 -vt 0.3541666666666667 0 -vt 0.3541666666666667 0.1875 -vt 0.3125 0.1875 -vt 0.3125 0.25 -vt 0.3541666666666667 0.25 -vt 0.3958333333333333 0.25 -vt 0.3541666666666667 0.25 -vt 0.3541666666666667 0.1875 -vt 0.3958333333333333 0.1875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o leg3 -v -0.0628125 0.375 0 -v -0.0628125 0.375 -0.125 -v -0.0628125 0 0 -v -0.0628125 0 -0.125 -v -0.1878125 0.375 -0.125 -v -0.1878125 0.375 0 -v -0.1878125 0 -0.125 -v -0.1878125 0 0 -vt 0.125 0.1875 -vt 0.16666666666666666 0.1875 -vt 0.16666666666666666 0 -vt 0.125 0 -vt 0.08333333333333333 0.1875 -vt 0.125 0.1875 -vt 0.125 0 -vt 0.08333333333333333 0 -vt 0.20833333333333334 0.1875 -vt 0.25 0.1875 -vt 0.25 0 -vt 0.20833333333333334 0 -vt 0.16666666666666666 0.1875 -vt 0.20833333333333334 0.1875 -vt 0.20833333333333334 0 -vt 0.16666666666666666 0 -vt 0.16666666666666666 0.1875 -vt 0.125 0.1875 -vt 0.125 0.25 -vt 0.16666666666666666 0.25 -vt 0.20833333333333334 0.25 -vt 0.16666666666666666 0.25 -vt 0.16666666666666666 0.1875 -vt 0.20833333333333334 0.1875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o tail -v 0.125 0.671875 0.5 -v 0.125 0.359375 0.5 -v 0.125 0.671875 1.0625 -v 0.125 0.3593749999999999 1.0625 -v -0.125 0.359375 0.5 -v -0.125 0.671875 0.5 -v -0.125 0.3593749999999999 1.0625 -v -0.125 0.671875 1.0625 -vt 0.7291666666666666 0.84375 -vt 0.8125 0.84375 -vt 0.8125 0.5625 -vt 0.7291666666666666 0.5625 -vt 0.625 0.84375 -vt 0.7291666666666666 0.84375 -vt 0.7291666666666666 0.5625 -vt 0.625 0.5625 -vt 0.9166666666666666 0.84375 -vt 1 0.84375 -vt 1 0.5625 -vt 0.9166666666666666 0.5625 -vt 0.8125 0.84375 -vt 0.9166666666666666 0.84375 -vt 0.9166666666666666 0.5625 -vt 0.8125 0.5625 -vt 0.8125 0.84375 -vt 0.7291666666666666 0.84375 -vt 0.7291666666666666 1 -vt 0.8125 1 -vt 0.8958333333333334 1 -vt 0.8125 1 -vt 0.8125 0.84375 -vt 0.8958333333333334 0.84375 -vn 0 -1 -2.220446049250313e-16 -vn 1 0 0 -vn 0 1 2.220446049250313e-16 -vn -1 0 0 -vn 0 2.220446049250313e-16 -1 -vn 0 -2.220446049250313e-16 1 -usemtl m_55d42d08-0bdc-6d16-75c7-074abfaa1062 -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/frog.obj b/renderer/viewer/three/entity/models/frog.obj deleted file mode 100644 index e76a114e..00000000 --- a/renderer/viewer/three/entity/models/frog.obj +++ /dev/null @@ -1,739 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o body -v 0.21875 0.25 0.3125 -v 0.21875 0.25 -0.25 -v 0.21875 0.0625 0.3125 -v 0.21875 0.0625 -0.25 -v -0.21875 0.25 -0.25 -v -0.21875 0.25 0.3125 -v -0.21875 0.0625 -0.25 -v -0.21875 0.0625 0.3125 -vt 0.25 0.7916666666666666 -vt 0.3958333333333333 0.7916666666666666 -vt 0.3958333333333333 0.7291666666666667 -vt 0.25 0.7291666666666667 -vt 0.0625 0.7916666666666666 -vt 0.25 0.7916666666666666 -vt 0.25 0.7291666666666667 -vt 0.0625 0.7291666666666667 -vt 0.5833333333333334 0.7916666666666666 -vt 0.7291666666666666 0.7916666666666666 -vt 0.7291666666666666 0.7291666666666667 -vt 0.5833333333333334 0.7291666666666667 -vt 0.3958333333333333 0.7916666666666666 -vt 0.5833333333333334 0.7916666666666666 -vt 0.5833333333333334 0.7291666666666667 -vt 0.3958333333333333 0.7291666666666667 -vt 0.3958333333333333 0.7916666666666666 -vt 0.25 0.7916666666666666 -vt 0.25 0.9791666666666666 -vt 0.3958333333333333 0.9791666666666666 -vt 0.5416666666666666 0.9791666666666666 -vt 0.3958333333333333 0.9791666666666666 -vt 0.3958333333333333 0.7916666666666666 -vt 0.5416666666666666 0.7916666666666666 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o body -v 0.21875 0.1875 0.3125 -v 0.21875 0.1875 -0.25 -v 0.21875 0.1875 0.3125 -v 0.21875 0.1875 -0.25 -v -0.21875 0.1875 -0.25 -v -0.21875 0.1875 0.3125 -v -0.21875 0.1875 -0.25 -v -0.21875 0.1875 0.3125 -vt 0.6666666666666666 0.35416666666666663 -vt 0.8125 0.35416666666666663 -vt 0.8125 0.35416666666666663 -vt 0.6666666666666666 0.35416666666666663 -vt 0.4791666666666667 0.35416666666666663 -vt 0.6666666666666666 0.35416666666666663 -vt 0.6666666666666666 0.35416666666666663 -vt 0.4791666666666667 0.35416666666666663 -vt 1 0.35416666666666663 -vt 1.1458333333333333 0.35416666666666663 -vt 1.1458333333333333 0.35416666666666663 -vt 1 0.35416666666666663 -vt 0.8125 0.35416666666666663 -vt 1 0.35416666666666663 -vt 1 0.35416666666666663 -vt 0.8125 0.35416666666666663 -vt 0.8125 0.35416666666666663 -vt 0.6666666666666666 0.35416666666666663 -vt 0.6666666666666666 0.5416666666666667 -vt 0.8125 0.5416666666666667 -vt 0.9583333333333334 0.5416666666666667 -vt 0.8125 0.5416666666666667 -vt 0.8125 0.35416666666666663 -vt 0.9583333333333334 0.35416666666666663 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o head -v 0.21875 0.3125 0.3125 -v 0.21875 0.3125 -0.25 -v 0.21875 0.3125 0.3125 -v 0.21875 0.3125 -0.25 -v -0.21875 0.3125 -0.25 -v -0.21875 0.3125 0.3125 -v -0.21875 0.3125 -0.25 -v -0.21875 0.3125 0.3125 -vt 0.6666666666666666 0.5416666666666667 -vt 0.8125 0.5416666666666667 -vt 0.8125 0.5416666666666667 -vt 0.6666666666666666 0.5416666666666667 -vt 0.4791666666666667 0.5416666666666667 -vt 0.6666666666666666 0.5416666666666667 -vt 0.6666666666666666 0.5416666666666667 -vt 0.4791666666666667 0.5416666666666667 -vt 1 0.5416666666666667 -vt 1.1458333333333333 0.5416666666666667 -vt 1.1458333333333333 0.5416666666666667 -vt 1 0.5416666666666667 -vt 0.8125 0.5416666666666667 -vt 1 0.5416666666666667 -vt 1 0.5416666666666667 -vt 0.8125 0.5416666666666667 -vt 0.8125 0.5416666666666667 -vt 0.6666666666666666 0.5416666666666667 -vt 0.6666666666666666 0.7291666666666667 -vt 0.8125 0.7291666666666667 -vt 0.9583333333333334 0.7291666666666667 -vt 0.8125 0.7291666666666667 -vt 0.8125 0.5416666666666667 -vt 0.9583333333333334 0.5416666666666667 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o head -v 0.21875 0.375 0.3125 -v 0.21875 0.375 -0.25 -v 0.21875 0.1875 0.3125 -v 0.21875 0.1875 -0.25 -v -0.21875 0.375 -0.25 -v -0.21875 0.375 0.3125 -v -0.21875 0.1875 -0.25 -v -0.21875 0.1875 0.3125 -vt 0.1875 0.5416666666666667 -vt 0.3333333333333333 0.5416666666666667 -vt 0.3333333333333333 0.47916666666666663 -vt 0.1875 0.47916666666666663 -vt 0 0.5416666666666667 -vt 0.1875 0.5416666666666667 -vt 0.1875 0.47916666666666663 -vt 0 0.47916666666666663 -vt 0.5208333333333334 0.5416666666666667 -vt 0.6666666666666666 0.5416666666666667 -vt 0.6666666666666666 0.47916666666666663 -vt 0.5208333333333334 0.47916666666666663 -vt 0.3333333333333333 0.5416666666666667 -vt 0.5208333333333334 0.5416666666666667 -vt 0.5208333333333334 0.47916666666666663 -vt 0.3333333333333333 0.47916666666666663 -vt 0.3333333333333333 0.5416666666666667 -vt 0.1875 0.5416666666666667 -vt 0.1875 0.7291666666666667 -vt 0.3333333333333333 0.7291666666666667 -vt 0.4791666666666667 0.7291666666666667 -vt 0.3333333333333333 0.7291666666666667 -vt 0.3333333333333333 0.5416666666666667 -vt 0.4791666666666667 0.5416666666666667 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o right_eye -v 0.21875 0.5 0 -v 0.21875 0.5 -0.1875 -v 0.21875 0.375 0 -v 0.21875 0.375 -0.1875 -v 0.03125 0.5 -0.1875 -v 0.03125 0.5 0 -v 0.03125 0.375 -0.1875 -v 0.03125 0.375 0 -vt 0.0625 0.9375 -vt 0.125 0.9375 -vt 0.125 0.8958333333333334 -vt 0.0625 0.8958333333333334 -vt 0 0.9375 -vt 0.0625 0.9375 -vt 0.0625 0.8958333333333334 -vt 0 0.8958333333333334 -vt 0.1875 0.9375 -vt 0.25 0.9375 -vt 0.25 0.8958333333333334 -vt 0.1875 0.8958333333333334 -vt 0.125 0.9375 -vt 0.1875 0.9375 -vt 0.1875 0.8958333333333334 -vt 0.125 0.8958333333333334 -vt 0.125 0.9375 -vt 0.0625 0.9375 -vt 0.0625 1 -vt 0.125 1 -vt 0.1875 1 -vt 0.125 1 -vt 0.125 0.9375 -vt 0.1875 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o left_eye -v -0.03125 0.5 0 -v -0.03125 0.5 -0.1875 -v -0.03125 0.375 0 -v -0.03125 0.375 -0.1875 -v -0.21875 0.5 -0.1875 -v -0.21875 0.5 0 -v -0.21875 0.375 -0.1875 -v -0.21875 0.375 0 -vt 0.0625 0.8333333333333334 -vt 0.125 0.8333333333333334 -vt 0.125 0.7916666666666666 -vt 0.0625 0.7916666666666666 -vt 0 0.8333333333333334 -vt 0.0625 0.8333333333333334 -vt 0.0625 0.7916666666666666 -vt 0 0.7916666666666666 -vt 0.1875 0.8333333333333334 -vt 0.25 0.8333333333333334 -vt 0.25 0.7916666666666666 -vt 0.1875 0.7916666666666666 -vt 0.125 0.8333333333333334 -vt 0.1875 0.8333333333333334 -vt 0.1875 0.7916666666666666 -vt 0.125 0.7916666666666666 -vt 0.125 0.8333333333333334 -vt 0.0625 0.8333333333333334 -vt 0.0625 0.8958333333333334 -vt 0.125 0.8958333333333334 -vt 0.1875 0.8958333333333334 -vt 0.125 0.8958333333333334 -vt 0.125 0.8333333333333334 -vt 0.1875 0.8333333333333334 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o croaking_body -v 0.21250000000000002 0.1875 -0.0625 -v 0.21250000000000002 0.1875 -0.2375 -v 0.21250000000000002 0.07499999999999996 -0.0625 -v 0.21250000000000002 0.07499999999999996 -0.2375 -v -0.21250000000000002 0.1875 -0.2375 -v -0.21250000000000002 0.1875 -0.0625 -v -0.21250000000000002 0.07499999999999996 -0.2375 -v -0.21250000000000002 0.07499999999999996 -0.0625 -vt 0.6041666666666666 0.8333333333333334 -vt 0.75 0.8333333333333334 -vt 0.75 0.7916666666666666 -vt 0.6041666666666666 0.7916666666666666 -vt 0.5416666666666666 0.8333333333333334 -vt 0.6041666666666666 0.8333333333333334 -vt 0.6041666666666666 0.7916666666666666 -vt 0.5416666666666666 0.7916666666666666 -vt 0.8125 0.8333333333333334 -vt 0.9583333333333334 0.8333333333333334 -vt 0.9583333333333334 0.7916666666666666 -vt 0.8125 0.7916666666666666 -vt 0.75 0.8333333333333334 -vt 0.8125 0.8333333333333334 -vt 0.8125 0.7916666666666666 -vt 0.75 0.7916666666666666 -vt 0.75 0.8333333333333334 -vt 0.6041666666666666 0.8333333333333334 -vt 0.6041666666666666 0.8958333333333334 -vt 0.75 0.8958333333333334 -vt 0.8958333333333334 0.8958333333333334 -vt 0.75 0.8958333333333334 -vt 0.75 0.8333333333333334 -vt 0.8958333333333334 0.8333333333333334 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o tongue -v 0.125 0.19374999999999998 0.30625 -v 0.125 0.19374999999999998 -0.13124999999999998 -v 0.125 0.19374999999999998 0.30625 -v 0.125 0.19374999999999998 -0.13124999999999998 -v -0.125 0.19374999999999998 -0.13124999999999998 -v -0.125 0.19374999999999998 0.30625 -v -0.125 0.19374999999999998 -0.13124999999999998 -v -0.125 0.19374999999999998 0.30625 -vt 0.5 0.5833333333333333 -vt 0.5833333333333334 0.5833333333333333 -vt 0.5833333333333334 0.5833333333333333 -vt 0.5 0.5833333333333333 -vt 0.3541666666666667 0.5833333333333333 -vt 0.5 0.5833333333333333 -vt 0.5 0.5833333333333333 -vt 0.3541666666666667 0.5833333333333333 -vt 0.7291666666666666 0.5833333333333333 -vt 0.8125 0.5833333333333333 -vt 0.8125 0.5833333333333333 -vt 0.7291666666666666 0.5833333333333333 -vt 0.5833333333333334 0.5833333333333333 -vt 0.7291666666666666 0.5833333333333333 -vt 0.7291666666666666 0.5833333333333333 -vt 0.5833333333333334 0.5833333333333333 -vt 0.5833333333333334 0.5833333333333333 -vt 0.5 0.5833333333333333 -vt 0.5 0.7291666666666667 -vt 0.5833333333333334 0.7291666666666667 -vt 0.6666666666666666 0.7291666666666667 -vt 0.5833333333333334 0.7291666666666667 -vt 0.5833333333333334 0.5833333333333333 -vt 0.6666666666666666 0.5833333333333333 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o left_arm -v -0.1875 0.1875 -0.03125 -v -0.1875 0.1875 -0.21875 -v -0.1875 0 -0.03125 -v -0.1875 0 -0.21875 -v -0.3125 0.1875 -0.21875 -v -0.3125 0.1875 -0.03125 -v -0.3125 0 -0.21875 -v -0.3125 0 -0.03125 -vt 0.0625 0.27083333333333337 -vt 0.10416666666666667 0.27083333333333337 -vt 0.10416666666666667 0.20833333333333337 -vt 0.0625 0.20833333333333337 -vt 0 0.27083333333333337 -vt 0.0625 0.27083333333333337 -vt 0.0625 0.20833333333333337 -vt 0 0.20833333333333337 -vt 0.16666666666666666 0.27083333333333337 -vt 0.20833333333333334 0.27083333333333337 -vt 0.20833333333333334 0.20833333333333337 -vt 0.16666666666666666 0.20833333333333337 -vt 0.10416666666666667 0.27083333333333337 -vt 0.16666666666666666 0.27083333333333337 -vt 0.16666666666666666 0.20833333333333337 -vt 0.10416666666666667 0.20833333333333337 -vt 0.10416666666666667 0.27083333333333337 -vt 0.0625 0.27083333333333337 -vt 0.0625 0.33333333333333337 -vt 0.10416666666666667 0.33333333333333337 -vt 0.14583333333333334 0.33333333333333337 -vt 0.10416666666666667 0.33333333333333337 -vt 0.10416666666666667 0.27083333333333337 -vt 0.14583333333333334 0.27083333333333337 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o left_arm -v 0 -0.0006249999999999867 0.03125 -v 0 -0.0006249999999999867 -0.46875 -v 0 -0.0006249999999999867 0.03125 -v 0 -0.0006249999999999867 -0.46875 -v -0.5 -0.0006249999999999867 -0.46875 -v -0.5 -0.0006249999999999867 0.03125 -v -0.5 -0.0006249999999999867 -0.46875 -v -0.5 -0.0006249999999999867 0.03125 -vt 0.5416666666666666 0 -vt 0.7083333333333334 0 -vt 0.7083333333333334 0 -vt 0.5416666666666666 0 -vt 0.375 0 -vt 0.5416666666666666 0 -vt 0.5416666666666666 0 -vt 0.375 0 -vt 0.875 0 -vt 1.0416666666666667 0 -vt 1.0416666666666667 0 -vt 0.875 0 -vt 0.7083333333333334 0 -vt 0.875 0 -vt 0.875 0 -vt 0.7083333333333334 0 -vt 0.7083333333333334 0 -vt 0.5416666666666666 0 -vt 0.5416666666666666 0.16666666666666663 -vt 0.7083333333333334 0.16666666666666663 -vt 0.875 0.16666666666666663 -vt 0.7083333333333334 0.16666666666666663 -vt 0.7083333333333334 0 -vt 0.875 0 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o right_arm -v 0.3125 0.1875 -0.03125 -v 0.3125 0.1875 -0.21875 -v 0.3125 0 -0.03125 -v 0.3125 0 -0.21875 -v 0.1875 0.1875 -0.21875 -v 0.1875 0.1875 -0.03125 -v 0.1875 0 -0.21875 -v 0.1875 0 -0.03125 -vt 0.0625 0.14583333333333337 -vt 0.10416666666666667 0.14583333333333337 -vt 0.10416666666666667 0.08333333333333337 -vt 0.0625 0.08333333333333337 -vt 0 0.14583333333333337 -vt 0.0625 0.14583333333333337 -vt 0.0625 0.08333333333333337 -vt 0 0.08333333333333337 -vt 0.16666666666666666 0.14583333333333337 -vt 0.20833333333333334 0.14583333333333337 -vt 0.20833333333333334 0.08333333333333337 -vt 0.16666666666666666 0.08333333333333337 -vt 0.10416666666666667 0.14583333333333337 -vt 0.16666666666666666 0.14583333333333337 -vt 0.16666666666666666 0.08333333333333337 -vt 0.10416666666666667 0.08333333333333337 -vt 0.10416666666666667 0.14583333333333337 -vt 0.0625 0.14583333333333337 -vt 0.0625 0.20833333333333337 -vt 0.10416666666666667 0.20833333333333337 -vt 0.14583333333333334 0.20833333333333337 -vt 0.10416666666666667 0.20833333333333337 -vt 0.10416666666666667 0.14583333333333337 -vt 0.14583333333333334 0.14583333333333337 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 -o right_arm -v 0.5 -0.0006249999999999867 0.03125 -v 0.5 -0.0006249999999999867 -0.46875 -v 0.5 -0.0006249999999999867 0.03125 -v 0.5 -0.0006249999999999867 -0.46875 -v 0 -0.0006249999999999867 -0.46875 -v 0 -0.0006249999999999867 0.03125 -v 0 -0.0006249999999999867 -0.46875 -v 0 -0.0006249999999999867 0.03125 -vt 0.20833333333333334 0 -vt 0.375 0 -vt 0.375 0 -vt 0.20833333333333334 0 -vt 0.041666666666666664 0 -vt 0.20833333333333334 0 -vt 0.20833333333333334 0 -vt 0.041666666666666664 0 -vt 0.5416666666666666 0 -vt 0.7083333333333334 0 -vt 0.7083333333333334 0 -vt 0.5416666666666666 0 -vt 0.375 0 -vt 0.5416666666666666 0 -vt 0.5416666666666666 0 -vt 0.375 0 -vt 0.375 0 -vt 0.20833333333333334 0 -vt 0.20833333333333334 0.16666666666666663 -vt 0.375 0.16666666666666663 -vt 0.5416666666666666 0.16666666666666663 -vt 0.375 0.16666666666666663 -vt 0.375 0 -vt 0.5416666666666666 0 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 -f 92/268/67 95/267/67 93/266/67 90/265/67 -f 91/272/68 92/271/68 90/270/68 89/269/68 -f 96/276/69 91/275/69 89/274/69 94/273/69 -f 95/280/70 96/279/70 94/278/70 93/277/70 -f 94/284/71 89/283/71 90/282/71 93/281/71 -f 95/288/72 92/287/72 91/286/72 96/285/72 -o left_leg -v -0.15625 0.1875 0.375 -v -0.15625 0.1875 0.125 -v -0.15625 0 0.375 -v -0.15625 0 0.125 -v -0.34375 0.1875 0.125 -v -0.34375 0.1875 0.375 -v -0.34375 0 0.125 -v -0.34375 0 0.375 -vt 0.375 0.39583333333333337 -vt 0.4375 0.39583333333333337 -vt 0.4375 0.33333333333333337 -vt 0.375 0.33333333333333337 -vt 0.2916666666666667 0.39583333333333337 -vt 0.375 0.39583333333333337 -vt 0.375 0.33333333333333337 -vt 0.2916666666666667 0.33333333333333337 -vt 0.5208333333333334 0.39583333333333337 -vt 0.5833333333333334 0.39583333333333337 -vt 0.5833333333333334 0.33333333333333337 -vt 0.5208333333333334 0.33333333333333337 -vt 0.4375 0.39583333333333337 -vt 0.5208333333333334 0.39583333333333337 -vt 0.5208333333333334 0.33333333333333337 -vt 0.4375 0.33333333333333337 -vt 0.4375 0.39583333333333337 -vt 0.375 0.39583333333333337 -vt 0.375 0.47916666666666663 -vt 0.4375 0.47916666666666663 -vt 0.5 0.47916666666666663 -vt 0.4375 0.47916666666666663 -vt 0.4375 0.39583333333333337 -vt 0.5 0.39583333333333337 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 -f 100/292/73 103/291/73 101/290/73 98/289/73 -f 99/296/74 100/295/74 98/294/74 97/293/74 -f 104/300/75 99/299/75 97/298/75 102/297/75 -f 103/304/76 104/303/76 102/302/76 101/301/76 -f 102/308/77 97/307/77 98/306/77 101/305/77 -f 103/312/78 100/311/78 99/310/78 104/309/78 -o left_leg -v -0.09375 -0.0006249999999999867 0.5 -v -0.09375 -0.0006249999999999867 0 -v -0.09375 -0.0006249999999999867 0.5 -v -0.09375 -0.0006249999999999867 0 -v -0.59375 -0.0006249999999999867 0 -v -0.59375 -0.0006249999999999867 0.5 -v -0.59375 -0.0006249999999999867 0 -v -0.59375 -0.0006249999999999867 0.5 -vt 0.20833333333333334 0.16666666666666663 -vt 0.375 0.16666666666666663 -vt 0.375 0.16666666666666663 -vt 0.20833333333333334 0.16666666666666663 -vt 0.041666666666666664 0.16666666666666663 -vt 0.20833333333333334 0.16666666666666663 -vt 0.20833333333333334 0.16666666666666663 -vt 0.041666666666666664 0.16666666666666663 -vt 0.5416666666666666 0.16666666666666663 -vt 0.7083333333333334 0.16666666666666663 -vt 0.7083333333333334 0.16666666666666663 -vt 0.5416666666666666 0.16666666666666663 -vt 0.375 0.16666666666666663 -vt 0.5416666666666666 0.16666666666666663 -vt 0.5416666666666666 0.16666666666666663 -vt 0.375 0.16666666666666663 -vt 0.375 0.16666666666666663 -vt 0.20833333333333334 0.16666666666666663 -vt 0.20833333333333334 0.33333333333333337 -vt 0.375 0.33333333333333337 -vt 0.5416666666666666 0.33333333333333337 -vt 0.375 0.33333333333333337 -vt 0.375 0.16666666666666663 -vt 0.5416666666666666 0.16666666666666663 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 -f 108/316/79 111/315/79 109/314/79 106/313/79 -f 107/320/80 108/319/80 106/318/80 105/317/80 -f 112/324/81 107/323/81 105/322/81 110/321/81 -f 111/328/82 112/327/82 110/326/82 109/325/82 -f 110/332/83 105/331/83 106/330/83 109/329/83 -f 111/336/84 108/335/84 107/334/84 112/333/84 -o right_leg -v 0.34375 0.1875 0.375 -v 0.34375 0.1875 0.125 -v 0.34375 0 0.375 -v 0.34375 0 0.125 -v 0.15625 0.1875 0.125 -v 0.15625 0.1875 0.375 -v 0.15625 0 0.125 -v 0.15625 0 0.375 -vt 0.08333333333333333 0.39583333333333337 -vt 0.14583333333333334 0.39583333333333337 -vt 0.14583333333333334 0.33333333333333337 -vt 0.08333333333333333 0.33333333333333337 -vt 0 0.39583333333333337 -vt 0.08333333333333333 0.39583333333333337 -vt 0.08333333333333333 0.33333333333333337 -vt 0 0.33333333333333337 -vt 0.22916666666666666 0.39583333333333337 -vt 0.2916666666666667 0.39583333333333337 -vt 0.2916666666666667 0.33333333333333337 -vt 0.22916666666666666 0.33333333333333337 -vt 0.14583333333333334 0.39583333333333337 -vt 0.22916666666666666 0.39583333333333337 -vt 0.22916666666666666 0.33333333333333337 -vt 0.14583333333333334 0.33333333333333337 -vt 0.14583333333333334 0.39583333333333337 -vt 0.08333333333333333 0.39583333333333337 -vt 0.08333333333333333 0.47916666666666663 -vt 0.14583333333333334 0.47916666666666663 -vt 0.20833333333333334 0.47916666666666663 -vt 0.14583333333333334 0.47916666666666663 -vt 0.14583333333333334 0.39583333333333337 -vt 0.20833333333333334 0.39583333333333337 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 -f 116/340/85 119/339/85 117/338/85 114/337/85 -f 115/344/86 116/343/86 114/342/86 113/341/86 -f 120/348/87 115/347/87 113/346/87 118/345/87 -f 119/352/88 120/351/88 118/350/88 117/349/88 -f 118/356/89 113/355/89 114/354/89 117/353/89 -f 119/360/90 116/359/90 115/358/90 120/357/90 -o right_leg -v 0.59375 -0.0006249999999999867 0.5 -v 0.59375 -0.0006249999999999867 0 -v 0.59375 -0.0006249999999999867 0.5 -v 0.59375 -0.0006249999999999867 0 -v 0.09375 -0.0006249999999999867 0 -v 0.09375 -0.0006249999999999867 0.5 -v 0.09375 -0.0006249999999999867 0 -v 0.09375 -0.0006249999999999867 0.5 -vt 0.5416666666666666 0.16666666666666663 -vt 0.7083333333333334 0.16666666666666663 -vt 0.7083333333333334 0.16666666666666663 -vt 0.5416666666666666 0.16666666666666663 -vt 0.375 0.16666666666666663 -vt 0.5416666666666666 0.16666666666666663 -vt 0.5416666666666666 0.16666666666666663 -vt 0.375 0.16666666666666663 -vt 0.875 0.16666666666666663 -vt 1.0416666666666667 0.16666666666666663 -vt 1.0416666666666667 0.16666666666666663 -vt 0.875 0.16666666666666663 -vt 0.7083333333333334 0.16666666666666663 -vt 0.875 0.16666666666666663 -vt 0.875 0.16666666666666663 -vt 0.7083333333333334 0.16666666666666663 -vt 0.7083333333333334 0.16666666666666663 -vt 0.5416666666666666 0.16666666666666663 -vt 0.5416666666666666 0.33333333333333337 -vt 0.7083333333333334 0.33333333333333337 -vt 0.875 0.33333333333333337 -vt 0.7083333333333334 0.33333333333333337 -vt 0.7083333333333334 0.16666666666666663 -vt 0.875 0.16666666666666663 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_4288dcd0-d35c-c2c4-0fee-38c374635ee1 -f 124/364/91 127/363/91 125/362/91 122/361/91 -f 123/368/92 124/367/92 122/366/92 121/365/92 -f 128/372/93 123/371/93 121/370/93 126/369/93 -f 127/376/94 128/375/94 126/374/94 125/373/94 -f 126/380/95 121/379/95 122/378/95 125/377/95 -f 127/384/96 124/383/96 123/382/96 128/381/96 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/ghast.obj b/renderer/viewer/three/entity/models/ghast.obj deleted file mode 100644 index bed7ccb2..00000000 --- a/renderer/viewer/three/entity/models/ghast.obj +++ /dev/null @@ -1,463 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o body -v 0.5 1 0.5 -v 0.5 1 -0.5 -v 0.5 0 0.5 -v 0.5 0 -0.5 -v -0.5 1 -0.5 -v -0.5 1 0.5 -v -0.5 0 -0.5 -v -0.5 0 0.5 -vt 0.25 0.5 -vt 0.5 0.5 -vt 0.5 0 -vt 0.25 0 -vt 0 0.5 -vt 0.25 0.5 -vt 0.25 0 -vt 0 0 -vt 0.75 0.5 -vt 1 0.5 -vt 1 0 -vt 0.75 0 -vt 0.5 0.5 -vt 0.75 0.5 -vt 0.75 0 -vt 0.5 0 -vt 0.5 0.5 -vt 0.25 0.5 -vt 0.25 1 -vt 0.5 1 -vt 0.75 1 -vt 0.5 1 -vt 0.5 0.5 -vt 0.75 0.5 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o tentacles_0 -v 0.30000000000000004 0.0625 -0.25 -v 0.30000000000000004 0.0625 -0.375 -v 0.30000000000000004 -0.5 -0.25 -v 0.30000000000000004 -0.5 -0.375 -v 0.17500000000000004 0.0625 -0.375 -v 0.17500000000000004 0.0625 -0.25 -v 0.17500000000000004 -0.5 -0.375 -v 0.17500000000000004 -0.5 -0.25 -vt 0.03125 0.9375 -vt 0.0625 0.9375 -vt 0.0625 0.65625 -vt 0.03125 0.65625 -vt 0 0.9375 -vt 0.03125 0.9375 -vt 0.03125 0.65625 -vt 0 0.65625 -vt 0.09375 0.9375 -vt 0.125 0.9375 -vt 0.125 0.65625 -vt 0.09375 0.65625 -vt 0.0625 0.9375 -vt 0.09375 0.9375 -vt 0.09375 0.65625 -vt 0.0625 0.65625 -vt 0.0625 0.9375 -vt 0.03125 0.9375 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.9375 -vt 0.09375 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o tentacles_1 -v -0.01874999999999999 0.0625 -0.25 -v -0.01874999999999999 0.0625 -0.375 -v -0.01874999999999999 -0.625 -0.25 -v -0.01874999999999999 -0.625 -0.375 -v -0.14375 0.0625 -0.375 -v -0.14375 0.0625 -0.25 -v -0.14375 -0.625 -0.375 -v -0.14375 -0.625 -0.25 -vt 0.03125 0.9375 -vt 0.0625 0.9375 -vt 0.0625 0.59375 -vt 0.03125 0.59375 -vt 0 0.9375 -vt 0.03125 0.9375 -vt 0.03125 0.59375 -vt 0 0.59375 -vt 0.09375 0.9375 -vt 0.125 0.9375 -vt 0.125 0.59375 -vt 0.09375 0.59375 -vt 0.0625 0.9375 -vt 0.09375 0.9375 -vt 0.09375 0.59375 -vt 0.0625 0.59375 -vt 0.0625 0.9375 -vt 0.03125 0.9375 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.9375 -vt 0.09375 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o tentacles_2 -v -0.33125 0.0625 -0.25 -v -0.33125 0.0625 -0.375 -v -0.33125 -0.4375 -0.25 -v -0.33125 -0.4375 -0.375 -v -0.45625 0.0625 -0.375 -v -0.45625 0.0625 -0.25 -v -0.45625 -0.4375 -0.375 -v -0.45625 -0.4375 -0.25 -vt 0.03125 0.9375 -vt 0.0625 0.9375 -vt 0.0625 0.6875 -vt 0.03125 0.6875 -vt 0 0.9375 -vt 0.03125 0.9375 -vt 0.03125 0.6875 -vt 0 0.6875 -vt 0.09375 0.9375 -vt 0.125 0.9375 -vt 0.125 0.6875 -vt 0.09375 0.6875 -vt 0.0625 0.9375 -vt 0.09375 0.9375 -vt 0.09375 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.9375 -vt 0.03125 0.9375 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.9375 -vt 0.09375 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o tentacles_3 -v 0.45625000000000004 0.0625 0.0625 -v 0.45625000000000004 0.0625 -0.0625 -v 0.45625000000000004 -0.5 0.0625 -v 0.45625000000000004 -0.5 -0.0625 -v 0.33125000000000004 0.0625 -0.0625 -v 0.33125000000000004 0.0625 0.0625 -v 0.33125000000000004 -0.5 -0.0625 -v 0.33125000000000004 -0.5 0.0625 -vt 0.03125 0.9375 -vt 0.0625 0.9375 -vt 0.0625 0.65625 -vt 0.03125 0.65625 -vt 0 0.9375 -vt 0.03125 0.9375 -vt 0.03125 0.65625 -vt 0 0.65625 -vt 0.09375 0.9375 -vt 0.125 0.9375 -vt 0.125 0.65625 -vt 0.09375 0.65625 -vt 0.0625 0.9375 -vt 0.09375 0.9375 -vt 0.09375 0.65625 -vt 0.0625 0.65625 -vt 0.0625 0.9375 -vt 0.03125 0.9375 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.9375 -vt 0.09375 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o tentacles_4 -v 0.14375000000000004 0.0625 0.0625 -v 0.14375000000000004 0.0625 -0.0625 -v 0.14375000000000004 -0.75 0.0625 -v 0.14375000000000004 -0.75 -0.0625 -v 0.018750000000000044 0.0625 -0.0625 -v 0.018750000000000044 0.0625 0.0625 -v 0.018750000000000044 -0.75 -0.0625 -v 0.018750000000000044 -0.75 0.0625 -vt 0.03125 0.9375 -vt 0.0625 0.9375 -vt 0.0625 0.53125 -vt 0.03125 0.53125 -vt 0 0.9375 -vt 0.03125 0.9375 -vt 0.03125 0.53125 -vt 0 0.53125 -vt 0.09375 0.9375 -vt 0.125 0.9375 -vt 0.125 0.53125 -vt 0.09375 0.53125 -vt 0.0625 0.9375 -vt 0.09375 0.9375 -vt 0.09375 0.53125 -vt 0.0625 0.53125 -vt 0.0625 0.9375 -vt 0.03125 0.9375 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.9375 -vt 0.09375 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o tentacles_5 -v -0.175 0.0625 0.0625 -v -0.175 0.0625 -0.0625 -v -0.175 -0.625 0.0625 -v -0.175 -0.625 -0.0625 -v -0.3 0.0625 -0.0625 -v -0.3 0.0625 0.0625 -v -0.3 -0.625 -0.0625 -v -0.3 -0.625 0.0625 -vt 0.03125 0.9375 -vt 0.0625 0.9375 -vt 0.0625 0.59375 -vt 0.03125 0.59375 -vt 0 0.9375 -vt 0.03125 0.9375 -vt 0.03125 0.59375 -vt 0 0.59375 -vt 0.09375 0.9375 -vt 0.125 0.9375 -vt 0.125 0.59375 -vt 0.09375 0.59375 -vt 0.0625 0.9375 -vt 0.09375 0.9375 -vt 0.09375 0.59375 -vt 0.0625 0.59375 -vt 0.0625 0.9375 -vt 0.03125 0.9375 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.9375 -vt 0.09375 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o tentacles_6 -v 0.30000000000000004 0.0625 0.375 -v 0.30000000000000004 0.0625 0.25 -v 0.30000000000000004 -0.6875 0.375 -v 0.30000000000000004 -0.6875 0.25 -v 0.17500000000000004 0.0625 0.25 -v 0.17500000000000004 0.0625 0.375 -v 0.17500000000000004 -0.6875 0.25 -v 0.17500000000000004 -0.6875 0.375 -vt 0.03125 0.9375 -vt 0.0625 0.9375 -vt 0.0625 0.5625 -vt 0.03125 0.5625 -vt 0 0.9375 -vt 0.03125 0.9375 -vt 0.03125 0.5625 -vt 0 0.5625 -vt 0.09375 0.9375 -vt 0.125 0.9375 -vt 0.125 0.5625 -vt 0.09375 0.5625 -vt 0.0625 0.9375 -vt 0.09375 0.9375 -vt 0.09375 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.9375 -vt 0.03125 0.9375 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.9375 -vt 0.09375 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o tentacles_7 -v -0.01874999999999999 0.0625 0.375 -v -0.01874999999999999 0.0625 0.25 -v -0.01874999999999999 -0.6875 0.375 -v -0.01874999999999999 -0.6875 0.25 -v -0.14375 0.0625 0.25 -v -0.14375 0.0625 0.375 -v -0.14375 -0.6875 0.25 -v -0.14375 -0.6875 0.375 -vt 0.03125 0.9375 -vt 0.0625 0.9375 -vt 0.0625 0.5625 -vt 0.03125 0.5625 -vt 0 0.9375 -vt 0.03125 0.9375 -vt 0.03125 0.5625 -vt 0 0.5625 -vt 0.09375 0.9375 -vt 0.125 0.9375 -vt 0.125 0.5625 -vt 0.09375 0.5625 -vt 0.0625 0.9375 -vt 0.09375 0.9375 -vt 0.09375 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.9375 -vt 0.03125 0.9375 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.9375 -vt 0.09375 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o tentacles_8 -v -0.33125 0.0625 0.375 -v -0.33125 0.0625 0.25 -v -0.33125 -0.75 0.375 -v -0.33125 -0.75 0.25 -v -0.45625 0.0625 0.25 -v -0.45625 0.0625 0.375 -v -0.45625 -0.75 0.25 -v -0.45625 -0.75 0.375 -vt 0.03125 0.9375 -vt 0.0625 0.9375 -vt 0.0625 0.53125 -vt 0.03125 0.53125 -vt 0 0.9375 -vt 0.03125 0.9375 -vt 0.03125 0.53125 -vt 0 0.53125 -vt 0.09375 0.9375 -vt 0.125 0.9375 -vt 0.125 0.53125 -vt 0.09375 0.53125 -vt 0.0625 0.9375 -vt 0.09375 0.9375 -vt 0.09375 0.53125 -vt 0.0625 0.53125 -vt 0.0625 0.9375 -vt 0.03125 0.9375 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.9375 -vt 0.09375 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_be60a09e-8083-c62f-16c0-359ca5c36498 -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/goat.obj b/renderer/viewer/three/entity/models/goat.obj deleted file mode 100644 index adb8910c..00000000 --- a/renderer/viewer/three/entity/models/goat.obj +++ /dev/null @@ -1,601 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o left_back_leg -v -0.0625 0.375 0.4375 -v -0.0625 0.375 0.25 -v -0.0625 0 0.4375 -v -0.0625 0 0.25 -v -0.25 0.375 0.25 -v -0.25 0.375 0.4375 -v -0.25 0 0.25 -v -0.25 0 0.4375 -vt 0.609375 0.5 -vt 0.65625 0.5 -vt 0.65625 0.40625 -vt 0.609375 0.40625 -vt 0.5625 0.5 -vt 0.609375 0.5 -vt 0.609375 0.40625 -vt 0.5625 0.40625 -vt 0.703125 0.5 -vt 0.75 0.5 -vt 0.75 0.40625 -vt 0.703125 0.40625 -vt 0.65625 0.5 -vt 0.703125 0.5 -vt 0.703125 0.40625 -vt 0.65625 0.40625 -vt 0.65625 0.5 -vt 0.609375 0.5 -vt 0.609375 0.546875 -vt 0.65625 0.546875 -vt 0.703125 0.546875 -vt 0.65625 0.546875 -vt 0.65625 0.5 -vt 0.703125 0.5 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o right_back_leg -v 0.1875 0.375 0.4375 -v 0.1875 0.375 0.25 -v 0.1875 0 0.4375 -v 0.1875 0 0.25 -v 0 0.375 0.25 -v 0 0.375 0.4375 -v 0 0 0.25 -v 0 0 0.4375 -vt 0.8125 0.5 -vt 0.859375 0.5 -vt 0.859375 0.40625 -vt 0.8125 0.40625 -vt 0.765625 0.5 -vt 0.8125 0.5 -vt 0.8125 0.40625 -vt 0.765625 0.40625 -vt 0.90625 0.5 -vt 0.953125 0.5 -vt 0.953125 0.40625 -vt 0.90625 0.40625 -vt 0.859375 0.5 -vt 0.90625 0.5 -vt 0.90625 0.40625 -vt 0.859375 0.40625 -vt 0.859375 0.5 -vt 0.8125 0.5 -vt 0.8125 0.546875 -vt 0.859375 0.546875 -vt 0.90625 0.546875 -vt 0.859375 0.546875 -vt 0.859375 0.5 -vt 0.90625 0.5 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o right_front_leg -v 0.1875 0.625 -0.1875 -v 0.1875 0.625 -0.375 -v 0.1875 0 -0.1875 -v 0.1875 0 -0.375 -v 0 0.625 -0.375 -v 0 0.625 -0.1875 -v 0 0 -0.375 -v 0 0 -0.1875 -vt 0.8125 0.921875 -vt 0.859375 0.921875 -vt 0.859375 0.765625 -vt 0.8125 0.765625 -vt 0.765625 0.921875 -vt 0.8125 0.921875 -vt 0.8125 0.765625 -vt 0.765625 0.765625 -vt 0.90625 0.921875 -vt 0.953125 0.921875 -vt 0.953125 0.765625 -vt 0.90625 0.765625 -vt 0.859375 0.921875 -vt 0.90625 0.921875 -vt 0.90625 0.765625 -vt 0.859375 0.765625 -vt 0.859375 0.921875 -vt 0.8125 0.921875 -vt 0.8125 0.96875 -vt 0.859375 0.96875 -vt 0.90625 0.96875 -vt 0.859375 0.96875 -vt 0.859375 0.921875 -vt 0.90625 0.921875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o left_front_leg -v -0.0625 0.625 -0.1875 -v -0.0625 0.625 -0.375 -v -0.0625 0 -0.1875 -v -0.0625 0 -0.375 -v -0.25 0.625 -0.375 -v -0.25 0.625 -0.1875 -v -0.25 0 -0.375 -v -0.25 0 -0.1875 -vt 0.59375 0.921875 -vt 0.640625 0.921875 -vt 0.640625 0.765625 -vt 0.59375 0.765625 -vt 0.546875 0.921875 -vt 0.59375 0.921875 -vt 0.59375 0.765625 -vt 0.546875 0.765625 -vt 0.6875 0.921875 -vt 0.734375 0.921875 -vt 0.734375 0.765625 -vt 0.6875 0.765625 -vt 0.640625 0.921875 -vt 0.6875 0.921875 -vt 0.6875 0.765625 -vt 0.640625 0.765625 -vt 0.640625 0.921875 -vt 0.59375 0.921875 -vt 0.59375 0.96875 -vt 0.640625 0.96875 -vt 0.6875 0.96875 -vt 0.640625 0.96875 -vt 0.640625 0.921875 -vt 0.6875 0.921875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o body -v 0.25 1.0625 0.5625 -v 0.25 1.0625 -0.4375 -v 0.25 0.375 0.5625 -v 0.25 0.375 -0.4375 -v -0.3125 1.0625 -0.4375 -v -0.3125 1.0625 0.5625 -v -0.3125 0.375 -0.4375 -v -0.3125 0.375 0.5625 -vt 0.265625 0.734375 -vt 0.40625 0.734375 -vt 0.40625 0.5625 -vt 0.265625 0.5625 -vt 0.015625 0.734375 -vt 0.265625 0.734375 -vt 0.265625 0.5625 -vt 0.015625 0.5625 -vt 0.65625 0.734375 -vt 0.796875 0.734375 -vt 0.796875 0.5625 -vt 0.65625 0.5625 -vt 0.40625 0.734375 -vt 0.65625 0.734375 -vt 0.65625 0.5625 -vt 0.40625 0.5625 -vt 0.40625 0.734375 -vt 0.265625 0.734375 -vt 0.265625 0.984375 -vt 0.40625 0.984375 -vt 0.546875 0.984375 -vt 0.40625 0.984375 -vt 0.40625 0.734375 -vt 0.546875 0.734375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o body -v 0.3125 1.125 0.1875 -v 0.3125 1.125 -0.5 -v 0.3125 0.25 0.1875 -v 0.3125 0.25 -0.5 -v -0.375 1.125 -0.5 -v -0.375 1.125 0.1875 -v -0.375 0.25 -0.5 -v -0.375 0.25 0.1875 -vt 0.171875 0.390625 -vt 0.34375 0.390625 -vt 0.34375 0.171875 -vt 0.171875 0.171875 -vt 0 0.390625 -vt 0.171875 0.390625 -vt 0.171875 0.171875 -vt 0 0.171875 -vt 0.515625 0.390625 -vt 0.6875 0.390625 -vt 0.6875 0.171875 -vt 0.515625 0.171875 -vt 0.34375 0.390625 -vt 0.515625 0.390625 -vt 0.515625 0.171875 -vt 0.34375 0.171875 -vt 0.34375 0.390625 -vt 0.171875 0.390625 -vt 0.171875 0.5625 -vt 0.34375 0.5625 -vt 0.515625 0.5625 -vt 0.34375 0.5625 -vt 0.34375 0.390625 -vt 0.515625 0.390625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o Head -v 0.125 1.3707881146238856 -0.6330909565283671 -v 0.125 0.8588180869432658 -0.991576229247771 -v 0.125 1.1198484237203028 -0.2747119371519333 -v 0.125 0.607878396039683 -0.6331972098713372 -v -0.1875 0.8588180869432658 -0.991576229247771 -v -0.1875 1.3707881146238856 -0.6330909565283671 -v -0.1875 0.607878396039683 -0.6331972098713372 -v -0.1875 1.1198484237203028 -0.2747119371519333 -vt 0.6875 0.125 -vt 0.765625 0.125 -vt 0.765625 0.015625 -vt 0.6875 0.015625 -vt 0.53125 0.125 -vt 0.6875 0.125 -vt 0.6875 0.015625 -vt 0.53125 0.015625 -vt 0.921875 0.125 -vt 1 0.125 -vt 1 0.015625 -vt 0.921875 0.015625 -vt 0.765625 0.125 -vt 0.921875 0.125 -vt 0.921875 0.015625 -vt 0.765625 0.015625 -vt 0.765625 0.125 -vt 0.6875 0.125 -vt 0.6875 0.28125 -vt 0.765625 0.28125 -vt 0.84375 0.28125 -vt 0.765625 0.28125 -vt 0.765625 0.125 -vt 0.84375 0.125 -vn 0 -0.8191520442889917 -0.5735764363510463 -vn 1 0 0 -vn 0 0.8191520442889917 0.5735764363510463 -vn -1 0 0 -vn 0 0.5735764363510463 -0.8191520442889917 -vn 0 -0.5735764363510463 0.8191520442889917 -usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o Head -v 0.12437500000000001 1.625 -0.5 -v 0.12437500000000001 1.625 -0.625 -v 0.12437500000000001 1.1875 -0.5 -v 0.12437500000000001 1.1875 -0.625 -v -0.0006249999999999867 1.625 -0.625 -v -0.0006249999999999867 1.625 -0.5 -v -0.0006249999999999867 1.1875 -0.625 -v -0.0006249999999999867 1.1875 -0.5 -vt 0.21875 0.109375 -vt 0.25 0.109375 -vt 0.25 0 -vt 0.21875 0 -vt 0.1875 0.109375 -vt 0.21875 0.109375 -vt 0.21875 0 -vt 0.1875 0 -vt 0.28125 0.109375 -vt 0.3125 0.109375 -vt 0.3125 0 -vt 0.28125 0 -vt 0.25 0.109375 -vt 0.28125 0.109375 -vt 0.28125 0 -vt 0.25 0 -vt 0.25 0.109375 -vt 0.21875 0.109375 -vt 0.21875 0.140625 -vt 0.25 0.140625 -vt 0.28125 0.140625 -vt 0.25 0.140625 -vt 0.25 0.109375 -vt 0.28125 0.109375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o Head -v -0.06187500000000001 1.625 -0.5 -v -0.06187500000000001 1.625 -0.625 -v -0.06187500000000001 1.1875 -0.5 -v -0.06187500000000001 1.1875 -0.625 -v -0.186875 1.625 -0.625 -v -0.186875 1.625 -0.5 -v -0.186875 1.1875 -0.625 -v -0.186875 1.1875 -0.5 -vt 0.21875 0.109375 -vt 0.25 0.109375 -vt 0.25 0 -vt 0.21875 0 -vt 0.1875 0.109375 -vt 0.21875 0.109375 -vt 0.21875 0 -vt 0.1875 0 -vt 0.28125 0.109375 -vt 0.3125 0.109375 -vt 0.3125 0 -vt 0.28125 0 -vt 0.25 0.109375 -vt 0.28125 0.109375 -vt 0.28125 0 -vt 0.25 0 -vt 0.25 0.109375 -vt 0.21875 0.109375 -vt 0.21875 0.140625 -vt 0.25 0.140625 -vt 0.28125 0.140625 -vt 0.25 0.140625 -vt 0.25 0.109375 -vt 0.28125 0.109375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o Head -v -0.1875 1.3125 -0.5625 -v -0.1875 1.3125 -0.625 -v -0.1875 1.1875 -0.5625 -v -0.1875 1.1875 -0.625 -v -0.375 1.3125 -0.625 -v -0.375 1.3125 -0.5625 -v -0.375 1.1875 -0.625 -v -0.375 1.1875 -0.5625 -vt 0.09375 0.03125 -vt 0.046875 0.03125 -vt 0.046875 0 -vt 0.09375 0 -vt 0.109375 0.03125 -vt 0.09375 0.03125 -vt 0.09375 0 -vt 0.109375 0 -vt 0.15625 0.03125 -vt 0.109375 0.03125 -vt 0.109375 0 -vt 0.15625 0 -vt 0.046875 0.03125 -vt 0.03125 0.03125 -vt 0.03125 0 -vt 0.046875 0 -vt 0.046875 0.03125 -vt 0.09375 0.03125 -vt 0.09375 0.046875 -vt 0.046875 0.046875 -vt 0.09375 0.046875 -vt 0.140625 0.046875 -vt 0.140625 0.03125 -vt 0.09375 0.03125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o Head -v 0.3125 1.3125 -0.5625 -v 0.3125 1.3125 -0.625 -v 0.3125 1.1875 -0.5625 -v 0.3125 1.1875 -0.625 -v 0.125 1.3125 -0.625 -v 0.125 1.3125 -0.5625 -v 0.125 1.1875 -0.625 -v 0.125 1.1875 -0.5625 -vt 0.046875 0.03125 -vt 0.09375 0.03125 -vt 0.09375 0 -vt 0.046875 0 -vt 0.03125 0.03125 -vt 0.046875 0.03125 -vt 0.046875 0 -vt 0.03125 0 -vt 0.109375 0.03125 -vt 0.15625 0.03125 -vt 0.15625 0 -vt 0.109375 0 -vt 0.09375 0.03125 -vt 0.109375 0.03125 -vt 0.109375 0 -vt 0.09375 0 -vt 0.09375 0.03125 -vt 0.046875 0.03125 -vt 0.046875 0.046875 -vt 0.09375 0.046875 -vt 0.140625 0.046875 -vt 0.09375 0.046875 -vt 0.09375 0.03125 -vt 0.140625 0.03125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 -o Head -v -0.03125 0.8125 -0.5625 -v -0.03125 0.8125 -0.875 -v -0.03125 0.375 -0.5625 -v -0.03125 0.375 -0.875 -v -0.03125 0.8125 -0.875 -v -0.03125 0.8125 -0.5625 -v -0.03125 0.375 -0.875 -v -0.03125 0.375 -0.5625 -vt 0.4375 0.109375 -vt 0.4375 0.109375 -vt 0.4375 0 -vt 0.4375 0 -vt 0.359375 0.109375 -vt 0.4375 0.109375 -vt 0.4375 0 -vt 0.359375 0 -vt 0.515625 0.109375 -vt 0.515625 0.109375 -vt 0.515625 0 -vt 0.515625 0 -vt 0.4375 0.109375 -vt 0.515625 0.109375 -vt 0.515625 0 -vt 0.4375 0 -vt 0.4375 0.109375 -vt 0.4375 0.109375 -vt 0.4375 0.1875 -vt 0.4375 0.1875 -vt 0.4375 0.1875 -vt 0.4375 0.1875 -vt 0.4375 0.109375 -vt 0.4375 0.109375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 -f 92/268/67 95/267/67 93/266/67 90/265/67 -f 91/272/68 92/271/68 90/270/68 89/269/68 -f 96/276/69 91/275/69 89/274/69 94/273/69 -f 95/280/70 96/279/70 94/278/70 93/277/70 -f 94/284/71 89/283/71 90/282/71 93/281/71 -f 95/288/72 92/287/72 91/286/72 96/285/72 -o HeadMain -v 0.125 1.3707881146238856 -0.6330909565283671 -v 0.125 0.8588180869432658 -0.991576229247771 -v 0.125 1.1198484237203028 -0.2747119371519333 -v 0.125 0.607878396039683 -0.6331972098713372 -v -0.1875 0.8588180869432658 -0.991576229247771 -v -0.1875 1.3707881146238856 -0.6330909565283671 -v -0.1875 0.607878396039683 -0.6331972098713372 -v -0.1875 1.1198484237203028 -0.2747119371519333 -vt 0.6875 0.125 -vt 0.765625 0.125 -vt 0.765625 0.015625 -vt 0.6875 0.015625 -vt 0.53125 0.125 -vt 0.6875 0.125 -vt 0.6875 0.015625 -vt 0.53125 0.015625 -vt 0.921875 0.125 -vt 1 0.125 -vt 1 0.015625 -vt 0.921875 0.015625 -vt 0.765625 0.125 -vt 0.921875 0.125 -vt 0.921875 0.015625 -vt 0.765625 0.015625 -vt 0.765625 0.125 -vt 0.6875 0.125 -vt 0.6875 0.28125 -vt 0.765625 0.28125 -vt 0.84375 0.28125 -vt 0.765625 0.28125 -vt 0.765625 0.125 -vt 0.84375 0.125 -vn 0 -0.8191520442889917 -0.5735764363510463 -vn 1 0 0 -vn 0 0.8191520442889917 0.5735764363510463 -vn -1 0 0 -vn 0 0.5735764363510463 -0.8191520442889917 -vn 0 -0.5735764363510463 0.8191520442889917 -usemtl m_bd56fb3d-3403-c92f-d539-6df121464423 -f 100/292/73 103/291/73 101/290/73 98/289/73 -f 99/296/74 100/295/74 98/294/74 97/293/74 -f 104/300/75 99/299/75 97/298/75 102/297/75 -f 103/304/76 104/303/76 102/302/76 101/301/76 -f 102/308/77 97/307/77 98/306/77 101/305/77 -f 103/312/78 100/311/78 99/310/78 104/309/78 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/guardian.obj b/renderer/viewer/three/entity/models/guardian.obj deleted file mode 100644 index 0addde29..00000000 --- a/renderer/viewer/three/entity/models/guardian.obj +++ /dev/null @@ -1,1015 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o head -v 0.375 0.875 0.5 -v 0.375 0.875 -0.5 -v 0.375 0.125 0.5 -v 0.375 0.125 -0.5 -v -0.375 0.875 -0.5 -v -0.375 0.875 0.5 -v -0.375 0.125 -0.5 -v -0.375 0.125 0.5 -vt 0.25 0.75 -vt 0.4375 0.75 -vt 0.4375 0.5625 -vt 0.25 0.5625 -vt 0 0.75 -vt 0.25 0.75 -vt 0.25 0.5625 -vt 0 0.5625 -vt 0.6875 0.75 -vt 0.875 0.75 -vt 0.875 0.5625 -vt 0.6875 0.5625 -vt 0.4375 0.75 -vt 0.6875 0.75 -vt 0.6875 0.5625 -vt 0.4375 0.5625 -vt 0.4375 0.75 -vt 0.25 0.75 -vt 0.25 1 -vt 0.4375 1 -vt 0.625 1 -vt 0.4375 1 -vt 0.4375 0.75 -vt 0.625 0.75 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o head -v 0.5 0.875 0.375 -v 0.5 0.875 -0.375 -v 0.5 0.125 0.375 -v 0.5 0.125 -0.375 -v 0.375 0.875 -0.375 -v 0.375 0.875 0.375 -v 0.375 0.125 -0.375 -v 0.375 0.125 0.375 -vt 0.1875 0.375 -vt 0.21875 0.375 -vt 0.21875 0.1875 -vt 0.1875 0.1875 -vt 0 0.375 -vt 0.1875 0.375 -vt 0.1875 0.1875 -vt 0 0.1875 -vt 0.40625 0.375 -vt 0.4375 0.375 -vt 0.4375 0.1875 -vt 0.40625 0.1875 -vt 0.21875 0.375 -vt 0.40625 0.375 -vt 0.40625 0.1875 -vt 0.21875 0.1875 -vt 0.21875 0.375 -vt 0.1875 0.375 -vt 0.1875 0.5625 -vt 0.21875 0.5625 -vt 0.25 0.5625 -vt 0.21875 0.5625 -vt 0.21875 0.375 -vt 0.25 0.375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o head -v -0.375 0.875 0.375 -v -0.375 0.875 -0.375 -v -0.375 0.125 0.375 -v -0.375 0.125 -0.375 -v -0.5 0.875 -0.375 -v -0.5 0.875 0.375 -v -0.5 0.125 -0.375 -v -0.5 0.125 0.375 -vt 0.21875 0.375 -vt 0.1875 0.375 -vt 0.1875 0.1875 -vt 0.21875 0.1875 -vt 0.40625 0.375 -vt 0.21875 0.375 -vt 0.21875 0.1875 -vt 0.40625 0.1875 -vt 0.4375 0.375 -vt 0.40625 0.375 -vt 0.40625 0.1875 -vt 0.4375 0.1875 -vt 0.1875 0.375 -vt 0 0.375 -vt 0 0.1875 -vt 0.1875 0.1875 -vt 0.1875 0.375 -vt 0.21875 0.375 -vt 0.21875 0.5625 -vt 0.1875 0.5625 -vt 0.21875 0.5625 -vt 0.25 0.5625 -vt 0.25 0.375 -vt 0.21875 0.375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o head -v 0.375 1 0.375 -v 0.375 1 -0.375 -v 0.375 0.875 0.375 -v 0.375 0.875 -0.375 -v -0.375 1 -0.375 -v -0.375 1 0.375 -v -0.375 0.875 -0.375 -v -0.375 0.875 0.375 -vt 0.625 0.1875 -vt 0.4375 0.1875 -vt 0.4375 0.15625 -vt 0.625 0.15625 -vt 0.8125 0.1875 -vt 0.625 0.1875 -vt 0.625 0.15625 -vt 0.8125 0.15625 -vt 1 0.1875 -vt 0.8125 0.1875 -vt 0.8125 0.15625 -vt 1 0.15625 -vt 0.4375 0.1875 -vt 0.25 0.1875 -vt 0.25 0.15625 -vt 0.4375 0.15625 -vt 0.4375 0.1875 -vt 0.625 0.1875 -vt 0.625 0.375 -vt 0.4375 0.375 -vt 0.625 0.375 -vt 0.8125 0.375 -vt 0.8125 0.1875 -vt 0.625 0.1875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o head -v 0.375 0.125 0.375 -v 0.375 0.125 -0.375 -v 0.375 0 0.375 -v 0.375 0 -0.375 -v -0.375 0.125 -0.375 -v -0.375 0.125 0.375 -v -0.375 0 -0.375 -v -0.375 0 0.375 -vt 0.625 0.1875 -vt 0.4375 0.1875 -vt 0.4375 0.15625 -vt 0.625 0.15625 -vt 0.8125 0.1875 -vt 0.625 0.1875 -vt 0.625 0.15625 -vt 0.8125 0.15625 -vt 1 0.1875 -vt 0.8125 0.1875 -vt 0.8125 0.15625 -vt 1 0.15625 -vt 0.4375 0.1875 -vt 0.25 0.1875 -vt 0.25 0.15625 -vt 0.4375 0.15625 -vt 0.4375 0.1875 -vt 0.625 0.1875 -vt 0.625 0.375 -vt 0.4375 0.375 -vt 0.625 0.375 -vt 0.8125 0.375 -vt 0.8125 0.1875 -vt 0.625 0.1875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o eye -v 0.0625 0.5625 -0.453125 -v 0.0625 0.5625 -0.515625 -v 0.0625 0.4375 -0.453125 -v 0.0625 0.4375 -0.515625 -v -0.0625 0.5625 -0.515625 -v -0.0625 0.5625 -0.453125 -v -0.0625 0.4375 -0.515625 -v -0.0625 0.4375 -0.453125 -vt 0.140625 0.984375 -vt 0.171875 0.984375 -vt 0.171875 0.953125 -vt 0.140625 0.953125 -vt 0.125 0.984375 -vt 0.140625 0.984375 -vt 0.140625 0.953125 -vt 0.125 0.953125 -vt 0.1875 0.984375 -vt 0.21875 0.984375 -vt 0.21875 0.953125 -vt 0.1875 0.953125 -vt 0.171875 0.984375 -vt 0.1875 0.984375 -vt 0.1875 0.953125 -vt 0.171875 0.953125 -vt 0.171875 0.984375 -vt 0.140625 0.984375 -vt 0.140625 1 -vt 0.171875 1 -vt 0.203125 1 -vt 0.171875 1 -vt 0.171875 0.984375 -vt 0.203125 0.984375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o tailpart0 -v 0.125 0.625 1 -v 0.125 0.625 0.5 -v 0.125 0.375 1 -v 0.125 0.375 0.5 -v -0.125 0.625 0.5 -v -0.125 0.625 1 -v -0.125 0.375 0.5 -v -0.125 0.375 1 -vt 0.75 0.875 -vt 0.8125 0.875 -vt 0.8125 0.8125 -vt 0.75 0.8125 -vt 0.625 0.875 -vt 0.75 0.875 -vt 0.75 0.8125 -vt 0.625 0.8125 -vt 0.9375 0.875 -vt 1 0.875 -vt 1 0.8125 -vt 0.9375 0.8125 -vt 0.8125 0.875 -vt 0.9375 0.875 -vt 0.9375 0.8125 -vt 0.8125 0.8125 -vt 0.8125 0.875 -vt 0.75 0.875 -vt 0.75 1 -vt 0.8125 1 -vt 0.875 1 -vt 0.8125 1 -vt 0.8125 0.875 -vt 0.875 0.875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o tailpart1 -v 0.09375 0.625 1.4375 -v 0.09375 0.625 1 -v 0.09375 0.4375 1.4375 -v 0.09375 0.4375 1 -v -0.09375 0.625 1 -v -0.09375 0.625 1.4375 -v -0.09375 0.4375 1 -v -0.09375 0.4375 1.4375 -vt 0.109375 0.046875 -vt 0.15625 0.046875 -vt 0.15625 0 -vt 0.109375 0 -vt 0 0.046875 -vt 0.109375 0.046875 -vt 0.109375 0 -vt 0 0 -vt 0.265625 0.046875 -vt 0.3125 0.046875 -vt 0.3125 0 -vt 0.265625 0 -vt 0.15625 0.046875 -vt 0.265625 0.046875 -vt 0.265625 0 -vt 0.15625 0 -vt 0.15625 0.046875 -vt 0.109375 0.046875 -vt 0.109375 0.15625 -vt 0.15625 0.15625 -vt 0.203125 0.15625 -vt 0.15625 0.15625 -vt 0.15625 0.046875 -vt 0.203125 0.046875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o tailpart2 -v 0.0625 0.625 1.8125 -v 0.0625 0.625 1.4375 -v 0.0625 0.5 1.8125 -v 0.0625 0.5 1.4375 -v -0.0625 0.625 1.4375 -v -0.0625 0.625 1.8125 -v -0.0625 0.5 1.4375 -v -0.0625 0.5 1.8125 -vt 0.734375 0.40625 -vt 0.765625 0.40625 -vt 0.765625 0.375 -vt 0.734375 0.375 -vt 0.640625 0.40625 -vt 0.734375 0.40625 -vt 0.734375 0.375 -vt 0.640625 0.375 -vt 0.859375 0.40625 -vt 0.890625 0.40625 -vt 0.890625 0.375 -vt 0.859375 0.375 -vt 0.765625 0.40625 -vt 0.859375 0.40625 -vt 0.859375 0.375 -vt 0.765625 0.375 -vt 0.765625 0.40625 -vt 0.734375 0.40625 -vt 0.734375 0.5 -vt 0.765625 0.5 -vt 0.796875 0.5 -vt 0.765625 0.5 -vt 0.765625 0.40625 -vt 0.796875 0.40625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o tailpart2 -v 0 0.84375 2.1875 -v 0 0.84375 1.625 -v 0 0.28125 2.1875 -v 0 0.28125 1.625 -v -0.0625 0.84375 1.625 -v -0.0625 0.84375 2.1875 -v -0.0625 0.28125 1.625 -v -0.0625 0.28125 2.1875 -vt 0.53125 0.5625 -vt 0.546875 0.5625 -vt 0.546875 0.421875 -vt 0.53125 0.421875 -vt 0.390625 0.5625 -vt 0.53125 0.5625 -vt 0.53125 0.421875 -vt 0.390625 0.421875 -vt 0.6875 0.5625 -vt 0.703125 0.5625 -vt 0.703125 0.421875 -vt 0.6875 0.421875 -vt 0.546875 0.5625 -vt 0.6875 0.5625 -vt 0.6875 0.421875 -vt 0.546875 0.421875 -vt 0.546875 0.5625 -vt 0.53125 0.5625 -vt 0.53125 0.703125 -vt 0.546875 0.703125 -vt 0.5625 0.703125 -vt 0.546875 0.703125 -vt 0.546875 0.5625 -vt 0.5625 0.5625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o spikepart0 -v -0.6518640639063484 1.2458835005110844 0.0625 -v -0.6518640639063484 1.2458835005110844 -0.0625 -v -0.25411649948891535 0.8481359360936516 0.0625 -v -0.25411649948891535 0.8481359360936516 -0.0625 -v -0.7402524115546669 1.157495152862766 -0.0625 -v -0.7402524115546669 1.157495152862766 0.0625 -v -0.34250484713723384 0.7597475884453331 -0.0625 -v -0.34250484713723384 0.7597475884453331 0.0625 -vt 0.03125 0.96875 -vt 0.0625 0.96875 -vt 0.0625 0.828125 -vt 0.03125 0.828125 -vt 0 0.96875 -vt 0.03125 0.96875 -vt 0.03125 0.828125 -vt 0 0.828125 -vt 0.09375 0.96875 -vt 0.125 0.96875 -vt 0.125 0.828125 -vt 0.09375 0.828125 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vt 0.09375 0.828125 -vt 0.0625 0.828125 -vt 0.0625 0.96875 -vt 0.03125 0.96875 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vn 0 0 -1 -vn 0.7071067811865475 0.7071067811865476 0 -vn 0 0 1 -vn -0.7071067811865475 -0.7071067811865476 0 -vn -0.7071067811865476 0.7071067811865475 0 -vn 0.7071067811865476 -0.7071067811865475 0 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 -o spikepart1 -v 0.7402524115546669 1.157495152862766 0.0625 -v 0.7402524115546669 1.157495152862766 -0.0625 -v 0.34250484713723384 0.7597475884453331 0.0625 -v 0.34250484713723384 0.7597475884453331 -0.0625 -v 0.6518640639063484 1.2458835005110844 -0.0625 -v 0.6518640639063484 1.2458835005110844 0.0625 -v 0.25411649948891535 0.8481359360936516 -0.0625 -v 0.25411649948891535 0.8481359360936516 0.0625 -vt 0.03125 0.96875 -vt 0.0625 0.96875 -vt 0.0625 0.828125 -vt 0.03125 0.828125 -vt 0 0.96875 -vt 0.03125 0.96875 -vt 0.03125 0.828125 -vt 0 0.828125 -vt 0.09375 0.96875 -vt 0.125 0.96875 -vt 0.125 0.828125 -vt 0.09375 0.828125 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vt 0.09375 0.828125 -vt 0.0625 0.828125 -vt 0.0625 0.96875 -vt 0.03125 0.96875 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vn 0 0 -1 -vn 0.7071067811865475 -0.7071067811865476 0 -vn 0 0 1 -vn -0.7071067811865475 0.7071067811865476 0 -vn 0.7071067811865476 0.7071067811865475 0 -vn -0.7071067811865476 -0.7071067811865475 0 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 92/268/67 95/267/67 93/266/67 90/265/67 -f 91/272/68 92/271/68 90/270/68 89/269/68 -f 96/276/69 91/275/69 89/274/69 94/273/69 -f 95/280/70 96/279/70 94/278/70 93/277/70 -f 94/284/71 89/283/71 90/282/71 93/281/71 -f 95/288/72 92/287/72 91/286/72 96/285/72 -o spikepart2 -v 0.0625 1.2458835005110844 -0.6518640639063484 -v 0.0625 1.157495152862766 -0.7402524115546669 -v 0.0625 0.8481359360936516 -0.25411649948891535 -v 0.0625 0.7597475884453331 -0.34250484713723384 -v -0.0625 1.157495152862766 -0.7402524115546669 -v -0.0625 1.2458835005110844 -0.6518640639063484 -v -0.0625 0.7597475884453331 -0.34250484713723384 -v -0.0625 0.8481359360936516 -0.25411649948891535 -vt 0.03125 0.96875 -vt 0.0625 0.96875 -vt 0.0625 0.828125 -vt 0.03125 0.828125 -vt 0 0.96875 -vt 0.03125 0.96875 -vt 0.03125 0.828125 -vt 0 0.828125 -vt 0.09375 0.96875 -vt 0.125 0.96875 -vt 0.125 0.828125 -vt 0.09375 0.828125 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vt 0.09375 0.828125 -vt 0.0625 0.828125 -vt 0.0625 0.96875 -vt 0.03125 0.96875 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vn 0 -0.7071067811865476 -0.7071067811865475 -vn 1 0 0 -vn 0 0.7071067811865476 0.7071067811865475 -vn -1 0 0 -vn 0 0.7071067811865475 -0.7071067811865476 -vn 0 -0.7071067811865475 0.7071067811865476 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 100/292/73 103/291/73 101/290/73 98/289/73 -f 99/296/74 100/295/74 98/294/74 97/293/74 -f 104/300/75 99/299/75 97/298/75 102/297/75 -f 103/304/76 104/303/76 102/302/76 101/301/76 -f 102/308/77 97/307/77 98/306/77 101/305/77 -f 103/312/78 100/311/78 99/310/78 104/309/78 -o spikepart3 -v 0.0625 1.1464466094067263 0.7513009550107066 -v 0.0625 1.2348349570550448 0.6629126073623883 -v 0.0625 0.7486990449892934 0.3535533905932735 -v 0.0625 0.8370873926376117 0.26516504294495524 -v -0.0625 1.2348349570550448 0.6629126073623883 -v -0.0625 1.1464466094067263 0.7513009550107066 -v -0.0625 0.8370873926376117 0.26516504294495524 -v -0.0625 0.7486990449892934 0.3535533905932735 -vt 0.03125 0.96875 -vt 0.0625 0.96875 -vt 0.0625 0.828125 -vt 0.03125 0.828125 -vt 0 0.96875 -vt 0.03125 0.96875 -vt 0.03125 0.828125 -vt 0 0.828125 -vt 0.09375 0.96875 -vt 0.125 0.96875 -vt 0.125 0.828125 -vt 0.09375 0.828125 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vt 0.09375 0.828125 -vt 0.0625 0.828125 -vt 0.0625 0.96875 -vt 0.03125 0.96875 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vn 0 0.7071067811865476 -0.7071067811865475 -vn 1 0 0 -vn 0 -0.7071067811865476 0.7071067811865475 -vn -1 0 0 -vn 0 0.7071067811865475 0.7071067811865476 -vn 0 -0.7071067811865475 -0.7071067811865476 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 108/316/79 111/315/79 109/314/79 106/313/79 -f 107/320/80 108/319/80 106/318/80 105/317/80 -f 112/324/81 107/323/81 105/322/81 110/321/81 -f 111/328/82 112/327/82 110/326/82 109/325/82 -f 110/332/83 105/331/83 106/330/83 109/329/83 -f 111/336/84 108/335/84 107/334/84 112/333/84 -o spikepart4 -v -0.7623494984667472 -0.16833006186201072 0.0625 -v -0.7623494984667472 -0.16833006186201072 -0.0625 -v -0.36460193404931407 0.22941750255542193 0.0625 -v -0.36460193404931407 0.22941750255542193 -0.0625 -v -0.6739611508184287 -0.256718409510329 -0.0625 -v -0.6739611508184287 -0.256718409510329 0.0625 -v -0.2762135864009956 0.14102915490710366 -0.0625 -v -0.2762135864009956 0.14102915490710366 0.0625 -vt 0.03125 0.96875 -vt 0.0625 0.96875 -vt 0.0625 0.828125 -vt 0.03125 0.828125 -vt 0 0.96875 -vt 0.03125 0.96875 -vt 0.03125 0.828125 -vt 0 0.828125 -vt 0.09375 0.96875 -vt 0.125 0.96875 -vt 0.125 0.828125 -vt 0.09375 0.828125 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vt 0.09375 0.828125 -vt 0.0625 0.828125 -vt 0.0625 0.96875 -vt 0.03125 0.96875 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vn 0 0 -1 -vn -0.7071067811865475 0.7071067811865477 0 -vn 0 0 1 -vn 0.7071067811865475 -0.7071067811865477 0 -vn -0.7071067811865477 -0.7071067811865475 0 -vn 0.7071067811865477 0.7071067811865475 0 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 116/340/85 119/339/85 117/338/85 114/337/85 -f 115/344/86 116/343/86 114/342/86 113/341/86 -f 120/348/87 115/347/87 113/346/87 118/345/87 -f 119/352/88 120/351/88 118/350/88 117/349/88 -f 118/356/89 113/355/89 114/354/89 117/353/89 -f 119/360/90 116/359/90 115/358/90 120/357/90 -o spikepart5 -v 0.6739611508184287 -0.256718409510329 0.0625 -v 0.6739611508184287 -0.256718409510329 -0.0625 -v 0.2762135864009956 0.14102915490710366 0.0625 -v 0.2762135864009956 0.14102915490710366 -0.0625 -v 0.7623494984667472 -0.16833006186201072 -0.0625 -v 0.7623494984667472 -0.16833006186201072 0.0625 -v 0.36460193404931407 0.22941750255542193 -0.0625 -v 0.36460193404931407 0.22941750255542193 0.0625 -vt 0.03125 0.96875 -vt 0.0625 0.96875 -vt 0.0625 0.828125 -vt 0.03125 0.828125 -vt 0 0.96875 -vt 0.03125 0.96875 -vt 0.03125 0.828125 -vt 0 0.828125 -vt 0.09375 0.96875 -vt 0.125 0.96875 -vt 0.125 0.828125 -vt 0.09375 0.828125 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vt 0.09375 0.828125 -vt 0.0625 0.828125 -vt 0.0625 0.96875 -vt 0.03125 0.96875 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vn 0 0 -1 -vn -0.7071067811865475 -0.7071067811865477 0 -vn 0 0 1 -vn 0.7071067811865475 0.7071067811865477 0 -vn 0.7071067811865477 -0.7071067811865475 0 -vn -0.7071067811865477 0.7071067811865475 0 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 124/364/91 127/363/91 125/362/91 122/361/91 -f 123/368/92 124/367/92 122/366/92 121/365/92 -f 128/372/93 123/371/93 121/370/93 126/369/93 -f 127/376/94 128/375/94 126/374/94 125/373/94 -f 126/380/95 121/379/95 122/378/95 125/377/95 -f 127/384/96 124/383/96 123/382/96 128/381/96 -o spikepart6 -v 0.0625 -0.21252423568616985 -0.8065436722909063 -v 0.0625 -0.30091258333448856 -0.7181553246425878 -v 0.0625 0.18522332873126324 -0.4087961078734732 -v 0.0625 0.09683498108294453 -0.3204077602251547 -v -0.0625 -0.30091258333448856 -0.7181553246425878 -v -0.0625 -0.21252423568616985 -0.8065436722909063 -v -0.0625 0.09683498108294453 -0.3204077602251547 -v -0.0625 0.18522332873126324 -0.4087961078734732 -vt 0.03125 0.96875 -vt 0.0625 0.96875 -vt 0.0625 0.828125 -vt 0.03125 0.828125 -vt 0 0.96875 -vt 0.03125 0.96875 -vt 0.03125 0.828125 -vt 0 0.828125 -vt 0.09375 0.96875 -vt 0.125 0.96875 -vt 0.125 0.828125 -vt 0.09375 0.828125 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vt 0.09375 0.828125 -vt 0.0625 0.828125 -vt 0.0625 0.96875 -vt 0.03125 0.96875 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vn 0 -0.7071067811865477 0.7071067811865475 -vn 1 0 0 -vn 0 0.7071067811865477 -0.7071067811865475 -vn -1 0 0 -vn 0 -0.7071067811865475 -0.7071067811865477 -vn 0 0.7071067811865475 0.7071067811865477 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 132/388/97 135/387/97 133/386/97 130/385/97 -f 131/392/98 132/391/98 130/390/98 129/389/98 -f 136/396/99 131/395/99 129/394/99 134/393/99 -f 135/400/100 136/399/100 134/398/100 133/397/100 -f 134/404/101 129/403/101 130/402/101 133/401/101 -f 135/408/102 132/407/102 131/406/102 136/405/102 -o spikepart7 -v 0.0625 -0.256718409510329 0.6739611508184287 -v 0.0625 -0.16833006186201072 0.7623494984667472 -v 0.0625 0.14102915490710366 0.2762135864009956 -v 0.0625 0.22941750255542193 0.36460193404931407 -v -0.0625 -0.16833006186201072 0.7623494984667472 -v -0.0625 -0.256718409510329 0.6739611508184287 -v -0.0625 0.22941750255542193 0.36460193404931407 -v -0.0625 0.14102915490710366 0.2762135864009956 -vt 0.03125 0.96875 -vt 0.0625 0.96875 -vt 0.0625 0.828125 -vt 0.03125 0.828125 -vt 0 0.96875 -vt 0.03125 0.96875 -vt 0.03125 0.828125 -vt 0 0.828125 -vt 0.09375 0.96875 -vt 0.125 0.96875 -vt 0.125 0.828125 -vt 0.09375 0.828125 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vt 0.09375 0.828125 -vt 0.0625 0.828125 -vt 0.0625 0.96875 -vt 0.03125 0.96875 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vn 0 0.7071067811865477 0.7071067811865475 -vn 1 0 0 -vn 0 -0.7071067811865477 -0.7071067811865475 -vn -1 0 0 -vn 0 -0.7071067811865475 0.7071067811865477 -vn 0 0.7071067811865475 -0.7071067811865477 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 140/412/103 143/411/103 141/410/103 138/409/103 -f 139/416/104 140/415/104 138/414/104 137/413/104 -f 144/420/105 139/419/105 137/418/105 142/417/105 -f 143/424/106 144/423/106 142/422/106 141/421/106 -f 142/428/107 137/427/107 138/426/107 141/425/107 -f 143/432/108 140/431/108 139/430/108 144/429/108 -o spikepart8 -v -0.7292038680986273 0.5625000000000004 -0.8175922157469457 -v -0.7292038680986275 0.43750000000000044 -0.8175922157469457 -v -0.33145630368119416 0.5625000000000002 -0.41984465132951265 -v -0.3314563036811944 0.4375000000000002 -0.41984465132951265 -v -0.8175922157469457 0.43750000000000044 -0.7292038680986275 -v -0.8175922157469455 0.5625000000000004 -0.7292038680986275 -v -0.41984465132951265 0.4375000000000002 -0.3314563036811944 -v -0.41984465132951243 0.5625000000000002 -0.3314563036811944 -vt 0.03125 0.96875 -vt 0.0625 0.96875 -vt 0.0625 0.828125 -vt 0.03125 0.828125 -vt 0 0.96875 -vt 0.03125 0.96875 -vt 0.03125 0.828125 -vt 0 0.828125 -vt 0.09375 0.96875 -vt 0.125 0.96875 -vt 0.125 0.828125 -vt 0.09375 0.828125 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vt 0.09375 0.828125 -vt 0.0625 0.828125 -vt 0.0625 0.96875 -vt 0.03125 0.96875 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vn -2.355138688025663e-16 -1 -2.3551386880256634e-16 -vn 0.7071067811865476 7.850462293418876e-17 -0.7071067811865476 -vn 2.355138688025663e-16 1 2.3551386880256634e-16 -vn -0.7071067811865476 -7.850462293418876e-17 0.7071067811865476 -vn -0.7071067811865475 2.355138688025663e-16 -0.7071067811865476 -vn 0.7071067811865475 -2.355138688025663e-16 0.7071067811865476 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 148/436/109 151/435/109 149/434/109 146/433/109 -f 147/440/110 148/439/110 146/438/110 145/437/110 -f 152/444/111 147/443/111 145/442/111 150/441/111 -f 151/448/112 152/447/112 150/446/112 149/445/112 -f 150/452/113 145/451/113 146/450/113 149/449/113 -f 151/456/114 148/455/114 147/454/114 152/453/114 -o spikepart8 -v 0.8175922157469455 0.5625000000000004 -0.7292038680986275 -v 0.8175922157469457 0.43750000000000044 -0.7292038680986275 -v 0.41984465132951243 0.5625000000000002 -0.3314563036811944 -v 0.41984465132951265 0.4375000000000002 -0.3314563036811944 -v 0.7292038680986275 0.43750000000000044 -0.8175922157469457 -v 0.7292038680986273 0.5625000000000004 -0.8175922157469457 -v 0.3314563036811944 0.4375000000000002 -0.41984465132951265 -v 0.33145630368119416 0.5625000000000002 -0.41984465132951265 -vt 0.03125 0.96875 -vt 0.0625 0.96875 -vt 0.0625 0.828125 -vt 0.03125 0.828125 -vt 0 0.96875 -vt 0.03125 0.96875 -vt 0.03125 0.828125 -vt 0 0.828125 -vt 0.09375 0.96875 -vt 0.125 0.96875 -vt 0.125 0.828125 -vt 0.09375 0.828125 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vt 0.09375 0.828125 -vt 0.0625 0.828125 -vt 0.0625 0.96875 -vt 0.03125 0.96875 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vn 2.355138688025663e-16 -1 -2.3551386880256634e-16 -vn 0.7071067811865476 -7.850462293418876e-17 0.7071067811865476 -vn -2.355138688025663e-16 1 2.3551386880256634e-16 -vn -0.7071067811865476 7.850462293418876e-17 -0.7071067811865476 -vn 0.7071067811865475 2.355138688025663e-16 -0.7071067811865476 -vn -0.7071067811865475 -2.355138688025663e-16 0.7071067811865476 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 156/460/115 159/459/115 157/458/115 154/457/115 -f 155/464/116 156/463/116 154/462/116 153/461/116 -f 160/468/117 155/467/117 153/466/117 158/465/117 -f 159/472/118 160/471/118 158/470/118 157/469/118 -f 158/476/119 153/475/119 154/474/119 157/473/119 -f 159/480/120 156/479/120 155/478/120 160/477/120 -o spikepart8 -v -0.8175922157469455 0.5625 0.7292038680986273 -v -0.8175922157469457 0.4375000000000002 0.7292038680986273 -v -0.41984465132951243 0.5625 0.33145630368119416 -v -0.41984465132951265 0.4375 0.33145630368119416 -v -0.7292038680986275 0.4375000000000002 0.8175922157469455 -v -0.7292038680986273 0.5625 0.8175922157469455 -v -0.3314563036811944 0.4375 0.41984465132951243 -v -0.33145630368119416 0.5625 0.41984465132951243 -vt 0.03125 0.96875 -vt 0.0625 0.96875 -vt 0.0625 0.828125 -vt 0.03125 0.828125 -vt 0 0.96875 -vt 0.03125 0.96875 -vt 0.03125 0.828125 -vt 0 0.828125 -vt 0.09375 0.96875 -vt 0.125 0.96875 -vt 0.125 0.828125 -vt 0.09375 0.828125 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vt 0.09375 0.828125 -vt 0.0625 0.828125 -vt 0.0625 0.96875 -vt 0.03125 0.96875 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vn -1.5700924586837752e-16 -1 1.570092458683775e-16 -vn -0.7071067811865475 7.850462293418875e-17 -0.7071067811865476 -vn 1.5700924586837752e-16 1 -1.570092458683775e-16 -vn 0.7071067811865475 -7.850462293418875e-17 0.7071067811865476 -vn -0.7071067811865476 7.850462293418876e-17 0.7071067811865475 -vn 0.7071067811865476 -7.850462293418876e-17 -0.7071067811865475 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 164/484/121 167/483/121 165/482/121 162/481/121 -f 163/488/122 164/487/122 162/486/122 161/485/122 -f 168/492/123 163/491/123 161/490/123 166/489/123 -f 167/496/124 168/495/124 166/494/124 165/493/124 -f 166/500/125 161/499/125 162/498/125 165/497/125 -f 167/504/126 164/503/126 163/502/126 168/501/126 -o spikepart8 -v 0.7292038680986273 0.5625 0.8175922157469455 -v 0.7292038680986275 0.4375000000000002 0.8175922157469455 -v 0.33145630368119416 0.5625 0.41984465132951243 -v 0.3314563036811944 0.4375 0.41984465132951243 -v 0.8175922157469457 0.4375000000000002 0.7292038680986273 -v 0.8175922157469455 0.5625 0.7292038680986273 -v 0.41984465132951265 0.4375 0.33145630368119416 -v 0.41984465132951243 0.5625 0.33145630368119416 -vt 0.03125 0.96875 -vt 0.0625 0.96875 -vt 0.0625 0.828125 -vt 0.03125 0.828125 -vt 0 0.96875 -vt 0.03125 0.96875 -vt 0.03125 0.828125 -vt 0 0.828125 -vt 0.09375 0.96875 -vt 0.125 0.96875 -vt 0.125 0.828125 -vt 0.09375 0.828125 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vt 0.09375 0.828125 -vt 0.0625 0.828125 -vt 0.0625 0.96875 -vt 0.03125 0.96875 -vt 0.03125 1 -vt 0.0625 1 -vt 0.09375 1 -vt 0.0625 1 -vt 0.0625 0.96875 -vt 0.09375 0.96875 -vn 1.5700924586837752e-16 -1 1.570092458683775e-16 -vn -0.7071067811865475 -7.850462293418875e-17 0.7071067811865476 -vn -1.5700924586837752e-16 1 -1.570092458683775e-16 -vn 0.7071067811865475 7.850462293418875e-17 -0.7071067811865476 -vn 0.7071067811865476 7.850462293418876e-17 0.7071067811865475 -vn -0.7071067811865476 -7.850462293418876e-17 -0.7071067811865475 -usemtl m_18bfdc93-cc40-fa86-b211-05ac08cf8255 -f 172/508/127 175/507/127 173/506/127 170/505/127 -f 171/512/128 172/511/128 170/510/128 169/509/128 -f 176/516/129 171/515/129 169/514/129 174/513/129 -f 175/520/130 176/519/130 174/518/130 173/517/130 -f 174/524/131 169/523/131 170/522/131 173/521/131 -f 175/528/132 172/527/132 171/526/132 176/525/132 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/horse.obj b/renderer/viewer/three/entity/models/horse.obj deleted file mode 100644 index bb08e913..00000000 --- a/renderer/viewer/three/entity/models/horse.obj +++ /dev/null @@ -1,1061 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o Body -v 0.3125 1.3125 0.6875 -v 0.3125 1.3125 -0.6875 -v 0.3125 0.6875 0.6875 -v 0.3125 0.6875 -0.6875 -v -0.3125 1.3125 -0.6875 -v -0.3125 1.3125 0.6875 -v -0.3125 0.6875 -0.6875 -v -0.3125 0.6875 0.6875 -vt 0.34375 0.15625 -vt 0.5 0.15625 -vt 0.5 0 -vt 0.34375 0 -vt 0 0.15625 -vt 0.34375 0.15625 -vt 0.34375 0 -vt 0 0 -vt 0.84375 0.15625 -vt 1 0.15625 -vt 1 0 -vt 0.84375 0 -vt 0.5 0.15625 -vt 0.84375 0.15625 -vt 0.84375 0 -vt 0.5 0 -vt 0.5 0.15625 -vt 0.34375 0.15625 -vt 0.34375 0.5 -vt 0.5 0.5 -vt 0.65625 0.5 -vt 0.5 0.5 -vt 0.5 0.15625 -vt 0.65625 0.15625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o TailA -v 0.09375 1.3125 0.7957531754730547 -v 0.09375 1.1875 0.5792468245269451 -v 0.09375 0.5547277716886161 1.2332531754730547 -v 0.09375 0.4297277716886161 1.0167468245269449 -v -0.09375 1.1875 0.5792468245269451 -v -0.09375 1.3125 0.7957531754730547 -v -0.09375 0.4297277716886161 1.0167468245269449 -v -0.09375 0.5547277716886161 1.2332531754730547 -vt 0.71875 0.375 -vt 0.765625 0.375 -vt 0.765625 0.15625 -vt 0.71875 0.15625 -vt 0.65625 0.375 -vt 0.71875 0.375 -vt 0.71875 0.15625 -vt 0.65625 0.15625 -vt 0.828125 0.375 -vt 0.875 0.375 -vt 0.875 0.15625 -vt 0.828125 0.15625 -vt 0.765625 0.375 -vt 0.828125 0.375 -vt 0.828125 0.15625 -vt 0.765625 0.15625 -vt 0.765625 0.375 -vt 0.71875 0.375 -vt 0.71875 0.4375 -vt 0.765625 0.4375 -vt 0.8125 0.4375 -vt 0.765625 0.4375 -vt 0.765625 0.375 -vt 0.8125 0.375 -vn 0 -0.49999999999999994 -0.8660254037844387 -vn 1 0 0 -vn 0 0.49999999999999994 0.8660254037844387 -vn -1 0 0 -vn 0 0.8660254037844387 -0.49999999999999994 -vn 0 -0.8660254037844387 0.49999999999999994 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o Leg1A -v -0.0625 0.6875 0.6875 -v -0.0625 0.6875 0.4375 -v -0.0625 0 0.6875 -v -0.0625 0 0.4375 -v -0.3125 0.6875 0.4375 -v -0.3125 0.6875 0.6875 -v -0.3125 0 0.4375 -v -0.3125 0 0.6875 -vt 0.875 0.609375 -vt 0.8125 0.609375 -vt 0.8125 0.4375 -vt 0.875 0.4375 -vt 0.9375 0.609375 -vt 0.875 0.609375 -vt 0.875 0.4375 -vt 0.9375 0.4375 -vt 1 0.609375 -vt 0.9375 0.609375 -vt 0.9375 0.4375 -vt 1 0.4375 -vt 0.8125 0.609375 -vt 0.75 0.609375 -vt 0.75 0.4375 -vt 0.8125 0.4375 -vt 0.8125 0.609375 -vt 0.875 0.609375 -vt 0.875 0.671875 -vt 0.8125 0.671875 -vt 0.875 0.671875 -vt 0.9375 0.671875 -vt 0.9375 0.609375 -vt 0.875 0.609375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o Leg2A -v 0.3125 0.6875 0.6875 -v 0.3125 0.6875 0.4375 -v 0.3125 0 0.6875 -v 0.3125 0 0.4375 -v 0.0625 0.6875 0.4375 -v 0.0625 0.6875 0.6875 -v 0.0625 0 0.4375 -v 0.0625 0 0.6875 -vt 0.8125 0.609375 -vt 0.875 0.609375 -vt 0.875 0.4375 -vt 0.8125 0.4375 -vt 0.75 0.609375 -vt 0.8125 0.609375 -vt 0.8125 0.4375 -vt 0.75 0.4375 -vt 0.9375 0.609375 -vt 1 0.609375 -vt 1 0.4375 -vt 0.9375 0.4375 -vt 0.875 0.609375 -vt 0.9375 0.609375 -vt 0.9375 0.4375 -vt 0.875 0.4375 -vt 0.875 0.609375 -vt 0.8125 0.609375 -vt 0.8125 0.671875 -vt 0.875 0.671875 -vt 0.9375 0.671875 -vt 0.875 0.671875 -vt 0.875 0.609375 -vt 0.9375 0.609375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o Leg3A -v -0.0625 0.6875 -0.4375 -v -0.0625 0.6875 -0.6875 -v -0.0625 0 -0.4375 -v -0.0625 0 -0.6875 -v -0.3125 0.6875 -0.6875 -v -0.3125 0.6875 -0.4375 -v -0.3125 0 -0.6875 -v -0.3125 0 -0.4375 -vt 0.875 0.609375 -vt 0.8125 0.609375 -vt 0.8125 0.4375 -vt 0.875 0.4375 -vt 0.9375 0.609375 -vt 0.875 0.609375 -vt 0.875 0.4375 -vt 0.9375 0.4375 -vt 1 0.609375 -vt 0.9375 0.609375 -vt 0.9375 0.4375 -vt 1 0.4375 -vt 0.8125 0.609375 -vt 0.75 0.609375 -vt 0.75 0.4375 -vt 0.8125 0.4375 -vt 0.8125 0.609375 -vt 0.875 0.609375 -vt 0.875 0.671875 -vt 0.8125 0.671875 -vt 0.875 0.671875 -vt 0.9375 0.671875 -vt 0.9375 0.609375 -vt 0.875 0.609375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o Leg4A -v 0.3125 0.6875 -0.4375 -v 0.3125 0.6875 -0.6875 -v 0.3125 0 -0.4375 -v 0.3125 0 -0.6875 -v 0.0625 0.6875 -0.6875 -v 0.0625 0.6875 -0.4375 -v 0.0625 0 -0.6875 -v 0.0625 0 -0.4375 -vt 0.8125 0.609375 -vt 0.875 0.609375 -vt 0.875 0.4375 -vt 0.8125 0.4375 -vt 0.75 0.609375 -vt 0.8125 0.609375 -vt 0.8125 0.4375 -vt 0.75 0.4375 -vt 0.9375 0.609375 -vt 1 0.609375 -vt 1 0.4375 -vt 0.9375 0.4375 -vt 0.875 0.609375 -vt 0.9375 0.609375 -vt 0.9375 0.4375 -vt 0.875 0.4375 -vt 0.875 0.609375 -vt 0.8125 0.609375 -vt 0.8125 0.671875 -vt 0.875 0.671875 -vt 0.9375 0.671875 -vt 0.875 0.671875 -vt 0.875 0.609375 -vt 0.9375 0.609375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o Head -v 0.1875 2.051882938682637 -0.7896234122634724 -v 0.1875 1.833132938682637 -1.1685095264191645 -v 0.1875 1.78125 -0.6333734122634727 -v 0.1875 1.5625 -1.0122595264191645 -v -0.1875 1.833132938682637 -1.1685095264191645 -v -0.1875 2.051882938682637 -0.7896234122634724 -v -0.1875 1.5625 -1.0122595264191645 -v -0.1875 1.78125 -0.6333734122634727 -vt 0.109375 0.6875 -vt 0.203125 0.6875 -vt 0.203125 0.609375 -vt 0.109375 0.609375 -vt 0 0.6875 -vt 0.109375 0.6875 -vt 0.109375 0.609375 -vt 0 0.609375 -vt 0.3125 0.6875 -vt 0.40625 0.6875 -vt 0.40625 0.609375 -vt 0.3125 0.609375 -vt 0.203125 0.6875 -vt 0.3125 0.6875 -vt 0.3125 0.609375 -vt 0.203125 0.609375 -vt 0.203125 0.6875 -vt 0.109375 0.6875 -vt 0.109375 0.796875 -vt 0.203125 0.796875 -vt 0.296875 0.796875 -vt 0.203125 0.796875 -vt 0.203125 0.6875 -vt 0.296875 0.6875 -vn 0 -0.49999999999999994 -0.8660254037844387 -vn 1 0 0 -vn 0 0.49999999999999994 0.8660254037844387 -vn -1 0 0 -vn 0 0.8660254037844387 -0.49999999999999994 -vn 0 -0.8660254037844387 0.49999999999999994 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o UMouth -v 0.125 1.833132938682637 -1.1685095264191645 -v 0.125 1.676882938682637 -1.4391424651018014 -v 0.125 1.5625 -1.0122595264191645 -v 0.125 1.40625 -1.2828924651018019 -v -0.125 1.676882938682637 -1.4391424651018014 -v -0.125 1.833132938682637 -1.1685095264191645 -v -0.125 1.40625 -1.2828924651018019 -v -0.125 1.5625 -1.0122595264191645 -vt 0.078125 0.53125 -vt 0.140625 0.53125 -vt 0.140625 0.453125 -vt 0.078125 0.453125 -vt 0 0.53125 -vt 0.078125 0.53125 -vt 0.078125 0.453125 -vt 0 0.453125 -vt 0.21875 0.53125 -vt 0.28125 0.53125 -vt 0.28125 0.453125 -vt 0.21875 0.453125 -vt 0.140625 0.53125 -vt 0.21875 0.53125 -vt 0.21875 0.453125 -vt 0.140625 0.453125 -vt 0.140625 0.53125 -vt 0.078125 0.53125 -vt 0.078125 0.609375 -vt 0.140625 0.609375 -vt 0.203125 0.609375 -vt 0.140625 0.609375 -vt 0.140625 0.53125 -vt 0.203125 0.53125 -vn 0 -0.49999999999999994 -0.8660254037844387 -vn 1 0 0 -vn 0 0.49999999999999994 0.8660254037844387 -vn -1 0 0 -vn 0 0.8660254037844387 -0.49999999999999994 -vn 0 -0.8660254037844387 0.49999999999999994 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o Ear1 -v -0.06465012057680164 2.1600077984998522 -0.8465349149312555 -v -0.06192650361593727 2.1288767141844853 -0.9006615026677829 -v -0.050497791707081574 1.9982459393130734 -0.7527849149312555 -v -0.04777417474621726 1.9671148549977064 -0.8069115026677829 -v -0.1864508408774055 2.117982246341028 -0.9006615026677829 -v -0.1891744578382698 2.149113330656395 -0.8465349149312555 -v -0.17229851200768548 1.9562203871542492 -0.8069115026677829 -v -0.1750221289685498 1.987351471469616 -0.7527849149312555 -vt 0.34375 0.734375 -vt 0.3125 0.734375 -vt 0.3125 0.6875 -vt 0.34375 0.6875 -vt 0.359375 0.734375 -vt 0.34375 0.734375 -vt 0.34375 0.6875 -vt 0.359375 0.6875 -vt 0.390625 0.734375 -vt 0.359375 0.734375 -vt 0.359375 0.6875 -vt 0.390625 0.6875 -vt 0.3125 0.734375 -vt 0.296875 0.734375 -vt 0.296875 0.6875 -vt 0.3125 0.6875 -vt 0.3125 0.734375 -vt 0.34375 0.734375 -vt 0.34375 0.75 -vt 0.3125 0.75 -vt 0.34375 0.75 -vt 0.375 0.75 -vt 0.375 0.734375 -vt 0.34375 0.734375 -vn 0.0435778713738291 -0.4980973490458729 -0.8660254037844388 -vn 0.9961946980917455 0.0871557427476582 -1.3877787807814457e-17 -vn -0.0435778713738291 0.4980973490458729 0.8660254037844388 -vn -0.9961946980917455 -0.0871557427476582 1.3877787807814457e-17 -vn -0.07547908730517335 0.862729915662821 -0.5 -vn 0.07547908730517335 -0.862729915662821 0.5 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o Ear2 -v 0.1891744578382698 2.149113330656395 -0.8465349149312555 -v 0.1864508408774055 2.117982246341028 -0.9006615026677829 -v 0.17502212896854985 1.987351471469616 -0.7527849149312555 -v 0.17229851200768542 1.9562203871542492 -0.8069115026677829 -v 0.06192650361593732 2.1288767141844853 -0.9006615026677829 -v 0.06465012057680164 2.1600077984998522 -0.8465349149312555 -v 0.04777417474621726 1.9671148549977064 -0.8069115026677829 -v 0.050497791707081574 1.9982459393130734 -0.7527849149312555 -vt 0.3125 0.734375 -vt 0.34375 0.734375 -vt 0.34375 0.6875 -vt 0.3125 0.6875 -vt 0.296875 0.734375 -vt 0.3125 0.734375 -vt 0.3125 0.6875 -vt 0.296875 0.6875 -vt 0.359375 0.734375 -vt 0.390625 0.734375 -vt 0.390625 0.6875 -vt 0.359375 0.6875 -vt 0.34375 0.734375 -vt 0.359375 0.734375 -vt 0.359375 0.6875 -vt 0.34375 0.6875 -vt 0.34375 0.734375 -vt 0.3125 0.734375 -vt 0.3125 0.75 -vt 0.34375 0.75 -vt 0.375 0.75 -vt 0.34375 0.75 -vt 0.34375 0.734375 -vt 0.375 0.734375 -vn -0.0435778713738291 -0.4980973490458729 -0.8660254037844388 -vn 0.9961946980917455 -0.0871557427476582 1.3877787807814457e-17 -vn 0.0435778713738291 0.4980973490458729 0.8660254037844388 -vn -0.9961946980917455 0.0871557427476582 -1.3877787807814457e-17 -vn 0.07547908730517335 0.862729915662821 -0.5 -vn -0.07547908730517335 -0.862729915662821 0.5 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o MuleEarL -v -0.15935822581478865 2.3816773650616265 -0.9715349149312555 -v -0.15127013065533484 2.351492182990093 -1.0256615026677829 -v -0.061295283546407786 2.0157014821763357 -0.7527849149312555 -v -0.05320718838695404 1.9855163001048024 -0.8069115026677829 -v -0.27201085894146837 2.3191398023522782 -1.0256615026677829 -v -0.28009895410092217 2.3493249844238115 -0.9715349149312555 -v -0.1739479166730875 1.9531639194669874 -0.8069115026677829 -v -0.1820360118325413 1.9833491015385207 -0.7527849149312555 -vt 0.046875 0.796875 -vt 0.015625 0.796875 -vt 0.015625 0.6875 -vt 0.046875 0.6875 -vt 0.0625 0.796875 -vt 0.046875 0.796875 -vt 0.046875 0.6875 -vt 0.0625 0.6875 -vt 0.09375 0.796875 -vt 0.0625 0.796875 -vt 0.0625 0.6875 -vt 0.09375 0.6875 -vt 0.015625 0.796875 -vt 0 0.796875 -vt 0 0.6875 -vt 0.015625 0.6875 -vt 0.015625 0.796875 -vt 0.046875 0.796875 -vt 0.046875 0.8125 -vt 0.015625 0.8125 -vt 0.046875 0.8125 -vt 0.078125 0.8125 -vt 0.078125 0.796875 -vt 0.046875 0.796875 -vn 0.12940952255126037 -0.48296291314453416 -0.8660254037844387 -vn 0.9659258262890683 0.25881904510252074 1.3877787807814457e-17 -vn -0.12940952255126037 0.48296291314453416 0.8660254037844387 -vn -0.9659258262890683 -0.25881904510252074 -1.3877787807814457e-17 -vn -0.2241438680420134 0.8365163037378079 -0.5 -vn 0.2241438680420134 -0.8365163037378079 0.5 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 -o MuleEarR -v 0.2800989541009222 2.3493249844238115 -0.9715349149312555 -v 0.27201085894146837 2.3191398023522782 -1.0256615026677829 -v 0.18203601183254126 1.9833491015385207 -0.7527849149312555 -v 0.1739479166730875 1.9531639194669874 -0.8069115026677829 -v 0.1512701306553348 2.351492182990093 -1.0256615026677829 -v 0.15935822581478865 2.3816773650616265 -0.9715349149312555 -v 0.05320718838695404 1.9855163001048024 -0.8069115026677829 -v 0.061295283546407786 2.0157014821763357 -0.7527849149312555 -vt 0.015625 0.796875 -vt 0.046875 0.796875 -vt 0.046875 0.6875 -vt 0.015625 0.6875 -vt 0 0.796875 -vt 0.015625 0.796875 -vt 0.015625 0.6875 -vt 0 0.6875 -vt 0.0625 0.796875 -vt 0.09375 0.796875 -vt 0.09375 0.6875 -vt 0.0625 0.6875 -vt 0.046875 0.796875 -vt 0.0625 0.796875 -vt 0.0625 0.6875 -vt 0.046875 0.6875 -vt 0.046875 0.796875 -vt 0.015625 0.796875 -vt 0.015625 0.8125 -vt 0.046875 0.8125 -vt 0.078125 0.8125 -vt 0.046875 0.8125 -vt 0.046875 0.796875 -vt 0.078125 0.796875 -vn -0.12940952255126037 -0.48296291314453416 -0.8660254037844387 -vn 0.9659258262890683 -0.25881904510252074 -1.3877787807814457e-17 -vn 0.12940952255126037 0.48296291314453416 0.8660254037844387 -vn -0.9659258262890683 0.25881904510252074 1.3877787807814457e-17 -vn 0.2241438680420134 0.8365163037378079 -0.5 -vn -0.2241438680420134 -0.8365163037378079 0.5 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 92/268/67 95/267/67 93/266/67 90/265/67 -f 91/272/68 92/271/68 90/270/68 89/269/68 -f 96/276/69 91/275/69 89/274/69 94/273/69 -f 95/280/70 96/279/70 94/278/70 93/277/70 -f 94/284/71 89/283/71 90/282/71 93/281/71 -f 95/288/72 92/287/72 91/286/72 96/285/72 -o Neck -v 0.125 1.7828924651018019 -0.6272436490538904 -v 0.125 1.5641424651018019 -1.0061297632095823 -v 0.125 1.1333734122634724 -0.2522436490538904 -v 0.125 0.9146234122634727 -0.6311297632095825 -v -0.125 1.5641424651018019 -1.0061297632095823 -v -0.125 1.7828924651018019 -0.6272436490538904 -v -0.125 0.9146234122634727 -0.6311297632095825 -v -0.125 1.1333734122634724 -0.2522436490538904 -vt 0.109375 0.34375 -vt 0.171875 0.34375 -vt 0.171875 0.15625 -vt 0.109375 0.15625 -vt 0 0.34375 -vt 0.109375 0.34375 -vt 0.109375 0.15625 -vt 0 0.15625 -vt 0.28125 0.34375 -vt 0.34375 0.34375 -vt 0.34375 0.15625 -vt 0.28125 0.15625 -vt 0.171875 0.34375 -vt 0.28125 0.34375 -vt 0.28125 0.15625 -vt 0.171875 0.15625 -vt 0.171875 0.34375 -vt 0.109375 0.34375 -vt 0.109375 0.453125 -vt 0.171875 0.453125 -vt 0.234375 0.453125 -vt 0.171875 0.453125 -vt 0.171875 0.34375 -vt 0.234375 0.34375 -vn 0 -0.49999999999999994 -0.8660254037844387 -vn 1 0 0 -vn 0 0.49999999999999994 0.8660254037844387 -vn -1 0 0 -vn 0 0.8660254037844387 -0.49999999999999994 -vn 0 -0.8660254037844387 0.49999999999999994 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 100/292/73 103/291/73 101/290/73 98/289/73 -f 99/296/74 100/295/74 98/294/74 97/293/74 -f 104/300/75 99/299/75 97/298/75 102/297/75 -f 103/304/76 104/303/76 102/302/76 101/301/76 -f 102/308/77 97/307/77 98/306/77 101/305/77 -f 103/312/78 100/311/78 99/310/78 104/309/78 -o Mane -v 0.0625 2.1160254037844384 -0.6752404735808355 -v 0.0625 2.0535254037844384 -0.7834936490538902 -v 0.0625 1.25 -0.1752404735808355 -v 0.0625 1.1875 -0.2834936490538904 -v -0.0625 2.0535254037844384 -0.7834936490538902 -v -0.0625 2.1160254037844384 -0.6752404735808355 -v -0.0625 1.1875 -0.2834936490538904 -v -0.0625 1.25 -0.1752404735808355 -vt 0.90625 0.40625 -vt 0.9375 0.40625 -vt 0.9375 0.15625 -vt 0.90625 0.15625 -vt 0.875 0.40625 -vt 0.90625 0.40625 -vt 0.90625 0.15625 -vt 0.875 0.15625 -vt 0.96875 0.40625 -vt 1 0.40625 -vt 1 0.15625 -vt 0.96875 0.15625 -vt 0.9375 0.40625 -vt 0.96875 0.40625 -vt 0.96875 0.15625 -vt 0.9375 0.15625 -vt 0.9375 0.40625 -vt 0.90625 0.40625 -vt 0.90625 0.4375 -vt 0.9375 0.4375 -vt 0.96875 0.4375 -vt 0.9375 0.4375 -vt 0.9375 0.40625 -vt 0.96875 0.40625 -vn 0 -0.49999999999999994 -0.8660254037844387 -vn 1 0 0 -vn 0 0.49999999999999994 0.8660254037844387 -vn -1 0 0 -vn 0 0.8660254037844387 -0.49999999999999994 -vn 0 -0.8660254037844387 0.49999999999999994 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 108/316/79 111/315/79 109/314/79 106/313/79 -f 107/320/80 108/319/80 106/318/80 105/317/80 -f 112/324/81 107/323/81 105/322/81 110/321/81 -f 111/328/82 112/327/82 110/326/82 109/325/82 -f 110/332/83 105/331/83 106/330/83 109/329/83 -f 111/336/84 108/335/84 107/334/84 112/333/84 -o Bag1 -v 0.5 1.3125 0.125 -v 0.3125000000000001 1.3125 0.12499999999999989 -v 0.5 0.8125 0.125 -v 0.3125000000000001 0.8125 0.12499999999999989 -v 0.3125 1.3125 0.625 -v 0.5 1.3125 0.625 -v 0.3125 0.8125 0.625 -v 0.5 0.8125 0.625 -vt 0.453125 0.625 -vt 0.578125 0.625 -vt 0.578125 0.5 -vt 0.453125 0.5 -vt 0.40625 0.625 -vt 0.453125 0.625 -vt 0.453125 0.5 -vt 0.40625 0.5 -vt 0.625 0.625 -vt 0.75 0.625 -vt 0.75 0.5 -vt 0.625 0.5 -vt 0.578125 0.625 -vt 0.625 0.625 -vt 0.625 0.5 -vt 0.578125 0.5 -vt 0.578125 0.625 -vt 0.453125 0.625 -vt 0.453125 0.671875 -vt 0.578125 0.671875 -vt 0.703125 0.671875 -vt 0.578125 0.671875 -vt 0.578125 0.625 -vt 0.703125 0.625 -vn -1 0 -2.220446049250313e-16 -vn 2.220446049250313e-16 0 -1 -vn 1 0 2.220446049250313e-16 -vn -2.220446049250313e-16 0 1 -vn 0 1 0 -vn 0 -1 0 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 116/340/85 119/339/85 117/338/85 114/337/85 -f 115/344/86 116/343/86 114/342/86 113/341/86 -f 120/348/87 115/347/87 113/346/87 118/345/87 -f 119/352/88 120/351/88 118/350/88 117/349/88 -f 118/356/89 113/355/89 114/354/89 117/353/89 -f 119/360/90 116/359/90 115/358/90 120/357/90 -o Bag2 -v -0.5 1.3125 0.625 -v -0.3125 1.3125 0.625 -v -0.5 0.8125 0.625 -v -0.3125 0.8125 0.625 -v -0.3125000000000001 1.3125 0.12499999999999989 -v -0.5000000000000001 1.3125 0.125 -v -0.3125000000000001 0.8125 0.12499999999999989 -v -0.5000000000000001 0.8125 0.125 -vt 0.578125 0.625 -vt 0.453125 0.625 -vt 0.453125 0.5 -vt 0.578125 0.5 -vt 0.625 0.625 -vt 0.578125 0.625 -vt 0.578125 0.5 -vt 0.625 0.5 -vt 0.75 0.625 -vt 0.625 0.625 -vt 0.625 0.5 -vt 0.75 0.5 -vt 0.453125 0.625 -vt 0.40625 0.625 -vt 0.40625 0.5 -vt 0.453125 0.5 -vt 0.453125 0.625 -vt 0.578125 0.625 -vt 0.578125 0.671875 -vt 0.453125 0.671875 -vt 0.578125 0.671875 -vt 0.703125 0.671875 -vt 0.703125 0.625 -vt 0.578125 0.625 -vn 1 0 -2.220446049250313e-16 -vn 2.220446049250313e-16 0 1 -vn -1 0 2.220446049250313e-16 -vn -2.220446049250313e-16 0 -1 -vn 0 1 0 -vn 0 -1 0 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 124/364/91 127/363/91 125/362/91 122/361/91 -f 123/368/92 124/367/92 122/366/92 121/365/92 -f 128/372/93 123/371/93 121/370/93 126/369/93 -f 127/376/94 128/375/94 126/374/94 125/373/94 -f 126/380/95 121/379/95 122/378/95 125/377/95 -f 127/384/96 124/383/96 123/382/96 128/381/96 -o Saddle -v 0.34375 1.34375 0.375 -v 0.34375 1.34375 -0.25 -v 0.34375 0.71875 0.375 -v 0.34375 0.71875 -0.25 -v -0.34375 1.34375 -0.25 -v -0.34375 1.34375 0.375 -v -0.34375 0.71875 -0.25 -v -0.34375 0.71875 0.375 -vt 0.546875 0.859375 -vt 0.703125 0.859375 -vt 0.703125 0.71875 -vt 0.546875 0.71875 -vt 0.40625 0.859375 -vt 0.546875 0.859375 -vt 0.546875 0.71875 -vt 0.40625 0.71875 -vt 0.84375 0.859375 -vt 1 0.859375 -vt 1 0.71875 -vt 0.84375 0.71875 -vt 0.703125 0.859375 -vt 0.84375 0.859375 -vt 0.84375 0.71875 -vt 0.703125 0.71875 -vt 0.703125 0.859375 -vt 0.546875 0.859375 -vt 0.546875 1 -vt 0.703125 1 -vt 0.859375 1 -vt 0.703125 1 -vt 0.703125 0.859375 -vt 0.859375 0.859375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 132/388/97 135/387/97 133/386/97 130/385/97 -f 131/392/98 132/391/98 130/390/98 129/389/98 -f 136/396/99 131/395/99 129/394/99 134/393/99 -f 135/400/100 136/399/100 134/398/100 133/397/100 -f 134/404/101 129/403/101 130/402/101 133/401/101 -f 135/408/102 132/407/102 131/406/102 136/405/102 -o SaddleMouthL -v -0.125 1.6952722283113841 -1.1540063509461098 -v -0.125 1.6327722283113841 -1.2622595264191645 -v -0.125 1.587019052838329 -1.0915063509461098 -v -0.125 1.524519052838329 -1.1997595264191645 -v -0.1875 1.6327722283113841 -1.2622595264191645 -v -0.1875 1.6952722283113841 -1.1540063509461098 -v -0.1875 1.524519052838329 -1.1997595264191645 -v -0.1875 1.587019052838329 -1.0915063509461098 -vt 0.484375 0.890625 -vt 0.5 0.890625 -vt 0.5 0.859375 -vt 0.484375 0.859375 -vt 0.453125 0.890625 -vt 0.484375 0.890625 -vt 0.484375 0.859375 -vt 0.453125 0.859375 -vt 0.53125 0.890625 -vt 0.546875 0.890625 -vt 0.546875 0.859375 -vt 0.53125 0.859375 -vt 0.5 0.890625 -vt 0.53125 0.890625 -vt 0.53125 0.859375 -vt 0.5 0.859375 -vt 0.5 0.890625 -vt 0.484375 0.890625 -vt 0.484375 0.921875 -vt 0.5 0.921875 -vt 0.515625 0.921875 -vt 0.5 0.921875 -vt 0.5 0.890625 -vt 0.515625 0.890625 -vn 0 -0.49999999999999994 -0.8660254037844387 -vn 1 0 0 -vn 0 0.49999999999999994 0.8660254037844387 -vn -1 0 0 -vn 0 0.8660254037844387 -0.49999999999999994 -vn 0 -0.8660254037844387 0.49999999999999994 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 140/412/103 143/411/103 141/410/103 138/409/103 -f 139/416/104 140/415/104 138/414/104 137/413/104 -f 144/420/105 139/419/105 137/418/105 142/417/105 -f 143/424/106 144/423/106 142/422/106 141/421/106 -f 142/428/107 137/427/107 138/426/107 141/425/107 -f 143/432/108 140/431/108 139/430/108 144/429/108 -o SaddleMouthR -v 0.1875 1.6952722283113841 -1.1540063509461098 -v 0.1875 1.6327722283113841 -1.2622595264191645 -v 0.1875 1.587019052838329 -1.0915063509461098 -v 0.1875 1.524519052838329 -1.1997595264191645 -v 0.125 1.6327722283113841 -1.2622595264191645 -v 0.125 1.6952722283113841 -1.1540063509461098 -v 0.125 1.524519052838329 -1.1997595264191645 -v 0.125 1.587019052838329 -1.0915063509461098 -vt 0.484375 0.890625 -vt 0.5 0.890625 -vt 0.5 0.859375 -vt 0.484375 0.859375 -vt 0.453125 0.890625 -vt 0.484375 0.890625 -vt 0.484375 0.859375 -vt 0.453125 0.859375 -vt 0.53125 0.890625 -vt 0.546875 0.890625 -vt 0.546875 0.859375 -vt 0.53125 0.859375 -vt 0.5 0.890625 -vt 0.53125 0.890625 -vt 0.53125 0.859375 -vt 0.5 0.859375 -vt 0.5 0.890625 -vt 0.484375 0.890625 -vt 0.484375 0.921875 -vt 0.5 0.921875 -vt 0.515625 0.921875 -vt 0.5 0.921875 -vt 0.5 0.890625 -vt 0.515625 0.890625 -vn 0 -0.49999999999999994 -0.8660254037844387 -vn 1 0 0 -vn 0 0.49999999999999994 0.8660254037844387 -vn -1 0 0 -vn 0 0.8660254037844387 -0.49999999999999994 -vn 0 -0.8660254037844387 0.49999999999999994 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 148/436/109 151/435/109 149/434/109 146/433/109 -f 147/440/110 148/439/110 146/438/110 145/437/110 -f 152/444/111 147/443/111 145/442/111 150/441/111 -f 151/448/112 152/447/112 150/446/112 149/445/112 -f 150/452/113 145/451/113 146/450/113 149/449/113 -f 151/456/114 148/455/114 147/454/114 152/453/114 -o SaddleMouthLine -v -0.19374999999999998 1.6875 -0.21875 -v -0.19374999999999998 1.6875 -1.21875 -v -0.19374999999999998 1.5 -0.21875 -v -0.19374999999999998 1.5 -1.21875 -v -0.19374999999999998 1.6875 -1.21875 -v -0.19374999999999998 1.6875 -0.21875 -v -0.19374999999999998 1.5 -1.21875 -v -0.19374999999999998 1.5 -0.21875 -vt 0.75 0.71875 -vt 0.75 0.71875 -vt 0.75 0.671875 -vt 0.75 0.671875 -vt 0.5 0.71875 -vt 0.75 0.71875 -vt 0.75 0.671875 -vt 0.5 0.671875 -vt 1 0.71875 -vt 1 0.71875 -vt 1 0.671875 -vt 1 0.671875 -vt 0.75 0.71875 -vt 1 0.71875 -vt 1 0.671875 -vt 0.75 0.671875 -vt 0.75 0.71875 -vt 0.75 0.71875 -vt 0.75 0.96875 -vt 0.75 0.96875 -vt 0.75 0.96875 -vt 0.75 0.96875 -vt 0.75 0.71875 -vt 0.75 0.71875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 156/460/115 159/459/115 157/458/115 154/457/115 -f 155/464/116 156/463/116 154/462/116 153/461/116 -f 160/468/117 155/467/117 153/466/117 158/465/117 -f 159/472/118 160/471/118 158/470/118 157/469/118 -f 158/476/119 153/475/119 154/474/119 157/473/119 -f 159/480/120 156/479/120 155/478/120 160/477/120 -o SaddleMouthLineR -v 0.19374999999999998 1.6875 -0.21875 -v 0.19374999999999998 1.6875 -1.21875 -v 0.19374999999999998 1.5 -0.21875 -v 0.19374999999999998 1.5 -1.21875 -v 0.19374999999999998 1.6875 -1.21875 -v 0.19374999999999998 1.6875 -0.21875 -v 0.19374999999999998 1.5 -1.21875 -v 0.19374999999999998 1.5 -0.21875 -vt 0.75 0.71875 -vt 0.75 0.71875 -vt 0.75 0.671875 -vt 0.75 0.671875 -vt 0.5 0.71875 -vt 0.75 0.71875 -vt 0.75 0.671875 -vt 0.5 0.671875 -vt 1 0.71875 -vt 1 0.71875 -vt 1 0.671875 -vt 1 0.671875 -vt 0.75 0.71875 -vt 1 0.71875 -vt 1 0.671875 -vt 0.75 0.671875 -vt 0.75 0.71875 -vt 0.75 0.71875 -vt 0.75 0.96875 -vt 0.75 0.96875 -vt 0.75 0.96875 -vt 0.75 0.96875 -vt 0.75 0.71875 -vt 0.75 0.71875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 164/484/121 167/483/121 165/482/121 162/481/121 -f 163/488/122 164/487/122 162/486/122 161/485/122 -f 168/492/123 163/491/123 161/490/123 166/489/123 -f 167/496/124 168/495/124 166/494/124 165/493/124 -f 166/500/125 161/499/125 162/498/125 165/497/125 -f 167/504/126 164/503/126 163/502/126 168/501/126 -o HeadSaddle -v 0.140625 1.8561195507185708 -1.1566606162754502 -v 0.140625 1.7779945507185708 -1.291977085616769 -v 0.140625 1.5584233181676694 -0.9847856162754505 -v 0.140625 1.4802983181676697 -1.120102085616769 -v -0.140625 1.7779945507185708 -1.291977085616769 -v -0.140625 1.8561195507185708 -1.1566606162754502 -v -0.140625 1.4802983181676697 -1.120102085616769 -v -0.140625 1.5584233181676694 -0.9847856162754505 -vt 0.328125 0.96875 -vt 0.390625 0.96875 -vt 0.390625 0.890625 -vt 0.328125 0.890625 -vt 0.296875 0.96875 -vt 0.328125 0.96875 -vt 0.328125 0.890625 -vt 0.296875 0.890625 -vt 0.421875 0.96875 -vt 0.484375 0.96875 -vt 0.484375 0.890625 -vt 0.421875 0.890625 -vt 0.390625 0.96875 -vt 0.421875 0.96875 -vt 0.421875 0.890625 -vt 0.390625 0.890625 -vt 0.390625 0.96875 -vt 0.328125 0.96875 -vt 0.328125 1 -vt 0.390625 1 -vt 0.453125 1 -vt 0.390625 1 -vt 0.390625 0.96875 -vt 0.453125 0.96875 -vn 0 -0.49999999999999994 -0.8660254037844387 -vn 1 0 0 -vn 0 0.49999999999999994 0.8660254037844387 -vn -1 0 0 -vn 0 0.8660254037844387 -0.49999999999999994 -vn 0 -0.8660254037844387 0.49999999999999994 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 172/508/127 175/507/127 173/506/127 170/505/127 -f 171/512/128 172/511/128 170/510/128 169/509/128 -f 176/516/129 171/515/129 169/514/129 174/513/129 -f 175/520/130 176/519/130 174/518/130 173/517/130 -f 174/524/131 169/523/131 170/522/131 173/521/131 -f 175/528/132 172/527/132 171/526/132 176/525/132 -o HeadSaddle -v 0.203125 2.074869550718571 -0.7777745021197584 -v 0.203125 1.8404945507185708 -1.183723910143714 -v 0.203125 1.7771733181676694 -0.6058995021197586 -v 0.203125 1.5427983181676694 -1.0118489101437143 -v -0.203125 1.8404945507185708 -1.183723910143714 -v -0.203125 2.074869550718571 -0.7777745021197584 -v -0.203125 1.5427983181676694 -1.0118489101437143 -v -0.203125 1.7771733181676694 -0.6058995021197586 -vt 0.109375 0.890625 -vt 0.203125 0.890625 -vt 0.203125 0.8125 -vt 0.109375 0.8125 -vt 0 0.890625 -vt 0.109375 0.890625 -vt 0.109375 0.8125 -vt 0 0.8125 -vt 0.3125 0.890625 -vt 0.40625 0.890625 -vt 0.40625 0.8125 -vt 0.3125 0.8125 -vt 0.203125 0.890625 -vt 0.3125 0.890625 -vt 0.3125 0.8125 -vt 0.203125 0.8125 -vt 0.203125 0.890625 -vt 0.109375 0.890625 -vt 0.109375 1 -vt 0.203125 1 -vt 0.296875 1 -vt 0.203125 1 -vt 0.203125 0.890625 -vt 0.296875 0.890625 -vn 0 -0.49999999999999994 -0.8660254037844387 -vn 1 0 0 -vn 0 0.49999999999999994 0.8660254037844387 -vn -1 0 0 -vn 0 0.8660254037844387 -0.49999999999999994 -vn 0 -0.8660254037844387 0.49999999999999994 -usemtl m_1e01f934-e3cf-9457-589b-e2903555a409 -f 180/532/133 183/531/133 181/530/133 178/529/133 -f 179/536/134 180/535/134 178/534/134 177/533/134 -f 184/540/135 179/539/135 177/538/135 182/537/135 -f 183/544/136 184/543/136 182/542/136 181/541/136 -f 182/548/137 177/547/137 178/546/137 181/545/137 -f 183/552/138 180/551/138 179/550/138 184/549/138 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/llama.obj b/renderer/viewer/three/entity/models/llama.obj deleted file mode 100644 index 1ef48ac5..00000000 --- a/renderer/viewer/three/entity/models/llama.obj +++ /dev/null @@ -1,509 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o head -v 0.125 1.9375 -0.4375 -v 0.125 1.9375 -1 -v 0.125 1.6875 -0.4375 -v 0.125 1.6875 -1 -v -0.125 1.9375 -1 -v -0.125 1.9375 -0.4375 -v -0.125 1.6875 -1 -v -0.125 1.6875 -0.4375 -vt 0.0703125 0.859375 -vt 0.1015625 0.859375 -vt 0.1015625 0.796875 -vt 0.0703125 0.796875 -vt 0 0.859375 -vt 0.0703125 0.859375 -vt 0.0703125 0.796875 -vt 0 0.796875 -vt 0.171875 0.859375 -vt 0.203125 0.859375 -vt 0.203125 0.796875 -vt 0.171875 0.796875 -vt 0.1015625 0.859375 -vt 0.171875 0.859375 -vt 0.171875 0.796875 -vt 0.1015625 0.796875 -vt 0.1015625 0.859375 -vt 0.0703125 0.859375 -vt 0.0703125 1 -vt 0.1015625 1 -vt 0.1328125 1 -vt 0.1015625 1 -vt 0.1015625 0.859375 -vt 0.1328125 0.859375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o head -v 0.25 2.0625 -0.375 -v 0.25 2.0625 -0.75 -v 0.25 0.9375 -0.375 -v 0.25 0.9375 -0.75 -v -0.25 2.0625 -0.75 -v -0.25 2.0625 -0.375 -v -0.25 0.9375 -0.75 -v -0.25 0.9375 -0.375 -vt 0.046875 0.6875 -vt 0.109375 0.6875 -vt 0.109375 0.40625 -vt 0.046875 0.40625 -vt 0 0.6875 -vt 0.046875 0.6875 -vt 0.046875 0.40625 -vt 0 0.40625 -vt 0.15625 0.6875 -vt 0.21875 0.6875 -vt 0.21875 0.40625 -vt 0.15625 0.40625 -vt 0.109375 0.6875 -vt 0.15625 0.6875 -vt 0.15625 0.40625 -vt 0.109375 0.40625 -vt 0.109375 0.6875 -vt 0.046875 0.6875 -vt 0.046875 0.78125 -vt 0.109375 0.78125 -vt 0.171875 0.78125 -vt 0.109375 0.78125 -vt 0.109375 0.6875 -vt 0.171875 0.6875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o head -v 0.25 2.25 -0.5 -v 0.25 2.25 -0.625 -v 0.25 2.0625 -0.5 -v 0.25 2.0625 -0.625 -v 0.0625 2.25 -0.625 -v 0.0625 2.25 -0.5 -v 0.0625 2.0625 -0.625 -v 0.0625 2.0625 -0.5 -vt 0.1484375 0.96875 -vt 0.171875 0.96875 -vt 0.171875 0.921875 -vt 0.1484375 0.921875 -vt 0.1328125 0.96875 -vt 0.1484375 0.96875 -vt 0.1484375 0.921875 -vt 0.1328125 0.921875 -vt 0.1875 0.96875 -vt 0.2109375 0.96875 -vt 0.2109375 0.921875 -vt 0.1875 0.921875 -vt 0.171875 0.96875 -vt 0.1875 0.96875 -vt 0.1875 0.921875 -vt 0.171875 0.921875 -vt 0.171875 0.96875 -vt 0.1484375 0.96875 -vt 0.1484375 1 -vt 0.171875 1 -vt 0.1953125 1 -vt 0.171875 1 -vt 0.171875 0.96875 -vt 0.1953125 0.96875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o head -v -0.0625 2.25 -0.5 -v -0.0625 2.25 -0.625 -v -0.0625 2.0625 -0.5 -v -0.0625 2.0625 -0.625 -v -0.25 2.25 -0.625 -v -0.25 2.25 -0.5 -v -0.25 2.0625 -0.625 -v -0.25 2.0625 -0.5 -vt 0.1484375 0.96875 -vt 0.171875 0.96875 -vt 0.171875 0.921875 -vt 0.1484375 0.921875 -vt 0.1328125 0.96875 -vt 0.1484375 0.96875 -vt 0.1484375 0.921875 -vt 0.1328125 0.921875 -vt 0.1875 0.96875 -vt 0.2109375 0.96875 -vt 0.2109375 0.921875 -vt 0.1875 0.921875 -vt 0.171875 0.96875 -vt 0.1875 0.96875 -vt 0.1875 0.921875 -vt 0.171875 0.921875 -vt 0.171875 0.96875 -vt 0.1484375 0.96875 -vt 0.1484375 1 -vt 0.171875 1 -vt 0.1953125 1 -vt 0.171875 1 -vt 0.171875 0.96875 -vt 0.1953125 0.96875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o chest1 -v 0.34375 1.3125 0.3750000000000001 -v 0.53125 1.3125 0.375 -v 0.34375 0.8125 0.3750000000000001 -v 0.53125 0.8125 0.375 -v 0.53125 1.3125 -0.12499999999999994 -v 0.34375 1.3125 -0.12499999999999989 -v 0.53125 0.8125 -0.12499999999999994 -v 0.34375 0.8125 -0.12499999999999989 -vt 0.375 0.515625 -vt 0.4375 0.515625 -vt 0.4375 0.390625 -vt 0.375 0.390625 -vt 0.3515625 0.515625 -vt 0.375 0.515625 -vt 0.375 0.390625 -vt 0.3515625 0.390625 -vt 0.4609375 0.515625 -vt 0.5234375 0.515625 -vt 0.5234375 0.390625 -vt 0.4609375 0.390625 -vt 0.4375 0.515625 -vt 0.4609375 0.515625 -vt 0.4609375 0.390625 -vt 0.4375 0.390625 -vt 0.4375 0.515625 -vt 0.375 0.515625 -vt 0.375 0.5625 -vt 0.4375 0.5625 -vt 0.5 0.5625 -vt 0.4375 0.5625 -vt 0.4375 0.515625 -vt 0.5 0.515625 -vn 1 0 -2.220446049250313e-16 -vn 2.220446049250313e-16 0 1 -vn -1 0 2.220446049250313e-16 -vn -2.220446049250313e-16 0 -1 -vn 0 1 0 -vn 0 -1 0 -usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o chest2 -v -0.53125 1.3125 0.3750000000000001 -v -0.34374999999999994 1.3125 0.375 -v -0.53125 0.8125 0.3750000000000001 -v -0.34374999999999994 0.8125 0.375 -v -0.34375000000000006 1.3125 -0.125 -v -0.5312500000000001 1.3125 -0.12499999999999989 -v -0.34375000000000006 0.8125 -0.125 -v -0.5312500000000001 0.8125 -0.12499999999999989 -vt 0.375 0.3125 -vt 0.4375 0.3125 -vt 0.4375 0.1875 -vt 0.375 0.1875 -vt 0.3515625 0.3125 -vt 0.375 0.3125 -vt 0.375 0.1875 -vt 0.3515625 0.1875 -vt 0.4609375 0.3125 -vt 0.5234375 0.3125 -vt 0.5234375 0.1875 -vt 0.4609375 0.1875 -vt 0.4375 0.3125 -vt 0.4609375 0.3125 -vt 0.4609375 0.1875 -vt 0.4375 0.1875 -vt 0.4375 0.3125 -vt 0.375 0.3125 -vt 0.375 0.359375 -vt 0.4375 0.359375 -vt 0.5 0.359375 -vt 0.4375 0.359375 -vt 0.4375 0.3125 -vt 0.5 0.3125 -vn 1 0 -2.220446049250313e-16 -vn 2.220446049250313e-16 0 1 -vn -1 0 2.220446049250313e-16 -vn -2.220446049250313e-16 0 -1 -vn 0 1 0 -vn 0 -1 0 -usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o body -v 0.375 1.3750000000000002 -0.5 -v 0.375 0.7500000000000002 -0.5 -v 0.375 1.375 0.625 -v 0.375 0.75 0.625 -v -0.375 0.7500000000000002 -0.5 -v -0.375 1.3750000000000002 -0.5 -v -0.375 0.75 0.625 -v -0.375 1.375 0.625 -vt 0.3046875 0.84375 -vt 0.3984375 0.84375 -vt 0.3984375 0.5625 -vt 0.3046875 0.5625 -vt 0.2265625 0.84375 -vt 0.3046875 0.84375 -vt 0.3046875 0.5625 -vt 0.2265625 0.5625 -vt 0.4765625 0.84375 -vt 0.5703125 0.84375 -vt 0.5703125 0.5625 -vt 0.4765625 0.5625 -vt 0.3984375 0.84375 -vt 0.4765625 0.84375 -vt 0.4765625 0.5625 -vt 0.3984375 0.5625 -vt 0.3984375 0.84375 -vt 0.3046875 0.84375 -vt 0.3046875 1 -vt 0.3984375 1 -vt 0.4921875 1 -vt 0.3984375 1 -vt 0.3984375 0.84375 -vt 0.4921875 0.84375 -vn 0 -1 -2.220446049250313e-16 -vn 1 0 0 -vn 0 1 2.220446049250313e-16 -vn -1 0 0 -vn 0 2.220446049250313e-16 -1 -vn 0 -2.220446049250313e-16 1 -usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o leg0 -v 0.34375 0.875 0.5 -v 0.34375 0.875 0.25 -v 0.34375 0 0.5 -v 0.34375 0 0.25 -v 0.09375 0.875 0.25 -v 0.09375 0.875 0.5 -v 0.09375 0 0.25 -v 0.09375 0 0.5 -vt 0.2578125 0.484375 -vt 0.2890625 0.484375 -vt 0.2890625 0.265625 -vt 0.2578125 0.265625 -vt 0.2265625 0.484375 -vt 0.2578125 0.484375 -vt 0.2578125 0.265625 -vt 0.2265625 0.265625 -vt 0.3203125 0.484375 -vt 0.3515625 0.484375 -vt 0.3515625 0.265625 -vt 0.3203125 0.265625 -vt 0.2890625 0.484375 -vt 0.3203125 0.484375 -vt 0.3203125 0.265625 -vt 0.2890625 0.265625 -vt 0.2890625 0.484375 -vt 0.2578125 0.484375 -vt 0.2578125 0.546875 -vt 0.2890625 0.546875 -vt 0.3203125 0.546875 -vt 0.2890625 0.546875 -vt 0.2890625 0.484375 -vt 0.3203125 0.484375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o leg1 -v -0.09375 0.875 0.5 -v -0.09375 0.875 0.25 -v -0.09375 0 0.5 -v -0.09375 0 0.25 -v -0.34375 0.875 0.25 -v -0.34375 0.875 0.5 -v -0.34375 0 0.25 -v -0.34375 0 0.5 -vt 0.2578125 0.484375 -vt 0.2890625 0.484375 -vt 0.2890625 0.265625 -vt 0.2578125 0.265625 -vt 0.2265625 0.484375 -vt 0.2578125 0.484375 -vt 0.2578125 0.265625 -vt 0.2265625 0.265625 -vt 0.3203125 0.484375 -vt 0.3515625 0.484375 -vt 0.3515625 0.265625 -vt 0.3203125 0.265625 -vt 0.2890625 0.484375 -vt 0.3203125 0.484375 -vt 0.3203125 0.265625 -vt 0.2890625 0.265625 -vt 0.2890625 0.484375 -vt 0.2578125 0.484375 -vt 0.2578125 0.546875 -vt 0.2890625 0.546875 -vt 0.3203125 0.546875 -vt 0.2890625 0.546875 -vt 0.2890625 0.484375 -vt 0.3203125 0.484375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o leg2 -v 0.34375 0.875 -0.1875 -v 0.34375 0.875 -0.4375 -v 0.34375 0 -0.1875 -v 0.34375 0 -0.4375 -v 0.09375 0.875 -0.4375 -v 0.09375 0.875 -0.1875 -v 0.09375 0 -0.4375 -v 0.09375 0 -0.1875 -vt 0.2578125 0.484375 -vt 0.2890625 0.484375 -vt 0.2890625 0.265625 -vt 0.2578125 0.265625 -vt 0.2265625 0.484375 -vt 0.2578125 0.484375 -vt 0.2578125 0.265625 -vt 0.2265625 0.265625 -vt 0.3203125 0.484375 -vt 0.3515625 0.484375 -vt 0.3515625 0.265625 -vt 0.3203125 0.265625 -vt 0.2890625 0.484375 -vt 0.3203125 0.484375 -vt 0.3203125 0.265625 -vt 0.2890625 0.265625 -vt 0.2890625 0.484375 -vt 0.2578125 0.484375 -vt 0.2578125 0.546875 -vt 0.2890625 0.546875 -vt 0.3203125 0.546875 -vt 0.2890625 0.546875 -vt 0.2890625 0.484375 -vt 0.3203125 0.484375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o leg3 -v -0.09375 0.875 -0.1875 -v -0.09375 0.875 -0.4375 -v -0.09375 0 -0.1875 -v -0.09375 0 -0.4375 -v -0.34375 0.875 -0.4375 -v -0.34375 0.875 -0.1875 -v -0.34375 0 -0.4375 -v -0.34375 0 -0.1875 -vt 0.2578125 0.484375 -vt 0.2890625 0.484375 -vt 0.2890625 0.265625 -vt 0.2578125 0.265625 -vt 0.2265625 0.484375 -vt 0.2578125 0.484375 -vt 0.2578125 0.265625 -vt 0.2265625 0.265625 -vt 0.3203125 0.484375 -vt 0.3515625 0.484375 -vt 0.3515625 0.265625 -vt 0.3203125 0.265625 -vt 0.2890625 0.484375 -vt 0.3203125 0.484375 -vt 0.3203125 0.265625 -vt 0.2890625 0.265625 -vt 0.2890625 0.484375 -vt 0.2578125 0.484375 -vt 0.2578125 0.546875 -vt 0.2890625 0.546875 -vt 0.3203125 0.546875 -vt 0.2890625 0.546875 -vt 0.2890625 0.484375 -vt 0.3203125 0.484375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_c2c1ddb5-5693-7a64-a950-f7fec476ea98 -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/minecart.obj b/renderer/viewer/three/entity/models/minecart.obj deleted file mode 100644 index 0dd2f4c8..00000000 --- a/renderer/viewer/three/entity/models/minecart.obj +++ /dev/null @@ -1,233 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o bottom -v 0.625 0.12500000000000022 -0.5000000000000002 -v 0.625 2.220446049250313e-16 -0.5000000000000002 -v 0.625 0.125 0.4999999999999998 -v 0.625 0 0.4999999999999998 -v -0.625 2.220446049250313e-16 -0.5000000000000002 -v -0.625 0.12500000000000022 -0.5000000000000002 -v -0.625 0 0.4999999999999998 -v -0.625 0.125 0.4999999999999998 -vt 0.34375 0.625 -vt 0.03125 0.625 -vt 0.03125 0.125 -vt 0.34375 0.125 -vt 0.375 0.625 -vt 0.34375 0.625 -vt 0.34375 0.125 -vt 0.375 0.125 -vt 0.6875 0.625 -vt 0.375 0.625 -vt 0.375 0.125 -vt 0.6875 0.125 -vt 0.03125 0.625 -vt 0 0.625 -vt 0 0.125 -vt 0.03125 0.125 -vt 0.03125 0.625 -vt 0.34375 0.625 -vt 0.34375 0.6875 -vt 0.03125 0.6875 -vt 0.34375 0.6875 -vt 0.65625 0.6875 -vt 0.65625 0.625 -vt 0.34375 0.625 -vn 0 -1 -2.220446049250313e-16 -vn 1 0 0 -vn 0 1 2.220446049250313e-16 -vn -1 0 0 -vn 0 2.220446049250313e-16 -1 -vn 0 -2.220446049250313e-16 1 -usemtl m_51fd1571-03b7-0fcd-9442-72fc6c7ce0a3 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o front -v 0.625 0.625 -0.5 -v 0.5 0.625 -0.5 -v 0.625 0.125 -0.5 -v 0.5 0.125 -0.5 -v 0.4999999999999999 0.625 0.5 -v 0.625 0.625 0.5 -v 0.4999999999999999 0.125 0.5 -v 0.625 0.125 0.5 -vt 0.28125 0.9375 -vt 0.03125 0.9375 -vt 0.03125 0.6875 -vt 0.28125 0.6875 -vt 0.3125 0.9375 -vt 0.28125 0.9375 -vt 0.28125 0.6875 -vt 0.3125 0.6875 -vt 0.5625 0.9375 -vt 0.3125 0.9375 -vt 0.3125 0.6875 -vt 0.5625 0.6875 -vt 0.03125 0.9375 -vt 0 0.9375 -vt 0 0.6875 -vt 0.03125 0.6875 -vt 0.03125 0.9375 -vt 0.28125 0.9375 -vt 0.28125 1 -vt 0.03125 1 -vt 0.28125 1 -vt 0.53125 1 -vt 0.53125 0.9375 -vt 0.28125 0.9375 -vn -1 0 -2.220446049250313e-16 -vn 2.220446049250313e-16 0 -1 -vn 1 0 2.220446049250313e-16 -vn -2.220446049250313e-16 0 1 -vn 0 1 0 -vn 0 -1 0 -usemtl m_51fd1571-03b7-0fcd-9442-72fc6c7ce0a3 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o back -v -0.6249999999999999 0.625 0.5 -v -0.4999999999999999 0.625 0.5 -v -0.6249999999999999 0.125 0.5 -v -0.4999999999999999 0.125 0.5 -v -0.5000000000000001 0.625 -0.5 -v -0.6250000000000001 0.625 -0.5 -v -0.5000000000000001 0.125 -0.5 -v -0.6250000000000001 0.125 -0.5 -vt 0.28125 0.9375 -vt 0.03125 0.9375 -vt 0.03125 0.6875 -vt 0.28125 0.6875 -vt 0.3125 0.9375 -vt 0.28125 0.9375 -vt 0.28125 0.6875 -vt 0.3125 0.6875 -vt 0.5625 0.9375 -vt 0.3125 0.9375 -vt 0.3125 0.6875 -vt 0.5625 0.6875 -vt 0.03125 0.9375 -vt 0 0.9375 -vt 0 0.6875 -vt 0.03125 0.6875 -vt 0.03125 0.9375 -vt 0.28125 0.9375 -vt 0.28125 1 -vt 0.03125 1 -vt 0.28125 1 -vt 0.53125 1 -vt 0.53125 0.9375 -vt 0.28125 0.9375 -vn 1 0 -2.220446049250313e-16 -vn 2.220446049250313e-16 0 1 -vn -1 0 2.220446049250313e-16 -vn -2.220446049250313e-16 0 -1 -vn 0 1 0 -vn 0 -1 0 -usemtl m_51fd1571-03b7-0fcd-9442-72fc6c7ce0a3 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o right -v -0.49999999999999994 0.625 -0.5 -v -0.5000000000000001 0.625 -0.37500000000000006 -v -0.49999999999999994 0.125 -0.5 -v -0.5000000000000001 0.125 -0.37500000000000006 -v 0.5 0.625 -0.3749999999999999 -v 0.5 0.625 -0.49999999999999994 -v 0.5 0.125 -0.3749999999999999 -v 0.5 0.125 -0.49999999999999994 -vt 0.28125 0.9375 -vt 0.03125 0.9375 -vt 0.03125 0.6875 -vt 0.28125 0.6875 -vt 0.3125 0.9375 -vt 0.28125 0.9375 -vt 0.28125 0.6875 -vt 0.3125 0.6875 -vt 0.5625 0.9375 -vt 0.3125 0.9375 -vt 0.3125 0.6875 -vt 0.5625 0.6875 -vt 0.03125 0.9375 -vt 0 0.9375 -vt 0 0.6875 -vt 0.03125 0.6875 -vt 0.03125 0.9375 -vt 0.28125 0.9375 -vt 0.28125 1 -vt 0.03125 1 -vt 0.28125 1 -vt 0.53125 1 -vt 0.53125 0.9375 -vt 0.28125 0.9375 -vn -1.2246467991473532e-16 0 1 -vn -1 0 -1.2246467991473532e-16 -vn 1.2246467991473532e-16 0 -1 -vn 1 0 1.2246467991473532e-16 -vn 0 1 0 -vn 0 -1 0 -usemtl m_51fd1571-03b7-0fcd-9442-72fc6c7ce0a3 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o left -v 0.5 0.625 0.5 -v 0.5 0.625 0.375 -v 0.5 0.125 0.5 -v 0.5 0.125 0.375 -v -0.5 0.625 0.375 -v -0.5 0.625 0.5 -v -0.5 0.125 0.375 -v -0.5 0.125 0.5 -vt 0.28125 0.9375 -vt 0.03125 0.9375 -vt 0.03125 0.6875 -vt 0.28125 0.6875 -vt 0.3125 0.9375 -vt 0.28125 0.9375 -vt 0.28125 0.6875 -vt 0.3125 0.6875 -vt 0.5625 0.9375 -vt 0.3125 0.9375 -vt 0.3125 0.6875 -vt 0.5625 0.6875 -vt 0.03125 0.9375 -vt 0 0.9375 -vt 0 0.6875 -vt 0.03125 0.6875 -vt 0.03125 0.9375 -vt 0.28125 0.9375 -vt 0.28125 1 -vt 0.03125 1 -vt 0.28125 1 -vt 0.53125 1 -vt 0.53125 0.9375 -vt 0.28125 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_51fd1571-03b7-0fcd-9442-72fc6c7ce0a3 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/parrot.obj b/renderer/viewer/three/entity/models/parrot.obj deleted file mode 100644 index 35d14a5d..00000000 --- a/renderer/viewer/three/entity/models/parrot.obj +++ /dev/null @@ -1,509 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o body -v 0.09375 0.5083704620381906 -0.10253364496531403 -v 0.09375 0.4291295379618094 -0.2724663550346859 -v 0.09375 0.16850504189944682 0.05594820318744831 -v 0.09375 0.08926411782306565 -0.11398450688192363 -v -0.09375 0.4291295379618094 -0.2724663550346859 -v -0.09375 0.5083704620381906 -0.10253364496531403 -v -0.09375 0.08926411782306565 -0.11398450688192363 -v -0.09375 0.16850504189944682 0.05594820318744831 -vt 0.15625 0.65625 -vt 0.25 0.65625 -vt 0.25 0.46875 -vt 0.15625 0.46875 -vt 0.0625 0.65625 -vt 0.15625 0.65625 -vt 0.15625 0.46875 -vt 0.0625 0.46875 -vt 0.34375 0.65625 -vt 0.4375 0.65625 -vt 0.4375 0.46875 -vt 0.34375 0.46875 -vt 0.25 0.65625 -vt 0.34375 0.65625 -vt 0.34375 0.46875 -vt 0.25 0.46875 -vt 0.25 0.65625 -vt 0.15625 0.65625 -vt 0.15625 0.75 -vt 0.25 0.75 -vt 0.34375 0.75 -vt 0.25 0.75 -vt 0.25 0.65625 -vt 0.34375 0.65625 -vn 0 -0.42261826174069944 -0.9063077870366499 -vn 1 0 0 -vn 0 0.42261826174069944 0.9063077870366499 -vn -1 0 0 -vn 0 0.9063077870366499 -0.42261826174069944 -vn 0 -0.9063077870366499 0.42261826174069944 -usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o wing0 -v -0.0625 0.5051478245037531 -0.08881019196643142 -v -0.0625 0.3976022426879319 -0.24240120027061735 -v -0.0625 0.24916281066344315 0.09043244439327047 -v -0.0625 0.14161722884762196 -0.06315856391091551 -v -0.125 0.3976022426879319 -0.24240120027061735 -v -0.125 0.5051478245037531 -0.08881019196643142 -v -0.125 0.14161722884762196 -0.06315856391091551 -v -0.125 0.24916281066344315 0.09043244439327047 -vt 0.6875 0.65625 -vt 0.71875 0.65625 -vt 0.71875 0.5 -vt 0.6875 0.5 -vt 0.59375 0.65625 -vt 0.6875 0.65625 -vt 0.6875 0.5 -vt 0.59375 0.5 -vt 0.8125 0.65625 -vt 0.84375 0.65625 -vt 0.84375 0.5 -vt 0.8125 0.5 -vt 0.71875 0.65625 -vt 0.8125 0.65625 -vt 0.8125 0.5 -vt 0.71875 0.5 -vt 0.71875 0.65625 -vt 0.6875 0.65625 -vt 0.6875 0.75 -vt 0.71875 0.75 -vt 0.75 0.75 -vt 0.71875 0.75 -vt 0.71875 0.65625 -vt 0.75 0.65625 -vn 0 -0.5735764363510462 -0.8191520442889919 -vn 1 0 0 -vn 0 0.5735764363510462 0.8191520442889919 -vn -1 0 0 -vn 0 0.8191520442889919 -0.5735764363510462 -vn 0 -0.8191520442889919 0.5735764363510462 -usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o wing1 -v 0.125 0.5051478245037531 -0.08881019196643142 -v 0.125 0.3976022426879319 -0.24240120027061735 -v 0.125 0.24916281066344315 0.09043244439327047 -v 0.125 0.14161722884762196 -0.06315856391091551 -v 0.0625 0.3976022426879319 -0.24240120027061735 -v 0.0625 0.5051478245037531 -0.08881019196643142 -v 0.0625 0.14161722884762196 -0.06315856391091551 -v 0.0625 0.24916281066344315 0.09043244439327047 -vt 0.6875 0.65625 -vt 0.71875 0.65625 -vt 0.71875 0.5 -vt 0.6875 0.5 -vt 0.59375 0.65625 -vt 0.6875 0.65625 -vt 0.6875 0.5 -vt 0.59375 0.5 -vt 0.8125 0.65625 -vt 0.84375 0.65625 -vt 0.84375 0.5 -vt 0.8125 0.5 -vt 0.71875 0.65625 -vt 0.8125 0.65625 -vt 0.8125 0.5 -vt 0.71875 0.5 -vt 0.71875 0.65625 -vt 0.6875 0.65625 -vt 0.6875 0.75 -vt 0.71875 0.75 -vt 0.75 0.75 -vt 0.71875 0.75 -vt 0.71875 0.65625 -vt 0.75 0.65625 -vn 0 -0.5735764363510462 -0.8191520442889919 -vn 1 0 0 -vn 0 0.5735764363510462 0.8191520442889919 -vn -1 0 0 -vn 0 0.8191520442889919 -0.5735764363510462 -vn 0 -0.8191520442889919 0.5735764363510462 -usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o head -v 0.0625 0.6125 -0.11249999999999999 -v 0.0625 0.6125 -0.2375 -v 0.0625 0.42500000000000004 -0.11249999999999999 -v 0.0625 0.42500000000000004 -0.2375 -v -0.0625 0.6125 -0.2375 -v -0.0625 0.6125 -0.11249999999999999 -v -0.0625 0.42500000000000004 -0.2375 -v -0.0625 0.42500000000000004 -0.11249999999999999 -vt 0.125 0.875 -vt 0.1875 0.875 -vt 0.1875 0.78125 -vt 0.125 0.78125 -vt 0.0625 0.875 -vt 0.125 0.875 -vt 0.125 0.78125 -vt 0.0625 0.78125 -vt 0.25 0.875 -vt 0.3125 0.875 -vt 0.3125 0.78125 -vt 0.25 0.78125 -vt 0.1875 0.875 -vt 0.25 0.875 -vt 0.25 0.78125 -vt 0.1875 0.78125 -vt 0.1875 0.875 -vt 0.125 0.875 -vt 0.125 0.9375 -vt 0.1875 0.9375 -vt 0.25 0.9375 -vt 0.1875 0.9375 -vt 0.1875 0.875 -vt 0.25 0.875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o head2 -v 0.0625 0.675 -0.11249999999999999 -v 0.0625 0.675 -0.3625 -v 0.0625 0.6125 -0.11249999999999999 -v 0.0625 0.6125 -0.3625 -v -0.0625 0.675 -0.3625 -v -0.0625 0.675 -0.11249999999999999 -v -0.0625 0.6125 -0.3625 -v -0.0625 0.6125 -0.11249999999999999 -vt 0.4375 0.875 -vt 0.5 0.875 -vt 0.5 0.84375 -vt 0.4375 0.84375 -vt 0.3125 0.875 -vt 0.4375 0.875 -vt 0.4375 0.84375 -vt 0.3125 0.84375 -vt 0.625 0.875 -vt 0.6875 0.875 -vt 0.6875 0.84375 -vt 0.625 0.84375 -vt 0.5 0.875 -vt 0.625 0.875 -vt 0.625 0.84375 -vt 0.5 0.84375 -vt 0.5 0.875 -vt 0.4375 0.875 -vt 0.4375 1 -vt 0.5 1 -vt 0.5625 1 -vt 0.5 1 -vt 0.5 0.875 -vt 0.5625 0.875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o beak1 -v 0.03125 0.6125 -0.23125 -v 0.03125 0.6125 -0.29375 -v 0.03125 0.48750000000000004 -0.23125 -v 0.03125 0.48750000000000004 -0.29375 -v -0.03125 0.6125 -0.29375 -v -0.03125 0.6125 -0.23125 -v -0.03125 0.48750000000000004 -0.29375 -v -0.03125 0.48750000000000004 -0.23125 -vt 0.375 0.75 -vt 0.40625 0.75 -vt 0.40625 0.6875 -vt 0.375 0.6875 -vt 0.34375 0.75 -vt 0.375 0.75 -vt 0.375 0.6875 -vt 0.34375 0.6875 -vt 0.4375 0.75 -vt 0.46875 0.75 -vt 0.46875 0.6875 -vt 0.4375 0.6875 -vt 0.40625 0.75 -vt 0.4375 0.75 -vt 0.4375 0.6875 -vt 0.40625 0.6875 -vt 0.40625 0.75 -vt 0.375 0.75 -vt 0.375 0.78125 -vt 0.40625 0.78125 -vt 0.4375 0.78125 -vt 0.40625 0.78125 -vt 0.40625 0.75 -vt 0.4375 0.75 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o beak2 -v 0.03125 0.6124999999999998 -0.29375 -v 0.03125 0.6124999999999998 -0.35625 -v 0.03125 0.5062500000000001 -0.29375 -v 0.03125 0.5062500000000001 -0.35625 -v -0.03125 0.6124999999999998 -0.35625 -v -0.03125 0.6124999999999998 -0.29375 -v -0.03125 0.5062500000000001 -0.35625 -v -0.03125 0.5062500000000001 -0.29375 -vt 0.53125 0.75 -vt 0.5625 0.75 -vt 0.5625 0.71875 -vt 0.53125 0.71875 -vt 0.5 0.75 -vt 0.53125 0.75 -vt 0.53125 0.71875 -vt 0.5 0.71875 -vt 0.59375 0.75 -vt 0.625 0.75 -vt 0.625 0.71875 -vt 0.59375 0.71875 -vt 0.5625 0.75 -vt 0.59375 0.75 -vt 0.59375 0.71875 -vt 0.5625 0.71875 -vt 0.5625 0.75 -vt 0.53125 0.75 -vt 0.53125 0.78125 -vt 0.5625 0.78125 -vt 0.59375 0.78125 -vt 0.5625 0.78125 -vt 0.5625 0.75 -vt 0.59375 0.75 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o feather -v 0 0.8812500000000001 -0.05625000000000002 -v 0 0.8812500000000001 -0.30625 -v 0 0.5687500000000001 -0.05625000000000002 -v 0 0.5687500000000001 -0.30625 -v 0 0.8812500000000001 -0.30625 -v 0 0.8812500000000001 -0.05625000000000002 -v 0 0.5687500000000001 -0.30625 -v 0 0.5687500000000001 -0.05625000000000002 -vt 0.1875 0.3125 -vt 0.1875 0.3125 -vt 0.1875 0.15625 -vt 0.1875 0.15625 -vt 0.0625 0.3125 -vt 0.1875 0.3125 -vt 0.1875 0.15625 -vt 0.0625 0.15625 -vt 0.3125 0.3125 -vt 0.3125 0.3125 -vt 0.3125 0.15625 -vt 0.3125 0.15625 -vt 0.1875 0.3125 -vt 0.3125 0.3125 -vt 0.3125 0.15625 -vt 0.1875 0.15625 -vt 0.1875 0.3125 -vt 0.1875 0.3125 -vt 0.1875 0.4375 -vt 0.1875 0.4375 -vt 0.1875 0.4375 -vt 0.1875 0.4375 -vt 0.1875 0.3125 -vt 0.1875 0.3125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o tail -v 0.09375 0.22142422560540864 0.027122222305063892 -v 0.09375 0.17354644791047258 -0.013052003300344839 -v 0.09375 0.06072732318377394 0.21863333308480837 -v 0.09375 0.012849545488837766 0.17845910747939964 -v -0.09375 0.17354644791047258 -0.013052003300344839 -v -0.09375 0.22142422560540864 0.027122222305063892 -v -0.09375 0.012849545488837766 0.17845910747939964 -v -0.09375 0.06072732318377394 0.21863333308480837 -vt 0.71875 0.9375 -vt 0.8125 0.9375 -vt 0.8125 0.8125 -vt 0.71875 0.8125 -vt 0.6875 0.9375 -vt 0.71875 0.9375 -vt 0.71875 0.8125 -vt 0.6875 0.8125 -vt 0.84375 0.9375 -vt 0.9375 0.9375 -vt 0.9375 0.8125 -vt 0.84375 0.8125 -vt 0.8125 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.8125 -vt 0.8125 0.8125 -vt 0.8125 0.9375 -vt 0.71875 0.9375 -vt 0.71875 0.96875 -vt 0.8125 0.96875 -vt 0.90625 0.96875 -vt 0.8125 0.96875 -vt 0.8125 0.9375 -vt 0.90625 0.9375 -vn 0 -0.766044443118978 -0.6427876096865393 -vn 1 0 0 -vn 0 0.766044443118978 0.6427876096865393 -vn -1 0 0 -vn 0 0.6427876096865393 -0.766044443118978 -vn 0 -0.6427876096865393 0.766044443118978 -usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o leg0 -v -0.03125 0.09375 -0.03125 -v -0.03125 0.09375 -0.09375 -v -0.03125 -0.03125 -0.03125 -v -0.03125 -0.03125 -0.09375 -v -0.09375 0.09375 -0.09375 -v -0.09375 0.09375 -0.03125 -v -0.09375 -0.03125 -0.09375 -v -0.09375 -0.03125 -0.03125 -vt 0.46875 0.40625 -vt 0.5 0.40625 -vt 0.5 0.34375 -vt 0.46875 0.34375 -vt 0.4375 0.40625 -vt 0.46875 0.40625 -vt 0.46875 0.34375 -vt 0.4375 0.34375 -vt 0.53125 0.40625 -vt 0.5625 0.40625 -vt 0.5625 0.34375 -vt 0.53125 0.34375 -vt 0.5 0.40625 -vt 0.53125 0.40625 -vt 0.53125 0.34375 -vt 0.5 0.34375 -vt 0.5 0.40625 -vt 0.46875 0.40625 -vt 0.46875 0.4375 -vt 0.5 0.4375 -vt 0.53125 0.4375 -vt 0.5 0.4375 -vt 0.5 0.40625 -vt 0.53125 0.40625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o leg1 -v 0.09375 0.09375 -0.03125 -v 0.09375 0.09375 -0.09375 -v 0.09375 -0.03125 -0.03125 -v 0.09375 -0.03125 -0.09375 -v 0.03125 0.09375 -0.09375 -v 0.03125 0.09375 -0.03125 -v 0.03125 -0.03125 -0.09375 -v 0.03125 -0.03125 -0.03125 -vt 0.46875 0.40625 -vt 0.5 0.40625 -vt 0.5 0.34375 -vt 0.46875 0.34375 -vt 0.4375 0.40625 -vt 0.46875 0.40625 -vt 0.46875 0.34375 -vt 0.4375 0.34375 -vt 0.53125 0.40625 -vt 0.5625 0.40625 -vt 0.5625 0.34375 -vt 0.53125 0.34375 -vt 0.5 0.40625 -vt 0.53125 0.40625 -vt 0.53125 0.34375 -vt 0.5 0.34375 -vt 0.5 0.40625 -vt 0.46875 0.40625 -vt 0.46875 0.4375 -vt 0.5 0.4375 -vt 0.53125 0.4375 -vt 0.5 0.4375 -vt 0.5 0.40625 -vt 0.53125 0.40625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_c341d2fe-028b-bd76-6b34-40c8c9b3653b -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/piglin.obj b/renderer/viewer/three/entity/models/piglin.obj deleted file mode 100644 index 2f68f4c1..00000000 --- a/renderer/viewer/three/entity/models/piglin.obj +++ /dev/null @@ -1,739 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o Body -v 0.25 1.5 0.125 -v 0.25 1.5 -0.125 -v 0.25 0.75 0.125 -v 0.25 0.75 -0.125 -v -0.25 1.5 -0.125 -v -0.25 1.5 0.125 -v -0.25 0.75 -0.125 -v -0.25 0.75 0.125 -vt 0.3125 0.6875 -vt 0.4375 0.6875 -vt 0.4375 0.5 -vt 0.3125 0.5 -vt 0.25 0.6875 -vt 0.3125 0.6875 -vt 0.3125 0.5 -vt 0.25 0.5 -vt 0.5 0.6875 -vt 0.625 0.6875 -vt 0.625 0.5 -vt 0.5 0.5 -vt 0.4375 0.6875 -vt 0.5 0.6875 -vt 0.5 0.5 -vt 0.4375 0.5 -vt 0.4375 0.6875 -vt 0.3125 0.6875 -vt 0.3125 0.75 -vt 0.4375 0.75 -vt 0.5625 0.75 -vt 0.4375 0.75 -vt 0.4375 0.6875 -vt 0.5625 0.6875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o Body -v 0.265625 1.515625 0.140625 -v 0.265625 1.515625 -0.140625 -v 0.265625 0.734375 0.140625 -v 0.265625 0.734375 -0.140625 -v -0.265625 1.515625 -0.140625 -v -0.265625 1.515625 0.140625 -v -0.265625 0.734375 -0.140625 -v -0.265625 0.734375 0.140625 -vt 0.3125 0.4375 -vt 0.4375 0.4375 -vt 0.4375 0.25 -vt 0.3125 0.25 -vt 0.25 0.4375 -vt 0.3125 0.4375 -vt 0.3125 0.25 -vt 0.25 0.25 -vt 0.5 0.4375 -vt 0.625 0.4375 -vt 0.625 0.25 -vt 0.5 0.25 -vt 0.4375 0.4375 -vt 0.5 0.4375 -vt 0.5 0.25 -vt 0.4375 0.25 -vt 0.4375 0.4375 -vt 0.3125 0.4375 -vt 0.3125 0.5 -vt 0.4375 0.5 -vt 0.5625 0.5 -vt 0.4375 0.5 -vt 0.4375 0.4375 -vt 0.5625 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o head -v 0.31125 1.9987500000000002 0.24875000000000003 -v 0.31125 1.9987500000000002 -0.24875000000000003 -v 0.31125 1.5012499999999998 0.24875000000000003 -v 0.31125 1.5012499999999998 -0.24875000000000003 -v -0.31125 1.9987500000000002 -0.24875000000000003 -v -0.31125 1.9987500000000002 0.24875000000000003 -v -0.31125 1.5012499999999998 -0.24875000000000003 -v -0.31125 1.5012499999999998 0.24875000000000003 -vt 0.125 0.875 -vt 0.28125 0.875 -vt 0.28125 0.75 -vt 0.125 0.75 -vt 0 0.875 -vt 0.125 0.875 -vt 0.125 0.75 -vt 0 0.75 -vt 0.40625 0.875 -vt 0.5625 0.875 -vt 0.5625 0.75 -vt 0.40625 0.75 -vt 0.28125 0.875 -vt 0.40625 0.875 -vt 0.40625 0.75 -vt 0.28125 0.75 -vt 0.28125 0.875 -vt 0.125 0.875 -vt 0.125 1 -vt 0.28125 1 -vt 0.4375 1 -vt 0.28125 1 -vt 0.28125 0.875 -vt 0.4375 0.875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o head -v 0.125 1.75 -0.25 -v 0.125 1.75 -0.3125 -v 0.125 1.5 -0.25 -v 0.125 1.5 -0.3125 -v -0.125 1.75 -0.3125 -v -0.125 1.75 -0.25 -v -0.125 1.5 -0.3125 -v -0.125 1.5 -0.25 -vt 0.5 0.96875 -vt 0.5625 0.96875 -vt 0.5625 0.90625 -vt 0.5 0.90625 -vt 0.484375 0.96875 -vt 0.5 0.96875 -vt 0.5 0.90625 -vt 0.484375 0.90625 -vt 0.578125 0.96875 -vt 0.640625 0.96875 -vt 0.640625 0.90625 -vt 0.578125 0.90625 -vt 0.5625 0.96875 -vt 0.578125 0.96875 -vt 0.578125 0.90625 -vt 0.5625 0.90625 -vt 0.5625 0.96875 -vt 0.5 0.96875 -vt 0.5 0.984375 -vt 0.5625 0.984375 -vt 0.625 0.984375 -vt 0.5625 0.984375 -vt 0.5625 0.96875 -vt 0.625 0.96875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o head -v -0.125 1.625 -0.25 -v -0.125 1.625 -0.3125 -v -0.125 1.5 -0.25 -v -0.125 1.5 -0.3125 -v -0.1875 1.625 -0.3125 -v -0.1875 1.625 -0.25 -v -0.1875 1.5 -0.3125 -v -0.1875 1.5 -0.25 -vt 0.046875 0.921875 -vt 0.0625 0.921875 -vt 0.0625 0.890625 -vt 0.046875 0.890625 -vt 0.03125 0.921875 -vt 0.046875 0.921875 -vt 0.046875 0.890625 -vt 0.03125 0.890625 -vt 0.078125 0.921875 -vt 0.09375 0.921875 -vt 0.09375 0.890625 -vt 0.078125 0.890625 -vt 0.0625 0.921875 -vt 0.078125 0.921875 -vt 0.078125 0.890625 -vt 0.0625 0.890625 -vt 0.0625 0.921875 -vt 0.046875 0.921875 -vt 0.046875 0.9375 -vt 0.0625 0.9375 -vt 0.078125 0.9375 -vt 0.0625 0.9375 -vt 0.0625 0.921875 -vt 0.078125 0.921875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o head -v 0.1875 1.625 -0.25 -v 0.1875 1.625 -0.3125 -v 0.1875 1.5 -0.25 -v 0.1875 1.5 -0.3125 -v 0.125 1.625 -0.3125 -v 0.125 1.625 -0.25 -v 0.125 1.5 -0.3125 -v 0.125 1.5 -0.25 -vt 0.046875 0.984375 -vt 0.0625 0.984375 -vt 0.0625 0.953125 -vt 0.046875 0.953125 -vt 0.03125 0.984375 -vt 0.046875 0.984375 -vt 0.046875 0.953125 -vt 0.03125 0.953125 -vt 0.078125 0.984375 -vt 0.09375 0.984375 -vt 0.09375 0.953125 -vt 0.078125 0.953125 -vt 0.0625 0.984375 -vt 0.078125 0.984375 -vt 0.078125 0.953125 -vt 0.0625 0.953125 -vt 0.0625 0.984375 -vt 0.046875 0.984375 -vt 0.046875 1 -vt 0.0625 1 -vt 0.078125 1 -vt 0.0625 1 -vt 0.0625 0.984375 -vt 0.078125 0.984375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o leftear -v -0.25837341226347266 1.84375 0.125 -v -0.25837341226347266 1.84375 -0.125 -v -0.41462341226347266 1.573117061317363 0.125 -v -0.41462341226347266 1.573117061317363 -0.125 -v -0.3125 1.875 -0.125 -v -0.3125 1.875 0.125 -v -0.46875 1.604367061317363 -0.125 -v -0.46875 1.604367061317363 0.125 -vt 0.859375 0.84375 -vt 0.875 0.84375 -vt 0.875 0.765625 -vt 0.859375 0.765625 -vt 0.796875 0.84375 -vt 0.859375 0.84375 -vt 0.859375 0.765625 -vt 0.796875 0.765625 -vt 0.9375 0.84375 -vt 0.953125 0.84375 -vt 0.953125 0.765625 -vt 0.9375 0.765625 -vt 0.875 0.84375 -vt 0.9375 0.84375 -vt 0.9375 0.765625 -vt 0.875 0.765625 -vt 0.875 0.84375 -vt 0.859375 0.84375 -vt 0.859375 0.90625 -vt 0.875 0.90625 -vt 0.890625 0.90625 -vt 0.875 0.90625 -vt 0.875 0.84375 -vt 0.890625 0.84375 -vn 0 0 -1 -vn 0.8660254037844387 -0.49999999999999994 0 -vn 0 0 1 -vn -0.8660254037844387 0.49999999999999994 0 -vn 0.49999999999999994 0.8660254037844387 0 -vn -0.49999999999999994 -0.8660254037844387 0 -usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o rightear -v 0.3125 1.875 0.125 -v 0.3125 1.875 -0.125 -v 0.46875 1.604367061317363 0.125 -v 0.46875 1.604367061317363 -0.125 -v 0.25837341226347266 1.84375 -0.125 -v 0.25837341226347266 1.84375 0.125 -v 0.41462341226347266 1.573117061317363 -0.125 -v 0.41462341226347266 1.573117061317363 0.125 -vt 0.671875 0.84375 -vt 0.6875 0.84375 -vt 0.6875 0.765625 -vt 0.671875 0.765625 -vt 0.609375 0.84375 -vt 0.671875 0.84375 -vt 0.671875 0.765625 -vt 0.609375 0.765625 -vt 0.75 0.84375 -vt 0.765625 0.84375 -vt 0.765625 0.765625 -vt 0.75 0.765625 -vt 0.6875 0.84375 -vt 0.75 0.84375 -vt 0.75 0.765625 -vt 0.6875 0.765625 -vt 0.6875 0.84375 -vt 0.671875 0.84375 -vt 0.671875 0.90625 -vt 0.6875 0.90625 -vt 0.703125 0.90625 -vt 0.6875 0.90625 -vt 0.6875 0.84375 -vt 0.703125 0.84375 -vn 0 0 -1 -vn 0.8660254037844387 0.49999999999999994 0 -vn 0 0 1 -vn -0.8660254037844387 -0.49999999999999994 0 -vn -0.49999999999999994 0.8660254037844387 0 -vn 0.49999999999999994 -0.8660254037844387 0 -usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o RightArm -v 0.5 1.5 0.125 -v 0.5 1.5 -0.125 -v 0.5 0.75 0.125 -v 0.5 0.75 -0.125 -v 0.25 1.5 -0.125 -v 0.25 1.5 0.125 -v 0.25 0.75 -0.125 -v 0.25 0.75 0.125 -vt 0.6875 0.6875 -vt 0.75 0.6875 -vt 0.75 0.5 -vt 0.6875 0.5 -vt 0.625 0.6875 -vt 0.6875 0.6875 -vt 0.6875 0.5 -vt 0.625 0.5 -vt 0.8125 0.6875 -vt 0.875 0.6875 -vt 0.875 0.5 -vt 0.8125 0.5 -vt 0.75 0.6875 -vt 0.8125 0.6875 -vt 0.8125 0.5 -vt 0.75 0.5 -vt 0.75 0.6875 -vt 0.6875 0.6875 -vt 0.6875 0.75 -vt 0.75 0.75 -vt 0.8125 0.75 -vt 0.75 0.75 -vt 0.75 0.6875 -vt 0.8125 0.6875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o RightArm -v 0.515625 1.515625 0.140625 -v 0.515625 1.515625 -0.140625 -v 0.515625 0.734375 0.140625 -v 0.515625 0.734375 -0.140625 -v 0.234375 1.515625 -0.140625 -v 0.234375 1.515625 0.140625 -v 0.234375 0.734375 -0.140625 -v 0.234375 0.734375 0.140625 -vt 0.6875 0.4375 -vt 0.75 0.4375 -vt 0.75 0.25 -vt 0.6875 0.25 -vt 0.625 0.4375 -vt 0.6875 0.4375 -vt 0.6875 0.25 -vt 0.625 0.25 -vt 0.8125 0.4375 -vt 0.875 0.4375 -vt 0.875 0.25 -vt 0.8125 0.25 -vt 0.75 0.4375 -vt 0.8125 0.4375 -vt 0.8125 0.25 -vt 0.75 0.25 -vt 0.75 0.4375 -vt 0.6875 0.4375 -vt 0.6875 0.5 -vt 0.75 0.5 -vt 0.8125 0.5 -vt 0.75 0.5 -vt 0.75 0.4375 -vt 0.8125 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o LeftArm -v -0.25 1.5 0.125 -v -0.25 1.5 -0.125 -v -0.25 0.75 0.125 -v -0.25 0.75 -0.125 -v -0.5 1.5 -0.125 -v -0.5 1.5 0.125 -v -0.5 0.75 -0.125 -v -0.5 0.75 0.125 -vt 0.5625 0.1875 -vt 0.625 0.1875 -vt 0.625 0 -vt 0.5625 0 -vt 0.5 0.1875 -vt 0.5625 0.1875 -vt 0.5625 0 -vt 0.5 0 -vt 0.6875 0.1875 -vt 0.75 0.1875 -vt 0.75 0 -vt 0.6875 0 -vt 0.625 0.1875 -vt 0.6875 0.1875 -vt 0.6875 0 -vt 0.625 0 -vt 0.625 0.1875 -vt 0.5625 0.1875 -vt 0.5625 0.25 -vt 0.625 0.25 -vt 0.6875 0.25 -vt 0.625 0.25 -vt 0.625 0.1875 -vt 0.6875 0.1875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 -o LeftArm -v -0.234375 1.515625 0.140625 -v -0.234375 1.515625 -0.140625 -v -0.234375 0.734375 0.140625 -v -0.234375 0.734375 -0.140625 -v -0.515625 1.515625 -0.140625 -v -0.515625 1.515625 0.140625 -v -0.515625 0.734375 -0.140625 -v -0.515625 0.734375 0.140625 -vt 0.8125 0.1875 -vt 0.875 0.1875 -vt 0.875 0 -vt 0.8125 0 -vt 0.75 0.1875 -vt 0.8125 0.1875 -vt 0.8125 0 -vt 0.75 0 -vt 0.9375 0.1875 -vt 1 0.1875 -vt 1 0 -vt 0.9375 0 -vt 0.875 0.1875 -vt 0.9375 0.1875 -vt 0.9375 0 -vt 0.875 0 -vt 0.875 0.1875 -vt 0.8125 0.1875 -vt 0.8125 0.25 -vt 0.875 0.25 -vt 0.9375 0.25 -vt 0.875 0.25 -vt 0.875 0.1875 -vt 0.9375 0.1875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 -f 92/268/67 95/267/67 93/266/67 90/265/67 -f 91/272/68 92/271/68 90/270/68 89/269/68 -f 96/276/69 91/275/69 89/274/69 94/273/69 -f 95/280/70 96/279/70 94/278/70 93/277/70 -f 94/284/71 89/283/71 90/282/71 93/281/71 -f 95/288/72 92/287/72 91/286/72 96/285/72 -o RightLeg -v 0.25 0.75 0.125 -v 0.25 0.75 -0.125 -v 0.25 0 0.125 -v 0.25 0 -0.125 -v 0 0.75 -0.125 -v 0 0.75 0.125 -v 0 0 -0.125 -v 0 0 0.125 -vt 0.0625 0.6875 -vt 0.125 0.6875 -vt 0.125 0.5 -vt 0.0625 0.5 -vt 0 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.5 -vt 0 0.5 -vt 0.1875 0.6875 -vt 0.25 0.6875 -vt 0.25 0.5 -vt 0.1875 0.5 -vt 0.125 0.6875 -vt 0.1875 0.6875 -vt 0.1875 0.5 -vt 0.125 0.5 -vt 0.125 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.75 -vt 0.125 0.75 -vt 0.1875 0.75 -vt 0.125 0.75 -vt 0.125 0.6875 -vt 0.1875 0.6875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 -f 100/292/73 103/291/73 101/290/73 98/289/73 -f 99/296/74 100/295/74 98/294/74 97/293/74 -f 104/300/75 99/299/75 97/298/75 102/297/75 -f 103/304/76 104/303/76 102/302/76 101/301/76 -f 102/308/77 97/307/77 98/306/77 101/305/77 -f 103/312/78 100/311/78 99/310/78 104/309/78 -o RightLeg -v 0.265625 0.765625 0.140625 -v 0.265625 0.765625 -0.140625 -v 0.265625 -0.015625 0.140625 -v 0.265625 -0.015625 -0.140625 -v -0.015625 0.765625 -0.140625 -v -0.015625 0.765625 0.140625 -v -0.015625 -0.015625 -0.140625 -v -0.015625 -0.015625 0.140625 -vt 0.0625 0.4375 -vt 0.125 0.4375 -vt 0.125 0.25 -vt 0.0625 0.25 -vt 0 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.25 -vt 0 0.25 -vt 0.1875 0.4375 -vt 0.25 0.4375 -vt 0.25 0.25 -vt 0.1875 0.25 -vt 0.125 0.4375 -vt 0.1875 0.4375 -vt 0.1875 0.25 -vt 0.125 0.25 -vt 0.125 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.5 -vt 0.125 0.5 -vt 0.1875 0.5 -vt 0.125 0.5 -vt 0.125 0.4375 -vt 0.1875 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 -f 108/316/79 111/315/79 109/314/79 106/313/79 -f 107/320/80 108/319/80 106/318/80 105/317/80 -f 112/324/81 107/323/81 105/322/81 110/321/81 -f 111/328/82 112/327/82 110/326/82 109/325/82 -f 110/332/83 105/331/83 106/330/83 109/329/83 -f 111/336/84 108/335/84 107/334/84 112/333/84 -o LeftLeg -v 0 0.75 0.125 -v 0 0.75 -0.125 -v 0 0 0.125 -v 0 0 -0.125 -v -0.25 0.75 -0.125 -v -0.25 0.75 0.125 -v -0.25 0 -0.125 -v -0.25 0 0.125 -vt 0.3125 0.1875 -vt 0.375 0.1875 -vt 0.375 0 -vt 0.3125 0 -vt 0.25 0.1875 -vt 0.3125 0.1875 -vt 0.3125 0 -vt 0.25 0 -vt 0.4375 0.1875 -vt 0.5 0.1875 -vt 0.5 0 -vt 0.4375 0 -vt 0.375 0.1875 -vt 0.4375 0.1875 -vt 0.4375 0 -vt 0.375 0 -vt 0.375 0.1875 -vt 0.3125 0.1875 -vt 0.3125 0.25 -vt 0.375 0.25 -vt 0.4375 0.25 -vt 0.375 0.25 -vt 0.375 0.1875 -vt 0.4375 0.1875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 -f 116/340/85 119/339/85 117/338/85 114/337/85 -f 115/344/86 116/343/86 114/342/86 113/341/86 -f 120/348/87 115/347/87 113/346/87 118/345/87 -f 119/352/88 120/351/88 118/350/88 117/349/88 -f 118/356/89 113/355/89 114/354/89 117/353/89 -f 119/360/90 116/359/90 115/358/90 120/357/90 -o LeftLeg -v 0.015625 0.765625 0.140625 -v 0.015625 0.765625 -0.140625 -v 0.015625 -0.015625 0.140625 -v 0.015625 -0.015625 -0.140625 -v -0.265625 0.765625 -0.140625 -v -0.265625 0.765625 0.140625 -v -0.265625 -0.015625 -0.140625 -v -0.265625 -0.015625 0.140625 -vt 0.0625 0.1875 -vt 0.125 0.1875 -vt 0.125 0 -vt 0.0625 0 -vt 0 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0 -vt 0 0 -vt 0.1875 0.1875 -vt 0.25 0.1875 -vt 0.25 0 -vt 0.1875 0 -vt 0.125 0.1875 -vt 0.1875 0.1875 -vt 0.1875 0 -vt 0.125 0 -vt 0.125 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.25 -vt 0.125 0.25 -vt 0.1875 0.25 -vt 0.125 0.25 -vt 0.125 0.1875 -vt 0.1875 0.1875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_bd9b2175-46cc-d3be-0d85-ed94b50a7825 -f 124/364/91 127/363/91 125/362/91 122/361/91 -f 123/368/92 124/367/92 122/366/92 121/365/92 -f 128/372/93 123/371/93 121/370/93 126/369/93 -f 127/376/94 128/375/94 126/374/94 125/373/94 -f 126/380/95 121/379/95 122/378/95 125/377/95 -f 127/384/96 124/383/96 123/382/96 128/381/96 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/pillager.obj b/renderer/viewer/three/entity/models/pillager.obj deleted file mode 100644 index 213a3b94..00000000 --- a/renderer/viewer/three/entity/models/pillager.obj +++ /dev/null @@ -1,371 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o Body -v 0.25 1.5 0.1875 -v 0.25 1.5 -0.1875 -v 0.25 0.75 0.1875 -v 0.25 0.75 -0.1875 -v -0.25 1.5 -0.1875 -v -0.25 1.5 0.1875 -v -0.25 0.75 -0.1875 -v -0.25 0.75 0.1875 -vt 0.34375 0.59375 -vt 0.46875 0.59375 -vt 0.46875 0.40625 -vt 0.34375 0.40625 -vt 0.25 0.59375 -vt 0.34375 0.59375 -vt 0.34375 0.40625 -vt 0.25 0.40625 -vt 0.5625 0.59375 -vt 0.6875 0.59375 -vt 0.6875 0.40625 -vt 0.5625 0.40625 -vt 0.46875 0.59375 -vt 0.5625 0.59375 -vt 0.5625 0.40625 -vt 0.46875 0.40625 -vt 0.46875 0.59375 -vt 0.34375 0.59375 -vt 0.34375 0.6875 -vt 0.46875 0.6875 -vt 0.59375 0.6875 -vt 0.46875 0.6875 -vt 0.46875 0.59375 -vt 0.59375 0.59375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_0e7f3cc8-7af8-21a7-d2f3-04bee5fb4aae -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o Body -v 0.28125 1.53125 0.21875 -v 0.28125 1.53125 -0.21875 -v 0.28125 0.34375 0.21875 -v 0.28125 0.34375 -0.21875 -v -0.28125 1.53125 -0.21875 -v -0.28125 1.53125 0.21875 -v -0.28125 0.34375 -0.21875 -v -0.28125 0.34375 0.21875 -vt 0.09375 0.3125 -vt 0.21875 0.3125 -vt 0.21875 0.03125 -vt 0.09375 0.03125 -vt 0 0.3125 -vt 0.09375 0.3125 -vt 0.09375 0.03125 -vt 0 0.03125 -vt 0.3125 0.3125 -vt 0.4375 0.3125 -vt 0.4375 0.03125 -vt 0.3125 0.03125 -vt 0.21875 0.3125 -vt 0.3125 0.3125 -vt 0.3125 0.03125 -vt 0.21875 0.03125 -vt 0.21875 0.3125 -vt 0.09375 0.3125 -vt 0.09375 0.40625 -vt 0.21875 0.40625 -vt 0.34375 0.40625 -vt 0.21875 0.40625 -vt 0.21875 0.3125 -vt 0.34375 0.3125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_0e7f3cc8-7af8-21a7-d2f3-04bee5fb4aae -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o head -v 0.25 2.125 0.25 -v 0.25 2.125 -0.25 -v 0.25 1.5 0.25 -v 0.25 1.5 -0.25 -v -0.25 2.125 -0.25 -v -0.25 2.125 0.25 -v -0.25 1.5 -0.25 -v -0.25 1.5 0.25 -vt 0.125 0.875 -vt 0.25 0.875 -vt 0.25 0.71875 -vt 0.125 0.71875 -vt 0 0.875 -vt 0.125 0.875 -vt 0.125 0.71875 -vt 0 0.71875 -vt 0.375 0.875 -vt 0.5 0.875 -vt 0.5 0.71875 -vt 0.375 0.71875 -vt 0.25 0.875 -vt 0.375 0.875 -vt 0.375 0.71875 -vt 0.25 0.71875 -vt 0.25 0.875 -vt 0.125 0.875 -vt 0.125 1 -vt 0.25 1 -vt 0.375 1 -vt 0.25 1 -vt 0.25 0.875 -vt 0.375 0.875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_0e7f3cc8-7af8-21a7-d2f3-04bee5fb4aae -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o nose -v 0.0625 1.6875 -0.25 -v 0.0625 1.6875 -0.375 -v 0.0625 1.4375 -0.25 -v 0.0625 1.4375 -0.375 -v -0.0625 1.6875 -0.375 -v -0.0625 1.6875 -0.25 -v -0.0625 1.4375 -0.375 -v -0.0625 1.4375 -0.25 -vt 0.40625 0.96875 -vt 0.4375 0.96875 -vt 0.4375 0.90625 -vt 0.40625 0.90625 -vt 0.375 0.96875 -vt 0.40625 0.96875 -vt 0.40625 0.90625 -vt 0.375 0.90625 -vt 0.46875 0.96875 -vt 0.5 0.96875 -vt 0.5 0.90625 -vt 0.46875 0.90625 -vt 0.4375 0.96875 -vt 0.46875 0.96875 -vt 0.46875 0.90625 -vt 0.4375 0.90625 -vt 0.4375 0.96875 -vt 0.40625 0.96875 -vt 0.40625 1 -vt 0.4375 1 -vt 0.46875 1 -vt 0.4375 1 -vt 0.4375 0.96875 -vt 0.46875 0.96875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_0e7f3cc8-7af8-21a7-d2f3-04bee5fb4aae -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o LeftLeg -v 0 0.75 0.125 -v 0 0.75 -0.125 -v 0 0 0.125 -v 0 0 -0.125 -v -0.25 0.75 -0.125 -v -0.25 0.75 0.125 -v -0.25 0 -0.125 -v -0.25 0 0.125 -vt 0.0625 0.59375 -vt 0.125 0.59375 -vt 0.125 0.40625 -vt 0.0625 0.40625 -vt 0 0.59375 -vt 0.0625 0.59375 -vt 0.0625 0.40625 -vt 0 0.40625 -vt 0.1875 0.59375 -vt 0.25 0.59375 -vt 0.25 0.40625 -vt 0.1875 0.40625 -vt 0.125 0.59375 -vt 0.1875 0.59375 -vt 0.1875 0.40625 -vt 0.125 0.40625 -vt 0.125 0.59375 -vt 0.0625 0.59375 -vt 0.0625 0.65625 -vt 0.125 0.65625 -vt 0.1875 0.65625 -vt 0.125 0.65625 -vt 0.125 0.59375 -vt 0.1875 0.59375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_0e7f3cc8-7af8-21a7-d2f3-04bee5fb4aae -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o RightLeg -v 0.25 0.75 0.125 -v 0.25 0.75 -0.125 -v 0.25 0 0.125 -v 0.25 0 -0.125 -v 0 0.75 -0.125 -v 0 0.75 0.125 -v 0 0 -0.125 -v 0 0 0.125 -vt 0.125 0.59375 -vt 0.0625 0.59375 -vt 0.0625 0.40625 -vt 0.125 0.40625 -vt 0.1875 0.59375 -vt 0.125 0.59375 -vt 0.125 0.40625 -vt 0.1875 0.40625 -vt 0.25 0.59375 -vt 0.1875 0.59375 -vt 0.1875 0.40625 -vt 0.25 0.40625 -vt 0.0625 0.59375 -vt 0 0.59375 -vt 0 0.40625 -vt 0.0625 0.40625 -vt 0.0625 0.59375 -vt 0.125 0.59375 -vt 0.125 0.65625 -vt 0.0625 0.65625 -vt 0.125 0.65625 -vt 0.1875 0.65625 -vt 0.1875 0.59375 -vt 0.125 0.59375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_0e7f3cc8-7af8-21a7-d2f3-04bee5fb4aae -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o RightArm -v 0.5 1.5 0.125 -v 0.5 1.5 -0.125 -v 0.5 0.75 0.125 -v 0.5 0.75 -0.125 -v 0.25 1.5 -0.125 -v 0.25 1.5 0.125 -v 0.25 0.75 -0.125 -v 0.25 0.75 0.125 -vt 0.6875 0.21875 -vt 0.75 0.21875 -vt 0.75 0.03125 -vt 0.6875 0.03125 -vt 0.625 0.21875 -vt 0.6875 0.21875 -vt 0.6875 0.03125 -vt 0.625 0.03125 -vt 0.8125 0.21875 -vt 0.875 0.21875 -vt 0.875 0.03125 -vt 0.8125 0.03125 -vt 0.75 0.21875 -vt 0.8125 0.21875 -vt 0.8125 0.03125 -vt 0.75 0.03125 -vt 0.75 0.21875 -vt 0.6875 0.21875 -vt 0.6875 0.28125 -vt 0.75 0.28125 -vt 0.8125 0.28125 -vt 0.75 0.28125 -vt 0.75 0.21875 -vt 0.8125 0.21875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_0e7f3cc8-7af8-21a7-d2f3-04bee5fb4aae -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o LeftArm -v -0.25 1.5 0.125 -v -0.25 1.5 -0.125 -v -0.25 0.75 0.125 -v -0.25 0.75 -0.125 -v -0.5 1.5 -0.125 -v -0.5 1.5 0.125 -v -0.5 0.75 -0.125 -v -0.5 0.75 0.125 -vt 0.75 0.21875 -vt 0.6875 0.21875 -vt 0.6875 0.03125 -vt 0.75 0.03125 -vt 0.8125 0.21875 -vt 0.75 0.21875 -vt 0.75 0.03125 -vt 0.8125 0.03125 -vt 0.875 0.21875 -vt 0.8125 0.21875 -vt 0.8125 0.03125 -vt 0.875 0.03125 -vt 0.6875 0.21875 -vt 0.625 0.21875 -vt 0.625 0.03125 -vt 0.6875 0.03125 -vt 0.6875 0.21875 -vt 0.75 0.21875 -vt 0.75 0.28125 -vt 0.6875 0.28125 -vt 0.75 0.28125 -vt 0.8125 0.28125 -vt 0.8125 0.21875 -vt 0.75 0.21875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_0e7f3cc8-7af8-21a7-d2f3-04bee5fb4aae -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/rabbit.obj b/renderer/viewer/three/entity/models/rabbit.obj deleted file mode 100644 index 545c4b5d..00000000 --- a/renderer/viewer/three/entity/models/rabbit.obj +++ /dev/null @@ -1,555 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o rearFootLeft -v -0.125 0.0625 0.4375 -v -0.125 0.0625 0 -v -0.125 0 0.4375 -v -0.125 0 0 -v -0.25 0.0625 0 -v -0.25 0.0625 0.4375 -v -0.25 0 0 -v -0.25 0 0.4375 -vt 0.265625 0.03125 -vt 0.234375 0.03125 -vt 0.234375 0 -vt 0.265625 0 -vt 0.375 0.03125 -vt 0.265625 0.03125 -vt 0.265625 0 -vt 0.375 0 -vt 0.40625 0.03125 -vt 0.375 0.03125 -vt 0.375 0 -vt 0.40625 0 -vt 0.234375 0.03125 -vt 0.125 0.03125 -vt 0.125 0 -vt 0.234375 0 -vt 0.234375 0.03125 -vt 0.265625 0.03125 -vt 0.265625 0.25 -vt 0.234375 0.25 -vt 0.265625 0.25 -vt 0.296875 0.25 -vt 0.296875 0.03125 -vt 0.265625 0.03125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o rearFootRight -v 0.25 0.0625 0.4375 -v 0.25 0.0625 0 -v 0.25 0 0.4375 -v 0.25 0 0 -v 0.125 0.0625 0 -v 0.125 0.0625 0.4375 -v 0.125 0 0 -v 0.125 0 0.4375 -vt 0.546875 0.03125 -vt 0.515625 0.03125 -vt 0.515625 0 -vt 0.546875 0 -vt 0.65625 0.03125 -vt 0.546875 0.03125 -vt 0.546875 0 -vt 0.65625 0 -vt 0.6875 0.03125 -vt 0.65625 0.03125 -vt 0.65625 0 -vt 0.6875 0 -vt 0.515625 0.03125 -vt 0.40625 0.03125 -vt 0.40625 0 -vt 0.515625 0 -vt 0.515625 0.03125 -vt 0.546875 0.03125 -vt 0.546875 0.25 -vt 0.515625 0.25 -vt 0.546875 0.25 -vt 0.578125 0.25 -vt 0.578125 0.03125 -vt 0.546875 0.03125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o haunchLeft -v -0.125 0.29936870521072856 0.5249039439955965 -v -0.125 0.40625 0.23124999999999996 -v -0.125 0.06444555001425145 0.43939890816417915 -v -0.125 0.1713268448035229 0.14574496416858285 -v -0.25 0.40625 0.23124999999999996 -v -0.25 0.29936870521072856 0.5249039439955965 -v -0.25 0.1713268448035229 0.14574496416858285 -v -0.25 0.06444555001425145 0.43939890816417915 -vt 0.359375 0.375 -vt 0.328125 0.375 -vt 0.328125 0.25 -vt 0.359375 0.25 -vt 0.4375 0.375 -vt 0.359375 0.375 -vt 0.359375 0.25 -vt 0.4375 0.25 -vt 0.46875 0.375 -vt 0.4375 0.375 -vt 0.4375 0.25 -vt 0.46875 0.25 -vt 0.328125 0.375 -vt 0.25 0.375 -vt 0.25 0.25 -vt 0.328125 0.25 -vt 0.328125 0.375 -vt 0.359375 0.375 -vt 0.359375 0.53125 -vt 0.328125 0.53125 -vt 0.359375 0.53125 -vt 0.390625 0.53125 -vt 0.390625 0.375 -vt 0.359375 0.375 -vn 0 0.34202014332566866 -0.9396926207859084 -vn 1 0 0 -vn 0 -0.34202014332566866 0.9396926207859084 -vn -1 0 0 -vn 0 0.9396926207859084 0.34202014332566866 -vn 0 -0.9396926207859084 -0.34202014332566866 -usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o haunchRight -v 0.25 0.29936870521072856 0.5249039439955965 -v 0.25 0.40625 0.23124999999999996 -v 0.25 0.06444555001425145 0.43939890816417915 -v 0.25 0.1713268448035229 0.14574496416858285 -v 0.125 0.40625 0.23124999999999996 -v 0.125 0.29936870521072856 0.5249039439955965 -v 0.125 0.1713268448035229 0.14574496416858285 -v 0.125 0.06444555001425145 0.43939890816417915 -vt 0.578125 0.375 -vt 0.546875 0.375 -vt 0.546875 0.25 -vt 0.578125 0.25 -vt 0.65625 0.375 -vt 0.578125 0.375 -vt 0.578125 0.25 -vt 0.65625 0.25 -vt 0.6875 0.375 -vt 0.65625 0.375 -vt 0.65625 0.25 -vt 0.6875 0.25 -vt 0.546875 0.375 -vt 0.46875 0.375 -vt 0.46875 0.25 -vt 0.546875 0.25 -vt 0.546875 0.375 -vt 0.578125 0.375 -vt 0.578125 0.53125 -vt 0.546875 0.53125 -vt 0.578125 0.53125 -vt 0.609375 0.53125 -vt 0.609375 0.375 -vt 0.578125 0.375 -vn 0 0.34202014332566866 -0.9396926207859084 -vn 1 0 0 -vn 0 -0.34202014332566866 0.9396926207859084 -vn -1 0 0 -vn 0 0.9396926207859084 0.34202014332566866 -vn 0 -0.9396926207859084 -0.34202014332566866 -usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o body -v 0.1875 0.4299615775982385 0.5427525179157087 -v 0.1875 0.6437241671767815 -0.04455537007548416 -v 0.1875 0.1363076336026421 0.4358712231264371 -v 0.1875 0.3500702231811851 -0.1514366648647556 -v -0.1875 0.6437241671767815 -0.04455537007548416 -v -0.1875 0.4299615775982385 0.5427525179157087 -v -0.1875 0.3500702231811851 -0.1514366648647556 -v -0.1875 0.1363076336026421 0.4358712231264371 -vt 0.25 0.6875 -vt 0.15625 0.6875 -vt 0.15625 0.53125 -vt 0.25 0.53125 -vt 0.40625 0.6875 -vt 0.25 0.6875 -vt 0.25 0.53125 -vt 0.40625 0.53125 -vt 0.5 0.6875 -vt 0.40625 0.6875 -vt 0.40625 0.53125 -vt 0.5 0.53125 -vt 0.15625 0.6875 -vt 0 0.6875 -vt 0 0.53125 -vt 0.15625 0.53125 -vt 0.15625 0.6875 -vt 0.25 0.6875 -vt 0.25 1 -vt 0.15625 1 -vt 0.25 1 -vt 0.34375 1 -vt 0.34375 0.6875 -vt 0.25 0.6875 -vn 0 0.34202014332566866 -0.9396926207859084 -vn 1 0 0 -vn 0 -0.34202014332566866 0.9396926207859084 -vn -1 0 0 -vn 0 0.9396926207859084 0.34202014332566866 -vn 0 -0.9396926207859084 -0.34202014332566866 -usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o frontLegLeft -v -0.125 0.42664698889581687 -0.0009495154367369918 -v -0.125 0.44835301110418313 -0.12405048456326301 -v -0.125 -0.004206403047024132 -0.07692059316601901 -v -0.125 0.017499619161342128 -0.20002156229254503 -v -0.25 0.44835301110418313 -0.12405048456326301 -v -0.25 0.42664698889581687 -0.0009495154367369918 -v -0.25 0.017499619161342128 -0.20002156229254503 -v -0.25 -0.004206403047024132 -0.07692059316601901 -vt 0.1875 0.46875 -vt 0.15625 0.46875 -vt 0.15625 0.25 -vt 0.1875 0.25 -vt 0.21875 0.46875 -vt 0.1875 0.46875 -vt 0.1875 0.25 -vt 0.21875 0.25 -vt 0.25 0.46875 -vt 0.21875 0.46875 -vt 0.21875 0.25 -vt 0.25 0.25 -vt 0.15625 0.46875 -vt 0.125 0.46875 -vt 0.125 0.25 -vt 0.15625 0.25 -vt 0.15625 0.46875 -vt 0.1875 0.46875 -vt 0.1875 0.53125 -vt 0.15625 0.53125 -vt 0.1875 0.53125 -vt 0.21875 0.53125 -vt 0.21875 0.46875 -vt 0.1875 0.46875 -vn 0 0.17364817766693033 -0.984807753012208 -vn 1 0 0 -vn 0 -0.17364817766693033 0.984807753012208 -vn -1 0 0 -vn 0 0.984807753012208 0.17364817766693033 -vn 0 -0.984807753012208 -0.17364817766693033 -usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o frontLegRight -v 0.25 0.42664698889581687 -0.0009495154367369918 -v 0.25 0.44835301110418313 -0.12405048456326301 -v 0.25 -0.004206403047024132 -0.07692059316601901 -v 0.25 0.017499619161342128 -0.20002156229254503 -v 0.125 0.44835301110418313 -0.12405048456326301 -v 0.125 0.42664698889581687 -0.0009495154367369918 -v 0.125 0.017499619161342128 -0.20002156229254503 -v 0.125 -0.004206403047024132 -0.07692059316601901 -vt 0.0625 0.46875 -vt 0.03125 0.46875 -vt 0.03125 0.25 -vt 0.0625 0.25 -vt 0.09375 0.46875 -vt 0.0625 0.46875 -vt 0.0625 0.25 -vt 0.09375 0.25 -vt 0.125 0.46875 -vt 0.09375 0.46875 -vt 0.09375 0.25 -vt 0.125 0.25 -vt 0.03125 0.46875 -vt 0 0.46875 -vt 0 0.25 -vt 0.03125 0.25 -vt 0.03125 0.46875 -vt 0.0625 0.46875 -vt 0.0625 0.53125 -vt 0.03125 0.53125 -vt 0.0625 0.53125 -vt 0.09375 0.53125 -vt 0.09375 0.46875 -vt 0.0625 0.46875 -vn 0 0.17364817766693033 -0.984807753012208 -vn 1 0 0 -vn 0 -0.17364817766693033 0.984807753012208 -vn -1 0 0 -vn 0 0.984807753012208 0.17364817766693033 -vn 0 -0.984807753012208 -0.17364817766693033 -usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o head -v 0.15625 0.75 -0.0625 -v 0.15625 0.75 -0.375 -v 0.15625 0.5 -0.0625 -v 0.15625 0.5 -0.375 -v -0.15625 0.75 -0.375 -v -0.15625 0.75 -0.0625 -v -0.15625 0.5 -0.375 -v -0.15625 0.5 -0.0625 -vt 0.65625 0.84375 -vt 0.578125 0.84375 -vt 0.578125 0.71875 -vt 0.65625 0.71875 -vt 0.734375 0.84375 -vt 0.65625 0.84375 -vt 0.65625 0.71875 -vt 0.734375 0.71875 -vt 0.8125 0.84375 -vt 0.734375 0.84375 -vt 0.734375 0.71875 -vt 0.8125 0.71875 -vt 0.578125 0.84375 -vt 0.5 0.84375 -vt 0.5 0.71875 -vt 0.578125 0.71875 -vt 0.578125 0.84375 -vt 0.65625 0.84375 -vt 0.65625 1 -vt 0.578125 1 -vt 0.65625 1 -vt 0.734375 1 -vt 0.734375 0.84375 -vt 0.65625 0.84375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o earRight -v 0.1509259103576669 1.0625 -0.10294047579726884 -v 0.1347497200387594 1.0625 -0.16331083994033568 -v 0.1509259103576669 0.75 -0.10294047579726884 -v 0.1347497200387594 0.75 -0.16331083994033568 -v 0.014008991752625821 1.0625 -0.1309584593025206 -v 0.030185182071533423 1.0625 -0.07058809515945375 -v 0.014008991752625821 0.75 -0.1309584593025206 -v 0.030185182071533423 0.75 -0.07058809515945375 -vt 0.953125 0.96875 -vt 0.921875 0.96875 -vt 0.921875 0.8125 -vt 0.953125 0.8125 -vt 0.96875 0.96875 -vt 0.953125 0.96875 -vt 0.953125 0.8125 -vt 0.96875 0.8125 -vt 1 0.96875 -vt 0.96875 0.96875 -vt 0.96875 0.8125 -vt 1 0.8125 -vt 0.921875 0.96875 -vt 0.90625 0.96875 -vt 0.90625 0.8125 -vt 0.921875 0.8125 -vt 0.921875 0.96875 -vt 0.953125 0.96875 -vt 0.953125 1 -vt 0.921875 1 -vt 0.953125 1 -vt 0.984375 1 -vt 0.984375 0.96875 -vt 0.953125 0.96875 -vn -0.25881904510252074 0 -0.9659258262890683 -vn 0.9659258262890683 0 -0.25881904510252074 -vn 0.25881904510252074 0 0.9659258262890683 -vn -0.9659258262890683 0 0.25881904510252074 -vn 0 1 0 -vn 0 -1 0 -usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o earLeft -v -0.030185182071533367 1.0625 -0.07058809515945375 -v -0.014008991752625821 1.0625 -0.1309584593025206 -v -0.030185182071533367 0.75 -0.07058809515945375 -v -0.014008991752625821 0.75 -0.1309584593025206 -v -0.1347497200387594 1.0625 -0.16331083994033568 -v -0.1509259103576669 1.0625 -0.10294047579726884 -v -0.1347497200387594 0.75 -0.16331083994033568 -v -0.1509259103576669 0.75 -0.10294047579726884 -vt 0.859375 0.96875 -vt 0.828125 0.96875 -vt 0.828125 0.8125 -vt 0.859375 0.8125 -vt 0.875 0.96875 -vt 0.859375 0.96875 -vt 0.859375 0.8125 -vt 0.875 0.8125 -vt 0.90625 0.96875 -vt 0.875 0.96875 -vt 0.875 0.8125 -vt 0.90625 0.8125 -vt 0.828125 0.96875 -vt 0.8125 0.96875 -vt 0.8125 0.8125 -vt 0.828125 0.8125 -vt 0.828125 0.96875 -vt 0.859375 0.96875 -vt 0.859375 1 -vt 0.828125 1 -vt 0.859375 1 -vt 0.890625 1 -vt 0.890625 0.96875 -vt 0.859375 0.96875 -vn 0.25881904510252074 0 -0.9659258262890683 -vn 0.9659258262890683 0 0.25881904510252074 -vn -0.25881904510252074 0 0.9659258262890683 -vn -0.9659258262890683 0 -0.25881904510252074 -vn 0 1 0 -vn 0 -1 0 -usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o tail -v 0.09375 0.2953436652829704 0.5870259660350201 -v 0.09375 0.33809618319867885 0.4695643884367815 -v 0.09375 0.11915129888561249 0.5228971891614571 -v 0.09375 0.16190381680132115 0.4054356115632185 -v -0.09375 0.33809618319867885 0.4695643884367815 -v -0.09375 0.2953436652829704 0.5870259660350201 -v -0.09375 0.16190381680132115 0.4054356115632185 -v -0.09375 0.11915129888561249 0.5228971891614571 -vt 0.890625 0.75 -vt 0.84375 0.75 -vt 0.84375 0.65625 -vt 0.890625 0.65625 -vt 0.921875 0.75 -vt 0.890625 0.75 -vt 0.890625 0.65625 -vt 0.921875 0.65625 -vt 0.96875 0.75 -vt 0.921875 0.75 -vt 0.921875 0.65625 -vt 0.96875 0.65625 -vt 0.84375 0.75 -vt 0.8125 0.75 -vt 0.8125 0.65625 -vt 0.84375 0.65625 -vt 0.84375 0.75 -vt 0.890625 0.75 -vt 0.890625 0.8125 -vt 0.84375 0.8125 -vt 0.890625 0.8125 -vt 0.9375 0.8125 -vt 0.9375 0.75 -vt 0.890625 0.75 -vn 0 0.34202014332566866 -0.9396926207859084 -vn 1 0 0 -vn 0 -0.34202014332566866 0.9396926207859084 -vn -1 0 0 -vn 0 0.9396926207859084 0.34202014332566866 -vn 0 -0.9396926207859084 -0.34202014332566866 -usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 -o nose -v 0.03125 0.65625 -0.34375 -v 0.03125 0.65625 -0.40625 -v 0.03125 0.59375 -0.34375 -v 0.03125 0.59375 -0.40625 -v -0.03125 0.65625 -0.40625 -v -0.03125 0.65625 -0.34375 -v -0.03125 0.59375 -0.40625 -v -0.03125 0.59375 -0.34375 -vt 0.53125 0.6875 -vt 0.515625 0.6875 -vt 0.515625 0.65625 -vt 0.53125 0.65625 -vt 0.546875 0.6875 -vt 0.53125 0.6875 -vt 0.53125 0.65625 -vt 0.546875 0.65625 -vt 0.5625 0.6875 -vt 0.546875 0.6875 -vt 0.546875 0.65625 -vt 0.5625 0.65625 -vt 0.515625 0.6875 -vt 0.5 0.6875 -vt 0.5 0.65625 -vt 0.515625 0.65625 -vt 0.515625 0.6875 -vt 0.53125 0.6875 -vt 0.53125 0.71875 -vt 0.515625 0.71875 -vt 0.53125 0.71875 -vt 0.546875 0.71875 -vt 0.546875 0.6875 -vt 0.53125 0.6875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_a200089f-c989-c3f8-c313-2c45240e78d7 -f 92/268/67 95/267/67 93/266/67 90/265/67 -f 91/272/68 92/271/68 90/270/68 89/269/68 -f 96/276/69 91/275/69 89/274/69 94/273/69 -f 95/280/70 96/279/70 94/278/70 93/277/70 -f 94/284/71 89/283/71 90/282/71 93/281/71 -f 95/288/72 92/287/72 91/286/72 96/285/72 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/sheep.obj b/renderer/viewer/three/entity/models/sheep.obj deleted file mode 100644 index 66a2175f..00000000 --- a/renderer/viewer/three/entity/models/sheep.obj +++ /dev/null @@ -1,555 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o body -v 0.25 1.1250000000000002 -0.5 -v 0.25 0.7500000000000002 -0.5 -v 0.25 1.125 0.5 -v 0.25 0.75 0.4999999999999999 -v -0.25 0.7500000000000002 -0.5 -v -0.25 1.1250000000000002 -0.5 -v -0.25 0.75 0.4999999999999999 -v -0.25 1.125 0.5 -vt 0.53125 0.78125 -vt 0.65625 0.78125 -vt 0.65625 0.53125 -vt 0.53125 0.53125 -vt 0.4375 0.78125 -vt 0.53125 0.78125 -vt 0.53125 0.53125 -vt 0.4375 0.53125 -vt 0.75 0.78125 -vt 0.875 0.78125 -vt 0.875 0.53125 -vt 0.75 0.53125 -vt 0.65625 0.78125 -vt 0.75 0.78125 -vt 0.75 0.53125 -vt 0.65625 0.53125 -vt 0.65625 0.78125 -vt 0.53125 0.78125 -vt 0.53125 0.875 -vt 0.65625 0.875 -vt 0.78125 0.875 -vt 0.65625 0.875 -vt 0.65625 0.78125 -vt 0.78125 0.78125 -vn 0 -1 -2.220446049250313e-16 -vn 1 0 0 -vn 0 1 2.220446049250313e-16 -vn -1 0 0 -vn 0 2.220446049250313e-16 -1 -vn 0 -2.220446049250313e-16 1 -usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o body -v 0.359375 1.2343750000000002 -0.609375 -v 0.359375 0.6406250000000002 -0.609375 -v 0.359375 1.234375 0.609375 -v 0.359375 0.640625 0.609375 -v -0.359375 0.6406250000000002 -0.609375 -v -0.359375 1.2343750000000002 -0.609375 -v -0.359375 0.640625 0.609375 -v -0.359375 1.234375 0.609375 -vt 0.53125 0.28125 -vt 0.65625 0.28125 -vt 0.65625 0.03125 -vt 0.53125 0.03125 -vt 0.4375 0.28125 -vt 0.53125 0.28125 -vt 0.53125 0.03125 -vt 0.4375 0.03125 -vt 0.75 0.28125 -vt 0.875 0.28125 -vt 0.875 0.03125 -vt 0.75 0.03125 -vt 0.65625 0.28125 -vt 0.75 0.28125 -vt 0.75 0.03125 -vt 0.65625 0.03125 -vt 0.65625 0.28125 -vt 0.53125 0.28125 -vt 0.53125 0.375 -vt 0.65625 0.375 -vt 0.78125 0.375 -vt 0.65625 0.375 -vt 0.65625 0.28125 -vt 0.78125 0.28125 -vn 0 -1 -2.220446049250313e-16 -vn 1 0 0 -vn 0 1 2.220446049250313e-16 -vn -1 0 0 -vn 0 2.220446049250313e-16 -1 -vn 0 -2.220446049250313e-16 1 -usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o head -v 0.1875 1.375 -0.375 -v 0.1875 1.375 -0.875 -v 0.1875 1 -0.375 -v 0.1875 1 -0.875 -v -0.1875 1.375 -0.875 -v -0.1875 1.375 -0.375 -v -0.1875 1 -0.875 -v -0.1875 1 -0.375 -vt 0.125 0.875 -vt 0.21875 0.875 -vt 0.21875 0.78125 -vt 0.125 0.78125 -vt 0 0.875 -vt 0.125 0.875 -vt 0.125 0.78125 -vt 0 0.78125 -vt 0.34375 0.875 -vt 0.4375 0.875 -vt 0.4375 0.78125 -vt 0.34375 0.78125 -vt 0.21875 0.875 -vt 0.34375 0.875 -vt 0.34375 0.78125 -vt 0.21875 0.78125 -vt 0.21875 0.875 -vt 0.125 0.875 -vt 0.125 1 -vt 0.21875 1 -vt 0.3125 1 -vt 0.21875 1 -vt 0.21875 0.875 -vt 0.3125 0.875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o head -v 0.22499999999999998 1.4125 -0.3375 -v 0.22499999999999998 1.4125 -0.7875 -v 0.22499999999999998 0.9624999999999999 -0.3375 -v 0.22499999999999998 0.9624999999999999 -0.7875 -v -0.22499999999999998 1.4125 -0.7875 -v -0.22499999999999998 1.4125 -0.3375 -v -0.22499999999999998 0.9624999999999999 -0.7875 -v -0.22499999999999998 0.9624999999999999 -0.3375 -vt 0.09375 0.40625 -vt 0.1875 0.40625 -vt 0.1875 0.3125 -vt 0.09375 0.3125 -vt 0 0.40625 -vt 0.09375 0.40625 -vt 0.09375 0.3125 -vt 0 0.3125 -vt 0.28125 0.40625 -vt 0.375 0.40625 -vt 0.375 0.3125 -vt 0.28125 0.3125 -vt 0.1875 0.40625 -vt 0.28125 0.40625 -vt 0.28125 0.3125 -vt 0.1875 0.3125 -vt 0.1875 0.40625 -vt 0.09375 0.40625 -vt 0.09375 0.5 -vt 0.1875 0.5 -vt 0.28125 0.5 -vt 0.1875 0.5 -vt 0.1875 0.40625 -vt 0.28125 0.40625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o leg0 -v 0.3125 0.75 0.5625 -v 0.3125 0.75 0.3125 -v 0.3125 0 0.5625 -v 0.3125 0 0.3125 -v 0.0625 0.75 0.3125 -v 0.0625 0.75 0.5625 -v 0.0625 0 0.3125 -v 0.0625 0 0.5625 -vt 0.0625 0.6875 -vt 0.125 0.6875 -vt 0.125 0.5 -vt 0.0625 0.5 -vt 0 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.5 -vt 0 0.5 -vt 0.1875 0.6875 -vt 0.25 0.6875 -vt 0.25 0.5 -vt 0.1875 0.5 -vt 0.125 0.6875 -vt 0.1875 0.6875 -vt 0.1875 0.5 -vt 0.125 0.5 -vt 0.125 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.75 -vt 0.125 0.75 -vt 0.1875 0.75 -vt 0.125 0.75 -vt 0.125 0.6875 -vt 0.1875 0.6875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o leg0 -v 0.34375 0.78125 0.59375 -v 0.34375 0.78125 0.28125 -v 0.34375 0.34375 0.59375 -v 0.34375 0.34375 0.28125 -v 0.03125 0.78125 0.28125 -v 0.03125 0.78125 0.59375 -v 0.03125 0.34375 0.28125 -v 0.03125 0.34375 0.59375 -vt 0.0625 0.1875 -vt 0.125 0.1875 -vt 0.125 0.09375 -vt 0.0625 0.09375 -vt 0 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.09375 -vt 0 0.09375 -vt 0.1875 0.1875 -vt 0.25 0.1875 -vt 0.25 0.09375 -vt 0.1875 0.09375 -vt 0.125 0.1875 -vt 0.1875 0.1875 -vt 0.1875 0.09375 -vt 0.125 0.09375 -vt 0.125 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.25 -vt 0.125 0.25 -vt 0.1875 0.25 -vt 0.125 0.25 -vt 0.125 0.1875 -vt 0.1875 0.1875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o leg1 -v -0.0625 0.75 0.5625 -v -0.0625 0.75 0.3125 -v -0.0625 0 0.5625 -v -0.0625 0 0.3125 -v -0.3125 0.75 0.3125 -v -0.3125 0.75 0.5625 -v -0.3125 0 0.3125 -v -0.3125 0 0.5625 -vt 0.0625 0.6875 -vt 0.125 0.6875 -vt 0.125 0.5 -vt 0.0625 0.5 -vt 0 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.5 -vt 0 0.5 -vt 0.1875 0.6875 -vt 0.25 0.6875 -vt 0.25 0.5 -vt 0.1875 0.5 -vt 0.125 0.6875 -vt 0.1875 0.6875 -vt 0.1875 0.5 -vt 0.125 0.5 -vt 0.125 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.75 -vt 0.125 0.75 -vt 0.1875 0.75 -vt 0.125 0.75 -vt 0.125 0.6875 -vt 0.1875 0.6875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o leg1 -v -0.03125 0.78125 0.59375 -v -0.03125 0.78125 0.28125 -v -0.03125 0.34375 0.59375 -v -0.03125 0.34375 0.28125 -v -0.34375 0.78125 0.28125 -v -0.34375 0.78125 0.59375 -v -0.34375 0.34375 0.28125 -v -0.34375 0.34375 0.59375 -vt 0.0625 0.1875 -vt 0.125 0.1875 -vt 0.125 0.09375 -vt 0.0625 0.09375 -vt 0 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.09375 -vt 0 0.09375 -vt 0.1875 0.1875 -vt 0.25 0.1875 -vt 0.25 0.09375 -vt 0.1875 0.09375 -vt 0.125 0.1875 -vt 0.1875 0.1875 -vt 0.1875 0.09375 -vt 0.125 0.09375 -vt 0.125 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.25 -vt 0.125 0.25 -vt 0.1875 0.25 -vt 0.125 0.25 -vt 0.125 0.1875 -vt 0.1875 0.1875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o leg2 -v 0.3125 0.75 -0.1875 -v 0.3125 0.75 -0.4375 -v 0.3125 0 -0.1875 -v 0.3125 0 -0.4375 -v 0.0625 0.75 -0.4375 -v 0.0625 0.75 -0.1875 -v 0.0625 0 -0.4375 -v 0.0625 0 -0.1875 -vt 0.0625 0.6875 -vt 0.125 0.6875 -vt 0.125 0.5 -vt 0.0625 0.5 -vt 0 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.5 -vt 0 0.5 -vt 0.1875 0.6875 -vt 0.25 0.6875 -vt 0.25 0.5 -vt 0.1875 0.5 -vt 0.125 0.6875 -vt 0.1875 0.6875 -vt 0.1875 0.5 -vt 0.125 0.5 -vt 0.125 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.75 -vt 0.125 0.75 -vt 0.1875 0.75 -vt 0.125 0.75 -vt 0.125 0.6875 -vt 0.1875 0.6875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o leg2 -v 0.34375 0.78125 -0.15625 -v 0.34375 0.78125 -0.46875 -v 0.34375 0.34375 -0.15625 -v 0.34375 0.34375 -0.46875 -v 0.03125 0.78125 -0.46875 -v 0.03125 0.78125 -0.15625 -v 0.03125 0.34375 -0.46875 -v 0.03125 0.34375 -0.15625 -vt 0.0625 0.1875 -vt 0.125 0.1875 -vt 0.125 0.09375 -vt 0.0625 0.09375 -vt 0 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.09375 -vt 0 0.09375 -vt 0.1875 0.1875 -vt 0.25 0.1875 -vt 0.25 0.09375 -vt 0.1875 0.09375 -vt 0.125 0.1875 -vt 0.1875 0.1875 -vt 0.1875 0.09375 -vt 0.125 0.09375 -vt 0.125 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.25 -vt 0.125 0.25 -vt 0.1875 0.25 -vt 0.125 0.25 -vt 0.125 0.1875 -vt 0.1875 0.1875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o leg3 -v -0.0625 0.75 -0.1875 -v -0.0625 0.75 -0.4375 -v -0.0625 0 -0.1875 -v -0.0625 0 -0.4375 -v -0.3125 0.75 -0.4375 -v -0.3125 0.75 -0.1875 -v -0.3125 0 -0.4375 -v -0.3125 0 -0.1875 -vt 0.0625 0.6875 -vt 0.125 0.6875 -vt 0.125 0.5 -vt 0.0625 0.5 -vt 0 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.5 -vt 0 0.5 -vt 0.1875 0.6875 -vt 0.25 0.6875 -vt 0.25 0.5 -vt 0.1875 0.5 -vt 0.125 0.6875 -vt 0.1875 0.6875 -vt 0.1875 0.5 -vt 0.125 0.5 -vt 0.125 0.6875 -vt 0.0625 0.6875 -vt 0.0625 0.75 -vt 0.125 0.75 -vt 0.1875 0.75 -vt 0.125 0.75 -vt 0.125 0.6875 -vt 0.1875 0.6875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 -o leg3 -v -0.03125 0.78125 -0.15625 -v -0.03125 0.78125 -0.46875 -v -0.03125 0.34375 -0.15625 -v -0.03125 0.34375 -0.46875 -v -0.34375 0.78125 -0.46875 -v -0.34375 0.78125 -0.15625 -v -0.34375 0.34375 -0.46875 -v -0.34375 0.34375 -0.15625 -vt 0.0625 0.1875 -vt 0.125 0.1875 -vt 0.125 0.09375 -vt 0.0625 0.09375 -vt 0 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.09375 -vt 0 0.09375 -vt 0.1875 0.1875 -vt 0.25 0.1875 -vt 0.25 0.09375 -vt 0.1875 0.09375 -vt 0.125 0.1875 -vt 0.1875 0.1875 -vt 0.1875 0.09375 -vt 0.125 0.09375 -vt 0.125 0.1875 -vt 0.0625 0.1875 -vt 0.0625 0.25 -vt 0.125 0.25 -vt 0.1875 0.25 -vt 0.125 0.25 -vt 0.125 0.1875 -vt 0.1875 0.1875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_801e22d5-c057-fde3-2edb-c11e082736eb -f 92/268/67 95/267/67 93/266/67 90/265/67 -f 91/272/68 92/271/68 90/270/68 89/269/68 -f 96/276/69 91/275/69 89/274/69 94/273/69 -f 95/280/70 96/279/70 94/278/70 93/277/70 -f 94/284/71 89/283/71 90/282/71 93/281/71 -f 95/288/72 92/287/72 91/286/72 96/285/72 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/shulker.obj b/renderer/viewer/three/entity/models/shulker.obj deleted file mode 100644 index 0287fddb..00000000 --- a/renderer/viewer/three/entity/models/shulker.obj +++ /dev/null @@ -1,141 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o base -v 0.5 0.5 0.5 -v 0.5 0.5 -0.5 -v 0.5 0 0.5 -v 0.5 0 -0.5 -v -0.5 0.5 -0.5 -v -0.5 0.5 0.5 -v -0.5 0 -0.5 -v -0.5 0 0.5 -vt 0.25 0.3125 -vt 0.5 0.3125 -vt 0.5 0.1875 -vt 0.25 0.1875 -vt 0 0.3125 -vt 0.25 0.3125 -vt 0.25 0.1875 -vt 0 0.1875 -vt 0.75 0.3125 -vt 1 0.3125 -vt 1 0.1875 -vt 0.75 0.1875 -vt 0.5 0.3125 -vt 0.75 0.3125 -vt 0.75 0.1875 -vt 0.5 0.1875 -vt 0.5 0.3125 -vt 0.25 0.3125 -vt 0.25 0.5625 -vt 0.5 0.5625 -vt 0.75 0.5625 -vt 0.5 0.5625 -vt 0.5 0.3125 -vt 0.75 0.3125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_1c25eeea-87e5-6114-747e-b8cdb1a56a09 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o lid -v 0.5 1.5625 0.5 -v 0.5 1.5625 -0.5 -v 0.5 0.8125 0.5 -v 0.5 0.8125 -0.5 -v -0.5 1.5625 -0.5 -v -0.5 1.5625 0.5 -v -0.5 0.8125 -0.5 -v -0.5 0.8125 0.5 -vt 0.25 0.75 -vt 0.5 0.75 -vt 0.5 0.5625 -vt 0.25 0.5625 -vt 0 0.75 -vt 0.25 0.75 -vt 0.25 0.5625 -vt 0 0.5625 -vt 0.75 0.75 -vt 1 0.75 -vt 1 0.5625 -vt 0.75 0.5625 -vt 0.5 0.75 -vt 0.75 0.75 -vt 0.75 0.5625 -vt 0.5 0.5625 -vt 0.5 0.75 -vt 0.25 0.75 -vt 0.25 1 -vt 0.5 1 -vt 0.75 1 -vt 0.5 1 -vt 0.5 0.75 -vt 0.75 0.75 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_1c25eeea-87e5-6114-747e-b8cdb1a56a09 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o head -v 0.1875 0.75 0.1875 -v 0.1875 0.75 -0.1875 -v 0.1875 0.375 0.1875 -v 0.1875 0.375 -0.1875 -v -0.1875 0.75 -0.1875 -v -0.1875 0.75 0.1875 -v -0.1875 0.375 -0.1875 -v -0.1875 0.375 0.1875 -vt 0.09375 0.09375 -vt 0.1875 0.09375 -vt 0.1875 0 -vt 0.09375 0 -vt 0 0.09375 -vt 0.09375 0.09375 -vt 0.09375 0 -vt 0 0 -vt 0.28125 0.09375 -vt 0.375 0.09375 -vt 0.375 0 -vt 0.28125 0 -vt 0.1875 0.09375 -vt 0.28125 0.09375 -vt 0.28125 0 -vt 0.1875 0 -vt 0.1875 0.09375 -vt 0.09375 0.09375 -vt 0.09375 0.1875 -vt 0.1875 0.1875 -vt 0.28125 0.1875 -vt 0.1875 0.1875 -vt 0.1875 0.09375 -vt 0.28125 0.09375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_1c25eeea-87e5-6114-747e-b8cdb1a56a09 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/sniffer.obj b/renderer/viewer/three/entity/models/sniffer.obj deleted file mode 100644 index 6fe8ed15..00000000 --- a/renderer/viewer/three/entity/models/sniffer.obj +++ /dev/null @@ -1,693 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o body -v 0.8125 2.09375 1.28125 -v 0.8125 2.09375 -1.28125 -v 0.8125 0.53125 1.28125 -v 0.8125 0.53125 -1.28125 -v -0.8125 2.09375 -1.28125 -v -0.8125 2.09375 1.28125 -v -0.8125 0.53125 -1.28125 -v -0.8125 0.53125 1.28125 -vt 0.53125 0.7916666666666666 -vt 0.6614583333333334 0.7916666666666666 -vt 0.6614583333333334 0.6666666666666667 -vt 0.53125 0.6666666666666667 -vt 0.3229166666666667 0.7916666666666666 -vt 0.53125 0.7916666666666666 -vt 0.53125 0.6666666666666667 -vt 0.3229166666666667 0.6666666666666667 -vt 0.8697916666666666 0.7916666666666666 -vt 1 0.7916666666666666 -vt 1 0.6666666666666667 -vt 0.8697916666666666 0.6666666666666667 -vt 0.6614583333333334 0.7916666666666666 -vt 0.8697916666666666 0.7916666666666666 -vt 0.8697916666666666 0.6666666666666667 -vt 0.6614583333333334 0.6666666666666667 -vt 0.6614583333333334 0.7916666666666666 -vt 0.53125 0.7916666666666666 -vt 0.53125 1 -vt 0.6614583333333334 1 -vt 0.7916666666666666 1 -vt 0.6614583333333334 1 -vt 0.6614583333333334 0.7916666666666666 -vt 0.7916666666666666 0.7916666666666666 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o body -v 0.78125 2.0625 1.25 -v 0.78125 2.0625 -1.25 -v 0.78125 0.25 1.25 -v 0.78125 0.25 -1.25 -v -0.78125 2.0625 -1.25 -v -0.78125 2.0625 1.25 -v -0.78125 0.25 -1.25 -v -0.78125 0.25 1.25 -vt 0.53125 0.4375 -vt 0.6614583333333334 0.4375 -vt 0.6614583333333334 0.28645833333333337 -vt 0.53125 0.28645833333333337 -vt 0.3229166666666667 0.4375 -vt 0.53125 0.4375 -vt 0.53125 0.28645833333333337 -vt 0.3229166666666667 0.28645833333333337 -vt 0.8697916666666666 0.4375 -vt 1 0.4375 -vt 1 0.28645833333333337 -vt 0.8697916666666666 0.28645833333333337 -vt 0.6614583333333334 0.4375 -vt 0.8697916666666666 0.4375 -vt 0.8697916666666666 0.28645833333333337 -vt 0.6614583333333334 0.28645833333333337 -vt 0.6614583333333334 0.4375 -vt 0.53125 0.4375 -vt 0.53125 0.6458333333333333 -vt 0.6614583333333334 0.6458333333333333 -vt 0.7916666666666666 0.6458333333333333 -vt 0.6614583333333334 0.6458333333333333 -vt 0.6614583333333334 0.4375 -vt 0.7916666666666666 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o body -v 0.78125 0.5 1.25 -v 0.78125 0.5 -1.25 -v 0.78125 0.5 1.25 -v 0.78125 0.5 -1.25 -v -0.78125 0.5 -1.25 -v -0.78125 0.5 1.25 -v -0.78125 0.5 -1.25 -v -0.78125 0.5 1.25 -vt 0.6614583333333334 0.4375 -vt 0.7916666666666666 0.4375 -vt 0.7916666666666666 0.4375 -vt 0.6614583333333334 0.4375 -vt 0.453125 0.4375 -vt 0.6614583333333334 0.4375 -vt 0.6614583333333334 0.4375 -vt 0.453125 0.4375 -vt 1 0.4375 -vt 1.1302083333333333 0.4375 -vt 1.1302083333333333 0.4375 -vt 1 0.4375 -vt 0.7916666666666666 0.4375 -vt 1 0.4375 -vt 1 0.4375 -vt 0.7916666666666666 0.4375 -vt 0.7916666666666666 0.4375 -vt 0.6614583333333334 0.4375 -vt 0.6614583333333334 0.6458333333333333 -vt 0.7916666666666666 0.6458333333333333 -vt 0.921875 0.6458333333333333 -vt 0.7916666666666666 0.6458333333333333 -vt 0.7916666666666666 0.4375 -vt 0.921875 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o head -v 0.40625 1.3125 -1.24375 -v 0.40625 1.3125 -1.93125 -v 0.40625 0.1875 -1.24375 -v 0.40625 0.1875 -1.93125 -v -0.40625 1.3125 -1.93125 -v -0.40625 1.3125 -1.24375 -v -0.40625 0.1875 -1.93125 -v -0.40625 0.1875 -1.24375 -vt 0.09895833333333333 0.8645833333333334 -vt 0.16666666666666666 0.8645833333333334 -vt 0.16666666666666666 0.7708333333333334 -vt 0.09895833333333333 0.7708333333333334 -vt 0.041666666666666664 0.8645833333333334 -vt 0.09895833333333333 0.8645833333333334 -vt 0.09895833333333333 0.7708333333333334 -vt 0.041666666666666664 0.7708333333333334 -vt 0.22395833333333334 0.8645833333333334 -vt 0.2916666666666667 0.8645833333333334 -vt 0.2916666666666667 0.7708333333333334 -vt 0.22395833333333334 0.7708333333333334 -vt 0.16666666666666666 0.8645833333333334 -vt 0.22395833333333334 0.8645833333333334 -vt 0.22395833333333334 0.7708333333333334 -vt 0.16666666666666666 0.7708333333333334 -vt 0.16666666666666666 0.8645833333333334 -vt 0.09895833333333333 0.8645833333333334 -vt 0.09895833333333333 0.921875 -vt 0.16666666666666666 0.921875 -vt 0.234375 0.921875 -vt 0.16666666666666666 0.921875 -vt 0.16666666666666666 0.8645833333333334 -vt 0.234375 0.8645833333333334 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o head -v 0.40625 0.375 -1.24375 -v 0.40625 0.375 -1.93125 -v 0.40625 0.375 -1.24375 -v 0.40625 0.375 -1.93125 -v -0.40625 0.375 -1.93125 -v -0.40625 0.375 -1.24375 -v -0.40625 0.375 -1.93125 -v -0.40625 0.375 -1.24375 -vt 0.09895833333333333 0.921875 -vt 0.16666666666666666 0.921875 -vt 0.16666666666666666 0.921875 -vt 0.09895833333333333 0.921875 -vt 0.041666666666666664 0.921875 -vt 0.09895833333333333 0.921875 -vt 0.09895833333333333 0.921875 -vt 0.041666666666666664 0.921875 -vt 0.22395833333333334 0.921875 -vt 0.2916666666666667 0.921875 -vt 0.2916666666666667 0.921875 -vt 0.22395833333333334 0.921875 -vt 0.16666666666666666 0.921875 -vt 0.22395833333333334 0.921875 -vt 0.22395833333333334 0.921875 -vt 0.16666666666666666 0.921875 -vt 0.16666666666666666 0.921875 -vt 0.09895833333333333 0.921875 -vt 0.09895833333333333 0.9791666666666666 -vt 0.16666666666666666 0.9791666666666666 -vt 0.234375 0.9791666666666666 -vt 0.16666666666666666 0.9791666666666666 -vt 0.16666666666666666 0.921875 -vt 0.234375 0.921875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o left_ear -v -0.4 1.3125 -1.24375 -v -0.4 1.3125 -1.68125 -v -0.4 0.125 -1.24375 -v -0.4 0.125 -1.68125 -v -0.4625 1.3125 -1.68125 -v -0.4625 1.3125 -1.24375 -v -0.4625 0.125 -1.68125 -v -0.4625 0.125 -1.24375 -vt 0.046875 0.9635416666666666 -vt 0.052083333333333336 0.9635416666666666 -vt 0.052083333333333336 0.8645833333333334 -vt 0.046875 0.8645833333333334 -vt 0.010416666666666666 0.9635416666666666 -vt 0.046875 0.9635416666666666 -vt 0.046875 0.8645833333333334 -vt 0.010416666666666666 0.8645833333333334 -vt 0.08854166666666667 0.9635416666666666 -vt 0.09375 0.9635416666666666 -vt 0.09375 0.8645833333333334 -vt 0.08854166666666667 0.8645833333333334 -vt 0.052083333333333336 0.9635416666666666 -vt 0.08854166666666667 0.9635416666666666 -vt 0.08854166666666667 0.8645833333333334 -vt 0.052083333333333336 0.8645833333333334 -vt 0.052083333333333336 0.9635416666666666 -vt 0.046875 0.9635416666666666 -vt 0.046875 1 -vt 0.052083333333333336 1 -vt 0.057291666666666664 1 -vt 0.052083333333333336 1 -vt 0.052083333333333336 0.9635416666666666 -vt 0.057291666666666664 0.9635416666666666 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o right_ear -v 0.4625 1.3125 -1.24375 -v 0.4625 1.3125 -1.68125 -v 0.4625 0.125 -1.24375 -v 0.4625 0.125 -1.68125 -v 0.4 1.3125 -1.68125 -v 0.4 1.3125 -1.24375 -v 0.4 0.125 -1.68125 -v 0.4 0.125 -1.24375 -vt 0.2864583333333333 0.9635416666666666 -vt 0.2916666666666667 0.9635416666666666 -vt 0.2916666666666667 0.8645833333333334 -vt 0.2864583333333333 0.8645833333333334 -vt 0.25 0.9635416666666666 -vt 0.2864583333333333 0.9635416666666666 -vt 0.2864583333333333 0.8645833333333334 -vt 0.25 0.8645833333333334 -vt 0.328125 0.9635416666666666 -vt 0.3333333333333333 0.9635416666666666 -vt 0.3333333333333333 0.8645833333333334 -vt 0.328125 0.8645833333333334 -vt 0.2916666666666667 0.9635416666666666 -vt 0.328125 0.9635416666666666 -vt 0.328125 0.8645833333333334 -vt 0.2916666666666667 0.8645833333333334 -vt 0.2916666666666667 0.9635416666666666 -vt 0.2864583333333333 0.9635416666666666 -vt 0.2864583333333333 1 -vt 0.2916666666666667 1 -vt 0.296875 1 -vt 0.2916666666666667 1 -vt 0.2916666666666667 0.9635416666666666 -vt 0.296875 0.9635416666666666 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o nose -v 0.40625 1.25 -1.93125 -v 0.40625 1.25 -2.49375 -v 0.40625 1.125 -1.93125 -v 0.40625 1.125 -2.49375 -v -0.40625 1.25 -2.49375 -v -0.40625 1.25 -1.93125 -v -0.40625 1.125 -2.49375 -v -0.40625 1.125 -1.93125 -vt 0.09895833333333333 0.71875 -vt 0.16666666666666666 0.71875 -vt 0.16666666666666666 0.7083333333333333 -vt 0.09895833333333333 0.7083333333333333 -vt 0.052083333333333336 0.71875 -vt 0.09895833333333333 0.71875 -vt 0.09895833333333333 0.7083333333333333 -vt 0.052083333333333336 0.7083333333333333 -vt 0.21354166666666666 0.71875 -vt 0.28125 0.71875 -vt 0.28125 0.7083333333333333 -vt 0.21354166666666666 0.7083333333333333 -vt 0.16666666666666666 0.71875 -vt 0.21354166666666666 0.71875 -vt 0.21354166666666666 0.7083333333333333 -vt 0.16666666666666666 0.7083333333333333 -vt 0.16666666666666666 0.71875 -vt 0.09895833333333333 0.71875 -vt 0.09895833333333333 0.765625 -vt 0.16666666666666666 0.765625 -vt 0.234375 0.765625 -vt 0.16666666666666666 0.765625 -vt 0.16666666666666666 0.71875 -vt 0.234375 0.71875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o lower_beak -v 0.40625 1.125 -1.93125 -v 0.40625 1.125 -2.49375 -v 0.40625 0.375 -1.93125 -v 0.40625 0.375 -2.49375 -v -0.40625 1.125 -2.49375 -v -0.40625 1.125 -1.93125 -v -0.40625 0.375 -2.49375 -v -0.40625 0.375 -1.93125 -vt 0.09895833333333333 0.65625 -vt 0.16666666666666666 0.65625 -vt 0.16666666666666666 0.59375 -vt 0.09895833333333333 0.59375 -vt 0.052083333333333336 0.65625 -vt 0.09895833333333333 0.65625 -vt 0.09895833333333333 0.59375 -vt 0.052083333333333336 0.59375 -vt 0.21354166666666666 0.65625 -vt 0.28125 0.65625 -vt 0.28125 0.59375 -vt 0.21354166666666666 0.59375 -vt 0.16666666666666666 0.65625 -vt 0.21354166666666666 0.65625 -vt 0.21354166666666666 0.59375 -vt 0.16666666666666666 0.59375 -vt 0.16666666666666666 0.65625 -vt 0.09895833333333333 0.65625 -vt 0.09895833333333333 0.703125 -vt 0.16666666666666666 0.703125 -vt 0.234375 0.703125 -vt 0.16666666666666666 0.703125 -vt 0.16666666666666666 0.65625 -vt 0.234375 0.65625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o right_front_leg -v 0.6875 0.625 -0.6875 -v 0.6875 0.625 -1.1875 -v 0.6875 0 -0.6875 -v 0.6875 0 -1.1875 -v 0.25 0.625 -1.1875 -v 0.25 0.625 -0.6875 -v 0.25 0 -1.1875 -v 0.25 0 -0.6875 -vt 0.20833333333333334 0.5052083333333333 -vt 0.24479166666666666 0.5052083333333333 -vt 0.24479166666666666 0.453125 -vt 0.20833333333333334 0.453125 -vt 0.16666666666666666 0.5052083333333333 -vt 0.20833333333333334 0.5052083333333333 -vt 0.20833333333333334 0.453125 -vt 0.16666666666666666 0.453125 -vt 0.2864583333333333 0.5052083333333333 -vt 0.3229166666666667 0.5052083333333333 -vt 0.3229166666666667 0.453125 -vt 0.2864583333333333 0.453125 -vt 0.24479166666666666 0.5052083333333333 -vt 0.2864583333333333 0.5052083333333333 -vt 0.2864583333333333 0.453125 -vt 0.24479166666666666 0.453125 -vt 0.24479166666666666 0.5052083333333333 -vt 0.20833333333333334 0.5052083333333333 -vt 0.20833333333333334 0.546875 -vt 0.24479166666666666 0.546875 -vt 0.28125 0.546875 -vt 0.24479166666666666 0.546875 -vt 0.24479166666666666 0.5052083333333333 -vt 0.28125 0.5052083333333333 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o right_mid_leg -v 0.6875 0.625 0.25 -v 0.6875 0.625 -0.25 -v 0.6875 0 0.25 -v 0.6875 0 -0.25 -v 0.25 0.625 -0.25 -v 0.25 0.625 0.25 -v 0.25 0 -0.25 -v 0.25 0 0.25 -vt 0.20833333333333334 0.41145833333333337 -vt 0.24479166666666666 0.41145833333333337 -vt 0.24479166666666666 0.359375 -vt 0.20833333333333334 0.359375 -vt 0.16666666666666666 0.41145833333333337 -vt 0.20833333333333334 0.41145833333333337 -vt 0.20833333333333334 0.359375 -vt 0.16666666666666666 0.359375 -vt 0.2864583333333333 0.41145833333333337 -vt 0.3229166666666667 0.41145833333333337 -vt 0.3229166666666667 0.359375 -vt 0.2864583333333333 0.359375 -vt 0.24479166666666666 0.41145833333333337 -vt 0.2864583333333333 0.41145833333333337 -vt 0.2864583333333333 0.359375 -vt 0.24479166666666666 0.359375 -vt 0.24479166666666666 0.41145833333333337 -vt 0.20833333333333334 0.41145833333333337 -vt 0.20833333333333334 0.453125 -vt 0.24479166666666666 0.453125 -vt 0.28125 0.453125 -vt 0.24479166666666666 0.453125 -vt 0.24479166666666666 0.41145833333333337 -vt 0.28125 0.41145833333333337 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 -o right_hind_leg -v 0.6875 0.625 1.1875 -v 0.6875 0.625 0.6875 -v 0.6875 0 1.1875 -v 0.6875 0 0.6875 -v 0.25 0.625 0.6875 -v 0.25 0.625 1.1875 -v 0.25 0 0.6875 -v 0.25 0 1.1875 -vt 0.20833333333333334 0.31770833333333337 -vt 0.24479166666666666 0.31770833333333337 -vt 0.24479166666666666 0.265625 -vt 0.20833333333333334 0.265625 -vt 0.16666666666666666 0.31770833333333337 -vt 0.20833333333333334 0.31770833333333337 -vt 0.20833333333333334 0.265625 -vt 0.16666666666666666 0.265625 -vt 0.2864583333333333 0.31770833333333337 -vt 0.3229166666666667 0.31770833333333337 -vt 0.3229166666666667 0.265625 -vt 0.2864583333333333 0.265625 -vt 0.24479166666666666 0.31770833333333337 -vt 0.2864583333333333 0.31770833333333337 -vt 0.2864583333333333 0.265625 -vt 0.24479166666666666 0.265625 -vt 0.24479166666666666 0.31770833333333337 -vt 0.20833333333333334 0.31770833333333337 -vt 0.20833333333333334 0.359375 -vt 0.24479166666666666 0.359375 -vt 0.28125 0.359375 -vt 0.24479166666666666 0.359375 -vt 0.24479166666666666 0.31770833333333337 -vt 0.28125 0.31770833333333337 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 -f 92/268/67 95/267/67 93/266/67 90/265/67 -f 91/272/68 92/271/68 90/270/68 89/269/68 -f 96/276/69 91/275/69 89/274/69 94/273/69 -f 95/280/70 96/279/70 94/278/70 93/277/70 -f 94/284/71 89/283/71 90/282/71 93/281/71 -f 95/288/72 92/287/72 91/286/72 96/285/72 -o left_front_leg -v -0.25 0.625 -0.6875 -v -0.25 0.625 -1.1875 -v -0.25 0 -0.6875 -v -0.25 0 -1.1875 -v -0.6875 0.625 -1.1875 -v -0.6875 0.625 -0.6875 -v -0.6875 0 -1.1875 -v -0.6875 0 -0.6875 -vt 0.041666666666666664 0.5052083333333333 -vt 0.078125 0.5052083333333333 -vt 0.078125 0.453125 -vt 0.041666666666666664 0.453125 -vt 0 0.5052083333333333 -vt 0.041666666666666664 0.5052083333333333 -vt 0.041666666666666664 0.453125 -vt 0 0.453125 -vt 0.11979166666666667 0.5052083333333333 -vt 0.15625 0.5052083333333333 -vt 0.15625 0.453125 -vt 0.11979166666666667 0.453125 -vt 0.078125 0.5052083333333333 -vt 0.11979166666666667 0.5052083333333333 -vt 0.11979166666666667 0.453125 -vt 0.078125 0.453125 -vt 0.078125 0.5052083333333333 -vt 0.041666666666666664 0.5052083333333333 -vt 0.041666666666666664 0.546875 -vt 0.078125 0.546875 -vt 0.11458333333333333 0.546875 -vt 0.078125 0.546875 -vt 0.078125 0.5052083333333333 -vt 0.11458333333333333 0.5052083333333333 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 -f 100/292/73 103/291/73 101/290/73 98/289/73 -f 99/296/74 100/295/74 98/294/74 97/293/74 -f 104/300/75 99/299/75 97/298/75 102/297/75 -f 103/304/76 104/303/76 102/302/76 101/301/76 -f 102/308/77 97/307/77 98/306/77 101/305/77 -f 103/312/78 100/311/78 99/310/78 104/309/78 -o left_mid_leg -v -0.25 0.625 0.25 -v -0.25 0.625 -0.25 -v -0.25 0 0.25 -v -0.25 0 -0.25 -v -0.6875 0.625 -0.25 -v -0.6875 0.625 0.25 -v -0.6875 0 -0.25 -v -0.6875 0 0.25 -vt 0.041666666666666664 0.41145833333333337 -vt 0.078125 0.41145833333333337 -vt 0.078125 0.359375 -vt 0.041666666666666664 0.359375 -vt 0 0.41145833333333337 -vt 0.041666666666666664 0.41145833333333337 -vt 0.041666666666666664 0.359375 -vt 0 0.359375 -vt 0.11979166666666667 0.41145833333333337 -vt 0.15625 0.41145833333333337 -vt 0.15625 0.359375 -vt 0.11979166666666667 0.359375 -vt 0.078125 0.41145833333333337 -vt 0.11979166666666667 0.41145833333333337 -vt 0.11979166666666667 0.359375 -vt 0.078125 0.359375 -vt 0.078125 0.41145833333333337 -vt 0.041666666666666664 0.41145833333333337 -vt 0.041666666666666664 0.453125 -vt 0.078125 0.453125 -vt 0.11458333333333333 0.453125 -vt 0.078125 0.453125 -vt 0.078125 0.41145833333333337 -vt 0.11458333333333333 0.41145833333333337 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 -f 108/316/79 111/315/79 109/314/79 106/313/79 -f 107/320/80 108/319/80 106/318/80 105/317/80 -f 112/324/81 107/323/81 105/322/81 110/321/81 -f 111/328/82 112/327/82 110/326/82 109/325/82 -f 110/332/83 105/331/83 106/330/83 109/329/83 -f 111/336/84 108/335/84 107/334/84 112/333/84 -o left_hind_leg -v -0.25 0.625 1.1875 -v -0.25 0.625 0.6875 -v -0.25 0 1.1875 -v -0.25 0 0.6875 -v -0.6875 0.625 0.6875 -v -0.6875 0.625 1.1875 -v -0.6875 0 0.6875 -v -0.6875 0 1.1875 -vt 0.041666666666666664 0.31770833333333337 -vt 0.078125 0.31770833333333337 -vt 0.078125 0.265625 -vt 0.041666666666666664 0.265625 -vt 0 0.31770833333333337 -vt 0.041666666666666664 0.31770833333333337 -vt 0.041666666666666664 0.265625 -vt 0 0.265625 -vt 0.11979166666666667 0.31770833333333337 -vt 0.15625 0.31770833333333337 -vt 0.15625 0.265625 -vt 0.11979166666666667 0.265625 -vt 0.078125 0.31770833333333337 -vt 0.11979166666666667 0.31770833333333337 -vt 0.11979166666666667 0.265625 -vt 0.078125 0.265625 -vt 0.078125 0.31770833333333337 -vt 0.041666666666666664 0.31770833333333337 -vt 0.041666666666666664 0.359375 -vt 0.078125 0.359375 -vt 0.11458333333333333 0.359375 -vt 0.078125 0.359375 -vt 0.078125 0.31770833333333337 -vt 0.11458333333333333 0.31770833333333337 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_583c9f26-fb84-68dc-a891-67c1661cee33 -f 116/340/85 119/339/85 117/338/85 114/337/85 -f 115/344/86 116/343/86 114/342/86 113/341/86 -f 120/348/87 115/347/87 113/346/87 118/345/87 -f 119/352/88 120/351/88 118/350/88 117/349/88 -f 118/356/89 113/355/89 114/354/89 117/353/89 -f 119/360/90 116/359/90 115/358/90 120/357/90 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/spider.obj b/renderer/viewer/three/entity/models/spider.obj deleted file mode 100644 index eb636839..00000000 --- a/renderer/viewer/three/entity/models/spider.obj +++ /dev/null @@ -1,509 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o head -v 0.25 0.8125 -0.1875 -v 0.25 0.8125 -0.6875 -v 0.25 0.3125 -0.1875 -v 0.25 0.3125 -0.6875 -v -0.25 0.8125 -0.6875 -v -0.25 0.8125 -0.1875 -v -0.25 0.3125 -0.6875 -v -0.25 0.3125 -0.1875 -vt 0.625 0.625 -vt 0.75 0.625 -vt 0.75 0.375 -vt 0.625 0.375 -vt 0.5 0.625 -vt 0.625 0.625 -vt 0.625 0.375 -vt 0.5 0.375 -vt 0.875 0.625 -vt 1 0.625 -vt 1 0.375 -vt 0.875 0.375 -vt 0.75 0.625 -vt 0.875 0.625 -vt 0.875 0.375 -vt 0.75 0.375 -vt 0.75 0.625 -vt 0.625 0.625 -vt 0.625 0.875 -vt 0.75 0.875 -vt 0.875 0.875 -vt 0.75 0.875 -vt 0.75 0.625 -vt 0.875 0.625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o body0 -v 0.1875 0.75 0.1875 -v 0.1875 0.75 -0.1875 -v 0.1875 0.375 0.1875 -v 0.1875 0.375 -0.1875 -v -0.1875 0.75 -0.1875 -v -0.1875 0.75 0.1875 -v -0.1875 0.375 -0.1875 -v -0.1875 0.375 0.1875 -vt 0.09375 0.8125 -vt 0.1875 0.8125 -vt 0.1875 0.625 -vt 0.09375 0.625 -vt 0 0.8125 -vt 0.09375 0.8125 -vt 0.09375 0.625 -vt 0 0.625 -vt 0.28125 0.8125 -vt 0.375 0.8125 -vt 0.375 0.625 -vt 0.28125 0.625 -vt 0.1875 0.8125 -vt 0.28125 0.8125 -vt 0.28125 0.625 -vt 0.1875 0.625 -vt 0.1875 0.8125 -vt 0.09375 0.8125 -vt 0.09375 1 -vt 0.1875 1 -vt 0.28125 1 -vt 0.1875 1 -vt 0.1875 0.8125 -vt 0.28125 0.8125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o body1 -v 0.3125 0.8125 0.9375 -v 0.3125 0.8125 0.1875 -v 0.3125 0.3125 0.9375 -v 0.3125 0.3125 0.1875 -v -0.3125 0.8125 0.1875 -v -0.3125 0.8125 0.9375 -v -0.3125 0.3125 0.1875 -v -0.3125 0.3125 0.9375 -vt 0.1875 0.25 -vt 0.34375 0.25 -vt 0.34375 0 -vt 0.1875 0 -vt 0 0.25 -vt 0.1875 0.25 -vt 0.1875 0 -vt 0 0 -vt 0.53125 0.25 -vt 0.6875 0.25 -vt 0.6875 0 -vt 0.53125 0 -vt 0.34375 0.25 -vt 0.53125 0.25 -vt 0.53125 0 -vt 0.34375 0 -vt 0.34375 0.25 -vt 0.1875 0.25 -vt 0.1875 0.625 -vt 0.34375 0.625 -vt 0.5 0.625 -vt 0.34375 0.625 -vt 0.34375 0.25 -vt 0.5 0.25 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o leg0 -v 0.7316941738241591 0.16919417382415936 0.8321067811865475 -v 0.7941941738241591 0.10669417382415936 0.743718433538229 -v 0.6433058261758406 0.08080582617584087 0.8321067811865475 -v 0.7058058261758406 0.018305826175840867 0.743718433538229 -v 0.29419417382415913 0.6066941738241591 0.03661165235168151 -v 0.23169417382415913 0.6691941738241591 0.125 -v 0.20580582617584076 0.5183058261758409 0.03661165235168151 -v 0.14330582617584076 0.5808058261758409 0.125 -vt 0.3125 0.9375 -vt 0.5625 0.9375 -vt 0.5625 0.875 -vt 0.3125 0.875 -vt 0.28125 0.9375 -vt 0.3125 0.9375 -vt 0.3125 0.875 -vt 0.28125 0.875 -vt 0.59375 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.875 -vt 0.59375 0.875 -vt 0.5625 0.9375 -vt 0.59375 0.9375 -vt 0.59375 0.875 -vt 0.5625 0.875 -vt 0.5625 0.9375 -vt 0.3125 0.9375 -vt 0.3125 1 -vt 0.5625 1 -vt 0.8125 1 -vt 0.5625 1 -vt 0.5625 0.9375 -vt 0.8125 0.9375 -vn 0.5 -0.5 -0.7071067811865476 -vn 0.5 -0.5 0.7071067811865477 -vn -0.5 0.5 0.7071067811865476 -vn -0.5 0.5 -0.7071067811865477 -vn 0.7071067811865477 0.7071067811865476 0 -vn -0.7071067811865477 -0.7071067811865476 0 -usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o leg1 -v -0.23169417382415913 0.6691941738241591 0.125 -v -0.29419417382415913 0.6066941738241591 0.03661165235168151 -v -0.14330582617584076 0.5808058261758409 0.125 -v -0.20580582617584076 0.5183058261758409 0.03661165235168151 -v -0.794194173824159 0.10669417382415936 0.743718433538229 -v -0.731694173824159 0.16919417382415936 0.8321067811865475 -v -0.7058058261758406 0.018305826175840867 0.743718433538229 -v -0.6433058261758406 0.08080582617584087 0.8321067811865475 -vt 0.3125 0.9375 -vt 0.5625 0.9375 -vt 0.5625 0.875 -vt 0.3125 0.875 -vt 0.28125 0.9375 -vt 0.3125 0.9375 -vt 0.3125 0.875 -vt 0.28125 0.875 -vt 0.59375 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.875 -vt 0.59375 0.875 -vt 0.5625 0.9375 -vt 0.59375 0.9375 -vt 0.59375 0.875 -vt 0.5625 0.875 -vt 0.5625 0.9375 -vt 0.3125 0.9375 -vt 0.3125 1 -vt 0.5625 1 -vt 0.8125 1 -vt 0.5625 1 -vt 0.5625 0.9375 -vt 0.8125 0.9375 -vn -0.5 -0.5 -0.7071067811865476 -vn 0.5 0.5 -0.7071067811865477 -vn 0.5 0.5 0.7071067811865476 -vn -0.5 -0.5 0.7071067811865477 -vn -0.7071067811865477 0.7071067811865476 0 -vn 0.7071067811865477 -0.7071067811865476 0 -usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o leg2 -v 1.0143853759373593 0.10357000946898909 0.36551321892668 -v 1.0408868946744412 0.08501344627527851 0.2447724906405464 -v 0.9426883213934785 0.0011760039328650995 0.36551321892668 -v 0.9691898401305603 -0.017380559260845474 0.2447724906405464 -v 0.24964677943821734 0.6390457394976019 -0.014046554461974337 -v 0.2231452607011355 0.6576023026913125 0.10669417382415924 -v 0.17794972489433658 0.5366517339614778 -0.014046554461974337 -v 0.15144820615725474 0.5552082971551884 0.10669417382415924 -vt 0.3125 0.9375 -vt 0.5625 0.9375 -vt 0.5625 0.875 -vt 0.3125 0.875 -vt 0.28125 0.9375 -vt 0.3125 0.9375 -vt 0.3125 0.875 -vt 0.28125 0.875 -vt 0.59375 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.875 -vt 0.59375 0.875 -vt 0.5625 0.9375 -vt 0.59375 0.9375 -vt 0.59375 0.875 -vt 0.5625 0.875 -vt 0.5625 0.9375 -vt 0.3125 0.9375 -vt 0.3125 1 -vt 0.5625 1 -vt 0.8125 1 -vt 0.5625 1 -vt 0.5625 0.9375 -vt 0.8125 0.9375 -vn 0.21201214989665462 -0.1484525055496845 -0.9659258262890683 -vn 0.7912401152362238 -0.5540322932223234 0.25881904510252074 -vn -0.21201214989665462 0.1484525055496845 0.9659258262890683 -vn -0.7912401152362238 0.5540322932223234 -0.25881904510252074 -vn 0.5735764363510462 0.8191520442889919 1.387778780781446e-17 -vn -0.5735764363510462 -0.8191520442889919 -1.387778780781446e-17 -usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o leg3 -v -0.2231452607011355 0.6576023026913125 0.10669417382415924 -v -0.24964677943821734 0.6390457394976019 -0.014046554461974337 -v -0.15144820615725474 0.5552082971551884 0.10669417382415924 -v -0.17794972489433658 0.5366517339614778 -0.014046554461974337 -v -1.0408868946744412 0.08501344627527851 0.2447724906405464 -v -1.0143853759373593 0.10357000946898909 0.36551321892668 -v -0.9691898401305603 -0.017380559260845474 0.2447724906405464 -v -0.9426883213934785 0.0011760039328650995 0.36551321892668 -vt 0.3125 0.9375 -vt 0.5625 0.9375 -vt 0.5625 0.875 -vt 0.3125 0.875 -vt 0.28125 0.9375 -vt 0.3125 0.9375 -vt 0.3125 0.875 -vt 0.28125 0.875 -vt 0.59375 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.875 -vt 0.59375 0.875 -vt 0.5625 0.9375 -vt 0.59375 0.9375 -vt 0.59375 0.875 -vt 0.5625 0.875 -vt 0.5625 0.9375 -vt 0.3125 0.9375 -vt 0.3125 1 -vt 0.5625 1 -vt 0.8125 1 -vt 0.5625 1 -vt 0.5625 0.9375 -vt 0.8125 0.9375 -vn -0.21201214989665462 -0.1484525055496845 -0.9659258262890683 -vn 0.7912401152362238 0.5540322932223234 -0.25881904510252074 -vn 0.21201214989665462 0.1484525055496845 0.9659258262890683 -vn -0.7912401152362238 -0.5540322932223234 0.25881904510252074 -vn -0.5735764363510462 0.8191520442889919 1.387778780781446e-17 -vn 0.5735764363510462 -0.8191520442889919 -1.387778780781446e-17 -usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o leg4 -v 1.0408868946744412 0.08501344627527851 -0.1822724906405464 -v 1.0143853759373593 0.10357000946898909 -0.30301321892668 -v 0.9691898401305603 -0.017380559260845474 -0.1822724906405464 -v 0.9426883213934785 0.0011760039328650995 -0.30301321892668 -v 0.2231452607011355 0.6576023026913125 -0.044194173824159244 -v 0.24964677943821734 0.6390457394976019 0.07654655446197434 -v 0.15144820615725474 0.5552082971551884 -0.044194173824159244 -v 0.17794972489433658 0.5366517339614778 0.07654655446197434 -vt 0.3125 0.9375 -vt 0.5625 0.9375 -vt 0.5625 0.875 -vt 0.3125 0.875 -vt 0.28125 0.9375 -vt 0.3125 0.9375 -vt 0.3125 0.875 -vt 0.28125 0.875 -vt 0.59375 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.875 -vt 0.59375 0.875 -vt 0.5625 0.9375 -vt 0.59375 0.9375 -vt 0.59375 0.875 -vt 0.5625 0.875 -vt 0.5625 0.9375 -vt 0.3125 0.9375 -vt 0.3125 1 -vt 0.5625 1 -vt 0.8125 1 -vt 0.5625 1 -vt 0.5625 0.9375 -vt 0.8125 0.9375 -vn -0.21201214989665462 0.1484525055496845 -0.9659258262890683 -vn 0.7912401152362238 -0.5540322932223234 -0.25881904510252074 -vn 0.21201214989665462 -0.1484525055496845 0.9659258262890683 -vn -0.7912401152362238 0.5540322932223234 0.25881904510252074 -vn 0.5735764363510462 0.8191520442889919 -1.387778780781446e-17 -vn -0.5735764363510462 -0.8191520442889919 1.387778780781446e-17 -usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o leg5 -v -0.24964677943821734 0.6390457394976019 0.07654655446197434 -v -0.2231452607011355 0.6576023026913125 -0.044194173824159244 -v -0.17794972489433658 0.5366517339614778 0.07654655446197434 -v -0.15144820615725474 0.5552082971551884 -0.044194173824159244 -v -1.0143853759373593 0.10357000946898909 -0.30301321892668 -v -1.0408868946744412 0.08501344627527851 -0.1822724906405464 -v -0.9426883213934785 0.0011760039328650995 -0.30301321892668 -v -0.9691898401305603 -0.017380559260845474 -0.1822724906405464 -vt 0.3125 0.9375 -vt 0.5625 0.9375 -vt 0.5625 0.875 -vt 0.3125 0.875 -vt 0.28125 0.9375 -vt 0.3125 0.9375 -vt 0.3125 0.875 -vt 0.28125 0.875 -vt 0.59375 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.875 -vt 0.59375 0.875 -vt 0.5625 0.9375 -vt 0.59375 0.9375 -vt 0.59375 0.875 -vt 0.5625 0.875 -vt 0.5625 0.9375 -vt 0.3125 0.9375 -vt 0.3125 1 -vt 0.5625 1 -vt 0.8125 1 -vt 0.5625 1 -vt 0.5625 0.9375 -vt 0.8125 0.9375 -vn 0.21201214989665462 0.1484525055496845 -0.9659258262890683 -vn 0.7912401152362238 0.5540322932223234 0.25881904510252074 -vn -0.21201214989665462 -0.1484525055496845 0.9659258262890683 -vn -0.7912401152362238 -0.5540322932223234 -0.25881904510252074 -vn -0.5735764363510462 0.8191520442889919 -1.387778780781446e-17 -vn 0.5735764363510462 -0.8191520442889919 1.387778780781446e-17 -usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o leg6 -v 0.7941941738241591 0.10669417382415936 -0.681218433538229 -v 0.7316941738241591 0.16919417382415936 -0.7696067811865475 -v 0.7058058261758406 0.018305826175840867 -0.681218433538229 -v 0.6433058261758406 0.08080582617584087 -0.7696067811865475 -v 0.23169417382415913 0.6691941738241591 -0.0625 -v 0.29419417382415913 0.6066941738241591 0.025888347648318488 -v 0.14330582617584076 0.5808058261758409 -0.0625 -v 0.20580582617584076 0.5183058261758409 0.025888347648318488 -vt 0.3125 0.9375 -vt 0.5625 0.9375 -vt 0.5625 0.875 -vt 0.3125 0.875 -vt 0.28125 0.9375 -vt 0.3125 0.9375 -vt 0.3125 0.875 -vt 0.28125 0.875 -vt 0.59375 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.875 -vt 0.59375 0.875 -vt 0.5625 0.9375 -vt 0.59375 0.9375 -vt 0.59375 0.875 -vt 0.5625 0.875 -vt 0.5625 0.9375 -vt 0.3125 0.9375 -vt 0.3125 1 -vt 0.5625 1 -vt 0.8125 1 -vt 0.5625 1 -vt 0.5625 0.9375 -vt 0.8125 0.9375 -vn -0.5 0.5 -0.7071067811865476 -vn 0.5 -0.5 -0.7071067811865477 -vn 0.5 -0.5 0.7071067811865476 -vn -0.5 0.5 0.7071067811865477 -vn 0.7071067811865477 0.7071067811865476 0 -vn -0.7071067811865477 -0.7071067811865476 0 -usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o leg7 -v -0.29419417382415913 0.6066941738241591 0.025888347648318488 -v -0.23169417382415913 0.6691941738241591 -0.0625 -v -0.20580582617584076 0.5183058261758409 0.025888347648318488 -v -0.14330582617584076 0.5808058261758409 -0.0625 -v -0.731694173824159 0.16919417382415936 -0.7696067811865475 -v -0.794194173824159 0.10669417382415936 -0.681218433538229 -v -0.6433058261758406 0.08080582617584087 -0.7696067811865475 -v -0.7058058261758406 0.018305826175840867 -0.681218433538229 -vt 0.3125 0.9375 -vt 0.5625 0.9375 -vt 0.5625 0.875 -vt 0.3125 0.875 -vt 0.28125 0.9375 -vt 0.3125 0.9375 -vt 0.3125 0.875 -vt 0.28125 0.875 -vt 0.59375 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.875 -vt 0.59375 0.875 -vt 0.5625 0.9375 -vt 0.59375 0.9375 -vt 0.59375 0.875 -vt 0.5625 0.875 -vt 0.5625 0.9375 -vt 0.3125 0.9375 -vt 0.3125 1 -vt 0.5625 1 -vt 0.8125 1 -vt 0.5625 1 -vt 0.5625 0.9375 -vt 0.8125 0.9375 -vn 0.5 0.5 -0.7071067811865476 -vn 0.5 0.5 0.7071067811865477 -vn -0.5 -0.5 0.7071067811865476 -vn -0.5 -0.5 -0.7071067811865477 -vn -0.7071067811865477 0.7071067811865476 0 -vn 0.7071067811865477 -0.7071067811865476 0 -usemtl m_9855f90d-c537-3611-ecbb-abc7e6cc7b17 -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/tadpole.obj b/renderer/viewer/three/entity/models/tadpole.obj deleted file mode 100644 index b38c8a26..00000000 --- a/renderer/viewer/three/entity/models/tadpole.obj +++ /dev/null @@ -1,95 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o body -v 0.09375 0.1875 0.03125 -v 0.09375 0.1875 -0.15625 -v 0.09375 0.0625 0.03125 -v 0.09375 0.0625 -0.15625 -v -0.09375 0.1875 -0.15625 -v -0.09375 0.1875 0.03125 -v -0.09375 0.0625 -0.15625 -v -0.09375 0.0625 0.03125 -vt 0.1875 0.8125 -vt 0.375 0.8125 -vt 0.375 0.6875 -vt 0.1875 0.6875 -vt 0 0.8125 -vt 0.1875 0.8125 -vt 0.1875 0.6875 -vt 0 0.6875 -vt 0.5625 0.8125 -vt 0.75 0.8125 -vt 0.75 0.6875 -vt 0.5625 0.6875 -vt 0.375 0.8125 -vt 0.5625 0.8125 -vt 0.5625 0.6875 -vt 0.375 0.6875 -vt 0.375 0.8125 -vt 0.1875 0.8125 -vt 0.1875 1 -vt 0.375 1 -vt 0.5625 1 -vt 0.375 1 -vt 0.375 0.8125 -vt 0.5625 0.8125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_71a3df64-a731-05a3-e848-ff24e21209ec -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o tail -v 0 0.1875 0.40625 -v 0 0.1875 -0.03125 -v 0 0.0625 0.40625 -v 0 0.0625 -0.03125 -v 0 0.1875 -0.03125 -v 0 0.1875 0.40625 -v 0 0.0625 -0.03125 -v 0 0.0625 0.40625 -vt 0.4375 0.5625 -vt 0.4375 0.5625 -vt 0.4375 0.4375 -vt 0.4375 0.4375 -vt 0 0.5625 -vt 0.4375 0.5625 -vt 0.4375 0.4375 -vt 0 0.4375 -vt 0.875 0.5625 -vt 0.875 0.5625 -vt 0.875 0.4375 -vt 0.875 0.4375 -vt 0.4375 0.5625 -vt 0.875 0.5625 -vt 0.875 0.4375 -vt 0.4375 0.4375 -vt 0.4375 0.5625 -vt 0.4375 0.5625 -vt 0.4375 1 -vt 0.4375 1 -vt 0.4375 1 -vt 0.4375 1 -vt 0.4375 0.5625 -vt 0.4375 0.5625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_71a3df64-a731-05a3-e848-ff24e21209ec -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/turtle.obj b/renderer/viewer/three/entity/models/turtle.obj deleted file mode 100644 index ac0d41b9..00000000 --- a/renderer/viewer/three/entity/models/turtle.obj +++ /dev/null @@ -1,371 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o body -v 0.59375 0.5625 -0.4375000000000001 -v 0.59375 0.1875 -0.4375000000000001 -v 0.59375 0.5624999999999996 0.8125 -v 0.59375 0.18749999999999956 0.8125 -v -0.59375 0.1875 -0.4375000000000001 -v -0.59375 0.5625 -0.4375000000000001 -v -0.59375 0.18749999999999956 0.8125 -v -0.59375 0.5624999999999996 0.8125 -vt 0.1015625 0.328125 -vt 0.25 0.328125 -vt 0.25 0.015625 -vt 0.1015625 0.015625 -vt 0.0546875 0.328125 -vt 0.1015625 0.328125 -vt 0.1015625 0.015625 -vt 0.0546875 0.015625 -vt 0.296875 0.328125 -vt 0.4453125 0.328125 -vt 0.4453125 0.015625 -vt 0.296875 0.015625 -vt 0.25 0.328125 -vt 0.296875 0.328125 -vt 0.296875 0.015625 -vt 0.25 0.015625 -vt 0.25 0.328125 -vt 0.1015625 0.328125 -vt 0.1015625 0.421875 -vt 0.25 0.421875 -vt 0.3984375 0.421875 -vt 0.25 0.421875 -vt 0.25 0.328125 -vt 0.3984375 0.328125 -vn 0 -1 -2.220446049250313e-16 -vn 1 0 0 -vn 0 1 2.220446049250313e-16 -vn -1 0 0 -vn 0 2.220446049250313e-16 -1 -vn 0 -2.220446049250313e-16 1 -usemtl m_d5e023f1-fe9e-4631-8a6b-282685c9cca4 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o body -v 0.34375 0.1875 -0.4375000000000001 -v 0.34375 0 -0.4375000000000002 -v 0.34375 0.18749999999999978 0.6874999999999998 -v 0.34375 -2.220446049250313e-16 0.6874999999999998 -v -0.34375 0 -0.4375000000000002 -v -0.34375 0.1875 -0.4375000000000001 -v -0.34375 -2.220446049250313e-16 0.6874999999999998 -v -0.34375 0.18749999999999978 0.6874999999999998 -vt 0.265625 0.9375 -vt 0.3515625 0.9375 -vt 0.3515625 0.65625 -vt 0.265625 0.65625 -vt 0.2421875 0.9375 -vt 0.265625 0.9375 -vt 0.265625 0.65625 -vt 0.2421875 0.65625 -vt 0.375 0.9375 -vt 0.4609375 0.9375 -vt 0.4609375 0.65625 -vt 0.375 0.65625 -vt 0.3515625 0.9375 -vt 0.375 0.9375 -vt 0.375 0.65625 -vt 0.3515625 0.65625 -vt 0.3515625 0.9375 -vt 0.265625 0.9375 -vt 0.265625 0.984375 -vt 0.3515625 0.984375 -vt 0.4375 0.984375 -vt 0.3515625 0.984375 -vt 0.3515625 0.9375 -vt 0.4375 0.9375 -vn 0 -1 -2.220446049250313e-16 -vn 1 0 0 -vn 0 1 2.220446049250313e-16 -vn -1 0 0 -vn 0 2.220446049250313e-16 -1 -vn 0 -2.220446049250313e-16 1 -usemtl m_d5e023f1-fe9e-4631-8a6b-282685c9cca4 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o eggbelly -v 0.28125 0 -0.4375000000000002 -v 0.28125 -0.0625 -0.4375000000000002 -v 0.28125 -2.220446049250313e-16 0.6874999999999998 -v 0.28125 -0.06250000000000022 0.6874999999999998 -v -0.28125 -0.0625 -0.4375000000000002 -v -0.28125 0 -0.4375000000000002 -v -0.28125 -0.06250000000000022 0.6874999999999998 -v -0.28125 -2.220446049250313e-16 0.6874999999999998 -vt 0.5546875 0.46875 -vt 0.625 0.46875 -vt 0.625 0.1875 -vt 0.5546875 0.1875 -vt 0.546875 0.46875 -vt 0.5546875 0.46875 -vt 0.5546875 0.1875 -vt 0.546875 0.1875 -vt 0.6328125 0.46875 -vt 0.703125 0.46875 -vt 0.703125 0.1875 -vt 0.6328125 0.1875 -vt 0.625 0.46875 -vt 0.6328125 0.46875 -vt 0.6328125 0.1875 -vt 0.625 0.1875 -vt 0.625 0.46875 -vt 0.5546875 0.46875 -vt 0.5546875 0.484375 -vt 0.625 0.484375 -vt 0.6953125 0.484375 -vt 0.625 0.484375 -vt 0.625 0.46875 -vt 0.6953125 0.46875 -vn 0 -1 -2.220446049250313e-16 -vn 1 0 0 -vn 0 1 2.220446049250313e-16 -vn -1 0 0 -vn 0 2.220446049250313e-16 -1 -vn 0 -2.220446049250313e-16 1 -usemtl m_d5e023f1-fe9e-4631-8a6b-282685c9cca4 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o head -v 0.1875 0.375 -0.4375 -v 0.1875 0.375 -0.8125 -v 0.1875 0.0625 -0.4375 -v 0.1875 0.0625 -0.8125 -v -0.1875 0.375 -0.8125 -v -0.1875 0.375 -0.4375 -v -0.1875 0.0625 -0.8125 -v -0.1875 0.0625 -0.4375 -vt 0.0703125 0.90625 -vt 0.1171875 0.90625 -vt 0.1171875 0.828125 -vt 0.0703125 0.828125 -vt 0.0234375 0.90625 -vt 0.0703125 0.90625 -vt 0.0703125 0.828125 -vt 0.0234375 0.828125 -vt 0.1640625 0.90625 -vt 0.2109375 0.90625 -vt 0.2109375 0.828125 -vt 0.1640625 0.828125 -vt 0.1171875 0.90625 -vt 0.1640625 0.90625 -vt 0.1640625 0.828125 -vt 0.1171875 0.828125 -vt 0.1171875 0.90625 -vt 0.0703125 0.90625 -vt 0.0703125 1 -vt 0.1171875 1 -vt 0.1640625 1 -vt 0.1171875 1 -vt 0.1171875 0.90625 -vt 0.1640625 0.90625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_d5e023f1-fe9e-4631-8a6b-282685c9cca4 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o leg0 -v 0.34375 0.125 1.3125 -v 0.34375 0.125 0.6875 -v 0.34375 0.0625 1.3125 -v 0.34375 0.0625 0.6875 -v 0.09375 0.125 0.6875 -v 0.09375 0.125 1.3125 -v 0.09375 0.0625 0.6875 -v 0.09375 0.0625 1.3125 -vt 0.0859375 0.484375 -vt 0.1171875 0.484375 -vt 0.1171875 0.46875 -vt 0.0859375 0.46875 -vt 0.0078125 0.484375 -vt 0.0859375 0.484375 -vt 0.0859375 0.46875 -vt 0.0078125 0.46875 -vt 0.1953125 0.484375 -vt 0.2265625 0.484375 -vt 0.2265625 0.46875 -vt 0.1953125 0.46875 -vt 0.1171875 0.484375 -vt 0.1953125 0.484375 -vt 0.1953125 0.46875 -vt 0.1171875 0.46875 -vt 0.1171875 0.484375 -vt 0.0859375 0.484375 -vt 0.0859375 0.640625 -vt 0.1171875 0.640625 -vt 0.1484375 0.640625 -vt 0.1171875 0.640625 -vt 0.1171875 0.484375 -vt 0.1484375 0.484375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_d5e023f1-fe9e-4631-8a6b-282685c9cca4 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o leg1 -v -0.09375 0.125 1.3125 -v -0.09375 0.125 0.6875 -v -0.09375 0.0625 1.3125 -v -0.09375 0.0625 0.6875 -v -0.34375 0.125 0.6875 -v -0.34375 0.125 1.3125 -v -0.34375 0.0625 0.6875 -v -0.34375 0.0625 1.3125 -vt 0.0859375 0.65625 -vt 0.1171875 0.65625 -vt 0.1171875 0.640625 -vt 0.0859375 0.640625 -vt 0.0078125 0.65625 -vt 0.0859375 0.65625 -vt 0.0859375 0.640625 -vt 0.0078125 0.640625 -vt 0.1953125 0.65625 -vt 0.2265625 0.65625 -vt 0.2265625 0.640625 -vt 0.1953125 0.640625 -vt 0.1171875 0.65625 -vt 0.1953125 0.65625 -vt 0.1953125 0.640625 -vt 0.1171875 0.640625 -vt 0.1171875 0.65625 -vt 0.0859375 0.65625 -vt 0.0859375 0.8125 -vt 0.1171875 0.8125 -vt 0.1484375 0.8125 -vt 0.1171875 0.8125 -vt 0.1171875 0.65625 -vt 0.1484375 0.65625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_d5e023f1-fe9e-4631-8a6b-282685c9cca4 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o leg2 -v 1.0800972660098695 0.1875 0.07574059804416988 -v 1.1343623215307852 0.1875 -0.2320118247721451 -v 1.0800972660098695 0.125 0.07574059804416988 -v 1.1343623215307852 0.125 -0.2320118247721451 -v 0.33420602220836626 0.1875 -0.373100969126526 -v 0.2799409666874506 0.1875 -0.06534854631021103 -v 0.33420602220836626 0.125 -0.373100969126526 -v 0.2799409666874506 0.125 -0.06534854631021103 -vt 0.25 0.453125 -vt 0.3515625 0.453125 -vt 0.3515625 0.4375 -vt 0.25 0.4375 -vt 0.2109375 0.453125 -vt 0.25 0.453125 -vt 0.25 0.4375 -vt 0.2109375 0.4375 -vt 0.390625 0.453125 -vt 0.4921875 0.453125 -vt 0.4921875 0.4375 -vt 0.390625 0.4375 -vt 0.3515625 0.453125 -vt 0.390625 0.453125 -vt 0.390625 0.4375 -vt 0.3515625 0.4375 -vt 0.3515625 0.453125 -vt 0.25 0.453125 -vt 0.25 0.53125 -vt 0.3515625 0.53125 -vt 0.453125 0.53125 -vt 0.3515625 0.53125 -vt 0.3515625 0.453125 -vt 0.453125 0.453125 -vn 0.17364817766693033 0 -0.984807753012208 -vn 0.984807753012208 0 0.17364817766693033 -vn -0.17364817766693033 0 0.984807753012208 -vn -0.984807753012208 0 -0.17364817766693033 -vn 0 1 0 -vn 0 -1 0 -usemtl m_d5e023f1-fe9e-4631-8a6b-282685c9cca4 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o leg3 -v -0.27994096668745055 0.1875 -0.06534854631021103 -v -0.3342060222083663 0.1875 -0.373100969126526 -v -0.27994096668745055 0.125 -0.06534854631021103 -v -0.3342060222083663 0.125 -0.373100969126526 -v -1.1343623215307852 0.1875 -0.2320118247721451 -v -1.0800972660098695 0.1875 0.07574059804416988 -v -1.1343623215307852 0.125 -0.2320118247721451 -v -1.0800972660098695 0.125 0.07574059804416988 -vt 0.25 0.546875 -vt 0.3515625 0.546875 -vt 0.3515625 0.53125 -vt 0.25 0.53125 -vt 0.2109375 0.546875 -vt 0.25 0.546875 -vt 0.25 0.53125 -vt 0.2109375 0.53125 -vt 0.390625 0.546875 -vt 0.4921875 0.546875 -vt 0.4921875 0.53125 -vt 0.390625 0.53125 -vt 0.3515625 0.546875 -vt 0.390625 0.546875 -vt 0.390625 0.53125 -vt 0.3515625 0.53125 -vt 0.3515625 0.546875 -vt 0.25 0.546875 -vt 0.25 0.625 -vt 0.3515625 0.625 -vt 0.453125 0.625 -vt 0.3515625 0.625 -vt 0.3515625 0.546875 -vt 0.453125 0.546875 -vn -0.17364817766693033 0 -0.984807753012208 -vn 0.984807753012208 0 -0.17364817766693033 -vn 0.17364817766693033 0 0.984807753012208 -vn -0.984807753012208 0 0.17364817766693033 -vn 0 1 0 -vn 0 -1 0 -usemtl m_d5e023f1-fe9e-4631-8a6b-282685c9cca4 -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/vex.obj b/renderer/viewer/three/entity/models/vex.obj deleted file mode 100644 index 63d99f88..00000000 --- a/renderer/viewer/three/entity/models/vex.obj +++ /dev/null @@ -1,325 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o body -v 0.09375 0.25 0.0625 -v 0.09375 0.25 -0.0625 -v 0.09375 0 0.0625 -v 0.09375 0 -0.0625 -v -0.09375 0.25 -0.0625 -v -0.09375 0.25 0.0625 -v -0.09375 0 -0.0625 -v -0.09375 0 0.0625 -vt 0.0625 0.625 -vt 0.15625 0.625 -vt 0.15625 0.5 -vt 0.0625 0.5 -vt 0 0.625 -vt 0.0625 0.625 -vt 0.0625 0.5 -vt 0 0.5 -vt 0.21875 0.625 -vt 0.3125 0.625 -vt 0.3125 0.5 -vt 0.21875 0.5 -vt 0.15625 0.625 -vt 0.21875 0.625 -vt 0.21875 0.5 -vt 0.15625 0.5 -vt 0.15625 0.625 -vt 0.0625 0.625 -vt 0.0625 0.6875 -vt 0.15625 0.6875 -vt 0.25 0.6875 -vt 0.15625 0.6875 -vt 0.15625 0.625 -vt 0.25 0.625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_f88b8145-cdbb-8011-03d2-81deb45b4e43 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o body -v 0.08125000000000004 0.17500000000000004 0.050000000000000044 -v 0.08125000000000004 0.17500000000000004 -0.04999999999999999 -v 0.08125000000000004 -0.11249999999999999 0.050000000000000044 -v 0.08125000000000004 -0.11249999999999999 -0.04999999999999999 -v -0.08124999999999999 0.17500000000000004 -0.04999999999999999 -v -0.08124999999999999 0.17500000000000004 0.050000000000000044 -v -0.08124999999999999 -0.11249999999999999 -0.04999999999999999 -v -0.08124999999999999 -0.11249999999999999 0.050000000000000044 -vt 0.0625 0.4375 -vt 0.15625 0.4375 -vt 0.15625 0.28125 -vt 0.0625 0.28125 -vt 0 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.28125 -vt 0 0.28125 -vt 0.21875 0.4375 -vt 0.3125 0.4375 -vt 0.3125 0.28125 -vt 0.21875 0.28125 -vt 0.15625 0.4375 -vt 0.21875 0.4375 -vt 0.21875 0.28125 -vt 0.15625 0.28125 -vt 0.15625 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.5 -vt 0.15625 0.5 -vt 0.25 0.5 -vt 0.15625 0.5 -vt 0.15625 0.4375 -vt 0.25 0.4375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_f88b8145-cdbb-8011-03d2-81deb45b4e43 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o head -v 0.15625 0.5625 0.15625 -v 0.15625 0.5625 -0.15625 -v 0.15625 0.25 0.15625 -v 0.15625 0.25 -0.15625 -v -0.15625 0.5625 -0.15625 -v -0.15625 0.5625 0.15625 -v -0.15625 0.25 -0.15625 -v -0.15625 0.25 0.15625 -vt 0.15625 0.84375 -vt 0.3125 0.84375 -vt 0.3125 0.6875 -vt 0.15625 0.6875 -vt 0 0.84375 -vt 0.15625 0.84375 -vt 0.15625 0.6875 -vt 0 0.6875 -vt 0.46875 0.84375 -vt 0.625 0.84375 -vt 0.625 0.6875 -vt 0.46875 0.6875 -vt 0.3125 0.84375 -vt 0.46875 0.84375 -vt 0.46875 0.6875 -vt 0.3125 0.6875 -vt 0.3125 0.84375 -vt 0.15625 0.84375 -vt 0.15625 1 -vt 0.3125 1 -vt 0.46875 1 -vt 0.3125 1 -vt 0.3125 0.84375 -vt 0.46875 0.84375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_f88b8145-cdbb-8011-03d2-81deb45b4e43 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o rightArm -v 0.18125000000000002 0.259375 0.05625000000000002 -v 0.18125000000000002 0.259375 -0.05625000000000002 -v 0.18125000000000002 0.021874999999999978 0.05625000000000002 -v 0.18125000000000002 0.021874999999999978 -0.05625000000000002 -v 0.06874999999999998 0.259375 -0.05625000000000002 -v 0.06874999999999998 0.259375 0.05625000000000002 -v 0.06874999999999998 0.021874999999999978 -0.05625000000000002 -v 0.06874999999999998 0.021874999999999978 0.05625000000000002 -vt 0.78125 0.9375 -vt 0.84375 0.9375 -vt 0.84375 0.8125 -vt 0.78125 0.8125 -vt 0.71875 0.9375 -vt 0.78125 0.9375 -vt 0.78125 0.8125 -vt 0.71875 0.8125 -vt 0.90625 0.9375 -vt 0.96875 0.9375 -vt 0.96875 0.8125 -vt 0.90625 0.8125 -vt 0.84375 0.9375 -vt 0.90625 0.9375 -vt 0.90625 0.8125 -vt 0.84375 0.8125 -vt 0.84375 0.9375 -vt 0.78125 0.9375 -vt 0.78125 1 -vt 0.84375 1 -vt 0.90625 1 -vt 0.84375 1 -vt 0.84375 0.9375 -vt 0.90625 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_f88b8145-cdbb-8011-03d2-81deb45b4e43 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o leftArm -v -0.06874999999999998 0.259375 0.05625000000000002 -v -0.06874999999999998 0.259375 -0.05625000000000002 -v -0.06874999999999998 0.021874999999999978 0.05625000000000002 -v -0.06874999999999998 0.021874999999999978 -0.05625000000000002 -v -0.18125000000000002 0.259375 -0.05625000000000002 -v -0.18125000000000002 0.259375 0.05625000000000002 -v -0.18125000000000002 0.021874999999999978 -0.05625000000000002 -v -0.18125000000000002 0.021874999999999978 0.05625000000000002 -vt 0.78125 0.75 -vt 0.84375 0.75 -vt 0.84375 0.625 -vt 0.78125 0.625 -vt 0.71875 0.75 -vt 0.78125 0.75 -vt 0.78125 0.625 -vt 0.71875 0.625 -vt 0.90625 0.75 -vt 0.96875 0.75 -vt 0.96875 0.625 -vt 0.90625 0.625 -vt 0.84375 0.75 -vt 0.90625 0.75 -vt 0.90625 0.625 -vt 0.84375 0.625 -vt 0.84375 0.75 -vt 0.78125 0.75 -vt 0.78125 0.8125 -vt 0.84375 0.8125 -vt 0.90625 0.8125 -vt 0.84375 0.8125 -vt 0.84375 0.75 -vt 0.90625 0.75 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_f88b8145-cdbb-8011-03d2-81deb45b4e43 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o leftWing -v -0.03125 0.1875 0.0625 -v -0.03125 0.1875 0.0625 -v -0.03125 -0.125 0.0625 -v -0.03125 -0.125 0.0625 -v -0.53125 0.1875 0.0625 -v -0.53125 0.1875 0.0625 -v -0.53125 -0.125 0.0625 -v -0.53125 -0.125 0.0625 -vt 0.75 0.3125 -vt 0.5 0.3125 -vt 0.5 0.15625 -vt 0.75 0.15625 -vt 0.75 0.3125 -vt 0.75 0.3125 -vt 0.75 0.15625 -vt 0.75 0.15625 -vt 1 0.3125 -vt 0.75 0.3125 -vt 0.75 0.15625 -vt 1 0.15625 -vt 0.5 0.3125 -vt 0.5 0.3125 -vt 0.5 0.15625 -vt 0.5 0.15625 -vt 0.5 0.3125 -vt 0.75 0.3125 -vt 0.75 0.3125 -vt 0.5 0.3125 -vt 0.75 0.3125 -vt 1 0.3125 -vt 1 0.3125 -vt 0.75 0.3125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_f88b8145-cdbb-8011-03d2-81deb45b4e43 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o rightWing -v 0.53125 0.1875 0.0625 -v 0.53125 0.1875 0.0625 -v 0.53125 -0.125 0.0625 -v 0.53125 -0.125 0.0625 -v 0.03125 0.1875 0.0625 -v 0.03125 0.1875 0.0625 -v 0.03125 -0.125 0.0625 -v 0.03125 -0.125 0.0625 -vt 0.5 0.3125 -vt 0.75 0.3125 -vt 0.75 0.15625 -vt 0.5 0.15625 -vt 0.5 0.3125 -vt 0.5 0.3125 -vt 0.5 0.15625 -vt 0.5 0.15625 -vt 0.75 0.3125 -vt 1 0.3125 -vt 1 0.15625 -vt 0.75 0.15625 -vt 0.75 0.3125 -vt 0.75 0.3125 -vt 0.75 0.15625 -vt 0.75 0.15625 -vt 0.75 0.3125 -vt 0.5 0.3125 -vt 0.5 0.3125 -vt 0.75 0.3125 -vt 1 0.3125 -vt 0.75 0.3125 -vt 0.75 0.3125 -vt 1 0.3125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_f88b8145-cdbb-8011-03d2-81deb45b4e43 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/villager.obj b/renderer/viewer/three/entity/models/villager.obj deleted file mode 100644 index 73462472..00000000 --- a/renderer/viewer/three/entity/models/villager.obj +++ /dev/null @@ -1,509 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o body -v 0.25 1.5 0.1875 -v 0.25 1.5 -0.1875 -v 0.25 0.75 0.1875 -v 0.25 0.75 -0.1875 -v -0.25 1.5 -0.1875 -v -0.25 1.5 0.1875 -v -0.25 0.75 -0.1875 -v -0.25 0.75 0.1875 -vt 0.34375 0.59375 -vt 0.46875 0.59375 -vt 0.46875 0.40625 -vt 0.34375 0.40625 -vt 0.25 0.59375 -vt 0.34375 0.59375 -vt 0.34375 0.40625 -vt 0.25 0.40625 -vt 0.5625 0.59375 -vt 0.6875 0.59375 -vt 0.6875 0.40625 -vt 0.5625 0.40625 -vt 0.46875 0.59375 -vt 0.5625 0.59375 -vt 0.5625 0.40625 -vt 0.46875 0.40625 -vt 0.46875 0.59375 -vt 0.34375 0.59375 -vt 0.34375 0.6875 -vt 0.46875 0.6875 -vt 0.59375 0.6875 -vt 0.46875 0.6875 -vt 0.46875 0.59375 -vt 0.59375 0.59375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o body -v 0.28125 1.53125 0.21875 -v 0.28125 1.53125 -0.21875 -v 0.28125 0.34375 0.21875 -v 0.28125 0.34375 -0.21875 -v -0.28125 1.53125 -0.21875 -v -0.28125 1.53125 0.21875 -v -0.28125 0.34375 -0.21875 -v -0.28125 0.34375 0.21875 -vt 0.09375 0.3125 -vt 0.21875 0.3125 -vt 0.21875 0.03125 -vt 0.09375 0.03125 -vt 0 0.3125 -vt 0.09375 0.3125 -vt 0.09375 0.03125 -vt 0 0.03125 -vt 0.3125 0.3125 -vt 0.4375 0.3125 -vt 0.4375 0.03125 -vt 0.3125 0.03125 -vt 0.21875 0.3125 -vt 0.3125 0.3125 -vt 0.3125 0.03125 -vt 0.21875 0.03125 -vt 0.21875 0.3125 -vt 0.09375 0.3125 -vt 0.09375 0.40625 -vt 0.21875 0.40625 -vt 0.34375 0.40625 -vt 0.21875 0.40625 -vt 0.21875 0.3125 -vt 0.34375 0.3125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o head -v 0.25 2.125 0.25 -v 0.25 2.125 -0.25 -v 0.25 1.5 0.25 -v 0.25 1.5 -0.25 -v -0.25 2.125 -0.25 -v -0.25 2.125 0.25 -v -0.25 1.5 -0.25 -v -0.25 1.5 0.25 -vt 0.125 0.875 -vt 0.25 0.875 -vt 0.25 0.71875 -vt 0.125 0.71875 -vt 0 0.875 -vt 0.125 0.875 -vt 0.125 0.71875 -vt 0 0.71875 -vt 0.375 0.875 -vt 0.5 0.875 -vt 0.5 0.71875 -vt 0.375 0.71875 -vt 0.25 0.875 -vt 0.375 0.875 -vt 0.375 0.71875 -vt 0.25 0.71875 -vt 0.25 0.875 -vt 0.125 0.875 -vt 0.125 1 -vt 0.25 1 -vt 0.375 1 -vt 0.25 1 -vt 0.25 0.875 -vt 0.375 0.875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o helmet -v 0.28125 2.15625 0.28125 -v 0.28125 2.15625 -0.28125 -v 0.28125 1.46875 0.28125 -v 0.28125 1.46875 -0.28125 -v -0.28125 2.15625 -0.28125 -v -0.28125 2.15625 0.28125 -v -0.28125 1.46875 -0.28125 -v -0.28125 1.46875 0.28125 -vt 0.625 0.875 -vt 0.75 0.875 -vt 0.75 0.71875 -vt 0.625 0.71875 -vt 0.5 0.875 -vt 0.625 0.875 -vt 0.625 0.71875 -vt 0.5 0.71875 -vt 0.875 0.875 -vt 1 0.875 -vt 1 0.71875 -vt 0.875 0.71875 -vt 0.75 0.875 -vt 0.875 0.875 -vt 0.875 0.71875 -vt 0.75 0.71875 -vt 0.75 0.875 -vt 0.625 0.875 -vt 0.625 1 -vt 0.75 1 -vt 0.875 1 -vt 0.75 1 -vt 0.75 0.875 -vt 0.875 0.875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o brim -v 0.5062500000000001 1.80625 0.5062500000000001 -v 0.5062500000000001 1.88125 0.5062500000000001 -v 0.5062500000000001 1.80625 -0.5062500000000001 -v 0.5062500000000001 1.8812499999999996 -0.5062500000000001 -v -0.50625 1.88125 0.5062500000000001 -v -0.50625 1.80625 0.5062500000000001 -v -0.50625 1.8812499999999996 -0.5062500000000001 -v -0.50625 1.80625 -0.5062500000000001 -vt 0.484375 0.25 -vt 0.734375 0.25 -vt 0.734375 0 -vt 0.484375 0 -vt 0.46875 0.25 -vt 0.484375 0.25 -vt 0.484375 0 -vt 0.46875 0 -vt 0.75 0.25 -vt 1 0.25 -vt 1 0 -vt 0.75 0 -vt 0.734375 0.25 -vt 0.75 0.25 -vt 0.75 0 -vt 0.734375 0 -vt 0.734375 0.25 -vt 0.484375 0.25 -vt 0.484375 0.265625 -vt 0.734375 0.265625 -vt 0.984375 0.265625 -vt 0.734375 0.265625 -vt 0.734375 0.25 -vt 0.984375 0.25 -vn 0 1 -2.220446049250313e-16 -vn 1 0 0 -vn 0 -1 2.220446049250313e-16 -vn -1 0 0 -vn 0 2.220446049250313e-16 1 -vn 0 -2.220446049250313e-16 -1 -usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o nose -v 0.0625 1.6875 -0.25 -v 0.0625 1.6875 -0.375 -v 0.0625 1.4375 -0.25 -v 0.0625 1.4375 -0.375 -v -0.0625 1.6875 -0.375 -v -0.0625 1.6875 -0.25 -v -0.0625 1.4375 -0.375 -v -0.0625 1.4375 -0.25 -vt 0.40625 0.96875 -vt 0.4375 0.96875 -vt 0.4375 0.90625 -vt 0.40625 0.90625 -vt 0.375 0.96875 -vt 0.40625 0.96875 -vt 0.40625 0.90625 -vt 0.375 0.90625 -vt 0.46875 0.96875 -vt 0.5 0.96875 -vt 0.5 0.90625 -vt 0.46875 0.90625 -vt 0.4375 0.96875 -vt 0.46875 0.96875 -vt 0.46875 0.90625 -vt 0.4375 0.90625 -vt 0.4375 0.96875 -vt 0.40625 0.96875 -vt 0.40625 1 -vt 0.4375 1 -vt 0.46875 1 -vt 0.4375 1 -vt 0.4375 0.96875 -vt 0.46875 0.96875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o arms -v 0.25 1.198223304703363 0 -v 0.25 1.375 -0.17677669529663698 -v 0.25 1.0214466094067263 -0.17677669529663698 -v 0.25 1.1982233047033632 -0.35355339059327373 -v -0.25 1.375 -0.17677669529663698 -v -0.25 1.198223304703363 0 -v -0.25 1.1982233047033632 -0.35355339059327373 -v -0.25 1.0214466094067263 -0.17677669529663698 -vt 0.6875 0.34375 -vt 0.8125 0.34375 -vt 0.8125 0.28125 -vt 0.6875 0.28125 -vt 0.625 0.34375 -vt 0.6875 0.34375 -vt 0.6875 0.28125 -vt 0.625 0.28125 -vt 0.875 0.34375 -vt 1 0.34375 -vt 1 0.28125 -vt 0.875 0.28125 -vt 0.8125 0.34375 -vt 0.875 0.34375 -vt 0.875 0.28125 -vt 0.8125 0.28125 -vt 0.8125 0.34375 -vt 0.6875 0.34375 -vt 0.6875 0.40625 -vt 0.8125 0.40625 -vt 0.9375 0.40625 -vt 0.8125 0.40625 -vt 0.8125 0.34375 -vt 0.9375 0.34375 -vn 0 0.7071067811865476 -0.7071067811865475 -vn 1 0 0 -vn 0 -0.7071067811865476 0.7071067811865475 -vn -1 0 0 -vn 0 0.7071067811865475 0.7071067811865476 -vn 0 -0.7071067811865475 -0.7071067811865476 -usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o arms -v 0.5 1.375 0.17677669529663698 -v 0.5 1.551776695296637 0 -v 0.5 1.0214466094067263 -0.17677669529663698 -v 0.5 1.1982233047033632 -0.35355339059327373 -v 0.25 1.551776695296637 0 -v 0.25 1.375 0.17677669529663698 -v 0.25 1.1982233047033632 -0.35355339059327373 -v 0.25 1.0214466094067263 -0.17677669529663698 -vt 0.75 0.59375 -vt 0.8125 0.59375 -vt 0.8125 0.46875 -vt 0.75 0.46875 -vt 0.6875 0.59375 -vt 0.75 0.59375 -vt 0.75 0.46875 -vt 0.6875 0.46875 -vt 0.875 0.59375 -vt 0.9375 0.59375 -vt 0.9375 0.46875 -vt 0.875 0.46875 -vt 0.8125 0.59375 -vt 0.875 0.59375 -vt 0.875 0.46875 -vt 0.8125 0.46875 -vt 0.8125 0.59375 -vt 0.75 0.59375 -vt 0.75 0.65625 -vt 0.8125 0.65625 -vt 0.875 0.65625 -vt 0.8125 0.65625 -vt 0.8125 0.59375 -vt 0.875 0.59375 -vn 0 0.7071067811865476 -0.7071067811865475 -vn 1 0 0 -vn 0 -0.7071067811865476 0.7071067811865475 -vn -1 0 0 -vn 0 0.7071067811865475 0.7071067811865476 -vn 0 -0.7071067811865475 -0.7071067811865476 -usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o arms -v -0.25 1.375 0.17677669529663698 -v -0.25 1.551776695296637 0 -v -0.25 1.0214466094067263 -0.17677669529663698 -v -0.25 1.1982233047033632 -0.35355339059327373 -v -0.5 1.551776695296637 0 -v -0.5 1.375 0.17677669529663698 -v -0.5 1.1982233047033632 -0.35355339059327373 -v -0.5 1.0214466094067263 -0.17677669529663698 -vt 0.8125 0.59375 -vt 0.75 0.59375 -vt 0.75 0.46875 -vt 0.8125 0.46875 -vt 0.875 0.59375 -vt 0.8125 0.59375 -vt 0.8125 0.46875 -vt 0.875 0.46875 -vt 0.9375 0.59375 -vt 0.875 0.59375 -vt 0.875 0.46875 -vt 0.9375 0.46875 -vt 0.75 0.59375 -vt 0.6875 0.59375 -vt 0.6875 0.46875 -vt 0.75 0.46875 -vt 0.75 0.59375 -vt 0.8125 0.59375 -vt 0.8125 0.65625 -vt 0.75 0.65625 -vt 0.8125 0.65625 -vt 0.875 0.65625 -vt 0.875 0.59375 -vt 0.8125 0.59375 -vn 0 0.7071067811865476 -0.7071067811865475 -vn 1 0 0 -vn 0 -0.7071067811865476 0.7071067811865475 -vn -1 0 0 -vn 0 0.7071067811865475 0.7071067811865476 -vn 0 -0.7071067811865475 -0.7071067811865476 -usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o leg0 -v 0.25 0.75 0.125 -v 0.25 0.75 -0.125 -v 0.25 0 0.125 -v 0.25 0 -0.125 -v 0 0.75 -0.125 -v 0 0.75 0.125 -v 0 0 -0.125 -v 0 0 0.125 -vt 0.0625 0.59375 -vt 0.125 0.59375 -vt 0.125 0.40625 -vt 0.0625 0.40625 -vt 0 0.59375 -vt 0.0625 0.59375 -vt 0.0625 0.40625 -vt 0 0.40625 -vt 0.1875 0.59375 -vt 0.25 0.59375 -vt 0.25 0.40625 -vt 0.1875 0.40625 -vt 0.125 0.59375 -vt 0.1875 0.59375 -vt 0.1875 0.40625 -vt 0.125 0.40625 -vt 0.125 0.59375 -vt 0.0625 0.59375 -vt 0.0625 0.65625 -vt 0.125 0.65625 -vt 0.1875 0.65625 -vt 0.125 0.65625 -vt 0.125 0.59375 -vt 0.1875 0.59375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o leg1 -v 0 0.75 0.125 -v 0 0.75 -0.125 -v 0 0 0.125 -v 0 0 -0.125 -v -0.25 0.75 -0.125 -v -0.25 0.75 0.125 -v -0.25 0 -0.125 -v -0.25 0 0.125 -vt 0.125 0.59375 -vt 0.0625 0.59375 -vt 0.0625 0.40625 -vt 0.125 0.40625 -vt 0.1875 0.59375 -vt 0.125 0.59375 -vt 0.125 0.40625 -vt 0.1875 0.40625 -vt 0.25 0.59375 -vt 0.1875 0.59375 -vt 0.1875 0.40625 -vt 0.25 0.40625 -vt 0.0625 0.59375 -vt 0 0.59375 -vt 0 0.40625 -vt 0.0625 0.40625 -vt 0.0625 0.59375 -vt 0.125 0.59375 -vt 0.125 0.65625 -vt 0.0625 0.65625 -vt 0.125 0.65625 -vt 0.1875 0.65625 -vt 0.1875 0.59375 -vt 0.125 0.59375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b4465c9b-59e0-9882-a652-f0428980cb6e -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/warden.obj b/renderer/viewer/three/entity/models/warden.obj deleted file mode 100644 index da0b2656..00000000 --- a/renderer/viewer/three/entity/models/warden.obj +++ /dev/null @@ -1,463 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o body -v 0.5625 2.125 0.4375 -v 0.5625 2.125 -0.25 -v 0.5625 0.8125 0.4375 -v 0.5625 0.8125 -0.25 -v -0.5625 2.125 -0.25 -v -0.5625 2.125 0.4375 -v -0.5625 0.8125 -0.25 -v -0.5625 0.8125 0.4375 -vt 0.0859375 0.9140625 -vt 0.2265625 0.9140625 -vt 0.2265625 0.75 -vt 0.0859375 0.75 -vt 0 0.9140625 -vt 0.0859375 0.9140625 -vt 0.0859375 0.75 -vt 0 0.75 -vt 0.3125 0.9140625 -vt 0.453125 0.9140625 -vt 0.453125 0.75 -vt 0.3125 0.75 -vt 0.2265625 0.9140625 -vt 0.3125 0.9140625 -vt 0.3125 0.75 -vt 0.2265625 0.75 -vt 0.2265625 0.9140625 -vt 0.0859375 0.9140625 -vt 0.0859375 1 -vt 0.2265625 1 -vt 0.3671875 1 -vt 0.2265625 1 -vt 0.2265625 0.9140625 -vt 0.3671875 0.9140625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o right_ribcage -v 0.5625 2.125 -0.25625 -v 0.5625 2.125 -0.25625 -v 0.5625 0.8125 -0.25625 -v 0.5625 0.8125 -0.25625 -v 0 2.125 -0.25625 -v 0 2.125 -0.25625 -v 0 0.8125 -0.25625 -v 0 0.8125 -0.25625 -vt 0.703125 0.9140625 -vt 0.7734375 0.9140625 -vt 0.7734375 0.75 -vt 0.703125 0.75 -vt 0.703125 0.9140625 -vt 0.703125 0.9140625 -vt 0.703125 0.75 -vt 0.703125 0.75 -vt 0.7734375 0.9140625 -vt 0.84375 0.9140625 -vt 0.84375 0.75 -vt 0.7734375 0.75 -vt 0.7734375 0.9140625 -vt 0.7734375 0.9140625 -vt 0.7734375 0.75 -vt 0.7734375 0.75 -vt 0.7734375 0.9140625 -vt 0.703125 0.9140625 -vt 0.703125 0.9140625 -vt 0.7734375 0.9140625 -vt 0.84375 0.9140625 -vt 0.7734375 0.9140625 -vt 0.7734375 0.9140625 -vt 0.84375 0.9140625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o left_ribcage -v 0 2.125 -0.25625 -v 0 2.125 -0.25625 -v 0 0.8125 -0.25625 -v 0 0.8125 -0.25625 -v -0.5625 2.125 -0.25625 -v -0.5625 2.125 -0.25625 -v -0.5625 0.8125 -0.25625 -v -0.5625 0.8125 -0.25625 -vt 0.7734375 0.9140625 -vt 0.703125 0.9140625 -vt 0.703125 0.75 -vt 0.7734375 0.75 -vt 0.7734375 0.9140625 -vt 0.7734375 0.9140625 -vt 0.7734375 0.75 -vt 0.7734375 0.75 -vt 0.84375 0.9140625 -vt 0.7734375 0.9140625 -vt 0.7734375 0.75 -vt 0.84375 0.75 -vt 0.703125 0.9140625 -vt 0.703125 0.9140625 -vt 0.703125 0.75 -vt 0.703125 0.75 -vt 0.703125 0.9140625 -vt 0.7734375 0.9140625 -vt 0.7734375 0.9140625 -vt 0.703125 0.9140625 -vt 0.7734375 0.9140625 -vt 0.84375 0.9140625 -vt 0.84375 0.9140625 -vt 0.7734375 0.9140625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o head -v 0.5 3.125 0.3125 -v 0.5 3.125 -0.3125 -v 0.5 2.125 0.3125 -v 0.5 2.125 -0.3125 -v -0.5 3.125 -0.3125 -v -0.5 3.125 0.3125 -v -0.5 2.125 -0.3125 -v -0.5 2.125 0.3125 -vt 0.078125 0.671875 -vt 0.203125 0.671875 -vt 0.203125 0.546875 -vt 0.078125 0.546875 -vt 0 0.671875 -vt 0.078125 0.671875 -vt 0.078125 0.546875 -vt 0 0.546875 -vt 0.28125 0.671875 -vt 0.40625 0.671875 -vt 0.40625 0.546875 -vt 0.28125 0.546875 -vt 0.203125 0.671875 -vt 0.28125 0.671875 -vt 0.28125 0.546875 -vt 0.203125 0.546875 -vt 0.203125 0.671875 -vt 0.078125 0.671875 -vt 0.078125 0.75 -vt 0.203125 0.75 -vt 0.328125 0.75 -vt 0.203125 0.75 -vt 0.203125 0.671875 -vt 0.328125 0.671875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o right_tendril -v 1.5 3.6875 0 -v 1.5 3.6875 0 -v 1.5 2.6875 0 -v 1.5 2.6875 0 -v 0.5 3.6875 0 -v 0.5 3.6875 0 -v 0.5 2.6875 0 -v 0.5 2.6875 0 -vt 0.40625 0.75 -vt 0.53125 0.75 -vt 0.53125 0.625 -vt 0.40625 0.625 -vt 0.40625 0.75 -vt 0.40625 0.75 -vt 0.40625 0.625 -vt 0.40625 0.625 -vt 0.53125 0.75 -vt 0.65625 0.75 -vt 0.65625 0.625 -vt 0.53125 0.625 -vt 0.53125 0.75 -vt 0.53125 0.75 -vt 0.53125 0.625 -vt 0.53125 0.625 -vt 0.53125 0.75 -vt 0.40625 0.75 -vt 0.40625 0.75 -vt 0.53125 0.75 -vt 0.65625 0.75 -vt 0.53125 0.75 -vt 0.53125 0.75 -vt 0.65625 0.75 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o left_tendril -v -0.5 3.6875 0 -v -0.5 3.6875 0 -v -0.5 2.6875 0 -v -0.5 2.6875 0 -v -1.5 3.6875 0 -v -1.5 3.6875 0 -v -1.5 2.6875 0 -v -1.5 2.6875 0 -vt 0.453125 1 -vt 0.578125 1 -vt 0.578125 0.875 -vt 0.453125 0.875 -vt 0.453125 1 -vt 0.453125 1 -vt 0.453125 0.875 -vt 0.453125 0.875 -vt 0.578125 1 -vt 0.703125 1 -vt 0.703125 0.875 -vt 0.578125 0.875 -vt 0.578125 1 -vt 0.578125 1 -vt 0.578125 0.875 -vt 0.578125 0.875 -vt 0.578125 1 -vt 0.453125 1 -vt 0.453125 1 -vt 0.578125 1 -vt 0.703125 1 -vt 0.578125 1 -vt 0.578125 1 -vt 0.703125 1 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o right_arm -v 1.0625 2.125 0.3125 -v 1.0625 2.125 -0.1875 -v 1.0625 0.375 0.3125 -v 1.0625 0.375 -0.1875 -v 0.5625 2.125 -0.1875 -v 0.5625 2.125 0.3125 -v 0.5625 0.375 -0.1875 -v 0.5625 0.375 0.3125 -vt 0.40625 0.546875 -vt 0.46875 0.546875 -vt 0.46875 0.328125 -vt 0.40625 0.328125 -vt 0.34375 0.546875 -vt 0.40625 0.546875 -vt 0.40625 0.328125 -vt 0.34375 0.328125 -vt 0.53125 0.546875 -vt 0.59375 0.546875 -vt 0.59375 0.328125 -vt 0.53125 0.328125 -vt 0.46875 0.546875 -vt 0.53125 0.546875 -vt 0.53125 0.328125 -vt 0.46875 0.328125 -vt 0.46875 0.546875 -vt 0.40625 0.546875 -vt 0.40625 0.609375 -vt 0.46875 0.609375 -vt 0.53125 0.609375 -vt 0.46875 0.609375 -vt 0.46875 0.546875 -vt 0.53125 0.546875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o left_arm -v -0.5625 2.125 0.3125 -v -0.5625 2.125 -0.1875 -v -0.5625 0.375 0.3125 -v -0.5625 0.375 -0.1875 -v -1.0625 2.125 -0.1875 -v -1.0625 2.125 0.3125 -v -1.0625 0.375 -0.1875 -v -1.0625 0.375 0.3125 -vt 0.0625 0.484375 -vt 0.125 0.484375 -vt 0.125 0.265625 -vt 0.0625 0.265625 -vt 0 0.484375 -vt 0.0625 0.484375 -vt 0.0625 0.265625 -vt 0 0.265625 -vt 0.1875 0.484375 -vt 0.25 0.484375 -vt 0.25 0.265625 -vt 0.1875 0.265625 -vt 0.125 0.484375 -vt 0.1875 0.484375 -vt 0.1875 0.265625 -vt 0.125 0.265625 -vt 0.125 0.484375 -vt 0.0625 0.484375 -vt 0.0625 0.546875 -vt 0.125 0.546875 -vt 0.1875 0.546875 -vt 0.125 0.546875 -vt 0.125 0.484375 -vt 0.1875 0.484375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o right_leg -v 0.5625 0.8125 0.1875 -v 0.5625 0.8125 -0.1875 -v 0.5625 0 0.1875 -v 0.5625 0 -0.1875 -v 0.1875 0.8125 -0.1875 -v 0.1875 0.8125 0.1875 -v 0.1875 0 -0.1875 -v 0.1875 0 0.1875 -vt 0.640625 0.578125 -vt 0.6875 0.578125 -vt 0.6875 0.4765625 -vt 0.640625 0.4765625 -vt 0.59375 0.578125 -vt 0.640625 0.578125 -vt 0.640625 0.4765625 -vt 0.59375 0.4765625 -vt 0.734375 0.578125 -vt 0.78125 0.578125 -vt 0.78125 0.4765625 -vt 0.734375 0.4765625 -vt 0.6875 0.578125 -vt 0.734375 0.578125 -vt 0.734375 0.4765625 -vt 0.6875 0.4765625 -vt 0.6875 0.578125 -vt 0.640625 0.578125 -vt 0.640625 0.625 -vt 0.6875 0.625 -vt 0.734375 0.625 -vt 0.6875 0.625 -vt 0.6875 0.578125 -vt 0.734375 0.578125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o left_leg -v -0.1875 0.8125 0.1875 -v -0.1875 0.8125 -0.1875 -v -0.1875 0 0.1875 -v -0.1875 0 -0.1875 -v -0.5625 0.8125 -0.1875 -v -0.5625 0.8125 0.1875 -v -0.5625 0 -0.1875 -v -0.5625 0 0.1875 -vt 0.640625 0.359375 -vt 0.6875 0.359375 -vt 0.6875 0.2578125 -vt 0.640625 0.2578125 -vt 0.59375 0.359375 -vt 0.640625 0.359375 -vt 0.640625 0.2578125 -vt 0.59375 0.2578125 -vt 0.734375 0.359375 -vt 0.78125 0.359375 -vt 0.78125 0.2578125 -vt 0.734375 0.2578125 -vt 0.6875 0.359375 -vt 0.734375 0.359375 -vt 0.734375 0.2578125 -vt 0.6875 0.2578125 -vt 0.6875 0.359375 -vt 0.640625 0.359375 -vt 0.640625 0.40625 -vt 0.6875 0.40625 -vt 0.734375 0.40625 -vt 0.6875 0.40625 -vt 0.6875 0.359375 -vt 0.734375 0.359375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_b8aa60f9-5a7d-baf1-aee9-852f731e91b8 -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/witch.obj b/renderer/viewer/three/entity/models/witch.obj deleted file mode 100644 index 275da643..00000000 --- a/renderer/viewer/three/entity/models/witch.obj +++ /dev/null @@ -1,647 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o head -v 0.25 2.125 0.25 -v 0.25 2.125 -0.25 -v 0.25 1.5 0.25 -v 0.25 1.5 -0.25 -v -0.25 2.125 -0.25 -v -0.25 2.125 0.25 -v -0.25 1.5 -0.25 -v -0.25 1.5 0.25 -vt 0.125 0.9375 -vt 0.25 0.9375 -vt 0.25 0.859375 -vt 0.125 0.859375 -vt 0 0.9375 -vt 0.125 0.9375 -vt 0.125 0.859375 -vt 0 0.859375 -vt 0.375 0.9375 -vt 0.5 0.9375 -vt 0.5 0.859375 -vt 0.375 0.859375 -vt 0.25 0.9375 -vt 0.375 0.9375 -vt 0.375 0.859375 -vt 0.25 0.859375 -vt 0.25 0.9375 -vt 0.125 0.9375 -vt 0.125 1 -vt 0.25 1 -vt 0.375 1 -vt 0.25 1 -vt 0.25 0.9375 -vt 0.375 0.9375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o nose -v 0.0625 1.6875 -0.25 -v 0.0625 1.6875 -0.375 -v 0.0625 1.4375 -0.25 -v 0.0625 1.4375 -0.375 -v -0.0625 1.6875 -0.375 -v -0.0625 1.6875 -0.25 -v -0.0625 1.4375 -0.375 -v -0.0625 1.4375 -0.25 -vt 0.40625 0.984375 -vt 0.4375 0.984375 -vt 0.4375 0.953125 -vt 0.40625 0.953125 -vt 0.375 0.984375 -vt 0.40625 0.984375 -vt 0.40625 0.953125 -vt 0.375 0.953125 -vt 0.46875 0.984375 -vt 0.5 0.984375 -vt 0.5 0.953125 -vt 0.46875 0.953125 -vt 0.4375 0.984375 -vt 0.46875 0.984375 -vt 0.46875 0.953125 -vt 0.4375 0.953125 -vt 0.4375 0.984375 -vt 0.40625 0.984375 -vt 0.40625 1 -vt 0.4375 1 -vt 0.46875 1 -vt 0.4375 1 -vt 0.4375 0.984375 -vt 0.46875 0.984375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o nose -v -0.015625 1.609375 -0.375 -v -0.015625 1.609375 -0.40625 -v -0.015625 1.578125 -0.375 -v -0.015625 1.578125 -0.40625 -v -0.046875 1.609375 -0.40625 -v -0.046875 1.609375 -0.375 -v -0.046875 1.578125 -0.40625 -v -0.046875 1.578125 -0.375 -vt 0.015625 0.9921875 -vt 0.03125 0.9921875 -vt 0.03125 0.984375 -vt 0.015625 0.984375 -vt 0 0.9921875 -vt 0.015625 0.9921875 -vt 0.015625 0.984375 -vt 0 0.984375 -vt 0.046875 0.9921875 -vt 0.0625 0.9921875 -vt 0.0625 0.984375 -vt 0.046875 0.984375 -vt 0.03125 0.9921875 -vt 0.046875 0.9921875 -vt 0.046875 0.984375 -vt 0.03125 0.984375 -vt 0.03125 0.9921875 -vt 0.015625 0.9921875 -vt 0.015625 1 -vt 0.03125 1 -vt 0.046875 1 -vt 0.03125 1 -vt 0.03125 0.9921875 -vt 0.046875 0.9921875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o hat -v 0.3125 2.128125 0.3125 -v 0.3125 2.128125 -0.3125 -v 0.3125 2.003125 0.3125 -v 0.3125 2.003125 -0.3125 -v -0.3125 2.128125 -0.3125 -v -0.3125 2.128125 0.3125 -v -0.3125 2.003125 -0.3125 -v -0.3125 2.003125 0.3125 -vt 0.15625 0.421875 -vt 0.3125 0.421875 -vt 0.3125 0.40625 -vt 0.15625 0.40625 -vt 0 0.421875 -vt 0.15625 0.421875 -vt 0.15625 0.40625 -vt 0 0.40625 -vt 0.46875 0.421875 -vt 0.625 0.421875 -vt 0.625 0.40625 -vt 0.46875 0.40625 -vt 0.3125 0.421875 -vt 0.46875 0.421875 -vt 0.46875 0.40625 -vt 0.3125 0.40625 -vt 0.3125 0.421875 -vt 0.15625 0.421875 -vt 0.15625 0.5 -vt 0.3125 0.5 -vt 0.46875 0.5 -vt 0.3125 0.5 -vt 0.3125 0.421875 -vt 0.46875 0.421875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o hat2 -v 0.19420316941970583 2.3448018130595334 0.26781917680283374 -v 0.19360379633542446 2.367690947692347 -0.16908124465229235 -v 0.20073843784720224 2.0952299807209473 0.2547351877420978 -v 0.20013906476292087 2.118119115353761 -0.18216523371302834 -v -0.24374628334138193 2.3562385328076525 -0.16908124465229235 -v -0.24314691025710045 2.333349398174839 0.26781917680283374 -v -0.2372110149138854 2.1066667004690665 -0.18216523371302834 -v -0.23661164182960404 2.083777565836253 0.2547351877420978 -vt 0.109375 0.3515625 -vt 0.21875 0.3515625 -vt 0.21875 0.3203125 -vt 0.109375 0.3203125 -vt 0 0.3515625 -vt 0.109375 0.3515625 -vt 0.109375 0.3203125 -vt 0 0.3203125 -vt 0.328125 0.3515625 -vt 0.4375 0.3515625 -vt 0.4375 0.3203125 -vt 0.328125 0.3203125 -vt 0.21875 0.3515625 -vt 0.328125 0.3515625 -vt 0.328125 0.3203125 -vt 0.21875 0.3203125 -vt 0.21875 0.3515625 -vt 0.109375 0.3515625 -vt 0.109375 0.40625 -vt 0.21875 0.40625 -vt 0.328125 0.40625 -vt 0.21875 0.40625 -vt 0.21875 0.3515625 -vt 0.328125 0.3515625 -vn -0.0013699956212146517 0.052318022017859046 -0.998629534754574 -vn 0.9996573249755573 0.026176948307873146 -2.168404344971009e-19 -vn 0.0013699956212146517 -0.052318022017859046 0.998629534754574 -vn -0.9996573249755573 -0.026176948307873146 2.168404344971009e-19 -vn -0.02614107370998589 0.9982873293543426 0.05233595624294382 -vn 0.02614107370998589 -0.9982873293543426 -0.05233595624294382 -usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o hat3 -v 0.06205916642018039 2.5318108508382715 0.25085017875105275 -v 0.059669177777630145 2.5708345128476795 0.003926219286475963 -v 0.08152178038959057 2.2856541582304613 0.21175939541454591 -v 0.07913179174704033 2.3246778202398692 -0.03516456405003088 -v -0.1895606250384982 2.5512376639234398 0.0032414562075101516 -v -0.187170636395948 2.5122140019140318 0.25016541567208694 -v -0.17009801106908795 2.3050809713156295 -0.03584932712899669 -v -0.1677080224265377 2.2660573093062215 0.2110746323355801 -vt 0.0625 0.2890625 -vt 0.125 0.2890625 -vt 0.125 0.2578125 -vt 0.0625 0.2578125 -vt 0 0.2890625 -vt 0.0625 0.2890625 -vt 0.0625 0.2578125 -vt 0 0.2578125 -vt 0.1875 0.2890625 -vt 0.25 0.2890625 -vt 0.25 0.2578125 -vt 0.1875 0.2578125 -vt 0.125 0.2890625 -vt 0.1875 0.2890625 -vt 0.1875 0.2578125 -vt 0.125 0.2578125 -vt 0.125 0.2890625 -vt 0.0625 0.2890625 -vt 0.0625 0.3203125 -vt 0.125 0.3203125 -vt 0.1875 0.3203125 -vt 0.125 0.3203125 -vt 0.125 0.2890625 -vt 0.1875 0.2890625 -vn -0.009559954570200835 0.156094648037632 -0.9876958378583074 -vn 0.9969192112645133 0.07838739569696003 0.002739052315863333 -vn 0.009559954570200835 -0.156094648037632 0.9876958378583074 -vn -0.9969192112645133 -0.07838739569696003 -0.002739052315863333 -vn -0.07785045587764094 0.9846267704312412 0.1563631333460272 -vn 0.07785045587764094 -0.9846267704312412 -0.1563631333460272 -usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o hat4 -v -0.06724991963009147 2.6297151428282426 0.2756843667494786 -v -0.07166686964939262 2.6629564553960905 0.18813684713130974 -v -0.03980089941132947 2.486376747492985 0.21987470619018534 -v -0.04421784943063062 2.519618060060833 0.1323271865720166 -v -0.16385315668047867 2.645999001844819 0.18634918036183534 -v -0.15943620666117758 2.6127576892769713 0.2738966999800041 -v -0.13640413646171662 2.502660606509562 0.1305395198025422 -v -0.13198718644241553 2.469419293941714 0.21808703942071106 -vt 0.015625 0.25 -vt 0.03125 0.25 -vt 0.03125 0.234375 -vt 0.015625 0.234375 -vt 0 0.25 -vt 0.015625 0.25 -vt 0.015625 0.234375 -vt 0 0.234375 -vt 0.046875 0.25 -vt 0.0625 0.25 -vt 0.0625 0.234375 -vt 0.046875 0.234375 -vt 0.03125 0.25 -vt 0.046875 0.25 -vt 0.046875 0.234375 -vt 0.03125 0.234375 -vt 0.03125 0.25 -vt 0.015625 0.25 -vt 0.015625 0.2578125 -vt 0.03125 0.2578125 -vt 0.046875 0.2578125 -vt 0.03125 0.2578125 -vt 0.03125 0.25 -vt 0.046875 0.25 -vn -0.04711413353921201 0.3545740007237079 -0.9338402092604674 -vn 0.9833203949982517 0.18087950454689375 0.019068445541060658 -vn 0.04711413353921201 -0.3545740007237079 0.9338402092604674 -vn -0.9833203949982517 -0.18087950454689375 -0.019068445541060658 -vn -0.17567372940007692 0.9173657301456462 0.3571818275794757 -vn 0.17567372940007692 -0.9173657301456462 -0.3571818275794757 -usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o body -v 0.25 1.5 0.1875 -v 0.25 1.5 -0.1875 -v 0.25 0.75 0.1875 -v 0.25 0.75 -0.1875 -v -0.25 1.5 -0.1875 -v -0.25 1.5 0.1875 -v -0.25 0.75 -0.1875 -v -0.25 0.75 0.1875 -vt 0.34375 0.796875 -vt 0.46875 0.796875 -vt 0.46875 0.703125 -vt 0.34375 0.703125 -vt 0.25 0.796875 -vt 0.34375 0.796875 -vt 0.34375 0.703125 -vt 0.25 0.703125 -vt 0.5625 0.796875 -vt 0.6875 0.796875 -vt 0.6875 0.703125 -vt 0.5625 0.703125 -vt 0.46875 0.796875 -vt 0.5625 0.796875 -vt 0.5625 0.703125 -vt 0.46875 0.703125 -vt 0.46875 0.796875 -vt 0.34375 0.796875 -vt 0.34375 0.84375 -vt 0.46875 0.84375 -vt 0.59375 0.84375 -vt 0.46875 0.84375 -vt 0.46875 0.796875 -vt 0.59375 0.796875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o body -v 0.28125 1.53125 0.21875 -v 0.28125 1.53125 -0.21875 -v 0.28125 0.34375 0.21875 -v 0.28125 0.34375 -0.21875 -v -0.28125 1.53125 -0.21875 -v -0.28125 1.53125 0.21875 -v -0.28125 0.34375 -0.21875 -v -0.28125 0.34375 0.21875 -vt 0.09375 0.65625 -vt 0.21875 0.65625 -vt 0.21875 0.515625 -vt 0.09375 0.515625 -vt 0 0.65625 -vt 0.09375 0.65625 -vt 0.09375 0.515625 -vt 0 0.515625 -vt 0.3125 0.65625 -vt 0.4375 0.65625 -vt 0.4375 0.515625 -vt 0.3125 0.515625 -vt 0.21875 0.65625 -vt 0.3125 0.65625 -vt 0.3125 0.515625 -vt 0.21875 0.515625 -vt 0.21875 0.65625 -vt 0.09375 0.65625 -vt 0.09375 0.703125 -vt 0.21875 0.703125 -vt 0.34375 0.703125 -vt 0.21875 0.703125 -vt 0.21875 0.65625 -vt 0.34375 0.65625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o arms -v 0.25 1.198223304703363 0 -v 0.25 1.375 -0.17677669529663698 -v 0.25 1.0214466094067263 -0.17677669529663698 -v 0.25 1.1982233047033632 -0.35355339059327373 -v -0.25 1.375 -0.17677669529663698 -v -0.25 1.198223304703363 0 -v -0.25 1.1982233047033632 -0.35355339059327373 -v -0.25 1.0214466094067263 -0.17677669529663698 -vt 0.6875 0.671875 -vt 0.8125 0.671875 -vt 0.8125 0.640625 -vt 0.6875 0.640625 -vt 0.625 0.671875 -vt 0.6875 0.671875 -vt 0.6875 0.640625 -vt 0.625 0.640625 -vt 0.875 0.671875 -vt 1 0.671875 -vt 1 0.640625 -vt 0.875 0.640625 -vt 0.8125 0.671875 -vt 0.875 0.671875 -vt 0.875 0.640625 -vt 0.8125 0.640625 -vt 0.8125 0.671875 -vt 0.6875 0.671875 -vt 0.6875 0.703125 -vt 0.8125 0.703125 -vt 0.9375 0.703125 -vt 0.8125 0.703125 -vt 0.8125 0.671875 -vt 0.9375 0.671875 -vn 0 0.7071067811865476 -0.7071067811865475 -vn 1 0 0 -vn 0 -0.7071067811865476 0.7071067811865475 -vn -1 0 0 -vn 0 0.7071067811865475 0.7071067811865476 -vn 0 -0.7071067811865475 -0.7071067811865476 -usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o arms -v 0.5 1.375 0.17677669529663698 -v 0.5 1.551776695296637 0 -v 0.5 1.0214466094067263 -0.17677669529663698 -v 0.5 1.1982233047033632 -0.35355339059327373 -v 0.25 1.551776695296637 0 -v 0.25 1.375 0.17677669529663698 -v 0.25 1.1982233047033632 -0.35355339059327373 -v 0.25 1.0214466094067263 -0.17677669529663698 -vt 0.75 0.796875 -vt 0.8125 0.796875 -vt 0.8125 0.734375 -vt 0.75 0.734375 -vt 0.6875 0.796875 -vt 0.75 0.796875 -vt 0.75 0.734375 -vt 0.6875 0.734375 -vt 0.875 0.796875 -vt 0.9375 0.796875 -vt 0.9375 0.734375 -vt 0.875 0.734375 -vt 0.8125 0.796875 -vt 0.875 0.796875 -vt 0.875 0.734375 -vt 0.8125 0.734375 -vt 0.8125 0.796875 -vt 0.75 0.796875 -vt 0.75 0.828125 -vt 0.8125 0.828125 -vt 0.875 0.828125 -vt 0.8125 0.828125 -vt 0.8125 0.796875 -vt 0.875 0.796875 -vn 0 0.7071067811865476 -0.7071067811865475 -vn 1 0 0 -vn 0 -0.7071067811865476 0.7071067811865475 -vn -1 0 0 -vn 0 0.7071067811865475 0.7071067811865476 -vn 0 -0.7071067811865475 -0.7071067811865476 -usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 -o arms -v -0.25 1.375 0.17677669529663698 -v -0.25 1.551776695296637 0 -v -0.25 1.0214466094067263 -0.17677669529663698 -v -0.25 1.1982233047033632 -0.35355339059327373 -v -0.5 1.551776695296637 0 -v -0.5 1.375 0.17677669529663698 -v -0.5 1.1982233047033632 -0.35355339059327373 -v -0.5 1.0214466094067263 -0.17677669529663698 -vt 0.75 0.796875 -vt 0.8125 0.796875 -vt 0.8125 0.734375 -vt 0.75 0.734375 -vt 0.6875 0.796875 -vt 0.75 0.796875 -vt 0.75 0.734375 -vt 0.6875 0.734375 -vt 0.875 0.796875 -vt 0.9375 0.796875 -vt 0.9375 0.734375 -vt 0.875 0.734375 -vt 0.8125 0.796875 -vt 0.875 0.796875 -vt 0.875 0.734375 -vt 0.8125 0.734375 -vt 0.8125 0.796875 -vt 0.75 0.796875 -vt 0.75 0.828125 -vt 0.8125 0.828125 -vt 0.875 0.828125 -vt 0.8125 0.828125 -vt 0.8125 0.796875 -vt 0.875 0.796875 -vn 0 0.7071067811865476 -0.7071067811865475 -vn 1 0 0 -vn 0 -0.7071067811865476 0.7071067811865475 -vn -1 0 0 -vn 0 0.7071067811865475 0.7071067811865476 -vn 0 -0.7071067811865475 -0.7071067811865476 -usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 -f 92/268/67 95/267/67 93/266/67 90/265/67 -f 91/272/68 92/271/68 90/270/68 89/269/68 -f 96/276/69 91/275/69 89/274/69 94/273/69 -f 95/280/70 96/279/70 94/278/70 93/277/70 -f 94/284/71 89/283/71 90/282/71 93/281/71 -f 95/288/72 92/287/72 91/286/72 96/285/72 -o leg0 -v 0.25 0.75 0.125 -v 0.25 0.75 -0.125 -v 0.25 0 0.125 -v 0.25 0 -0.125 -v 0 0.75 -0.125 -v 0 0.75 0.125 -v 0 0 -0.125 -v 0 0 0.125 -vt 0.0625 0.796875 -vt 0.125 0.796875 -vt 0.125 0.703125 -vt 0.0625 0.703125 -vt 0 0.796875 -vt 0.0625 0.796875 -vt 0.0625 0.703125 -vt 0 0.703125 -vt 0.1875 0.796875 -vt 0.25 0.796875 -vt 0.25 0.703125 -vt 0.1875 0.703125 -vt 0.125 0.796875 -vt 0.1875 0.796875 -vt 0.1875 0.703125 -vt 0.125 0.703125 -vt 0.125 0.796875 -vt 0.0625 0.796875 -vt 0.0625 0.828125 -vt 0.125 0.828125 -vt 0.1875 0.828125 -vt 0.125 0.828125 -vt 0.125 0.796875 -vt 0.1875 0.796875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 -f 100/292/73 103/291/73 101/290/73 98/289/73 -f 99/296/74 100/295/74 98/294/74 97/293/74 -f 104/300/75 99/299/75 97/298/75 102/297/75 -f 103/304/76 104/303/76 102/302/76 101/301/76 -f 102/308/77 97/307/77 98/306/77 101/305/77 -f 103/312/78 100/311/78 99/310/78 104/309/78 -o leg1 -v 0 0.75 0.125 -v 0 0.75 -0.125 -v 0 0 0.125 -v 0 0 -0.125 -v -0.25 0.75 -0.125 -v -0.25 0.75 0.125 -v -0.25 0 -0.125 -v -0.25 0 0.125 -vt 0.0625 0.796875 -vt 0.125 0.796875 -vt 0.125 0.703125 -vt 0.0625 0.703125 -vt 0 0.796875 -vt 0.0625 0.796875 -vt 0.0625 0.703125 -vt 0 0.703125 -vt 0.1875 0.796875 -vt 0.25 0.796875 -vt 0.25 0.703125 -vt 0.1875 0.703125 -vt 0.125 0.796875 -vt 0.1875 0.796875 -vt 0.1875 0.703125 -vt 0.125 0.703125 -vt 0.125 0.796875 -vt 0.0625 0.796875 -vt 0.0625 0.828125 -vt 0.125 0.828125 -vt 0.1875 0.828125 -vt 0.125 0.828125 -vt 0.125 0.796875 -vt 0.1875 0.796875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_5cc249a3-cb80-69af-8be3-aeafeadc66a1 -f 108/316/79 111/315/79 109/314/79 106/313/79 -f 107/320/80 108/319/80 106/318/80 105/317/80 -f 112/324/81 107/323/81 105/322/81 110/321/81 -f 111/328/82 112/327/82 110/326/82 109/325/82 -f 110/332/83 105/331/83 106/330/83 109/329/83 -f 111/336/84 108/335/84 107/334/84 112/333/84 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/wolf.obj b/renderer/viewer/three/entity/models/wolf.obj deleted file mode 100644 index 086cda39..00000000 --- a/renderer/viewer/three/entity/models/wolf.obj +++ /dev/null @@ -1,509 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o head -v 0.25 0.84375 -0.3125 -v 0.25 0.84375 -0.5625 -v 0.25 0.46875 -0.3125 -v 0.25 0.46875 -0.5625 -v -0.125 0.84375 -0.5625 -v -0.125 0.84375 -0.3125 -v -0.125 0.46875 -0.5625 -v -0.125 0.46875 -0.3125 -vt 0.0625 0.875 -vt 0.15625 0.875 -vt 0.15625 0.6875 -vt 0.0625 0.6875 -vt 0 0.875 -vt 0.0625 0.875 -vt 0.0625 0.6875 -vt 0 0.6875 -vt 0.21875 0.875 -vt 0.3125 0.875 -vt 0.3125 0.6875 -vt 0.21875 0.6875 -vt 0.15625 0.875 -vt 0.21875 0.875 -vt 0.21875 0.6875 -vt 0.15625 0.6875 -vt 0.15625 0.875 -vt 0.0625 0.875 -vt 0.0625 1 -vt 0.15625 1 -vt 0.25 1 -vt 0.15625 1 -vt 0.15625 0.875 -vt 0.25 0.875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o head -v 0.25 0.96875 -0.375 -v 0.25 0.96875 -0.4375 -v 0.25 0.84375 -0.375 -v 0.25 0.84375 -0.4375 -v 0.125 0.96875 -0.4375 -v 0.125 0.96875 -0.375 -v 0.125 0.84375 -0.4375 -v 0.125 0.84375 -0.375 -vt 0.265625 0.53125 -vt 0.296875 0.53125 -vt 0.296875 0.46875 -vt 0.265625 0.46875 -vt 0.25 0.53125 -vt 0.265625 0.53125 -vt 0.265625 0.46875 -vt 0.25 0.46875 -vt 0.3125 0.53125 -vt 0.34375 0.53125 -vt 0.34375 0.46875 -vt 0.3125 0.46875 -vt 0.296875 0.53125 -vt 0.3125 0.53125 -vt 0.3125 0.46875 -vt 0.296875 0.46875 -vt 0.296875 0.53125 -vt 0.265625 0.53125 -vt 0.265625 0.5625 -vt 0.296875 0.5625 -vt 0.328125 0.5625 -vt 0.296875 0.5625 -vt 0.296875 0.53125 -vt 0.328125 0.53125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o head -v 0 0.96875 -0.375 -v 0 0.96875 -0.4375 -v 0 0.84375 -0.375 -v 0 0.84375 -0.4375 -v -0.125 0.96875 -0.4375 -v -0.125 0.96875 -0.375 -v -0.125 0.84375 -0.4375 -v -0.125 0.84375 -0.375 -vt 0.265625 0.53125 -vt 0.296875 0.53125 -vt 0.296875 0.46875 -vt 0.265625 0.46875 -vt 0.25 0.53125 -vt 0.265625 0.53125 -vt 0.265625 0.46875 -vt 0.25 0.46875 -vt 0.3125 0.53125 -vt 0.34375 0.53125 -vt 0.34375 0.46875 -vt 0.3125 0.46875 -vt 0.296875 0.53125 -vt 0.3125 0.53125 -vt 0.3125 0.46875 -vt 0.296875 0.46875 -vt 0.296875 0.53125 -vt 0.265625 0.53125 -vt 0.265625 0.5625 -vt 0.296875 0.5625 -vt 0.328125 0.5625 -vt 0.296875 0.5625 -vt 0.296875 0.53125 -vt 0.328125 0.53125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o head -v 0.15625 0.6572268750000001 -0.5 -v 0.15625 0.6572268750000001 -0.75 -v 0.15625 0.469726875 -0.5 -v 0.15625 0.469726875 -0.75 -v -0.03125 0.6572268750000001 -0.75 -v -0.03125 0.6572268750000001 -0.5 -v -0.03125 0.469726875 -0.75 -v -0.03125 0.469726875 -0.5 -vt 0.0625 0.5625 -vt 0.109375 0.5625 -vt 0.109375 0.46875 -vt 0.0625 0.46875 -vt 0 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.46875 -vt 0 0.46875 -vt 0.171875 0.5625 -vt 0.21875 0.5625 -vt 0.21875 0.46875 -vt 0.171875 0.46875 -vt 0.109375 0.5625 -vt 0.171875 0.5625 -vt 0.171875 0.46875 -vt 0.109375 0.46875 -vt 0.109375 0.5625 -vt 0.0625 0.5625 -vt 0.0625 0.6875 -vt 0.109375 0.6875 -vt 0.15625 0.6875 -vt 0.109375 0.6875 -vt 0.109375 0.5625 -vt 0.15625 0.5625 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o body -v 0.25 0.8125 1.1102230246251565e-16 -v 0.25 0.4375 0 -v 0.25 0.8125 0.5625 -v 0.25 0.4375 0.5625 -v -0.125 0.4375 0 -v -0.125 0.8125 1.1102230246251565e-16 -v -0.125 0.4375 0.5625 -v -0.125 0.8125 0.5625 -vt 0.375 0.375 -vt 0.46875 0.375 -vt 0.46875 0.09375 -vt 0.375 0.09375 -vt 0.28125 0.375 -vt 0.375 0.375 -vt 0.375 0.09375 -vt 0.28125 0.09375 -vt 0.5625 0.375 -vt 0.65625 0.375 -vt 0.65625 0.09375 -vt 0.5625 0.09375 -vt 0.46875 0.375 -vt 0.5625 0.375 -vt 0.5625 0.09375 -vt 0.46875 0.09375 -vt 0.46875 0.375 -vt 0.375 0.375 -vt 0.375 0.5625 -vt 0.46875 0.5625 -vt 0.5625 0.5625 -vt 0.46875 0.5625 -vt 0.46875 0.375 -vt 0.5625 0.375 -vn 0 -1 -2.220446049250313e-16 -vn 1 0 0 -vn 0 1 2.220446049250313e-16 -vn -1 0 0 -vn 0 2.220446049250313e-16 -1 -vn 0 -2.220446049250313e-16 1 -usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o upperBody -v 0.3125 0.4375 1.1102230246251565e-16 -v 0.3125 0.875 0 -v 0.3125 0.4374999999999999 -0.37499999999999994 -v 0.3125 0.875 -0.375 -v -0.1875 0.875 0 -v -0.1875 0.4375 1.1102230246251565e-16 -v -0.1875 0.875 -0.375 -v -0.1875 0.4374999999999999 -0.37499999999999994 -vt 0.4375 0.78125 -vt 0.5625 0.78125 -vt 0.5625 0.59375 -vt 0.4375 0.59375 -vt 0.328125 0.78125 -vt 0.4375 0.78125 -vt 0.4375 0.59375 -vt 0.328125 0.59375 -vt 0.671875 0.78125 -vt 0.796875 0.78125 -vt 0.796875 0.59375 -vt 0.671875 0.59375 -vt 0.5625 0.78125 -vt 0.671875 0.78125 -vt 0.671875 0.59375 -vt 0.5625 0.59375 -vt 0.5625 0.78125 -vt 0.4375 0.78125 -vt 0.4375 1 -vt 0.5625 1 -vt 0.6875 1 -vt 0.5625 1 -vt 0.5625 0.78125 -vt 0.6875 0.78125 -vn 0 1 -2.220446049250313e-16 -vn 1 0 0 -vn 0 -1 2.220446049250313e-16 -vn -1 0 0 -vn 0 2.220446049250313e-16 1 -vn 0 -2.220446049250313e-16 -1 -usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o leg0 -v 0.21875 0.5 0.5 -v 0.21875 0.5 0.375 -v 0.21875 0 0.5 -v 0.21875 0 0.375 -v 0.09375 0.5 0.375 -v 0.09375 0.5 0.5 -v 0.09375 0 0.375 -v 0.09375 0 0.5 -vt 0.03125 0.375 -vt 0.0625 0.375 -vt 0.0625 0.125 -vt 0.03125 0.125 -vt 0 0.375 -vt 0.03125 0.375 -vt 0.03125 0.125 -vt 0 0.125 -vt 0.09375 0.375 -vt 0.125 0.375 -vt 0.125 0.125 -vt 0.09375 0.125 -vt 0.0625 0.375 -vt 0.09375 0.375 -vt 0.09375 0.125 -vt 0.0625 0.125 -vt 0.0625 0.375 -vt 0.03125 0.375 -vt 0.03125 0.4375 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.375 -vt 0.09375 0.375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o leg1 -v 0.03125 0.5 0.5 -v 0.03125 0.5 0.375 -v 0.03125 0 0.5 -v 0.03125 0 0.375 -v -0.09375 0.5 0.375 -v -0.09375 0.5 0.5 -v -0.09375 0 0.375 -v -0.09375 0 0.5 -vt 0.03125 0.375 -vt 0.0625 0.375 -vt 0.0625 0.125 -vt 0.03125 0.125 -vt 0 0.375 -vt 0.03125 0.375 -vt 0.03125 0.125 -vt 0 0.125 -vt 0.09375 0.375 -vt 0.125 0.375 -vt 0.125 0.125 -vt 0.09375 0.125 -vt 0.0625 0.375 -vt 0.09375 0.375 -vt 0.09375 0.125 -vt 0.0625 0.125 -vt 0.0625 0.375 -vt 0.03125 0.375 -vt 0.03125 0.4375 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.375 -vt 0.09375 0.375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o leg2 -v 0.21875 0.5 -0.1875 -v 0.21875 0.5 -0.3125 -v 0.21875 0 -0.1875 -v 0.21875 0 -0.3125 -v 0.09375 0.5 -0.3125 -v 0.09375 0.5 -0.1875 -v 0.09375 0 -0.3125 -v 0.09375 0 -0.1875 -vt 0.03125 0.375 -vt 0.0625 0.375 -vt 0.0625 0.125 -vt 0.03125 0.125 -vt 0 0.375 -vt 0.03125 0.375 -vt 0.03125 0.125 -vt 0 0.125 -vt 0.09375 0.375 -vt 0.125 0.375 -vt 0.125 0.125 -vt 0.09375 0.125 -vt 0.0625 0.375 -vt 0.09375 0.375 -vt 0.09375 0.125 -vt 0.0625 0.125 -vt 0.0625 0.375 -vt 0.03125 0.375 -vt 0.03125 0.4375 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.375 -vt 0.09375 0.375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o leg3 -v 0.03125 0.5 -0.1875 -v 0.03125 0.5 -0.3125 -v 0.03125 0 -0.1875 -v 0.03125 0 -0.3125 -v -0.09375 0.5 -0.3125 -v -0.09375 0.5 -0.1875 -v -0.09375 0 -0.3125 -v -0.09375 0 -0.1875 -vt 0.03125 0.375 -vt 0.0625 0.375 -vt 0.0625 0.125 -vt 0.03125 0.125 -vt 0 0.375 -vt 0.03125 0.375 -vt 0.03125 0.125 -vt 0 0.125 -vt 0.09375 0.375 -vt 0.125 0.375 -vt 0.125 0.125 -vt 0.09375 0.125 -vt 0.0625 0.375 -vt 0.09375 0.375 -vt 0.09375 0.125 -vt 0.0625 0.125 -vt 0.0625 0.375 -vt 0.03125 0.375 -vt 0.03125 0.4375 -vt 0.0625 0.4375 -vt 0.09375 0.4375 -vt 0.0625 0.4375 -vt 0.0625 0.375 -vt 0.09375 0.375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 -o tail -v 0.125 0.8011970027680619 0.5358485272719404 -v 0.125 0.6988029972319381 0.46415147272805957 -v 0.125 0.5144087845925389 0.9454245494164362 -v 0.125 0.4120147790564149 0.8737274948725555 -v 0 0.6988029972319381 0.46415147272805957 -v 0 0.8011970027680619 0.5358485272719404 -v 0 0.4120147790564149 0.8737274948725555 -v 0 0.5144087845925389 0.9454245494164362 -vt 0.171875 0.375 -vt 0.203125 0.375 -vt 0.203125 0.125 -vt 0.171875 0.125 -vt 0.140625 0.375 -vt 0.171875 0.375 -vt 0.171875 0.125 -vt 0.140625 0.125 -vt 0.234375 0.375 -vt 0.265625 0.375 -vt 0.265625 0.125 -vt 0.234375 0.125 -vt 0.203125 0.375 -vt 0.234375 0.375 -vt 0.234375 0.125 -vt 0.203125 0.125 -vt 0.203125 0.375 -vt 0.171875 0.375 -vt 0.171875 0.4375 -vt 0.203125 0.4375 -vt 0.234375 0.4375 -vt 0.203125 0.4375 -vt 0.203125 0.375 -vt 0.234375 0.375 -vn 0 -0.8191520442889917 -0.5735764363510463 -vn 1 0 0 -vn 0 0.8191520442889917 0.5735764363510463 -vn -1 0 0 -vn 0 0.5735764363510463 -0.8191520442889917 -vn 0 -0.5735764363510463 0.8191520442889917 -usemtl m_94c40dbc-0261-544f-e827-6e5c4aaaa4dd -f 84/244/61 87/243/61 85/242/61 82/241/61 -f 83/248/62 84/247/62 82/246/62 81/245/62 -f 88/252/63 83/251/63 81/250/63 86/249/63 -f 87/256/64 88/255/64 86/254/64 85/253/64 -f 86/260/65 81/259/65 82/258/65 85/257/65 -f 87/264/66 84/263/66 83/262/66 88/261/66 \ No newline at end of file diff --git a/renderer/viewer/three/entity/models/zombie_villager.obj b/renderer/viewer/three/entity/models/zombie_villager.obj deleted file mode 100644 index 22282802..00000000 --- a/renderer/viewer/three/entity/models/zombie_villager.obj +++ /dev/null @@ -1,463 +0,0 @@ -# Made in Blockbench 4.9.4 -mtllib materials.mtl - -o Body -v 0.25 1.5 0.1875 -v 0.25 1.5 -0.1875 -v 0.25 0.75 0.1875 -v 0.25 0.75 -0.1875 -v -0.25 1.5 -0.1875 -v -0.25 1.5 0.1875 -v -0.25 0.75 -0.1875 -v -0.25 0.75 0.1875 -vt 0.34375 0.59375 -vt 0.46875 0.59375 -vt 0.46875 0.40625 -vt 0.34375 0.40625 -vt 0.25 0.59375 -vt 0.34375 0.59375 -vt 0.34375 0.40625 -vt 0.25 0.40625 -vt 0.5625 0.59375 -vt 0.6875 0.59375 -vt 0.6875 0.40625 -vt 0.5625 0.40625 -vt 0.46875 0.59375 -vt 0.5625 0.59375 -vt 0.5625 0.40625 -vt 0.46875 0.40625 -vt 0.46875 0.59375 -vt 0.34375 0.59375 -vt 0.34375 0.6875 -vt 0.46875 0.6875 -vt 0.59375 0.6875 -vt 0.46875 0.6875 -vt 0.46875 0.59375 -vt 0.59375 0.59375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d -f 4/4/1 7/3/1 5/2/1 2/1/1 -f 3/8/2 4/7/2 2/6/2 1/5/2 -f 8/12/3 3/11/3 1/10/3 6/9/3 -f 7/16/4 8/15/4 6/14/4 5/13/4 -f 6/20/5 1/19/5 2/18/5 5/17/5 -f 7/24/6 4/23/6 3/22/6 8/21/6 -o Body -v 0.28125 1.53125 0.21875 -v 0.28125 1.53125 -0.21875 -v 0.28125 0.34375 0.21875 -v 0.28125 0.34375 -0.21875 -v -0.28125 1.53125 -0.21875 -v -0.28125 1.53125 0.21875 -v -0.28125 0.34375 -0.21875 -v -0.28125 0.34375 0.21875 -vt 0.09375 0.3125 -vt 0.21875 0.3125 -vt 0.21875 0.03125 -vt 0.09375 0.03125 -vt 0 0.3125 -vt 0.09375 0.3125 -vt 0.09375 0.03125 -vt 0 0.03125 -vt 0.3125 0.3125 -vt 0.4375 0.3125 -vt 0.4375 0.03125 -vt 0.3125 0.03125 -vt 0.21875 0.3125 -vt 0.3125 0.3125 -vt 0.3125 0.03125 -vt 0.21875 0.03125 -vt 0.21875 0.3125 -vt 0.09375 0.3125 -vt 0.09375 0.40625 -vt 0.21875 0.40625 -vt 0.34375 0.40625 -vt 0.21875 0.40625 -vt 0.21875 0.3125 -vt 0.34375 0.3125 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d -f 12/28/7 15/27/7 13/26/7 10/25/7 -f 11/32/8 12/31/8 10/30/8 9/29/8 -f 16/36/9 11/35/9 9/34/9 14/33/9 -f 15/40/10 16/39/10 14/38/10 13/37/10 -f 14/44/11 9/43/11 10/42/11 13/41/11 -f 15/48/12 12/47/12 11/46/12 16/45/12 -o Head -v 0.265625 2.140625 0.265625 -v 0.265625 2.140625 -0.265625 -v 0.265625 1.484375 0.265625 -v 0.265625 1.484375 -0.265625 -v -0.265625 2.140625 -0.265625 -v -0.265625 2.140625 0.265625 -v -0.265625 1.484375 -0.265625 -v -0.265625 1.484375 0.265625 -vt 0.125 0.875 -vt 0.25 0.875 -vt 0.25 0.71875 -vt 0.125 0.71875 -vt 0 0.875 -vt 0.125 0.875 -vt 0.125 0.71875 -vt 0 0.71875 -vt 0.375 0.875 -vt 0.5 0.875 -vt 0.5 0.71875 -vt 0.375 0.71875 -vt 0.25 0.875 -vt 0.375 0.875 -vt 0.375 0.71875 -vt 0.25 0.71875 -vt 0.25 0.875 -vt 0.125 0.875 -vt 0.125 1 -vt 0.25 1 -vt 0.375 1 -vt 0.25 1 -vt 0.25 0.875 -vt 0.375 0.875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d -f 20/52/13 23/51/13 21/50/13 18/49/13 -f 19/56/14 20/55/14 18/54/14 17/53/14 -f 24/60/15 19/59/15 17/58/15 22/57/15 -f 23/64/16 24/63/16 22/62/16 21/61/16 -f 22/68/17 17/67/17 18/66/17 21/65/17 -f 23/72/18 20/71/18 19/70/18 24/69/18 -o Head -v 0.078125 1.703125 -0.234375 -v 0.078125 1.703125 -0.390625 -v 0.078125 1.421875 -0.234375 -v 0.078125 1.421875 -0.390625 -v -0.078125 1.703125 -0.390625 -v -0.078125 1.703125 -0.234375 -v -0.078125 1.421875 -0.390625 -v -0.078125 1.421875 -0.234375 -vt 0.40625 0.96875 -vt 0.4375 0.96875 -vt 0.4375 0.90625 -vt 0.40625 0.90625 -vt 0.375 0.96875 -vt 0.40625 0.96875 -vt 0.40625 0.90625 -vt 0.375 0.90625 -vt 0.46875 0.96875 -vt 0.5 0.96875 -vt 0.5 0.90625 -vt 0.46875 0.90625 -vt 0.4375 0.96875 -vt 0.46875 0.96875 -vt 0.46875 0.90625 -vt 0.4375 0.90625 -vt 0.4375 0.96875 -vt 0.40625 0.96875 -vt 0.40625 1 -vt 0.4375 1 -vt 0.46875 1 -vt 0.4375 1 -vt 0.4375 0.96875 -vt 0.46875 0.96875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d -f 28/76/19 31/75/19 29/74/19 26/73/19 -f 27/80/20 28/79/20 26/78/20 25/77/20 -f 32/84/21 27/83/21 25/82/21 30/81/21 -f 31/88/22 32/87/22 30/86/22 29/85/22 -f 30/92/23 25/91/23 26/90/23 29/89/23 -f 31/96/24 28/95/24 27/94/24 32/93/24 -o Head Layer -v 0.28125 2.15625 0.28125 -v 0.28125 2.15625 -0.28125 -v 0.28125 1.46875 0.28125 -v 0.28125 1.46875 -0.28125 -v -0.28125 2.15625 -0.28125 -v -0.28125 2.15625 0.28125 -v -0.28125 1.46875 -0.28125 -v -0.28125 1.46875 0.28125 -vt 0.625 0.875 -vt 0.75 0.875 -vt 0.75 0.71875 -vt 0.625 0.71875 -vt 0.5 0.875 -vt 0.625 0.875 -vt 0.625 0.71875 -vt 0.5 0.71875 -vt 0.875 0.875 -vt 1 0.875 -vt 1 0.71875 -vt 0.875 0.71875 -vt 0.75 0.875 -vt 0.875 0.875 -vt 0.875 0.71875 -vt 0.75 0.71875 -vt 0.75 0.875 -vt 0.625 0.875 -vt 0.625 1 -vt 0.75 1 -vt 0.875 1 -vt 0.75 1 -vt 0.75 0.875 -vt 0.875 0.875 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d -f 36/100/25 39/99/25 37/98/25 34/97/25 -f 35/104/26 36/103/26 34/102/26 33/101/26 -f 40/108/27 35/107/27 33/106/27 38/105/27 -f 39/112/28 40/111/28 38/110/28 37/109/28 -f 38/116/29 33/115/29 34/114/29 37/113/29 -f 39/120/30 36/119/30 35/118/30 40/117/30 -o brim -v 0.5062500000000001 2.00625 -0.30625 -v 0.5062500000000001 2.00625 -0.38125 -v 0.5062500000000001 0.9937499999999999 -0.30625 -v 0.5062500000000001 0.9937499999999999 -0.38125 -v -0.50625 2.00625 -0.38125 -v -0.50625 2.00625 -0.30625 -v -0.50625 0.9937499999999999 -0.38125 -v -0.50625 0.9937499999999999 -0.30625 -vt 0.484375 0.25 -vt 0.734375 0.25 -vt 0.734375 0 -vt 0.484375 0 -vt 0.46875 0.25 -vt 0.484375 0.25 -vt 0.484375 0 -vt 0.46875 0 -vt 0.75 0.25 -vt 1 0.25 -vt 1 0 -vt 0.75 0 -vt 0.734375 0.25 -vt 0.75 0.25 -vt 0.75 0 -vt 0.734375 0 -vt 0.734375 0.25 -vt 0.484375 0.25 -vt 0.484375 0.265625 -vt 0.734375 0.265625 -vt 0.984375 0.265625 -vt 0.734375 0.265625 -vt 0.734375 0.25 -vt 0.984375 0.25 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d -f 44/124/31 47/123/31 45/122/31 42/121/31 -f 43/128/32 44/127/32 42/126/32 41/125/32 -f 48/132/33 43/131/33 41/130/33 46/129/33 -f 47/136/34 48/135/34 46/134/34 45/133/34 -f 46/140/35 41/139/35 42/138/35 45/137/35 -f 47/144/36 44/143/36 43/142/36 48/141/36 -o RightArm -v 0.5 1.5 0.125 -v 0.5 1.5 -0.125 -v 0.5 0.75 0.125 -v 0.5 0.75 -0.125 -v 0.25 1.5 -0.125 -v 0.25 1.5 0.125 -v 0.25 0.75 -0.125 -v 0.25 0.75 0.125 -vt 0.75 0.59375 -vt 0.8125 0.59375 -vt 0.8125 0.40625 -vt 0.75 0.40625 -vt 0.6875 0.59375 -vt 0.75 0.59375 -vt 0.75 0.40625 -vt 0.6875 0.40625 -vt 0.875 0.59375 -vt 0.9375 0.59375 -vt 0.9375 0.40625 -vt 0.875 0.40625 -vt 0.8125 0.59375 -vt 0.875 0.59375 -vt 0.875 0.40625 -vt 0.8125 0.40625 -vt 0.8125 0.59375 -vt 0.75 0.59375 -vt 0.75 0.65625 -vt 0.8125 0.65625 -vt 0.875 0.65625 -vt 0.8125 0.65625 -vt 0.8125 0.59375 -vt 0.875 0.59375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d -f 52/148/37 55/147/37 53/146/37 50/145/37 -f 51/152/38 52/151/38 50/150/38 49/149/38 -f 56/156/39 51/155/39 49/154/39 54/153/39 -f 55/160/40 56/159/40 54/158/40 53/157/40 -f 54/164/41 49/163/41 50/162/41 53/161/41 -f 55/168/42 52/167/42 51/166/42 56/165/42 -o LeftArm -v -0.25 1.5 0.125 -v -0.25 1.5 -0.125 -v -0.25 0.75 0.125 -v -0.25 0.75 -0.125 -v -0.5 1.5 -0.125 -v -0.5 1.5 0.125 -v -0.5 0.75 -0.125 -v -0.5 0.75 0.125 -vt 0.8125 0.59375 -vt 0.75 0.59375 -vt 0.75 0.40625 -vt 0.8125 0.40625 -vt 0.875 0.59375 -vt 0.8125 0.59375 -vt 0.8125 0.40625 -vt 0.875 0.40625 -vt 0.9375 0.59375 -vt 0.875 0.59375 -vt 0.875 0.40625 -vt 0.9375 0.40625 -vt 0.75 0.59375 -vt 0.6875 0.59375 -vt 0.6875 0.40625 -vt 0.75 0.40625 -vt 0.75 0.59375 -vt 0.8125 0.59375 -vt 0.8125 0.65625 -vt 0.75 0.65625 -vt 0.8125 0.65625 -vt 0.875 0.65625 -vt 0.875 0.59375 -vt 0.8125 0.59375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d -f 60/172/43 63/171/43 61/170/43 58/169/43 -f 59/176/44 60/175/44 58/174/44 57/173/44 -f 64/180/45 59/179/45 57/178/45 62/177/45 -f 63/184/46 64/183/46 62/182/46 61/181/46 -f 62/188/47 57/187/47 58/186/47 61/185/47 -f 63/192/48 60/191/48 59/190/48 64/189/48 -o RightLeg -v 0.25 0.75 0.125 -v 0.25 0.75 -0.125 -v 0.25 0 0.125 -v 0.25 0 -0.125 -v 0 0.75 -0.125 -v 0 0.75 0.125 -v 0 0 -0.125 -v 0 0 0.125 -vt 0.0625 0.59375 -vt 0.125 0.59375 -vt 0.125 0.40625 -vt 0.0625 0.40625 -vt 0 0.59375 -vt 0.0625 0.59375 -vt 0.0625 0.40625 -vt 0 0.40625 -vt 0.1875 0.59375 -vt 0.25 0.59375 -vt 0.25 0.40625 -vt 0.1875 0.40625 -vt 0.125 0.59375 -vt 0.1875 0.59375 -vt 0.1875 0.40625 -vt 0.125 0.40625 -vt 0.125 0.59375 -vt 0.0625 0.59375 -vt 0.0625 0.65625 -vt 0.125 0.65625 -vt 0.1875 0.65625 -vt 0.125 0.65625 -vt 0.125 0.59375 -vt 0.1875 0.59375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d -f 68/196/49 71/195/49 69/194/49 66/193/49 -f 67/200/50 68/199/50 66/198/50 65/197/50 -f 72/204/51 67/203/51 65/202/51 70/201/51 -f 71/208/52 72/207/52 70/206/52 69/205/52 -f 70/212/53 65/211/53 66/210/53 69/209/53 -f 71/216/54 68/215/54 67/214/54 72/213/54 -o LeftLeg -v 0 0.75 0.125 -v 0 0.75 -0.125 -v 0 0 0.125 -v 0 0 -0.125 -v -0.25 0.75 -0.125 -v -0.25 0.75 0.125 -v -0.25 0 -0.125 -v -0.25 0 0.125 -vt 0.125 0.59375 -vt 0.0625 0.59375 -vt 0.0625 0.40625 -vt 0.125 0.40625 -vt 0.1875 0.59375 -vt 0.125 0.59375 -vt 0.125 0.40625 -vt 0.1875 0.40625 -vt 0.25 0.59375 -vt 0.1875 0.59375 -vt 0.1875 0.40625 -vt 0.25 0.40625 -vt 0.0625 0.59375 -vt 0 0.59375 -vt 0 0.40625 -vt 0.0625 0.40625 -vt 0.0625 0.59375 -vt 0.125 0.59375 -vt 0.125 0.65625 -vt 0.0625 0.65625 -vt 0.125 0.65625 -vt 0.1875 0.65625 -vt 0.1875 0.59375 -vt 0.125 0.59375 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn -1 0 0 -vn 0 1 0 -vn 0 -1 0 -usemtl m_dabf2b9e-3dd1-eda4-ab17-56ae6660288d -f 76/220/55 79/219/55 77/218/55 74/217/55 -f 75/224/56 76/223/56 74/222/56 73/221/56 -f 80/228/57 75/227/57 73/226/57 78/225/57 -f 79/232/58 80/231/58 78/230/58 77/229/58 -f 78/236/59 73/235/59 74/234/59 77/233/59 -f 79/240/60 76/239/60 75/238/60 80/237/60 \ No newline at end of file diff --git a/renderer/viewer/three/entity/objModels.js b/renderer/viewer/three/entity/objModels.js deleted file mode 100644 index edff440b..00000000 --- a/renderer/viewer/three/entity/objModels.js +++ /dev/null @@ -1 +0,0 @@ -export * as externalModels from './exportedModels' diff --git a/renderer/viewer/three/graphicsBackend.ts b/renderer/viewer/three/graphicsBackend.ts deleted file mode 100644 index 04cb00ca..00000000 --- a/renderer/viewer/three/graphicsBackend.ts +++ /dev/null @@ -1,166 +0,0 @@ -import * as THREE from 'three' -import { Vec3 } from 'vec3' -import { GraphicsBackendLoader, GraphicsBackend, GraphicsInitOptions, DisplayWorldOptions } from '../../../src/appViewer' -import { ProgressReporter } from '../../../src/core/progressReporter' -import { showNotification } from '../../../src/react/NotificationProvider' -import { displayEntitiesDebugList } from '../../playground/allEntitiesDebug' -import supportedVersions from '../../../src/supportedVersions.mjs' -import { ResourcesManager } from '../../../src/resourcesManager' -import { WorldRendererThree } from './worldrendererThree' -import { DocumentRenderer } from './documentRenderer' -import { PanoramaRenderer } from './panorama' -import { initVR } from './world/vr' - -// https://discourse.threejs.org/t/updates-to-color-management-in-three-js-r152/50791 -THREE.ColorManagement.enabled = false -globalThis.THREE = THREE - -const getBackendMethods = (worldRenderer: WorldRendererThree) => { - return { - updateMap: worldRenderer.entities.updateMap.bind(worldRenderer.entities), - updateCustomBlock: worldRenderer.updateCustomBlock.bind(worldRenderer), - getBlockInfo: worldRenderer.getBlockInfo.bind(worldRenderer), - playEntityAnimation: worldRenderer.entities.playAnimation.bind(worldRenderer.entities), - damageEntity: worldRenderer.entities.handleDamageEvent.bind(worldRenderer.entities), - updatePlayerSkin: worldRenderer.entities.updatePlayerSkin.bind(worldRenderer.entities), - changeHandSwingingState: worldRenderer.changeHandSwingingState.bind(worldRenderer), - getHighestBlocks: worldRenderer.getHighestBlocks.bind(worldRenderer), - reloadWorld: worldRenderer.reloadWorld.bind(worldRenderer), - - addMedia: worldRenderer.media.addMedia.bind(worldRenderer.media), - destroyMedia: worldRenderer.media.destroyMedia.bind(worldRenderer.media), - setVideoPlaying: worldRenderer.media.setVideoPlaying.bind(worldRenderer.media), - setVideoSeeking: worldRenderer.media.setVideoSeeking.bind(worldRenderer.media), - setVideoVolume: worldRenderer.media.setVideoVolume.bind(worldRenderer.media), - setVideoSpeed: worldRenderer.media.setVideoSpeed.bind(worldRenderer.media), - - addSectionAnimation (id: string, animation: typeof worldRenderer.sectionsOffsetsAnimations[string]) { - worldRenderer.sectionsOffsetsAnimations[id] = animation - }, - removeSectionAnimation (id: string) { - delete worldRenderer.sectionsOffsetsAnimations[id] - }, - - shakeFromDamage: worldRenderer.cameraShake.shakeFromDamage.bind(worldRenderer.cameraShake), - onPageInteraction: worldRenderer.media.onPageInteraction.bind(worldRenderer.media), - downloadMesherLog: worldRenderer.downloadMesherLog.bind(worldRenderer), - - addWaypoint: worldRenderer.waypoints.addWaypoint.bind(worldRenderer.waypoints), - removeWaypoint: worldRenderer.waypoints.removeWaypoint.bind(worldRenderer.waypoints), - - // New method for updating skybox - setSkyboxImage: worldRenderer.skyboxRenderer.setSkyboxImage.bind(worldRenderer.skyboxRenderer) - } -} - -export type ThreeJsBackendMethods = ReturnType - -const createGraphicsBackend: GraphicsBackendLoader = (initOptions: GraphicsInitOptions) => { - // Private state - const documentRenderer = new DocumentRenderer(initOptions) - globalThis.renderer = documentRenderer.renderer - - let panoramaRenderer: PanoramaRenderer | null = null - let worldRenderer: WorldRendererThree | null = null - - const startPanorama = async () => { - if (!documentRenderer) throw new Error('Document renderer not initialized') - if (worldRenderer) return - const qs = new URLSearchParams(location.search) - if (qs.get('debugEntities')) { - const fullResourceManager = initOptions.resourcesManager as ResourcesManager - fullResourceManager.currentConfig = { version: qs.get('version') || supportedVersions.at(-1)!, noInventoryGui: true } - await fullResourceManager.updateAssetsData({ }) - - displayEntitiesDebugList(fullResourceManager.currentConfig.version) - return - } - - if (!panoramaRenderer) { - panoramaRenderer = new PanoramaRenderer(documentRenderer, initOptions, !!process.env.SINGLE_FILE_BUILD_MODE) - globalThis.panoramaRenderer = panoramaRenderer - callModsMethod('panoramaCreated', panoramaRenderer) - await panoramaRenderer.start() - callModsMethod('panoramaReady', panoramaRenderer) - } - } - - const startWorld = async (displayOptions: DisplayWorldOptions) => { - if (panoramaRenderer) { - panoramaRenderer.dispose() - panoramaRenderer = null - } - worldRenderer = new WorldRendererThree(documentRenderer.renderer, initOptions, displayOptions) - void initVR(worldRenderer, documentRenderer) - await worldRenderer.worldReadyPromise - documentRenderer.render = (sizeChanged: boolean) => { - worldRenderer?.render(sizeChanged) - } - documentRenderer.inWorldRenderingConfig = displayOptions.inWorldRenderingConfig - window.world = worldRenderer - callModsMethod('worldReady', worldRenderer) - } - - const disconnect = () => { - if (panoramaRenderer) { - panoramaRenderer.dispose() - panoramaRenderer = null - } - if (documentRenderer) { - documentRenderer.dispose() - } - if (worldRenderer) { - worldRenderer.destroy() - worldRenderer = null - } - } - - // Public interface - const backend: GraphicsBackend = { - id: 'threejs', - displayName: `three.js ${THREE.REVISION}`, - startPanorama, - startWorld, - disconnect, - setRendering (rendering) { - documentRenderer.setPaused(!rendering) - if (worldRenderer) worldRenderer.renderingActive = rendering - }, - getDebugOverlay: () => ({ - get entitiesString () { - return worldRenderer?.entities.getDebugString() - }, - }), - updateCamera (pos: Vec3 | null, yaw: number, pitch: number) { - worldRenderer?.setFirstPersonCamera(pos, yaw, pitch) - }, - get soundSystem () { - return worldRenderer?.soundSystem - }, - get backendMethods () { - if (!worldRenderer) return undefined - return getBackendMethods(worldRenderer) - } - } - - globalThis.threeJsBackend = backend - globalThis.resourcesManager = initOptions.resourcesManager - callModsMethod('default', backend) - - return backend -} - -const callModsMethod = (method: string, ...args: any[]) => { - for (const mod of Object.values((window.loadedMods ?? {}) as Record)) { - try { - mod.threeJsBackendModule?.[method]?.(...args) - } catch (err) { - const errorMessage = `[mod three.js] Error calling ${method} on ${mod.name}: ${err}` - showNotification(errorMessage, 'error') - throw new Error(errorMessage) - } - } -} - -createGraphicsBackend.id = 'threejs' -export default createGraphicsBackend diff --git a/renderer/viewer/three/hand.ts b/renderer/viewer/three/hand.ts deleted file mode 100644 index 2bd3832b..00000000 --- a/renderer/viewer/three/hand.ts +++ /dev/null @@ -1,89 +0,0 @@ -import * as THREE from 'three' -import { loadSkinFromUsername, loadSkinImage } from '../lib/utils/skins' -import { steveTexture } from './entities' - - -export const getMyHand = async (image?: string, userName?: string) => { - let newMap: THREE.Texture - if (!image && !userName) { - newMap = await steveTexture - } else { - if (!image) { - image = await loadSkinFromUsername(userName!, 'skin') - } - if (!image) { - return - } - const { canvas } = await loadSkinImage(image) - newMap = new THREE.CanvasTexture(canvas) - } - - newMap.magFilter = THREE.NearestFilter - newMap.minFilter = THREE.NearestFilter - // right arm - const box = new THREE.BoxGeometry() - const material = new THREE.MeshStandardMaterial() - const slim = false - const mesh = new THREE.Mesh(box, material) - mesh.scale.x = slim ? 3 : 4 - mesh.scale.y = 12 - mesh.scale.z = 4 - setSkinUVs(box, 40, 16, slim ? 3 : 4, 12, 4) - material.map = newMap - material.needsUpdate = true - const group = new THREE.Group() - group.add(mesh) - group.scale.set(0.1, 0.1, 0.1) - mesh.rotation.z = Math.PI - return group -} - -function setUVs ( - box: THREE.BoxGeometry, - u: number, - v: number, - width: number, - height: number, - depth: number, - textureWidth: number, - textureHeight: number -): void { - const toFaceVertices = (x1: number, y1: number, x2: number, y2: number) => [ - new THREE.Vector2(x1 / textureWidth, 1 - y2 / textureHeight), - new THREE.Vector2(x2 / textureWidth, 1 - y2 / textureHeight), - new THREE.Vector2(x2 / textureWidth, 1 - y1 / textureHeight), - new THREE.Vector2(x1 / textureWidth, 1 - y1 / textureHeight), - ] - - const top = toFaceVertices(u + depth, v, u + width + depth, v + depth) - const bottom = toFaceVertices(u + width + depth, v, u + width * 2 + depth, v + depth) - const left = toFaceVertices(u, v + depth, u + depth, v + depth + height) - const front = toFaceVertices(u + depth, v + depth, u + width + depth, v + depth + height) - const right = toFaceVertices(u + width + depth, v + depth, u + width + depth * 2, v + height + depth) - const back = toFaceVertices(u + width + depth * 2, v + depth, u + width * 2 + depth * 2, v + height + depth) - - const uvAttr = box.attributes.uv as THREE.BufferAttribute - const uvRight = [right[3], right[2], right[0], right[1]] - const uvLeft = [left[3], left[2], left[0], left[1]] - const uvTop = [top[3], top[2], top[0], top[1]] - const uvBottom = [bottom[0], bottom[1], bottom[3], bottom[2]] - const uvFront = [front[3], front[2], front[0], front[1]] - const uvBack = [back[3], back[2], back[0], back[1]] - - // Create a new array to hold the modified UV data - const newUVData = [] as number[] - - // Iterate over the arrays and copy the data to uvData - for (const uvArray of [uvRight, uvLeft, uvTop, uvBottom, uvFront, uvBack]) { - for (const uv of uvArray) { - newUVData.push(uv.x, uv.y) - } - } - - uvAttr.set(new Float32Array(newUVData)) - uvAttr.needsUpdate = true -} - -function setSkinUVs (box: THREE.BoxGeometry, u: number, v: number, width: number, height: number, depth: number): void { - setUVs(box, u, v, width, height, depth, 64, 64) -} diff --git a/renderer/viewer/three/holdingBlock.ts b/renderer/viewer/three/holdingBlock.ts deleted file mode 100644 index f9d00f0e..00000000 --- a/renderer/viewer/three/holdingBlock.ts +++ /dev/null @@ -1,933 +0,0 @@ -import * as THREE from 'three' -import * as tweenJs from '@tweenjs/tween.js' -import PrismarineItem from 'prismarine-item' -import worldBlockProvider, { WorldBlockProvider } from 'mc-assets/dist/worldBlockProvider' -import { BlockModel } from 'mc-assets' -import { getThreeBlockModelGroup, renderBlockThree, setBlockPosition } from '../lib/mesher/standaloneRenderer' -import { MovementState, PlayerStateRenderer } from '../lib/basePlayerState' -import { DebugGui } from '../lib/DebugGui' -import { SmoothSwitcher } from '../lib/smoothSwitcher' -import { watchProperty } from '../lib/utils/proxy' -import { WorldRendererConfig } from '../lib/worldrendererCommon' -import { getMyHand } from './hand' -import { WorldRendererThree } from './worldrendererThree' -import { disposeObject } from './threeJsUtils' - -export type HandItemBlock = { - name? - properties? - fullItem? - type: 'block' | 'item' | 'hand' - id?: number -} - -const rotationPositionData = { - itemRight: { - 'rotation': [ - 0, - -90, - 25 - ], - 'translation': [ - 1.13, - 3.2, - 1.13 - ], - 'scale': [ - 0.68, - 0.68, - 0.68 - ] - }, - itemLeft: { - 'rotation': [ - 0, - 90, - -25 - ], - 'translation': [ - 1.13, - 3.2, - 1.13 - ], - 'scale': [ - 0.68, - 0.68, - 0.68 - ] - }, - blockRight: { - 'rotation': [ - 0, - 45, - 0 - ], - 'translation': [ - 0, - 0, - 0 - ], - 'scale': [ - 0.4, - 0.4, - 0.4 - ] - }, - blockLeft: { - 'rotation': [ - 0, - 225, - 0 - ], - 'translation': [ - 0, - 0, - 0 - ], - 'scale': [ - 0.4, - 0.4, - 0.4 - ] - } -} - -export default class HoldingBlock { - // TODO refactor with the tree builder for better visual understanding - holdingBlock: THREE.Object3D | undefined = undefined - blockSwapAnimation: { - switcher: SmoothSwitcher - // hidden: boolean - } | undefined = undefined - cameraGroup = new THREE.Mesh() - objectOuterGroup = new THREE.Group() // 3 - objectInnerGroup = new THREE.Group() // 4 - holdingBlockInnerGroup = new THREE.Group() // 5 - camera = new THREE.PerspectiveCamera(75, 1, 0.1, 100) - stopUpdate = false - lastHeldItem: HandItemBlock | undefined - isSwinging = false - nextIterStopCallbacks: Array<() => void> | undefined - idleAnimator: HandIdleAnimator | undefined - ready = false - lastUpdate = 0 - playerHand: THREE.Object3D | undefined - offHandDisplay = false - offHandModeLegacy = false - - swingAnimator: HandSwingAnimator | undefined - config: WorldRendererConfig - - constructor (public worldRenderer: WorldRendererThree, public offHand = false) { - this.initCameraGroup() - this.worldRenderer.onReactivePlayerStateUpdated('heldItemMain', () => { - if (!this.offHand) { - this.updateItem() - } - }, false) - this.worldRenderer.onReactivePlayerStateUpdated('heldItemOff', () => { - if (this.offHand) { - this.updateItem() - } - }, false) - this.config = worldRenderer.displayOptions.inWorldRenderingConfig - - this.offHandDisplay = this.offHand - // this.offHandDisplay = true - if (!this.offHand) { - // load default hand - void getMyHand().then((hand) => { - this.playerHand = hand - // trigger update - this.updateItem() - }).then(() => { - // now watch over the player skin - watchProperty( - async () => { - return getMyHand(this.worldRenderer.playerStateReactive.playerSkin, this.worldRenderer.playerStateReactive.onlineMode ? this.worldRenderer.playerStateReactive.username : undefined) - }, - this.worldRenderer.playerStateReactive, - 'playerSkin', - (newHand) => { - if (newHand) { - this.playerHand = newHand - // trigger update - this.updateItem() - } - }, - (oldHand) => { - disposeObject(oldHand!, true) - } - ) - }) - } - } - - updateItem () { - if (!this.ready) return - const item = this.offHand ? this.worldRenderer.playerStateReactive.heldItemOff : this.worldRenderer.playerStateReactive.heldItemMain - if (item) { - void this.setNewItem(item) - } else if (this.offHand) { - void this.setNewItem() - } else { - void this.setNewItem({ - type: 'hand', - }) - } - } - - initCameraGroup () { - this.cameraGroup = new THREE.Mesh() - } - - startSwing () { - this.swingAnimator?.startSwing() - } - - stopSwing () { - this.swingAnimator?.stopSwing() - } - - render (originalCamera: THREE.PerspectiveCamera, renderer: THREE.WebGLRenderer, ambientLight: THREE.AmbientLight, directionalLight: THREE.DirectionalLight) { - if (!this.lastHeldItem) return - const now = performance.now() - if (this.lastUpdate && now - this.lastUpdate > 50) { // one tick - void this.replaceItemModel(this.lastHeldItem) - } - - // Only update idle animation if not swinging - if (this.swingAnimator?.isCurrentlySwinging() || this.swingAnimator?.debugParams.animationStage) { - this.swingAnimator?.update() - } else { - this.idleAnimator?.update() - } - - this.blockSwapAnimation?.switcher.update() - - const scene = new THREE.Scene() - scene.add(this.cameraGroup) - // if (this.camera.aspect !== originalCamera.aspect) { - // this.camera.aspect = originalCamera.aspect - // this.camera.updateProjectionMatrix() - // } - this.updateCameraGroup() - scene.add(ambientLight.clone()) - scene.add(directionalLight.clone()) - - const viewerSize = renderer.getSize(new THREE.Vector2()) - const minSize = Math.min(viewerSize.width, viewerSize.height) - const x = viewerSize.width - minSize - - // Mirror the scene for offhand by scaling - const { offHandDisplay } = this - if (offHandDisplay) { - this.cameraGroup.scale.x = -1 - } - - renderer.autoClear = false - renderer.clearDepth() - if (this.offHandDisplay) { - renderer.setViewport(0, 0, minSize, minSize) - } else { - const x = viewerSize.width - minSize - // if (x) x -= x / 4 - renderer.setViewport(x, 0, minSize, minSize) - } - renderer.render(scene, this.camera) - renderer.setViewport(0, 0, viewerSize.width, viewerSize.height) - - // Reset the mirroring after rendering - if (offHandDisplay) { - this.cameraGroup.scale.x = 1 - } - } - - // worldTest () { - // const mesh = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), new THREE.MeshPhongMaterial({ color: 0x00_00_ff, transparent: true, opacity: 0.5 })) - // mesh.position.set(0.5, 0.5, 0.5) - // const group = new THREE.Group() - // group.add(mesh) - // group.position.set(-0.5, -0.5, -0.5) - // const outerGroup = new THREE.Group() - // outerGroup.add(group) - // outerGroup.position.set(this.camera.position.x, this.camera.position.y, this.camera.position.z) - // this.scene.add(outerGroup) - - // new tweenJs.Tween(group.rotation).to({ z: THREE.MathUtils.degToRad(90) }, 1000).yoyo(true).repeat(Infinity).start() - // } - - async playBlockSwapAnimation (forceState: 'appeared' | 'disappeared') { - this.blockSwapAnimation ??= { - switcher: new SmoothSwitcher( - () => ({ - y: this.objectInnerGroup.position.y - }), - (property, value) => { - if (property === 'y') this.objectInnerGroup.position.y = value - }, - { - y: 16 // units per second - } - ) - } - - const newState = forceState - // if (forceState && newState !== forceState) { - // throw new Error(`forceState does not match current state ${forceState} !== ${newState}`) - // } - - const targetY = this.objectInnerGroup.position.y + (this.objectInnerGroup.scale.y * 1.5 * (newState === 'appeared' ? 1 : -1)) - - // if (newState === this.blockSwapAnimation.switcher.transitioningToStateName) { - // return false - // } - - let cancelled = false - return new Promise((resolve) => { - this.blockSwapAnimation!.switcher.transitionTo( - { y: targetY }, - newState, - () => { - if (!cancelled) { - resolve(true) - } - }, - () => { - cancelled = true - resolve(false) - } - ) - }) - } - - isDifferentItem (block: HandItemBlock | undefined) { - const Item = PrismarineItem(this.worldRenderer.version) - if (!this.lastHeldItem) { - return true - } - if (this.lastHeldItem.name !== block?.name) { - return true - } - // eslint-disable-next-line sonarjs/prefer-single-boolean-return - if (!Item.equal(this.lastHeldItem.fullItem, block?.fullItem ?? {}) || JSON.stringify(this.lastHeldItem.fullItem.components) !== JSON.stringify(block?.fullItem?.components)) { - return true - } - - return false - } - - updateCameraGroup () { - if (this.stopUpdate) return - const { camera } = this - this.cameraGroup.position.copy(camera.position) - this.cameraGroup.rotation.copy(camera.rotation) - - // const viewerSize = viewer.renderer.getSize(new THREE.Vector2()) - // const aspect = viewerSize.width / viewerSize.height - const aspect = 1 - - - // Adjust the position based on the aspect ratio - const { position, scale: scaleData } = this.getHandHeld3d() - const distance = -position.z - const side = this.offHandModeLegacy ? -1 : 1 - this.objectOuterGroup.position.set( - distance * position.x * aspect * side, - distance * position.y, - -distance - ) - - // const scale = Math.min(0.8, Math.max(1, 1 * aspect)) - const scale = scaleData * 2.22 * 0.2 - this.objectOuterGroup.scale.set(scale, scale, scale) - } - - lastItemModelName: string | undefined - private async createItemModel (handItem: HandItemBlock): Promise<{ model: THREE.Object3D; type: 'hand' | 'block' | 'item' } | undefined> { - this.lastUpdate = performance.now() - if (!handItem || (handItem.type === 'hand' && !this.playerHand)) return undefined - - let blockInner: THREE.Object3D | undefined - if (handItem.type === 'item' || handItem.type === 'block') { - const result = this.worldRenderer.entities.getItemMesh({ - ...handItem.fullItem, - itemId: handItem.id, - }, { - 'minecraft:display_context': 'firstperson', - 'minecraft:use_duration': this.worldRenderer.playerStateReactive.itemUsageTicks, - 'minecraft:using_item': !!this.worldRenderer.playerStateReactive.itemUsageTicks, - }, false, this.lastItemModelName) - if (result) { - const { mesh: itemMesh, isBlock, modelName } = result - if (isBlock) { - blockInner = itemMesh - handItem.type = 'block' - } else { - itemMesh.position.set(0.5, 0.5, 0.5) - blockInner = itemMesh - handItem.type = 'item' - } - this.lastItemModelName = modelName - } - } else { - blockInner = this.playerHand! - } - if (!blockInner) return - blockInner.name = 'holdingBlock' - - const rotationDeg = this.getHandHeld3d().rotation - blockInner.rotation.x = THREE.MathUtils.degToRad(rotationDeg.x) - blockInner.rotation.y = THREE.MathUtils.degToRad(rotationDeg.y) - blockInner.rotation.z = THREE.MathUtils.degToRad(rotationDeg.z) - - return { model: blockInner, type: handItem.type } - } - - async replaceItemModel (handItem?: HandItemBlock): Promise { - // if switch animation is in progress, do not replace the item - if (this.blockSwapAnimation?.switcher.isTransitioning) return - - if (!handItem) { - this.holdingBlock?.removeFromParent() - this.holdingBlock = undefined - this.swingAnimator?.stopSwing() - this.swingAnimator = undefined - this.idleAnimator = undefined - return - } - - const result = await this.createItemModel(handItem) - if (!result) return - - // Update the model without changing the group structure - this.holdingBlock?.removeFromParent() - this.holdingBlock = result.model - this.holdingBlockInnerGroup.add(result.model) - - - } - - testUnknownBlockSwitch () { - void this.setNewItem({ - type: 'item', - name: 'minecraft:some-unknown-block', - id: 0, - fullItem: {} - }) - } - - switchRequest = 0 - async setNewItem (handItem?: HandItemBlock) { - if (!this.isDifferentItem(handItem)) return - this.lastItemModelName = undefined - const switchRequest = ++this.switchRequest - this.lastHeldItem = handItem - let playAppearAnimation = false - if (this.holdingBlock) { - // play disappear animation - playAppearAnimation = true - const result = await this.playBlockSwapAnimation('disappeared') - if (!result) return - this.holdingBlock?.removeFromParent() - this.holdingBlock = undefined - } - - if (!handItem) { - this.swingAnimator?.stopSwing() - this.swingAnimator = undefined - this.idleAnimator = undefined - this.blockSwapAnimation = undefined - return - } - - if (switchRequest !== this.switchRequest) return - const result = await this.createItemModel(handItem) - if (!result || switchRequest !== this.switchRequest) return - - const blockOuterGroup = new THREE.Group() - this.holdingBlockInnerGroup.removeFromParent() - this.holdingBlockInnerGroup = new THREE.Group() - this.holdingBlockInnerGroup.add(result.model) - blockOuterGroup.add(this.holdingBlockInnerGroup) - this.holdingBlock = result.model - this.objectInnerGroup = new THREE.Group() - this.objectInnerGroup.add(blockOuterGroup) - this.objectInnerGroup.position.set(-0.5, -0.5, -0.5) - if (playAppearAnimation) { - this.objectInnerGroup.position.y -= this.objectInnerGroup.scale.y * 1.5 - } - Object.assign(blockOuterGroup.position, { x: 0.5, y: 0.5, z: 0.5 }) - - this.objectOuterGroup = new THREE.Group() - this.objectOuterGroup.add(this.objectInnerGroup) - - this.cameraGroup.add(this.objectOuterGroup) - const rotationDeg = this.getHandHeld3d().rotation - this.objectOuterGroup.rotation.y = THREE.MathUtils.degToRad(rotationDeg.yOuter) - - if (playAppearAnimation) { - await this.playBlockSwapAnimation('appeared') - } - - this.swingAnimator = new HandSwingAnimator(this.holdingBlockInnerGroup) - this.swingAnimator.type = result.type - if (this.config.viewBobbing) { - this.idleAnimator = new HandIdleAnimator(this.holdingBlockInnerGroup, this.worldRenderer.playerStateReactive) - } - } - - getHandHeld3d () { - const type = this.lastHeldItem?.type ?? 'hand' - const side = this.offHandModeLegacy ? 'Left' : 'Right' - - let scale = 0.8 * 1.15 // default scale for hand - let position = { - x: 0.4, - y: -0.7, - z: -0.45 - } - let rotation = { - x: -32.4, - y: 42.8, - z: -41.3, - yOuter: 0 - } - - if (type === 'item') { - const itemData = rotationPositionData[`item${side}`] - position = { - x: -0.05, - y: -0.7, - z: -0.45 - } - rotation = { - x: itemData.rotation[0], - y: itemData.rotation[1], - z: itemData.rotation[2], - yOuter: 0 - } - scale = itemData.scale[0] * 1.15 - } else if (type === 'block') { - const blockData = rotationPositionData[`block${side}`] - position = { - x: 0.4, - y: -0.7, - z: -0.45 - } - rotation = { - x: blockData.rotation[0], - y: blockData.rotation[1], - z: blockData.rotation[2], - yOuter: 0 - } - scale = blockData.scale[0] * 1.15 - } - - return { - rotation, - position, - scale - } - } -} - -class HandIdleAnimator { - globalTime = 0 - lastTime = 0 - currentState: MovementState - targetState: MovementState - defaultPosition: { x: number; y: number; z: number; rotationX: number; rotationY: number; rotationZ: number } - private readonly idleOffset = { y: 0, rotationZ: 0 } - private readonly tween = new tweenJs.Group() - private idleTween: tweenJs.Tween<{ y: number; rotationZ: number }> | null = null - private readonly stateSwitcher: SmoothSwitcher - - // Debug parameters - private readonly debugParams = { - // Transition durations for different state changes - walkingSpeed: 8, - sprintingSpeed: 16, - walkingAmplitude: { x: 1 / 30, y: 1 / 10, rotationZ: 0.25 }, - sprintingAmplitude: { x: 1 / 30, y: 1 / 10, rotationZ: 0.4 } - } - - private readonly debugGui: DebugGui - - constructor (public handMesh: THREE.Object3D, public playerState: PlayerStateRenderer) { - this.handMesh = handMesh - this.globalTime = 0 - this.currentState = 'NOT_MOVING' - this.targetState = 'NOT_MOVING' - - this.defaultPosition = { - x: handMesh.position.x, - y: handMesh.position.y, - z: handMesh.position.z, - rotationX: handMesh.rotation.x, - rotationY: handMesh.rotation.y, - rotationZ: handMesh.rotation.z - } - - // Initialize state switcher with appropriate speeds - this.stateSwitcher = new SmoothSwitcher( - () => { - return { - x: this.handMesh.position.x, - y: this.handMesh.position.y, - z: this.handMesh.position.z, - rotationX: this.handMesh.rotation.x, - rotationY: this.handMesh.rotation.y, - rotationZ: this.handMesh.rotation.z - } - }, - (property, value) => { - switch (property) { - case 'x': this.handMesh.position.x = value; break - case 'y': this.handMesh.position.y = value; break - case 'z': this.handMesh.position.z = value; break - case 'rotationX': this.handMesh.rotation.x = value; break - case 'rotationY': this.handMesh.rotation.y = value; break - case 'rotationZ': this.handMesh.rotation.z = value; break - } - }, - { - x: 2, // units per second - y: 2, - z: 2, - rotation: Math.PI // radians per second - } - ) - - // Initialize debug GUI - this.debugGui = new DebugGui('idle_animator', this.debugParams) - // this.debugGui.activate() - } - - private startIdleAnimation () { - if (this.idleTween) { - this.idleTween.stop() - } - - // Start from current position for smooth transition - this.idleOffset.y = this.handMesh.position.y - this.defaultPosition.y - this.idleOffset.rotationZ = this.handMesh.rotation.z - this.defaultPosition.rotationZ - - this.idleTween = new tweenJs.Tween(this.idleOffset, this.tween) - .to({ - y: 0.05, - rotationZ: 0.05 - }, 3000) - .easing(tweenJs.Easing.Sinusoidal.InOut) - .yoyo(true) - .repeat(Infinity) - .start() - } - - private stopIdleAnimation () { - if (this.idleTween) { - this.idleTween.stop() - this.idleOffset.y = 0 - this.idleOffset.rotationZ = 0 - } - } - - private getStateTransform (state: MovementState, time: number) { - switch (state) { - case 'NOT_MOVING': - case 'SNEAKING': - return { - x: this.defaultPosition.x, - y: this.defaultPosition.y, - z: this.defaultPosition.z, - rotationX: this.defaultPosition.rotationX, - rotationY: this.defaultPosition.rotationY, - rotationZ: this.defaultPosition.rotationZ - } - case 'WALKING': - case 'SPRINTING': { - const speed = state === 'SPRINTING' ? this.debugParams.sprintingSpeed : this.debugParams.walkingSpeed - const amplitude = state === 'SPRINTING' ? this.debugParams.sprintingAmplitude : this.debugParams.walkingAmplitude - - return { - x: this.defaultPosition.x + Math.sin(time * speed) * amplitude.x, - y: this.defaultPosition.y - Math.abs(Math.cos(time * speed)) * amplitude.y, - z: this.defaultPosition.z, - rotationX: this.defaultPosition.rotationX, - rotationY: this.defaultPosition.rotationY, - // rotationZ: this.defaultPosition.rotationZ + Math.sin(time * speed) * amplitude.rotationZ - rotationZ: this.defaultPosition.rotationZ - } - } - } - } - - setState (newState: MovementState) { - if (newState === this.targetState) return - - this.targetState = newState - const noTransition = false - if (this.currentState !== newState) { - // Stop idle animation during state transitions - this.stopIdleAnimation() - - // Calculate new state transform - if (!noTransition) { - // this.globalTime = 0 - const stateTransform = this.getStateTransform(newState, this.globalTime) - - // Start transition to new state - this.stateSwitcher.transitionTo(stateTransform, newState) - // this.updated = false - } - this.currentState = newState - } - } - - updated = false - update () { - this.stateSwitcher.update() - - const now = performance.now() - const deltaTime = (now - this.lastTime) / 1000 - this.lastTime = now - - // Update global time based on current state - if (!this.stateSwitcher.isTransitioning) { - switch (this.currentState) { - case 'NOT_MOVING': - case 'SNEAKING': - this.globalTime = Math.PI / 4 - break - case 'SPRINTING': - case 'WALKING': - this.globalTime += deltaTime - break - } - } - - // Check for state changes from player state - if (this.playerState) { - const newState = this.playerState.movementState - if (newState !== this.targetState) { - this.setState(newState) - } - } - - // If we're not transitioning between states and in a stable state that should have idle animation - if (!this.stateSwitcher.isTransitioning && - (this.currentState === 'NOT_MOVING' || this.currentState === 'SNEAKING')) { - // Start idle animation if not already running - if (!this.idleTween?.isPlaying()) { - this.startIdleAnimation() - } - // Update idle animation - this.tween.update() - - // Apply idle offsets - this.handMesh.position.y = this.defaultPosition.y + this.idleOffset.y - this.handMesh.rotation.z = this.defaultPosition.rotationZ + this.idleOffset.rotationZ - } - - // If we're in a movement state and not transitioning, update the movement animation - if (!this.stateSwitcher.isTransitioning && - (this.currentState === 'WALKING' || this.currentState === 'SPRINTING')) { - const stateTransform = this.getStateTransform(this.currentState, this.globalTime) - Object.assign(this.handMesh.position, stateTransform) - Object.assign(this.handMesh.rotation, { - x: stateTransform.rotationX, - y: stateTransform.rotationY, - z: stateTransform.rotationZ - }) - // this.stateSwitcher.transitionTo(stateTransform, this.currentState) - } - } - - getCurrentState () { - return this.currentState - } - - destroy () { - this.stopIdleAnimation() - this.stateSwitcher.forceFinish() - } -} - -class HandSwingAnimator { - private readonly PI = Math.PI - private animationTimer = 0 - private lastTime = 0 - private isAnimating = false - private stopRequested = false - private readonly originalRotation: THREE.Euler - private readonly originalPosition: THREE.Vector3 - private readonly originalScale: THREE.Vector3 - - readonly debugParams = { - // Animation timing - animationTime: 250, - animationStage: 0, - useClassicSwing: true, - - // Item/Block animation parameters - itemSwingXPosScale: -0.8, - itemSwingYPosScale: 0.2, - itemSwingZPosScale: -0.2, - itemHeightScale: -0.6, - itemPreswingRotY: 45, - itemSwingXRotAmount: -30, - itemSwingYRotAmount: -35, - itemSwingZRotAmount: -5, - - // Hand/Arm animation parameters - armSwingXPosScale: -0.3, - armSwingYPosScale: 0.4, - armSwingZPosScale: -0.4, - armSwingYRotAmount: 70, - armSwingZRotAmount: -20, - armHeightScale: -0.6 - } - - private readonly debugGui: DebugGui - - public type: 'hand' | 'block' | 'item' = 'hand' - - constructor (public handMesh: THREE.Object3D) { - this.handMesh = handMesh - // Store initial transforms - this.originalRotation = handMesh.rotation.clone() - this.originalPosition = handMesh.position.clone() - this.originalScale = handMesh.scale.clone() - - // Initialize debug GUI - this.debugGui = new DebugGui('hand_animator', this.debugParams, undefined, { - animationStage: { - min: 0, - max: 1, - step: 0.01 - }, - // Add ranges for all animation parameters - itemSwingXPosScale: { min: -2, max: 2, step: 0.1 }, - itemSwingYPosScale: { min: -2, max: 2, step: 0.1 }, - itemSwingZPosScale: { min: -2, max: 2, step: 0.1 }, - itemHeightScale: { min: -2, max: 2, step: 0.1 }, - itemPreswingRotY: { min: -180, max: 180, step: 5 }, - itemSwingXRotAmount: { min: -180, max: 180, step: 5 }, - itemSwingYRotAmount: { min: -180, max: 180, step: 5 }, - itemSwingZRotAmount: { min: -180, max: 180, step: 5 }, - armSwingXPosScale: { min: -2, max: 2, step: 0.1 }, - armSwingYPosScale: { min: -2, max: 2, step: 0.1 }, - armSwingZPosScale: { min: -2, max: 2, step: 0.1 }, - armSwingYRotAmount: { min: -180, max: 180, step: 5 }, - armSwingZRotAmount: { min: -180, max: 180, step: 5 }, - armHeightScale: { min: -2, max: 2, step: 0.1 } - }) - // this.debugGui.activate() - } - - update () { - if (!this.isAnimating && !this.debugParams.animationStage) { - // If not animating, ensure we're at original position - this.handMesh.rotation.copy(this.originalRotation) - this.handMesh.position.copy(this.originalPosition) - this.handMesh.scale.copy(this.originalScale) - return - } - - const now = performance.now() - const deltaTime = (now - this.lastTime) / 1000 - this.lastTime = now - - // Update animation progress - this.animationTimer += deltaTime * 1000 // Convert to ms - - // Calculate animation stage (0 to 1) - const stage = this.debugParams.animationStage || Math.min(this.animationTimer / this.debugParams.animationTime, 1) - - if (stage >= 1) { - // Animation complete - if (this.stopRequested) { - // If stop was requested, actually stop now that we've completed a swing - this.isAnimating = false - this.stopRequested = false - this.animationTimer = 0 - this.handMesh.rotation.copy(this.originalRotation) - this.handMesh.position.copy(this.originalPosition) - this.handMesh.scale.copy(this.originalScale) - return - } - // Otherwise reset timer and continue - this.animationTimer = 0 - return - } - - // Start from original transforms - this.handMesh.rotation.copy(this.originalRotation) - this.handMesh.position.copy(this.originalPosition) - this.handMesh.scale.copy(this.originalScale) - - // Calculate swing progress - const swingProgress = stage - const sqrtProgress = Math.sqrt(swingProgress) - const sinProgress = Math.sin(swingProgress * this.PI) - const sinSqrtProgress = Math.sin(sqrtProgress * this.PI) - - if (this.type === 'hand') { - // Hand animation - const xOffset = this.debugParams.armSwingXPosScale * sinSqrtProgress - const yOffset = this.debugParams.armSwingYPosScale * Math.sin(sqrtProgress * this.PI * 2) - const zOffset = this.debugParams.armSwingZPosScale * sinProgress - - this.handMesh.position.x += xOffset - this.handMesh.position.y += yOffset + this.debugParams.armHeightScale * swingProgress - this.handMesh.position.z += zOffset - - // Rotations - this.handMesh.rotation.y += THREE.MathUtils.degToRad(this.debugParams.armSwingYRotAmount * sinSqrtProgress) - this.handMesh.rotation.z += THREE.MathUtils.degToRad(this.debugParams.armSwingZRotAmount * sinProgress) - } else { - // Item/Block animation - const xOffset = this.debugParams.itemSwingXPosScale * sinSqrtProgress - const yOffset = this.debugParams.itemSwingYPosScale * Math.sin(sqrtProgress * this.PI * 2) - const zOffset = this.debugParams.itemSwingZPosScale * sinProgress - - this.handMesh.position.x += xOffset - this.handMesh.position.y += yOffset + this.debugParams.itemHeightScale * swingProgress - this.handMesh.position.z += zOffset - - // Pre-swing rotation - this.handMesh.rotation.y += THREE.MathUtils.degToRad(this.debugParams.itemPreswingRotY) - - // Swing rotations - this.handMesh.rotation.x += THREE.MathUtils.degToRad(this.debugParams.itemSwingXRotAmount * sinProgress) - this.handMesh.rotation.y += THREE.MathUtils.degToRad(this.debugParams.itemSwingYRotAmount * sinSqrtProgress) - this.handMesh.rotation.z += THREE.MathUtils.degToRad(this.debugParams.itemSwingZRotAmount * sinProgress) - } - } - - startSwing () { - this.stopRequested = false - if (this.isAnimating) return - - this.isAnimating = true - this.animationTimer = 0 - this.lastTime = performance.now() - } - - stopSwing () { - if (!this.isAnimating) return - this.stopRequested = true - } - - isCurrentlySwinging () { - return this.isAnimating - } -} - -export const getBlockMeshFromModel = (material: THREE.Material, model: BlockModel, name: string, blockProvider: WorldBlockProvider) => { - const worldRenderModel = blockProvider.transformModel(model, { - name, - properties: {} - }) as any - return getThreeBlockModelGroup(material, [[worldRenderModel]], undefined, 'plains', loadedData) -} diff --git a/renderer/viewer/three/itemMesh.ts b/renderer/viewer/three/itemMesh.ts deleted file mode 100644 index 3fa069b9..00000000 --- a/renderer/viewer/three/itemMesh.ts +++ /dev/null @@ -1,427 +0,0 @@ -import * as THREE from 'three' - -export interface Create3DItemMeshOptions { - depth: number - pixelSize?: number -} - -export interface Create3DItemMeshResult { - geometry: THREE.BufferGeometry - totalVertices: number - totalTriangles: number -} - -/** - * Creates a 3D item geometry with front/back faces and connecting edges - * from a canvas containing the item texture - */ -export function create3DItemMesh ( - canvas: HTMLCanvasElement, - options: Create3DItemMeshOptions -): Create3DItemMeshResult { - const { depth, pixelSize } = options - - // Validate canvas dimensions - if (canvas.width <= 0 || canvas.height <= 0) { - throw new Error(`Invalid canvas dimensions: ${canvas.width}x${canvas.height}`) - } - - const ctx = canvas.getContext('2d')! - const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height) - const { data } = imageData - - const w = canvas.width - const h = canvas.height - const halfDepth = depth / 2 - const actualPixelSize = pixelSize ?? (1 / Math.max(w, h)) - - // Find opaque pixels - const isOpaque = (x: number, y: number) => { - if (x < 0 || y < 0 || x >= w || y >= h) return false - const i = (y * w + x) * 4 - return data[i + 3] > 128 // alpha > 128 - } - - const vertices: number[] = [] - const indices: number[] = [] - const uvs: number[] = [] - const normals: number[] = [] - - let vertexIndex = 0 - - // Helper to add a vertex - const addVertex = (x: number, y: number, z: number, u: number, v: number, nx: number, ny: number, nz: number) => { - vertices.push(x, y, z) - uvs.push(u, v) - normals.push(nx, ny, nz) - return vertexIndex++ - } - - // Helper to add a quad (two triangles) - const addQuad = (v0: number, v1: number, v2: number, v3: number) => { - indices.push(v0, v1, v2, v0, v2, v3) - } - - // Convert pixel coordinates to world coordinates - const pixelToWorld = (px: number, py: number) => { - const x = (px / w - 0.5) * actualPixelSize * w - const y = -(py / h - 0.5) * actualPixelSize * h - return { x, y } - } - - // Create a grid of vertices for front and back faces - const frontVertices: Array> = Array.from({ length: h + 1 }, () => Array.from({ length: w + 1 }, () => null)) - const backVertices: Array> = Array.from({ length: h + 1 }, () => Array.from({ length: w + 1 }, () => null)) - - // Create vertices at pixel corners - for (let py = 0; py <= h; py++) { - for (let px = 0; px <= w; px++) { - const { x, y } = pixelToWorld(px - 0.5, py - 0.5) - - // UV coordinates should map to the texture space of the extracted tile - const u = px / w - const v = py / h - - // Check if this vertex is needed for any face or edge - let needVertex = false - - // Check all 4 adjacent pixels to see if any are opaque - const adjacentPixels = [ - [px - 1, py - 1], // top-left pixel - [px, py - 1], // top-right pixel - [px - 1, py], // bottom-left pixel - [px, py] // bottom-right pixel - ] - - for (const [adjX, adjY] of adjacentPixels) { - if (isOpaque(adjX, adjY)) { - needVertex = true - break - } - } - - if (needVertex) { - frontVertices[py][px] = addVertex(x, y, halfDepth, u, v, 0, 0, 1) - backVertices[py][px] = addVertex(x, y, -halfDepth, u, v, 0, 0, -1) - } - } - } - - // Create front and back faces - for (let py = 0; py < h; py++) { - for (let px = 0; px < w; px++) { - if (!isOpaque(px, py)) continue - - const v00 = frontVertices[py][px] - const v10 = frontVertices[py][px + 1] - const v11 = frontVertices[py + 1][px + 1] - const v01 = frontVertices[py + 1][px] - - const b00 = backVertices[py][px] - const b10 = backVertices[py][px + 1] - const b11 = backVertices[py + 1][px + 1] - const b01 = backVertices[py + 1][px] - - if (v00 !== null && v10 !== null && v11 !== null && v01 !== null) { - // Front face - addQuad(v00, v10, v11, v01) - } - - if (b00 !== null && b10 !== null && b11 !== null && b01 !== null) { - // Back face (reversed winding) - addQuad(b10, b00, b01, b11) - } - } - } - - // Create edge faces for each side of the pixel with proper UVs - for (let py = 0; py < h; py++) { - for (let px = 0; px < w; px++) { - if (!isOpaque(px, py)) continue - - const pixelU = (px + 0.5) / w // Center of current pixel - const pixelV = (py + 0.5) / h - - // Left edge (x = px) - if (!isOpaque(px - 1, py)) { - const f0 = frontVertices[py][px] - const f1 = frontVertices[py + 1][px] - const b0 = backVertices[py][px] - const b1 = backVertices[py + 1][px] - - if (f0 !== null && f1 !== null && b0 !== null && b1 !== null) { - // Create new vertices for edge with current pixel's UV - const ef0 = addVertex(vertices[f0 * 3], vertices[f0 * 3 + 1], vertices[f0 * 3 + 2], pixelU, pixelV, -1, 0, 0) - const ef1 = addVertex(vertices[f1 * 3], vertices[f1 * 3 + 1], vertices[f1 * 3 + 2], pixelU, pixelV, -1, 0, 0) - const eb1 = addVertex(vertices[b1 * 3], vertices[b1 * 3 + 1], vertices[b1 * 3 + 2], pixelU, pixelV, -1, 0, 0) - const eb0 = addVertex(vertices[b0 * 3], vertices[b0 * 3 + 1], vertices[b0 * 3 + 2], pixelU, pixelV, -1, 0, 0) - addQuad(ef0, ef1, eb1, eb0) - } - } - - // Right edge (x = px + 1) - if (!isOpaque(px + 1, py)) { - const f0 = frontVertices[py + 1][px + 1] - const f1 = frontVertices[py][px + 1] - const b0 = backVertices[py + 1][px + 1] - const b1 = backVertices[py][px + 1] - - if (f0 !== null && f1 !== null && b0 !== null && b1 !== null) { - const ef0 = addVertex(vertices[f0 * 3], vertices[f0 * 3 + 1], vertices[f0 * 3 + 2], pixelU, pixelV, 1, 0, 0) - const ef1 = addVertex(vertices[f1 * 3], vertices[f1 * 3 + 1], vertices[f1 * 3 + 2], pixelU, pixelV, 1, 0, 0) - const eb1 = addVertex(vertices[b1 * 3], vertices[b1 * 3 + 1], vertices[b1 * 3 + 2], pixelU, pixelV, 1, 0, 0) - const eb0 = addVertex(vertices[b0 * 3], vertices[b0 * 3 + 1], vertices[b0 * 3 + 2], pixelU, pixelV, 1, 0, 0) - addQuad(ef0, ef1, eb1, eb0) - } - } - - // Top edge (y = py) - if (!isOpaque(px, py - 1)) { - const f0 = frontVertices[py][px] - const f1 = frontVertices[py][px + 1] - const b0 = backVertices[py][px] - const b1 = backVertices[py][px + 1] - - if (f0 !== null && f1 !== null && b0 !== null && b1 !== null) { - const ef0 = addVertex(vertices[f0 * 3], vertices[f0 * 3 + 1], vertices[f0 * 3 + 2], pixelU, pixelV, 0, -1, 0) - const ef1 = addVertex(vertices[f1 * 3], vertices[f1 * 3 + 1], vertices[f1 * 3 + 2], pixelU, pixelV, 0, -1, 0) - const eb1 = addVertex(vertices[b1 * 3], vertices[b1 * 3 + 1], vertices[b1 * 3 + 2], pixelU, pixelV, 0, -1, 0) - const eb0 = addVertex(vertices[b0 * 3], vertices[b0 * 3 + 1], vertices[b0 * 3 + 2], pixelU, pixelV, 0, -1, 0) - addQuad(ef0, ef1, eb1, eb0) - } - } - - // Bottom edge (y = py + 1) - if (!isOpaque(px, py + 1)) { - const f0 = frontVertices[py + 1][px + 1] - const f1 = frontVertices[py + 1][px] - const b0 = backVertices[py + 1][px + 1] - const b1 = backVertices[py + 1][px] - - if (f0 !== null && f1 !== null && b0 !== null && b1 !== null) { - const ef0 = addVertex(vertices[f0 * 3], vertices[f0 * 3 + 1], vertices[f0 * 3 + 2], pixelU, pixelV, 0, 1, 0) - const ef1 = addVertex(vertices[f1 * 3], vertices[f1 * 3 + 1], vertices[f1 * 3 + 2], pixelU, pixelV, 0, 1, 0) - const eb1 = addVertex(vertices[b1 * 3], vertices[b1 * 3 + 1], vertices[b1 * 3 + 2], pixelU, pixelV, 0, 1, 0) - const eb0 = addVertex(vertices[b0 * 3], vertices[b0 * 3 + 1], vertices[b0 * 3 + 2], pixelU, pixelV, 0, 1, 0) - addQuad(ef0, ef1, eb1, eb0) - } - } - } - } - - const geometry = new THREE.BufferGeometry() - geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3)) - geometry.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2)) - geometry.setAttribute('normal', new THREE.Float32BufferAttribute(normals, 3)) - geometry.setIndex(indices) - - // Compute normals properly - geometry.computeVertexNormals() - - return { - geometry, - totalVertices: vertexIndex, - totalTriangles: indices.length / 3 - } -} - -export interface ItemTextureInfo { - u: number - v: number - sizeX: number - sizeY: number -} - -export interface ItemMeshResult { - mesh: THREE.Object3D - itemsTexture?: THREE.Texture - itemsTextureFlipped?: THREE.Texture - cleanup?: () => void -} - -/** - * Extracts item texture region to a canvas - */ -export function extractItemTextureToCanvas ( - sourceTexture: THREE.Texture, - textureInfo: ItemTextureInfo -): HTMLCanvasElement { - const { u, v, sizeX, sizeY } = textureInfo - - // Calculate canvas size - fix the calculation - const canvasWidth = Math.max(1, Math.floor(sizeX * sourceTexture.image.width)) - const canvasHeight = Math.max(1, Math.floor(sizeY * sourceTexture.image.height)) - - const canvas = document.createElement('canvas') - canvas.width = canvasWidth - canvas.height = canvasHeight - - const ctx = canvas.getContext('2d')! - ctx.imageSmoothingEnabled = false - - // Draw the item texture region to canvas - ctx.drawImage( - sourceTexture.image, - u * sourceTexture.image.width, - v * sourceTexture.image.height, - sizeX * sourceTexture.image.width, - sizeY * sourceTexture.image.height, - 0, - 0, - canvas.width, - canvas.height - ) - - return canvas -} - -/** - * Creates either a 2D or 3D item mesh based on parameters - */ -export function createItemMesh ( - sourceTexture: THREE.Texture, - textureInfo: ItemTextureInfo, - options: { - faceCamera?: boolean - use3D?: boolean - depth?: number - } = {} -): ItemMeshResult { - const { faceCamera = false, use3D = true, depth = 0.04 } = options - const { u, v, sizeX, sizeY } = textureInfo - - if (faceCamera) { - // Create sprite for camera-facing items - const itemsTexture = sourceTexture.clone() - itemsTexture.flipY = true - itemsTexture.offset.set(u, 1 - v - sizeY) - itemsTexture.repeat.set(sizeX, sizeY) - itemsTexture.needsUpdate = true - itemsTexture.magFilter = THREE.NearestFilter - itemsTexture.minFilter = THREE.NearestFilter - - const spriteMat = new THREE.SpriteMaterial({ - map: itemsTexture, - transparent: true, - alphaTest: 0.1, - }) - const mesh = new THREE.Sprite(spriteMat) - - return { - mesh, - itemsTexture, - cleanup () { - itemsTexture.dispose() - } - } - } - - if (use3D) { - // Try to create 3D mesh - try { - const canvas = extractItemTextureToCanvas(sourceTexture, textureInfo) - const { geometry } = create3DItemMesh(canvas, { depth }) - - // Create texture from canvas for the 3D mesh - const itemsTexture = new THREE.CanvasTexture(canvas) - itemsTexture.magFilter = THREE.NearestFilter - itemsTexture.minFilter = THREE.NearestFilter - itemsTexture.wrapS = itemsTexture.wrapT = THREE.ClampToEdgeWrapping - itemsTexture.flipY = false - itemsTexture.needsUpdate = true - - const material = new THREE.MeshStandardMaterial({ - map: itemsTexture, - side: THREE.DoubleSide, - transparent: true, - alphaTest: 0.1, - }) - - const mesh = new THREE.Mesh(geometry, material) - - return { - mesh, - itemsTexture, - cleanup () { - itemsTexture.dispose() - geometry.dispose() - if (material.map) material.map.dispose() - material.dispose() - } - } - } catch (error) { - console.warn('Failed to create 3D item mesh, falling back to 2D:', error) - // Fall through to 2D rendering - } - } - - // Fallback to 2D flat rendering - const itemsTexture = sourceTexture.clone() - itemsTexture.flipY = true - itemsTexture.offset.set(u, 1 - v - sizeY) - itemsTexture.repeat.set(sizeX, sizeY) - itemsTexture.needsUpdate = true - itemsTexture.magFilter = THREE.NearestFilter - itemsTexture.minFilter = THREE.NearestFilter - - const itemsTextureFlipped = itemsTexture.clone() - itemsTextureFlipped.repeat.x *= -1 - itemsTextureFlipped.needsUpdate = true - itemsTextureFlipped.offset.set(u + sizeX, 1 - v - sizeY) - - const material = new THREE.MeshStandardMaterial({ - map: itemsTexture, - transparent: true, - alphaTest: 0.1, - }) - const materialFlipped = new THREE.MeshStandardMaterial({ - map: itemsTextureFlipped, - transparent: true, - alphaTest: 0.1, - }) - const mesh = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 0), [ - new THREE.MeshBasicMaterial({ color: 0x00_00_00 }), new THREE.MeshBasicMaterial({ color: 0x00_00_00 }), - new THREE.MeshBasicMaterial({ color: 0x00_00_00 }), new THREE.MeshBasicMaterial({ color: 0x00_00_00 }), - material, materialFlipped, - ]) - - return { - mesh, - itemsTexture, - itemsTextureFlipped, - cleanup () { - itemsTexture.dispose() - itemsTextureFlipped.dispose() - material.dispose() - materialFlipped.dispose() - } - } -} - -/** - * Creates a complete 3D item mesh from a canvas texture - */ -export function createItemMeshFromCanvas ( - canvas: HTMLCanvasElement, - options: Create3DItemMeshOptions -): THREE.Mesh { - const { geometry } = create3DItemMesh(canvas, options) - - // Base color texture for the item - const colorTexture = new THREE.CanvasTexture(canvas) - colorTexture.magFilter = THREE.NearestFilter - colorTexture.minFilter = THREE.NearestFilter - colorTexture.wrapS = colorTexture.wrapT = THREE.ClampToEdgeWrapping - colorTexture.flipY = false // Important for canvas textures - colorTexture.needsUpdate = true - - // Material - no transparency, no alpha test needed for edges - const material = new THREE.MeshBasicMaterial({ - map: colorTexture, - side: THREE.DoubleSide, - transparent: true, - alphaTest: 0.1 - }) - - return new THREE.Mesh(geometry, material) -} diff --git a/renderer/viewer/three/panorama.ts b/renderer/viewer/three/panorama.ts deleted file mode 100644 index 254b980c..00000000 --- a/renderer/viewer/three/panorama.ts +++ /dev/null @@ -1,302 +0,0 @@ -import { join } from 'path' -import * as THREE from 'three' -import { getSyncWorld } from 'renderer/playground/shared' -import { Vec3 } from 'vec3' -import * as tweenJs from '@tweenjs/tween.js' -import type { GraphicsInitOptions } from '../../../src/appViewer' -import { WorldDataEmitter } from '../lib/worldDataEmitter' -import { defaultWorldRendererConfig, WorldRendererCommon } from '../lib/worldrendererCommon' -import { getDefaultRendererState } from '../baseGraphicsBackend' -import { ResourcesManager } from '../../../src/resourcesManager' -import { getInitialPlayerStateRenderer } from '../lib/basePlayerState' -import { loadThreeJsTextureFromUrl, loadThreeJsTextureFromUrlSync } from './threeJsUtils' -import { WorldRendererThree } from './worldrendererThree' -import { EntityMesh } from './entity/EntityMesh' -import { DocumentRenderer } from './documentRenderer' -import { PANORAMA_VERSION } from './panoramaShared' - -const panoramaFiles = [ - 'panorama_3.png', // right (+x) - 'panorama_1.png', // left (-x) - 'panorama_4.png', // top (+y) - 'panorama_5.png', // bottom (-y) - 'panorama_0.png', // front (+z) - 'panorama_2.png', // back (-z) -] - -export class PanoramaRenderer { - private readonly camera: THREE.PerspectiveCamera - private scene: THREE.Scene - private readonly ambientLight: THREE.AmbientLight - private readonly directionalLight: THREE.DirectionalLight - private panoramaGroup: THREE.Object3D | null = null - private time = 0 - private readonly abortController = new AbortController() - private worldRenderer: WorldRendererCommon | WorldRendererThree | undefined - public WorldRendererClass = WorldRendererThree - public startTimes = new Map() - - constructor (private readonly documentRenderer: DocumentRenderer, private readonly options: GraphicsInitOptions, private readonly doWorldBlocksPanorama = false) { - this.scene = new THREE.Scene() - // #324568 - this.scene.background = new THREE.Color(0x32_45_68) - - // Add ambient light - this.ambientLight = new THREE.AmbientLight(0xcc_cc_cc) - this.scene.add(this.ambientLight) - - // Add directional light - this.directionalLight = new THREE.DirectionalLight(0xff_ff_ff, 0.5) - this.directionalLight.position.set(1, 1, 0.5).normalize() - this.directionalLight.castShadow = true - this.scene.add(this.directionalLight) - - this.camera = new THREE.PerspectiveCamera(85, this.documentRenderer.canvas.width / this.documentRenderer.canvas.height, 0.05, 1000) - this.camera.position.set(0, 0, 0) - this.camera.rotation.set(0, 0, 0) - } - - async start () { - if (this.doWorldBlocksPanorama) { - await this.worldBlocksPanorama() - } else { - this.addClassicPanorama() - } - - - this.documentRenderer.render = (sizeChanged = false) => { - if (sizeChanged) { - this.camera.aspect = this.documentRenderer.canvas.width / this.documentRenderer.canvas.height - this.camera.updateProjectionMatrix() - } - this.documentRenderer.renderer.render(this.scene, this.camera) - } - } - - async debugImageInFrontOfCamera () { - const image = await loadThreeJsTextureFromUrl(join('background', 'panorama_0.png')) - const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1000, 1000), new THREE.MeshBasicMaterial({ map: image })) - mesh.position.set(0, 0, -500) - mesh.rotation.set(0, 0, 0) - this.scene.add(mesh) - } - - addClassicPanorama () { - const panorGeo = new THREE.BoxGeometry(1000, 1000, 1000) - const panorMaterials = [] as THREE.MeshBasicMaterial[] - const fadeInDuration = 200 - - // void this.debugImageInFrontOfCamera() - - for (const file of panoramaFiles) { - const load = async () => { - const { texture } = loadThreeJsTextureFromUrlSync(join('background', file)) - - // Instead of using repeat/offset to flip, we'll use the texture matrix - texture.matrixAutoUpdate = false - texture.matrix.set( - -1, 0, 1, 0, 1, 0, 0, 0, 1 - ) - - texture.wrapS = THREE.ClampToEdgeWrapping - texture.wrapT = THREE.ClampToEdgeWrapping - texture.minFilter = THREE.LinearFilter - texture.magFilter = THREE.LinearFilter - - const material = new THREE.MeshBasicMaterial({ - map: texture, - transparent: true, - side: THREE.DoubleSide, - depthWrite: false, - opacity: 0 // Start with 0 opacity - }) - - // Start fade-in when texture is loaded - this.startTimes.set(material, Date.now()) - panorMaterials.push(material) - } - - void load() - } - - const panoramaBox = new THREE.Mesh(panorGeo, panorMaterials) - panoramaBox.onBeforeRender = () => { - this.time += 0.01 - panoramaBox.rotation.y = Math.PI + this.time * 0.01 - panoramaBox.rotation.z = Math.sin(-this.time * 0.001) * 0.001 - - // Time-based fade in animation for each material - for (const material of panorMaterials) { - const startTime = this.startTimes.get(material) - if (startTime) { - const elapsed = Date.now() - startTime - const progress = Math.min(1, elapsed / fadeInDuration) - material.opacity = progress - } - } - } - - const group = new THREE.Object3D() - group.add(panoramaBox) - - // Add squids - for (let i = 0; i < 20; i++) { - const m = new EntityMesh('1.16.4', 'squid').mesh - m.position.set(Math.random() * 30 - 15, Math.random() * 20 - 10, Math.random() * 10 - 17) - m.rotation.set(0, Math.PI + Math.random(), -Math.PI / 4, 'ZYX') - const v = Math.random() * 0.01 - m.children[0].onBeforeRender = () => { - m.rotation.y += v - m.rotation.z = Math.cos(panoramaBox.rotation.y * 3) * Math.PI / 4 - Math.PI / 2 - } - group.add(m) - } - - this.scene.add(group) - this.panoramaGroup = group - } - - async worldBlocksPanorama () { - const version = PANORAMA_VERSION - const fullResourceManager = this.options.resourcesManager as ResourcesManager - fullResourceManager.currentConfig = { version, noInventoryGui: true, } - await fullResourceManager.updateAssetsData({ }) - if (this.abortController.signal.aborted) return - console.time('load panorama scene') - const world = getSyncWorld(version) - const PrismarineBlock = require('prismarine-block') - const Block = PrismarineBlock(version) - const fullBlocks = loadedData.blocksArray.filter(block => { - // if (block.name.includes('leaves')) return false - if (/* !block.name.includes('wool') && */!block.name.includes('stained_glass')/* && !block.name.includes('terracotta') */) return false - const b = Block.fromStateId(block.defaultState, 0) - if (b.shapes?.length !== 1) return false - const shape = b.shapes[0] - return shape[0] === 0 && shape[1] === 0 && shape[2] === 0 && shape[3] === 1 && shape[4] === 1 && shape[5] === 1 - }) - const Z = -15 - const sizeX = 100 - const sizeY = 100 - for (let x = -sizeX; x < sizeX; x++) { - for (let y = -sizeY; y < sizeY; y++) { - const block = fullBlocks[Math.floor(Math.random() * fullBlocks.length)] - world.setBlockStateId(new Vec3(x, y, Z), block.defaultState) - } - } - this.camera.updateProjectionMatrix() - this.camera.position.set(0.5, sizeY / 2 + 0.5, 0.5) - this.camera.rotation.set(0, 0, 0) - const initPos = new Vec3(...this.camera.position.toArray()) - const worldView = new WorldDataEmitter(world, 2, initPos) - // worldView.addWaitTime = 0 - if (this.abortController.signal.aborted) return - - this.worldRenderer = new this.WorldRendererClass( - this.documentRenderer.renderer, - this.options, - { - version, - worldView, - inWorldRenderingConfig: defaultWorldRendererConfig, - playerStateReactive: getInitialPlayerStateRenderer().reactive, - rendererState: getDefaultRendererState().reactive, - nonReactiveState: getDefaultRendererState().nonReactive - } - ) - if (this.worldRenderer instanceof WorldRendererThree) { - this.scene = this.worldRenderer.scene - } - void worldView.init(initPos) - - await this.worldRenderer.waitForChunksToRender() - if (this.abortController.signal.aborted) return - // add small camera rotation to side on mouse move depending on absolute position of the cursor - const { camera } = this - const initX = camera.position.x - const initY = camera.position.y - let prevTwin: tweenJs.Tween | undefined - document.body.addEventListener('pointermove', (e) => { - if (e.pointerType !== 'mouse') return - const pos = new THREE.Vector2(e.clientX, e.clientY) - const SCALE = 0.2 - /* -0.5 - 0.5 */ - const xRel = pos.x / window.innerWidth - 0.5 - const yRel = -(pos.y / window.innerHeight - 0.5) - prevTwin?.stop() - const to = { - x: initX + (xRel * SCALE), - y: initY + (yRel * SCALE) - } - prevTwin = new tweenJs.Tween(camera.position).to(to, 0) // todo use the number depending on diff // todo use the number depending on diff - // prevTwin.easing(tweenJs.Easing.Exponential.InOut) - prevTwin.start() - camera.updateProjectionMatrix() - }, { - signal: this.abortController.signal - }) - - console.timeEnd('load panorama scene') - } - - dispose () { - this.scene.clear() - this.worldRenderer?.destroy() - this.abortController.abort() - } -} - -// export class ClassicPanoramaRenderer { -// panoramaGroup: THREE.Object3D - -// constructor (private readonly backgroundFiles: string[], onRender: Array<(sizeChanged: boolean) => void>, addSquids = true) { -// const panorGeo = new THREE.BoxGeometry(1000, 1000, 1000) -// const loader = new THREE.TextureLoader() -// const panorMaterials = [] as THREE.MeshBasicMaterial[] - -// for (const file of this.backgroundFiles) { -// const texture = loader.load(file) - -// // Instead of using repeat/offset to flip, we'll use the texture matrix -// texture.matrixAutoUpdate = false -// texture.matrix.set( -// -1, 0, 1, 0, 1, 0, 0, 0, 1 -// ) - -// texture.wrapS = THREE.ClampToEdgeWrapping // Changed from RepeatWrapping -// texture.wrapT = THREE.ClampToEdgeWrapping // Changed from RepeatWrapping -// texture.minFilter = THREE.LinearFilter -// texture.magFilter = THREE.LinearFilter - -// panorMaterials.push(new THREE.MeshBasicMaterial({ -// map: texture, -// transparent: true, -// side: THREE.DoubleSide, -// depthWrite: false, -// })) -// } - -// const panoramaBox = new THREE.Mesh(panorGeo, panorMaterials) -// panoramaBox.onBeforeRender = () => { -// } - -// const group = new THREE.Object3D() -// group.add(panoramaBox) - -// if (addSquids) { -// // Add squids -// for (let i = 0; i < 20; i++) { -// const m = new EntityMesh('1.16.4', 'squid').mesh -// m.position.set(Math.random() * 30 - 15, Math.random() * 20 - 10, Math.random() * 10 - 17) -// m.rotation.set(0, Math.PI + Math.random(), -Math.PI / 4, 'ZYX') -// const v = Math.random() * 0.01 -// onRender.push(() => { -// m.rotation.y += v -// m.rotation.z = Math.cos(panoramaBox.rotation.y * 3) * Math.PI / 4 - Math.PI / 2 -// }) -// group.add(m) -// } -// } - -// this.panoramaGroup = group -// } -// } diff --git a/renderer/viewer/three/panoramaShared.ts b/renderer/viewer/three/panoramaShared.ts deleted file mode 100644 index ad80367f..00000000 --- a/renderer/viewer/three/panoramaShared.ts +++ /dev/null @@ -1 +0,0 @@ -export const PANORAMA_VERSION = '1.21.4' diff --git a/renderer/viewer/three/primitives.js b/renderer/viewer/three/primitives.js deleted file mode 100644 index 08c1c49e..00000000 --- a/renderer/viewer/three/primitives.js +++ /dev/null @@ -1,142 +0,0 @@ -/* eslint-disable unicorn/no-abusive-eslint-disable */ -/* eslint-disable */ -const THREE = require('three') -const { MeshLine, MeshLineMaterial } = require('three.meshline') - -function getMesh(primitive, camera) { - if (primitive.type === 'line') { - const color = primitive.color ? primitive.color : 0xff0000 - const resolution = new THREE.Vector2(window.innerWidth / camera.zoom, window.innerHeight / camera.zoom) - const material = new MeshLineMaterial({ color, resolution, sizeAttenuation: false, lineWidth: 8 }) - - const points = [] - for (const p of primitive.points) { - points.push(p.x, p.y, p.z) - } - - const line = new MeshLine() - line.setPoints(points) - return new THREE.Mesh(line, material) - } else if (primitive.type === 'boxgrid') { - const color = primitive.color ? primitive.color : 'aqua' - - const sx = primitive.end.x - primitive.start.x - const sy = primitive.end.y - primitive.start.y - const sz = primitive.end.z - primitive.start.z - - const boxGeometry = new THREE.BoxBufferGeometry(sx, sy, sz, sx, sy, sz) - boxGeometry.attributes.positionStart = boxGeometry.attributes.position.clone() - - const gridGeometry = GridBoxGeometry(boxGeometry, false) - const grid = new THREE.LineSegments(gridGeometry, new THREE.LineBasicMaterial({ color })) - grid.position.x = primitive.start.x + sx / 2 - grid.position.y = primitive.start.y + sy / 2 - grid.position.z = primitive.start.z + sz / 2 - return grid - } else if (primitive.type === 'points') { - const color = primitive.color ? primitive.color : 'aqua' - const size = primitive.size ? primitive.size : 5 - const points = [] - for (const p of primitive.points) { - points.push(p.x, p.y, p.z) - } - const geometry = new THREE.BufferGeometry() - geometry.setAttribute('position', new THREE.Float32BufferAttribute(points, 3)) - const material = new THREE.PointsMaterial({ color, size, sizeAttenuation: false }) - return new THREE.Points(geometry, material) - } - return null -} - -class Primitives { - constructor(scene, camera) { - this.scene = scene - this.camera = camera - this.primitives = {} - } - - clear() { - for (const mesh of Object.values(this.primitives)) { - this.scene.remove(mesh) - disposeObject(mesh) - } - this.primitives = {} - } - - update(primitive) { - if (this.primitives[primitive.id]) { - this.scene.remove(this.primitives[primitive.id]) - disposeObject(this.primitives[primitive.id]) - delete this.primitives[primitive.id] - } - - const mesh = getMesh(primitive, this.camera) - if (!mesh) return - this.primitives[primitive.id] = mesh - this.scene.add(mesh) - } -} - -function GridBoxGeometry(geometry, independent) { - if (!(geometry instanceof THREE.BoxBufferGeometry)) { - console.log("GridBoxGeometry: the parameter 'geometry' has to be of the type THREE.BoxBufferGeometry") - return geometry - } - independent = independent !== undefined ? independent : false - - const newGeometry = new THREE.BoxBufferGeometry() - const position = geometry.attributes.position - newGeometry.attributes.position = independent === false ? position : position.clone() - - const segmentsX = geometry.parameters.widthSegments || 1 - const segmentsY = geometry.parameters.heightSegments || 1 - const segmentsZ = geometry.parameters.depthSegments || 1 - - let startIndex = 0 - const indexSide1 = indexSide(segmentsZ, segmentsY, startIndex) - startIndex += (segmentsZ + 1) * (segmentsY + 1) - const indexSide2 = indexSide(segmentsZ, segmentsY, startIndex) - startIndex += (segmentsZ + 1) * (segmentsY + 1) - const indexSide3 = indexSide(segmentsX, segmentsZ, startIndex) - startIndex += (segmentsX + 1) * (segmentsZ + 1) - const indexSide4 = indexSide(segmentsX, segmentsZ, startIndex) - startIndex += (segmentsX + 1) * (segmentsZ + 1) - const indexSide5 = indexSide(segmentsX, segmentsY, startIndex) - startIndex += (segmentsX + 1) * (segmentsY + 1) - const indexSide6 = indexSide(segmentsX, segmentsY, startIndex) - - let fullIndices = [] - fullIndices = fullIndices.concat(indexSide1) - fullIndices = fullIndices.concat(indexSide2) - fullIndices = fullIndices.concat(indexSide3) - fullIndices = fullIndices.concat(indexSide4) - fullIndices = fullIndices.concat(indexSide5) - fullIndices = fullIndices.concat(indexSide6) - - newGeometry.setIndex(fullIndices) - - function indexSide(x, y, shift) { - const indices = [] - for (let i = 0; i < y + 1; i++) { - let index11 = 0 - let index12 = 0 - for (let j = 0; j < x; j++) { - index11 = (x + 1) * i + j - index12 = index11 + 1 - const index21 = index11 - const index22 = index11 + (x + 1) - indices.push(shift + index11, shift + index12) - if (index22 < ((x + 1) * (y + 1) - 1)) { - indices.push(shift + index21, shift + index22) - } - } - if ((index12 + x + 1) <= ((x + 1) * (y + 1) - 1)) { - indices.push(shift + index12, shift + index12 + x + 1) - } - } - return indices - } - return newGeometry -} - -module.exports = { Primitives } diff --git a/renderer/viewer/three/renderSlot.ts b/renderer/viewer/three/renderSlot.ts deleted file mode 100644 index 321633eb..00000000 --- a/renderer/viewer/three/renderSlot.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { getRenamedData } from 'flying-squid/dist/blockRenames' -import { BlockModel } from 'mc-assets' -import { versionToNumber } from 'mc-assets/dist/utils' -import type { ResourcesManagerCommon } from '../../../src/resourcesManager' - -export type ResolvedItemModelRender = { - modelName: string, - originalItemName?: string -} - -export const renderSlot = (model: ResolvedItemModelRender, resourcesManager: ResourcesManagerCommon, debugIsQuickbar = false, fullBlockModelSupport = false): { - texture: string, - blockData: Record & { resolvedModel: BlockModel } | null, - scale: number | null, - slice: number[] | null, - modelName: string | null, -} => { - let itemModelName = model.modelName - const isItem = loadedData.itemsByName[itemModelName] - - // #region normalize item name - if (versionToNumber(bot.version) < versionToNumber('1.13')) itemModelName = getRenamedData(isItem ? 'items' : 'blocks', itemModelName, bot.version, '1.13.1') as string - // #endregion - - - let itemTexture - - if (!fullBlockModelSupport) { - const atlas = resourcesManager.currentResources?.guiAtlas?.json - // todo atlas holds all rendered blocks, not all possibly rendered item/block models, need to request this on demand instead (this is how vanilla works) - const tryGetAtlasTexture = (name?: string) => name && atlas?.textures[name.replace('minecraft:', '').replace('block/', '').replace('blocks/', '').replace('item/', '').replace('items/', '').replace('_inventory', '')] - const item = tryGetAtlasTexture(itemModelName) ?? tryGetAtlasTexture(model.originalItemName) - if (item) { - const x = item.u * atlas.width - const y = item.v * atlas.height - return { - texture: 'gui', - slice: [x, y, atlas.tileSize, atlas.tileSize], - scale: 0.25, - blockData: null, - modelName: null - } - } - } - - const blockToTopTexture = (r) => r.top ?? r - - try { - if (!appViewer.resourcesManager.currentResources?.itemsRenderer) throw new Error('Items renderer is not available') - itemTexture = - appViewer.resourcesManager.currentResources.itemsRenderer.getItemTexture(itemModelName, {}, false, fullBlockModelSupport) - ?? (model.originalItemName ? appViewer.resourcesManager.currentResources.itemsRenderer.getItemTexture(model.originalItemName, {}, false, fullBlockModelSupport) : undefined) - ?? appViewer.resourcesManager.currentResources.itemsRenderer.getItemTexture('item/missing_texture')! - } catch (err) { - // get resourcepack from resource manager - reportError?.(`Failed to render item ${itemModelName} (original: ${model.originalItemName}) on ${bot.version} (resourcepack: TODO!): ${err.stack}`) - itemTexture = blockToTopTexture(appViewer.resourcesManager.currentResources!.itemsRenderer.getItemTexture('errored')!) - } - - itemTexture ??= blockToTopTexture(appViewer.resourcesManager.currentResources!.itemsRenderer.getItemTexture('unknown')!) - - - if ('type' in itemTexture) { - // is item - return { - texture: itemTexture.type, - slice: itemTexture.slice, - modelName: itemModelName, - blockData: null, - scale: null - } - } else { - // is block - return { - texture: 'blocks', - blockData: itemTexture, - modelName: itemModelName, - slice: null, - scale: null - } - } -} diff --git a/renderer/viewer/three/skyboxRenderer.ts b/renderer/viewer/three/skyboxRenderer.ts deleted file mode 100644 index fb9edae6..00000000 --- a/renderer/viewer/three/skyboxRenderer.ts +++ /dev/null @@ -1,406 +0,0 @@ -import * as THREE from 'three' -import { DebugGui } from '../lib/DebugGui' - -export const DEFAULT_TEMPERATURE = 0.75 - -export class SkyboxRenderer { - private texture: THREE.Texture | null = null - private mesh: THREE.Mesh | null = null - private skyMesh: THREE.Mesh | null = null - private voidMesh: THREE.Mesh | null = null - - // World state - private worldTime = 0 - private partialTicks = 0 - private viewDistance = 4 - private temperature = DEFAULT_TEMPERATURE - private inWater = false - private waterBreathing = false - private fogBrightness = 0 - private prevFogBrightness = 0 - private readonly fogOrangeness = 0 // Debug property to control sky color orangeness - private readonly distanceFactor = 2.7 - - private readonly brightnessAtPosition = 1 - debugGui: DebugGui - - constructor (private readonly scene: THREE.Scene, public defaultSkybox: boolean, public initialImage: string | null) { - this.debugGui = new DebugGui('skybox_renderer', this, [ - 'temperature', - 'worldTime', - 'inWater', - 'waterBreathing', - 'fogOrangeness', - 'brightnessAtPosition', - 'distanceFactor' - ], { - brightnessAtPosition: { min: 0, max: 1, step: 0.01 }, - temperature: { min: 0, max: 1, step: 0.01 }, - worldTime: { min: 0, max: 24_000, step: 1 }, - fogOrangeness: { min: -1, max: 1, step: 0.01 }, - distanceFactor: { min: 0, max: 5, step: 0.01 }, - }) - - if (!initialImage) { - this.createGradientSky() - } - // this.debugGui.activate() - } - - async init () { - if (this.initialImage) { - await this.setSkyboxImage(this.initialImage) - } - } - - async setSkyboxImage (imageUrl: string) { - // Dispose old textures if they exist - if (this.texture) { - this.texture.dispose() - } - - // Load the equirectangular texture - const textureLoader = new THREE.TextureLoader() - this.texture = await new Promise((resolve) => { - textureLoader.load( - imageUrl, - (texture) => { - texture.mapping = THREE.EquirectangularReflectionMapping - texture.encoding = THREE.sRGBEncoding - // Keep pixelated look - texture.minFilter = THREE.NearestFilter - texture.magFilter = THREE.NearestFilter - texture.needsUpdate = true - resolve(texture) - } - ) - }) - - // Create or update the skybox - if (this.mesh) { - // Just update the texture on the existing material - this.mesh.material.map = this.texture - this.mesh.material.needsUpdate = true - } else { - // Create a large sphere geometry for the skybox - const geometry = new THREE.SphereGeometry(500, 60, 40) - // Flip the geometry inside out - geometry.scale(-1, 1, 1) - - // Create material using the loaded texture - const material = new THREE.MeshBasicMaterial({ - map: this.texture, - side: THREE.FrontSide // Changed to FrontSide since we're flipping the geometry - }) - - // Create and add the skybox mesh - this.mesh = new THREE.Mesh(geometry, material) - this.scene.add(this.mesh) - } - } - - update (cameraPosition: THREE.Vector3, newViewDistance: number) { - if (newViewDistance !== this.viewDistance) { - this.viewDistance = newViewDistance - this.updateSkyColors() - } - - if (this.mesh) { - // Update skybox position - this.mesh.position.copy(cameraPosition) - } else if (this.skyMesh) { - // Update gradient sky position - this.skyMesh.position.copy(cameraPosition) - this.voidMesh?.position.copy(cameraPosition) - this.updateSkyColors() // Update colors based on time of day - } - } - - // Update world time - updateTime (timeOfDay: number, partialTicks = 0) { - if (this.debugGui.visible) return - this.worldTime = timeOfDay - this.partialTicks = partialTicks - this.updateSkyColors() - } - - // Update view distance - updateViewDistance (viewDistance: number) { - this.viewDistance = viewDistance - this.updateSkyColors() - } - - // Update temperature (for biome support) - updateTemperature (temperature: number) { - if (this.debugGui.visible) return - this.temperature = temperature - this.updateSkyColors() - } - - // Update water state - updateWaterState (inWater: boolean, waterBreathing: boolean) { - if (this.debugGui.visible) return - this.inWater = inWater - this.waterBreathing = waterBreathing - this.updateSkyColors() - } - - // Update default skybox setting - updateDefaultSkybox (defaultSkybox: boolean) { - if (this.debugGui.visible) return - this.defaultSkybox = defaultSkybox - this.updateSkyColors() - } - - private createGradientSky () { - const size = 64 - const scale = 256 / size + 2 - - { - const geometry = new THREE.PlaneGeometry(size * scale * 2, size * scale * 2) - geometry.rotateX(-Math.PI / 2) - geometry.translate(0, 16, 0) - - const material = new THREE.MeshBasicMaterial({ - color: 0xff_ff_ff, - side: THREE.DoubleSide, - depthTest: false - }) - - this.skyMesh = new THREE.Mesh(geometry, material) - this.scene.add(this.skyMesh) - } - - { - const geometry = new THREE.PlaneGeometry(size * scale * 2, size * scale * 2) - geometry.rotateX(-Math.PI / 2) - geometry.translate(0, -16, 0) - - const material = new THREE.MeshBasicMaterial({ - color: 0xff_ff_ff, - side: THREE.DoubleSide, - depthTest: false - }) - - this.voidMesh = new THREE.Mesh(geometry, material) - this.scene.add(this.voidMesh) - } - - this.updateSkyColors() - } - - private getFogColor (partialTicks = 0): THREE.Vector3 { - const angle = this.getCelestialAngle(partialTicks) - let rotation = Math.cos(angle * Math.PI * 2) * 2 + 0.5 - rotation = Math.max(0, Math.min(1, rotation)) - - let x = 0.752_941_2 - let y = 0.847_058_83 - let z = 1 - - x *= (rotation * 0.94 + 0.06) - y *= (rotation * 0.94 + 0.06) - z *= (rotation * 0.91 + 0.09) - - return new THREE.Vector3(x, y, z) - } - - private getSkyColor (x = 0, z = 0, partialTicks = 0): THREE.Vector3 { - const angle = this.getCelestialAngle(partialTicks) - let brightness = Math.cos(angle * 3.141_593 * 2) * 2 + 0.5 - - if (brightness < 0) brightness = 0 - if (brightness > 1) brightness = 1 - - const temperature = this.getTemperature(x, z) - const rgb = this.getSkyColorByTemp(temperature) - - const red = ((rgb >> 16) & 0xff) / 255 - const green = ((rgb >> 8) & 0xff) / 255 - const blue = (rgb & 0xff) / 255 - - return new THREE.Vector3( - red * brightness, - green * brightness, - blue * brightness - ) - } - - private calculateCelestialAngle (time: number, partialTicks: number): number { - const modTime = (time % 24_000) - let angle = (modTime + partialTicks) / 24_000 - 0.25 - - if (angle < 0) { - angle++ - } - if (angle > 1) { - angle-- - } - - angle = 1 - ((Math.cos(angle * Math.PI) + 1) / 2) - angle += (angle - angle) / 3 - - return angle - } - - private getCelestialAngle (partialTicks: number): number { - return this.calculateCelestialAngle(this.worldTime, partialTicks) - } - - private getTemperature (x: number, z: number): number { - return this.temperature - } - - private getSkyColorByTemp (temperature: number): number { - temperature /= 3 - if (temperature < -1) temperature = -1 - if (temperature > 1) temperature = 1 - - // Apply debug fog orangeness to hue - positive values make it more orange, negative make it less orange - const baseHue = 0.622_222_2 - temperature * 0.05 - // Orange is around hue 0.08-0.15, so we need to shift from blue-purple (0.62) toward orange - // Use a more dramatic shift and also increase saturation for more noticeable effect - const orangeHue = 0.12 // Orange hue value - const hue = this.fogOrangeness > 0 - ? baseHue + (orangeHue - baseHue) * this.fogOrangeness * 0.8 // Blend toward orange - : baseHue + this.fogOrangeness * 0.1 // Subtle shift for negative values - const saturation = 0.5 + temperature * 0.1 + Math.abs(this.fogOrangeness) * 0.3 // Increase saturation with orangeness - const brightness = 1 - - return this.hsbToRgb(hue, saturation, brightness) - } - - private hsbToRgb (hue: number, saturation: number, brightness: number): number { - let r = 0; let g = 0; let b = 0 - if (saturation === 0) { - r = g = b = Math.floor(brightness * 255 + 0.5) - } else { - const h = (hue - Math.floor(hue)) * 6 - const f = h - Math.floor(h) - const p = brightness * (1 - saturation) - const q = brightness * (1 - saturation * f) - const t = brightness * (1 - (saturation * (1 - f))) - switch (Math.floor(h)) { - case 0: - r = Math.floor(brightness * 255 + 0.5) - g = Math.floor(t * 255 + 0.5) - b = Math.floor(p * 255 + 0.5) - break - case 1: - r = Math.floor(q * 255 + 0.5) - g = Math.floor(brightness * 255 + 0.5) - b = Math.floor(p * 255 + 0.5) - break - case 2: - r = Math.floor(p * 255 + 0.5) - g = Math.floor(brightness * 255 + 0.5) - b = Math.floor(t * 255 + 0.5) - break - case 3: - r = Math.floor(p * 255 + 0.5) - g = Math.floor(q * 255 + 0.5) - b = Math.floor(brightness * 255 + 0.5) - break - case 4: - r = Math.floor(t * 255 + 0.5) - g = Math.floor(p * 255 + 0.5) - b = Math.floor(brightness * 255 + 0.5) - break - case 5: - r = Math.floor(brightness * 255 + 0.5) - g = Math.floor(p * 255 + 0.5) - b = Math.floor(q * 255 + 0.5) - break - } - } - return 0xff_00_00_00 | (r << 16) | (g << 8) | (Math.trunc(b)) - } - - private updateSkyColors () { - if (!this.skyMesh || !this.voidMesh) return - - // If default skybox is disabled, hide the skybox meshes - if (!this.defaultSkybox) { - this.skyMesh.visible = false - this.voidMesh.visible = false - if (this.mesh) { - this.mesh.visible = false - } - return - } - - // Show skybox meshes when default skybox is enabled - this.skyMesh.visible = true - this.voidMesh.visible = true - if (this.mesh) { - this.mesh.visible = true - } - - // Update fog brightness with smooth transition - this.prevFogBrightness = this.fogBrightness - const renderDistance = this.viewDistance / 32 - const targetBrightness = this.brightnessAtPosition * (1 - renderDistance) + renderDistance - this.fogBrightness += (targetBrightness - this.fogBrightness) * 0.1 - - // Handle water fog - if (this.inWater) { - const waterViewDistance = this.waterBreathing ? 100 : 5 - this.scene.fog = new THREE.Fog(new THREE.Color(0, 0, 1), 0.0025, waterViewDistance) - this.scene.background = new THREE.Color(0, 0, 1) - - // Update sky and void colors for underwater effect - ;(this.skyMesh.material as THREE.MeshBasicMaterial).color.set(new THREE.Color(0, 0, 1)) - ;(this.voidMesh.material as THREE.MeshBasicMaterial).color.set(new THREE.Color(0, 0, 0.6)) - return - } - - // Normal sky colors - const viewDistance = this.viewDistance * 16 - const viewFactor = 1 - (0.25 + 0.75 * this.viewDistance / 32) ** 0.25 - - const angle = this.getCelestialAngle(this.partialTicks) - const skyColor = this.getSkyColor(0, 0, this.partialTicks) - const fogColor = this.getFogColor(this.partialTicks) - - const brightness = Math.cos(angle * Math.PI * 2) * 2 + 0.5 - const clampedBrightness = Math.max(0, Math.min(1, brightness)) - - // Interpolate fog brightness - const interpolatedBrightness = this.prevFogBrightness + (this.fogBrightness - this.prevFogBrightness) * this.partialTicks - - const red = (fogColor.x + (skyColor.x - fogColor.x) * viewFactor) * clampedBrightness * interpolatedBrightness - const green = (fogColor.y + (skyColor.y - fogColor.y) * viewFactor) * clampedBrightness * interpolatedBrightness - const blue = (fogColor.z + (skyColor.z - fogColor.z) * viewFactor) * clampedBrightness * interpolatedBrightness - - this.scene.background = new THREE.Color(red, green, blue) - this.scene.fog = new THREE.Fog(new THREE.Color(red, green, blue), 0.0025, viewDistance * this.distanceFactor) - - ;(this.skyMesh.material as THREE.MeshBasicMaterial).color.set(new THREE.Color(skyColor.x, skyColor.y, skyColor.z)) - ;(this.voidMesh.material as THREE.MeshBasicMaterial).color.set(new THREE.Color( - skyColor.x * 0.2 + 0.04, - skyColor.y * 0.2 + 0.04, - skyColor.z * 0.6 + 0.1 - )) - } - - dispose () { - if (this.texture) { - this.texture.dispose() - } - if (this.mesh) { - this.mesh.geometry.dispose() - ;(this.mesh.material as THREE.Material).dispose() - this.scene.remove(this.mesh) - } - if (this.skyMesh) { - this.skyMesh.geometry.dispose() - ;(this.skyMesh.material as THREE.Material).dispose() - this.scene.remove(this.skyMesh) - } - if (this.voidMesh) { - this.voidMesh.geometry.dispose() - ;(this.voidMesh.material as THREE.Material).dispose() - this.scene.remove(this.voidMesh) - } - } -} diff --git a/renderer/viewer/three/threeJsMedia.ts b/renderer/viewer/three/threeJsMedia.ts deleted file mode 100644 index 582273d1..00000000 --- a/renderer/viewer/three/threeJsMedia.ts +++ /dev/null @@ -1,599 +0,0 @@ -import * as THREE from 'three' -import { sendVideoPlay, sendVideoStop } from '../../../src/customChannels' -import { WorldRendererThree } from './worldrendererThree' -import { ThreeJsSound } from './threeJsSound' - -interface MediaProperties { - position: { x: number, y: number, z: number } - size: { width: number, height: number } - src: string - rotation?: 0 | 1 | 2 | 3 // 0-3 for 0°, 90°, 180°, 270° - doubleSide?: boolean - background?: number // Hexadecimal color (e.g., 0x000000 for black) - opacity?: number // 0-1 value for transparency - uvMapping?: { startU: number, endU: number, startV: number, endV: number } - allowOrigins?: string[] | boolean - loop?: boolean - volume?: number - autoPlay?: boolean - - allowLighting?: boolean -} - -export class ThreeJsMedia { - customMedia = new Map void - positionalAudio?: THREE.PositionalAudio - hadAutoPlayError?: boolean - }>() - - constructor (private readonly worldRenderer: WorldRendererThree) { - this.worldRenderer.onWorldSwitched.push(() => { - this.onWorldGone() - }) - - this.worldRenderer.onRender.push(() => { - this.render() - }) - } - - onWorldGone () { - for (const [id, videoData] of this.customMedia.entries()) { - this.destroyMedia(id) - } - } - - onWorldStop () { - for (const [id, videoData] of this.customMedia.entries()) { - this.setVideoPlaying(id, false) - } - } - - private createErrorTexture (width: number, height: number, background = 0x00_00_00, error = 'Failed to load'): THREE.CanvasTexture { - const canvas = document.createElement('canvas') - const MAX_DIMENSION = 100 - - canvas.width = MAX_DIMENSION - canvas.height = MAX_DIMENSION - - const ctx = canvas.getContext('2d') - if (!ctx) return new THREE.CanvasTexture(canvas) - - // Clear with transparent background - ctx.clearRect(0, 0, canvas.width, canvas.height) - - // Add background color - ctx.fillStyle = `rgba(${background >> 16 & 255}, ${background >> 8 & 255}, ${background & 255}, 0.5)` - ctx.fillRect(0, 0, canvas.width, canvas.height) - - // Add red text with size relative to canvas dimensions - ctx.fillStyle = '#ff0000' - ctx.font = 'bold 10px sans-serif' - ctx.textAlign = 'center' - ctx.textBaseline = 'middle' - ctx.fillText(error, canvas.width / 2, canvas.height / 2, canvas.width) - - const texture = new THREE.CanvasTexture(canvas) - texture.minFilter = THREE.LinearFilter - texture.magFilter = THREE.LinearFilter - return texture - } - - private createBackgroundTexture (width: number, height: number, color = 0x00_00_00, opacity = 1): THREE.CanvasTexture { - const canvas = document.createElement('canvas') - canvas.width = 1 - canvas.height = 1 - - const ctx = canvas.getContext('2d') - if (!ctx) return new THREE.CanvasTexture(canvas) - - // Convert hex color to rgba - const r = (color >> 16) & 255 - const g = (color >> 8) & 255 - const b = color & 255 - - ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${opacity})` - ctx.fillRect(0, 0, 1, 1) - - const texture = new THREE.CanvasTexture(canvas) - texture.minFilter = THREE.NearestFilter - texture.magFilter = THREE.NearestFilter - return texture - } - - validateOrigin (src: string, allowOrigins: string[] | boolean) { - if (allowOrigins === true) return true - if (allowOrigins === false) return false - const url = new URL(src) - return allowOrigins.some(origin => url.origin.endsWith(origin)) - } - - onPageInteraction () { - for (const [id, videoData] of this.customMedia.entries()) { - if (videoData.hadAutoPlayError) { - videoData.hadAutoPlayError = false - void videoData.video?.play() - .catch(err => { - if (err.name === 'AbortError') return - console.error('Failed to play video:', err) - videoData.hadAutoPlayError = true - return true - }) - .then((fromCatch) => { - if (fromCatch) return - if (videoData.positionalAudio) { - // workaround: audio has to be recreated - this.addMedia(id, videoData.props) - } - }) - } - } - } - - addMedia (id: string, props: MediaProperties) { - const originalProps = structuredClone(props) - this.destroyMedia(id) - - const { scene } = this.worldRenderer - - const originSecurityError = props.allowOrigins !== undefined && !this.validateOrigin(props.src, props.allowOrigins) - if (originSecurityError) { - console.warn('Remote resource blocked due to security policy', props.src, 'allowed origins:', props.allowOrigins, 'you can control it with `remoteContentNotSameOrigin` option') - props.src = '' - } - - const isImage = props.src.endsWith('.png') || props.src.endsWith('.jpg') || props.src.endsWith('.jpeg') - - let video: HTMLVideoElement | undefined - let positionalAudio: THREE.PositionalAudio | undefined - if (!isImage) { - video = document.createElement('video') - video.src = props.src.endsWith('.gif') ? props.src.replace('.gif', '.mp4') : props.src - video.loop = props.loop ?? true - video.volume = props.volume ?? 1 - video.playsInline = true - video.crossOrigin = 'anonymous' - - // Create positional audio - const soundSystem = this.worldRenderer.soundSystem as ThreeJsSound - soundSystem.initAudioListener() - if (!soundSystem.audioListener) throw new Error('Audio listener not initialized') - positionalAudio = new THREE.PositionalAudio(soundSystem.audioListener) - positionalAudio.setRefDistance(6) - positionalAudio.setVolume(props.volume ?? 1) - scene.add(positionalAudio) - positionalAudio.position.set(props.position.x, props.position.y, props.position.z) - - // Connect video to positional audio - positionalAudio.setMediaElementSource(video) - positionalAudio.connect() - - video.addEventListener('pause', () => { - positionalAudio?.pause() - sendVideoStop(id, 'paused', video!.currentTime) - }) - video.addEventListener('play', () => { - positionalAudio?.play() - sendVideoPlay(id) - }) - video.addEventListener('seeked', () => { - if (positionalAudio && video) { - positionalAudio.offset = video.currentTime - } - }) - video.addEventListener('stalled', () => { - sendVideoStop(id, 'stalled', video!.currentTime) - }) - video.addEventListener('waiting', () => { - sendVideoStop(id, 'waiting', video!.currentTime) - }) - video.addEventListener('error', ({ error }) => { - sendVideoStop(id, `error: ${error}`, video!.currentTime) - }) - video.addEventListener('ended', () => { - sendVideoStop(id, 'ended', video!.currentTime) - }) - } - - - // Create background texture first - const backgroundTexture = this.createBackgroundTexture( - props.size.width, - props.size.height, - props.background, - // props.opacity ?? 1 - ) - - const handleError = (text?: string) => { - const errorTexture = this.createErrorTexture(props.size.width, props.size.height, props.background, text) - material.map = errorTexture - material.needsUpdate = true - } - - // Create a plane geometry with configurable UV mapping - const geometry = new THREE.PlaneGeometry(1, 1) - - // Create material with initial properties using background texture - const MaterialClass = props.allowLighting ? THREE.MeshLambertMaterial : THREE.MeshBasicMaterial - const material = new MaterialClass({ - map: backgroundTexture, - transparent: true, - side: props.doubleSide ? THREE.DoubleSide : THREE.FrontSide, - alphaTest: 0.1 - }) - - const texture = video - ? new THREE.VideoTexture(video) - : new THREE.TextureLoader().load(props.src, () => { - if (this.customMedia.get(id)?.texture === texture) { - material.map = texture - material.needsUpdate = true - } - }, undefined, () => handleError()) // todo cache - texture.minFilter = THREE.NearestFilter - texture.magFilter = THREE.NearestFilter - // texture.format = THREE.RGBAFormat - // texture.colorSpace = THREE.SRGBColorSpace - texture.generateMipmaps = false - - // Create inner mesh for offsets - const mesh = new THREE.Mesh(geometry, material) - - const { mesh: panel } = this.positionMeshExact(mesh, THREE.MathUtils.degToRad((props.rotation ?? 0) * 90), props.position, props.size.width, props.size.height) - - scene.add(panel) - - if (video) { - // Start playing the video - video.play().catch(err => { - if (err.name === 'AbortError') return - console.error('Failed to play video:', err) - videoData.hadAutoPlayError = true - handleError(err.name === 'NotAllowedError' ? 'Waiting for user interaction' : 'Failed to auto play') - }) - - // Update texture in animation loop - mesh.onBeforeRender = () => { - if (video.readyState === video.HAVE_ENOUGH_DATA && (!video.paused || !videoData?.hadAutoPlayError)) { - if (material.map !== texture) { - material.map = texture - material.needsUpdate = true - } - texture.needsUpdate = true - - // Sync audio position with video position - if (positionalAudio) { - positionalAudio.position.copy(panel.position) - positionalAudio.rotation.copy(panel.rotation) - } - } - } - } - - // UV mapping configuration - const updateUVMapping = (config: { startU: number, endU: number, startV: number, endV: number }) => { - const uvs = geometry.attributes.uv.array as Float32Array - uvs[0] = config.startU - uvs[1] = config.startV - uvs[2] = config.endU - uvs[3] = config.startV - uvs[4] = config.endU - uvs[5] = config.endV - uvs[6] = config.startU - uvs[7] = config.endV - geometry.attributes.uv.needsUpdate = true - } - - // Apply initial UV mapping if provided - if (props.uvMapping) { - updateUVMapping(props.uvMapping) - } - - const videoData = { - mesh: panel, - video, - texture, - updateUVMapping, - positionalAudio, - props: originalProps, - hadAutoPlayError: false - } - // Store video data - this.customMedia.set(id, videoData) - - return id - } - - render () { - for (const [id, videoData] of this.customMedia.entries()) { - const chunkX = Math.floor(videoData.props.position.x / 16) * 16 - const chunkZ = Math.floor(videoData.props.position.z / 16) * 16 - const sectionY = Math.floor(videoData.props.position.y / 16) * 16 - - const chunkKey = `${chunkX},${chunkZ}` - const sectionKey = `${chunkX},${sectionY},${chunkZ}` - videoData.mesh.visible = !!this.worldRenderer.sectionObjects[sectionKey] || !!this.worldRenderer.finishedChunks[chunkKey] - } - } - - setVideoPlaying (id: string, playing: boolean) { - const videoData = this.customMedia.get(id) - if (videoData?.video) { - if (playing) { - videoData.video.play().catch(console.error) - } else { - videoData.video.pause() - } - } - } - - setVideoSeeking (id: string, seconds: number) { - const videoData = this.customMedia.get(id) - if (videoData?.video) { - videoData.video.currentTime = seconds - } - } - - setVideoVolume (id: string, volume: number) { - const videoData = this.customMedia.get(id) - if (videoData?.video) { - videoData.video.volume = volume - } - } - - setVideoSpeed (id: string, speed: number) { - const videoData = this.customMedia.get(id) - if (videoData?.video) { - videoData.video.playbackRate = speed - } - } - - destroyMedia (id: string) { - const { scene } = this.worldRenderer - const mediaData = this.customMedia.get(id) - if (mediaData) { - if (mediaData.video) { - mediaData.video.pause() - mediaData.video.src = '' - mediaData.video.remove() - } - if (mediaData.positionalAudio) { - // mediaData.positionalAudio.stop() - // mediaData.positionalAudio.disconnect() - scene.remove(mediaData.positionalAudio) - } - scene.remove(mediaData.mesh) - mediaData.texture.dispose() - - // Get the inner mesh from the group - const mesh = mediaData.mesh.children[0] as THREE.Mesh - if (mesh) { - mesh.geometry.dispose() - if (mesh.material instanceof THREE.Material) { - mesh.material.dispose() - } - } - - this.customMedia.delete(id) - } - } - - /** - * Positions a mesh exactly at startPosition and extends it along the rotation direction - * with the specified width and height - * - * @param mesh The mesh to position - * @param rotation Rotation in radians (applied to Y axis) - * @param startPosition The exact starting position (corner) of the mesh - * @param width Width of the mesh - * @param height Height of the mesh - * @param depth Depth of the mesh (default: 1) - * @returns The positioned mesh for chaining - */ - positionMeshExact ( - mesh: THREE.Mesh, - rotation: number, - startPosition: { x: number, y: number, z: number }, - width: number, - height: number, - depth = 1 - ) { - // avoid z-fighting with the ground plane - if (rotation === 0) { - startPosition.z += 0.001 - } - if (rotation === Math.PI / 2) { - startPosition.x -= 0.001 - } - if (rotation === Math.PI) { - startPosition.z -= 0.001 - } - if (rotation === 3 * Math.PI / 2) { - startPosition.x += 0.001 - } - - // rotation normalize coordinates - if (rotation === 0) { - startPosition.z += 1 - } - if (rotation === Math.PI) { - startPosition.x += 1 - } - if (rotation === 3 * Math.PI / 2) { - startPosition.z += 1 - startPosition.x += 1 - } - - - // First, clean up any previous transformations - mesh.matrix.identity() - mesh.position.set(0, 0, 0) - mesh.rotation.set(0, 0, 0) - mesh.scale.set(1, 1, 1) - - // By default, PlaneGeometry creates a plane in the XY plane (facing +Z) - // We need to set up the proper orientation for our use case - // Rotate the plane to face the correct direction based on the rotation parameter - mesh.rotateY(rotation) - if (rotation === Math.PI / 2 || rotation === 3 * Math.PI / 2) { - mesh.rotateZ(-Math.PI) - mesh.rotateX(-Math.PI) - } - - // Scale it to the desired size - mesh.scale.set(width, height, depth) - - // For a PlaneGeometry, if we want the corner at the origin, we need to offset - // by half the dimensions after scaling - mesh.geometry.translate(0.5, 0.5, 0) - mesh.geometry.attributes.position.needsUpdate = true - - // Now place the mesh at the start position - mesh.position.set(startPosition.x, startPosition.y, startPosition.z) - - // Create a group to hold our mesh and markers - const debugGroup = new THREE.Group() - debugGroup.add(mesh) - - // Add a marker at the starting position (should be exactly at pos) - const startMarker = new THREE.Mesh( - new THREE.BoxGeometry(0.1, 0.1, 0.1), - new THREE.MeshBasicMaterial({ color: 0xff_00_00 }) - ) - startMarker.position.copy(new THREE.Vector3(startPosition.x, startPosition.y, startPosition.z)) - debugGroup.add(startMarker) - - // Add a marker at the end position (width units away in the rotated direction) - const endX = startPosition.x + Math.cos(rotation) * width - const endZ = startPosition.z + Math.sin(rotation) * width - const endYMarker = new THREE.Mesh( - new THREE.BoxGeometry(0.1, 0.1, 0.1), - new THREE.MeshBasicMaterial({ color: 0x00_00_ff }) - ) - endYMarker.position.set(startPosition.x, startPosition.y + height, startPosition.z) - debugGroup.add(endYMarker) - - // Add a marker at the width endpoint - const endWidthMarker = new THREE.Mesh( - new THREE.BoxGeometry(0.1, 0.1, 0.1), - new THREE.MeshBasicMaterial({ color: 0xff_ff_00 }) - ) - endWidthMarker.position.set(endX, startPosition.y, endZ) - debugGroup.add(endWidthMarker) - - // Add a marker at the corner diagonal endpoint (both width and height) - const endCornerMarker = new THREE.Mesh( - new THREE.BoxGeometry(0.1, 0.1, 0.1), - new THREE.MeshBasicMaterial({ color: 0xff_00_ff }) - ) - endCornerMarker.position.set(endX, startPosition.y + height, endZ) - debugGroup.add(endCornerMarker) - - // Also add a visual helper to show the rotation direction - const directionHelper = new THREE.ArrowHelper( - new THREE.Vector3(Math.cos(rotation), 0, Math.sin(rotation)), - new THREE.Vector3(startPosition.x, startPosition.y, startPosition.z), - 1, - 0xff_00_00 - ) - debugGroup.add(directionHelper) - - return { - mesh, - debugGroup - } - } - - createTestCanvasTexture () { - const canvas = document.createElement('canvas') - canvas.width = 100 - canvas.height = 100 - const ctx = canvas.getContext('2d') - if (!ctx) return null - ctx.font = '10px Arial' - ctx.fillStyle = 'red' - ctx.fillText('Hello World', 0, 10) // at - return new THREE.CanvasTexture(canvas) - } - - /** - * Creates a test mesh that demonstrates the exact positioning - */ - addTestMeshExact (rotationNum: number) { - const pos = window.cursorBlockRel().position - console.log('Creating exact positioned test mesh at:', pos) - - // Create a plane mesh with a wireframe to visualize boundaries - const plane = new THREE.Mesh( - new THREE.PlaneGeometry(1, 1), - new THREE.MeshBasicMaterial({ - // side: THREE.DoubleSide, - map: this.createTestCanvasTexture() - }) - ) - - const width = 2 - const height = 1 - const rotation = THREE.MathUtils.degToRad(rotationNum * 90) // 90 degrees in radians - - // Position the mesh exactly where we want it - const { debugGroup } = this.positionMeshExact(plane, rotation, pos, width, height) - - this.worldRenderer.scene.add(debugGroup) - console.log('Exact test mesh added with dimensions:', width, height, 'and rotation:', rotation) - } - - lastCheck = 0 - THROTTLE_TIME = 100 - tryIntersectMedia () { - // hack: need to optimize this by pulling only in distance of interaction instead and throttle - if (this.customMedia.size === 0) return - if (Date.now() - this.lastCheck < this.THROTTLE_TIME) return - this.lastCheck = Date.now() - - const { camera, scene } = this.worldRenderer - const raycaster = new THREE.Raycaster() - - // Get mouse position at center of screen - const mouse = new THREE.Vector2(0, 0) - - // Update the raycaster - raycaster.setFromCamera(mouse, camera) - - // Check intersection with all objects in scene - const intersects = raycaster.intersectObjects(scene.children, true) - if (intersects.length > 0) { - const intersection = intersects[0] - const intersectedObject = intersection.object - - // Find if this object belongs to any media - for (const [id, videoData] of this.customMedia.entries()) { - // Check if the intersected object is part of our media mesh - if (intersectedObject === videoData.mesh || - videoData.mesh.children.includes(intersectedObject)) { - const { uv } = intersection - if (uv) { - const result = { - id, - x: uv.x, - y: uv.y - } - this.worldRenderer.reactiveState.world.intersectMedia = result - this.worldRenderer['debugVideo'] = videoData - this.worldRenderer.cursorBlock.cursorLinesHidden = true - return - } - } - } - } - - // No media intersection found - this.worldRenderer.reactiveState.world.intersectMedia = null - this.worldRenderer['debugVideo'] = null - this.worldRenderer.cursorBlock.cursorLinesHidden = false - } -} diff --git a/renderer/viewer/three/threeJsMethods.ts b/renderer/viewer/three/threeJsMethods.ts deleted file mode 100644 index 629909c9..00000000 --- a/renderer/viewer/three/threeJsMethods.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { GraphicsBackend } from '../../../src/appViewer' -import type { ThreeJsBackendMethods } from './graphicsBackend' - -export function getThreeJsRendererMethods (): ThreeJsBackendMethods | undefined { - const renderer = appViewer.backend - if (renderer?.id !== 'threejs' || !renderer.backendMethods) return - return new Proxy(renderer.backendMethods, { - get (target, prop) { - return async (...args) => { - const result = await (target[prop as any] as any)(...args) - return result - } - } - }) as ThreeJsBackendMethods -} diff --git a/renderer/viewer/three/threeJsParticles.ts b/renderer/viewer/three/threeJsParticles.ts deleted file mode 100644 index 993f2b62..00000000 --- a/renderer/viewer/three/threeJsParticles.ts +++ /dev/null @@ -1,160 +0,0 @@ -import * as THREE from 'three' - -interface ParticleMesh extends THREE.Mesh { - velocity: THREE.Vector3; -} - -interface ParticleConfig { - fountainHeight: number; - resetHeight: number; - xVelocityRange: number; - zVelocityRange: number; - particleCount: number; - particleRadiusRange: { min: number; max: number }; - yVelocityRange: { min: number; max: number }; -} - -export interface FountainOptions { - position?: { x: number, y: number, z: number } - particleConfig?: Partial; -} - -export class Fountain { - private readonly particles: ParticleMesh[] = [] - private readonly config: { particleConfig: ParticleConfig } - private readonly position: THREE.Vector3 - container: THREE.Object3D | undefined - - constructor (public sectionId: string, options: FountainOptions = {}) { - this.position = options.position ? new THREE.Vector3(options.position.x, options.position.y, options.position.z) : new THREE.Vector3(0, 0, 0) - this.config = this.createConfig(options.particleConfig) - } - - private createConfig ( - particleConfigOverride?: Partial - ): { particleConfig: ParticleConfig } { - const particleConfig: ParticleConfig = { - fountainHeight: 10, - resetHeight: 0, - xVelocityRange: 0.4, - zVelocityRange: 0.4, - particleCount: 400, - particleRadiusRange: { min: 0.1, max: 0.6 }, - yVelocityRange: { min: 0.1, max: 2 }, - ...particleConfigOverride - } - - return { particleConfig } - } - - - createParticles (container: THREE.Object3D): void { - this.container = container - const colorStart = new THREE.Color(0xff_ff_00) - const colorEnd = new THREE.Color(0xff_a5_00) - - for (let i = 0; i < this.config.particleConfig.particleCount; i++) { - const radius = Math.random() * - (this.config.particleConfig.particleRadiusRange.max - this.config.particleConfig.particleRadiusRange.min) + - this.config.particleConfig.particleRadiusRange.min - const geometry = new THREE.SphereGeometry(radius) - const material = new THREE.MeshBasicMaterial({ - color: colorStart.clone().lerp(colorEnd, Math.random()) - }) - const mesh = new THREE.Mesh(geometry, material) - const particle = mesh as unknown as ParticleMesh - - particle.position.set( - this.position.x + (Math.random() - 0.5) * this.config.particleConfig.xVelocityRange * 2, - this.position.y + this.config.particleConfig.fountainHeight, - this.position.z + (Math.random() - 0.5) * this.config.particleConfig.zVelocityRange * 2 - ) - - particle.velocity = new THREE.Vector3( - (Math.random() - 0.5) * this.config.particleConfig.xVelocityRange, - -Math.random() * this.config.particleConfig.yVelocityRange.max, - (Math.random() - 0.5) * this.config.particleConfig.zVelocityRange - ) - - this.particles.push(particle) - this.container.add(particle) - - // this.container.onBeforeRender = () => { - // this.render() - // } - } - } - - render (): void { - for (const particle of this.particles) { - particle.velocity.y -= 0.01 + Math.random() * 0.1 - particle.position.add(particle.velocity) - - if (particle.position.y < this.position.y + this.config.particleConfig.resetHeight) { - particle.position.set( - this.position.x + (Math.random() - 0.5) * this.config.particleConfig.xVelocityRange * 2, - this.position.y + this.config.particleConfig.fountainHeight, - this.position.z + (Math.random() - 0.5) * this.config.particleConfig.zVelocityRange * 2 - ) - particle.velocity.set( - (Math.random() - 0.5) * this.config.particleConfig.xVelocityRange, - -Math.random() * this.config.particleConfig.yVelocityRange.max, - (Math.random() - 0.5) * this.config.particleConfig.zVelocityRange - ) - } - } - } - - private updateParticleCount (newCount: number): void { - if (newCount !== this.config.particleConfig.particleCount) { - this.config.particleConfig.particleCount = newCount - const currentCount = this.particles.length - - if (newCount > currentCount) { - this.addParticles(newCount - currentCount) - } else if (newCount < currentCount) { - this.removeParticles(currentCount - newCount) - } - } - } - - private addParticles (count: number): void { - const geometry = new THREE.SphereGeometry(0.1) - const material = new THREE.MeshBasicMaterial({ color: 0x00_ff_00 }) - - for (let i = 0; i < count; i++) { - const mesh = new THREE.Mesh(geometry, material) - const particle = mesh as unknown as ParticleMesh - particle.position.copy(this.position) - particle.velocity = new THREE.Vector3( - Math.random() * this.config.particleConfig.xVelocityRange - - this.config.particleConfig.xVelocityRange / 2, - Math.random() * 2, - Math.random() * this.config.particleConfig.zVelocityRange - - this.config.particleConfig.zVelocityRange / 2 - ) - this.particles.push(particle) - this.container!.add(particle) - } - } - - private removeParticles (count: number): void { - for (let i = 0; i < count; i++) { - const particle = this.particles.pop() - if (particle) { - this.container!.remove(particle) - } - } - } - - public dispose (): void { - for (const particle of this.particles) { - particle.geometry.dispose() - if (Array.isArray(particle.material)) { - for (const material of particle.material) material.dispose() - } else { - particle.material.dispose() - } - } - } -} diff --git a/renderer/viewer/three/threeJsSound.ts b/renderer/viewer/three/threeJsSound.ts deleted file mode 100644 index 699bb2cc..00000000 --- a/renderer/viewer/three/threeJsSound.ts +++ /dev/null @@ -1,99 +0,0 @@ -import * as THREE from 'three' -import { WorldRendererThree } from './worldrendererThree' - -export interface SoundSystem { - playSound: (position: { x: number, y: number, z: number }, path: string, volume?: number, pitch?: number, timeout?: number) => void - destroy: () => void -} - -export class ThreeJsSound implements SoundSystem { - audioListener: THREE.AudioListener | undefined - private readonly activeSounds = new Set() - private readonly audioContext: AudioContext | undefined - private readonly soundVolumes = new Map() - baseVolume = 1 - - constructor (public worldRenderer: WorldRendererThree) { - worldRenderer.onWorldSwitched.push(() => { - this.stopAll() - }) - - worldRenderer.onReactiveConfigUpdated('volume', (volume) => { - this.changeVolume(volume) - }) - } - - initAudioListener () { - if (this.audioListener) return - this.audioListener = new THREE.AudioListener() - this.worldRenderer.camera.add(this.audioListener) - } - - playSound (position: { x: number, y: number, z: number }, path: string, volume = 1, pitch = 1, timeout = 500) { - this.initAudioListener() - - const sound = new THREE.PositionalAudio(this.audioListener!) - this.activeSounds.add(sound) - this.soundVolumes.set(sound, volume) - - const audioLoader = new THREE.AudioLoader() - const start = Date.now() - void audioLoader.loadAsync(path).then((buffer) => { - if (Date.now() - start > timeout) { - console.warn('Ignored playing sound', path, 'due to timeout:', timeout, 'ms <', Date.now() - start, 'ms') - return - } - // play - sound.setBuffer(buffer) - sound.setRefDistance(20) - sound.setVolume(volume * this.baseVolume) - sound.setPlaybackRate(pitch) // set the pitch - this.worldRenderer.scene.add(sound) - // set sound position - sound.position.set(position.x, position.y, position.z) - sound.onEnded = () => { - this.worldRenderer.scene.remove(sound) - if (sound.source) { - sound.disconnect() - } - this.activeSounds.delete(sound) - this.soundVolumes.delete(sound) - audioLoader.manager.itemEnd(path) - } - sound.play() - }) - } - - stopAll () { - for (const sound of this.activeSounds) { - if (!sound) continue - sound.stop() - if (sound.source) { - sound.disconnect() - } - this.worldRenderer.scene.remove(sound) - } - this.activeSounds.clear() - this.soundVolumes.clear() - } - - changeVolume (volume: number) { - this.baseVolume = volume - for (const [sound, individualVolume] of this.soundVolumes) { - sound.setVolume(individualVolume * this.baseVolume) - } - } - - destroy () { - this.stopAll() - // Remove and cleanup audio listener - if (this.audioListener) { - this.audioListener.removeFromParent() - this.audioListener = undefined - } - } - - playTestSound () { - this.playSound(this.worldRenderer.camera.position, '/sound.mp3') - } -} diff --git a/renderer/viewer/three/threeJsUtils.ts b/renderer/viewer/three/threeJsUtils.ts deleted file mode 100644 index cbef9065..00000000 --- a/renderer/viewer/three/threeJsUtils.ts +++ /dev/null @@ -1,73 +0,0 @@ -import * as THREE from 'three' -import { getLoadedImage } from 'mc-assets/dist/utils' -import { createCanvas } from '../lib/utils' - -export const disposeObject = (obj: THREE.Object3D, cleanTextures = false) => { - // not cleaning texture there as it might be used by other objects, but would be good to also do that - if (obj instanceof THREE.Mesh) { - obj.geometry?.dispose?.() - obj.material?.dispose?.() - } - if (obj.children) { - // eslint-disable-next-line unicorn/no-array-for-each - obj.children.forEach(child => disposeObject(child, cleanTextures)) - } - if (cleanTextures) { - if (obj instanceof THREE.Mesh) { - obj.material?.map?.dispose?.() - } - } -} - -let textureCache: Record = {} -let imagesPromises: Record> = {} - -export const loadThreeJsTextureFromUrlSync = (imageUrl: string) => { - const texture = new THREE.Texture() - const promise = getLoadedImage(imageUrl).then(image => { - texture.image = image - texture.needsUpdate = true - return texture - }) - return { - texture, - promise - } -} - -export const loadThreeJsTextureFromUrl = async (imageUrl: string) => { - const loaded = new THREE.TextureLoader().loadAsync(imageUrl) - return loaded -} - -export const loadThreeJsTextureFromBitmap = (image: ImageBitmap) => { - const canvas = createCanvas(image.width, image.height) - const ctx = canvas.getContext('2d')! - ctx.drawImage(image, 0, 0) - const texture = new THREE.Texture(canvas) - texture.magFilter = THREE.NearestFilter - texture.minFilter = THREE.NearestFilter - return texture -} - -export async function loadTexture (texture: string, cb: (texture: THREE.Texture) => void, onLoad?: () => void): Promise { - const cached = textureCache[texture] - if (!cached) { - const { promise, resolve } = Promise.withResolvers() - const t = loadThreeJsTextureFromUrlSync(texture) - textureCache[texture] = t.texture - void t.promise.then(resolve) - imagesPromises[texture] = promise - } - - cb(textureCache[texture]) - void imagesPromises[texture].then(() => { - onLoad?.() - }) -} - -export const clearTextureCache = () => { - textureCache = {} - imagesPromises = {} -} - diff --git a/renderer/viewer/three/waypointSprite.ts b/renderer/viewer/three/waypointSprite.ts deleted file mode 100644 index 6a30e6db..00000000 --- a/renderer/viewer/three/waypointSprite.ts +++ /dev/null @@ -1,418 +0,0 @@ -import * as THREE from 'three' - -// Centralized visual configuration (in screen pixels) -export const WAYPOINT_CONFIG = { - // Target size in screen pixels (this controls the final sprite size) - TARGET_SCREEN_PX: 150, - // Canvas size for internal rendering (keep power of 2 for textures) - CANVAS_SIZE: 256, - // Relative positions in canvas (0-1) - LAYOUT: { - DOT_Y: 0.3, - NAME_Y: 0.45, - DISTANCE_Y: 0.55, - }, - // Multiplier for canvas internal resolution to keep text crisp - CANVAS_SCALE: 2, - ARROW: { - enabledDefault: false, - pixelSize: 50, - paddingPx: 50, - }, -} - -export type WaypointSprite = { - group: THREE.Group - sprite: THREE.Sprite - // Offscreen arrow controls - enableOffscreenArrow: (enabled: boolean) => void - setArrowParent: (parent: THREE.Object3D | null) => void - // Convenience combined updater - updateForCamera: ( - cameraPosition: THREE.Vector3, - camera: THREE.PerspectiveCamera, - viewportWidthPx: number, - viewportHeightPx: number - ) => boolean - // Utilities - setColor: (color: number) => void - setLabel: (label?: string) => void - updateDistanceText: (label: string, distanceText: string) => void - setVisible: (visible: boolean) => void - setPosition: (x: number, y: number, z: number) => void - dispose: () => void -} - -export function createWaypointSprite (options: { - position: THREE.Vector3 | { x: number, y: number, z: number }, - color?: number, - label?: string, - depthTest?: boolean, - // Y offset in world units used by updateScaleWorld only (screen-pixel API ignores this) - labelYOffset?: number, - metadata?: any, -}): WaypointSprite { - const color = options.color ?? 0xFF_00_00 - const depthTest = options.depthTest ?? false - const labelYOffset = options.labelYOffset ?? 1.5 - - // Build combined sprite - const sprite = createCombinedSprite(color, options.label ?? '', '0m', depthTest) - sprite.renderOrder = 10 - let currentLabel = options.label ?? '' - - // Offscreen arrow (detached by default) - let arrowSprite: THREE.Sprite | undefined - let arrowParent: THREE.Object3D | null = null - let arrowEnabled = WAYPOINT_CONFIG.ARROW.enabledDefault - - // Group for easy add/remove - const group = new THREE.Group() - group.add(sprite) - - // Initial position - const { x, y, z } = options.position - group.position.set(x, y, z) - - function setColor (newColor: number) { - const canvas = drawCombinedCanvas(newColor, currentLabel, '0m') - const texture = new THREE.CanvasTexture(canvas) - const mat = sprite.material - mat.map?.dispose() - mat.map = texture - mat.needsUpdate = true - } - - function setLabel (newLabel?: string) { - currentLabel = newLabel ?? '' - const canvas = drawCombinedCanvas(color, currentLabel, '0m') - const texture = new THREE.CanvasTexture(canvas) - const mat = sprite.material - mat.map?.dispose() - mat.map = texture - mat.needsUpdate = true - } - - function updateDistanceText (label: string, distanceText: string) { - const canvas = drawCombinedCanvas(color, label, distanceText) - const texture = new THREE.CanvasTexture(canvas) - const mat = sprite.material - mat.map?.dispose() - mat.map = texture - mat.needsUpdate = true - } - - function setVisible (visible: boolean) { - sprite.visible = visible - } - - function setPosition (nx: number, ny: number, nz: number) { - group.position.set(nx, ny, nz) - } - - // Keep constant pixel size on screen using global config - function updateScaleScreenPixels ( - cameraPosition: THREE.Vector3, - cameraFov: number, - distance: number, - viewportHeightPx: number - ) { - const vFovRad = cameraFov * Math.PI / 180 - const worldUnitsPerScreenHeightAtDist = Math.tan(vFovRad / 2) * 2 * distance - // Use configured target screen size - const scale = worldUnitsPerScreenHeightAtDist * (WAYPOINT_CONFIG.TARGET_SCREEN_PX / viewportHeightPx) - sprite.scale.set(scale, scale, 1) - } - - function ensureArrow () { - if (arrowSprite) return - const size = 128 - const canvas = document.createElement('canvas') - canvas.width = size - canvas.height = size - const ctx = canvas.getContext('2d')! - ctx.clearRect(0, 0, size, size) - - // Draw arrow shape - ctx.beginPath() - ctx.moveTo(size * 0.15, size * 0.5) - ctx.lineTo(size * 0.85, size * 0.5) - ctx.lineTo(size * 0.5, size * 0.15) - ctx.closePath() - - // Use waypoint color for arrow - const colorHex = `#${color.toString(16).padStart(6, '0')}` - ctx.lineWidth = 6 - ctx.strokeStyle = 'black' - ctx.stroke() - ctx.fillStyle = colorHex - ctx.fill() - - const texture = new THREE.CanvasTexture(canvas) - const material = new THREE.SpriteMaterial({ map: texture, transparent: true, depthTest: false, depthWrite: false }) - arrowSprite = new THREE.Sprite(material) - arrowSprite.renderOrder = 12 - arrowSprite.visible = false - if (arrowParent) arrowParent.add(arrowSprite) - } - - function enableOffscreenArrow (enabled: boolean) { - arrowEnabled = enabled - if (!enabled && arrowSprite) arrowSprite.visible = false - } - - function setArrowParent (parent: THREE.Object3D | null) { - if (arrowSprite?.parent) arrowSprite.parent.remove(arrowSprite) - arrowParent = parent - if (arrowSprite && parent) parent.add(arrowSprite) - } - - function updateOffscreenArrow ( - camera: THREE.PerspectiveCamera, - viewportWidthPx: number, - viewportHeightPx: number - ): boolean { - if (!arrowEnabled) return true - ensureArrow() - if (!arrowSprite) return true - - // Check if onlyLeftRight is enabled in metadata - const onlyLeftRight = options.metadata?.onlyLeftRight === true - - // Build camera basis using camera.up to respect custom orientations - const forward = new THREE.Vector3() - camera.getWorldDirection(forward) // camera look direction - const upWorld = camera.up.clone().normalize() - const right = new THREE.Vector3().copy(forward).cross(upWorld).normalize() - const upCam = new THREE.Vector3().copy(right).cross(forward).normalize() - - // Vector from camera to waypoint - const camPos = new THREE.Vector3().setFromMatrixPosition(camera.matrixWorld) - const toWp = new THREE.Vector3(group.position.x, group.position.y, group.position.z).sub(camPos) - - // Components in camera basis - const z = toWp.dot(forward) - const x = toWp.dot(right) - const y = toWp.dot(upCam) - - const aspect = viewportWidthPx / viewportHeightPx - const vFovRad = camera.fov * Math.PI / 180 - const hFovRad = 2 * Math.atan(Math.tan(vFovRad / 2) * aspect) - - // Determine if waypoint is inside view frustum using angular checks - const thetaX = Math.atan2(x, z) - const thetaY = Math.atan2(y, z) - const visible = z > 0 && Math.abs(thetaX) <= hFovRad / 2 && Math.abs(thetaY) <= vFovRad / 2 - if (visible) { - arrowSprite.visible = false - return true - } - - // Direction on screen in normalized frustum units - let rx = thetaX / (hFovRad / 2) - let ry = thetaY / (vFovRad / 2) - - // If behind the camera, snap to dominant axis to avoid confusing directions - if (z <= 0) { - if (Math.abs(rx) > Math.abs(ry)) { - rx = Math.sign(rx) - ry = 0 - } else { - rx = 0 - ry = Math.sign(ry) - } - } - - // Apply onlyLeftRight logic - restrict arrows to left/right edges only - if (onlyLeftRight) { - // Force the arrow to appear only on left or right edges - if (Math.abs(rx) > Math.abs(ry)) { - // Horizontal direction is dominant, keep it - ry = 0 - } else { - // Vertical direction is dominant, but we want only left/right - // So choose left or right based on the sign of rx - rx = rx >= 0 ? 1 : -1 - ry = 0 - } - } - - // Place on the rectangle border [-1,1]x[-1,1] - const s = Math.max(Math.abs(rx), Math.abs(ry)) || 1 - let ndcX = rx / s - let ndcY = ry / s - - // Apply padding in pixel space by clamping - const padding = WAYPOINT_CONFIG.ARROW.paddingPx - const pxX = ((ndcX + 1) * 0.5) * viewportWidthPx - const pxY = ((1 - ndcY) * 0.5) * viewportHeightPx - const clampedPxX = Math.min(Math.max(pxX, padding), viewportWidthPx - padding) - const clampedPxY = Math.min(Math.max(pxY, padding), viewportHeightPx - padding) - ndcX = (clampedPxX / viewportWidthPx) * 2 - 1 - ndcY = -(clampedPxY / viewportHeightPx) * 2 + 1 - - // Compute world position at a fixed distance in front of the camera using camera basis - const placeDist = Math.max(2, camera.near * 4) - const halfPlaneHeight = Math.tan(vFovRad / 2) * placeDist - const halfPlaneWidth = halfPlaneHeight * aspect - const pos = camPos.clone() - .add(forward.clone().multiplyScalar(placeDist)) - .add(right.clone().multiplyScalar(ndcX * halfPlaneWidth)) - .add(upCam.clone().multiplyScalar(ndcY * halfPlaneHeight)) - - // Update arrow sprite - arrowSprite.visible = true - arrowSprite.position.copy(pos) - - // Angle for rotation relative to screen right/up (derived from camera up vector) - const angle = Math.atan2(ry, rx) - arrowSprite.material.rotation = angle - Math.PI / 2 - - // Constant pixel size for arrow (use fixed placement distance) - const worldUnitsPerScreenHeightAtDist = Math.tan(vFovRad / 2) * 2 * placeDist - const sPx = worldUnitsPerScreenHeightAtDist * (WAYPOINT_CONFIG.ARROW.pixelSize / viewportHeightPx) - arrowSprite.scale.set(sPx, sPx, 1) - return false - } - - function computeDistance (cameraPosition: THREE.Vector3): number { - return cameraPosition.distanceTo(group.position) - } - - function updateForCamera ( - cameraPosition: THREE.Vector3, - camera: THREE.PerspectiveCamera, - viewportWidthPx: number, - viewportHeightPx: number - ): boolean { - const distance = computeDistance(cameraPosition) - // Keep constant pixel size - updateScaleScreenPixels(cameraPosition, camera.fov, distance, viewportHeightPx) - // Update text - updateDistanceText(currentLabel, `${Math.round(distance)}m`) - // Update arrow and visibility - const onScreen = updateOffscreenArrow(camera, viewportWidthPx, viewportHeightPx) - setVisible(onScreen) - return onScreen - } - - function dispose () { - const mat = sprite.material - mat.map?.dispose() - mat.dispose() - if (arrowSprite) { - const am = arrowSprite.material - am.map?.dispose() - am.dispose() - } - } - - return { - group, - sprite, - enableOffscreenArrow, - setArrowParent, - updateForCamera, - setColor, - setLabel, - updateDistanceText, - setVisible, - setPosition, - dispose, - } -} - -// Internal helpers -function drawCombinedCanvas (color: number, id: string, distance: string): HTMLCanvasElement { - const scale = WAYPOINT_CONFIG.CANVAS_SCALE * (globalThis.devicePixelRatio || 1) - const size = WAYPOINT_CONFIG.CANVAS_SIZE * scale - const canvas = document.createElement('canvas') - canvas.width = size - canvas.height = size - const ctx = canvas.getContext('2d')! - - // Clear canvas - ctx.clearRect(0, 0, size, size) - - // Draw dot - const centerX = size / 2 - const dotY = Math.round(size * WAYPOINT_CONFIG.LAYOUT.DOT_Y) - const radius = Math.round(size * 0.05) // Dot takes up ~12% of canvas height - const borderWidth = Math.max(2, Math.round(4 * scale)) - - // Outer border (black) - ctx.beginPath() - ctx.arc(centerX, dotY, radius + borderWidth, 0, Math.PI * 2) - ctx.fillStyle = 'black' - ctx.fill() - - // Inner circle (colored) - ctx.beginPath() - ctx.arc(centerX, dotY, radius, 0, Math.PI * 2) - ctx.fillStyle = `#${color.toString(16).padStart(6, '0')}` - ctx.fill() - - // Text properties - ctx.textAlign = 'center' - ctx.textBaseline = 'middle' - - // Title - const nameFontPx = Math.round(size * 0.08) // ~8% of canvas height - const distanceFontPx = Math.round(size * 0.06) // ~6% of canvas height - ctx.font = `bold ${nameFontPx}px mojangles` - ctx.lineWidth = Math.max(2, Math.round(3 * scale)) - const nameY = Math.round(size * WAYPOINT_CONFIG.LAYOUT.NAME_Y) - - ctx.strokeStyle = 'black' - ctx.strokeText(id, centerX, nameY) - ctx.fillStyle = 'white' - ctx.fillText(id, centerX, nameY) - - // Distance - ctx.font = `bold ${distanceFontPx}px mojangles` - ctx.lineWidth = Math.max(2, Math.round(2 * scale)) - const distanceY = Math.round(size * WAYPOINT_CONFIG.LAYOUT.DISTANCE_Y) - - ctx.strokeStyle = 'black' - ctx.strokeText(distance, centerX, distanceY) - ctx.fillStyle = '#CCCCCC' - ctx.fillText(distance, centerX, distanceY) - - return canvas -} - -function createCombinedSprite (color: number, id: string, distance: string, depthTest: boolean): THREE.Sprite { - const canvas = drawCombinedCanvas(color, id, distance) - const texture = new THREE.CanvasTexture(canvas) - texture.anisotropy = 1 - texture.magFilter = THREE.LinearFilter - texture.minFilter = THREE.LinearFilter - const material = new THREE.SpriteMaterial({ - map: texture, - transparent: true, - opacity: 1, - depthTest, - depthWrite: false, - }) - const sprite = new THREE.Sprite(material) - sprite.position.set(0, 0, 0) - return sprite -} - -export const WaypointHelpers = { - // World-scale constant size helper - computeWorldScale (distance: number, fixedReference = 10) { - return Math.max(0.0001, distance / fixedReference) - }, - // Screen-pixel constant size helper - computeScreenPixelScale ( - camera: THREE.PerspectiveCamera, - distance: number, - pixelSize: number, - viewportHeightPx: number - ) { - const vFovRad = camera.fov * Math.PI / 180 - const worldUnitsPerScreenHeightAtDist = Math.tan(vFovRad / 2) * 2 * distance - return worldUnitsPerScreenHeightAtDist * (pixelSize / viewportHeightPx) - } -} diff --git a/renderer/viewer/three/waypoints.ts b/renderer/viewer/three/waypoints.ts deleted file mode 100644 index 256ca6df..00000000 --- a/renderer/viewer/three/waypoints.ts +++ /dev/null @@ -1,140 +0,0 @@ -import * as THREE from 'three' -import { WorldRendererThree } from './worldrendererThree' -import { createWaypointSprite, type WaypointSprite } from './waypointSprite' - -interface Waypoint { - id: string - x: number - y: number - z: number - minDistance: number - color: number - label?: string - sprite: WaypointSprite -} - -interface WaypointOptions { - color?: number - label?: string - minDistance?: number - metadata?: any -} - -export class WaypointsRenderer { - private readonly waypoints = new Map() - private readonly waypointScene = new THREE.Scene() - - constructor ( - private readonly worldRenderer: WorldRendererThree - ) { - } - - private updateWaypoints () { - const playerPos = this.worldRenderer.cameraObject.position - const sizeVec = this.worldRenderer.renderer.getSize(new THREE.Vector2()) - - for (const waypoint of this.waypoints.values()) { - const waypointPos = new THREE.Vector3(waypoint.x, waypoint.y, waypoint.z) - const distance = playerPos.distanceTo(waypointPos) - const visible = !waypoint.minDistance || distance >= waypoint.minDistance - - waypoint.sprite.setVisible(visible) - - if (visible) { - // Update position - waypoint.sprite.setPosition(waypoint.x, waypoint.y, waypoint.z) - // Ensure camera-based update each frame - waypoint.sprite.updateForCamera(this.worldRenderer.getCameraPosition(), this.worldRenderer.camera, sizeVec.width, sizeVec.height) - } - } - } - - render () { - if (this.waypoints.size === 0) return - - // Update waypoint scaling - this.updateWaypoints() - - // Render waypoints scene with the world camera - this.worldRenderer.renderer.render(this.waypointScene, this.worldRenderer.camera) - } - - // Removed sprite/label texture creation. Use utils/waypointSprite.ts - - addWaypoint ( - id: string, - x: number, - y: number, - z: number, - options: WaypointOptions = {} - ) { - // Remove existing waypoint if it exists - this.removeWaypoint(id) - - const color = options.color ?? 0xFF_00_00 - const { label, metadata } = options - const minDistance = options.minDistance ?? 0 - - const sprite = createWaypointSprite({ - position: new THREE.Vector3(x, y, z), - color, - label: (label || id), - metadata, - }) - sprite.enableOffscreenArrow(true) - sprite.setArrowParent(this.waypointScene) - - this.waypointScene.add(sprite.group) - - this.waypoints.set(id, { - id, x: x + 0.5, y: y + 0.5, z: z + 0.5, minDistance, - color, label, - sprite, - }) - } - - removeWaypoint (id: string) { - const waypoint = this.waypoints.get(id) - if (waypoint) { - this.waypointScene.remove(waypoint.sprite.group) - waypoint.sprite.dispose() - this.waypoints.delete(id) - } - } - - clear () { - for (const id of this.waypoints.keys()) { - this.removeWaypoint(id) - } - } - - testWaypoint () { - this.addWaypoint('Test Point', 0, 70, 0, { color: 0x00_FF_00, label: 'Test Point' }) - this.addWaypoint('Spawn', 0, 64, 0, { color: 0xFF_FF_00, label: 'Spawn' }) - this.addWaypoint('Far Point', 100, 70, 100, { color: 0x00_00_FF, label: 'Far Point' }) - } - - getWaypoint (id: string): Waypoint | undefined { - return this.waypoints.get(id) - } - - getAllWaypoints (): Waypoint[] { - return [...this.waypoints.values()] - } - - setWaypointColor (id: string, color: number) { - const waypoint = this.waypoints.get(id) - if (waypoint) { - waypoint.sprite.setColor(color) - waypoint.color = color - } - } - - setWaypointLabel (id: string, label?: string) { - const waypoint = this.waypoints.get(id) - if (waypoint) { - waypoint.label = label - waypoint.sprite.setLabel(label) - } - } -} diff --git a/renderer/viewer/three/world/cursorBlock.ts b/renderer/viewer/three/world/cursorBlock.ts deleted file mode 100644 index a03a6999..00000000 --- a/renderer/viewer/three/world/cursorBlock.ts +++ /dev/null @@ -1,162 +0,0 @@ -import * as THREE from 'three' -import { LineMaterial, LineSegmentsGeometry, Wireframe } from 'three-stdlib' -import { Vec3 } from 'vec3' -import { BlockShape, BlocksShapes } from 'renderer/viewer/lib/basePlayerState' -import { WorldRendererThree } from '../worldrendererThree' -import { loadThreeJsTextureFromUrl } from '../threeJsUtils' -import destroyStage0 from '../../../../assets/destroy_stage_0.png' -import destroyStage1 from '../../../../assets/destroy_stage_1.png' -import destroyStage2 from '../../../../assets/destroy_stage_2.png' -import destroyStage3 from '../../../../assets/destroy_stage_3.png' -import destroyStage4 from '../../../../assets/destroy_stage_4.png' -import destroyStage5 from '../../../../assets/destroy_stage_5.png' -import destroyStage6 from '../../../../assets/destroy_stage_6.png' -import destroyStage7 from '../../../../assets/destroy_stage_7.png' -import destroyStage8 from '../../../../assets/destroy_stage_8.png' -import destroyStage9 from '../../../../assets/destroy_stage_9.png' - -export class CursorBlock { - _cursorLinesHidden = false - get cursorLinesHidden () { - return this._cursorLinesHidden - } - set cursorLinesHidden (value: boolean) { - if (this.interactionLines) { - this.interactionLines.mesh.visible = !value - } - this._cursorLinesHidden = value - } - - cursorLineMaterial: LineMaterial - interactionLines: null | { blockPos: Vec3, mesh: THREE.Group, shapePositions: BlocksShapes | undefined } = null - prevColor: string | undefined - blockBreakMesh: THREE.Mesh - breakTextures: THREE.Texture[] = [] - - constructor (public readonly worldRenderer: WorldRendererThree) { - // Initialize break mesh and textures - const destroyStagesImages = [ - destroyStage0, destroyStage1, destroyStage2, destroyStage3, destroyStage4, - destroyStage5, destroyStage6, destroyStage7, destroyStage8, destroyStage9 - ] - - for (let i = 0; i < 10; i++) { - void loadThreeJsTextureFromUrl(destroyStagesImages[i]).then((texture) => { - texture.magFilter = THREE.NearestFilter - texture.minFilter = THREE.NearestFilter - this.breakTextures.push(texture) - }) - } - - const breakMaterial = new THREE.MeshBasicMaterial({ - transparent: true, - blending: THREE.MultiplyBlending, - alphaTest: 0.5, - }) - this.blockBreakMesh = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), breakMaterial) - this.blockBreakMesh.visible = false - this.blockBreakMesh.renderOrder = 999 - this.blockBreakMesh.name = 'blockBreakMesh' - this.worldRenderer.scene.add(this.blockBreakMesh) - - this.worldRenderer.onReactivePlayerStateUpdated('gameMode', () => { - this.updateLineMaterial() - }) - // todo figure out why otherwise fog from skybox breaks it - setTimeout(() => { - this.updateLineMaterial() - if (this.interactionLines) { - this.setHighlightCursorBlock(this.interactionLines.blockPos, this.interactionLines.shapePositions, true) - } - }) - } - - // Update functions - updateLineMaterial () { - const inCreative = this.worldRenderer.playerStateReactive.gameMode === 'creative' - const pixelRatio = this.worldRenderer.renderer.getPixelRatio() - - if (this.cursorLineMaterial) { - this.cursorLineMaterial.dispose() - } - this.cursorLineMaterial = new LineMaterial({ - color: (() => { - switch (this.worldRenderer.worldRendererConfig.highlightBlockColor) { - case 'blue': - return 0x40_80_ff - case 'classic': - return 0x00_00_00 - default: - return inCreative ? 0x40_80_ff : 0x00_00_00 - } - })(), - linewidth: Math.max(pixelRatio * 0.7, 1) * 2, - // dashed: true, - // dashSize: 5, - }) - this.prevColor = this.worldRenderer.worldRendererConfig.highlightBlockColor - } - - updateBreakAnimation (blockPosition: { x: number, y: number, z: number } | undefined, stage: number | null, mergedShape?: BlockShape) { - this.hideBreakAnimation() - if (stage === null || !blockPosition || !mergedShape) return - - const { position, width, height, depth } = mergedShape - this.blockBreakMesh.scale.set(width * 1.001, height * 1.001, depth * 1.001) - position.add(blockPosition) - this.blockBreakMesh.position.set(position.x, position.y, position.z) - this.blockBreakMesh.visible = true; - - (this.blockBreakMesh.material as THREE.MeshBasicMaterial).map = this.breakTextures[stage] ?? this.breakTextures.at(-1); - (this.blockBreakMesh.material as THREE.MeshBasicMaterial).needsUpdate = true - } - - hideBreakAnimation () { - if (this.blockBreakMesh) { - this.blockBreakMesh.visible = false - } - } - - updateDisplay () { - if (this.cursorLineMaterial) { - const { renderer } = this.worldRenderer - this.cursorLineMaterial.resolution.set(renderer.domElement.width, renderer.domElement.height) - this.cursorLineMaterial.dashOffset = performance.now() / 750 - } - } - - setHighlightCursorBlock (blockPos: Vec3 | null, shapePositions?: BlocksShapes, force = false): void { - if (blockPos && this.interactionLines && blockPos.equals(this.interactionLines.blockPos) && !force) { - return - } - if (this.interactionLines !== null) { - this.worldRenderer.scene.remove(this.interactionLines.mesh) - this.interactionLines = null - } - if (blockPos === null) { - return - } - - const group = new THREE.Group() - for (const { position, width, height, depth } of shapePositions ?? []) { - const scale = [1.0001 * width, 1.0001 * height, 1.0001 * depth] as const - const geometry = new THREE.BoxGeometry(...scale) - const lines = new LineSegmentsGeometry().fromEdgesGeometry(new THREE.EdgesGeometry(geometry)) - const wireframe = new Wireframe(lines, this.cursorLineMaterial) - const pos = blockPos.plus(position) - wireframe.position.set(pos.x, pos.y, pos.z) - wireframe.computeLineDistances() - group.add(wireframe) - } - this.worldRenderer.scene.add(group) - group.visible = !this.cursorLinesHidden - this.interactionLines = { blockPos, mesh: group, shapePositions } - } - - render () { - if (this.prevColor !== this.worldRenderer.worldRendererConfig.highlightBlockColor) { - this.updateLineMaterial() - } - this.updateDisplay() - } -} diff --git a/renderer/viewer/three/world/vr.ts b/renderer/viewer/three/world/vr.ts deleted file mode 100644 index ecf1b299..00000000 --- a/renderer/viewer/three/world/vr.ts +++ /dev/null @@ -1,257 +0,0 @@ -import { VRButton } from 'three/examples/jsm/webxr/VRButton.js' -import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js' -import { XRControllerModelFactory } from 'three/examples/jsm/webxr/XRControllerModelFactory.js' -import { buttonMap as standardButtonsMap } from 'contro-max/build/gamepad' -import * as THREE from 'three' -import { WorldRendererThree } from '../worldrendererThree' -import { DocumentRenderer } from '../documentRenderer' - -export async function initVR (worldRenderer: WorldRendererThree, documentRenderer: DocumentRenderer) { - if (!('xr' in navigator) || !worldRenderer.worldRendererConfig.vrSupport) return - const { renderer } = worldRenderer - - const isSupported = await checkVRSupport() - if (!isSupported) return - - enableVr() - - const vrButtonContainer = createVrButtonContainer(renderer) - const updateVrButtons = () => { - const newHidden = !worldRenderer.worldRendererConfig.vrSupport || !worldRenderer.worldRendererConfig.foreground - if (vrButtonContainer.hidden !== newHidden) { - vrButtonContainer.hidden = newHidden - } - } - - worldRenderer.onRender.push(updateVrButtons) - - function enableVr () { - renderer.xr.enabled = true - // renderer.xr.setReferenceSpaceType('local-floor') - worldRenderer.reactiveState.preventEscapeMenu = true - } - - function disableVr () { - renderer.xr.enabled = false - worldRenderer.cameraGroupVr = undefined - worldRenderer.reactiveState.preventEscapeMenu = false - worldRenderer.scene.remove(user) - vrButtonContainer.hidden = true - } - - function createVrButtonContainer (renderer) { - const container = document.createElement('div') - const vrButton = VRButton.createButton(renderer) - styleContainer(container) - - const closeButton = createCloseButton(container) - - container.appendChild(vrButton) - container.appendChild(closeButton) - document.body.appendChild(container) - - return container - } - - function styleContainer (container: HTMLElement) { - typedAssign(container.style, { - position: 'absolute', - bottom: '80px', - left: '0', - right: '0', - display: 'flex', - justifyContent: 'center', - zIndex: '8', - gap: '8px', - }) - } - - function createCloseButton (container: HTMLElement) { - const closeButton = document.createElement('button') - closeButton.textContent = 'X' - typedAssign(closeButton.style, { - padding: '0 12px', - color: 'white', - fontSize: '14px', - lineHeight: '20px', - cursor: 'pointer', - background: 'transparent', - border: '1px solid rgb(255, 255, 255)', - borderRadius: '4px', - opacity: '0.7', - }) - - closeButton.addEventListener('click', () => { - container.hidden = true - worldRenderer.worldRendererConfig.vrSupport = false - }) - - return closeButton - } - - - async function checkVRSupport () { - try { - const supported = await navigator.xr?.isSessionSupported('immersive-vr') - return supported && !!XRSession.prototype.updateRenderState - } catch (err) { - console.error('Error checking if VR is supported', err) - return false - } - } - - // hack for vr camera - const user = new THREE.Group() - user.name = 'vr-camera-container' - worldRenderer.scene.add(user) - const controllerModelFactory = new XRControllerModelFactory(new GLTFLoader()) - const controller1 = renderer.xr.getControllerGrip(0) - const controller2 = renderer.xr.getControllerGrip(1) - - // todo the logic written here can be hard to understand as it was designed to work in gamepad api emulation mode, will be refactored once there is a contro-max rewrite is done - const virtualGamepadIndex = 4 - let connectedVirtualGamepad - //@ts-expect-error - const manageXrInputSource = ({ gamepad, handedness = defaultHandedness }, defaultHandedness, removeAction = false) => { - if (handedness === 'right') { - const event: any = new Event(removeAction ? 'gamepaddisconnected' : 'gamepadconnected') // todo need to expose and use external gamepads api in contro-max instead - event.gamepad = removeAction ? connectedVirtualGamepad : { ...gamepad, mapping: 'standard', index: virtualGamepadIndex } - connectedVirtualGamepad = event.gamepad - window.dispatchEvent(event) - } - } - let hand1: any = controllerModelFactory.createControllerModel(controller1) - controller1.addEventListener('connected', (event) => { - hand1.xrInputSource = event.data - manageXrInputSource(event.data, 'left') - user.add(controller1) - }) - controller1.add(hand1) - let hand2: any = controllerModelFactory.createControllerModel(controller2) - controller2.addEventListener('connected', (event) => { - hand2.xrInputSource = event.data - manageXrInputSource(event.data, 'right') - user.add(controller2) - }) - controller2.add(hand2) - - controller1.addEventListener('disconnected', () => { - // don't handle removal of gamepads for now as is don't affect contro-max - manageXrInputSource(hand1.xrInputSource, 'left', true) - hand1.xrInputSource = undefined - }) - controller2.addEventListener('disconnected', () => { - manageXrInputSource(hand1.xrInputSource, 'right', true) - hand2.xrInputSource = undefined - }) - - const originalGetGamepads = navigator.getGamepads.bind(navigator) - // is it okay to patch this? - //@ts-expect-error - navigator.getGamepads = () => { - const originalGamepads = originalGetGamepads() - if (!hand1.xrInputSource || !hand2.xrInputSource) return originalGamepads - return [ - ...originalGamepads, - { - axes: remapAxes(hand2.xrInputSource.gamepad.axes, hand1.xrInputSource.gamepad.axes), - buttons: remapButtons(hand2.xrInputSource.gamepad.buttons, hand1.xrInputSource.gamepad.buttons), - connected: true, - mapping: 'standard', - id: '', - index: virtualGamepadIndex - } - ] - } - - let rotSnapReset = true - let yawOffset = 0 - renderer.setAnimationLoop(() => { - if (!renderer.xr.isPresenting) return - if (hand1.xrInputSource && hand2.xrInputSource) { - hand1.xAxis = hand1.xrInputSource.gamepad.axes[2] - hand1.yAxis = hand1.xrInputSource.gamepad.axes[3] - hand2.xAxis = hand2.xrInputSource.gamepad.axes[2] - hand2.yAxis = hand2.xrInputSource.gamepad.axes[3] - // hand2 should be right - if (hand1.xrInputSource.handedness === 'right') { - const tmp = hand2 - hand2 = hand1 - hand1 = tmp - } - } - - if (rotSnapReset) { - if (Math.abs(hand1.xAxis) > 0.8) { - yawOffset -= Math.PI / 4 * Math.sign(hand1.xAxis) - rotSnapReset = false - } - } else if (Math.abs(hand1.xAxis) < 0.1) { - rotSnapReset = true - } - - // appViewer.backend?.updateCamera(null, yawOffset, 0) - // worldRenderer.updateCamera(null, bot.entity.yaw, bot.entity.pitch) - - // todo restore this logic (need to preserve ability to move camera) - // const xrCamera = renderer.xr.getCamera() - // const d = xrCamera.getWorldDirection(new THREE.Vector3()) - // bot.entity.yaw = Math.atan2(-d.x, -d.z) - // bot.entity.pitch = Math.asin(d.y) - - documentRenderer.frameRender(false) - }) - renderer.xr.addEventListener('sessionstart', () => { - user.add(worldRenderer.camera) - worldRenderer.cameraGroupVr = user - }) - renderer.xr.addEventListener('sessionend', () => { - worldRenderer.cameraGroupVr = undefined - user.remove(worldRenderer.camera) - }) - - worldRenderer.abortController.signal.addEventListener('abort', disableVr) -} - -const xrStandardRightButtonsMap = [ - [0 /* trigger */, 'Right Trigger'], - [1 /* squeeze */, 'Right Bumper'], - // need to think of a way to support touchpad input - [3 /* Thumbstick Press */, 'Right Stick'], - [4 /* A */, 'A'], - [5 /* B */, 'B'], -] -const xrStandardLeftButtonsMap = [ - [0 /* trigger */, 'Left Trigger'], - [1 /* squeeze */, 'Left Bumper'], - // need to think of a way to support touchpad input - [3 /* Thumbstick Press */, 'Left Stick'], - [4 /* A */, 'X'], - [5 /* B */, 'Y'], -] -const remapButtons = (rightButtons: any[], leftButtons: any[]) => { - // return remapped buttons - const remapped = [] as string[] - const remapWithMap = (buttons, map) => { - for (const [index, standardName] of map) { - const standardMappingIndex = standardButtonsMap.findIndex((aliases) => aliases.find(alias => standardName === alias)) - remapped[standardMappingIndex] = buttons[index] - } - } - remapWithMap(rightButtons, xrStandardRightButtonsMap) - remapWithMap(leftButtons, xrStandardLeftButtonsMap) - return remapped -} -const remapAxes = (axesRight, axesLeft) => { - // 0, 1 are reserved for touch - return [ - axesLeft[2], - axesLeft[3], - axesRight[2], - axesRight[3] - ] -} - -function typedAssign> (target: T, source: Partial) { - Object.assign(target, source) -} diff --git a/renderer/viewer/three/worldrendererThree.ts b/renderer/viewer/three/worldrendererThree.ts deleted file mode 100644 index 1b4e6152..00000000 --- a/renderer/viewer/three/worldrendererThree.ts +++ /dev/null @@ -1,1161 +0,0 @@ -import * as THREE from 'three' -import { Vec3 } from 'vec3' -import nbt from 'prismarine-nbt' -import PrismarineChatLoader from 'prismarine-chat' -import * as tweenJs from '@tweenjs/tween.js' -import { Biome } from 'minecraft-data' -import { renderSign } from '../sign-renderer' -import { DisplayWorldOptions, GraphicsInitOptions } from '../../../src/appViewer' -import { chunkPos, sectionPos } from '../lib/simpleUtils' -import { WorldRendererCommon } from '../lib/worldrendererCommon' -import { addNewStat } from '../lib/ui/newStats' -import { MesherGeometryOutput } from '../lib/mesher/shared' -import { ItemSpecificContextProperties } from '../lib/basePlayerState' -import { setBlockPosition } from '../lib/mesher/standaloneRenderer' -import { getMyHand } from './hand' -import HoldingBlock from './holdingBlock' -import { getMesh } from './entity/EntityMesh' -import { armorModel } from './entity/armorModels' -import { disposeObject, loadThreeJsTextureFromBitmap } from './threeJsUtils' -import { CursorBlock } from './world/cursorBlock' -import { getItemUv } from './appShared' -import { Entities } from './entities' -import { ThreeJsSound } from './threeJsSound' -import { CameraShake } from './cameraShake' -import { ThreeJsMedia } from './threeJsMedia' -import { Fountain } from './threeJsParticles' -import { WaypointsRenderer } from './waypoints' -import { DEFAULT_TEMPERATURE, SkyboxRenderer } from './skyboxRenderer' - -type SectionKey = string - -export class WorldRendererThree extends WorldRendererCommon { - outputFormat = 'threeJs' as const - sectionObjects: Record = {} - chunkTextures = new Map() - signsCache = new Map() - starField: StarField - cameraSectionPos: Vec3 = new Vec3(0, 0, 0) - holdingBlock: HoldingBlock - holdingBlockLeft: HoldingBlock - scene = new THREE.Scene() - ambientLight = new THREE.AmbientLight(0xcc_cc_cc) - directionalLight = new THREE.DirectionalLight(0xff_ff_ff, 0.5) - entities = new Entities(this) - cameraGroupVr?: THREE.Object3D - material = new THREE.MeshLambertMaterial({ vertexColors: true, transparent: true, alphaTest: 0.1 }) - itemsTexture: THREE.Texture - cursorBlock: CursorBlock - onRender: Array<() => void> = [] - cameraShake: CameraShake - cameraContainer: THREE.Object3D - media: ThreeJsMedia - waitingChunksToDisplay = {} as { [chunkKey: string]: SectionKey[] } - waypoints: WaypointsRenderer - camera: THREE.PerspectiveCamera - renderTimeAvg = 0 - sectionsOffsetsAnimations = {} as { - [chunkKey: string]: { - time: number, - // also specifies direction - speedX: number, - speedY: number, - speedZ: number, - - currentOffsetX: number, - currentOffsetY: number, - currentOffsetZ: number, - - limitX?: number, - limitY?: number, - limitZ?: number, - } - } - fountains: Fountain[] = [] - DEBUG_RAYCAST = false - skyboxRenderer: SkyboxRenderer - - private currentPosTween?: tweenJs.Tween - private currentRotTween?: tweenJs.Tween<{ pitch: number, yaw: number }> - - get tilesRendered () { - return Object.values(this.sectionObjects).reduce((acc, obj) => acc + (obj as any).tilesCount, 0) - } - - get blocksRendered () { - return Object.values(this.sectionObjects).reduce((acc, obj) => acc + (obj as any).blocksCount, 0) - } - - constructor (public renderer: THREE.WebGLRenderer, public initOptions: GraphicsInitOptions, public displayOptions: DisplayWorldOptions) { - if (!initOptions.resourcesManager) throw new Error('resourcesManager is required') - super(initOptions.resourcesManager, displayOptions, initOptions) - - this.renderer = renderer - displayOptions.rendererState.renderer = WorldRendererThree.getRendererInfo(renderer) ?? '...' - this.starField = new StarField(this) - this.cursorBlock = new CursorBlock(this) - this.holdingBlock = new HoldingBlock(this) - this.holdingBlockLeft = new HoldingBlock(this, true) - - // Initialize skybox renderer - this.skyboxRenderer = new SkyboxRenderer(this.scene, this.worldRendererConfig.defaultSkybox, null) - void this.skyboxRenderer.init() - - this.addDebugOverlay() - this.resetScene() - void this.init() - - this.soundSystem = new ThreeJsSound(this) - this.cameraShake = new CameraShake(this, this.onRender) - this.media = new ThreeJsMedia(this) - this.waypoints = new WaypointsRenderer(this) - - // this.fountain = new Fountain(this.scene, this.scene, { - // position: new THREE.Vector3(0, 10, 0), - // }) - - this.renderUpdateEmitter.on('chunkFinished', (chunkKey: string) => { - this.finishChunk(chunkKey) - }) - this.worldSwitchActions() - } - - get cameraObject () { - return this.cameraGroupVr ?? this.cameraContainer - } - - worldSwitchActions () { - this.onWorldSwitched.push(() => { - // clear custom blocks - this.protocolCustomBlocks.clear() - // Reset section animations - this.sectionsOffsetsAnimations = {} - // Clear waypoints - this.waypoints.clear() - }) - } - - updateEntity (e, isPosUpdate = false) { - const overrides = { - rotation: { - head: { - x: e.headPitch ?? e.pitch, - y: e.headYaw, - z: 0 - } - } - } - if (isPosUpdate) { - this.entities.updateEntityPosition(e, false, overrides) - } else { - this.entities.update(e, overrides) - } - } - - updatePlayerEntity (e: any) { - this.entities.handlePlayerEntity(e) - } - - resetScene () { - this.scene.matrixAutoUpdate = false // for perf - this.scene.background = new THREE.Color(this.initOptions.config.sceneBackground) - this.scene.add(this.ambientLight) - this.directionalLight.position.set(1, 1, 0.5).normalize() - this.directionalLight.castShadow = true - this.scene.add(this.directionalLight) - - const size = this.renderer.getSize(new THREE.Vector2()) - this.camera = new THREE.PerspectiveCamera(75, size.x / size.y, 0.1, 1000) - this.cameraContainer = new THREE.Object3D() - this.cameraContainer.add(this.camera) - this.scene.add(this.cameraContainer) - } - - override watchReactivePlayerState () { - super.watchReactivePlayerState() - this.onReactivePlayerStateUpdated('inWater', (value) => { - this.skyboxRenderer.updateWaterState(value, this.playerStateReactive.waterBreathing) - }) - this.onReactivePlayerStateUpdated('waterBreathing', (value) => { - this.skyboxRenderer.updateWaterState(this.playerStateReactive.inWater, value) - }) - this.onReactivePlayerStateUpdated('ambientLight', (value) => { - if (!value) return - this.ambientLight.intensity = value - }) - this.onReactivePlayerStateUpdated('directionalLight', (value) => { - if (!value) return - this.directionalLight.intensity = value - }) - this.onReactivePlayerStateUpdated('lookingAtBlock', (value) => { - this.cursorBlock.setHighlightCursorBlock(value ? new Vec3(value.x, value.y, value.z) : null, value?.shapes) - }) - this.onReactivePlayerStateUpdated('diggingBlock', (value) => { - this.cursorBlock.updateBreakAnimation(value ? { x: value.x, y: value.y, z: value.z } : undefined, value?.stage ?? null, value?.mergedShape) - }) - this.onReactivePlayerStateUpdated('perspective', (value) => { - // Update camera perspective when it changes - const vecPos = new Vec3(this.cameraObject.position.x, this.cameraObject.position.y, this.cameraObject.position.z) - this.updateCamera(vecPos, this.cameraShake.getBaseRotation().yaw, this.cameraShake.getBaseRotation().pitch) - // todo also update camera when block within camera was changed - }) - } - - override watchReactiveConfig () { - super.watchReactiveConfig() - this.onReactiveConfigUpdated('showChunkBorders', (value) => { - this.updateShowChunksBorder(value) - }) - this.onReactiveConfigUpdated('defaultSkybox', (value) => { - this.skyboxRenderer.updateDefaultSkybox(value) - }) - } - - changeHandSwingingState (isAnimationPlaying: boolean, isLeft = false) { - const holdingBlock = isLeft ? this.holdingBlockLeft : this.holdingBlock - if (isAnimationPlaying) { - holdingBlock.startSwing() - } else { - holdingBlock.stopSwing() - } - } - - async updateAssetsData (): Promise { - const resources = this.resourcesManager.currentResources - - const oldTexture = this.material.map - const oldItemsTexture = this.itemsTexture - - const texture = loadThreeJsTextureFromBitmap(resources.blocksAtlasImage) - texture.needsUpdate = true - texture.flipY = false - this.material.map = texture - - const itemsTexture = loadThreeJsTextureFromBitmap(resources.itemsAtlasImage) - itemsTexture.needsUpdate = true - itemsTexture.flipY = false - this.itemsTexture = itemsTexture - - if (oldTexture) { - oldTexture.dispose() - } - if (oldItemsTexture) { - oldItemsTexture.dispose() - } - - await super.updateAssetsData() - this.onAllTexturesLoaded() - if (Object.keys(this.loadedChunks).length > 0) { - console.log('rerendering chunks because of texture update') - this.rerenderAllChunks() - } - } - - onAllTexturesLoaded () { - this.holdingBlock.ready = true - this.holdingBlock.updateItem() - this.holdingBlockLeft.ready = true - this.holdingBlockLeft.updateItem() - } - - changeBackgroundColor (color: [number, number, number]): void { - this.scene.background = new THREE.Color(color[0], color[1], color[2]) - } - - timeUpdated (newTime: number): void { - const nightTime = 13_500 - const morningStart = 23_000 - const displayStars = newTime > nightTime && newTime < morningStart - if (displayStars) { - this.starField.addToScene() - } else { - this.starField.remove() - } - - this.skyboxRenderer.updateTime(newTime) - } - - biomeUpdated (biome: Biome): void { - if (biome?.temperature !== undefined) { - this.skyboxRenderer.updateTemperature(biome.temperature) - } - } - - biomeReset (): void { - // Reset to default temperature when biome is unknown - this.skyboxRenderer.updateTemperature(DEFAULT_TEMPERATURE) - } - - getItemRenderData (item: Record, specificProps: ItemSpecificContextProperties) { - return getItemUv(item, specificProps, this.resourcesManager, this.playerStateReactive) - } - - async demoModel () { - //@ts-expect-error - const pos = cursorBlockRel(0, 1, 0).position - - const mesh = (await getMyHand())! - // mesh.rotation.y = THREE.MathUtils.degToRad(90) - setBlockPosition(mesh, pos) - const helper = new THREE.BoxHelper(mesh, 0xff_ff_00) - mesh.add(helper) - this.scene.add(mesh) - } - - demoItem () { - //@ts-expect-error - const pos = cursorBlockRel(0, 1, 0).position - const { mesh } = this.entities.getItemMesh({ - itemId: 541, - }, {})! - mesh.position.set(pos.x + 0.5, pos.y + 0.5, pos.z + 0.5) - // mesh.scale.set(0.5, 0.5, 0.5) - const helper = new THREE.BoxHelper(mesh, 0xff_ff_00) - mesh.add(helper) - this.scene.add(mesh) - } - - debugOverlayAdded = false - addDebugOverlay () { - if (this.debugOverlayAdded) return - this.debugOverlayAdded = true - const pane = addNewStat('debug-overlay') - setInterval(() => { - pane.setVisibility(this.displayAdvancedStats) - if (this.displayAdvancedStats) { - const formatBigNumber = (num: number) => { - return new Intl.NumberFormat('en-US', {}).format(num) - } - let text = '' - text += `C: ${formatBigNumber(this.renderer.info.render.calls)} ` - text += `TR: ${formatBigNumber(this.renderer.info.render.triangles)} ` - text += `TE: ${formatBigNumber(this.renderer.info.memory.textures)} ` - text += `F: ${formatBigNumber(this.tilesRendered)} ` - text += `B: ${formatBigNumber(this.blocksRendered)}` - pane.updateText(text) - this.backendInfoReport = text - } - }, 200) - } - - /** - * Optionally update data that are depedendent on the viewer position - */ - updatePosDataChunk (key: string) { - const [x, y, z] = key.split(',').map(x => Math.floor(+x / 16)) - // sum of distances: x + y + z - const chunkDistance = Math.abs(x - this.cameraSectionPos.x) + Math.abs(y - this.cameraSectionPos.y) + Math.abs(z - this.cameraSectionPos.z) - const section = this.sectionObjects[key].children.find(child => child.name === 'mesh')! - section.renderOrder = 500 - chunkDistance - } - - override updateViewerPosition (pos: Vec3): void { - this.viewerChunkPosition = pos - } - - cameraSectionPositionUpdate () { - // eslint-disable-next-line guard-for-in - for (const key in this.sectionObjects) { - const value = this.sectionObjects[key] - if (!value) continue - this.updatePosDataChunk(key) - } - } - - getDir (current: number, origin: number) { - if (current === origin) return 0 - return current < origin ? 1 : -1 - } - - finishChunk (chunkKey: string) { - for (const sectionKey of this.waitingChunksToDisplay[chunkKey] ?? []) { - this.sectionObjects[sectionKey].visible = true - } - delete this.waitingChunksToDisplay[chunkKey] - } - - // debugRecomputedDeletedObjects = 0 - handleWorkerMessage (data: { geometry: MesherGeometryOutput, key, type }): void { - if (data.type !== 'geometry') return - let object: THREE.Object3D = this.sectionObjects[data.key] - if (object) { - this.scene.remove(object) - disposeObject(object) - delete this.sectionObjects[data.key] - } - - const chunkCoords = data.key.split(',') - if (!this.loadedChunks[chunkCoords[0] + ',' + chunkCoords[2]] || !data.geometry.positions.length || !this.active) return - - // if (object) { - // this.debugRecomputedDeletedObjects++ - // } - - const geometry = new THREE.BufferGeometry() - geometry.setAttribute('position', new THREE.BufferAttribute(data.geometry.positions, 3)) - geometry.setAttribute('normal', new THREE.BufferAttribute(data.geometry.normals, 3)) - geometry.setAttribute('color', new THREE.BufferAttribute(data.geometry.colors, 3)) - geometry.setAttribute('uv', new THREE.BufferAttribute(data.geometry.uvs, 2)) - geometry.index = new THREE.BufferAttribute(data.geometry.indices as Uint32Array | Uint16Array, 1) - - const mesh = new THREE.Mesh(geometry, this.material) - mesh.position.set(data.geometry.sx, data.geometry.sy, data.geometry.sz) - mesh.name = 'mesh' - object = new THREE.Group() - object.add(mesh) - // mesh with static dimensions: 16x16x16 - const staticChunkMesh = new THREE.Mesh(new THREE.BoxGeometry(16, 16, 16), new THREE.MeshBasicMaterial({ color: 0x00_00_00, transparent: true, opacity: 0 })) - staticChunkMesh.position.set(data.geometry.sx, data.geometry.sy, data.geometry.sz) - const boxHelper = new THREE.BoxHelper(staticChunkMesh, 0xff_ff_00) - boxHelper.name = 'helper' - object.add(boxHelper) - object.name = 'chunk'; - (object as any).tilesCount = data.geometry.positions.length / 3 / 4; - (object as any).blocksCount = data.geometry.blocksCount - if (!this.displayOptions.inWorldRenderingConfig.showChunkBorders) { - boxHelper.visible = false - } - // should not compute it once - if (Object.keys(data.geometry.signs).length) { - for (const [posKey, { isWall, isHanging, rotation }] of Object.entries(data.geometry.signs)) { - const signBlockEntity = this.blockEntities[posKey] - if (!signBlockEntity) continue - const [x, y, z] = posKey.split(',') - const sign = this.renderSign(new Vec3(+x, +y, +z), rotation, isWall, isHanging, nbt.simplify(signBlockEntity)) - if (!sign) continue - object.add(sign) - } - } - if (Object.keys(data.geometry.heads).length) { - for (const [posKey, { isWall, rotation }] of Object.entries(data.geometry.heads)) { - const headBlockEntity = this.blockEntities[posKey] - if (!headBlockEntity) continue - const [x, y, z] = posKey.split(',') - const head = this.renderHead(new Vec3(+x, +y, +z), rotation, isWall, nbt.simplify(headBlockEntity)) - if (!head) continue - object.add(head) - } - } - this.sectionObjects[data.key] = object - if (this.displayOptions.inWorldRenderingConfig._renderByChunks) { - object.visible = false - const chunkKey = `${chunkCoords[0]},${chunkCoords[2]}` - this.waitingChunksToDisplay[chunkKey] ??= [] - this.waitingChunksToDisplay[chunkKey].push(data.key) - if (this.finishedChunks[chunkKey]) { - // todo it might happen even when it was not an update - this.finishChunk(chunkKey) - } - } - - this.updatePosDataChunk(data.key) - object.matrixAutoUpdate = false - mesh.onAfterRender = (renderer, scene, camera, geometry, material, group) => { - // mesh.matrixAutoUpdate = false - } - - this.scene.add(object) - } - - getSignTexture (position: Vec3, blockEntity, isHanging, backSide = false) { - const chunk = chunkPos(position) - let textures = this.chunkTextures.get(`${chunk[0]},${chunk[1]}`) - if (!textures) { - textures = {} - this.chunkTextures.set(`${chunk[0]},${chunk[1]}`, textures) - } - const texturekey = `${position.x},${position.y},${position.z}` - // todo investigate bug and remove this so don't need to clean in section dirty - if (textures[texturekey]) return textures[texturekey] - - const PrismarineChat = PrismarineChatLoader(this.version) - const canvas = renderSign(blockEntity, isHanging, PrismarineChat) - if (!canvas) return - const tex = new THREE.Texture(canvas) - tex.magFilter = THREE.NearestFilter - tex.minFilter = THREE.NearestFilter - tex.needsUpdate = true - textures[texturekey] = tex - return tex - } - - getCameraPosition () { - const worldPos = new THREE.Vector3() - this.camera.getWorldPosition(worldPos) - return worldPos - } - - getSectionCameraPosition () { - const pos = this.getCameraPosition() - return new Vec3( - Math.floor(pos.x / 16), - Math.floor(pos.y / 16), - Math.floor(pos.z / 16) - ) - } - - updateCameraSectionPos () { - const newSectionPos = this.getSectionCameraPosition() - if (!this.cameraSectionPos.equals(newSectionPos)) { - this.cameraSectionPos = newSectionPos - this.cameraSectionPositionUpdate() - } - } - - setFirstPersonCamera (pos: Vec3 | null, yaw: number, pitch: number) { - const yOffset = this.playerStateReactive.eyeHeight - - this.updateCamera(pos?.offset(0, yOffset, 0) ?? null, yaw, pitch) - this.media.tryIntersectMedia() - this.updateCameraSectionPos() - } - - getThirdPersonCamera (pos: THREE.Vector3 | null, yaw: number, pitch: number) { - pos ??= this.cameraObject.position - - // Calculate camera offset based on perspective - const isBack = this.playerStateReactive.perspective === 'third_person_back' - const distance = 4 // Default third person distance - - // Calculate direction vector using proper world orientation - // We need to get the camera's current look direction and use that for positioning - - // Create a direction vector that represents where the camera is looking - // This matches the Three.js camera coordinate system - const direction = new THREE.Vector3(0, 0, -1) // Forward direction in camera space - - // Apply the same rotation that's applied to the camera container - const pitchQuat = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), pitch) - const yawQuat = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), yaw) - const finalQuat = new THREE.Quaternion().multiplyQuaternions(yawQuat, pitchQuat) - - // Transform the direction vector by the camera's rotation - direction.applyQuaternion(finalQuat) - - // For back view, we want the camera behind the player (opposite to view direction) - // For front view, we want the camera in front of the player (same as view direction) - if (isBack) { - direction.multiplyScalar(-1) - } - - // Create debug visualization if advanced stats are enabled - if (this.DEBUG_RAYCAST) { - this.debugRaycast(pos, direction, distance) - } - - // Perform raycast to avoid camera going through blocks - const raycaster = new THREE.Raycaster() - raycaster.set(pos, direction) - raycaster.far = distance // Limit raycast distance - - // Filter to only nearby chunks for performance - const nearbyChunks = Object.values(this.sectionObjects) - .filter(obj => obj.name === 'chunk' && obj.visible) - .filter(obj => { - // Get the mesh child which has the actual geometry - const mesh = obj.children.find(child => child.name === 'mesh') - if (!mesh) return false - - // Check distance from player position to chunk - const chunkWorldPos = new THREE.Vector3() - mesh.getWorldPosition(chunkWorldPos) - const distance = pos.distanceTo(chunkWorldPos) - return distance < 80 // Only check chunks within 80 blocks - }) - - // Get all mesh children for raycasting - const meshes: THREE.Object3D[] = [] - for (const chunk of nearbyChunks) { - const mesh = chunk.children.find(child => child.name === 'mesh') - if (mesh) meshes.push(mesh) - } - - const intersects = raycaster.intersectObjects(meshes, false) - - let finalDistance = distance - if (intersects.length > 0) { - // Use intersection distance minus a small offset to prevent clipping - finalDistance = Math.max(0.5, intersects[0].distance - 0.2) - } - - const finalPos = new Vec3( - pos.x + direction.x * finalDistance, - pos.y + direction.y * finalDistance, - pos.z + direction.z * finalDistance - ) - - return finalPos - } - - private debugRaycastHelper?: THREE.ArrowHelper - private debugHitPoint?: THREE.Mesh - - private debugRaycast (pos: THREE.Vector3, direction: THREE.Vector3, distance: number) { - // Remove existing debug objects - if (this.debugRaycastHelper) { - this.scene.remove(this.debugRaycastHelper) - this.debugRaycastHelper = undefined - } - if (this.debugHitPoint) { - this.scene.remove(this.debugHitPoint) - this.debugHitPoint = undefined - } - - // Create raycast arrow - this.debugRaycastHelper = new THREE.ArrowHelper( - direction.clone().normalize(), - pos, - distance, - 0xff_00_00, // Red color - distance * 0.1, - distance * 0.05 - ) - this.scene.add(this.debugRaycastHelper) - - // Create hit point indicator - const hitGeometry = new THREE.SphereGeometry(0.2, 8, 8) - const hitMaterial = new THREE.MeshBasicMaterial({ color: 0x00_ff_00 }) - this.debugHitPoint = new THREE.Mesh(hitGeometry, hitMaterial) - this.debugHitPoint.position.copy(pos).add(direction.clone().multiplyScalar(distance)) - this.scene.add(this.debugHitPoint) - } - - prevFramePerspective = null as string | null - - updateCamera (pos: Vec3 | null, yaw: number, pitch: number): void { - // if (this.freeFlyMode) { - // pos = this.freeFlyState.position - // pitch = this.freeFlyState.pitch - // yaw = this.freeFlyState.yaw - // } - - if (pos) { - if (this.renderer.xr.isPresenting) { - pos.y -= this.camera.position.y // Fix Y position of camera in world - } - - this.currentPosTween?.stop() - this.currentPosTween = new tweenJs.Tween(this.cameraObject.position).to({ x: pos.x, y: pos.y, z: pos.z }, this.playerStateUtils.isSpectatingEntity() ? 150 : 50).start() - // this.freeFlyState.position = pos - } - - if (this.playerStateUtils.isSpectatingEntity()) { - const rotation = this.cameraShake.getBaseRotation() - // wrap in the correct direction - let yawOffset = 0 - const halfPi = Math.PI / 2 - if (rotation.yaw < halfPi && yaw > Math.PI + halfPi) { - yawOffset = -Math.PI * 2 - } else if (yaw < halfPi && rotation.yaw > Math.PI + halfPi) { - yawOffset = Math.PI * 2 - } - this.currentRotTween?.stop() - this.currentRotTween = new tweenJs.Tween(rotation).to({ pitch, yaw: yaw + yawOffset }, 100) - .onUpdate(params => this.cameraShake.setBaseRotation(params.pitch, params.yaw - yawOffset)).start() - } else { - this.currentRotTween?.stop() - this.cameraShake.setBaseRotation(pitch, yaw) - - const { perspective } = this.playerStateReactive - if (perspective === 'third_person_back' || perspective === 'third_person_front') { - // Use getThirdPersonCamera for proper raycasting with max distance of 4 - const currentCameraPos = this.cameraObject.position - const thirdPersonPos = this.getThirdPersonCamera( - new THREE.Vector3(currentCameraPos.x, currentCameraPos.y, currentCameraPos.z), - yaw, - pitch - ) - - const distance = currentCameraPos.distanceTo(new THREE.Vector3(thirdPersonPos.x, thirdPersonPos.y, thirdPersonPos.z)) - // Apply Z offset based on perspective and calculated distance - const zOffset = perspective === 'third_person_back' ? distance : -distance - this.camera.position.set(0, 0, zOffset) - - if (perspective === 'third_person_front') { - // Flip camera view 180 degrees around Y axis for front view - this.camera.rotation.set(0, Math.PI, 0) - } else { - this.camera.rotation.set(0, 0, 0) - } - } else { - this.camera.position.set(0, 0, 0) - this.camera.rotation.set(0, 0, 0) - - // remove any debug raycasting - if (this.debugRaycastHelper) { - this.scene.remove(this.debugRaycastHelper) - this.debugRaycastHelper = undefined - } - if (this.debugHitPoint) { - this.scene.remove(this.debugHitPoint) - this.debugHitPoint = undefined - } - } - } - - this.updateCameraSectionPos() - } - - debugChunksVisibilityOverride () { - const { chunksRenderAboveOverride, chunksRenderBelowOverride, chunksRenderDistanceOverride, chunksRenderAboveEnabled, chunksRenderBelowEnabled, chunksRenderDistanceEnabled } = this.reactiveDebugParams - - const baseY = this.cameraSectionPos.y * 16 - - if ( - this.displayOptions.inWorldRenderingConfig.enableDebugOverlay && - chunksRenderAboveOverride !== undefined || - chunksRenderBelowOverride !== undefined || - chunksRenderDistanceOverride !== undefined - ) { - for (const [key, object] of Object.entries(this.sectionObjects)) { - const [x, y, z] = key.split(',').map(Number) - const isVisible = - // eslint-disable-next-line no-constant-binary-expression, sonarjs/no-redundant-boolean - (chunksRenderAboveEnabled && chunksRenderAboveOverride !== undefined) ? y <= (baseY + chunksRenderAboveOverride) : true && - // eslint-disable-next-line @stylistic/indent-binary-ops, no-constant-binary-expression, sonarjs/no-redundant-boolean - (chunksRenderBelowEnabled && chunksRenderBelowOverride !== undefined) ? y >= (baseY - chunksRenderBelowOverride) : true && - // eslint-disable-next-line @stylistic/indent-binary-ops - (chunksRenderDistanceEnabled && chunksRenderDistanceOverride !== undefined) ? Math.abs(y - baseY) <= chunksRenderDistanceOverride : true - - object.visible = isVisible - } - } else { - for (const object of Object.values(this.sectionObjects)) { - object.visible = true - } - } - } - - render (sizeChanged = false) { - if (this.reactiveDebugParams.stopRendering) return - this.debugChunksVisibilityOverride() - const start = performance.now() - this.lastRendered = performance.now() - this.cursorBlock.render() - this.updateSectionOffsets() - - // Update skybox position to follow camera - const cameraPos = this.getCameraPosition() - this.skyboxRenderer.update(cameraPos, this.viewDistance) - - const sizeOrFovChanged = sizeChanged || this.displayOptions.inWorldRenderingConfig.fov !== this.camera.fov - if (sizeOrFovChanged) { - const size = this.renderer.getSize(new THREE.Vector2()) - this.camera.aspect = size.width / size.height - this.camera.fov = this.displayOptions.inWorldRenderingConfig.fov - this.camera.updateProjectionMatrix() - } - - if (!this.reactiveDebugParams.disableEntities) { - this.entities.render() - } - - // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style - const cam = this.cameraGroupVr instanceof THREE.Group ? this.cameraGroupVr.children.find(child => child instanceof THREE.PerspectiveCamera) as THREE.PerspectiveCamera : this.camera - this.renderer.render(this.scene, cam) - - if ( - this.displayOptions.inWorldRenderingConfig.showHand && - this.playerStateReactive.gameMode !== 'spectator' && - this.playerStateReactive.perspective === 'first_person' && - // !this.freeFlyMode && - !this.renderer.xr.isPresenting - ) { - this.holdingBlock.render(this.camera, this.renderer, this.ambientLight, this.directionalLight) - this.holdingBlockLeft.render(this.camera, this.renderer, this.ambientLight, this.directionalLight) - } - - for (const fountain of this.fountains) { - if (this.sectionObjects[fountain.sectionId] && !this.sectionObjects[fountain.sectionId].foutain) { - fountain.createParticles(this.sectionObjects[fountain.sectionId]) - this.sectionObjects[fountain.sectionId].foutain = true - } - fountain.render() - } - - this.waypoints.render() - - for (const onRender of this.onRender) { - onRender() - } - const end = performance.now() - const totalTime = end - start - this.renderTimeAvgCount++ - this.renderTimeAvg = ((this.renderTimeAvg * (this.renderTimeAvgCount - 1)) + totalTime) / this.renderTimeAvgCount - this.renderTimeMax = Math.max(this.renderTimeMax, totalTime) - this.currentRenderedFrames++ - } - - renderHead (position: Vec3, rotation: number, isWall: boolean, blockEntity) { - let textureData: string - if (blockEntity.SkullOwner) { - textureData = blockEntity.SkullOwner.Properties?.textures?.[0]?.Value - } else { - textureData = blockEntity.profile?.properties?.find(p => p.name === 'textures')?.value - } - if (!textureData) return - - try { - const decodedData = JSON.parse(Buffer.from(textureData, 'base64').toString()) - let skinUrl = decodedData.textures?.SKIN?.url - const { skinTexturesProxy } = this.worldRendererConfig - if (skinTexturesProxy) { - skinUrl = skinUrl?.replace('http://textures.minecraft.net/', skinTexturesProxy) - .replace('https://textures.minecraft.net/', skinTexturesProxy) - } - - const mesh = getMesh(this, skinUrl, armorModel.head) - const group = new THREE.Group() - if (isWall) { - mesh.position.set(0, 0.3125, 0.3125) - } - // move head model down as armor have a different offset than blocks - mesh.position.y -= 23 / 16 - group.add(mesh) - group.position.set(position.x + 0.5, position.y + 0.045, position.z + 0.5) - group.rotation.set( - 0, - -THREE.MathUtils.degToRad(rotation * (isWall ? 90 : 45 / 2)), - 0 - ) - group.scale.set(0.8, 0.8, 0.8) - return group - } catch (err) { - console.error('Error decoding player texture:', err) - } - } - - renderSign (position: Vec3, rotation: number, isWall: boolean, isHanging: boolean, blockEntity) { - const tex = this.getSignTexture(position, blockEntity, isHanging) - - if (!tex) return - - // todo implement - // const key = JSON.stringify({ position, rotation, isWall }) - // if (this.signsCache.has(key)) { - // console.log('cached', key) - // } else { - // this.signsCache.set(key, tex) - // } - - const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), new THREE.MeshBasicMaterial({ map: tex, transparent: true })) - mesh.renderOrder = 999 - - const lineHeight = 7 / 16 - const scaleFactor = isHanging ? 1.3 : 1 - mesh.scale.set(1 * scaleFactor, lineHeight * scaleFactor, 1 * scaleFactor) - - const thickness = (isHanging ? 2 : 1.5) / 16 - const wallSpacing = 0.25 / 16 - if (isWall && !isHanging) { - mesh.position.set(0, 0, -0.5 + thickness + wallSpacing + 0.0001) - } else { - mesh.position.set(0, 0, thickness / 2 + 0.0001) - } - - const group = new THREE.Group() - group.rotation.set( - 0, - -THREE.MathUtils.degToRad(rotation * (isWall ? 90 : 45 / 2)), - 0 - ) - group.add(mesh) - const height = (isHanging ? 10 : 8) / 16 - const heightOffset = (isHanging ? 0 : isWall ? 4.333 : 9.333) / 16 - const textPosition = height / 2 + heightOffset - group.position.set(position.x + 0.5, position.y + textPosition, position.z + 0.5) - return group - } - - lightUpdate (chunkX: number, chunkZ: number) { - // set all sections in the chunk dirty - for (let y = this.worldSizeParams.minY; y < this.worldSizeParams.worldHeight; y += 16) { - this.setSectionDirty(new Vec3(chunkX, y, chunkZ)) - } - } - - rerenderAllChunks () { // todo not clear what to do with loading chunks - for (const key of Object.keys(this.sectionObjects)) { - const [x, y, z] = key.split(',').map(Number) - this.setSectionDirty(new Vec3(x, y, z)) - } - } - - updateShowChunksBorder (value: boolean) { - for (const object of Object.values(this.sectionObjects)) { - for (const child of object.children) { - if (child.name === 'helper') { - child.visible = value - } - } - } - } - - resetWorld () { - super.resetWorld() - - for (const mesh of Object.values(this.sectionObjects)) { - this.scene.remove(mesh) - } - - // Clean up debug objects - if (this.debugRaycastHelper) { - this.scene.remove(this.debugRaycastHelper) - this.debugRaycastHelper = undefined - } - if (this.debugHitPoint) { - this.scene.remove(this.debugHitPoint) - this.debugHitPoint = undefined - } - } - - getLoadedChunksRelative (pos: Vec3, includeY = false) { - const [currentX, currentY, currentZ] = sectionPos(pos) - return Object.fromEntries(Object.entries(this.sectionObjects).map(([key, o]) => { - const [xRaw, yRaw, zRaw] = key.split(',').map(Number) - const [x, y, z] = sectionPos({ x: xRaw, y: yRaw, z: zRaw }) - const setKey = includeY ? `${x - currentX},${y - currentY},${z - currentZ}` : `${x - currentX},${z - currentZ}` - return [setKey, o] - })) - } - - cleanChunkTextures (x, z) { - const textures = this.chunkTextures.get(`${Math.floor(x / 16)},${Math.floor(z / 16)}`) ?? {} - for (const key of Object.keys(textures)) { - textures[key].dispose() - delete textures[key] - } - } - - readdChunks () { - for (const key of Object.keys(this.sectionObjects)) { - this.scene.remove(this.sectionObjects[key]) - } - setTimeout(() => { - for (const key of Object.keys(this.sectionObjects)) { - this.scene.add(this.sectionObjects[key]) - } - }, 500) - } - - disableUpdates (children = this.scene.children) { - for (const child of children) { - child.matrixWorldNeedsUpdate = false - this.disableUpdates(child.children ?? []) - } - } - - removeColumn (x, z) { - super.removeColumn(x, z) - - this.cleanChunkTextures(x, z) - for (let y = this.worldSizeParams.minY; y < this.worldSizeParams.worldHeight; y += 16) { - this.setSectionDirty(new Vec3(x, y, z), false) - const key = `${x},${y},${z}` - const mesh = this.sectionObjects[key] - if (mesh) { - this.scene.remove(mesh) - disposeObject(mesh) - } - delete this.sectionObjects[key] - } - } - - setSectionDirty (...args: Parameters) { - const [pos] = args - this.cleanChunkTextures(pos.x, pos.z) // todo don't do this! - super.setSectionDirty(...args) - } - - static getRendererInfo (renderer: THREE.WebGLRenderer) { - try { - const gl = renderer.getContext() - return `${gl.getParameter(gl.getExtension('WEBGL_debug_renderer_info')!.UNMASKED_RENDERER_WEBGL)}` - } catch (err) { - console.warn('Failed to get renderer info', err) - } - } - - worldStop () { - this.media.onWorldStop() - } - - destroy (): void { - super.destroy() - this.skyboxRenderer.dispose() - } - - shouldObjectVisible (object: THREE.Object3D) { - // Get chunk coordinates - const chunkX = Math.floor(object.position.x / 16) * 16 - const chunkZ = Math.floor(object.position.z / 16) * 16 - const sectionY = Math.floor(object.position.y / 16) * 16 - - const chunkKey = `${chunkX},${chunkZ}` - const sectionKey = `${chunkX},${sectionY},${chunkZ}` - - return !!this.finishedChunks[chunkKey] || !!this.sectionObjects[sectionKey] - } - - updateSectionOffsets () { - const currentTime = performance.now() - for (const [key, anim] of Object.entries(this.sectionsOffsetsAnimations)) { - const timeDelta = (currentTime - anim.time) / 1000 // Convert to seconds - anim.time = currentTime - - // Update offsets based on speed and time delta - anim.currentOffsetX += anim.speedX * timeDelta - anim.currentOffsetY += anim.speedY * timeDelta - anim.currentOffsetZ += anim.speedZ * timeDelta - - // Apply limits if they exist - if (anim.limitX !== undefined) { - if (anim.speedX > 0) { - anim.currentOffsetX = Math.min(anim.currentOffsetX, anim.limitX) - } else { - anim.currentOffsetX = Math.max(anim.currentOffsetX, anim.limitX) - } - } - if (anim.limitY !== undefined) { - if (anim.speedY > 0) { - anim.currentOffsetY = Math.min(anim.currentOffsetY, anim.limitY) - } else { - anim.currentOffsetY = Math.max(anim.currentOffsetY, anim.limitY) - } - } - if (anim.limitZ !== undefined) { - if (anim.speedZ > 0) { - anim.currentOffsetZ = Math.min(anim.currentOffsetZ, anim.limitZ) - } else { - anim.currentOffsetZ = Math.max(anim.currentOffsetZ, anim.limitZ) - } - } - - // Apply the offset to the section object - const section = this.sectionObjects[key] - if (section) { - section.position.set( - anim.currentOffsetX, - anim.currentOffsetY, - anim.currentOffsetZ - ) - section.updateMatrix() - } - } - } - - reloadWorld () { - this.entities.reloadEntities() - } -} - -class StarField { - points?: THREE.Points - private _enabled = true - get enabled () { - return this._enabled - } - - set enabled (value) { - this._enabled = value - if (this.points) { - this.points.visible = value - } - } - - constructor ( - private readonly worldRenderer: WorldRendererThree - ) { - const clock = new THREE.Clock() - const speed = 0.2 - this.worldRenderer.onRender.push(() => { - if (!this.points) return - this.points.position.copy(this.worldRenderer.getCameraPosition()); - (this.points.material as StarfieldMaterial).uniforms.time.value = clock.getElapsedTime() * speed - }) - } - - addToScene () { - if (this.points || !this.enabled) return - - const radius = 80 - const depth = 50 - const count = 7000 - const factor = 7 - const saturation = 10 - - const geometry = new THREE.BufferGeometry() - - const genStar = r => new THREE.Vector3().setFromSpherical(new THREE.Spherical(r, Math.acos(1 - Math.random() * 2), Math.random() * 2 * Math.PI)) - - const positions = [] as number[] - const colors = [] as number[] - const sizes = Array.from({ length: count }, () => (0.5 + 0.5 * Math.random()) * factor) - const color = new THREE.Color() - let r = radius + depth - const increment = depth / count - for (let i = 0; i < count; i++) { - r -= increment * Math.random() - positions.push(...genStar(r).toArray()) - color.setHSL(i / count, saturation, 0.9) - colors.push(color.r, color.g, color.b) - } - - geometry.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3)) - geometry.setAttribute('color', new THREE.Float32BufferAttribute(colors, 3)) - geometry.setAttribute('size', new THREE.Float32BufferAttribute(sizes, 1)) - - // Create a material - const material = new StarfieldMaterial() - material.blending = THREE.AdditiveBlending - material.depthTest = false - material.transparent = true - - // Create points and add them to the scene - this.points = new THREE.Points(geometry, material) - this.worldRenderer.scene.add(this.points) - - this.points.renderOrder = -1 - } - - remove () { - if (this.points) { - this.points.geometry.dispose(); - (this.points.material as THREE.Material).dispose() - this.worldRenderer.scene.remove(this.points) - - this.points = undefined - } - } -} - -const version = parseInt(THREE.REVISION.replaceAll(/\D+/g, ''), 10) -class StarfieldMaterial extends THREE.ShaderMaterial { - constructor () { - super({ - uniforms: { time: { value: 0 }, fade: { value: 1 } }, - vertexShader: /* glsl */ ` - uniform float time; - attribute float size; - varying vec3 vColor; - attribute vec3 color; - void main() { - vColor = color; - vec4 mvPosition = modelViewMatrix * vec4(position, 0.5); - gl_PointSize = 0.7 * size * (30.0 / -mvPosition.z) * (3.0 + sin(time + 100.0)); - gl_Position = projectionMatrix * mvPosition; - }`, - fragmentShader: /* glsl */ ` - uniform sampler2D pointTexture; - uniform float fade; - varying vec3 vColor; - void main() { - float opacity = 1.0; - gl_FragColor = vec4(vColor, 1.0); - - #include - #include <${version >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}> - }`, - }) - } -} diff --git a/replaceScript.ts b/replaceScript.ts new file mode 100644 index 00000000..910c88ae --- /dev/null +++ b/replaceScript.ts @@ -0,0 +1,15 @@ +import fs from 'fs' + +let file = fs.readFileSync('./.git/rebase-merge/git-rebase-todo', 'utf8') + +const actions = fs.readFileSync('./actions', 'utf8') + +actions.split('\n').forEach(action => { + const [type, commit] = action.split(' ') + // if (!file.includes(`pick ${commit}`)) throw new Error(`Commit ${commit} not found`) + file = file.replace(`pick ${commit}`, `${type} ${commit}`) +}) + +fs.writeFileSync('./actions2', file, 'utf8') + +fs.writeFileSync('./.git/rebase-merge/git-rebase-todo', file, 'utf8') diff --git a/rsbuild.config.ts b/rsbuild.config.ts deleted file mode 100644 index 6cd6b2ed..00000000 --- a/rsbuild.config.ts +++ /dev/null @@ -1,298 +0,0 @@ -/// -import { defineConfig, mergeRsbuildConfig, RsbuildPluginAPI } from '@rsbuild/core' -import { pluginReact } from '@rsbuild/plugin-react' -import { pluginTypedCSSModules } from '@rsbuild/plugin-typed-css-modules' -import { pluginNodePolyfill } from '@rsbuild/plugin-node-polyfill' -import { pluginTypeCheck } from '@rsbuild/plugin-type-check' -import path from 'path' -import childProcess from 'child_process' -import fs from 'fs' -import fsExtra from 'fs-extra' -import { promisify } from 'util' -import { generateSW } from 'workbox-build' -import { getSwAdditionalEntries } from './scripts/build' -import { appAndRendererSharedConfig } from './renderer/rsbuildSharedConfig' -import { genLargeDataAliases } from './scripts/genLargeDataAliases' -import sharp from 'sharp' -import supportedVersions from './src/supportedVersions.mjs' -import { startWsServer } from './scripts/wsServer' - -const SINGLE_FILE_BUILD = process.env.SINGLE_FILE_BUILD === 'true' - -if (SINGLE_FILE_BUILD) { - const patchCssFile = 'node_modules/pixelarticons/fonts/pixelart-icons-font.css' - const text = fs.readFileSync(patchCssFile, 'utf8') - fs.writeFileSync(patchCssFile, text.replaceAll("url('pixelart-icons-font.ttf?t=1711815892278') format('truetype'),", ""), 'utf8') -} - -//@ts-ignore -try { require('./localSettings.js') } catch { } - -const execAsync = promisify(childProcess.exec) - -const buildingVersion = new Date().toISOString().split(':')[0] - -const dev = process.env.NODE_ENV === 'development' -const disableServiceWorker = process.env.DISABLE_SERVICE_WORKER === 'true' - -let releaseTag -let releaseLink -let releaseChangelog -let githubRepositoryFallback - -if (fs.existsSync('./assets/release.json')) { - const releaseJson = JSON.parse(fs.readFileSync('./assets/release.json', 'utf8')) - releaseTag = releaseJson.latestTag - releaseLink = releaseJson.isCommit ? `/commit/${releaseJson.latestTag}` : `/releases/${releaseJson.latestTag}` - releaseChangelog = releaseJson.changelog?.replace(//, '') - githubRepositoryFallback = releaseJson.repository -} - -const configJson = JSON.parse(fs.readFileSync('./config.json', 'utf8')) -try { - Object.assign(configJson, JSON.parse(fs.readFileSync(process.env.LOCAL_CONFIG_FILE || './config.local.json', 'utf8'))) -} catch (err) {} -if (dev) { - configJson.defaultProxy = ':8080' -} - -const configSource = (SINGLE_FILE_BUILD ? 'BUNDLED' : (process.env.CONFIG_JSON_SOURCE || 'REMOTE')) as 'BUNDLED' | 'REMOTE' - -const faviconPath = 'favicon.png' - -const enableMetrics = process.env.ENABLE_METRICS === 'true' - -// base options are in ./renderer/rsbuildSharedConfig.ts -const appConfig = defineConfig({ - html: { - template: './index.html', - inject: 'body', - tags: [ - ...SINGLE_FILE_BUILD ? [] : [ - { - tag: 'link', - attrs: { - rel: 'manifest', - crossorigin: 'anonymous', - href: 'manifest.json' - }, - } - ], - // - // - // - { - tag: 'link', - attrs: { - rel: 'favicon', - href: faviconPath - } - }, - ...SINGLE_FILE_BUILD ? [] : [ - { - tag: 'link', - attrs: { - rel: 'icon', - type: 'image/png', - href: faviconPath - } - }, - { - tag: 'meta', - attrs: { - property: 'og:image', - content: faviconPath - } - } - ] - ] - }, - output: { - externals: [ - 'sharp' - ], - sourceMap: { - js: 'source-map', - css: true, - }, - minify: { - // js: false, - jsOptions: { - minimizerOptions: { - mangle: { - safari10: true, - keep_classnames: true, - keep_fnames: true, - keep_private_props: true, - }, - compress: { - unused: true, - }, - }, - }, - }, - distPath: SINGLE_FILE_BUILD ? { - html: './single', - } : undefined, - inlineScripts: SINGLE_FILE_BUILD, - inlineStyles: SINGLE_FILE_BUILD, - // 50kb limit for data uri - dataUriLimit: SINGLE_FILE_BUILD ? 1 * 1024 * 1024 * 1024 : 50 * 1024 - }, - performance: { - // prefetch: { - // include(filename) { - // return filename.includes('mc-data') || filename.includes('mc-assets') - // }, - // }, - }, - source: { - entry: { - index: './src/index.ts', - }, - // exclude: [ - // /.woff$/ - // ], - define: { - 'process.env.BUILD_VERSION': JSON.stringify(!dev ? buildingVersion : 'undefined'), - 'process.env.MAIN_MENU_LINKS': JSON.stringify(process.env.MAIN_MENU_LINKS), - 'process.env.SINGLE_FILE_BUILD': JSON.stringify(process.env.SINGLE_FILE_BUILD), - 'process.env.SINGLE_FILE_BUILD_MODE': JSON.stringify(process.env.SINGLE_FILE_BUILD), - 'process.platform': '"browser"', - 'process.env.GITHUB_URL': - JSON.stringify(`https://github.com/${process.env.GITHUB_REPOSITORY || `${process.env.VERCEL_GIT_REPO_OWNER}/${process.env.VERCEL_GIT_REPO_SLUG}` || githubRepositoryFallback}`), - 'process.env.ALWAYS_MINIMAL_SERVER_UI': JSON.stringify(process.env.ALWAYS_MINIMAL_SERVER_UI), - 'process.env.RELEASE_TAG': JSON.stringify(releaseTag), - 'process.env.RELEASE_LINK': JSON.stringify(releaseLink), - 'process.env.RELEASE_CHANGELOG': JSON.stringify(releaseChangelog), - 'process.env.DISABLE_SERVICE_WORKER': JSON.stringify(disableServiceWorker), - 'process.env.INLINED_APP_CONFIG': JSON.stringify(configSource === 'BUNDLED' ? configJson : null), - 'process.env.ENABLE_COOKIE_STORAGE': JSON.stringify(process.env.ENABLE_COOKIE_STORAGE || true), - 'process.env.COOKIE_STORAGE_PREFIX': JSON.stringify(process.env.COOKIE_STORAGE_PREFIX || ''), - 'process.env.WS_PORT': JSON.stringify(enableMetrics ? 8081 : false), - }, - }, - server: { - // strictPort: true, - // publicDir: { - // name: 'assets', - // }, - proxy: { - '/api': 'http://localhost:8080', - }, - }, - plugins: [ - pluginTypedCSSModules(), - { - name: 'test', - setup(build: RsbuildPluginAPI) { - const prep = async () => { - console.time('total-prep') - fs.mkdirSync('./generated', { recursive: true }) - if (!fs.existsSync('./generated/minecraft-data-optimized.json') || !fs.existsSync('./generated/mc-assets-compressed.js') || require('./generated/minecraft-data-optimized.json').versionKey !== require('minecraft-data/package.json').version) { - childProcess.execSync('tsx ./scripts/makeOptimizedMcData.mjs', { stdio: 'inherit' }) - } - childProcess.execSync('tsx ./scripts/genShims.ts', { stdio: 'inherit' }) - if (!fs.existsSync('./generated/latestBlockCollisionsShapes.json') || require('./generated/latestBlockCollisionsShapes.json').versionKey !== require('minecraft-data/package.json').version) { - childProcess.execSync('tsx ./scripts/optimizeBlockCollisions.ts', { stdio: 'inherit' }) - } - // childProcess.execSync(['tsx', './scripts/genLargeDataAliases.ts', ...(SINGLE_FILE_BUILD ? ['--compressed'] : [])].join(' '), { stdio: 'inherit' }) - genLargeDataAliases(SINGLE_FILE_BUILD || process.env.ALWAYS_COMPRESS_LARGE_DATA === 'true') - fsExtra.copySync('./node_modules/mc-assets/dist/other-textures/latest/entity', './dist/textures/entity') - fsExtra.copySync('./assets/background', './dist/background') - fs.copyFileSync('./assets/favicon.png', './dist/favicon.png') - fs.copyFileSync('./assets/playground.html', './dist/playground.html') - fs.copyFileSync('./assets/manifest.json', './dist/manifest.json') - fs.copyFileSync('./assets/config.html', './dist/config.html') - fs.copyFileSync('./assets/debug-inputs.html', './dist/debug-inputs.html') - fs.copyFileSync('./assets/loading-bg.jpg', './dist/loading-bg.jpg') - if (fs.existsSync('./assets/release.json')) { - fs.copyFileSync('./assets/release.json', './dist/release.json') - } - - if (configSource === 'REMOTE') { - fs.writeFileSync('./dist/config.json', JSON.stringify(configJson, undefined, 2), 'utf8') - } - if (fs.existsSync('./generated/sounds.js')) { - fs.copyFileSync('./generated/sounds.js', './dist/sounds.js') - } - // childProcess.execSync('./scripts/prepareSounds.mjs', { stdio: 'inherit' }) - // childProcess.execSync('tsx ./scripts/genMcDataTypes.ts', { stdio: 'inherit' }) - // childProcess.execSync('tsx ./scripts/genPixelartTypes.ts', { stdio: 'inherit' }) - if (fs.existsSync('./renderer/dist/mesher.js') && dev) { - // copy mesher - fs.copyFileSync('./renderer/dist/mesher.js', './dist/mesher.js') - fs.copyFileSync('./renderer/dist/mesher.js.map', './dist/mesher.js.map') - } else if (!dev) { - await execAsync('pnpm run build-mesher') - } - fs.writeFileSync('./dist/version.txt', buildingVersion, 'utf-8') - - // Start WebSocket server in development - if (dev && enableMetrics) { - await startWsServer(8081, false) - } - - console.timeEnd('total-prep') - } - if (!dev) { - build.onBeforeBuild(async () => { - prep() - }) - build.onAfterBuild(async () => { - if (fs.readdirSync('./assets/customTextures').length > 0) { - childProcess.execSync('tsx ./scripts/patchAssets.ts', { stdio: 'inherit' }) - } - - if (SINGLE_FILE_BUILD) { - // check that only index.html is in the dist/single folder - const singleBuildFiles = fs.readdirSync('./dist/single') - if (singleBuildFiles.length !== 1 || singleBuildFiles[0] !== 'index.html') { - throw new Error('Single file build must only have index.html in the dist/single folder. Ensure workers are imported & built correctly.') - } - - // process index.html - const singleBuildHtml = './dist/single/index.html' - let html = fs.readFileSync(singleBuildHtml, 'utf8') - const verToMajor = (ver: string) => ver.split('.').slice(0, 2).join('.') - const supportedMajorVersions = [...new Set(supportedVersions.map(a => verToMajor(a)))].join(', ') - html = `\n\n\n${html}` - - const resizedImage = (await (sharp('./assets/favicon.png') as any).resize(64).toBuffer()).toString('base64') - html = html.replace('favicon.png', `data:image/png;base64,${resizedImage}`) - html = html.replace('src="./loading-bg.jpg"', `src="data:image/png;base64,${fs.readFileSync('./assets/loading-bg.jpg', 'base64')}"`) - html += '' - fs.writeFileSync(singleBuildHtml, html, 'utf8') - // write output file size - console.log('single file size', (fs.statSync(singleBuildHtml).size / 1024 / 1024).toFixed(2), 'mb') - } else { - if (!disableServiceWorker) { - const { count, size, warnings } = await generateSW({ - // dontCacheBustURLsMatching: [new RegExp('...')], - globDirectory: 'dist', - skipWaiting: true, - clientsClaim: true, - additionalManifestEntries: getSwAdditionalEntries(), - globPatterns: [], - swDest: './dist/service-worker.js', - }) - } - } - }) - } - build.onBeforeStartDevServer(() => prep()) - }, - }, - ], - // performance: { - // bundleAnalyze: { - // analyzerMode: 'json', - // reportFilename: 'report.json', - // }, - // }, -}) - -export default mergeRsbuildConfig( - appAndRendererSharedConfig(), - appConfig -) diff --git a/screenshot.png b/screenshot.png deleted file mode 100644 index 7631b82b..00000000 Binary files a/screenshot.png and /dev/null differ diff --git a/scripts/build.js b/scripts/build.js deleted file mode 100644 index 2d5e0a2e..00000000 --- a/scripts/build.js +++ /dev/null @@ -1,111 +0,0 @@ -//@ts-check -const fsExtra = require('fs-extra') -const defaultLocalServerOptions = require('../src/defaultLocalServerOptions') -const glob = require('glob') -const fs = require('fs') -const crypto = require('crypto') -const path = require('path') - -const prismarineViewerBase = "./node_modules/renderer" - -// these files could be copied at build time eg with copy plugin, but copy plugin slows down the config so we copy them there, alternative we could inline it in esbuild config -const filesToCopy = [ - { from: `${prismarineViewerBase}/public/mesher.js`, to: 'dist/mesher.js' }, - { from: './assets/', to: './dist/' }, - { from: './config.json', to: 'dist/config.json' }, - // { from: path.join(entityMcAssets.directory, 'entity'), to: 'dist/textures/1.16.4/entity' }, -] -exports.filesToCopy = filesToCopy -exports.copyFiles = (dev = false) => { - console.time('copy files') - if (!dev) { - // copy glob - const cwd = `${prismarineViewerBase}/public/textures/` - const files = glob.sync('*.png', { cwd: cwd, nodir: true, }) - for (const file of files) { - const copyDest = path.join('dist/textures/', file) - fs.mkdirSync(path.dirname(copyDest), { recursive: true, }) - fs.copyFileSync(path.join(cwd, file), copyDest) - } - } - - filesToCopy.forEach(file => { - fsExtra.copySync(file.from, file.to) - }) - - console.timeEnd('copy files') -} - -exports.copyFilesDev = () => { - if (fsExtra.existsSync('dist/config.json')) return - exports.copyFiles() -} - -exports.getSwAdditionalEntries = () => { - // need to be careful with this - const filesToCachePatterns = [ - 'index.html', - 'background/**', - // todo-low copy from assets - '*.mp3', - '*.ttf', - '*.png', - '*.woff', - 'mesher.js', - 'manifest.json', - 'worldSaveWorker.js', - `textures/entity/squid/squid.png`, - 'sounds.js', - // everything but not .map - 'static/**/!(*.map)', - ] - const filesNeedsCacheKey = [ - 'index.html', - 'mesher.js', - 'worldSaveWorker.js', - ] - const output = [] - console.log('Generating sw additional entries...') - for (const pattern of filesToCachePatterns) { - const files = glob.sync(pattern, { cwd: 'dist' }) - for (const file of files) { - const fullPath = path.join('dist', file) - if (!fs.lstatSync(fullPath).isFile()) continue - let revision = null - const url = './' + file.replace(/\\/g, '/') - if (filesNeedsCacheKey.includes(file)) { - const fileContents = fs.readFileSync(fullPath, 'utf-8') - const md5Hash = crypto.createHash('md5').update(fileContents).digest('hex') - revision = md5Hash - } - output.push({ url, revision }) - } - } - if (output.length > 40) { - throw new Error(`SW: Ios has a limit of 40 urls to cache (now ${output.length})`) - } - console.log(`Got ${output.length} additional sw entries to cache`) - return output -} - -exports.moveStorybookFiles = () => { - fsExtra.moveSync('storybook-static', 'dist/storybook', { overwrite: true, }) - fsExtra.copySync('dist/storybook', '.vercel/output/static/storybook') -} - -exports.getSwFilesSize = () => { - const files = exports.getSwAdditionalEntries() - let size = 0 - for (const { url } of files) { - const file = path.join(__dirname, '../dist', url) - size += fs.statSync(file).size - } - console.log('mb', size / 1024 / 1024) -} - -const fn = require.main === module && exports[process.argv[2]] - -if (fn) { - const result = fn() - if (result) console.log(result) -} diff --git a/scripts/buildNpmReact.ts b/scripts/buildNpmReact.ts deleted file mode 100644 index f4f00e4d..00000000 --- a/scripts/buildNpmReact.ts +++ /dev/null @@ -1,160 +0,0 @@ -import fs from 'fs' -import path from 'path' -import { build, transform } from 'esbuild' -import { execSync } from 'child_process' -// import { copy } from 'fs-extra' -import { glob } from 'glob' - -const isAbsolute = (path: string) => path.startsWith('/') || /^[A-Z]:/i.test(path) - -fs.promises.readdir(path.resolve(__dirname, '../src/react')).then(async (files) => { - const components = files - .filter((file) => { - if (file.startsWith('Concept')) return false - return file.endsWith('.stories.tsx') - }) - .map((file) => { - return file.replace('.stories.tsx', '') - }) - - const content = components.map((component) => { - return `export { default as ${component} } from './${component}'` - }).join('\n') - - await fs.promises.writeFile( - path.resolve(__dirname, '../src/react/npmReactComponents.ts'), - content - ) - - execSync('pnpm tsc -p tsconfig.npm.json', { - cwd: path.resolve(__dirname, '../'), - stdio: 'inherit', - }) - - const packageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../package.npm.json'), 'utf-8')) - const packageJsonRoot = JSON.parse(fs.readFileSync(path.resolve(__dirname, '../package.json'), 'utf-8')) - const external = Object.keys(packageJson.peerDependencies) - const dependencies = new Set() - let version = process.argv[2] || packageJsonRoot.version - version = version.replace(/^v/, '') - packageJson.version = version - - const externalize = ['renderer', 'mc-assets'] - const { metafile } = await build({ - entryPoints: [path.resolve(__dirname, '../src/react/npmReactComponents.ts')], - bundle: true, - outfile: path.resolve(__dirname, '../dist-npm/bundle.esm.js'), - format: 'esm', - platform: 'browser', - target: 'es2020', - external: external, - metafile: true, - minify: true, - write: false, // todo - loader: { - '.png': 'dataurl', - '.jpg': 'dataurl', - '.jpeg': 'dataurl', - '.webp': 'dataurl', - '.css': 'text', - }, - plugins: [ - // on external module resolve - { - name: 'collect-imports', - setup (build) { - build.onResolve({ filter: /.*/ }, (args) => { - if (args.importer.includes('node_modules') || external.some(x => args.path.startsWith(x)) || isAbsolute(args.path)) { - return undefined - } - if (args.path.startsWith('./') || args.path.startsWith('../')) { - if (args.path.endsWith('.png') || args.path.endsWith('.css') || args.path.endsWith('.jpg') || args.path.endsWith('.jpeg')) { - const absoluteImporting = path.join(path.dirname(args.importer), args.path) - const absoluteRoot = path.resolve(__dirname, '../src') - const relativeToRoot = path.relative(absoluteRoot, absoluteImporting) - fs.copyFileSync(absoluteImporting, path.resolve(__dirname, '../dist-npm/dist-pre', relativeToRoot)) - } - // default behavior - return undefined - } - const dep = args.path.startsWith('@') ? args.path.split('/').slice(0, 2).join('/') : args.path.split('/')[0] - if (!dependencies.has(dep)) { - dependencies.add(dep) - console.log('Adding dependency:', dep, 'from', args.importer) - } - // return { external: true } - }) - }, - }, - ], - }) - for (const dependency of dependencies) { - if (externalize.includes(dependency)) continue - if (!packageJsonRoot.dependencies[dependency]) throw new Error(`Dependency ${dependency} not found in package.json`) - packageJson.dependencies[dependency] = packageJsonRoot.dependencies[dependency] - } - fs.writeFileSync(path.resolve(__dirname, '../dist-npm/package.json'), JSON.stringify(packageJson, null, 2)) - // fs.promises.writeFile('./dist-npm/metafile.json', JSON.stringify(metafile, null, 2)) - - await build({ - entryPoints: ['dist-npm/dist-pre/**/*.js'], - outdir: 'dist-npm/dist', - // allowOverwrite: true, - jsx: 'preserve', - bundle: true, - target: 'esnext', - platform: 'browser', - format: 'esm', - loader: { - '.css': 'copy', - '.module.css': 'copy', - '.png': 'copy', - }, - minifyWhitespace: false, - logOverride: { - // 'ignored-bare-import': "info" - }, - plugins: [ - { - name: 'all-external', - setup (build) { - build.onResolve({ filter: /.*/ }, (args) => { - // todo use workspace deps - if (externalize.some(x => args.path.startsWith(x))) { - return undefined // bundle - } - if (args.path.endsWith('.css') || args.path.endsWith('.png') || args.path.endsWith('.jpg') || args.path.endsWith('.jpeg')) { - return undefined // loader action - } - return { - path: args.path, - external: true, - } - }) - }, - } - ], - }) - - const paths = await glob('dist-npm/dist-pre/**/*.d.ts') - // copy to dist - for (const p of paths) { - const relative = path.relative('dist-npm/dist-pre', p) - const target = path.resolve('dist-npm/dist', relative) - fs.copyFileSync(p, target) - } - // rm dist-pre - fs.rmSync('dist-npm/dist-pre', { recursive: true }) - fs.copyFileSync(path.resolve(__dirname, '../README.NPM.MD'), path.resolve(__dirname, '../dist-npm/README.md')) - - if (version !== '0.0.0-dev') { - execSync('npm publish', { - cwd: path.resolve(__dirname, '../dist-npm'), - env: { - ...process.env, - NPM_TOKEN: process.env.NPM_TOKEN, - NODE_AUTH_TOKEN: process.env.NPM_TOKEN - } - }) - } -}) diff --git a/scripts/dockerPrepare.mjs b/scripts/dockerPrepare.mjs deleted file mode 100644 index 62a4f5e4..00000000 --- a/scripts/dockerPrepare.mjs +++ /dev/null @@ -1,35 +0,0 @@ -//@ts-check -import fs from 'fs' -import path from 'path' -import { fileURLToPath } from 'url' -import { execSync } from 'child_process' - -// Get repository from git config -const getGitRepository = () => { - try { - const gitConfig = fs.readFileSync('.git/config', 'utf8') - const originUrlMatch = gitConfig.match(/\[remote "origin"\][\s\S]*?url = .*?github\.com[:/](.*?)(\.git)?\n/m) - if (originUrlMatch) { - return originUrlMatch[1] - } - } catch (err) { - console.warn('Failed to read git repository from config:', err) - } - return null -} - -// write release tag and repository info -const commitShort = execSync('git rev-parse --short HEAD').toString().trim() -const repository = getGitRepository() -fs.writeFileSync('./assets/release.json', JSON.stringify({ - latestTag: `${commitShort} (docker)`, - repository -}), 'utf8') - -const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8')) -delete packageJson.optionalDependencies -fs.writeFileSync('./package.json', JSON.stringify(packageJson, null, 2), 'utf8') - -const packageJsonViewer = JSON.parse(fs.readFileSync('./renderer/package.json', 'utf8')) -delete packageJsonViewer.optionalDependencies -fs.writeFileSync('./renderer/package.json', JSON.stringify(packageJsonViewer, null, 2), 'utf8') diff --git a/scripts/downloadSoundsMap.mjs b/scripts/downloadSoundsMap.mjs deleted file mode 100644 index f5791768..00000000 --- a/scripts/downloadSoundsMap.mjs +++ /dev/null @@ -1,13 +0,0 @@ -import fs from 'fs' - -const url = 'https://github.com/zardoy/minecraft-web-client/raw/sounds-generated/sounds-v2.js' -fetch(url).then(res => res.text()).then(data => { - if (fs.existsSync('./dist')) { - fs.writeFileSync('./dist/sounds.js', data, 'utf8') - } - fs.mkdirSync('./generated', { recursive: true }) - fs.writeFileSync('./generated/sounds.js', data, 'utf8') - if (fs.existsSync('.vercel/output/static/')) { - fs.writeFileSync('.vercel/output/static/sounds.js', data, 'utf8') - } -}) diff --git a/scripts/esbuildPlugins.mjs b/scripts/esbuildPlugins.mjs deleted file mode 100644 index 431c16a4..00000000 --- a/scripts/esbuildPlugins.mjs +++ /dev/null @@ -1,27 +0,0 @@ -//@ts-check - -import { join, dirname } from 'path' -import * as fs from 'fs' -import { fileURLToPath } from 'url' - -const __dirname = dirname(fileURLToPath(new URL(import.meta.url))) - -/** @type {import('esbuild').Plugin[]} */ -const mesherSharedPlugins = [ - { - name: 'minecraft-data', - setup (build) { - build.onLoad({ - filter: /data[\/\\]pc[\/\\]common[\/\\]legacy.json$/, - }, async (args) => { - const data = fs.readFileSync(join(__dirname, '../src/preflatMap.json'), 'utf8') - return { - contents: `module.exports = ${data}`, - loader: 'js', - } - }) - } - } -] - -export { mesherSharedPlugins } diff --git a/scripts/genLargeDataAliases.ts b/scripts/genLargeDataAliases.ts deleted file mode 100644 index 2372dbfd..00000000 --- a/scripts/genLargeDataAliases.ts +++ /dev/null @@ -1,62 +0,0 @@ -import * as fs from 'fs' - -export const genLargeDataAliases = async (isCompressed: boolean) => { - const modules = { - mcData: { - raw: '../generated/minecraft-data-optimized.json', - compressed: '../generated/mc-data-compressed.js', - }, - blockStatesModels: { - raw: 'mc-assets/dist/blockStatesModels.json', - compressed: '../generated/mc-assets-compressed.js', - } - } - - const OUT_FILE = './generated/large-data-aliases.ts' - - let str = `${decoderCode}\nexport const importLargeData = async (mod: ${Object.keys(modules).map(x => `'${x}'`).join(' | ')}) => {\n` - for (const [module, { compressed, raw }] of Object.entries(modules)) { - const chunkName = module === 'mcData' ? 'mc-data' : 'mc-assets'; - let importCode = `(await import(/* webpackChunkName: "${chunkName}" */ '${isCompressed ? compressed : raw}')).default`; - if (isCompressed) { - importCode = `JSON.parse(decompressFromBase64(${importCode}))` - } - str += ` if (mod === '${module}') return ${importCode}\n` - } - str += `}\n` - - fs.writeFileSync(OUT_FILE, str, 'utf8') -} - -const decoderCode = /* ts */ ` -import pako from 'pako'; - -globalThis.pako = { inflate: pako.inflate.bind(pako) } - -function decompressFromBase64(input) { - console.time('decompressFromBase64') - // Decode the Base64 string - const binaryString = atob(input); - const len = binaryString.length; - const bytes = new Uint8Array(len); - - // Convert the binary string to a byte array - for (let i = 0; i < len; i++) { - bytes[i] = binaryString.charCodeAt(i); - } - - // Decompress the byte array - const decompressedData = pako.inflate(bytes, { to: 'string' }); - - console.timeEnd('decompressFromBase64') - return decompressedData; -} -` - -// execute if run directly -if (require.main === module) { - console.log('running...') - const isCompressed = process.argv.includes('--compressed') - genLargeDataAliases(isCompressed) - console.log('done generating large data aliases') -} diff --git a/scripts/genMcDataTypes.ts b/scripts/genMcDataTypes.ts deleted file mode 100644 index 82b5b878..00000000 --- a/scripts/genMcDataTypes.ts +++ /dev/null @@ -1,51 +0,0 @@ -import minecraftData from 'minecraft-data' -import fs from 'fs' -import supportedVersions from '../src/supportedVersions.mjs' - -const data = minecraftData('1.20.1') - -let types = '' -types += `\nexport type BlockNames = ${Object.keys(data.blocksByName).map(blockName => `'${blockName}'`).join(' | ')};` -types += `\nexport type ItemNames = ${Object.keys(data.itemsByName).map(blockName => `'${blockName}'`).join(' | ')};` -types += `\nexport type EntityNames = ${Object.keys(data.entitiesByName).map(blockName => `'${blockName}'`).join(' | ')};` -types += `\nexport type BiomesNames = ${Object.keys(data.biomesByName).map(blockName => `'${blockName}'`).join(' | ')};` -types += `\nexport type EnchantmentNames = ${Object.keys(data.enchantmentsByName).map(blockName => `'${blockName}'`).join(' | ')};` - -type Version = string -const allVersionsEntitiesMetadata = {} as Record> -for (const version of supportedVersions) { - const data = minecraftData(version) - for (const { name, metadataKeys } of data.entitiesArray) { - allVersionsEntitiesMetadata[name] ??= {} - if (!metadataKeys) { - // console.warn('Entity has no metadata', name, version) - } - for (const [i, key] of (metadataKeys ?? []).entries()) { - allVersionsEntitiesMetadata[name][key] ??= { - version: version, - firstKey: i, - } - } - } -} - -types += '\n\nexport type EntityMetadataVersions = {\n' -for (const [name, versions] of Object.entries(allVersionsEntitiesMetadata)) { - types += `'${name}': {` - for (const [key, v] of Object.entries(versions)) { - types += `\n/** ${v.version}+ (${v.firstKey}) */\n` - types += `'${key}': string;` - } - types += '},' -} -types += '\n}' - -const minify = false -if (minify) { - types = types.replaceAll(/[\t]/g, '') -} - -fs.writeFileSync('./src/mcDataTypes.ts', types, 'utf8') diff --git a/scripts/genPixelartTypes.ts b/scripts/genPixelartTypes.ts deleted file mode 100644 index e7c9649a..00000000 --- a/scripts/genPixelartTypes.ts +++ /dev/null @@ -1,16 +0,0 @@ -import fs from 'fs' - -const icons = fs.readdirSync('node_modules/pixelarticons/svg') - -const addIconPath = '../../node_modules/pixelarticons/svg/' - -let str = 'export type PixelartIconsGenerated = {\n' -for (const icon of icons) { - const name = icon.replace('.svg', '') - // jsdoc - const jsdocImage = '![image](' + addIconPath + icon + ')' - str += ` /** ${jsdocImage} */\n` - str += ` '${name}': string;\n` -} -str += '}\n' -fs.writeFileSync('./src/react/pixelartIcons.generated.ts', str, 'utf8') diff --git a/scripts/genShims.ts b/scripts/genShims.ts deleted file mode 100644 index 2916044a..00000000 --- a/scripts/genShims.ts +++ /dev/null @@ -1,37 +0,0 @@ -import fs from 'fs' -import { appReplacableResources } from '../src/resourcesSource' - -fs.mkdirSync('./generated', { recursive: true }) - -// app resources - -let headerImports = '' -let resourcesContent = 'export const appReplacableResources: { [key in Keys]: { content: any, resourcePackPath: string, cssVar?: string, cssVarRepeat?: number } } = {\n' -let resourcesContentOriginal = 'export const resourcesContentOriginal = {\n' -const keys = [] as string[] - -for (const resource of appReplacableResources) { - const { path, ...rest } = resource - const name = path.split('/').slice(-4).join('_').replace('.png', '').replaceAll('-', '_').replaceAll('.', '_') - keys.push(name) - headerImports += `import ${name} from '${path.replace('../node_modules/', '')}'\n` - - resourcesContent += ` - '${name}': { - content: ${name}, - resourcePackPath: 'minecraft/textures/${path.slice(path.indexOf('other-textures/') + 'other-textures/'.length).split('/').slice(1).join('/')}', - ...${JSON.stringify(rest)} - }, -` - resourcesContentOriginal += ` - '${name}': ${name}, -` -} - -resourcesContent += '}\n' -resourcesContent += `type Keys = ${keys.map(k => `'${k}'`).join(' | ')}\n` -resourcesContentOriginal += '}\n' -resourcesContent += resourcesContentOriginal - -fs.mkdirSync('./src/generated', { recursive: true }) -fs.writeFileSync('./src/generated/resources.ts', headerImports + '\n' + resourcesContent, 'utf8') diff --git a/scripts/getMissingRecipes.mjs b/scripts/getMissingRecipes.mjs deleted file mode 100644 index 59e78672..00000000 --- a/scripts/getMissingRecipes.mjs +++ /dev/null @@ -1,41 +0,0 @@ -//@ts-check -// tsx ./scripts/getMissingRecipes.mjs -import MinecraftData from 'minecraft-data' -import supportedVersions from '../src/supportedVersions.mjs' -import fs from 'fs' - -console.time('import-data') -const { descriptionGenerators } = await import('../src/itemsDescriptions') -console.timeEnd('import-data') - -const data = MinecraftData(supportedVersions.at(-1)) - -const hasDescription = name => { - for (const [key, value] of descriptionGenerators) { - if (Array.isArray(key) && key.includes(name)) { - return true - } - if (key instanceof RegExp && key.test(name)) { - return true - } - } - return false -} - -const result = [] -for (const item of data.itemsArray) { - const recipes = data.recipes[item.id] - if (!recipes) { - if (item.name.endsWith('_slab') || item.name.endsWith('_stairs') || item.name.endsWith('_wall')) { - console.warn('Must have recipe!', item.name) - continue - } - if (hasDescription(item.name)) { - continue - } - - result.push(item.name) - } -} - -fs.writeFileSync('./generated/noRecipies.json', JSON.stringify(result, null, 2)) diff --git a/scripts/githubActions.mjs b/scripts/githubActions.mjs deleted file mode 100644 index 3e8eb0f6..00000000 --- a/scripts/githubActions.mjs +++ /dev/null @@ -1,43 +0,0 @@ -//@ts-check -import fs from 'fs' -import os from 'os' - -const fns = { - async getAlias () { - const aliasesRaw = process.env.ALIASES - if (!aliasesRaw) throw new Error('No aliases found') - const aliases = aliasesRaw.split('\n').map((x) => x.trim().split('=')) - const githubActionsPull = process.env.PULL_URL?.split('/').at(-1) - if (!githubActionsPull) throw new Error(`Not a pull request, got ${process.env.PULL_URL}`) - const prNumber = githubActionsPull - const alias = aliases.find((x) => x[0] === prNumber) - if (alias) { - // set github output - setOutput('alias', alias[1]) - } - }, - getReleasingAlias() { - const final = (ver) => `${ver}.mcraft.fun,${ver}.pcm.gg` - const releaseJson = JSON.parse(fs.readFileSync('./assets/release.json', 'utf8')) - const tag = releaseJson.latestTag - const [major, minor, patch] = tag.replace('v', '').split('.') - if (major === '0' && minor === '1') { - setOutput('alias', final(`v${patch}`)) - } else { - setOutput('alias', final(tag)) - } - } -} - -function setOutput (key, value) { - // Temporary hack until core actions library catches up with github new recommendations - const output = process.env['GITHUB_OUTPUT'] - fs.appendFileSync(output, `${key}=${value}${os.EOL}`) -} - -const fn = fns[process.argv[2]] -if (fn) { - fn() -} else { - console.error('Function not found') -} diff --git a/scripts/makeOptimizedMcData.mjs b/scripts/makeOptimizedMcData.mjs deleted file mode 100644 index a572d067..00000000 --- a/scripts/makeOptimizedMcData.mjs +++ /dev/null @@ -1,382 +0,0 @@ -//@ts-check -import { build } from 'esbuild' -import { existsSync } from 'node:fs' -import Module from "node:module" -import { dirname } from 'node:path' -import supportedVersions from '../src/supportedVersions.mjs' -import { gzipSizeFromFileSync } from 'gzip-size' -import fs from 'fs' -import { default as _JsonOptimizer } from '../src/optimizeJson' -import { gzipSync } from 'zlib' -import MinecraftData from 'minecraft-data' -import MCProtocol from 'minecraft-protocol' - -/** @type {typeof _JsonOptimizer} */ -//@ts-ignore -const JsonOptimizer = _JsonOptimizer.default - -// console.log(a.diff_main(JSON.stringify({ a: 1 }), JSON.stringify({ a: 1, b: 2 }))) - -const require = Module.createRequire(import.meta.url) - -const dataPaths = require('minecraft-data/minecraft-data/data/dataPaths.json') - -function toMajor(version) { - const [a, b] = (version + '').split('.') - return `${a}.${b}` -} - -let versions = {} -const dataTypes = new Set() - -for (const [version, dataSet] of Object.entries(dataPaths.pc)) { - if (!supportedVersions.includes(version)) continue - for (const type of Object.keys(dataSet)) { - dataTypes.add(type) - } - versions[version] = dataSet -} - -const versionToNumber = (ver) => { - const [x, y = '0', z = '0'] = ver.split('.') - return +`${x.padStart(2, '0')}${y.padStart(2, '0')}${z.padStart(2, '0')}` -} - -// Version clipping support -const minVersion = process.env.MIN_MC_VERSION -const maxVersion = process.env.MAX_MC_VERSION - -// Filter versions based on MIN_VERSION and MAX_VERSION if provided -if (minVersion || maxVersion) { - const filteredVersions = {} - const minVersionNum = minVersion ? versionToNumber(minVersion) : 0 - const maxVersionNum = maxVersion ? versionToNumber(maxVersion) : Infinity - - for (const [version, dataSet] of Object.entries(versions)) { - const versionNum = versionToNumber(version) - if (versionNum >= minVersionNum && versionNum <= maxVersionNum) { - filteredVersions[version] = dataSet - } - } - - versions = filteredVersions - - console.log(`Version clipping applied: ${minVersion || 'none'} to ${maxVersion || 'none'}`) - console.log(`Processing ${Object.keys(versions).length} versions:`, Object.keys(versions).sort((a, b) => versionToNumber(a) - versionToNumber(b))) -} - -console.log('Bundling version range:', Object.keys(versions)[0], 'to', Object.keys(versions).at(-1)) - -// if not included here (even as {}) will not be bundled & accessible! -// const compressedOutput = !!process.env.SINGLE_FILE_BUILD -const compressedOutput = true -const dataTypeBundling2 = { - blocks: { - arrKey: 'name', - }, - items: { - arrKey: 'name', - }, - recipes: { - processData: processRecipes - } -} -const dataTypeBundling = { - language: process.env.SKIP_MC_DATA_LANGUAGE === 'true' ? { - raw: {} - } : { - ignoreRemoved: true, - ignoreChanges: true - }, - blocks: { - arrKey: 'name', - processData(current, prev, _, version) { - for (const block of current) { - const prevBlock = prev?.find(x => x.name === block.name) - if (block.transparent) { - const forceOpaque = block.name.includes('shulker_box') || block.name.match(/^double_.+_slab\d?$/) || ['melon_block', 'lit_pumpkin', 'lit_redstone_ore', 'lit_furnace'].includes(block.name) - - if (forceOpaque || (prevBlock && !prevBlock.transparent)) { - block.transparent = false - } - } - if (block.hardness === 0 && prevBlock && prevBlock.hardness > 0) { - block.hardness = prevBlock.hardness - } - } - } - // ignoreRemoved: true, - // genChanges (source, diff) { - // const diffs = {} - // const newItems = {} - // for (const [key, val] of Object.entries(diff)) { - // const src = source[key] - // if (!src) { - // newItems[key] = val - // continue - // } - // const { minStateId, defaultState, maxStateId } = val - // if (defaultState === undefined || minStateId === src.minStateId || maxStateId === src.maxStateId || defaultState === src.defaultState) continue - // diffs[key] = [minStateId, defaultState, maxStateId] - // } - // return { - // stateChanges: diffs - // } - // }, - // ignoreChanges: true - }, - items: { - arrKey: 'name' - }, - attributes: { - arrKey: 'name' - }, - particles: { - arrKey: 'name' - }, - effects: { - arrKey: 'name' - }, - enchantments: { - arrKey: 'name' - }, - instruments: { - arrKey: 'name' - }, - foods: { - arrKey: 'name' - }, - entities: { - arrKey: 'id+type' - }, - materials: {}, - windows: { - arrKey: 'name' - }, - version: { - raw: true - }, - tints: {}, - biomes: { - arrKey: 'name' - }, - entityLoot: { - arrKey: 'entity' - }, - blockLoot: { - arrKey: 'block' - }, - recipes: process.env.SKIP_MC_DATA_RECIPES === 'true' ? { - raw: {} - } : { - raw: true - // processData: processRecipes - }, - blockCollisionShapes: {}, - loginPacket: {}, - protocol: { - raw: true - }, - // sounds: { - // arrKey: 'name' - // } -} - -function processRecipes(current, prev, getData, version) { - // can require the same multiple times per different versions - if (current._proccessed) return - const items = getData('items') - const blocks = getData('blocks') - const itemsIdsMap = Object.fromEntries(items.map((b) => [b.id, b.name])) - const blocksIdsMap = Object.fromEntries(blocks.map((b) => [b.id, b.name])) - for (const key of Object.keys(current)) { - const mapId = (id) => { - if (typeof id !== 'string' && typeof id !== 'number') throw new Error('Incorrect type') - const mapped = itemsIdsMap[id] ?? blocksIdsMap[id] - if (!mapped) { - throw new Error(`No item/block name with id ${id}`) - } - return mapped - } - const processRecipe = (obj) => { - // if (!obj) return - // if (Array.isArray(obj)) { - // obj.forEach((id, i) => { - // obj[i] = mapId(obj[id]) - // }) - // } else if (obj && typeof obj === 'object') { - // if (!'count metadata id'.split(' ').every(x => x in obj)) { - // throw new Error(`process error: Unknown deep object pattern: ${JSON.stringify(obj)}`) - // } - // obj.id = mapId(obj.id) - // } else { - // throw new Error('unknown type') - // } - const parseRecipeItem = (item) => { - if (typeof item === 'number') return mapId(item) - if (Array.isArray(item)) return [mapId(item), ...item.slice(1)] - if (!item) { - return item - } - if ('id' in item) { - item.id = mapId(item.id) - return item - } - throw new Error('unhandled') - } - const maybeProccessShape = (shape) => { - if (!shape) return - for (const shapeRow of shape) { - for (const [i, item] of shapeRow.entries()) { - shapeRow[i] = parseRecipeItem(item) - } - } - } - if (obj.result) obj.result = parseRecipeItem(obj.result) - maybeProccessShape(obj.inShape) - maybeProccessShape(obj.outShape) - if (obj.ingredients) { - for (const [i, ingredient] of obj.ingredients.entries()) { - obj.ingredients[i] = parseRecipeItem(ingredient) - } - } - } - try { - const name = mapId(key) - for (const [i, recipe] of current[key].entries()) { - try { - processRecipe(recipe) - } catch (err) { - console.warn(`${version} [warn] Removing incorrect recipe: ${err}`) - delete current[i] - } - } - current[name] = current[key] - } catch (err) { - console.warn(`${version} [warn] Removing incorrect recipe: ${err}`) - } - delete current[key] - } - current._proccessed = true -} - -const notBundling = [...dataTypes.keys()].filter(x => !Object.keys(dataTypeBundling).includes(x)) -console.log("Not bundling minecraft-data data:", notBundling) - -let previousData = {} -// /** @type {Record} */ -const diffSources = {} -const versionsArr = Object.entries(versions) -const sizePerDataType = {} -const rawDataVersions = {} -// const versionsArr = Object.entries(versions).slice(-1) -for (const [i, [version, dataSet]] of versionsArr.reverse().entries()) { - for (const [dataType, dataPath] of Object.entries(dataSet)) { - const config = dataTypeBundling[dataType] - if (!config) continue - const ignoreCollisionShapes = dataType === 'blockCollisionShapes' && versionToNumber(version) >= versionToNumber('1.13') - - let injectCode = '' - const getRealData = (type) => { - const loc = `minecraft-data/data/${dataSet[type]}/` - const dataPathAbsolute = require.resolve(`minecraft-data/${loc}${type}`) - // const data = fs.readFileSync(dataPathAbsolute, 'utf8') - const dataRaw = require(dataPathAbsolute) - return dataRaw - } - const dataRaw = getRealData(dataType) - let rawData = dataRaw - if (config.raw) { - rawDataVersions[dataType] ??= {} - rawDataVersions[dataType][version] = rawData - if (config.raw === true) { - rawData = dataRaw - } else { - rawData = config.raw - } - - if (ignoreCollisionShapes && dataType === 'blockCollisionShapes') { - rawData = { - blocks: {}, - shapes: {} - } - } - } else { - if (!diffSources[dataType]) { - diffSources[dataType] = new JsonOptimizer(config.arrKey, config.ignoreChanges, config.ignoreRemoved) - } - try { - config.processData?.(dataRaw, previousData[dataType], getRealData, version) - diffSources[dataType].recordDiff(version, dataRaw) - injectCode = `restoreDiff(sources, ${JSON.stringify(dataType)}, ${JSON.stringify(version)})` - } catch (err) { - const error = new Error(`Failed to diff ${dataType} for ${version}: ${err.message}`) - error.stack = err.stack - throw error - } - } - sizePerDataType[dataType] ??= 0 - sizePerDataType[dataType] += Buffer.byteLength(JSON.stringify(injectCode || rawData), 'utf8') - if (config.genChanges && previousData[dataType]) { - const changes = config.genChanges(previousData[dataType], dataRaw) - // Object.assign(data, changes) - } - previousData[dataType] = dataRaw - } -} -const sources = Object.fromEntries(Object.entries(diffSources).map(x => { - const data = x[1].export() - // const data = {} - sizePerDataType[x[0]] += Buffer.byteLength(JSON.stringify(data), 'utf8') - return [x[0], data] -})) -Object.assign(sources, rawDataVersions) -sources.versionKey = require('minecraft-data/package.json').version - -const totalSize = Object.values(sizePerDataType).reduce((acc, val) => acc + val, 0) -console.log('total size (mb)', totalSize / 1024 / 1024) -console.log( - 'size per data type (mb, %)', - Object.fromEntries(Object.entries(sizePerDataType).map(([dataType, size]) => { - return [dataType, [size / 1024 / 1024, Math.round(size / totalSize * 100)]] - }).sort((a, b) => { - //@ts-ignore - return b[1][1] - a[1][1] - })) -) - -function compressToBase64(input) { - const buffer = gzipSync(input) - return buffer.toString('base64') -} - -const filePath = './generated/minecraft-data-optimized.json' -fs.writeFileSync(filePath, JSON.stringify(sources), 'utf8') -if (compressedOutput) { - const minizedCompressed = compressToBase64(fs.readFileSync(filePath)) - console.log('size of compressed', Buffer.byteLength(minizedCompressed, 'utf8') / 1000 / 1000) - const compressedFilePath = './generated/mc-data-compressed.js' - fs.writeFileSync(compressedFilePath, `export default ${JSON.stringify(minizedCompressed)}`, 'utf8') - - const mcAssets = JSON.stringify(require('mc-assets/dist/blockStatesModels.json')) - fs.writeFileSync('./generated/mc-assets-compressed.js', `export default ${JSON.stringify(compressToBase64(mcAssets))}`, 'utf8') - - // const modelsObj = fs.readFileSync('./prismarine-renderer/viewer/lib/entity/exportedModels.js') - // const models = -} - -console.log('size', fs.lstatSync(filePath).size / 1000 / 1000, gzipSizeFromFileSync(filePath) / 1000 / 1000) - -// always bundled - -const { defaultVersion } = MCProtocol -const data = MinecraftData(defaultVersion) -console.log('defaultVersion', defaultVersion, !!data) -const initialMcData = { - [defaultVersion]: { - version: data.version, - protocol: data.protocol, - } -} - -// fs.writeFileSync('./generated/minecraft-initial-data.json', JSON.stringify(initialMcData), 'utf8') diff --git a/scripts/optimizeBlockCollisions.ts b/scripts/optimizeBlockCollisions.ts deleted file mode 100644 index 251a564a..00000000 --- a/scripts/optimizeBlockCollisions.ts +++ /dev/null @@ -1,59 +0,0 @@ -import fs from 'fs' -import supportedVersions from '../src/supportedVersions.mjs' -import { join } from 'path' - -type Shape = number[] - -interface Shapes { - blocks: Record - shapes: Record -} - -const shapesMap = new Map() -const processData = (data: Shapes) => { - const sizeInput = JSON.stringify(data).length - let replaced = 0 - let shapesToRemove = new Set() - for (const [block, shapes] of Object.entries(data.blocks)) { - const arr = Array.isArray(shapes) - const shapesArr = Array.isArray(shapes) ? shapes : [shapes] - for (const [i, id] of shapesArr.entries()) { - const resolved = data.shapes[id] - const shapesKey = resolved.map(x => x.join(',')).join(';') - const existingShapeId = shapesMap.get(shapesKey) - // todo-low the size can be optimized even futher by splitting data into shape-parts - if (existingShapeId !== undefined && existingShapeId !== id) { - // console.log(`duplicate for ${block}: ${existingShapeId}`) - if (arr) data.blocks[block][i] = existingShapeId - else data.blocks[block] = existingShapeId - replaced++ - shapesToRemove.add(id) - } - else { - shapesMap.set(shapesKey, id) - } - } - } - for (const shape of shapesToRemove) { - delete data.shapes[shape] - } - // const sizeOutput = JSON.stringify(data).length - // console.log('Saving', replaced, sizeInput / 1024, '->', sizeOutput / 1024, Math.round(sizeInput / sizeOutput), 'x') - return data -} - -for (const version of [...supportedVersions].reverse()) { - const dataPath = join(require.resolve('minecraft-data'), '../minecraft-data/data/pc', version, 'blockCollisionShapes.json') - if (fs.existsSync(dataPath)) { - console.log('using blockCollisionShapes of version', version) - const data = JSON.parse(fs.readFileSync(dataPath, 'utf8')) - data.version = version - data.versionKey = require('minecraft-data/package.json').version - processData(data) - fs.mkdirSync('./generated', { recursive: true }) - fs.writeFileSync('./generated/latestBlockCollisionsShapes.json', JSON.stringify(data), 'utf8') - break - } -} - -// const path = './node_modules/.pnpm/minecraft-data@3.45.0/node_modules/minecraft-data/minecraft-data/data/pc/1.19/blockCollisionShapes.json' diff --git a/scripts/outdatedGitPackages.mjs b/scripts/outdatedGitPackages.mjs deleted file mode 100644 index c6a3b2d5..00000000 --- a/scripts/outdatedGitPackages.mjs +++ /dev/null @@ -1,52 +0,0 @@ -// pnpm bug workaround -import fs from 'fs' -import { parse } from 'yaml' -import _ from 'lodash' - -const lockfile = parse(fs.readFileSync('./pnpm-lock.yaml', 'utf8')) -const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8')) -const depsKeys = ['dependencies', 'devDependencies'] - -const githubToken = process.env.GITHUB_TOKEN -const ignoreDeps = packageJson.pnpm?.updateConfig?.ignoreDependencies ?? [] - -const outdatedDeps = [] - -const allDepsObj = {} - -for (const [key, val] of Object.entries(lockfile.importers)) { - // Object.assign(allDepsObj, val) - _.merge(allDepsObj, val) -} - -for (const [depsKey, deps] of Object.entries(allDepsObj)) { - for (const [depName, { specifier, version }] of Object.entries(deps)) { - if (ignoreDeps.includes(depName)) continue - if (!specifier.startsWith('github:')) continue - // console.log('checking github:', depName, version, specifier) - - let possiblyBranch = specifier.match(/#(.*)$/)?.[1] ?? '' - if (possiblyBranch) possiblyBranch = `/${possiblyBranch}` - const sha = version.split('/').slice(3).join('/').replace(/\(.+/, '') - const repo = version.split('/').slice(1, 3).join('/') - - const lastCommitJson = await fetch(`https://api.github.com/repos/${repo}/commits${possiblyBranch}?per_page=1`, { - headers: { - Authorization: githubToken ? `token ${githubToken}` : undefined, - }, - }).then(res => res.json()) - - const lastCommitActual = lastCommitJson ?? lastCommitJson[0] - const lastCommitActualSha = Array.isArray(lastCommitActual) ? lastCommitActual[0]?.sha : lastCommitActual?.sha - if (lastCommitActualSha === undefined) debugger - if (sha !== lastCommitActualSha) { - // console.log(`Outdated ${depName} github.com/${repo} : ${sha} -> ${lastCommitActualSha} (${lastCommitActual.commit.message})`) - outdatedDeps.push({ depName, repo, sha, lastCommitActualSha }) - } - } - -} - -if (outdatedDeps.length) { - throw new Error(`Outdated dependencies found: \n${outdatedDeps.map(({ depName, repo, sha, lastCommitActualSha }) => `${depName} github.com/${repo} : ${sha} -> ${lastCommitActualSha}`).join('\n')}`) -} diff --git a/scripts/patchAssets.ts b/scripts/patchAssets.ts deleted file mode 100644 index 99994f5f..00000000 --- a/scripts/patchAssets.ts +++ /dev/null @@ -1,137 +0,0 @@ -import blocksAtlas from 'mc-assets/dist/blocksAtlases.json' -import itemsAtlas from 'mc-assets/dist/itemsAtlases.json' -import * as fs from 'fs' -import * as path from 'path' -import sharp from 'sharp' - -interface AtlasFile { - latest: { - suSv: number - tileSize: number - width: number - height: number - textures: { - [key: string]: { - u: number - v: number - su: number - sv: number - tileIndex: number - } - } - } -} - -async function patchTextureAtlas( - atlasType: 'blocks' | 'items', - atlasData: AtlasFile, - customTexturesDir: string, - distDir: string -) { - // Check if custom textures directory exists and has files - if (!fs.existsSync(customTexturesDir) || fs.readdirSync(customTexturesDir).length === 0) { - return - } - - // Find the latest atlas file - const atlasFiles = fs.readdirSync(distDir) - .filter(file => file.startsWith(`${atlasType}AtlasLatest`) && file.endsWith('.png')) - .sort() - - if (atlasFiles.length === 0) { - console.log(`No ${atlasType}AtlasLatest.png found in ${distDir}`) - return - } - - const latestAtlasFile = atlasFiles[atlasFiles.length - 1] - const atlasPath = path.join(distDir, latestAtlasFile) - console.log(`Patching ${atlasPath}`) - - // Get atlas dimensions - const atlasMetadata = await sharp(atlasPath).metadata() - if (!atlasMetadata.width || !atlasMetadata.height) { - throw new Error(`Failed to get atlas dimensions for ${atlasPath}`) - } - - // Process each custom texture - const customTextureFiles = fs.readdirSync(customTexturesDir) - .filter(file => file.endsWith('.png')) - - if (customTextureFiles.length === 0) return - - // Prepare composite operations - const composites: sharp.OverlayOptions[] = [] - - for (const textureFile of customTextureFiles) { - const textureName = path.basename(textureFile, '.png') - - if (atlasData.latest.textures[textureName]) { - const textureData = atlasData.latest.textures[textureName] - const customTexturePath = path.join(customTexturesDir, textureFile) - - try { - // Convert UV coordinates to pixel coordinates - const x = Math.round(textureData.u * atlasMetadata.width) - const y = Math.round(textureData.v * atlasMetadata.height) - const width = Math.round((textureData.su ?? atlasData.latest.suSv) * atlasMetadata.width) - const height = Math.round((textureData.sv ?? atlasData.latest.suSv) * atlasMetadata.height) - - // Resize custom texture to match atlas dimensions and add to composite operations - const resizedTextureBuffer = await sharp(customTexturePath) - .resize(width, height, { - fit: 'fill', - kernel: 'nearest' // Preserve pixel art quality - }) - .png() - .toBuffer() - - composites.push({ - input: resizedTextureBuffer, - left: x, - top: y, - blend: 'over' - }) - - console.log(`Prepared ${textureName} at (${x}, ${y}) with size (${width}, ${height})`) - } catch (error) { - console.error(`Failed to prepare ${textureName}:`, error) - } - } else { - console.warn(`Texture ${textureName} not found in ${atlasType} atlas`) - } - } - - if (composites.length > 0) { - // Apply all patches at once using Sharp's composite - await sharp(atlasPath) - .composite(composites) - .png() - .toFile(atlasPath + '.tmp') - - // Replace original with patched version - fs.renameSync(atlasPath + '.tmp', atlasPath) - console.log(`Saved patched ${atlasType} atlas to ${atlasPath}`) - } -} - -async function main() { - const customBlocksDir = './assets/customTextures/blocks' - const customItemsDir = './assets/customTextures/items' - const distDir = './dist/static/image' - - try { - // Patch blocks atlas - await patchTextureAtlas('blocks', blocksAtlas as unknown as AtlasFile, customBlocksDir, distDir) - - // Patch items atlas - await patchTextureAtlas('items', itemsAtlas as unknown as AtlasFile, customItemsDir, distDir) - - console.log('Texture atlas patching completed!') - } catch (error) { - console.error('Failed to patch texture atlases:', error) - process.exit(1) - } -} - -// Run the script -main() diff --git a/scripts/prepareSounds.mjs b/scripts/prepareSounds.mjs deleted file mode 100644 index 02026a04..00000000 --- a/scripts/prepareSounds.mjs +++ /dev/null @@ -1,321 +0,0 @@ -//@ts-check - -import { getVersionList, DEFAULT_RESOURCE_ROOT_URL } from '@xmcl/installer' -import path from 'path' -import fs from 'fs' -import { fileURLToPath } from 'url' -import { exec } from 'child_process' -import { promisify } from 'util' -import { build } from 'esbuild' -import supportedVersions from '../src/supportedVersions.mjs' - -const __dirname = path.dirname(fileURLToPath(new URL(import.meta.url))) - -export const versionToNumber = (ver) => { - const [x, y = '0', z = '0'] = ver.split('.') - return +`${x.padStart(2, '0')}${y.padStart(2, '0')}${z.padStart(2, '0')}` -} - -const targetedVersions = [...supportedVersions].sort((a, b) => versionToNumber(b) - versionToNumber(a)) - -/** @type {{name, size, hash}[]} */ -let prevSounds = null - -const burgerDataUrl = (version) => `https://raw.githubusercontent.com/Pokechu22/Burger/gh-pages/${version}.json` -const burgerDataPath = './generated/burger.json' -const EXISTING_CACHE_PATH = './generated/existing-sounds-cache.json' - -// const perVersionData: Record { - let existingSoundsCache = {} - try { - existingSoundsCache = JSON.parse(await fs.promises.readFile(EXISTING_CACHE_PATH, 'utf8')) - } catch (err) {} - const { versions } = await getVersionList() - const lastVersion = versions.filter(version => !version.id.includes('w'))[0] - // if (lastVersion.id !== targetedVersions[0]) throw new Error('last version is not the same as targetedVersions[0], update') - for (const version of targetedVersions) { - const versionData = versions.find(x => x.id === version) - if (!versionData) throw new Error('no version data for ' + version) - console.log('Getting assets for version', version) - const { assetIndex } = await fetch(versionData.url).then((r) => r.json()) - /** @type {{objects: {[a: string]: { size, hash }}}} */ - const index = await fetch(assetIndex.url).then((r) => r.json()) - const soundAssets = Object.entries(index.objects).filter(([name]) => /* name.endsWith('.ogg') || */ name.startsWith('minecraft/sounds/')).map(([name, { size, hash }]) => ({ name, size, hash })) - soundAssets.sort((a, b) => a.name.localeCompare(b.name)) - if (prevSounds) { - const prevSoundNames = new Set(prevSounds.map(x => x.name)) - const addedSounds = prevSounds.filter(x => !soundAssets.some(y => y.name === x.name)) - // todo implement removed - const removedSounds = soundAssets.filter(x => !prevSoundNames.has(x.name)) - // console.log('+', addedSounds.map(x => x.name)) - // console.log('-', removedSounds.map(x => x.name)) - const changedSize = soundAssets.filter(x => prevSoundNames.has(x.name) && prevSounds.find(y => y.name === x.name).size !== x.size) - console.log('changed size', changedSize.map(x => ({ name: x.name, prev: prevSounds.find(y => y.name === x.name).size, curr: x.size }))) - if (addedSounds.length || changedSize.length) { - soundsPathVersionsRemap[version] = [...addedSounds, ...changedSize].map(x => x.name.replace('minecraft/sounds/', '').replace('.ogg', '')) - } - if (addedSounds.length) { - console.log('downloading new sounds for version', version) - downloadSounds(version, addedSounds, version + '/') - } - if (changedSize.length) { - console.log('downloading changed sounds for version', version) - downloadSounds(version, changedSize, version + '/') - } - } else { - console.log('downloading sounds for version', version) - downloadSounds(version, soundAssets) - } - prevSounds = soundAssets - } - async function downloadSound({ name, hash, size }, namePath, log) { - const cached = - !!namePath.replace('.ogg', '.mp3').split('/').reduce((acc, cur) => acc?.[cur], existingSoundsCache.sounds) || - !!namePath.replace('.ogg', '.ogg').split('/').reduce((acc, cur) => acc?.[cur], existingSoundsCache.sounds) - const savePath = path.resolve(`generated/sounds/${namePath}`) - if (cached || fs.existsSync(savePath)) { - // console.log('skipped', name) - existingSoundsCache.sounds[namePath] = true - return - } - log() - const r = await fetch(DEFAULT_RESOURCE_ROOT_URL + '/' + hash.slice(0, 2) + '/' + hash, /* {headers: {range: `bytes=0-${size-1}`}} */) - // save file - const file = await r.blob() - fs.mkdirSync(path.dirname(savePath), { recursive: true }) - await fs.promises.writeFile(savePath, Buffer.from(await file.arrayBuffer())) - - const reader = file.stream().getReader() - - const writer = fs.createWriteStream(savePath) - let offset = 0 - while (true) { - const { done, value } = await reader.read() - if (done) break - writer.write(Buffer.from(value)) - offset += value.byteLength - } - writer.close() - } - async function downloadSounds(version, assets, addPath = '') { - if (addPath && existingSoundsCache.sounds[version]) { - console.log('using existing sounds for version', version) - return - } - console.log(version, 'have to download', assets.length, 'sounds') - for (let i = 0; i < assets.length; i += 5) { - await Promise.all(assets.slice(i, i + 5).map((asset, j) => downloadSound(asset, `${addPath}${asset.name}`, () => { - console.log('downloading', addPath, asset.name, i + j, '/', assets.length) - }))) - } - } - - fs.writeFileSync('./generated/soundsPathVersionsRemap.json', JSON.stringify(soundsPathVersionsRemap), 'utf8') - fs.writeFileSync(EXISTING_CACHE_PATH, JSON.stringify(existingSoundsCache), 'utf8') -} - -const lightpackOverrideSounds = { - 'Block breaking': 'step/stone1', - 'Block broken': 'dig/stone1', - 'Block placed': 'dig/stone1' -} - -// this is not done yet, will be used to select only sounds for bundle (most important ones) -const isSoundWhitelisted = (name) => name.startsWith('random/') || name.startsWith('note/') || name.endsWith('/say1') || name.endsWith('/death') || (name.startsWith('mob/') && name.endsWith('/step1')) || name.endsWith('/swoop1') || /* name.endsWith('/break1') || */ name.endsWith('dig/stone1') - -// const ffmpeg = 'C:/Users/Vitaly/Documents/LosslessCut-win-x64/resources/ffmpeg.exe' // can be ffmpeg-static -const ffmpegExec = 'ffmpeg' -const maintainBitrate = true - -const scanFilesDeep = async (root, onOggFile) => { - const files = await fs.promises.readdir(root, { withFileTypes: true }) - for (const file of files) { - if (file.isDirectory()) { - await scanFilesDeep(path.join(root, file.name), onOggFile) - } else if (file.name.endsWith('.ogg') && !files.some(x => x.name === file.name.replace('.ogg', '.mp3'))) { - await onOggFile(path.join(root, file.name)) - } - } -} - -const convertSounds = async () => { - const toConvert = [] - await scanFilesDeep('generated/sounds', (oggPath) => { - toConvert.push(oggPath) - }) - - const convertSound = async (i) => { - const proc = promisify(exec)(`${ffmpegExec} -i "${toConvert[i]}" -y -codec:a libmp3lame ${maintainBitrate ? '-qscale:a 2' : ''} "${toConvert[i].replace('.ogg', '.mp3')}"`) - // pipe stdout to the console - //@ts-ignore - proc.child.stdout.pipe(process.stdout) - await proc - console.log('converted to mp3', i, '/', toConvert.length, toConvert[i]) - } - - const CONCURRENCY = 5 - for (let i = 0; i < toConvert.length; i += CONCURRENCY) { - await Promise.all(toConvert.slice(i, i + CONCURRENCY).map((oggPath, j) => convertSound(i + j))) - } -} - -const getSoundsMap = (burgerData) => { - /** @type {Record} */ - return burgerData[0].sounds - // const map = JSON.parse(fs.readFileSync(burgerDataPath, 'utf8'))[0].sounds -} - -const writeSoundsMap = async () => { - const burgerData = await fetch(burgerDataUrl(targetedVersions[0])).then((r) => r.json()) - fs.writeFileSync(burgerDataPath, JSON.stringify(burgerData[0].sounds), 'utf8') - - const allSoundsMapOutput = {} - let prevMap - - // todo REMAP ONLY IDS. Do diffs, as mostly only ids are changed between versions - // const localTargetedVersions = targetedVersions.slice(0, 2) - let lastMappingsJson - const localTargetedVersions = targetedVersions - for (const targetedVersion of [...localTargetedVersions].reverse()) { - console.log('Processing version', targetedVersion) - - const burgerData = await fetch(burgerDataUrl(targetedVersion)).then((r) => r.json()).catch((err) => { - // console.error('error fetching burger data', targetedVersion, err) - return null - }) - /** @type {{sounds: string[]}} */ - const mappingJson = await fetch(`https://raw.githubusercontent.com/ViaVersion/Mappings/7a45c1f9dbc1f1fdadacfecdb205ba84e55766fc/mappings/mapping-${targetedVersion}.json`).then(async (r) => { - return r.json() - // lastMappingsJson = r.status === 404 ? lastMappingsJson : (await r.json()) - // if (r.status === 404) { - // console.warn('using prev mappings json for ' + targetedVersion) - // } - // return lastMappingsJson - }).catch((err) => { - // console.error('error fetching mapping json', targetedVersion, err) - return null - }) - // if (!mappingJson) throw new Error('no initial mapping json for ' + targetedVersion) - if (burgerData && !mappingJson) { - console.warn('has burger but no mapping json for ' + targetedVersion) - continue - } - if (!mappingJson || !burgerData) { - console.warn('no mapping json or burger data for ' + targetedVersion) - continue - } - const allSoundsMap = getSoundsMap(burgerData) - // console.log(Object.keys(sounds).length, 'ids') - const outputIdMap = {} - const outputFilesMap = {} - - const classes = {} - let keysStats = { - new: 0, - same: 0 - } - for (const { _id, subtitle, sounds, name } of Object.values(allSoundsMap)) { - if (!sounds?.length /* && !subtitle */) continue - const firstName = sounds[0].name - // const includeSound = isSoundWhitelisted(firstName) - // if (!includeSound) continue - const mostUsedSound = sounds.sort((a, b) => b.weight - a.weight)[0] - // outputMap[id] = { subtitle, sounds: mostUsedSound } - // outputMap[id] = { subtitle, sounds } - // const soundFilePath = `generated/sounds/minecraft/sounds/${targetSound.name}.mp3` - // if (!fs.existsSync(soundFilePath)) { - // console.warn('no sound file', targetSound.name) - // continue - // } - let outputUseSoundLine = [] - const minWeight = sounds.reduce((acc, cur) => cur.weight ? Math.min(acc, cur.weight) : acc, sounds[0].weight ?? 1) - if (isNaN(minWeight)) debugger - for (const sound of sounds) { - if (sound.weight && isNaN(sound.weight)) debugger - outputUseSoundLine.push(`${sound.volume ?? 1};${sound.name};${sound.weight ?? minWeight}`) - } - const id = mappingJson.sounds.findIndex(x => x === name) - if (id === -1) { - console.warn('no id for sound', name, targetedVersion) - continue - } - const key = `${id};${name}` - outputIdMap[key] = outputUseSoundLine.join(',') - if (prevMap && prevMap[key]) { - keysStats.same++ - } else { - keysStats.new++ - } - // for (const {name: soundName} of sounds ?? []) { - // let obj = classes - // for (const part of soundName.split('/')) { - // obj[part] ??= {} - // obj = obj[part] - // } - // } - } - // console.log(classes) - // console.log('to download', new Set(Object.values(outputIdMap).flatMap(x => x.sounds)).size) - // console.log('json size', JSON.stringify(outputIdMap).length / 1024 / 1024) - allSoundsMapOutput[targetedVersion] = outputIdMap - prevMap = outputIdMap - // const allSoundNames = new Set(Object.values(allSoundsMap).flatMap(({ name, sounds }) => { - // if (!sounds) { - // console.log(name) - // return [] - // } - // return sounds.map(sound => sound.name) - // })) - // console.log(allSoundNames.size, 'sounds') - } - - fs.writeFileSync('./generated/sounds.json', JSON.stringify(allSoundsMapOutput), 'utf8') -} - -const makeSoundsBundle = async () => { - const allSoundsMap = JSON.parse(fs.readFileSync('./generated/sounds.json', 'utf8')) - const allSoundsVersionedMap = JSON.parse(fs.readFileSync('./generated/soundsPathVersionsRemap.json', 'utf8')) - if (!process.env.REPO_SLUG) throw new Error('REPO_SLUG is not set') - - const allSoundsMeta = { - format: 'mp3', - baseUrl: `https://raw.githubusercontent.com/${process.env.REPO_SLUG}/sounds/sounds/` - } - - await build({ - bundle: true, - outfile: `dist/sounds.js`, - stdin: { - contents: `window.allSoundsMap = ${JSON.stringify(allSoundsMap)}\nwindow.allSoundsVersionedMap = ${JSON.stringify(allSoundsVersionedMap)}\nwindow.allSoundsMeta = ${JSON.stringify(allSoundsMeta)}`, - resolveDir: __dirname, - sourcefile: `sounds.js`, - loader: 'js', - }, - metafile: true, - }) - // copy also to generated/sounds.js - fs.copyFileSync('./dist/sounds.js', './generated/sounds.js') -} - -const action = process.argv[2] -if (action) { - const execFn = { - download: downloadAllSoundsAndCreateMap, - convert: convertSounds, - write: writeSoundsMap, - bundle: makeSoundsBundle, - }[action] - - if (execFn) { - execFn() - } -} else { - // downloadAllSoundsAndCreateMap() - // convertSounds() - writeSoundsMap() - // makeSoundsBundle() -} diff --git a/scripts/replaceFavicon.mjs b/scripts/replaceFavicon.mjs deleted file mode 100644 index 0c60d26d..00000000 --- a/scripts/replaceFavicon.mjs +++ /dev/null @@ -1,8 +0,0 @@ -import fs from 'fs' - -const faviconUrl = process.argv[2] - -// save to assets/favicon.png -fetch(faviconUrl).then(res => res.arrayBuffer()).then(buffer => { - fs.writeFileSync('assets/favicon.png', Buffer.from(buffer)) -}) diff --git a/scripts/requestData.ts b/scripts/requestData.ts deleted file mode 100644 index dc866a1b..00000000 --- a/scripts/requestData.ts +++ /dev/null @@ -1,42 +0,0 @@ -import WebSocket from 'ws' - -function formatBytes(bytes: number) { - return `${(bytes).toFixed(2)} MB` -} - -function formatTime(ms: number) { - return `${(ms / 1000).toFixed(2)}s` -} - -const ws = new WebSocket('ws://localhost:8081') - -ws.on('open', () => { - console.log('Connected to metrics server, waiting for metrics...') -}) - -ws.on('message', (data) => { - try { - const metrics = JSON.parse(data.toString()) - console.log('\nPerformance Metrics:') - console.log('------------------') - console.log(`Load Time: ${formatTime(metrics.loadTime)}`) - console.log(`Memory Usage: ${formatBytes(metrics.memoryUsage)}`) - console.log(`Timestamp: ${new Date(metrics.timestamp).toLocaleString()}`) - if (!process.argv.includes('-f')) { // follow mode - process.exit(0) - } - } catch (error) { - console.error('Error parsing metrics:', error) - } -}) - -ws.on('error', (error) => { - console.error('WebSocket error:', error) - process.exit(1) -}) - -// Exit if no metrics received after 5 seconds -setTimeout(() => { - console.error('Timeout waiting for metrics') - process.exit(1) -}, 5000) diff --git a/scripts/testOptimizedMcdata.ts b/scripts/testOptimizedMcdata.ts deleted file mode 100644 index 7c94fac2..00000000 --- a/scripts/testOptimizedMcdata.ts +++ /dev/null @@ -1,116 +0,0 @@ -import assert from 'assert' -import JsonOptimizer, { restoreMinecraftData } from '../src/optimizeJson'; -import fs from 'fs' -import minecraftData from 'minecraft-data' - -const json = JSON.parse(fs.readFileSync('./generated/minecraft-data-optimized.json', 'utf8')) - -const dataPaths = require('minecraft-data/minecraft-data/data/dataPaths.json') - -const validateData = (ver, type) => { - const target = restoreMinecraftData(structuredClone(json), type, ver) - const arrKey = json[type].arrKey - const originalPath = dataPaths.pc[ver][type] - const original = require(`minecraft-data/minecraft-data/data/${originalPath}/${type}.json`) - if (arrKey) { - const originalKeys = original.map(a => JsonOptimizer.getByArrKey(a, arrKey)) as string[] - for (const [i, item] of originalKeys.entries()) { - if (originalKeys.indexOf(item) !== i) { - console.warn(`${type} ${ver} Incorrect source, duplicated arrKey (${arrKey}) ${item}. Ignoring!`) // todo should span instead - const index = originalKeys.indexOf(item); - original.splice(index, 1) - originalKeys.splice(index, 1) - } - } - // if (target.length !== originalKeys.length) { - // throw new Error(`wrong arr length: ${target.length} !== ${original.length}`) - // } - checkKeys(originalKeys, target.map(a => JsonOptimizer.getByArrKey(a, arrKey))) - for (const item of target as any[]) { - const keys = Object.entries(item).map(a => a[0]) - const origItem = original.find(a => JsonOptimizer.getByArrKey(a, arrKey) === JsonOptimizer.getByArrKey(item, arrKey)); - const keysSource = Object.entries(origItem).map(a => a[0]) - checkKeys(keysSource, keys, true, 'prop keys', true) - checkObj(origItem, item) - } - } else { - const keysOriginal = Object.keys(original) - const keysTarget = Object.keys(target) - checkKeys(keysOriginal, keysTarget) - for (const key of keysTarget) { - checkObj(original[key], target[key]) - } - } -} - -const sortObj = (obj) => { - const sorted = {} - for (const key of Object.keys(obj).sort()) { - sorted[key] = obj[key] - } - return sorted -} - -const checkObj = (source, diffing) => { - if (!Array.isArray(source)) { - source = sortObj(source) - } - if (!Array.isArray(diffing)) { - diffing = sortObj(diffing) - } - if (JSON.stringify(source) !== JSON.stringify(diffing)) { - throw new Error(`different value: ${JSON.stringify(source)} ${JSON.stringify(diffing)}`) - } - // checkKeys(Object.keys(source), Object.keys(diffing)) - // for (const [key, val] of Object.entries(source)) { - // if (JSON.stringify(val) !== JSON.stringify(diffing[key])) { - // throw new Error(`different value of ${key}: ${val} ${diffing[key]}`) - // } - // } -} - -const checkKeys = (source, diffing, isUniq = true, msg = '', redundantIsOk = false) => { - if (isUniq) { - for (const [i, item] of diffing.entries()) { - if (diffing.indexOf(item) !== i) { - throw new Error(`Duplicate: ${item}: ${i} ${diffing.indexOf(item)} ${msg}`) - } - } - } - for (const key of source) { - if (!diffing.includes(key)) { - throw new Error(`Diffing does not include "${key}" (${msg})`) - } - } - if (!redundantIsOk) { - for (const key of diffing) { - if (!source.includes(key)) { - throw new Error(`Source does not include "${key}" (${msg})`) - } - } - } -} - -// const data = minecraftData('1.20.4') -const oldId = JsonOptimizer.restoreData(json['blocks'], '1.20', undefined).find(x => x.name === 'brown_stained_glass').id; -const newId = JsonOptimizer.restoreData(json['blocks'], '1.20.4', undefined).find(x => x.name === 'brown_stained_glass').id; -assert(oldId !== newId) -// test all types + all versions - -for (const type of Object.keys(json)) { - if (!json[type].__IS_OPTIMIZED__) continue - if (type === 'language') continue // we have loose data for language for size reasons - console.log('validating', type) - const source = json[type] - let checkedVer = 0 - for (const ver of Object.keys(source.diffs)) { - try { - validateData(ver, type) - } catch (err) { - err.message = `Failed to validate ${type} for ${ver}: ${err.message}` - throw err; - } - checkedVer++ - } - console.log('Checked versions:', checkedVer) -} diff --git a/scripts/updateGitDeps.ts b/scripts/updateGitDeps.ts deleted file mode 100644 index 797aea8f..00000000 --- a/scripts/updateGitDeps.ts +++ /dev/null @@ -1,160 +0,0 @@ -import fs from 'fs' -import path from 'path' -import yaml from 'yaml' -import { execSync } from 'child_process' -import { createInterface } from 'readline' - -interface LockfilePackage { - specifier: string - version: string -} - -interface Lockfile { - importers: { - '.': { - dependencies?: Record - devDependencies?: Record - } - } -} - -interface PackageJson { - pnpm?: { - updateConfig?: { - ignoreDependencies?: string[] - } - } -} - -async function prompt(question: string): Promise { - const rl = createInterface({ - input: process.stdin, - output: process.stdout - }) - - return new Promise(resolve => { - rl.question(question, answer => { - rl.close() - resolve(answer.toLowerCase().trim()) - }) - }) -} - -async function getLatestCommit(owner: string, repo: string): Promise { - const response = await fetch(`https://api.github.com/repos/${owner}/${repo}/commits/HEAD`) - if (!response.ok) { - throw new Error(`Failed to fetch latest commit: ${response.statusText}`) - } - const data = await response.json() - return data.sha -} - -function extractGitInfo(specifier: string): { owner: string; repo: string; branch: string } | null { - const match = specifier.match(/github:([^/]+)\/([^#]+)(?:#(.+))?/) - if (!match) return null - return { - owner: match[1], - repo: match[2], - branch: match[3] || 'master' - } -} - -function extractCommitHash(version: string): string | null { - const match = version.match(/https:\/\/codeload\.github\.com\/[^/]+\/[^/]+\/tar\.gz\/([a-f0-9]+)/) - return match ? match[1] : null -} - -function getIgnoredDependencies(): string[] { - try { - const packageJsonPath = path.join(process.cwd(), 'package.json') - const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) as PackageJson - return packageJson.pnpm?.updateConfig?.ignoreDependencies || [] - } catch (error) { - console.warn('Failed to read package.json for ignored dependencies:', error) - return [] - } -} - -async function main() { - const lockfilePath = path.join(process.cwd(), 'pnpm-lock.yaml') - const lockfileContent = fs.readFileSync(lockfilePath, 'utf8') - const lockfile = yaml.parse(lockfileContent) as Lockfile - - const ignoredDependencies = new Set(getIgnoredDependencies()) - console.log('Ignoring dependencies:', Array.from(ignoredDependencies).join(', ') || 'none') - - const dependencies = { - ...lockfile.importers['.'].dependencies, - ...lockfile.importers['.'].devDependencies - } - - const updates: Array<{ - name: string - currentHash: string - latestHash: string - gitInfo: ReturnType - }> = [] - - console.log('\nChecking git dependencies...') - for (const [name, pkg] of Object.entries(dependencies)) { - if (ignoredDependencies.has(name)) { - console.log(`Skipping ignored dependency: ${name}`) - continue - } - - if (!pkg.specifier.startsWith('github:')) continue - - const gitInfo = extractGitInfo(pkg.specifier) - if (!gitInfo) continue - - const currentHash = extractCommitHash(pkg.version) - if (!currentHash) continue - - try { - process.stdout.write(`Checking ${name}... `) - const latestHash = await getLatestCommit(gitInfo.owner, gitInfo.repo) - if (currentHash !== latestHash) { - console.log('update available') - updates.push({ name, currentHash, latestHash, gitInfo }) - } else { - console.log('up to date') - } - } catch (error) { - console.log('failed') - console.error(`Error checking ${name}:`, error) - } - } - - if (updates.length === 0) { - console.log('\nAll git dependencies are up to date!') - return - } - - console.log('\nThe following git dependencies can be updated:') - for (const update of updates) { - console.log(`\n${update.name}:`) - console.log(` Current: ${update.currentHash}`) - console.log(` Latest: ${update.latestHash}`) - console.log(` Repo: ${update.gitInfo!.owner}/${update.gitInfo!.repo}`) - } - - const answer = await prompt('\nWould you like to update these dependencies? (y/N): ') - if (answer === 'y' || answer === 'yes') { - let newLockfileContent = lockfileContent - for (const update of updates) { - newLockfileContent = newLockfileContent.replace( - new RegExp(update.currentHash, 'g'), - update.latestHash - ) - } - fs.writeFileSync(lockfilePath, newLockfileContent) - console.log('\nUpdated pnpm-lock.yaml with new commit hashes') - // console.log('Running pnpm install to apply changes...') - // execSync('pnpm install', { stdio: 'inherit' }) - console.log('Done!') - } else { - console.log('\nNo changes were made.') - } -} - -main().catch(console.error) diff --git a/scripts/updateHandledPackets.mjs b/scripts/updateHandledPackets.mjs deleted file mode 100644 index 080eaf44..00000000 --- a/scripts/updateHandledPackets.mjs +++ /dev/null @@ -1,60 +0,0 @@ -import fs from 'fs' -import path from 'path' -import minecraftData from 'minecraft-data' - -const lastVersion = minecraftData.versions.pc[0] -// console.log('last proto ver', lastVersion.minecraftVersion) -const allPackets = minecraftData(lastVersion.minecraftVersion).protocol -const getPackets = ({ types }) => { - return Object.keys(types).map(type => type.replace('packet_', '')) -} -// todo test against all versions -const allFromServerPackets = getPackets(allPackets.play.toClient) -const allToServerPackets = getPackets(allPackets.play.toServer).filter(x => !['packet'].includes(x)) - -const buildFile = './dist/index.js' - -const file = fs.readFileSync(buildFile, 'utf8') - -const packetsReceiveRegex = /client\.on\("(\w+)"/g -const packetsReceiveSend = /client\.write\("(\w+)"/g - -let allSupportedReceive = [...new Set([...file.matchAll(packetsReceiveRegex)].map(x => x[1]))] -let allSupportedSend = [...new Set([...file.matchAll(packetsReceiveSend)].map(x => x[1]))] - -let md = '# Handled Packets\n' - -md += '\n## Server -> Client\n\n' -let notSupportedRows = [] -let supportedRows = [] -for (const packet of allFromServerPackets) { - const includes = allSupportedReceive.includes(packet); - (includes ? supportedRows : notSupportedRows).push(packet) -} - -for (const row of notSupportedRows) { - md += `❌ ${row}\n` -} -for (const row of supportedRows) { - md += `✅ ${row}\n` -} - -md += '\n' - -notSupportedRows = [] -supportedRows = [] - -md += '## Client -> Server\n\n' -for (const packet of allToServerPackets) { - const includes = allSupportedSend.includes(packet); - (includes ? supportedRows : notSupportedRows).push(packet) -} - -for (const row of notSupportedRows) { - md += `❌ ${row}\n` -} -for (const row of supportedRows) { - md += `✅ ${row}\n` -} - -fs.writeFileSync('./docs-assets/handled-packets.md', md) diff --git a/scripts/uploadSoundFiles.ts b/scripts/uploadSoundFiles.ts deleted file mode 100644 index e8677c87..00000000 --- a/scripts/uploadSoundFiles.ts +++ /dev/null @@ -1,109 +0,0 @@ -import fetch from 'node-fetch'; -import * as fs from 'fs'; -import * as path from 'path'; -import { glob } from 'glob'; - -// Git details -const REPO_SLUG = process.env.REPO_SLUG; -const owner = REPO_SLUG.split('/')[0]; -const repo = REPO_SLUG.split('/')[1]; -const branch = "sounds"; - -// GitHub token for authentication -const token = process.env.GITHUB_TOKEN; - -// GitHub API endpoint -const baseUrl = `https://api.github.com/repos/${owner}/${repo}/contents`; - -const headers = { - Authorization: `token ${token}`, - 'Content-Type': 'application/json' -}; - -async function getShaForExistingFile(repoFilePath: string): Promise { - const url = `${baseUrl}/${repoFilePath}?ref=${branch}`; - const response = await fetch(url, { headers }); - if (response.status === 404) { - return null; // File does not exist - } - if (!response.ok) { - throw new Error(`Failed to fetch ${url}: ${response.statusText}`); - } - const data = await response.json(); - return data.sha; -} - -async function uploadFiles() { - const commitMessage = "Upload multiple files via script"; - const committer = { - name: "GitHub", - email: "noreply@github.com" - }; - - const filesToUpload = glob.sync("generated/sounds/**/*.mp3").map(localPath => { - const repoPath = localPath.replace(/^generated\//, ''); - return { localPath, repoPath }; - }); - - const files = await Promise.all(filesToUpload.map(async file => { - const content = fs.readFileSync(file.localPath, 'base64'); - const sha = await getShaForExistingFile(file.repoPath); - return { - path: file.repoPath, - mode: "100644", - type: "blob", - sha: sha || undefined, - content: content - }; - })); - - const treeResponse = await fetch(`${baseUrl}/git/trees`, { - method: 'POST', - headers: headers, - body: JSON.stringify({ - base_tree: null, - tree: files - }) - }); - - if (!treeResponse.ok) { - throw new Error(`Failed to create tree: ${treeResponse.statusText}`); - } - - const treeData = await treeResponse.json(); - - const commitResponse = await fetch(`${baseUrl}/git/commits`, { - method: 'POST', - headers: headers, - body: JSON.stringify({ - message: commitMessage, - tree: treeData.sha, - parents: [branch], - committer: committer - }) - }); - - if (!commitResponse.ok) { - throw new Error(`Failed to create commit: ${commitResponse.statusText}`); - } - - const commitData = await commitResponse.json(); - - const updateRefResponse = await fetch(`${baseUrl}/git/refs/heads/${branch}`, { - method: 'PATCH', - headers: headers, - body: JSON.stringify({ - sha: commitData.sha - }) - }); - - if (!updateRefResponse.ok) { - throw new Error(`Failed to update ref: ${updateRefResponse.statusText}`); - } - - console.log("Files uploaded successfully"); -} - -uploadFiles().catch(error => { - console.error("Error uploading files:", error); -}); diff --git a/scripts/uploadSounds.ts b/scripts/uploadSounds.ts deleted file mode 100644 index b0e9ecd7..00000000 --- a/scripts/uploadSounds.ts +++ /dev/null @@ -1,67 +0,0 @@ -import fs from 'fs' - -// GitHub details -const owner = "zardoy"; -const repo = "minecraft-web-client"; -const branch = "sounds-generated"; -const filePath = "dist/sounds.js"; // Local file path -const repoFilePath = "sounds-v2.js"; // Path in the repo - -// GitHub token for authentication -const token = process.env.GITHUB_TOKEN; - -// GitHub API endpoint -const baseUrl = `https://api.github.com/repos/${owner}/${repo}/contents/${repoFilePath}`; - -const headers = { - Authorization: `token ${token}`, - 'Content-Type': 'application/json' -}; - -async function getShaForExistingFile(): Promise { - const url = `${baseUrl}?ref=${branch}`; - const response = await fetch(url, { headers }); - if (response.status === 404) { - return null; // File does not exist - } - if (!response.ok) { - throw new Error(`Failed to fetch ${url}: ${response.statusText}`); - } - const data = await response.json(); - return data.sha; -} - -async function uploadFile() { - const content = fs.readFileSync(filePath, 'utf8'); - const base64Content = Buffer.from(content).toString('base64'); - const sha = await getShaForExistingFile(); - console.log('got sha') - - const body = { - message: "Update sounds.js", - content: base64Content, - branch: branch, - committer: { - name: "GitHub", - email: "noreply@github.com" - }, - sha: sha || undefined - }; - - const response = await fetch(baseUrl, { - method: 'PUT', - headers: headers, - body: JSON.stringify(body) - }); - - if (!response.ok) { - throw new Error(`Failed to upload file: ${response.statusText}`); - } - - const responseData = await response.json(); - console.log("File uploaded successfully:", responseData); -} - -uploadFile().catch(error => { - console.error("Error uploading file:", error); -}); diff --git a/scripts/wsServer.ts b/scripts/wsServer.ts deleted file mode 100644 index 43035f52..00000000 --- a/scripts/wsServer.ts +++ /dev/null @@ -1,45 +0,0 @@ -import {WebSocketServer} from 'ws' - -export function startWsServer(port: number = 8081, tryOtherPort: boolean = true): Promise { - return new Promise((resolve, reject) => { - const tryPort = (currentPort: number) => { - const wss = new WebSocketServer({ port: currentPort }) - .on('listening', () => { - console.log(`WebSocket server started on port ${currentPort}`) - resolve(currentPort) - }) - .on('error', (err: any) => { - if (err.code === 'EADDRINUSE' && tryOtherPort) { - console.log(`Port ${currentPort} in use, trying ${currentPort + 1}`) - wss.close() - tryPort(currentPort + 1) - } else { - reject(err) - } - }) - - wss.on('connection', (ws) => { - console.log('Client connected') - - ws.on('message', (message) => { - try { - // Simply relay the message to all connected clients except sender - wss.clients.forEach(client => { - if (client !== ws && client.readyState === WebSocket.OPEN) { - client.send(message.toString()) - } - }) - } catch (error) { - console.error('Error processing message:', error) - } - }) - - ws.on('close', () => { - console.log('Client disconnected') - }) - }) - } - - tryPort(port) - }) -} diff --git a/server.js b/server.js deleted file mode 100644 index 49699cdb..00000000 --- a/server.js +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/env node - -const express = require('express') -const netApi = require('net-browserify') -const compression = require('compression') -const path = require('path') -const cors = require('cors') -const https = require('https') -const fs = require('fs') -let siModule -try { - siModule = require('systeminformation') -} catch (err) { } - -// Create our app -const app = express() - -const isProd = process.argv.includes('--prod') || process.env.NODE_ENV === 'production' -const timeoutIndex = process.argv.indexOf('--timeout') -let timeout = timeoutIndex > -1 && timeoutIndex + 1 < process.argv.length - ? parseInt(process.argv[timeoutIndex + 1]) - : process.env.TIMEOUT - ? parseInt(process.env.TIMEOUT) - : 10000 -if (isNaN(timeout) || timeout < 0) { - console.warn('Invalid timeout value provided, using default of 10000ms') - timeout = 10000 -} -app.use(compression()) -app.use(cors()) -app.use(netApi({ - allowOrigin: '*', - log: process.argv.includes('--log') || process.env.LOG === 'true', - timeout -})) -if (!isProd) { - app.use('/sounds', express.static(path.join(__dirname, './generated/sounds/'))) -} -// patch config -app.get('/config.json', (req, res, next) => { - // read original file config - let config = {} - let publicConfig = {} - try { - config = require('./config.json') - } catch { - try { - config = require('./dist/config.json') - } catch { } - } - try { - publicConfig = require('./public/config.json') - } catch { } - res.json({ - ...config, - 'defaultProxy': '', // use current url (this server) - ...publicConfig, - }) -}) -if (isProd) { - // add headers to enable shared array buffer - app.use((req, res, next) => { - res.setHeader('Cross-Origin-Opener-Policy', 'same-origin') - res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp') - next() - }) - - // First serve from the override directory (volume mount) - app.use(express.static(path.join(__dirname, './public'))) - - // Then fallback to the original dist directory - app.use(express.static(path.join(__dirname, './dist'))) -} - -const numArg = process.argv.find(x => x.match(/^\d+$/)) -const port = (require.main === module ? numArg : undefined) || 8080 - -// Start the server -const server = - app.listen(port, async function () { - console.log('Proxy server listening on port ' + server.address().port) - if (siModule && isProd) { - const _interfaces = await siModule.networkInterfaces() - const interfaces = Array.isArray(_interfaces) ? _interfaces : [_interfaces] - let netInterface = interfaces.find(int => int.default) - if (!netInterface) { - netInterface = interfaces.find(int => !int.virtual) ?? interfaces[0] - console.warn('Failed to get the default network interface, searching for fallback') - } - if (netInterface) { - const address = netInterface.ip4 - console.log(`You can access the server on http://localhost:${port} or http://${address}:${port}`) - } - } - }) - -module.exports = { app } diff --git a/src/api/mcStatusApi.ts b/src/api/mcStatusApi.ts deleted file mode 100644 index 8ac429dd..00000000 --- a/src/api/mcStatusApi.ts +++ /dev/null @@ -1,64 +0,0 @@ -globalThis.resolveDnsFallback = async (hostname: string) => { - const response = await fetchServerStatus(hostname) - return response?.raw.srv_record ?? undefined -} - -export const isServerValid = (ip: string) => { - const isInLocalNetwork = ip.startsWith('192.168.') || - ip.startsWith('10.') || - ip.startsWith('172.') || - ip.startsWith('127.') || - ip.startsWith('localhost') || - ip.startsWith(':') - const VALID_IP_OR_DOMAIN = ip.includes('.') - - return !isInLocalNetwork && VALID_IP_OR_DOMAIN -} - -export async function fetchServerStatus (ip: string, signal?: AbortSignal, versionOverride?: string) { - if (!isServerValid(ip)) return - - const response = await fetch(`https://api.mcstatus.io/v2/status/java/${ip}`, { signal }) - const data: ServerResponse = await response.json() - const versionClean = data.version?.name_raw.replace(/^[^\d.]+/, '') - - return { - formattedText: data.motd?.raw ?? '', - textNameRight: data.online ? - `${versionOverride ?? versionClean} ${data.players?.online ?? '??'}/${data.players?.max ?? '??'}` : - '', - icon: data.icon, - offline: !data.online, - raw: data - } -} - -export type ServerResponse = { - online: boolean - version?: { - name_raw: string - } - // display tooltip - players?: { - online: number - max: number - list: Array<{ - name_raw: string - name_clean: string - }> - } - icon?: string - motd?: { - raw: string - } - // todo circle error icon - mods?: Array<{ name: string, version: string }> - // todo display via hammer icon - software?: string - plugins?: Array<{ name, version }> - // port?: number - srv_record?: { - host: string - port: number - } -} diff --git a/src/appConfig.ts b/src/appConfig.ts deleted file mode 100644 index c29d74e8..00000000 --- a/src/appConfig.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { defaultsDeep } from 'lodash' -import { disabledSettings, options, qsOptions } from './optionsStorage' -import { miscUiState } from './globalState' -import { setLoadingScreenStatus } from './appStatus' -import { setStorageDataOnAppConfigLoad } from './react/appStorageProvider' -import { customKeymaps, updateBinds } from './controls' - -export type CustomAction = { - readonly type: string - readonly input: readonly any[] -} - -export type ActionType = string | CustomAction - -export type ActionHoldConfig = { - readonly command: ActionType - readonly longPressAction?: ActionType - readonly duration?: number - readonly threshold?: number -} - -export type MobileButtonConfig = { - readonly label?: string - readonly icon?: string - readonly action?: ActionType - readonly actionHold?: ActionType | ActionHoldConfig - readonly iconStyle?: React.CSSProperties -} - -export type AppConfig = { - // defaultHost?: string - // defaultHostSave?: string - defaultProxy?: string - // defaultProxySave?: string - // defaultVersion?: string - peerJsServer?: string - peerJsServerFallback?: string - promoteServers?: Array<{ ip, description, name?, version?, }> - mapsProvider?: string - - appParams?: Record // query string params - rightSideText?: string - - defaultSettings?: Record - forceSettings?: Record - // hideSettings?: Record - allowAutoConnect?: boolean - splashText?: string - splashTextFallback?: string - pauseLinks?: Array>> - mobileButtons?: MobileButtonConfig[] - keybindings?: Record - defaultLanguage?: string - displayLanguageSelector?: boolean - supportedLanguages?: string[] - showModsButton?: boolean - defaultUsername?: string - skinTexturesProxy?: string - alwaysReconnectButton?: boolean - reportBugButtonWithReconnect?: boolean - disabledCommands?: string[] // Array of command IDs to disable (e.g. ['general.jump', 'general.chat']) -} - -export const loadAppConfig = (appConfig: AppConfig) => { - - if (miscUiState.appConfig) { - Object.assign(miscUiState.appConfig, appConfig) - } else { - miscUiState.appConfig = appConfig - } - - if (appConfig.forceSettings) { - for (const [key, value] of Object.entries(appConfig.forceSettings)) { - if (value) { - disabledSettings.value.add(key) - // since the setting is forced, we need to set it to that value - if (appConfig.defaultSettings && key in appConfig.defaultSettings && !qsOptions[key]) { - options[key] = appConfig.defaultSettings[key] - } - } else { - disabledSettings.value.delete(key) - } - } - } - // todo apply defaultSettings to defaults even if not forced in case of remote config - - if (appConfig.keybindings) { - Object.assign(customKeymaps, defaultsDeep(appConfig.keybindings, customKeymaps)) - updateBinds(customKeymaps) - } - - appViewer?.appConfigUdpate() - - setStorageDataOnAppConfigLoad(appConfig) -} - -export const isBundledConfigUsed = !!process.env.INLINED_APP_CONFIG - -if (isBundledConfigUsed) { - loadAppConfig(process.env.INLINED_APP_CONFIG as AppConfig ?? {}) -} else { - void window.fetch('config.json').then(async res => res.json()).then(c => c, (error) => { - // console.warn('Failed to load optional app config.json', error) - // return {} - setLoadingScreenStatus('Failed to load app config.json', true) - }).then((config: AppConfig) => { - loadAppConfig(config) - }) -} diff --git a/src/appParams.ts b/src/appParams.ts deleted file mode 100644 index 4c8ca186..00000000 --- a/src/appParams.ts +++ /dev/null @@ -1,121 +0,0 @@ -import type { AppConfig } from './appConfig' -import { miscUiState } from './globalState' - -const qsParams = new URLSearchParams(window.location?.search ?? '') - -export type AppQsParams = { - // AddServerOrConnect.tsx params - ip?: string - name?: string - version?: string - proxy?: string - username?: string - lockConnect?: string - autoConnect?: string - alwaysReconnect?: string - // googledrive.ts params - state?: string - // ServersListProvider.tsx params - serversList?: string - // Map and texture params - texturepack?: string - map?: string - mapDirBaseUrl?: string - mapDirGuess?: string - // Singleplayer params - singleplayer?: string - sp?: string - loadSave?: string - // Server params - reconnect?: string - server?: string - // Peer connection params - connectPeer?: string - peerVersion?: string - // UI params - modal?: string - viewerConnect?: string - // Map version param - mapVersion?: string - // Command params - command?: string - // Misc params - suggest_save?: string - noPacketsValidation?: string - testCrashApp?: string - onlyConnect?: string - connectText?: string - freezeSettings?: string - testIosCrash?: string - addPing?: string - - // Replay params - replayFilter?: string - replaySpeed?: string - replayFileUrl?: string - replayValidateClient?: string - replayStopOnError?: string - replaySkipMissingOnTimeout?: string - replayPacketsSenderDelay?: string - - // Benchmark params - openBenchmark?: string - renderDistance?: string - downloadBenchmark?: string - benchmarkMapZipUrl?: string - benchmarkPosition?: string -} - -export type AppQsParamsArray = { - mapDir?: string[] - setting?: string[] - serverSetting?: string[] - command?: string[] -} - -type AppQsParamsArrayTransformed = { - [k in keyof AppQsParamsArray]: string[] -} - -globalThis.process ??= {} as any -const initialAppConfig = process?.env?.INLINED_APP_CONFIG as AppConfig ?? {} - -export const appQueryParams = new Proxy({} as AppQsParams, { - get (target, property) { - if (typeof property !== 'string') { - return undefined - } - const qsParam = qsParams.get(property) - if (qsParam) return qsParam - return miscUiState.appConfig?.appParams?.[property] - }, -}) - -export const appQueryParamsArray = new Proxy({} as AppQsParamsArrayTransformed, { - get (target, property) { - if (typeof property !== 'string') { - return null - } - const qsParam = qsParams.getAll(property) - if (qsParam.length) return qsParam - return miscUiState.appConfig?.appParams?.[property] ?? [] - }, -}) - -export function updateQsParam (name: keyof AppQsParams, value: string | undefined) { - const url = new URL(window.location.href) - if (value) { - url.searchParams.set(name, value) - } else { - url.searchParams.delete(name) - } - window.history.replaceState({}, '', url.toString()) -} - -// Helper function to check if a specific query parameter exists -export const hasQueryParam = (param: keyof AppQsParams) => qsParams.has(param) - -// Helper function to get all query parameters as a URLSearchParams object -export const getRawQueryParams = () => qsParams; - -(globalThis as any).debugQueryParams = Object.fromEntries(qsParams.entries()) diff --git a/src/appStatus.ts b/src/appStatus.ts deleted file mode 100644 index 101714f5..00000000 --- a/src/appStatus.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { resetStateAfterDisconnect } from './browserfs' -import { hideModal, activeModalStack, showModal, miscUiState } from './globalState' -import { appStatusState, resetAppStatusState } from './react/AppStatusProvider' - -let ourLastStatus: string | undefined = '' -export const setLoadingScreenStatus = function (status: string | undefined | null, isError = false, hideDots = false, fromFlyingSquid = false, minecraftJsonMessage?: Record) { - if (typeof status === 'string') status = window.translateText?.(status) ?? status - // null can come from flying squid, should restore our last status - if (status === null) { - status = ourLastStatus - } else if (!fromFlyingSquid) { - ourLastStatus = status - } - fromFlyingSquid = false - - if (status === undefined) { - appStatusState.status = '' - - hideModal({ reactType: 'app-status' }, {}, { force: true }) - return - } - - if (!activeModalStack.some(x => x.reactType === 'app-status')) { - // just showing app status - resetAppStatusState() - } - showModal({ reactType: 'app-status' }) - if (appStatusState.isError) { - return - } - appStatusState.hideDots = hideDots - appStatusState.isError = isError - appStatusState.lastStatus = isError ? appStatusState.status : '' - appStatusState.status = status - appStatusState.minecraftJsonMessage = minecraftJsonMessage ?? null - - if (isError && miscUiState.gameLoaded) { - resetStateAfterDisconnect() - } -} -globalThis.setLoadingScreenStatus = setLoadingScreenStatus diff --git a/src/appViewer.ts b/src/appViewer.ts deleted file mode 100644 index 628d11b4..00000000 --- a/src/appViewer.ts +++ /dev/null @@ -1,354 +0,0 @@ -import { WorldDataEmitter, WorldDataEmitterWorker } from 'renderer/viewer/lib/worldDataEmitter' -import { getInitialPlayerState, PlayerStateRenderer, PlayerStateReactive } from 'renderer/viewer/lib/basePlayerState' -import { subscribeKey } from 'valtio/utils' -import { defaultWorldRendererConfig, WorldRendererConfig } from 'renderer/viewer/lib/worldrendererCommon' -import { Vec3 } from 'vec3' -import { SoundSystem } from 'renderer/viewer/three/threeJsSound' -import { proxy, subscribe } from 'valtio' -import { getDefaultRendererState } from 'renderer/viewer/baseGraphicsBackend' -import { getSyncWorld } from 'renderer/playground/shared' -import { MaybePromise } from 'contro-max/build/types/store' -import { PANORAMA_VERSION } from 'renderer/viewer/three/panoramaShared' -import { playerState } from './mineflayer/playerState' -import { createNotificationProgressReporter, ProgressReporter } from './core/progressReporter' -import { setLoadingScreenStatus } from './appStatus' -import { activeModalStack, miscUiState } from './globalState' -import { options } from './optionsStorage' -import { ResourcesManager, ResourcesManagerTransferred } from './resourcesManager' -import { watchOptionsAfterWorldViewInit } from './watchOptions' -import { loadMinecraftData } from './connect' -import { reloadChunks } from './utils' -import { displayClientChat } from './botUtils' - -export interface RendererReactiveState { - world: { - chunksLoaded: Set - // chunksTotalNumber: number - heightmaps: Map - allChunksLoaded: boolean - mesherWork: boolean - intersectMedia: { id: string, x: number, y: number } | null - } - renderer: string - preventEscapeMenu: boolean -} -export interface NonReactiveState { - world: { - chunksLoaded: Set - chunksTotalNumber: number - } -} - -export interface GraphicsBackendConfig { - fpsLimit?: number - powerPreference?: 'high-performance' | 'low-power' - statsVisible?: number - sceneBackground: string - timeoutRendering?: boolean -} - -const defaultGraphicsBackendConfig: GraphicsBackendConfig = { - fpsLimit: undefined, - powerPreference: undefined, - sceneBackground: 'lightblue', - timeoutRendering: false -} - -export interface GraphicsInitOptions { - resourcesManager: ResourcesManagerTransferred - config: GraphicsBackendConfig - rendererSpecificSettings: S - - callbacks: { - displayCriticalError: (error: Error) => void - setRendererSpecificSettings: (key: string, value: any) => void - - fireCustomEvent: (eventName: string, ...args: any[]) => void - } -} - -export interface DisplayWorldOptions { - version: string - worldView: WorldDataEmitterWorker - inWorldRenderingConfig: WorldRendererConfig - playerStateReactive: PlayerStateReactive - rendererState: RendererReactiveState - nonReactiveState: NonReactiveState -} - -export type GraphicsBackendLoader = ((options: GraphicsInitOptions) => MaybePromise) & { - id: string -} - -// no sync methods -export interface GraphicsBackend { - id: string - displayName?: string - startPanorama: () => void - // prepareResources: (version: string, progressReporter: ProgressReporter) => Promise - startWorld: (options: DisplayWorldOptions) => Promise | void - disconnect: () => void - setRendering: (rendering: boolean) => void - getDebugOverlay?: () => Record - updateCamera: (pos: Vec3 | null, yaw: number, pitch: number) => void - setRoll?: (roll: number) => void - soundSystem: SoundSystem | undefined - - backendMethods: Record | undefined -} - -export class AppViewer { - waitBackendLoadPromises = [] as Array> - - resourcesManager = new ResourcesManager() - worldView: WorldDataEmitter | undefined - readonly config: GraphicsBackendConfig = { - ...defaultGraphicsBackendConfig, - powerPreference: options.gpuPreference === 'default' ? undefined : options.gpuPreference - } - backend?: GraphicsBackend - backendLoader?: GraphicsBackendLoader - private currentState?: { - method: string - args: any[] - } - currentDisplay = null as 'menu' | 'world' | null - inWorldRenderingConfig: WorldRendererConfig = proxy(defaultWorldRendererConfig) - lastCamUpdate = 0 - playerState = playerState - rendererState = getDefaultRendererState().reactive - nonReactiveState: NonReactiveState = getDefaultRendererState().nonReactive - worldReady: Promise - private resolveWorldReady: () => void - - constructor () { - this.disconnectBackend() - } - - async loadBackend (loader: GraphicsBackendLoader) { - if (this.backend) { - this.disconnectBackend() - } - - await Promise.all(this.waitBackendLoadPromises) - this.waitBackendLoadPromises = [] - - this.backendLoader = loader - const rendererSpecificSettings = {} as Record - const rendererSettingsKey = `renderer.${this.backendLoader?.id}` - for (const key in options) { - if (key.startsWith(rendererSettingsKey)) { - rendererSpecificSettings[key.slice(rendererSettingsKey.length + 1)] = options[key] - } - } - const loaderOptions: GraphicsInitOptions = { // todo! - resourcesManager: this.resourcesManager as ResourcesManagerTransferred, - config: this.config, - callbacks: { - displayCriticalError (error) { - console.error(error) - setLoadingScreenStatus(error.message, true) - }, - setRendererSpecificSettings (key: string, value: any) { - options[`${rendererSettingsKey}.${key}`] = value - }, - fireCustomEvent (eventName, ...args) { - // this.callbacks.fireCustomEvent(eventName, ...args) - } - }, - rendererSpecificSettings, - } - this.backend = await loader(loaderOptions) - - // if (this.resourcesManager.currentResources) { - // void this.prepareResources(this.resourcesManager.currentResources.version, createNotificationProgressReporter()) - // } - - // Execute queued action if exists - if (this.currentState) { - if (this.currentState.method === 'startPanorama') { - this.startPanorama() - } else { - const { method, args } = this.currentState - this.backend[method](...args) - if (method === 'startWorld') { - void this.worldView!.init(bot.entity.position) - // void this.worldView!.init(args[0].playerState.getPosition()) - } - } - } - - // todo - modalStackUpdateChecks() - } - - async startWithBot () { - const renderDistance = miscUiState.singleplayer ? options.renderDistance : options.multiplayerRenderDistance - await this.startWorld(bot.world, renderDistance) - this.worldView!.listenToBot(bot) - } - - appConfigUdpate () { - if (miscUiState.appConfig) { - this.inWorldRenderingConfig.skinTexturesProxy = miscUiState.appConfig.skinTexturesProxy - } - } - - async startWorld (world, renderDistance: number, playerStateSend: PlayerStateRenderer = this.playerState.reactive) { - if (this.currentDisplay === 'world') throw new Error('World already started') - this.currentDisplay = 'world' - const startPosition = bot.entity?.position ?? new Vec3(0, 64, 0) - this.worldView = new WorldDataEmitter(world, renderDistance, startPosition) - this.worldView.panicChunksReload = () => { - if (!options.experimentalClientSelfReload) return - if (process.env.NODE_ENV === 'development') { - displayClientChat(`[client] client panicked due to too long loading time. Soft reloading chunks...`) - } - void reloadChunks() - } - window.worldView = this.worldView - watchOptionsAfterWorldViewInit(this.worldView) - this.appConfigUdpate() - - const displayWorldOptions: DisplayWorldOptions = { - version: this.resourcesManager.currentConfig!.version, - worldView: this.worldView, - inWorldRenderingConfig: this.inWorldRenderingConfig, - playerStateReactive: playerStateSend, - rendererState: this.rendererState, - nonReactiveState: this.nonReactiveState - } - let promise: undefined | Promise - if (this.backend) { - promise = this.backend.startWorld(displayWorldOptions) ?? undefined - // void this.worldView.init(startPosition) - } - this.currentState = { method: 'startWorld', args: [displayWorldOptions] } - - await promise - // Resolve the promise after world is started - this.resolveWorldReady() - return !!promise - } - - resetBackend (cleanState = false) { - this.disconnectBackend(cleanState) - if (this.backendLoader) { - void this.loadBackend(this.backendLoader) - } - } - - startPanorama () { - if (this.currentDisplay === 'menu') return - if (options.disableAssets) return - if (this.backend && !hasAppStatus()) { - this.currentDisplay = 'menu' - if (process.env.SINGLE_FILE_BUILD_MODE) { - void loadMinecraftData(PANORAMA_VERSION).then(() => { - this.backend?.startPanorama() - }) - } else { - this.backend.startPanorama() - } - } - this.currentState = { method: 'startPanorama', args: [] } - } - - // async prepareResources (version: string, progressReporter: ProgressReporter) { - // if (this.backend) { - // await this.backend.prepareResources(version, progressReporter) - // } - // } - - destroyAll () { - this.disconnectBackend() - this.resourcesManager.destroy() - } - - disconnectBackend (cleanState = false) { - if (cleanState) { - this.currentState = undefined - this.currentDisplay = null - this.worldView = undefined - } - if (this.backend) { - this.backend.disconnect() - this.backend = undefined - } - this.currentDisplay = null - const { promise, resolve } = Promise.withResolvers() - this.worldReady = promise - this.resolveWorldReady = resolve - this.rendererState = proxy(getDefaultRendererState().reactive) - this.nonReactiveState = getDefaultRendererState().nonReactive - // this.queuedDisplay = undefined - } - - get utils () { - return { - async waitingForChunks () { - if (this.backend?.worldState.allChunksLoaded) return - return new Promise((resolve) => { - const interval = setInterval(() => { - if (this.backend?.worldState.allChunksLoaded) { - clearInterval(interval) - resolve(true) - } - }, 100) - }) - } - } - } -} - -// do not import this. Use global appViewer instead (without window prefix). -export const appViewer = new AppViewer() -window.appViewer = appViewer - -const initialMenuStart = async () => { - if (appViewer.currentDisplay === 'world') { - appViewer.resetBackend(true) - } - const demo = new URLSearchParams(window.location.search).get('demo') - if (!demo) { - appViewer.startPanorama() - return - } - - // const version = '1.18.2' - const version = '1.21.4' - const { loadMinecraftData } = await import('./connect') - const { getSyncWorld } = await import('../renderer/playground/shared') - await loadMinecraftData(version) - const world = getSyncWorld(version) - world.setBlockStateId(new Vec3(0, 64, 0), loadedData.blocksByName.water.defaultState) - world.setBlockStateId(new Vec3(1, 64, 0), loadedData.blocksByName.water.defaultState) - world.setBlockStateId(new Vec3(1, 64, 1), loadedData.blocksByName.water.defaultState) - world.setBlockStateId(new Vec3(0, 64, 1), loadedData.blocksByName.water.defaultState) - world.setBlockStateId(new Vec3(-1, 64, -1), loadedData.blocksByName.water.defaultState) - world.setBlockStateId(new Vec3(-1, 64, 0), loadedData.blocksByName.water.defaultState) - world.setBlockStateId(new Vec3(0, 64, -1), loadedData.blocksByName.water.defaultState) - appViewer.resourcesManager.currentConfig = { version } - appViewer.playerState.reactive = getInitialPlayerState() - await appViewer.resourcesManager.updateAssetsData({}) - await appViewer.startWorld(world, 3) - appViewer.backend!.updateCamera(new Vec3(0, 65.7, 0), 0, -Math.PI / 2) // Y+1 and pitch = PI/2 to look down - void appViewer.worldView!.init(new Vec3(0, 64, 0)) -} -window.initialMenuStart = initialMenuStart - -const hasAppStatus = () => activeModalStack.some(m => m.reactType === 'app-status') - -const modalStackUpdateChecks = () => { - // maybe start panorama - if (!miscUiState.gameLoaded && !hasAppStatus()) { - void initialMenuStart() - } - - if (appViewer.backend) { - appViewer.backend.setRendering(!hasAppStatus()) - } - - appViewer.inWorldRenderingConfig.foreground = activeModalStack.length === 0 -} -subscribe(activeModalStack, modalStackUpdateChecks) diff --git a/src/appViewerLoad.ts b/src/appViewerLoad.ts deleted file mode 100644 index 53260662..00000000 --- a/src/appViewerLoad.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { subscribeKey } from 'valtio/utils' -import createGraphicsBackend from 'renderer/viewer/three/graphicsBackend' -import { options } from './optionsStorage' -import { appViewer } from './appViewer' -import { miscUiState } from './globalState' -import { watchOptionsAfterViewerInit } from './watchOptions' -import { showNotification } from './react/NotificationProvider' - -const backends = [ - createGraphicsBackend, -] -const loadBackend = async () => { - let backend = backends.find(backend => backend.id === options.activeRenderer) - if (!backend) { - showNotification(`No backend found for renderer ${options.activeRenderer}`, `Falling back to ${backends[0].id}`, true) - backend = backends[0] - } - await appViewer.loadBackend(backend) -} -window.loadBackend = loadBackend -if (process.env.SINGLE_FILE_BUILD_MODE) { - const unsub = subscribeKey(miscUiState, 'fsReady', () => { - if (miscUiState.fsReady) { - // don't do it earlier to load fs and display menu faster - void loadBackend() - unsub() - } - }) -} else { - setTimeout(() => { - void loadBackend() - }) -} - -const animLoop = () => { - for (const fn of beforeRenderFrame) fn() - requestAnimationFrame(animLoop) -} -requestAnimationFrame(animLoop) - -watchOptionsAfterViewerInit() - -// reset backend when renderer changes - -subscribeKey(options, 'activeRenderer', async () => { - if (appViewer.currentDisplay === 'world' && bot) { - appViewer.resetBackend(true) - await loadBackend() - void appViewer.startWithBot() - } -}) diff --git a/src/basicSounds.ts b/src/basicSounds.ts deleted file mode 100644 index 54af0d35..00000000 --- a/src/basicSounds.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { subscribeKey } from 'valtio/utils' -import { options } from './optionsStorage' -import { isCypress } from './standaloneUtils' -import { reportWarningOnce } from './utils' - -let audioContext: AudioContext -const sounds: Record = {} - -// Track currently playing sounds and their gain nodes -const activeSounds: Array<{ - source: AudioBufferSourceNode; - gainNode: GainNode; - volumeMultiplier: number; - isMusic: boolean; -}> = [] -window.activeSounds = activeSounds - -// load as many resources on page load as possible instead on demand as user can disable internet connection after he thinks the page is loaded -const loadingSounds = [] as string[] -const convertedSounds = [] as string[] - -export async function loadSound (path: string, contents = path) { - if (loadingSounds.includes(path)) return true - loadingSounds.push(path) - - try { - audioContext ??= new window.AudioContext() - - const res = await window.fetch(contents) - if (!res.ok) { - const error = `Failed to load sound ${path}` - if (isCypress()) throw new Error(error) - else console.warn(error) - return - } - const arrayBuffer = await res.arrayBuffer() - - // Decode the audio data immediately - const audioBuffer = await audioContext.decodeAudioData(arrayBuffer) - sounds[path] = audioBuffer - convertedSounds.push(path) // Mark as converted immediately - - loadingSounds.splice(loadingSounds.indexOf(path), 1) - } catch (err) { - console.warn(`Failed to load sound ${path}:`, err) - loadingSounds.splice(loadingSounds.indexOf(path), 1) - if (isCypress()) throw err - } -} - -export const loadOrPlaySound = async (url, soundVolume = 1, loadTimeout = options.remoteSoundsLoadTimeout, loop = false, isMusic = false) => { - const soundBuffer = sounds[url] - if (!soundBuffer) { - const start = Date.now() - const cancelled = await loadSound(url) - if (cancelled || Date.now() - start > loadTimeout) return - } - - return playSound(url, soundVolume, loop, isMusic) -} - -export async function playSound (url, soundVolume = 1, loop = false, isMusic = false) { - const volume = soundVolume * (options.volume / 100) * (isMusic ? options.musicVolume / 100 : 1) - - if (!volume) return - - try { - audioContext ??= new window.AudioContext() - } catch (err) { - reportWarningOnce('audioContext', 'Failed to create audio context. Some sounds will not play') - return - } - - const soundBuffer = sounds[url] - if (!soundBuffer) { - console.warn(`Sound ${url} not loaded yet`) - return - } - - const gainNode = audioContext.createGain() - const source = audioContext.createBufferSource() - source.buffer = soundBuffer - source.loop = loop - source.connect(gainNode) - gainNode.connect(audioContext.destination) - gainNode.gain.value = volume - source.start(0) - - // Add to active sounds - activeSounds.push({ source, gainNode, volumeMultiplier: soundVolume, isMusic }) - - const callbacks = [] as Array<() => void> - source.onended = () => { - // Remove from active sounds when finished - const index = activeSounds.findIndex(s => s.source === source) - if (index !== -1) activeSounds.splice(index, 1) - - for (const callback of callbacks) { - callback() - } - callbacks.length = 0 - } - - return { - onEnded (callback: () => void) { - callbacks.push(callback) - }, - stop () { - try { - source.stop() - // Remove from active sounds - const index = activeSounds.findIndex(s => s.source === source) - if (index !== -1) activeSounds.splice(index, 1) - } catch (err) { - console.warn('Failed to stop sound:', err) - } - }, - gainNode, - } -} - -export function stopAllSounds () { - for (const { source } of activeSounds) { - try { - source.stop() - } catch (err) { - console.warn('Failed to stop sound:', err) - } - } - activeSounds.length = 0 -} - -export function stopSound (url: string) { - const soundIndex = activeSounds.findIndex(s => s.source.buffer === sounds[url]) - if (soundIndex !== -1) { - const { source } = activeSounds[soundIndex] - try { - source.stop() - } catch (err) { - console.warn('Failed to stop sound:', err) - } - activeSounds.splice(soundIndex, 1) - } -} - -export function changeVolumeOfCurrentlyPlayingSounds (newVolume: number, newMusicVolume: number) { - const normalizedVolume = newVolume / 100 - for (const { gainNode, volumeMultiplier, isMusic } of activeSounds) { - try { - gainNode.gain.value = normalizedVolume * volumeMultiplier * (isMusic ? newMusicVolume / 100 : 1) - } catch (err) { - console.warn('Failed to change sound volume:', err) - } - } -} - -subscribeKey(options, 'volume', () => { - changeVolumeOfCurrentlyPlayingSounds(options.volume, options.musicVolume) -}) - -subscribeKey(options, 'musicVolume', () => { - changeVolumeOfCurrentlyPlayingSounds(options.volume, options.musicVolume) -}) diff --git a/src/benchmark.ts b/src/benchmark.ts deleted file mode 100644 index 42603a10..00000000 --- a/src/benchmark.ts +++ /dev/null @@ -1,311 +0,0 @@ -import { Vec3 } from 'vec3' -import { WorldRendererCommon } from 'renderer/viewer/lib/worldrendererCommon' -import prettyBytes from 'pretty-bytes' -import { subscribe } from 'valtio' -import { downloadAndOpenMapFromUrl } from './downloadAndOpenFile' -import { activeModalStack, miscUiState } from './globalState' -import { disabledSettings, options } from './optionsStorage' -import { BenchmarkAdapterInfo, getAllInfoLines } from './benchmarkAdapter' -import { appQueryParams } from './appParams' -import { getScreenRefreshRate } from './utils' -import { setLoadingScreenStatus } from './appStatus' - -const DEFAULT_RENDER_DISTANCE = 5 - -interface BenchmarkFixture { - urlZip?: string - urlDir?: string[] - replayFileUrl?: string - spawn?: [number, number, number] -} - -const fixtures: Record = { - default: { - urlZip: 'https://bucket.mcraft.fun/Future CITY 4.4-slim.zip', - spawn: [-133, 87, 309] as [number, number, number], - }, - dir: { - urlDir: ['https://bucket.mcraft.fun/Greenfield%20v0.5.1/map-index.json', 'https://mcraft-proxy.vercel.app/0/bucket.mcraft.fun/Greenfield%20v0.5.1/map-index.json'], - }, - replay: { - replayFileUrl: 'https://raw.githubusercontent.com/zardoy/mcraft-fun-replays/refs/heads/main/hypepixel-tnt-lobby.worldstate.txt', - }, -} - -Error.stackTraceLimit = Error.stackTraceLimit < 30 ? 30 : Error.stackTraceLimit - -const SESSION_STORAGE_BACKUP_KEY = 'benchmark-backup' -export const openBenchmark = async (renderDistance = DEFAULT_RENDER_DISTANCE) => { - let fixtureNameOpen = appQueryParams.openBenchmark - if (!fixtureNameOpen || fixtureNameOpen === '1' || fixtureNameOpen === 'true' || fixtureNameOpen === 'zip') { - fixtureNameOpen = 'default' - } - - - if (sessionStorage.getItem(SESSION_STORAGE_BACKUP_KEY)) { - const backup = JSON.stringify(JSON.parse(sessionStorage.getItem(SESSION_STORAGE_BACKUP_KEY)!), null, 2) - setLoadingScreenStatus('Either other tab with benchmark is open or page crashed. Last data backup is downloaded. Reload page to retry.') - // download file - const a = document.createElement('a') - a.href = 'data:text/plain;charset=utf-8,' + encodeURIComponent(backup) - a.download = `benchmark-${appViewer.backend?.id}.txt` - a.click() - sessionStorage.removeItem(SESSION_STORAGE_BACKUP_KEY) - return - } - - const fixture: BenchmarkFixture = appQueryParams.benchmarkMapZipUrl ? { - urlZip: appQueryParams.benchmarkMapZipUrl, - spawn: appQueryParams.benchmarkPosition ? appQueryParams.benchmarkPosition.split(',').map(Number) as [number, number, number] : fixtures.default.spawn, - } : fixtures[fixtureNameOpen] - - if (!fixture) { - setLoadingScreenStatus(`Benchmark fixture ${fixtureNameOpen} not found`) - return - } - - let memoryUsageAverage = 0 - let memoryUsageSamples = 0 - let memoryUsageWorst = 0 - setInterval(() => { - const memoryUsage = (window.performance as any)?.memory?.usedJSHeapSize - if (memoryUsage) { - memoryUsageAverage = (memoryUsageAverage * memoryUsageSamples + memoryUsage) / (memoryUsageSamples + 1) - memoryUsageSamples++ - if (memoryUsage > memoryUsageWorst) { - memoryUsageWorst = memoryUsage - } - } - }, 200) - - let mainThreadFpsAverage = 0 - let mainThreadFpsWorst = undefined as number | undefined - let mainThreadFpsSamples = 0 - let currentPassedFrames = 0 - const mainLoop = () => { - currentPassedFrames++ - requestAnimationFrame(mainLoop) - } - requestAnimationFrame(mainLoop) - setInterval(() => { - mainThreadFpsAverage = (mainThreadFpsAverage * mainThreadFpsSamples + currentPassedFrames) / (mainThreadFpsSamples + 1) - mainThreadFpsSamples++ - if (mainThreadFpsWorst === undefined) { - mainThreadFpsWorst = currentPassedFrames - } else { - mainThreadFpsWorst = Math.min(mainThreadFpsWorst, currentPassedFrames) - } - currentPassedFrames = 0 - }, 1000) - - // todo urlDir fix - let fixtureName = `${fixture.urlZip ?? fixture.urlDir?.join('|') ?? fixture.replayFileUrl ?? 'unknown'}` - if (fixture.spawn) { - fixtureName += ` - ${fixture.spawn.join(' ')}` - } - - fixtureName += ` - ${renderDistance}` - if (process.env.NODE_ENV !== 'development') { // do not delay - setLoadingScreenStatus('Benchmark requested... Getting screen refresh rate') - await new Promise(resolve => { - setTimeout(resolve, 1000) - }) - } - let start = 0 - // interval to backup data in sessionStorage in case of page crash - const saveBackupInterval = setInterval(() => { - if (!window.world) return - const backup = JSON.parse(JSON.stringify(window.benchmarkAdapter)) - backup.timePassed = ((Date.now() - start) / 1000).toFixed(2) - sessionStorage.setItem(SESSION_STORAGE_BACKUP_KEY, JSON.stringify(backup)) - }, 500) - - const screenRefreshRate = await getScreenRefreshRate() - const benchmarkAdapter: BenchmarkAdapterInfo = { - get fixture () { - return fixtureName - }, - get worldLoadTimeSeconds () { - return window.worldLoadTime - }, - get mesherWorkersCount () { - return (window.world as WorldRendererCommon).worldRendererConfig.mesherWorkers - }, - get mesherProcessAvgMs () { - return (window.world as WorldRendererCommon).workersProcessAverageTime - }, - get mesherProcessTotalMs () { - return (window.world as WorldRendererCommon).workersProcessAverageTime * (window.world as WorldRendererCommon).workersProcessAverageTimeCount - }, - get mesherProcessWorstMs () { - return (window.world as WorldRendererCommon).maxWorkersProcessTime - }, - get chunksFullInfo () { - return (window.world as WorldRendererCommon).chunksFullInfo - }, - get averageRenderTimeMs () { - return (window.world as WorldRendererCommon).renderTimeAvg - }, - get worstRenderTimeMs () { - return (window.world as WorldRendererCommon).renderTimeMax - }, - get fpsAveragePrediction () { - const avgRenderTime = (window.world as WorldRendererCommon).renderTimeAvg - return 1000 / avgRenderTime - }, - get fpsWorstPrediction () { - const maxRenderTime = (window.world as WorldRendererCommon).renderTimeMax - return 1000 / maxRenderTime - }, - get fpsAverageReal () { - return `${(window.world as WorldRendererCommon).fpsAverage.toFixed(0)} / ${screenRefreshRate}` - }, - get fpsWorstReal () { - return (window.world as WorldRendererCommon).fpsWorst ?? -1 - }, - get backendInfoReport () { - return (window.world as WorldRendererCommon).backendInfoReport - }, - get fpsAverageMainThread () { - return mainThreadFpsAverage - }, - get fpsWorstMainThread () { - return mainThreadFpsWorst ?? -1 - }, - get memoryUsageAverage () { - return prettyBytes(memoryUsageAverage) - }, - get memoryUsageWorst () { - return prettyBytes(memoryUsageWorst) - }, - get gpuInfo () { - return appViewer.rendererState.renderer - }, - get hardwareConcurrency () { - return navigator.hardwareConcurrency - }, - get userAgent () { - return navigator.userAgent - }, - clientVersion: `${process.env.RELEASE_TAG} ${process.env.BUILD_VERSION} ${process.env.RELEASE_LINK ?? ''}`, - } - window.benchmarkAdapter = benchmarkAdapter - - disabledSettings.value.add('renderDistance') - options.renderDistance = renderDistance - disabledSettings.value.add('renderDebug') - options.renderDebug = 'advanced' - disabledSettings.value.add('waitForChunksRender') - options.waitForChunksRender = false - - void downloadAndOpenMapFromUrl(fixture.urlZip, undefined, fixture.urlDir, fixture.replayFileUrl, { - connectEvents: { - serverCreated () { - if (fixture.spawn) { - localServer!.spawnPoint = new Vec3(...fixture.spawn) - localServer!.on('newPlayer', (player) => { - player.on('dataLoaded', () => { - player.position = new Vec3(...fixture.spawn!) - start = Date.now() - }) - }) - } - }, - } - }) - - document.addEventListener('cypress-world-ready', () => { - clearInterval(saveBackupInterval) - sessionStorage.removeItem(SESSION_STORAGE_BACKUP_KEY) - let stats = getAllInfoLines(window.benchmarkAdapter) - const downloadFile = () => { - // const changedSettings = - - const a = document.createElement('a') - a.href = 'data:text/plain;charset=utf-8,' + encodeURIComponent(stats.join('\n')) - a.download = `benchmark-${appViewer.backend?.id}.txt` - a.click() - } - if (appQueryParams.downloadBenchmark) { - downloadFile() - } - - const panel = document.createElement('div') - panel.style.position = 'fixed' - panel.style.top = '20px' - panel.style.right = '10px' - panel.style.backgroundColor = 'rgba(0,0,0,0.8)' - panel.style.color = 'white' - panel.style.padding = '10px' - panel.style.zIndex = '1000' - panel.style.fontFamily = 'monospace' - panel.style.maxWidth = '80%' - panel.style.maxHeight = '90vh' - panel.style.overflow = 'auto' - panel.id = 'benchmark-panel' - - // Add download button - const downloadButton = document.createElement('button') - downloadButton.textContent = 'Download Results' - downloadButton.style.marginBottom = '10px' - downloadButton.style.padding = '5px 10px' - downloadButton.style.backgroundColor = '#4CAF50' - downloadButton.style.color = 'white' - downloadButton.style.border = 'none' - downloadButton.style.borderRadius = '4px' - downloadButton.style.cursor = 'pointer' - downloadButton.onclick = downloadFile - panel.appendChild(downloadButton) - - const pre = document.createElement('pre') - pre.style.whiteSpace = 'pre-wrap' - pre.style.wordBreak = 'break-word' - panel.appendChild(pre) - - pre.textContent = stats.join('\n') - const updateStats = () => { - stats = getAllInfoLines(window.benchmarkAdapter) - pre.textContent = stats.join('\n') - } - - document.body.appendChild(panel) - // setInterval(updateStats, 100) - }) -} - -// add before unload -window.addEventListener('beforeunload', () => { - // remove sessionStorage backup - sessionStorage.removeItem(SESSION_STORAGE_BACKUP_KEY) -}) - -document.addEventListener('pointerlockchange', (e) => { - const panel = document.querySelector('#benchmark-panel') - if (panel) { - panel.hidden = !!document.pointerLockElement - } -}) - -subscribe(activeModalStack, () => { - const panel = document.querySelector('#benchmark-panel') - if (panel && activeModalStack.length > 1) { - panel.hidden = true - } -}) - -export const registerOpenBenchmarkListener = () => { - if (appQueryParams.openBenchmark) { - void openBenchmark(appQueryParams.renderDistance ? +appQueryParams.renderDistance : undefined) - } - - window.addEventListener('keydown', (e) => { - if (e.code === 'KeyB' && e.shiftKey && !miscUiState.gameLoaded && activeModalStack.length === 0) { - e.preventDefault() - // add ?openBenchmark=true to url without reload - const url = new URL(window.location.href) - url.searchParams.set('openBenchmark', 'true') - window.history.replaceState({}, '', url.toString()) - void openBenchmark() - } - }) -} diff --git a/src/benchmarkAdapter.ts b/src/benchmarkAdapter.ts deleted file mode 100644 index e3da6669..00000000 --- a/src/benchmarkAdapter.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { noCase } from 'change-case' - -export interface BenchmarkAdapterInfo { - fixture: string - // general load info - worldLoadTimeSeconds: number - - // mesher - mesherWorkersCount: number - mesherProcessAvgMs: number - mesherProcessWorstMs: number - mesherProcessTotalMs: number - chunksFullInfo: string - - // rendering backend - averageRenderTimeMs: number - worstRenderTimeMs: number - fpsAveragePrediction: number - fpsWorstPrediction: number - fpsAverageReal: string - fpsWorstReal: number - backendInfoReport: string - - // main thread - fpsAverageMainThread: number - fpsWorstMainThread: number - - // memory total - memoryUsageAverage: string - memoryUsageWorst: string - - // context info - gpuInfo: string - hardwareConcurrency: number - userAgent: string - clientVersion: string -} - -export const getAllInfo = (adapter: BenchmarkAdapterInfo) => { - return Object.fromEntries( - Object.entries(adapter).map(([key, value]) => { - if (typeof value === 'function') { - value = (value as () => any)() - } - if (typeof value === 'number') { - value = value.toFixed(2) - } - return [noCase(key), value] - }) - ) -} - -export const getAllInfoLines = (adapter: BenchmarkAdapterInfo, delayed = false) => { - const info = getAllInfo(adapter) - if (delayed) { - for (const key in info) { - if (key !== 'fpsAveragePrediction' && key !== 'fpsAverageReal') { - delete info[key] - } - } - } - - return Object.entries(info).map(([key, value]) => { - return `${key}${delayed ? ' (delayed)' : ''}: ${value}` - }) -} diff --git a/src/botUtils.ts b/src/botUtils.ts deleted file mode 100644 index 10609322..00000000 --- a/src/botUtils.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { versionToNumber } from 'renderer/viewer/common/utils' -import * as nbt from 'prismarine-nbt' - -export const displayClientChat = (text: string) => { - const message = { - text - } - if (versionToNumber(bot.version) >= versionToNumber('1.19')) { - bot._client.emit('systemChat', { - formattedMessage: JSON.stringify(message), - position: 0, - sender: 'minecraft:chat' - }) - return - } - bot._client.emit('chat', { - message: JSON.stringify(message), - position: 0, - sender: 'minecraft:chat' - }) -} - -export const parseFormattedMessagePacket = (arg) => { - if (typeof arg === 'string') { - try { - arg = JSON.parse(arg) - return { - formatted: arg, - plain: '' - } - } catch {} - } - if (typeof arg === 'object') { - try { - return { - formatted: nbt.simplify(arg), - plain: '' - } - } catch (err) { - console.warn('Failed to parse formatted message', arg, err) - return { - plain: JSON.stringify(arg) - } - } - } - return { - plain: String(arg) - } -} diff --git a/src/browserfs.ts b/src/browserfs.ts deleted file mode 100644 index 006b6db8..00000000 --- a/src/browserfs.ts +++ /dev/null @@ -1,685 +0,0 @@ -import { join } from 'path' -import { promisify } from 'util' -import fs from 'fs' -import sanitizeFilename from 'sanitize-filename' -import { oneOf } from '@zardoy/utils' -import * as browserfs from 'browserfs' -import { options, resetOptions } from './optionsStorage' - -import { fsState, loadSave } from './loadSave' -import { installResourcepackPack, installTexturePackFromHandle, updateTexturePackInstalledState } from './resourcePack' -import { miscUiState } from './globalState' -import { setLoadingScreenStatus } from './appStatus' -import { VALID_REPLAY_EXTENSIONS, openFile } from './packetsReplay/replayPackets' -import { getFixedFilesize } from './downloadAndOpenFile' -import { packetsReplayState } from './react/state/packetsReplayState' -import { createFullScreenProgressReporter } from './core/progressReporter' -import { showNotification } from './react/NotificationProvider' -import { resetAppStorage } from './react/appStorageProvider' -import { ConnectOptions } from './connect' -const { GoogleDriveFileSystem } = require('google-drive-browserfs/src/backends/GoogleDrive') - -browserfs.install(window) -const defaultMountablePoints = { - '/data': { fs: 'IndexedDB' }, - '/resourcepack': { fs: 'InMemory' }, // temporary storage for currently loaded resource pack - '/temp': { fs: 'InMemory' } -} -const fallbackMountablePoints = { - '/resourcepack': { fs: 'InMemory' }, // temporary storage for downloaded server resource pack - '/temp': { fs: 'InMemory' } -} -browserfs.configure({ - fs: 'MountableFileSystem', - options: defaultMountablePoints, -}, async (e) => { - if (e) { - browserfs.configure({ - fs: 'MountableFileSystem', - options: fallbackMountablePoints, - }, async (e2) => { - if (e2) { - showNotification('Unknown FS error, cannot continue', e2.message, true) - throw e2 - } - showNotification('Failed to access device storage', `Check you have free space. ${e.message}`, true) - miscUiState.fsReady = true - miscUiState.singleplayerAvailable = false - }) - return - } - await updateTexturePackInstalledState() - miscUiState.fsReady = true - miscUiState.singleplayerAvailable = true -}) - -export const forceCachedDataPaths = {} -export const forceRedirectPaths = {} - -window.fs = fs -//@ts-expect-error -fs.promises = new Proxy(Object.fromEntries(['readFile', 'writeFile', 'stat', 'mkdir', 'rmdir', 'unlink', 'rename', /* 'copyFile', */'readdir'].map(key => [key, promisify(fs[key])])), { - get (target, p: string, receiver) { - if (!target[p]) throw new Error(`Not implemented fs.promises.${p}`) - return (...args) => { - // browser fs bug: if path doesn't start with / dirname will return . which would cause infinite loop, so we need to normalize paths - if (typeof args[0] === 'string' && !args[0].startsWith('/')) args[0] = '/' + args[0] - const toRemap = Object.entries(forceRedirectPaths).find(([from]) => args[0].startsWith(from)) - if (toRemap) { - args[0] = args[0].replace(toRemap[0], toRemap[1]) - } - // Write methods - // todo issue one-time warning (in chat I guess) - const readonly = fsState.isReadonly && !(args[0].startsWith('/data') && !fsState.inMemorySave) // allow copying worlds from external providers such as zip - if (readonly) { - if (oneOf(p, 'readFile', 'writeFile') && forceCachedDataPaths[args[0]]) { - if (p === 'readFile') { - return Promise.resolve(forceCachedDataPaths[args[0]]) - } else if (p === 'writeFile') { - forceCachedDataPaths[args[0]] = args[1] - console.debug('Skipped writing to readonly fs', args[0]) - return Promise.resolve() - } - } - if (oneOf(p, 'writeFile', 'mkdir', 'rename')) return - } - if (p === 'open' && fsState.isReadonly) { - args[1] = 'r' // read-only, zipfs throw otherwise - } - if (p === 'readFile') { - fsState.openReadOperations++ - } else if (p === 'writeFile') { - fsState.openWriteOperations++ - } - return target[p](...args).finally(() => { - if (p === 'readFile') { - fsState.openReadOperations-- - } else if (p === 'writeFile') { - fsState.openWriteOperations-- - } - }) - } - } -}) -//@ts-expect-error -fs.promises.open = async (...args) => { - //@ts-expect-error - const fd = await promisify(fs.open)(...args) - return { - ...Object.fromEntries(['read', 'write', 'close'].map(x => [x, async (...args) => { - return new Promise(resolve => { - // todo it results in world corruption on interactions eg block placements - if (x === 'write' && fsState.isReadonly) { - resolve({ buffer: Buffer.from([]), bytesRead: 0 }) - return - } - - if (x === 'read') { - fsState.openReadOperations++ - } else if (x === 'write' || x === 'close') { - fsState.openWriteOperations++ - } - fs[x](fd, ...args, (err, bytesRead, buffer) => { - if (x === 'read') { - fsState.openReadOperations-- - } else if (x === 'write' || x === 'close') { - // todo that's not correct - fsState.openWriteOperations-- - } - if (err) throw err - // todo if readonly probably there is no need to open at all (return some mocked version - check reload)? - if (x === 'write' && !fsState.isReadonly) { - // flush data, though alternatively we can rely on close in unload - fs.fsync(fd, () => { }) - } - resolve({ buffer, bytesRead }) - }) - }) - }])), - // for debugging - fd, - filename: args[0], - async close () { - return new Promise(resolve => { - fs.close(fd, (err) => { - if (err) { - throw err - } else { - resolve() - } - }) - }) - } - } -} - -// for testing purposes, todo move it to core patch -const removeFileRecursiveSync = (path) => { - for (const file of fs.readdirSync(path)) { - const curPath = join(path, file) - if (fs.lstatSync(curPath).isDirectory()) { - // recurse - removeFileRecursiveSync(curPath) - fs.rmdirSync(curPath) - } else { - // delete file - fs.unlinkSync(curPath) - } - } -} - -window.removeFileRecursiveSync = removeFileRecursiveSync - -export const mkdirRecursive = async (path: string) => { - const parts = path.split('/') - let current = '' - for (const part of parts) { - current += part + '/' - try { - // eslint-disable-next-line no-await-in-loop - await fs.promises.mkdir(current) - } catch (err) { - } - } -} - -export const uniqueFileNameFromWorldName = async (title: string, savePath: string) => { - const name = sanitizeFilename(title) - let resultPath!: string - // getUniqueFolderName - let i = 0 - let free = false - while (!free) { - try { - resultPath = `${savePath.replace(/\$/, '')}/${name}${i === 0 ? '' : `-${i}`}` - // eslint-disable-next-line no-await-in-loop - await fs.promises.stat(resultPath) - i++ - } catch (err) { - free = true - } - } - return resultPath -} - -export const mountExportFolder = async () => { - let handle: FileSystemDirectoryHandle - try { - handle = await showDirectoryPicker({ - id: 'world-export', - }) - } catch (err) { - if (err instanceof DOMException && err.name === 'AbortError') return - throw err - } - if (!handle) return false - await new Promise(resolve => { - browserfs.configure({ - fs: 'MountableFileSystem', - options: { - ...defaultMountablePoints, - '/export': { - fs: 'FileSystemAccess', - options: { - handle - } - } - }, - }, (e) => { - if (e) throw e - resolve() - }) - }) - return true -} - -let googleDriveFileSystem - -/** Only cached! */ -export const googleDriveGetFileIdFromPath = (path: string) => { - return googleDriveFileSystem._getExistingFileId(path) -} - -export const mountGoogleDriveFolder = async (readonly: boolean, rootId: string) => { - googleDriveFileSystem = new GoogleDriveFileSystem() - googleDriveFileSystem.rootDirId = rootId - googleDriveFileSystem.isReadonly = readonly - await new Promise(resolve => { - browserfs.configure({ - fs: 'MountableFileSystem', - options: { - ...defaultMountablePoints, - '/google': googleDriveFileSystem - }, - }, (e) => { - if (e) throw e - resolve() - }) - }) - fsState.isReadonly = readonly - fsState.syncFs = false - fsState.inMemorySave = false - fsState.remoteBackend = true - return true -} - -export async function removeFileRecursiveAsync (path, removeDirectoryItself = true) { - const errors = [] as Array<[string, Error]> - try { - const files = await fs.promises.readdir(path) - - // Use Promise.all to parallelize file/directory removal - await Promise.all(files.map(async (file) => { - const curPath = join(path, file) - const stats = await fs.promises.stat(curPath) - if (stats.isDirectory()) { - // Recurse - await removeFileRecursiveAsync(curPath) - } else { - // Delete file - await fs.promises.unlink(curPath) - } - })) - - // After removing all files/directories, remove the current directory - if (removeDirectoryItself) { - await fs.promises.rmdir(path) - } - } catch (error) { - errors.push([path, error]) - } - - if (errors.length) { - setTimeout(() => { - console.error(errors) - throw new Error(`Error removing directories/files: ${errors.map(([path, err]) => `${path}: ${err.message}`).join(', ')}`) - }) - } -} - - -const SUPPORT_WRITE = true - -export const openWorldDirectory = async (dragndropHandle?: FileSystemDirectoryHandle) => { - let _directoryHandle: FileSystemDirectoryHandle - if (dragndropHandle) { - _directoryHandle = dragndropHandle - } else { - try { - _directoryHandle = await window.showDirectoryPicker({ - id: 'select-world', // important: this is used to remember user choice (start directory) - }) - } catch (err) { - if (err instanceof DOMException && err.name === 'AbortError') return - throw err - } - } - const directoryHandle = _directoryHandle - - const requestResult = SUPPORT_WRITE && !options.preferLoadReadonly ? await directoryHandle.requestPermission?.({ mode: 'readwrite' }) : undefined - const writeAccess = requestResult === 'granted' - - const doContinue = writeAccess || !SUPPORT_WRITE || options.disableLoadPrompts || confirm('Continue in readonly mode?') - if (!doContinue) return - await new Promise(resolve => { - browserfs.configure({ - fs: 'MountableFileSystem', - options: { - ...defaultMountablePoints, - '/world': { - fs: 'FileSystemAccess', - options: { - handle: directoryHandle - } - } - }, - }, (e) => { - if (e) throw e - resolve() - }) - }) - - fsState.isReadonly = !writeAccess - fsState.syncFs = false - fsState.inMemorySave = false - fsState.remoteBackend = false - await loadSave() -} - -const tryToDetectResourcePack = async () => { - const askInstall = async () => { - // todo investigate browserfs read errors - return alert('ATM You can install texturepacks only via options menu.') - // if (confirm('Resource pack detected, do you want to install it?')) { - // await installTexturePackFromHandle() - // } - } - - if (fs.existsSync('/world/pack.mcmeta')) { - await askInstall() - return true - } - // const jszip = new JSZip() - // let loaded = await jszip.loadAsync(file) - // if (loaded.file('pack.mcmeta')) { - // loaded = null - // askInstall() - // return true - // } - // loaded = null -} - -export const possiblyCleanHandle = (callback = () => { }) => { - if (!fsState.saveLoaded) { - // todo clean handle - browserfs.configure({ - fs: 'MountableFileSystem', - options: defaultMountablePoints, - }, (e) => { - callback() - if (e) throw e - }) - } -} - -const readdirSafe = async (path: string) => { - try { - return await fs.promises.readdir(path) - } catch (err) { - return null - } -} - -export const collectFilesToCopy = async (basePath: string, safe = false): Promise => { - const result: string[] = [] - const countFiles = async (relPath: string) => { - const resolvedPath = join(basePath, relPath) - const files = relPath === '.' && !safe ? await fs.promises.readdir(resolvedPath) : await readdirSafe(resolvedPath) - if (!files) return null - await Promise.all(files.map(async file => { - const res = await countFiles(join(relPath, file)) - if (res === null) { - // is file - result.push(join(relPath, file)) - } - })) - } - await countFiles('.') - return result -} - -export const copyFilesAsyncWithProgress = async (pathSrc: string, pathDest: string, throwRootNotExist = true, addMsg = '') => { - const stat = await existsViaStats(pathSrc) - if (!stat) { - if (throwRootNotExist) throw new Error(`Cannot copy. Source directory ${pathSrc} does not exist`) - console.debug('source directory does not exist', pathSrc) - return - } - if (!stat.isDirectory()) { - await fs.promises.writeFile(pathDest, await fs.promises.readFile(pathSrc) as any) - console.debug('copied single file', pathSrc, pathDest) - return - } - - try { - setLoadingScreenStatus('Copying files') - let filesCount = 0 - const countFiles = async (path: string) => { - const files = await fs.promises.readdir(path) - await Promise.all(files.map(async (file) => { - const curPath = join(path, file) - const stats = await fs.promises.stat(curPath) - if (stats.isDirectory()) { - // Recurse - await countFiles(curPath) - } else { - filesCount++ - } - })) - } - console.debug('Counting files', pathSrc) - await countFiles(pathSrc) - console.debug('counted', filesCount) - let copied = 0 - await copyFilesAsync(pathSrc, pathDest, (name) => { - copied++ - setLoadingScreenStatus(`Copying files${addMsg} (${copied}/${filesCount}): ${name}`) - }) - } finally { - setLoadingScreenStatus(undefined) - } -} - -export const existsViaStats = async (path: string) => { - try { - return await fs.promises.stat(path) - } catch (e) { - return false - } -} - -export const fileExistsAsyncOptimized = async (path: string) => { - try { - await fs.promises.readdir(path) - } catch (err) { - if (err.code === 'ENOTDIR') return true - // eslint-disable-next-line sonarjs/prefer-single-boolean-return - if (err.code === 'ENOENT') return false - // throw err - return false - } - return true -} - -export const copyFilesAsync = async (pathSrc: string, pathDest: string, fileCopied?: (name) => void) => { - // query: can't use fs.copy! use fs.promises.writeFile and readFile - const files = await fs.promises.readdir(pathSrc) - - if (!await existsViaStats(pathDest)) { - await fs.promises.mkdir(pathDest, { recursive: true }) - } - - // Use Promise.all to parallelize file/directory copying - await Promise.all(files.map(async (file) => { - const curPathSrc = join(pathSrc, file) - const curPathDest = join(pathDest, file) - const stats = await fs.promises.stat(curPathSrc) - if (stats.isDirectory()) { - // Recurse - await fs.promises.mkdir(curPathDest) - await copyFilesAsync(curPathSrc, curPathDest, fileCopied) - } else { - // Copy file - try { - await fs.promises.writeFile(curPathDest, await fs.promises.readFile(curPathSrc) as any) - console.debug('copied file', curPathSrc, curPathDest) - } catch (err) { - console.error('Error copying file', curPathSrc, curPathDest, err) - throw err - } - fileCopied?.(curPathDest) - } - })) -} - -export const openWorldFromHttpDir = async (fileDescriptorUrls: string[]/* | undefined */, baseUrlParam) => { - // todo try go guess mode - let index - let baseUrl - for (const url of fileDescriptorUrls) { - let file - try { - setLoadingScreenStatus(`Trying to get world descriptor from ${new URL(url).host}`) - const controller = new AbortController() - setTimeout(() => { - controller.abort() - }, 3000) - // eslint-disable-next-line no-await-in-loop - const response = await fetch(url, { signal: controller.signal }) - // eslint-disable-next-line no-await-in-loop - file = await response.json() - } catch (err) { - console.error('Error fetching file descriptor', url, err) - } - if (!file) continue - if (file.baseUrl) { - baseUrl = new URL(file.baseUrl, baseUrl).toString() - index = file.index - } else { - index = file - baseUrl = baseUrlParam ?? url.split('/').slice(0, -1).join('/') - } - break - } - if (!index) throw new Error(`The provided mapDir file is not valid descriptor file! ${fileDescriptorUrls.join(', ')}`) - await new Promise(async resolve => { - browserfs.configure({ - fs: 'MountableFileSystem', - options: { - ...defaultMountablePoints, - '/world': { - fs: 'HTTPRequest', - options: { - index, - baseUrl - } - } - }, - }, (e) => { - if (e) throw e - resolve() - }) - }) - - fsState.saveLoaded = false - fsState.isReadonly = true - fsState.syncFs = false - fsState.inMemorySave = false - fsState.remoteBackend = true - - await loadSave() -} - -// todo rename method -const openWorldZipInner = async (file: File | ArrayBuffer, name = file['name'], connectOptions?: Partial) => { - await new Promise(async resolve => { - browserfs.configure({ - // todo - fs: 'MountableFileSystem', - options: { - ...defaultMountablePoints, - '/world': { - fs: 'ZipFS', - options: { - zipData: Buffer.from(file instanceof File ? (await file.arrayBuffer()) : file), - name - } - } - }, - }, (e) => { - if (e) throw e - resolve() - }) - }) - - fsState.saveLoaded = false - fsState.isReadonly = true - fsState.syncFs = true - fsState.inMemorySave = false - fsState.remoteBackend = false - - if (fs.existsSync('/world/level.dat')) { - await loadSave() - } else { - const dirs = fs.readdirSync('/world') - const availableWorlds: string[] = [] - for (const dir of dirs) { - if (fs.existsSync(`/world/${dir}/level.dat`)) { - availableWorlds.push(dir) - } - } - - if (availableWorlds.length === 0) { - if (await tryToDetectResourcePack()) return - alert('No worlds found in the zip') - return - } - - if (availableWorlds.length === 1) { - await loadSave(`/world/${availableWorlds[0]}`, connectOptions) - return - } - - alert(`Many (${availableWorlds.length}) worlds found in the zip!`) - // todo prompt picker - // const selectWorld - } -} - -export const openWorldZip = async (...args: Parameters) => { - try { - return await openWorldZipInner(...args) - } finally { - possiblyCleanHandle() - } -} - -export const resetLocalStorage = () => { - resetOptions() - resetAppStorage() -} - -window.resetLocalStorage = resetLocalStorage - -export const openFilePicker = (specificCase?: 'resourcepack') => { - // create and show input picker - let picker: HTMLInputElement = document.body.querySelector('input#file-zip-picker')! - if (!picker) { - picker = document.createElement('input') - picker.type = 'file' - picker.accept = specificCase ? '.zip' : [...VALID_REPLAY_EXTENSIONS, '.zip'].join(',') - - picker.addEventListener('change', () => { - const file = picker.files?.[0] - picker.value = '' - if (!file) return - if (specificCase === 'resourcepack') { - if (!file.name.endsWith('.zip')) { - const doContinue = confirm(`Are you sure ${file.name.slice(-20)} is .zip file? ONLY .zip files are supported. Continue?`) - if (!doContinue) return - } - void installResourcepackPack(file, createFullScreenProgressReporter()).catch((err) => { - setLoadingScreenStatus(err.message, true) - }) - } else { - // eslint-disable-next-line no-lonely-if - if (VALID_REPLAY_EXTENSIONS.some(ext => file.name.endsWith(ext)) || file.name.startsWith('packets-replay')) { - void file.text().then(contents => { - openFile({ - contents, - filename: file.name, - filesize: file.size - }) - }) - } else { - void openWorldZip(file) - } - } - }) - picker.hidden = true - document.body.appendChild(picker) - } - - picker.click() -} - -export const resetStateAfterDisconnect = () => { - miscUiState.gameLoaded = false - miscUiState.loadedDataVersion = null - miscUiState.singleplayer = false - miscUiState.flyingSquid = false - miscUiState.wanOpened = false - miscUiState.currentDisplayQr = null - - fsState.saveLoaded = false -} diff --git a/src/builtinCommands.ts b/src/builtinCommands.ts deleted file mode 100644 index a292c5cd..00000000 --- a/src/builtinCommands.ts +++ /dev/null @@ -1,156 +0,0 @@ -import fs from 'fs' -import { join } from 'path' -import JSZip from 'jszip' -import { getThreeJsRendererMethods } from 'renderer/viewer/three/threeJsMethods' -import { fsState, readLevelDat } from './loadSave' -import { closeWan, openToWanAndCopyJoinLink } from './localServerMultiplayer' -import { copyFilesAsync, uniqueFileNameFromWorldName } from './browserfs' -import { saveServer } from './flyingSquidUtils' -import { setLoadingScreenStatus } from './appStatus' -import { displayClientChat } from './botUtils' -import { miscUiState } from './globalState' - -const notImplemented = () => { - return 'Not implemented yet' -} - -async function addFolderToZip (folderPath, zip, relativePath) { - const entries = await fs.promises.readdir(folderPath) - - for (const entry of entries) { - const entryPath = join(folderPath, entry) - const stats = await fs.promises.stat(entryPath) - - const zipEntryPath = join(relativePath, entry) - - if (stats.isDirectory()) { - const subZip = zip.folder(zipEntryPath) - await addFolderToZip(entryPath, subZip, zipEntryPath) - } else { - const fileData = await fs.promises.readFile(entryPath) - zip.file(entry, fileData) - } - } -} - -export const exportWorld = async (path: string, type: 'zip' | 'folder', zipName = 'world-prismarine-exported') => { - try { - if (type === 'zip') { - setLoadingScreenStatus('Generating zip, this may take a few minutes') - const zip = new JSZip() - await addFolderToZip(path, zip, '') - - // Generate the ZIP archive content - const zipContent = await zip.generateAsync({ type: 'blob' }) - - // Create a download link and trigger the download - const downloadLink = document.createElement('a') - downloadLink.href = URL.createObjectURL(zipContent) - // todo use loaded zip/folder name - downloadLink.download = `${zipName}.zip` - downloadLink.click() - - // Clean up the URL object after download - URL.revokeObjectURL(downloadLink.href) - } else { - setLoadingScreenStatus('Preparing export folder') - let dest = '/' - if ((await fs.promises.readdir('/export')).length) { - const { levelDat } = (await readLevelDat(path))! - dest = await uniqueFileNameFromWorldName(levelDat.LevelName, path) - } - setLoadingScreenStatus(`Copying files to ${dest} of selected folder`) - await copyFilesAsync(path, '/export' + dest) - } - } finally { - setLoadingScreenStatus(undefined) - } -} - -// todo include in help -const exportLoadedWorld = async () => { - await saveServer() - let worldFolder = fsState.inMemorySavePath - if (!worldFolder.startsWith('/')) worldFolder = `/${worldFolder}` - await exportWorld(worldFolder, 'zip') -} - -window.exportWorld = exportLoadedWorld - -const writeText = (text) => { - displayClientChat(text) -} - -export const commands: Array<{ - command: string[], - alwaysAvailable?: boolean, - invoke (args: string[]): Promise | void - //@ts-format-ignore-region -}> = [ - { - command: ['/download', '/export'], - invoke: exportLoadedWorld - }, - { - command: ['/publish', '/share'], - async invoke () { - const text = await openToWanAndCopyJoinLink(writeText) - if (text) writeText(text) - } - }, - { - command: ['/close'], - invoke () { - const text = closeWan() - if (text) writeText(text) - } - }, - { - command: ['/save'], - async invoke () { - await saveServer(false) - writeText('Saved to browser memory') - } - }, - { - command: ['/pos'], - alwaysAvailable: true, - async invoke ([type]) { - let pos: { x: number, y: number, z: number } | undefined - if (type === 'block') { - const blockPos = window.cursorBlockRel()?.position - if (blockPos) { - pos = { x: blockPos.x, y: blockPos.y, z: blockPos.z } - } - } else { - const playerPos = bot.entity.position - pos = { x: playerPos.x, y: playerPos.y, z: playerPos.z } - } - if (!pos) return - const formatted = `${pos.x.toFixed(2)} ${pos.y.toFixed(2)} ${pos.z.toFixed(2)}` - await navigator.clipboard.writeText(formatted) - writeText(`Copied position to clipboard: ${formatted}`) - } - }, - { - command: ['/mesherlog'], - alwaysAvailable: true, - invoke () { - getThreeJsRendererMethods()?.downloadMesherLog() - } - } -] -//@ts-format-ignore-endregion - -export const getBuiltinCommandsList = () => commands.filter(command => command.alwaysAvailable || miscUiState.singleplayer).flatMap(command => command.command) - -export const tryHandleBuiltinCommand = (message: string) => { - const [userCommand, ...args] = message.split(' ') - - for (const command of commands.filter(command => command.alwaysAvailable || miscUiState.singleplayer)) { - if (command.command.includes(userCommand)) { - void command.invoke(args) // ignoring for now - return true - } - } -} diff --git a/src/cameraRotationControls.ts b/src/cameraRotationControls.ts deleted file mode 100644 index 679a3a44..00000000 --- a/src/cameraRotationControls.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { contro } from './controls' -import { activeModalStack, isGameActive, miscUiState, showModal } from './globalState' -import { options } from './optionsStorage' -import { hideNotification, notificationProxy } from './react/NotificationProvider' -import { pointerLock } from './utils' -import { updateMotion, initMotionTracking } from './react/uiMotion' - -let lastMouseMove: number - -export type CameraMoveEvent = { - movementX: number - movementY: number - type: string - stopPropagation?: () => void -} - -export function onCameraMove (e: MouseEvent | CameraMoveEvent) { - if (!isGameActive(true)) return - if (e.type === 'mousemove' && !document.pointerLockElement) return - e.stopPropagation?.() - if (appViewer.playerState.utils.isSpectatingEntity()) return - const now = performance.now() - // todo: limit camera movement for now to avoid unexpected jumps - if (now - lastMouseMove < 4 && !options.preciseMouseInput) return - lastMouseMove = now - let { mouseSensX, mouseSensY } = options - if (mouseSensY === -1) mouseSensY = mouseSensX - moveCameraRawHandler({ - x: e.movementX * mouseSensX * 0.0001, - y: e.movementY * mouseSensY * 0.0001 - }) - bot.mouse.update() - updateMotion() -} - -export const moveCameraRawHandler = ({ x, y }: { x: number; y: number }) => { - const maxPitch = 0.5 * Math.PI - const minPitch = -0.5 * Math.PI - - appViewer.lastCamUpdate = Date.now() - - // if (viewer.world.freeFlyMode) { - // // Update freeFlyState directly - // viewer.world.freeFlyState.yaw = (viewer.world.freeFlyState.yaw - x) % (2 * Math.PI) - // viewer.world.freeFlyState.pitch = Math.max(minPitch, Math.min(maxPitch, viewer.world.freeFlyState.pitch - y)) - // return - // } - - if (!bot?.entity) return - const pitch = bot.entity.pitch - y - void bot.look(bot.entity.yaw - x, Math.max(minPitch, Math.min(maxPitch, pitch)), true) - appViewer.backend?.updateCamera(null, bot.entity.yaw, pitch) -} - -window.addEventListener('mousemove', (e: MouseEvent) => { - onCameraMove(e) -}, { capture: true }) - -export const onControInit = () => { - contro.on('stickMovement', ({ stick, vector }) => { - if (!isGameActive(true)) return - if (stick !== 'right') return - let { x, z } = vector - if (Math.abs(x) < 0.18) x = 0 - if (Math.abs(z) < 0.18) z = 0 - onCameraMove({ - movementX: x * 10, - movementY: z * 10, - type: 'stickMovement', - stopPropagation () {} - } as CameraMoveEvent) - miscUiState.usingGamepadInput = true - }) -} - -function pointerLockChangeCallback () { - if (appViewer.rendererState.preventEscapeMenu) return - if (!pointerLock.hasPointerLock && activeModalStack.length === 0 && miscUiState.gameLoaded) { - showModal({ reactType: 'pause-screen' }) - } -} - -document.addEventListener('pointerlockchange', pointerLockChangeCallback, false) diff --git a/src/chatUtils.test.ts b/src/chatUtils.test.ts deleted file mode 100644 index 6d683919..00000000 --- a/src/chatUtils.test.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { test, expect } from 'vitest' -import mcData from 'minecraft-data' -import { formatMessage, isAllowedChatCharacter, isStringAllowed } from './chatUtils' - -//@ts-expect-error -globalThis.loadedData ??= mcData('1.20.1') - -const mapIncludeDefined = (props) => { - return (x) => { - return Object.fromEntries(Object.entries(x).filter(([k, v]) => v !== undefined && props.includes(k))) - } -} - -test('formatMessage', () => { - const result = formatMessage({ - 'json': { - 'translate': 'chat.type.announcement', - 'with': [ - { - 'text': 'Server' - }, - { - 'text': '§cf' - } - ] - }, - 'translate': 'chat.type.announcement', - 'with': [ - { - 'json': { - 'text': 'Server' - }, - 'text': 'Server' - }, - { - 'json': { - 'text': '§cf' - }, - 'text': '§cf' - } - ] - }).map(mapIncludeDefined(['text', 'color'])) - expect(result).toMatchInlineSnapshot(` - [ - { - "text": "[", - }, - { - "text": "Server", - }, - { - "text": "] ", - }, - { - "text": "", - }, - { - "color": "red", - "text": "f", - }, - { - "text": "", - }, - ] - `) -}) - -test('isAllowedChatCharacter', () => { - expect(isAllowedChatCharacter('a')).toBe(true) - expect(isAllowedChatCharacter('a')).toBe(true) - expect(isAllowedChatCharacter('§')).toBe(false) - expect(isAllowedChatCharacter(' ')).toBe(true) - expect(isStringAllowed('a§b')).toMatchObject({ - valid: false, - clean: 'ab', - invalid: ['§'] - }) - expect(isStringAllowed('aツ')).toMatchObject({ - valid: true, - }) - expect(isStringAllowed('a🟢')).toMatchObject({ - valid: true, - }) -}) diff --git a/src/chatUtils.ts b/src/chatUtils.ts deleted file mode 100644 index 849d5847..00000000 --- a/src/chatUtils.ts +++ /dev/null @@ -1,173 +0,0 @@ -// this should actually be moved to mineflayer / renderer - -import { fromFormattedString, TextComponent } from '@xmcl/text-component' -import type { IndexedData } from 'minecraft-data' -import { versionToNumber } from 'renderer/viewer/common/utils' - -export interface MessageFormatOptions { - doShadow?: boolean -} - -export type MessageFormatPart = Pick & { - text: string - color?: string - bold?: boolean - italic?: boolean - underlined?: boolean - strikethrough?: boolean - obfuscated?: boolean -} - -type MessageInput = { - text?: string - translate?: string - with?: Array - color?: string - bold?: boolean - italic?: boolean - underlined?: boolean - strikethrough?: boolean - obfuscated?: boolean - extra?: MessageInput[] - json?: any -} - -const global = globalThis as any - -// todo move to sign-renderer, replace with prismarine-chat, fix mcData issue! -export const formatMessage = (message: MessageInput, mcData: IndexedData = global.loadedData) => { - let msglist: MessageFormatPart[] = [] - - const readMsg = (msg: MessageInput) => { - const styles = { - color: msg.color, - bold: !!msg.bold, - italic: !!msg.italic, - underlined: !!msg.underlined, - strikethrough: !!msg.strikethrough, - obfuscated: !!msg.obfuscated - } - - if (!msg.text && typeof msg.json?.[''] === 'string') msg.text = msg.json[''] - if (msg.text) { - msglist.push({ - ...msg, - text: msg.text, - ...styles - }) - } else if (msg.translate) { - const tText = mcData?.language[msg.translate] ?? msg.translate - - if (msg.with) { - const splitted = tText.split(/%s|%\d+\$s/g) - - let i = 0 - for (const [j, part] of splitted.entries()) { - msglist.push({ text: part, ...styles }) - - if (j + 1 < splitted.length) { - if (msg.with[i]) { - const msgWith = msg.with[i] - if (typeof msgWith === 'string') { - readMsg({ - ...styles, - text: msgWith - }) - } else { - readMsg({ - ...styles, - ...msgWith - }) - } - } - i++ - } - } - } else { - msglist.push({ - ...msg, - text: tText, - ...styles - }) - } - } - - if (msg.extra) { - for (let ex of msg.extra) { - if (typeof ex === 'string') { - ex = { text: ex } - } - readMsg({ ...styles, ...ex }) - } - } - } - - readMsg(message) - - const flat = (msg) => { - return [msg, msg.extra?.flatMap(flat) ?? []] - } - - msglist = msglist.map(msg => { - // normalize § - if (!msg.text.includes?.('§')) return msg - const newMsg = fromFormattedString(msg.text) - return flat(newMsg) - }).flat(Infinity) - - return msglist -} - -export const messageToString = (message: MessageInput | string) => { - if (typeof message === 'string') { - return message - } - const msglist = formatMessage(message) - return msglist.map(msg => msg.text).join('') -} - -const blockToItemRemaps = { - water: 'water_bucket', - lava: 'lava_bucket', - redstone_wire: 'redstone', - tripwire: 'tripwire_hook' -} - -export const getItemFromBlock = (block: import('prismarine-block').Block) => { - const item = global.loadedData.itemsByName[blockToItemRemaps[block.name] ?? block.name] - return item -} - -export function isAllowedChatCharacter (char: string): boolean { - // if (char.length !== 1) { - // throw new Error('Input must be a single character') - // } - - const charCode = char.codePointAt(0)! - return charCode !== 167 && charCode >= 32 && charCode !== 127 -} - -export const isStringAllowed = (str: string) => { - const invalidChars = new Set() - for (const [i, char] of [...str].entries()) { - const isSurrogatePair = str.codePointAt(i) !== str['charCodeAt'](i) - if (isSurrogatePair) continue - - if (!isAllowedChatCharacter(char)) { - invalidChars.add(char) - } - } - - const valid = invalidChars.size === 0 - if (valid) { - return { - valid: true - } - } - - return { - valid, - clean: [...str].filter(c => !invalidChars.has(c)).join(''), - invalid: [...invalidChars] - } -} diff --git a/src/clientMods.ts b/src/clientMods.ts deleted file mode 100644 index 204a5861..00000000 --- a/src/clientMods.ts +++ /dev/null @@ -1,637 +0,0 @@ -/* eslint-disable no-await-in-loop */ -import { openDB } from 'idb' -import * as React from 'react' -import * as valtio from 'valtio' -import * as valtioUtils from 'valtio/utils' -import { gt } from 'semver' -import { proxy } from 'valtio' -import { options } from './optionsStorage' -import { appStorage } from './react/appStorageProvider' -import { showInputsModal, showOptionsModal } from './react/SelectOption' -import { ProgressReporter } from './core/progressReporter' -import { showNotification } from './react/NotificationProvider' - -let sillyProtection = false -const protectRuntime = () => { - if (sillyProtection) return - sillyProtection = true - const sensetiveKeys = new Set(['authenticatedAccounts', 'serversList', 'username']) - const proxy = new Proxy(window.localStorage, { - get (target, prop) { - if (typeof prop === 'string') { - if (sensetiveKeys.has(prop)) { - console.warn(`Access to sensitive key "${prop}" was blocked`) - return null - } - if (prop === 'getItem') { - return (key: string) => { - if (sensetiveKeys.has(key)) { - console.warn(`Access to sensitive key "${key}" via getItem was blocked`) - return null - } - return target.getItem(key) - } - } - if (prop === 'setItem') { - return (key: string, value: string) => { - if (sensetiveKeys.has(key)) { - console.warn(`Attempt to set sensitive key "${key}" via setItem was blocked`) - return - } - target.setItem(key, value) - } - } - if (prop === 'removeItem') { - return (key: string) => { - if (sensetiveKeys.has(key)) { - console.warn(`Attempt to delete sensitive key "${key}" via removeItem was blocked`) - return - } - target.removeItem(key) - } - } - if (prop === 'clear') { - console.warn('Attempt to clear localStorage was blocked') - return () => {} - } - } - return Reflect.get(target, prop) - }, - set (target, prop, value) { - if (typeof prop === 'string' && sensetiveKeys.has(prop)) { - console.warn(`Attempt to set sensitive key "${prop}" was blocked`) - return false - } - return Reflect.set(target, prop, value) - }, - deleteProperty (target, prop) { - if (typeof prop === 'string' && sensetiveKeys.has(prop)) { - console.warn(`Attempt to delete sensitive key "${prop}" was blocked`) - return false - } - return Reflect.deleteProperty(target, prop) - } - }) - Object.defineProperty(window, 'localStorage', { - value: proxy, - writable: false, - configurable: false, - }) -} - -// #region Database -const dbPromise = openDB('mods-db', 1, { - upgrade (db) { - db.createObjectStore('mods', { - keyPath: 'name', - }) - db.createObjectStore('repositories', { - keyPath: 'url', - }) - }, -}) - -export interface ModSetting { - label?: string - type: 'toggle' | 'choice' | 'input' | 'slider' - hidden?: boolean - values?: string[] - inputType?: string - hint?: string - default?: any -} - -export interface ModSettingsDict { - [settingId: string]: ModSetting -} - -export interface ModAction { - method?: string - label?: string - /** @default false */ - gameGlobal?: boolean - /** @default false */ - onlyForeground?: boolean -} - -// mcraft-repo.json -export interface McraftRepoFile { - packages: ClientModDefinition[] - /** @default true */ - prefix?: string | boolean - name?: string // display name - description?: string - mirrorUrls?: string[] - autoUpdateOverride?: boolean - lastUpdated?: number -} -export interface Repository extends McraftRepoFile { - url: string -} - -export interface ClientMod { - name: string; // unique identifier like owner.name - version: string - enabled?: boolean - - scriptMainUnstable?: string; - serverPlugin?: string - // serverPlugins?: string[] - // mesherThread?: string - stylesGlobal?: string - threeJsBackend?: string // three.js - // stylesLocal?: string - - requiresNetwork?: boolean - fullyOffline?: boolean - description?: string - author?: string - section?: string - autoUpdateOverride?: boolean - lastUpdated?: number - wasModifiedLocally?: boolean - // todo depends, hashsum - - settings?: ModSettingsDict - actionsMain?: Record -} - -const cleanupFetchedModData = (mod: ClientModDefinition | Record) => { - delete mod['enabled'] - delete mod['repo'] - delete mod['autoUpdateOverride'] - delete mod['lastUpdated'] - delete mod['wasModifiedLocally'] - return mod -} - -export type ClientModDefinition = Omit & { - scriptMainUnstable?: boolean - stylesGlobal?: boolean - serverPlugin?: boolean - threeJsBackend?: boolean -} - -export async function saveClientModData (data: ClientMod) { - const db = await dbPromise - data.lastUpdated = Date.now() - await db.put('mods', data) - modsReactiveUpdater.counter++ -} - -async function getPlugin (name: string) { - const db = await dbPromise - return db.get('mods', name) as Promise -} - -export async function getAllMods () { - const db = await dbPromise - return db.getAll('mods') as Promise -} - -async function deletePlugin (name) { - const db = await dbPromise - await db.delete('mods', name) - modsReactiveUpdater.counter++ -} - -async function removeAllMods () { - const db = await dbPromise - await db.clear('mods') - modsReactiveUpdater.counter++ -} - -// --- - -async function saveRepository (data: Repository) { - const db = await dbPromise - data.lastUpdated = Date.now() - await db.put('repositories', data) -} - -async function getRepository (url: string) { - const db = await dbPromise - return db.get('repositories', url) as Promise -} - -async function getAllRepositories () { - const db = await dbPromise - return db.getAll('repositories') as Promise -} -window.getAllRepositories = getAllRepositories - -async function deleteRepository (url) { - const db = await dbPromise - await db.delete('repositories', url) -} - -// --- - -// #endregion - -window.mcraft = { - version: process.env.RELEASE_TAG, - build: process.env.BUILD_VERSION, - ui: {}, - React, - valtio: { - ...valtio, - ...valtioUtils, - }, - // openDB -} - -const activateMod = async (mod: ClientMod, reason: string) => { - if (mod.enabled === false) return false - protectRuntime() - console.debug(`Activating mod ${mod.name} (${reason})...`) - window.loadedMods ??= {} - if (window.loadedMods[mod.name]) { - console.warn(`Mod is ${mod.name} already loaded, skipping activation...`) - return false - } - if (mod.stylesGlobal) { - const style = document.createElement('style') - style.textContent = mod.stylesGlobal - style.id = `mod-${mod.name}` - document.head.appendChild(style) - } - if (mod.scriptMainUnstable) { - const blob = new Blob([mod.scriptMainUnstable], { type: 'text/javascript' }) - const url = URL.createObjectURL(blob) - // eslint-disable-next-line no-useless-catch - try { - const module = await import(/* webpackIgnore: true */ url) - module.default?.(structuredClone(mod), { settings: getModSettingsProxy(mod) }) - window.loadedMods[mod.name] ??= {} - window.loadedMods[mod.name].mainUnstableModule = module - } catch (e) { - throw e - } - URL.revokeObjectURL(url) - } - if (mod.threeJsBackend) { - const blob = new Blob([mod.threeJsBackend], { type: 'text/javascript' }) - const url = URL.createObjectURL(blob) - // eslint-disable-next-line no-useless-catch - try { - const module = await import(/* webpackIgnore: true */ url) - // todo - window.loadedMods[mod.name] ??= {} - // for accessing global world var - window.loadedMods[mod.name].threeJsBackendModule = module - } catch (e) { - throw e - } - URL.revokeObjectURL(url) - } - mod.enabled = true - return true -} - -export const appStartup = async () => { - void checkModsUpdates() - - const mods = await getAllMods() - for (const mod of mods) { - await activateMod(mod, 'autostart').catch(e => { - modsErrors[mod.name] ??= [] - modsErrors[mod.name].push(`startup: ${String(e)}`) - console.error(`Error activating mod on startup ${mod.name}:`, e) - }) - } -} - -export const modsUpdateStatus = proxy({} as Record) -export const modsWaitingReloadStatus = proxy({} as Record) -export const modsErrors = proxy({} as Record) - -const normalizeRepoUrl = (url: string) => { - if (url.startsWith('https://')) return url - if (url.startsWith('http://')) return url - if (url.startsWith('//')) return `https:${url}` - return `https://raw.githubusercontent.com/${url}/master` -} - -const installOrUpdateMod = async (repo: Repository, mod: ClientModDefinition, activate = true, progress?: ProgressReporter) => { - // eslint-disable-next-line no-useless-catch - try { - const fetchData = async (urls: string[]) => { - const errored = [] as string[] - // eslint-disable-next-line no-unreachable-loop - for (const urlTemplate of urls) { - const modNameOnly = mod.name.split('.').pop() - const modFolder = repo.prefix === false ? modNameOnly : typeof repo.prefix === 'string' ? `${repo.prefix}/${modNameOnly}` : mod.name - const url = new URL(`${modFolder}/${urlTemplate}`, normalizeRepoUrl(repo.url).replace(/\/$/, '') + '/').href - // eslint-disable-next-line no-useless-catch - try { - const response = await fetch(url) - if (!response.ok) throw new Error(`Failed to fetch ${url}: ${response.status} ${response.statusText}`) - return await response.text() - } catch (e) { - // errored.push(String(e)) - throw e - } - } - console.warn(`[${mod.name}] Error installing component of ${urls[0]}: ${errored.join(', ')}`) - return undefined - } - if (mod.stylesGlobal) { - await progress?.executeWithMessage( - `Downloading ${mod.name} styles`, - async () => { - mod.stylesGlobal = await fetchData(['global.css']) as any - } - ) - } - if (mod.scriptMainUnstable) { - await progress?.executeWithMessage( - `Downloading ${mod.name} script`, - async () => { - mod.scriptMainUnstable = await fetchData(['mainUnstable.js']) as any - } - ) - } - if (mod.threeJsBackend) { - await progress?.executeWithMessage( - `Downloading ${mod.name} three.js backend`, - async () => { - mod.threeJsBackend = await fetchData(['three.js']) as any - } - ) - } - if (mod.serverPlugin) { - if (mod.name.endsWith('.disabled')) throw new Error(`Mod name ${mod.name} can't end with .disabled`) - await progress?.executeWithMessage( - `Downloading ${mod.name} server plugin`, - async () => { - mod.serverPlugin = await fetchData(['serverPlugin.js']) as any - } - ) - } - if (activate) { - // todo try to de-activate mod if it's already loaded - if (window.loadedMods?.[mod.name]) { - modsWaitingReloadStatus[mod.name] = true - } else { - await activateMod(mod as ClientMod, 'install') - } - } - await saveClientModData(mod as ClientMod) - delete modsUpdateStatus[mod.name] - } catch (e) { - // console.error(`Error installing mod ${mod.name}:`, e) - throw e - } -} - -const checkRepositoryUpdates = async (repo: Repository) => { - for (const mod of repo.packages) { - - const modExisting = await getPlugin(mod.name) - if (modExisting?.version && gt(mod.version, modExisting.version)) { - modsUpdateStatus[mod.name] = [modExisting.version, mod.version] - if (options.modsAutoUpdate === 'always' && (!repo.autoUpdateOverride && !modExisting.autoUpdateOverride)) { - void installOrUpdateMod(repo, mod).catch(e => { - console.error(`Error updating mod ${mod.name}:`, e) - }) - } - } - } - -} - -export const fetchRepository = async (urlOriginal: string, url: string, hasMirrors = false) => { - const fetchUrl = normalizeRepoUrl(url).replace(/\/$/, '') + '/mcraft-repo.json' - try { - const response = await fetch(fetchUrl).then(async res => res.json()) - if (!response.packages) throw new Error(`No packages field in the response json of the repository: ${fetchUrl}`) - response.autoUpdateOverride = (await getRepository(urlOriginal))?.autoUpdateOverride - response.url = urlOriginal - void saveRepository(response) - modsReactiveUpdater.counter++ - return true - } catch (e) { - console.warn(`Error fetching repository (trying other mirrors) ${url}:`, e) - return false - } -} - -export const fetchAllRepositories = async () => { - const repositories = await getAllRepositories() - await Promise.all(repositories.map(async (repo) => { - const allUrls = [repo.url, ...(repo.mirrorUrls || [])] - for (const [i, url] of allUrls.entries()) { - const isLast = i === allUrls.length - 1 - - if (await fetchRepository(repo.url, url, !isLast)) break - } - })) - appStorage.modsAutoUpdateLastCheck = Date.now() -} - -const checkModsUpdates = async () => { - await autoRefreshModRepositories() - for (const repo of await getAllRepositories()) { - - await checkRepositoryUpdates(repo) - } -} - -const autoRefreshModRepositories = async () => { - if (options.modsAutoUpdate === 'never') return - const lastCheck = appStorage.modsAutoUpdateLastCheck - if (lastCheck && Date.now() - lastCheck < 1000 * 60 * 60 * options.modsUpdatePeriodCheck) return - await fetchAllRepositories() - // todo think of not updating check timestamp on offline access -} - -export const installModByName = async (repoUrl: string, name: string, progress?: ProgressReporter) => { - progress?.beginStage('main', `Installing ${name}`) - const repo = await getRepository(repoUrl) - if (!repo) throw new Error(`Repository ${repoUrl} not found`) - const mod = repo.packages.find(m => m.name === name) - if (!mod) throw new Error(`Mod ${name} not found in repository ${repoUrl}`) - await installOrUpdateMod(repo, mod, undefined, progress) - progress?.endStage('main') -} - -export const uninstallModAction = async (name: string) => { - const choice = await showOptionsModal(`Uninstall mod ${name}?`, ['Yes']) - if (!choice) return - await deletePlugin(name) - window.loadedMods ??= {} - if (window.loadedMods[name]) { - // window.loadedMods[name].default?.(null) - delete window.loadedMods[name] - modsWaitingReloadStatus[name] = true - } - // Clear any errors associated with the mod - delete modsErrors[name] -} - -export const setEnabledModAction = async (name: string, newEnabled: boolean) => { - const mod = await getPlugin(name) - if (!mod) throw new Error(`Mod ${name} not found`) - if (newEnabled) { - mod.enabled = true - if (!window.loadedMods?.[mod.name]) { - await activateMod(mod, 'manual') - } - } else { - // todo deactivate mod - mod.enabled = false - if (window.loadedMods?.[mod.name]) { - if (window.loadedMods[mod.name]?.threeJsBackendModule) { - window.loadedMods[mod.name].threeJsBackendModule.deactivate() - delete window.loadedMods[mod.name].threeJsBackendModule - } - if (window.loadedMods[mod.name]?.mainUnstableModule) { - window.loadedMods[mod.name].mainUnstableModule.deactivate() - delete window.loadedMods[mod.name].mainUnstableModule - } - - if (Object.keys(window.loadedMods[mod.name]).length === 0) { - delete window.loadedMods[mod.name] - } - } - } - await saveClientModData(mod) -} - -export const modsReactiveUpdater = proxy({ - counter: 0 -}) - -export const getAllModsDisplayList = async () => { - const repos = await getAllRepositories() - const installedMods = await getAllMods() - const modsWithoutRepos = installedMods.filter(mod => !repos.some(repo => repo.packages.some(m => m.name === mod.name))) - const mapMods = (mapMods: ClientMod[]) => mapMods.map(mod => ({ - ...mod, - installed: installedMods.find(m => m.name === mod.name), - activated: !!window.loadedMods?.[mod.name], - installedVersion: installedMods.find(m => m.name === mod.name)?.version, - canBeActivated: mod.scriptMainUnstable || mod.stylesGlobal, - })) - return { - repos: repos.map(repo => ({ - ...repo, - packages: mapMods(repo.packages as ClientMod[]), - })), - modsWithoutRepos: mapMods(modsWithoutRepos), - } -} - -export const removeRepositoryAction = async (url: string) => { - // todo remove mods - const choice = await showOptionsModal('Remove repository? Installed mods wont be automatically removed.', ['Yes']) - if (!choice) return - await deleteRepository(url) - modsReactiveUpdater.counter++ -} - -export const selectAndRemoveRepository = async () => { - const repos = await getAllRepositories() - const choice = await showOptionsModal('Select repository to remove', repos.map(repo => repo.url)) - if (!choice) return - await removeRepositoryAction(choice) -} - -export const addRepositoryAction = async () => { - const { url } = await showInputsModal('Add repository', { - url: { - type: 'text', - label: 'Repository URL or slug', - placeholder: 'github-owner/repo-name', - }, - }) - if (!url) return - await fetchRepository(url, url) -} - -export const getServerPlugin = async (plugin: string) => { - const mod = await getPlugin(plugin) - if (!mod) return null - if (mod.serverPlugin) { - return { - content: mod.serverPlugin, - version: mod.version - } - } - return null -} - -export const getAvailableServerPlugins = async () => { - const mods = await getAllMods() - return mods.filter(mod => mod.serverPlugin) -} - -window.inspectInstalledMods = getAllMods - -type ModifiableField = { - field: string - label: string - language: string - getContent?: () => string -} - -// --- - -export const getAllModsModifiableFields = () => { - const fields: ModifiableField[] = [ - { - field: 'scriptMainUnstable', - label: 'Main Thread Script (unstable)', - language: 'js' - }, - { - field: 'stylesGlobal', - label: 'Global CSS Styles', - language: 'css' - }, - { - field: 'threeJsBackend', - label: 'Three.js Renderer Backend Thread', - language: 'js' - }, - { - field: 'serverPlugin', - label: 'Built-in server plugin', - language: 'js' - } - ] - return fields -} - -export const getModModifiableFields = (mod: ClientMod): ModifiableField[] => { - return getAllModsModifiableFields().filter(field => mod[field.field]) -} - -export const getModSettingsProxy = (mod: ClientMod) => { - if (!mod.settings) return valtio.proxy({}) - - const proxy = valtio.proxy({}) - for (const [key, setting] of Object.entries(mod.settings)) { - proxy[key] = options[`mod-${mod.name}-${key}`] ?? setting.default - } - - valtio.subscribe(proxy, (ops) => { - for (const op of ops) { - const [type, path, value] = op - const key = path[0] as string - options[`mod-${mod.name}-${key}`] = value - } - }) - - return proxy -} - -export const callMethodAction = async (modName: string, type: 'main', method: string) => { - try { - const mod = window.loadedMods?.[modName] - await mod[method]() - } catch (err) { - showNotification(`Failed to execute ${method}`, `Problem in ${type} js script of ${modName}`, true) - } -} diff --git a/src/connect.ts b/src/connect.ts deleted file mode 100644 index cb6b8f65..00000000 --- a/src/connect.ts +++ /dev/null @@ -1,96 +0,0 @@ -// import { versionsByMinecraftVersion } from 'minecraft-data' -// import minecraftInitialDataJson from '../generated/minecraft-initial-data.json' -import MinecraftData from 'minecraft-data' -import PrismarineBlock from 'prismarine-block' -import PrismarineItem from 'prismarine-item' -import { miscUiState } from './globalState' -import supportedVersions from './supportedVersions.mjs' -import { options } from './optionsStorage' -import { downloadSoundsIfNeeded } from './sounds/botSoundSystem' -import { AuthenticatedAccount } from './react/serversStorage' - -export type ConnectOptions = { - server?: string - singleplayer?: any - username: string - proxy?: string - botVersion?: string - serverOverrides? - serverOverridesFlat? - peerId?: string - ignoreQs?: boolean - onSuccessfulPlay?: () => void - serverIndex?: string - authenticatedAccount?: AuthenticatedAccount | true - peerOptions?: any - viewerWsConnect?: string - saveServerToHistory?: boolean - - /** Will enable local replay server */ - worldStateFileContents?: string - - connectEvents?: { - serverCreated?: () => void - // connect: () => void; - // disconnect: () => void; - // error: (err: any) => void; - // ready: () => void; - // end: () => void; - } -} - -export const getVersionAutoSelect = (autoVersionSelect = options.serversAutoVersionSelect) => { - if (autoVersionSelect === 'auto') { - return '1.19.4' - } - if (autoVersionSelect === 'latest') { - return supportedVersions.at(-1)! - } - return autoVersionSelect -} - -export const loadMinecraftData = async (version: string) => { - await window._LOAD_MC_DATA() - // setLoadingScreenStatus(`Loading data for ${version}`) - // // todo expose cache - // // const initialDataVersion = Object.keys(minecraftInitialDataJson)[0]! - // // if (version === initialDataVersion) { - // // // ignore cache hit - // // versionsByMinecraftVersion.pc[initialDataVersion]!.dataVersion!++ - // // } - - const mcData = MinecraftData(version) - window.PrismarineBlock = PrismarineBlock(mcData.version.minecraftVersion!) - window.PrismarineItem = PrismarineItem(mcData.version.minecraftVersion!) - window.loadedData = mcData - window.mcData = mcData - miscUiState.loadedDataVersion = version -} - -export type AssetDownloadReporter = (asset: string, isDone: boolean) => void - -export const downloadAllMinecraftData = async (reporter?: AssetDownloadReporter) => { - reporter?.('mc-data', false) - await window._LOAD_MC_DATA() - reporter?.('mc-data', true) -} - -const loadFonts = async () => { - const FONT_FAMILY = 'mojangles' - if (!document.fonts.check(`1em ${FONT_FAMILY}`)) { - // todo instead re-render signs on load - await document.fonts.load(`1em ${FONT_FAMILY}`).catch(() => { - console.error('Failed to load font, signs wont be rendered correctly') - }) - } -} - -export const downloadOtherGameData = async (reporter?: AssetDownloadReporter) => { - reporter?.('fonts', false) - reporter?.('sounds', false) - - await Promise.all([ - loadFonts().then(() => reporter?.('fonts', true)), - downloadSoundsIfNeeded().then(() => reporter?.('sounds', true)) - ]) -} diff --git a/src/controls.ts b/src/controls.ts deleted file mode 100644 index db6a6fc6..00000000 --- a/src/controls.ts +++ /dev/null @@ -1,1051 +0,0 @@ -//@ts-check - -import { Vec3 } from 'vec3' -import { proxy, subscribe } from 'valtio' - -import { ControMax } from 'contro-max/build/controMax' -import { CommandEventArgument, SchemaCommandInput } from 'contro-max/build/types' -import { stringStartsWith } from 'contro-max/build/stringUtils' -import { GameMode } from 'mineflayer' -import { getThreeJsRendererMethods } from 'renderer/viewer/three/threeJsMethods' -import { isGameActive, showModal, gameAdditionalState, activeModalStack, hideCurrentModal, miscUiState, hideModal, hideAllModals } from './globalState' -import { goFullscreen, isInRealGameSession, pointerLock, reloadChunks } from './utils' -import { options } from './optionsStorage' -import { openPlayerInventory } from './inventoryWindows' -import { chatInputValueGlobal } from './react/Chat' -import { fsState } from './loadSave' -import { customCommandsConfig } from './customCommands' -import type { CustomCommand } from './react/KeybindingsCustom' -import { showOptionsModal } from './react/SelectOption' -import widgets from './react/widgets' -import { getItemFromBlock } from './chatUtils' -import { gamepadUiCursorState, moveGamepadCursorByPx } from './react/GamepadUiCursor' -import { completeResourcepackPackInstall, copyServerResourcePackToRegular, resourcePackState } from './resourcePack' -import { showNotification } from './react/NotificationProvider' -import { lastConnectOptions } from './react/AppStatusProvider' -import { onCameraMove, onControInit } from './cameraRotationControls' -import { createNotificationProgressReporter } from './core/progressReporter' -import { appStorage } from './react/appStorageProvider' -import { switchGameMode } from './packetsReplay/replayPackets' -import { tabListState } from './react/PlayerListOverlayProvider' -import { type ActionType, type ActionHoldConfig, type CustomAction } from './appConfig' -import { playerState } from './mineflayer/playerState' - -export const customKeymaps = proxy(appStorage.keybindings) -subscribe(customKeymaps, () => { - appStorage.keybindings = customKeymaps -}) - -const controlOptions = { - preventDefault: true -} - -export const contro = new ControMax({ - commands: { - general: { - // movement - jump: ['Space', 'A'], - inventory: ['KeyE', 'X'], - drop: ['KeyQ', 'B'], - dropStack: [null], - sneak: ['ShiftLeft'], - toggleSneakOrDown: [null, 'Right Stick'], - sprint: ['ControlLeft', 'Left Stick'], - // game interactions - nextHotbarSlot: [null, 'Right Bumper'], - prevHotbarSlot: [null, 'Left Bumper'], - attackDestroy: [null, 'Right Trigger'], - interactPlace: [null, 'Left Trigger'], - swapHands: ['KeyF'], - selectItem: ['KeyH'], - rotateCameraLeft: [null], - rotateCameraRight: [null], - rotateCameraUp: [null], - rotateCameraDown: [null], - // ui? - chat: [['KeyT', 'Enter']], - command: ['Slash'], - playersList: ['Tab'], - debugOverlay: ['F3'], - debugOverlayHelpMenu: [null], - // client side - zoom: ['KeyC'], - viewerConsole: ['Backquote'], - togglePerspective: ['F5'], - }, - ui: { - toggleFullscreen: ['F11'], - back: [null/* 'Escape' */, 'B'], - toggleMap: ['KeyJ'], - leftClick: [null, 'A'], - rightClick: [null, 'Y'], - speedupCursor: [null, 'Left Stick'], - pauseMenu: [null, 'Start'] - }, - communication: { - toggleMicrophone: ['KeyM'], - }, - advanced: { - lockUrl: ['KeyY'], - }, - custom: {} as Record, - // waila: { - // showLookingBlockRecipe: ['Numpad3'], - // showLookingBlockUsages: ['Numpad4'] - // } - } satisfies Record>, - movementKeymap: 'WASD', - movementVector: '2d', - groupedCommands: { - general: { - switchSlot: ['Digits', []] - } - }, -}, { - defaultControlOptions: controlOptions, - target: document, - captureEvents () { - return true - }, - storeProvider: { - load: () => customKeymaps, - save () { }, - }, - gamepadPollingInterval: 10 -}) -window.controMax = contro -export type Command = CommandEventArgument['command'] - -export const isCommandDisabled = (command: Command) => { - return miscUiState.appConfig?.disabledCommands?.includes(command) -} - -onControInit() - -updateBinds(customKeymaps) - -const updateDoPreventDefault = () => { - controlOptions.preventDefault = miscUiState.gameLoaded && !activeModalStack.length -} - -subscribe(miscUiState, updateDoPreventDefault) -subscribe(activeModalStack, updateDoPreventDefault) -updateDoPreventDefault() - -const setSprinting = (state: boolean) => { - bot.setControlState('sprint', state) - gameAdditionalState.isSprinting = state -} - -const isSpectatingEntity = () => { - return appViewer.playerState.utils.isSpectatingEntity() -} - -contro.on('movementUpdate', ({ vector, soleVector, gamepadIndex }) => { - // Don't allow movement while spectating an entity - if (isSpectatingEntity()) return - - if (gamepadIndex !== undefined && gamepadUiCursorState.display) { - const deadzone = 0.1 // TODO make deadzone configurable - if (Math.abs(soleVector.x) < deadzone && Math.abs(soleVector.z) < deadzone) { - return - } - moveGamepadCursorByPx(soleVector.x, true) - moveGamepadCursorByPx(soleVector.z, false) - emitMousemove() - } - miscUiState.usingGamepadInput = gamepadIndex !== undefined - if (!bot || !isGameActive(false)) return - - // if (viewer.world.freeFlyMode) { - // // Create movement vector from input - // const direction = new THREE.Vector3(0, 0, 0) - // if (vector.z !== undefined) direction.z = vector.z - // if (vector.x !== undefined) direction.x = vector.x - - // // Apply camera rotation to movement direction - // direction.applyQuaternion(viewer.camera.quaternion) - - // // Update freeFlyState position with normalized direction - // const moveSpeed = 1 - // direction.multiplyScalar(moveSpeed) - // viewer.world.freeFlyState.position.add(new Vec3(direction.x, direction.y, direction.z)) - // return - // } - - // gamepadIndex will be used for splitscreen in future - const coordToAction = [ - ['z', -1, 'forward'], - ['z', 1, 'back'], - ['x', -1, 'left'], - ['x', 1, 'right'], - ] as const - - const newState: Partial = {} - for (const [coord, v] of Object.entries(vector)) { - if (v === undefined || Math.abs(v) < 0.3) continue - // todo use raw values eg for slow movement - const mappedValue = v < 0 ? -1 : 1 - // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain - const foundAction = coordToAction.find(([c, mapV]) => c === coord && mapV === mappedValue)?.[2]! - newState[foundAction] = true - } - - for (const key of ['forward', 'back', 'left', 'right'] as const) { - if (newState[key] === bot.controlState[key]) continue - const action = !!newState[key] - if (action && !isGameActive(true)) continue - bot.setControlState(key, action) - - if (key === 'forward') { - // todo workaround: need to refactor - if (action) { - void contro.emit('trigger', { command: 'general.forward' } as any) - } else { - void contro.emit('release', { command: 'general.forward' } as any) - setSprinting(false) - } - } - } -}) - -let lastCommandTrigger = null as { command: string, time: number } | null - -const secondActionActivationTimeout = 300 -const secondActionCommands = { - 'general.jump' () { - // if (bot.game.gameMode === 'spectator') return - toggleFly() - }, - 'general.forward' () { - setSprinting(true) - } -} - -// detect pause open, as ANY keyup event is not fired when you exit pointer lock (esc) -subscribe(activeModalStack, () => { - if (activeModalStack.length) { - // iterate over pressedKeys - for (const key of contro.pressedKeys) { - contro.pressedKeyOrButtonChanged({ code: key }, false) - } - } -}) - -const emitMousemove = () => { - const { x, y } = gamepadUiCursorState - const xAbs = x / 100 * window.innerWidth - const yAbs = y / 100 * window.innerHeight - const element = document.elementFromPoint(xAbs, yAbs) as HTMLElement | null - if (!element) return - element.dispatchEvent(new MouseEvent('mousemove', { - clientX: xAbs, - clientY: yAbs - })) -} - -let lastClickedEl = null as HTMLElement | null -let lastClickedElTimeout: ReturnType | undefined -const inModalCommand = (command: Command, pressed: boolean) => { - if (pressed && !gamepadUiCursorState.display) return - - if (pressed) { - if (command === 'ui.back') { - hideCurrentModal() - } - if (command === 'ui.pauseMenu') { - // hide all modals - hideAllModals() - } - if (command === 'ui.leftClick' || command === 'ui.rightClick') { - // in percent - const { x, y } = gamepadUiCursorState - const xAbs = x / 100 * window.innerWidth - const yAbs = y / 100 * window.innerHeight - const el = document.elementFromPoint(xAbs, yAbs) as HTMLElement - if (el) { - if (el === lastClickedEl && command === 'ui.leftClick') { - el.dispatchEvent(new MouseEvent('dblclick', { - bubbles: true, - clientX: xAbs, - clientY: yAbs - })) - return - } - el.dispatchEvent(new MouseEvent('mousedown', { - button: command === 'ui.leftClick' ? 0 : 2, - bubbles: true, - clientX: xAbs, - clientY: yAbs - })) - el.dispatchEvent(new MouseEvent(command === 'ui.leftClick' ? 'click' : 'contextmenu', { - bubbles: true, - clientX: xAbs, - clientY: yAbs - })) - el.dispatchEvent(new MouseEvent('mouseup', { - button: command === 'ui.leftClick' ? 0 : 2, - bubbles: true, - clientX: xAbs, - clientY: yAbs - })) - el.focus() - lastClickedEl = el - if (lastClickedElTimeout) clearTimeout(lastClickedElTimeout) - lastClickedElTimeout = setTimeout(() => { - lastClickedEl = null - }, 500) - } - } - } - - if (command === 'ui.speedupCursor') { - gamepadUiCursorState.multiply = pressed ? 2 : 1 - } -} - -// Camera rotation controls -const cameraRotationControls = { - activeDirections: new Set<'left' | 'right' | 'up' | 'down'>(), - interval: null as ReturnType | null, - config: { - speed: 1, // movement per interval - interval: 5 // ms between movements - }, - movements: { - left: { movementX: -0.5, movementY: 0 }, - right: { movementX: 0.5, movementY: 0 }, - up: { movementX: 0, movementY: -0.5 }, - down: { movementX: 0, movementY: 0.5 } - }, - updateMovement () { - if (cameraRotationControls.activeDirections.size === 0) { - if (cameraRotationControls.interval) { - clearInterval(cameraRotationControls.interval) - cameraRotationControls.interval = null - } - return - } - - if (!cameraRotationControls.interval) { - cameraRotationControls.interval = setInterval(() => { - // Combine all active movements - const movement = { movementX: 0, movementY: 0 } - for (const direction of cameraRotationControls.activeDirections) { - movement.movementX += cameraRotationControls.movements[direction].movementX - movement.movementY += cameraRotationControls.movements[direction].movementY - } - - onCameraMove({ - ...movement, - type: 'keyboardRotation', - stopPropagation () {} - }) - }, cameraRotationControls.config.interval) - } - }, - start (direction: 'left' | 'right' | 'up' | 'down') { - cameraRotationControls.activeDirections.add(direction) - cameraRotationControls.updateMovement() - }, - stop (direction: 'left' | 'right' | 'up' | 'down') { - cameraRotationControls.activeDirections.delete(direction) - cameraRotationControls.updateMovement() - }, - handleCommand (command: string, pressed: boolean) { - // Don't allow movement while spectating an entity - if (isSpectatingEntity()) return - - const directionMap = { - 'general.rotateCameraLeft': 'left', - 'general.rotateCameraRight': 'right', - 'general.rotateCameraUp': 'up', - 'general.rotateCameraDown': 'down' - } as const - - const direction = directionMap[command] - if (direction) { - if (pressed) cameraRotationControls.start(direction) - else cameraRotationControls.stop(direction) - return true - } - return false - } -} -window.cameraRotationControls = cameraRotationControls - -const setSneaking = (state: boolean) => { - gameAdditionalState.isSneaking = state - bot.setControlState('sneak', state) - -} - -const onTriggerOrReleased = (command: Command, pressed: boolean) => { - // always allow release! - if (!bot || !isGameActive(false)) return - if (stringStartsWith(command, 'general')) { - // handle general commands - // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check - switch (command) { - case 'general.jump': - if (isSpectatingEntity()) break - // if (viewer.world.freeFlyMode) { - // const moveSpeed = 0.5 - // viewer.world.freeFlyState.position.add(new Vec3(0, pressed ? moveSpeed : 0, 0)) - // } else { - bot.setControlState('jump', pressed) - // } - break - case 'general.sneak': - // if (viewer.world.freeFlyMode) { - // const moveSpeed = 0.5 - // viewer.world.freeFlyState.position.add(new Vec3(0, pressed ? -moveSpeed : 0, 0)) - // } else { - setSneaking(pressed) - // } - break - case 'general.sprint': - // todo add setting to change behavior - if (pressed) { - setSprinting(pressed) - } - break - case 'general.toggleSneakOrDown': - if (gameAdditionalState.isFlying) { - setSneaking(pressed) - } else if (pressed) { - setSneaking(!gameAdditionalState.isSneaking) - } - break - case 'general.attackDestroy': - document.dispatchEvent(new MouseEvent(pressed ? 'mousedown' : 'mouseup', { button: 0 })) - break - case 'general.interactPlace': - document.dispatchEvent(new MouseEvent(pressed ? 'mousedown' : 'mouseup', { button: 2 })) - break - case 'general.zoom': - gameAdditionalState.isZooming = pressed - break - case 'general.debugOverlay': - if (pressed) { - miscUiState.showDebugHud = !miscUiState.showDebugHud - } - break - case 'general.debugOverlayHelpMenu': - if (pressed) { - void onF3LongPress() - } - break - case 'general.rotateCameraLeft': - case 'general.rotateCameraRight': - case 'general.rotateCameraUp': - case 'general.rotateCameraDown': - cameraRotationControls.handleCommand(command, pressed) - break - case 'general.playersList': - tabListState.isOpen = pressed - break - case 'general.viewerConsole': - if (lastConnectOptions.value?.viewerWsConnect) { - showModal({ reactType: 'console' }) - } - break - case 'general.togglePerspective': - if (pressed) { - const currentPerspective = playerState.reactive.perspective - // eslint-disable-next-line sonarjs/no-nested-switch - switch (currentPerspective) { - case 'first_person': - playerState.reactive.perspective = 'third_person_back' - break - case 'third_person_back': - playerState.reactive.perspective = 'third_person_front' - break - case 'third_person_front': - playerState.reactive.perspective = 'first_person' - break - } - } - break - } - } else if (stringStartsWith(command, 'ui')) { - switch (command) { - case 'ui.pauseMenu': - if (pressed) { - if (activeModalStack.length) { - hideCurrentModal() - } else { - showModal({ reactType: 'pause-screen' }) - } - } - break - case 'ui.back': - case 'ui.toggleFullscreen': - case 'ui.toggleMap': - case 'ui.leftClick': - case 'ui.rightClick': - case 'ui.speedupCursor': - // These are handled elsewhere - break - } - } -} - -// im still not sure, maybe need to refactor to handle in inventory instead -const alwaysPressedHandledCommand = (command: Command) => { - inModalCommand(command, true) - // triggered even outside of the game - if (command === 'general.inventory') { - if (activeModalStack.at(-1)?.reactType?.startsWith?.('player_win:')) { // todo? - hideCurrentModal() - } - } - if (command === 'advanced.lockUrl') { - lockUrl() - } - if (command === 'communication.toggleMicrophone') { - toggleMicrophoneMuted?.() - } -} - -export function lockUrl () { - let newQs = '' - if (fsState.saveLoaded && fsState.inMemorySave) { - const worldFolder = fsState.inMemorySavePath - const save = worldFolder.split('/').at(-1) - newQs = `loadSave=${save}` - } else if (process.env.NODE_ENV === 'development') { - newQs = `reconnect=1` - } else if (lastConnectOptions.value?.server) { - const qs = new URLSearchParams() - const { server, botVersion, proxy, username } = lastConnectOptions.value - qs.set('ip', server) - if (botVersion) qs.set('version', botVersion) - if (proxy) qs.set('proxy', proxy) - if (username) qs.set('username', username) - newQs = String(qs.toString()) - } - - if (newQs) { - window.history.replaceState({}, '', `${window.location.pathname}?${newQs}`) - } -} - -function cycleHotbarSlot (dir: 1 | -1) { - const newHotbarSlot = (bot.quickBarSlot + dir + 9) % 9 - bot.setQuickBarSlot(newHotbarSlot) -} - -// custom commands handler -const customCommandsHandler = ({ command }) => { - const [section, name] = command.split('.') - if (!isGameActive(true) || section !== 'custom') return - - if (contro.userConfig?.custom) { - customCommandsConfig[(contro.userConfig.custom[name] as CustomCommand).type].handler((contro.userConfig.custom[name] as CustomCommand).inputs) - } -} -contro.on('trigger', customCommandsHandler) - -contro.on('trigger', ({ command }) => { - if (isCommandDisabled(command)) return - - const willContinue = !isGameActive(true) - alwaysPressedHandledCommand(command) - if (willContinue) return - - const secondActionCommand = secondActionCommands[command] - if (secondActionCommand) { - if (command === lastCommandTrigger?.command && Date.now() - lastCommandTrigger.time < secondActionActivationTimeout) { - const commandToTrigger = secondActionCommands[lastCommandTrigger.command] - commandToTrigger() - lastCommandTrigger = null - } else { - lastCommandTrigger = { - command, - time: Date.now(), - } - } - } - - onTriggerOrReleased(command, true) - - if (stringStartsWith(command, 'general')) { - switch (command) { - case 'general.jump': - case 'general.sneak': - case 'general.toggleSneakOrDown': - case 'general.sprint': - case 'general.attackDestroy': - case 'general.rotateCameraLeft': - case 'general.rotateCameraRight': - case 'general.rotateCameraUp': - case 'general.rotateCameraDown': - case 'general.debugOverlay': - case 'general.debugOverlayHelpMenu': - case 'general.playersList': - case 'general.togglePerspective': - // no-op - break - case 'general.swapHands': { - if (isSpectatingEntity()) break - bot._client.write('block_dig', { - 'status': 6, - 'location': { - 'x': 0, - 'z': 0, - 'y': 0 - }, - 'face': 0, - }) - break - } - case 'general.interactPlace': - // handled in onTriggerOrReleased - break - case 'general.inventory': - if (isSpectatingEntity()) break - document.exitPointerLock?.() - openPlayerInventory() - break - case 'general.drop': { - if (isSpectatingEntity()) break - // protocol 1.9+ - bot._client.write('block_dig', { - 'status': 4, - 'location': { - 'x': 0, - 'z': 0, - 'y': 0 - }, - 'face': 0, - sequence: 0 - }) - const slot = bot.inventory.hotbarStart + bot.quickBarSlot - const item = bot.inventory.slots[slot] - if (item) { - item.count-- - bot.inventory.updateSlot(slot, item.count > 0 ? item : null!) - } - break - } - case 'general.dropStack': { - if (bot.heldItem) { - void bot.tossStack(bot.heldItem) - } - break - } - case 'general.chat': - showModal({ reactType: 'chat' }) - break - case 'general.command': - chatInputValueGlobal.value = '/' - showModal({ reactType: 'chat' }) - break - case 'general.selectItem': - if (isSpectatingEntity()) break - void selectItem() - break - case 'general.nextHotbarSlot': - if (isSpectatingEntity()) break - cycleHotbarSlot(1) - break - case 'general.prevHotbarSlot': - if (isSpectatingEntity()) break - cycleHotbarSlot(-1) - break - case 'general.zoom': - break - case 'general.viewerConsole': - if (lastConnectOptions.value?.viewerWsConnect) { - showModal({ reactType: 'console' }) - } - break - } - } - - if (command === 'ui.toggleFullscreen') { - void goFullscreen(true) - } -}) - -// show-hide Fullmap -contro.on('trigger', ({ command }) => { - if (command !== 'ui.toggleMap') return - const isActive = isGameActive(true) - if (activeModalStack.at(-1)?.reactType === 'full-map') { - miscUiState.displayFullmap = false - hideModal({ reactType: 'full-map' }) - } else if (isActive && !activeModalStack.length) { - miscUiState.displayFullmap = true - showModal({ reactType: 'full-map' }) - } -}) - -contro.on('release', ({ command }) => { - if (isCommandDisabled(command)) return - - inModalCommand(command, false) - onTriggerOrReleased(command, false) -}) - -// hard-coded keybindings - -export const f3Keybinds: Array<{ - key?: string, - action: () => void | Promise, - mobileTitle: string - enabled?: () => boolean -}> = [ - { - key: 'KeyA', - action () { - //@ts-expect-error - const loadedChunks = Object.entries(worldView.loadedChunks).filter(([, v]) => v).map(([key]) => key.split(',').map(Number)) - for (const [x, z] of loadedChunks) { - worldView!.unloadChunk({ x, z }) - } - // for (const child of viewer.scene.children) { - // if (child.name === 'chunk') { // should not happen - // viewer.scene.remove(child) - // console.warn('forcefully removed chunk from scene') - // } - // } - if (localServer) { - //@ts-expect-error not sure why it is private... maybe revisit api? - localServer.players[0].world.columns = {} - } - void reloadChunks() - if (appViewer.backend?.backendMethods && typeof appViewer.backend.backendMethods.reloadWorld === 'function') { - appViewer.backend.backendMethods.reloadWorld() - } - }, - mobileTitle: 'Reload chunks', - }, - { - key: 'KeyG', - action () { - options.showChunkBorders = !options.showChunkBorders - }, - mobileTitle: 'Toggle chunk borders', - }, - { - key: 'KeyH', - action () { - showModal({ reactType: 'chunks-debug' }) - }, - mobileTitle: 'Show Chunks Debug', - }, - { - action () { - showModal({ reactType: 'renderer-debug' }) - }, - mobileTitle: 'Renderer Debug Menu', - }, - { - key: 'KeyY', - async action () { - // waypoints - const widgetNames = widgets.map(widget => widget.name) - const widget = await showOptionsModal('Open Widget', widgetNames) - if (!widget) return - showModal({ reactType: `widget-${widget}` }) - }, - mobileTitle: 'Open Widget' - }, - { - key: 'KeyT', - async action () { - // TODO! - if (resourcePackState.resourcePackInstalled || gameAdditionalState.usingServerResourcePack) { - showNotification('Reloading textures...') - await completeResourcepackPackInstall('default', 'default', gameAdditionalState.usingServerResourcePack, createNotificationProgressReporter()) - } - }, - mobileTitle: 'Reload Textures' - }, - { - key: 'F4', - async action () { - let nextGameMode: GameMode - switch (bot.game.gameMode) { - case 'creative': { - nextGameMode = 'survival' - - break - } - case 'survival': { - nextGameMode = 'adventure' - - break - } - case 'adventure': { - nextGameMode = 'spectator' - - break - } - case 'spectator': { - nextGameMode = 'creative' - - break - } - // No default - } - if (lastConnectOptions.value?.worldStateFileContents) { - switchGameMode(nextGameMode) - } else { - bot.chat(`/gamemode ${nextGameMode}`) - } - }, - mobileTitle: 'Cycle Game Mode' - }, - { - key: 'KeyP', - async action () { - const { uuid, ping: playerPing, username } = bot.player - const proxyPing = await bot['pingProxy']() - void showOptionsModal(`${username}: last known total latency (ping): ${playerPing}. Connected to ${lastConnectOptions.value?.proxy} with current ping ${proxyPing}. Player UUID: ${uuid}`, []) - }, - mobileTitle: 'Show Player & Ping Details', - enabled: () => !lastConnectOptions.value?.singleplayer && !!bot.player - }, - { - action () { - void copyServerResourcePackToRegular() - }, - mobileTitle: 'Copy Server Resource Pack', - enabled: () => !!gameAdditionalState.usingServerResourcePack - } -] - -export const reloadChunksAction = () => { - const action = f3Keybinds.find(f3Keybind => f3Keybind.key === 'KeyA') - void action!.action() -} - -document.addEventListener('keydown', (e) => { - if (!isGameActive(false)) return - if (contro.pressedKeys.has('F3')) { - const keybind = f3Keybinds.find((v) => v.key === e.code) - if (keybind && (keybind.enabled?.() ?? true)) { - void keybind.action() - e.stopPropagation() - } - } -}, { - capture: true, -}) - -const isFlying = () => (bot.entity as any).flying - -const startFlying = (sendAbilities = true) => { - if (sendAbilities) { - bot._client.write('abilities', { - flags: 2, - }) - } - (bot.entity as any).flying = true -} - -const endFlying = (sendAbilities = true) => { - if (!isFlying()) return - if (sendAbilities) { - bot._client.write('abilities', { - flags: 0, - }) - } - (bot.entity as any).flying = false -} - -export const onBotCreate = () => { -} - -const toggleFly = (newState = !isFlying(), sendAbilities?: boolean) => { - if (!bot.entity.canFly) return - - if (newState) { - startFlying(sendAbilities) - } else { - endFlying(sendAbilities) - } - gameAdditionalState.isFlying = isFlying() -} - -const selectItem = async () => { - const block = bot.blockAtCursor(5) - if (!block) return - const itemId = getItemFromBlock(block)?.id - if (!itemId) return - const Item = require('prismarine-item')(bot.version) - const item = new Item(itemId, 1, 0) - await bot.creative.setInventorySlot(bot.inventory.hotbarStart + bot.quickBarSlot, item) - bot.updateHeldItem() -} - -addEventListener('mousedown', async (e) => { - // always prevent default for side buttons (back / forward navigation) - if (e.button === 3 || e.button === 4) { - e.preventDefault() - } - - if ((e.target as HTMLElement).matches?.('#VRButton')) return - if (!isInRealGameSession() && !(e.target as HTMLElement).id.includes('ui-root')) return - void pointerLock.requestPointerLock() - if (!bot) return - getThreeJsRendererMethods()?.onPageInteraction() - // wheel click - // todo support ctrl+wheel (+nbt) - if (e.button === 1) { - await selectItem() - } -}) - -window.addEventListener('keydown', (e) => { - if (e.code !== 'Escape') return - if (!activeModalStack.length) { - getThreeJsRendererMethods()?.onPageInteraction() - } - - if (activeModalStack.length) { - const hideAll = e.ctrlKey || e.metaKey - if (hideAll) { - hideAllModals() - } else { - hideCurrentModal() - } - if (activeModalStack.length === 0) { - getThreeJsRendererMethods()?.onPageInteraction() - pointerLock.justHitEscape = true - } - } else if (pointerLock.hasPointerLock) { - document.exitPointerLock?.() - if (options.autoExitFullscreen) { - void document.exitFullscreen() - } - } else { - document.dispatchEvent(new Event('pointerlockchange')) - } -}) - -window.addEventListener('keydown', (e) => { - if (e.code !== 'F2' || e.repeat || !isGameActive(true)) return - e.preventDefault() - const canvas = document.getElementById('viewer-canvas') as HTMLCanvasElement - if (!canvas) return - const link = document.createElement('a') - link.href = canvas.toDataURL('image/png') - const date = new Date() - link.download = `screenshot ${date.toLocaleString().replaceAll('.', '-').replace(',', '')}.png` - link.click() -}) - -window.addEventListener('keydown', (e) => { - if (e.code !== 'F1' || e.repeat || !isGameActive(true)) return - e.preventDefault() - miscUiState.showUI = !miscUiState.showUI -}) - -// #region experimental debug things -window.addEventListener('keydown', (e) => { - if (e.code === 'KeyL' && e.altKey && !e.shiftKey && !e.ctrlKey && !e.metaKey) { - console.clear() - } - if (e.code === 'KeyK' && e.altKey && e.shiftKey && !e.ctrlKey && !e.metaKey) { - if (sessionStorage.delayLoadUntilFocus) { - sessionStorage.removeItem('delayLoadUntilFocus') - } else { - sessionStorage.setItem('delayLoadUntilFocus', 'true') - } - } - if (e.code === 'KeyK' && e.altKey && !e.shiftKey && !e.ctrlKey && !e.metaKey) { - // eslint-disable-next-line no-debugger - debugger - } -}) -// #endregion - -export function updateBinds (commands: any) { - contro.inputSchema.commands.custom = Object.fromEntries(Object.entries(commands?.custom ?? {}).map(([key, value]) => { - return [key, { - keys: [], - gamepad: [], - type: '', - inputs: [] - }] - })) - - for (const [group, actions] of Object.entries(commands)) { - contro.userConfig![group] = Object.fromEntries(Object.entries(actions).map(([key, value]) => { - const newValue = { - keys: value?.keys ?? undefined, - gamepad: value?.gamepad ?? undefined, - } - - if (group === 'custom') { - newValue['type'] = (value).type - newValue['inputs'] = (value).inputs - } - - return [key, newValue] - })) - } -} - -export const onF3LongPress = async () => { - const actions = f3Keybinds.filter(f3Keybind => { - return f3Keybind.mobileTitle && (f3Keybind.enabled?.() ?? true) - }) - const actionNames = actions.map(f3Keybind => { - return `${f3Keybind.mobileTitle}${f3Keybind.key ? ` (F3+${f3Keybind.key})` : ''}` - }) - const select = await showOptionsModal('', actionNames) - if (!select) return - const actionIndex = actionNames.indexOf(select) - const f3Keybind = actions[actionIndex]! - void f3Keybind.action() -} - -export const handleMobileButtonCustomAction = (action: CustomAction) => { - const handler = customCommandsConfig[action.type]?.handler - if (handler) { - handler([...action.input]) - } -} - -export const triggerCommand = (command: Command, isDown: boolean) => { - handleMobileButtonActionCommand(command, isDown) -} - -export const handleMobileButtonActionCommand = (command: ActionType | ActionHoldConfig, isDown: boolean) => { - const commandValue = typeof command === 'string' ? command : 'command' in command ? command.command : command - - // Check if command is disabled before proceeding - if (typeof commandValue === 'string' && isCommandDisabled(commandValue as Command)) return - - if (typeof commandValue === 'string' && !stringStartsWith(commandValue, 'custom')) { - const event: CommandEventArgument = { - command: commandValue as Command, - schema: { - keys: [], - gamepad: [] - } - } - if (isDown) { - contro.emit('trigger', event) - } else { - contro.emit('release', event) - } - } else if (typeof commandValue === 'object') { - if (isDown) { - handleMobileButtonCustomAction(commandValue) - } - } -} - -export const handleMobileButtonLongPress = (actionHold: ActionHoldConfig) => { - if (typeof actionHold.longPressAction === 'string' && actionHold.longPressAction === 'general.debugOverlayHelpMenu') { - void onF3LongPress() - } else if (actionHold.longPressAction) { - handleMobileButtonActionCommand(actionHold.longPressAction, true) - } -} diff --git a/src/core/ideChannels.ts b/src/core/ideChannels.ts deleted file mode 100644 index a9c517f7..00000000 --- a/src/core/ideChannels.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { proxy } from 'valtio' - -export const ideState = proxy({ - id: '', - contents: '', - line: 0, - column: 0, - language: 'typescript', - title: '', -}) -globalThis.ideState = ideState - -export const registerIdeChannels = () => { - registerIdeOpenChannel() - registerIdeSaveChannel() -} - -const registerIdeOpenChannel = () => { - const CHANNEL_NAME = 'minecraft-web-client:ide-open' - - const packetStructure = [ - 'container', - [ - { - name: 'id', - type: ['pstring', { countType: 'i16' }] - }, - { - name: 'language', - type: ['pstring', { countType: 'i16' }] - }, - { - name: 'contents', - type: ['pstring', { countType: 'i16' }] - }, - { - name: 'line', - type: 'i32' - }, - { - name: 'column', - type: 'i32' - }, - { - name: 'title', - type: ['pstring', { countType: 'i16' }] - } - ] - ] - - bot._client.registerChannel(CHANNEL_NAME, packetStructure, true) - - bot._client.on(CHANNEL_NAME as any, (data) => { - const { id, language, contents, line, column, title } = data - - ideState.contents = contents - ideState.line = line - ideState.column = column - ideState.id = id - ideState.language = language || 'typescript' - ideState.title = title - }) - - console.debug(`registered custom channel ${CHANNEL_NAME} channel`) -} -const IDE_SAVE_CHANNEL_NAME = 'minecraft-web-client:ide-save' -const registerIdeSaveChannel = () => { - - const packetStructure = [ - 'container', - [ - { - name: 'id', - type: ['pstring', { countType: 'i16' }] - }, - { - name: 'contents', - type: ['pstring', { countType: 'i16' }] - }, - { - name: 'language', - type: ['pstring', { countType: 'i16' }] - }, - { - name: 'line', - type: 'i32' - }, - { - name: 'column', - type: 'i32' - }, - ] - ] - bot._client.registerChannel(IDE_SAVE_CHANNEL_NAME, packetStructure, true) -} - -export const saveIde = () => { - bot._client.writeChannel(IDE_SAVE_CHANNEL_NAME, { - id: ideState.id, - contents: ideState.contents, - language: ideState.language, - // todo: reflect updated - line: ideState.line, - column: ideState.column, - }) -} diff --git a/src/core/importExport.ts b/src/core/importExport.ts deleted file mode 100644 index b3e26347..00000000 --- a/src/core/importExport.ts +++ /dev/null @@ -1,219 +0,0 @@ -import { appStorage } from '../react/appStorageProvider' -import { getChangedSettings, options } from '../optionsStorage' -import { customKeymaps } from '../controls' -import { showInputsModal } from '../react/SelectOption' - -interface ExportedFile { - _about: string - options?: Record - keybindings?: Record - servers?: any[] - username?: string - proxy?: string - proxies?: string[] - accountTokens?: any[] -} - -export const importData = async () => { - try { - const input = document.createElement('input') - input.type = 'file' - input.accept = '.json' - input.click() - - const file = await new Promise((resolve) => { - input.onchange = () => { - if (!input.files?.[0]) return - resolve(input.files[0]) - } - }) - - const text = await file.text() - const data = JSON.parse(text) - - if (!data._about?.includes('Minecraft Web Client')) { - const doContinue = confirm('This file does not appear to be a Minecraft Web Client profile. Continue anyway?') - if (!doContinue) return - } - - // Build available data types for selection - const availableData: Record, { present: boolean, description: string }> = { - options: { present: !!data.options, description: 'Game settings and preferences' }, - keybindings: { present: !!data.keybindings, description: 'Custom key mappings' }, - servers: { present: !!data.servers, description: 'Saved server list' }, - username: { present: !!data.username, description: 'Username' }, - proxy: { present: !!data.proxy, description: 'Selected proxy server' }, - proxies: { present: !!data.proxies, description: 'Global proxies list' }, - accountTokens: { present: !!data.accountTokens, description: 'Account authentication tokens' }, - } - - // Filter to only present data types - const presentTypes = Object.fromEntries(Object.entries(availableData) - .filter(([_, info]) => info.present) - .map(([key, info]) => [key, info])) - - if (Object.keys(presentTypes).length === 0) { - alert('No compatible data found in the imported file.') - return - } - - const importChoices = await showInputsModal('Select Data to Import', { - mergeData: { - type: 'checkbox', - label: 'Merge with existing data (uncheck to remove old data)', - defaultValue: true, - }, - ...Object.fromEntries(Object.entries(presentTypes).map(([key, info]) => [key, { - type: 'checkbox', - label: info.description, - defaultValue: true, - }])) - }) as { mergeData: boolean } & Record - - if (!importChoices) return - - const importedTypes: string[] = [] - const shouldMerge = importChoices.mergeData - - if (importChoices.options && data.options) { - if (shouldMerge) { - Object.assign(options, data.options) - } else { - for (const key of Object.keys(options)) { - if (key in data.options) { - options[key as any] = data.options[key] - } - } - } - importedTypes.push('settings') - } - - if (importChoices.keybindings && data.keybindings) { - if (shouldMerge) { - Object.assign(customKeymaps, data.keybindings) - } else { - for (const key of Object.keys(customKeymaps)) delete customKeymaps[key] - Object.assign(customKeymaps, data.keybindings) - } - importedTypes.push('keybindings') - } - - if (importChoices.servers && data.servers) { - if (shouldMerge && appStorage.serversList) { - // Merge by IP, update existing entries and add new ones - const existingIps = new Set(appStorage.serversList.map(s => s.ip)) - const newServers = data.servers.filter(s => !existingIps.has(s.ip)) - appStorage.serversList = [...appStorage.serversList, ...newServers] - } else { - appStorage.serversList = data.servers - } - importedTypes.push('servers') - } - - if (importChoices.username && data.username) { - appStorage.username = data.username - importedTypes.push('username') - } - - if ((importChoices.proxy && data.proxy) || (importChoices.proxies && data.proxies)) { - if (!appStorage.proxiesData) { - appStorage.proxiesData = { proxies: [], selected: '' } - } - - if (importChoices.proxies && data.proxies) { - if (shouldMerge) { - // Merge unique proxies - const uniqueProxies = new Set([...appStorage.proxiesData.proxies, ...data.proxies]) - appStorage.proxiesData.proxies = [...uniqueProxies] - } else { - appStorage.proxiesData.proxies = data.proxies - } - importedTypes.push('proxies list') - } - - if (importChoices.proxy && data.proxy) { - appStorage.proxiesData.selected = data.proxy - importedTypes.push('selected proxy') - } - } - - if (importChoices.accountTokens && data.accountTokens) { - if (shouldMerge && appStorage.authenticatedAccounts) { - // Merge by unique identifier (assuming accounts have some unique ID or username) - const existingAccounts = new Set(appStorage.authenticatedAccounts.map(a => a.username)) - const newAccounts = data.accountTokens.filter(a => !existingAccounts.has(a.username)) - appStorage.authenticatedAccounts = [...appStorage.authenticatedAccounts, ...newAccounts] - } else { - appStorage.authenticatedAccounts = data.accountTokens - } - importedTypes.push('account tokens') - } - - alert(`Profile imported successfully! Imported data: ${importedTypes.join(', ')}.\nYou may need to reload the page for some changes to take effect.`) - } catch (err) { - console.error('Failed to import profile:', err) - alert('Failed to import profile: ' + (err.message || err)) - } -} - -export const exportData = async () => { - const data = await showInputsModal('Export Profile', { - profileName: { - type: 'text', - }, - exportSettings: { - type: 'checkbox', - defaultValue: true, - }, - exportKeybindings: { - type: 'checkbox', - defaultValue: true, - }, - exportServers: { - type: 'checkbox', - defaultValue: true, - }, - saveUsernameAndProxy: { - type: 'checkbox', - defaultValue: true, - }, - exportGlobalProxiesList: { - type: 'checkbox', - defaultValue: false, - }, - exportAccountTokens: { - type: 'checkbox', - defaultValue: false, - }, - }) - const fileName = `${data.profileName ? `${data.profileName}-` : ''}web-client-profile.json` - const json: ExportedFile = { - _about: 'Minecraft Web Client (mcraft.fun) Profile', - ...data.exportSettings ? { - options: getChangedSettings(), - } : {}, - ...data.exportKeybindings ? { - keybindings: customKeymaps, - } : {}, - ...data.exportServers ? { - servers: appStorage.serversList, - } : {}, - ...data.saveUsernameAndProxy ? { - username: appStorage.username, - proxy: appStorage.proxiesData?.selected, - } : {}, - ...data.exportGlobalProxiesList ? { - proxies: appStorage.proxiesData?.proxies, - } : {}, - ...data.exportAccountTokens ? { - accountTokens: appStorage.authenticatedAccounts, - } : {}, - } - const blob = new Blob([JSON.stringify(json, null, 2)], { type: 'application/json' }) - const url = URL.createObjectURL(blob) - const a = document.createElement('a') - a.href = url - a.download = fileName - a.click() - URL.revokeObjectURL(url) -} diff --git a/src/core/progressReporter.ts b/src/core/progressReporter.ts deleted file mode 100644 index 75878fd2..00000000 --- a/src/core/progressReporter.ts +++ /dev/null @@ -1,234 +0,0 @@ -import { setLoadingScreenStatus } from '../appStatus' -import { appStatusState } from '../react/AppStatusProvider' -import { hideNotification, showNotification } from '../react/NotificationProvider' -import { pixelartIcons } from '../react/PixelartIcon' - -export interface ProgressReporter { - currentMessage: string | undefined - beginStage (stage: string, title: string): void - endStage (stage: string): void - setSubStage (stage: string, subStageTitle: string): void - reportProgress (stage: string, progress: number): void - executeWithMessage(message: string, fn: () => Promise): Promise - executeWithMessage(message: string, stage: string, fn: () => Promise): Promise - - setMessage (message: string): void - - end(): void - error(message: string): void -} - -interface ReporterDisplayImplementation { - setMessage (message: string): void - end (): void - error(message: string): void -} - -interface StageInfo { - title: string - subStage?: string - progress?: number -} - -const NO_STAGES_ACTION_END = false - -const createProgressReporter = (implementation: ReporterDisplayImplementation): ProgressReporter => { - const stages = new Map() - let currentMessage: string | undefined - let ended = false - - const end = () => { - if (ended) return - ended = true - stages.clear() - implementation.end() - } - - const updateStatus = () => { - if (ended) return - const activeStages = [...stages.entries()] - if (activeStages.length === 0) { - if (NO_STAGES_ACTION_END) { - end() - } else { - implementation.setMessage('Waiting for tasks') - } - return - } - - const [currentStage, info] = activeStages.at(-1)! - let message = info.title - if (info.subStage) { - message += ` - ${info.subStage}` - } - if (info.progress !== undefined) { - const num = Math.round(info.progress * 100) - if (isFinite(num)) { - message += `: ${num}%` - } - } - - currentMessage = message - implementation.setMessage(message) - } - - const reporter = { - beginStage (stage: string, title: string) { - if (stages.has(stage)) { - throw new Error(`Stage ${stage} already is running`) - } - stages.set(stage, { title }) - updateStatus() - }, - - endStage (stage: string) { - stages.delete(stage) - updateStatus() - }, - - setSubStage (stage: string, subStageTitle: string) { - const info = stages.get(stage) - if (info) { - info.subStage = subStageTitle - updateStatus() - } - }, - - reportProgress (stage: string, progress: number) { - const info = stages.get(stage) - if (info) { - info.progress = progress - updateStatus() - } - }, - - async executeWithMessage(...args: any[]): Promise { - const message = args[0] - const stage = typeof args[1] === 'string' ? args[1] : undefined - const fn = typeof args[1] === 'string' ? args[2] : args[1] - - const tempStage = stage ?? 'temp-' + Math.random().toString(36).slice(2) - reporter.beginStage(tempStage, message) - try { - const result = await fn() - return result - } finally { - reporter.endStage(tempStage) - } - }, - - end (): void { - end() - }, - - setMessage (message: string): void { - if (ended) return - implementation.setMessage(message) - }, - - get currentMessage () { - return currentMessage - }, - - error (message: string): void { - if (ended) return - implementation.error(message) - } - } - - return reporter -} - -const fullScreenReporters = [] as ProgressReporter[] -export const createFullScreenProgressReporter = (): ProgressReporter => { - const reporter = createProgressReporter({ - setMessage (message: string) { - if (appStatusState.isError) return - setLoadingScreenStatus(message) - }, - end () { - if (appStatusState.isError) return - fullScreenReporters.splice(fullScreenReporters.indexOf(reporter), 1) - if (fullScreenReporters.length === 0) { - setLoadingScreenStatus(undefined) - } else { - setLoadingScreenStatus(fullScreenReporters.at(-1)!.currentMessage) - } - }, - - error (message: string): void { - if (appStatusState.isError) return - setLoadingScreenStatus(message, true) - } - }) - fullScreenReporters.push(reporter) - return reporter -} - -export const createNotificationProgressReporter = (endMessage?: string): ProgressReporter => { - const id = `progress-reporter-${Math.random().toString(36).slice(2)}` - return createProgressReporter({ - setMessage (message: string) { - showNotification(`${message}...`, '', false, '', undefined, true, id) - }, - end () { - if (endMessage) { - showNotification(endMessage, '', false, pixelartIcons.check, undefined, true) - } else { - hideNotification(id) - } - }, - - error (message: string): void { - showNotification(message, '', true, '', undefined, true) - } - }) -} - -export const createConsoleLogProgressReporter = (group?: string): ProgressReporter => { - return createProgressReporter({ - setMessage (message: string) { - console.log(group ? `[${group}] ${message}` : message) - }, - end () { - console.log(group ? `[${group}] done` : 'done') - }, - - error (message: string): void { - console.error(message) - } - }) -} - -export const createWrappedProgressReporter = (reporter: ProgressReporter, message?: string) => { - const stage = `wrapped-${message}` - if (message) { - reporter.beginStage(stage, message) - } - - return createProgressReporter({ - setMessage (message: string) { - reporter.setMessage(message) - }, - end () { - if (message) { - reporter.endStage(stage) - } - }, - - error (message: string): void { - reporter.error(message) - } - }) -} - -export const createNullProgressReporter = (): ProgressReporter => { - return createProgressReporter({ - setMessage (message: string) { - }, - end () { - }, - error (message: string) { - } - }) -} diff --git a/src/core/timers.ts b/src/core/timers.ts deleted file mode 100644 index 570f46c0..00000000 --- a/src/core/timers.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { options } from '../optionsStorage' - -interface Timer { - id: number - callback: () => void - targetTime: number - isInterval: boolean - interval?: number - cleanup?: () => void -} - -let nextTimerId = 1 -const timers: Timer[] = [] - -// TODO implementation breaks tps (something is wrong with intervals) -const fixBrowserTimers = () => { - const originalSetTimeout = window.setTimeout - //@ts-expect-error - window.setTimeout = (callback: () => void, delay: number) => { - if (!delay) { - return originalSetTimeout(callback) - } - const id = nextTimerId++ - const targetTime = performance.now() + delay - timers.push({ id, callback, targetTime, isInterval: false }) - originalSetTimeout(() => { - checkTimers() - }, delay) - return id - } - - const originalSetInterval = window.setInterval - //@ts-expect-error - window.setInterval = (callback: () => void, interval: number) => { - if (!interval) { - return originalSetInterval(callback, interval) - } - const id = nextTimerId++ - const targetTime = performance.now() + interval - const originalInterval = originalSetInterval(() => { - checkTimers() - }, interval) - timers.push({ - id, - callback, - targetTime, - isInterval: true, - interval, - cleanup () { - originalClearInterval(originalInterval) - }, - }) - return id - } - - const originalClearTimeout = window.clearTimeout - //@ts-expect-error - window.clearTimeout = (id: number) => { - const index = timers.findIndex(t => t.id === id) - if (index !== -1) { - timers.splice(index, 1) - } - return originalClearTimeout(id) - } - - const originalClearInterval = window.clearInterval - //@ts-expect-error - window.clearInterval = (id: number) => { - const index = timers.findIndex(t => t.id === id) - if (index !== -1) { - const timer = timers[index] - if (timer.cleanup) { - timer.cleanup() - } - timers.splice(index, 1) - } - return originalClearInterval(id) - } -} - -export const checkTimers = () => { - const now = performance.now() - - let triggered = false - for (let i = timers.length - 1; i >= 0; i--) { - const timer = timers[i] - - if (now >= timer.targetTime) { - triggered = true - timer.callback() - - if (timer.isInterval && timer.interval) { - // Reschedule interval - timer.targetTime = now + timer.interval - } else { - // Remove one-time timer - timers.splice(i, 1) - } - } - } - - if (!triggered) { - console.log('No timers triggered!') - } -} - -// workaround for browser timers throttling after 5 minutes of tab inactivity -export const preventThrottlingWithSound = () => { - try { - const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)() - const oscillator = audioContext.createOscillator() - const gainNode = audioContext.createGain() - - // Unfortunatelly cant use 0 - gainNode.gain.value = 0.001 - - // Connect nodes - oscillator.connect(gainNode) - gainNode.connect(audioContext.destination) - - // Use a very low frequency - oscillator.frequency.value = 1 - - // Start playing - oscillator.start() - - return async () => { - try { - oscillator.stop() - await audioContext.close() - } catch (err) { - console.warn('Error stopping silent audio:', err) - } - } - } catch (err) { - console.error('Error creating silent audio:', err) - return () => {} - } -} diff --git a/src/createLocalServer.ts b/src/createLocalServer.ts deleted file mode 100644 index d0beac9a..00000000 --- a/src/createLocalServer.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { LocalServer } from './customServer' - -const { createMCServer } = require('flying-squid/dist') - -export const startLocalServer = (serverOptions) => { - const passOptions = { ...serverOptions, Server: LocalServer } - const server: NonNullable = createMCServer(passOptions) - server.formatMessage = (message) => `[server] ${message}` - server.options = passOptions - //@ts-expect-error todo remove - server.looseProtocolMode = true - return server -} - -// features that flying-squid doesn't support at all -// todo move & generate in flying-squid -export const unsupportedLocalServerFeatures = ['transactionPacketExists', 'teleportUsesOwnPacket'] diff --git a/src/customChannels.ts b/src/customChannels.ts deleted file mode 100644 index 506ea776..00000000 --- a/src/customChannels.ts +++ /dev/null @@ -1,504 +0,0 @@ -import PItem from 'prismarine-item' -import { getThreeJsRendererMethods } from 'renderer/viewer/three/threeJsMethods' -import { options } from './optionsStorage' -import { jeiCustomCategories } from './inventoryWindows' -import { registerIdeChannels } from './core/ideChannels' - -export default () => { - customEvents.on('mineflayerBotCreated', async () => { - if (!options.customChannels) return - bot.once('login', () => { - registerBlockModelsChannel() - registerMediaChannels() - registerSectionAnimationChannels() - registeredJeiChannel() - registerBlockInteractionsCustomizationChannel() - registerWaypointChannels() - registerIdeChannels() - }) - }) -} - -const registerChannel = (channelName: string, packetStructure: any[], handler: (data: any) => void, waitForWorld = true) => { - bot._client.registerChannel(channelName, packetStructure, true) - bot._client.on(channelName as any, async (data) => { - if (waitForWorld) { - await appViewer.worldReady - handler(data) - } else { - handler(data) - } - }) - - console.debug(`registered custom channel ${channelName} channel`) -} - -const registerBlockInteractionsCustomizationChannel = () => { - const CHANNEL_NAME = 'minecraft-web-client:block-interactions-customization' - const packetStructure = [ - 'container', - [ - { - name: 'newConfiguration', - type: ['pstring', { countType: 'i16' }] - }, - ] - ] - - registerChannel(CHANNEL_NAME, packetStructure, (data) => { - const config = JSON.parse(data.newConfiguration) - bot.mouse.setConfigFromPacket(config) - }, true) -} - -const registerWaypointChannels = () => { - const packetStructure = [ - 'container', - [ - { - name: 'id', - type: ['pstring', { countType: 'i16' }] - }, - { - name: 'x', - type: 'f32' - }, - { - name: 'y', - type: 'f32' - }, - { - name: 'z', - type: 'f32' - }, - { - name: 'minDistance', - type: 'i32' - }, - { - name: 'label', - type: ['pstring', { countType: 'i16' }] - }, - { - name: 'color', - type: 'i32' - }, - { - name: 'metadataJson', - type: ['pstring', { countType: 'i16' }] - } - ] - ] - - registerChannel('minecraft-web-client:waypoint-add', packetStructure, (data) => { - // Parse metadata if provided - let metadata: any = {} - if (data.metadataJson && data.metadataJson.trim() !== '') { - try { - metadata = JSON.parse(data.metadataJson) - } catch (error) { - console.warn('Failed to parse waypoint metadataJson:', error) - } - } - - getThreeJsRendererMethods()?.addWaypoint(data.id, data.x, data.y, data.z, { - minDistance: data.minDistance, - label: data.label || undefined, - color: data.color || undefined, - metadata - }) - }) - - registerChannel('minecraft-web-client:waypoint-delete', [ - 'container', - [ - { - name: 'id', - type: ['pstring', { countType: 'i16' }] - } - ] - ], (data) => { - getThreeJsRendererMethods()?.removeWaypoint(data.id) - }) -} - -const registerBlockModelsChannel = () => { - const CHANNEL_NAME = 'minecraft-web-client:blockmodels' - - const packetStructure = [ - 'container', - [ - { - name: 'worldName', // currently not used - type: ['pstring', { countType: 'i16' }] - }, - { - name: 'x', - type: 'i32' - }, - { - name: 'y', - type: 'i32' - }, - { - name: 'z', - type: 'i32' - }, - { - name: 'model', - type: ['pstring', { countType: 'i16' }] - } - ] - ] - - registerChannel(CHANNEL_NAME, packetStructure, (data) => { - const { worldName, x, y, z, model } = data - - const chunkX = Math.floor(x / 16) * 16 - const chunkZ = Math.floor(z / 16) * 16 - const chunkKey = `${chunkX},${chunkZ}` - const blockPosKey = `${x},${y},${z}` - - getThreeJsRendererMethods()?.updateCustomBlock(chunkKey, blockPosKey, model) - }, true) -} - -const registerSectionAnimationChannels = () => { - const ADD_CHANNEL = 'minecraft-web-client:section-animation-add' - const REMOVE_CHANNEL = 'minecraft-web-client:section-animation-remove' - - /** - * Add a section animation - * @param id - Section position for animation like `16,32,16` - * @param offset - Initial offset in blocks - * @param speedX - Movement speed in blocks per second on X axis - * @param speedY - Movement speed in blocks per second on Y axis - * @param speedZ - Movement speed in blocks per second on Z axis - * @param limitX - Maximum offset in blocks on X axis (0 means no limit) - * @param limitY - Maximum offset in blocks on Y axis (0 means no limit) - * @param limitZ - Maximum offset in blocks on Z axis (0 means no limit) - */ - const addPacketStructure = [ - 'container', - [ - { name: 'id', type: ['pstring', { countType: 'i16' }] }, - { name: 'offset', type: 'f32' }, - { name: 'speedX', type: 'f32' }, - { name: 'speedY', type: 'f32' }, - { name: 'speedZ', type: 'f32' }, - { name: 'limitX', type: 'f32' }, - { name: 'limitY', type: 'f32' }, - { name: 'limitZ', type: 'f32' } - ] - ] - - /** - * Remove a section animation - * @param id - Identifier of the animation to remove - */ - const removePacketStructure = [ - 'container', - [ - { name: 'id', type: ['pstring', { countType: 'i16' }] } - ] - ] - - registerChannel(ADD_CHANNEL, addPacketStructure, (data) => { - const { id, offset, speedX, speedY, speedZ, limitX, limitY, limitZ } = data - getThreeJsRendererMethods()?.addSectionAnimation(id, { - time: performance.now(), - speedX, - speedY, - speedZ, - currentOffsetX: offset, - currentOffsetY: offset, - currentOffsetZ: offset, - limitX: limitX === 0 ? undefined : limitX, - limitY: limitY === 0 ? undefined : limitY, - limitZ: limitZ === 0 ? undefined : limitZ - }) - }, true) - - registerChannel(REMOVE_CHANNEL, removePacketStructure, (data) => { - const { id } = data - getThreeJsRendererMethods()?.removeSectionAnimation(id) - }, true) - - console.debug('Registered section animation channels') -} - -window.testSectionAnimation = (speedY = 1) => { - const pos = bot.entity.position - const id = `${Math.floor(pos.x / 16) * 16},${Math.floor(pos.y / 16) * 16},${Math.floor(pos.z / 16) * 16}` - getThreeJsRendererMethods()?.addSectionAnimation(id, { - time: performance.now(), - speedX: 0, - speedY, - speedZ: 0, - currentOffsetX: 0, - currentOffsetY: 0, - currentOffsetZ: 0, - // limitX: 10, - // limitY: 10, - }) -} - -const registeredJeiChannel = () => { - const CHANNEL_NAME = 'minecraft-web-client:jei' - // id - string, categoryTitle - string, items - string (json array) - const packetStructure = [ - 'container', - [ - { - name: 'id', - type: ['pstring', { countType: 'i16' }] - }, - { - name: '_categoryTitle', - type: ['pstring', { countType: 'i16' }] - }, - { - name: 'items', - type: ['pstring', { countType: 'i16' }] - }, - ] - ] - - bot._client.registerChannel(CHANNEL_NAME, packetStructure, true) - - bot._client.on(CHANNEL_NAME as any, (data) => { - const { id, categoryTitle, items } = data - if (items === '') { - // remove category - jeiCustomCategories.value = jeiCustomCategories.value.filter(x => x.id !== id) - return - } - const PrismarineItem = PItem(bot.version) - jeiCustomCategories.value.push({ - id, - categoryTitle, - items: JSON.parse(items).map(x => { - const itemString = x.itemName || x.item_name || x.item || x.itemId - const itemId = loadedData.itemsByName[itemString.replace('minecraft:', '')] - if (!itemId) { - console.warn(`Could not add item ${itemString} to JEI category ${categoryTitle} because it was not found`) - return null - } - // const item = new PrismarineItem(itemId.id, x.itemCount || x.item_count || x.count || 1, x.itemDamage || x.item_damage || x.damage || 0, x.itemNbt || x.item_nbt || x.nbt || null) - return PrismarineItem.fromNotch({ - ...x, - itemId: itemId.id, - }) - }) - }) - }) - - console.debug(`registered custom channel ${CHANNEL_NAME} channel`) -} - -const registerMediaChannels = () => { - // Media Add Channel - const ADD_CHANNEL = 'minecraft-web-client:media-add' - const addPacketStructure = [ - 'container', - [ - { name: 'id', type: ['pstring', { countType: 'i16' }] }, - { name: 'x', type: 'f32' }, - { name: 'y', type: 'f32' }, - { name: 'z', type: 'f32' }, - { name: 'width', type: 'f32' }, - { name: 'height', type: 'f32' }, - { name: 'rotation', type: 'i16' }, // 0: 0° - towards positive z, 1: 90° - positive x, 2: 180° - negative z, 3: 270° - negative x (3-6 is same but double side) - { name: 'source', type: ['pstring', { countType: 'i16' }] }, - { name: 'loop', type: 'bool' }, - { name: 'volume', type: 'f32' }, // 0 - { name: '_aspectRatioMode', type: 'i16' }, // 0 - { name: '_background', type: 'i16' }, // 0 - { name: '_opacity', type: 'i16' }, // 1 - { name: '_cropXStart', type: 'f32' }, // 0 - { name: '_cropYStart', type: 'f32' }, // 0 - { name: '_cropXEnd', type: 'f32' }, // 0 - { name: '_cropYEnd', type: 'f32' }, // 0 - ] - ] - - // Media Control Channels - const PLAY_CHANNEL = 'minecraft-web-client:media-play' - const PAUSE_CHANNEL = 'minecraft-web-client:media-pause' - const SEEK_CHANNEL = 'minecraft-web-client:media-seek' - const VOLUME_CHANNEL = 'minecraft-web-client:media-volume' - const SPEED_CHANNEL = 'minecraft-web-client:media-speed' - const DESTROY_CHANNEL = 'minecraft-web-client:media-destroy' - - const noDataPacketStructure = [ - 'container', - [ - { name: 'id', type: ['pstring', { countType: 'i16' }] } - ] - ] - - const setNumberPacketStructure = [ - 'container', - [ - { name: 'id', type: ['pstring', { countType: 'i16' }] }, - { name: 'seconds', type: 'f32' } - ] - ] - - // Register channels - registerChannel(PLAY_CHANNEL, noDataPacketStructure, (data) => { - const { id } = data - getThreeJsRendererMethods()?.setVideoPlaying(id, true) - }, true) - registerChannel(PAUSE_CHANNEL, noDataPacketStructure, (data) => { - const { id } = data - getThreeJsRendererMethods()?.setVideoPlaying(id, false) - }, true) - registerChannel(SEEK_CHANNEL, setNumberPacketStructure, (data) => { - const { id, seconds } = data - getThreeJsRendererMethods()?.setVideoSeeking(id, seconds) - }, true) - registerChannel(VOLUME_CHANNEL, setNumberPacketStructure, (data) => { - const { id, volume } = data - getThreeJsRendererMethods()?.setVideoVolume(id, volume) - }, true) - registerChannel(SPEED_CHANNEL, setNumberPacketStructure, (data) => { - const { id, speed } = data - getThreeJsRendererMethods()?.setVideoSpeed(id, speed) - }, true) - registerChannel(DESTROY_CHANNEL, noDataPacketStructure, (data) => { - const { id } = data - getThreeJsRendererMethods()?.destroyMedia(id) - }, true) - - // Handle media add - registerChannel(ADD_CHANNEL, addPacketStructure, (data) => { - const { id, x, y, z, width, height, rotation, source, loop, volume, background, opacity } = data - - // Add new video - getThreeJsRendererMethods()?.addMedia(id, { - position: { x, y, z }, - size: { width, height }, - // side: 'towards', - src: source, - rotation: rotation as 0 | 1 | 2 | 3, - doubleSide: false, - background, - opacity: opacity / 100, - allowOrigins: options.remoteContentNotSameOrigin === false ? [getCurrentTopDomain()] : options.remoteContentNotSameOrigin, - loop, - volume - }) - }) - - // --- - - // Video interaction channel - const interactionPacketStructure = [ - 'container', - [ - { name: 'id', type: ['pstring', { countType: 'i16' }] }, - { name: 'x', type: 'f32' }, - { name: 'y', type: 'f32' }, - { name: 'isRightClick', type: 'bool' } - ] - ] - - bot._client.registerChannel(MEDIA_INTERACTION_CHANNEL, interactionPacketStructure, true) - - // Media play channel - bot._client.registerChannel(MEDIA_PLAY_CHANNEL_CLIENTBOUND, noDataPacketStructure, true) - const mediaStopPacketStructure = [ - 'container', - [ - { name: 'id', type: ['pstring', { countType: 'i16' }] }, - // ended - emitted even when loop is true (will continue playing) - // error: ... - // stalled - connection drops, server stops sending data - // waiting - connection is slow, server is sending data, but not fast enough (buffering) - // control - { name: 'reason', type: ['pstring', { countType: 'i16' }] }, - { name: 'time', type: 'f32' } - ] - ] - bot._client.registerChannel(MEDIA_STOP_CHANNEL_CLIENTBOUND, mediaStopPacketStructure, true) - - console.debug('Registered media channels') -} - -const MEDIA_INTERACTION_CHANNEL = 'minecraft-web-client:media-interaction' -const MEDIA_PLAY_CHANNEL_CLIENTBOUND = 'minecraft-web-client:media-play' -const MEDIA_STOP_CHANNEL_CLIENTBOUND = 'minecraft-web-client:media-stop' - -export const sendVideoInteraction = (id: string, x: number, y: number, isRightClick: boolean) => { - bot._client.writeChannel(MEDIA_INTERACTION_CHANNEL, { id, x, y, isRightClick }) -} - -export const sendVideoPlay = (id: string) => { - bot._client.writeChannel(MEDIA_PLAY_CHANNEL_CLIENTBOUND, { id }) -} - -export const sendVideoStop = (id: string, reason: string, time: number) => { - bot._client.writeChannel(MEDIA_STOP_CHANNEL_CLIENTBOUND, { id, reason, time }) -} - -export const videoCursorInteraction = () => { - const { intersectMedia } = appViewer.rendererState.world - if (!intersectMedia) return null - return intersectMedia -} -window.videoCursorInteraction = videoCursorInteraction - -const addTestVideo = (rotation = 0 as 0 | 1 | 2 | 3, scale = 1, isImage = false) => { - const block = window.cursorBlockRel() - if (!block) return - const { position: startPosition } = block - - // Add video with proper positioning - getThreeJsRendererMethods()?.addMedia('test-video', { - position: { - x: startPosition.x, - y: startPosition.y + 1, - z: startPosition.z - }, - size: { - width: scale, - height: scale - }, - src: isImage ? 'https://bucket.mcraft.fun/test_image.png' : 'https://bucket.mcraft.fun/test_video.mp4', - rotation, - // doubleSide: true, - background: 0x00_00_00, // Black color - // TODO broken - // uvMapping: { - // startU: 0, - // endU: 1, - // startV: 0, - // endV: 1 - // }, - opacity: 1, - allowOrigins: true, - }) -} -window.addTestVideo = addTestVideo - -function getCurrentTopDomain (): string { - const { hostname } = location - // Split hostname into parts - const parts = hostname.split('.') - - // Handle special cases like co.uk, com.br, etc. - if (parts.length > 2) { - // Check for common country codes with additional segments - if (parts.at(-2) === 'co' || - parts.at(-2) === 'com' || - parts.at(-2) === 'org' || - parts.at(-2) === 'gov') { - // Return last 3 parts (e.g., example.co.uk) - return parts.slice(-3).join('.') - } - } - - // Return last 2 parts (e.g., example.com) - return parts.slice(-2).join('.') -} diff --git a/src/customClient.js b/src/customClient.js deleted file mode 100644 index b1a99904..00000000 --- a/src/customClient.js +++ /dev/null @@ -1,91 +0,0 @@ -//@ts-check -import * as nbt from 'prismarine-nbt' -import { options } from './optionsStorage' - -const { EventEmitter } = require('events') -const debug = require('debug')('minecraft-protocol') -const states = require('minecraft-protocol/src/states') - -window.serverDataChannel ??= {} -export const customCommunication = { - sendData(data) { - setTimeout(() => { - window.serverDataChannel[this.isServer ? 'emitClient' : 'emitServer'](data) - }) - }, - receiverSetup(processData) { - window.serverDataChannel[this.isServer ? 'emitServer' : 'emitClient'] = (data) => { - processData(data) - } - } -} - -class CustomChannelClient extends EventEmitter { - constructor(isServer, version) { - super() - this.version = version - this.isServer = !!isServer - this.state = states.HANDSHAKING - } - - get state() { - return this.protocolState - } - - setSerializer(state) { - customCommunication.receiverSetup.call(this, (/** @type {{name, params, state?}} */parsed) => { - if (!options.excludeCommunicationDebugEvents.includes(parsed.name)) { - debug(`receive in ${this.isServer ? 'server' : 'client'}: ${parsed.name}`) - } - this.emit(parsed.name, parsed.params, parsed) - this.emit('packet_name', parsed.name, parsed.params, parsed) - }) - } - - // eslint-disable-next-line @typescript-eslint/adjacent-overload-signatures, grouped-accessor-pairs - set state(newProperty) { - const oldProperty = this.protocolState - this.protocolState = newProperty - - this.setSerializer(this.protocolState) - - this.emit('state', newProperty, oldProperty) - } - - end(endReason, fullReason) { - // eslint-disable-next-line unicorn/no-this-assignment - const client = this - if (client.state === states.PLAY) { - fullReason ||= loadedData.supportFeature('chatPacketsUseNbtComponents') - ? nbt.comp({ text: nbt.string(endReason) }) - : JSON.stringify({ text: endReason }) - client.write('kick_disconnect', { reason: fullReason }) - } else if (client.state === states.LOGIN) { - fullReason ||= JSON.stringify({ text: endReason }) - client.write('disconnect', { reason: fullReason }) - } - - this._endReason = endReason - this.emit('end', this._endReason) // still emits on server side only, doesn't send anything to our client - } - - write(name, params) { - if (!options.excludeCommunicationDebugEvents.includes(name)) { - debug(`[${this.state}] from ${this.isServer ? 'server' : 'client'}: ` + name) - debug(params) - } - - this.emit('writePacket', name, params) - customCommunication.sendData.call(this, { name, params, state: this.state }) - } - - writeBundle(packets) { - // no-op - } - - writeRaw(buffer) { - // no-op - } -} - -export default CustomChannelClient diff --git a/src/customCommands.ts b/src/customCommands.ts deleted file mode 100644 index 75c13f68..00000000 --- a/src/customCommands.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { guiOptionsScheme, tryFindOptionConfig } from './optionsGuiScheme' -import { options } from './optionsStorage' - -export const customCommandsConfig = { - chat: { - input: [ - { - type: 'text', - placeholder: 'Command to send e.g. gamemode creative' - } - ], - handler ([command]) { - bot.chat(`/${command.replace(/^\//, '')}`) - } - }, - setOrToggleSetting: { - input: [ - { - type: 'select', - // maybe title case? - options: Object.keys(options) - }, - { - type: 'select', - options: ['toggle', 'set'] - }, - ([setting = '', action = ''] = []) => { - const value = options[setting] - if (!action || value === undefined || action === 'toggle') return null - if (action === 'set') { - const getBase = () => { - const config = tryFindOptionConfig(setting as any) - if (config && 'values' in config) { - return { - type: 'select', - options: config.values - } - } - if (config?.type === 'toggle' || typeof value === 'boolean') { - return { - type: 'select', - options: ['true', 'false'] - } - } - if (config?.type === 'slider' || value.type === 'number') { - return { - type: 'number', - } - } - return { - type: 'text' - } - } - return { - ...getBase(), - placeholder: value - } - } - } - ], - handler ([setting, action, value]) { - if (action === 'toggle' || action === undefined) { - const value = options[setting] - const config = tryFindOptionConfig(setting) - if (config && 'values' in config && config.values) { - const { values } = config - const currentIndex = values.indexOf(value) - const nextIndex = (currentIndex + 1) % values.length - options[setting] = values[nextIndex] - } else { - options[setting] = typeof value === 'boolean' ? !value : typeof value === 'number' ? value + 1 : value - } - } else { - options[setting] = value - } - } - }, - jsScripts: { - input: [ - { - type: 'text', - placeholder: 'JavaScript code to run in main thread (sensitive!)' - } - ], - handler ([code]) { - // eslint-disable-next-line no-new-func -- this is a feature, not a bug - new Function(code)() - } - }, - // openCommandsScreen: {} -} diff --git a/src/customServer.ts b/src/customServer.ts deleted file mode 100644 index 972636fe..00000000 --- a/src/customServer.ts +++ /dev/null @@ -1,20 +0,0 @@ -import EventEmitter from 'events' - -import CustomChannelClient from './customClient' - -export class LocalServer extends EventEmitter.EventEmitter { - socketServer = null - cipher = null - decipher = null - clients = {} - - constructor (public version, public customPackets, public hideErrors = false) { - super() - } - - listen () { - this.emit('connection', new CustomChannelClient(true, this.version)) - } - - close () { } -} diff --git a/src/defaultLocalServerOptions.js b/src/defaultLocalServerOptions.js deleted file mode 100644 index 3b93910d..00000000 --- a/src/defaultLocalServerOptions.js +++ /dev/null @@ -1,39 +0,0 @@ -module.exports = { - 'motd': 'A Minecraft Server \nRunning flying-squid', - // host: '', - // eslint-disable-next-line unicorn/numeric-separators-style - 'port': 25565, - 'max-players': 10, - 'online-mode': false, - 'gameMode': 0, - 'difficulty': 0, - 'worldFolder': 'world', - 'pluginsFolder': true, - // todo set sid, disable entities auto-spawn - 'generation': { - // grass_field - // diamond_square - // empty - // superflat - // all_the_blocks - // nether - 'name': 'diamond_square', - options: {} - // 'options': { - // 'worldHeight': 80 - // } - }, - 'kickTimeout': 10_000, - 'plugins': {}, - 'modpe': false, - 'view-distance': 2, - 'player-list-text': { - 'header': 'Flying squid', - 'footer': 'Integrated server' - }, - keepAlive: false, - 'everybody-op': true, - 'max-entities': 100, - 'version': '1.18', - versionMajor: '1.18' -} diff --git a/src/defaultOptions.ts b/src/defaultOptions.ts deleted file mode 100644 index 48c1cfad..00000000 --- a/src/defaultOptions.ts +++ /dev/null @@ -1,159 +0,0 @@ -export const defaultOptions = { - renderDistance: 3, - keepChunksDistance: 1, - multiplayerRenderDistance: 3, - closeConfirmation: true, - autoFullScreen: false, - mouseRawInput: true, - autoExitFullscreen: false, - localUsername: 'wanderer', - mouseSensX: 50, - mouseSensY: -1, - chatWidth: 320, - chatHeight: 180, - chatScale: 100, - chatOpacity: 100, - chatOpacityOpened: 100, - messagesLimit: 200, - volume: 50, - enableMusic: true, - musicVolume: 50, - // fov: 70, - fov: 75, - defaultPerspective: 'first_person' as 'first_person' | 'third_person_back' | 'third_person_front', - guiScale: 3, - autoRequestCompletions: true, - touchButtonsSize: 40, - touchButtonsOpacity: 80, - touchButtonsPosition: 12, - touchControlsPositions: getDefaultTouchControlsPositions(), - touchControlsSize: getTouchControlsSize(), - touchMovementType: 'modern' as 'modern' | 'classic', - touchInteractionType: 'classic' as 'classic' | 'buttons', - gpuPreference: 'default' as 'default' | 'high-performance' | 'low-power', - backgroundRendering: '20fps' as 'full' | '20fps' | '5fps', - /** @unstable */ - disableAssets: false, - /** @unstable */ - debugLogNotFrequentPackets: false, - unimplementedContainers: false, - dayCycleAndLighting: true, - loadPlayerSkins: true, - renderEars: true, - lowMemoryMode: false, - starfieldRendering: true, - defaultSkybox: true, - enabledResourcepack: null as string | null, - useVersionsTextures: 'latest', - serverResourcePacks: 'prompt' as 'prompt' | 'always' | 'never', - showHand: true, - viewBobbing: true, - displayRecordButton: true, - packetsLoggerPreset: 'all' as 'all' | 'no-buffers', - serversAutoVersionSelect: 'auto' as 'auto' | 'latest' | '1.20.4' | string, - customChannels: false, - remoteContentNotSameOrigin: false as boolean | string[], - packetsRecordingAutoStart: false, - language: 'auto', - preciseMouseInput: false, - // todo ui setting, maybe enable by default? - waitForChunksRender: false as 'sp-only' | boolean, - jeiEnabled: true as boolean | Array<'creative' | 'survival' | 'adventure' | 'spectator'>, - modsSupport: false, - modsAutoUpdate: 'check' as 'check' | 'never' | 'always', - modsUpdatePeriodCheck: 24, // hours - preventBackgroundTimeoutKick: false, - preventSleep: false, - debugContro: false, - debugChatScroll: false, - chatVanillaRestrictions: true, - debugResponseTimeIndicator: false, - chatPingExtension: true, - // antiAliasing: false, - topRightTimeDisplay: 'only-fullscreen' as 'only-fullscreen' | 'always' | 'never', - - clipWorldBelowY: undefined as undefined | number, // will be removed - disableSignsMapsSupport: false, - singleplayerAutoSave: false, - showChunkBorders: false, // todo rename option - frameLimit: false as number | false, - alwaysBackupWorldBeforeLoading: undefined as boolean | undefined | null, - alwaysShowMobileControls: false, - excludeCommunicationDebugEvents: [] as string[], - preventDevReloadWhilePlaying: false, - numWorkers: 4, - localServerOptions: { - gameMode: 1 - } as any, - saveLoginPassword: 'prompt' as 'prompt' | 'never' | 'always', - preferLoadReadonly: false, - experimentalClientSelfReload: false, - remoteSoundsSupport: false, - remoteSoundsLoadTimeout: 500, - disableLoadPrompts: false, - guestUsername: 'guest', - askGuestName: true, - errorReporting: true, - /** Actually might be useful */ - showCursorBlockInSpectator: false, - renderEntities: true, - smoothLighting: true, - newVersionsLighting: false, - chatSelect: true, - autoJump: 'auto' as 'auto' | 'always' | 'never', - autoParkour: false, - vrSupport: true, // doesn't directly affect the VR mode, should only disable the button which is annoying to android users - vrPageGameRendering: false, - renderDebug: 'basic' as 'none' | 'advanced' | 'basic', - rendererPerfDebugOverlay: false, - - // advanced bot options - autoRespawn: false, - mutedSounds: [] as string[], - plugins: [] as Array<{ enabled: boolean, name: string, description: string, script: string }>, - /** Wether to popup sign editor on server action */ - autoSignEditor: true, - wysiwygSignEditor: 'auto' as 'auto' | 'always' | 'never', - showMinimap: 'never' as 'always' | 'singleplayer' | 'never', - minimapOptimizations: true, - displayBossBars: true, - disabledUiParts: [] as string[], - neighborChunkUpdates: true, - highlightBlockColor: 'auto' as 'auto' | 'blue' | 'classic', - activeRenderer: 'threejs', - rendererSharedOptions: { - _experimentalSmoothChunkLoading: true, - _renderByChunks: false - } -} - -function getDefaultTouchControlsPositions () { - return { - action: [ - 70, - 76 - ], - sneak: [ - 84, - 76 - ], - break: [ - 70, - 57 - ], - jump: [ - 84, - 57 - ], - } as Record -} - -function getTouchControlsSize () { - return { - joystick: 55, - action: 36, - break: 36, - jump: 36, - sneak: 36, - } -} diff --git a/src/devReload.ts b/src/devReload.ts deleted file mode 100644 index e778d8d4..00000000 --- a/src/devReload.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { isMobile } from 'renderer/viewer/lib/simpleUtils' - -if (process.env.NODE_ENV === 'development') { - // mobile devtools - if (isMobile()) { - // can be changed to require('eruda') - //@ts-expect-error - void import('https://cdn.skypack.dev/eruda').then(({ default: eruda }) => eruda.init()) - } -} -console.log('JS Loaded in', Date.now() - window.startLoad) diff --git a/src/devtools.ts b/src/devtools.ts deleted file mode 100644 index 1f8ef8e8..00000000 --- a/src/devtools.ts +++ /dev/null @@ -1,324 +0,0 @@ -// global variables useful for debugging - -import fs from 'fs' -import { WorldRendererThree } from 'renderer/viewer/three/worldrendererThree' -import { enable, disable, enabled } from 'debug' -import { Vec3 } from 'vec3' - -customEvents.on('mineflayerBotCreated', () => { - window.debugServerPacketNames = Object.fromEntries(Object.keys(loadedData.protocol.play.toClient.types).map(name => { - name = name.replace('packet_', '') - return [name, name] - })) - window.debugClientPacketNames = Object.fromEntries(Object.keys(loadedData.protocol.play.toServer.types).map(name => { - name = name.replace('packet_', '') - return [name, name] - })) -}) - -window.Vec3 = Vec3 -window.cursorBlockRel = (x = 0, y = 0, z = 0) => { - const newPos = bot.blockAtCursor(5)?.position.offset(x, y, z) - if (!newPos) return - return bot.world.getBlock(newPos) -} - -window.entityCursor = () => { - return bot.mouse.getCursorState().entity -} - -// wanderer -window.inspectPlayer = () => require('fs').promises.readFile('/world/playerdata/9e487d23-2ffc-365a-b1f8-f38203f59233.dat').then(window.nbt.parse).then(console.log) - -Object.defineProperty(window, 'debugSceneChunks', { - get () { - if (!(window.world instanceof WorldRendererThree)) return undefined - return (window.world)?.getLoadedChunksRelative?.(bot.entity.position, true) - }, -}) - -window.chunkKey = (xRel = 0, zRel = 0) => { - const pos = bot.entity.position - return `${(Math.floor(pos.x / 16) + xRel) * 16},${(Math.floor(pos.z / 16) + zRel) * 16}` -} - -window.sectionKey = (xRel = 0, yRel = 0, zRel = 0) => { - const pos = bot.entity.position - return `${(Math.floor(pos.x / 16) + xRel) * 16},${(Math.floor(pos.y / 16) + yRel) * 16},${(Math.floor(pos.z / 16) + zRel) * 16}` -} - -window.keys = (obj) => Object.keys(obj) -window.values = (obj) => Object.values(obj) - -window.len = (obj) => Object.keys(obj).length - -customEvents.on('gameLoaded', () => { - bot._client.on('packet', (data, { name }) => { - if (sessionStorage.ignorePackets?.includes(name)) { - console.log('ignoring packet', name) - const oldEmit = bot._client.emit - let i = 0 - // ignore next 3 emits - //@ts-expect-error - bot._client.emit = (...args) => { - if (i++ === 3) { - oldEmit.apply(bot._client, args) - bot._client.emit = oldEmit - } - } - } - }) -}) - -window.inspectPacket = (packetName, isFromClient = false, fullOrListener: boolean | ((...args) => void) = false) => { - if (typeof isFromClient === 'function') { - fullOrListener = isFromClient - isFromClient = false - } - const listener = typeof fullOrListener === 'function' - ? (name, ...args) => fullOrListener(...args, name) - : (name, ...args) => { - const displayName = name === packetName ? name : `${name} (${packetName})` - console.log('packet', displayName, fullOrListener ? args : args[0]) - } - - // Pre-compile regex if using wildcards - const pattern = typeof packetName === 'string' && packetName.includes('*') - ? new RegExp('^' + packetName.replaceAll('*', '.*') + '$') - : null - - const packetNameListener = (name, data) => { - if (pattern) { - if (pattern.test(name)) { - listener(name, data) - } - } else if (name === packetName) { - listener(name, data) - } - } - const packetListener = (data, { name }) => { - packetNameListener(name, data) - } - - const attach = () => { - if (isFromClient) { - bot?._client.prependListener('writePacket', packetNameListener) - } else { - bot?._client.prependListener('packet_name', packetNameListener) - bot?._client.prependListener('packet', packetListener) - } - } - const detach = () => { - if (isFromClient) { - bot?._client.removeListener('writePacket', packetNameListener) - } else { - bot?._client.removeListener('packet_name', packetNameListener) - bot?._client.removeListener('packet', packetListener) - } - } - attach() - customEvents.on('mineflayerBotCreated', attach) - - const returnobj = {} - Object.defineProperty(returnobj, 'detach', { - get () { - detach() - customEvents.removeListener('mineflayerBotCreated', attach) - return true - }, - }) - return returnobj -} - -window.downloadFile = async (path: string) => { - if (!path.startsWith('/') && localServer) path = `${localServer.options.worldFolder}/${path}` - const data = await fs.promises.readFile(path) - const blob = new Blob([data], { type: 'application/octet-stream' }) - const url = URL.createObjectURL(blob) - const a = document.createElement('a') - a.href = url - a.download = path.split('/').at(-1)! - a.click() - URL.revokeObjectURL(url) -} - -Object.defineProperty(window, 'debugToggle', { - get () { - localStorage.debug = localStorage.debug === '*' ? '' : '*' - if (enabled('*')) { - disable() - return 'disabled debug' - } else { - enable('*') - return 'enabled debug' - } - }, - set (v) { - enable(v) - localStorage.debug = v - console.log('Enabled debug for', v) - } -}) - -customEvents.on('gameLoaded', () => { - window.holdingBlock = (window.world as WorldRendererThree | undefined)?.holdingBlock -}) - -window.clearStorage = (...keysToKeep: string[]) => { - for (let i = 0; i < localStorage.length; i++) { - const key = localStorage.key(i) - if (key && !keysToKeep.includes(key)) { - localStorage.removeItem(key) - } - } - return `Cleared ${localStorage.length - keysToKeep.length} items from localStorage. Kept: ${keysToKeep.join(', ')}` -} - - -// PERF DEBUG - -// for advanced debugging, use with watch expression - -window.statsPerSecAvg = {} -let currentStatsPerSec = {} as Record -const waitingStatsPerSec = {} -window.markStart = (label) => { - waitingStatsPerSec[label] ??= [] - waitingStatsPerSec[label][0] = performance.now() -} -window.markEnd = (label) => { - if (!waitingStatsPerSec[label]?.[0]) return - currentStatsPerSec[label] ??= [] - currentStatsPerSec[label].push(performance.now() - waitingStatsPerSec[label][0]) - delete waitingStatsPerSec[label] -} -const updateStatsPerSecAvg = () => { - window.statsPerSecAvg = Object.fromEntries(Object.entries(currentStatsPerSec).map(([key, value]) => { - return [key, { - avg: value.reduce((a, b) => a + b, 0) / value.length, - count: value.length - }] - })) - currentStatsPerSec = {} -} - - -window.statsPerSec = {} -let statsPerSecCurrent = {} -let lastReset = performance.now() -window.addStatPerSec = (name) => { - statsPerSecCurrent[name] ??= 0 - statsPerSecCurrent[name]++ -} -window.statsPerSecCurrent = statsPerSecCurrent -setInterval(() => { - window.statsPerSec = { duration: Math.floor(performance.now() - lastReset), ...statsPerSecCurrent, } - statsPerSecCurrent = {} - window.statsPerSecCurrent = statsPerSecCurrent - updateStatsPerSecAvg() - lastReset = performance.now() -}, 1000) - -// --- - -// Add type declaration for performance.memory -declare global { - interface Performance { - memory?: { - usedJSHeapSize: number - totalJSHeapSize: number - jsHeapSizeLimit: number - } - } -} - -// Performance metrics WebSocket client -let ws: WebSocket | null = null -let wsReconnectTimeout: NodeJS.Timeout | null = null -let metricsInterval: NodeJS.Timeout | null = null - -// Start collecting metrics immediately -const startTime = performance.now() - -function collectAndSendMetrics () { - if (!ws || ws.readyState !== WebSocket.OPEN) return - - const metrics = { - loadTime: performance.now() - startTime, - memoryUsage: (performance.memory?.usedJSHeapSize ?? 0) / 1024 / 1024, - timestamp: Date.now() - } - - ws.send(JSON.stringify(metrics)) -} - -function getWebSocketUrl () { - const wsPort = process.env.WS_PORT - if (!wsPort) return null - - const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:' - const { hostname } = window.location - return `${protocol}//${hostname}:${wsPort}` -} - -function connectWebSocket () { - if (ws) return - - const wsUrl = getWebSocketUrl() - if (!wsUrl) { - return - } - - ws = new WebSocket(wsUrl) - - ws.onopen = () => { - console.log('Connected to metrics server') - if (wsReconnectTimeout) { - clearTimeout(wsReconnectTimeout) - wsReconnectTimeout = null - } - - // Start sending metrics immediately after connection - collectAndSendMetrics() - - // Clear existing interval if any - if (metricsInterval) { - clearInterval(metricsInterval) - } - - // Set new interval - metricsInterval = setInterval(collectAndSendMetrics, 500) - } - - ws.onclose = () => { - console.log('Disconnected from metrics server') - ws = null - - // Clear metrics interval - if (metricsInterval) { - clearInterval(metricsInterval) - metricsInterval = null - } - - // Try to reconnect after 3 seconds - wsReconnectTimeout = setTimeout(connectWebSocket, 3000) - } - - ws.onerror = (error) => { - console.error('WebSocket error:', error) - } -} - -// Connect immediately -connectWebSocket() - -// Add command to request current metrics -window.requestMetrics = () => { - const metrics = { - loadTime: performance.now() - startTime, - memoryUsage: (performance.memory?.usedJSHeapSize ?? 0) / 1024 / 1024, - timestamp: Date.now() - } - console.log('Current metrics:', metrics) - return metrics -} diff --git a/src/downloadAndOpenFile.ts b/src/downloadAndOpenFile.ts deleted file mode 100644 index 1ff318ff..00000000 --- a/src/downloadAndOpenFile.ts +++ /dev/null @@ -1,150 +0,0 @@ -import prettyBytes from 'pretty-bytes' -import { openWorldFromHttpDir, openWorldZip } from './browserfs' -import { getResourcePackNames, installResourcepackPack, resourcePackState, updateTexturePackInstalledState } from './resourcePack' -import { setLoadingScreenStatus } from './appStatus' -import { appQueryParams, appQueryParamsArray } from './appParams' -import { VALID_REPLAY_EXTENSIONS, openFile } from './packetsReplay/replayPackets' -import { createFullScreenProgressReporter } from './core/progressReporter' -import { ConnectOptions } from './connect' - -export const getFixedFilesize = (bytes: number) => { - return prettyBytes(bytes, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) -} - -export const isInterestedInDownload = () => { - const { map, texturepack, replayFileUrl } = appQueryParams - const { mapDir } = appQueryParamsArray - return !!map || !!texturepack || !!replayFileUrl || !!mapDir -} - -const inner = async () => { - const { map, texturepack, replayFileUrl } = appQueryParams - const { mapDir } = appQueryParamsArray - return downloadAndOpenMapFromUrl(map, texturepack, mapDir, replayFileUrl) -} - -export const downloadAndOpenMapFromUrl = async (mapUrl: string | undefined, texturepackUrl: string | undefined, mapUrlDir: string[] | undefined, replayFileUrl: string | undefined, connectOptions?: Partial) => { - if (replayFileUrl) { - setLoadingScreenStatus('Downloading replay file') - const response = await fetch(replayFileUrl) - const contentLength = response.headers?.get('Content-Length') - const size = contentLength ? +contentLength : undefined - const filename = replayFileUrl.split('/').pop() - - let downloadedBytes = 0 - const buffer = await new Response(new ReadableStream({ - async start (controller) { - if (!response.body) throw new Error('Server returned no response!') - const reader = response.body.getReader() - - // eslint-disable-next-line no-constant-condition - while (true) { - const { done, value } = await reader.read() - - if (done) { - controller.close() - break - } - - downloadedBytes += value.byteLength - - // Calculate download progress as a percentage - const progress = size ? (downloadedBytes / size) * 100 : undefined - setLoadingScreenStatus(`Download replay file progress: ${progress === undefined ? '?' : Math.floor(progress)}% (${getFixedFilesize(downloadedBytes)} / ${size && getFixedFilesize(size)})`, false, true) - - // Pass the received data to the controller - controller.enqueue(value) - } - }, - })).arrayBuffer() - - // Convert buffer to text, handling any compression automatically - const decoder = new TextDecoder() - const contents = decoder.decode(buffer) - - openFile({ - contents, - filename, - filesize: size - }) - return true - } - - const mapUrlDirGuess = appQueryParams.mapDirGuess - const mapUrlDirBaseUrl = appQueryParams.mapDirBaseUrl - if (mapUrlDir?.length) { - await openWorldFromHttpDir(mapUrlDir, mapUrlDirBaseUrl ?? undefined) - return true - } - - if (mapUrlDirGuess) { - // await openWorldFromHttpDir(undefined, mapUrlDirGuess) - return true - } - - // fixme - if (texturepackUrl) mapUrl = texturepackUrl - if (!mapUrl) return false - - if (texturepackUrl) { - await updateTexturePackInstalledState() - if (resourcePackState.resourcePackInstalled) { - if (!confirm(`You are going to install a new resource pack, which will REPLACE the current one: ${await getResourcePackNames()[0]} Continue?`)) return - } - } - const name = mapUrl.slice(mapUrl.lastIndexOf('/') + 1).slice(-25) - const downloadThing = texturepackUrl ? 'texturepack' : 'world' - setLoadingScreenStatus(`Downloading ${downloadThing} ${name}...`) - - const response = await fetch(mapUrl) - const contentType = response.headers.get('Content-Type') - if (!contentType || !contentType.startsWith('application/zip')) { - alert('Invalid map file') - } - const contentLengthStr = response.headers?.get('Content-Length') - const contentLength = contentLengthStr && +contentLengthStr - setLoadingScreenStatus(`Downloading ${downloadThing} ${name}: have to download ${contentLength && getFixedFilesize(contentLength)}...`) - - let downloadedBytes = 0 - const buffer = await new Response(new ReadableStream({ - async start (controller) { - if (!response.body) throw new Error('Server returned no response!') - const reader = response.body.getReader() - - // eslint-disable-next-line no-constant-condition - while (true) { - const { done, value } = await reader.read() - - if (done) { - controller.close() - break - } - - downloadedBytes += value.byteLength - - // Calculate download progress as a percentage - const progress = contentLength ? (downloadedBytes / contentLength) * 100 : undefined - setLoadingScreenStatus(`Download ${downloadThing} progress: ${progress === undefined ? '?' : Math.floor(progress)}% (${getFixedFilesize(downloadedBytes)} / ${contentLength && getFixedFilesize(contentLength)})`, false, true) - - // Pass the received data to the controller - controller.enqueue(value) - } - }, - })).arrayBuffer() - if (texturepackUrl) { - const name = mapUrl.slice(mapUrl.lastIndexOf('/') + 1).slice(-30) - await installResourcepackPack(buffer, createFullScreenProgressReporter(), name) - } else { - await openWorldZip(buffer, undefined, connectOptions) - } - return true -} - -export default async () => { - try { - return await inner() - } catch (err) { - setLoadingScreenStatus(`Failed to download/open. Either refresh page or remove map param from URL. Reason: ${err.message}`) - return true - } -} diff --git a/src/dragndrop.ts b/src/dragndrop.ts deleted file mode 100644 index 5a16bc05..00000000 --- a/src/dragndrop.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { promisify } from 'util' -import fs from 'fs' -import * as nbt from 'prismarine-nbt' -import RegionFile from 'prismarine-provider-anvil/src/region' -import { versions } from 'minecraft-data' -import { getThreeJsRendererMethods } from 'renderer/viewer/three/threeJsMethods' -import { openWorldDirectory, openWorldZip } from './browserfs' -import { isGameActive } from './globalState' -import { showNotification } from './react/NotificationProvider' -import { openFile, VALID_REPLAY_EXTENSIONS } from './packetsReplay/replayPackets' - -const parseNbt = promisify(nbt.parse) -const simplifyNbt = nbt.simplify -window.nbt = nbt - -// Supported image types for skybox -const VALID_IMAGE_EXTENSIONS = ['.png', '.jpg', '.jpeg', '.webp'] - -// todo display drop zone -for (const event of ['drag', 'dragstart', 'dragend', 'dragover', 'dragenter', 'dragleave', 'drop']) { - window.addEventListener(event, (e: any) => { - if (e.dataTransfer && !e.dataTransfer.types.includes('Files')) { - // e.dataTransfer.effectAllowed = "none" - return - } - e.preventDefault() - }) -} -window.addEventListener('drop', async e => { - if (!e.dataTransfer?.files.length) return - const { items } = e.dataTransfer - const item = items[0] - if (item.getAsFileSystemHandle) { - const filehandle = await item.getAsFileSystemHandle() as FileSystemFileHandle | FileSystemDirectoryHandle - if (filehandle.kind === 'file') { - const file = await filehandle.getFile() - - await handleDroppedFile(file) - } else { - if (isGameActive(false)) { - alert('Exit current world first, before loading a new one.') - return - } - await openWorldDirectory(filehandle) - } - } else { - await handleDroppedFile(item.getAsFile()!) - } -}) - -async function handleDroppedFile (file: File) { - // Check for image files first when game is active - if (isGameActive(false) && VALID_IMAGE_EXTENSIONS.some(ext => file.name.toLowerCase().endsWith(ext))) { - try { - // Convert image to base64 - const reader = new FileReader() - const base64Promise = new Promise((resolve, reject) => { - reader.onload = () => resolve(reader.result as string) - reader.onerror = reject - }) - reader.readAsDataURL(file) - const base64Image = await base64Promise - - // Get ThreeJS backend methods and update skybox - const setSkyboxImage = getThreeJsRendererMethods()?.setSkyboxImage - if (setSkyboxImage) { - await setSkyboxImage(base64Image) - showNotification('Skybox updated successfully') - } else { - showNotification('Cannot update skybox - renderer does not support it') - } - return - } catch (err) { - console.error('Failed to update skybox:', err) - showNotification('Failed to update skybox', 'error') - return - } - } - - if (file.name.endsWith('.zip')) { - void openWorldZip(file) - return - } - // if (file.name.endsWith('.mca')) // TODO let's do something interesting with it: viewer? - if (file.name.endsWith('.rar')) { - alert('Rar files are not supported yet!') - return - } - if (VALID_REPLAY_EXTENSIONS.some(ext => file.name.endsWith(ext)) || file.name.startsWith('packets-replay')) { - const contents = await file.text() - openFile({ - contents, - filename: file.name, - filesize: file.size - }) - return - } - if (file.name.endsWith('.mca')) { - const tempPath = '/temp/temp.mca' - try { - await fs.promises.writeFile(tempPath, Buffer.from(await file.arrayBuffer()) as any) - const region = new RegionFile(tempPath) - await region.initialize() - const chunks: Record = {} - console.log('Reading chunks...') - console.log(chunks) - let versionDetected = false - for (const [i, _] of Array.from({ length: 32 }).entries()) { - for (const [k, _] of Array.from({ length: 32 }).entries()) { - // todo, may use faster reading, but features is not commonly used - // eslint-disable-next-line no-await-in-loop - const nbt = await region.read(i, k) - chunks[`${i},${k}`] = nbt - if (nbt && !versionDetected) { - const simplified = simplifyNbt(nbt) - const version = versions.pc.find(x => x['dataVersion'] === simplified.DataVersion)?.minecraftVersion - console.log('Detected version', version ?? 'unknown') - versionDetected = true - } - } - } - Object.defineProperty(chunks, 'simplified', { - get () { - const mapped = {} - for (const [i, _] of Array.from({ length: 32 }).entries()) { - for (const [k, _] of Array.from({ length: 32 }).entries()) { - const key = `${i},${k}` - const chunk = chunks[key] - if (!chunk) continue - mapped[key] = simplifyNbt(chunk) - } - } - return mapped - }, - }) - console.log('Done!', chunks) - } finally { - await fs.promises.unlink(tempPath) - } - return - } - - const buffer = await file.arrayBuffer() - const parsed = await parseNbt(Buffer.from(buffer)).catch((err) => { - alert('Couldn\'t parse nbt, ensure you are opening .dat or file (or .zip/folder with a world)') - throw err - }) - showNotification(`${file.name} data available in browser console`) - console.log('raw', parsed) - console.log('simplified', nbt.simplify(parsed)) -} diff --git a/src/entities.ts b/src/entities.ts deleted file mode 100644 index 674f91ef..00000000 --- a/src/entities.ts +++ /dev/null @@ -1,368 +0,0 @@ -import { Entity } from 'prismarine-entity' -import { versionToNumber } from 'renderer/viewer/common/utils' -import tracker from '@nxg-org/mineflayer-tracker' -import { loader as autoJumpPlugin } from '@nxg-org/mineflayer-auto-jump' -import { subscribeKey } from 'valtio/utils' -import { getThreeJsRendererMethods } from 'renderer/viewer/three/threeJsMethods' -import { Team } from 'mineflayer' -import { options, watchValue } from './optionsStorage' -import { gameAdditionalState, miscUiState } from './globalState' -import { EntityStatus } from './mineflayer/entityStatus' - - -const updateAutoJump = () => { - if (!bot?.autoJumper) return - const autoJump = options.autoParkour || (options.autoJump === 'auto' ? miscUiState.currentTouch && !miscUiState.usingGamepadInput : options.autoJump === 'always') - bot.autoJumper.setOpts({ - // jumpIntoWater: options.autoParkour, - jumpOnAllEdges: options.autoParkour, - // strictBlockCollision: true, - }) - if (autoJump === bot.autoJumper.enabled) return - if (autoJump) { - bot.autoJumper.enable() - } else { - bot.autoJumper.disable() - } -} -subscribeKey(options, 'autoJump', () => { - updateAutoJump() -}) -subscribeKey(options, 'autoParkour', () => { - updateAutoJump() -}) -subscribeKey(miscUiState, 'usingGamepadInput', () => { - updateAutoJump() -}) -subscribeKey(miscUiState, 'currentTouch', () => { - updateAutoJump() -}) - -customEvents.on('gameLoaded', () => { - bot.loadPlugin(tracker) - bot.loadPlugin(autoJumpPlugin) - updateAutoJump() - - const playerPerAnimation = {} as Record - const checkEntityData = (e: Entity) => { - if (!e.username) return - window.debugEntityMetadata ??= {} - window.debugEntityMetadata[e.username] = e - if (e.type === 'player') { - bot.tracker.trackEntity(e) - } - } - - const trackBotEntity = () => { - // Always track the bot entity for animations - if (bot.entity) { - bot.tracker.trackEntity(bot.entity) - } - } - - let lastCall = 0 - bot.on('physicsTick', () => { - // throttle, tps: 6 - if (Date.now() - lastCall < 166) return - lastCall = Date.now() - for (const [id, { tracking, info }] of Object.entries(bot.tracker.trackingData)) { - if (!tracking) continue - const e = bot.entities[id] - if (!e) continue - const speed = info.avgVel - const WALKING_SPEED = 0.03 - const SPRINTING_SPEED = 0.18 - const isCrouched = e === bot.entity ? gameAdditionalState.isSneaking : e['crouching'] - const isWalking = Math.abs(speed.x) > WALKING_SPEED || Math.abs(speed.z) > WALKING_SPEED - const isSprinting = Math.abs(speed.x) > SPRINTING_SPEED || Math.abs(speed.z) > SPRINTING_SPEED - - const newAnimation = - isCrouched ? (isWalking ? 'crouchWalking' : 'crouch') - : isWalking ? (isSprinting ? 'running' : 'walking') - : 'idle' - if (newAnimation !== playerPerAnimation[id]) { - // Handle bot entity animation specially (for player entity in third person) - if (e === bot.entity) { - getThreeJsRendererMethods()?.playEntityAnimation('player_entity', newAnimation) - } else { - getThreeJsRendererMethods()?.playEntityAnimation(e.id, newAnimation) - } - playerPerAnimation[id] = newAnimation - } - } - }) - - bot.on('entitySwingArm', (e) => { - getThreeJsRendererMethods()?.playEntityAnimation(e.id, 'oneSwing') - }) - - bot.on('botArmSwingStart', (hand) => { - if (hand === 'right') { - getThreeJsRendererMethods()?.playEntityAnimation('player_entity', 'oneSwing') - } - }) - - bot.inventory.on('updateSlot', (slot) => { - if (slot === 5 || slot === 6 || slot === 7 || slot === 8) { - const item = bot.inventory.slots[slot]! - bot.entity.equipment[slot - 3] = item - appViewer.worldView?.emit('playerEntity', bot.entity) - } - }) - bot.on('heldItemChanged', () => { - const item = bot.inventory.slots[bot.quickBarSlot + 36]! - bot.entity.equipment[0] = item - appViewer.worldView?.emit('playerEntity', bot.entity) - }) - - bot._client.on('damage_event', (data) => { - const { entityId, sourceTypeId: damage } = data - getThreeJsRendererMethods()?.damageEntity(entityId, damage) - }) - - bot._client.on('entity_status', (data) => { - if (versionToNumber(bot.version) >= versionToNumber('1.19.4')) return - const { entityId, entityStatus } = data - if (entityStatus === EntityStatus.HURT) { - getThreeJsRendererMethods()?.damageEntity(entityId, entityStatus) - } - - if (entityStatus === EntityStatus.BURNED) { - updateEntityStates(entityId, true, true) - } - }) - - // on fire events - bot._client.on('entity_metadata', (data) => { - if (data.entityId !== bot.entity.id) return - handleEntityMetadata(data) - }) - - bot.on('end', () => { - if (onFireTimeout) { - clearTimeout(onFireTimeout) - } - }) - - bot.on('respawn', () => { - if (onFireTimeout) { - clearTimeout(onFireTimeout) - } - }) - - const updateCamera = (entity: Entity) => { - if (bot.game.gameMode !== 'spectator') return - bot.entity.position = entity.position.clone() - void bot.look(entity.yaw, entity.pitch, true) - bot.entity.yaw = entity.yaw - bot.entity.pitch = entity.pitch - } - - bot.on('entityGone', (entity) => { - bot.tracker.stopTrackingEntity(entity, true) - }) - - bot.on('entityMoved', (e) => { - checkEntityData(e) - if (appViewer.playerState.reactive.cameraSpectatingEntity === e.id) { - updateCamera(e) - } - }) - bot._client.on('entity_velocity', (packet) => { - const e = bot.entities[packet.entityId] - if (!e) return - checkEntityData(e) - }) - - for (const entity of Object.values(bot.entities)) { - if (entity !== bot.entity) { - checkEntityData(entity) - } - } - - // Track bot entity initially - trackBotEntity() - - bot.on('entitySpawn', (e) => { - checkEntityData(e) - if (appViewer.playerState.reactive.cameraSpectatingEntity === e.id) { - updateCamera(e) - } - }) - bot.on('entityUpdate', checkEntityData) - bot.on('entityEquip', checkEntityData) - - // Re-track bot entity after login - bot.on('login', () => { - setTimeout(() => { - trackBotEntity() - }) // Small delay to ensure bot.entity is properly set - }) - - bot._client.on('camera', (packet) => { - if (bot.player.entity.id === packet.cameraId) { - if (appViewer.playerState.utils.isSpectatingEntity() && appViewer.playerState.reactive.cameraSpectatingEntity) { - const entity = bot.entities[appViewer.playerState.reactive.cameraSpectatingEntity] - appViewer.playerState.reactive.cameraSpectatingEntity = undefined - if (entity) { - // do a force entity update - bot.emit('entityUpdate', entity) - } - } - } else if (appViewer.playerState.reactive.gameMode === 'spectator') { - const entity = bot.entities[packet.cameraId] - appViewer.playerState.reactive.cameraSpectatingEntity = packet.cameraId - if (entity) { - updateCamera(entity) - // do a force entity update - bot.emit('entityUpdate', entity) - } - } - }) - - const applySkinTexturesProxy = (url: string | undefined) => { - const { appConfig } = miscUiState - if (appConfig?.skinTexturesProxy) { - return url?.replace('http://textures.minecraft.net/', appConfig.skinTexturesProxy) - .replace('https://textures.minecraft.net/', appConfig.skinTexturesProxy) - } - return url - } - - // Texture override from packet properties - const updateSkin = (player: import('mineflayer').Player) => { - if (!player.uuid || !player.username || !player.skinData) return - - try { - const skinUrl = applySkinTexturesProxy(player.skinData.url) - const capeUrl = applySkinTexturesProxy((player.skinData as any).capeUrl) - - // Find entity with matching UUID and update skin - let entityId = '' - for (const [entId, entity] of Object.entries(bot.entities)) { - if (entity.uuid === player.uuid) { - entityId = entId - break - } - } - // even if not found, still record to cache - void getThreeJsRendererMethods()!.updatePlayerSkin(entityId, player.username, player.uuid, skinUrl ?? true, capeUrl) - } catch (err) { - reportError(new Error('Error applying skin texture:', { cause: err })) - } - } - - bot.on('playerJoined', updateSkin) - bot.on('playerUpdated', updateSkin) - for (const entity of Object.values(bot.players)) { - updateSkin(entity) - } - - const teamUpdated = (team: Team) => { - for (const entity of Object.values(bot.entities)) { - if (entity.type === 'player' && entity.username && team.members.includes(entity.username) || entity.uuid && team.members.includes(entity.uuid)) { - bot.emit('entityUpdate', entity) - } - } - } - bot.on('teamUpdated', teamUpdated) - for (const team of Object.values(bot.teams)) { - teamUpdated(team) - } - - const updateEntityNameTags = (team: Team) => { - for (const entity of Object.values(bot.entities)) { - const entityTeam = entity.type === 'player' && entity.username ? bot.teamMap[entity.username] : entity.uuid ? bot.teamMap[entity.uuid] : undefined - if ((entityTeam?.nameTagVisibility === 'hideForOwnTeam' && entityTeam.name === team.name) - || (entityTeam?.nameTagVisibility === 'hideForOtherTeams' && entityTeam.name !== team.name)) { - bot.emit('entityUpdate', entity) - } - } - } - - const doEntitiesNeedUpdating = (team: Team) => { - return team.nameTagVisibility === 'never' - || (team.nameTagVisibility === 'hideForOtherTeams' && appViewer.playerState.reactive.team?.team !== team.team) - || (team.nameTagVisibility === 'hideForOwnTeam' && appViewer.playerState.reactive.team?.team === team.team) - } - - bot.on('teamMemberAdded', (team: Team, members: string[]) => { - if (members.includes(bot.username) && appViewer.playerState.reactive.team?.team !== team.team) { - appViewer.playerState.reactive.team = team - // Player was added to a team, need to check if any entities need updating - updateEntityNameTags(team) - } else if (doEntitiesNeedUpdating(team)) { - // Need to update all entities that were added - for (const entity of Object.values(bot.entities)) { - if (entity.type === 'player' && entity.username && members.includes(entity.username) || entity.uuid && members.includes(entity.uuid)) { - bot.emit('entityUpdate', entity) - } - } - } - }) - - bot.on('teamMemberRemoved', (team: Team, members: string[]) => { - if (members.includes(bot.username) && appViewer.playerState.reactive.team?.team === team.team) { - appViewer.playerState.reactive.team = undefined - // Player was removed from a team, need to check if any entities need updating - updateEntityNameTags(team) - } else if (doEntitiesNeedUpdating(team)) { - // Need to update all entities that were removed - for (const entity of Object.values(bot.entities)) { - if (entity.type === 'player' && entity.username && members.includes(entity.username) || entity.uuid && members.includes(entity.uuid)) { - bot.emit('entityUpdate', entity) - } - } - } - }) - - bot.on('teamRemoved', (team: Team) => { - if (appViewer.playerState.reactive.team?.team === team?.team) { - appViewer.playerState.reactive.team = undefined - // Player's team was removed, need to update all entities that are in a team - updateEntityNameTags(team) - } - }) - -}) - -// Constants -const SHARED_FLAGS_KEY = 0 -const ENTITY_FLAGS = { - ON_FIRE: 0x01, // Bit 0 - SNEAKING: 0x02, // Bit 1 - SPRINTING: 0x08, // Bit 3 - SWIMMING: 0x10, // Bit 4 - INVISIBLE: 0x20, // Bit 5 - GLOWING: 0x40, // Bit 6 - FALL_FLYING: 0x80 // Bit 7 (elytra flying) -} - -let onFireTimeout: NodeJS.Timeout | undefined -const updateEntityStates = (entityId: number, onFire: boolean, timeout?: boolean) => { - if (entityId !== bot.entity.id) return - appViewer.playerState.reactive.onFire = onFire - if (onFireTimeout) { - clearTimeout(onFireTimeout) - } - if (timeout) { - onFireTimeout = setTimeout(() => { - updateEntityStates(entityId, false, false) - }, 5000) - } -} - -// Process entity metadata packet -function handleEntityMetadata (packet: { entityId: number, metadata: Array<{ key: number, type: string, value: number }> }) { - const { entityId, metadata } = packet - - // Find shared flags in metadata - const flagsData = metadata.find(meta => meta.key === SHARED_FLAGS_KEY && - meta.type === 'byte') - - // Update fire state if flags were found - if (flagsData) { - const wasOnFire = appViewer.playerState.reactive.onFire - appViewer.playerState.reactive.onFire = (flagsData.value & ENTITY_FLAGS.ON_FIRE) !== 0 - } -} diff --git a/src/env.d.ts b/src/env.d.ts deleted file mode 100644 index e565fcec..00000000 --- a/src/env.d.ts +++ /dev/null @@ -1,37 +0,0 @@ -declare namespace NodeJS { - interface ProcessEnv { - // Build configuration - NODE_ENV: 'development' | 'production' - MIN_MC_VERSION?: string - MAX_MC_VERSION?: string - ALWAYS_COMPRESS_LARGE_DATA?: 'true' | 'false' - SINGLE_FILE_BUILD?: 'true' | 'false' - WS_PORT?: string - DISABLE_SERVICE_WORKER?: 'true' | 'false' - CONFIG_JSON_SOURCE?: 'BUNDLED' | 'REMOTE' - LOCAL_CONFIG_FILE?: string - BUILD_VERSION?: string - - // Build internals - GITHUB_REPOSITORY?: string - VERCEL_GIT_REPO_OWNER?: string - VERCEL_GIT_REPO_SLUG?: string - - // UI - MAIN_MENU_LINKS?: string - ALWAYS_MINIMAL_SERVER_UI?: 'true' | 'false' - - // App features - ENABLE_COOKIE_STORAGE?: string - COOKIE_STORAGE_PREFIX?: string - - // Build info. Release information - RELEASE_TAG?: string - RELEASE_LINK?: string - RELEASE_CHANGELOG?: string - - // Build info - INLINED_APP_CONFIG?: string - GITHUB_URL?: string - } -} diff --git a/src/errorLoadingScreenHelpers.ts b/src/errorLoadingScreenHelpers.ts deleted file mode 100644 index 2f882f89..00000000 --- a/src/errorLoadingScreenHelpers.ts +++ /dev/null @@ -1,12 +0,0 @@ -export const guessProblem = (errorMessage: string) => { - if (errorMessage.endsWith('Socket error: ECONNREFUSED')) { - return 'Most probably the server is not running.' - } -} - -export const loadingTexts = [ - 'Like the project? Give us a star on GitHub or rate us on AlternativeTo!', - 'To stay updated with the latest changes, go to the GitHub page, click on "Watch", choose "Custom", and then opt for "Releases"!', - 'Upvote features on GitHub issues to help us prioritize them!', - 'Want to contribute to the project? Check out Contributing.md on GitHub!', -] diff --git a/src/external/index.ts b/src/external/index.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/src/flyingSquidEvents.ts b/src/flyingSquidEvents.ts deleted file mode 100644 index 7231dd27..00000000 --- a/src/flyingSquidEvents.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { saveServer } from './flyingSquidUtils' -import { watchUnloadForCleanup } from './gameUnload' -import { showModal } from './globalState' -import { options } from './optionsStorage' -import { chatInputValueGlobal } from './react/Chat' -import { showNotification } from './react/NotificationProvider' - -export default () => { - localServer!.on('warpsLoaded', () => { - if (!localServer) return - showNotification(`${localServer.warps.length} Warps loaded`, 'Use /warp to teleport to a warp point.', false, 'label-alt', () => { - chatInputValueGlobal.value = '/warp ' - showModal({ reactType: 'chat' }) - }) - }) - - if (options.singleplayerAutoSave) { - const autoSaveInterval = setInterval(() => { - if (options.singleplayerAutoSave) { - void saveServer(true) - } - }, 2000) - watchUnloadForCleanup(() => { - clearInterval(autoSaveInterval) - }) - } -} diff --git a/src/flyingSquidUtils.ts b/src/flyingSquidUtils.ts deleted file mode 100644 index 2ae0be7c..00000000 --- a/src/flyingSquidUtils.ts +++ /dev/null @@ -1,44 +0,0 @@ -import * as crypto from 'crypto' -import UUID from 'uuid-1345' -import { fsState } from './loadSave' - - -// https://github.com/PrismarineJS/node-minecraft-protocol/blob/cf1f67117d586b5e6e21f0d9602da12e9fcf46b6/src/server/login.js#L170 -function javaUUID (s: string) { - const hash = crypto.createHash('md5') - hash.update(s, 'utf8') - const buffer = hash.digest() - buffer[6] = (buffer[6] & 15) | 48 - buffer[8] = (buffer[8] & 63) | 128 - return buffer -} - -export function nameToMcOfflineUUID (name) { - return (new UUID(javaUUID('OfflinePlayer:' + name))).toString() -} - -export async function savePlayers (autoSave: boolean) { - if (!localServer?.players[0]) return - if (autoSave && new URL(location.href).searchParams.get('noSave') === 'true') return - //@ts-expect-error TODO - await localServer.savePlayersSingleplayer() -} - -// todo flying squid should expose save function instead -export const saveServer = async (autoSave = true) => { - if (!localServer || fsState.isReadonly) return - // todo - console.time('save server') - const worlds = [(localServer as any).overworld] as Array - await Promise.all([localServer.writeLevelDat(), savePlayers(autoSave), ...worlds.map(async world => world.saveNow())]) - console.timeEnd('save server') -} -export const disconnect = async () => { - if (localServer) { - await saveServer() - void localServer.quit() // todo investigate we should await - } - window.history.replaceState({}, '', `${window.location.pathname}`) // remove qs - bot.end('You left the server') - location.reload() -} diff --git a/src/gameUnload.ts b/src/gameUnload.ts deleted file mode 100644 index d5622411..00000000 --- a/src/gameUnload.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { subscribe } from 'valtio' -import { miscUiState } from './globalState' - -let toCleanup = [] as Array<() => void> - -export const watchUnloadForCleanup = (func: () => void) => { - toCleanup.push(func) -} - -subscribe(miscUiState, () => { - if (!miscUiState.gameLoaded) { - for (const func of toCleanup) { - func() - } - toCleanup = [] - } -}) diff --git a/src/generatedClientPackets.ts b/src/generatedClientPackets.ts deleted file mode 100644 index 2715cd73..00000000 --- a/src/generatedClientPackets.ts +++ /dev/null @@ -1,543 +0,0 @@ -export interface ClientWriteMap { - keep_alive: /** 1.7 */ { - keepAliveId: number; - } | /** 1.12.2 */ { - keepAliveId: bigint; - }; - /** Removed in 1.19 */ - chat: /** 1.7 */ { - message: string; - }; - use_entity: /** 1.7 */ { - target: number; - mouse: number; - x: any; - y: any; - z: any; - } | /** 1.9 */ { - target: number; - mouse: number; - x: any; - y: any; - z: any; - hand: any; - } | /** 1.16 */ { - target: number; - mouse: number; - x: any; - y: any; - z: any; - hand: any; - sneaking: boolean; - }; - flying: /** 1.7 */ { - onGround: boolean; - }; - position: /** 1.7 */ { - x: number; - stance: number; - y: number; - z: number; - onGround: boolean; - } | /** 1.8 */ { - x: number; - y: number; - z: number; - onGround: boolean; - }; - look: /** 1.7 */ { - yaw: number; - pitch: number; - onGround: boolean; - }; - position_look: /** 1.7 */ { - x: number; - stance: number; - y: number; - z: number; - yaw: number; - pitch: number; - onGround: boolean; - } | /** 1.8 */ { - x: number; - y: number; - z: number; - yaw: number; - pitch: number; - onGround: boolean; - }; - block_dig: /** 1.7 */ { - status: number; - location: any; - face: number; - } | /** 1.8 */ { - status: number; - location: { x: number, y: number, z: number }; - face: number; - } | /** 1.19 */ { - status: number; - location: { x: number, y: number, z: number }; - face: number; - sequence: number; - }; - block_place: /** 1.7 */ { - location: any; - direction: number; - heldItem: any; - cursorX: number; - cursorY: number; - cursorZ: number; - } | /** 1.8 */ { - location: { x: number, y: number, z: number }; - direction: number; - heldItem: any; - cursorX: number; - cursorY: number; - cursorZ: number; - } | /** 1.9 */ { - location: { x: number, y: number, z: number }; - direction: number; - hand: number; - cursorX: number; - cursorY: number; - cursorZ: number; - } | /** 1.14 */ { - hand: number; - location: { x: number, y: number, z: number }; - direction: number; - cursorX: number; - cursorY: number; - cursorZ: number; - insideBlock: boolean; - } | /** 1.19 */ { - hand: number; - location: { x: number, y: number, z: number }; - direction: number; - cursorX: number; - cursorY: number; - cursorZ: number; - insideBlock: boolean; - sequence: number; - }; - held_item_slot: /** 1.7 */ { - slotId: number; - }; - arm_animation: /** 1.7 */ { - entityId: number; - animation: number; - } | /** 1.8 */ { - - } | /** 1.9 */ { - hand: number; - }; - entity_action: /** 1.7 */ { - entityId: number; - actionId: number; - jumpBoost: number; - }; - steer_vehicle: /** 1.7 */ { - sideways: number; - forward: number; - jump: boolean; - unmount: boolean; - } | /** 1.8 */ { - sideways: number; - forward: number; - jump: number; - }; - close_window: /** 1.7 */ { - windowId: number; - }; - window_click: /** 1.7 */ { - windowId: number; - slot: number; - mouseButton: number; - action: number; - mode: number; - item: any; - } | /** 1.17 */ { - windowId: number; - slot: number; - mouseButton: number; - mode: number; - changedSlots: any; - cursorItem: any; - } | /** 1.17.1 */ { - windowId: number; - stateId: number; - slot: number; - mouseButton: number; - mode: number; - changedSlots: any; - cursorItem: any; - }; - /** Removed in 1.17 */ - transaction: /** 1.7 */ { - windowId: number; - action: number; - accepted: boolean; - }; - set_creative_slot: /** 1.7 */ { - slot: number; - item: any; - }; - enchant_item: /** 1.7 */ { - windowId: number; - enchantment: number; - }; - update_sign: /** 1.7 */ { - location: any; - text1: string; - text2: string; - text3: string; - text4: string; - } | /** 1.8 */ { - location: { x: number, y: number, z: number }; - text1: string; - text2: string; - text3: string; - text4: string; - } | /** 1.20 */ { - location: { x: number, y: number, z: number }; - isFrontText: boolean; - text1: string; - text2: string; - text3: string; - text4: string; - }; - abilities: /** 1.7 */ { - flags: number; - flyingSpeed: number; - walkingSpeed: number; - } | /** 1.16 */ { - flags: number; - }; - tab_complete: /** 1.7 */ { - text: string; - } | /** 1.8 */ { - text: string; - block: any; - } | /** 1.9 */ { - text: string; - assumeCommand: boolean; - lookedAtBlock: any; - } | /** 1.13 */ { - transactionId: number; - text: string; - }; - settings: /** 1.7 */ { - locale: string; - viewDistance: number; - chatFlags: number; - chatColors: boolean; - difficulty: number; - showCape: boolean; - } | /** 1.8 */ { - locale: string; - viewDistance: number; - chatFlags: number; - chatColors: boolean; - skinParts: number; - } | /** 1.9 */ { - locale: string; - viewDistance: number; - chatFlags: number; - chatColors: boolean; - skinParts: number; - mainHand: number; - } | /** 1.17 */ { - locale: string; - viewDistance: number; - chatFlags: number; - chatColors: boolean; - skinParts: number; - mainHand: number; - disableTextFiltering: boolean; - } | /** 1.18 */ { - locale: string; - viewDistance: number; - chatFlags: number; - chatColors: boolean; - skinParts: number; - mainHand: number; - enableTextFiltering: boolean; - enableServerListing: boolean; - }; - client_command: /** 1.7 */ { - payload: number; - } | /** 1.9 */ { - actionId: number; - }; - custom_payload: /** 1.7 */ { - channel: string; - data: any; - }; - packet: /** 1.7 */ { - name: any; - params: any; - }; - spectate: /** 1.8 */ { - target: any; - }; - resource_pack_receive: /** 1.8 */ { - hash: string; - result: number; - } | /** 1.10 */ { - result: number; - } | /** 1.20.3 */ { - uuid: any; - result: number; - }; - teleport_confirm: /** 1.9 */ { - teleportId: number; - }; - vehicle_move: /** 1.9 */ { - x: number; - y: number; - z: number; - yaw: number; - pitch: number; - }; - steer_boat: /** 1.9 */ { - leftPaddle: boolean; - rightPaddle: boolean; - }; - use_item: /** 1.9 */ { - hand: number; - } | /** 1.19 */ { - hand: number; - sequence: number; - }; - /** Removed in 1.12.1 */ - prepare_crafting_grid: /** 1.12 */ { - windowId: number; - actionNumber: number; - returnEntry: any; - prepareEntry: any; - }; - /** Removed in 1.16.2 */ - crafting_book_data: /** 1.12 */ { - type: number; - undefined: any; - }; - advancement_tab: /** 1.12 */ { - action: number; - tabId: any; - }; - craft_recipe_request: /** 1.12.1 */ { - windowId: number; - recipe: number; - makeAll: boolean; - } | /** 1.13 */ { - windowId: number; - recipe: string; - makeAll: boolean; - }; - query_block_nbt: /** 1.13 */ { - transactionId: number; - location: { x: number, y: number, z: number }; - }; - edit_book: /** 1.13 */ { - new_book: any; - signing: boolean; - } | /** 1.13.1 */ { - new_book: any; - signing: boolean; - hand: number; - } | /** 1.17.1 */ { - hand: number; - pages: any; - title: any; - }; - query_entity_nbt: /** 1.13 */ { - transactionId: number; - entityId: number; - }; - pick_item: /** 1.13 */ { - slot: number; - }; - name_item: /** 1.13 */ { - name: string; - }; - select_trade: /** 1.13 */ { - slot: number; - }; - set_beacon_effect: /** 1.13 */ { - primary_effect: number; - secondary_effect: number; - } | /** 1.19 */ { - primary_effect: any; - secondary_effect: any; - }; - update_command_block: /** 1.13 */ { - location: { x: number, y: number, z: number }; - command: string; - mode: number; - flags: number; - }; - update_command_block_minecart: /** 1.13 */ { - entityId: number; - command: string; - track_output: boolean; - }; - update_structure_block: /** 1.13 */ { - location: { x: number, y: number, z: number }; - action: number; - mode: number; - name: string; - offset_x: number; - offset_y: number; - offset_z: number; - size_x: number; - size_y: number; - size_z: number; - mirror: number; - rotation: number; - metadata: string; - integrity: number; - seed: any; - flags: number; - } | /** 1.19 */ { - location: { x: number, y: number, z: number }; - action: number; - mode: number; - name: string; - offset_x: number; - offset_y: number; - offset_z: number; - size_x: number; - size_y: number; - size_z: number; - mirror: number; - rotation: number; - metadata: string; - integrity: number; - seed: number; - flags: number; - }; - set_difficulty: /** 1.14 */ { - newDifficulty: number; - }; - lock_difficulty: /** 1.14 */ { - locked: boolean; - }; - update_jigsaw_block: /** 1.14 */ { - location: { x: number, y: number, z: number }; - attachmentType: string; - targetPool: string; - finalState: string; - } | /** 1.16 */ { - location: { x: number, y: number, z: number }; - name: string; - target: string; - pool: string; - finalState: string; - jointType: string; - } | /** 1.20.3 */ { - location: { x: number, y: number, z: number }; - name: string; - target: string; - pool: string; - finalState: string; - jointType: string; - selection_priority: number; - placement_priority: number; - }; - generate_structure: /** 1.16 */ { - location: { x: number, y: number, z: number }; - levels: number; - keepJigsaws: boolean; - }; - displayed_recipe: /** 1.16.2 */ { - recipeId: string; - }; - recipe_book: /** 1.16.2 */ { - bookId: number; - bookOpen: boolean; - filterActive: boolean; - }; - pong: /** 1.17 */ { - id: number; - }; - chat_command: /** 1.19 */ { - command: string; - timestamp: bigint; - salt: bigint; - argumentSignatures: any; - signedPreview: boolean; - } | /** 1.19.2 */ { - command: string; - timestamp: bigint; - salt: bigint; - argumentSignatures: any; - signedPreview: boolean; - previousMessages: any; - lastRejectedMessage: any; - } | /** 1.19.3 */ { - command: string; - timestamp: bigint; - salt: bigint; - argumentSignatures: any; - messageCount: number; - acknowledged: any; - }; - chat_message: /** 1.19 */ { - message: string; - timestamp: bigint; - salt: bigint; - signature: any; - signedPreview: boolean; - } | /** 1.19.2 */ { - message: string; - timestamp: bigint; - salt: bigint; - signature: any; - signedPreview: boolean; - previousMessages: any; - lastRejectedMessage: any; - } | /** 1.19.3 */ { - message: string; - timestamp: bigint; - salt: bigint; - signature: any; - offset: number; - acknowledged: any; - }; - /** Removed in 1.19.3 */ - chat_preview: /** 1.19 */ { - query: number; - message: string; - }; - message_acknowledgement: /** 1.19.2 */ { - previousMessages: any; - lastRejectedMessage: any; - } | /** 1.19.3 */ { - count: number; - }; - chat_session_update: /** 1.19.3 */ { - sessionUUID: any; - expireTime: bigint; - publicKey: any; - signature: any; - }; - chunk_batch_received: /** 1.20.2 */ { - chunksPerTick: number; - }; - /** Removed in 1.20.3 */ - configuation_acknowledged: /** 1.20.2 */ { - - }; - ping_request: /** 1.20.2 */ { - id: bigint; - }; - configuration_acknowledged: /** 1.20.3 */ { - - }; - set_slot_state: /** 1.20.3 */ { - slot_id: number; - window_id: number; - state: boolean; - }; -} - -export declare const clientWrite: (name: T, data: ClientWriteMap[T]) => Buffer diff --git a/src/generatedServerPackets.ts b/src/generatedServerPackets.ts deleted file mode 100644 index 3b3ce018..00000000 --- a/src/generatedServerPackets.ts +++ /dev/null @@ -1,1474 +0,0 @@ -// from server to client - -export interface ClientOnMap { - keep_alive: /** 1.7 */ { - keepAliveId: number; - } | /** 1.12.2 */ { - keepAliveId: bigint; - }; - login:/** 1.8 */ { - entityId: number; - gameMode: number; - dimension: number; - difficulty: number; - maxPlayers: number; - levelType: string; - reducedDebugInfo: boolean; - } | /** 1.14 */ { - entityId: number; - gameMode: number; - dimension: number; - maxPlayers: number; - levelType: string; - viewDistance: number; - reducedDebugInfo: boolean; - } | /** 1.15 */ { - entityId: number; - gameMode: number; - dimension: number; - hashedSeed: bigint; - maxPlayers: number; - levelType: string; - viewDistance: number; - reducedDebugInfo: boolean; - enableRespawnScreen: boolean; - } | /** 1.16 */ { - entityId: number; - gameMode: number; - previousGameMode: number; - worldNames: any; - dimensionCodec: any; - dimension: string; - worldName: string; - hashedSeed: bigint; - maxPlayers: number; - viewDistance: number; - reducedDebugInfo: boolean; - enableRespawnScreen: boolean; - isDebug: boolean; - isFlat: boolean; - } | /** 1.16.2 */ { - entityId: number; - isHardcore: boolean; - gameMode: number; - previousGameMode: number; - worldNames: any; - dimensionCodec: any; - dimension: any; - worldName: string; - hashedSeed: bigint; - maxPlayers: number; - viewDistance: number; - reducedDebugInfo: boolean; - enableRespawnScreen: boolean; - isDebug: boolean; - isFlat: boolean; - } | /** 1.18 */ { - entityId: number; - isHardcore: boolean; - gameMode: number; - previousGameMode: number; - worldNames: any; - dimensionCodec: any; - dimension: any; - worldName: string; - hashedSeed: bigint; - maxPlayers: number; - viewDistance: number; - simulationDistance: number; - reducedDebugInfo: boolean; - enableRespawnScreen: boolean; - isDebug: boolean; - isFlat: boolean; - } | /** 1.19 */ { - entityId: number; - isHardcore: boolean; - gameMode: number; - previousGameMode: number; - worldNames: any; - dimensionCodec: any; - worldType: string; - worldName: string; - hashedSeed: bigint; - maxPlayers: number; - viewDistance: number; - simulationDistance: number; - reducedDebugInfo: boolean; - enableRespawnScreen: boolean; - isDebug: boolean; - isFlat: boolean; - death: any; - } | /** 1.20 */ { - entityId: number; - isHardcore: boolean; - gameMode: number; - previousGameMode: number; - worldNames: any; - dimensionCodec: any; - worldType: string; - worldName: string; - hashedSeed: bigint; - maxPlayers: number; - viewDistance: number; - simulationDistance: number; - reducedDebugInfo: boolean; - enableRespawnScreen: boolean; - isDebug: boolean; - isFlat: boolean; - death: any; - portalCooldown: number; - }; - /** Removed in 1.19 */ - chat: /** 1.7 */ { - message: string; - } | /** 1.8 */ { - message: string; - position: number; - } | /** 1.16 */ { - message: string; - position: number; - sender: any; - }; - update_time: /** 1.7 */ { - age: bigint; - time: bigint; - }; - entity_equipment: /** 1.7 */ { - entityId: number; - slot: number; - item: any; - } | /** 1.16 */ { - entityId: number; - equipments: any; - }; - spawn_position:/** 1.8 */ { - location: { x: number, y: number, z: number }; - } | /** 1.17 */ { - location: { x: number, y: number, z: number }; - angle: number; - }; - update_health: /** 1.7 */ { - health: number; - food: number; - foodSaturation: number; - }; - respawn: /** 1.7 */ { - dimension: number; - difficulty: number; - gamemode: number; - levelType: string; - } | /** 1.14 */ { - dimension: number; - gamemode: number; - levelType: string; - } | /** 1.15 */ { - dimension: number; - hashedSeed: bigint; - gamemode: number; - levelType: string; - } | /** 1.16 */ { - dimension: string; - worldName: string; - hashedSeed: bigint; - gamemode: number; - previousGamemode: number; - isDebug: boolean; - isFlat: boolean; - copyMetadata: boolean; - } | /** 1.16.2 */ { - dimension: any; - worldName: string; - hashedSeed: bigint; - gamemode: number; - previousGamemode: number; - isDebug: boolean; - isFlat: boolean; - copyMetadata: boolean; - } | /** 1.19 */ { - dimension: string; - worldName: string; - hashedSeed: bigint; - gamemode: number; - previousGamemode: number; - isDebug: boolean; - isFlat: boolean; - copyMetadata: boolean; - death: any; - } | /** 1.20 */ { - dimension: string; - worldName: string; - hashedSeed: bigint; - gamemode: number; - previousGamemode: number; - isDebug: boolean; - isFlat: boolean; - copyMetadata: boolean; - death: any; - portalCooldown: number; - }; - position: /** 1.8 */ { - x: number; - y: number; - z: number; - yaw: number; - pitch: number; - flags: number; - } | /** 1.9 */ { - x: number; - y: number; - z: number; - yaw: number; - pitch: number; - flags: number; - teleportId: number; - } | /** 1.17 */ { - x: number; - y: number; - z: number; - yaw: number; - pitch: number; - flags: number; - teleportId: number; - dismountVehicle: boolean; - } /** 1.19.4 */ ; - held_item_slot: /** 1.7 */ { - slot: number; - }; - /** Removed in 1.14 */ - bed: /** 1.7 */ { - entityId: number; - location: any; - } | /** 1.8 */ { - entityId: number; - location: { x: number, y: number, z: number }; - }; - animation: /** 1.7 */ { - entityId: number; - animation: number; - }; - named_entity_spawn: /** 1.7 */ { - entityId: number; - playerUUID: string; - playerName: string; - data: any; - x: number; - y: number; - z: number; - yaw: number; - pitch: number; - currentItem: number; - metadata: any; - } | /** 1.8 */ { - entityId: number; - playerUUID: any; - x: number; - y: number; - z: number; - yaw: number; - pitch: number; - currentItem: number; - metadata: any; - } | /** 1.9 */ { - entityId: number; - playerUUID: any; - x: number; - y: number; - z: number; - yaw: number; - pitch: number; - metadata: any; - } | /** 1.15 */ { - entityId: number; - playerUUID: any; - x: number; - y: number; - z: number; - yaw: number; - pitch: number; - }; - collect: /** 1.7 */ { - collectedEntityId: number; - collectorEntityId: number; - } | /** 1.11 */ { - collectedEntityId: number; - collectorEntityId: number; - pickupItemCount: number; - }; - spawn_entity: /** 1.7 */ { - entityId: number; - type: number; - x: number; - y: number; - z: number; - pitch: number; - yaw: number; - objectData: any; - } | /** 1.9 */ { - entityId: number; - objectUUID: any; - type: number; - x: number; - y: number; - z: number; - pitch: number; - yaw: number; - objectData: number; - velocityX: number; - velocityY: number; - velocityZ: number; - } | /** 1.19 */ { - entityId: number; - objectUUID: any; - type: number; - x: number; - y: number; - z: number; - pitch: number; - yaw: number; - headPitch: number; - objectData: number; - velocityX: number; - velocityY: number; - velocityZ: number; - }; - /** Removed in 1.19 */ - spawn_entity_living: /** 1.7 */ { - entityId: number; - type: number; - x: number; - y: number; - z: number; - yaw: number; - pitch: number; - headPitch: number; - velocityX: number; - velocityY: number; - velocityZ: number; - metadata: any; - } | /** 1.9 */ { - entityId: number; - entityUUID: any; - type: number; - x: number; - y: number; - z: number; - yaw: number; - pitch: number; - headPitch: number; - velocityX: number; - velocityY: number; - velocityZ: number; - metadata: any; - } | /** 1.15 */ { - entityId: number; - entityUUID: any; - type: number; - x: number; - y: number; - z: number; - yaw: number; - pitch: number; - headPitch: number; - velocityX: number; - velocityY: number; - velocityZ: number; - }; - /** Removed in 1.19 */ - spawn_entity_painting: /** 1.7 */ { - entityId: number; - title: string; - location: any; - direction: number; - } | /** 1.8 */ { - entityId: number; - title: string; - location: { x: number, y: number, z: number }; - direction: number; - } | /** 1.9 */ { - entityId: number; - entityUUID: any; - title: string; - location: { x: number, y: number, z: number }; - direction: number; - } | /** 1.13 */ { - entityId: number; - entityUUID: any; - title: number; - location: { x: number, y: number, z: number }; - direction: number; - }; - spawn_entity_experience_orb: /** 1.7 */ { - entityId: number; - x: number; - y: number; - z: number; - count: number; - }; - entity_velocity: /** 1.7 */ { - entityId: number; - velocityX: number; - velocityY: number; - velocityZ: number; - }; - /** Removed in 1.17 */ - entity_destroy: /** 1.17.1 */ { - entityIds: any; - }; - /** Removed in 1.17 */ - entity: /** 1.7 */ { - entityId: number; - }; - rel_entity_move: /** 1.7 */ { - entityId: number; - dX: number; - dY: number; - dZ: number; - } | /** 1.8 */ { - entityId: number; - dX: number; - dY: number; - dZ: number; - onGround: boolean; - }; - entity_look: /** 1.7 */ { - entityId: number; - yaw: number; - pitch: number; - } | /** 1.8 */ { - entityId: number; - yaw: number; - pitch: number; - onGround: boolean; - }; - entity_move_look: /** 1.7 */ { - entityId: number; - dX: number; - dY: number; - dZ: number; - yaw: number; - pitch: number; - } | /** 1.8 */ { - entityId: number; - dX: number; - dY: number; - dZ: number; - yaw: number; - pitch: number; - onGround: boolean; - }; - entity_teleport: /** 1.7 */ { - entityId: number; - x: number; - y: number; - z: number; - yaw: number; - pitch: number; - } | /** 1.8 */ { - entityId: number; - x: number; - y: number; - z: number; - yaw: number; - pitch: number; - onGround: boolean; - }; - entity_head_rotation: /** 1.7 */ { - entityId: number; - headYaw: number; - }; - entity_status: /** 1.7 */ { - entityId: number; - entityStatus: number; - }; - attach_entity: /** 1.7 */ { - entityId: number; - vehicleId: number; - leash: boolean; - } | /** 1.9 */ { - entityId: number; - vehicleId: number; - }; - entity_metadata: /** 1.7 */ { - entityId: number; - metadata: any; - }; - entity_effect: /** 1.7 */ { - entityId: number; - effectId: number; - amplifier: number; - duration: number; - } | /** 1.8 */ { - entityId: number; - effectId: number; - amplifier: number; - duration: number; - hideParticles: boolean; - } | /** 1.9 */ { - entityId: number; - effectId: number; - amplifier: number; - duration: number; - hideParticles: number; - } | /** 1.19 */ { - entityId: number; - effectId: number; - amplifier: number; - duration: number; - hideParticles: number; - factorCodec: any; - }; - remove_entity_effect: /** 1.7 */ { - entityId: number; - effectId: number; - }; - experience: /** 1.7 */ { - experienceBar: number; - level: number; - totalExperience: number; - } | /** 1.19.3 */ { - experienceBar: number; - totalExperience: number; - level: number; - }; - /** Removed in 1.9 */ - update_attributes: /** 1.7 */ { - entityId: number; - properties: any; - }; - map_chunk: /** 1.7 */ { - x: number; - z: number; - groundUp: boolean; - bitMap: number; - addBitMap: number; - compressedChunkData: any; - } | /** 1.8 */ { - x: number; - z: number; - groundUp: boolean; - bitMap: number; - chunkData: any; - } | /** 1.9.4 */ { - x: number; - z: number; - groundUp: boolean; - bitMap: number; - chunkData: any; - blockEntities: any; - } | /** 1.14 */ { - x: number; - z: number; - groundUp: boolean; - bitMap: number; - heightmaps: any; - chunkData: any; - blockEntities: any; - } | /** 1.15 */ { - x: number; - z: number; - groundUp: boolean; - bitMap: number; - heightmaps: any; - biomes: any; - chunkData: any; - blockEntities: any; - } | /** 1.16 */ { - x: number; - z: number; - groundUp: boolean; - ignoreOldData: boolean; - bitMap: number; - heightmaps: any; - biomes: any; - chunkData: any; - blockEntities: any; - } /** 1.16.2 */ | /** 1.17 */ { - x: number; - z: number; - bitMap: any; - heightmaps: any; - biomes: any; - chunkData: any; - blockEntities: any; - } | /** 1.18 */ { - x: number; - z: number; - heightmaps: any; - chunkData: any; - blockEntities: any; - trustEdges: boolean; - skyLightMask: any; - blockLightMask: any; - emptySkyLightMask: any; - emptyBlockLightMask: any; - skyLight: any; - blockLight: any; - } | /** 1.20 */ { - x: number; - z: number; - heightmaps: any; - chunkData: any; - blockEntities: any; - skyLightMask: any; - blockLightMask: any; - emptySkyLightMask: any; - emptyBlockLightMask: any; - skyLight: any; - blockLight: any; - }; - multi_block_change: /** 1.7 */ { - chunkX: number; - chunkZ: number; - recordCount: any; - dataLength: number; - records: any; - } | /** 1.8 */ { - chunkX: number; - chunkZ: number; - records: any; - } | /** 1.16.2 */ { - chunkCoordinates: any; - notTrustEdges: boolean; - records: any; - } | /** 1.19.2 */ { - chunkCoordinates: any; - suppressLightUpdates: boolean; - records: any; - } | /** 1.20 */ { - chunkCoordinates: any; - records: any; - }; - block_change: /** 1.7 */ { - location: any; - type: number; - metadata: number; - } | /** 1.8 */ { - location: { x: number, y: number, z: number }; - type: number; - }; - block_action: /** 1.7 */ { - location: any; - byte1: number; - byte2: number; - blockId: number; - } | /** 1.8 */ { - location: { x: number, y: number, z: number }; - byte1: number; - byte2: number; - blockId: number; - }; - block_break_animation: /** 1.7 */ { - entityId: number; - location: any; - destroyStage: number; - } | /** 1.8 */ { - entityId: number; - location: { x: number, y: number, z: number }; - destroyStage: number; - }; - /** Removed in 1.9 */ - map_chunk_bulk: /** 1.7 */ { - chunkColumnCount: any; - dataLength: any; - skyLightSent: boolean; - compressedChunkData: any; - meta: any; - } | /** 1.8 */ { - skyLightSent: boolean; - meta: any; - data: any; - }; - explosion: /** 1.7 */ { - x: number; - y: number; - z: number; - radius: number; - affectedBlockOffsets: any; - playerMotionX: number; - playerMotionY: number; - playerMotionZ: number; - }; - world_event: /** 1.7 */ { - effectId: number; - location: any; - data: number; - global: boolean; - } | /** 1.8 */ { - effectId: number; - location: { x: number, y: number, z: number }; - data: number; - global: boolean; - }; - /** Removed in 1.19.3 */ - named_sound_effect: /** 1.7 */ { - soundName: string; - x: number; - y: number; - z: number; - volume: number; - pitch: number; - } | /** 1.9 */ { - soundName: string; - soundCategory: number; - x: number; - y: number; - z: number; - volume: number; - pitch: number; - } | /** 1.19 */ { - soundName: string; - soundCategory: number; - x: number; - y: number; - z: number; - volume: number; - pitch: number; - seed: bigint; - }; - world_particles: /** 1.7 */ { - particleName: string; - x: number; - y: number; - z: number; - offsetX: number; - offsetY: number; - offsetZ: number; - particleData: number; - particles: number; - } | /** 1.8 */ { - particleId: number; - longDistance: boolean; - x: number; - y: number; - z: number; - offsetX: number; - offsetY: number; - offsetZ: number; - particleData: number; - particles: number; - data: any; - }; - game_state_change: /** 1.7 */ { - reason: number; - gameMode: number; - }; - /** Removed in 1.16 */ - spawn_entity_weather: /** 1.7 */ { - entityId: number; - type: number; - x: number; - y: number; - z: number; - }; - open_window: /** 1.7 */ { - windowId: number; - inventoryType: number; - windowTitle: string; - slotCount: number; - useProvidedTitle: boolean; - entityId: any; - } | /** 1.8 */ { - windowId: number; - inventoryType: string; - windowTitle: string; - slotCount: number; - entityId: any; - } | /** 1.14 */ { - windowId: number; - inventoryType: number; - windowTitle: string; - }; - close_window: /** 1.7 */ { - windowId: number; - }; - set_slot: /** 1.7 */ { - windowId: number; - slot: number; - item: any; - } | /** 1.17.1 */ { - windowId: number; - stateId: number; - slot: number; - item: any; - }; - window_items: /** 1.7 */ { - windowId: number; - items: any; - } | /** 1.17.1 */ { - windowId: number; - stateId: number; - items: any; - carriedItem: any; - }; - craft_progress_bar: /** 1.7 */ { - windowId: number; - property: number; - value: number; - }; - /** Removed in 1.17 */ - transaction: /** 1.7 */ { - windowId: number; - action: number; - accepted: boolean; - }; - /** Removed in 1.9.4 */ - update_sign: /** 1.7 */ { - location: any; - text1: string; - text2: string; - text3: string; - text4: string; - } | /** 1.8 */ { - location: { x: number, y: number, z: number }; - text1: string; - text2: string; - text3: string; - text4: string; - }; - map: /** 1.7 */ { - itemDamage: number; - data: any; - } | /** 1.8 */ { - itemDamage: number; - scale: number; - icons: any; - columns: number; - rows: any; - x: any; - y: any; - data: any; - } | /** 1.9 */ { - itemDamage: number; - scale: number; - trackingPosition: boolean; - icons: any; - columns: number; - rows: any; - x: any; - y: any; - data: any; - } | /** 1.14 */ { - itemDamage: number; - scale: number; - trackingPosition: boolean; - locked: boolean; - icons: any; - columns: number; - rows: any; - x: any; - y: any; - data: any; - } | /** 1.17 */ { - itemDamage: number; - scale: number; - locked: boolean; - icons: any; - columns: number; - rows: any; - x: any; - y: any; - data: any; - }; - tile_entity_data: /** 1.7 */ { - location: any; - action: number; - nbtData: any; - } | /** 1.8 */ { - location: { x: number, y: number, z: number }; - action: number; - nbtData: any; - }; - open_sign_entity: /** 1.7 */ { - location: any; - } | /** 1.8 */ { - location: { x: number, y: number, z: number }; - } | /** 1.20 */ { - location: { x: number, y: number, z: number }; - isFrontText: boolean; - }; - statistics: /** 1.7 */ { - entries: any; - }; - player_info: /** 1.8 */ { - action: number; - data: any; - }; - abilities: /** 1.7 */ { - flags: number; - flyingSpeed: number; - walkingSpeed: number; - }; - tab_complete: /** 1.7 */ { - matches: any; - } | /** 1.13 */ { - transactionId: number; - start: number; - length: number; - matches: any; - }; - scoreboard_objective:/** 1.8 */ { - name: string; - action: number; - displayText: any; - type: any; - }; - scoreboard_score:/** 1.8 */ { - itemName: string; - action: number; - scoreName: string; - value: any; - }; - scoreboard_display_objective: /** 1.7 */ { - position: number; - name: string; - }; - /** Removed in 1.9 */ - scoreboard_team: /** 1.7 */ { - team: string; - mode: number; - name: any; - prefix: any; - suffix: any; - friendlyFire: any; - players: any; - } | /** 1.8 */ { - team: string; - mode: number; - name: any; - prefix: any; - suffix: any; - friendlyFire: any; - nameTagVisibility: any; - color: any; - players: any; - }; - custom_payload: /** 1.7 */ { - channel: string; - data: any; - }; - kick_disconnect: /** 1.7 */ { - reason: string; - }; - packet: /** 1.7 */ { - name: any; - params: any; - }; - difficulty: /** 1.8 */ { - difficulty: number; - } | /** 1.14 */ { - difficulty: number; - difficultyLocked: boolean; - }; - /** Removed in 1.17 */ - combat_event: /** 1.8 */ { - event: number; - duration: any; - playerId: any; - entityId: any; - message: any; - }; - camera: /** 1.8 */ { - cameraId: number; - }; - /** Removed in 1.17 */ - world_border: /** 1.8 */ { - action: number; - radius: any; - x: any; - z: any; - old_radius: any; - new_radius: any; - speed: any; - portalBoundary: any; - warning_time: any; - warning_blocks: any; - }; - /** Removed in 1.17 */ - title: /** 1.8 */ { - action: number; - text: any; - fadeIn: any; - stay: any; - fadeOut: any; - }; - /** Removed in 1.9 */ - set_compression: /** 1.8 */ { - threshold: number; - }; - playerlist_header: /** 1.8 */ { - header: string; - footer: string; - }; - resource_pack_send: /** 1.8 */ { - url: string; - hash: string; - } | /** 1.17 */ { - url: string; - hash: string; - forced: boolean; - promptMessage: any; - }; - /** Removed in 1.9 */ - update_entity_nbt: /** 1.8 */ { - entityId: number; - tag: any; - }; - boss_bar: /** 1.9 */ { - entityUUID: any; - action: number; - title: any; - health: any; - color: any; - dividers: any; - flags: any; - }; - set_cooldown: /** 1.9 */ { - itemID: number; - cooldownTicks: number; - }; - unload_chunk: /** 1.9 */ { - chunkX: number; - chunkZ: number; - }; - vehicle_move: /** 1.9 */ { - x: number; - y: number; - z: number; - yaw: number; - pitch: number; - }; - set_passengers: /** 1.9 */ { - entityId: number; - passengers: any; - }; - teams: /** 1.9 */ { - team: string; - mode: number; - name: any; - prefix: any; - suffix: any; - friendlyFire: any; - nameTagVisibility: any; - collisionRule: any; - color: any; - players: any; - } | /** 1.13 */ { - team: string; - mode: number; - name: any; - friendlyFire: any; - nameTagVisibility: any; - collisionRule: any; - formatting: any; - prefix: any; - suffix: any; - players: any; - }; - sound_effect: /** 1.9 */ { - soundId: number; - soundCategory: number; - x: number; - y: number; - z: number; - volume: number; - pitch: number; - } | /** 1.19 */ { - soundId: number; - soundCategory: number; - x: number; - y: number; - z: number; - volume: number; - pitch: number; - seed: bigint; - }; - entity_update_attributes: /** 1.9 */ { - entityId: number; - properties: any; - }; - advancements: /** 1.12 */ { - reset: boolean; - advancementMapping: any; - identifiers: any; - progressMapping: any; - }; - unlock_recipes: /** 1.12 */ { - action: number; - craftingBookOpen: boolean; - filteringCraftable: boolean; - recipes1: any; - recipes2: any; - } | /** 1.13 */ { - action: number; - craftingBookOpen: boolean; - filteringCraftable: boolean; - smeltingBookOpen: boolean; - filteringSmeltable: boolean; - recipes1: any; - recipes2: any; - } | /** 1.16.2 */ { - action: number; - craftingBookOpen: boolean; - filteringCraftable: boolean; - smeltingBookOpen: boolean; - filteringSmeltable: boolean; - blastFurnaceOpen: boolean; - filteringBlastFurnace: boolean; - smokerBookOpen: boolean; - filteringSmoker: boolean; - recipes1: any; - recipes2: any; - }; - select_advancement_tab: /** 1.12 */ { - id: any; - }; - craft_recipe_response: /** 1.12.1 */ { - windowId: number; - recipe: number; - } | /** 1.13 */ { - windowId: number; - recipe: string; - }; - declare_commands: /** 1.13 */ { - nodes: any; - rootIndex: number; - }; - face_player: /** 1.13 */ { - feet_eyes: number; - x: number; - y: number; - z: number; - isEntity: boolean; - entityId: any; - entity_feet_eyes: any; - }; - nbt_query_response: /** 1.13 */ { - transactionId: number; - nbt: any; - }; - stop_sound: /** 1.13 */ { - flags: number; - source: any; - sound: any; - }; - declare_recipes: /** 1.13 */ { - recipes: any; - }; - tags: /** 1.13 */ { - blockTags: any; - itemTags: any; - fluidTags: any; - } | /** 1.14 */ { - blockTags: any; - itemTags: any; - fluidTags: any; - entityTags: any; - } | /** 1.17 */ { - tags: any; - }; - open_horse_window: /** 1.14 */ { - windowId: number; - nbSlots: number; - entityId: number; - }; - update_light: /** 1.14 */ { - chunkX: number; - chunkZ: number; - skyLightMask: number; - blockLightMask: number; - emptySkyLightMask: number; - emptyBlockLightMask: number; - data: any; - } | /** 1.16 */ { - chunkX: number; - chunkZ: number; - trustEdges: boolean; - skyLightMask: number; - blockLightMask: number; - emptySkyLightMask: number; - emptyBlockLightMask: number; - data: any; - } | /** 1.17 */ { - chunkX: number; - chunkZ: number; - trustEdges: boolean; - skyLightMask: any; - blockLightMask: any; - emptySkyLightMask: any; - emptyBlockLightMask: any; - skyLight: any; - blockLight: any; - } | /** 1.20 */ { - chunkX: number; - chunkZ: number; - skyLightMask: any; - blockLightMask: any; - emptySkyLightMask: any; - emptyBlockLightMask: any; - skyLight: any; - blockLight: any; - }; - trade_list: /** 1.14 */ { - windowId: number; - trades: any; - villagerLevel: number; - experience: number; - isRegularVillager: boolean; - } | /** 1.14.3 */ { - windowId: number; - trades: any; - villagerLevel: number; - experience: number; - isRegularVillager: boolean; - canRestock: boolean; - }; - open_book: /** 1.14 */ { - hand: number; - }; - update_view_position: /** 1.14 */ { - chunkX: number; - chunkZ: number; - }; - update_view_distance: /** 1.14 */ { - viewDistance: number; - }; - entity_sound_effect: /** 1.14 */ { - soundId: number; - soundCategory: number; - entityId: number; - volume: number; - pitch: number; - } | /** 1.19.2 */ { - soundId: number; - soundCategory: number; - entityId: number; - volume: number; - pitch: number; - seed: bigint; - }; - acknowledge_player_digging: /** 1.14.4 */ { - location: { x: number, y: number, z: number }; - block: number; - status: number; - successful: boolean; - } | /** 1.19 */ { - sequenceId: number; - }; - end_combat_event: /** 1.17 */ { - duration: number; - entityId: number; - } | /** 1.20 */ { - duration: number; - }; - enter_combat_event: /** 1.17 */ { - - }; - death_combat_event: /** 1.17 */ { - playerId: number; - entityId: number; - message: string; - } | /** 1.20 */ { - playerId: number; - message: string; - }; - /** Removed in 1.17.1 */ - destroy_entity: /** 1.17 */ { - entityId: number; - }; - /** Removed in 1.19 */ - sculk_vibration_signal: /** 1.17 */ { - sourcePosition: { x: number, y: number, z: number }; - destinationIdentifier: string; - destination: any; - arrivalTicks: number; - }; - clear_titles: /** 1.17 */ { - reset: boolean; - }; - initialize_world_border: /** 1.17 */ { - x: number; - z: number; - oldDiameter: number; - newDiameter: number; - speed: any; - portalTeleportBoundary: number; - warningBlocks: number; - warningTime: number; - } | /** 1.19 */ { - x: number; - z: number; - oldDiameter: number; - newDiameter: number; - speed: number; - portalTeleportBoundary: number; - warningBlocks: number; - warningTime: number; - }; - action_bar: /** 1.17 */ { - text: string; - }; - world_border_center: /** 1.17 */ { - x: number; - z: number; - }; - world_border_lerp_size: /** 1.17 */ { - oldDiameter: number; - newDiameter: number; - speed: any; - } | /** 1.19 */ { - oldDiameter: number; - newDiameter: number; - speed: number; - }; - world_border_size: /** 1.17 */ { - diameter: number; - }; - world_border_warning_delay: /** 1.17 */ { - warningTime: number; - }; - world_border_warning_reach: /** 1.17 */ { - warningBlocks: number; - }; - ping: /** 1.17 */ { - id: number; - }; - set_title_subtitle: /** 1.17 */ { - text: string; - }; - set_title_text: /** 1.17 */ { - text: string; - }; - set_title_time: /** 1.17 */ { - fadeIn: number; - stay: number; - fadeOut: number; - }; - simulation_distance: /** 1.18 */ { - distance: number; - }; - /** Removed in 1.19.3 */ - chat_preview: /** 1.19 */ { - queryId: number; - message: any; - }; - player_chat: /** 1.19 */ { - signedChatContent: string; - unsignedChatContent: any; - type: number; - senderUuid: any; - senderName: string; - senderTeam: any; - timestamp: bigint; - salt: bigint; - signature: any; - } | /** 1.19.2 */ { - previousSignature: any; - senderUuid: any; - signature: any; - plainMessage: string; - formattedMessage: any; - timestamp: bigint; - salt: bigint; - previousMessages: any; - unsignedContent: any; - filterType: number; - filterTypeMask: any; - type: number; - networkName: string; - networkTargetName: any; - } | /** 1.19.3 */ { - senderUuid: any; - index: number; - signature: any; - plainMessage: string; - timestamp: bigint; - salt: bigint; - previousMessages: any; - unsignedChatContent: any; - filterType: number; - filterTypeMask: any; - type: number; - networkName: string; - networkTargetName: any; - }; - /** Removed in 1.19.3 */ - should_display_chat_preview: /** 1.19 */ { - should_display_chat_preview: boolean; - }; - system_chat: /** 1.19 */ { - content: string; - type: number; - } | /** 1.19.2 */ { - content: string; - isActionBar: boolean; - }; - server_data: /** 1.19 */ { - motd: any; - icon: any; - previewsChat: boolean; - } | /** 1.19.2 */ { - motd: any; - icon: any; - previewsChat: boolean; - enforcesSecureChat: boolean; - } | /** 1.19.3 */ { - motd: any; - icon: any; - enforcesSecureChat: boolean; - } | /** 1.19.4 */ { - motd: string; - iconBytes: any; - enforcesSecureChat: boolean; - }; - chat_suggestions: /** 1.19.2 */ { - action: number; - entries: any; - }; - hide_message: /** 1.19.2 */ { - signature: any; - } | /** 1.19.3 */ { - id: number; - signature: any; - }; - /** Removed in 1.19.3 */ - message_header: /** 1.19.2 */ { - previousSignature: any; - senderUuid: any; - signature: any; - messageHash: any; - }; - profileless_chat: /** 1.19.3 */ { - message: string; - type: number; - name: string; - target: any; - }; - player_remove: /** 1.19.3 */ { - players: any; - }; - feature_flags: /** 1.19.3 */ { - features: any; - }; - chunk_biomes: /** 1.19.4 */ { - biomes: any; - }; - damage_event: /** 1.19.4 */ { - entityId: number; - sourceTypeId: number; - sourceCauseId: any; - sourceDirectId: any; - sourcePosition: any; - }; - hurt_animation: /** 1.19.4 */ { - entityId: number; - yaw: number; - }; -} - -type ClientOnMcProtocolEvents = ClientOnMap & { - [x: `raw.${string}`]: any - packet: any - state: any -} - -export declare const clientOn: (name: T, callback: (data: ClientOnMcProtocolEvents[T], packetMeta: import('minecraft-protocol').PacketMeta) => void) => void diff --git a/src/getCollisionInteractionShapes.ts b/src/getCollisionInteractionShapes.ts deleted file mode 100644 index 9dead22b..00000000 --- a/src/getCollisionInteractionShapes.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { getRenamedData } from 'flying-squid/dist/blockRenames' -import outputInteractionShapesJson from './interactionShapesGenerated.json' -import './getCollisionShapes' - -export default () => { - customEvents.on('gameLoaded', () => { - // todo also remap block states (e.g. redstone)! - const renamedBlocksInteraction = getRenamedData('blocks', Object.keys(outputInteractionShapesJson), '1.20.2', bot.version) - const interactionShapes = { - ...outputInteractionShapesJson, - ...Object.fromEntries(Object.entries(outputInteractionShapesJson).map(([block, shape], i) => [renamedBlocksInteraction[i], shape])) - } - interactionShapes[''] = interactionShapes['air'] - // todo make earlier - window.interactionShapes = interactionShapes - }) -} diff --git a/src/getCollisionShapes.ts b/src/getCollisionShapes.ts deleted file mode 100644 index 383adc0e..00000000 --- a/src/getCollisionShapes.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { getRenamedData } from 'flying-squid/dist/blockRenames' -import collisionShapesInit from '../generated/latestBlockCollisionsShapes.json' - -// defining globally to be used in loaded data, not sure of better workaround -window.globalGetCollisionShapes = (version) => { - // todo use the same in resourcepack - const versionFrom = collisionShapesInit.version - const renamedBlocks = getRenamedData('blocks', Object.keys(collisionShapesInit.blocks), versionFrom, version) - const collisionShapes = { - ...collisionShapesInit, - blocks: Object.fromEntries(Object.entries(collisionShapesInit.blocks).map(([, shape], i) => [renamedBlocks[i], shape])) - } - return collisionShapes -} diff --git a/src/globalDomListeners.ts b/src/globalDomListeners.ts deleted file mode 100644 index bfce0d42..00000000 --- a/src/globalDomListeners.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { saveServer } from './flyingSquidUtils' -import { isGameActive, activeModalStack } from './globalState' -import { options } from './optionsStorage' -import { isInRealGameSession } from './utils' - -window.addEventListener('unload', (e) => { - if (!window.justReloaded) { - sessionStorage.justReloaded = false - } - void saveServer() -}) - -document.addEventListener('visibilitychange', () => { - if (document.visibilityState === 'hidden') void saveServer() -}) -document.addEventListener('blur', () => { - void saveServer() -}) - -window.addEventListener('beforeunload', (event) => { - if (!window.justReloaded) { - sessionStorage.justReloaded = false - } - - // todo-low maybe exclude chat? - if (!isGameActive(true) && activeModalStack.at(-1)?.elem?.id !== 'chat') return - if (sessionStorage.lastReload && !options.preventDevReloadWhilePlaying) return - if (!options.closeConfirmation) return - if (!isInRealGameSession()) return - - // For major browsers doning only this is enough - event.preventDefault() - - // Display a confirmation prompt - event.returnValue = '' // Required for some browsers - return 'The game is running. Are you sure you want to close this page?' -}) - -window.addEventListener('contextmenu', (e) => { - const ALLOW_TAGS = ['INPUT', 'TEXTAREA', 'A'] - // allow if target is in ALLOW_TAGS or has selection text - if (ALLOW_TAGS.includes((e.target as HTMLElement)?.tagName) || window.getSelection()?.toString()) { - return - } - e.preventDefault() -}) diff --git a/src/globalState.ts b/src/globalState.ts deleted file mode 100644 index b8982de7..00000000 --- a/src/globalState.ts +++ /dev/null @@ -1,159 +0,0 @@ -//@ts-check - -import { proxy, ref, subscribe } from 'valtio' -import type { WorldWarp } from 'flying-squid/dist/lib/modules/warps' -import type { OptionsGroupType } from './optionsGuiScheme' -import { options, disabledSettings } from './optionsStorage' -import { AppConfig } from './appConfig' - -// todo: refactor structure with support of hideNext=false - -export const notHideableModalsWithoutForce = new Set([ - 'app-status', - 'divkit:nonclosable', - 'only-connect-server', -]) - -type Modal = ({ elem?: HTMLElement & Record } & { reactType: string }) - -type ContextMenuItem = { callback; label } - -export const activeModalStack: Modal[] = proxy([]) - -export const insertActiveModalStack = (name: string, newModalStack = activeModalStacks[name]) => { - hideModal(undefined, undefined, { restorePrevious: false, force: true }) - activeModalStack.splice(0, activeModalStack.length, ...newModalStack) - const last = activeModalStack.at(-1) - if (last) showModalInner(last) -} - -export const activeModalStacks: Record = {} - -window.activeModalStack = activeModalStack - -/** - * @returns true if operation was successful - */ -const showModalInner = (modal: Modal) => { - const cancel = modal.elem?.show?.() - return true -} - -export const showModal = (elem: /* (HTMLElement & Record) | */{ reactType: string } | string) => { - const resolved = typeof elem === 'string' ? { reactType: elem } : elem - const curModal = activeModalStack.at(-1) - if ((resolved.reactType && resolved.reactType === curModal?.reactType) || !showModalInner(resolved)) return - activeModalStack.push(resolved) -} - -window.showModal = showModal - -/** - * - * @returns true if previous modal was restored - */ -export const hideModal = (modal = activeModalStack.at(-1), data: any = undefined, options: { force?: boolean; restorePrevious?: boolean } = {}) => { - const { force = false, restorePrevious = true } = options - if (!modal) return - let cancel = [...notHideableModalsWithoutForce].some(m => modal.reactType.startsWith(m)) ? !force : undefined - if (force) { - cancel = undefined - } - - if (!cancel) { - const lastModal = activeModalStack.at(-1) - for (let i = activeModalStack.length - 1; i >= 0; i--) { - if (activeModalStack[i].reactType === modal.reactType) { - activeModalStack.splice(i, 1) - break - } - } - const newModal = activeModalStack.at(-1) - if (newModal && lastModal !== newModal && restorePrevious) { - // would be great to ignore cancel I guess? - showModalInner(newModal) - } - return true - } -} - -export const hideCurrentModal = (_data?, onHide?: () => void) => { - if (hideModal(undefined, undefined)) { - onHide?.() - } -} - -export const hideAllModals = () => { - while (activeModalStack.length > 0) { - if (!hideModal()) break - } - return activeModalStack.length === 0 -} - -export const openOptionsMenu = (group: OptionsGroupType) => { - showModal({ reactType: `options-${group}` }) -} - -subscribe(activeModalStack, () => { - document.body.style.setProperty('--has-modals-z', activeModalStack.length ? '-1' : null) -}) - -// --- - -export const currentContextMenu = proxy({ items: [] as ContextMenuItem[] | null, x: 0, y: 0 }) - -export const showContextmenu = (items: ContextMenuItem[], { clientX, clientY }) => { - Object.assign(currentContextMenu, { - items, - x: clientX, - y: clientY, - }) -} - -// --- - -export const miscUiState = proxy({ - currentDisplayQr: null as string | null, - currentTouch: null as boolean | null, - hasErrors: false, - singleplayer: false, - flyingSquid: false, - wanOpened: false, - wanOpening: false, - /** wether game hud is shown (in playing state) */ - gameLoaded: false, - showUI: true, - showDebugHud: false, - loadedServerIndex: '', - /** currently trying to load or loaded mc version, after all data is loaded */ - loadedDataVersion: null as string | null, - fsReady: false, - singleplayerAvailable: false, - usingGamepadInput: false, - appConfig: null as AppConfig | null, - displaySearchInput: false, - displayFullmap: false -}) - -export const isGameActive = (foregroundCheck: boolean) => { - if (foregroundCheck && activeModalStack.length) return false - return miscUiState.gameLoaded -} - -window.miscUiState = miscUiState - -// state that is not possible to get via bot and in-game specific -export const gameAdditionalState = proxy({ - isFlying: false, - isSprinting: false, - isSneaking: false, - isZooming: false, - warps: [] as WorldWarp[], - noConnection: false, - poorConnection: false, - viewerConnection: false, - - usingServerResourcePack: false, -}) - -window.gameAdditionalState = gameAdditionalState diff --git a/src/globals.d.ts b/src/globals.d.ts deleted file mode 100644 index 7a2c6f1f..00000000 --- a/src/globals.d.ts +++ /dev/null @@ -1,56 +0,0 @@ -/// - -// todo make optional -declare const bot: Omit & { - world: Omit & { - getBlock: (pos: import('vec3').Vec3) => import('prismarine-block').Block | null - } - _client: Omit & { - write: typeof import('./generatedClientPackets').clientWrite - on: typeof import('./generatedServerPackets').clientOn - } -} -declare const __type_bot: typeof bot -declare const appViewer: import('./appViewer').AppViewer -declare const worldView: import('renderer/viewer/lib/worldDataEmitter').WorldDataEmitter | undefined -declare const addStatPerSec: (name: string) => void -declare const localServer: import('flying-squid/dist/index').FullServer & { options } | undefined -/** all currently loaded mc data */ -declare const mcData: Record -declare const loadedData: import('minecraft-data').IndexedData & { sounds: Record } -declare const customEvents: import('typed-emitter').default<{ - /** Singleplayer load requested */ - singleplayer (): void - digStart (): void - gameLoaded (): void - mineflayerBotCreated (): void - search (q: string): void - activateItem (item: Item, slot: number, offhand: boolean): void - hurtAnimation (yaw?: number): void - customChannelRegister (channel: string, parser: any): void -}> -declare const beforeRenderFrame: Array<() => void> -declare const translate: (key: T) => T - -// API LAYER -declare const toggleMicrophoneMuted: undefined | (() => void) -declare const translateText: undefined | ((text: string) => string) - -declare interface Document { - exitPointerLock?(): void -} - -declare module '*.frag' { - const png: string - export default png -} -declare module '*.vert' { - const png: string - export default png -} -declare module '*.wgsl' { - const png: string - export default png -} - -declare interface Window extends Record { } diff --git a/src/globals.js b/src/globals.js deleted file mode 100644 index 11351555..00000000 --- a/src/globals.js +++ /dev/null @@ -1,16 +0,0 @@ -import EventEmitter from 'events' - -window.reportError = window.reportError ?? console.error -window.bot = undefined -window.THREE = undefined -window.localServer = undefined -window.worldView = undefined -window.viewer = undefined // legacy -window.appViewer = undefined -window.loadedData = undefined -window.customEvents = new EventEmitter() -window.customEvents.setMaxListeners(10_000) -window.translate = (key) => { - if (typeof key !== 'string') return key - return window.translateText?.(key) ?? key -} diff --git a/src/googledrive.ts b/src/googledrive.ts deleted file mode 100644 index 5e5e9ae9..00000000 --- a/src/googledrive.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { GoogleOAuthProvider, useGoogleLogin } from '@react-oauth/google' -import { proxy, ref, subscribe } from 'valtio' -import React from 'react' -import { loadScript } from 'renderer/viewer/lib/utils' -import { loadGoogleDriveApi, loadInMemorySave } from './react/SingleplayerProvider' -import { setLoadingScreenStatus } from './appStatus' -import { showOptionsModal } from './react/SelectOption' -import { appQueryParams } from './appParams' - -const CLIENT_ID = '137156026346-igv2gkjsj2hlid92rs3q7cjjnc77s132.apps.googleusercontent.com' -// const CLIENT_ID = process.env.GOOGLE_CLIENT_ID -const SCOPES = 'https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/drive.install' -export const APP_ID = CLIENT_ID.split('-')[0] - -export const GoogleDriveProvider = ({ children }) => { - return React.createElement(GoogleOAuthProvider, { clientId: CLIENT_ID } as any, children) - // return -} - -export const isGoogleDriveAvailable = () => { - return !!CLIENT_ID -} - -export const useGoogleLogIn = () => { - const login = useGoogleLogin({ - onSuccess (tokenResponse) { - localStorage.hasEverLoggedIn = true - googleProviderState.accessToken = tokenResponse.access_token - googleProviderState.expiresIn = ref(new Date(Date.now() + tokenResponse.expires_in * 1000)) - googleProviderState.hasEverLoggedIn = true - }, - // prompt: hasEverLoggedIn ? 'none' : 'consent', - scope: SCOPES, - flow: 'implicit', - onError (error) { - const accessDenied = error.error === 'access_denied' || error.error === 'invalid_scope' || (error as any).error_subtype === 'access_denied' - if (accessDenied) { - googleProviderState.hasEverLoggedIn = false - } - } - }) - return () => login({ - prompt: googleProviderState.hasEverLoggedIn ? 'none' : 'consent' - }) -} - -export const possiblyHandleStateVariable = async () => { - const stateParam = appQueryParams.state - if (!stateParam) return - setLoadingScreenStatus('Opening world in read only mode, waiting for login...') - await loadGoogleDriveApi() - await loadScript('https://accounts.google.com/gsi/client') - const parsed = JSON.parse(stateParam) as { - ids: [string] - action: 'open' - userId: string - } - const tokenClient = window.google.accounts.oauth2.initTokenClient({ - client_id: CLIENT_ID, - scope: SCOPES, - async callback (response) { - if (response.error) { - setLoadingScreenStatus('Error: ' + response.error, true) - googleProviderState.hasEverLoggedIn = false - return - } - setLoadingScreenStatus('Opening world in read only mode...') - googleProviderState.accessToken = response.access_token - // await mountGoogleDriveFolder(true, parsed.ids[0]) - await loadInMemorySave('/google') - } - }) - const choice = await showOptionsModal('Select an action...', ['Login']) - if (choice === 'Login') { - tokenClient.requestAccessToken({ - prompt: googleProviderState.hasEverLoggedIn ? '' : 'consent', - }) - } else { - window.close() - } -} - -export const googleProviderState = proxy({ - accessToken: (localStorage.saveAccessToken ? localStorage.accessToken : null) as string | null, - hasEverLoggedIn: !!(localStorage.hasEverLoggedIn), - isReady: false, - expiresIn: localStorage.saveAccessToken ? ref(new Date(Date.now() + 1000 * 60 * 60)) : null, - readonlyMode: localStorage.googleReadonlyMode ? localStorage.googleReadonlyMode === 'true' : true, - lastSelectedFolder: (localStorage.lastSelectedFolder ? JSON.parse(localStorage.lastSelectedFolder) : null) as { - id: string - name: string - } | null -}) - -subscribe(googleProviderState, () => { - localStorage.googleReadonlyMode = googleProviderState.readonlyMode - localStorage.lastSelectedFolder = googleProviderState.lastSelectedFolder ? JSON.stringify(googleProviderState.lastSelectedFolder) : null - if (googleProviderState.hasEverLoggedIn) { - localStorage.hasEverLoggedIn = true - } else { - delete localStorage.hasEverLoggedIn - } - - if (localStorage.saveAccessToken && googleProviderState) { - // For testing only - localStorage.accessToken = googleProviderState.accessToken || null - } else { - delete localStorage.accessToken - } -}) diff --git a/src/importsWorkaround.js b/src/importsWorkaround.js deleted file mode 100644 index 231654ca..00000000 --- a/src/importsWorkaround.js +++ /dev/null @@ -1,9 +0,0 @@ -// workaround for mineflayer -globalThis.window ??= globalThis -globalThis.localStorage ??= {} -process.versions.node = '18.0.0' - -if (!navigator.getGamepads) { - console.warn('navigator.getGamepads is not available, adding a workaround') - navigator.getGamepads ??= () => [] -} diff --git a/src/index.ts b/src/index.ts deleted file mode 100644 index 7764188f..00000000 --- a/src/index.ts +++ /dev/null @@ -1,1085 +0,0 @@ -/* eslint-disable import/order */ -import './importsWorkaround' -import './styles.css' -import './testCrasher' -import './globals' -import './devtools' -import './entities' -import customChannels from './customChannels' -import './globalDomListeners' -import './mineflayer/maps' -import './mineflayer/cameraShake' -import './shims/patchShims' -import './mineflayer/java-tester/index' -import './external' -import './appConfig' -import './mineflayer/timers' -import './mineflayer/plugins' -import { getServerInfo } from './mineflayer/mc-protocol' -import { onGameLoad } from './inventoryWindows' -import initCollisionShapes from './getCollisionInteractionShapes' -import protocolMicrosoftAuth from 'minecraft-protocol/src/client/microsoftAuth' -import microsoftAuthflow from './microsoftAuthflow' -import { Duplex } from 'stream' - -import './scaleInterface' - -import { options } from './optionsStorage' -import './reactUi' -import { lockUrl, onBotCreate } from './controls' -import './dragndrop' -import { possiblyCleanHandle } from './browserfs' -import downloadAndOpenFile, { isInterestedInDownload } from './downloadAndOpenFile' - -import fs from 'fs' -import net, { Socket } from 'net' -import mineflayer from 'mineflayer' - -import debug from 'debug' -import { defaultsDeep } from 'lodash-es' -import initializePacketsReplay from './packetsReplay/packetsReplayLegacy' - -import { - activeModalStack, - activeModalStacks, - hideModal, - insertActiveModalStack, - isGameActive, - miscUiState, - showModal, - gameAdditionalState, -} from './globalState' - -import { parseServerAddress } from './parseServerAddress' -import { setLoadingScreenStatus } from './appStatus' -import { isCypress } from './standaloneUtils' - -import { startLocalServer, unsupportedLocalServerFeatures } from './createLocalServer' -import defaultServerOptions from './defaultLocalServerOptions' - -import { onAppLoad, resourcepackReload, resourcePackState } from './resourcePack' -import { ConnectPeerOptions, connectToPeer } from './localServerMultiplayer' -import CustomChannelClient from './customClient' -import { registerServiceWorker } from './serviceWorker' -import { appStatusState, lastConnectOptions, quickDevReconnect } from './react/AppStatusProvider' - -import { fsState } from './loadSave' -import { watchFov } from './rendererUtils' -import { loadInMemorySave } from './react/SingleplayerProvider' - -import { possiblyHandleStateVariable } from './googledrive' -import flyingSquidEvents from './flyingSquidEvents' -import { showNotification } from './react/NotificationProvider' -import { saveToBrowserMemory } from './react/PauseScreen' -import './devReload' -import './water' -import { ConnectOptions, getVersionAutoSelect, downloadOtherGameData, downloadAllMinecraftData, loadMinecraftData } from './connect' -import { ref, subscribe } from 'valtio' -import { signInMessageState } from './react/SignInMessageProvider' -import { findServerPassword, updateAuthenticatedAccountData, updateLoadedServerData, updateServerConnectionHistory } from './react/serversStorage' -import { mainMenuState } from './react/MainMenuRenderApp' -import './mobileShim' -import { parseFormattedMessagePacket } from './botUtils' -import { appStartup } from './clientMods' -import { getViewerVersionData, getWsProtocolStream, onBotCreatedViewerHandler } from './viewerConnector' -import { getWebsocketStream } from './mineflayer/websocket-core' -import { appQueryParams, appQueryParamsArray } from './appParams' -import { playerState } from './mineflayer/playerState' -import { states } from 'minecraft-protocol' -import { initMotionTracking } from './react/uiMotion' -import { UserError } from './mineflayer/userError' -import { startLocalReplayServer } from './packetsReplay/replayPackets' -import { createFullScreenProgressReporter, createWrappedProgressReporter, ProgressReporter } from './core/progressReporter' -import { appViewer } from './appViewer' -import './appViewerLoad' -import { registerOpenBenchmarkListener } from './benchmark' -import { tryHandleBuiltinCommand } from './builtinCommands' -import { loadingTimerState } from './react/LoadingTimer' -import { loadPluginsIntoWorld } from './react/CreateWorldProvider' -import { getCurrentProxy, getCurrentUsername } from './react/ServersList' - -window.debug = debug -window.beforeRenderFrame = [] - -// ACTUAL CODE - -void registerServiceWorker().then(() => { - mainMenuState.serviceWorkerLoaded = true -}) -watchFov() -initCollisionShapes() -initializePacketsReplay() -onAppLoad() -customChannels() - -if (appQueryParams.testCrashApp === '2') throw new Error('test') - -function hideCurrentScreens () { - activeModalStacks['main-menu'] = [...activeModalStack] - insertActiveModalStack('', []) -} - -const loadSingleplayer = (serverOverrides = {}, flattenedServerOverrides = {}, connectOptions?: Partial) => { - const serverSettingsQsRaw = appQueryParamsArray.serverSetting ?? [] - const serverSettingsQs = serverSettingsQsRaw.map(x => x.split(':')).reduce>((acc, [key, value]) => { - acc[key] = JSON.parse(value) - return acc - }, {}) - void connect({ - singleplayer: true, - username: options.localUsername, - serverOverrides, - serverOverridesFlat: { - ...flattenedServerOverrides, - ...serverSettingsQs - }, - ...connectOptions - }) -} -function listenGlobalEvents () { - window.addEventListener('connect', e => { - const options = (e as CustomEvent).detail - void connect(options) - }) - window.addEventListener('singleplayer', (e) => { - const { detail } = (e as CustomEvent) - const { connectOptions, ...rest } = detail - loadSingleplayer(rest, {}, connectOptions) - }) -} - -export async function connect (connectOptions: ConnectOptions) { - if (miscUiState.gameLoaded) return - - if (sessionStorage.delayLoadUntilFocus) { - await new Promise(resolve => { - if (document.hasFocus()) { - resolve(undefined) - } else { - window.addEventListener('focus', resolve) - } - }) - } - if (sessionStorage.delayLoadUntilClick) { - await new Promise(resolve => { - window.addEventListener('click', resolve) - }) - } - - appStatusState.showReconnect = false - loadingTimerState.loading = true - loadingTimerState.start = Date.now() - miscUiState.hasErrors = false - lastConnectOptions.value = connectOptions - - const { singleplayer } = connectOptions - const p2pMultiplayer = !!connectOptions.peerId - miscUiState.singleplayer = singleplayer - miscUiState.flyingSquid = singleplayer || p2pMultiplayer - - // Track server connection in history - if (!singleplayer && !p2pMultiplayer && connectOptions.server && connectOptions.saveServerToHistory !== false) { - const parsedServer = parseServerAddress(connectOptions.server) - updateServerConnectionHistory(parsedServer.host, connectOptions.botVersion) - } - - const { renderDistance: renderDistanceSingleplayer, multiplayerRenderDistance } = options - - const parsedServer = parseServerAddress(connectOptions.server) - const server = { host: parsedServer.host, port: parsedServer.port } - if (connectOptions.proxy?.startsWith(':')) { - connectOptions.proxy = `${location.protocol}//${location.hostname}${connectOptions.proxy}` - } - if (connectOptions.proxy && location.port !== '80' && location.port !== '443' && !/:\d+$/.test(connectOptions.proxy)) { - const https = connectOptions.proxy.startsWith('https://') || location.protocol === 'https:' - connectOptions.proxy = `${connectOptions.proxy}:${https ? 443 : 80}` - } - const parsedProxy = parseServerAddress(connectOptions.proxy, false) - const proxy = { host: parsedProxy.host, port: parsedProxy.port } - let { username } = connectOptions - - if (connectOptions.server) { - console.log(`connecting to ${server.host}:${server.port ?? 25_565}`) - } - console.log('using player username', username) - - hideCurrentScreens() - const progress = createFullScreenProgressReporter() - const loggingInMsg = connectOptions.server ? 'Connecting to server' : 'Logging in' - progress.beginStage('connect', loggingInMsg) - - let ended = false - let bot!: typeof __type_bot - let hadConnected = false - const destroyAll = (wasKicked = false) => { - if (ended) return - loadingTimerState.loading = false - const { alwaysReconnect } = appQueryParams - if ((!wasKicked && miscUiState.appConfig?.allowAutoConnect && appQueryParams.autoConnect && hadConnected) || (alwaysReconnect)) { - if (alwaysReconnect === 'quick' || alwaysReconnect === 'fast') { - quickDevReconnect() - } else { - location.reload() - } - } - errorAbortController.abort() - ended = true - progress.end() - // dont reset viewer so we can still do debugging - localServer = window.localServer = window.server = undefined - gameAdditionalState.viewerConnection = false - - if (bot) { - bot.end() - // ensure mineflayer plugins receive this event for cleanup - bot.emit('end', '') - bot.removeAllListeners() - bot._client.removeAllListeners() - bot._client = { - //@ts-expect-error - write (packetName) { - console.warn('Tried to write packet', packetName, 'after bot was destroyed') - } - } - //@ts-expect-error - window.bot = bot = undefined - } - cleanFs() - } - const cleanFs = () => { - if (singleplayer && !fsState.inMemorySave) { - possiblyCleanHandle(() => { - // todo: this is not enough, we need to wait for all async operations to finish - }) - } - } - let lastPacket = undefined as string | undefined - const onPossibleErrorDisconnect = () => { - if (lastPacket && bot?._client && bot._client.state !== states.PLAY) { - appStatusState.descriptionHint = `Last Server Packet: ${lastPacket}` - } - } - const handleError = (err) => { - console.error(err) - if (err === 'ResizeObserver loop completed with undelivered notifications.') { - return - } - if (isCypress()) throw err - miscUiState.hasErrors = true - if (miscUiState.gameLoaded) return - // close all modals - for (const modal of activeModalStack) { - hideModal(modal) - } - - setLoadingScreenStatus(`Error encountered. ${err}`, true) - appStatusState.showReconnect = true - onPossibleErrorDisconnect() - destroyAll() - } - - // todo(hard): remove it! - const errorAbortController = new AbortController() - window.addEventListener('unhandledrejection', (e) => { - if (e.reason.name === 'ServerPluginLoadFailure') { - if (confirm(`Failed to load server plugin ${e.reason.pluginName} (invoking ${e.reason.pluginMethod}). Continue?`)) { - return - } - } - if (e.reason?.stack?.includes('chrome-extension://')) { - // ignore issues caused by chrome extension - return - } - handleError(e.reason) - }, { - signal: errorAbortController.signal - }) - window.addEventListener('error', (e) => { - handleError(e.message) - }, { - signal: errorAbortController.signal - }) - - let clientDataStream: Duplex | undefined - - if (connectOptions.server && !connectOptions.viewerWsConnect && !parsedServer.isWebSocket) { - console.log(`using proxy ${proxy.host}:${proxy.port || location.port}`) - net['setProxy']({ hostname: proxy.host, port: proxy.port, headers: { Authorization: `Bearer ${new URLSearchParams(location.search).get('token') ?? ''}` }, artificialDelay: appQueryParams.addPing ? Number(appQueryParams.addPing) : undefined }) - } - - const renderDistance = singleplayer ? renderDistanceSingleplayer : multiplayerRenderDistance - let updateDataAfterJoin = () => { } - let localServer - let localReplaySession: ReturnType | undefined - let lastKnownKickReason = undefined as string | undefined - try { - const serverOptions = defaultsDeep({}, connectOptions.serverOverrides ?? {}, options.localServerOptions, defaultServerOptions) - Object.assign(serverOptions, connectOptions.serverOverridesFlat ?? {}) - - await progress.executeWithMessage('Downloading Minecraft data', 'download-mcdata', async () => { - loadingTimerState.networkOnlyStart = Date.now() - - let downloadingAssets = [] as string[] - const reportAssetDownload = (asset: string, isDone: boolean) => { - if (isDone) { - downloadingAssets = downloadingAssets.filter(a => a !== asset) - } else { - downloadingAssets.push(asset) - } - progress.setSubStage('download-mcdata', `(${downloadingAssets.join(', ')})`) - } - - await Promise.all([ - downloadAllMinecraftData(reportAssetDownload), - downloadOtherGameData(reportAssetDownload) - ]) - loadingTimerState.networkOnlyStart = 0 - }) - - let dataDownloaded = false - const downloadMcData = async (version: string) => { - if (dataDownloaded) return - dataDownloaded = true - appViewer.resourcesManager.currentConfig = { version, texturesVersion: options.useVersionsTextures || undefined } - - await progress.executeWithMessage( - 'Processing downloaded Minecraft data', - async () => { - await loadMinecraftData(version) - await appViewer.resourcesManager.loadSourceData(version) - } - ) - - await progress.executeWithMessage( - 'Applying user-installed resource pack', - async () => { - try { - await resourcepackReload(true) - } catch (err) { - console.error(err) - const doContinue = confirm('Failed to apply texture pack. See errors in the console. Continue?') - if (!doContinue) { - throw err - } - } - } - ) - - await progress.executeWithMessage( - 'Preparing textures', - async () => { - await appViewer.resourcesManager.updateAssetsData({}) - } - ) - } - - let finalVersion = connectOptions.botVersion || (singleplayer ? serverOptions.version : undefined) - - if (connectOptions.worldStateFileContents) { - try { - localReplaySession = startLocalReplayServer(connectOptions.worldStateFileContents) - } catch (err) { - console.error(err) - throw new UserError(`Failed to start local replay server: ${err}`) - } - finalVersion = localReplaySession.version - } - - if (singleplayer) { - // SINGLEPLAYER EXPLAINER: - // Note 1: here we have custom sync communication between server Client (flying-squid) and game client (mineflayer) - // Note 2: custom Server class is used which simplifies communication & Client creation on it's side - // local server started - // mineflayer.createBot (see source def) - // bot._client = bot._client ?? mc.createClient(options) <-- mc-protocol package - // tcpDns() skipped since we define connect option - // in setProtocol: we emit 'connect' here below so in that file we send set_protocol and login_start (onLogin handler) - // Client (class) of flying-squid (in server/login.js of mc-protocol): onLogin handler: skip most logic & go to loginClient() which assigns uuid and sends 'success' back to client (onLogin handler) and emits 'login' on the server (login.js in flying-squid handler) - // flying-squid: 'login' -> player.login -> now sends 'login' event to the client (handled in many plugins in mineflayer) -> then 'update_health' is sent which emits 'spawn' in mineflayer - - const serverPlugins = new URLSearchParams(location.search).getAll('serverPlugin') - if (serverPlugins.length > 0 && !serverOptions.worldFolder) { - console.log('Placing server plugins', serverPlugins) - - serverOptions.worldFolder ??= '/temp' - await loadPluginsIntoWorld('/temp', serverPlugins) - - console.log('Server plugins placed') - } - - localServer = window.localServer = window.server = startLocalServer(serverOptions) - connectOptions?.connectEvents?.serverCreated?.() - // todo need just to call quit if started - // loadingScreen.maybeRecoverable = false - // init world, todo: do it for any async plugins - if (!localServer.pluginsReady) { - await progress.executeWithMessage( - 'Starting local server', - async () => { - await new Promise(resolve => { - localServer.once('pluginsReady', resolve) - }) - } - ) - } - - localServer.on('newPlayer', (player) => { - player.on('loadingStatus', (newStatus) => { - progress.setMessage(newStatus) - }) - }) - flyingSquidEvents() - } - - if (connectOptions.authenticatedAccount) username = 'you' - let initialLoadingText: string - if (singleplayer) { - initialLoadingText = 'Local server is still starting' - } else if (p2pMultiplayer) { - initialLoadingText = 'Connecting to peer' - } else if (connectOptions.server) { - if (!finalVersion) { - const versionAutoSelect = getVersionAutoSelect() - const wrapped = createWrappedProgressReporter(progress, `Fetching server version. Preffered: ${versionAutoSelect}`) - loadingTimerState.networkOnlyStart = Date.now() - const autoVersionSelect = await getServerInfo(server.host, server.port ? Number(server.port) : undefined, versionAutoSelect) - wrapped.end() - finalVersion = autoVersionSelect.version - } - initialLoadingText = `Connecting to server ${server.host}:${server.port ?? 25_565} with version ${finalVersion}` - } else if (connectOptions.viewerWsConnect) { - initialLoadingText = `Connecting to Mineflayer WebSocket server ${connectOptions.viewerWsConnect}` - } else if (connectOptions.worldStateFileContents) { - initialLoadingText = `Loading local replay server` - } else { - initialLoadingText = 'We have no idea what to do' - } - progress.setMessage(initialLoadingText) - - if (parsedServer.isWebSocket) { - loadingTimerState.networkOnlyStart = Date.now() - clientDataStream = (await getWebsocketStream(server.host)).mineflayerStream - } - - let newTokensCacheResult = null as any - const cachedTokens = typeof connectOptions.authenticatedAccount === 'object' ? connectOptions.authenticatedAccount.cachedTokens : {} - let authData: Awaited> | undefined - if (connectOptions.authenticatedAccount) { - authData = await microsoftAuthflow({ - tokenCaches: cachedTokens, - proxyBaseUrl: connectOptions.proxy, - setProgressText (text) { - progress.setMessage(text) - }, - setCacheResult (result) { - newTokensCacheResult = result - }, - connectingServer: server.host - }) - } - - if (p2pMultiplayer) { - clientDataStream = await connectToPeer(connectOptions.peerId!, connectOptions.peerOptions) - } - if (connectOptions.viewerWsConnect) { - const { version, time, requiresPass } = await getViewerVersionData(connectOptions.viewerWsConnect) - let password - if (requiresPass) { - password = prompt('Enter password') - if (!password) { - throw new UserError('Password is required') - } - } - console.log('Latency:', Date.now() - time, 'ms') - // const version = '1.21.1' - finalVersion = version - await downloadMcData(version) - setLoadingScreenStatus(`Connecting to WebSocket server ${connectOptions.viewerWsConnect}`) - clientDataStream = (await getWsProtocolStream(connectOptions.viewerWsConnect)).clientDuplex - if (password) { - clientDataStream.write(password) - } - gameAdditionalState.viewerConnection = true - } - - if (finalVersion) { - // ensure data is downloaded - loadingTimerState.networkOnlyStart ??= Date.now() - await downloadMcData(finalVersion) - } - - const brand = clientDataStream ? 'minecraft-web-client' : undefined - bot = mineflayer.createBot({ - host: server.host, - port: server.port ? +server.port : undefined, - brand, - version: finalVersion || false, - ...clientDataStream ? { - stream: clientDataStream as any, - } : {}, - ...singleplayer || p2pMultiplayer || localReplaySession ? { - keepAlive: false, - } : {}, - ...singleplayer ? { - version: serverOptions.version, - connect () { }, - Client: CustomChannelClient as any, - } : {}, - ...localReplaySession ? { - connect () { }, - Client: CustomChannelClient as any, - } : {}, - onMsaCode (data) { - signInMessageState.code = data.user_code - signInMessageState.link = data.verification_uri - signInMessageState.expiresOn = Date.now() + data.expires_in * 1000 - }, - sessionServer: authData?.sessionEndpoint?.toString(), - auth: connectOptions.authenticatedAccount ? async (client, options) => { - authData!.setOnMsaCodeCallback(options.onMsaCode) - authData?.setConnectingVersion(client.version) - //@ts-expect-error - client.authflow = authData!.authFlow - try { - signInMessageState.abortController = ref(new AbortController()) - await Promise.race([ - protocolMicrosoftAuth.authenticate(client, options), - new Promise((_r, reject) => { - signInMessageState.abortController.signal.addEventListener('abort', () => { - reject(new UserError('Aborted by user')) - }) - }) - ]) - if (signInMessageState.shouldSaveToken) { - updateAuthenticatedAccountData(accounts => { - const existingAccount = accounts.find(a => a.username === client.username) - if (existingAccount) { - existingAccount.cachedTokens = { ...existingAccount.cachedTokens, ...newTokensCacheResult } - } else { - accounts.push({ - username: client.username, - cachedTokens: { ...cachedTokens, ...newTokensCacheResult } - }) - } - return accounts - }) - updateDataAfterJoin = () => { - updateLoadedServerData(s => ({ ...s, authenticatedAccountOverride: client.username }), connectOptions.serverIndex) - } - } else { - updateDataAfterJoin = () => { - updateLoadedServerData(s => ({ ...s, authenticatedAccountOverride: undefined }), connectOptions.serverIndex) - } - } - setLoadingScreenStatus('Authentication successful. Logging in to server') - } finally { - signInMessageState.code = '' - } - } : undefined, - username, - viewDistance: renderDistance, - checkTimeoutInterval: 240 * 1000, - // noPongTimeout: 240 * 1000, - closeTimeout: 240 * 1000, - respawn: options.autoRespawn, - maxCatchupTicks: 0, - 'mapDownloader-saveToFile': false, - // "mapDownloader-saveInternal": false, // do not save into memory, todo must be implemeneted as we do really care of ram - }) as unknown as typeof __type_bot - window.bot = bot - - if (connectOptions.viewerWsConnect) { - void onBotCreatedViewerHandler() - } - customEvents.emit('mineflayerBotCreated') - if (singleplayer || p2pMultiplayer || localReplaySession) { - if (singleplayer || p2pMultiplayer) { - // in case of p2pMultiplayer there is still flying-squid on the host side - const _supportFeature = bot.supportFeature - bot.supportFeature = ((feature) => { - if (unsupportedLocalServerFeatures.includes(feature)) { - return false - } - return _supportFeature(feature) - }) as typeof bot.supportFeature - } - - bot.emit('inject_allowed') - bot._client.emit('connect') - } else if (clientDataStream) { - // bot.emit('inject_allowed') - bot._client.emit('connect') - } else { - const setupConnectHandlers = () => { - Socket.prototype['handleStringMessage'] = function (message: string) { - if (message.startsWith('proxy-message') || message.startsWith('proxy-command:')) { // for future - return false - } - if (message.startsWith('proxy-shutdown:')) { - lastKnownKickReason = message.slice('proxy-shutdown:'.length) - return false - } - return true - } - bot._client.socket.on('connect', () => { - console.log('Proxy WebSocket connection established') - //@ts-expect-error - bot._client.socket._ws.addEventListener('close', () => { - console.log('WebSocket connection closed') - setTimeout(() => { - if (bot) { - bot.emit('end', 'WebSocket connection closed with unknown reason') - } - }, 1000) - }) - bot._client.socket.on('close', () => { - setTimeout(() => { - if (bot) { - bot.emit('end', 'WebSocket connection closed with unknown reason') - } - }) - }) - }) - } - // socket setup actually can be delayed because of dns lookup - if (bot._client.socket) { - setupConnectHandlers() - } else { - const originalSetSocket = bot._client.setSocket.bind(bot._client) - bot._client.setSocket = (socket) => { - if (!bot) return - originalSetSocket(socket) - setupConnectHandlers() - } - } - - } - } catch (err) { - handleError(err) - } - if (!bot) return - - const p2pConnectTimeout = p2pMultiplayer ? setTimeout(() => { throw new UserError('Spawn timeout. There might be error on the other side, check console.') }, 20_000) : undefined - - // bot.on('inject_allowed', () => { - // loadingScreen.maybeRecoverable = false - // }) - - bot.on('error', handleError) - - bot.on('kicked', (kickReason) => { - console.log('You were kicked!', kickReason) - const { formatted: kickReasonFormatted, plain: kickReasonString } = parseFormattedMessagePacket(kickReason) - // close all modals - for (const modal of activeModalStack) { - hideModal(modal) - } - setLoadingScreenStatus(`The Minecraft server kicked you. Kick reason: ${kickReasonString}`, true, undefined, undefined, kickReasonFormatted) - appStatusState.showReconnect = true - destroyAll(true) - }) - - const packetBeforePlay = (_, __, ___, fullBuffer) => { - lastPacket = fullBuffer.toString() - } - bot._client.on('packet', packetBeforePlay as any) - const playStateSwitch = (newState) => { - if (newState === 'play') { - bot._client.removeListener('packet', packetBeforePlay) - } - } - bot._client.on('state', playStateSwitch) - - bot.on('end', (endReason) => { - if (ended) return - console.log('disconnected for', endReason) - if (endReason === 'socketClosed') { - endReason = lastKnownKickReason ?? 'Connection with proxy server lost' - } - // close all modals - for (const modal of activeModalStack) { - hideModal(modal) - } - setLoadingScreenStatus(`You have been disconnected from the server. End reason:\n${endReason}`, true) - appStatusState.showReconnect = true - onPossibleErrorDisconnect() - destroyAll() - if (isCypress()) throw new Error(`disconnected: ${endReason}`) - }) - - onBotCreate() - - bot.once('login', () => { - errorAbortController.abort() - loadingTimerState.networkOnlyStart = 0 - progress.setMessage('Loading world') - }) - - let worldWasReady = false - const waitForChunksToLoad = async (progress?: ProgressReporter) => { - await new Promise(resolve => { - if (worldWasReady) { - resolve() - return - } - const unsub = subscribe(appViewer.rendererState, () => { - if (appViewer.rendererState.world.allChunksLoaded && appViewer.nonReactiveState.world.chunksTotalNumber) { - worldWasReady = true - resolve() - unsub() - } else { - const perc = Math.round(appViewer.rendererState.world.chunksLoaded.size / appViewer.nonReactiveState.world.chunksTotalNumber * 100) - progress?.reportProgress('chunks', perc / 100) - } - }) - }) - } - - const spawnEarlier = !singleplayer && !p2pMultiplayer - const displayWorld = async () => { - if (resourcePackState.isServerInstalling) { - await new Promise(resolve => { - subscribe(resourcePackState, () => { - if (!resourcePackState.isServerInstalling) { - resolve() - } - }) - }) - await appViewer.resourcesManager.promiseAssetsReady - } - if (appStatusState.isError) return - - if (!appViewer.resourcesManager.currentResources?.itemsRenderer) { - await appViewer.resourcesManager.updateAssetsData({}) - } - - const loadWorldStart = Date.now() - console.log('try to focus window') - window.focus?.() - void waitForChunksToLoad().then(() => { - window.worldLoadTime = (Date.now() - loadWorldStart) / 1000 - console.log('All chunks done and ready! Time from renderer connect to ready', (Date.now() - loadWorldStart) / 1000, 's') - document.dispatchEvent(new Event('cypress-world-ready')) - }) - - try { - if (p2pConnectTimeout) clearTimeout(p2pConnectTimeout) - playerState.reactive.onlineMode = !!connectOptions.authenticatedAccount - - progress.setMessage('Placing blocks (starting viewer)') - if (!connectOptions.worldStateFileContents || connectOptions.worldStateFileContents.length < 3 * 1024 * 1024) { - localStorage.lastConnectOptions = JSON.stringify(connectOptions) - if (process.env.NODE_ENV === 'development' && !localStorage.lockUrl && !location.search.slice(1).length) { - lockUrl() - } - } else { - localStorage.removeItem('lastConnectOptions') - } - connectOptions.onSuccessfulPlay?.() - updateDataAfterJoin() - const password = findServerPassword() - if (password) { - setTimeout(() => { - bot.chat(`/login ${password}`) - }, 500) - } - - - console.log('bot spawned - starting viewer') - await appViewer.startWorld(bot.world, renderDistance) - appViewer.worldView!.listenToBot(bot) - if (appViewer.backend) { - void appViewer.worldView!.init(bot.entity.position) - } - - initMotionTracking() - - // Bot position callback - const botPosition = () => { - appViewer.lastCamUpdate = Date.now() - // this might cause lag, but not sure - appViewer.backend?.updateCamera(bot.entity.position, bot.entity.yaw, bot.entity.pitch) - void appViewer.worldView?.updatePosition(bot.entity.position) - } - bot.on('move', botPosition) - botPosition() - - progress.setMessage('Setting callbacks') - - onGameLoad() - - if (appStatusState.isError) return - - const waitForChunks = async () => { - if (appQueryParams.sp === '1') return //todo - const waitForChunks = options.waitForChunksRender === 'sp-only' ? !!singleplayer : options.waitForChunksRender - if (!appViewer.backend || appViewer.rendererState.world.allChunksLoaded || !waitForChunks) { - return - } - - await progress.executeWithMessage( - 'Loading chunks', - 'chunks', - async () => { - await waitForChunksToLoad(progress) - } - ) - } - - await waitForChunks() - - setTimeout(() => { - if (appQueryParams.suggest_save) { - showNotification('Suggestion', 'Save the world to keep your progress!', false, undefined, async () => { - const savePath = await saveToBrowserMemory() - if (!savePath) return - const saveName = savePath.split('/').pop() - bot.end() - // todo hot reload - location.search = `loadSave=${saveName}` - }) - } - }, 600) - - miscUiState.gameLoaded = true - miscUiState.loadedServerIndex = connectOptions.serverIndex ?? '' - customEvents.emit('gameLoaded') - - // Test iOS Safari crash by creating memory pressure - if (appQueryParams.testIosCrash) { - setTimeout(() => { - console.log('Starting iOS crash test with memory pressure...') - // eslint-disable-next-line sonarjs/no-unused-collection - const arrays: number[][] = [] - try { - // Create large arrays until we run out of memory - // eslint-disable-next-line no-constant-condition - while (true) { - const arr = Array.from({ length: 1024 * 1024 }).fill(0).map((_, i) => i) - arrays.push(arr) - } - } catch (e) { - console.error('Memory allocation failed:', e) - } - }, 1000) - } - - progress.end() - setLoadingScreenStatus(undefined) - } catch (err) { - handleError(err) - } - hadConnected = true - } - // don't use spawn event, player can be dead - bot.once(spawnEarlier ? 'forcedMove' : 'health', displayWorld) - - if (singleplayer && connectOptions.serverOverrides.worldFolder) { - fsState.saveLoaded = true - } - - if (!connectOptions.ignoreQs || process.env.NODE_ENV === 'development') { - // todo cleanup - customEvents.on('gameLoaded', () => { - const commands = appQueryParamsArray.command ?? [] - for (let command of commands) { - if (!command.startsWith('/')) command = `/${command}` - const builtinHandled = tryHandleBuiltinCommand(command) - if (!builtinHandled) { - bot.chat(command) - } - } - }) - } -} - -listenGlobalEvents() - -// #region fire click event on touch as we disable default behaviors -let activeTouch: { touch: Touch, elem: HTMLElement, start: number } | undefined -document.body.addEventListener('touchend', (e) => { - if (!isGameActive(true)) return - if (activeTouch?.touch.identifier !== e.changedTouches[0].identifier) return - if (Date.now() - activeTouch.start > 500) { - activeTouch.elem.dispatchEvent(new Event('longtouch', { bubbles: true })) - } else { - activeTouch.elem.click() - } - activeTouch = undefined -}) -document.body.addEventListener('touchstart', (e) => { - const targetElement = (e.target as HTMLElement).closest('#ui-root') - if (!isGameActive(true) || !targetElement) return - // we always prevent default behavior to disable magnifier on ios, but by doing so we also disable click events - e.preventDefault() - let firstClickable // todo remove composedPath and this workaround when lit-element is fully dropped - const path = e.composedPath() as Array<{ click?: () => void }> - for (const elem of path) { - if (elem.click) { - firstClickable = elem - break - } - } - if (!firstClickable) return - activeTouch = { - touch: e.touches[0], - elem: firstClickable, - start: Date.now(), - } -}, { passive: false }) -// #endregion - -// immediate game enter actions: reconnect or URL QS -const maybeEnterGame = () => { - const waitForConfigFsLoad = (fn: () => void) => { - let unsubscribe: () => void | undefined - const checkDone = () => { - if (miscUiState.fsReady && miscUiState.appConfig) { - fn() - unsubscribe?.() - return true - } - return false - } - - if (!checkDone()) { - const text = miscUiState.appConfig ? 'Loading' : 'Loading config' - setLoadingScreenStatus(text) - unsubscribe = subscribe(miscUiState, checkDone) - } - } - - const reconnectOptions = sessionStorage.getItem('reconnectOptions') ? JSON.parse(sessionStorage.getItem('reconnectOptions')!) : undefined - - if (reconnectOptions) { - sessionStorage.removeItem('reconnectOptions') - if (Date.now() - reconnectOptions.timestamp < 1000 * 60 * 2) { - return waitForConfigFsLoad(async () => { - void connect(reconnectOptions.value) - }) - } - } - - if (appQueryParams.reconnect && localStorage.lastConnectOptions && process.env.NODE_ENV === 'development') { - const lastConnect = JSON.parse(localStorage.lastConnectOptions ?? {}) - return waitForConfigFsLoad(async () => { - void connect({ - botVersion: appQueryParams.version ?? undefined, - ...lastConnect, - ip: appQueryParams.ip || undefined - }) - }) - } - - if (appQueryParams.singleplayer === '1' || appQueryParams.sp === '1') { - return waitForConfigFsLoad(async () => { - loadSingleplayer({}, { - worldFolder: undefined, - ...appQueryParams.version ? { version: appQueryParams.version } : {} - }) - }) - } - if (appQueryParams.loadSave) { - const enterSave = async () => { - const savePath = `/data/worlds/${appQueryParams.loadSave}` - try { - await fs.promises.stat(savePath) - await loadInMemorySave(savePath) - } catch (err) { - alert(`Save ${savePath} not found`) - } - } - return waitForConfigFsLoad(enterSave) - } - - if (appQueryParams.ip || appQueryParams.proxy) { - const openServerAction = () => { - if (appQueryParams.autoConnect && miscUiState.appConfig?.allowAutoConnect) { - void connect({ - server: appQueryParams.ip, - proxy: getCurrentProxy(), - botVersion: appQueryParams.version ?? undefined, - username: getCurrentUsername()!, - }) - return - } - - setLoadingScreenStatus(undefined) - if (appQueryParams.onlyConnect || process.env.ALWAYS_MINIMAL_SERVER_UI === 'true') { - showModal({ reactType: 'only-connect-server' }) - } else { - showModal({ reactType: 'editServer' }) - } - } - - // showModal({ reactType: 'empty' }) - return waitForConfigFsLoad(openServerAction) - } - - if (appQueryParams.connectPeer) { - // try to connect to peer - const peerId = appQueryParams.connectPeer - const peerOptions = {} as ConnectPeerOptions - if (appQueryParams.server) { - peerOptions.server = appQueryParams.server - } - const version = appQueryParams.peerVersion - let username: string | null = options.guestUsername - if (options.askGuestName) username = prompt('Enter your username to connect to peer', username) - if (!username) return - options.guestUsername = username - void connect({ - username, - botVersion: version || undefined, - peerId, - peerOptions - }) - return - - } - - if (appQueryParams.viewerConnect) { - void connect({ - username: `viewer-${Math.random().toString(36).slice(2, 10)}`, - viewerWsConnect: appQueryParams.viewerConnect, - }) - return - } - - if (appQueryParams.modal) { - const modals = appQueryParams.modal.split(',') - for (const modal of modals) { - showModal({ reactType: modal }) - } - return - } - - if (appQueryParams.serversList && !miscUiState.appConfig?.appParams?.serversList) { - // open UI only if it's in URL - showModal({ reactType: 'serversList' }) - } - - if (isInterestedInDownload()) { - void downloadAndOpenFile() - } - - void possiblyHandleStateVariable() -} - -try { - maybeEnterGame() -} catch (err) { - console.error(err) - alert(`Something went wrong: ${err}`) -} - -// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion -const initialLoader = document.querySelector('.initial-loader') as HTMLElement | null -if (initialLoader) { - initialLoader.style.opacity = '0' - initialLoader.style.pointerEvents = 'none' -} -window.pageLoaded = true - -appViewer.waitBackendLoadPromises.push(appStartup()) -registerOpenBenchmarkListener() diff --git a/src/interactionShapesGenerated.json b/src/interactionShapesGenerated.json deleted file mode 100644 index 804952e0..00000000 --- a/src/interactionShapesGenerated.json +++ /dev/null @@ -1,6599 +0,0 @@ -{ - "moving_piston": [], - "water": [], - "lava": [], - "bubble_column": [], - "air": [], - "void_air": [], - "cave_air": [], - "mangrove_propagule": { - "hanging=true": [ - 7, - 0, - 7, - 9, - 16, - 9 - ], - "age=0": [ - 7, - 13, - 7, - 9, - 16, - 9 - ], - "age=1": [ - 7, - 10, - 7, - 9, - 16, - 9 - ], - "age=2": [ - 7, - 7, - 7, - 9, - 16, - 9 - ], - "age=3": [ - 7, - 3, - 7, - 9, - 16, - 9 - ], - "age=4": [ - 7, - 0, - 7, - 9, - 16, - 9 - ] - }, - "fern": [ - 2, - 0, - 2, - 14, - 13, - 14 - ], - "dandelion": [ - 5, - 0, - 5, - 11, - 10, - 11 - ], - "torchflower": [ - 5, - 0, - 5, - 11, - 10, - 11 - ], - "poppy": [ - 5, - 0, - 5, - 11, - 10, - 11 - ], - "blue_orchid": [ - 5, - 0, - 5, - 11, - 10, - 11 - ], - "allium": [ - 5, - 0, - 5, - 11, - 10, - 11 - ], - "azure_bluet": [ - 5, - 0, - 5, - 11, - 10, - 11 - ], - "red_tulip": [ - 5, - 0, - 5, - 11, - 10, - 11 - ], - "orange_tulip": [ - 5, - 0, - 5, - 11, - 10, - 11 - ], - "white_tulip": [ - 5, - 0, - 5, - 11, - 10, - 11 - ], - "pink_tulip": [ - 5, - 0, - 5, - 11, - 10, - 11 - ], - "oxeye_daisy": [ - 5, - 0, - 5, - 11, - 10, - 11 - ], - "cornflower": [ - 5, - 0, - 5, - 11, - 10, - 11 - ], - "wither_rose": [ - 5, - 0, - 5, - 11, - 10, - 11 - ], - "lily_of_the_valley": [ - 5, - 0, - 5, - 11, - 10, - 11 - ], - "brown_mushroom": [ - 5, - 0, - 5, - 11, - 6, - 11 - ], - "red_mushroom": [ - 5, - 0, - 5, - 11, - 6, - 11 - ], - "torch": [ - 6, - 0, - 6, - 10, - 10, - 10 - ], - "soul_fire": [ - 0, - 0, - 0, - 16, - 1, - 16 - ], - "soul_torch": [ - 6, - 0, - 6, - 10, - 10, - 10 - ], - "end_portal": [ - 0, - 6, - 0, - 16, - 12, - 16 - ], - "end_gateway": [], - "kelp_plant": [ - 0, - 0, - 0, - 16, - 16, - 16 - ], - "dead_tube_coral": [ - 2, - 0, - 2, - 14, - 15, - 14 - ], - "dead_brain_coral": [ - 2, - 0, - 2, - 14, - 15, - 14 - ], - "dead_bubble_coral": [ - 2, - 0, - 2, - 14, - 15, - 14 - ], - "dead_fire_coral": [ - 2, - 0, - 2, - 14, - 15, - 14 - ], - "dead_horn_coral": [ - 2, - 0, - 2, - 14, - 15, - 14 - ], - "tube_coral": [ - 2, - 0, - 2, - 14, - 15, - 14 - ], - "brain_coral": [ - 2, - 0, - 2, - 14, - 15, - 14 - ], - "bubble_coral": [ - 2, - 0, - 2, - 14, - 15, - 14 - ], - "fire_coral": [ - 2, - 0, - 2, - 14, - 15, - 14 - ], - "horn_coral": [ - 2, - 0, - 2, - 14, - 15, - 14 - ], - "dead_tube_coral_fan": [ - 2, - 0, - 2, - 14, - 4, - 14 - ], - "dead_brain_coral_fan": [ - 2, - 0, - 2, - 14, - 4, - 14 - ], - "dead_bubble_coral_fan": [ - 2, - 0, - 2, - 14, - 4, - 14 - ], - "dead_fire_coral_fan": [ - 2, - 0, - 2, - 14, - 4, - 14 - ], - "dead_horn_coral_fan": [ - 2, - 0, - 2, - 14, - 4, - 14 - ], - "tube_coral_fan": [ - 2, - 0, - 2, - 14, - 4, - 14 - ], - "brain_coral_fan": [ - 2, - 0, - 2, - 14, - 4, - 14 - ], - "bubble_coral_fan": [ - 2, - 0, - 2, - 14, - 4, - 14 - ], - "fire_coral_fan": [ - 2, - 0, - 2, - 14, - 4, - 14 - ], - "horn_coral_fan": [ - 2, - 0, - 2, - 14, - 4, - 14 - ], - "bamboo_sapling": [ - 4, - 0, - 4, - 12, - 12, - 12 - ], - "warped_fungus": [ - 4, - 0, - 4, - 12, - 9, - 12 - ], - "warped_roots": [ - 2, - 0, - 2, - 14, - 13, - 14 - ], - "nether_sprouts": [ - 2, - 0, - 2, - 14, - 3, - 14 - ], - "crimson_fungus": [ - 4, - 0, - 4, - 12, - 9, - 12 - ], - "weeping_vines_plant": [ - 1, - 0, - 1, - 15, - 16, - 15 - ], - "twisting_vines_plant": [ - 4, - 0, - 4, - 12, - 16, - 12 - ], - "crimson_roots": [ - 2, - 0, - 2, - 14, - 13, - 14 - ], - "powder_snow": [ - 0, - 0, - 0, - 16, - 16, - 16 - ], - "spore_blossom": [ - 2, - 13, - 2, - 14, - 16, - 14 - ], - "hanging_roots": [ - 2, - 10, - 2, - 14, - 16, - 14 - ], - "frogspawn": [ - 0, - 0, - 0, - 16, - 1.5, - 16 - ], - "jungle_sapling": [ - 2, - 0, - 2, - 14, - 12, - 14 - ], - "acacia_sapling": [ - 2, - 0, - 2, - 14, - 12, - 14 - ], - "cherry_sapling": [ - 2, - 0, - 2, - 14, - 12, - 14 - ], - "powered_rail": { - "shape=ascending_east": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "shape=ascending_north": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "shape=ascending_south": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "shape=ascending_west": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "": [ - 0, - 0, - 0, - 16, - 2, - 16 - ] - }, - "detector_rail": { - "shape=ascending_east": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "shape=ascending_north": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "shape=ascending_south": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "shape=ascending_west": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "": [ - 0, - 0, - 0, - 16, - 2, - 16 - ] - }, - "wall_torch": { - "facing=east": [ - 0, - 3, - 5.5, - 5, - 13, - 10.5 - ], - "facing=north": [ - 5.5, - 3, - 11, - 10.5, - 13, - 16 - ], - "facing=south": [ - 5.5, - 3, - 0, - 10.5, - 13, - 5 - ], - "facing=west": [ - 11, - 3, - 5.5, - 16, - 13, - 10.5 - ] - }, - "fire": { - "combine": { - "up=true": [ - 0, - 15, - 0, - 16, - 16, - 16 - ], - "west=true": [ - 0, - 0, - 0, - 1, - 16, - 16 - ], - "east=true": [ - 15, - 0, - 0, - 16, - 16, - 16 - ], - "north=true": [ - 0, - 0, - 0, - 16, - 16, - 1 - ], - "south=true": [ - 0, - 0, - 15, - 16, - 16, - 16 - ] - } - }, - "redstone_wire": { - "combine": { - "north=side|up": [ - 3, - 0, - 0, - 13, - 1, - 13 - ], - "south=side|up": [ - 3, - 0, - 3, - 13, - 1, - 16 - ], - "east=side|up": [ - 3, - 0, - 3, - 16, - 1, - 13 - ], - "west=side|up": [ - 0, - 0, - 3, - 13, - 1, - 13 - ], - "north=up": [ - 3, - 0, - 0, - 13, - 16, - 1 - ], - "south=up": [ - 3, - 0, - 15, - 13, - 16, - 16 - ], - "east=up": [ - 15, - 0, - 3, - 16, - 16, - 13 - ], - "west=up": [ - 0, - 0, - 3, - 1, - 16, - 13 - ] - } - }, - "wheat": { - "age=0": [ - 0, - 0, - 0, - 16, - 2, - 16 - ], - "age=1": [ - 0, - 0, - 0, - 16, - 4, - 16 - ], - "age=2": [ - 0, - 0, - 0, - 16, - 6, - 16 - ], - "age=3": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "age=4": [ - 0, - 0, - 0, - 16, - 10, - 16 - ], - "age=5": [ - 0, - 0, - 0, - 16, - 12, - 16 - ], - "age=6": [ - 0, - 0, - 0, - 16, - 14, - 16 - ], - "age=7": [ - 0, - 0, - 0, - 16, - 16, - 16 - ] - }, - "oak_sign": [ - 4, - 0, - 4, - 12, - 16, - 12 - ], - "spruce_sign": [ - 4, - 0, - 4, - 12, - 16, - 12 - ], - "birch_sign": [ - 4, - 0, - 4, - 12, - 16, - 12 - ], - "acacia_sign": [ - 4, - 0, - 4, - 12, - 16, - 12 - ], - "cherry_sign": [ - 4, - 0, - 4, - 12, - 16, - 12 - ], - "jungle_sign": [ - 4, - 0, - 4, - 12, - 16, - 12 - ], - "dark_oak_sign": [ - 4, - 0, - 4, - 12, - 16, - 12 - ], - "mangrove_sign": [ - 4, - 0, - 4, - 12, - 16, - 12 - ], - "bamboo_sign": [ - 4, - 0, - 4, - 12, - 16, - 12 - ], - "rail": { - "shape=ascending_east": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "shape=ascending_north": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "shape=ascending_south": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "shape=ascending_west": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "": [ - 0, - 0, - 0, - 16, - 2, - 16 - ] - }, - "oak_wall_sign": { - "facing=north": [ - 0, - 4.5, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 4.5, - 0, - 16, - 12.5, - 2 - ], - "facing=east": [ - 0, - 4.5, - 0, - 2, - 12.5, - 16 - ], - "facing=west": [ - 14, - 4.5, - 0, - 16, - 12.5, - 16 - ] - }, - "spruce_wall_sign": { - "facing=north": [ - 0, - 4.5, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 4.5, - 0, - 16, - 12.5, - 2 - ], - "facing=east": [ - 0, - 4.5, - 0, - 2, - 12.5, - 16 - ], - "facing=west": [ - 14, - 4.5, - 0, - 16, - 12.5, - 16 - ] - }, - "birch_wall_sign": { - "facing=north": [ - 0, - 4.5, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 4.5, - 0, - 16, - 12.5, - 2 - ], - "facing=east": [ - 0, - 4.5, - 0, - 2, - 12.5, - 16 - ], - "facing=west": [ - 14, - 4.5, - 0, - 16, - 12.5, - 16 - ] - }, - "acacia_wall_sign": { - "facing=north": [ - 0, - 4.5, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 4.5, - 0, - 16, - 12.5, - 2 - ], - "facing=east": [ - 0, - 4.5, - 0, - 2, - 12.5, - 16 - ], - "facing=west": [ - 14, - 4.5, - 0, - 16, - 12.5, - 16 - ] - }, - "cherry_wall_sign": { - "facing=north": [ - 0, - 4.5, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 4.5, - 0, - 16, - 12.5, - 2 - ], - "facing=east": [ - 0, - 4.5, - 0, - 2, - 12.5, - 16 - ], - "facing=west": [ - 14, - 4.5, - 0, - 16, - 12.5, - 16 - ] - }, - "jungle_wall_sign": { - "facing=north": [ - 0, - 4.5, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 4.5, - 0, - 16, - 12.5, - 2 - ], - "facing=east": [ - 0, - 4.5, - 0, - 2, - 12.5, - 16 - ], - "facing=west": [ - 14, - 4.5, - 0, - 16, - 12.5, - 16 - ] - }, - "dark_oak_wall_sign": { - "facing=north": [ - 0, - 4.5, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 4.5, - 0, - 16, - 12.5, - 2 - ], - "facing=east": [ - 0, - 4.5, - 0, - 2, - 12.5, - 16 - ], - "facing=west": [ - 14, - 4.5, - 0, - 16, - 12.5, - 16 - ] - }, - "mangrove_wall_sign": { - "facing=north": [ - 0, - 4.5, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 4.5, - 0, - 16, - 12.5, - 2 - ], - "facing=east": [ - 0, - 4.5, - 0, - 2, - 12.5, - 16 - ], - "facing=west": [ - 14, - 4.5, - 0, - 16, - 12.5, - 16 - ] - }, - "bamboo_wall_sign": { - "facing=north": [ - 0, - 4.5, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 4.5, - 0, - 16, - 12.5, - 2 - ], - "facing=east": [ - 0, - 4.5, - 0, - 2, - 12.5, - 16 - ], - "facing=west": [ - 14, - 4.5, - 0, - 16, - 12.5, - 16 - ] - }, - "oak_hanging_sign": [ - 3, - 0, - 3, - 13, - 16, - 13 - ], - "spruce_hanging_sign": [ - 3, - 0, - 3, - 13, - 16, - 13 - ], - "birch_hanging_sign": [ - 3, - 0, - 3, - 13, - 16, - 13 - ], - "acacia_hanging_sign": [ - 3, - 0, - 3, - 13, - 16, - 13 - ], - "cherry_hanging_sign": [ - 3, - 0, - 3, - 13, - 16, - 13 - ], - "jungle_hanging_sign": [ - 3, - 0, - 3, - 13, - 16, - 13 - ], - "dark_oak_hanging_sign": [ - 3, - 0, - 3, - 13, - 16, - 13 - ], - "crimson_hanging_sign": [ - 3, - 0, - 3, - 13, - 16, - 13 - ], - "warped_hanging_sign": [ - 3, - 0, - 3, - 13, - 16, - 13 - ], - "mangrove_hanging_sign": [ - 3, - 0, - 3, - 13, - 16, - 13 - ], - "bamboo_hanging_sign": [ - 3, - 0, - 3, - 13, - 16, - 13 - ], - "lever": { - "face=floor,facing=east": [ - 4, - 0, - 5, - 12, - 6, - 11 - ], - "face=floor,facing=north": [ - 5, - 0, - 4, - 11, - 6, - 12 - ], - "face=floor,facing=south": [ - 5, - 0, - 4, - 11, - 6, - 12 - ], - "face=floor,facing=west": [ - 4, - 0, - 5, - 12, - 6, - 11 - ], - "face=ceiling,facing=east": [ - 4, - 10, - 5, - 12, - 16, - 11 - ], - "face=ceiling,facing=north": [ - 5, - 10, - 4, - 11, - 16, - 12 - ], - "face=ceiling,facing=south": [ - 5, - 10, - 4, - 11, - 16, - 12 - ], - "face=ceiling,facing=west": [ - 4, - 10, - 5, - 12, - 16, - 11 - ], - "face=wall,facing=east": [ - 0, - 4, - 5, - 6, - 12, - 11 - ], - "face=wall,facing=north": [ - 5, - 4, - 10, - 11, - 12, - 16 - ], - "face=wall,facing=south": [ - 5, - 4, - 0, - 11, - 12, - 6 - ], - "face=wall,facing=west": [ - 10, - 4, - 5, - 16, - 12, - 11 - ] - }, - "stone_pressure_plate": { - "powered=false": [ - 1, - 0, - 1, - 15, - 1, - 15 - ], - "powered=true": [ - 1, - 0, - 1, - 15, - 0.5, - 15 - ] - }, - "oak_pressure_plate": { - "powered=false": [ - 1, - 0, - 1, - 15, - 1, - 15 - ], - "powered=true": [ - 1, - 0, - 1, - 15, - 0.5, - 15 - ] - }, - "spruce_pressure_plate": { - "powered=false": [ - 1, - 0, - 1, - 15, - 1, - 15 - ], - "powered=true": [ - 1, - 0, - 1, - 15, - 0.5, - 15 - ] - }, - "birch_pressure_plate": { - "powered=false": [ - 1, - 0, - 1, - 15, - 1, - 15 - ], - "powered=true": [ - 1, - 0, - 1, - 15, - 0.5, - 15 - ] - }, - "jungle_pressure_plate": { - "powered=false": [ - 1, - 0, - 1, - 15, - 1, - 15 - ], - "powered=true": [ - 1, - 0, - 1, - 15, - 0.5, - 15 - ] - }, - "acacia_pressure_plate": { - "powered=false": [ - 1, - 0, - 1, - 15, - 1, - 15 - ], - "powered=true": [ - 1, - 0, - 1, - 15, - 0.5, - 15 - ] - }, - "cherry_pressure_plate": { - "powered=false": [ - 1, - 0, - 1, - 15, - 1, - 15 - ], - "powered=true": [ - 1, - 0, - 1, - 15, - 0.5, - 15 - ] - }, - "dark_oak_pressure_plate": { - "powered=false": [ - 1, - 0, - 1, - 15, - 1, - 15 - ], - "powered=true": [ - 1, - 0, - 1, - 15, - 0.5, - 15 - ] - }, - "mangrove_pressure_plate": { - "powered=false": [ - 1, - 0, - 1, - 15, - 1, - 15 - ], - "powered=true": [ - 1, - 0, - 1, - 15, - 0.5, - 15 - ] - }, - "bamboo_pressure_plate": { - "powered=false": [ - 1, - 0, - 1, - 15, - 1, - 15 - ], - "powered=true": [ - 1, - 0, - 1, - 15, - 0.5, - 15 - ] - }, - "redstone_torch": [ - 6, - 0, - 6, - 10, - 10, - 10 - ], - "redstone_wall_torch": { - "facing=east": [ - 0, - 3, - 5.5, - 5, - 13, - 10.5 - ], - "facing=north": [ - 5.5, - 3, - 11, - 10.5, - 13, - 16 - ], - "facing=south": [ - 5.5, - 3, - 0, - 10.5, - 13, - 5 - ], - "facing=west": [ - 11, - 3, - 5.5, - 16, - 13, - 10.5 - ] - }, - "stone_button": { - "face=floor,facing=north,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=north,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=south,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=south,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=west,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=west,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=floor,facing=east,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=east,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=wall,facing=north,powered=false": [ - 5, - 6, - 14, - 11, - 10, - 16 - ], - "face=wall,facing=north,powered=true": [ - 5, - 6, - 15, - 11, - 10, - 16 - ], - "face=wall,facing=south,powered=false": [ - 5, - 6, - 0, - 11, - 10, - 2 - ], - "face=wall,facing=south,powered=true": [ - 5, - 6, - 0, - 11, - 10, - 1 - ], - "face=wall,facing=west,powered=false": [ - 14, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=west,powered=true": [ - 15, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=east,powered=false": [ - 0, - 6, - 5, - 2, - 10, - 11 - ], - "face=wall,facing=east,powered=true": [ - 0, - 6, - 5, - 1, - 10, - 11 - ], - "face=ceiling,facing=north,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=north,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=west,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=west,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ] - }, - "sugar_cane": [ - 2, - 0, - 2, - 14, - 16, - 14 - ], - "soul_wall_torch": { - "facing=east": [ - 0, - 3, - 5.5, - 5, - 13, - 10.5 - ], - "facing=north": [ - 5.5, - 3, - 11, - 10.5, - 13, - 16 - ], - "facing=south": [ - 5.5, - 3, - 0, - 10.5, - 13, - 5 - ], - "facing=west": [ - 11, - 3, - 5.5, - 16, - 13, - 10.5 - ] - }, - "attached_pumpkin_stem": { - "facing=east": [ - 6, - 0, - 6, - 16, - 10, - 10 - ], - "facing=north": [ - 6, - 0, - 0, - 10, - 10, - 10 - ], - "facing=south": [ - 6, - 0, - 6, - 10, - 10, - 16 - ], - "facing=west": [ - 0, - 0, - 6, - 10, - 10, - 10 - ] - }, - "attached_melon_stem": { - "facing=east": [ - 6, - 0, - 6, - 16, - 10, - 10 - ], - "facing=north": [ - 6, - 0, - 0, - 10, - 10, - 10 - ], - "facing=south": [ - 6, - 0, - 6, - 10, - 10, - 16 - ], - "facing=west": [ - 0, - 0, - 6, - 10, - 10, - 10 - ] - }, - "pumpkin_stem": { - "age=0": [ - 7, - 0, - 7, - 9, - 2, - 9 - ], - "age=1": [ - 7, - 0, - 7, - 9, - 4, - 9 - ], - "age=2": [ - 7, - 0, - 7, - 9, - 6, - 9 - ], - "age=3": [ - 7, - 0, - 7, - 9, - 8, - 9 - ], - "age=4": [ - 7, - 0, - 7, - 9, - 10, - 9 - ], - "age=5": [ - 7, - 0, - 7, - 9, - 12, - 9 - ], - "age=6": [ - 7, - 0, - 7, - 9, - 14, - 9 - ], - "age=7": [ - 7, - 0, - 7, - 9, - 16, - 9 - ] - }, - "melon_stem": { - "age=0": [ - 7, - 0, - 7, - 9, - 2, - 9 - ], - "age=1": [ - 7, - 0, - 7, - 9, - 4, - 9 - ], - "age=2": [ - 7, - 0, - 7, - 9, - 6, - 9 - ], - "age=3": [ - 7, - 0, - 7, - 9, - 8, - 9 - ], - "age=4": [ - 7, - 0, - 7, - 9, - 10, - 9 - ], - "age=5": [ - 7, - 0, - 7, - 9, - 12, - 9 - ], - "age=6": [ - 7, - 0, - 7, - 9, - 14, - 9 - ], - "age=7": [ - 7, - 0, - 7, - 9, - 16, - 9 - ] - }, - "vine": { - "combine": { - "up=true": [ - 0, - 15, - 0, - 16, - 16, - 16 - ], - "west=true": [ - 0, - 0, - 0, - 1, - 16, - 16 - ], - "east=true": [ - 15, - 0, - 0, - 16, - 16, - 16 - ], - "north=true": [ - 0, - 0, - 0, - 16, - 16, - 1 - ], - "south=true": [ - 0, - 0, - 15, - 16, - 16, - 16 - ] - } - }, - "glow_lichen": { - "combine": { - "up=true": [ - 0, - 15, - 0, - 16, - 16, - 16 - ], - "west=true": [ - 0, - 0, - 0, - 1, - 16, - 16 - ], - "east=true": [ - 15, - 0, - 0, - 16, - 16, - 16 - ], - "north=true": [ - 0, - 0, - 0, - 16, - 16, - 1 - ], - "south=true": [ - 0, - 0, - 15, - 16, - 16, - 16 - ] - } - }, - "nether_wart": { - "age=0": [ - 0, - 0, - 0, - 16, - 5, - 16 - ], - "age=1": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "age=2": [ - 0, - 0, - 0, - 16, - 11, - 16 - ], - "age=3": [ - 0, - 0, - 0, - 16, - 14, - 16 - ] - }, - "tripwire_hook": { - "facing=east": [ - 0, - 0, - 5, - 6, - 10, - 11 - ], - "facing=north": [ - 5, - 0, - 10, - 11, - 10, - 16 - ], - "facing=south": [ - 5, - 0, - 0, - 11, - 10, - 6 - ], - "facing=west": [ - 10, - 0, - 5, - 16, - 10, - 11 - ] - }, - "tripwire": { - "attached=true": [ - 0, - 1, - 0, - 16, - 2.5, - 16 - ], - "attached=false": [ - 0, - 0, - 0, - 16, - 8, - 16 - ] - }, - "carrots": { - "age=0": [ - 0, - 0, - 0, - 16, - 2, - 16 - ], - "age=1": [ - 0, - 0, - 0, - 16, - 3, - 16 - ], - "age=2": [ - 0, - 0, - 0, - 16, - 4, - 16 - ], - "age=3": [ - 0, - 0, - 0, - 16, - 5, - 16 - ], - "age=4": [ - 0, - 0, - 0, - 16, - 6, - 16 - ], - "age=5": [ - 0, - 0, - 0, - 16, - 7, - 16 - ], - "age=6": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "age=7": [ - 0, - 0, - 0, - 16, - 9, - 16 - ] - }, - "potatoes": { - "age=0": [ - 0, - 0, - 0, - 16, - 2, - 16 - ], - "age=1": [ - 0, - 0, - 0, - 16, - 3, - 16 - ], - "age=2": [ - 0, - 0, - 0, - 16, - 4, - 16 - ], - "age=3": [ - 0, - 0, - 0, - 16, - 5, - 16 - ], - "age=4": [ - 0, - 0, - 0, - 16, - 6, - 16 - ], - "age=5": [ - 0, - 0, - 0, - 16, - 7, - 16 - ], - "age=6": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "age=7": [ - 0, - 0, - 0, - 16, - 9, - 16 - ] - }, - "oak_button": { - "face=floor,facing=north,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=north,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=south,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=south,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=west,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=west,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=floor,facing=east,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=east,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=wall,facing=north,powered=false": [ - 5, - 6, - 14, - 11, - 10, - 16 - ], - "face=wall,facing=north,powered=true": [ - 5, - 6, - 15, - 11, - 10, - 16 - ], - "face=wall,facing=south,powered=false": [ - 5, - 6, - 0, - 11, - 10, - 2 - ], - "face=wall,facing=south,powered=true": [ - 5, - 6, - 0, - 11, - 10, - 1 - ], - "face=wall,facing=west,powered=false": [ - 14, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=west,powered=true": [ - 15, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=east,powered=false": [ - 0, - 6, - 5, - 2, - 10, - 11 - ], - "face=wall,facing=east,powered=true": [ - 0, - 6, - 5, - 1, - 10, - 11 - ], - "face=ceiling,facing=north,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=north,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=west,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=west,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ] - }, - "spruce_button": { - "face=floor,facing=north,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=north,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=south,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=south,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=west,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=west,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=floor,facing=east,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=east,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=wall,facing=north,powered=false": [ - 5, - 6, - 14, - 11, - 10, - 16 - ], - "face=wall,facing=north,powered=true": [ - 5, - 6, - 15, - 11, - 10, - 16 - ], - "face=wall,facing=south,powered=false": [ - 5, - 6, - 0, - 11, - 10, - 2 - ], - "face=wall,facing=south,powered=true": [ - 5, - 6, - 0, - 11, - 10, - 1 - ], - "face=wall,facing=west,powered=false": [ - 14, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=west,powered=true": [ - 15, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=east,powered=false": [ - 0, - 6, - 5, - 2, - 10, - 11 - ], - "face=wall,facing=east,powered=true": [ - 0, - 6, - 5, - 1, - 10, - 11 - ], - "face=ceiling,facing=north,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=north,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=west,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=west,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ] - }, - "birch_button": { - "face=floor,facing=north,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=north,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=south,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=south,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=west,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=west,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=floor,facing=east,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=east,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=wall,facing=north,powered=false": [ - 5, - 6, - 14, - 11, - 10, - 16 - ], - "face=wall,facing=north,powered=true": [ - 5, - 6, - 15, - 11, - 10, - 16 - ], - "face=wall,facing=south,powered=false": [ - 5, - 6, - 0, - 11, - 10, - 2 - ], - "face=wall,facing=south,powered=true": [ - 5, - 6, - 0, - 11, - 10, - 1 - ], - "face=wall,facing=west,powered=false": [ - 14, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=west,powered=true": [ - 15, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=east,powered=false": [ - 0, - 6, - 5, - 2, - 10, - 11 - ], - "face=wall,facing=east,powered=true": [ - 0, - 6, - 5, - 1, - 10, - 11 - ], - "face=ceiling,facing=north,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=north,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=west,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=west,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ] - }, - "jungle_button": { - "face=floor,facing=north,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=north,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=south,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=south,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=west,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=west,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=floor,facing=east,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=east,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=wall,facing=north,powered=false": [ - 5, - 6, - 14, - 11, - 10, - 16 - ], - "face=wall,facing=north,powered=true": [ - 5, - 6, - 15, - 11, - 10, - 16 - ], - "face=wall,facing=south,powered=false": [ - 5, - 6, - 0, - 11, - 10, - 2 - ], - "face=wall,facing=south,powered=true": [ - 5, - 6, - 0, - 11, - 10, - 1 - ], - "face=wall,facing=west,powered=false": [ - 14, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=west,powered=true": [ - 15, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=east,powered=false": [ - 0, - 6, - 5, - 2, - 10, - 11 - ], - "face=wall,facing=east,powered=true": [ - 0, - 6, - 5, - 1, - 10, - 11 - ], - "face=ceiling,facing=north,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=north,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=west,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=west,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ] - }, - "acacia_button": { - "face=floor,facing=north,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=north,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=south,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=south,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=west,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=west,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=floor,facing=east,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=east,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=wall,facing=north,powered=false": [ - 5, - 6, - 14, - 11, - 10, - 16 - ], - "face=wall,facing=north,powered=true": [ - 5, - 6, - 15, - 11, - 10, - 16 - ], - "face=wall,facing=south,powered=false": [ - 5, - 6, - 0, - 11, - 10, - 2 - ], - "face=wall,facing=south,powered=true": [ - 5, - 6, - 0, - 11, - 10, - 1 - ], - "face=wall,facing=west,powered=false": [ - 14, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=west,powered=true": [ - 15, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=east,powered=false": [ - 0, - 6, - 5, - 2, - 10, - 11 - ], - "face=wall,facing=east,powered=true": [ - 0, - 6, - 5, - 1, - 10, - 11 - ], - "face=ceiling,facing=north,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=north,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=west,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=west,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ] - }, - "cherry_button": { - "face=floor,facing=north,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=north,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=south,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=south,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=west,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=west,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=floor,facing=east,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=east,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=wall,facing=north,powered=false": [ - 5, - 6, - 14, - 11, - 10, - 16 - ], - "face=wall,facing=north,powered=true": [ - 5, - 6, - 15, - 11, - 10, - 16 - ], - "face=wall,facing=south,powered=false": [ - 5, - 6, - 0, - 11, - 10, - 2 - ], - "face=wall,facing=south,powered=true": [ - 5, - 6, - 0, - 11, - 10, - 1 - ], - "face=wall,facing=west,powered=false": [ - 14, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=west,powered=true": [ - 15, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=east,powered=false": [ - 0, - 6, - 5, - 2, - 10, - 11 - ], - "face=wall,facing=east,powered=true": [ - 0, - 6, - 5, - 1, - 10, - 11 - ], - "face=ceiling,facing=north,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=north,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=west,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=west,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ] - }, - "dark_oak_button": { - "face=floor,facing=north,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=north,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=south,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=south,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=west,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=west,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=floor,facing=east,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=east,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=wall,facing=north,powered=false": [ - 5, - 6, - 14, - 11, - 10, - 16 - ], - "face=wall,facing=north,powered=true": [ - 5, - 6, - 15, - 11, - 10, - 16 - ], - "face=wall,facing=south,powered=false": [ - 5, - 6, - 0, - 11, - 10, - 2 - ], - "face=wall,facing=south,powered=true": [ - 5, - 6, - 0, - 11, - 10, - 1 - ], - "face=wall,facing=west,powered=false": [ - 14, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=west,powered=true": [ - 15, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=east,powered=false": [ - 0, - 6, - 5, - 2, - 10, - 11 - ], - "face=wall,facing=east,powered=true": [ - 0, - 6, - 5, - 1, - 10, - 11 - ], - "face=ceiling,facing=north,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=north,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=west,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=west,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ] - }, - "mangrove_button": { - "face=floor,facing=north,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=north,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=south,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=south,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=west,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=west,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=floor,facing=east,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=east,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=wall,facing=north,powered=false": [ - 5, - 6, - 14, - 11, - 10, - 16 - ], - "face=wall,facing=north,powered=true": [ - 5, - 6, - 15, - 11, - 10, - 16 - ], - "face=wall,facing=south,powered=false": [ - 5, - 6, - 0, - 11, - 10, - 2 - ], - "face=wall,facing=south,powered=true": [ - 5, - 6, - 0, - 11, - 10, - 1 - ], - "face=wall,facing=west,powered=false": [ - 14, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=west,powered=true": [ - 15, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=east,powered=false": [ - 0, - 6, - 5, - 2, - 10, - 11 - ], - "face=wall,facing=east,powered=true": [ - 0, - 6, - 5, - 1, - 10, - 11 - ], - "face=ceiling,facing=north,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=north,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=west,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=west,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ] - }, - "bamboo_button": { - "face=floor,facing=north,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=north,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=south,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=south,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=west,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=west,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=floor,facing=east,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=east,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=wall,facing=north,powered=false": [ - 5, - 6, - 14, - 11, - 10, - 16 - ], - "face=wall,facing=north,powered=true": [ - 5, - 6, - 15, - 11, - 10, - 16 - ], - "face=wall,facing=south,powered=false": [ - 5, - 6, - 0, - 11, - 10, - 2 - ], - "face=wall,facing=south,powered=true": [ - 5, - 6, - 0, - 11, - 10, - 1 - ], - "face=wall,facing=west,powered=false": [ - 14, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=west,powered=true": [ - 15, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=east,powered=false": [ - 0, - 6, - 5, - 2, - 10, - 11 - ], - "face=wall,facing=east,powered=true": [ - 0, - 6, - 5, - 1, - 10, - 11 - ], - "face=ceiling,facing=north,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=north,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=west,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=west,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ] - }, - "light_weighted_pressure_plate": { - "powered=false": [ - 1, - 0, - 1, - 15, - 1, - 15 - ], - "powered=true": [ - 1, - 0, - 1, - 15, - 0.5, - 15 - ] - }, - "heavy_weighted_pressure_plate": { - "powered=false": [ - 1, - 0, - 1, - 15, - 1, - 15 - ], - "powered=true": [ - 1, - 0, - 1, - 15, - 0.5, - 15 - ] - }, - "activator_rail": { - "shape=ascending_east": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "shape=ascending_north": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "shape=ascending_south": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "shape=ascending_west": [ - 0, - 0, - 0, - 16, - 8, - 16 - ], - "": [ - 0, - 0, - 0, - 16, - 2, - 16 - ] - }, - "light": [], - "sunflower": [ - 0, - 0, - 0, - 16, - 16, - 16 - ], - "rose_bush": [ - 0, - 0, - 0, - 16, - 16, - 16 - ], - "peony": [ - 0, - 0, - 0, - 16, - 16, - 16 - ], - "large_fern": [ - 0, - 0, - 0, - 16, - 16, - 16 - ], - "white_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "orange_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "magenta_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "light_blue_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "yellow_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "lime_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "pink_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "gray_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "light_gray_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "cyan_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "purple_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "blue_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "brown_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "green_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "red_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "black_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "white_wall_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "orange_wall_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "magenta_wall_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "light_blue_wall_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "yellow_wall_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "lime_wall_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "pink_wall_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "gray_wall_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "light_gray_wall_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "cyan_wall_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "purple_wall_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "blue_wall_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "brown_wall_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "green_wall_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "red_wall_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "black_wall_banner": { - "facing=north": [ - 0, - 0, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 0, - 0, - 16, - 12.5, - 2 - ], - "facing=west": [ - 14, - 0, - 0, - 16, - 12.5, - 16 - ], - "facing=east": [ - 0, - 0, - 0, - 2, - 12.5, - 16 - ] - }, - "torchflower_crop": { - "age=0": [ - 5, - 0, - 5, - 11, - 6, - 11 - ], - "age=1": [ - 5, - 0, - 5, - 11, - 10, - 11 - ] - }, - "pitcher_plant": [ - 0, - 0, - 0, - 16, - 16, - 16 - ], - "beetroots": { - "age=0": [ - 0, - 0, - 0, - 16, - 2, - 16 - ], - "age=1": [ - 0, - 0, - 0, - 16, - 4, - 16 - ], - "age=2": [ - 0, - 0, - 0, - 16, - 6, - 16 - ], - "age=3": [ - 0, - 0, - 0, - 16, - 8, - 16 - ] - }, - "kelp": [ - 0, - 0, - 0, - 16, - 9, - 16 - ], - "dead_tube_coral_wall_fan": { - "facing=north": [ - 0, - 4, - 5, - 16, - 12, - 16 - ], - "facing=south": [ - 0, - 4, - 0, - 16, - 12, - 11 - ], - "facing=west": [ - 5, - 4, - 0, - 16, - 12, - 16 - ], - "facing=east": [ - 0, - 4, - 0, - 11, - 12, - 16 - ] - }, - "dead_brain_coral_wall_fan": { - "facing=north": [ - 0, - 4, - 5, - 16, - 12, - 16 - ], - "facing=south": [ - 0, - 4, - 0, - 16, - 12, - 11 - ], - "facing=west": [ - 5, - 4, - 0, - 16, - 12, - 16 - ], - "facing=east": [ - 0, - 4, - 0, - 11, - 12, - 16 - ] - }, - "dead_bubble_coral_wall_fan": { - "facing=north": [ - 0, - 4, - 5, - 16, - 12, - 16 - ], - "facing=south": [ - 0, - 4, - 0, - 16, - 12, - 11 - ], - "facing=west": [ - 5, - 4, - 0, - 16, - 12, - 16 - ], - "facing=east": [ - 0, - 4, - 0, - 11, - 12, - 16 - ] - }, - "dead_fire_coral_wall_fan": { - "facing=north": [ - 0, - 4, - 5, - 16, - 12, - 16 - ], - "facing=south": [ - 0, - 4, - 0, - 16, - 12, - 11 - ], - "facing=west": [ - 5, - 4, - 0, - 16, - 12, - 16 - ], - "facing=east": [ - 0, - 4, - 0, - 11, - 12, - 16 - ] - }, - "dead_horn_coral_wall_fan": { - "facing=north": [ - 0, - 4, - 5, - 16, - 12, - 16 - ], - "facing=south": [ - 0, - 4, - 0, - 16, - 12, - 11 - ], - "facing=west": [ - 5, - 4, - 0, - 16, - 12, - 16 - ], - "facing=east": [ - 0, - 4, - 0, - 11, - 12, - 16 - ] - }, - "tube_coral_wall_fan": { - "facing=north": [ - 0, - 4, - 5, - 16, - 12, - 16 - ], - "facing=south": [ - 0, - 4, - 0, - 16, - 12, - 11 - ], - "facing=west": [ - 5, - 4, - 0, - 16, - 12, - 16 - ], - "facing=east": [ - 0, - 4, - 0, - 11, - 12, - 16 - ] - }, - "brain_coral_wall_fan": { - "facing=north": [ - 0, - 4, - 5, - 16, - 12, - 16 - ], - "facing=south": [ - 0, - 4, - 0, - 16, - 12, - 11 - ], - "facing=west": [ - 5, - 4, - 0, - 16, - 12, - 16 - ], - "facing=east": [ - 0, - 4, - 0, - 11, - 12, - 16 - ] - }, - "bubble_coral_wall_fan": { - "facing=north": [ - 0, - 4, - 5, - 16, - 12, - 16 - ], - "facing=south": [ - 0, - 4, - 0, - 16, - 12, - 11 - ], - "facing=west": [ - 5, - 4, - 0, - 16, - 12, - 16 - ], - "facing=east": [ - 0, - 4, - 0, - 11, - 12, - 16 - ] - }, - "fire_coral_wall_fan": { - "facing=north": [ - 0, - 4, - 5, - 16, - 12, - 16 - ], - "facing=south": [ - 0, - 4, - 0, - 16, - 12, - 11 - ], - "facing=west": [ - 5, - 4, - 0, - 16, - 12, - 16 - ], - "facing=east": [ - 0, - 4, - 0, - 11, - 12, - 16 - ] - }, - "horn_coral_wall_fan": { - "facing=north": [ - 0, - 4, - 5, - 16, - 12, - 16 - ], - "facing=south": [ - 0, - 4, - 0, - 16, - 12, - 11 - ], - "facing=west": [ - 5, - 4, - 0, - 16, - 12, - 16 - ], - "facing=east": [ - 0, - 4, - 0, - 11, - 12, - 16 - ] - }, - "sweet_berry_bush": { - "age=0": [ - 3, - 0, - 3, - 13, - 8, - 13 - ], - "age=1": [ - 1, - 0, - 1, - 15, - 16, - 15 - ], - "age=2": [ - 1, - 0, - 1, - 15, - 16, - 15 - ], - "": [ - 0, - 0, - 0, - 16, - 16, - 16 - ] - }, - "weeping_vines": [ - 4, - 9, - 4, - 12, - 16, - 12 - ], - "twisting_vines": [ - 4, - 0, - 4, - 12, - 15, - 12 - ], - "crimson_pressure_plate": { - "powered=false": [ - 1, - 0, - 1, - 15, - 1, - 15 - ], - "powered=true": [ - 1, - 0, - 1, - 15, - 0.5, - 15 - ] - }, - "warped_pressure_plate": { - "powered=false": [ - 1, - 0, - 1, - 15, - 1, - 15 - ], - "powered=true": [ - 1, - 0, - 1, - 15, - 0.5, - 15 - ] - }, - "crimson_button": { - "face=floor,facing=north,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=north,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=south,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=south,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=west,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=west,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=floor,facing=east,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=east,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=wall,facing=north,powered=false": [ - 5, - 6, - 14, - 11, - 10, - 16 - ], - "face=wall,facing=north,powered=true": [ - 5, - 6, - 15, - 11, - 10, - 16 - ], - "face=wall,facing=south,powered=false": [ - 5, - 6, - 0, - 11, - 10, - 2 - ], - "face=wall,facing=south,powered=true": [ - 5, - 6, - 0, - 11, - 10, - 1 - ], - "face=wall,facing=west,powered=false": [ - 14, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=west,powered=true": [ - 15, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=east,powered=false": [ - 0, - 6, - 5, - 2, - 10, - 11 - ], - "face=wall,facing=east,powered=true": [ - 0, - 6, - 5, - 1, - 10, - 11 - ], - "face=ceiling,facing=north,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=north,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=west,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=west,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ] - }, - "warped_button": { - "face=floor,facing=north,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=north,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=south,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=south,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=west,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=west,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=floor,facing=east,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=east,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=wall,facing=north,powered=false": [ - 5, - 6, - 14, - 11, - 10, - 16 - ], - "face=wall,facing=north,powered=true": [ - 5, - 6, - 15, - 11, - 10, - 16 - ], - "face=wall,facing=south,powered=false": [ - 5, - 6, - 0, - 11, - 10, - 2 - ], - "face=wall,facing=south,powered=true": [ - 5, - 6, - 0, - 11, - 10, - 1 - ], - "face=wall,facing=west,powered=false": [ - 14, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=west,powered=true": [ - 15, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=east,powered=false": [ - 0, - 6, - 5, - 2, - 10, - 11 - ], - "face=wall,facing=east,powered=true": [ - 0, - 6, - 5, - 1, - 10, - 11 - ], - "face=ceiling,facing=north,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=north,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=west,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=west,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ] - }, - "crimson_sign": [ - 4, - 0, - 4, - 12, - 16, - 12 - ], - "warped_sign": [ - 4, - 0, - 4, - 12, - 16, - 12 - ], - "crimson_wall_sign": { - "facing=north": [ - 0, - 4.5, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 4.5, - 0, - 16, - 12.5, - 2 - ], - "facing=east": [ - 0, - 4.5, - 0, - 2, - 12.5, - 16 - ], - "facing=west": [ - 14, - 4.5, - 0, - 16, - 12.5, - 16 - ] - }, - "warped_wall_sign": { - "facing=north": [ - 0, - 4.5, - 14, - 16, - 12.5, - 16 - ], - "facing=south": [ - 0, - 4.5, - 0, - 16, - 12.5, - 2 - ], - "facing=east": [ - 0, - 4.5, - 0, - 2, - 12.5, - 16 - ], - "facing=west": [ - 14, - 4.5, - 0, - 16, - 12.5, - 16 - ] - }, - "polished_blackstone_pressure_plate": { - "powered=false": [ - 1, - 0, - 1, - 15, - 1, - 15 - ], - "powered=true": [ - 1, - 0, - 1, - 15, - 0.5, - 15 - ] - }, - "polished_blackstone_button": { - "face=floor,facing=north,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=north,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=south,powered=false": [ - 5, - 0, - 6, - 11, - 2, - 10 - ], - "face=floor,facing=south,powered=true": [ - 5, - 0, - 6, - 11, - 1, - 10 - ], - "face=floor,facing=west,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=west,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=floor,facing=east,powered=false": [ - 6, - 0, - 5, - 10, - 2, - 11 - ], - "face=floor,facing=east,powered=true": [ - 6, - 0, - 5, - 10, - 1, - 11 - ], - "face=wall,facing=north,powered=false": [ - 5, - 6, - 14, - 11, - 10, - 16 - ], - "face=wall,facing=north,powered=true": [ - 5, - 6, - 15, - 11, - 10, - 16 - ], - "face=wall,facing=south,powered=false": [ - 5, - 6, - 0, - 11, - 10, - 2 - ], - "face=wall,facing=south,powered=true": [ - 5, - 6, - 0, - 11, - 10, - 1 - ], - "face=wall,facing=west,powered=false": [ - 14, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=west,powered=true": [ - 15, - 6, - 5, - 16, - 10, - 11 - ], - "face=wall,facing=east,powered=false": [ - 0, - 6, - 5, - 2, - 10, - 11 - ], - "face=wall,facing=east,powered=true": [ - 0, - 6, - 5, - 1, - 10, - 11 - ], - "face=ceiling,facing=north,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=north,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=false": [ - 5, - 14, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=south,powered=true": [ - 5, - 15, - 6, - 11, - 16, - 10 - ], - "face=ceiling,facing=west,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=west,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=false": [ - 6, - 14, - 5, - 10, - 16, - 11 - ], - "face=ceiling,facing=east,powered=true": [ - 6, - 15, - 5, - 10, - 16, - 11 - ] - }, - "sculk_vein": { - "combine": { - "up=true": [ - 0, - 15, - 0, - 16, - 16, - 16 - ], - "west=true": [ - 0, - 0, - 0, - 1, - 16, - 16 - ], - "east=true": [ - 15, - 0, - 0, - 16, - 16, - 16 - ], - "north=true": [ - 0, - 0, - 0, - 16, - 16, - 1 - ], - "south=true": [ - 0, - 0, - 15, - 16, - 16, - 16 - ] - } - }, - "cave_vines": [ - 1, - 0, - 1, - 15, - 16, - 15 - ], - "big_dripleaf_stem": { - "facing=north": [ - 5, - 0, - 9, - 11, - 16, - 15 - ], - "facing=south": [ - 5, - 0, - 1, - 11, - 16, - 7 - ], - "facing=east": [ - 1, - 0, - 5, - 7, - 16, - 11 - ], - "facing=west": [ - 9, - 0, - 5, - 15, - 16, - 11 - ] - }, - "small_dripleaf": [ - 2, - 0, - 2, - 14, - 13, - 14 - ] -} diff --git a/src/inventoryWindows.ts b/src/inventoryWindows.ts deleted file mode 100644 index d40260df..00000000 --- a/src/inventoryWindows.ts +++ /dev/null @@ -1,666 +0,0 @@ -import { proxy, subscribe } from 'valtio' -import { showInventory } from 'minecraft-inventory-gui/web/ext.mjs' - -// import Dirt from 'mc-assets/dist/other-textures/latest/blocks/dirt.png' -import { RecipeItem } from 'minecraft-data' -import { flat, fromFormattedString } from '@xmcl/text-component' -import { splitEvery, equals } from 'rambda' -import PItem, { Item } from 'prismarine-item' -import { versionToNumber } from 'renderer/viewer/common/utils' -import { getRenamedData } from 'flying-squid/dist/blockRenames' -import PrismarineChatLoader from 'prismarine-chat' -import * as nbt from 'prismarine-nbt' -import { BlockModel } from 'mc-assets' -import { renderSlot } from 'renderer/viewer/three/renderSlot' -import { loadSkinFromUsername } from 'renderer/viewer/lib/utils/skins' -import Generic95 from '../assets/generic_95.png' -import { appReplacableResources } from './generated/resources' -import { activeModalStack, hideCurrentModal, hideModal, miscUiState, showModal } from './globalState' -import { options } from './optionsStorage' -import { assertDefined, inGameError } from './utils' -import { displayClientChat } from './botUtils' -import { currentScaling } from './scaleInterface' -import { getItemDescription } from './itemsDescriptions' -import { MessageFormatPart } from './chatUtils' -import { GeneralInputItem, getItemMetadata, getItemModelName, getItemNameRaw, RenderItem } from './mineflayer/items' -import { playerState } from './mineflayer/playerState' -import { modelViewerState } from './react/OverlayModelViewer' - -const loadedImagesCache = new Map() -const cleanLoadedImagesCache = () => { - loadedImagesCache.delete('blocks') - loadedImagesCache.delete('items') -} - -let lastWindow: ReturnType -let lastWindowType: string | null | undefined // null is inventory -/** bot version */ -let version: string -let PrismarineItem: typeof Item - -export const jeiCustomCategories = proxy({ - value: [] as Array<{ id: string, categoryTitle: string, items: any[] }> -}) - -let remotePlayerSkin: string | undefined | Promise - -export const showInventoryPlayer = () => { - modelViewerState.model = { - positioning: { - windowWidth: 176, - windowHeight: 166, - x: 25, - y: 8, - width: 50, - height: 70, - scaled: true, - onlyInitialScale: true, - followCursor: true, - }, - // models: ['https://bucket.mcraft.fun/sitarbuckss.glb'], - // debug: true, - steveModelSkin: appViewer.playerState.reactive.playerSkin ?? (typeof remotePlayerSkin === 'string' ? remotePlayerSkin : ''), - } - if (remotePlayerSkin === undefined && !appViewer.playerState.reactive.playerSkin) { - remotePlayerSkin = loadSkinFromUsername(bot.username, 'skin').then(a => { - setTimeout(() => { showInventoryPlayer() }, 0) // todo patch instead and make reactive - remotePlayerSkin = a ?? '' - return remotePlayerSkin - }) - } -} - -export const onGameLoad = () => { - version = bot.version - - PrismarineItem = PItem(version) - - const mapWindowType = (type: string, inventoryStart: number) => { - if (type === 'minecraft:container') { - if (inventoryStart === 45 - 9 * 4) return 'minecraft:generic_9x1' - if (inventoryStart === 45 - 9 * 3) return 'minecraft:generic_9x2' - if (inventoryStart === 45 - 9 * 2) return 'minecraft:generic_9x3' - if (inventoryStart === 45 - 9) return 'minecraft:generic_9x4' - if (inventoryStart === 45) return 'minecraft:generic_9x5' - if (inventoryStart === 45 + 9) return 'minecraft:generic_9x6' - } - return type - } - - const maybeParseNbtJson = (data: any) => { - if (typeof data === 'string') { - try { - data = JSON.parse(data) - } catch (err) { - // ignore - } - } - return nbt.simplify(data) ?? data - } - - bot.on('windowOpen', (win) => { - const implementedWindow = implementedContainersGuiMap[mapWindowType(win.type as string, win.inventoryStart)] - if (implementedWindow) { - openWindow(implementedWindow, maybeParseNbtJson(win.title)) - } else if (options.unimplementedContainers) { - openWindow('ChestWin', maybeParseNbtJson(win.title)) - } else { - // todo format - displayClientChat(`[client error] cannot open unimplemented window ${win.id} (${win.type}). Slots: ${win.slots.map(item => getItemName(item)).filter(Boolean).join(', ')}`) - bot.currentWindow?.['close']() - } - }) - - // workaround: singleplayer player inventory crafting - let skipUpdate = false - bot.inventory.on('updateSlot', ((_oldSlot, oldItem, newItem) => { - const currentSlot = _oldSlot as number - if (!miscUiState.singleplayer || oldItem === newItem || skipUpdate) return - const { craftingResultSlot } = bot.inventory - if (currentSlot === craftingResultSlot && oldItem && !newItem) { - for (let i = 1; i < 5; i++) { - const count = bot.inventory.slots[i]?.count - if (count && count > 1) { - const slot = bot.inventory.slots[i]! - slot.count-- - void bot.creative.setInventorySlot(i, slot) - } else { - void bot.creative.setInventorySlot(i, null) - } - } - return - } - if (currentSlot > 4) return - const craftingSlots = bot.inventory.slots.slice(1, 5) - try { - const resultingItem = getResultingRecipe(craftingSlots, 2) - skipUpdate = true - void bot.creative.setInventorySlot(craftingResultSlot, resultingItem ?? null).then(() => { - skipUpdate = false - }) - } catch (err) { - console.error(err) - // todo resolve the error! and why would we ever get here on every update? - } - }) as any) - - bot.on('windowClose', () => { - // todo hide up to the window itself! - if (lastWindow) { - hideCurrentModal() - } - }) - bot.on('respawn', () => { // todo validate logic against native client (maybe login) - if (lastWindow) { - hideCurrentModal() - } - }) - - customEvents.on('search', (q) => { - if (!lastWindow) return - upJei(q) - }) - - if (!appViewer.resourcesManager['_inventoryChangeTracked']) { - appViewer.resourcesManager['_inventoryChangeTracked'] = true - const texturesChanged = () => { - cleanLoadedImagesCache() - if (!lastWindow) return - upWindowItemsLocal() - upJei(lastJeiSearch) - } - appViewer.resourcesManager.on('assetsInventoryReady', () => texturesChanged()) - appViewer.resourcesManager.on('assetsTexturesUpdated', () => texturesChanged()) - } -} - -const getImageSrc = (path): string | HTMLImageElement | ImageBitmap => { - switch (path) { - case 'gui/container/inventory': return appReplacableResources.latest_gui_container_inventory.content - case 'blocks': return appViewer.resourcesManager.blocksAtlasParser.latestImage - case 'items': return appViewer.resourcesManager.itemsAtlasParser.latestImage - case 'gui': return appViewer.resourcesManager.currentResources!.guiAtlas!.image - case 'gui/container/dispenser': return appReplacableResources.latest_gui_container_dispenser.content - case 'gui/container/furnace': return appReplacableResources.latest_gui_container_furnace.content - case 'gui/container/crafting_table': return appReplacableResources.latest_gui_container_crafting_table.content - case 'gui/container/shulker_box': return appReplacableResources.latest_gui_container_shulker_box.content - case 'gui/container/generic_54': return appReplacableResources.latest_gui_container_generic_54.content - case 'gui/container/generic_95': return Generic95 - case 'gui/container/hopper': return appReplacableResources.latest_gui_container_hopper.content - case 'gui/container/horse': return appReplacableResources.latest_gui_container_horse.content - case 'gui/container/villager2': return appReplacableResources.latest_gui_container_villager2.content - case 'gui/container/enchanting_table': return appReplacableResources.latest_gui_container_enchanting_table.content - case 'gui/container/anvil': return appReplacableResources.latest_gui_container_anvil.content - case 'gui/container/beacon': return appReplacableResources.latest_gui_container_beacon.content - case 'gui/widgets': return appReplacableResources.other_textures_latest_gui_widgets.content - } - // empty texture - return 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=' -} - -const getImage = ({ path = undefined as string | undefined, texture = undefined as string | undefined, blockData = undefined as any, image = undefined as HTMLImageElement | undefined }, onLoad = () => { }) => { - if (image) { - return image - } - if (!path && !texture) { - throw new Error('Either pass path or texture') - } - const loadPath = (blockData ? 'blocks' : path ?? texture)! - if (loadedImagesCache.has(loadPath)) { - onLoad() - } else { - const imageSrc = getImageSrc(loadPath) - if (imageSrc instanceof ImageBitmap) { - onLoad() - loadedImagesCache.set(loadPath, imageSrc) - return imageSrc - } - - let image: HTMLImageElement - if (imageSrc instanceof Image) { - image = imageSrc - } else { - image = new Image() - image.src = imageSrc - } - image.onload = onLoad - loadedImagesCache.set(loadPath, image) - } - return loadedImagesCache.get(loadPath) -} - -const getItemName = (slot: Item | RenderItem | null) => { - const parsed = getItemNameRaw(slot, appViewer.resourcesManager) - if (!parsed) return - // todo display full text renderer from sign renderer - const text = flat(parsed as MessageFormatPart).map(x => (typeof x === 'string' ? x : x.text)) - return text.join('') -} - -let lastMappedSlots = [] as any[] -const itemToVisualKey = (slot: RenderItem | Item | null) => { - if (!slot) return '' - const keys = [ - slot.name, - slot.durabilityUsed, - slot.maxDurability, - slot['count'], - slot['metadata'], - slot.nbt ? JSON.stringify(slot.nbt) : '', - slot['components'] ? JSON.stringify(slot['components']) : '', - appViewer.resourcesManager.currentResources!.guiAtlasVersion, - ].join('|') - return keys -} -const validateSlot = (slot: any, index: number) => { - if (!slot.texture) { - throw new Error(`Slot has no texture: ${index} ${slot.name}`) - } -} -const mapSlots = (slots: Array, isJei = false) => { - const newSlots = slots.map((slot, i) => { - if (!slot) return null - - if (!isJei) { - const oldKey = lastMappedSlots[i]?.cacheKey - const newKey = itemToVisualKey(slot) - slot['cacheKey'] = i + '|' + newKey - if (oldKey && oldKey === newKey) { - validateSlot(lastMappedSlots[i], i) - return lastMappedSlots[i] - } - } - - try { - if (slot.durabilityUsed && slot.maxDurability) slot.durabilityUsed = Math.min(slot.durabilityUsed, slot.maxDurability) - const debugIsQuickbar = !isJei && i === bot.inventory.hotbarStart + bot.quickBarSlot - const modelName = getItemModelName(slot, { 'minecraft:display_context': 'gui', }, appViewer.resourcesManager, appViewer.playerState.reactive) - const slotCustomProps = renderSlot({ modelName, originalItemName: slot.name }, appViewer.resourcesManager, debugIsQuickbar) - const itemCustomName = getItemName(slot) - Object.assign(slot, { ...slotCustomProps, displayName: itemCustomName ?? slot.displayName }) - //@ts-expect-error - slot.toJSON = () => { - // Allow to serialize slot to JSON as minecraft-inventory-gui creates icon property as cache (recursively) - //@ts-expect-error - const { icon, ...rest } = slot - return rest - } - validateSlot(slot, i) - } catch (err) { - inGameError(err) - } - return slot - }) - lastMappedSlots = JSON.parse(JSON.stringify(newSlots)) - return newSlots -} - -export const upInventoryItems = (isInventory: boolean, invWindow = lastWindow) => { - // inv.pwindow.inv.slots[2].displayName = 'test' - // inv.pwindow.inv.slots[2].blockData = getBlockData('dirt') - const customSlots = mapSlots((isInventory ? bot.inventory : bot.currentWindow)!.slots) - invWindow.pwindow.setSlots(customSlots) - return customSlots -} - -export const onModalClose = (callback: () => any) => { - const modal = activeModalStack.at(-1) - const unsubscribe = subscribe(activeModalStack, () => { - const newModal = activeModalStack.at(-1) - if (modal?.reactType !== newModal?.reactType) { - callback() - unsubscribe() - } - }, true) -} - -const implementedContainersGuiMap = { - // todo allow arbitrary size instead! - 'minecraft:generic_9x1': 'ChestWin', - 'minecraft:generic_9x2': 'ChestWin', - 'minecraft:generic_9x3': 'ChestWin', - 'minecraft:generic_9x4': 'Generic95Win', - 'minecraft:generic_9x5': 'Generic95Win', - // hopper - 'minecraft:generic_5x1': 'HopperWin', - 'minecraft:generic_9x6': 'LargeChestWin', - 'minecraft:generic_3x3': 'DropDispenseWin', - 'minecraft:furnace': 'FurnaceWin', - 'minecraft:smoker': 'FurnaceWin', - 'minecraft:shulker_box': 'ChestWin', - 'minecraft:blast_furnace': 'FurnaceWin', - 'minecraft:crafting': 'CraftingWin', - 'minecraft:crafting3x3': 'CraftingWin', // todo different result slot - 'minecraft:anvil': 'AnvilWin', - // enchant - 'minecraft:enchanting_table': 'EnchantingWin', - // horse - 'minecraft:horse': 'HorseWin', - // villager - 'minecraft:villager': 'VillagerWin', -} - -let lastJeiSearch = '' -const upJei = (search: string) => { - lastJeiSearch = search - search = search.toLowerCase() - // todo fix pre flat - const itemsArray = [ - ...jeiCustomCategories.value.flatMap(x => x.items).filter(x => x !== null), - ...loadedData.itemsArray.filter(x => x.displayName.toLowerCase().includes(search)).map(item => new PrismarineItem(item.id, 1)).filter(x => x !== null) - ] - const matchedSlots = itemsArray.map(x => { - x.displayName = getItemName(x) ?? x.displayName - if (!x.displayName.toLowerCase().includes(search)) return null - return x - }).filter(a => a !== null) - lastWindow.pwindow.win.jeiSlotsPage = 0 - lastWindow.pwindow.win.jeiSlots = mapSlots(matchedSlots, true) -} - -export const openItemsCanvas = (type, _bot = bot as typeof bot | null) => { - const inv = showInventory(type, getImage, {}, _bot); - (inv.canvasManager.children[0].callbacks as any).getItemRecipes = (item) => { - const allRecipes = getAllItemRecipes(item.name) - inv.canvasManager.children[0].messageDisplay = '' - const itemDescription = getItemDescription(item) - if (!allRecipes?.length && !itemDescription) { - inv.canvasManager.children[0].messageDisplay = `No recipes found for ${item.displayName}` - } - return [...allRecipes ?? [], ...itemDescription ? [ - [ - 'GenericDescription', - mapSlots([item], true)[0], - [], - itemDescription - ] - ] : []] - } - (inv.canvasManager.children[0].callbacks as any).getItemUsages = (item) => { - const allItemUsages = getAllItemUsages(item.name) - inv.canvasManager.children[0].messageDisplay = '' - if (!allItemUsages?.length) { - inv.canvasManager.children[0].messageDisplay = `No usages found for ${item.displayName}` - } - return allItemUsages - } - return inv -} - -const upWindowItemsLocal = () => { - if (!lastWindow && bot.currentWindow) { - // edge case: might happen due to high ping, inventory should be closed soon! - // openWindow(implementedContainersGuiMap[bot.currentWindow.type]) - return - } - void Promise.resolve().then(() => upInventoryItems(lastWindowType === null)) -} - -let skipClosePacketSending = false -const openWindow = (type: string | undefined, title: string | any = undefined) => { - // if (activeModalStack.some(x => x.reactType?.includes?.('player_win:'))) { - if (activeModalStack.length) { // game is not in foreground, don't close current modal - if (type) { - skipClosePacketSending = true - hideCurrentModal() - } else { - bot.currentWindow?.['close']() - return - } - } - lastWindowType = type ?? null - showModal({ - reactType: `player_win:${type}`, - }) - onModalClose(() => { - // might be already closed (event fired) - if (type !== undefined && bot.currentWindow && !skipClosePacketSending) bot.currentWindow['close']() - lastWindow.destroy() - lastWindow = null as any - lastWindowType = null - window.inventory = null - miscUiState.displaySearchInput = false - destroyFn() - skipClosePacketSending = false - - modelViewerState.model = undefined - }) - if (type === undefined) { - showInventoryPlayer() - } - cleanLoadedImagesCache() - const inv = openItemsCanvas(type) - inv.canvasManager.children[0].mobileHelpers = miscUiState.currentTouch - window.inventory = inv - const PrismarineChat = PrismarineChatLoader(bot.version) - try { - inv.canvasManager.children[0].customTitleText = title ? - typeof title === 'string' ? - fromFormattedString(title).text : - new PrismarineChat(title).toString() : - undefined - } catch (err) { - reportError?.(err) - inv.canvasManager.children[0].customTitleText = undefined - } - // todo - inv.canvasManager.setScale(currentScaling.scale === 1 ? 1.5 : currentScaling.scale) - inv.canvas.style.zIndex = '10' - inv.canvas.style.position = 'fixed' - inv.canvas.style.inset = '0' - - inv.canvasManager.onClose = async () => { - await new Promise(resolve => { - setTimeout(resolve, 0) - }) - if (activeModalStack.at(-1)?.reactType?.includes('player_win:')) { - hideModal(undefined, undefined, { force: true }) - } - inv.canvasManager.destroy() - } - - lastWindow = inv - - upWindowItemsLocal() - - lastWindow.pwindow.touch = miscUiState.currentTouch ?? false - const oldOnInventoryEvent = lastWindow.pwindow.onInventoryEvent.bind(lastWindow.pwindow) - lastWindow.pwindow.onInventoryEvent = (type, containing, windowIndex, inventoryIndex, item) => { - if (inv.canvasManager.children[0].currentGuide) { - const isRightClick = type === 'rightclick' - const isLeftClick = type === 'leftclick' - if (isLeftClick || isRightClick) { - modelViewerState.model = undefined - inv.canvasManager.children[0].showRecipesOrUsages(isLeftClick, item) - } - } else { - oldOnInventoryEvent(type, containing, windowIndex, inventoryIndex, item) - } - } - lastWindow.pwindow.onJeiClick = (slotItem, _index, isRightclick) => { - if (versionToNumber(bot.version) < versionToNumber('1.13')) { - alert('Item give is broken on 1.12.2 and below, we are working on it!') - return - } - // slotItem is the slot from mapSlots - const itemId = loadedData.itemsByName[slotItem.name]?.id - if (!itemId) { - inGameError(`Item for block ${slotItem.name} not found`) - return - } - const item = PrismarineItem.fromNotch({ - ...slotItem, - itemId, - itemCount: isRightclick ? 64 : 1, - components: slotItem.components ?? [], - removeComponents: slotItem.removedComponents ?? [], - itemDamage: slotItem.metadata ?? 0, - nbt: slotItem.nbt, - }) - if (bot.game.gameMode === 'creative') { - const freeSlot = bot.inventory.firstEmptyInventorySlot() - if (freeSlot === null) return - void bot.creative.setInventorySlot(freeSlot, item) - } else { - modelViewerState.model = undefined - inv.canvasManager.children[0].showRecipesOrUsages(!isRightclick, mapSlots([item], true)[0]) - } - } - - const isJeiEnabled = () => { - if (typeof options.jeiEnabled === 'boolean') return options.jeiEnabled - if (Array.isArray(options.jeiEnabled)) { - return options.jeiEnabled.includes(bot.game?.gameMode as any) - } - return false - } - - if (isJeiEnabled()) { - lastWindow.pwindow.win.jeiSlotsPage = 0 - // todo workaround so inventory opens immediately (though it still lags) - setTimeout(() => { - upJei('') - }) - miscUiState.displaySearchInput = true - } else { - lastWindow.pwindow.win.jeiSlots = [] - miscUiState.displaySearchInput = false - } - - if (type === undefined) { - // player inventory - bot.inventory.on('updateSlot', upWindowItemsLocal) - destroyFn = () => { - bot.inventory.off('updateSlot', upWindowItemsLocal) - } - } else { - //@ts-expect-error - bot.currentWindow.on('updateSlot', () => { - upWindowItemsLocal() - }) - } -} - -let destroyFn = () => { } - -export const openPlayerInventory = () => { - openWindow(undefined) -} - -const getResultingRecipe = (slots: Array, gridRows: number) => { - const inputSlotsItems = slots.map(blockSlot => blockSlot?.type) - let currentShape = splitEvery(gridRows, inputSlotsItems as Array) - // todo rewrite with candidates search - if (currentShape.length > 1) { - // eslint-disable-next-line @typescript-eslint/no-for-in-array - for (const slotX in currentShape[0]) { - if (currentShape[0][slotX] !== undefined) { - for (const [otherY] of Array.from({ length: gridRows }).entries()) { - if (currentShape[otherY]?.[slotX] === undefined) { - currentShape[otherY]![slotX] = null - } - } - } - } - } - currentShape = currentShape.map(arr => arr.filter(x => x !== undefined)).filter(x => x.length !== 0) - - // todo rewrite - // eslint-disable-next-line @typescript-eslint/require-array-sort-compare - const slotsIngredients = [...inputSlotsItems].sort().filter(item => item !== undefined) - type Result = RecipeItem | undefined - let shapelessResult: Result - let shapeResult: Result - outer: for (const [id, recipeVariants] of Object.entries(loadedData.recipes ?? {})) { - for (const recipeVariant of recipeVariants) { - if ('inShape' in recipeVariant && equals(currentShape, recipeVariant.inShape as number[][])) { - shapeResult = recipeVariant.result! - break outer - } - if ('ingredients' in recipeVariant && equals(slotsIngredients, recipeVariant.ingredients?.sort() as number[])) { - shapelessResult = recipeVariant.result - break outer - } - } - } - const result = shapeResult ?? shapelessResult - if (!result) return - const id = typeof result === 'number' ? result : Array.isArray(result) ? result[0] : result.id - if (!id) return - const count = (typeof result === 'number' ? undefined : Array.isArray(result) ? result[1] : result.count) ?? 1 - const metadata = typeof result === 'object' && !Array.isArray(result) ? result.metadata : undefined - const item = new PrismarineItem(id, count, metadata) - return item -} - -const ingredientToItem = (recipeItem) => (recipeItem === null ? null : new PrismarineItem(recipeItem, 1)) - -const getAllItemRecipes = (itemName: string) => { - const item = loadedData.itemsByName[itemName] - if (!item) return - const itemId = item.id - const recipes = loadedData.recipes?.[itemId] - if (!recipes) return - const results = [] as Array<{ - result: Item, - ingredients: Array, - description?: string - }> - - // get recipes here - for (const recipe of recipes) { - const { result } = recipe - if (!result) continue - const resultId = typeof result === 'number' ? result : Array.isArray(result) ? result[0]! : result.id - const resultCount = (typeof result === 'number' ? undefined : Array.isArray(result) ? result[1] : result.count) ?? 1 - const resultMetadata = typeof result === 'object' && !Array.isArray(result) ? result.metadata : undefined - const resultItem = new PrismarineItem(resultId!, resultCount, resultMetadata) - if ('inShape' in recipe) { - const ingredients = recipe.inShape - if (!ingredients) continue - - const ingredientsItems = ingredients.flatMap(items => items.map(item => ingredientToItem(item))) - results.push({ result: resultItem, ingredients: ingredientsItems }) - } - if ('ingredients' in recipe) { - const { ingredients } = recipe - if (!ingredients) continue - const ingredientsItems = ingredients.map(item => ingredientToItem(item)) - results.push({ result: resultItem, ingredients: ingredientsItems, description: 'Shapeless' }) - } - } - return results.map(({ result, ingredients, description }) => { - return [ - 'CraftingTableGuide', - mapSlots([result], true)[0], - mapSlots(ingredients, true), - description - ] - }) -} - -const getAllItemUsages = (itemName: string) => { - const item = loadedData.itemsByName[itemName] - if (!item) return - const foundRecipeIds = [] as string[] - - for (const [id, recipes] of Object.entries(loadedData.recipes ?? {})) { - for (const recipe of recipes) { - if ('inShape' in recipe) { - if (recipe.inShape.some(row => row.includes(item.id))) { - foundRecipeIds.push(id) - } - } - if ('ingredients' in recipe) { - if (recipe.ingredients.includes(item.id)) { - foundRecipeIds.push(id) - } - } - } - } - - return foundRecipeIds.flatMap(id => { - // todo should use exact match, not include all recipes! - return getAllItemRecipes(loadedData.items[id].name) - }) -} diff --git a/src/itemsDescriptions.ts b/src/itemsDescriptions.ts deleted file mode 100644 index 662d7331..00000000 --- a/src/itemsDescriptions.ts +++ /dev/null @@ -1,1290 +0,0 @@ - -export const descriptionGenerators = new Map string)>() -descriptionGenerators.set(/_slab$/, name => 'Craft it by placing 3 blocks of the material in a row in a crafting table.') -descriptionGenerators.set(/_stairs$/, name => 'Craft it by placing 6 blocks of the material in a stair shape in a crafting table.') -descriptionGenerators.set(/_log$/, name => 'You can get it by chopping down a tree. To chop down a tree, hold down the left mouse button until the tree breaks.') -descriptionGenerators.set(/_leaves$/, name => 'You can get it by breaking the leaves of a tree with a tool that has the Silk Touch enchantment or by using shears.') -descriptionGenerators.set(['mangrove_roots'], name => 'You can get it by breaking the roots of a mangrove tree.') -descriptionGenerators.set(['mud'], 'Mud is a block found abundantly in mangrove swamps or created by using a water bottle on a dirt block. It can be used for crafting or converted into clay using pointed dripstone.') -descriptionGenerators.set(['clay'], 'Clay is a block found underwater or created by using a water bottle on a mud block. It can be used for crafting or converted into terracotta using a furnace.') -descriptionGenerators.set(['terracotta'], 'Terracotta is a block created by smelting clay in a furnace. It can be used for crafting or decoration.') -descriptionGenerators.set(['stone'], 'Stone is a block found underground.') -descriptionGenerators.set(['dirt'], 'Dirt is a block found on the surface.') -descriptionGenerators.set(['sand'], 'Sand is a block found on the surface near water.') -descriptionGenerators.set(['gravel'], 'Gravel is a block found on the surface and sometimes underground.') -descriptionGenerators.set(['sandstone'], 'Sandstone is a block found in deserts.') -descriptionGenerators.set(['red_sandstone'], 'Red sandstone is a block found in mesas.') -descriptionGenerators.set(['granite', 'diorite', 'andesite'], name => `${name.charAt(0).toUpperCase() + name.slice(1)} is a block found underground.`) -descriptionGenerators.set(['netherrack', 'soul_sand', 'soul_soil', 'glowstone'], name => `${name.charAt(0).toUpperCase() + name.slice(1)} is a block found in the Nether.`) -descriptionGenerators.set(['end_stone'], 'End stone is a block found in the End.') -descriptionGenerators.set(['obsidian'], 'Obsidian is a block created by pouring water on lava.') -descriptionGenerators.set(['glass'], 'Glass is a block created by smelting sand in a furnace.') -descriptionGenerators.set(['bedrock'], 'Bedrock is an indestructible block found at the bottom of the world in the Overworld and at the top of the world in the Nether.') -descriptionGenerators.set(['water', 'lava'], name => `${name.charAt(0).toUpperCase() + name.slice(1)} is a fluid found in the Overworld.`) -descriptionGenerators.set(/_sapling$/, name => `${name} drops from the leaves of a tree when it decays or is broken. It can be planted on dirt to grow a new tree.`) -descriptionGenerators.set(/^stripped_/, name => `${name} is created by using an axe on the block.`) -descriptionGenerators.set(['sponge'], 'Sponge is a block found in ocean monuments.') -descriptionGenerators.set(/^music_disc_/, name => `Music discs are rare items that can be found in dungeons or by trading with villagers. Also dropped by creepers when killed by a skeleton.`) -descriptionGenerators.set(/^enchanted_book$/, 'Enchanted books are rare items that can be found in dungeons or by trading with villagers.') -descriptionGenerators.set(/_spawn_egg$/, name => `${name} is an item that can be used to spawn a mob in Creative mode. Cannot be obtained in Survival mode.`) -descriptionGenerators.set(/_pottery_sherd$/, name => `${name} can be obtained only by brushing suspicious blocks, with the variants of sherd obtainable being dependent on the structure.`) -descriptionGenerators.set(['cracked_deepslate_bricks'], `Deepslate Bricks and Cracked Deepslate Bricks generate naturally in ancient cities.`) - -const moreGeneratedBlocks = { - 'natural_blocks': { - 'air': { - 'obtained_from': 'Naturally occurs in the world.' - }, - 'deepslate': { - 'obtained_from': 'Mined with a pickaxe in layers -64 to 16.', - 'rarity': 'Common' - }, - 'cobbled_deepslate': { - 'obtained_from': 'Mined from deepslate with any pickaxe.' - }, - 'calcite': { - 'obtained_from': 'Mined with a pickaxe, found in geodes.' - }, - 'tuff': { - 'obtained_from': 'Mined with a pickaxe in layers -64 to 16.', - 'rarity': 'Common' - }, - 'chiseled_tuff': { - 'obtained_from': 'Crafted from tuff.' - }, - 'polished_tuff': { - 'obtained_from': 'Crafted from tuff.' - }, - 'tuff_bricks': { - 'obtained_from': 'Crafted from tuff.' - }, - 'chiseled_tuff_bricks': { - 'obtained_from': 'Crafted from tuff bricks.' - }, - 'grass_block': { - 'obtained_from': 'Mined with a tool enchanted with Silk Touch.' - }, - 'podzol': { - 'obtained_from': 'Mined with a tool enchanted with Silk Touch, found in giant tree taiga biomes.' - }, - 'rooted_dirt': { - 'obtained_from': 'Mined with a shovel, found under azalea trees.' - }, - 'crimson_nylium': { - 'obtained_from': 'Mined with a pickaxe, found in the Nether.' - }, - 'warped_nylium': { - 'obtained_from': 'Mined with a pickaxe, found in the Nether.' - }, - 'cobblestone': { - 'obtained_from': 'Mined from stone, or from breaking stone structures.' - }, - 'mangrove_propagule': { - 'obtained_from': 'Harvested from mangrove trees.' - }, - 'suspicious_sand': { - 'obtained_from': 'Found in deserts and beaches.' - }, - 'suspicious_gravel': { - 'obtained_from': 'Found underwater.' - }, - 'red_sand': { - 'obtained_from': 'Mined from red sand in badlands biomes.' - }, - 'coal_ore': { - 'obtained_from': 'Mined with a pickaxe in layers 0 to 128.', - 'rarity': 'Common' - }, - 'deepslate_coal_ore': { - 'obtained_from': 'Mined with a pickaxe in layers -64 to 0.', - 'rarity': 'Rare' - }, - 'iron_ore': { - 'obtained_from': 'Mined with a pickaxe in layers 0 to 63.', - 'rarity': 'Common' - }, - 'deepslate_iron_ore': { - 'obtained_from': 'Mined with a pickaxe in layers -64 to 0.', - 'rarity': 'Uncommon' - }, - 'copper_ore': { - 'obtained_from': 'Mined with a pickaxe in layers 0 to 96.', - 'rarity': 'Common' - }, - 'deepslate_copper_ore': { - 'obtained_from': 'Mined with a pickaxe in layers -16 to 64.', - 'rarity': 'Uncommon' - }, - 'gold_ore': { - 'obtained_from': 'Mined with a pickaxe in layers -64 to 32.', - 'rarity': 'Uncommon' - }, - 'deepslate_gold_ore': { - 'obtained_from': 'Mined with a pickaxe in layers -64 to 0.', - 'rarity': 'Rare' - }, - 'redstone_ore': { - 'obtained_from': 'Mined with an iron pickaxe or higher in layers -64 to 16.', - 'rarity': 'Uncommon' - }, - 'deepslate_redstone_ore': { - 'obtained_from': 'Mined with an iron pickaxe or higher in layers -64 to 0.', - 'rarity': 'Uncommon' - }, - 'emerald_ore': { - 'obtained_from': 'Mined with an iron pickaxe or higher in mountain biomes, layers -16 to 256.', - 'rarity': 'Rare' - }, - 'deepslate_emerald_ore': { - 'obtained_from': 'Mined with an iron pickaxe or higher in mountain biomes, layers -64 to 0.', - 'rarity': 'Very Rare' - }, - 'lapis_ore': { - 'obtained_from': 'Mined with a stone pickaxe or higher in layers -64 to 32.', - 'rarity': 'Uncommon' - }, - 'deepslate_lapis_ore': { - 'obtained_from': 'Mined with a stone pickaxe or higher in layers -64 to 0.', - 'rarity': 'Rare' - }, - 'diamond_ore': { - 'obtained_from': 'Mined with an iron pickaxe or higher in layers -64 to 16.', - 'rarity': 'Rare' - }, - 'deepslate_diamond_ore': { - 'obtained_from': 'Mined with an iron pickaxe or higher in layers -64 to 0.', - 'rarity': 'Very Rare' - }, - 'nether_gold_ore': { - 'obtained_from': 'Mined with any pickaxe in the Nether.' - }, - 'nether_quartz_ore': { - 'obtained_from': 'Mined with any pickaxe in the Nether.' - }, - 'ancient_debris': { - 'obtained_from': 'Mined with a diamond or netherite pickaxe in the Nether, layers 8 to 22.', - 'rarity': 'Very Rare' - }, - 'budding_amethyst': { - 'obtained_from': 'Found in amethyst geodes, cannot be obtained as an item.' - }, - 'exposed_copper': { - 'obtained_from': 'Exposed copper block obtained through mining.' - }, - 'weathered_copper': { - 'obtained_from': 'Weathered copper block obtained through mining.' - }, - 'oxidized_copper': { - 'obtained_from': 'Oxidized copper block obtained through mining.' - }, - 'chiseled_copper': { - 'obtained_from': 'Crafted from copper blocks.' - }, - 'exposed_chiseled_copper': { - 'obtained_from': 'Exposed chiseled copper block obtained through mining.' - }, - 'weathered_chiseled_copper': { - 'obtained_from': 'Weathered chiseled copper block obtained through mining.' - }, - 'oxidized_chiseled_copper': { - 'obtained_from': 'Oxidized chiseled copper block obtained through mining.' - }, - 'waxed_chiseled_copper': { - 'obtained_from': 'Crafted from copper blocks, waxed to prevent oxidation.' - }, - 'waxed_exposed_chiseled_copper': { - 'obtained_from': 'Waxed exposed chiseled copper block obtained through mining.' - }, - 'waxed_weathered_chiseled_copper': { - 'obtained_from': 'Waxed weathered chiseled copper block obtained through mining.' - }, - 'waxed_oxidized_chiseled_copper': { - 'obtained_from': 'Waxed oxidized chiseled copper block obtained through mining.' - }, - 'crimson_stem': { - 'obtained_from': 'Mined from crimson trees in the Nether.' - }, - 'warped_stem': { - 'obtained_from': 'Mined from warped trees in the Nether.' - }, - 'stripped_crimson_stem': { - 'obtained_from': 'Stripped from crimson stem with an axe.' - }, - 'stripped_warped_stem': { - 'obtained_from': 'Stripped from warped stem with an axe.' - }, - 'stripped_bamboo_block': { - 'obtained_from': 'Crafted from bamboo.' - }, - 'sponge': { - 'obtained_from': 'Found in ocean monuments.' - }, - 'wet_sponge': { - 'obtained_from': 'Absorbs water, can be dried in a furnace.' - }, - 'cobweb': { - 'obtained_from': 'Mined with a sword or shears, found in mineshafts.' - }, - 'short_grass': { - 'obtained_from': 'Sheared from grass.' - }, - 'fern': { - 'obtained_from': 'Sheared from ferns in forest biomes.' - }, - 'azalea': { - 'obtained_from': 'Found in lush caves.' - }, - 'flowering_azalea': { - 'obtained_from': 'Found in lush caves.' - }, - 'dead_bush': { - 'obtained_from': 'Mined with shears in desert biomes.' - }, - 'seagrass': { - 'obtained_from': 'Sheared from underwater grass.' - }, - 'sea_pickle': { - 'obtained_from': 'Mined with shears from coral reefs.' - }, - 'dandelion': { - 'type': 'natural', - 'description': 'Dandelions are common flowers that spawn in plains, forests, and meadows.', - 'spawn_range': 'Surface' - }, - 'poppy': { - 'type': 'natural', - 'description': 'Poppies are common flowers that generate in plains, forests, and meadows.', - 'spawn_range': 'Surface' - }, - 'blue_orchid': { - 'type': 'natural', - 'description': 'Blue orchids spawn naturally in swamp biomes.', - 'spawn_range': 'Surface' - }, - 'allium': { - 'type': 'natural', - 'description': 'Alliums are flowers that generate in flower forest biomes.', - 'spawn_range': 'Surface' - }, - 'azure_bluet': { - 'type': 'natural', - 'description': 'Azure bluets are common flowers that spawn in plains and flower forest biomes.', - 'spawn_range': 'Surface' - }, - 'red_tulip': { - 'type': 'natural', - 'description': 'Red tulips are flowers found in flower forests and plains.', - 'spawn_range': 'Surface' - }, - 'orange_tulip': { - 'type': 'natural', - 'description': 'Orange tulips are flowers found in flower forests and plains.', - 'spawn_range': 'Surface' - }, - 'white_tulip': { - 'type': 'natural', - 'description': 'White tulips are flowers found in flower forests and plains.', - 'spawn_range': 'Surface' - }, - 'pink_tulip': { - 'type': 'natural', - 'description': 'Pink tulips are flowers found in flower forests and plains.', - 'spawn_range': 'Surface' - }, - 'oxeye_daisy': { - 'type': 'natural', - 'description': 'Oxeye daisies are common flowers that generate in plains and flower forest biomes.', - 'spawn_range': 'Surface' - }, - 'cornflower': { - 'type': 'natural', - 'description': 'Cornflowers spawn in plains, flower forests, and meadows.', - 'spawn_range': 'Surface' - }, - 'lily_of_the_valley': { - 'type': 'natural', - 'description': 'Lily of the valleys generate in flower forest biomes.', - 'spawn_range': 'Surface' - }, - 'wither_rose': { - 'type': 'dropped', - 'description': 'Wither roses are dropped when a mob is killed by the Wither boss.', - 'spawn_range': 'N/A' - }, - 'torchflower': { - 'type': 'crafted', - 'description': 'Torchflowers can be grown using torchflower seeds, which are found in archeology loot or by trading.', - 'spawn_range': 'N/A' - }, - 'pitcher_plant': { - 'type': 'crafted', - 'description': 'Pitcher plants can be grown using pitcher pods, which are found in archeology loot or by trading.', - 'spawn_range': 'N/A' - }, - 'spore_blossom': { - 'type': 'natural', - 'description': 'Spore blossoms generate naturally on the ceilings of lush caves.', - 'spawn_range': 'Underground' - }, - 'brown_mushroom': { - 'type': 'natural', - 'description': 'Brown mushrooms are found in dark areas, swamps, mushroom fields, and forests.', - 'spawn_range': 'Surface' - }, - 'red_mushroom': { - 'type': 'natural', - 'description': 'Red mushrooms are found in dark areas, swamps, mushroom fields, and forests.', - 'spawn_range': 'Surface' - }, - 'crimson_fungus': { - 'type': 'natural', - 'description': 'Crimson fungi generate naturally in crimson forests in the Nether.', - 'spawn_range': 'Nether' - }, - 'warped_fungus': { - 'type': 'natural', - 'description': 'Warped fungi generate naturally in warped forests in the Nether.', - 'spawn_range': 'Nether' - }, - 'crimson_roots': { - 'type': 'natural', - 'description': 'Crimson roots generate naturally in crimson forests in the Nether.', - 'spawn_range': 'Nether' - }, - 'warped_roots': { - 'type': 'natural', - 'description': 'Warped roots generate naturally in warped forests in the Nether.', - 'spawn_range': 'Nether' - }, - 'nether_sprouts': { - 'type': 'natural', - 'description': 'Nether sprouts generate naturally in warped forests in the Nether.', - 'spawn_range': 'Nether' - }, - 'weeping_vines': { - 'type': 'natural', - 'description': 'Weeping vines generate naturally in crimson forests in the Nether and grow downward from netherrack.', - 'spawn_range': 'Nether' - }, - 'twisting_vines': { - 'type': 'natural', - 'description': 'Twisting vines generate naturally in warped forests in the Nether and grow upward from the ground.', - 'spawn_range': 'Nether' - }, - 'sugar_cane': { - 'type': 'natural', - 'description': 'Sugar cane is found near water in most biomes.', - 'spawn_range': 'Surface' - }, - 'kelp': { - 'type': 'natural', - 'description': 'Kelp generates underwater in most ocean biomes.', - 'spawn_range': 'Water' - }, - 'pink_petals': { - 'type': 'natural', - 'description': 'Pink petals generate naturally in cherry grove biomes.', - 'spawn_range': 'Surface' - }, - 'moss_block': { - 'type': 'natural', - 'description': 'Moss blocks generate in lush caves and can also be obtained through trading or by using bone meal on moss carpets.', - 'spawn_range': 'Underground' - }, - 'hanging_roots': { - 'type': 'natural', - 'description': 'Hanging roots generate naturally in lush caves.', - 'spawn_range': 'Underground' - }, - 'big_dripleaf': { - 'type': 'natural', - 'description': 'Big dripleaf plants generate in lush caves and can also be obtained through trading.', - 'spawn_range': 'Underground' - }, - 'small_dripleaf': { - 'type': 'natural', - 'description': 'Small dripleaf plants generate in lush caves and can also be obtained through trading.', - 'spawn_range': 'Underground' - }, - 'bamboo': { - 'type': 'natural', - 'description': 'Bamboo generates in jungle biomes, especially bamboo jungles.', - 'spawn_range': 'Surface' - }, - 'smooth_quartz': { - 'type': 'crafted', - 'description': 'Smooth quartz is obtained by smelting blocks of quartz.', - 'spawn_range': 'N/A' - }, - 'smooth_red_sandstone': { - 'type': 'crafted', - 'description': 'Smooth red sandstone is obtained by smelting red sandstone.', - 'spawn_range': 'N/A' - }, - 'smooth_sandstone': { - 'type': 'crafted', - 'description': 'Smooth sandstone is obtained by smelting sandstone.', - 'spawn_range': 'N/A' - }, - 'smooth_stone': { - 'type': 'crafted', - 'description': 'Smooth stone is obtained by smelting regular stone.', - 'spawn_range': 'N/A' - }, - 'chorus_plant': { - 'type': 'natural', - 'description': 'Chorus plants generate naturally in the End and can be grown from chorus flowers.', - 'spawn_range': 'End' - }, - 'chorus_flower': { - 'type': 'natural', - 'description': 'Chorus flowers generate naturally in the End on top of chorus plants.', - 'spawn_range': 'End' - }, - 'spawner': { - 'type': 'natural', - 'description': 'Spawners generate in dungeons, mineshafts, and other structures.', - 'spawn_range': 'Underground' - }, - 'farmland': { - 'type': 'crafted', - 'description': 'Farmland is created by using a hoe on dirt or grass blocks.', - 'spawn_range': 'N/A' - }, - 'ice': { - 'type': 'natural', - 'description': 'Ice generates in snowy and icy biomes and can also be obtained by breaking ice blocks with a Silk Touch tool.', - 'spawn_range': 'Surface' - }, - 'cactus': { - 'type': 'natural', - 'description': 'Cacti generate naturally in desert biomes.', - 'spawn_range': 'Surface' - }, - 'pumpkin': { - 'type': 'natural', - 'description': 'Pumpkins generate naturally in most grassy biomes and can also be grown from pumpkin seeds.', - 'spawn_range': 'Surface' - }, - 'carved_pumpkin': { - 'type': 'crafted', - 'description': 'Carved pumpkins are obtained by using shears on a pumpkin.', - 'spawn_range': 'N/A' - }, - 'basalt': { - 'type': 'natural', - 'description': 'Basalt generates in the Nether in basalt deltas and can also be created by lava flowing over soul soil next to blue ice.', - 'spawn_range': 'Nether' - }, - 'smooth_basalt': { - 'type': 'natural', - 'description': 'Smooth basalt is found around amethyst geodes or can be obtained by smelting basalt.', - 'spawn_range': 'Underground' - }, - 'infested_stone': { - 'type': 'natural', - 'description': 'Infested stone blocks contain silverfish and generate in strongholds, underground.', - 'spawn_range': 'Underground' - }, - 'infested_cobblestone': { - 'type': 'natural', - 'description': 'Infested cobblestone blocks contain silverfish and generate in strongholds, underground.', - 'spawn_range': 'Underground' - }, - 'infested_stone_bricks': { - 'type': 'natural', - 'description': 'Infested stone bricks contain silverfish and generate in strongholds, underground.', - 'spawn_range': 'Underground' - }, - 'infested_mossy_stone_bricks': { - 'type': 'natural', - 'description': 'Infested mossy stone bricks contain silverfish and generate in strongholds, underground.', - 'spawn_range': 'Underground' - }, - 'infested_cracked_stone_bricks': { - 'type': 'natural', - 'description': 'Infested cracked stone bricks contain silverfish and generate in strongholds, underground.', - 'spawn_range': 'Underground' - }, - 'infested_chiseled_stone_bricks': { - 'type': 'natural', - 'description': 'Infested chiseled stone bricks contain silverfish and generate in strongholds, underground.', - 'spawn_range': 'Underground' - }, - 'infested_deepslate': { - 'type': 'natural', - 'description': 'Infested deepslate contains silverfish and generates in the deepslate layer underground.', - 'spawn_range': 'Underground' - }, - 'cracked_stone_bricks': { - 'type': 'crafted', - 'description': 'Cracked stone bricks are obtained by smelting stone bricks.', - 'spawn_range': 'N/A' - }, - 'cracked_deepslate_bricks': { - 'type': 'crafted', - 'description': 'Cracked deepslate bricks are obtained by smelting deepslate bricks.', - 'spawn_range': 'N/A' - }, - 'cracked_deepslate_tiles': { - 'type': 'crafted', - 'description': 'Cracked deepslate tiles are obtained by smelting deepslate tiles.', - 'spawn_range': 'N/A' - }, - 'reinforced_deepslate': { - 'type': 'crafted', - 'description': 'Reinforced deepslate is a strong block that cannot be obtained in survival mode.', - 'spawn_range': 'N/A' - }, - 'brown_mushroom_block': { - 'type': 'natural', - 'description': 'Brown mushroom blocks generate as part of huge mushrooms in dark forest biomes and mushroom fields.', - 'spawn_range': 'Surface' - }, - 'red_mushroom_block': { - 'type': 'natural', - 'description': 'Red mushroom blocks generate as part of huge mushrooms in dark forest biomes and mushroom fields.', - 'spawn_range': 'Surface' - }, - 'mushroom_stem': { - 'type': 'natural', - 'description': 'Mushroom stems generate as part of huge mushrooms in dark forest biomes and mushroom fields.', - 'spawn_range': 'Surface' - }, - 'vine': { - 'type': 'natural', - 'description': 'Vines generate naturally on trees and walls in jungle biomes, swamps, and lush caves.', - 'spawn_range': 'Surface' - }, - 'glow_lichen': { - 'type': 'natural', - 'description': 'Glow lichen generates naturally in caves and can spread to other blocks using bone meal.', - 'spawn_range': 'Underground' - }, - 'mycelium': { - 'type': 'natural', - 'description': 'Mycelium generates naturally in mushroom field biomes and spreads to dirt blocks.', - 'spawn_range': 'Surface' - }, - 'lily_pad': { - 'type': 'natural', - 'description': 'Lily pads generate naturally on the surface of water in swamps.', - 'spawn_range': 'Water' - }, - 'cracked_nether_bricks': { - 'type': 'crafted', - 'description': 'Cracked nether bricks are obtained by smelting nether bricks.', - 'spawn_range': 'N/A' - }, - 'sculk': { - 'type': 'natural', - 'description': 'Sculk generates naturally in the deep dark biome and spreads using a sculk catalyst.', - 'spawn_range': 'Underground' - }, - 'sculk_vein': { - 'type': 'natural', - 'description': 'Sculk veins generate naturally in the deep dark biome and spread using a sculk catalyst.', - 'spawn_range': 'Underground' - }, - 'sculk_catalyst': { - 'type': 'natural', - 'description': 'Sculk catalysts generate naturally in the deep dark biome and spread sculk blocks when mobs die nearby.', - 'spawn_range': 'Underground' - }, - 'sculk_shrieker': { - 'type': 'natural', - 'description': 'Sculk shriekers generate naturally in the deep dark biome and emit a loud shriek when activated.', - 'spawn_range': 'Underground' - }, - 'end_portal_frame': { - 'type': 'natural', - 'description': 'End portal frames generate naturally in strongholds, forming the structure of end portals.', - 'spawn_range': 'Underground' - }, - 'dragon_egg': { - 'type': 'dropped', - 'description': 'The dragon egg is dropped when the Ender Dragon is defeated for the first time.', - 'spawn_range': 'End' - }, - 'command_block': { - 'type': 'crafted', - 'description': 'Command blocks are powerful blocks used in commands and redstone, obtainable only via commands.', - 'spawn_range': 'N/A' - }, - 'chipped_anvil': { - 'type': 'crafted', - 'description': 'Chipped anvils are damaged versions of anvils and are used for repairing and enchanting.', - 'spawn_range': 'N/A' - }, - 'damaged_anvil': { - 'type': 'crafted', - 'description': 'Damaged anvils are further damaged versions of anvils and are used for repairing and enchanting.', - 'spawn_range': 'N/A' - }, - 'barrier': { - 'type': 'crafted', - 'description': 'Barriers are invisible blocks used in map-making and obtainable only via commands.', - 'spawn_range': 'N/A' - }, - 'light': { - 'type': 'crafted', - 'description': 'Light blocks are invisible blocks that emit light, obtainable only via commands.', - 'spawn_range': 'N/A' - }, - 'dirt_path': { - 'type': 'crafted', - 'description': 'Dirt paths are created by using a shovel on grass blocks and are commonly found in villages.', - 'spawn_range': 'Surface' - }, - 'sunflower': { - 'type': 'natural', - 'description': 'Sunflowers generate naturally in sunflower plains biomes.', - 'spawn_range': 'Surface' - }, - 'lilac': { - 'type': 'natural', - 'description': 'Lilacs generate naturally in forest biomes.', - 'spawn_range': 'Surface' - }, - 'rose_bush': { - 'type': 'natural', - 'description': 'Rose bushes generate naturally in forest biomes.', - 'spawn_range': 'Surface' - }, - 'peony': { - 'type': 'natural', - 'description': 'Peonies generate naturally in forest biomes.', - 'spawn_range': 'Surface' - }, - 'tall_grass': { - 'type': 'natural', - 'description': 'Tall grass generates naturally in various biomes and can be grown using bone meal.', - 'spawn_range': 'Surface' - }, - 'large_fern': { - 'type': 'natural', - 'description': 'Large ferns generate naturally in taiga biomes.', - 'spawn_range': 'Surface' - }, - 'repeating_command_block': { - 'type': 'crafted', - 'description': 'Repeating command blocks execute commands every tick and are obtainable only via commands.', - 'spawn_range': 'N/A' - }, - 'chain_command_block': { - 'type': 'crafted', - 'description': 'Chain command blocks execute commands when triggered and are obtainable only via commands.', - 'spawn_range': 'N/A' - }, - 'warped_wart_block': { - 'type': 'natural', - 'description': 'Warped wart blocks generate naturally in warped forests in the Nether.', - 'spawn_range': 'Nether' - }, - 'structure_void': { - 'type': 'crafted', - 'description': 'Structure voids are used in structure blocks to exclude certain blocks from being saved and are obtainable only via commands.', - 'spawn_range': 'N/A' - }, - 'white_shulker_box': { - 'type': 'crafted', - 'description': 'White shulker boxes are crafted from shulker shells and dye, and they function as portable storage.', - 'spawn_range': 'N/A' - }, - 'orange_shulker_box': { - 'type': 'crafted', - 'description': 'Orange shulker boxes are crafted from shulker shells and dye, and they function as portable storage.', - 'spawn_range': 'N/A' - }, - 'magenta_shulker_box': { - 'type': 'crafted', - 'description': 'Magenta shulker boxes are crafted from shulker shells and dye, and they function as portable storage.', - 'spawn_range': 'N/A' - }, - 'light_blue_shulker_box': { - 'type': 'crafted', - 'description': 'Light blue shulker boxes are crafted from shulker shells and dye, and they function as portable storage.', - 'spawn_range': 'N/A' - }, - 'yellow_shulker_box': { - 'type': 'crafted', - 'description': 'Yellow shulker boxes are crafted from shulker shells and dye, and they function as portable storage.', - 'spawn_range': 'N/A' - }, - 'lime_shulker_box': { - 'type': 'crafted', - 'description': 'Lime shulker boxes are crafted from shulker shells and dye, and they function as portable storage.', - 'spawn_range': 'N/A' - }, - 'pink_shulker_box': { - 'type': 'crafted', - 'description': 'Pink shulker boxes are crafted from shulker shells and dye, and they function as portable storage.', - 'spawn_range': 'N/A' - }, - 'gray_shulker_box': { - 'type': 'crafted', - 'description': 'Gray shulker boxes are crafted from shulker shells and dye, and they function as portable storage.', - 'spawn_range': 'N/A' - }, - 'light_gray_shulker_box': { - 'type': 'crafted', - 'description': 'Light gray shulker boxes are crafted from shulker shells and dye, and they function as portable storage.', - 'spawn_range': 'N/A' - }, - 'cyan_shulker_box': { - 'type': 'crafted', - 'description': 'Cyan shulker boxes are crafted from shulker shells and dye, and they function as portable storage.', - 'spawn_range': 'N/A' - }, - 'purple_shulker_box': { - 'type': 'crafted', - 'description': 'Purple shulker boxes are crafted from shulker shells and dye, and they function as portable storage.', - 'spawn_range': 'N/A' - }, - 'blue_shulker_box': { - 'type': 'crafted', - 'description': 'Blue shulker boxes are crafted from shulker shells and dye, and they function as portable storage.', - 'spawn_range': 'N/A' - }, - 'brown_shulker_box': { - 'type': 'crafted', - 'description': 'Brown shulker boxes are crafted from shulker shells and dye, and they function as portable storage.', - 'spawn_range': 'N/A' - }, - 'green_shulker_box': { - 'type': 'crafted', - 'description': 'Green shulker boxes are crafted from shulker shells and dye, and they function as portable storage.', - 'spawn_range': 'N/A' - }, - 'red_shulker_box': { - 'type': 'crafted', - 'description': 'Red shulker boxes are crafted from shulker shells and dye, and they function as portable storage.', - 'spawn_range': 'N/A' - }, - 'black_shulker_box': { - 'type': 'crafted', - 'description': 'Black shulker boxes are crafted from shulker shells and dye, and they function as portable storage.', - 'spawn_range': 'N/A' - }, - 'white_glazed_terracotta': { - 'type': 'crafted', - 'description': 'White glazed terracotta is obtained by smelting white terracotta and features decorative patterns.', - 'spawn_range': 'N/A' - }, - 'orange_glazed_terracotta': { - 'type': 'crafted', - 'description': 'Orange glazed terracotta is obtained by smelting orange terracotta and features decorative patterns.', - 'spawn_range': 'N/A' - }, - 'magenta_glazed_terracotta': { - 'type': 'crafted', - 'description': 'Magenta glazed terracotta is obtained by smelting magenta terracotta and features decorative patterns.', - 'spawn_range': 'N/A' - }, - 'light_blue_glazed_terracotta': { - 'type': 'crafted', - 'description': 'Light blue glazed terracotta is obtained by smelting light blue terracotta and features decorative patterns.', - 'spawn_range': 'N/A' - }, - 'yellow_glazed_terracotta': { - 'type': 'crafted', - 'description': 'Yellow glazed terracotta is obtained by smelting yellow terracotta and features decorative patterns.', - 'spawn_range': 'N/A' - }, - 'lime_glazed_terracotta': { - 'type': 'crafted', - 'description': 'Lime glazed terracotta is obtained by smelting lime terracotta and features decorative patterns.', - 'spawn_range': 'N/A' - }, - 'pink_glazed_terracotta': { - 'type': 'crafted', - 'description': 'Pink glazed terracotta is obtained by smelting pink terracotta and features decorative patterns.', - 'spawn_range': 'N/A' - }, - 'gray_glazed_terracotta': { - 'type': 'crafted', - 'description': 'Gray glazed terracotta is obtained by smelting gray terracotta and features decorative patterns.', - 'spawn_range': 'N/A' - }, - 'light_gray_glazed_terracotta': { - 'type': 'crafted', - 'description': 'Light gray glazed terracotta is obtained by smelting light gray terracotta and features decorative patterns.', - 'spawn_range': 'N/A' - }, - 'cyan_glazed_terracotta': { - 'type': 'crafted', - 'description': 'Cyan glazed terracotta is obtained by smelting cyan terracotta and features decorative patterns.', - 'spawn_range': 'N/A' - }, - 'purple_glazed_terracotta': { - 'type': 'crafted', - 'description': 'Purple glazed terracotta is obtained by smelting purple terracotta and features decorative patterns.', - 'spawn_range': 'N/A' - }, - 'blue_glazed_terracotta': { - 'type': 'crafted', - 'description': 'Blue glazed terracotta is obtained by smelting blue terracotta and features decorative patterns.', - 'spawn_range': 'N/A' - }, - 'brown_glazed_terracotta': { - 'type': 'crafted', - 'description': 'Brown glazed terracotta is obtained by smelting brown terracotta and features decorative patterns.', - 'spawn_range': 'N/A' - }, - 'green_glazed_terracotta': { - 'type': 'crafted', - 'description': 'Green glazed terracotta is obtained by smelting green terracotta and features decorative patterns.', - 'spawn_range': 'N/A' - }, - 'red_glazed_terracotta': { - 'type': 'crafted', - 'description': 'Red glazed terracotta is obtained by smelting red terracotta and features decorative patterns.', - 'spawn_range': 'N/A' - }, - 'black_glazed_terracotta': { - 'type': 'crafted', - 'description': 'Black glazed terracotta is obtained by smelting black terracotta and features decorative patterns.', - 'spawn_range': 'N/A' - }, - 'white_concrete': { - 'type': 'crafted', - 'description': 'White concrete is crafted from concrete powder and hardens when in contact with water.', - 'spawn_range': 'N/A' - }, - 'orange_concrete': { - 'type': 'crafted', - 'description': 'Orange concrete is crafted from concrete powder and hardens when in contact with water.', - 'spawn_range': 'N/A' - }, - 'magenta_concrete': { - 'type': 'crafted', - 'description': 'Magenta concrete is crafted from concrete powder and hardens when in contact with water.', - 'spawn_range': 'N/A' - }, - 'light_blue_concrete': { - 'type': 'crafted', - 'description': 'Light blue concrete is crafted from concrete powder and hardens when in contact with water.', - 'spawn_range': 'N/A' - }, - 'yellow_concrete': { - 'type': 'crafted', - 'description': 'Yellow concrete is crafted from concrete powder and hardens when in contact with water.', - 'spawn_range': 'N/A' - }, - 'lime_concrete': { - 'type': 'crafted', - 'description': 'Lime concrete is crafted from concrete powder and hardens when in contact with water.', - 'spawn_range': 'N/A' - }, - 'pink_concrete': { - 'type': 'crafted', - 'description': 'Pink concrete is crafted from concrete powder and hardens when in contact with water.', - 'spawn_range': 'N/A' - }, - 'gray_concrete': { - 'type': 'crafted', - 'description': 'Gray concrete is crafted from concrete powder and hardens when in contact with water.', - 'spawn_range': 'N/A' - }, - 'light_gray_concrete': { - 'type': 'crafted', - 'description': 'Light gray concrete is crafted from concrete powder and hardens when in contact with water.', - 'spawn_range': 'N/A' - }, - 'cyan_concrete': { - 'type': 'crafted', - 'description': 'Cyan concrete is crafted from concrete powder and hardens when in contact with water.', - 'spawn_range': 'N/A' - }, - 'purple_concrete': { - 'type': 'crafted', - 'description': 'Purple concrete is crafted from concrete powder and hardens when in contact with water.', - 'spawn_range': 'N/A' - }, - 'blue_concrete': { - 'type': 'crafted', - 'description': 'Blue concrete is crafted from concrete powder and hardens when in contact with water.', - 'spawn_range': 'N/A' - }, - 'brown_concrete': { - 'type': 'crafted', - 'description': 'Brown concrete is crafted from concrete powder and hardens when in contact with water.', - 'spawn_range': 'N/A' - }, - 'green_concrete': { - 'type': 'crafted', - 'description': 'Green concrete is crafted from concrete powder and hardens when in contact with water.', - 'spawn_range': 'N/A' - }, - 'red_concrete': { - 'type': 'crafted', - 'description': 'Red concrete is crafted from concrete powder and hardens when in contact with water.', - 'spawn_range': 'N/A' - }, - 'black_concrete': { - 'type': 'crafted', - 'description': 'Black concrete is crafted from concrete powder and hardens when in contact with water.', - 'spawn_range': 'N/A' - }, - 'white_concrete_powder': { - 'type': 'crafted', - 'description': 'White concrete powder is crafted from sand, gravel, and dye, and hardens into concrete when in contact with water.', - 'spawn_range': 'N/A' - }, - 'orange_concrete_powder': { - 'type': 'crafted', - 'description': 'Orange concrete powder is crafted from sand, gravel, and dye, and hardens into concrete when in contact with water.', - 'spawn_range': 'N/A' - }, - 'magenta_concrete_powder': { - 'type': 'crafted', - 'description': 'Magenta concrete powder is crafted from sand, gravel, and dye, and hardens into concrete when in contact with water.', - 'spawn_range': 'N/A' - }, - 'light_blue_concrete_powder': { - 'type': 'crafted', - 'description': 'Light blue concrete powder is crafted from sand, gravel, and dye, and hardens into concrete when in contact with water.', - 'spawn_range': 'N/A' - }, - 'yellow_concrete_powder': { - 'type': 'crafted', - 'description': 'Yellow concrete powder is crafted from sand, gravel, and dye, and hardens into concrete when in contact with water.', - 'spawn_range': 'N/A' - }, - 'lime_concrete_powder': { - 'type': 'crafted', - 'description': 'Lime concrete powder is crafted from sand, gravel, and dye, and hardens into concrete when in contact with water.', - 'spawn_range': 'N/A' - }, - 'pink_concrete_powder': { - 'type': 'crafted', - 'description': 'Pink concrete powder is crafted from sand, gravel, and dye, and hardens into concrete when in contact with water.', - 'spawn_range': 'N/A' - }, - 'gray_concrete_powder': { - 'type': 'crafted', - 'description': 'Gray concrete powder is crafted from sand, gravel, and dye, and hardens into concrete when in contact with water.', - 'spawn_range': 'N/A' - }, - 'light_gray_concrete_powder': { - 'type': 'crafted', - 'description': 'Light gray concrete powder is crafted from sand, gravel, and dye, and hardens into concrete when in contact with water.', - 'spawn_range': 'N/A' - }, - 'cyan_concrete_powder': { - 'type': 'crafted', - 'description': 'Cyan concrete powder is crafted from sand, gravel, and dye, and hardens into concrete when in contact with water.', - 'spawn_range': 'N/A' - }, - 'purple_concrete_powder': { - 'type': 'crafted', - 'description': 'Purple concrete powder is crafted from sand, gravel, and dye, and hardens into concrete when in contact with water.', - 'spawn_range': 'N/A' - }, - 'blue_concrete_powder': { - 'type': 'crafted', - 'description': 'Blue concrete powder is crafted from sand, gravel, and dye, and hardens into concrete when in contact with water.', - 'spawn_range': 'N/A' - }, - 'brown_concrete_powder': { - 'type': 'crafted', - 'description': 'Brown concrete powder is crafted from sand, gravel, and dye, and hardens into concrete when in contact with water.', - 'spawn_range': 'N/A' - }, - 'green_concrete_powder': { - 'type': 'crafted', - 'description': 'Green concrete powder is crafted from sand, gravel, and dye, and hardens into concrete when in contact with water.', - 'spawn_range': 'N/A' - }, - 'red_concrete_powder': { - 'type': 'crafted', - 'description': 'Red concrete powder is crafted from sand, gravel, and dye, and hardens into concrete when in contact with water.', - 'spawn_range': 'N/A' - }, - 'black_concrete_powder': { - 'type': 'crafted', - 'description': 'Black concrete powder is crafted from sand, gravel, and dye, and hardens into concrete when in contact with water.', - 'spawn_range': 'N/A' - }, - 'cyan_candle': { - 'type': 'crafted', - 'description': 'Cyan candles are crafted from string and dye and can be placed on blocks to emit light.', - 'spawn_range': 'N/A' - }, - 'pink_candle': { - 'type': 'crafted', - 'description': 'Pink candles are crafted from string and dye and can be placed on blocks to emit light.', - 'spawn_range': 'N/A' - }, - 'purple_candle': { - 'type': 'crafted', - 'description': 'Purple candles are crafted from string and dye and can be placed on blocks to emit light.', - 'spawn_range': 'N/A' - }, - 'blue_candle': { - 'type': 'crafted', - 'description': 'Blue candles are crafted from string and dye and can be placed on blocks to emit light.', - 'spawn_range': 'N/A' - }, - 'brown_candle': { - 'type': 'crafted', - 'description': 'Brown candles are crafted from string and dye and can be placed on blocks to emit light.', - 'spawn_range': 'N/A' - }, - 'green_candle': { - 'type': 'crafted', - 'description': 'Green candles are crafted from string and dye and can be placed on blocks to emit light.', - 'spawn_range': 'N/A' - }, - 'red_candle': { - 'type': 'crafted', - 'description': 'Red candles are crafted from string and dye and can be placed on blocks to emit light.', - 'spawn_range': 'N/A' - }, - 'black_candle': { - 'type': 'crafted', - 'description': 'Black candles are crafted from string and dye and can be placed on blocks to emit light.', - 'spawn_range': 'N/A' - }, - 'turtle_egg': 'can be obtained via turtle breeding on beaches, where turtles lay eggs that can be collected.', - 'sniffer_egg': 'can be found in buried treasure or ancient ruins, used to hatch sniffers.', - 'dead_tube_coral_block': 'can be obtained by mining tube coral blocks with a pickaxe without Silk Touch or when exposed to air.', - 'dead_brain_coral_block': 'can be obtained by mining brain coral blocks with a pickaxe without Silk Touch or when exposed to air.', - 'dead_bubble_coral_block': 'can be obtained by mining bubble coral blocks with a pickaxe without Silk Touch or when exposed to air.', - 'dead_fire_coral_block': 'can be obtained by mining fire coral blocks with a pickaxe without Silk Touch or when exposed to air.', - 'dead_horn_coral_block': 'can be obtained by mining horn coral blocks with a pickaxe without Silk Touch or when exposed to air.', - 'tube_coral_block': 'can be obtained by mining with a pickaxe enchanted with Silk Touch, found in warm ocean biomes.', - 'brain_coral_block': 'can be obtained by mining with a pickaxe enchanted with Silk Touch, found in warm ocean biomes.', - 'bubble_coral_block': 'can be obtained by mining with a pickaxe enchanted with Silk Touch, found in warm ocean biomes.', - 'fire_coral_block': 'can be obtained by mining with a pickaxe enchanted with Silk Touch, found in warm ocean biomes.', - 'horn_coral_block': 'can be obtained by mining with a pickaxe enchanted with Silk Touch, found in warm ocean biomes.', - 'tube_coral': 'can be obtained by mining with a pickaxe enchanted with Silk Touch, found in warm ocean biomes.', - 'brain_coral': 'can be obtained by mining with a pickaxe enchanted with Silk Touch, found in warm ocean biomes.', - 'bubble_coral': 'can be obtained by mining with a pickaxe enchanted with Silk Touch, found in warm ocean biomes.', - 'fire_coral': 'can be obtained by mining with a pickaxe enchanted with Silk Touch, found in warm ocean biomes.', - 'horn_coral': 'can be obtained by mining with a pickaxe enchanted with Silk Touch, found in warm ocean biomes.', - 'dead_brain_coral': 'can be obtained by mining brain coral without Silk Touch or when exposed to air.', - 'dead_bubble_coral': 'can be obtained by mining bubble coral without Silk Touch or when exposed to air.', - 'dead_fire_coral': 'can be obtained by mining fire coral without Silk Touch or when exposed to air.', - 'dead_horn_coral': 'can be obtained by mining horn coral without Silk Touch or when exposed to air.', - 'dead_tube_coral': 'can be obtained by mining tube coral without Silk Touch or when exposed to air.', - 'tube_coral_fan': 'can be obtained by mining with a pickaxe enchanted with Silk Touch, found in warm ocean biomes.', - 'brain_coral_fan': 'can be obtained by mining with a pickaxe enchanted with Silk Touch, found in warm ocean biomes.', - 'bubble_coral_fan': 'can be obtained by mining with a pickaxe enchanted with Silk Touch, found in warm ocean biomes.', - 'fire_coral_fan': 'can be obtained by mining with a pickaxe enchanted with Silk Touch, found in warm ocean biomes.', - 'horn_coral_fan': 'can be obtained by mining with a pickaxe enchanted with Silk Touch, found in warm ocean biomes.', - 'dead_tube_coral_fan': 'can be obtained by mining tube coral fans without Silk Touch or when exposed to air.', - 'dead_brain_coral_fan': 'can be obtained by mining brain coral fans without Silk Touch or when exposed to air.', - 'dead_bubble_coral_fan': 'can be obtained by mining bubble coral fans without Silk Touch or when exposed to air.', - 'dead_fire_coral_fan': 'can be obtained by mining fire coral fans without Silk Touch or when exposed to air.', - 'dead_horn_coral_fan': 'can be obtained by mining horn coral fans without Silk Touch or when exposed to air.', - 'sculk_sensor': 'can be obtained via Silk Touch enchantment on a pickaxe or found in ancient cities in the deep dark biome.', - 'copper_door': 'can be crafted using copper ingots.', - 'exposed_copper_door': 'can be obtained by allowing copper doors to oxidize or can be crafted directly.', - 'weathered_copper_door': 'can be obtained by allowing exposed copper doors to further oxidize or can be crafted directly.', - 'oxidized_copper_door': 'can be obtained by allowing weathered copper doors to fully oxidize or can be crafted directly.', - 'waxed_copper_door': 'can be crafted using copper ingots and honeycomb.', - 'waxed_exposed_copper_door': 'can be crafted using exposed copper doors and honeycomb.', - 'waxed_weathered_copper_door': 'can be crafted using weathered copper doors and honeycomb.', - 'waxed_oxidized_copper_door': 'can be crafted using oxidized copper doors and honeycomb.', - 'copper_trapdoor': 'can be crafted using copper ingots.', - 'exposed_copper_trapdoor': 'can be obtained by allowing copper trapdoors to oxidize or can be crafted directly.', - 'weathered_copper_trapdoor': 'can be obtained by allowing exposed copper trapdoors to further oxidize or can be crafted directly.', - 'oxidized_copper_trapdoor': 'can be obtained by allowing weathered copper trapdoors to fully oxidize or can be crafted directly.', - 'waxed_copper_trapdoor': 'can be crafted using copper ingots and honeycomb.', - 'waxed_exposed_copper_trapdoor': 'can be crafted using exposed copper trapdoors and honeycomb.', - 'waxed_weathered_copper_trapdoor': 'can be crafted using weathered copper trapdoors and honeycomb.', - 'waxed_oxidized_copper_trapdoor': 'can be crafted using oxidized copper trapdoors and honeycomb.', - 'saddle': 'can be obtained from fishing, dungeon chests, or trading with leatherworkers.', - 'elytra': 'can be found in end ships within end cities.', - 'structure_block': 'can be obtained using commands or in creative mode, used to save and load structures.', - 'jigsaw': 'can be obtained using commands or in creative mode, used to generate structures.', - 'scute': 'can be obtained when baby turtles grow into adults.', - 'apple': 'can be obtained by breaking oak and dark oak leaves or found in chests.', - 'charcoal': 'can be obtained by smelting logs or wood in a furnace.', - 'quartz': 'can be obtained by mining nether quartz ore in the Nether.', - 'amethyst_shard': 'can be obtained by mining amethyst clusters found in geodes with a pickaxe.', - 'netherite_scrap': 'can be obtained by smelting ancient debris found in the Nether.', - 'netherite_sword': 'can be crafted using a diamond sword and netherite ingot.', - 'netherite_shovel': 'can be crafted using a diamond shovel and netherite ingot.', - 'netherite_pickaxe': 'can be crafted using a diamond pickaxe and netherite ingot.', - 'netherite_axe': 'can be crafted using a diamond axe and netherite ingot.', - 'netherite_hoe': 'can be crafted using a diamond hoe and netherite ingot.', - 'string': 'can be obtained from killing spiders or breaking cobwebs.', - 'feather': 'can be obtained from killing chickens.', - 'gunpowder': 'can be obtained from killing creepers, ghasts, and witches.', - 'wheat_seeds': 'can be obtained by breaking tall grass or harvesting wheat crops.', - 'chainmail_helmet': 'can be obtained from chest loot, trading with villagers, or killing mobs wearing it.', - 'chainmail_chestplate': 'can be obtained from chest loot, trading with villagers, or killing mobs wearing it.', - 'chainmail_leggings': 'can be obtained from chest loot, trading with villagers, or killing mobs wearing it.', - 'chainmail_boots': 'can be obtained from chest loot, trading with villagers, or killing mobs wearing it.', - 'netherite_helmet': 'can be crafted using a diamond helmet and netherite ingot.', - 'netherite_chestplate': 'can be crafted using a diamond chestplate and netherite ingot.', - 'netherite_leggings': 'can be crafted using diamond leggings and netherite ingot.', - 'netherite_boots': 'can be crafted using diamond boots and netherite ingot.', - 'flint': 'can be obtained by breaking gravel blocks.', - 'porkchop': 'can be obtained by killing pigs.', - 'cooked_porkchop': 'can be obtained by cooking porkchop in a furnace, smoker, or campfire.', - 'enchanted_golden_apple': 'can be found in dungeon, bastion remnant, and mineshaft chests.', - 'water_bucket': 'can be obtained by using a bucket on a water source block.', - 'lava_bucket': 'can be obtained by using a bucket on a lava source block.', - 'powder_snow_bucket': 'can be obtained by using a bucket on powder snow.', - 'snowball': 'can be obtained by breaking snow blocks or using a shovel on snow.', - 'milk_bucket': 'can be obtained by using a bucket on a cow or mooshroom.', - 'pufferfish_bucket': 'can be obtained by using a bucket on a pufferfish in water.', - 'salmon_bucket': 'can be obtained by using a bucket on a salmon in water.', - 'cod_bucket': 'can be obtained by using a bucket on a cod in water.', - 'tropical_fish_bucket': 'can be obtained by using a bucket on a tropical fish in water.', - 'axolotl_bucket': 'can be obtained by using a bucket on an axolotl in water.', - 'tadpole_bucket': 'can be obtained by using a bucket on a tadpole in water.', - 'brick': 'can be obtained by smelting clay in a furnace.', - 'clay_ball': 'can be obtained by breaking clay blocks or from chest loot.', - 'egg': 'can be obtained from chickens periodically.', - 'bundle': 'can be crafted using rabbit hide and string.', - 'glowstone_dust': 'can be obtained by breaking glowstone blocks or killing witches.', - 'cod': 'can be obtained by fishing or killing cod in water.', - 'salmon': 'can be obtained by fishing or killing salmon in water.', - 'tropical_fish': 'can be obtained by fishing or killing tropical fish in water.', - 'pufferfish': 'can be obtained by fishing or killing pufferfish in water.', - 'cooked_cod': 'can be obtained by cooking cod in a furnace, smoker, or campfire.', - 'cooked_salmon': 'can be obtained by cooking salmon in a furnace, smoker, or campfire.', - 'ink_sac': 'can be obtained by killing squid or as loot from wandering traders.', - 'glow_ink_sac': 'can be obtained by killing glow squid.', - 'cocoa_beans': 'can be obtained from cocoa pods found on jungle trees.', - 'green_dye': 'can be obtained by smelting cactus in a furnace.', - 'bone': 'can be obtained by killing skeletons or from chest loot.', - 'crafter': 'can be obtained via crafting using specific materials (details vary by mod or version).', - 'filled_map': 'can be obtained by using an empty map item.', - 'melon_slice': 'can be obtained by breaking melon blocks.', - 'beef': 'can be obtained by killing cows.', - 'cooked_beef': 'can be obtained by cooking beef in a furnace, smoker, or campfire.', - 'chicken': 'can be obtained by killing chickens.', - 'cooked_chicken': 'can be obtained by cooking chicken in a furnace, smoker, or campfire.', - 'rotten_flesh': 'can be obtained by killing zombies or drowned.', - 'ender_pearl': 'can be obtained by killing endermen.', - 'blaze_rod': 'can be obtained by killing blazes in the Nether.', - 'ghast_tear': 'can be obtained by killing ghasts in the Nether.', - 'nether_wart': 'can be found in Nether fortresses and bastion remnants.', - 'potion': 'can be brewed using a brewing stand with various ingredients.', - 'spider_eye': 'can be obtained by killing spiders or witches.', - 'experience_bottle': 'can be obtained from trading with villagers or found in chest loot.', - 'written_book': 'can be crafted using a book and quill after writing in it.', - 'carrot': 'can be obtained by harvesting carrot crops or found in village farms.', - 'potato': 'can be obtained by harvesting potato crops or found in village farms.', - 'baked_potato': 'can be obtained by cooking potatoes in a furnace, smoker, or campfire.', - 'poisonous_potato': 'can be obtained by harvesting potato crops (rare chance).', - 'skeleton_skull': 'can be obtained by killing skeletons with a charged creeper explosion.', - 'wither_skeleton_skull': 'can be obtained by killing wither skeletons (rare drop).', - 'player_head': 'can be obtained via commands or by killing players in certain conditions (e.g., with a charged creeper).', - 'zombie_head': 'can be obtained by killing zombies with a charged creeper explosion.', - 'creeper_head': 'can be obtained by killing creepers with a charged creeper explosion.', - 'dragon_head': 'can be found at the end of end ships in end cities.', - 'piglin_head': 'can be obtained by killing piglins with a charged creeper explosion.', - 'nether_star': 'can be obtained by defeating the Wither boss.', - 'firework_star': 'can be crafted using gunpowder and dye.', - 'nether_brick': 'can be obtained by smelting netherrack in a furnace or found in Nether fortresses.', - 'prismarine_shard': 'can be obtained by killing guardians and elder guardians.', - 'prismarine_crystals': 'can be obtained by killing guardians and elder guardians or breaking sea lanterns.', - 'rabbit': 'can be obtained by killing rabbits.', - 'cooked_rabbit': 'can be obtained by cooking rabbit in a furnace, smoker, or campfire.', - 'rabbit_foot': 'can be obtained by killing rabbits (rare drop).', - 'rabbit_hide': 'can be obtained by killing rabbits.', - 'iron_horse_armor': 'can be found in dungeon, temple, and stronghold chests.', - 'golden_horse_armor': 'can be found in dungeon, temple, and stronghold chests.', - 'diamond_horse_armor': 'can be found in dungeon, temple, and stronghold chests.', - 'name_tag': 'can be obtained by fishing, dungeon chests, or trading with librarians.', - 'command_block_minecart': 'can be obtained using commands in creative mode.', - 'mutton': 'can be obtained by killing sheep.', - 'cooked_mutton': 'can be obtained by cooking mutton in a furnace, smoker, or campfire.', - 'chorus_fruit': 'can be obtained by breaking chorus plants found in the End.', - 'popped_chorus_fruit': 'can be obtained by smelting chorus fruit in a furnace.', - 'torchflower_seeds': 'can be obtained from torchflower plants, used for breeding and decoration.', - 'pitcher_pod': 'can be obtained from pitcher plants, used for breeding and decoration.', - 'beetroot': 'can be obtained by harvesting beetroot crops or found in village farms.', - 'beetroot_seeds': 'can be obtained by harvesting beetroot crops or from chests.', - 'dragon_breath': 'can be obtained by using an empty bottle on the ender dragon\'s breath attack.', - 'splash_potion': 'can be brewed using a brewing stand and gunpowder with various potions.', - 'tipped_arrow': 'can be crafted using arrows and lingering potions.', - 'lingering_potion': 'can be brewed using a brewing stand and dragon\'s breath with various potions.', - 'totem_of_undying': 'can be obtained by killing evokers in woodland mansions and during raids.', - 'shulker_shell': 'can be obtained by killing shulkers in end cities.', - 'knowledge_book': 'can be obtained using commands or given in custom advancements.', - 'debug_stick': 'can be obtained using commands in creative mode.', - 'disc_fragment_5': 'can be found in ancient city chests, used to craft music disc 5.', - 'trident': 'can be obtained by killing drowned (rare drop).', - 'phantom_membrane': 'can be obtained by killing phantoms.', - 'nautilus_shell': 'can be obtained from fishing, drowned, or wandering traders.', - 'heart_of_the_sea': 'can be found in buried treasure chests.', - 'suspicious_stew': 'can be crafted using mushrooms and various flowers or found in chests.', - 'globe_banner_pattern': 'can be obtained from trading with cartographer villagers.', - 'piglin_banner_pattern': 'can be obtained from bastion remnant chests.', - 'goat_horn': 'can be obtained when a goat rams a solid block.', - 'bell': 'can be obtained from village structures or crafted using iron ingots and wood.', - 'sweet_berries': 'can be obtained from sweet berry bushes found in taiga biomes.', - 'glow_berries': 'can be found in lush cave biomes or by trading with wandering traders.', - 'shroomlight': 'can be obtained by breaking shroomlights found in Nether forests.', - 'honeycomb': 'can be obtained by using shears on beehives or bee nests.', - 'bee_nest': 'can be found in forest biomes with birch or oak trees, especially in flower forests.', - 'crying_obsidian': 'can be found in ruined portals, bastion remnants, or bartered from piglins.', - 'blackstone': 'can be found in basalt deltas, bastion remnants, or crafted from polished blackstone.', - 'gilded_blackstone': 'can be found in bastion remnants.', - 'cracked_polished_blackstone_bricks': 'can be obtained by smelting polished blackstone bricks.', - 'small_amethyst_bud': 'can be found growing in amethyst geodes.', - 'medium_amethyst_bud': 'can be found growing in amethyst geodes.', - 'large_amethyst_bud': 'can be found growing in amethyst geodes.', - 'amethyst_cluster': 'can be found growing in amethyst geodes.', - 'pointed_dripstone': 'can be found in dripstone caves or created by placing a dripstone block under a water source block.', - 'ochre_froglight': 'can be obtained by leading a frog to eat a magma cube, dropping this item.', - 'verdant_froglight': 'can be obtained by leading a frog to eat a magma cube, dropping this item.', - 'pearlescent_froglight': 'can be obtained by leading a frog to eat a magma cube, dropping this item.', - 'frogspawn': 'Frogspawn is an item that can be found in the game Minecraft and is primarily used to breed frogs.', - 'echo_shard': 'Echo Shard is an item in Minecraft Dungeons, primarily used as a currency for trading with Piglin vendors.', - 'copper_grate': 'Copper Grate is a block in Minecraft that can be crafted from copper ingots, primarily used as a decorative block.', - 'exposed_copper_grate': 'Exposed Copper Grate is a variant of Copper Grate in Minecraft that has weathered to the exposed state over time.', - 'weathered_copper_grate': 'Weathered Copper Grate is a variant of Copper Grate in Minecraft that has weathered to the weathered state over time.', - 'oxidized_copper_grate': 'Oxidized Copper Grate is a variant of Copper Grate in Minecraft that has weathered to the oxidized state over time.', - 'waxed_copper_grate': 'Waxed Copper Grate is a variant of Copper Grate in Minecraft that has been waxed to prevent further weathering.', - 'waxed_exposed_copper_grate': 'Waxed Exposed Copper Grate is a variant of Exposed Copper Grate in Minecraft that has been waxed to prevent further weathering.', - 'waxed_weathered_copper_grate': 'Waxed Weathered Copper Grate is a variant of Weathered Copper Grate in Minecraft that has been waxed to prevent further weathering.', - 'waxed_oxidized_copper_grate': 'Waxed Oxidized Copper Grate is a variant of Oxidized Copper Grate in Minecraft that has been waxed to prevent further weathering.', - 'copper_bulb': 'Copper Bulb is a block in Minecraft that can be crafted from copper ingots, primarily used as a decorative block.', - 'exposed_copper_bulb': 'Exposed Copper Bulb is a variant of Copper Bulb in Minecraft that has weathered to the exposed state over time.', - 'weathered_copper_bulb': 'Weathered Copper Bulb is a variant of Copper Bulb in Minecraft that has weathered to the weathered state over time.', - 'oxidized_copper_bulb': 'Oxidized Copper Bulb is a variant of Copper Bulb in Minecraft that has weathered to the oxidized state over time.', - 'waxed_copper_bulb': 'Waxed Copper Bulb is a variant of Copper Bulb in Minecraft that has been waxed to prevent further weathering.', - 'waxed_exposed_copper_bulb': 'Waxed Exposed Copper Bulb is a variant of Exposed Copper Bulb in Minecraft that has been waxed to prevent further weathering.', - 'waxed_weathered_copper_bulb': 'Waxed Weathered Copper Bulb is a variant of Weathered Copper Bulb in Minecraft that has been waxed to prevent further weathering.', - 'waxed_oxidized_copper_bulb': 'Waxed Oxidized Copper Bulb is a variant of Oxidized Copper Bulb in Minecraft that has been waxed to prevent further weathering.', - 'trial_spawner': 'Trial Spawner is an item in Minecraft Dungeons, used in the Ancient Hunt game mode to summon trials for unique rewards.', - 'trial_key': 'Trial Key is an item in Minecraft Dungeons, obtained from defeating Ancient mobs in the Ancient Hunt game mode, used to unlock trials.' - } -} - -const lowerCaseFirstLetter = (string) => string.charAt(0).toLowerCase() + string.slice(1) -for (const [name, data] of Object.entries(moreGeneratedBlocks.natural_blocks)) { - let description = '' as string | ((name: string) => string) - if (typeof data === 'object') { - const obtainedFrom = 'obtained_from' in data ? data.obtained_from : 'description' in data ? data.description : '' - description = obtainedFrom + ('rarity' in data ? ` Rarity: ${data.rarity}` : '') + ('spawn_range' in data ? ` Spawn range: ${data.spawn_range}` : '') - } else { - description = (name) => `${lowerCaseFirstLetter(name)}: ${data}` - } - descriptionGenerators.set([name], description) -} - -export const getItemDescription = (item: import('prismarine-item').Item) => { - const { name } = item - let result: string | ((name: string) => string) = '' - for (const [names, description] of descriptionGenerators) { - if (Array.isArray(names) && names.includes(name)) { - result = description - } - if (typeof names === 'string' && names === name) { - result = description - } - if (names instanceof RegExp && names.test(name)) { - result = description - } - } - return typeof result === 'function' ? result(item.displayName) : result -} diff --git a/src/loadSave.ts b/src/loadSave.ts deleted file mode 100644 index f1676cff..00000000 --- a/src/loadSave.ts +++ /dev/null @@ -1,181 +0,0 @@ -import fs from 'fs' -import path from 'path' -import * as nbt from 'prismarine-nbt' -import { proxy } from 'valtio' -import { gzip } from 'node-gzip' -import { versionToNumber } from 'renderer/viewer/common/utils' -import { options } from './optionsStorage' -import { nameToMcOfflineUUID, disconnect } from './flyingSquidUtils' -import { existsViaStats, forceCachedDataPaths, forceRedirectPaths, mkdirRecursive } from './browserfs' -import { isMajorVersionGreater } from './utils' - -import { activeModalStacks, insertActiveModalStack, miscUiState } from './globalState' -import supportedVersions from './supportedVersions.mjs' -import { ConnectOptions } from './connect' -import { appQueryParams } from './appParams' - -// todo include name of opened handle (zip)! -// additional fs metadata -export const fsState = proxy({ - isReadonly: false, - syncFs: false, - inMemorySave: false, - saveLoaded: false, - openReadOperations: 0, - openWriteOperations: 0, - remoteBackend: false, - inMemorySavePath: '' -}) - -const PROPOSE_BACKUP = true - -export function longArrayToNumber (longArray: number[]) { - const [high, low] = longArray - return (high << 32) + low -} - -export const readLevelDat = async (path) => { - let levelDatContent - try { - // todo-low cache reading - levelDatContent = await fs.promises.readFile(`${path}/level.dat`) - } catch (err) { - if (err.code === 'ENOENT') { - return undefined - } - throw err - } - const { parsed } = await nbt.parse(Buffer.from(levelDatContent)) - const levelDat: import('./mcTypes').LevelDat = nbt.simplify(parsed).Data - return { levelDat, dataRaw: parsed.value.Data!.value as Record } -} - -export const loadSave = async (root = '/world', connectOptions?: Partial) => { - // todo test - if (miscUiState.gameLoaded) { - await disconnect() - await new Promise(resolve => { - setTimeout(resolve) - }) - } - - const disablePrompts = options.disableLoadPrompts - - // todo do it in singleplayer as well - // eslint-disable-next-line guard-for-in - for (const key in forceCachedDataPaths) { - - delete forceCachedDataPaths[key] - } - // eslint-disable-next-line guard-for-in - for (const key in forceRedirectPaths) { - - delete forceRedirectPaths[key] - } - // todo check jsHeapSizeLimit - - const warnings: string[] = [] - const { levelDat, dataRaw } = (await readLevelDat(root))! - if (levelDat === undefined) { - if (fsState.isReadonly) { - throw new Error('level.dat not found, ensure you are loading world folder') - } else { - warnings.push('level.dat not found, world in current folder will be created') - } - } - - let version: string | undefined | null - if (levelDat) { - version = appQueryParams.mapVersion ?? levelDat.Version?.Name - if (!version) { - // const newVersion = disablePrompts ? '1.8.8' : prompt(`In 1.8 and before world save doesn't contain version info, please enter version you want to use to load the world.\nSupported versions ${supportedVersions.join(', ')}`, '1.8.8') - // if (!newVersion) return - // todo detect world load issues - const newVersion = '1.8.8' - version = newVersion - } - const lastSupportedVersion = supportedVersions.at(-1)! - const firstSupportedVersion = supportedVersions[0] - const lowerBound = isMajorVersionGreater(firstSupportedVersion, version) - const upperBound = versionToNumber(version) > versionToNumber(lastSupportedVersion) - if (lowerBound || upperBound) { - version = prompt(`Version ${version} is not supported, supported versions are ${supportedVersions.join(', ')}, what try to use instead?`, lowerBound ? firstSupportedVersion : lastSupportedVersion) - if (!version) return - } - - const playerUuid = nameToMcOfflineUUID(options.localUsername) - const playerDatPath = `${root}/playerdata/${playerUuid}.dat` - const playerDataOverride = dataRaw.Player - if (playerDataOverride) { - const playerDat = await gzip(nbt.writeUncompressed({ name: '', ...playerDataOverride })) - if (fsState.isReadonly) { - forceCachedDataPaths[playerDatPath] = playerDat - } else { - await mkdirRecursive(path.dirname(playerDatPath)) - await fs.promises.writeFile(playerDatPath, playerDat) - } - } - } - - if (warnings.length && !disablePrompts) { - const doContinue = confirm(`Continue with following warnings?\n${warnings.join('\n')}`) - if (!doContinue) return - } - - if (PROPOSE_BACKUP) { - // const doBackup = options.alwaysBackupWorldBeforeLoading ?? confirm('Do you want to backup your world files before loading it?') - // // const doBackup = true - // if (doBackup) { - // // todo do it in flying squid instead - // await fs.promises.copyFile('/world/level.dat', `/world/level.dat_old`) - // try { - // await fs.promises.mkdir('/backups/region.old', { recursive: true }) - // } catch (err) { } - // const files = await fs.promises.readdir('/world/region') - // for (const file of files) { - // await fs.promises.copyFile(`/world/region/${file}`, `/world/region.old/${file}`) - // } - // } - } - - if (!fsState.isReadonly && !fsState.inMemorySave && !disablePrompts) { - // todo allow also to ctrl+s - alert('Note: the world is saved on interval, /save or disconnect! Ensure you have backup and be careful of new chunks writes!') - } - - // improve compatibility with community saves - const rootRemapFiles = ['Warp files'] - for (const rootRemapFile of rootRemapFiles) { - // eslint-disable-next-line no-await-in-loop - if (await existsViaStats(path.join(root, '..', rootRemapFile))) { - forceRedirectPaths[path.join(root, rootRemapFile)] = path.join(root, '..', rootRemapFile) - } - } - - // todo reimplement - if (activeModalStacks['main-menu']) { - insertActiveModalStack('main-menu') - } - // todo use general logic - // if (activeModalStack.at(-1)?.reactType === 'app-status' && !appStatusState.isError) { - // alert('Wait for operations to finish before loading a new world') - // return - // } - // for (const _i of activeModalStack) { - // hideModal(undefined, undefined, { force: true }) - // } - - // todo should not be set here - fsState.saveLoaded = true - fsState.inMemorySavePath = root - window.dispatchEvent(new CustomEvent('singleplayer', { - // todo check gamemode level.dat data etc - detail: { - version, - ...root === '/world' ? {} : { - 'worldFolder': root - }, - connectOptions - }, - })) -} diff --git a/src/localServerMultiplayer.ts b/src/localServerMultiplayer.ts deleted file mode 100644 index 7eaa2427..00000000 --- a/src/localServerMultiplayer.ts +++ /dev/null @@ -1,230 +0,0 @@ -import { Duplex } from 'stream' -import { Peer, DataConnection } from 'peerjs' -import Client from 'minecraft-protocol/src/client' -import { resolveTimeout } from './utils' -import { setLoadingScreenStatus } from './appStatus' -import { miscUiState } from './globalState' - -class CustomDuplex extends Duplex { - constructor (options, public writeAction) { - super(options) - } - - _read () { } - - _write (chunk, encoding, callback) { - this.writeAction(chunk) - callback() - } -} - -let peerInstance: Peer | undefined - -let overridePeerJsServer = null as string | null - -export const getJoinLink = () => { - if (!peerInstance) return - const url = new URL(window.location.href) - for (const key of url.searchParams.keys()) { - url.searchParams.delete(key) - } - url.searchParams.set('connectPeer', peerInstance.id) - url.searchParams.set('peerVersion', localServer!.options.version) - const host = (overridePeerJsServer ?? miscUiState.appConfig?.peerJsServer) ?? undefined - if (host) { - // TODO! use miscUiState.appConfig.peerJsServer - url.searchParams.set('server', host) - } - return url.toString() -} - -const copyJoinLink = async () => { - miscUiState.wanOpened = true - const joinLink = getJoinLink()! - if (navigator.clipboard) { - await navigator.clipboard.writeText(joinLink) - } else { - window.prompt('Copy to clipboard: Ctrl+C, Enter', joinLink) - } -} - -export const openToWanAndCopyJoinLink = async (writeText: (text) => void, doCopy = true) => { - if (!localServer) return - if (peerInstance) { - if (doCopy) await copyJoinLink() - return 'Already opened to wan. Join link copied' - } - miscUiState.wanOpening = true - const host = (overridePeerJsServer ?? miscUiState.appConfig?.peerJsServer) || undefined - const params = host ? parseUrl(host) : undefined - const peer = new Peer({ - debug: 3, - secure: true, - ...params - }) - peerInstance = peer - peer.on('connection', (connection) => { - console.log('connection') - const serverDuplex = new CustomDuplex({}, async (data) => connection.send(data)) - const client = new Client(true, localServer.options.version, undefined) - client.setSocket(serverDuplex) - localServer._server.emit('connection', client) - - connection.on('data', (data: any) => { - serverDuplex.push(Buffer.from(data)) - }) - // our side disconnect - const endConnection = () => { - console.log('connection.close') - serverDuplex.end() - connection.close() - } - serverDuplex.on('end', endConnection) - serverDuplex.on('force-close', endConnection) - client.on('end', endConnection) - - const disconnected = () => { - serverDuplex.end() - client.end() - } - connection.on('iceStateChanged', (state) => { - console.log('iceStateChanged', state) - if (state === 'disconnected') { - disconnected() - } - }) - connection.on('close', disconnected) - connection.on('error', disconnected) - }) - const fallbackServer = miscUiState.appConfig?.peerJsServerFallback - const hasFallback = fallbackServer && peer.options.host !== fallbackServer - let hadErrorReported = false - peer.on('error', (error) => { - console.error('peerJS error', error) - if (error.type === 'server-error' && hasFallback) { - return - } - hadErrorReported = true - writeText(error.message || JSON.stringify(error)) - }) - let timeout - const destroy = () => { - clearTimeout(timeout) - timeout = undefined - peer.destroy() - peerInstance = undefined - } - - const result = await new Promise(resolve => { - peer.on('open', async () => { - await copyJoinLink() - resolve('Copied join link to clipboard') - }) - timeout = setTimeout(async () => { - if (!hadErrorReported && timeout !== undefined) { - if (hasFallback && overridePeerJsServer === null) { - destroy() - overridePeerJsServer = fallbackServer - console.log('Trying fallback server due to timeout', fallbackServer) - resolve((await openToWanAndCopyJoinLink(writeText, doCopy))!) - } else { - writeText('timeout') - resolve('Failed to open to wan (timeout)') - } - } - }, 6000) - - // fallback - peer.on('error', async (error) => { - if (!peer.open) { - if (hasFallback) { - destroy() - - overridePeerJsServer = fallbackServer - console.log('Trying fallback server', fallbackServer) - resolve((await openToWanAndCopyJoinLink(writeText, doCopy))!) - } - } - }) - }) - if (peerInstance && !peerInstance.open) { - destroy() - } - miscUiState.wanOpening = false - return result -} - -const parseUrl = (url: string) => { - // peerJS does this internally for some reason: const url = new URL(`${protocol}://${host}:${port}${path}${key}/${method}`) - if (!url.startsWith('http')) url = `${location.protocol}//${url}` - const urlObj = new URL(url) - const key = urlObj.searchParams.get('key') - return { - host: urlObj.hostname, - path: urlObj.pathname, - protocol: urlObj.protocol.slice(0, -1), - ...urlObj.port ? { port: +urlObj.port } : {}, - ...key ? { key } : {}, - } -} - -export const closeWan = () => { - peerInstance?.destroy() - peerInstance = undefined - miscUiState.wanOpened = false - return 'Closed WAN' -} - -export type ConnectPeerOptions = { - server?: string -} - -export const connectToPeer = async (peerId: string, options: ConnectPeerOptions = {}) => { - setLoadingScreenStatus('Connecting to peer server') - // todo destroy connection on error - // TODO! use miscUiState.appConfig.peerJsServer - const host = options.server - const params = host ? parseUrl(host) : undefined - const peer = new Peer({ - debug: 3, - ...params - }) - await resolveTimeout(new Promise(resolve => { - peer.once('open', resolve) - })) - setLoadingScreenStatus('Connecting to the peer') - const connection = peer.connect(peerId, { - serialization: 'raw', - }) - await resolveTimeout(new Promise((resolve, reject) => { - connection.once('error', (error) => { - console.log(error.type, error.name) - console.log(error) - reject(error.message) - }) - connection.once('open', resolve) - })) - - const clientDuplex = new CustomDuplex({}, (data) => { - // todo debug until play state - // console.debug('sending', data.toString()) - void connection.send(data) - }) - connection.on('data', (data: any) => { - console.debug('received', Buffer.from(data).toString()) - clientDuplex.push(Buffer.from(data)) - }) - connection.on('close', () => { - console.log('connection closed') - clientDuplex.end() - // bot._client.end() - // bot.end() - bot.emit('end', 'Disconnected.') - }) - connection.on('error', (error) => { - console.error(error) - clientDuplex.end() - }) - - return clientDuplex -} diff --git a/src/markdownToFormattedText.test.ts b/src/markdownToFormattedText.test.ts deleted file mode 100644 index 5c1d5f35..00000000 --- a/src/markdownToFormattedText.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { describe, expect, it } from 'vitest' -import markdownToFormattedText from './markdownToFormattedText' - -describe('markdownToFormattedText', () => { - it('should convert markdown to formatted text', () => { - const markdown = '**bold** *italic* [link](https://example.com) k `code`' - const text = markdownToFormattedText(markdown) - const command = '/data merge block ~ ~ ~ {Text1:\'' + JSON.stringify(text[0]) + '\',Text2: \'' + JSON.stringify(text[1]) + '\',Text3:\'' + JSON.stringify(text[2]) + '\',Text4:\'' + JSON.stringify(text[3]) + '\'}' // mojangson - expect(text).toMatchInlineSnapshot(` - [ - [ - [ - { - "bold": true, - "text": "bold", - }, - { - "text": " ", - }, - { - "italic": true, - "text": "italic", - }, - { - "text": " ", - }, - { - "text": " k ", - }, - "code", - ], - ], - "", - "", - "", - ] - `) - }) -}) diff --git a/src/markdownToFormattedText.ts b/src/markdownToFormattedText.ts deleted file mode 100644 index 5fff20f8..00000000 --- a/src/markdownToFormattedText.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { remark } from 'remark' - -export default (markdown: string) => { - const arr = markdown.split('\n\n') - const lines = ['', '', '', ''] as any[] - for (const [i, ast] of arr.map(md => remark().parse(md)).entries()) { - lines[i] = transformToMinecraftJSON(ast as Element) - } - return lines -} - -function transformToMinecraftJSON (element: Element): any { - switch (element.type) { - case 'root': { - if (!element.children) return - return element.children.map(child => transformToMinecraftJSON(child)).filter(Boolean) - } - case 'paragraph': { - if (!element.children) return - const transformedChildren = element.children.map(child => transformToMinecraftJSON(child)).filter(Boolean) - return transformedChildren.flat() - } - case 'strong': { - if (!element.children) return - return [{ bold: true, text: element.children[0].value }] - } - case 'text': { - return { text: element.value } - } - case 'emphasis': { - if (!element.children) return - return [{ italic: true, text: element.children[0].value }] - } - default: - // todo leave untouched eg links - return element.value - } -} - -interface Position { - start: { - line: number; - column: number; - offset: number; - }; - end: { - line: number; - column: number; - offset: number; - }; -} - -interface Element { - type: string; - children?: Element[]; - value?: string; - position: Position; -} diff --git a/src/mcDataTypes.ts b/src/mcDataTypes.ts deleted file mode 100644 index 3375cf28..00000000 --- a/src/mcDataTypes.ts +++ /dev/null @@ -1,4318 +0,0 @@ - -export type BlockNames = 'air' | 'stone' | 'granite' | 'polished_granite' | 'diorite' | 'polished_diorite' | 'andesite' | 'polished_andesite' | 'grass_block' | 'dirt' | 'coarse_dirt' | 'podzol' | 'cobblestone' | 'oak_planks' | 'spruce_planks' | 'birch_planks' | 'jungle_planks' | 'acacia_planks' | 'cherry_planks' | 'dark_oak_planks' | 'mangrove_planks' | 'bamboo_planks' | 'bamboo_mosaic' | 'oak_sapling' | 'spruce_sapling' | 'birch_sapling' | 'jungle_sapling' | 'acacia_sapling' | 'cherry_sapling' | 'dark_oak_sapling' | 'mangrove_propagule' | 'bedrock' | 'water' | 'lava' | 'sand' | 'suspicious_sand' | 'red_sand' | 'gravel' | 'suspicious_gravel' | 'gold_ore' | 'deepslate_gold_ore' | 'iron_ore' | 'deepslate_iron_ore' | 'coal_ore' | 'deepslate_coal_ore' | 'nether_gold_ore' | 'oak_log' | 'spruce_log' | 'birch_log' | 'jungle_log' | 'acacia_log' | 'cherry_log' | 'dark_oak_log' | 'mangrove_log' | 'mangrove_roots' | 'muddy_mangrove_roots' | 'bamboo_block' | 'stripped_spruce_log' | 'stripped_birch_log' | 'stripped_jungle_log' | 'stripped_acacia_log' | 'stripped_cherry_log' | 'stripped_dark_oak_log' | 'stripped_oak_log' | 'stripped_mangrove_log' | 'stripped_bamboo_block' | 'oak_wood' | 'spruce_wood' | 'birch_wood' | 'jungle_wood' | 'acacia_wood' | 'cherry_wood' | 'dark_oak_wood' | 'mangrove_wood' | 'stripped_oak_wood' | 'stripped_spruce_wood' | 'stripped_birch_wood' | 'stripped_jungle_wood' | 'stripped_acacia_wood' | 'stripped_cherry_wood' | 'stripped_dark_oak_wood' | 'stripped_mangrove_wood' | 'oak_leaves' | 'spruce_leaves' | 'birch_leaves' | 'jungle_leaves' | 'acacia_leaves' | 'cherry_leaves' | 'dark_oak_leaves' | 'mangrove_leaves' | 'azalea_leaves' | 'flowering_azalea_leaves' | 'sponge' | 'wet_sponge' | 'glass' | 'lapis_ore' | 'deepslate_lapis_ore' | 'lapis_block' | 'dispenser' | 'sandstone' | 'chiseled_sandstone' | 'cut_sandstone' | 'note_block' | 'white_bed' | 'orange_bed' | 'magenta_bed' | 'light_blue_bed' | 'yellow_bed' | 'lime_bed' | 'pink_bed' | 'gray_bed' | 'light_gray_bed' | 'cyan_bed' | 'purple_bed' | 'blue_bed' | 'brown_bed' | 'green_bed' | 'red_bed' | 'black_bed' | 'powered_rail' | 'detector_rail' | 'sticky_piston' | 'cobweb' | 'grass' | 'fern' | 'dead_bush' | 'seagrass' | 'tall_seagrass' | 'piston' | 'piston_head' | 'white_wool' | 'orange_wool' | 'magenta_wool' | 'light_blue_wool' | 'yellow_wool' | 'lime_wool' | 'pink_wool' | 'gray_wool' | 'light_gray_wool' | 'cyan_wool' | 'purple_wool' | 'blue_wool' | 'brown_wool' | 'green_wool' | 'red_wool' | 'black_wool' | 'moving_piston' | 'dandelion' | 'torchflower' | 'poppy' | 'blue_orchid' | 'allium' | 'azure_bluet' | 'red_tulip' | 'orange_tulip' | 'white_tulip' | 'pink_tulip' | 'oxeye_daisy' | 'cornflower' | 'wither_rose' | 'lily_of_the_valley' | 'brown_mushroom' | 'red_mushroom' | 'gold_block' | 'iron_block' | 'bricks' | 'tnt' | 'bookshelf' | 'chiseled_bookshelf' | 'mossy_cobblestone' | 'obsidian' | 'torch' | 'wall_torch' | 'fire' | 'soul_fire' | 'spawner' | 'oak_stairs' | 'chest' | 'redstone_wire' | 'diamond_ore' | 'deepslate_diamond_ore' | 'diamond_block' | 'crafting_table' | 'wheat' | 'farmland' | 'furnace' | 'oak_sign' | 'spruce_sign' | 'birch_sign' | 'acacia_sign' | 'cherry_sign' | 'jungle_sign' | 'dark_oak_sign' | 'mangrove_sign' | 'bamboo_sign' | 'oak_door' | 'ladder' | 'rail' | 'cobblestone_stairs' | 'oak_wall_sign' | 'spruce_wall_sign' | 'birch_wall_sign' | 'acacia_wall_sign' | 'cherry_wall_sign' | 'jungle_wall_sign' | 'dark_oak_wall_sign' | 'mangrove_wall_sign' | 'bamboo_wall_sign' | 'oak_hanging_sign' | 'spruce_hanging_sign' | 'birch_hanging_sign' | 'acacia_hanging_sign' | 'cherry_hanging_sign' | 'jungle_hanging_sign' | 'dark_oak_hanging_sign' | 'crimson_hanging_sign' | 'warped_hanging_sign' | 'mangrove_hanging_sign' | 'bamboo_hanging_sign' | 'oak_wall_hanging_sign' | 'spruce_wall_hanging_sign' | 'birch_wall_hanging_sign' | 'acacia_wall_hanging_sign' | 'cherry_wall_hanging_sign' | 'jungle_wall_hanging_sign' | 'dark_oak_wall_hanging_sign' | 'mangrove_wall_hanging_sign' | 'crimson_wall_hanging_sign' | 'warped_wall_hanging_sign' | 'bamboo_wall_hanging_sign' | 'lever' | 'stone_pressure_plate' | 'iron_door' | 'oak_pressure_plate' | 'spruce_pressure_plate' | 'birch_pressure_plate' | 'jungle_pressure_plate' | 'acacia_pressure_plate' | 'cherry_pressure_plate' | 'dark_oak_pressure_plate' | 'mangrove_pressure_plate' | 'bamboo_pressure_plate' | 'redstone_ore' | 'deepslate_redstone_ore' | 'redstone_torch' | 'redstone_wall_torch' | 'stone_button' | 'snow' | 'ice' | 'snow_block' | 'cactus' | 'clay' | 'sugar_cane' | 'jukebox' | 'oak_fence' | 'pumpkin' | 'netherrack' | 'soul_sand' | 'soul_soil' | 'basalt' | 'polished_basalt' | 'soul_torch' | 'soul_wall_torch' | 'glowstone' | 'nether_portal' | 'carved_pumpkin' | 'jack_o_lantern' | 'cake' | 'repeater' | 'white_stained_glass' | 'orange_stained_glass' | 'magenta_stained_glass' | 'light_blue_stained_glass' | 'yellow_stained_glass' | 'lime_stained_glass' | 'pink_stained_glass' | 'gray_stained_glass' | 'light_gray_stained_glass' | 'cyan_stained_glass' | 'purple_stained_glass' | 'blue_stained_glass' | 'brown_stained_glass' | 'green_stained_glass' | 'red_stained_glass' | 'black_stained_glass' | 'oak_trapdoor' | 'spruce_trapdoor' | 'birch_trapdoor' | 'jungle_trapdoor' | 'acacia_trapdoor' | 'cherry_trapdoor' | 'dark_oak_trapdoor' | 'mangrove_trapdoor' | 'bamboo_trapdoor' | 'stone_bricks' | 'mossy_stone_bricks' | 'cracked_stone_bricks' | 'chiseled_stone_bricks' | 'packed_mud' | 'mud_bricks' | 'infested_stone' | 'infested_cobblestone' | 'infested_stone_bricks' | 'infested_mossy_stone_bricks' | 'infested_cracked_stone_bricks' | 'infested_chiseled_stone_bricks' | 'brown_mushroom_block' | 'red_mushroom_block' | 'mushroom_stem' | 'iron_bars' | 'chain' | 'glass_pane' | 'melon' | 'attached_pumpkin_stem' | 'attached_melon_stem' | 'pumpkin_stem' | 'melon_stem' | 'vine' | 'glow_lichen' | 'oak_fence_gate' | 'brick_stairs' | 'stone_brick_stairs' | 'mud_brick_stairs' | 'mycelium' | 'lily_pad' | 'nether_bricks' | 'nether_brick_fence' | 'nether_brick_stairs' | 'nether_wart' | 'enchanting_table' | 'brewing_stand' | 'cauldron' | 'water_cauldron' | 'lava_cauldron' | 'powder_snow_cauldron' | 'end_portal' | 'end_portal_frame' | 'end_stone' | 'dragon_egg' | 'redstone_lamp' | 'cocoa' | 'sandstone_stairs' | 'emerald_ore' | 'deepslate_emerald_ore' | 'ender_chest' | 'tripwire_hook' | 'tripwire' | 'emerald_block' | 'spruce_stairs' | 'birch_stairs' | 'jungle_stairs' | 'command_block' | 'beacon' | 'cobblestone_wall' | 'mossy_cobblestone_wall' | 'flower_pot' | 'potted_torchflower' | 'potted_oak_sapling' | 'potted_spruce_sapling' | 'potted_birch_sapling' | 'potted_jungle_sapling' | 'potted_acacia_sapling' | 'potted_cherry_sapling' | 'potted_dark_oak_sapling' | 'potted_mangrove_propagule' | 'potted_fern' | 'potted_dandelion' | 'potted_poppy' | 'potted_blue_orchid' | 'potted_allium' | 'potted_azure_bluet' | 'potted_red_tulip' | 'potted_orange_tulip' | 'potted_white_tulip' | 'potted_pink_tulip' | 'potted_oxeye_daisy' | 'potted_cornflower' | 'potted_lily_of_the_valley' | 'potted_wither_rose' | 'potted_red_mushroom' | 'potted_brown_mushroom' | 'potted_dead_bush' | 'potted_cactus' | 'carrots' | 'potatoes' | 'oak_button' | 'spruce_button' | 'birch_button' | 'jungle_button' | 'acacia_button' | 'cherry_button' | 'dark_oak_button' | 'mangrove_button' | 'bamboo_button' | 'skeleton_skull' | 'skeleton_wall_skull' | 'wither_skeleton_skull' | 'wither_skeleton_wall_skull' | 'zombie_head' | 'zombie_wall_head' | 'player_head' | 'player_wall_head' | 'creeper_head' | 'creeper_wall_head' | 'dragon_head' | 'dragon_wall_head' | 'piglin_head' | 'piglin_wall_head' | 'anvil' | 'chipped_anvil' | 'damaged_anvil' | 'trapped_chest' | 'light_weighted_pressure_plate' | 'heavy_weighted_pressure_plate' | 'comparator' | 'daylight_detector' | 'redstone_block' | 'nether_quartz_ore' | 'hopper' | 'quartz_block' | 'chiseled_quartz_block' | 'quartz_pillar' | 'quartz_stairs' | 'activator_rail' | 'dropper' | 'white_terracotta' | 'orange_terracotta' | 'magenta_terracotta' | 'light_blue_terracotta' | 'yellow_terracotta' | 'lime_terracotta' | 'pink_terracotta' | 'gray_terracotta' | 'light_gray_terracotta' | 'cyan_terracotta' | 'purple_terracotta' | 'blue_terracotta' | 'brown_terracotta' | 'green_terracotta' | 'red_terracotta' | 'black_terracotta' | 'white_stained_glass_pane' | 'orange_stained_glass_pane' | 'magenta_stained_glass_pane' | 'light_blue_stained_glass_pane' | 'yellow_stained_glass_pane' | 'lime_stained_glass_pane' | 'pink_stained_glass_pane' | 'gray_stained_glass_pane' | 'light_gray_stained_glass_pane' | 'cyan_stained_glass_pane' | 'purple_stained_glass_pane' | 'blue_stained_glass_pane' | 'brown_stained_glass_pane' | 'green_stained_glass_pane' | 'red_stained_glass_pane' | 'black_stained_glass_pane' | 'acacia_stairs' | 'cherry_stairs' | 'dark_oak_stairs' | 'mangrove_stairs' | 'bamboo_stairs' | 'bamboo_mosaic_stairs' | 'slime_block' | 'barrier' | 'light' | 'iron_trapdoor' | 'prismarine' | 'prismarine_bricks' | 'dark_prismarine' | 'prismarine_stairs' | 'prismarine_brick_stairs' | 'dark_prismarine_stairs' | 'prismarine_slab' | 'prismarine_brick_slab' | 'dark_prismarine_slab' | 'sea_lantern' | 'hay_block' | 'white_carpet' | 'orange_carpet' | 'magenta_carpet' | 'light_blue_carpet' | 'yellow_carpet' | 'lime_carpet' | 'pink_carpet' | 'gray_carpet' | 'light_gray_carpet' | 'cyan_carpet' | 'purple_carpet' | 'blue_carpet' | 'brown_carpet' | 'green_carpet' | 'red_carpet' | 'black_carpet' | 'terracotta' | 'coal_block' | 'packed_ice' | 'sunflower' | 'lilac' | 'rose_bush' | 'peony' | 'tall_grass' | 'large_fern' | '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' | 'white_wall_banner' | 'orange_wall_banner' | 'magenta_wall_banner' | 'light_blue_wall_banner' | 'yellow_wall_banner' | 'lime_wall_banner' | 'pink_wall_banner' | 'gray_wall_banner' | 'light_gray_wall_banner' | 'cyan_wall_banner' | 'purple_wall_banner' | 'blue_wall_banner' | 'brown_wall_banner' | 'green_wall_banner' | 'red_wall_banner' | 'black_wall_banner' | 'red_sandstone' | 'chiseled_red_sandstone' | 'cut_red_sandstone' | 'red_sandstone_stairs' | 'oak_slab' | 'spruce_slab' | 'birch_slab' | 'jungle_slab' | 'acacia_slab' | 'cherry_slab' | 'dark_oak_slab' | 'mangrove_slab' | 'bamboo_slab' | 'bamboo_mosaic_slab' | 'stone_slab' | 'smooth_stone_slab' | 'sandstone_slab' | 'cut_sandstone_slab' | 'petrified_oak_slab' | 'cobblestone_slab' | 'brick_slab' | 'stone_brick_slab' | 'mud_brick_slab' | 'nether_brick_slab' | 'quartz_slab' | 'red_sandstone_slab' | 'cut_red_sandstone_slab' | 'purpur_slab' | 'smooth_stone' | 'smooth_sandstone' | 'smooth_quartz' | 'smooth_red_sandstone' | 'spruce_fence_gate' | 'birch_fence_gate' | 'jungle_fence_gate' | 'acacia_fence_gate' | 'cherry_fence_gate' | 'dark_oak_fence_gate' | 'mangrove_fence_gate' | 'bamboo_fence_gate' | 'spruce_fence' | 'birch_fence' | 'jungle_fence' | 'acacia_fence' | 'cherry_fence' | 'dark_oak_fence' | 'mangrove_fence' | 'bamboo_fence' | 'spruce_door' | 'birch_door' | 'jungle_door' | 'acacia_door' | 'cherry_door' | 'dark_oak_door' | 'mangrove_door' | 'bamboo_door' | 'end_rod' | 'chorus_plant' | 'chorus_flower' | 'purpur_block' | 'purpur_pillar' | 'purpur_stairs' | 'end_stone_bricks' | 'torchflower_crop' | 'pitcher_crop' | 'pitcher_plant' | 'beetroots' | 'dirt_path' | 'end_gateway' | 'repeating_command_block' | 'chain_command_block' | 'frosted_ice' | 'magma_block' | 'nether_wart_block' | 'red_nether_bricks' | 'bone_block' | 'structure_void' | 'observer' | 'shulker_box' | 'white_shulker_box' | 'orange_shulker_box' | 'magenta_shulker_box' | 'light_blue_shulker_box' | 'yellow_shulker_box' | 'lime_shulker_box' | 'pink_shulker_box' | 'gray_shulker_box' | 'light_gray_shulker_box' | 'cyan_shulker_box' | 'purple_shulker_box' | 'blue_shulker_box' | 'brown_shulker_box' | 'green_shulker_box' | 'red_shulker_box' | 'black_shulker_box' | 'white_glazed_terracotta' | 'orange_glazed_terracotta' | 'magenta_glazed_terracotta' | 'light_blue_glazed_terracotta' | 'yellow_glazed_terracotta' | 'lime_glazed_terracotta' | 'pink_glazed_terracotta' | 'gray_glazed_terracotta' | 'light_gray_glazed_terracotta' | 'cyan_glazed_terracotta' | 'purple_glazed_terracotta' | 'blue_glazed_terracotta' | 'brown_glazed_terracotta' | 'green_glazed_terracotta' | 'red_glazed_terracotta' | 'black_glazed_terracotta' | 'white_concrete' | 'orange_concrete' | 'magenta_concrete' | 'light_blue_concrete' | 'yellow_concrete' | 'lime_concrete' | 'pink_concrete' | 'gray_concrete' | 'light_gray_concrete' | 'cyan_concrete' | 'purple_concrete' | 'blue_concrete' | 'brown_concrete' | 'green_concrete' | 'red_concrete' | 'black_concrete' | 'white_concrete_powder' | 'orange_concrete_powder' | 'magenta_concrete_powder' | 'light_blue_concrete_powder' | 'yellow_concrete_powder' | 'lime_concrete_powder' | 'pink_concrete_powder' | 'gray_concrete_powder' | 'light_gray_concrete_powder' | 'cyan_concrete_powder' | 'purple_concrete_powder' | 'blue_concrete_powder' | 'brown_concrete_powder' | 'green_concrete_powder' | 'red_concrete_powder' | 'black_concrete_powder' | 'kelp' | 'kelp_plant' | 'dried_kelp_block' | 'turtle_egg' | 'sniffer_egg' | 'dead_tube_coral_block' | 'dead_brain_coral_block' | 'dead_bubble_coral_block' | 'dead_fire_coral_block' | 'dead_horn_coral_block' | 'tube_coral_block' | 'brain_coral_block' | 'bubble_coral_block' | 'fire_coral_block' | 'horn_coral_block' | 'dead_tube_coral' | 'dead_brain_coral' | 'dead_bubble_coral' | 'dead_fire_coral' | 'dead_horn_coral' | 'tube_coral' | 'brain_coral' | 'bubble_coral' | 'fire_coral' | 'horn_coral' | 'dead_tube_coral_fan' | 'dead_brain_coral_fan' | 'dead_bubble_coral_fan' | 'dead_fire_coral_fan' | 'dead_horn_coral_fan' | 'tube_coral_fan' | 'brain_coral_fan' | 'bubble_coral_fan' | 'fire_coral_fan' | 'horn_coral_fan' | 'dead_tube_coral_wall_fan' | 'dead_brain_coral_wall_fan' | 'dead_bubble_coral_wall_fan' | 'dead_fire_coral_wall_fan' | 'dead_horn_coral_wall_fan' | 'tube_coral_wall_fan' | 'brain_coral_wall_fan' | 'bubble_coral_wall_fan' | 'fire_coral_wall_fan' | 'horn_coral_wall_fan' | 'sea_pickle' | 'blue_ice' | 'conduit' | 'bamboo_sapling' | 'bamboo' | 'potted_bamboo' | 'void_air' | 'cave_air' | 'bubble_column' | 'polished_granite_stairs' | 'smooth_red_sandstone_stairs' | 'mossy_stone_brick_stairs' | 'polished_diorite_stairs' | 'mossy_cobblestone_stairs' | 'end_stone_brick_stairs' | 'stone_stairs' | 'smooth_sandstone_stairs' | 'smooth_quartz_stairs' | 'granite_stairs' | 'andesite_stairs' | 'red_nether_brick_stairs' | 'polished_andesite_stairs' | 'diorite_stairs' | 'polished_granite_slab' | 'smooth_red_sandstone_slab' | 'mossy_stone_brick_slab' | 'polished_diorite_slab' | 'mossy_cobblestone_slab' | 'end_stone_brick_slab' | 'smooth_sandstone_slab' | 'smooth_quartz_slab' | 'granite_slab' | 'andesite_slab' | 'red_nether_brick_slab' | 'polished_andesite_slab' | 'diorite_slab' | 'brick_wall' | 'prismarine_wall' | 'red_sandstone_wall' | 'mossy_stone_brick_wall' | 'granite_wall' | 'stone_brick_wall' | 'mud_brick_wall' | 'nether_brick_wall' | 'andesite_wall' | 'red_nether_brick_wall' | 'sandstone_wall' | 'end_stone_brick_wall' | 'diorite_wall' | 'scaffolding' | 'loom' | 'barrel' | 'smoker' | 'blast_furnace' | 'cartography_table' | 'fletching_table' | 'grindstone' | 'lectern' | 'smithing_table' | 'stonecutter' | 'bell' | 'lantern' | 'soul_lantern' | 'campfire' | 'soul_campfire' | 'sweet_berry_bush' | 'warped_stem' | 'stripped_warped_stem' | 'warped_hyphae' | 'stripped_warped_hyphae' | 'warped_nylium' | 'warped_fungus' | 'warped_wart_block' | 'warped_roots' | 'nether_sprouts' | 'crimson_stem' | 'stripped_crimson_stem' | 'crimson_hyphae' | 'stripped_crimson_hyphae' | 'crimson_nylium' | 'crimson_fungus' | 'shroomlight' | 'weeping_vines' | 'weeping_vines_plant' | 'twisting_vines' | 'twisting_vines_plant' | 'crimson_roots' | 'crimson_planks' | 'warped_planks' | 'crimson_slab' | 'warped_slab' | 'crimson_pressure_plate' | 'warped_pressure_plate' | 'crimson_fence' | 'warped_fence' | 'crimson_trapdoor' | 'warped_trapdoor' | 'crimson_fence_gate' | 'warped_fence_gate' | 'crimson_stairs' | 'warped_stairs' | 'crimson_button' | 'warped_button' | 'crimson_door' | 'warped_door' | 'crimson_sign' | 'warped_sign' | 'crimson_wall_sign' | 'warped_wall_sign' | 'structure_block' | 'jigsaw' | 'composter' | 'target' | 'bee_nest' | 'beehive' | 'honey_block' | 'honeycomb_block' | 'netherite_block' | 'ancient_debris' | 'crying_obsidian' | 'respawn_anchor' | 'potted_crimson_fungus' | 'potted_warped_fungus' | 'potted_crimson_roots' | 'potted_warped_roots' | 'lodestone' | 'blackstone' | 'blackstone_stairs' | 'blackstone_wall' | 'blackstone_slab' | 'polished_blackstone' | 'polished_blackstone_bricks' | 'cracked_polished_blackstone_bricks' | 'chiseled_polished_blackstone' | 'polished_blackstone_brick_slab' | 'polished_blackstone_brick_stairs' | 'polished_blackstone_brick_wall' | 'gilded_blackstone' | 'polished_blackstone_stairs' | 'polished_blackstone_slab' | 'polished_blackstone_pressure_plate' | 'polished_blackstone_button' | 'polished_blackstone_wall' | 'chiseled_nether_bricks' | 'cracked_nether_bricks' | 'quartz_bricks' | 'candle' | 'white_candle' | 'orange_candle' | 'magenta_candle' | 'light_blue_candle' | 'yellow_candle' | 'lime_candle' | 'pink_candle' | 'gray_candle' | 'light_gray_candle' | 'cyan_candle' | 'purple_candle' | 'blue_candle' | 'brown_candle' | 'green_candle' | 'red_candle' | 'black_candle' | 'candle_cake' | 'white_candle_cake' | 'orange_candle_cake' | 'magenta_candle_cake' | 'light_blue_candle_cake' | 'yellow_candle_cake' | 'lime_candle_cake' | 'pink_candle_cake' | 'gray_candle_cake' | 'light_gray_candle_cake' | 'cyan_candle_cake' | 'purple_candle_cake' | 'blue_candle_cake' | 'brown_candle_cake' | 'green_candle_cake' | 'red_candle_cake' | 'black_candle_cake' | 'amethyst_block' | 'budding_amethyst' | 'amethyst_cluster' | 'large_amethyst_bud' | 'medium_amethyst_bud' | 'small_amethyst_bud' | 'tuff' | 'calcite' | 'tinted_glass' | 'powder_snow' | 'sculk_sensor' | 'calibrated_sculk_sensor' | 'sculk' | 'sculk_vein' | 'sculk_catalyst' | 'sculk_shrieker' | 'oxidized_copper' | 'weathered_copper' | 'exposed_copper' | 'copper_block' | 'copper_ore' | 'deepslate_copper_ore' | 'oxidized_cut_copper' | 'weathered_cut_copper' | 'exposed_cut_copper' | 'cut_copper' | 'oxidized_cut_copper_stairs' | 'weathered_cut_copper_stairs' | 'exposed_cut_copper_stairs' | 'cut_copper_stairs' | 'oxidized_cut_copper_slab' | 'weathered_cut_copper_slab' | 'exposed_cut_copper_slab' | 'cut_copper_slab' | 'waxed_copper_block' | 'waxed_weathered_copper' | 'waxed_exposed_copper' | 'waxed_oxidized_copper' | 'waxed_oxidized_cut_copper' | 'waxed_weathered_cut_copper' | 'waxed_exposed_cut_copper' | 'waxed_cut_copper' | 'waxed_oxidized_cut_copper_stairs' | 'waxed_weathered_cut_copper_stairs' | 'waxed_exposed_cut_copper_stairs' | 'waxed_cut_copper_stairs' | 'waxed_oxidized_cut_copper_slab' | 'waxed_weathered_cut_copper_slab' | 'waxed_exposed_cut_copper_slab' | 'waxed_cut_copper_slab' | 'lightning_rod' | 'pointed_dripstone' | 'dripstone_block' | 'cave_vines' | 'cave_vines_plant' | 'spore_blossom' | 'azalea' | 'flowering_azalea' | 'moss_carpet' | 'pink_petals' | 'moss_block' | 'big_dripleaf' | 'big_dripleaf_stem' | 'small_dripleaf' | 'hanging_roots' | 'rooted_dirt' | 'mud' | 'deepslate' | 'cobbled_deepslate' | 'cobbled_deepslate_stairs' | 'cobbled_deepslate_slab' | 'cobbled_deepslate_wall' | 'polished_deepslate' | 'polished_deepslate_stairs' | 'polished_deepslate_slab' | 'polished_deepslate_wall' | 'deepslate_tiles' | 'deepslate_tile_stairs' | 'deepslate_tile_slab' | 'deepslate_tile_wall' | 'deepslate_bricks' | 'deepslate_brick_stairs' | 'deepslate_brick_slab' | 'deepslate_brick_wall' | 'chiseled_deepslate' | 'cracked_deepslate_bricks' | 'cracked_deepslate_tiles' | 'infested_deepslate' | 'smooth_basalt' | 'raw_iron_block' | 'raw_copper_block' | 'raw_gold_block' | 'potted_azalea_bush' | 'potted_flowering_azalea_bush' | 'ochre_froglight' | 'verdant_froglight' | 'pearlescent_froglight' | 'frogspawn' | 'reinforced_deepslate' | 'decorated_pot'; -export type ItemNames = 'air' | 'stone' | 'granite' | 'polished_granite' | 'diorite' | 'polished_diorite' | 'andesite' | 'polished_andesite' | 'deepslate' | 'cobbled_deepslate' | 'polished_deepslate' | 'calcite' | 'tuff' | 'dripstone_block' | 'grass_block' | 'dirt' | 'coarse_dirt' | 'podzol' | 'rooted_dirt' | 'mud' | 'crimson_nylium' | 'warped_nylium' | 'cobblestone' | 'oak_planks' | 'spruce_planks' | 'birch_planks' | 'jungle_planks' | 'acacia_planks' | 'cherry_planks' | 'dark_oak_planks' | 'mangrove_planks' | 'bamboo_planks' | 'crimson_planks' | 'warped_planks' | 'bamboo_mosaic' | 'oak_sapling' | 'spruce_sapling' | 'birch_sapling' | 'jungle_sapling' | 'acacia_sapling' | 'cherry_sapling' | 'dark_oak_sapling' | 'mangrove_propagule' | 'bedrock' | 'sand' | 'suspicious_sand' | 'suspicious_gravel' | 'red_sand' | 'gravel' | 'coal_ore' | 'deepslate_coal_ore' | 'iron_ore' | 'deepslate_iron_ore' | 'copper_ore' | 'deepslate_copper_ore' | 'gold_ore' | 'deepslate_gold_ore' | 'redstone_ore' | 'deepslate_redstone_ore' | 'emerald_ore' | 'deepslate_emerald_ore' | 'lapis_ore' | 'deepslate_lapis_ore' | 'diamond_ore' | 'deepslate_diamond_ore' | 'nether_gold_ore' | 'nether_quartz_ore' | 'ancient_debris' | 'coal_block' | 'raw_iron_block' | 'raw_copper_block' | 'raw_gold_block' | 'amethyst_block' | 'budding_amethyst' | 'iron_block' | 'copper_block' | 'gold_block' | 'diamond_block' | 'netherite_block' | 'exposed_copper' | 'weathered_copper' | 'oxidized_copper' | 'cut_copper' | 'exposed_cut_copper' | 'weathered_cut_copper' | 'oxidized_cut_copper' | 'cut_copper_stairs' | 'exposed_cut_copper_stairs' | 'weathered_cut_copper_stairs' | 'oxidized_cut_copper_stairs' | 'cut_copper_slab' | 'exposed_cut_copper_slab' | 'weathered_cut_copper_slab' | 'oxidized_cut_copper_slab' | 'waxed_copper_block' | 'waxed_exposed_copper' | 'waxed_weathered_copper' | 'waxed_oxidized_copper' | 'waxed_cut_copper' | 'waxed_exposed_cut_copper' | 'waxed_weathered_cut_copper' | 'waxed_oxidized_cut_copper' | 'waxed_cut_copper_stairs' | 'waxed_exposed_cut_copper_stairs' | 'waxed_weathered_cut_copper_stairs' | 'waxed_oxidized_cut_copper_stairs' | 'waxed_cut_copper_slab' | 'waxed_exposed_cut_copper_slab' | 'waxed_weathered_cut_copper_slab' | 'waxed_oxidized_cut_copper_slab' | 'oak_log' | 'spruce_log' | 'birch_log' | 'jungle_log' | 'acacia_log' | 'cherry_log' | 'dark_oak_log' | 'mangrove_log' | 'mangrove_roots' | 'muddy_mangrove_roots' | 'crimson_stem' | 'warped_stem' | 'bamboo_block' | 'stripped_oak_log' | 'stripped_spruce_log' | 'stripped_birch_log' | 'stripped_jungle_log' | 'stripped_acacia_log' | 'stripped_cherry_log' | 'stripped_dark_oak_log' | 'stripped_mangrove_log' | 'stripped_crimson_stem' | 'stripped_warped_stem' | 'stripped_oak_wood' | 'stripped_spruce_wood' | 'stripped_birch_wood' | 'stripped_jungle_wood' | 'stripped_acacia_wood' | 'stripped_cherry_wood' | 'stripped_dark_oak_wood' | 'stripped_mangrove_wood' | 'stripped_crimson_hyphae' | 'stripped_warped_hyphae' | 'stripped_bamboo_block' | 'oak_wood' | 'spruce_wood' | 'birch_wood' | 'jungle_wood' | 'acacia_wood' | 'cherry_wood' | 'dark_oak_wood' | 'mangrove_wood' | 'crimson_hyphae' | 'warped_hyphae' | 'oak_leaves' | 'spruce_leaves' | 'birch_leaves' | 'jungle_leaves' | 'acacia_leaves' | 'cherry_leaves' | 'dark_oak_leaves' | 'mangrove_leaves' | 'azalea_leaves' | 'flowering_azalea_leaves' | 'sponge' | 'wet_sponge' | 'glass' | 'tinted_glass' | 'lapis_block' | 'sandstone' | 'chiseled_sandstone' | 'cut_sandstone' | 'cobweb' | 'grass' | 'fern' | 'azalea' | 'flowering_azalea' | 'dead_bush' | 'seagrass' | 'sea_pickle' | 'white_wool' | 'orange_wool' | 'magenta_wool' | 'light_blue_wool' | 'yellow_wool' | 'lime_wool' | 'pink_wool' | 'gray_wool' | 'light_gray_wool' | 'cyan_wool' | 'purple_wool' | 'blue_wool' | 'brown_wool' | 'green_wool' | 'red_wool' | 'black_wool' | 'dandelion' | 'poppy' | 'blue_orchid' | 'allium' | 'azure_bluet' | 'red_tulip' | 'orange_tulip' | 'white_tulip' | 'pink_tulip' | 'oxeye_daisy' | 'cornflower' | 'lily_of_the_valley' | 'wither_rose' | 'torchflower' | 'pitcher_plant' | 'spore_blossom' | 'brown_mushroom' | 'red_mushroom' | 'crimson_fungus' | 'warped_fungus' | 'crimson_roots' | 'warped_roots' | 'nether_sprouts' | 'weeping_vines' | 'twisting_vines' | 'sugar_cane' | 'kelp' | 'moss_carpet' | 'pink_petals' | 'moss_block' | 'hanging_roots' | 'big_dripleaf' | 'small_dripleaf' | 'bamboo' | 'oak_slab' | 'spruce_slab' | 'birch_slab' | 'jungle_slab' | 'acacia_slab' | 'cherry_slab' | 'dark_oak_slab' | 'mangrove_slab' | 'bamboo_slab' | 'bamboo_mosaic_slab' | 'crimson_slab' | 'warped_slab' | 'stone_slab' | 'smooth_stone_slab' | 'sandstone_slab' | 'cut_sandstone_slab' | 'petrified_oak_slab' | 'cobblestone_slab' | 'brick_slab' | 'stone_brick_slab' | 'mud_brick_slab' | 'nether_brick_slab' | 'quartz_slab' | 'red_sandstone_slab' | 'cut_red_sandstone_slab' | 'purpur_slab' | 'prismarine_slab' | 'prismarine_brick_slab' | 'dark_prismarine_slab' | 'smooth_quartz' | 'smooth_red_sandstone' | 'smooth_sandstone' | 'smooth_stone' | 'bricks' | 'bookshelf' | 'chiseled_bookshelf' | 'decorated_pot' | 'mossy_cobblestone' | 'obsidian' | 'torch' | 'end_rod' | 'chorus_plant' | 'chorus_flower' | 'purpur_block' | 'purpur_pillar' | 'purpur_stairs' | 'spawner' | 'chest' | 'crafting_table' | 'farmland' | 'furnace' | 'ladder' | 'cobblestone_stairs' | 'snow' | 'ice' | 'snow_block' | 'cactus' | 'clay' | 'jukebox' | 'oak_fence' | 'spruce_fence' | 'birch_fence' | 'jungle_fence' | 'acacia_fence' | 'cherry_fence' | 'dark_oak_fence' | 'mangrove_fence' | 'bamboo_fence' | 'crimson_fence' | 'warped_fence' | 'pumpkin' | 'carved_pumpkin' | 'jack_o_lantern' | 'netherrack' | 'soul_sand' | 'soul_soil' | 'basalt' | 'polished_basalt' | 'smooth_basalt' | 'soul_torch' | 'glowstone' | 'infested_stone' | 'infested_cobblestone' | 'infested_stone_bricks' | 'infested_mossy_stone_bricks' | 'infested_cracked_stone_bricks' | 'infested_chiseled_stone_bricks' | 'infested_deepslate' | 'stone_bricks' | 'mossy_stone_bricks' | 'cracked_stone_bricks' | 'chiseled_stone_bricks' | 'packed_mud' | 'mud_bricks' | 'deepslate_bricks' | 'cracked_deepslate_bricks' | 'deepslate_tiles' | 'cracked_deepslate_tiles' | 'chiseled_deepslate' | 'reinforced_deepslate' | 'brown_mushroom_block' | 'red_mushroom_block' | 'mushroom_stem' | 'iron_bars' | 'chain' | 'glass_pane' | 'melon' | 'vine' | 'glow_lichen' | 'brick_stairs' | 'stone_brick_stairs' | 'mud_brick_stairs' | 'mycelium' | 'lily_pad' | 'nether_bricks' | 'cracked_nether_bricks' | 'chiseled_nether_bricks' | 'nether_brick_fence' | 'nether_brick_stairs' | 'sculk' | 'sculk_vein' | 'sculk_catalyst' | 'sculk_shrieker' | 'enchanting_table' | 'end_portal_frame' | 'end_stone' | 'end_stone_bricks' | 'dragon_egg' | 'sandstone_stairs' | 'ender_chest' | 'emerald_block' | 'oak_stairs' | 'spruce_stairs' | 'birch_stairs' | 'jungle_stairs' | 'acacia_stairs' | 'cherry_stairs' | 'dark_oak_stairs' | 'mangrove_stairs' | 'bamboo_stairs' | 'bamboo_mosaic_stairs' | 'crimson_stairs' | 'warped_stairs' | 'command_block' | 'beacon' | 'cobblestone_wall' | 'mossy_cobblestone_wall' | 'brick_wall' | 'prismarine_wall' | 'red_sandstone_wall' | 'mossy_stone_brick_wall' | 'granite_wall' | 'stone_brick_wall' | 'mud_brick_wall' | 'nether_brick_wall' | 'andesite_wall' | 'red_nether_brick_wall' | 'sandstone_wall' | 'end_stone_brick_wall' | 'diorite_wall' | 'blackstone_wall' | 'polished_blackstone_wall' | 'polished_blackstone_brick_wall' | 'cobbled_deepslate_wall' | 'polished_deepslate_wall' | 'deepslate_brick_wall' | 'deepslate_tile_wall' | 'anvil' | 'chipped_anvil' | 'damaged_anvil' | 'chiseled_quartz_block' | 'quartz_block' | 'quartz_bricks' | 'quartz_pillar' | 'quartz_stairs' | 'white_terracotta' | 'orange_terracotta' | 'magenta_terracotta' | 'light_blue_terracotta' | 'yellow_terracotta' | 'lime_terracotta' | 'pink_terracotta' | 'gray_terracotta' | 'light_gray_terracotta' | 'cyan_terracotta' | 'purple_terracotta' | 'blue_terracotta' | 'brown_terracotta' | 'green_terracotta' | 'red_terracotta' | 'black_terracotta' | 'barrier' | 'light' | 'hay_block' | 'white_carpet' | 'orange_carpet' | 'magenta_carpet' | 'light_blue_carpet' | 'yellow_carpet' | 'lime_carpet' | 'pink_carpet' | 'gray_carpet' | 'light_gray_carpet' | 'cyan_carpet' | 'purple_carpet' | 'blue_carpet' | 'brown_carpet' | 'green_carpet' | 'red_carpet' | 'black_carpet' | 'terracotta' | 'packed_ice' | 'dirt_path' | 'sunflower' | 'lilac' | 'rose_bush' | 'peony' | 'tall_grass' | 'large_fern' | 'white_stained_glass' | 'orange_stained_glass' | 'magenta_stained_glass' | 'light_blue_stained_glass' | 'yellow_stained_glass' | 'lime_stained_glass' | 'pink_stained_glass' | 'gray_stained_glass' | 'light_gray_stained_glass' | 'cyan_stained_glass' | 'purple_stained_glass' | 'blue_stained_glass' | 'brown_stained_glass' | 'green_stained_glass' | 'red_stained_glass' | 'black_stained_glass' | 'white_stained_glass_pane' | 'orange_stained_glass_pane' | 'magenta_stained_glass_pane' | 'light_blue_stained_glass_pane' | 'yellow_stained_glass_pane' | 'lime_stained_glass_pane' | 'pink_stained_glass_pane' | 'gray_stained_glass_pane' | 'light_gray_stained_glass_pane' | 'cyan_stained_glass_pane' | 'purple_stained_glass_pane' | 'blue_stained_glass_pane' | 'brown_stained_glass_pane' | 'green_stained_glass_pane' | 'red_stained_glass_pane' | 'black_stained_glass_pane' | 'prismarine' | 'prismarine_bricks' | 'dark_prismarine' | 'prismarine_stairs' | 'prismarine_brick_stairs' | 'dark_prismarine_stairs' | 'sea_lantern' | 'red_sandstone' | 'chiseled_red_sandstone' | 'cut_red_sandstone' | 'red_sandstone_stairs' | 'repeating_command_block' | 'chain_command_block' | 'magma_block' | 'nether_wart_block' | 'warped_wart_block' | 'red_nether_bricks' | 'bone_block' | 'structure_void' | 'shulker_box' | 'white_shulker_box' | 'orange_shulker_box' | 'magenta_shulker_box' | 'light_blue_shulker_box' | 'yellow_shulker_box' | 'lime_shulker_box' | 'pink_shulker_box' | 'gray_shulker_box' | 'light_gray_shulker_box' | 'cyan_shulker_box' | 'purple_shulker_box' | 'blue_shulker_box' | 'brown_shulker_box' | 'green_shulker_box' | 'red_shulker_box' | 'black_shulker_box' | 'white_glazed_terracotta' | 'orange_glazed_terracotta' | 'magenta_glazed_terracotta' | 'light_blue_glazed_terracotta' | 'yellow_glazed_terracotta' | 'lime_glazed_terracotta' | 'pink_glazed_terracotta' | 'gray_glazed_terracotta' | 'light_gray_glazed_terracotta' | 'cyan_glazed_terracotta' | 'purple_glazed_terracotta' | 'blue_glazed_terracotta' | 'brown_glazed_terracotta' | 'green_glazed_terracotta' | 'red_glazed_terracotta' | 'black_glazed_terracotta' | 'white_concrete' | 'orange_concrete' | 'magenta_concrete' | 'light_blue_concrete' | 'yellow_concrete' | 'lime_concrete' | 'pink_concrete' | 'gray_concrete' | 'light_gray_concrete' | 'cyan_concrete' | 'purple_concrete' | 'blue_concrete' | 'brown_concrete' | 'green_concrete' | 'red_concrete' | 'black_concrete' | 'white_concrete_powder' | 'orange_concrete_powder' | 'magenta_concrete_powder' | 'light_blue_concrete_powder' | 'yellow_concrete_powder' | 'lime_concrete_powder' | 'pink_concrete_powder' | 'gray_concrete_powder' | 'light_gray_concrete_powder' | 'cyan_concrete_powder' | 'purple_concrete_powder' | 'blue_concrete_powder' | 'brown_concrete_powder' | 'green_concrete_powder' | 'red_concrete_powder' | 'black_concrete_powder' | 'turtle_egg' | 'sniffer_egg' | 'dead_tube_coral_block' | 'dead_brain_coral_block' | 'dead_bubble_coral_block' | 'dead_fire_coral_block' | 'dead_horn_coral_block' | 'tube_coral_block' | 'brain_coral_block' | 'bubble_coral_block' | 'fire_coral_block' | 'horn_coral_block' | 'tube_coral' | 'brain_coral' | 'bubble_coral' | 'fire_coral' | 'horn_coral' | 'dead_brain_coral' | 'dead_bubble_coral' | 'dead_fire_coral' | 'dead_horn_coral' | 'dead_tube_coral' | 'tube_coral_fan' | 'brain_coral_fan' | 'bubble_coral_fan' | 'fire_coral_fan' | 'horn_coral_fan' | 'dead_tube_coral_fan' | 'dead_brain_coral_fan' | 'dead_bubble_coral_fan' | 'dead_fire_coral_fan' | 'dead_horn_coral_fan' | 'blue_ice' | 'conduit' | 'polished_granite_stairs' | 'smooth_red_sandstone_stairs' | 'mossy_stone_brick_stairs' | 'polished_diorite_stairs' | 'mossy_cobblestone_stairs' | 'end_stone_brick_stairs' | 'stone_stairs' | 'smooth_sandstone_stairs' | 'smooth_quartz_stairs' | 'granite_stairs' | 'andesite_stairs' | 'red_nether_brick_stairs' | 'polished_andesite_stairs' | 'diorite_stairs' | 'cobbled_deepslate_stairs' | 'polished_deepslate_stairs' | 'deepslate_brick_stairs' | 'deepslate_tile_stairs' | 'polished_granite_slab' | 'smooth_red_sandstone_slab' | 'mossy_stone_brick_slab' | 'polished_diorite_slab' | 'mossy_cobblestone_slab' | 'end_stone_brick_slab' | 'smooth_sandstone_slab' | 'smooth_quartz_slab' | 'granite_slab' | 'andesite_slab' | 'red_nether_brick_slab' | 'polished_andesite_slab' | 'diorite_slab' | 'cobbled_deepslate_slab' | 'polished_deepslate_slab' | 'deepslate_brick_slab' | 'deepslate_tile_slab' | 'scaffolding' | 'redstone' | 'redstone_torch' | 'redstone_block' | 'repeater' | 'comparator' | 'piston' | 'sticky_piston' | 'slime_block' | 'honey_block' | 'observer' | 'hopper' | 'dispenser' | 'dropper' | 'lectern' | 'target' | 'lever' | 'lightning_rod' | 'daylight_detector' | 'sculk_sensor' | 'calibrated_sculk_sensor' | 'tripwire_hook' | 'trapped_chest' | 'tnt' | 'redstone_lamp' | 'note_block' | 'stone_button' | 'polished_blackstone_button' | 'oak_button' | 'spruce_button' | 'birch_button' | 'jungle_button' | 'acacia_button' | 'cherry_button' | 'dark_oak_button' | 'mangrove_button' | 'bamboo_button' | 'crimson_button' | 'warped_button' | 'stone_pressure_plate' | 'polished_blackstone_pressure_plate' | 'light_weighted_pressure_plate' | 'heavy_weighted_pressure_plate' | 'oak_pressure_plate' | 'spruce_pressure_plate' | 'birch_pressure_plate' | 'jungle_pressure_plate' | 'acacia_pressure_plate' | 'cherry_pressure_plate' | 'dark_oak_pressure_plate' | 'mangrove_pressure_plate' | 'bamboo_pressure_plate' | 'crimson_pressure_plate' | 'warped_pressure_plate' | 'iron_door' | 'oak_door' | 'spruce_door' | 'birch_door' | 'jungle_door' | 'acacia_door' | 'cherry_door' | 'dark_oak_door' | 'mangrove_door' | 'bamboo_door' | 'crimson_door' | 'warped_door' | 'iron_trapdoor' | 'oak_trapdoor' | 'spruce_trapdoor' | 'birch_trapdoor' | 'jungle_trapdoor' | 'acacia_trapdoor' | 'cherry_trapdoor' | 'dark_oak_trapdoor' | 'mangrove_trapdoor' | 'bamboo_trapdoor' | 'crimson_trapdoor' | 'warped_trapdoor' | 'oak_fence_gate' | 'spruce_fence_gate' | 'birch_fence_gate' | 'jungle_fence_gate' | 'acacia_fence_gate' | 'cherry_fence_gate' | 'dark_oak_fence_gate' | 'mangrove_fence_gate' | 'bamboo_fence_gate' | 'crimson_fence_gate' | 'warped_fence_gate' | 'powered_rail' | 'detector_rail' | 'rail' | 'activator_rail' | 'saddle' | 'minecart' | 'chest_minecart' | 'furnace_minecart' | 'tnt_minecart' | 'hopper_minecart' | 'carrot_on_a_stick' | 'warped_fungus_on_a_stick' | 'elytra' | 'oak_boat' | 'oak_chest_boat' | 'spruce_boat' | 'spruce_chest_boat' | 'birch_boat' | 'birch_chest_boat' | 'jungle_boat' | 'jungle_chest_boat' | 'acacia_boat' | 'acacia_chest_boat' | 'cherry_boat' | 'cherry_chest_boat' | 'dark_oak_boat' | 'dark_oak_chest_boat' | 'mangrove_boat' | 'mangrove_chest_boat' | 'bamboo_raft' | 'bamboo_chest_raft' | 'structure_block' | 'jigsaw' | 'turtle_helmet' | 'scute' | 'flint_and_steel' | 'apple' | 'bow' | 'arrow' | 'coal' | 'charcoal' | 'diamond' | 'emerald' | 'lapis_lazuli' | 'quartz' | 'amethyst_shard' | 'raw_iron' | 'iron_ingot' | 'raw_copper' | 'copper_ingot' | 'raw_gold' | 'gold_ingot' | 'netherite_ingot' | 'netherite_scrap' | 'wooden_sword' | 'wooden_shovel' | 'wooden_pickaxe' | 'wooden_axe' | 'wooden_hoe' | 'stone_sword' | 'stone_shovel' | 'stone_pickaxe' | 'stone_axe' | 'stone_hoe' | 'golden_sword' | 'golden_shovel' | 'golden_pickaxe' | 'golden_axe' | 'golden_hoe' | 'iron_sword' | 'iron_shovel' | 'iron_pickaxe' | 'iron_axe' | 'iron_hoe' | 'diamond_sword' | 'diamond_shovel' | 'diamond_pickaxe' | 'diamond_axe' | 'diamond_hoe' | 'netherite_sword' | 'netherite_shovel' | 'netherite_pickaxe' | 'netherite_axe' | 'netherite_hoe' | 'stick' | 'bowl' | 'mushroom_stew' | 'string' | 'feather' | 'gunpowder' | 'wheat_seeds' | 'wheat' | 'bread' | 'leather_helmet' | 'leather_chestplate' | 'leather_leggings' | 'leather_boots' | 'chainmail_helmet' | 'chainmail_chestplate' | 'chainmail_leggings' | 'chainmail_boots' | 'iron_helmet' | 'iron_chestplate' | 'iron_leggings' | 'iron_boots' | 'diamond_helmet' | 'diamond_chestplate' | 'diamond_leggings' | 'diamond_boots' | 'golden_helmet' | 'golden_chestplate' | 'golden_leggings' | 'golden_boots' | 'netherite_helmet' | 'netherite_chestplate' | 'netherite_leggings' | 'netherite_boots' | 'flint' | 'porkchop' | 'cooked_porkchop' | 'painting' | 'golden_apple' | 'enchanted_golden_apple' | 'oak_sign' | 'spruce_sign' | 'birch_sign' | 'jungle_sign' | 'acacia_sign' | 'cherry_sign' | 'dark_oak_sign' | 'mangrove_sign' | 'bamboo_sign' | 'crimson_sign' | 'warped_sign' | 'oak_hanging_sign' | 'spruce_hanging_sign' | 'birch_hanging_sign' | 'jungle_hanging_sign' | 'acacia_hanging_sign' | 'cherry_hanging_sign' | 'dark_oak_hanging_sign' | 'mangrove_hanging_sign' | 'bamboo_hanging_sign' | 'crimson_hanging_sign' | 'warped_hanging_sign' | 'bucket' | 'water_bucket' | 'lava_bucket' | 'powder_snow_bucket' | 'snowball' | 'leather' | 'milk_bucket' | 'pufferfish_bucket' | 'salmon_bucket' | 'cod_bucket' | 'tropical_fish_bucket' | 'axolotl_bucket' | 'tadpole_bucket' | 'brick' | 'clay_ball' | 'dried_kelp_block' | 'paper' | 'book' | 'slime_ball' | 'egg' | 'compass' | 'recovery_compass' | 'bundle' | 'fishing_rod' | 'clock' | 'spyglass' | 'glowstone_dust' | 'cod' | 'salmon' | 'tropical_fish' | 'pufferfish' | 'cooked_cod' | 'cooked_salmon' | 'ink_sac' | 'glow_ink_sac' | 'cocoa_beans' | 'white_dye' | 'orange_dye' | 'magenta_dye' | 'light_blue_dye' | 'yellow_dye' | 'lime_dye' | 'pink_dye' | 'gray_dye' | 'light_gray_dye' | 'cyan_dye' | 'purple_dye' | 'blue_dye' | 'brown_dye' | 'green_dye' | 'red_dye' | 'black_dye' | 'bone_meal' | 'bone' | 'sugar' | 'cake' | 'white_bed' | 'orange_bed' | 'magenta_bed' | 'light_blue_bed' | 'yellow_bed' | 'lime_bed' | 'pink_bed' | 'gray_bed' | 'light_gray_bed' | 'cyan_bed' | 'purple_bed' | 'blue_bed' | 'brown_bed' | 'green_bed' | 'red_bed' | 'black_bed' | 'cookie' | 'filled_map' | 'shears' | 'melon_slice' | 'dried_kelp' | 'pumpkin_seeds' | 'melon_seeds' | 'beef' | 'cooked_beef' | 'chicken' | 'cooked_chicken' | 'rotten_flesh' | 'ender_pearl' | 'blaze_rod' | 'ghast_tear' | 'gold_nugget' | 'nether_wart' | 'potion' | 'glass_bottle' | 'spider_eye' | 'fermented_spider_eye' | 'blaze_powder' | 'magma_cream' | 'brewing_stand' | 'cauldron' | 'ender_eye' | 'glistering_melon_slice' | 'allay_spawn_egg' | 'axolotl_spawn_egg' | 'bat_spawn_egg' | 'bee_spawn_egg' | 'blaze_spawn_egg' | 'cat_spawn_egg' | 'camel_spawn_egg' | 'cave_spider_spawn_egg' | 'chicken_spawn_egg' | 'cod_spawn_egg' | 'cow_spawn_egg' | 'creeper_spawn_egg' | 'dolphin_spawn_egg' | 'donkey_spawn_egg' | 'drowned_spawn_egg' | 'elder_guardian_spawn_egg' | 'ender_dragon_spawn_egg' | 'enderman_spawn_egg' | 'endermite_spawn_egg' | 'evoker_spawn_egg' | 'fox_spawn_egg' | 'frog_spawn_egg' | 'ghast_spawn_egg' | 'glow_squid_spawn_egg' | 'goat_spawn_egg' | 'guardian_spawn_egg' | 'hoglin_spawn_egg' | 'horse_spawn_egg' | 'husk_spawn_egg' | 'iron_golem_spawn_egg' | 'llama_spawn_egg' | 'magma_cube_spawn_egg' | 'mooshroom_spawn_egg' | 'mule_spawn_egg' | 'ocelot_spawn_egg' | 'panda_spawn_egg' | 'parrot_spawn_egg' | 'phantom_spawn_egg' | 'pig_spawn_egg' | 'piglin_spawn_egg' | 'piglin_brute_spawn_egg' | 'pillager_spawn_egg' | 'polar_bear_spawn_egg' | 'pufferfish_spawn_egg' | 'rabbit_spawn_egg' | 'ravager_spawn_egg' | 'salmon_spawn_egg' | 'sheep_spawn_egg' | 'shulker_spawn_egg' | 'silverfish_spawn_egg' | 'skeleton_spawn_egg' | 'skeleton_horse_spawn_egg' | 'slime_spawn_egg' | 'sniffer_spawn_egg' | 'snow_golem_spawn_egg' | 'spider_spawn_egg' | 'squid_spawn_egg' | 'stray_spawn_egg' | 'strider_spawn_egg' | 'tadpole_spawn_egg' | 'trader_llama_spawn_egg' | 'tropical_fish_spawn_egg' | 'turtle_spawn_egg' | 'vex_spawn_egg' | 'villager_spawn_egg' | 'vindicator_spawn_egg' | 'wandering_trader_spawn_egg' | 'warden_spawn_egg' | 'witch_spawn_egg' | 'wither_spawn_egg' | 'wither_skeleton_spawn_egg' | 'wolf_spawn_egg' | 'zoglin_spawn_egg' | 'zombie_spawn_egg' | 'zombie_horse_spawn_egg' | 'zombie_villager_spawn_egg' | 'zombified_piglin_spawn_egg' | 'experience_bottle' | 'fire_charge' | 'writable_book' | 'written_book' | 'item_frame' | 'glow_item_frame' | 'flower_pot' | 'carrot' | 'potato' | 'baked_potato' | 'poisonous_potato' | 'map' | 'golden_carrot' | 'skeleton_skull' | 'wither_skeleton_skull' | 'player_head' | 'zombie_head' | 'creeper_head' | 'dragon_head' | 'piglin_head' | 'nether_star' | 'pumpkin_pie' | 'firework_rocket' | 'firework_star' | 'enchanted_book' | 'nether_brick' | 'prismarine_shard' | 'prismarine_crystals' | 'rabbit' | 'cooked_rabbit' | 'rabbit_stew' | 'rabbit_foot' | 'rabbit_hide' | 'armor_stand' | 'iron_horse_armor' | 'golden_horse_armor' | 'diamond_horse_armor' | 'leather_horse_armor' | 'lead' | 'name_tag' | 'command_block_minecart' | 'mutton' | 'cooked_mutton' | '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' | 'end_crystal' | 'chorus_fruit' | 'popped_chorus_fruit' | 'torchflower_seeds' | 'pitcher_pod' | 'beetroot' | 'beetroot_seeds' | 'beetroot_soup' | 'dragon_breath' | 'splash_potion' | 'spectral_arrow' | 'tipped_arrow' | 'lingering_potion' | 'shield' | 'totem_of_undying' | 'shulker_shell' | 'iron_nugget' | 'knowledge_book' | 'debug_stick' | 'music_disc_13' | 'music_disc_cat' | 'music_disc_blocks' | 'music_disc_chirp' | 'music_disc_far' | 'music_disc_mall' | 'music_disc_mellohi' | 'music_disc_stal' | 'music_disc_strad' | 'music_disc_ward' | 'music_disc_11' | 'music_disc_wait' | 'music_disc_otherside' | 'music_disc_relic' | 'music_disc_5' | 'music_disc_pigstep' | 'disc_fragment_5' | 'trident' | 'phantom_membrane' | 'nautilus_shell' | 'heart_of_the_sea' | 'crossbow' | 'suspicious_stew' | 'loom' | 'flower_banner_pattern' | 'creeper_banner_pattern' | 'skull_banner_pattern' | 'mojang_banner_pattern' | 'globe_banner_pattern' | 'piglin_banner_pattern' | 'goat_horn' | 'composter' | 'barrel' | 'smoker' | 'blast_furnace' | 'cartography_table' | 'fletching_table' | 'grindstone' | 'smithing_table' | 'stonecutter' | 'bell' | 'lantern' | 'soul_lantern' | 'sweet_berries' | 'glow_berries' | 'campfire' | 'soul_campfire' | 'shroomlight' | 'honeycomb' | 'bee_nest' | 'beehive' | 'honey_bottle' | 'honeycomb_block' | 'lodestone' | 'crying_obsidian' | 'blackstone' | 'blackstone_slab' | 'blackstone_stairs' | 'gilded_blackstone' | 'polished_blackstone' | 'polished_blackstone_slab' | 'polished_blackstone_stairs' | 'chiseled_polished_blackstone' | 'polished_blackstone_bricks' | 'polished_blackstone_brick_slab' | 'polished_blackstone_brick_stairs' | 'cracked_polished_blackstone_bricks' | 'respawn_anchor' | 'candle' | 'white_candle' | 'orange_candle' | 'magenta_candle' | 'light_blue_candle' | 'yellow_candle' | 'lime_candle' | 'pink_candle' | 'gray_candle' | 'light_gray_candle' | 'cyan_candle' | 'purple_candle' | 'blue_candle' | 'brown_candle' | 'green_candle' | 'red_candle' | 'black_candle' | 'small_amethyst_bud' | 'medium_amethyst_bud' | 'large_amethyst_bud' | 'amethyst_cluster' | 'pointed_dripstone' | 'ochre_froglight' | 'verdant_froglight' | 'pearlescent_froglight' | 'frogspawn' | 'echo_shard' | 'brush' | 'netherite_upgrade_smithing_template' | 'sentry_armor_trim_smithing_template' | 'dune_armor_trim_smithing_template' | 'coast_armor_trim_smithing_template' | 'wild_armor_trim_smithing_template' | 'ward_armor_trim_smithing_template' | 'eye_armor_trim_smithing_template' | 'vex_armor_trim_smithing_template' | 'tide_armor_trim_smithing_template' | 'snout_armor_trim_smithing_template' | 'rib_armor_trim_smithing_template' | 'spire_armor_trim_smithing_template' | 'wayfinder_armor_trim_smithing_template' | 'shaper_armor_trim_smithing_template' | 'silence_armor_trim_smithing_template' | 'raiser_armor_trim_smithing_template' | 'host_armor_trim_smithing_template' | 'angler_pottery_sherd' | 'archer_pottery_sherd' | 'arms_up_pottery_sherd' | 'blade_pottery_sherd' | 'brewer_pottery_sherd' | 'burn_pottery_sherd' | 'danger_pottery_sherd' | 'explorer_pottery_sherd' | 'friend_pottery_sherd' | 'heart_pottery_sherd' | 'heartbreak_pottery_sherd' | 'howl_pottery_sherd' | 'miner_pottery_sherd' | 'mourner_pottery_sherd' | 'plenty_pottery_sherd' | 'prize_pottery_sherd' | 'sheaf_pottery_sherd' | 'shelter_pottery_sherd' | 'skull_pottery_sherd' | 'snort_pottery_sherd'; -export type EntityNames = 'allay' | 'area_effect_cloud' | 'armor_stand' | 'arrow' | 'axolotl' | 'bat' | 'bee' | 'blaze' | 'block_display' | 'boat' | 'camel' | 'cat' | 'cave_spider' | 'chest_boat' | 'chest_minecart' | 'chicken' | 'cod' | 'command_block_minecart' | 'cow' | 'creeper' | 'dolphin' | 'donkey' | 'dragon_fireball' | 'drowned' | 'egg' | 'elder_guardian' | 'end_crystal' | 'ender_dragon' | 'ender_pearl' | 'enderman' | 'endermite' | 'evoker' | 'evoker_fangs' | 'experience_bottle' | 'experience_orb' | 'eye_of_ender' | 'falling_block' | 'firework_rocket' | 'fox' | 'frog' | 'furnace_minecart' | 'ghast' | 'giant' | 'glow_item_frame' | 'glow_squid' | 'goat' | 'guardian' | 'hoglin' | 'hopper_minecart' | 'horse' | 'husk' | 'illusioner' | 'interaction' | 'iron_golem' | 'item' | 'item_display' | 'item_frame' | 'fireball' | 'leash_knot' | 'lightning_bolt' | 'llama' | 'llama_spit' | 'magma_cube' | 'marker' | 'minecart' | 'mooshroom' | 'mule' | 'ocelot' | 'painting' | 'panda' | 'parrot' | 'phantom' | 'pig' | 'piglin' | 'piglin_brute' | 'pillager' | 'polar_bear' | 'potion' | 'pufferfish' | 'rabbit' | 'ravager' | 'salmon' | 'sheep' | 'shulker' | 'shulker_bullet' | 'silverfish' | 'skeleton' | 'skeleton_horse' | 'slime' | 'small_fireball' | 'sniffer' | 'snow_golem' | 'snowball' | 'spawner_minecart' | 'spectral_arrow' | 'spider' | 'squid' | 'stray' | 'strider' | 'tadpole' | 'text_display' | 'tnt' | 'tnt_minecart' | 'trader_llama' | 'trident' | 'tropical_fish' | 'turtle' | 'vex' | 'villager' | 'vindicator' | 'wandering_trader' | 'warden' | 'witch' | 'wither' | 'wither_skeleton' | 'wither_skull' | 'wolf' | 'zoglin' | 'zombie' | 'zombie_horse' | 'zombie_villager' | 'zombified_piglin' | 'player' | 'fishing_bobber'; -export type BiomesNames = 'badlands' | 'bamboo_jungle' | 'basalt_deltas' | 'beach' | 'birch_forest' | 'cherry_grove' | 'cold_ocean' | 'crimson_forest' | 'dark_forest' | 'deep_cold_ocean' | 'deep_dark' | 'deep_frozen_ocean' | 'deep_lukewarm_ocean' | 'deep_ocean' | 'desert' | 'dripstone_caves' | 'end_barrens' | 'end_highlands' | 'end_midlands' | 'eroded_badlands' | 'flower_forest' | 'forest' | 'frozen_ocean' | 'frozen_peaks' | 'frozen_river' | 'grove' | 'ice_spikes' | 'jagged_peaks' | 'jungle' | 'lukewarm_ocean' | 'lush_caves' | 'mangrove_swamp' | 'meadow' | 'mushroom_fields' | 'nether_wastes' | 'ocean' | 'old_growth_birch_forest' | 'old_growth_pine_taiga' | 'old_growth_spruce_taiga' | 'plains' | 'river' | 'savanna' | 'savanna_plateau' | 'small_end_islands' | 'snowy_beach' | 'snowy_plains' | 'snowy_slopes' | 'snowy_taiga' | 'soul_sand_valley' | 'sparse_jungle' | 'stony_peaks' | 'stony_shore' | 'sunflower_plains' | 'swamp' | 'taiga' | 'the_end' | 'the_void' | 'warm_ocean' | 'warped_forest' | 'windswept_forest' | 'windswept_gravelly_hills' | 'windswept_hills' | 'windswept_savanna' | 'wooded_badlands'; -export type EnchantmentNames = 'protection' | 'fire_protection' | 'feather_falling' | 'blast_protection' | 'projectile_protection' | 'respiration' | 'aqua_affinity' | 'thorns' | 'depth_strider' | 'frost_walker' | 'binding_curse' | 'soul_speed' | 'swift_sneak' | 'sharpness' | 'smite' | 'bane_of_arthropods' | 'knockback' | 'fire_aspect' | 'looting' | 'sweeping' | 'efficiency' | 'silk_touch' | 'unbreaking' | 'fortune' | 'power' | 'punch' | 'flame' | 'infinity' | 'luck_of_the_sea' | 'lure' | 'loyalty' | 'impaling' | 'riptide' | 'channeling' | 'multishot' | 'quick_charge' | 'piercing' | 'mending' | 'vanishing_curse'; - -export type EntityMetadataVersions = { -'Mob': {},'Monster': {},'Creeper': {},'Skeleton': {},'Spider': {},'Giant': {},'Zombie': {},'Slime': {},'Ghast': {},'PigZombie': {},'Enderman': {},'CaveSpider': {},'Silverfish': {},'Blaze': {},'LavaSlime': {},'EnderDragon': {},'WitherBoss': {},'Bat': {},'Witch': {},'Endermite': {},'Guardian': {},'Pig': {},'Sheep': {},'Cow': {},'Chicken': {},'Squid': {},'Wolf': {},'MushroomCow': {},'SnowMan': {},'Ozelot': {},'VillagerGolem': {},'EntityHorse': {},'Rabbit': {},'Villager': {},'Boat': {},'Item': {},'MinecartRideable': {},'PrimedTnt': {},'EnderCrystal': {},'Arrow': {},'Snowball': {},'ThrownEgg': {},'Fireball': {},'SmallFireball': {},'ThrownEnderpearl': {},'WitherSkull': {},'FallingSand': {},'ItemFrame': {},'EyeOfEnderSignal': {},'ThrownPotion': {},'ThrownExpBottle': {},'FireworksRocketEntity': {},'LeashKnot': {},'ArmorStand': {},'Fishing Float': {},'Shulker': {},'XPOrb': {},'Dragon Fireball': {},'item': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'item': string;},'xp_orb': {},'area_effect_cloud': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'radius': string; -/** 1.19.4+ (9) */ -'color': string; -/** 1.19.4+ (10) */ -'waiting': string; -/** 1.19.4+ (11) */ -'particle': string;},'elder_guardian': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'moving': string; -/** 1.19.4+ (17) */ -'attack_target': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'wither_skeleton': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'stray': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'egg': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'item_stack': string;},'leash_knot': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string;},'painting': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'painting_variant': string;},'arrow': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'flags': string; -/** 1.19.4+ (9) */ -'pierce_level': string; -/** 1.19.4+ (10) */ -'effect_color': string;},'snowball': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'item_stack': string;},'fireball': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'item_stack': string;},'small_fireball': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'item_stack': string;},'ender_pearl': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'item_stack': string;},'eye_of_ender_signal': {},'potion': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'item_stack': string;},'xp_bottle': {},'item_frame': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'item': string; -/** 1.19.4+ (9) */ -'rotation': string;},'wither_skull': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'dangerous': string;},'tnt': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'fuse': string; -/** 1.20.3+ (9) */ -'block_state': string;},'falling_block': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'start_pos': string;},'fireworks_rocket': {},'husk': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'special_type': string; -/** 1.19.4+ (18) */ -'drowned_conversion': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'spectral_arrow': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'flags': string; -/** 1.19.4+ (9) */ -'pierce_level': string;},'shulker_bullet': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string;},'dragon_fireball': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string;},'zombie_villager': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'special_type': string; -/** 1.19.4+ (18) */ -'drowned_conversion': string; -/** 1.19.4+ (19) */ -'converting': string; -/** 1.19.4+ (20) */ -'villager_data': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'skeleton_horse': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'flags': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'zombie_horse': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'flags': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'armor_stand': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'client_flags': string; -/** 1.19.4+ (16) */ -'head_pose': string; -/** 1.19.4+ (17) */ -'body_pose': string; -/** 1.19.4+ (18) */ -'left_arm_pose': string; -/** 1.19.4+ (19) */ -'right_arm_pose': string; -/** 1.19.4+ (20) */ -'left_leg_pose': string; -/** 1.19.4+ (21) */ -'right_leg_pose': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'donkey': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'flags': string; -/** 1.19.4+ (18) */ -'chest': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'mule': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'flags': string; -/** 1.19.4+ (18) */ -'chest': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'evocation_fangs': {},'evocation_illager': {},'vex': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'flags': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'vindication_illager': {},'commandblock_minecart': {},'boat': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'hurt': string; -/** 1.19.4+ (9) */ -'hurtdir': string; -/** 1.19.4+ (10) */ -'damage': string; -/** 1.19.4+ (11) */ -'type': string; -/** 1.19.4+ (12) */ -'paddle_left': string; -/** 1.19.4+ (13) */ -'paddle_right': string; -/** 1.19.4+ (14) */ -'bubble_time': string;},'minecart': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'hurt': string; -/** 1.19.4+ (9) */ -'hurtdir': string; -/** 1.19.4+ (10) */ -'damage': string; -/** 1.19.4+ (11) */ -'display_block': string; -/** 1.19.4+ (12) */ -'display_offset': string; -/** 1.19.4+ (13) */ -'custom_display': string;},'chest_minecart': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'hurt': string; -/** 1.19.4+ (9) */ -'hurtdir': string; -/** 1.19.4+ (10) */ -'damage': string; -/** 1.19.4+ (11) */ -'display_block': string; -/** 1.19.4+ (12) */ -'display_offset': string; -/** 1.19.4+ (13) */ -'custom_display': string;},'furnace_minecart': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'hurt': string; -/** 1.19.4+ (9) */ -'hurtdir': string; -/** 1.19.4+ (10) */ -'damage': string; -/** 1.19.4+ (11) */ -'display_block': string; -/** 1.19.4+ (12) */ -'display_offset': string; -/** 1.19.4+ (13) */ -'custom_display': string; -/** 1.19.4+ (14) */ -'fuel': string;},'tnt_minecart': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'hurt': string; -/** 1.19.4+ (9) */ -'hurtdir': string; -/** 1.19.4+ (10) */ -'damage': string; -/** 1.19.4+ (11) */ -'display_block': string; -/** 1.19.4+ (12) */ -'display_offset': string; -/** 1.19.4+ (13) */ -'custom_display': string;},'hopper_minecart': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'hurt': string; -/** 1.19.4+ (9) */ -'hurtdir': string; -/** 1.19.4+ (10) */ -'damage': string; -/** 1.19.4+ (11) */ -'display_block': string; -/** 1.19.4+ (12) */ -'display_offset': string; -/** 1.19.4+ (13) */ -'custom_display': string;},'spawner_minecart': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'hurt': string; -/** 1.19.4+ (9) */ -'hurtdir': string; -/** 1.19.4+ (10) */ -'damage': string; -/** 1.19.4+ (11) */ -'display_block': string; -/** 1.19.4+ (12) */ -'display_offset': string; -/** 1.19.4+ (13) */ -'custom_display': string;},'creeper': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'swell_dir': string; -/** 1.19.4+ (17) */ -'is_powered': string; -/** 1.19.4+ (18) */ -'is_ignited': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'skeleton': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'stray_conversion': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'spider': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'flags': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'giant': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'zombie': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'special_type': string; -/** 1.19.4+ (18) */ -'drowned_conversion': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'slime': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'size': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'ghast': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'is_charging': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'zombie_pigman': {},'enderman': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'carry_state': string; -/** 1.19.4+ (17) */ -'creepy': string; -/** 1.19.4+ (18) */ -'stared_at': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'cave_spider': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'flags': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'silverfish': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'blaze': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'flags': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'magma_cube': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'size': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'ender_dragon': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'phase': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'wither': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'target_a': string; -/** 1.19.4+ (17) */ -'target_b': string; -/** 1.19.4+ (18) */ -'target_c': string; -/** 1.19.4+ (19) */ -'inv': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'bat': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'flags': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'witch': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'is_celebrating': string; -/** 1.19.4+ (17) */ -'using_item': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'endermite': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'guardian': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'moving': string; -/** 1.19.4+ (17) */ -'attack_target': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'shulker': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'attach_face': string; -/** 1.19.4+ (17) */ -'peek': string; -/** 1.19.4+ (18) */ -'color': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'pig': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'saddle': string; -/** 1.19.4+ (18) */ -'boost_time': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'sheep': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'wool': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'cow': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'chicken': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'squid': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'wolf': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'flags': string; -/** 1.19.4+ (18) */ -'owneruuid': string; -/** 1.19.4+ (19) */ -'interested': string; -/** 1.19.4+ (20) */ -'collar_color': string; -/** 1.19.4+ (21) */ -'remaining_anger_time': string; -/** 1.20.5+ (10) */ -'effect_particles': string; -/** 1.20.5+ (22) */ -'variant': string;},'mooshroom': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'type': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'snowman': {},'ocelot': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'trusting': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'villager_golem': {},'horse': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'flags': string; -/** 1.19.4+ (18) */ -'type_variant': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'rabbit': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'type': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'polar_bear': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'standing': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'llama': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'flags': string; -/** 1.19.4+ (18) */ -'chest': string; -/** 1.19.4+ (19) */ -'strength': string; -/** 1.19.4+ (20) */ -'swag': string; -/** 1.19.4+ (21) */ -'variant': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'llama_spit': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string;},'villager': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'unhappy_counter': string; -/** 1.19.4+ (18) */ -'villager_data': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'ender_crystal': {},'Fishing Hook': {},'illusion_illager': {},'parrot': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'flags': string; -/** 1.19.4+ (18) */ -'owneruuid': string; -/** 1.19.4+ (19) */ -'variant': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'cod': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'from_bucket': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'dolphin': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'treasure_pos': string; -/** 1.19.4+ (17) */ -'got_fish': string; -/** 1.19.4+ (18) */ -'moistness_level': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'drowned': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'special_type': string; -/** 1.19.4+ (18) */ -'drowned_conversion': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'end_crystal': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'beam_target': string; -/** 1.19.4+ (9) */ -'show_bottom': string;},'evoker_fangs': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string;},'evoker': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'is_celebrating': string; -/** 1.19.4+ (17) */ -'spell_casting': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'experience_orb': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string;},'eye_of_ender': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'item_stack': string;},'illusioner': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'is_celebrating': string; -/** 1.19.4+ (17) */ -'spell_casting': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'pufferfish': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'from_bucket': string; -/** 1.19.4+ (17) */ -'puff_state': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'salmon': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'from_bucket': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'snow_golem': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'pumpkin': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'tropical_fish': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'from_bucket': string; -/** 1.19.4+ (17) */ -'type_variant': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'turtle': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'home_pos': string; -/** 1.19.4+ (18) */ -'has_egg': string; -/** 1.19.4+ (19) */ -'laying_egg': string; -/** 1.19.4+ (20) */ -'travel_pos': string; -/** 1.19.4+ (21) */ -'going_home': string; -/** 1.19.4+ (22) */ -'travelling': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'experience_bottle': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'item_stack': string;},'iron_golem}': {},'vindicator': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'is_celebrating': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'phantom': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'size': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'lightning_bolt': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string;},'player': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'player_absorption': string; -/** 1.19.4+ (16) */ -'score': string; -/** 1.19.4+ (17) */ -'player_mode_customisation': string; -/** 1.19.4+ (18) */ -'player_main_hand': string; -/** 1.19.4+ (19) */ -'shoulder_left': string; -/** 1.19.4+ (20) */ -'shoulder_right': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'fishing_bobber': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'hooked_entity': string; -/** 1.19.4+ (9) */ -'biting': string;},'trident': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'flags': string; -/** 1.19.4+ (9) */ -'pierce_level': string; -/** 1.19.4+ (10) */ -'loyalty': string; -/** 1.19.4+ (11) */ -'foil': string;},'item_stack': {},'area_effect cloud': {},'activated_tnt': {},'endercrystal': {},'tipped_arrow': {},'firecharge': {},'thrown_enderpearl': {},'falling_objects': {},'item_frames': {},'eye_of ender': {},'thrown_potion': {},'thrown_exp bottle': {},'firework_rocket': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'fireworks_item': string; -/** 1.19.4+ (9) */ -'attached_to_target': string; -/** 1.19.4+ (10) */ -'shot_at_angle': string;},'armorstand': {},'fishing_hook': {},'cat': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'flags': string; -/** 1.19.4+ (18) */ -'owneruuid': string; -/** 1.19.4+ (19) */ -'variant': string; -/** 1.19.4+ (20) */ -'is_lying': string; -/** 1.19.4+ (21) */ -'relax_state_one': string; -/** 1.19.4+ (22) */ -'collar_color': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'fox': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'type': string; -/** 1.19.4+ (18) */ -'flags': string; -/** 1.19.4+ (19) */ -'trusted_0': string; -/** 1.19.4+ (20) */ -'trusted_1': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'command_block_minecart': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'hurt': string; -/** 1.19.4+ (9) */ -'hurtdir': string; -/** 1.19.4+ (10) */ -'damage': string; -/** 1.19.4+ (11) */ -'display_block': string; -/** 1.19.4+ (12) */ -'display_offset': string; -/** 1.19.4+ (13) */ -'custom_display': string; -/** 1.19.4+ (14) */ -'command_name': string; -/** 1.19.4+ (15) */ -'last_output': string;},'panda': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'unhappy_counter': string; -/** 1.19.4+ (18) */ -'sneeze_counter': string; -/** 1.19.4+ (19) */ -'eat_counter': string; -/** 1.19.4+ (20) */ -'main_gene': string; -/** 1.19.4+ (21) */ -'hidden_gene': string; -/** 1.19.4+ (22) */ -'flags': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'trader_llama': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'flags': string; -/** 1.19.4+ (18) */ -'chest': string; -/** 1.19.4+ (19) */ -'strength': string; -/** 1.19.4+ (20) */ -'swag': string; -/** 1.19.4+ (21) */ -'variant': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'iron_golem': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'flags': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'pillager': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'is_celebrating': string; -/** 1.19.4+ (17) */ -'is_charging_crossbow': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'wandering_trader': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'unhappy_counter': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'ravager': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'is_celebrating': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'bee': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'flags': string; -/** 1.19.4+ (18) */ -'remaining_anger_time': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'hoglin': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'immune_to_zombification': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'piglin': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'immune_to_zombification': string; -/** 1.19.4+ (17) */ -'baby': string; -/** 1.19.4+ (18) */ -'is_charging_crossbow': string; -/** 1.19.4+ (19) */ -'is_dancing': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'strider': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'boost_time': string; -/** 1.19.4+ (18) */ -'suffocating': string; -/** 1.19.4+ (19) */ -'saddle': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'zoglin': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'zombified_piglin': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'special_type': string; -/** 1.19.4+ (18) */ -'drowned_conversion': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'piglin_brute': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'immune_to_zombification': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'axolotl': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'variant': string; -/** 1.19.4+ (18) */ -'playing_dead': string; -/** 1.19.4+ (19) */ -'from_bucket': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'glow_item_frame': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'item': string; -/** 1.19.4+ (9) */ -'rotation': string;},'glow_squid': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'dark_ticks_remaining': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'goat': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'is_screaming_goat': string; -/** 1.19.4+ (18) */ -'has_left_horn': string; -/** 1.19.4+ (19) */ -'has_right_horn': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'marker': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string;},'allay': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'dancing': string; -/** 1.19.4+ (17) */ -'can_duplicate': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'chest_boat': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'hurt': string; -/** 1.19.4+ (9) */ -'hurtdir': string; -/** 1.19.4+ (10) */ -'damage': string; -/** 1.19.4+ (11) */ -'type': string; -/** 1.19.4+ (12) */ -'paddle_left': string; -/** 1.19.4+ (13) */ -'paddle_right': string; -/** 1.19.4+ (14) */ -'bubble_time': string;},'frog': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'variant': string; -/** 1.19.4+ (18) */ -'tongue_target': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'tadpole': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'from_bucket': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'warden': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'client_anger_level': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'camel': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'flags': string; -/** 1.19.4+ (18) */ -'dash': string; -/** 1.19.4+ (19) */ -'last_pose_change_tick': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'block_display': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'interpolation_start_delta_ticks': string; -/** 1.19.4+ (9) */ -'interpolation_duration': string; -/** 1.19.4+ (10) */ -'translation': string; -/** 1.19.4+ (11) */ -'scale': string; -/** 1.19.4+ (12) */ -'left_rotation': string; -/** 1.19.4+ (13) */ -'right_rotation': string; -/** 1.19.4+ (14) */ -'billboard_render_constraints': string; -/** 1.19.4+ (15) */ -'brightness_override': string; -/** 1.19.4+ (16) */ -'view_range': string; -/** 1.19.4+ (17) */ -'shadow_radius': string; -/** 1.19.4+ (18) */ -'shadow_strength': string; -/** 1.19.4+ (19) */ -'width': string; -/** 1.19.4+ (20) */ -'height': string; -/** 1.19.4+ (21) */ -'glow_color_override': string; -/** 1.19.4+ (22) */ -'block_state': string; -/** 1.20.2+ (8) */ -'transformation_interpolation_start_delta_ticks': string; -/** 1.20.2+ (9) */ -'transformation_interpolation_duration': string; -/** 1.20.2+ (10) */ -'pos_rot_interpolation_duration': string;},'interaction': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'width': string; -/** 1.19.4+ (9) */ -'height': string; -/** 1.19.4+ (10) */ -'response': string;},'item_display': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'interpolation_start_delta_ticks': string; -/** 1.19.4+ (9) */ -'interpolation_duration': string; -/** 1.19.4+ (10) */ -'translation': string; -/** 1.19.4+ (11) */ -'scale': string; -/** 1.19.4+ (12) */ -'left_rotation': string; -/** 1.19.4+ (13) */ -'right_rotation': string; -/** 1.19.4+ (14) */ -'billboard_render_constraints': string; -/** 1.19.4+ (15) */ -'brightness_override': string; -/** 1.19.4+ (16) */ -'view_range': string; -/** 1.19.4+ (17) */ -'shadow_radius': string; -/** 1.19.4+ (18) */ -'shadow_strength': string; -/** 1.19.4+ (19) */ -'width': string; -/** 1.19.4+ (20) */ -'height': string; -/** 1.19.4+ (21) */ -'glow_color_override': string; -/** 1.19.4+ (22) */ -'item_stack': string; -/** 1.19.4+ (23) */ -'item_display': string; -/** 1.20.2+ (8) */ -'transformation_interpolation_start_delta_ticks': string; -/** 1.20.2+ (9) */ -'transformation_interpolation_duration': string; -/** 1.20.2+ (10) */ -'pos_rot_interpolation_duration': string;},'sniffer': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'living_entity_flags': string; -/** 1.19.4+ (9) */ -'health': string; -/** 1.19.4+ (10) */ -'effect_color': string; -/** 1.19.4+ (11) */ -'effect_ambience': string; -/** 1.19.4+ (12) */ -'arrow_count': string; -/** 1.19.4+ (13) */ -'stinger_count': string; -/** 1.19.4+ (14) */ -'sleeping_pos': string; -/** 1.19.4+ (15) */ -'mob_flags': string; -/** 1.19.4+ (16) */ -'baby': string; -/** 1.19.4+ (17) */ -'state': string; -/** 1.19.4+ (18) */ -'drop_seed_at_tick': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'text_display': { -/** 1.19.4+ (0) */ -'shared_flags': string; -/** 1.19.4+ (1) */ -'air_supply': string; -/** 1.19.4+ (2) */ -'custom_name': string; -/** 1.19.4+ (3) */ -'custom_name_visible': string; -/** 1.19.4+ (4) */ -'silent': string; -/** 1.19.4+ (5) */ -'no_gravity': string; -/** 1.19.4+ (6) */ -'pose': string; -/** 1.19.4+ (7) */ -'ticks_frozen': string; -/** 1.19.4+ (8) */ -'interpolation_start_delta_ticks': string; -/** 1.19.4+ (9) */ -'interpolation_duration': string; -/** 1.19.4+ (10) */ -'translation': string; -/** 1.19.4+ (11) */ -'scale': string; -/** 1.19.4+ (12) */ -'left_rotation': string; -/** 1.19.4+ (13) */ -'right_rotation': string; -/** 1.19.4+ (14) */ -'billboard_render_constraints': string; -/** 1.19.4+ (15) */ -'brightness_override': string; -/** 1.19.4+ (16) */ -'view_range': string; -/** 1.19.4+ (17) */ -'shadow_radius': string; -/** 1.19.4+ (18) */ -'shadow_strength': string; -/** 1.19.4+ (19) */ -'width': string; -/** 1.19.4+ (20) */ -'height': string; -/** 1.19.4+ (21) */ -'glow_color_override': string; -/** 1.19.4+ (22) */ -'text': string; -/** 1.19.4+ (23) */ -'line_width': string; -/** 1.19.4+ (24) */ -'background_color': string; -/** 1.19.4+ (25) */ -'text_opacity': string; -/** 1.19.4+ (26) */ -'style_flags': string; -/** 1.20.2+ (8) */ -'transformation_interpolation_start_delta_ticks': string; -/** 1.20.2+ (9) */ -'transformation_interpolation_duration': string; -/** 1.20.2+ (10) */ -'pos_rot_interpolation_duration': string;},'breeze': { -/** 1.20.3+ (0) */ -'shared_flags': string; -/** 1.20.3+ (1) */ -'air_supply': string; -/** 1.20.3+ (2) */ -'custom_name': string; -/** 1.20.3+ (3) */ -'custom_name_visible': string; -/** 1.20.3+ (4) */ -'silent': string; -/** 1.20.3+ (5) */ -'no_gravity': string; -/** 1.20.3+ (6) */ -'pose': string; -/** 1.20.3+ (7) */ -'ticks_frozen': string; -/** 1.20.3+ (8) */ -'living_entity_flags': string; -/** 1.20.3+ (9) */ -'health': string; -/** 1.20.3+ (10) */ -'effect_color': string; -/** 1.20.3+ (11) */ -'effect_ambience': string; -/** 1.20.3+ (12) */ -'arrow_count': string; -/** 1.20.3+ (13) */ -'stinger_count': string; -/** 1.20.3+ (14) */ -'sleeping_pos': string; -/** 1.20.3+ (15) */ -'mob_flags': string; -/** 1.20.5+ (10) */ -'effect_particles': string;},'wind_charge': { -/** 1.20.3+ (0) */ -'shared_flags': string; -/** 1.20.3+ (1) */ -'air_supply': string; -/** 1.20.3+ (2) */ -'custom_name': string; -/** 1.20.3+ (3) */ -'custom_name_visible': string; -/** 1.20.3+ (4) */ -'silent': string; -/** 1.20.3+ (5) */ -'no_gravity': string; -/** 1.20.3+ (6) */ -'pose': string; -/** 1.20.3+ (7) */ -'ticks_frozen': string;},'armadillo': { -/** 1.20.5+ (0) */ -'shared_flags': string; -/** 1.20.5+ (1) */ -'air_supply': string; -/** 1.20.5+ (2) */ -'custom_name': string; -/** 1.20.5+ (3) */ -'custom_name_visible': string; -/** 1.20.5+ (4) */ -'silent': string; -/** 1.20.5+ (5) */ -'no_gravity': string; -/** 1.20.5+ (6) */ -'pose': string; -/** 1.20.5+ (7) */ -'ticks_frozen': string; -/** 1.20.5+ (8) */ -'living_entity_flags': string; -/** 1.20.5+ (9) */ -'health': string; -/** 1.20.5+ (10) */ -'effect_particles': string; -/** 1.20.5+ (11) */ -'effect_ambience': string; -/** 1.20.5+ (12) */ -'arrow_count': string; -/** 1.20.5+ (13) */ -'stinger_count': string; -/** 1.20.5+ (14) */ -'sleeping_pos': string; -/** 1.20.5+ (15) */ -'mob_flags': string; -/** 1.20.5+ (16) */ -'baby': string; -/** 1.20.5+ (17) */ -'armadillo_state': string;},'bogged': { -/** 1.20.5+ (0) */ -'shared_flags': string; -/** 1.20.5+ (1) */ -'air_supply': string; -/** 1.20.5+ (2) */ -'custom_name': string; -/** 1.20.5+ (3) */ -'custom_name_visible': string; -/** 1.20.5+ (4) */ -'silent': string; -/** 1.20.5+ (5) */ -'no_gravity': string; -/** 1.20.5+ (6) */ -'pose': string; -/** 1.20.5+ (7) */ -'ticks_frozen': string; -/** 1.20.5+ (8) */ -'living_entity_flags': string; -/** 1.20.5+ (9) */ -'health': string; -/** 1.20.5+ (10) */ -'effect_particles': string; -/** 1.20.5+ (11) */ -'effect_ambience': string; -/** 1.20.5+ (12) */ -'arrow_count': string; -/** 1.20.5+ (13) */ -'stinger_count': string; -/** 1.20.5+ (14) */ -'sleeping_pos': string; -/** 1.20.5+ (15) */ -'mob_flags': string; -/** 1.20.5+ (16) */ -'sheared': string;},'breeze_wind_charge': { -/** 1.20.5+ (0) */ -'shared_flags': string; -/** 1.20.5+ (1) */ -'air_supply': string; -/** 1.20.5+ (2) */ -'custom_name': string; -/** 1.20.5+ (3) */ -'custom_name_visible': string; -/** 1.20.5+ (4) */ -'silent': string; -/** 1.20.5+ (5) */ -'no_gravity': string; -/** 1.20.5+ (6) */ -'pose': string; -/** 1.20.5+ (7) */ -'ticks_frozen': string;},'ominous_item_spawner': { -/** 1.20.5+ (0) */ -'shared_flags': string; -/** 1.20.5+ (1) */ -'air_supply': string; -/** 1.20.5+ (2) */ -'custom_name': string; -/** 1.20.5+ (3) */ -'custom_name_visible': string; -/** 1.20.5+ (4) */ -'silent': string; -/** 1.20.5+ (5) */ -'no_gravity': string; -/** 1.20.5+ (6) */ -'pose': string; -/** 1.20.5+ (7) */ -'ticks_frozen': string; -/** 1.20.5+ (8) */ -'item': string;}, -} \ No newline at end of file diff --git a/src/mcTypes.ts b/src/mcTypes.ts deleted file mode 100644 index ebb4f560..00000000 --- a/src/mcTypes.ts +++ /dev/null @@ -1,165 +0,0 @@ - -// todo move from here - -//@ts-format-ignore-region -// 1.8.8 -export interface LevelDat { - WorldGenSettings?: WorldGenSettings; - RandomSeed: number[]; - generatorName?: string; - BorderCenterX: number; - BorderCenterZ: number; - Difficulty: number; - DifficultyLocked: number; - BorderSizeLerpTime: number[]; - Version?: { - Name: string - // id, snapshot - } - /** 0,1 */ - raining: number; - Time: number[]; - GameType: number; - MapFeatures: number; - BorderDamagePerBlock: number; - BorderWarningBlocks: number; - BorderSizeLerpTarget: number; - DayTime: number[]; - initialized: number; - allowCommands: number; - SizeOnDisk: number[]; - GameRules: GameRules; - Player: Player; - SpawnY: number; - rainTime: number; - thunderTime: number; - SpawnZ: number; - hardcore: number; - SpawnX: number; - clearWeatherTime: number; - thundering: number; - generatorVersion?: number; - version: number; - BorderSafeZone: number; - generatorOptions?: string; - LastPlayed: number[]; - BorderWarningTime: number; - LevelName: string; - BorderSize: number; -} - -export interface GameRules { - doTileDrops: string; - doFireTick: string; - reducedDebugInfo: string; - naturalRegeneration: string; - doMobLoot: string; - keepInventory: string; - doEntityDrops: string; - mobGriefing: string; - randomTickSpeed: string; - commandBlockOutput: string; - doMobSpawning: string; - logAdminCommands: string; - sendCommandFeedback: string; - doDaylightCycle: string; - showDeathMessages: string; -} - -export interface Player { - HurtByTimestamp: number; - SleepTimer: number; - Attributes: Attribute[]; - Invulnerable: number; - PortalCooldown: number; - AbsorptionAmount: number; - abilities: Abilities; - FallDistance: number; - DeathTime: number; - XpSeed: number; - HealF: number; - XpTotal: number; - playerGameType: number; - SelectedItem: SelectedItem; - Motion: number[]; - UUIDLeast: number[]; - Health: number; - foodSaturationLevel: number; - Air: number; - OnGround: number; - Dimension: number; - Rotation: number[]; - XpLevel: number; - Score: number; - UUIDMost: number[]; - Sleeping: number; - Pos: number[]; - Fire: number; - XpP: number; - EnderItems: any[]; - foodLevel: number; - foodExhaustionLevel: number; - HurtTime: number; - SelectedItemSlot: number; - Inventory: SelectedItem[]; - foodTickTimer: number; -} - -export interface Attribute { - Base: number; - Name: string; -} - -export interface SelectedItem { - Slot?: number; - id: string; - Count: number; - Damage: number; -} - -export interface Abilities { - invulnerable: number; - mayfly: number; - instabuild: number; - walkSpeed: number; - mayBuild: number; - flying: number; - flySpeed: number; -} - -// 1.16+ - -export interface WorldGenSettings { - /** 0,1 */ - bonus_chest: number; - seed: number[]; - /** 0,1 */ - generate_features: number; - dimensions: Dimensions; -} - -export interface Dimensions { - // :overworld, :the_nether, :the_end - [key: string]: WorldGen; -} - -export interface WorldGen { - generator: WorldGenGenerator; - // same as key - type: string; -} - -export interface WorldGenGenerator { - settings: string; - seed: number[]; - biome_source: PurpleBiomeSource; - type: string; -} - -export interface PurpleBiomeSource { - seed: number[]; - /** only for overworld 0,1 */ - large_biomes?: number; - // :noise, :flat, ? - type: string; -} diff --git a/src/microsoftAuthflow.ts b/src/microsoftAuthflow.ts deleted file mode 100644 index d759a7dc..00000000 --- a/src/microsoftAuthflow.ts +++ /dev/null @@ -1,182 +0,0 @@ -export const getProxyDetails = async (proxyBaseUrl: string) => { - if (!proxyBaseUrl.startsWith('http')) proxyBaseUrl = `${isPageSecure() ? 'https' : 'http'}://${proxyBaseUrl}` - const url = `${proxyBaseUrl}/api/vm/net/connect` - let result: Response - try { - result = await fetch(url) - } catch (err) { - throw new Error(`Selected proxy server ${proxyBaseUrl} most likely is down`) - } - return result -} - -export default async ({ tokenCaches, proxyBaseUrl, setProgressText = (text) => { }, setCacheResult, connectingServer }) => { - let onMsaCodeCallback - let connectingVersion = '' - // const authEndpoint = 'http://localhost:3000/' - // const sessionEndpoint = 'http://localhost:3000/session' - let authEndpoint: URL | undefined - let sessionEndpoint: URL | undefined - const result = await getProxyDetails(proxyBaseUrl) - - try { - const json = await result.json() - authEndpoint = urlWithBase(json.capabilities.authEndpoint, proxyBaseUrl) - sessionEndpoint = urlWithBase(json.capabilities.sessionEndpoint, proxyBaseUrl) - if (!authEndpoint) throw new Error('No auth endpoint') - } catch (err) { - console.error(err) - throw new Error(`Selected proxy server ${proxyBaseUrl} does not support Microsoft authentication`) - } - const authFlow = { - async getMinecraftJavaToken () { - setProgressText('Authenticating with Microsoft account') - if (!window.crypto && !isPageSecure()) throw new Error('Crypto API is available only in secure contexts. Be sure to use https!') - let result = null - await fetch(authEndpoint, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - ...tokenCaches, - // important to set this param and not fake it as auth server might reject the request otherwise - connectingServer, - connectingServerVersion: connectingVersion - }), - }) - .catch(e => { - throw new Error(`Failed to connect to auth server (network error): ${e.message}`) - }) - .then(async response => { - if (!response.ok) { - throw new Error(`Auth server error (${response.status}): ${await response.text()}`) - } - - const reader = response.body!.getReader() - const decoder = new TextDecoder('utf8') - - const processText = ({ done, value = undefined as Uint8Array | undefined }) => { - if (done) { - return - } - - const processChunk = (chunkStr) => { - let json: any - try { - json = JSON.parse(chunkStr) - } catch (err) {} - if (!json) return - if (json.user_code) { - onMsaCodeCallback(json) - // this.codeCallback(json) - } - if (json.error) throw new Error(`Auth server error: ${json.error}`) - if (json.token) result = json - if (json.newCache) setCacheResult(json.newCache) - } - - const strings = decoder.decode(value) - - for (const chunk of strings.split('\n\n')) { - processChunk(chunk) - } - - return reader.read().then(processText) - } - return reader.read().then(processText) - }) - const restoredData = await restoreData(result) - if (restoredData?.certificates?.profileKeys?.privatePEM) { - restoredData.certificates.profileKeys.private = restoredData.certificates.profileKeys.privatePEM - } - return restoredData - } - } - return { - authFlow, - sessionEndpoint, - setOnMsaCodeCallback (callback) { - onMsaCodeCallback = callback - }, - setConnectingVersion (version) { - connectingVersion = version - } - } -} - -function isPageSecure (url = window.location.href) { - return !url.startsWith('http:') -} - -// restore dates from strings -const restoreData = async (json) => { - const promises = [] as Array> - if (typeof json === 'object' && json) { - for (const [key, value] of Object.entries(json)) { - if (typeof value === 'string') { - promises.push(tryRestorePublicKey(value, key, json)) - if (value.endsWith('Z')) { - const date = new Date(value) - if (!isNaN(date.getTime())) { - json[key] = date - } - } - } - if (typeof value === 'object') { - // eslint-disable-next-line no-await-in-loop - await restoreData(value) - } - } - } - - await Promise.all(promises) - - return json -} - -const tryRestorePublicKey = async (value: string, name: string, parent: { [x: string]: any }) => { - value = value.trim() - if (!name.endsWith('PEM') || !value.startsWith('-----BEGIN RSA PUBLIC KEY-----') || !value.endsWith('-----END RSA PUBLIC KEY-----')) return - const der = pemToArrayBuffer(value) - const key = await window.crypto.subtle.importKey( - 'spki', // Specify that the data is in SPKI format - der, - { - name: 'RSA-OAEP', - hash: { name: 'SHA-256' } - }, - true, - ['encrypt'] // Specify key usages - ) - const originalName = name.replace('PEM', '') - const exported = await window.crypto.subtle.exportKey('spki', key) - const exportedBuffer = new Uint8Array(exported) - parent[originalName] = { - export () { - return exportedBuffer - } - } -} - -function pemToArrayBuffer (pem) { - // Fetch the part of the PEM string between header and footer - const pemHeader = '-----BEGIN RSA PUBLIC KEY-----' - const pemFooter = '-----END RSA PUBLIC KEY-----' - const pemContents = pem.slice(pemHeader.length, pem.length - pemFooter.length).trim() - const binaryDerString = atob(pemContents.replaceAll(/\s/g, '')) - const binaryDer = new Uint8Array(binaryDerString.length) - for (let i = 0; i < binaryDerString.length; i++) { - binaryDer[i] = binaryDerString.codePointAt(i)! - } - return binaryDer.buffer -} - -const urlWithBase = (url: string, base: string) => { - const defaultBase = isPageSecure() ? 'https' : 'http' - if (!base.startsWith('http')) base = `${defaultBase}://${base}` - const urlObj = new URL(url, base) - base = base.replace(/^https?:\/\//, '') - urlObj.host = base.includes(':') ? base : `${base}:${isPageSecure(base) ? '443' : '80'}` - return urlObj -} diff --git a/src/mineflayer/cameraShake.ts b/src/mineflayer/cameraShake.ts deleted file mode 100644 index 9e271da5..00000000 --- a/src/mineflayer/cameraShake.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { getThreeJsRendererMethods } from 'renderer/viewer/three/threeJsMethods' - -customEvents.on('mineflayerBotCreated', () => { - customEvents.on('hurtAnimation', (yaw) => { - getThreeJsRendererMethods()?.shakeFromDamage() - }) - - bot._client.on('hurt_animation', ({ entityId, yaw }) => { - if (entityId === bot.entity.id) { - customEvents.emit('hurtAnimation', yaw) - } - }) - bot.on('entityHurt', ({ id }) => { - if (id === bot.entity.id) { - customEvents.emit('hurtAnimation') - } - }) - let { health } = bot - bot.on('health', () => { - if (bot.health < health) { - customEvents.emit('hurtAnimation') - } - health = bot.health - }) -}) diff --git a/src/mineflayer/entityStatus.ts b/src/mineflayer/entityStatus.ts deleted file mode 100644 index e13784bc..00000000 --- a/src/mineflayer/entityStatus.ts +++ /dev/null @@ -1,70 +0,0 @@ -export const EntityStatus = { - JUMP: 1, - HURT: 2, // legacy - DEATH: 3, - START_ATTACKING: 4, - STOP_ATTACKING: 5, - TAMING_FAILED: 6, - TAMING_SUCCEEDED: 7, - SHAKE_WETNESS: 8, - USE_ITEM_COMPLETE: 9, - EAT_GRASS: 10, - OFFER_FLOWER: 11, - LOVE_HEARTS: 12, - VILLAGER_ANGRY: 13, - VILLAGER_HAPPY: 14, - WITCH_HAT_MAGIC: 15, - ZOMBIE_CONVERTING: 16, - FIREWORKS_EXPLODE: 17, - IN_LOVE_HEARTS: 18, - SQUID_ANIM_SYNCH: 19, - SILVERFISH_MERGE_ANIM: 20, - GUARDIAN_ATTACK_SOUND: 21, - REDUCED_DEBUG_INFO: 22, - FULL_DEBUG_INFO: 23, - PERMISSION_LEVEL_ALL: 24, - PERMISSION_LEVEL_MODERATORS: 25, - PERMISSION_LEVEL_GAMEMASTERS: 26, - PERMISSION_LEVEL_ADMINS: 27, - PERMISSION_LEVEL_OWNERS: 28, - ATTACK_BLOCKED: 29, - SHIELD_DISABLED: 30, - FISHING_ROD_REEL_IN: 31, - ARMORSTAND_WOBBLE: 32, - THORNED: 33, // legacy - STOP_OFFER_FLOWER: 34, - TALISMAN_ACTIVATE: 35, // legacy - DROWNED: 36, // legacy - BURNED: 37, // legacy - DOLPHIN_LOOKING_FOR_TREASURE: 38, - RAVAGER_STUNNED: 39, - TRUSTING_FAILED: 40, - TRUSTING_SUCCEEDED: 41, - VILLAGER_SWEAT: 42, - BAD_OMEN_TRIGGERED: 43, // legacy - POKED: 44, // legacy - FOX_EAT: 45, - TELEPORT: 46, - MAINHAND_BREAK: 47, - OFFHAND_BREAK: 48, - HEAD_BREAK: 49, - CHEST_BREAK: 50, - LEGS_BREAK: 51, - FEET_BREAK: 52, - HONEY_SLIDE: 53, - HONEY_JUMP: 54, - SWAP_HANDS: 55, - CANCEL_SHAKE_WETNESS: 56, - FROZEN: 57, // legacy - START_RAM: 58, - END_RAM: 59, - POOF: 60, - TENDRILS_SHIVER: 61, - SONIC_CHARGE: 62, - SNIFFER_DIGGING_SOUND: 63, - ARMADILLO_PEEK: 64, - BODY_BREAK: 65, - SHAKE: 66 -} as const - -export type EntityStatusName = keyof typeof EntityStatus diff --git a/src/mineflayer/items.ts b/src/mineflayer/items.ts deleted file mode 100644 index 48d0dfe0..00000000 --- a/src/mineflayer/items.ts +++ /dev/null @@ -1,139 +0,0 @@ -import mojangson from 'mojangson' -import nbt from 'prismarine-nbt' -import { fromFormattedString } from '@xmcl/text-component' -import { getItemSelector, ItemSpecificContextProperties, PlayerStateRenderer } from 'renderer/viewer/lib/basePlayerState' -import { getItemDefinition } from 'mc-assets/dist/itemDefinitions' -import { MessageFormatPart } from '../chatUtils' -import { ResourcesManager, ResourcesManagerCommon, ResourcesManagerTransferred } from '../resourcesManager' - -type RenderSlotComponent = { - type: string, - data: any - // example - // { - // "type": "item_model", - // "data": "aa:ss" - // } -} -export type RenderItem = Pick & { - components?: RenderSlotComponent[], - // componentMap?: Map -} -export type GeneralInputItem = Pick & { - components?: RenderSlotComponent[], - displayName?: string - modelResolved?: boolean -} - -type JsonString = string -type PossibleItemProps = { - CustomModelData?: number - Damage?: number - display?: { Name?: JsonString } // {"text":"Knife","color":"white","italic":"true"} -} - -export const getItemMetadata = (item: GeneralInputItem, resourcesManager: ResourcesManagerCommon) => { - let customText = undefined as string | any | undefined - let customModel = undefined as string | undefined - - let itemId = item.name - if (!itemId.includes(':')) { - itemId = `minecraft:${itemId}` - } - const customModelDataDefinitions = resourcesManager.currentResources?.customItemModelNames[itemId] - - if (item.components) { - const componentMap = new Map() - for (const component of item.components) { - componentMap.set(component.type, component) - } - - const customTextComponent = componentMap.get('custom_name') || componentMap.get('item_name') - if (customTextComponent) { - customText = typeof customTextComponent.data === 'string' ? customTextComponent.data : nbt.simplify(customTextComponent.data) - } - const customModelComponent = componentMap.get('item_model') - if (customModelComponent) { - customModel = customModelComponent.data - } - if (customModelDataDefinitions) { - const customModelDataComponent: any = componentMap.get('custom_model_data') - if (customModelDataComponent?.data) { - let customModelData: number | undefined - if (typeof customModelDataComponent.data === 'number') { - customModelData = customModelDataComponent.data - } else if (typeof customModelDataComponent.data === 'object' - && 'floats' in customModelDataComponent.data - && Array.isArray(customModelDataComponent.data.floats) - && customModelDataComponent.data.floats.length > 0) { - customModelData = customModelDataComponent.data.floats[0] - } - if (customModelData && customModelDataDefinitions[customModelData]) { - customModel = customModelDataDefinitions[customModelData] - } - } - } - const loreComponent = componentMap.get('lore') - if (loreComponent) { - customText ??= item.displayName ?? item.name - // todo test - customText += `\n${JSON.stringify(loreComponent.data)}` - } - } - if (item.nbt) { - const itemNbt: PossibleItemProps = nbt.simplify(item.nbt) - const customName = itemNbt.display?.Name - if (customName) { - customText = customName - } - if (customModelDataDefinitions && itemNbt.CustomModelData && customModelDataDefinitions[itemNbt.CustomModelData]) { - customModel = customModelDataDefinitions[itemNbt.CustomModelData] - } - } - - return { - customText, - customModel - } -} - - -export const getItemNameRaw = (item: Pick | null, resourcesManager: ResourcesManagerCommon) => { - if (!item) return '' - const { customText } = getItemMetadata(item as GeneralInputItem, resourcesManager) - if (!customText) return - try { - if (typeof customText === 'object') { - return customText - } - const parsed = customText.startsWith('{') && customText.endsWith('}') ? mojangson.simplify(mojangson.parse(customText)) : fromFormattedString(customText) - if (parsed.extra) { - return parsed as Record - } else { - return parsed as MessageFormatPart - } - } catch (err) { - return { - text: JSON.stringify(customText) - } - } -} - -export const getItemModelName = (item: GeneralInputItem, specificProps: ItemSpecificContextProperties, resourcesManager: ResourcesManagerCommon, playerState: PlayerStateRenderer) => { - let itemModelName = item.name - const { customModel } = getItemMetadata(item, resourcesManager) - if (customModel) { - itemModelName = customModel - } - - const itemSelector = getItemSelector(playerState, { - ...specificProps - }) - const modelFromDef = getItemDefinition(appViewer.resourcesManager.itemsDefinitionsStore, { - name: itemModelName, - version: appViewer.resourcesManager.currentResources!.version, - properties: itemSelector - })?.model - const model = (modelFromDef === 'minecraft:special' ? undefined : modelFromDef) ?? itemModelName - return model -} diff --git a/src/mineflayer/java-tester/commands.ts b/src/mineflayer/java-tester/commands.ts deleted file mode 100644 index 1925c4d7..00000000 --- a/src/mineflayer/java-tester/commands.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { versionToNumber } from 'flying-squid/dist/utils' - -const customStickNbt = (tags: Record) => { - let cmd = '/give @p stick' - const wrapIntoQuotes = versionToNumber(bot.version) < versionToNumber('1.21.5') - cmd += `[${Object.entries(tags).map(([key, value]) => { - if (typeof value === 'object') { - value = JSON.stringify(value) - } - return `${key}=${wrapIntoQuotes ? `'${value}'` : value}` - }).join(',')}]` - return cmd -} - -const writeCmd = (cmd: string) => { - if (!cmd.startsWith('/')) cmd = `/${cmd}` - console.log('Executing', cmd) - bot.chat(cmd) -} - -let msg = 0 -const LIMIT_MSG = 100 -export const javaServerTester = { - itemCustomLore () { - const cmd = customStickNbt({ - lore: [{ text: 'This Stick is very sticky.' }] - }) - writeCmd(cmd) - }, - - itemCustomModel () { - const cmd = customStickNbt({ - item_model: 'minecraft:diamond' - }) - writeCmd(cmd) - }, - itemCustomModel2 () { - const cmd = customStickNbt({ - item_model: 'diamond' - }) - writeCmd(cmd) - }, - - itemCustomName () { - const cmd = customStickNbt({ - custom_name: [{ text: 'diamond' }] - }) - writeCmd(cmd) - }, - itemCustomName2 () { - const cmd = customStickNbt({ - custom_name: [{ translate: 'item.diamond.name' }] - }) - writeCmd(cmd) - }, - - spamChat () { - for (let i = msg; i < msg + LIMIT_MSG; i++) { - bot.chat('Hello, world, ' + i) - } - msg += LIMIT_MSG - }, - spamChatComplexMessage () { - for (let i = msg; i < msg + LIMIT_MSG; i++) { - bot.chat('/tell @a ' + i) - } - } -} diff --git a/src/mineflayer/java-tester/index.ts b/src/mineflayer/java-tester/index.ts deleted file mode 100644 index d395b8f3..00000000 --- a/src/mineflayer/java-tester/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { javaServerTester } from './commands' - -window.javaServerTester = javaServerTester -customEvents.on('mineflayerBotCreated', () => { - // -}) diff --git a/src/mineflayer/maps.ts b/src/mineflayer/maps.ts deleted file mode 100644 index 5e968205..00000000 --- a/src/mineflayer/maps.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { mapDownloader } from 'mineflayer-item-map-downloader' -import { setImageConverter } from 'mineflayer-item-map-downloader/lib/util' -import { getThreeJsRendererMethods } from 'renderer/viewer/three/threeJsMethods' - -setImageConverter((buf: Uint8Array) => { - const canvas = document.createElement('canvas') - const ctx = canvas.getContext('2d')! - canvas.width = 128 - canvas.height = 128 - const imageData = ctx.createImageData(canvas.width, canvas.height) - imageData.data.set(buf) - ctx.putImageData(imageData, 0, 0) - // data url - return canvas.toDataURL('image/png') -}) - -customEvents.on('mineflayerBotCreated', () => { - bot.on('login', () => { - bot.loadPlugin(mapDownloader) - bot.mapDownloader.on('new_map', ({ png, id }) => { - getThreeJsRendererMethods()?.updateMap(id, png) - }) - }) -}) diff --git a/src/mineflayer/mc-protocol.ts b/src/mineflayer/mc-protocol.ts deleted file mode 100644 index cd21d01f..00000000 --- a/src/mineflayer/mc-protocol.ts +++ /dev/null @@ -1,139 +0,0 @@ -import net from 'net' -import { Client } from 'minecraft-protocol' -import { appQueryParams } from '../appParams' -import { downloadAllMinecraftData, getVersionAutoSelect } from '../connect' -import { gameAdditionalState } from '../globalState' -import { ProgressReporter } from '../core/progressReporter' -import { parseServerAddress } from '../parseServerAddress' -import { getCurrentProxy } from '../react/ServersList' -import { pingServerVersion, validatePacket } from './minecraft-protocol-extra' -import { getWebsocketStream } from './websocket-core' - -let lastPacketTime = 0 -customEvents.on('mineflayerBotCreated', () => { - // const oldParsePacketBuffer = bot._client.deserializer.parsePacketBuffer - // try { - // const parsed = oldParsePacketBuffer(buffer) - // } catch (err) { - // debugger - // reportError(new Error(`Error parsing packet ${buffer.subarray(0, 30).toString('hex')}`, { cause: err })) - // throw err - // } - // } - class MinecraftProtocolError extends Error { - constructor (message: string, cause?: Error, public data?: any) { - if (data?.customPayload) { - message += ` (Custom payload: ${data.customPayload.channel})` - } - super(message, { cause }) - this.name = 'MinecraftProtocolError' - } - } - - const onClientError = (err, data) => { - const error = new MinecraftProtocolError(`Minecraft protocol client error: ${err.message}`, err, data) - reportError(error) - } - if (typeof bot._client['_events'].error === 'function') { - // dont report to bot for more explicit error - bot._client['_events'].error = onClientError - } else { - bot._client.on('error' as any, onClientError) - } - - // todo move more code here - if (!appQueryParams.noPacketsValidation) { - (bot._client as unknown as Client).on('packet', (data, packetMeta, buffer, fullBuffer) => { - validatePacket(packetMeta.name, data, fullBuffer, true) - lastPacketTime = performance.now() - }); - (bot._client as unknown as Client).on('writePacket', (name, params) => { - validatePacket(name, params, Buffer.alloc(0), false) - }) - } -}) - -setInterval(() => { - if (!bot || !lastPacketTime) return - if (bot.player?.ping > 500) { // TODO: we cant rely on server ping 1. weird calculations 2. available with delays instead patch minecraft-protocol to get latency of keep_alive packet - gameAdditionalState.poorConnection = true - } else { - gameAdditionalState.poorConnection = false - } - if (performance.now() - lastPacketTime < 2000) { - gameAdditionalState.noConnection = false - return - } - gameAdditionalState.noConnection = true -}, 1000) - - -export const getServerInfo = async (ip: string, port?: number, preferredVersion = getVersionAutoSelect(), ping = false, progressReporter?: ProgressReporter, setProxyParams?: ProxyParams) => { - await downloadAllMinecraftData() - const isWebSocket = ip.startsWith('ws://') || ip.startsWith('wss://') - let stream - if (isWebSocket) { - progressReporter?.setMessage('Connecting to WebSocket server') - stream = (await getWebsocketStream(ip)).mineflayerStream - progressReporter?.setMessage('WebSocket connected. Ping packet sent, waiting for response') - } else if (setProxyParams) { - setProxy(setProxyParams) - } - window.setLoadingMessage = (message?: string) => { - if (message === undefined) { - progressReporter?.endStage('dns') - } else { - progressReporter?.beginStage('dns', message) - } - } - return pingServerVersion(ip, port, { - ...(stream ? { stream } : {}), - ...(ping ? { noPongTimeout: 3000 } : {}), - ...(preferredVersion ? { version: preferredVersion } : {}), - }).finally(() => { - window.setLoadingMessage = undefined - }) -} - -globalThis.debugTestPing = async (ip: string) => { - const parsed = parseServerAddress(ip, false) - const result = await getServerInfo(parsed.host, parsed.port ? Number(parsed.port) : undefined, undefined, true, undefined, { address: getCurrentProxy(), }) - console.log('result', result) - return result -} - -export const getDefaultProxyParams = () => { - return { - headers: { - Authorization: `Bearer ${new URLSearchParams(location.search).get('token') ?? ''}` - } - } -} - -export type ProxyParams = { - address?: string - headers?: Record -} - -export const setProxy = (proxyParams: ProxyParams) => { - if (proxyParams.address?.startsWith(':')) { - proxyParams.address = `${location.protocol}//${location.hostname}${proxyParams.address}` - } - if (proxyParams.address && location.port !== '80' && location.port !== '443' && !/:\d+$/.test(proxyParams.address)) { - const https = proxyParams.address.startsWith('https://') || location.protocol === 'https:' - proxyParams.address = `${proxyParams.address}:${https ? 443 : 80}` - } - - const parsedProxy = parseServerAddress(proxyParams.address, false) - const proxy = { host: parsedProxy.host, port: parsedProxy.port } - proxyParams.headers ??= getDefaultProxyParams().headers - net['setProxy']({ - hostname: proxy.host, - port: proxy.port, - headers: proxyParams.headers, - artificialDelay: appQueryParams.addPing ? Number(appQueryParams.addPing) : undefined - }) - return { - proxy - } -} diff --git a/src/mineflayer/minecraft-protocol-extra.ts b/src/mineflayer/minecraft-protocol-extra.ts deleted file mode 100644 index 65260979..00000000 --- a/src/mineflayer/minecraft-protocol-extra.ts +++ /dev/null @@ -1,119 +0,0 @@ -import EventEmitter from 'events' -import clientAutoVersion from 'minecraft-protocol/src/client/autoVersion' - -export const pingServerVersion = async (ip: string, port?: number, mergeOptions: Record = {}) => { - const fakeClient = new EventEmitter() as any - const options = { - host: ip, - port, - noPongTimeout: 10_000, - closeTimeout: 20_000, - ...mergeOptions, - } - let latency = 0 - let fullInfo: any = null - fakeClient.autoVersionHooks = [(res) => { - latency = res.latency - fullInfo = res - }] - - // TODO use client.socket.destroy() instead of client.end() for faster cleanup - clientAutoVersion(fakeClient, options) - await Promise.race([ - new Promise((resolve, reject) => { - fakeClient.once('connect_allowed', () => { - resolve() - }) - }), - new Promise((resolve, reject) => { - fakeClient.on('error', (err) => { - reject(new Error(err.message ?? err)) - }) - if (mergeOptions.stream) { - mergeOptions.stream.on('end', (err) => { - setTimeout(() => { - reject(new Error('Connection closed. Please report if you see this but the server is actually fine.')) - }) - }) - } - }) - ]) - - return { - version: fakeClient.version, - latency, - fullInfo, - } -} - -const MAX_PACKET_SIZE = 2_097_152 // 2mb -const CHAT_MAX_PACKET_DEPTH = 200 // todo improve perf - -const CHAT_VALIDATE_PACKETS = new Set([ - 'chat', - 'system_chat', - 'player_chat', - 'profileless_chat', - 'kick_disconnect', - 'resource_pack_send', - 'action_bar', - 'set_title_text', - 'set_title_subtitle', - 'title', - 'death_combat_event', - 'server_data', - 'scoreboard_objective', - 'scoreboard_team', - 'playerlist_header', - 'boss_bar' -]) - -export const validatePacket = (name: string, data: any, fullBuffer: Buffer, isFromServer: boolean) => { - // todo find out why chat is so slow with react - if (!isFromServer) return - - if (fullBuffer.length > MAX_PACKET_SIZE) { - console.groupCollapsed(`Packet ${name} is too large: ${fullBuffer.length} bytes`) - console.log(data) - console.groupEnd() - throw new Error(`Packet ${name} is too large: ${fullBuffer.length} bytes`) - } - - if (CHAT_VALIDATE_PACKETS.has(name)) { - // todo count total number of objects instead of max depth - const maxDepth = getObjectMaxDepth(data) - if (maxDepth > CHAT_MAX_PACKET_DEPTH) { - console.groupCollapsed(`Packet ${name} have too many nested objects: ${maxDepth}`) - console.log(data) - console.groupEnd() - throw new Error(`Packet ${name} have too many nested objects: ${maxDepth}`) - } - } -} - -function getObjectMaxDepth (obj: unknown, currentDepth = 0): number { - // Base case: null or primitive types have depth 0 - if (obj === null || typeof obj !== 'object' || obj instanceof Buffer) { - return currentDepth - } - - // Handle arrays and objects - let maxDepth = currentDepth - - if (Array.isArray(obj)) { - // For arrays, check each element - for (const item of obj) { - const depth = getObjectMaxDepth(item, currentDepth + 1) - maxDepth = Math.max(maxDepth, depth) - } - } else { - // For objects, check each value - // eslint-disable-next-line guard-for-in - for (const key in obj) { - const depth = getObjectMaxDepth(obj[key], currentDepth + 1) - maxDepth = Math.max(maxDepth, depth) - } - } - - return maxDepth -} diff --git a/src/mineflayer/playerState.ts b/src/mineflayer/playerState.ts deleted file mode 100644 index 33f7af77..00000000 --- a/src/mineflayer/playerState.ts +++ /dev/null @@ -1,200 +0,0 @@ -import { HandItemBlock } from 'renderer/viewer/three/holdingBlock' -import { getInitialPlayerState, getPlayerStateUtils, PlayerStateReactive, PlayerStateRenderer, PlayerStateUtils } from 'renderer/viewer/lib/basePlayerState' -import { subscribe } from 'valtio' -import { subscribeKey } from 'valtio/utils' -import { gameAdditionalState } from '../globalState' -import { options } from '../optionsStorage' - -/** - * can be used only in main thread. Mainly for more convenient reactive state updates. - * In renderer/ directory, use PlayerStateControllerRenderer type or worldRenderer.playerState. - */ -export class PlayerStateControllerMain { - disableStateUpdates = false - - private timeOffGround = 0 - private lastUpdateTime = performance.now() - - // Held item state - private isUsingItem = false - ready = false - - reactive: PlayerStateReactive - utils: PlayerStateUtils - - constructor () { - customEvents.on('mineflayerBotCreated', () => { - this.ready = false - bot.on('inject_allowed', () => { - if (this.ready) return - this.ready = true - this.botCreated() - }) - bot.on('end', () => { - this.ready = false - }) - }) - } - - private onBotCreatedOrGameJoined () { - this.reactive.username = bot.username ?? '' - } - - private botCreated () { - console.log('bot created & plugins injected') - this.reactive = getInitialPlayerState() - this.reactive.perspective = options.defaultPerspective - this.utils = getPlayerStateUtils(this.reactive) - this.onBotCreatedOrGameJoined() - - const handleDimensionData = (data) => { - let hasSkyLight = 1 - try { - hasSkyLight = data.dimension.value.has_skylight.value - } catch {} - this.reactive.lightingDisabled = bot.game.dimension === 'the_nether' || bot.game.dimension === 'the_end' || !hasSkyLight - } - - bot._client.on('login', (packet) => { - handleDimensionData(packet) - }) - bot._client.on('respawn', (packet) => { - handleDimensionData(packet) - }) - - // Movement tracking - bot.on('move', () => { - this.updateMovementState() - }) - - // Item tracking - bot.on('heldItemChanged', () => { - return this.updateHeldItem(false) - }) - bot.inventory.on('updateSlot', (index) => { - if (index === 45) this.updateHeldItem(true) - }) - const updateSneakingOrFlying = () => { - this.updateMovementState() - this.reactive.sneaking = bot.controlState.sneak - this.reactive.flying = gameAdditionalState.isFlying - this.reactive.eyeHeight = bot.controlState.sneak && !gameAdditionalState.isFlying ? 1.27 : 1.62 - } - bot.on('physicsTick', () => { - if (this.isUsingItem) this.reactive.itemUsageTicks++ - updateSneakingOrFlying() - }) - // todo move from gameAdditionalState to reactive directly - subscribeKey(gameAdditionalState, 'isSneaking', () => { - updateSneakingOrFlying() - }) - subscribeKey(gameAdditionalState, 'isFlying', () => { - updateSneakingOrFlying() - }) - - // Initial held items setup - this.updateHeldItem(false) - this.updateHeldItem(true) - - bot.on('game', () => { - this.reactive.gameMode = bot.game.gameMode - }) - this.reactive.gameMode = bot.game?.gameMode - - customEvents.on('gameLoaded', () => { - this.reactive.team = bot.teamMap[bot.username] - }) - - this.watchReactive() - } - - // #region Movement and Physics State - private updateMovementState () { - if (!bot?.entity || this.disableStateUpdates) return - - const { velocity } = bot.entity - const isOnGround = bot.entity.onGround - const VELOCITY_THRESHOLD = 0.01 - const SPRINTING_VELOCITY = 0.15 - const OFF_GROUND_THRESHOLD = 0 // ms before switching to SNEAKING when off ground - - const now = performance.now() - const deltaTime = now - this.lastUpdateTime - this.lastUpdateTime = now - - // this.lastVelocity = velocity - - // Update time off ground - if (isOnGround) { - this.timeOffGround = 0 - } else { - this.timeOffGround += deltaTime - } - - if (gameAdditionalState.isSneaking || gameAdditionalState.isFlying || (this.timeOffGround > OFF_GROUND_THRESHOLD)) { - this.reactive.movementState = 'SNEAKING' - } else if (Math.abs(velocity.x) > VELOCITY_THRESHOLD || Math.abs(velocity.z) > VELOCITY_THRESHOLD) { - this.reactive.movementState = Math.abs(velocity.x) > SPRINTING_VELOCITY || Math.abs(velocity.z) > SPRINTING_VELOCITY - ? 'SPRINTING' - : 'WALKING' - } else { - this.reactive.movementState = 'NOT_MOVING' - } - } - - // #region Held Item State - private updateHeldItem (isLeftHand: boolean) { - const newItem = isLeftHand ? bot.inventory.slots[45] : bot.heldItem - if (!newItem) { - if (isLeftHand) { - this.reactive.heldItemOff = undefined - } else { - this.reactive.heldItemMain = undefined - } - return - } - - const block = loadedData.blocksByName[newItem.name] - const blockProperties = block ? new window.PrismarineBlock(block.id, 'void', newItem.metadata).getProperties() : {} - const item: HandItemBlock = { - name: newItem.name, - properties: blockProperties, - id: newItem.type, - type: block ? 'block' : 'item', - fullItem: newItem, - } - - if (isLeftHand) { - this.reactive.heldItemOff = item - } else { - this.reactive.heldItemMain = item - } - // this.events.emit('heldItemChanged', item, isLeftHand) - } - - startUsingItem () { - if (this.isUsingItem) return - this.isUsingItem = true - this.reactive.itemUsageTicks = 0 - } - - stopUsingItem () { - this.isUsingItem = false - this.reactive.itemUsageTicks = 0 - } - - getItemUsageTicks (): number { - return this.reactive.itemUsageTicks - } - - watchReactive () { - subscribeKey(this.reactive, 'eyeHeight', () => { - appViewer.backend?.updateCamera(bot.entity.position, bot.entity.yaw, bot.entity.pitch) - }) - } - - // #endregion -} - -export const playerState = new PlayerStateControllerMain() -window.playerState = playerState diff --git a/src/mineflayer/plugins/index.ts b/src/mineflayer/plugins/index.ts deleted file mode 100644 index 6ac11376..00000000 --- a/src/mineflayer/plugins/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { lastConnectOptions } from '../../react/AppStatusProvider' -import mouse from './mouse' -import packetsPatcher from './packetsPatcher' -import { localRelayServerPlugin } from './packetsRecording' -import ping from './ping' -import webFeatures from './webFeatures' - -// register -webFeatures() -packetsPatcher() - - -customEvents.on('mineflayerBotCreated', () => { - if (lastConnectOptions.value!.server) { - bot.loadPlugin(ping) - } - bot.loadPlugin(mouse) - if (!lastConnectOptions.value!.worldStateFileContents) { - bot.loadPlugin(localRelayServerPlugin) - } -}) diff --git a/src/mineflayer/plugins/mouse.ts b/src/mineflayer/plugins/mouse.ts deleted file mode 100644 index 14e19345..00000000 --- a/src/mineflayer/plugins/mouse.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { createMouse } from 'mineflayer-mouse' -import { Bot } from 'mineflayer' -import { Block } from 'prismarine-block' -import { getThreeJsRendererMethods } from 'renderer/viewer/three/threeJsMethods' -import { isGameActive, showModal } from '../../globalState' - -import { isCypress } from '../../standaloneUtils' -import { playerState } from '../playerState' -import { sendVideoInteraction, videoCursorInteraction } from '../../customChannels' - -function cursorBlockDisplay (bot: Bot) { - const updateCursorBlock = (data?: { block: Block }) => { - if (!data?.block || bot.game.gameMode === 'spectator') { - playerState.reactive.lookingAtBlock = undefined - return - } - - const { block } = data - playerState.reactive.lookingAtBlock = { - x: block.position.x, - y: block.position.y, - z: block.position.z, - shapes: bot.mouse.getBlockCursorShapes(block).map(shape => { - return bot.mouse.getDataFromShape(shape) - }) - } - } - - bot.on('highlightCursorBlock', updateCursorBlock) - bot.on('game', () => { - const block = bot.mouse.getCursorState().cursorBlock - updateCursorBlock(block ? { block } : undefined) - }) - - bot.on('blockBreakProgressStage', (block, stage) => { - const mergedShape = bot.mouse.getMergedCursorShape(block) - playerState.reactive.diggingBlock = stage === null ? undefined : { - x: block.position.x, - y: block.position.y, - z: block.position.z, - stage, - mergedShape: mergedShape ? bot.mouse.getDataFromShape(mergedShape) : undefined - } - }) -} - -export default (bot: Bot) => { - bot.loadPlugin(createMouse({})) - - domListeners(bot) - cursorBlockDisplay(bot) - - otherListeners() -} - -const otherListeners = () => { - bot.on('startDigging', (block) => { - customEvents.emit('digStart') - }) - - bot.on('goingToSleep', () => { - showModal({ reactType: 'bed' }) - }) - - bot.on('botArmSwingStart', (hand) => { - getThreeJsRendererMethods()?.changeHandSwingingState(true, hand === 'left') - }) - - bot.on('botArmSwingEnd', (hand) => { - getThreeJsRendererMethods()?.changeHandSwingingState(false, hand === 'left') - }) - - bot.on('startUsingItem', (item, slot, isOffhand, duration) => { - customEvents.emit('activateItem', item, isOffhand ? 45 : bot.quickBarSlot, isOffhand) - playerState.startUsingItem() - }) - - bot.on('stopUsingItem', () => { - playerState.stopUsingItem() - }) -} - -const domListeners = (bot: Bot) => { - const abortController = new AbortController() - document.addEventListener('mousedown', (e) => { - if (e.isTrusted && !document.pointerLockElement && !isCypress()) return - if (!isGameActive(true)) return - - getThreeJsRendererMethods()?.onPageInteraction() - - const videoInteraction = videoCursorInteraction() - if (videoInteraction) { - sendVideoInteraction(videoInteraction.id, videoInteraction.x, videoInteraction.y, e.button === 0) - return - } - - if (e.button === 0) { - bot.leftClickStart() - } else if (e.button === 2) { - bot.rightClickStart() - } - }, { signal: abortController.signal }) - - document.addEventListener('mouseup', (e) => { - if (e.button === 0) { - bot.leftClickEnd() - } else if (e.button === 2) { - bot.rightClickEnd() - } - }, { signal: abortController.signal }) - - bot.mouse.beforeUpdateChecks = () => { - if (!document.hasFocus() || !isGameActive(true)) { - // deactive all buttons - bot.mouse.buttons.fill(false) - } - } - - bot.on('end', () => { - abortController.abort() - }) -} diff --git a/src/mineflayer/plugins/packetsPatcher.ts b/src/mineflayer/plugins/packetsPatcher.ts deleted file mode 100644 index 5e93ef60..00000000 --- a/src/mineflayer/plugins/packetsPatcher.ts +++ /dev/null @@ -1,50 +0,0 @@ -export default () => { - // not plugin so its loaded earlier - customEvents.on('mineflayerBotCreated', () => { - botInit() - }) -} - -const waitingPackets = {} as Record> - -const botInit = () => { - // PATCH READING - bot._client.on('packet', (data, meta) => { - if (meta.name === 'map_chunk') { - if (data.groundUp && data.bitMap === 1 && data.chunkData.every(x => x === 0)) { - data.chunkData = Buffer.from(Array.from({ length: 12_544 }).fill(0) as any) - } - } - }) - - // PATCH WRITING - - const clientWrite = bot._client.write.bind(bot._client) - const sendAllPackets = (name: string, data: any) => { - for (const packet of waitingPackets[name]) { - clientWrite(packet.name, packet.data) - } - delete waitingPackets[name] - } - - //@ts-expect-error - bot._client.write = (name: string, data: any) => { - // if (name === 'position' || name === 'position_look' || name === 'look' || name === 'teleport_confirm') { - // const chunkX = Math.floor(bot.entity.position.x / 16) - // const chunkZ = Math.floor(bot.entity.position.z / 16) - // const loadedColumns = bot.world.getColumns() - // if (loadedColumns.some((c) => c.chunkX === chunkX && c.chunkZ === chunkZ)) { - // sendAllPackets('position', data) - // } else { - // waitingPackets['position'] = [...(waitingPackets['position'] || []), { name, data }] - // return - // } - // } - if (name === 'settings') { - data['viewDistance'] = Math.max(data['viewDistance'], 3) - } - return clientWrite(name, data) - } - - // PATCH INTERACTIONS -} diff --git a/src/mineflayer/plugins/packetsRecording.ts b/src/mineflayer/plugins/packetsRecording.ts deleted file mode 100644 index b9ba028c..00000000 --- a/src/mineflayer/plugins/packetsRecording.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { viewerConnector } from 'mcraft-fun-mineflayer' -import { PACKETS_REPLAY_FILE_EXTENSION, WORLD_STATE_FILE_EXTENSION } from 'mcraft-fun-mineflayer/build/worldState' -import { Bot } from 'mineflayer' -import CircularBuffer from 'flying-squid/dist/circularBuffer' -import { PacketsLogger } from 'mcraft-fun-mineflayer/build/packetsLogger' -import { subscribe } from 'valtio' -import { lastConnectOptions } from '../../react/AppStatusProvider' -import { packetsRecordingState } from '../../packetsReplay/packetsReplayLegacy' -import { packetsReplayState } from '../../react/state/packetsReplayState' - -const AUTO_CAPTURE_PACKETS_COUNT = 30 -let circularBuffer: CircularBuffer | undefined -let lastConnectVersion = '' - -export const localRelayServerPlugin = (bot: Bot) => { - lastConnectVersion = bot.version - let ended = false - bot.on('end', () => { - ended = true - }) - - bot.loadPlugin( - viewerConnector({ - tcpEnabled: false, - websocketEnabled: false, - }) - ) - - const downloadFile = (contents: string, filename: string) => { - const a = document.createElement('a') - const blob = new Blob([contents], { type: 'text/plain' }) - const url = URL.createObjectURL(blob) - a.href = url - a.download = filename - a.click() - URL.revokeObjectURL(url) - } - - bot.downloadCurrentWorldState = () => { - const worldState = bot.webViewer._unstable.createStateCaptureFile() - // add readable timestamp to filename - const timestamp = new Date().toISOString().replaceAll(/[-:Z]/g, '') - downloadFile(worldState.contents, `${bot.username}-world-state-${timestamp}.${WORLD_STATE_FILE_EXTENSION}`) - } - - let logger: PacketsLogger | undefined - bot.startPacketsRecording = () => { - bot.webViewer._unstable.startRecording((l) => { - logger = l - }) - } - - bot.stopPacketsRecording = () => { - if (!logger) return - const packets = logger?.contents - logger = undefined - const timestamp = new Date().toISOString().replaceAll(/[-:Z]/g, '') - downloadFile(packets, `${bot.username}-packets-${timestamp}.${PACKETS_REPLAY_FILE_EXTENSION}`) - bot.webViewer._unstable.stopRecording() - } - - circularBuffer = new CircularBuffer(AUTO_CAPTURE_PACKETS_COUNT) - let position = 0 - bot._client.on('writePacket' as any, (name, params) => { - circularBuffer!.add({ name, state: bot._client.state, params, isFromServer: false, timestamp: Date.now() }) - if (packetsRecordingState.active) { - packetsReplayState.packetsPlayback.push({ - name, - data: params, - isFromClient: true, - isUpcoming: false, - position: position++, - timestamp: Date.now(), - }) - packetsReplayState.progress.current++ - } - }) - bot._client.on('packet', (data, { name }) => { - if (name === 'map_chunk') data = { x: data.x, z: data.z } - circularBuffer!.add({ name, state: bot._client.state, params: data, isFromServer: true, timestamp: Date.now() }) - if (packetsRecordingState.active) { - packetsReplayState.packetsPlayback.push({ - name, - data, - isFromClient: false, - isUpcoming: false, - position: position++, - timestamp: Date.now(), - }) - packetsReplayState.progress.total++ - } - }) - const oldWriteChannel = bot._client.writeChannel.bind(bot._client) - bot._client.writeChannel = (channel, params) => { - packetsReplayState.packetsPlayback.push({ - name: channel, - data: params, - isFromClient: true, - isUpcoming: false, - position: position++, - timestamp: Date.now(), - isCustomChannel: true, - }) - oldWriteChannel(channel, params) - } - - upPacketsReplayPanel() -} - -const upPacketsReplayPanel = () => { - if (packetsRecordingState.active && bot) { - packetsReplayState.isOpen = true - packetsReplayState.isMinimized = true - packetsReplayState.isRecording = true - packetsReplayState.replayName = 'Recording all packets for ' + bot.username - } -} - -subscribe(packetsRecordingState, () => { - upPacketsReplayPanel() -}) - -declare module 'mineflayer' { - interface Bot { - downloadCurrentWorldState: () => void - startPacketsRecording: () => void - stopPacketsRecording: () => void - } -} - -export const getLastAutoCapturedPackets = () => circularBuffer?.size -export const downloadAutoCapturedPackets = () => { - const logger = new PacketsLogger({ minecraftVersion: lastConnectVersion }) - logger.relativeTime = false - logger.formattedTime = true - for (const packet of circularBuffer?.getLastElements() ?? []) { - logger.log(packet.isFromServer, { name: packet.name, state: packet.state, time: packet.timestamp }, packet.params) - } - const textContents = logger.contents - const blob = new Blob([textContents], { type: 'text/plain' }) - const url = URL.createObjectURL(blob) - const a = document.createElement('a') - a.href = url - a.download = `${lastConnectOptions.value?.server ?? 'unknown-server'}-${lastConnectOptions.value?.username ?? 'unknown-username'}-auto-captured-packets.txt` - a.click() - URL.revokeObjectURL(url) -} diff --git a/src/mineflayer/plugins/ping.ts b/src/mineflayer/plugins/ping.ts deleted file mode 100644 index d6a23554..00000000 --- a/src/mineflayer/plugins/ping.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { versionToNumber } from 'renderer/viewer/common/utils' - -export default () => { - let i = 0 - bot.pingProxy = async () => { - const curI = ++i - return new Promise(resolve => { - //@ts-expect-error - bot._client.socket._ws.send(`ping:${curI}`) - const date = Date.now() - const onPong = (received) => { - if (received !== curI.toString()) return - bot._client.socket.off('pong' as any, onPong) - resolve(Date.now() - date) - } - bot._client.socket.on('pong' as any, onPong) - }) - } - - let pingId = 0 - bot.pingServer = async () => { - if (versionToNumber(bot.version) < versionToNumber('1.20.2')) return bot.player?.ping ?? -1 - return new Promise((resolve) => { - const curId = pingId++ - bot._client.write('ping_request', { id: BigInt(curId) }) - const date = Date.now() - const onPong = (data: { id: bigint }) => { - if (BigInt(data.id) !== BigInt(curId)) return - bot._client.off('ping_response' as any, onPong) - resolve(Date.now() - date) - } - bot._client.on('ping_response' as any, onPong) - }) - } -} - -declare module 'mineflayer' { - interface Bot { - pingProxy: () => Promise - pingServer: () => Promise - } -} diff --git a/src/mineflayer/plugins/webFeatures.ts b/src/mineflayer/plugins/webFeatures.ts deleted file mode 100644 index c56d7d66..00000000 --- a/src/mineflayer/plugins/webFeatures.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Bot } from 'mineflayer' -import { getAppLanguage } from '../../optionsStorage' - -export default () => { - customEvents.on('mineflayerBotCreated', () => { - bot.loadPlugin(plugin) - }) -} - -const plugin = (bot: Bot) => { - bot.settings['locale'] = getAppLanguage() -} diff --git a/src/mineflayer/timers.ts b/src/mineflayer/timers.ts deleted file mode 100644 index 99110718..00000000 --- a/src/mineflayer/timers.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { subscribeKey } from 'valtio/utils' -import { preventThrottlingWithSound } from '../core/timers' -import { options } from '../optionsStorage' - -customEvents.on('mineflayerBotCreated', () => { - const abortController = new AbortController() - - const maybeGoBackgroundKickPrevention = () => { - if (options.preventBackgroundTimeoutKick && !bot.backgroundKickPrevention) { - const unsub = preventThrottlingWithSound() - bot.on('end', unsub) - bot.backgroundKickPrevention = true - } - } - maybeGoBackgroundKickPrevention() - subscribeKey(options, 'preventBackgroundTimeoutKick', (value) => { - maybeGoBackgroundKickPrevention() - }) - - // wake lock - const requestWakeLock = async () => { - if (!('wakeLock' in navigator)) { - console.warn('Wake Lock API is not supported in this browser') - return - } - - if (options.preventSleep && !bot.wakeLock && !bot.lockRequested) { - bot.lockRequested = true - bot.wakeLock = await navigator.wakeLock.request('screen').finally(() => { - bot.lockRequested = false - }) - - bot.wakeLock.addEventListener('release', () => { - bot.wakeLock = undefined - }, { - once: true, - }) - } - - if (!options.preventSleep && bot.wakeLock) { - void bot.wakeLock.release() - } - } - document.addEventListener('visibilitychange', () => { - if (document.visibilityState === 'visible') { - // we are back to the tab, request wake lock again - void requestWakeLock() - } - }, { - signal: abortController.signal, - }) - void requestWakeLock() - subscribeKey(options, 'preventSleep', (value) => { - void requestWakeLock() - }) - - bot.on('end', () => { - if (bot.wakeLock) { - void bot.wakeLock.release() - } - abortController.abort() - }) -}) - -declare module 'mineflayer' { - interface Bot { - backgroundKickPrevention?: boolean - wakeLock?: WakeLockSentinel - lockRequested?: boolean - } -} diff --git a/src/mineflayer/userError.ts b/src/mineflayer/userError.ts deleted file mode 100644 index 9d3e08a7..00000000 --- a/src/mineflayer/userError.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class UserError extends Error { - constructor (message: string) { - super(message) - this.name = 'UserError' - } -} diff --git a/src/mineflayer/websocket-core.ts b/src/mineflayer/websocket-core.ts deleted file mode 100644 index f8163102..00000000 --- a/src/mineflayer/websocket-core.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Duplex } from 'stream' -import { UserError } from './userError' - -class CustomDuplex extends Duplex { - constructor (options, public writeAction) { - super(options) - } - - override _read () {} - - override _write (chunk, encoding, callback) { - this.writeAction(chunk) - callback() - } -} - -export const getWebsocketStream = async (host: string) => { - const baseProtocol = host.startsWith('ws://') ? 'ws' : 'wss' - const hostClean = host.replace('ws://', '').replace('wss://', '') - const hostURL = new URL(`${baseProtocol}://${hostClean}`) - const hostParams = hostURL.searchParams - hostParams.append('client_mcraft', '') - const ws = new WebSocket(`${baseProtocol}://${hostURL.host}${hostURL.pathname}?${hostParams.toString()}`) - const clientDuplex = new CustomDuplex(undefined, data => { - ws.send(data) - }) - - clientDuplex.on('error', () => {}) - - ws.addEventListener('message', async message => { - let { data } = message - if (data instanceof Blob) { - data = await data.arrayBuffer() - } - clientDuplex.push(Buffer.from(data)) - }) - - ws.addEventListener('close', () => { - console.log('ws closed') - clientDuplex.end() - setTimeout(() => { - clientDuplex.emit('end', 'Connection lost') - }, 500) - }) - - ws.addEventListener('error', err => { - console.log('ws error', err) - clientDuplex.emit('error', err) - }) - - await new Promise((resolve, reject) => { - ws.addEventListener('open', resolve) - ws.addEventListener('error', err => { - console.log('ws error', err) - reject(new UserError('Failed to open websocket connection')) - }) - }) - - return { - mineflayerStream: clientDuplex, - ws, - } -} diff --git a/src/mobileShim.ts b/src/mobileShim.ts deleted file mode 100644 index ebf33d6e..00000000 --- a/src/mobileShim.ts +++ /dev/null @@ -1,20 +0,0 @@ -// fix double tap on mobile - -let lastElement = null as { - clickTime: number - element: HTMLElement -} | null -document.addEventListener('touchstart', (e) => { - if (e.touches.length > 1) { - lastElement = null - return - } - if (lastElement && Date.now() - lastElement.clickTime < 500 && lastElement.element === e.target) { - lastElement.element.dispatchEvent(new MouseEvent('dblclick', { bubbles: true })) - lastElement = null - } - lastElement = { - clickTime: Date.now(), - element: e.target as HTMLElement - } -}, { passive: false }) diff --git a/src/optimizeJson.ts b/src/optimizeJson.ts deleted file mode 100644 index a7fe7d4e..00000000 --- a/src/optimizeJson.ts +++ /dev/null @@ -1,369 +0,0 @@ -import { versionToNumber } from 'renderer/viewer/common/utils' - -type IdMap = Record - -type DiffData = { - removed: number[], - changed: any[], - removedProps: Array<[number, number[]]>, - added -} - -type SourceData = { - keys: IdMap, - properties: IdMap - source: Record - diffs: Record - arrKey? - __IS_OPTIMIZED__: true -} - -function getRecipesProcessorProcessRecipes (items, blocks) { - return (current) => { - // can require the same multiple times per different versions - const itemsIdsMap = Object.fromEntries(items.map((b) => [b.name, b.id])) - const blocksIdsMap = Object.fromEntries(blocks.map((b) => [b.name, b.id])) - const keys = Object.keys(current) - for (const key of keys) { - if (key === '_proccessed') { - delete current[key] - continue - } - const mapId = (id) => { - if (typeof id !== 'string' && typeof id !== 'number') throw new Error('Incorrect type') - const mapped = itemsIdsMap[id] ?? blocksIdsMap[id] - if (!mapped) { - throw new Error(`No item/block name with id ${id}`) - } - return mapped - } - const processRecipe = (obj) => { - // if (!obj) return - // if (Array.isArray(obj)) { - // obj.forEach((id, i) => { - // obj[i] = mapId(obj[id]) - // }) - // } else if (obj && typeof obj === 'object') { - // if (!'count metadata id'.split(' ').every(x => x in obj)) { - // throw new Error(`process error: Unknown deep object pattern: ${JSON.stringify(obj)}`) - // } - // obj.id = mapId(obj.id) - // } else { - // throw new Error('unknown type') - // } - const parseRecipeItem = (item) => { - if (typeof item === 'number' || typeof item === 'string') return mapId(item) - if (Array.isArray(item)) return [mapId(item), ...item.slice(1)] - if (!item) { - return item - } - if ('id' in item) { - item.id = mapId(item.id) - return item - } - throw new Error('unhandled') - } - const maybeProccessShape = (shape) => { - if (!shape) return - for (const shapeRow of shape) { - for (const [i, item] of shapeRow.entries()) { - shapeRow[i] = parseRecipeItem(item) - } - } - } - if (obj.result) obj.result = parseRecipeItem(obj.result) - maybeProccessShape(obj.inShape) - maybeProccessShape(obj.outShape) - if (obj.ingredients) { - for (const [i, ingredient] of obj.ingredients.entries()) { - obj.ingredients[i] = parseRecipeItem(ingredient) - } - } - } - // eslint-disable-next-line no-useless-catch - try { - const name = mapId(key) - for (const [i, recipe] of current[key].entries()) { - // eslint-disable-next-line no-useless-catch - try { - processRecipe(recipe) - } catch (err) { - // console.warn(`${version} [warn] Removing incorrect recipe: ${err}`) - // delete current[i] - throw err - } - } - current[name] = current[key] - } catch (err) { - // console.warn(`${version} [warn] Removing incorrect recipe: ${err}`) - throw err - } - delete current[key] - } - } -} - -export const restoreMinecraftData = (allVersionData: any, type: string, version: string) => { - let restorer - if (type === 'recipes') { - restorer = getRecipesProcessorProcessRecipes( - JsonOptimizer.restoreData(allVersionData.items, version, undefined), - JsonOptimizer.restoreData(allVersionData.blocks, version, undefined), - ) - } - return JsonOptimizer.restoreData(allVersionData[type], version, restorer) -} - -export default class JsonOptimizer { - keys = {} as IdMap - idToKey = {} as Record - properties = {} as IdMap - source = {} - previousKeys = [] as number[] - previousValues = {} as Record - diffs = {} as Record - - constructor (public arrKey?: string, public ignoreChanges = false, public ignoreRemoved = false) { } - - export () { - const { keys, properties, source, arrKey, diffs } = this - return { - keys, - properties, - source, - arrKey, - diffs, - '__IS_OPTIMIZED__': true - } satisfies SourceData - } - - diffObj (diffing): DiffData { - const removed = [] as number[] - const changed = [] as any[] - const removedProps = [] as any[] - const { arrKey, ignoreChanges, ignoreRemoved } = this - const added = [] as number[] - - if (!diffing || typeof diffing !== 'object') throw new Error('diffing data is not object') - if (Array.isArray(diffing) && !arrKey) throw new Error('arrKey is required for arrays') - const diffingObj = Array.isArray(diffing) ? Object.fromEntries(diffing.map(x => { - const key = JsonOptimizer.getByArrKey(x, arrKey!) - return [key, x] - })) : diffing - - const possiblyNewKeys = Object.keys(diffingObj) - this.keys ??= {} - this.properties ??= {} - let lastRootKeyId = Object.values(this.keys).length - let lastItemKeyId = Object.values(this.properties).length - for (const key of possiblyNewKeys) { - this.keys[key] ??= lastRootKeyId++ - this.idToKey[this.keys[key]] = key - } - const DEBUG = false - - const addDiff = (key, newVal, prevVal) => { - const valueMapped = [] as any[] - const isItemObj = typeof newVal === 'object' && newVal - const keyId = this.keys[key] - if (isItemObj) { - const removedPropsLocal = [] as any[] - for (const [prop, val] of Object.entries(newVal)) { - // mc-data: why push only changed props? eg for blocks only stateId are different between all versions so we skip a lot of duplicated data like block props - if (!isEqualStructured(newVal[prop], prevVal[prop])) { - let keyMapped = this.properties[prop] - if (keyMapped === undefined) { - this.properties[prop] = lastItemKeyId++ - keyMapped = this.properties[prop] - } - valueMapped.push(DEBUG ? prop : keyMapped, newVal[prop]) - } - } - // also add undefined for removed props - for (const prop of Object.keys(prevVal)) { - if (prop in newVal) continue - let keyMapped = this.properties[prop] - if (keyMapped === undefined) { - this.properties[prop] = lastItemKeyId++ - keyMapped = this.properties[prop] - } - removedPropsLocal.push(DEBUG ? prop : keyMapped) - } - removedProps.push([keyId, removedPropsLocal]) - } - changed.push(DEBUG ? key : keyId, isItemObj ? valueMapped : newVal) - } - for (const [id, sourceVal] of Object.entries(this.source)) { - const key = this.idToKey[id] - const diffVal = diffingObj[key] - if (!ignoreChanges && diffVal !== undefined) { - this.previousValues[id] ??= this.source[id] - const prevVal = this.previousValues[id] - if (!isEqualStructured(prevVal, diffVal)) { - addDiff(key, diffVal, prevVal) - } - this.previousValues[id] = diffVal - } - } - for (const [key, val] of Object.entries(diffingObj)) { - const id = this.keys[key] - if (!this.source[id]) { - this.source[id] = val - } - added.push(id) - } - - for (const previousKey of this.previousKeys) { - const key = this.idToKey[previousKey] - if (diffingObj[key] === undefined && !ignoreRemoved) { - removed.push(previousKey) - } - } - - for (const toRemove of removed) { - this.previousKeys.splice(this.previousKeys.indexOf(toRemove), 1) - } - - for (const previousKey of this.previousKeys) { - const index = added.indexOf(previousKey) - if (index === -1) continue - added.splice(index, 1) - } - - this.previousKeys = [...this.previousKeys, ...added] - - return { - removed, - changed, - added, - removedProps - } - } - - recordDiff (key: string, diffObj: string) { - const diff = this.diffObj(diffObj) - // problem is that 274 key 10.20.6 no removed keys in diff created - this.diffs[key] = diff - } - - static isOptimizedChangeDiff (changePossiblyArrDiff) { - if (!Array.isArray(changePossiblyArrDiff)) return false - if (changePossiblyArrDiff.length % 2 !== 0) return false - for (let i = 0; i < changePossiblyArrDiff.length; i += 2) { - if (typeof changePossiblyArrDiff[i] !== 'number') return false - } - return true - } - - static restoreData ({ keys, properties, source, arrKey, diffs }: SourceData, targetKey: string, dataRestorer: ((data) => void) | undefined) { - // if (!diffs[targetKey]) throw new Error(`The requested data to restore with key ${targetKey} does not exist`) - source = structuredClone(source) - const keysById = Object.fromEntries(Object.entries(keys).map(x => [x[1], x[0]])) - const propertiesById = Object.fromEntries(Object.entries(properties).map(x => [x[1], x[0]])) - const dataByKeys = {} as Record - for (const [versionKey, { added, changed, removed, removedProps }] of Object.entries(diffs)) { - for (const toAdd of added) { - dataByKeys[toAdd] = source[toAdd] - } - for (const toRemove of removed) { - delete dataByKeys[toRemove] - } - for (let i = 0; i < changed.length; i += 2) { - const key = changed[i] - const change = changed[i + 1] - const isOptimizedChange = JsonOptimizer.isOptimizedChangeDiff(change) - if (isOptimizedChange) { - // apply optimized diff - for (let k = 0; k < change.length; k += 2) { - const propId = change[k] - const newVal = change[k + 1] - const prop = propertiesById[propId] - // const prop = propId - if (prop === undefined) throw new Error(`Property id change is undefined: ${propId}`) - dataByKeys[key][prop] = newVal - } - } else { - dataByKeys[key] = change - } - } - for (const [key, removePropsId] of removedProps) { - for (const removePropId of removePropsId) { - const removeProp = propertiesById[removePropId] - // todo: this is not correct! - if (Array.isArray(dataByKeys[key])) { - dataByKeys[key].splice(removeProp as any, 1) // splice accepts strings as well - } else { - delete dataByKeys[key][removeProp] - } - } - } - if (versionToNumber(versionKey) <= versionToNumber(targetKey)) { - break - } - } - let data - if (arrKey) { - data = Object.values(dataByKeys) - } else { - data = Object.fromEntries(Object.entries(dataByKeys).map(([key, val]) => [keysById[key], val])) - } - dataRestorer?.(data) - return data - } - - static getByArrKey (item: any, arrKey: string) { - return arrKey.split('+').map(x => item[x]).join('+') - } - - static resolveDefaults (arr) { - if (!Array.isArray(arr)) throw new Error('not an array') - const propsValueCount = {} as { - [key: string]: { - [val: string]: number - } - } - for (const obj of arr) { - if (typeof obj !== 'object' || !obj) continue - for (const [key, val] of Object.entries(obj)) { - const valJson = JSON.stringify(val) - propsValueCount[key] ??= {} - propsValueCount[key][valJson] ??= 0 - propsValueCount[key][valJson] += 1 - } - } - const defaults = Object.fromEntries(Object.entries(propsValueCount).map(([prop, values]) => { - const defaultValue = Object.entries(values).sort(([, count1], [, count2]) => count2 - count1)[0][0] - return [prop, defaultValue] - })) - - const newData = [] as any[] - const noData = {} - for (const [i, obj] of arr.entries()) { - if (typeof obj !== 'object' || !obj) { - newData.push(obj) - continue - } - for (const key of Object.keys(defaults)) { - const val = obj[key] - if (!val) { - noData[key] ??= [] - noData[key].push(key) - continue - } - if (defaults[key] === JSON.stringify(val)) { - delete obj[key] - } - } - newData.push(obj) - } - - return { - data: newData, - defaults - } - } -} - -const isEqualStructured = (val1, val2) => { - return JSON.stringify(val1) === JSON.stringify(val2) -} diff --git a/src/optionsGuiScheme.tsx b/src/optionsGuiScheme.tsx deleted file mode 100644 index 0cb0fe1e..00000000 --- a/src/optionsGuiScheme.tsx +++ /dev/null @@ -1,743 +0,0 @@ -import { useEffect, useRef, useState } from 'react' -import { useSnapshot } from 'valtio' -import { openURL } from 'renderer/viewer/lib/simpleUtils' -import { noCase } from 'change-case' -import { versionToNumber } from 'mc-assets/dist/utils' -import { gameAdditionalState, miscUiState, openOptionsMenu, showModal } from './globalState' -import { AppOptions, getChangedSettings, options, resetOptions } from './optionsStorage' -import Button from './react/Button' -import { OptionMeta, OptionSlider } from './react/OptionsItems' -import Slider from './react/Slider' -import { getScreenRefreshRate } from './utils' -import { setLoadingScreenStatus } from './appStatus' -import { openFilePicker, resetLocalStorage } from './browserfs' -import { completeResourcepackPackInstall, getResourcePackNames, resourcepackReload, resourcePackState, uninstallResourcePack } from './resourcePack' -import { downloadPacketsReplay, packetsRecordingState } from './packetsReplay/packetsReplayLegacy' -import { showInputsModal, showOptionsModal } from './react/SelectOption' -import { ClientMod, getAllMods, modsUpdateStatus } from './clientMods' -import supportedVersions from './supportedVersions.mjs' -import { getVersionAutoSelect } from './connect' -import { createNotificationProgressReporter } from './core/progressReporter' -import { customKeymaps } from './controls' -import { appStorage } from './react/appStorageProvider' -import { exportData, importData } from './core/importExport' - -export const guiOptionsScheme: { - [t in OptionsGroupType]: Array<{ [K in keyof AppOptions]?: Partial> } & { custom? }> -} = { - render: [ - { - custom () { - const frameLimitValue = useSnapshot(options).frameLimit - const [frameLimitMax, setFrameLimitMax] = useState(null as number | null) - - return
- { - options.frameLimit = newVal > frameLimitMax! ? false : newVal - }} - /> -
- } - }, - { - gpuPreference: { - text: 'GPU Preference', - tooltip: 'You will need to reload the page for this to take effect.', - values: [['default', 'Auto'], ['high-performance', 'Dedicated'], ['low-power', 'Low Power']] - }, - }, - { - custom () { - return - }, - mouseSensX: {}, - mouseSensY: { - min: -1, - valueText (value) { - return value === -1 ? 'Same as X' : `${value}` - }, - }, - mouseRawInput: { - tooltip: 'Wether to disable any mouse acceleration (MC does it by default). Most probably it is still supported only by Chrome.', - // eslint-disable-next-line no-extra-boolean-cast - disabledReason: Boolean(document.documentElement.requestPointerLock) ? undefined : 'Your browser does not support pointer lock.', - }, - autoFullScreen: { - tooltip: 'Auto Fullscreen allows you to use Ctrl+W and Escape having to wait/click on screen again.', - disabledReason: navigator['keyboard'] ? undefined : 'Your browser doesn\'t support keyboard lock API' - }, - autoExitFullscreen: { - tooltip: 'Exit fullscreen on escape (pause menu open). But note you can always do it with F11.', - }, - }, - { - custom () { - return Touch Controls - }, - alwaysShowMobileControls: { - text: 'Always Mobile Controls', - }, - touchButtonsSize: { - min: 40, - disableIf: [ - 'touchMovementType', - 'modern' - ], - }, - touchButtonsOpacity: { - min: 10, - max: 90, - disableIf: [ - 'touchMovementType', - 'modern' - ], - }, - touchButtonsPosition: { - max: 80, - disableIf: [ - 'touchMovementType', - 'modern' - ], - }, - touchMovementType: { - text: 'Movement Controls', - values: [['modern', 'Modern'], ['classic', 'Classic']], - }, - touchInteractionType: { - text: 'Interaction Controls', - values: [['classic', 'Classic'], ['buttons', 'Buttons']], - }, - }, - { - custom () { - const { touchInteractionType, touchMovementType } = useSnapshot(options) - return - }, - }, - { - custom () { - return - }, - }, - { - custom () { - return - }, - }, - { - custom () { - const { active, hasRecordedPackets } = useSnapshot(packetsRecordingState) - return - }, - }, - { - packetsLoggerPreset: { - text: 'Packets Logger Preset', - values: [ - ['all', 'All'], - ['no-buffers', 'No Buffers'] - ], - }, - }, - { - debugContro: { - text: 'Debug Controls', - }, - }, - { - debugResponseTimeIndicator: { - text: 'Debug Input Lag', - }, - }, - { - debugChatScroll: { - }, - } - ], - 'export-import': [ - { - custom () { - return Export/Import Data - } - }, - { - custom () { - return - } - }, - { - custom () { - return - } - }, - { - custom () { - return - } - }, - { - custom () { - return - } - } - ], -} -export type OptionsGroupType = 'main' | 'render' | 'interface' | 'controls' | 'sound' | 'advanced' | 'VR' | 'export-import' - -const Category = ({ children }) =>
{children}
- -const UiToggleButton = ({ name, addUiText = false, label = noCase(name) }: { name: string, addUiText?: boolean, label?: string }) => { - const { disabledUiParts } = useSnapshot(options) - - const currentlyDisabled = disabledUiParts.includes(name) - if (addUiText) label = `${label} UI` - return -} - -export const tryFindOptionConfig = (option: keyof AppOptions) => { - for (const group of Object.values(guiOptionsScheme)) { - for (const optionConfig of group) { - if (option in optionConfig) { - return optionConfig[option] - } - } - } - - return null -} diff --git a/src/optionsStorage.ts b/src/optionsStorage.ts deleted file mode 100644 index 22d5ef26..00000000 --- a/src/optionsStorage.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { proxy, subscribe } from 'valtio/vanilla' -import { subscribeKey } from 'valtio/utils' -import { omitObj } from '@zardoy/utils' -import { appQueryParams, appQueryParamsArray } from './appParams' -import type { AppConfig } from './appConfig' -import { appStorage } from './react/appStorageProvider' -import { miscUiState } from './globalState' -import { defaultOptions } from './defaultOptions' - -const isDev = process.env.NODE_ENV === 'development' -const initialAppConfig = process.env?.INLINED_APP_CONFIG as AppConfig ?? {} - -// const qsOptionsRaw = new URLSearchParams(location.search).getAll('setting') -const qsOptionsRaw = appQueryParamsArray.setting ?? [] -export const qsOptions = Object.fromEntries(qsOptionsRaw.map(o => { - const [key, value] = o.split(':') - return [key, JSON.parse(value)] -})) - -// Track which settings are disabled (controlled by QS or forced by config) -export const disabledSettings = proxy({ - value: new Set(Object.keys(qsOptions)) -}) - -const migrateOptions = (options: Partial>) => { - if (options.highPerformanceGpu) { - options.gpuPreference = 'high-performance' - delete options.highPerformanceGpu - } - if (Object.keys(options.touchControlsPositions ?? {}).length === 0) { - options.touchControlsPositions = defaultOptions.touchControlsPositions - } - if (options.touchControlsPositions?.jump === undefined) { - options.touchControlsPositions!.jump = defaultOptions.touchControlsPositions.jump - } - if (options.touchControlsType === 'joystick-buttons') { - options.touchInteractionType = 'buttons' - } - - return options -} -const migrateOptionsLocalStorage = () => { - if (Object.keys(appStorage['options'] ?? {}).length) { - for (const key of Object.keys(appStorage['options'])) { - if (!(key in defaultOptions)) continue // drop unknown options - const defaultValue = defaultOptions[key] - if (JSON.stringify(defaultValue) !== JSON.stringify(appStorage['options'][key])) { - appStorage.changedSettings[key] = appStorage['options'][key] - } - } - delete appStorage['options'] - } -} - -export type AppOptions = typeof defaultOptions - -const isDeepEqual = (a: any, b: any): boolean => { - if (a === b) return true - if (typeof a !== typeof b) return false - if (typeof a !== 'object') return false - if (a === null || b === null) return a === b - if (Array.isArray(a) && Array.isArray(b)) { - if (a.length !== b.length) return false - return a.every((item, index) => isDeepEqual(item, b[index])) - } - const keysA = Object.keys(a) - const keysB = Object.keys(b) - if (keysA.length !== keysB.length) return false - return keysA.every(key => isDeepEqual(a[key], b[key])) -} - -export const getChangedSettings = () => { - return Object.fromEntries( - Object.entries(appStorage.changedSettings).filter(([key, value]) => !isDeepEqual(defaultOptions[key], value)) - ) -} - -migrateOptionsLocalStorage() -export const options: AppOptions = proxy({ - ...defaultOptions, - ...initialAppConfig.defaultSettings, - ...migrateOptions(appStorage.changedSettings), - ...qsOptions -}) - -window.options = window.settings = options - -export const resetOptions = () => { - Object.assign(options, defaultOptions) -} - -Object.defineProperty(window, 'debugChangedOptions', { - get () { - return getChangedSettings() - }, -}) - -subscribe(options, (ops) => { - if (appQueryParams.freezeSettings === 'true') return - for (const op of ops) { - const [type, path, value] = op - // let patch - // let accessor = options - // for (const part of path) { - // } - const key = path[0] as string - if (disabledSettings.value.has(key)) continue - appStorage.changedSettings[key] = options[key] - } -}) - -type WatchValue = >(proxy: T, callback: (p: T, isChanged: boolean) => void) => () => void - -export const watchValue: WatchValue = (proxy, callback) => { - const watchedProps = new Set() - callback(new Proxy(proxy, { - get (target, p, receiver) { - watchedProps.add(p.toString()) - return Reflect.get(target, p, receiver) - }, - }), false) - const unsubscribes = [] as Array<() => void> - for (const prop of watchedProps) { - unsubscribes.push( - subscribeKey(proxy, prop, () => { - callback(proxy, true) - }) - ) - } - - return () => { - for (const unsubscribe of unsubscribes) { - unsubscribe() - } - } -} - -watchValue(options, o => { - globalThis.excludeCommunicationDebugEvents = o.excludeCommunicationDebugEvents -}) - -watchValue(options, o => { - document.body.classList.toggle('disable-assets', o.disableAssets) -}) -watchValue(options, o => { - document.body.style.setProperty('--touch-movement-buttons-opacity', (o.touchButtonsOpacity / 100).toString()) -}) -watchValue(options, o => { - document.body.style.setProperty('--touch-movement-buttons-position', (o.touchButtonsPosition * 2) + 'px') -}) - -export const useOptionValue = (setting, valueCallback) => { - valueCallback(setting) - subscribe(setting, valueCallback) -} - -export const getAppLanguage = () => { - if (options.language === 'auto') { - return miscUiState.appConfig?.defaultLanguage ?? navigator.language - } - return options.language -} - -export { defaultOptions } from './defaultOptions' diff --git a/src/packetsReplay/packetsReplayLegacy.ts b/src/packetsReplay/packetsReplayLegacy.ts deleted file mode 100644 index a9cc71ec..00000000 --- a/src/packetsReplay/packetsReplayLegacy.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { proxy } from 'valtio' -import { PacketsLogger } from 'mcraft-fun-mineflayer/build/packetsLogger' -import { options } from '../optionsStorage' - -export const packetsRecordingState = proxy({ - active: options.packetsRecordingAutoStart, - hasRecordedPackets: false -}) - -// eslint-disable-next-line import/no-mutable-exports -export let replayLogger: PacketsLogger | undefined - -const isBufferData = (data: any): boolean => { - if (Buffer.isBuffer(data) || data instanceof Uint8Array) return true - if (typeof data === 'object' && data !== null) { - return Object.values(data).some(value => isBufferData(value)) - } - return false -} - -const processPacketData = (data: any): any => { - if (options.packetsLoggerPreset === 'no-buffers') { - if (Buffer.isBuffer(data)) { - return '[buffer]' - } - if (typeof data === 'object' && data !== null) { - const processed = {} - for (const [key, value] of Object.entries(data)) { - processed[key] = isBufferData(value) ? '[buffer]' : value - } - return processed - } - } - return data -} - -export default () => { - customEvents.on('mineflayerBotCreated', () => { - replayLogger = new PacketsLogger({ minecraftVersion: bot.version }) - replayLogger.contents = '' - packetsRecordingState.hasRecordedPackets = false - const handleServerPacket = (data, { name, state = bot._client.state }) => { - if (!packetsRecordingState.active) { - return - } - replayLogger!.log(true, { name, state }, processPacketData(data)) - packetsRecordingState.hasRecordedPackets = true - } - bot._client.on('packet', handleServerPacket) - bot._client.on('packet_name' as any, (name, data) => { - handleServerPacket(data, { name }) - }) - - bot._client.on('writePacket' as any, (name, data) => { - if (!packetsRecordingState.active) { - return - } - replayLogger!.log(false, { name, state: bot._client.state }, processPacketData(data)) - packetsRecordingState.hasRecordedPackets = true - }) - }) -} - -export const downloadPacketsReplay = async () => { - const a = document.createElement('a') - a.href = `data:text/plain;charset=utf-8,${encodeURIComponent(replayLogger!.contents)}` - a.download = `packets-replay-${new Date().toISOString()}.txt` - a.click() -} -globalThis.downloadPacketsReplay = downloadPacketsReplay diff --git a/src/packetsReplay/replayPackets.ts b/src/packetsReplay/replayPackets.ts deleted file mode 100644 index 54b3d652..00000000 --- a/src/packetsReplay/replayPackets.ts +++ /dev/null @@ -1,366 +0,0 @@ -/* eslint-disable no-await-in-loop */ -import { createServer, ServerClient } from 'minecraft-protocol' -import { ParsedReplayPacket, parseReplayContents } from 'mcraft-fun-mineflayer/build/packetsLogger' -import { PACKETS_REPLAY_FILE_EXTENSION, WORLD_STATE_FILE_EXTENSION } from 'mcraft-fun-mineflayer/build/worldState' -import MinecraftData from 'minecraft-data' -import { GameMode } from 'mineflayer' -import { UserError } from '../mineflayer/userError' -import { packetsReplayState } from '../react/state/packetsReplayState' -import { getFixedFilesize } from '../react/simpleUtils' -import { appQueryParams } from '../appParams' -import { LocalServer } from '../customServer' - -const SUPPORTED_FORMAT_VERSION = 1 - -type ReplayDefinition = { - minecraftVersion: string - replayAgainst?: 'client' | 'server' - serverIp?: string -} - -interface OpenFileOptions { - contents: string - filename?: string - filesize?: number -} - -export function openFile ({ contents, filename = 'unnamed', filesize }: OpenFileOptions) { - packetsReplayState.replayName = `${filename} (${getFixedFilesize(filesize ?? contents.length)})` - packetsReplayState.isPlaying = false - - const connectOptions = { - worldStateFileContents: contents, - username: 'replay' - } - dispatchEvent(new CustomEvent('connect', { detail: connectOptions })) -} - -export const startLocalReplayServer = (contents: string) => { - const { packets, header } = parseReplayContents(contents) - - packetsReplayState.packetsPlayback = [] - packetsReplayState.isOpen = true - packetsReplayState.isPlaying = true - packetsReplayState.progress = { - current: 0, - total: packets.filter(packet => packet.isFromServer).length - } - packetsReplayState.speed = 1 - packetsReplayState.replayName ||= `local ${getFixedFilesize(contents.length)}` - packetsReplayState.replayName = `${header.minecraftVersion} ${packetsReplayState.replayName}` - - if ('formatVersion' in header && header.formatVersion !== SUPPORTED_FORMAT_VERSION) { - throw new UserError(`Unsupported format version: ${header.formatVersion}`) - } - if ('replayAgainst' in header && header.replayAgainst === 'server') { - throw new Error('not supported') - } - - const server = createServer({ - Server: LocalServer as any, - version: header.minecraftVersion, - keepAlive: false, - 'online-mode': false - }) - - const data = MinecraftData(header.minecraftVersion) - server.on(data.supportFeature('hasConfigurationState') ? 'playerJoin' : 'login' as any, async client => { - await mainPacketsReplayer( - client, - packets, - packetsReplayState.customButtons.validateClientPackets.state ? undefined : true - ) - }) - - return { - server, - version: header.minecraftVersion - } -} - -// time based packets -// const FLATTEN_CLIENT_PACKETS = new Set(['position', 'position_look']) -const FLATTEN_CLIENT_PACKETS = new Set([] as string[]) - -const positions = { - client: 0, - server: 0 -} -const addPacketToReplayer = (name: string, data, isFromClient: boolean, wasUpcoming = false) => { - const side = isFromClient ? 'client' : 'server' - - if (wasUpcoming) { - const lastUpcoming = packetsReplayState.packetsPlayback.find(p => p.isUpcoming && p.name === name) - if (lastUpcoming) { - lastUpcoming.isUpcoming = false - } - } else { - packetsReplayState.packetsPlayback.push({ - name, - data, - isFromClient, - position: ++positions[side]!, - isUpcoming: false, - timestamp: Date.now() - }) - } - - if (!isFromClient && !wasUpcoming) { - packetsReplayState.progress.current++ - } -} - -const IGNORE_SERVER_PACKETS = new Set([ - 'kick_disconnect', -]) - -const ADDITIONAL_DELAY = 500 - -const mainPacketsReplayer = async (client: ServerClient, packets: ParsedReplayPacket[], ignoreClientPacketsWait: string[] | true = []) => { - const writePacket = (name: string, data: any) => { - data = restoreData(data) - client.write(name, data) - } - - const playPackets = packets.filter(p => p.state === 'play') - - let clientPackets = [] as Array<{ name: string, params: any }> - const clientsPacketsWaiter = createPacketsWaiter({ - unexpectedPacketReceived (name, params) { - console.log('unexpectedPacketReceived', name, params) - addPacketToReplayer(name, params, true) - }, - expectedPacketReceived (name, params) { - console.log('expectedPacketReceived', name, params) - addPacketToReplayer(name, params, true, true) - }, - unexpectedPacketsLimit: 15, - onUnexpectedPacketsLimitReached () { - addPacketToReplayer('...', {}, true) - } - }) - - // Patch console.error to detect errors - const originalConsoleError = console.error - let lastSentPacket: { name: string, params: any } | null = null - console.error = (...args) => { - if (lastSentPacket) { - console.log('Got error after packet', lastSentPacket.name, lastSentPacket.params) - } - originalConsoleError.apply(console, args) - if (packetsReplayState.customButtons.stopOnError.state) { - packetsReplayState.isPlaying = false - throw new Error('Replay stopped due to error: ' + args.join(' ')) - } - } - - const playServerPacket = (name: string, params: any) => { - try { - writePacket(name, params) - addPacketToReplayer(name, params, false) - lastSentPacket = { name, params } - } catch (err) { - console.error('Error processing packet:', err) - if (packetsReplayState.customButtons.stopOnError.state) { - packetsReplayState.isPlaying = false - } - } - } - - try { - bot.on('error', (err) => { - console.error('Mineflayer error:', err) - }) - - bot._client.on('writePacket' as any, (name, params) => { - clientsPacketsWaiter.addPacket(name, params) - }) - - console.log('start replaying!') - for (const [i, packet] of playPackets.entries()) { - if (!packetsReplayState.isPlaying) { - await new Promise(resolve => { - const interval = setInterval(() => { - if (packetsReplayState.isPlaying) { - clearInterval(interval) - resolve() - } - }, 100) - }) - } - - if (packet.isFromServer) { - if (packet.params === null) { - console.warn('packet.params is null', packet) - continue - } - playServerPacket(packet.name, packet.params) - if (packet.diff) { - await new Promise(resolve => { - setTimeout(resolve, packet.diff * packetsReplayState.speed + ADDITIONAL_DELAY * (packetsReplayState.customButtons.packetsSenderDelay.state ? 1 : 0)) - }) - } - } else if (ignoreClientPacketsWait !== true && !ignoreClientPacketsWait.includes(packet.name)) { - clientPackets.push({ name: packet.name, params: packet.params }) - if (playPackets[i + 1]?.isFromServer) { - // eslint-disable-next-line @typescript-eslint/no-loop-func - clientPackets = clientPackets.filter((p, index) => { - return !FLATTEN_CLIENT_PACKETS.has(p.name) || index === clientPackets.findIndex(clientPacket => clientPacket.name === p.name) - }) - for (const packet of clientPackets) { - packetsReplayState.packetsPlayback.push({ - name: packet.name, - data: packet.params, - isFromClient: true, - position: positions.client++, - timestamp: Date.now(), - isUpcoming: true, - }) - } - - await Promise.race([ - clientsPacketsWaiter.waitForPackets(clientPackets.map(p => p.name)), - ...(packetsReplayState.customButtons.skipMissingOnTimeout.state ? [new Promise(resolve => { - setTimeout(resolve, 1000) - })] : []) - ]) - clientsPacketsWaiter.stopWaiting() - clientPackets = [] - } - } - } - } finally { - // Restore original console.error - console.error = originalConsoleError - } -} - -export const switchGameMode = (gameMode: GameMode) => { - const gamemodes = { - survival: 0, - creative: 1, - adventure: 2, - spectator: 3 - } - if (gameMode === 'spectator') { - bot._client.emit('abilities', { - // can fly + is flying - flags: 6 - }) - } - bot._client.emit('game_state_change', { - reason: 3, - gameMode: gamemodes[gameMode] - }) -} - -interface PacketsWaiterOptions { - unexpectedPacketReceived?: (name: string, params: any) => void - expectedPacketReceived?: (name: string, params: any) => void - onUnexpectedPacketsLimitReached?: () => void - unexpectedPacketsLimit?: number -} - -interface PacketsWaiter { - addPacket(name: string, params: any): void - waitForPackets(packets: string[]): Promise - stopWaiting(): void -} - -const createPacketsWaiter = (options: PacketsWaiterOptions = {}): PacketsWaiter => { - let packetHandler: ((data: any, name: string) => void) | null = null - const queuedPackets: Array<{ name: string, params: any }> = [] - let isWaiting = false - let unexpectedPacketsCount = 0 - const handlePacket = (data: any, name: string, waitingPackets: string[], resolve: () => void) => { - if (waitingPackets.includes(name)) { - waitingPackets.splice(waitingPackets.indexOf(name), 1) - options.expectedPacketReceived?.(name, data) - } else { - if (options.unexpectedPacketsLimit && unexpectedPacketsCount < options.unexpectedPacketsLimit) { - options.unexpectedPacketReceived?.(name, data) - } - if (options.onUnexpectedPacketsLimitReached && unexpectedPacketsCount === options.unexpectedPacketsLimit) { - options.onUnexpectedPacketsLimitReached?.() - } - unexpectedPacketsCount++ - } - - if (waitingPackets.length === 0) { - resolve() - } - } - - return { - addPacket (name: string, params: any) { - if (packetHandler) { - packetHandler(params, name) - } else { - queuedPackets.push({ name, params }) - } - }, - - async waitForPackets (packets: string[]) { - if (isWaiting) { - throw new Error('Already waiting for packets') - } - unexpectedPacketsCount = 0 - isWaiting = true - - try { - await new Promise(resolve => { - const waitingPackets = [...packets] - - packetHandler = (data: any, name: string) => { - handlePacket(data, name, waitingPackets, resolve) - } - - // Process any queued packets - for (const packet of queuedPackets) { - handlePacket(packet.params, packet.name, waitingPackets, resolve) - } - queuedPackets.length = 0 - }) - } finally { - isWaiting = false - packetHandler = null - } - }, - stopWaiting () { - isWaiting = false - packetHandler = null - queuedPackets.length = 0 - } - } -} - -const isArrayEqual = (a: any[], b: any[]) => { - if (a.length !== b.length) return false - for (const [i, element] of a.entries()) { - if (element !== b[i]) return false - } - return true -} - -const restoreData = (json: any) => { - if (!json) return json - const keys = Object.keys(json) - - if (isArrayEqual(keys.sort(), ['data', 'type'].sort())) { - if (json.type === 'Buffer') { - return Buffer.from(json.data) - } - } - - if (typeof json === 'object' && json) { - for (const [key, value] of Object.entries(json)) { - if (typeof value === 'object') { - json[key] = restoreData(value) - } - } - } - - return json -} - -export const VALID_REPLAY_EXTENSIONS = [`.${PACKETS_REPLAY_FILE_EXTENSION}`, `.${WORLD_STATE_FILE_EXTENSION}`] diff --git a/src/parseServerAddress.ts b/src/parseServerAddress.ts deleted file mode 100644 index acedf70a..00000000 --- a/src/parseServerAddress.ts +++ /dev/null @@ -1,54 +0,0 @@ - - -export const parseServerAddress = (address: string | undefined, removeHttp = true): ParsedServerAddress => { - if (!address) { - return { host: '', isWebSocket: false, serverIpFull: '' } - } - - if (/^ws:[^/]/.test(address)) address = address.replace('ws:', 'ws://') - if (/^wss:[^/]/.test(address)) address = address.replace('wss:', 'wss://') - const isWebSocket = address.startsWith('ws://') || address.startsWith('wss://') - if (isWebSocket) { - return { host: address, isWebSocket: true, serverIpFull: address } - } - - if (removeHttp) { - address = address.replace(/^https?:\/\//, '') - } - - const parts = address.split(':') - - let version: string | null = null - let port: string | null = null - - for (let i = 0; i < parts.length; i++) { - const part = parts[i] - if (/^\d+\.\d+(\.\d+)?$/.test(part)) { - version = part - parts.splice(i, 1) - i-- - } - if (/^\d+$/.test(part)) { - port = part - parts.splice(i, 1) - i-- - } - } - - const host = parts.join(':') - return { - host, - ...(port ? { port } : {}), - ...(version ? { version } : {}), - isWebSocket: false, - serverIpFull: port ? `${host}:${port}` : host - } -} - -export interface ParsedServerAddress { - host: string - port?: string - version?: string - isWebSocket: boolean - serverIpFull: string -} diff --git a/src/preflatMap.json b/src/preflatMap.json deleted file mode 100644 index 81c2a20a..00000000 --- a/src/preflatMap.json +++ /dev/null @@ -1,1741 +0,0 @@ -{ - "blocks": { - "0:0": "air", - "1:0": "stone", - "1:1": "granite", - "1:2": "polished_granite", - "1:3": "diorite", - "1:4": "polished_diorite", - "1:5": "andesite", - "1:6": "polished_andesite", - "2:0": "grass_block[snowy=false]", - "3:0": "dirt", - "3:1": "coarse_dirt", - "3:2": "podzol[snowy=false]", - "4:0": "cobblestone", - "5:0": "oak_planks", - "5:1": "spruce_planks", - "5:2": "birch_planks", - "5:3": "jungle_planks", - "5:4": "acacia_planks", - "5:5": "dark_oak_planks", - "6:0": "oak_sapling[stage=0]", - "6:1": "spruce_sapling[stage=0]", - "6:2": "birch_sapling[stage=0]", - "6:3": "jungle_sapling[stage=0]", - "6:4": "acacia_sapling[stage=0]", - "6:5": "dark_oak_sapling[stage=0]", - "6:8": "oak_sapling[stage=1]", - "6:9": "spruce_sapling[stage=1]", - "6:10": "birch_sapling[stage=1]", - "6:11": "jungle_sapling[stage=1]", - "6:12": "acacia_sapling[stage=1]", - "6:13": "dark_oak_sapling[stage=1]", - "7:0": "bedrock", - "8:0": "water[level=0]", - "8:1": "water[level=1]", - "8:2": "water[level=2]", - "8:3": "water[level=3]", - "8:4": "water[level=4]", - "8:5": "water[level=5]", - "8:6": "water[level=6]", - "8:7": "water[level=7]", - "8:8": "water[level=8]", - "8:9": "water[level=9]", - "8:10": "water[level=10]", - "8:11": "water[level=11]", - "8:12": "water[level=12]", - "8:13": "water[level=13]", - "8:14": "water[level=14]", - "8:15": "water[level=15]", - "9:0": "water[level=0]", - "9:1": "water[level=1]", - "9:2": "water[level=2]", - "9:3": "water[level=3]", - "9:4": "water[level=4]", - "9:5": "water[level=5]", - "9:6": "water[level=6]", - "9:7": "water[level=7]", - "9:8": "water[level=8]", - "9:9": "water[level=9]", - "9:10": "water[level=10]", - "9:11": "water[level=11]", - "9:12": "water[level=12]", - "9:13": "water[level=13]", - "9:14": "water[level=14]", - "9:15": "water[level=15]", - "10:0": "lava[level=0]", - "10:1": "lava[level=1]", - "10:2": "lava[level=2]", - "10:3": "lava[level=3]", - "10:4": "lava[level=4]", - "10:5": "lava[level=5]", - "10:6": "lava[level=6]", - "10:7": "lava[level=7]", - "10:8": "lava[level=8]", - "10:9": "lava[level=9]", - "10:10": "lava[level=10]", - "10:11": "lava[level=11]", - "10:12": "lava[level=12]", - "10:13": "lava[level=13]", - "10:14": "lava[level=14]", - "10:15": "lava[level=15]", - "11:0": "lava[level=0]", - "11:1": "lava[level=1]", - "11:2": "lava[level=2]", - "11:3": "lava[level=3]", - "11:4": "lava[level=4]", - "11:5": "lava[level=5]", - "11:6": "lava[level=6]", - "11:7": "lava[level=7]", - "11:8": "lava[level=8]", - "11:9": "lava[level=9]", - "11:10": "lava[level=10]", - "11:11": "lava[level=11]", - "11:12": "lava[level=12]", - "11:13": "lava[level=13]", - "11:14": "lava[level=14]", - "11:15": "lava[level=15]", - "12:0": "sand", - "12:1": "red_sand", - "13:0": "gravel", - "14:0": "gold_ore", - "15:0": "iron_ore", - "16:0": "coal_ore", - "17:0": "oak_log[axis=y]", - "17:1": "spruce_log[axis=y]", - "17:2": "birch_log[axis=y]", - "17:3": "jungle_log[axis=y]", - "17:4": "oak_log[axis=x]", - "17:5": "spruce_log[axis=x]", - "17:6": "birch_log[axis=x]", - "17:7": "jungle_log[axis=x]", - "17:8": "oak_log[axis=z]", - "17:9": "spruce_log[axis=z]", - "17:10": "birch_log[axis=z]", - "17:11": "jungle_log[axis=z]", - "17:12": "oak_bark", - "17:13": "spruce_bark", - "17:14": "birch_bark", - "17:15": "jungle_bark", - "18:0": "oak_leaves[check_decay=false,decayable=true]", - "18:1": "spruce_leaves[check_decay=false,decayable=true]", - "18:2": "birch_leaves[check_decay=false,decayable=true]", - "18:3": "jungle_leaves[check_decay=false,decayable=true]", - "18:4": "oak_leaves[check_decay=false,decayable=false]", - "18:5": "spruce_leaves[check_decay=false,decayable=false]", - "18:6": "birch_leaves[check_decay=false,decayable=false]", - "18:7": "jungle_leaves[check_decay=false,decayable=false]", - "18:8": "oak_leaves[check_decay=true,decayable=true]", - "18:9": "spruce_leaves[check_decay=true,decayable=true]", - "18:10": "birch_leaves[check_decay=true,decayable=true]", - "18:11": "jungle_leaves[check_decay=true,decayable=true]", - "18:12": "oak_leaves[check_decay=true,decayable=false]", - "18:13": "spruce_leaves[check_decay=true,decayable=false]", - "18:14": "birch_leaves[check_decay=true,decayable=false]", - "18:15": "jungle_leaves[check_decay=true,decayable=false]", - "19:0": "sponge", - "19:1": "wet_sponge", - "20:0": "glass", - "21:0": "lapis_ore", - "22:0": "lapis_block", - "23:0": "dispenser[facing=down,triggered=false]", - "23:1": "dispenser[facing=up,triggered=false]", - "23:2": "dispenser[facing=north,triggered=false]", - "23:3": "dispenser[facing=south,triggered=false]", - "23:4": "dispenser[facing=west,triggered=false]", - "23:5": "dispenser[facing=east,triggered=false]", - "23:8": "dispenser[facing=down,triggered=true]", - "23:9": "dispenser[facing=up,triggered=true]", - "23:10": "dispenser[facing=north,triggered=true]", - "23:11": "dispenser[facing=south,triggered=true]", - "23:12": "dispenser[facing=west,triggered=true]", - "23:13": "dispenser[facing=east,triggered=true]", - "24:0": "sandstone", - "24:1": "chiseled_sandstone", - "24:2": "cut_sandstone", - "25:0": "note_block", - "26:0": "red_bed[facing=south,occupied=false,part=foot]", - "26:1": "red_bed[facing=west,occupied=false,part=foot]", - "26:2": "red_bed[facing=north,occupied=false,part=foot]", - "26:3": "red_bed[facing=east,occupied=false,part=foot]", - "26:8": "red_bed[facing=south,occupied=false,part=head]", - "26:9": "red_bed[facing=west,occupied=false,part=head]", - "26:10": "red_bed[facing=north,occupied=false,part=head]", - "26:11": "red_bed[facing=east,occupied=false,part=head]", - "26:12": "red_bed[facing=south,occupied=true,part=head]", - "26:13": "red_bed[facing=west,occupied=true,part=head]", - "26:14": "red_bed[facing=north,occupied=true,part=head]", - "26:15": "red_bed[facing=east,occupied=true,part=head]", - "27:0": "powered_rail[powered=false,shape=north_south]", - "27:1": "powered_rail[powered=false,shape=east_west]", - "27:2": "powered_rail[powered=false,shape=ascending_east]", - "27:3": "powered_rail[powered=false,shape=ascending_west]", - "27:4": "powered_rail[powered=false,shape=ascending_north]", - "27:5": "powered_rail[powered=false,shape=ascending_south]", - "27:8": "powered_rail[powered=true,shape=north_south]", - "27:9": "powered_rail[powered=true,shape=east_west]", - "27:10": "powered_rail[powered=true,shape=ascending_east]", - "27:11": "powered_rail[powered=true,shape=ascending_west]", - "27:12": "powered_rail[powered=true,shape=ascending_north]", - "27:13": "powered_rail[powered=true,shape=ascending_south]", - "28:0": "detector_rail[powered=false,shape=north_south]", - "28:1": "detector_rail[powered=false,shape=east_west]", - "28:2": "detector_rail[powered=false,shape=ascending_east]", - "28:3": "detector_rail[powered=false,shape=ascending_west]", - "28:4": "detector_rail[powered=false,shape=ascending_north]", - "28:5": "detector_rail[powered=false,shape=ascending_south]", - "28:8": "detector_rail[powered=true,shape=north_south]", - "28:9": "detector_rail[powered=true,shape=east_west]", - "28:10": "detector_rail[powered=true,shape=ascending_east]", - "28:11": "detector_rail[powered=true,shape=ascending_west]", - "28:12": "detector_rail[powered=true,shape=ascending_north]", - "28:13": "detector_rail[powered=true,shape=ascending_south]", - "29:0": "sticky_piston[extended=false,facing=down]", - "29:1": "sticky_piston[extended=false,facing=up]", - "29:2": "sticky_piston[extended=false,facing=north]", - "29:3": "sticky_piston[extended=false,facing=south]", - "29:4": "sticky_piston[extended=false,facing=west]", - "29:5": "sticky_piston[extended=false,facing=east]", - "29:8": "sticky_piston[extended=true,facing=down]", - "29:9": "sticky_piston[extended=true,facing=up]", - "29:10": "sticky_piston[extended=true,facing=north]", - "29:11": "sticky_piston[extended=true,facing=south]", - "29:12": "sticky_piston[extended=true,facing=west]", - "29:13": "sticky_piston[extended=true,facing=east]", - "30:0": "cobweb", - "31:0": "dead_bush", - "31:1": "grass", - "31:2": "fern", - "32:0": "dead_bush", - "33:0": "piston[extended=false,facing=down]", - "33:1": "piston[extended=false,facing=up]", - "33:2": "piston[extended=false,facing=north]", - "33:3": "piston[extended=false,facing=south]", - "33:4": "piston[extended=false,facing=west]", - "33:5": "piston[extended=false,facing=east]", - "33:8": "piston[extended=true,facing=down]", - "33:9": "piston[extended=true,facing=up]", - "33:10": "piston[extended=true,facing=north]", - "33:11": "piston[extended=true,facing=south]", - "33:12": "piston[extended=true,facing=west]", - "33:13": "piston[extended=true,facing=east]", - "34:0": "piston_head[facing=down,short=false,type=normal]", - "34:1": "piston_head[facing=up,short=false,type=normal]", - "34:2": "piston_head[facing=north,short=false,type=normal]", - "34:3": "piston_head[facing=south,short=false,type=normal]", - "34:4": "piston_head[facing=west,short=false,type=normal]", - "34:5": "piston_head[facing=east,short=false,type=normal]", - "34:8": "piston_head[facing=down,short=false,type=sticky]", - "34:9": "piston_head[facing=up,short=false,type=sticky]", - "34:10": "piston_head[facing=north,short=false,type=sticky]", - "34:11": "piston_head[facing=south,short=false,type=sticky]", - "34:12": "piston_head[facing=west,short=false,type=sticky]", - "34:13": "piston_head[facing=east,short=false,type=sticky]", - "35:0": "white_wool", - "35:1": "orange_wool", - "35:2": "magenta_wool", - "35:3": "light_blue_wool", - "35:4": "yellow_wool", - "35:5": "lime_wool", - "35:6": "pink_wool", - "35:7": "gray_wool", - "35:8": "light_gray_wool", - "35:9": "cyan_wool", - "35:10": "purple_wool", - "35:11": "blue_wool", - "35:12": "brown_wool", - "35:13": "green_wool", - "35:14": "red_wool", - "35:15": "black_wool", - "36:0": "moving_piston[facing=down,type=normal]", - "36:1": "moving_piston[facing=up,type=normal]", - "36:2": "moving_piston[facing=north,type=normal]", - "36:3": "moving_piston[facing=south,type=normal]", - "36:4": "moving_piston[facing=west,type=normal]", - "36:5": "moving_piston[facing=east,type=normal]", - "36:8": "moving_piston[facing=down,type=sticky]", - "36:9": "moving_piston[facing=up,type=sticky]", - "36:10": "moving_piston[facing=north,type=sticky]", - "36:11": "moving_piston[facing=south,type=sticky]", - "36:12": "moving_piston[facing=west,type=sticky]", - "36:13": "moving_piston[facing=east,type=sticky]", - "37:0": "dandelion", - "38:0": "poppy", - "38:1": "blue_orchid", - "38:2": "allium", - "38:3": "azure_bluet", - "38:4": "red_tulip", - "38:5": "orange_tulip", - "38:6": "white_tulip", - "38:7": "pink_tulip", - "38:8": "oxeye_daisy", - "39:0": "brown_mushroom", - "40:0": "red_mushroom", - "41:0": "gold_block", - "42:0": "iron_block", - "43:0": "stone_slab[type=double]", - "43:1": "sandstone_slab[type=double]", - "43:2": "petrified_oak_slab[type=double]", - "43:3": "cobblestone_slab[type=double]", - "43:4": "brick_slab[type=double]", - "43:5": "stone_brick_slab[type=double]", - "43:6": "nether_brick_slab[type=double]", - "43:7": "quartz_slab[type=double]", - "43:8": "smooth_stone", - "43:9": "smooth_sandstone", - "43:10": "petrified_oak_slab[type=double]", - "43:11": "cobblestone_slab[type=double]", - "43:12": "brick_slab[type=double]", - "43:13": "stone_brick_slab[type=double]", - "43:14": "nether_brick_slab[type=double]", - "43:15": "smooth_quartz", - "44:0": "stone_slab[type=bottom]", - "44:1": "sandstone_slab[type=bottom]", - "44:2": "petrified_oak_slab[type=bottom]", - "44:3": "cobblestone_slab[type=bottom]", - "44:4": "brick_slab[type=bottom]", - "44:5": "stone_brick_slab[type=bottom]", - "44:6": "nether_brick_slab[type=bottom]", - "44:7": "quartz_slab[type=bottom]", - "44:8": "stone_slab[type=top]", - "44:9": "sandstone_slab[type=top]", - "44:10": "petrified_oak_slab[type=top]", - "44:11": "cobblestone_slab[type=top]", - "44:12": "brick_slab[type=top]", - "44:13": "stone_brick_slab[type=top]", - "44:14": "nether_brick_slab[type=top]", - "44:15": "quartz_slab[type=top]", - "45:0": "bricks", - "46:0": "tnt[unstable=false]", - "46:1": "tnt[unstable=true]", - "47:0": "bookshelf", - "48:0": "mossy_cobblestone", - "49:0": "obsidian", - "50:1": "wall_torch[facing=east]", - "50:2": "wall_torch[facing=west]", - "50:3": "wall_torch[facing=south]", - "50:4": "wall_torch[facing=north]", - "50:5": "torch", - "51:0": "fire[age=0,east=false,north=false,south=false,up=false,west=false]", - "51:1": "fire[age=1,east=false,north=false,south=false,up=false,west=false]", - "51:2": "fire[age=2,east=false,north=false,south=false,up=false,west=false]", - "51:3": "fire[age=3,east=false,north=false,south=false,up=false,west=false]", - "51:4": "fire[age=4,east=false,north=false,south=false,up=false,west=false]", - "51:5": "fire[age=5,east=false,north=false,south=false,up=false,west=false]", - "51:6": "fire[age=6,east=false,north=false,south=false,up=false,west=false]", - "51:7": "fire[age=7,east=false,north=false,south=false,up=false,west=false]", - "51:8": "fire[age=8,east=false,north=false,south=false,up=false,west=false]", - "51:9": "fire[age=9,east=false,north=false,south=false,up=false,west=false]", - "51:10": "fire[age=10,east=false,north=false,south=false,up=false,west=false]", - "51:11": "fire[age=11,east=false,north=false,south=false,up=false,west=false]", - "51:12": "fire[age=12,east=false,north=false,south=false,up=false,west=false]", - "51:13": "fire[age=13,east=false,north=false,south=false,up=false,west=false]", - "51:14": "fire[age=14,east=false,north=false,south=false,up=false,west=false]", - "51:15": "fire[age=15,east=false,north=false,south=false,up=false,west=false]", - "52:0": "mob_spawner", - "53:0": "oak_stairs[facing=east,half=bottom,shape=straight]", - "53:1": "oak_stairs[facing=west,half=bottom,shape=straight]", - "53:2": "oak_stairs[facing=south,half=bottom,shape=straight]", - "53:3": "oak_stairs[facing=north,half=bottom,shape=straight]", - "53:4": "oak_stairs[facing=east,half=top,shape=straight]", - "53:5": "oak_stairs[facing=west,half=top,shape=straight]", - "53:6": "oak_stairs[facing=south,half=top,shape=straight]", - "53:7": "oak_stairs[facing=north,half=top,shape=straight]", - "54:2": "chest[facing=north,type=single]", - "54:3": "chest[facing=south,type=single]", - "54:4": "chest[facing=west,type=single]", - "54:5": "chest[facing=east,type=single]", - "55:0": "redstone_wire[east=none,north=none,power=0,south=none,west=none]", - "55:1": "redstone_wire[east=none,north=none,power=1,south=none,west=none]", - "55:2": "redstone_wire[east=none,north=none,power=2,south=none,west=none]", - "55:3": "redstone_wire[east=none,north=none,power=3,south=none,west=none]", - "55:4": "redstone_wire[east=none,north=none,power=4,south=none,west=none]", - "55:5": "redstone_wire[east=none,north=none,power=5,south=none,west=none]", - "55:6": "redstone_wire[east=none,north=none,power=6,south=none,west=none]", - "55:7": "redstone_wire[east=none,north=none,power=7,south=none,west=none]", - "55:8": "redstone_wire[east=none,north=none,power=8,south=none,west=none]", - "55:9": "redstone_wire[east=none,north=none,power=9,south=none,west=none]", - "55:10": "redstone_wire[east=none,north=none,power=10,south=none,west=none]", - "55:11": "redstone_wire[east=none,north=none,power=11,south=none,west=none]", - "55:12": "redstone_wire[east=none,north=none,power=12,south=none,west=none]", - "55:13": "redstone_wire[east=none,north=none,power=13,south=none,west=none]", - "55:14": "redstone_wire[east=none,north=none,power=14,south=none,west=none]", - "55:15": "redstone_wire[east=none,north=none,power=15,south=none,west=none]", - "56:0": "diamond_ore", - "57:0": "diamond_block", - "58:0": "crafting_table", - "59:0": "wheat[age=0]", - "59:1": "wheat[age=1]", - "59:2": "wheat[age=2]", - "59:3": "wheat[age=3]", - "59:4": "wheat[age=4]", - "59:5": "wheat[age=5]", - "59:6": "wheat[age=6]", - "59:7": "wheat[age=7]", - "60:0": "farmland[moisture=0]", - "60:1": "farmland[moisture=1]", - "60:2": "farmland[moisture=2]", - "60:3": "farmland[moisture=3]", - "60:4": "farmland[moisture=4]", - "60:5": "farmland[moisture=5]", - "60:6": "farmland[moisture=6]", - "60:7": "farmland[moisture=7]", - "61:2": "furnace[facing=north,lit=false]", - "61:3": "furnace[facing=south,lit=false]", - "61:4": "furnace[facing=west,lit=false]", - "61:5": "furnace[facing=east,lit=false]", - "62:2": "furnace[facing=north,lit=true]", - "62:3": "furnace[facing=south,lit=true]", - "62:4": "furnace[facing=west,lit=true]", - "62:5": "furnace[facing=east,lit=true]", - "63:0": "sign[rotation=0]", - "63:1": "sign[rotation=1]", - "63:2": "sign[rotation=2]", - "63:3": "sign[rotation=3]", - "63:4": "sign[rotation=4]", - "63:5": "sign[rotation=5]", - "63:6": "sign[rotation=6]", - "63:7": "sign[rotation=7]", - "63:8": "sign[rotation=8]", - "63:9": "sign[rotation=9]", - "63:10": "sign[rotation=10]", - "63:11": "sign[rotation=11]", - "63:12": "sign[rotation=12]", - "63:13": "sign[rotation=13]", - "63:14": "sign[rotation=14]", - "63:15": "sign[rotation=15]", - "64:0": "oak_door[facing=east,half=lower,hinge=right,open=false,powered=false]", - "64:1": "oak_door[facing=south,half=lower,hinge=right,open=false,powered=false]", - "64:2": "oak_door[facing=west,half=lower,hinge=right,open=false,powered=false]", - "64:3": "oak_door[facing=north,half=lower,hinge=right,open=false,powered=false]", - "64:4": "oak_door[facing=east,half=lower,hinge=right,open=true,powered=false]", - "64:5": "oak_door[facing=south,half=lower,hinge=right,open=true,powered=false]", - "64:6": "oak_door[facing=west,half=lower,hinge=right,open=true,powered=false]", - "64:7": "oak_door[facing=north,half=lower,hinge=right,open=true,powered=false]", - "64:8": "oak_door[facing=east,half=upper,hinge=left,open=false,powered=false]", - "64:9": "oak_door[facing=east,half=upper,hinge=right,open=false,powered=false]", - "64:10": "oak_door[facing=east,half=upper,hinge=left,open=false,powered=true]", - "64:11": "oak_door[facing=east,half=upper,hinge=right,open=false,powered=true]", - "65:2": "ladder[facing=north]", - "65:3": "ladder[facing=south]", - "65:4": "ladder[facing=west]", - "65:5": "ladder[facing=east]", - "66:0": "rail[shape=north_south]", - "66:1": "rail[shape=east_west]", - "66:2": "rail[shape=ascending_east]", - "66:3": "rail[shape=ascending_west]", - "66:4": "rail[shape=ascending_north]", - "66:5": "rail[shape=ascending_south]", - "66:6": "rail[shape=south_east]", - "66:7": "rail[shape=south_west]", - "66:8": "rail[shape=north_west]", - "66:9": "rail[shape=north_east]", - "67:0": "cobblestone_stairs[facing=east,half=bottom,shape=straight]", - "67:1": "cobblestone_stairs[facing=west,half=bottom,shape=straight]", - "67:2": "cobblestone_stairs[facing=south,half=bottom,shape=straight]", - "67:3": "cobblestone_stairs[facing=north,half=bottom,shape=straight]", - "67:4": "cobblestone_stairs[facing=east,half=top,shape=straight]", - "67:5": "cobblestone_stairs[facing=west,half=top,shape=straight]", - "67:6": "cobblestone_stairs[facing=south,half=top,shape=straight]", - "67:7": "cobblestone_stairs[facing=north,half=top,shape=straight]", - "68:2": "wall_sign[facing=north]", - "68:3": "wall_sign[facing=south]", - "68:4": "wall_sign[facing=west]", - "68:5": "wall_sign[facing=east]", - "69:0": "lever[face=ceiling,facing=west,powered=false]", - "69:1": "lever[face=wall,facing=east,powered=false]", - "69:2": "lever[face=wall,facing=west,powered=false]", - "69:3": "lever[face=wall,facing=south,powered=false]", - "69:4": "lever[face=wall,facing=north,powered=false]", - "69:5": "lever[face=floor,facing=north,powered=false]", - "69:6": "lever[face=floor,facing=west,powered=false]", - "69:7": "lever[face=ceiling,facing=north,powered=false]", - "69:8": "lever[face=ceiling,facing=west,powered=true]", - "69:9": "lever[face=wall,facing=east,powered=true]", - "69:10": "lever[face=wall,facing=west,powered=true]", - "69:11": "lever[face=wall,facing=south,powered=true]", - "69:12": "lever[face=wall,facing=north,powered=true]", - "69:13": "lever[face=floor,facing=north,powered=true]", - "69:14": "lever[face=floor,facing=west,powered=true]", - "69:15": "lever[face=ceiling,facing=north,powered=true]", - "70:0": "stone_pressure_plate[powered=false]", - "70:1": "stone_pressure_plate[powered=true]", - "71:0": "iron_door[facing=east,half=lower,hinge=right,open=false,powered=false]", - "71:1": "iron_door[facing=south,half=lower,hinge=right,open=false,powered=false]", - "71:2": "iron_door[facing=west,half=lower,hinge=right,open=false,powered=false]", - "71:3": "iron_door[facing=north,half=lower,hinge=right,open=false,powered=false]", - "71:4": "iron_door[facing=east,half=lower,hinge=right,open=true,powered=false]", - "71:5": "iron_door[facing=south,half=lower,hinge=right,open=true,powered=false]", - "71:6": "iron_door[facing=west,half=lower,hinge=right,open=true,powered=false]", - "71:7": "iron_door[facing=north,half=lower,hinge=right,open=true,powered=false]", - "71:8": "iron_door[facing=east,half=upper,hinge=left,open=false,powered=false]", - "71:9": "iron_door[facing=east,half=upper,hinge=right,open=false,powered=false]", - "71:10": "iron_door[facing=east,half=upper,hinge=left,open=false,powered=true]", - "71:11": "iron_door[facing=east,half=upper,hinge=right,open=false,powered=true]", - "72:0": "oak_pressure_plate[powered=false]", - "72:1": "oak_pressure_plate[powered=true]", - "73:0": "redstone_ore[lit=false]", - "74:0": "redstone_ore[lit=true]", - "75:1": "redstone_wall_torch[facing=east,lit=false]", - "75:2": "redstone_wall_torch[facing=west,lit=false]", - "75:3": "redstone_wall_torch[facing=south,lit=false]", - "75:4": "redstone_wall_torch[facing=north,lit=false]", - "75:5": "redstone_torch[lit=false]", - "76:1": "redstone_wall_torch[facing=east,lit=true]", - "76:2": "redstone_wall_torch[facing=west,lit=true]", - "76:3": "redstone_wall_torch[facing=south,lit=true]", - "76:4": "redstone_wall_torch[facing=north,lit=true]", - "76:5": "redstone_torch[lit=true]", - "77:0": "stone_button[face=ceiling,facing=north,powered=false]", - "77:1": "stone_button[face=wall,facing=east,powered=false]", - "77:2": "stone_button[face=wall,facing=west,powered=false]", - "77:3": "stone_button[face=wall,facing=south,powered=false]", - "77:4": "stone_button[face=wall,facing=north,powered=false]", - "77:5": "stone_button[face=floor,facing=north,powered=false]", - "77:8": "stone_button[face=ceiling,facing=north,powered=true]", - "77:9": "stone_button[face=wall,facing=east,powered=true]", - "77:10": "stone_button[face=wall,facing=west,powered=true]", - "77:11": "stone_button[face=wall,facing=south,powered=true]", - "77:12": "stone_button[face=wall,facing=north,powered=true]", - "77:13": "stone_button[face=floor,facing=north,powered=true]", - "78:0": "snow[layers=1]", - "78:1": "snow[layers=2]", - "78:2": "snow[layers=3]", - "78:3": "snow[layers=4]", - "78:4": "snow[layers=5]", - "78:5": "snow[layers=6]", - "78:6": "snow[layers=7]", - "78:7": "snow[layers=8]", - "79:0": "ice", - "80:0": "snow_block", - "81:0": "cactus[age=0]", - "81:1": "cactus[age=1]", - "81:2": "cactus[age=2]", - "81:3": "cactus[age=3]", - "81:4": "cactus[age=4]", - "81:5": "cactus[age=5]", - "81:6": "cactus[age=6]", - "81:7": "cactus[age=7]", - "81:8": "cactus[age=8]", - "81:9": "cactus[age=9]", - "81:10": "cactus[age=10]", - "81:11": "cactus[age=11]", - "81:12": "cactus[age=12]", - "81:13": "cactus[age=13]", - "81:14": "cactus[age=14]", - "81:15": "cactus[age=15]", - "82:0": "clay", - "83:0": "sugar_cane[age=0]", - "83:1": "sugar_cane[age=1]", - "83:2": "sugar_cane[age=2]", - "83:3": "sugar_cane[age=3]", - "83:4": "sugar_cane[age=4]", - "83:5": "sugar_cane[age=5]", - "83:6": "sugar_cane[age=6]", - "83:7": "sugar_cane[age=7]", - "83:8": "sugar_cane[age=8]", - "83:9": "sugar_cane[age=9]", - "83:10": "sugar_cane[age=10]", - "83:11": "sugar_cane[age=11]", - "83:12": "sugar_cane[age=12]", - "83:13": "sugar_cane[age=13]", - "83:14": "sugar_cane[age=14]", - "83:15": "sugar_cane[age=15]", - "84:0": "jukebox[has_record=false]", - "84:1": "jukebox[has_record=true]", - "85:0": "oak_fence[east=false,north=false,south=false,west=false]", - "86:0": "carved_pumpkin[facing=south]", - "86:1": "carved_pumpkin[facing=west]", - "86:2": "carved_pumpkin[facing=north]", - "86:3": "carved_pumpkin[facing=east]", - "87:0": "netherrack", - "88:0": "soul_sand", - "89:0": "glowstone", - "90:1": "portal[axis=x]", - "90:2": "portal[axis=z]", - "91:0": "jack_o_lantern[facing=south]", - "91:1": "jack_o_lantern[facing=west]", - "91:2": "jack_o_lantern[facing=north]", - "91:3": "jack_o_lantern[facing=east]", - "92:0": "cake[bites=0]", - "92:1": "cake[bites=1]", - "92:2": "cake[bites=2]", - "92:3": "cake[bites=3]", - "92:4": "cake[bites=4]", - "92:5": "cake[bites=5]", - "92:6": "cake[bites=6]", - "93:0": "repeater[delay=1,facing=south,locked=false,powered=false]", - "93:1": "repeater[delay=1,facing=west,locked=false,powered=false]", - "93:2": "repeater[delay=1,facing=north,locked=false,powered=false]", - "93:3": "repeater[delay=1,facing=east,locked=false,powered=false]", - "93:4": "repeater[delay=2,facing=south,locked=false,powered=false]", - "93:5": "repeater[delay=2,facing=west,locked=false,powered=false]", - "93:6": "repeater[delay=2,facing=north,locked=false,powered=false]", - "93:7": "repeater[delay=2,facing=east,locked=false,powered=false]", - "93:8": "repeater[delay=3,facing=south,locked=false,powered=false]", - "93:9": "repeater[delay=3,facing=west,locked=false,powered=false]", - "93:10": "repeater[delay=3,facing=north,locked=false,powered=false]", - "93:11": "repeater[delay=3,facing=east,locked=false,powered=false]", - "93:12": "repeater[delay=4,facing=south,locked=false,powered=false]", - "93:13": "repeater[delay=4,facing=west,locked=false,powered=false]", - "93:14": "repeater[delay=4,facing=north,locked=false,powered=false]", - "93:15": "repeater[delay=4,facing=east,locked=false,powered=false]", - "94:0": "repeater[delay=1,facing=south,locked=false,powered=true]", - "94:1": "repeater[delay=1,facing=west,locked=false,powered=true]", - "94:2": "repeater[delay=1,facing=north,locked=false,powered=true]", - "94:3": "repeater[delay=1,facing=east,locked=false,powered=true]", - "94:4": "repeater[delay=2,facing=south,locked=false,powered=true]", - "94:5": "repeater[delay=2,facing=west,locked=false,powered=true]", - "94:6": "repeater[delay=2,facing=north,locked=false,powered=true]", - "94:7": "repeater[delay=2,facing=east,locked=false,powered=true]", - "94:8": "repeater[delay=3,facing=south,locked=false,powered=true]", - "94:9": "repeater[delay=3,facing=west,locked=false,powered=true]", - "94:10": "repeater[delay=3,facing=north,locked=false,powered=true]", - "94:11": "repeater[delay=3,facing=east,locked=false,powered=true]", - "94:12": "repeater[delay=4,facing=south,locked=false,powered=true]", - "94:13": "repeater[delay=4,facing=west,locked=false,powered=true]", - "94:14": "repeater[delay=4,facing=north,locked=false,powered=true]", - "94:15": "repeater[delay=4,facing=east,locked=false,powered=true]", - "95:0": "white_stained_glass", - "95:1": "orange_stained_glass", - "95:2": "magenta_stained_glass", - "95:3": "light_blue_stained_glass", - "95:4": "yellow_stained_glass", - "95:5": "lime_stained_glass", - "95:6": "pink_stained_glass", - "95:7": "gray_stained_glass", - "95:8": "light_gray_stained_glass", - "95:9": "cyan_stained_glass", - "95:10": "purple_stained_glass", - "95:11": "blue_stained_glass", - "95:12": "brown_stained_glass", - "95:13": "green_stained_glass", - "95:14": "red_stained_glass", - "95:15": "black_stained_glass", - "96:0": "oak_trapdoor[facing=north,half=bottom,open=false]", - "96:1": "oak_trapdoor[facing=south,half=bottom,open=false]", - "96:2": "oak_trapdoor[facing=west,half=bottom,open=false]", - "96:3": "oak_trapdoor[facing=east,half=bottom,open=false]", - "96:4": "oak_trapdoor[facing=north,half=bottom,open=true]", - "96:5": "oak_trapdoor[facing=south,half=bottom,open=true]", - "96:6": "oak_trapdoor[facing=west,half=bottom,open=true]", - "96:7": "oak_trapdoor[facing=east,half=bottom,open=true]", - "96:8": "oak_trapdoor[facing=north,half=top,open=false]", - "96:9": "oak_trapdoor[facing=south,half=top,open=false]", - "96:10": "oak_trapdoor[facing=west,half=top,open=false]", - "96:11": "oak_trapdoor[facing=east,half=top,open=false]", - "96:12": "oak_trapdoor[facing=north,half=top,open=true]", - "96:13": "oak_trapdoor[facing=south,half=top,open=true]", - "96:14": "oak_trapdoor[facing=west,half=top,open=true]", - "96:15": "oak_trapdoor[facing=east,half=top,open=true]", - "97:0": "infested_stone", - "97:1": "infested_cobblestone", - "97:2": "infested_stone_bricks", - "97:3": "infested_mossy_stone_bricks", - "97:4": "infested_cracked_stone_bricks", - "97:5": "infested_chiseled_stone_bricks", - "98:0": "stone_bricks", - "98:1": "mossy_stone_bricks", - "98:2": "cracked_stone_bricks", - "98:3": "chiseled_stone_bricks", - "99:0": "brown_mushroom_block[north=false,east=false,south=false,west=false,up=false,down=false]", - "99:1": "brown_mushroom_block[north=true,east=false,south=false,west=true,up=true,down=false]", - "99:2": "brown_mushroom_block[north=true,east=false,south=false,west=false,up=true,down=false]", - "99:3": "brown_mushroom_block[north=true,east=true,south=false,west=false,up=true,down=false]", - "99:4": "brown_mushroom_block[north=false,east=false,south=false,west=true,up=true,down=false]", - "99:5": "brown_mushroom_block[north=false,east=false,south=false,west=false,up=true,down=false]", - "99:6": "brown_mushroom_block[north=false,east=true,south=false,west=false,up=true,down=false]", - "99:7": "brown_mushroom_block[north=false,east=false,south=true,west=true,up=true,down=false]", - "99:8": "brown_mushroom_block[north=false,east=false,south=true,west=false,up=true,down=false]", - "99:9": "brown_mushroom_block[north=false,east=true,south=true,west=false,up=true,down=false]", - "99:10": "mushroom_stem[north=true,east=true,south=true,west=true,up=false,down=false]", - "99:14": "brown_mushroom_block[north=true,east=true,south=true,west=true,up=true,down=true]", - "99:15": "mushroom_stem[north=true,east=true,south=true,west=true,up=true,down=true]", - "100:0": "red_mushroom_block[north=false,east=false,south=false,west=false,up=false,down=false]", - "100:1": "red_mushroom_block[north=true,east=false,south=false,west=true,up=true,down=false]", - "100:2": "red_mushroom_block[north=true,east=false,south=false,west=false,up=true,down=false]", - "100:3": "red_mushroom_block[north=true,east=true,south=false,west=false,up=true,down=false]", - "100:4": "red_mushroom_block[north=false,east=false,south=false,west=true,up=true,down=false]", - "100:5": "red_mushroom_block[north=false,east=false,south=false,west=false,up=true,down=false]", - "100:6": "red_mushroom_block[north=false,east=true,south=false,west=false,up=true,down=false]", - "100:7": "red_mushroom_block[north=false,east=false,south=true,west=true,up=true,down=false]", - "100:8": "red_mushroom_block[north=false,east=false,south=true,west=false,up=true,down=false]", - "100:9": "red_mushroom_block[north=false,east=true,south=true,west=false,up=true,down=false]", - "100:10": "mushroom_stem[north=true,east=true,south=true,west=true,up=false,down=false]", - "100:14": "red_mushroom_block[north=true,east=true,south=true,west=true,up=true,down=true]", - "100:15": "mushroom_stem[north=true,east=true,south=true,west=true,up=true,down=true]", - "101:0": "iron_bars[east=false,north=false,south=false,west=false]", - "102:0": "glass_pane[east=false,north=false,south=false,west=false]", - "103:0": "melon_block", - "104:0": "pumpkin_stem[age=0]", - "104:1": "pumpkin_stem[age=1]", - "104:2": "pumpkin_stem[age=2]", - "104:3": "pumpkin_stem[age=3]", - "104:4": "pumpkin_stem[age=4]", - "104:5": "pumpkin_stem[age=5]", - "104:6": "pumpkin_stem[age=6]", - "104:7": "pumpkin_stem[age=7]", - "105:0": "melon_stem[age=0]", - "105:1": "melon_stem[age=1]", - "105:2": "melon_stem[age=2]", - "105:3": "melon_stem[age=3]", - "105:4": "melon_stem[age=4]", - "105:5": "melon_stem[age=5]", - "105:6": "melon_stem[age=6]", - "105:7": "melon_stem[age=7]", - "106:0": "vine[east=false,north=false,south=false,up=true,west=false]", - "106:1": "vine[east=false,north=false,south=true,up=true,west=false]", - "106:2": "vine[east=false,north=false,south=false,up=true,west=true]", - "106:3": "vine[east=false,north=false,south=true,up=true,west=true]", - "106:4": "vine[east=false,north=true,south=false,up=true,west=false]", - "106:5": "vine[east=false,north=true,south=true,up=true,west=false]", - "106:6": "vine[east=false,north=true,south=false,up=true,west=true]", - "106:7": "vine[east=false,north=true,south=true,up=true,west=true]", - "106:8": "vine[east=true,north=false,south=false,up=true,west=false]", - "106:9": "vine[east=true,north=false,south=true,up=true,west=false]", - "106:10": "vine[east=true,north=false,south=false,up=true,west=true]", - "106:11": "vine[east=true,north=false,south=true,up=true,west=true]", - "106:12": "vine[east=true,north=true,south=false,up=true,west=false]", - "106:13": "vine[east=true,north=true,south=true,up=true,west=false]", - "106:14": "vine[east=true,north=true,south=false,up=true,west=true]", - "106:15": "vine[east=true,north=true,south=true,up=true,west=true]", - "107:0": "oak_fence_gate[facing=south,in_wall=false,open=false,powered=false]", - "107:1": "oak_fence_gate[facing=west,in_wall=false,open=false,powered=false]", - "107:2": "oak_fence_gate[facing=north,in_wall=false,open=false,powered=false]", - "107:3": "oak_fence_gate[facing=east,in_wall=false,open=false,powered=false]", - "107:4": "oak_fence_gate[facing=south,in_wall=false,open=true,powered=false]", - "107:5": "oak_fence_gate[facing=west,in_wall=false,open=true,powered=false]", - "107:6": "oak_fence_gate[facing=north,in_wall=false,open=true,powered=false]", - "107:7": "oak_fence_gate[facing=east,in_wall=false,open=true,powered=false]", - "107:8": "oak_fence_gate[facing=south,in_wall=false,open=false,powered=true]", - "107:9": "oak_fence_gate[facing=west,in_wall=false,open=false,powered=true]", - "107:10": "oak_fence_gate[facing=north,in_wall=false,open=false,powered=true]", - "107:11": "oak_fence_gate[facing=east,in_wall=false,open=false,powered=true]", - "107:12": "oak_fence_gate[facing=south,in_wall=false,open=true,powered=true]", - "107:13": "oak_fence_gate[facing=west,in_wall=false,open=true,powered=true]", - "107:14": "oak_fence_gate[facing=north,in_wall=false,open=true,powered=true]", - "107:15": "oak_fence_gate[facing=east,in_wall=false,open=true,powered=true]", - "108:0": "brick_stairs[facing=east,half=bottom,shape=straight]", - "108:1": "brick_stairs[facing=west,half=bottom,shape=straight]", - "108:2": "brick_stairs[facing=south,half=bottom,shape=straight]", - "108:3": "brick_stairs[facing=north,half=bottom,shape=straight]", - "108:4": "brick_stairs[facing=east,half=top,shape=straight]", - "108:5": "brick_stairs[facing=west,half=top,shape=straight]", - "108:6": "brick_stairs[facing=south,half=top,shape=straight]", - "108:7": "brick_stairs[facing=north,half=top,shape=straight]", - "109:0": "stone_brick_stairs[facing=east,half=bottom,shape=straight]", - "109:1": "stone_brick_stairs[facing=west,half=bottom,shape=straight]", - "109:2": "stone_brick_stairs[facing=south,half=bottom,shape=straight]", - "109:3": "stone_brick_stairs[facing=north,half=bottom,shape=straight]", - "109:4": "stone_brick_stairs[facing=east,half=top,shape=straight]", - "109:5": "stone_brick_stairs[facing=west,half=top,shape=straight]", - "109:6": "stone_brick_stairs[facing=south,half=top,shape=straight]", - "109:7": "stone_brick_stairs[facing=north,half=top,shape=straight]", - "110:0": "mycelium[snowy=false]", - "111:0": "lily_pad", - "112:0": "nether_bricks", - "113:0": "nether_brick_fence[east=false,north=false,south=false,west=false]", - "114:0": "nether_brick_stairs[facing=east,half=bottom,shape=straight]", - "114:1": "nether_brick_stairs[facing=west,half=bottom,shape=straight]", - "114:2": "nether_brick_stairs[facing=south,half=bottom,shape=straight]", - "114:3": "nether_brick_stairs[facing=north,half=bottom,shape=straight]", - "114:4": "nether_brick_stairs[facing=east,half=top,shape=straight]", - "114:5": "nether_brick_stairs[facing=west,half=top,shape=straight]", - "114:6": "nether_brick_stairs[facing=south,half=top,shape=straight]", - "114:7": "nether_brick_stairs[facing=north,half=top,shape=straight]", - "115:0": "nether_wart[age=0]", - "115:1": "nether_wart[age=1]", - "115:2": "nether_wart[age=2]", - "115:3": "nether_wart[age=3]", - "116:0": "enchanting_table", - "117:0": "brewing_stand[has_bottle_0=false,has_bottle_1=false,has_bottle_2=false]", - "117:1": "brewing_stand[has_bottle_0=true,has_bottle_1=false,has_bottle_2=false]", - "117:2": "brewing_stand[has_bottle_0=false,has_bottle_1=true,has_bottle_2=false]", - "117:3": "brewing_stand[has_bottle_0=true,has_bottle_1=true,has_bottle_2=false]", - "117:4": "brewing_stand[has_bottle_0=false,has_bottle_1=false,has_bottle_2=true]", - "117:5": "brewing_stand[has_bottle_0=true,has_bottle_1=false,has_bottle_2=true]", - "117:6": "brewing_stand[has_bottle_0=false,has_bottle_1=true,has_bottle_2=true]", - "117:7": "brewing_stand[has_bottle_0=true,has_bottle_1=true,has_bottle_2=true]", - "118:0": "cauldron[level=0]", - "118:1": "cauldron[level=1]", - "118:2": "cauldron[level=2]", - "118:3": "cauldron[level=3]", - "119:0": "end_portal", - "120:0": "end_portal_frame[eye=false,facing=south]", - "120:1": "end_portal_frame[eye=false,facing=west]", - "120:2": "end_portal_frame[eye=false,facing=north]", - "120:3": "end_portal_frame[eye=false,facing=east]", - "120:4": "end_portal_frame[eye=true,facing=south]", - "120:5": "end_portal_frame[eye=true,facing=west]", - "120:6": "end_portal_frame[eye=true,facing=north]", - "120:7": "end_portal_frame[eye=true,facing=east]", - "121:0": "end_stone", - "122:0": "dragon_egg", - "123:0": "redstone_lamp[lit=false]", - "124:0": "redstone_lamp[lit=true]", - "125:0": "oak_slab[type=double]", - "125:1": "spruce_slab[type=double]", - "125:2": "birch_slab[type=double]", - "125:3": "jungle_slab[type=double]", - "125:4": "acacia_slab[type=double]", - "125:5": "dark_oak_slab[type=double]", - "126:0": "oak_slab[type=bottom]", - "126:1": "spruce_slab[type=bottom]", - "126:2": "birch_slab[type=bottom]", - "126:3": "jungle_slab[type=bottom]", - "126:4": "acacia_slab[type=bottom]", - "126:5": "dark_oak_slab[type=bottom]", - "126:8": "oak_slab[type=top]", - "126:9": "spruce_slab[type=top]", - "126:10": "birch_slab[type=top]", - "126:11": "jungle_slab[type=top]", - "126:12": "acacia_slab[type=top]", - "126:13": "dark_oak_slab[type=top]", - "127:0": "cocoa[age=0,facing=south]", - "127:1": "cocoa[age=0,facing=west]", - "127:2": "cocoa[age=0,facing=north]", - "127:3": "cocoa[age=0,facing=east]", - "127:4": "cocoa[age=1,facing=south]", - "127:5": "cocoa[age=1,facing=west]", - "127:6": "cocoa[age=1,facing=north]", - "127:7": "cocoa[age=1,facing=east]", - "127:8": "cocoa[age=2,facing=south]", - "127:9": "cocoa[age=2,facing=west]", - "127:10": "cocoa[age=2,facing=north]", - "127:11": "cocoa[age=2,facing=east]", - "128:0": "sandstone_stairs[facing=east,half=bottom,shape=straight]", - "128:1": "sandstone_stairs[facing=west,half=bottom,shape=straight]", - "128:2": "sandstone_stairs[facing=south,half=bottom,shape=straight]", - "128:3": "sandstone_stairs[facing=north,half=bottom,shape=straight]", - "128:4": "sandstone_stairs[facing=east,half=top,shape=straight]", - "128:5": "sandstone_stairs[facing=west,half=top,shape=straight]", - "128:6": "sandstone_stairs[facing=south,half=top,shape=straight]", - "128:7": "sandstone_stairs[facing=north,half=top,shape=straight]", - "129:0": "emerald_ore", - "130:2": "ender_chest[facing=north]", - "130:3": "ender_chest[facing=south]", - "130:4": "ender_chest[facing=west]", - "130:5": "ender_chest[facing=east]", - "131:0": "tripwire_hook[attached=false,facing=south,powered=false]", - "131:1": "tripwire_hook[attached=false,facing=west,powered=false]", - "131:2": "tripwire_hook[attached=false,facing=north,powered=false]", - "131:3": "tripwire_hook[attached=false,facing=east,powered=false]", - "131:4": "tripwire_hook[attached=true,facing=south,powered=false]", - "131:5": "tripwire_hook[attached=true,facing=west,powered=false]", - "131:6": "tripwire_hook[attached=true,facing=north,powered=false]", - "131:7": "tripwire_hook[attached=true,facing=east,powered=false]", - "131:8": "tripwire_hook[attached=false,facing=south,powered=true]", - "131:9": "tripwire_hook[attached=false,facing=west,powered=true]", - "131:10": "tripwire_hook[attached=false,facing=north,powered=true]", - "131:11": "tripwire_hook[attached=false,facing=east,powered=true]", - "131:12": "tripwire_hook[attached=true,facing=south,powered=true]", - "131:13": "tripwire_hook[attached=true,facing=west,powered=true]", - "131:14": "tripwire_hook[attached=true,facing=north,powered=true]", - "131:15": "tripwire_hook[attached=true,facing=east,powered=true]", - "132:0": "tripwire[attached=false,disarmed=false,east=false,north=false,powered=false,south=false,west=false]", - "132:1": "tripwire[attached=false,disarmed=false,east=false,north=false,powered=true,south=false,west=false]", - "132:4": "tripwire[attached=true,disarmed=false,east=false,north=false,powered=false,south=false,west=false]", - "132:5": "tripwire[attached=true,disarmed=false,east=false,north=false,powered=true,south=false,west=false]", - "132:8": "tripwire[attached=false,disarmed=true,east=false,north=false,powered=false,south=false,west=false]", - "132:9": "tripwire[attached=false,disarmed=true,east=false,north=false,powered=true,south=false,west=false]", - "132:12": "tripwire[attached=true,disarmed=true,east=false,north=false,powered=false,south=false,west=false]", - "132:13": "tripwire[attached=true,disarmed=true,east=false,north=false,powered=true,south=false,west=false]", - "133:0": "emerald_block", - "134:0": "spruce_stairs[facing=east,half=bottom,shape=straight]", - "134:1": "spruce_stairs[facing=west,half=bottom,shape=straight]", - "134:2": "spruce_stairs[facing=south,half=bottom,shape=straight]", - "134:3": "spruce_stairs[facing=north,half=bottom,shape=straight]", - "134:4": "spruce_stairs[facing=east,half=top,shape=straight]", - "134:5": "spruce_stairs[facing=west,half=top,shape=straight]", - "134:6": "spruce_stairs[facing=south,half=top,shape=straight]", - "134:7": "spruce_stairs[facing=north,half=top,shape=straight]", - "135:0": "birch_stairs[facing=east,half=bottom,shape=straight]", - "135:1": "birch_stairs[facing=west,half=bottom,shape=straight]", - "135:2": "birch_stairs[facing=south,half=bottom,shape=straight]", - "135:3": "birch_stairs[facing=north,half=bottom,shape=straight]", - "135:4": "birch_stairs[facing=east,half=top,shape=straight]", - "135:5": "birch_stairs[facing=west,half=top,shape=straight]", - "135:6": "birch_stairs[facing=south,half=top,shape=straight]", - "135:7": "birch_stairs[facing=north,half=top,shape=straight]", - "136:0": "jungle_stairs[facing=east,half=bottom,shape=straight]", - "136:1": "jungle_stairs[facing=west,half=bottom,shape=straight]", - "136:2": "jungle_stairs[facing=south,half=bottom,shape=straight]", - "136:3": "jungle_stairs[facing=north,half=bottom,shape=straight]", - "136:4": "jungle_stairs[facing=east,half=top,shape=straight]", - "136:5": "jungle_stairs[facing=west,half=top,shape=straight]", - "136:6": "jungle_stairs[facing=south,half=top,shape=straight]", - "136:7": "jungle_stairs[facing=north,half=top,shape=straight]", - "137:0": "command_block[conditional=false,facing=down]", - "137:1": "command_block[conditional=false,facing=up]", - "137:2": "command_block[conditional=false,facing=north]", - "137:3": "command_block[conditional=false,facing=south]", - "137:4": "command_block[conditional=false,facing=west]", - "137:5": "command_block[conditional=false,facing=east]", - "137:8": "command_block[conditional=true,facing=down]", - "137:9": "command_block[conditional=true,facing=up]", - "137:10": "command_block[conditional=true,facing=north]", - "137:11": "command_block[conditional=true,facing=south]", - "137:12": "command_block[conditional=true,facing=west]", - "137:13": "command_block[conditional=true,facing=east]", - "138:0": "beacon", - "139:0": "cobblestone_wall[east=false,north=false,south=false,up=false,west=false]", - "139:1": "mossy_cobblestone_wall[east=false,north=false,south=false,up=false,west=false]", - "140:0": "potted_cactus", - "140:1": "potted_cactus", - "140:2": "potted_cactus", - "140:3": "potted_cactus", - "140:4": "potted_cactus", - "140:5": "potted_cactus", - "140:6": "potted_cactus", - "140:7": "potted_cactus", - "140:8": "potted_cactus", - "140:9": "potted_cactus", - "140:10": "potted_cactus", - "140:11": "potted_cactus", - "140:12": "potted_cactus", - "140:13": "potted_cactus", - "140:14": "potted_cactus", - "140:15": "potted_cactus", - "141:0": "carrots[age=0]", - "141:1": "carrots[age=1]", - "141:2": "carrots[age=2]", - "141:3": "carrots[age=3]", - "141:4": "carrots[age=4]", - "141:5": "carrots[age=5]", - "141:6": "carrots[age=6]", - "141:7": "carrots[age=7]", - "142:0": "potatoes[age=0]", - "142:1": "potatoes[age=1]", - "142:2": "potatoes[age=2]", - "142:3": "potatoes[age=3]", - "142:4": "potatoes[age=4]", - "142:5": "potatoes[age=5]", - "142:6": "potatoes[age=6]", - "142:7": "potatoes[age=7]", - "143:0": "oak_button[face=ceiling,facing=north,powered=false]", - "143:1": "oak_button[face=wall,facing=east,powered=false]", - "143:2": "oak_button[face=wall,facing=west,powered=false]", - "143:3": "oak_button[face=wall,facing=south,powered=false]", - "143:4": "oak_button[face=wall,facing=north,powered=false]", - "143:5": "oak_button[face=floor,facing=north,powered=false]", - "143:8": "oak_button[face=ceiling,facing=north,powered=true]", - "143:9": "oak_button[face=wall,facing=east,powered=true]", - "143:10": "oak_button[face=wall,facing=west,powered=true]", - "143:11": "oak_button[face=wall,facing=south,powered=true]", - "143:12": "oak_button[face=wall,facing=north,powered=true]", - "143:13": "oak_button[face=floor,facing=north,powered=true]", - "144:0": "player_head[facing=down]", - "144:1": "player_head[facing=up]", - "144:2": "player_head[facing=north]", - "144:3": "player_head[facing=south]", - "144:4": "player_head[facing=west]", - "144:5": "player_head[facing=east]", - "144:8": "player_head[facing=down]", - "144:9": "player_head[facing=up]", - "144:10": "player_head[facing=north]", - "144:11": "player_head[facing=south]", - "144:12": "player_head[facing=west]", - "144:13": "player_head[facing=east]", - "145:0": "anvil[facing=south]", - "145:1": "anvil[facing=west]", - "145:2": "anvil[facing=north]", - "145:3": "anvil[facing=east]", - "145:4": "chipped_anvil[facing=south]", - "145:5": "chipped_anvil[facing=west]", - "145:6": "chipped_anvil[facing=north]", - "145:7": "chipped_anvil[facing=east]", - "145:8": "damaged_anvil[facing=south]", - "145:9": "damaged_anvil[facing=west]", - "145:10": "damaged_anvil[facing=north]", - "145:11": "damaged_anvil[facing=east]", - "146:2": "trapped_chest[facing=north,type=single]", - "146:3": "trapped_chest[facing=south,type=single]", - "146:4": "trapped_chest[facing=west,type=single]", - "146:5": "trapped_chest[facing=east,type=single]", - "147:0": "light_weighted_pressure_plate[power=0]", - "147:1": "light_weighted_pressure_plate[power=1]", - "147:2": "light_weighted_pressure_plate[power=2]", - "147:3": "light_weighted_pressure_plate[power=3]", - "147:4": "light_weighted_pressure_plate[power=4]", - "147:5": "light_weighted_pressure_plate[power=5]", - "147:6": "light_weighted_pressure_plate[power=6]", - "147:7": "light_weighted_pressure_plate[power=7]", - "147:8": "light_weighted_pressure_plate[power=8]", - "147:9": "light_weighted_pressure_plate[power=9]", - "147:10": "light_weighted_pressure_plate[power=10]", - "147:11": "light_weighted_pressure_plate[power=11]", - "147:12": "light_weighted_pressure_plate[power=12]", - "147:13": "light_weighted_pressure_plate[power=13]", - "147:14": "light_weighted_pressure_plate[power=14]", - "147:15": "light_weighted_pressure_plate[power=15]", - "148:0": "heavy_weighted_pressure_plate[power=0]", - "148:1": "heavy_weighted_pressure_plate[power=1]", - "148:2": "heavy_weighted_pressure_plate[power=2]", - "148:3": "heavy_weighted_pressure_plate[power=3]", - "148:4": "heavy_weighted_pressure_plate[power=4]", - "148:5": "heavy_weighted_pressure_plate[power=5]", - "148:6": "heavy_weighted_pressure_plate[power=6]", - "148:7": "heavy_weighted_pressure_plate[power=7]", - "148:8": "heavy_weighted_pressure_plate[power=8]", - "148:9": "heavy_weighted_pressure_plate[power=9]", - "148:10": "heavy_weighted_pressure_plate[power=10]", - "148:11": "heavy_weighted_pressure_plate[power=11]", - "148:12": "heavy_weighted_pressure_plate[power=12]", - "148:13": "heavy_weighted_pressure_plate[power=13]", - "148:14": "heavy_weighted_pressure_plate[power=14]", - "148:15": "heavy_weighted_pressure_plate[power=15]", - "149:0": "comparator[facing=south,mode=compare,powered=false]", - "149:1": "comparator[facing=west,mode=compare,powered=false]", - "149:2": "comparator[facing=north,mode=compare,powered=false]", - "149:3": "comparator[facing=east,mode=compare,powered=false]", - "149:4": "comparator[facing=south,mode=subtract,powered=false]", - "149:5": "comparator[facing=west,mode=subtract,powered=false]", - "149:6": "comparator[facing=north,mode=subtract,powered=false]", - "149:7": "comparator[facing=east,mode=subtract,powered=false]", - "149:8": "comparator[facing=south,mode=compare,powered=true]", - "149:9": "comparator[facing=west,mode=compare,powered=true]", - "149:10": "comparator[facing=north,mode=compare,powered=true]", - "149:11": "comparator[facing=east,mode=compare,powered=true]", - "149:12": "comparator[facing=south,mode=subtract,powered=true]", - "149:13": "comparator[facing=west,mode=subtract,powered=true]", - "149:14": "comparator[facing=north,mode=subtract,powered=true]", - "149:15": "comparator[facing=east,mode=subtract,powered=true]", - "150:0": "comparator[facing=south,mode=compare,powered=false]", - "150:1": "comparator[facing=west,mode=compare,powered=false]", - "150:2": "comparator[facing=north,mode=compare,powered=false]", - "150:3": "comparator[facing=east,mode=compare,powered=false]", - "150:4": "comparator[facing=south,mode=subtract,powered=false]", - "150:5": "comparator[facing=west,mode=subtract,powered=false]", - "150:6": "comparator[facing=north,mode=subtract,powered=false]", - "150:7": "comparator[facing=east,mode=subtract,powered=false]", - "150:8": "comparator[facing=south,mode=compare,powered=true]", - "150:9": "comparator[facing=west,mode=compare,powered=true]", - "150:10": "comparator[facing=north,mode=compare,powered=true]", - "150:11": "comparator[facing=east,mode=compare,powered=true]", - "150:12": "comparator[facing=south,mode=subtract,powered=true]", - "150:13": "comparator[facing=west,mode=subtract,powered=true]", - "150:14": "comparator[facing=north,mode=subtract,powered=true]", - "150:15": "comparator[facing=east,mode=subtract,powered=true]", - "151:0": "daylight_detector[inverted=false,power=0]", - "151:1": "daylight_detector[inverted=false,power=1]", - "151:2": "daylight_detector[inverted=false,power=2]", - "151:3": "daylight_detector[inverted=false,power=3]", - "151:4": "daylight_detector[inverted=false,power=4]", - "151:5": "daylight_detector[inverted=false,power=5]", - "151:6": "daylight_detector[inverted=false,power=6]", - "151:7": "daylight_detector[inverted=false,power=7]", - "151:8": "daylight_detector[inverted=false,power=8]", - "151:9": "daylight_detector[inverted=false,power=9]", - "151:10": "daylight_detector[inverted=false,power=10]", - "151:11": "daylight_detector[inverted=false,power=11]", - "151:12": "daylight_detector[inverted=false,power=12]", - "151:13": "daylight_detector[inverted=false,power=13]", - "151:14": "daylight_detector[inverted=false,power=14]", - "151:15": "daylight_detector[inverted=false,power=15]", - "152:0": "redstone_block", - "153:0": "nether_quartz_ore", - "154:0": "hopper[enabled=true,facing=down]", - "154:2": "hopper[enabled=true,facing=north]", - "154:3": "hopper[enabled=true,facing=south]", - "154:4": "hopper[enabled=true,facing=west]", - "154:5": "hopper[enabled=true,facing=east]", - "154:8": "hopper[enabled=false,facing=down]", - "154:10": "hopper[enabled=false,facing=north]", - "154:11": "hopper[enabled=false,facing=south]", - "154:12": "hopper[enabled=false,facing=west]", - "154:13": "hopper[enabled=false,facing=east]", - "155:0": "quartz_block", - "155:1": "chiseled_quartz_block", - "155:2": "quartz_pillar[axis=y]", - "155:3": "quartz_pillar[axis=x]", - "155:4": "quartz_pillar[axis=z]", - "156:0": "quartz_stairs[facing=east,half=bottom,shape=straight]", - "156:1": "quartz_stairs[facing=west,half=bottom,shape=straight]", - "156:2": "quartz_stairs[facing=south,half=bottom,shape=straight]", - "156:3": "quartz_stairs[facing=north,half=bottom,shape=straight]", - "156:4": "quartz_stairs[facing=east,half=top,shape=straight]", - "156:5": "quartz_stairs[facing=west,half=top,shape=straight]", - "156:6": "quartz_stairs[facing=south,half=top,shape=straight]", - "156:7": "quartz_stairs[facing=north,half=top,shape=straight]", - "157:0": "activator_rail[powered=false,shape=north_south]", - "157:1": "activator_rail[powered=false,shape=east_west]", - "157:2": "activator_rail[powered=false,shape=ascending_east]", - "157:3": "activator_rail[powered=false,shape=ascending_west]", - "157:4": "activator_rail[powered=false,shape=ascending_north]", - "157:5": "activator_rail[powered=false,shape=ascending_south]", - "157:8": "activator_rail[powered=true,shape=north_south]", - "157:9": "activator_rail[powered=true,shape=east_west]", - "157:10": "activator_rail[powered=true,shape=ascending_east]", - "157:11": "activator_rail[powered=true,shape=ascending_west]", - "157:12": "activator_rail[powered=true,shape=ascending_north]", - "157:13": "activator_rail[powered=true,shape=ascending_south]", - "158:0": "dropper[facing=down,triggered=false]", - "158:1": "dropper[facing=up,triggered=false]", - "158:2": "dropper[facing=north,triggered=false]", - "158:3": "dropper[facing=south,triggered=false]", - "158:4": "dropper[facing=west,triggered=false]", - "158:5": "dropper[facing=east,triggered=false]", - "158:8": "dropper[facing=down,triggered=true]", - "158:9": "dropper[facing=up,triggered=true]", - "158:10": "dropper[facing=north,triggered=true]", - "158:11": "dropper[facing=south,triggered=true]", - "158:12": "dropper[facing=west,triggered=true]", - "158:13": "dropper[facing=east,triggered=true]", - "159:0": "white_terracotta", - "159:1": "orange_terracotta", - "159:2": "magenta_terracotta", - "159:3": "light_blue_terracotta", - "159:4": "yellow_terracotta", - "159:5": "lime_terracotta", - "159:6": "pink_terracotta", - "159:7": "gray_terracotta", - "159:8": "light_gray_terracotta", - "159:9": "cyan_terracotta", - "159:10": "purple_terracotta", - "159:11": "blue_terracotta", - "159:12": "brown_terracotta", - "159:13": "green_terracotta", - "159:14": "red_terracotta", - "159:15": "black_terracotta", - "160:0": "white_stained_glass_pane[east=false,north=false,south=false,west=false]", - "160:1": "orange_stained_glass_pane[east=false,north=false,south=false,west=false]", - "160:2": "magenta_stained_glass_pane[east=false,north=false,south=false,west=false]", - "160:3": "light_blue_stained_glass_pane[east=false,north=false,south=false,west=false]", - "160:4": "yellow_stained_glass_pane[east=false,north=false,south=false,west=false]", - "160:5": "lime_stained_glass_pane[east=false,north=false,south=false,west=false]", - "160:6": "pink_stained_glass_pane[east=false,north=false,south=false,west=false]", - "160:7": "gray_stained_glass_pane[east=false,north=false,south=false,west=false]", - "160:8": "light_gray_stained_glass_pane[east=false,north=false,south=false,west=false]", - "160:9": "cyan_stained_glass_pane[east=false,north=false,south=false,west=false]", - "160:10": "purple_stained_glass_pane[east=false,north=false,south=false,west=false]", - "160:11": "blue_stained_glass_pane[east=false,north=false,south=false,west=false]", - "160:12": "brown_stained_glass_pane[east=false,north=false,south=false,west=false]", - "160:13": "green_stained_glass_pane[east=false,north=false,south=false,west=false]", - "160:14": "red_stained_glass_pane[east=false,north=false,south=false,west=false]", - "160:15": "black_stained_glass_pane[east=false,north=false,south=false,west=false]", - "161:0": "acacia_leaves[check_decay=false,decayable=true]", - "161:1": "dark_oak_leaves[check_decay=false,decayable=true]", - "161:4": "acacia_leaves[check_decay=false,decayable=false]", - "161:5": "dark_oak_leaves[check_decay=false,decayable=false]", - "161:8": "acacia_leaves[check_decay=true,decayable=true]", - "161:9": "dark_oak_leaves[check_decay=true,decayable=true]", - "161:12": "acacia_leaves[check_decay=true,decayable=false]", - "161:13": "dark_oak_leaves[check_decay=true,decayable=false]", - "162:0": "acacia_log[axis=y]", - "162:1": "dark_oak_log[axis=y]", - "162:4": "acacia_log[axis=x]", - "162:5": "dark_oak_log[axis=x]", - "162:8": "acacia_log[axis=z]", - "162:9": "dark_oak_log[axis=z]", - "162:12": "acacia_bark", - "162:13": "dark_oak_bark", - "163:0": "acacia_stairs[facing=east,half=bottom,shape=straight]", - "163:1": "acacia_stairs[facing=west,half=bottom,shape=straight]", - "163:2": "acacia_stairs[facing=south,half=bottom,shape=straight]", - "163:3": "acacia_stairs[facing=north,half=bottom,shape=straight]", - "163:4": "acacia_stairs[facing=east,half=top,shape=straight]", - "163:5": "acacia_stairs[facing=west,half=top,shape=straight]", - "163:6": "acacia_stairs[facing=south,half=top,shape=straight]", - "163:7": "acacia_stairs[facing=north,half=top,shape=straight]", - "164:0": "dark_oak_stairs[facing=east,half=bottom,shape=straight]", - "164:1": "dark_oak_stairs[facing=west,half=bottom,shape=straight]", - "164:2": "dark_oak_stairs[facing=south,half=bottom,shape=straight]", - "164:3": "dark_oak_stairs[facing=north,half=bottom,shape=straight]", - "164:4": "dark_oak_stairs[facing=east,half=top,shape=straight]", - "164:5": "dark_oak_stairs[facing=west,half=top,shape=straight]", - "164:6": "dark_oak_stairs[facing=south,half=top,shape=straight]", - "164:7": "dark_oak_stairs[facing=north,half=top,shape=straight]", - "165:0": "slime_block", - "166:0": "barrier", - "167:0": "iron_trapdoor[facing=north,half=bottom,open=false]", - "167:1": "iron_trapdoor[facing=south,half=bottom,open=false]", - "167:2": "iron_trapdoor[facing=west,half=bottom,open=false]", - "167:3": "iron_trapdoor[facing=east,half=bottom,open=false]", - "167:4": "iron_trapdoor[facing=north,half=bottom,open=true]", - "167:5": "iron_trapdoor[facing=south,half=bottom,open=true]", - "167:6": "iron_trapdoor[facing=west,half=bottom,open=true]", - "167:7": "iron_trapdoor[facing=east,half=bottom,open=true]", - "167:8": "iron_trapdoor[facing=north,half=top,open=false]", - "167:9": "iron_trapdoor[facing=south,half=top,open=false]", - "167:10": "iron_trapdoor[facing=west,half=top,open=false]", - "167:11": "iron_trapdoor[facing=east,half=top,open=false]", - "167:12": "iron_trapdoor[facing=north,half=top,open=true]", - "167:13": "iron_trapdoor[facing=south,half=top,open=true]", - "167:14": "iron_trapdoor[facing=west,half=top,open=true]", - "167:15": "iron_trapdoor[facing=east,half=top,open=true]", - "168:0": "prismarine", - "168:1": "prismarine_bricks", - "168:2": "dark_prismarine", - "169:0": "sea_lantern", - "170:0": "hay_block[axis=y]", - "170:4": "hay_block[axis=x]", - "170:8": "hay_block[axis=z]", - "171:0": "white_carpet", - "171:1": "orange_carpet", - "171:2": "magenta_carpet", - "171:3": "light_blue_carpet", - "171:4": "yellow_carpet", - "171:5": "lime_carpet", - "171:6": "pink_carpet", - "171:7": "gray_carpet", - "171:8": "light_gray_carpet", - "171:9": "cyan_carpet", - "171:10": "purple_carpet", - "171:11": "blue_carpet", - "171:12": "brown_carpet", - "171:13": "green_carpet", - "171:14": "red_carpet", - "171:15": "black_carpet", - "172:0": "terracotta", - "173:0": "coal_block", - "174:0": "packed_ice", - "175:0": "sunflower[half=lower]", - "175:1": "lilac[half=lower]", - "175:2": "tall_grass[half=lower]", - "175:3": "large_fern[half=lower]", - "175:4": "rose_bush[half=lower]", - "175:5": "peony[half=lower]", - "175:8": "peony[half=upper]", - "175:9": "peony[half=upper]", - "175:10": "peony[half=upper]", - "175:11": "peony[half=upper]", - "176:0": "white_banner[rotation=0]", - "176:1": "white_banner[rotation=1]", - "176:2": "white_banner[rotation=2]", - "176:3": "white_banner[rotation=3]", - "176:4": "white_banner[rotation=4]", - "176:5": "white_banner[rotation=5]", - "176:6": "white_banner[rotation=6]", - "176:7": "white_banner[rotation=7]", - "176:8": "white_banner[rotation=8]", - "176:9": "white_banner[rotation=9]", - "176:10": "white_banner[rotation=10]", - "176:11": "white_banner[rotation=11]", - "176:12": "white_banner[rotation=12]", - "176:13": "white_banner[rotation=13]", - "176:14": "white_banner[rotation=14]", - "176:15": "white_banner[rotation=15]", - "177:2": "white_wall_banner[facing=north]", - "177:3": "white_wall_banner[facing=south]", - "177:4": "white_wall_banner[facing=west]", - "177:5": "white_wall_banner[facing=east]", - "178:0": "daylight_detector[inverted=true,power=0]", - "178:1": "daylight_detector[inverted=true,power=1]", - "178:2": "daylight_detector[inverted=true,power=2]", - "178:3": "daylight_detector[inverted=true,power=3]", - "178:4": "daylight_detector[inverted=true,power=4]", - "178:5": "daylight_detector[inverted=true,power=5]", - "178:6": "daylight_detector[inverted=true,power=6]", - "178:7": "daylight_detector[inverted=true,power=7]", - "178:8": "daylight_detector[inverted=true,power=8]", - "178:9": "daylight_detector[inverted=true,power=9]", - "178:10": "daylight_detector[inverted=true,power=10]", - "178:11": "daylight_detector[inverted=true,power=11]", - "178:12": "daylight_detector[inverted=true,power=12]", - "178:13": "daylight_detector[inverted=true,power=13]", - "178:14": "daylight_detector[inverted=true,power=14]", - "178:15": "daylight_detector[inverted=true,power=15]", - "179:0": "red_sandstone", - "179:1": "chiseled_red_sandstone", - "179:2": "cut_red_sandstone", - "180:0": "red_sandstone_stairs[facing=east,half=bottom,shape=straight]", - "180:1": "red_sandstone_stairs[facing=west,half=bottom,shape=straight]", - "180:2": "red_sandstone_stairs[facing=south,half=bottom,shape=straight]", - "180:3": "red_sandstone_stairs[facing=north,half=bottom,shape=straight]", - "180:4": "red_sandstone_stairs[facing=east,half=top,shape=straight]", - "180:5": "red_sandstone_stairs[facing=west,half=top,shape=straight]", - "180:6": "red_sandstone_stairs[facing=south,half=top,shape=straight]", - "180:7": "red_sandstone_stairs[facing=north,half=top,shape=straight]", - "181:0": "red_sandstone_slab[type=double]", - "181:8": "smooth_red_sandstone", - "182:0": "red_sandstone_slab[type=bottom]", - "182:8": "red_sandstone_slab[type=top]", - "183:0": "spruce_fence_gate[facing=south,in_wall=false,open=false,powered=false]", - "183:1": "spruce_fence_gate[facing=west,in_wall=false,open=false,powered=false]", - "183:2": "spruce_fence_gate[facing=north,in_wall=false,open=false,powered=false]", - "183:3": "spruce_fence_gate[facing=east,in_wall=false,open=false,powered=false]", - "183:4": "spruce_fence_gate[facing=south,in_wall=false,open=true,powered=false]", - "183:5": "spruce_fence_gate[facing=west,in_wall=false,open=true,powered=false]", - "183:6": "spruce_fence_gate[facing=north,in_wall=false,open=true,powered=false]", - "183:7": "spruce_fence_gate[facing=east,in_wall=false,open=true,powered=false]", - "183:8": "spruce_fence_gate[facing=south,in_wall=false,open=false,powered=true]", - "183:9": "spruce_fence_gate[facing=west,in_wall=false,open=false,powered=true]", - "183:10": "spruce_fence_gate[facing=north,in_wall=false,open=false,powered=true]", - "183:11": "spruce_fence_gate[facing=east,in_wall=false,open=false,powered=true]", - "183:12": "spruce_fence_gate[facing=south,in_wall=false,open=true,powered=true]", - "183:13": "spruce_fence_gate[facing=west,in_wall=false,open=true,powered=true]", - "183:14": "spruce_fence_gate[facing=north,in_wall=false,open=true,powered=true]", - "183:15": "spruce_fence_gate[facing=east,in_wall=false,open=true,powered=true]", - "184:0": "birch_fence_gate[facing=south,in_wall=false,open=false,powered=false]", - "184:1": "birch_fence_gate[facing=west,in_wall=false,open=false,powered=false]", - "184:2": "birch_fence_gate[facing=north,in_wall=false,open=false,powered=false]", - "184:3": "birch_fence_gate[facing=east,in_wall=false,open=false,powered=false]", - "184:4": "birch_fence_gate[facing=south,in_wall=false,open=true,powered=false]", - "184:5": "birch_fence_gate[facing=west,in_wall=false,open=true,powered=false]", - "184:6": "birch_fence_gate[facing=north,in_wall=false,open=true,powered=false]", - "184:7": "birch_fence_gate[facing=east,in_wall=false,open=true,powered=false]", - "184:8": "birch_fence_gate[facing=south,in_wall=false,open=false,powered=true]", - "184:9": "birch_fence_gate[facing=west,in_wall=false,open=false,powered=true]", - "184:10": "birch_fence_gate[facing=north,in_wall=false,open=false,powered=true]", - "184:11": "birch_fence_gate[facing=east,in_wall=false,open=false,powered=true]", - "184:12": "birch_fence_gate[facing=south,in_wall=false,open=true,powered=true]", - "184:13": "birch_fence_gate[facing=west,in_wall=false,open=true,powered=true]", - "184:14": "birch_fence_gate[facing=north,in_wall=false,open=true,powered=true]", - "184:15": "birch_fence_gate[facing=east,in_wall=false,open=true,powered=true]", - "185:0": "jungle_fence_gate[facing=south,in_wall=false,open=false,powered=false]", - "185:1": "jungle_fence_gate[facing=west,in_wall=false,open=false,powered=false]", - "185:2": "jungle_fence_gate[facing=north,in_wall=false,open=false,powered=false]", - "185:3": "jungle_fence_gate[facing=east,in_wall=false,open=false,powered=false]", - "185:4": "jungle_fence_gate[facing=south,in_wall=false,open=true,powered=false]", - "185:5": "jungle_fence_gate[facing=west,in_wall=false,open=true,powered=false]", - "185:6": "jungle_fence_gate[facing=north,in_wall=false,open=true,powered=false]", - "185:7": "jungle_fence_gate[facing=east,in_wall=false,open=true,powered=false]", - "185:8": "jungle_fence_gate[facing=south,in_wall=false,open=false,powered=true]", - "185:9": "jungle_fence_gate[facing=west,in_wall=false,open=false,powered=true]", - "185:10": "jungle_fence_gate[facing=north,in_wall=false,open=false,powered=true]", - "185:11": "jungle_fence_gate[facing=east,in_wall=false,open=false,powered=true]", - "185:12": "jungle_fence_gate[facing=south,in_wall=false,open=true,powered=true]", - "185:13": "jungle_fence_gate[facing=west,in_wall=false,open=true,powered=true]", - "185:14": "jungle_fence_gate[facing=north,in_wall=false,open=true,powered=true]", - "185:15": "jungle_fence_gate[facing=east,in_wall=false,open=true,powered=true]", - "186:0": "dark_oak_fence_gate[facing=south,in_wall=false,open=false,powered=false]", - "186:1": "dark_oak_fence_gate[facing=west,in_wall=false,open=false,powered=false]", - "186:2": "dark_oak_fence_gate[facing=north,in_wall=false,open=false,powered=false]", - "186:3": "dark_oak_fence_gate[facing=east,in_wall=false,open=false,powered=false]", - "186:4": "dark_oak_fence_gate[facing=south,in_wall=false,open=true,powered=false]", - "186:5": "dark_oak_fence_gate[facing=west,in_wall=false,open=true,powered=false]", - "186:6": "dark_oak_fence_gate[facing=north,in_wall=false,open=true,powered=false]", - "186:7": "dark_oak_fence_gate[facing=east,in_wall=false,open=true,powered=false]", - "186:8": "dark_oak_fence_gate[facing=south,in_wall=false,open=false,powered=true]", - "186:9": "dark_oak_fence_gate[facing=west,in_wall=false,open=false,powered=true]", - "186:10": "dark_oak_fence_gate[facing=north,in_wall=false,open=false,powered=true]", - "186:11": "dark_oak_fence_gate[facing=east,in_wall=false,open=false,powered=true]", - "186:12": "dark_oak_fence_gate[facing=south,in_wall=false,open=true,powered=true]", - "186:13": "dark_oak_fence_gate[facing=west,in_wall=false,open=true,powered=true]", - "186:14": "dark_oak_fence_gate[facing=north,in_wall=false,open=true,powered=true]", - "186:15": "dark_oak_fence_gate[facing=east,in_wall=false,open=true,powered=true]", - "187:0": "acacia_fence_gate[facing=south,in_wall=false,open=false,powered=false]", - "187:1": "acacia_fence_gate[facing=west,in_wall=false,open=false,powered=false]", - "187:2": "acacia_fence_gate[facing=north,in_wall=false,open=false,powered=false]", - "187:3": "acacia_fence_gate[facing=east,in_wall=false,open=false,powered=false]", - "187:4": "acacia_fence_gate[facing=south,in_wall=false,open=true,powered=false]", - "187:5": "acacia_fence_gate[facing=west,in_wall=false,open=true,powered=false]", - "187:6": "acacia_fence_gate[facing=north,in_wall=false,open=true,powered=false]", - "187:7": "acacia_fence_gate[facing=east,in_wall=false,open=true,powered=false]", - "187:8": "acacia_fence_gate[facing=south,in_wall=false,open=false,powered=true]", - "187:9": "acacia_fence_gate[facing=west,in_wall=false,open=false,powered=true]", - "187:10": "acacia_fence_gate[facing=north,in_wall=false,open=false,powered=true]", - "187:11": "acacia_fence_gate[facing=east,in_wall=false,open=false,powered=true]", - "187:12": "acacia_fence_gate[facing=south,in_wall=false,open=true,powered=true]", - "187:13": "acacia_fence_gate[facing=west,in_wall=false,open=true,powered=true]", - "187:14": "acacia_fence_gate[facing=north,in_wall=false,open=true,powered=true]", - "187:15": "acacia_fence_gate[facing=east,in_wall=false,open=true,powered=true]", - "188:0": "spruce_fence[east=false,north=false,south=false,west=false]", - "189:0": "birch_fence[east=false,north=false,south=false,west=false]", - "190:0": "jungle_fence[east=false,north=false,south=false,west=false]", - "191:0": "dark_oak_fence[east=false,north=false,south=false,west=false]", - "192:0": "acacia_fence[east=false,north=false,south=false,west=false]", - "193:0": "spruce_door[facing=east,half=lower,hinge=right,open=false,powered=false]", - "193:1": "spruce_door[facing=south,half=lower,hinge=right,open=false,powered=false]", - "193:2": "spruce_door[facing=west,half=lower,hinge=right,open=false,powered=false]", - "193:3": "spruce_door[facing=north,half=lower,hinge=right,open=false,powered=false]", - "193:4": "spruce_door[facing=east,half=lower,hinge=right,open=true,powered=false]", - "193:5": "spruce_door[facing=south,half=lower,hinge=right,open=true,powered=false]", - "193:6": "spruce_door[facing=west,half=lower,hinge=right,open=true,powered=false]", - "193:7": "spruce_door[facing=north,half=lower,hinge=right,open=true,powered=false]", - "193:8": "spruce_door[facing=east,half=upper,hinge=left,open=false,powered=false]", - "193:9": "spruce_door[facing=east,half=upper,hinge=right,open=false,powered=false]", - "193:10": "spruce_door[facing=east,half=upper,hinge=left,open=false,powered=true]", - "193:11": "spruce_door[facing=east,half=upper,hinge=right,open=false,powered=true]", - "194:0": "birch_door[facing=east,half=lower,hinge=right,open=false,powered=false]", - "194:1": "birch_door[facing=south,half=lower,hinge=right,open=false,powered=false]", - "194:2": "birch_door[facing=west,half=lower,hinge=right,open=false,powered=false]", - "194:3": "birch_door[facing=north,half=lower,hinge=right,open=false,powered=false]", - "194:4": "birch_door[facing=east,half=lower,hinge=right,open=true,powered=false]", - "194:5": "birch_door[facing=south,half=lower,hinge=right,open=true,powered=false]", - "194:6": "birch_door[facing=west,half=lower,hinge=right,open=true,powered=false]", - "194:7": "birch_door[facing=north,half=lower,hinge=right,open=true,powered=false]", - "194:8": "birch_door[facing=east,half=upper,hinge=left,open=false,powered=false]", - "194:9": "birch_door[facing=east,half=upper,hinge=right,open=false,powered=false]", - "194:10": "birch_door[facing=east,half=upper,hinge=left,open=false,powered=true]", - "194:11": "birch_door[facing=east,half=upper,hinge=right,open=false,powered=true]", - "195:0": "jungle_door[facing=east,half=lower,hinge=right,open=false,powered=false]", - "195:1": "jungle_door[facing=south,half=lower,hinge=right,open=false,powered=false]", - "195:2": "jungle_door[facing=west,half=lower,hinge=right,open=false,powered=false]", - "195:3": "jungle_door[facing=north,half=lower,hinge=right,open=false,powered=false]", - "195:4": "jungle_door[facing=east,half=lower,hinge=right,open=true,powered=false]", - "195:5": "jungle_door[facing=south,half=lower,hinge=right,open=true,powered=false]", - "195:6": "jungle_door[facing=west,half=lower,hinge=right,open=true,powered=false]", - "195:7": "jungle_door[facing=north,half=lower,hinge=right,open=true,powered=false]", - "195:8": "jungle_door[facing=east,half=upper,hinge=left,open=false,powered=false]", - "195:9": "jungle_door[facing=east,half=upper,hinge=right,open=false,powered=false]", - "195:10": "jungle_door[facing=east,half=upper,hinge=left,open=false,powered=true]", - "195:11": "jungle_door[facing=east,half=upper,hinge=right,open=false,powered=true]", - "196:0": "acacia_door[facing=east,half=lower,hinge=right,open=false,powered=false]", - "196:1": "acacia_door[facing=south,half=lower,hinge=right,open=false,powered=false]", - "196:2": "acacia_door[facing=west,half=lower,hinge=right,open=false,powered=false]", - "196:3": "acacia_door[facing=north,half=lower,hinge=right,open=false,powered=false]", - "196:4": "acacia_door[facing=east,half=lower,hinge=right,open=true,powered=false]", - "196:5": "acacia_door[facing=south,half=lower,hinge=right,open=true,powered=false]", - "196:6": "acacia_door[facing=west,half=lower,hinge=right,open=true,powered=false]", - "196:7": "acacia_door[facing=north,half=lower,hinge=right,open=true,powered=false]", - "196:8": "acacia_door[facing=east,half=upper,hinge=left,open=false,powered=false]", - "196:9": "acacia_door[facing=east,half=upper,hinge=right,open=false,powered=false]", - "196:10": "acacia_door[facing=east,half=upper,hinge=left,open=false,powered=true]", - "196:11": "acacia_door[facing=east,half=upper,hinge=right,open=false,powered=true]", - "197:0": "dark_oak_door[facing=east,half=lower,hinge=right,open=false,powered=false]", - "197:1": "dark_oak_door[facing=south,half=lower,hinge=right,open=false,powered=false]", - "197:2": "dark_oak_door[facing=west,half=lower,hinge=right,open=false,powered=false]", - "197:3": "dark_oak_door[facing=north,half=lower,hinge=right,open=false,powered=false]", - "197:4": "dark_oak_door[facing=east,half=lower,hinge=right,open=true,powered=false]", - "197:5": "dark_oak_door[facing=south,half=lower,hinge=right,open=true,powered=false]", - "197:6": "dark_oak_door[facing=west,half=lower,hinge=right,open=true,powered=false]", - "197:7": "dark_oak_door[facing=north,half=lower,hinge=right,open=true,powered=false]", - "197:8": "dark_oak_door[facing=east,half=upper,hinge=left,open=false,powered=false]", - "197:9": "dark_oak_door[facing=east,half=upper,hinge=right,open=false,powered=false]", - "197:10": "dark_oak_door[facing=east,half=upper,hinge=left,open=false,powered=true]", - "197:11": "dark_oak_door[facing=east,half=upper,hinge=right,open=false,powered=true]", - "198:0": "end_rod[facing=down]", - "198:1": "end_rod[facing=up]", - "198:2": "end_rod[facing=north]", - "198:3": "end_rod[facing=south]", - "198:4": "end_rod[facing=west]", - "198:5": "end_rod[facing=east]", - "199:0": "chorus_plant[down=false,east=false,north=false,south=false,up=false,west=false]", - "200:0": "chorus_flower[age=0]", - "200:1": "chorus_flower[age=1]", - "200:2": "chorus_flower[age=2]", - "200:3": "chorus_flower[age=3]", - "200:4": "chorus_flower[age=4]", - "200:5": "chorus_flower[age=5]", - "201:0": "purpur_block", - "202:0": "purpur_pillar[axis=y]", - "202:4": "purpur_pillar[axis=x]", - "202:8": "purpur_pillar[axis=z]", - "203:0": "purpur_stairs[facing=east,half=bottom,shape=straight]", - "203:1": "purpur_stairs[facing=west,half=bottom,shape=straight]", - "203:2": "purpur_stairs[facing=south,half=bottom,shape=straight]", - "203:3": "purpur_stairs[facing=north,half=bottom,shape=straight]", - "203:4": "purpur_stairs[facing=east,half=top,shape=straight]", - "203:5": "purpur_stairs[facing=west,half=top,shape=straight]", - "203:6": "purpur_stairs[facing=south,half=top,shape=straight]", - "203:7": "purpur_stairs[facing=north,half=top,shape=straight]", - "204:0": "purpur_slab[type=double]", - "205:0": "purpur_slab[type=bottom]", - "205:8": "purpur_slab[type=top]", - "206:0": "end_stone_bricks", - "207:0": "beetroots[age=0]", - "207:1": "beetroots[age=1]", - "207:2": "beetroots[age=2]", - "207:3": "beetroots[age=3]", - "208:0": "grass_path", - "209:0": "end_gateway", - "210:0": "repeating_command_block[conditional=false,facing=down]", - "210:1": "repeating_command_block[conditional=false,facing=up]", - "210:2": "repeating_command_block[conditional=false,facing=north]", - "210:3": "repeating_command_block[conditional=false,facing=south]", - "210:4": "repeating_command_block[conditional=false,facing=west]", - "210:5": "repeating_command_block[conditional=false,facing=east]", - "210:8": "repeating_command_block[conditional=true,facing=down]", - "210:9": "repeating_command_block[conditional=true,facing=up]", - "210:10": "repeating_command_block[conditional=true,facing=north]", - "210:11": "repeating_command_block[conditional=true,facing=south]", - "210:12": "repeating_command_block[conditional=true,facing=west]", - "210:13": "repeating_command_block[conditional=true,facing=east]", - "211:0": "chain_command_block[conditional=false,facing=down]", - "211:1": "chain_command_block[conditional=false,facing=up]", - "211:2": "chain_command_block[conditional=false,facing=north]", - "211:3": "chain_command_block[conditional=false,facing=south]", - "211:4": "chain_command_block[conditional=false,facing=west]", - "211:5": "chain_command_block[conditional=false,facing=east]", - "211:8": "chain_command_block[conditional=true,facing=down]", - "211:9": "chain_command_block[conditional=true,facing=up]", - "211:10": "chain_command_block[conditional=true,facing=north]", - "211:11": "chain_command_block[conditional=true,facing=south]", - "211:12": "chain_command_block[conditional=true,facing=west]", - "211:13": "chain_command_block[conditional=true,facing=east]", - "212:0": "frosted_ice[age=0]", - "212:1": "frosted_ice[age=1]", - "212:2": "frosted_ice[age=2]", - "212:3": "frosted_ice[age=3]", - "213:0": "magma_block", - "214:0": "nether_wart_block", - "215:0": "red_nether_bricks", - "216:0": "bone_block[axis=y]", - "216:4": "bone_block[axis=x]", - "216:8": "bone_block[axis=z]", - "217:0": "structure_void", - "218:0": "observer[facing=down,powered=false]", - "218:1": "observer[facing=up,powered=false]", - "218:2": "observer[facing=north,powered=false]", - "218:3": "observer[facing=south,powered=false]", - "218:4": "observer[facing=west,powered=false]", - "218:5": "observer[facing=east,powered=false]", - "218:8": "observer[facing=down,powered=true]", - "218:9": "observer[facing=up,powered=true]", - "218:10": "observer[facing=north,powered=true]", - "218:11": "observer[facing=south,powered=true]", - "218:12": "observer[facing=west,powered=true]", - "218:13": "observer[facing=east,powered=true]", - "219:0": "white_shulker_box[facing=down]", - "219:1": "white_shulker_box[facing=up]", - "219:2": "white_shulker_box[facing=north]", - "219:3": "white_shulker_box[facing=south]", - "219:4": "white_shulker_box[facing=west]", - "219:5": "white_shulker_box[facing=east]", - "220:0": "orange_shulker_box[facing=down]", - "220:1": "orange_shulker_box[facing=up]", - "220:2": "orange_shulker_box[facing=north]", - "220:3": "orange_shulker_box[facing=south]", - "220:4": "orange_shulker_box[facing=west]", - "220:5": "orange_shulker_box[facing=east]", - "221:0": "magenta_shulker_box[facing=down]", - "221:1": "magenta_shulker_box[facing=up]", - "221:2": "magenta_shulker_box[facing=north]", - "221:3": "magenta_shulker_box[facing=south]", - "221:4": "magenta_shulker_box[facing=west]", - "221:5": "magenta_shulker_box[facing=east]", - "222:0": "light_blue_shulker_box[facing=down]", - "222:1": "light_blue_shulker_box[facing=up]", - "222:2": "light_blue_shulker_box[facing=north]", - "222:3": "light_blue_shulker_box[facing=south]", - "222:4": "light_blue_shulker_box[facing=west]", - "222:5": "light_blue_shulker_box[facing=east]", - "223:0": "yellow_shulker_box[facing=down]", - "223:1": "yellow_shulker_box[facing=up]", - "223:2": "yellow_shulker_box[facing=north]", - "223:3": "yellow_shulker_box[facing=south]", - "223:4": "yellow_shulker_box[facing=west]", - "223:5": "yellow_shulker_box[facing=east]", - "224:0": "lime_shulker_box[facing=down]", - "224:1": "lime_shulker_box[facing=up]", - "224:2": "lime_shulker_box[facing=north]", - "224:3": "lime_shulker_box[facing=south]", - "224:4": "lime_shulker_box[facing=west]", - "224:5": "lime_shulker_box[facing=east]", - "225:0": "pink_shulker_box[facing=down]", - "225:1": "pink_shulker_box[facing=up]", - "225:2": "pink_shulker_box[facing=north]", - "225:3": "pink_shulker_box[facing=south]", - "225:4": "pink_shulker_box[facing=west]", - "225:5": "pink_shulker_box[facing=east]", - "226:0": "gray_shulker_box[facing=down]", - "226:1": "gray_shulker_box[facing=up]", - "226:2": "gray_shulker_box[facing=north]", - "226:3": "gray_shulker_box[facing=south]", - "226:4": "gray_shulker_box[facing=west]", - "226:5": "gray_shulker_box[facing=east]", - "227:0": "light_gray_shulker_box[facing=down]", - "227:1": "light_gray_shulker_box[facing=up]", - "227:2": "light_gray_shulker_box[facing=north]", - "227:3": "light_gray_shulker_box[facing=south]", - "227:4": "light_gray_shulker_box[facing=west]", - "227:5": "light_gray_shulker_box[facing=east]", - "228:0": "cyan_shulker_box[facing=down]", - "228:1": "cyan_shulker_box[facing=up]", - "228:2": "cyan_shulker_box[facing=north]", - "228:3": "cyan_shulker_box[facing=south]", - "228:4": "cyan_shulker_box[facing=west]", - "228:5": "cyan_shulker_box[facing=east]", - "229:0": "purple_shulker_box[facing=down]", - "229:1": "purple_shulker_box[facing=up]", - "229:2": "purple_shulker_box[facing=north]", - "229:3": "purple_shulker_box[facing=south]", - "229:4": "purple_shulker_box[facing=west]", - "229:5": "purple_shulker_box[facing=east]", - "230:0": "blue_shulker_box[facing=down]", - "230:1": "blue_shulker_box[facing=up]", - "230:2": "blue_shulker_box[facing=north]", - "230:3": "blue_shulker_box[facing=south]", - "230:4": "blue_shulker_box[facing=west]", - "230:5": "blue_shulker_box[facing=east]", - "231:0": "brown_shulker_box[facing=down]", - "231:1": "brown_shulker_box[facing=up]", - "231:2": "brown_shulker_box[facing=north]", - "231:3": "brown_shulker_box[facing=south]", - "231:4": "brown_shulker_box[facing=west]", - "231:5": "brown_shulker_box[facing=east]", - "232:0": "green_shulker_box[facing=down]", - "232:1": "green_shulker_box[facing=up]", - "232:2": "green_shulker_box[facing=north]", - "232:3": "green_shulker_box[facing=south]", - "232:4": "green_shulker_box[facing=west]", - "232:5": "green_shulker_box[facing=east]", - "233:0": "red_shulker_box[facing=down]", - "233:1": "red_shulker_box[facing=up]", - "233:2": "red_shulker_box[facing=north]", - "233:3": "red_shulker_box[facing=south]", - "233:4": "red_shulker_box[facing=west]", - "233:5": "red_shulker_box[facing=east]", - "234:0": "black_shulker_box[facing=down]", - "234:1": "black_shulker_box[facing=up]", - "234:2": "black_shulker_box[facing=north]", - "234:3": "black_shulker_box[facing=south]", - "234:4": "black_shulker_box[facing=west]", - "234:5": "black_shulker_box[facing=east]", - "235:0": "white_glazed_terracotta[facing=south]", - "235:1": "white_glazed_terracotta[facing=west]", - "235:2": "white_glazed_terracotta[facing=north]", - "235:3": "white_glazed_terracotta[facing=east]", - "236:0": "orange_glazed_terracotta[facing=south]", - "236:1": "orange_glazed_terracotta[facing=west]", - "236:2": "orange_glazed_terracotta[facing=north]", - "236:3": "orange_glazed_terracotta[facing=east]", - "237:0": "magenta_glazed_terracotta[facing=south]", - "237:1": "magenta_glazed_terracotta[facing=west]", - "237:2": "magenta_glazed_terracotta[facing=north]", - "237:3": "magenta_glazed_terracotta[facing=east]", - "238:0": "light_blue_glazed_terracotta[facing=south]", - "238:1": "light_blue_glazed_terracotta[facing=west]", - "238:2": "light_blue_glazed_terracotta[facing=north]", - "238:3": "light_blue_glazed_terracotta[facing=east]", - "239:0": "yellow_glazed_terracotta[facing=south]", - "239:1": "yellow_glazed_terracotta[facing=west]", - "239:2": "yellow_glazed_terracotta[facing=north]", - "239:3": "yellow_glazed_terracotta[facing=east]", - "240:0": "lime_glazed_terracotta[facing=south]", - "240:1": "lime_glazed_terracotta[facing=west]", - "240:2": "lime_glazed_terracotta[facing=north]", - "240:3": "lime_glazed_terracotta[facing=east]", - "241:0": "pink_glazed_terracotta[facing=south]", - "241:1": "pink_glazed_terracotta[facing=west]", - "241:2": "pink_glazed_terracotta[facing=north]", - "241:3": "pink_glazed_terracotta[facing=east]", - "242:0": "gray_glazed_terracotta[facing=south]", - "242:1": "gray_glazed_terracotta[facing=west]", - "242:2": "gray_glazed_terracotta[facing=north]", - "242:3": "gray_glazed_terracotta[facing=east]", - "243:0": "light_gray_glazed_terracotta[facing=south]", - "243:1": "light_gray_glazed_terracotta[facing=west]", - "243:2": "light_gray_glazed_terracotta[facing=north]", - "243:3": "light_gray_glazed_terracotta[facing=east]", - "244:0": "cyan_glazed_terracotta[facing=south]", - "244:1": "cyan_glazed_terracotta[facing=west]", - "244:2": "cyan_glazed_terracotta[facing=north]", - "244:3": "cyan_glazed_terracotta[facing=east]", - "245:0": "purple_glazed_terracotta[facing=south]", - "245:1": "purple_glazed_terracotta[facing=west]", - "245:2": "purple_glazed_terracotta[facing=north]", - "245:3": "purple_glazed_terracotta[facing=east]", - "246:0": "blue_glazed_terracotta[facing=south]", - "246:1": "blue_glazed_terracotta[facing=west]", - "246:2": "blue_glazed_terracotta[facing=north]", - "246:3": "blue_glazed_terracotta[facing=east]", - "247:0": "brown_glazed_terracotta[facing=south]", - "247:1": "brown_glazed_terracotta[facing=west]", - "247:2": "brown_glazed_terracotta[facing=north]", - "247:3": "brown_glazed_terracotta[facing=east]", - "248:0": "green_glazed_terracotta[facing=south]", - "248:1": "green_glazed_terracotta[facing=west]", - "248:2": "green_glazed_terracotta[facing=north]", - "248:3": "green_glazed_terracotta[facing=east]", - "249:0": "red_glazed_terracotta[facing=south]", - "249:1": "red_glazed_terracotta[facing=west]", - "249:2": "red_glazed_terracotta[facing=north]", - "249:3": "red_glazed_terracotta[facing=east]", - "250:0": "black_glazed_terracotta[facing=south]", - "250:1": "black_glazed_terracotta[facing=west]", - "250:2": "black_glazed_terracotta[facing=north]", - "250:3": "black_glazed_terracotta[facing=east]", - "251:0": "white_concrete", - "251:1": "orange_concrete", - "251:2": "magenta_concrete", - "251:3": "light_blue_concrete", - "251:4": "yellow_concrete", - "251:5": "lime_concrete", - "251:6": "pink_concrete", - "251:7": "gray_concrete", - "251:8": "light_gray_concrete", - "251:9": "cyan_concrete", - "251:10": "purple_concrete", - "251:11": "blue_concrete", - "251:12": "brown_concrete", - "251:13": "green_concrete", - "251:14": "red_concrete", - "251:15": "black_concrete", - "252:0": "white_concrete_powder", - "252:1": "orange_concrete_powder", - "252:2": "magenta_concrete_powder", - "252:3": "light_blue_concrete_powder", - "252:4": "yellow_concrete_powder", - "252:5": "lime_concrete_powder", - "252:6": "pink_concrete_powder", - "252:7": "gray_concrete_powder", - "252:8": "light_gray_concrete_powder", - "252:9": "cyan_concrete_powder", - "252:10": "purple_concrete_powder", - "252:11": "blue_concrete_powder", - "252:12": "brown_concrete_powder", - "252:13": "green_concrete_powder", - "252:14": "red_concrete_powder", - "252:15": "black_concrete_powder", - "255:0": "structure_block[mode=save]", - "255:1": "structure_block[mode=load]", - "255:2": "structure_block[mode=corner]", - "255:3": "structure_block[mode=data]" - }, - "clientCalculatedBlocks": { - "block_snowy": [ - "grass_block", - "dirt", - "coarse_dirt", - "podzol", - "mycelium" - ], - "directional": [ - "fire", - "redstone_wire", - "oak_fence", - "iron_bars", - "glass_pane", - "vine", - "nether_brick_fence", - "tripwire", - "cobblestone_wall", - "mossy_cobblestone_wall", - "white_stained_glass_pane", - "orange_stained_glass_pane", - "magenta_stained_glass_pane", - "light_blue_stained_glass_pane", - "yellow_stained_glass_pane", - "lime_stained_glass_pane", - "pink_stained_glass_pane", - "gray_stained_glass_pane", - "light_gray_stained_glass_pane", - "cyan_stained_glass_pane", - "purple_stained_glass_pane", - "blue_stained_glass_pane", - "brown_stained_glass_pane", - "green_stained_glass_pane", - "red_stained_glass_pane", - "black_stained_glass_pane", - "spruce_fence", - "birch_fence", - "jungle_fence", - "dark_oak_fence", - "acacia_fence", - "chorus_plant" - ], - "door": [ - "oak_door", - "iron_door", - "spruce_door", - "birch_door", - "jungle_door", - "acacia_door", - "dark_oak_door" - ], - "repeater_locked": [ - "repeater" - ], - "gate_in_wall": [ - "oak_fence_gate", - "spruce_fence_gate", - "birch_fence_gate", - "jungle_fence_gate", - "dark_oak_fence_gate", - "acacia_fence_gate" - ] - } -} diff --git a/src/react/AddServerOrConnect.tsx b/src/react/AddServerOrConnect.tsx deleted file mode 100644 index 36fd5264..00000000 --- a/src/react/AddServerOrConnect.tsx +++ /dev/null @@ -1,256 +0,0 @@ -import React, { useEffect } from 'react' -import { appQueryParams } from '../appParams' -import { fetchServerStatus, isServerValid } from '../api/mcStatusApi' -import { parseServerAddress } from '../parseServerAddress' -import Screen from './Screen' -import Input, { INPUT_LABEL_WIDTH, InputWithLabel } from './Input' -import Button from './Button' -import SelectGameVersion from './SelectGameVersion' -import { usePassesScaledDimensions } from './UIProvider' - -export interface BaseServerInfo { - ip: string - name?: string - versionOverride?: string - proxyOverride?: string - usernameOverride?: string - /** Username or always use new if true */ - authenticatedAccountOverride?: string | true -} - -interface Props { - onBack: () => void - onConfirm: (info: BaseServerInfo) => void - title?: string - initialData?: BaseServerInfo - parseQs?: boolean - onQsConnect?: (server: BaseServerInfo) => void - placeholders?: Pick - accounts?: string[] - authenticatedAccounts?: number - versions?: string[] -} - -export default ({ onBack, onConfirm, title = 'Add a Server', initialData, parseQs, onQsConnect, placeholders, accounts, versions }: Props) => { - const isSmallHeight = !usePassesScaledDimensions(null, 350) - const qsParamName = parseQs ? appQueryParams.name : undefined - const qsParamIp = parseQs ? appQueryParams.ip : undefined - const qsParamVersion = parseQs ? appQueryParams.version : undefined - const qsParamProxy = parseQs ? appQueryParams.proxy : undefined - const qsParamUsername = parseQs ? appQueryParams.username : undefined - const qsParamLockConnect = parseQs ? appQueryParams.lockConnect : undefined - - const parsedQsIp = parseServerAddress(qsParamIp) - const parsedInitialIp = parseServerAddress(initialData?.ip) - - const [serverName, setServerName] = React.useState(initialData?.name ?? qsParamName ?? '') - const [serverIp, setServerIp] = React.useState(parsedQsIp.serverIpFull || parsedInitialIp.serverIpFull || '') - const [versionOverride, setVersionOverride] = React.useState(initialData?.versionOverride ?? /* legacy */ initialData?.['version'] ?? qsParamVersion ?? '') - const [proxyOverride, setProxyOverride] = React.useState(initialData?.proxyOverride ?? qsParamProxy ?? '') - const [usernameOverride, setUsernameOverride] = React.useState(initialData?.usernameOverride ?? qsParamUsername ?? '') - const lockConnect = qsParamLockConnect === 'true' - - const smallWidth = !usePassesScaledDimensions(400) - const initialAccount = initialData?.authenticatedAccountOverride - const [accountIndex, setAccountIndex] = React.useState(initialAccount === true ? -2 : initialAccount ? (accounts?.includes(initialAccount) ? accounts.indexOf(initialAccount) : -2) : -1) - - const freshAccount = accountIndex === -2 - const noAccountSelected = accountIndex === -1 - const authenticatedAccountOverride = noAccountSelected ? undefined : freshAccount ? true : accounts?.[accountIndex] - - let ipFinal = serverIp - ipFinal = ipFinal.replace(/:$/, '') - const commonUseOptions: BaseServerInfo = { - name: serverName, - ip: ipFinal, - versionOverride: versionOverride || undefined, - proxyOverride: proxyOverride || undefined, - usernameOverride: usernameOverride || undefined, - authenticatedAccountOverride, - } - - const [fetchedServerInfoIp, setFetchedServerInfoIp] = React.useState(undefined) - const [serverOnline, setServerOnline] = React.useState(null as boolean | null) - const [onlinePlayersList, setOnlinePlayersList] = React.useState([]) - - useEffect(() => { - const controller = new AbortController() - - const checkServer = async () => { - if (!qsParamIp || !isServerValid(qsParamIp)) return - - try { - const status = await fetchServerStatus(qsParamIp) - if (!status) return - - setServerOnline(status.raw.online) - setOnlinePlayersList(status.raw.players?.list.map(p => p.name_raw) ?? []) - setFetchedServerInfoIp(qsParamIp) - } catch (err) { - console.error('Failed to fetch server status:', err) - } - } - - void checkServer() - return () => controller.abort() - }, [qsParamIp]) - - const validateUsername = (username: string) => { - if (!username) return undefined - if (onlinePlayersList.includes(username)) { - return { border: 'red solid 1px' } - } - const MINECRAFT_USERNAME_REGEX = /^\w{3,16}$/ - if (!MINECRAFT_USERNAME_REGEX.test(username)) { - return { border: 'red solid 1px' } - } - return undefined - } - - const validateServerIp = () => { - if (!serverIp) return undefined - if (serverOnline) { - return { border: 'lightgreen solid 1px' } - } else { - return { border: 'red solid 1px' } - } - } - - const displayConnectButton = qsParamIp - const serverExamples = ['example.com:25565', 'play.hypixel.net', 'ws://play.pcm.gg', 'wss://play.webmc.fun'] - // pick random example - const example = serverExamples[Math.floor(Math.random() * serverExamples.length)] - - return -
{ - e.preventDefault() - onConfirm(commonUseOptions) - }} - > -
- { - setServerIp(value) - setServerOnline(false) - }} - validateInput={serverOnline === null || fetchedServerInfoIp !== serverIp ? undefined : validateServerIp} - placeholder={example} - /> - {!lockConnect && <> -
- setServerName(value)} placeholder='Defaults to IP' /> -
- } - {isSmallHeight ?
:
Overrides:
} -
- - { return { value: v, label: v } }) ?? []} - onChange={(value) => { - setVersionOverride(value) - }} - placeholder="Optional, but recommended to specify" - disabled={lockConnect} - /> -
- - setProxyOverride(value)} - placeholder={serverIp.startsWith('ws://') || serverIp.startsWith('wss://') ? 'Not needed for websocket servers' : placeholders?.proxyOverride} - /> - setUsernameOverride(value)} - placeholder={placeholders?.usernameOverride} - validateInput={!serverOnline || fetchedServerInfoIp !== serverIp ? undefined : validateUsername} - /> - - - {!lockConnect && <> - { - onBack() - }}> - Cancel - - - {displayConnectButton ? translate('Save') : {translate('Save')}} - - } - {displayConnectButton && ( -
- { - onQsConnect?.(commonUseOptions) - }} - > - {translate('Connect')} - -
- )} -
- - -} - -const ButtonWrapper = ({ ...props }: React.ComponentProps) => { - props.style ??= {} - props.style.width = INPUT_LABEL_WIDTH - return } - {actionsSlot} - {!lockConnect && } - {backAction &&
- ) -} diff --git a/src/react/AppStatusProvider.tsx b/src/react/AppStatusProvider.tsx deleted file mode 100644 index 9c7b34ac..00000000 --- a/src/react/AppStatusProvider.tsx +++ /dev/null @@ -1,242 +0,0 @@ -import { proxy, useSnapshot } from 'valtio' -import { useEffect, useRef, useState } from 'react' -import { activeModalStack, activeModalStacks, hideModal, insertActiveModalStack, miscUiState } from '../globalState' -import { guessProblem } from '../errorLoadingScreenHelpers' -import type { ConnectOptions } from '../connect' -import { downloadPacketsReplay, packetsRecordingState, replayLogger } from '../packetsReplay/packetsReplayLegacy' -import { getProxyDetails } from '../microsoftAuthflow' -import { downloadAutoCapturedPackets, getLastAutoCapturedPackets } from '../mineflayer/plugins/packetsRecording' -import { appQueryParams } from '../appParams' -import AppStatus from './AppStatus' -import DiveTransition from './DiveTransition' -import { useDidUpdateEffect } from './utils' -import { useIsModalActive } from './utilsApp' -import Button from './Button' -import { updateAuthenticatedAccountData, updateLoadedServerData, AuthenticatedAccount } from './serversStorage' -import { showOptionsModal } from './SelectOption' -import LoadingChunks from './LoadingChunks' -import MessageFormattedString from './MessageFormattedString' - -const initialState = { - status: '', - lastStatus: '', - maybeRecoverable: true, - descriptionHint: '', - isError: false, - hideDots: false, - loadingChunksData: null as null | Record, - loadingChunksDataPlayerChunk: null as null | { x: number, z: number }, - isDisplaying: false, - minecraftJsonMessage: null as null | Record, - showReconnect: false -} -export const appStatusState = proxy(initialState) -export const resetAppStatusState = () => { - Object.assign(appStatusState, initialState) -} - -export const lastConnectOptions = { - value: null as ConnectOptions | null -} -globalThis.lastConnectOptions = lastConnectOptions - -const saveReconnectOptions = (options: ConnectOptions) => { - sessionStorage.setItem('reconnectOptions', JSON.stringify({ - value: options, - timestamp: Date.now() - })) -} - -export const reconnectReload = () => { - if (lastConnectOptions.value) { - saveReconnectOptions(lastConnectOptions.value) - window.location.reload() - } -} - -export const quickDevReconnect = () => { - if (!lastConnectOptions.value) { - return - } - - resetAppStatusState() - window.dispatchEvent(new window.CustomEvent('connect', { - detail: lastConnectOptions.value - })) -} - -export default () => { - const lastState = useRef(JSON.parse(JSON.stringify(appStatusState))) - const currentState = useSnapshot(appStatusState) - const { active: replayActive } = useSnapshot(packetsRecordingState) - - const isOpen = useIsModalActive('app-status') - - if (isOpen) { - lastState.current = JSON.parse(JSON.stringify(currentState)) - } - - const usingState = (isOpen ? currentState : lastState.current) as typeof currentState - const { isError, lastStatus, maybeRecoverable, status, hideDots, descriptionHint, loadingChunksData, loadingChunksDataPlayerChunk, minecraftJsonMessage, showReconnect } = usingState - - useDidUpdateEffect(() => { - // todo play effect only when world successfully loaded - if (!isOpen) { - const startDiveAnimation = (divingElem: HTMLElement) => { - divingElem.style.animationName = 'dive-animation' - divingElem.parentElement!.style.perspective = '1200px' - divingElem.onanimationend = () => { - divingElem.parentElement!.style.perspective = '' - divingElem.onanimationend = null - } - } - - const divingElem = document.querySelector('#viewer-canvas') - let observer: MutationObserver | null = null - if (divingElem) { - startDiveAnimation(divingElem as HTMLElement) - } else { - observer = new MutationObserver((mutations) => { - const divingElem = document.querySelector('#viewer-canvas') - if (divingElem) { - startDiveAnimation(divingElem as HTMLElement) - observer!.disconnect() - } - }) - observer.observe(document.body, { - childList: true, - subtree: true - }) - } - return () => { - if (observer) { - observer.disconnect() - } - } - } - }, [isOpen]) - - useEffect(() => { - const controller = new AbortController() - window.addEventListener('keyup', (e) => { - if ('input textarea select'.split(' ').includes((e.target as HTMLElement).tagName?.toLowerCase() ?? '')) return - if (activeModalStack.at(-1)?.reactType !== 'app-status') return - // todo do only if reconnect is possible - if (e.code !== 'KeyR' || !lastConnectOptions.value) return - quickDevReconnect() - }, { - signal: controller.signal - }) - return () => controller.abort() - }, []) - - const displayAuthButton = status.includes('This server appears to be an online server and you are providing no authentication.') - || JSON.stringify(minecraftJsonMessage ?? {}).toLowerCase().includes('authenticate') - const hasVpnText = (text: string) => text.includes('VPN') || text.includes('Proxy') - const displayVpnButton = hasVpnText(status) || (minecraftJsonMessage && hasVpnText(JSON.stringify(minecraftJsonMessage))) - const authReconnectAction = async () => { - let accounts = [] as AuthenticatedAccount[] - updateAuthenticatedAccountData(oldAccounts => { - accounts = oldAccounts - return oldAccounts - }) - - const account = await showOptionsModal('Choose account to connect with', [...accounts.map(account => account.username), 'Use other account']) - if (!account) return - lastConnectOptions.value!.authenticatedAccount = accounts.find(acc => acc.username === account) || true - quickDevReconnect() - } - - const lastAutoCapturedPackets = getLastAutoCapturedPackets() - const lockConnect = appQueryParams.lockConnect === 'true' - const wasDisconnected = showReconnect - let backAction = undefined as (() => void) | undefined - if (maybeRecoverable && (!lockConnect || !wasDisconnected)) { - backAction = () => { - if (!wasDisconnected) { - hideModal(undefined, undefined, { force: true }) - return - } - resetAppStatusState() - miscUiState.gameLoaded = false - miscUiState.loadedDataVersion = null - window.loadedData = undefined - if (activeModalStacks['main-menu']) { - insertActiveModalStack('main-menu') - if (activeModalStack.at(-1)?.reactType === 'app-status') { - hideModal(undefined, undefined, { force: true }) // workaround: hide loader that was shown on world loading - } - } else { - hideModal(undefined, undefined, { force: true }) - } - } - } - return - { - displayAuthButton ? '' : (isError ? guessProblem(status) : '') || descriptionHint - }{ - minecraftJsonMessage && - }} - backAction={backAction} - actionsSlot={ - <> - {displayAuthButton && -
-} diff --git a/src/react/Book.module.css b/src/react/Book.module.css deleted file mode 100644 index d672baf6..00000000 --- a/src/react/Book.module.css +++ /dev/null @@ -1,605 +0,0 @@ -.bookWrapper * { - box-sizing: border-box; -} -.bookWrapper { - box-sizing: border-box; - position: absolute; - width: 100%; - height: 100%; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - gap: 0.5vh; -} -.bookContainer { - position: relative; - display: flex; - flex-direction: column; - justify-content: space-between; - align-items: center; - gap: 3%; - padding: 0; -} - -.bookImages { - position: relative; -} - -.outSide { - display: none; - position: absolute; - z-index: 2; - top: 0; - left: 50%; - transform: translateX(-50%); - width: 40%; - height: 100%; - margin: 0 auto; -} -.titleIcon { - display: none; - position: absolute; - top: 0; - left: 50%; - transform: translateX(-50%); - width: 50%; - height: 100%; - margin: 0 auto; - z-index: 2; -} -.titleContent { - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - position: relative; - width: 100%; - height: 100%; - overflow: hidden; -} -.titleContent span { - font-size: 10px; -} -.titleContent input { - text-align: center; - width: 100%; - height: 10%; - font-size: 10px; - margin: 4% 0%; - padding: 2% 4%; - background-color: transparent; - color: white; - caret-color: greenyellow; - font-family: inherit; - border: 1px solid black; - padding: 8px 15px; -} - -.insideIcon { - width: 100%; - height: 20vh; -} -.insideHalfIcon { - position: absolute; - top: 0; - left: 0; - width: 50%; - height: 100%; -} - -.inside { - position: absolute; - top: 0%; - width: 90%; - height: 100%; - display: flex; - justify-content: flex-start; - align-items: flex-start; - gap: 5%; - background-color: transparent; - box-shadow: none; - padding: 3% 0%; -} -.inside.uneditable { - height: 90%; -} - -.page { - position: relative; - width: 50%; - height: 100%; - overflow-y: auto; - background-color: transparent; - overflow: hidden; -} - -.messageFormattedString { - position: relative; - width: 100%; - height: 100%; - white-space: pre-wrap; - font-family: minecraft; - font-size: 10px; - padding: 10px; -} - -.messageFormattedString > span { - text-shadow: none !important; -} - -.textArea { - position: relative; - width: 100%; - height: 100%; - border: none; - outline: none; - resize: none; - font-family: minecraft; - font-size: 10px; - background-color: transparent; - box-shadow: none; - overflow: hidden; - text-overflow: ellipsis; -} -.textArea > span { - animation: blink 1s step-end infinite; - border-bottom: 2px solid white; -} - -@keyframes blink { - from, - to { - border-color: transparent; - } - 50% { - border-color: #fff; - } -} - -.controlPrev, .controlNext, -.controlPrev::before, .controlNext::before, -.controlPrev::after, .controlNext::after { - border: none !important; - background-color: transparent !important; - text-shadow: none !important; - width: auto !important; -} - -.inside Button.controlPrev { - position: absolute !important; - background-image: url('./book_icons/prev.webp'); - background-size: contain; - background-repeat: no-repeat; - background-position: center; - left: 2%; - bottom: 6%; - margin: 0; - padding: 4%; -} -.inside Button.controlPrev:active { - background-image: url('./book_icons/prev-click.webp') !important; -} -.inside Button.controlNext { - position: absolute !important; - background-image: url('./book_icons/next.webp') !important; - background-size: contain; - background-repeat: no-repeat; - background-position: center; - right: 2%; - bottom: 6%; - margin: 0; - padding: 4%; -} -.inside Button.controlNext:active { - background-image: url('./book_icons/next-click.webp') !important; -} - -.actions { - display: flex; - flex-wrap: wrap; - width: 50%; - gap: 0.5vw; - row-gap: 0.5vw; - align-items: center; - justify-content: center; -} - -.actions button { - cursor: pointer; - font-family: minecraft; - width: 45%; -} - -/* Animations */ - -@keyframes titleAnimation { - 0% { - transform: translateX(-50%) rotateY(85deg); - } - 100% { - transform: translateX(-50%) rotateY(0); - } -} - -@keyframes titleContentAnimation { - 0% { - transform: translateX(-50%) rotateY(85deg); - } - 100% { - transform: translateX(-50%) rotateY(0); - } -} - -@keyframes insideAnimation { - 0% { - clip-path: inset(0% 0% 0% 0%); - transform: translateX(0%); - } - 25% { - transform: translateX(5%); - } - 50% { - clip-path: inset(0% 0% 0% 50%); - transform: translateX(0%); - } - 99% { - opacity: 1; - } - 100% { - clip-path: inset(0% 0% 0% 75%); - transform: translateX(-25%); - opacity: 0; - } -} - -@keyframes pageAnimation { - 0% { - transform: translateX(0) rotateY(0); - } - 99% { - display: flex; - } - 100% { - transform: translateX(55%) rotateY(90deg); - padding: 0%; - display: none; - } -} -@keyframes pageTextAnimation { - 0% { - transform: translateX(0) rotateY(0); - } - 100% { - transform: translateX(65%) rotateY(88deg); - display: none; - } -} -@keyframes pageSecondTextAnimation { - 0% { - transform: translateX(0%); - } - 25% { - transform: translateX(10%); - } - 50% { - transform: translateX(0%); - display: flex; - } - 100% { - transform: translateX(-50%); - display: none; - } -} - -.pageAnimation { - animation: pageAnimation .15s forwards; -} - -.titleAnimation { - display: flex; - animation: titleAnimation .3s forwards; -} - -.titleContentAnimation { - display: flex; - animation: titleContentAnimation .3s forwards; -} - -.insideAnimation { - animation: insideAnimation .3s forwards; -} - -.pageTextAnimation { - animation: pageTextAnimation .15s forwards; -} - -.pageSecondTextAnimation { - animation: pageSecondTextAnimation .3s forwards; -} - -.hidden { - display: none !important; -} - -/* Animation Reverse */ - -@keyframes titleAnimationReverse { - 0% { - transform: translateX(-50%) rotateY(0); - } - 50% { - transform: translateX(0%) - } - 100% { - transform: translateX(-50%) rotateY(-90deg); - display: none; - } -} - -@keyframes titleContentAnimationReverse { - 0% { - transform: translateX(-50%) rotateY(0); - } - 50% { - transform: translateX(10%) - } - 100% { - transform: translateX(-50%) rotateY(-90deg); - display: none; - } -} - -@keyframes insideAnimationReverse { - 0% { - clip-path: inset(0% 0% 0% 50%); - transform: translateX(0%); - opacity: 1; - } - 50% { - clip-path: inset(0% 0% 0% 50%); - } - 100% { - clip-path: inset(0% 0% 0% 0%); - transform: translateX(0%); - } -} - -@keyframes pageAnimationReverse { - 0% { - transform: translateX(55%) rotateY(-90deg); - padding: 0%; - display: none; - } - 1% { - display: flex; - } - 100% { - transform: translateX(0) rotateY(0); - } -} - -@keyframes pageTextAnimationReverse { - 0% { - transform: translateX(65%) rotateY(88deg); - display: none; - } - 100% { - transform: translateX(0) rotateY(0); - } -} - -@keyframes pageSecondTextAnimationReverse { - 0% { - transform: translateX(-50%); - display: none; - } - 50% { - transform: translateX(0%); - display: flex; - } - 75% { - transform: translateX(10%); - } - 100% { - transform: translateX(0%); - } -} - -@keyframes pageButtonAnimationReverse { - 0% { - opacity: 0; - } - 99% { - opacity: 0; - } - 100% { - opacity: 1; - } -} - -.titleAnimationReverse { - display: flex; - animation: titleAnimationReverse .3s forwards; -} - -.titleContentAnimationReverse { - display: flex; - animation: titleContentAnimationReverse .3s forwards; -} - -.insideAnimationReverse { - animation: insideAnimationReverse .3s forwards; -} - -.pageAnimationReverse { - animation: pageAnimationReverse .15s forwards; -} - -.pageTextAnimationReverse { - animation: pageTextAnimationReverse .15s forwards; -} - -.pageSecondTextAnimationReverse { - animation: pageSecondTextAnimationReverse .3s forwards; -} - -.pageButtonAnimationReverse { - animation: pageButtonAnimationReverse .3s forwards -} - -@media screen and (min-width: 972px) and (max-width: 1024px) { - .textArea, .text { - font-size: 10px; - } -} - -@media screen and (max-width: 972px) { - .outSide { - width: 80%; - padding: 4% 0%; - } - .titleIcon { - width: 100%; - } - .titleContent span { - font-size: 10px; - } - .titleContent input { - font-size: 10px; - } - - .insideIcon { - width: 100%; - height: 40vh; - } - .inside { - padding: 9% 8%; - } - .insideHalfIcon { - display: none; - } - - .page { - width: 100%; - height: 100%; - } - .inside Button.controlPrev { - left: 10%; - bottom: 6%; - padding: 6%; - } - .inside Button.controlNext { - right: 15%; - bottom: 6%; - padding: 6%; - } - - .textArea, .text { - font-size: 10px; - } - /* Animations width < 768px */ - @keyframes titleAnimation { - 0% { - transform: translateX(-0%) rotateY(90deg); - } - 100% { - transform: translateX(-50%) rotateY(0); - } - } - @keyframes titleContentAnimation { - 0% { - transform: translateX(-0%) rotateY(90deg); - } - 100% { - transform: translateX(-50%) rotateY(0); - } - } - @keyframes insideAnimation { - 0% { - transform: translateX(0) rotateY(0); - } - 100% { - transform: translateX(50%) rotateY(-90deg); - } - } - - @keyframes pageTextAnimation { - 0% { - transform: translateX(0) rotateY(0); - } - 100% { - transform: translateX(50%) rotateY(-90deg); - display: none; - } - } - - /* Animations Reverse width < 768px */ - @keyframes titleAnimationReverse { - 0% { - transform: translateX(-60%) rotateY(0); - } - 75% { - opacity: 1; - } - 100% { - opacity: 0; - transform: translateX(0%) rotateY(90deg); - } - } - @keyframes titleContentAnimationReverse { - 0% { - transform: translateX(-60%) rotateY(0); - } - 100% { - transform: translateX(0%) rotateY(90deg); - } - } - @keyframes insideAnimationReverse { - 0% { - z-index: 5; - transform: translateX(50%) rotateY(-90deg); - } - 100% { - transform: translateX(0) rotateY(0); - } - } - - @keyframes pageTextAnimationReverse { - 0% { - transform: translateX(25%) rotateY(-20deg); - } - 100% { - transform: translateX(0) rotateY(0); - display: flex; - } - } -} - -@media screen and (max-width: 591px) { - .textArea .text { - font-size: 14px; - } -} - -@media screen and (max-height: 768px) { - .textArea, .text { - font-size: 5px; - } - .outSide { - padding: 4% 0%; - } - .titleContent span { - font-size: 5px; - } -} -@media screen and (max-height: 632px) { - .titleContent span { - font-size: 5px; - } -} -@media screen and (max-height: 392px) { - .insideIcon { - height: 40vh; - } -} diff --git a/src/react/Book.module.css.d.ts b/src/react/Book.module.css.d.ts deleted file mode 100644 index 06d3d007..00000000 --- a/src/react/Book.module.css.d.ts +++ /dev/null @@ -1,38 +0,0 @@ -// This file is automatically generated. -// Please do not change this file! -interface CssExports { - actions: string; - blink: string; - bookContainer: string; - bookImages: string; - bookWrapper: string; - controlNext: string; - controlPrev: string; - hidden: string; - inside: string; - insideAnimation: string; - insideAnimationReverse: string; - insideHalfIcon: string; - insideIcon: string; - messageFormattedString: string; - outSide: string; - page: string; - pageAnimation: string; - pageAnimationReverse: string; - pageButtonAnimationReverse: string; - pageSecondTextAnimation: string; - pageSecondTextAnimationReverse: string; - pageTextAnimation: string; - pageTextAnimationReverse: string; - text: string; - textArea: string; - titleAnimation: string; - titleAnimationReverse: string; - titleContent: string; - titleContentAnimation: string; - titleContentAnimationReverse: string; - titleIcon: string; - uneditable: string; -} -declare const cssExports: CssExports; -export default cssExports; diff --git a/src/react/Book.stories.tsx b/src/react/Book.stories.tsx deleted file mode 100644 index f772122d..00000000 --- a/src/react/Book.stories.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { Meta, Story } from '@storybook/react' -import Book, { BookProps } from './Book' - -export default { - title: 'Book', - component: Book, -} as Meta - -const Template: Story = (args) => - -export const Default = Template.bind({}) -Default.args = { - textPages: [ - 'Page 1: This is some text for page 1.', - 'Page 2: This is some text for page 2.', - 'Page 3: This is some text for page 3.', - 'Page 4: This is some text for page 4.', - 'Page 5: This is some text for page 5.', - ], - editable: true, - onSign: (pages, title) => console.log('Signed with pages:', pages, 'Title:', title), - onEdit: (pages) => console.log('Edit with pages:', pages), - onClose: () => console.log('Closed book'), - author: 'Author' -} diff --git a/src/react/Book.tsx b/src/react/Book.tsx deleted file mode 100644 index 0c53a221..00000000 --- a/src/react/Book.tsx +++ /dev/null @@ -1,323 +0,0 @@ -import React, { useState, useRef, useEffect, useCallback } from 'react' -import insideIcon from './book_icons/book.webp' -import insideHalfIcon from './book_icons/book-half.webp' -import singlePageInsideIcon from './book_icons/notebook.webp' -import titleIcon from './book_icons/title.webp' -import styles from './Book.module.css' -import Button from './Button' -import MessageFormattedString from './MessageFormattedString' - -export interface BookProps { - textPages: string[] - editable: boolean - onSign: (textPages: string[], title: string) => void - onEdit: (textPages: string[]) => void - onClose: () => void - author: string -} - -const Book: React.FC = ({ textPages, editable, onSign, onEdit, onClose, author }) => { - const [pages, setPages] = useState(textPages) - const [currentPage, setCurrentPage] = useState(0) - const [isSinglePage, setIsSinglePage] = useState(window.innerWidth < 972) - const [insideImage, setInsideImage] = useState(window.innerWidth < 972 ? singlePageInsideIcon : insideIcon) - const [animateInsideIcon, setAnimateInsideIcon] = useState(0) - const [animatePageIcon, setAnimatePageIcon] = useState(0) - const [animateTitleIcon, setAnimateTitleIcon] = useState(0) - const [signClickedOnce, setSignClickedOnce] = useState(false) - const textAreaRefs = useRef([]) - const inputRef = useRef(null) - - const handleResize = useCallback(() => { - const isSingle = window.innerWidth < 972 - setIsSinglePage(isSingle) - setInsideImage(isSingle ? singlePageInsideIcon : insideIcon) - }, []) - - useEffect(() => { - handleResize() - window.addEventListener('resize', handleResize) - return () => window.removeEventListener('resize', handleResize) - }, [handleResize]) - - useEffect(() => { - const index = currentPage * (isSinglePage ? 1 : 2) - if (textAreaRefs.current[index]) textAreaRefs.current[index].focus() - }, [currentPage, isSinglePage]) - - useEffect(() => { - if (signClickedOnce) { - setTimeout(() => { - inputRef.current!.focus() - }, 300) // wait for animation - } - }, [signClickedOnce]) - - const handlePageChange = (direction: number) => { - setCurrentPage((prevPage) => Math.min(Math.max(prevPage + direction, 0), Math.ceil(pages.length / (isSinglePage ? 1 : 2)) - 1)) - } - - const updatePage = (index, text) => { - setPages((prevPages) => { - const updatedPages = [...prevPages] - updatedPages[index] = text - return updatedPages - }) - } - - const handleTextChange = (e, pageIndex) => { - const text = e.target.value - updatePage(pageIndex, text) - - const nextPageIndex = pageIndex + 1 - const isMaxLengthReached = text.length >= e.target.maxLength - - if (isMaxLengthReached) { - if (nextPageIndex < pages.length) { - setCurrentPage(Math.floor(nextPageIndex / (isSinglePage ? 1 : 2))) - } else { - setPages((prevPages) => [...prevPages, '']) - setCurrentPage(Math.floor(nextPageIndex / (isSinglePage ? 1 : 2))) - } - textAreaRefs.current[nextPageIndex]?.focus() - } else if (text === '' && pageIndex > 0 && e.nativeEvent.inputType === 'deleteContentBackward') { - setCurrentPage(Math.floor((pageIndex - 1) / (isSinglePage ? 1 : 2))) - textAreaRefs.current[pageIndex - 1]?.focus() - } - } - - useEffect(() => { - const index = currentPage * (isSinglePage ? 1 : 2) - textAreaRefs.current[index]?.focus() - }, [currentPage, isSinglePage]) - - const handlePaste = (e: React.ClipboardEvent, pageIndex: number) => { - const pasteText = e.clipboardData.getData('text') - const updatedPages = [...pages] - const currentText = updatedPages[pageIndex] - const selectionStart = e.currentTarget.selectionStart || 0 - const selectionEnd = e.currentTarget.selectionEnd || 0 - - const newText = currentText.slice(0, selectionStart) + pasteText + currentText.slice(selectionEnd) - updatedPages[pageIndex] = newText - setPages(updatedPages) - - if (newText.length > e.currentTarget.maxLength) { - const remainingText = newText.slice(e.currentTarget.maxLength) - updatedPages[pageIndex] = newText.slice(0, e.currentTarget.maxLength) - setPages(updatedPages) - - const nextPageIndex = pageIndex + 1 - - if (nextPageIndex < pages.length) { - handlePasteRemainingText(remainingText, nextPageIndex) - } else { - setPages((prevPages) => [...prevPages, remainingText]) - setCurrentPage(Math.floor(nextPageIndex / (isSinglePage ? 1 : 2))) - focusOnTextArea(nextPageIndex) - } - } - } - - const handlePasteRemainingText = (remainingText: string, nextPageIndex: number) => { - const updatedPages = [...pages] - updatedPages[nextPageIndex] = remainingText - setPages(updatedPages) - focusOnTextArea(nextPageIndex) - } - - const focusOnTextArea = (index: number) => { - setTimeout(() => { - textAreaRefs.current[index]?.focus() - }, 0) - } - - const handleSign = useCallback(() => { - if (editable && signClickedOnce) { - const title = inputRef.current?.value || '' - onSign(pages, title) - } - setSignClickedOnce(true) - setAnimatePageIcon(1) - setAnimateInsideIcon(1) - setTimeout(() => { - setAnimateTitleIcon(1) - }, 150) - }, [pages, onSign, editable, signClickedOnce]) - - const handleEdit = useCallback(() => { - setSignClickedOnce(false) - onEdit(pages) - }, [pages, onEdit]) - - const handleCancel = useCallback(() => { - if (signClickedOnce) { - setSignClickedOnce(false) - setAnimateTitleIcon(2) - setTimeout(() => { - setAnimateInsideIcon(2) - setTimeout(() => { - setAnimatePageIcon(2) - }, 150) - }, 150) - } else { - onClose() - } - }, [signClickedOnce, onClose]) - - const setRef = (index: number) => (el: HTMLTextAreaElement | null) => { - textAreaRefs.current[index] = el! - } - - const getAnimationClass = (animationState, baseClass) => { - switch (animationState) { - case 1: - return `${baseClass} ${styles.pageAnimation}` - case 2: - return `${baseClass} ${styles.pageAnimationReverse}` - default: - return baseClass - } - } - - const renderPage = (index) => ( -
- {editable ? ( -