diff --git a/README.MD b/README.MD index 4c15a3cd9..36d208650 100644 --- a/README.MD +++ b/README.MD @@ -1,5 +1,7 @@ # Minecraft Web Client +![banner](./docs-assets/banner.jpg) + A true Minecraft client running in your browser! A port of the original game to the web, written in JavaScript using modern web technologies. This project is a work in progress, but I consider it to be usable. If you encounter any bugs or usability issues, please report them! diff --git a/assets/loading-bg.jpg b/assets/loading-bg.jpg new file mode 100644 index 000000000..168c741ed Binary files /dev/null and b/assets/loading-bg.jpg differ diff --git a/docs-assets/banner.jpg b/docs-assets/banner.jpg new file mode 100644 index 000000000..270a6863d Binary files /dev/null and b/docs-assets/banner.jpg differ diff --git a/index.html b/index.html index ac9721c0f..6a273589e 100644 --- a/index.html +++ b/index.html @@ -4,22 +4,59 @@ - + + + Prismarine Web Client diff --git a/package.json b/package.json index 642dd0de6..2b4083596 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "dependencies": { "@dimaka/interface": "0.0.3-alpha.0", "@floating-ui/react": "^0.26.1", + "@mui/base": "5.0.0-beta.34", "@types/react": "^18.2.20", "@types/react-dom": "^18.2.7", "@types/wicg-file-system-access": "^2023.10.2", @@ -45,14 +46,14 @@ "esbuild": "^0.19.3", "esbuild-plugin-polyfill-node": "^0.3.0", "express": "^4.18.2", - "flying-squid": "github:zardoy/space-squid#everything", + "flying-squid": "npm:@zardoy/flying-squid@^0.0.9", "fs-extra": "^11.1.1", "iconify-icon": "^1.0.8", "jszip": "^3.10.1", "lit": "^2.8.0", "lodash-es": "^4.17.21", "minecraft-assets": "^1.12.2", - "minecraft-data": "3.58.0", + "minecraft-data": "3.60.0", "net-browserify": "github:zardoy/prismarinejs-net-browserify", "node-gzip": "^1.1.2", "peerjs": "^1.5.0", @@ -126,9 +127,9 @@ "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.58.0", + "minecraft-data": "3.60.0", "prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", - "minecraft-protocol": "github:zardoy/minecraft-protocol#custom-client-extra", + "minecraft-protocol": "github:zardoy/minecraft-protocol#everything", "react": "^18.2.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 14a513fff..1ad1edfc1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,9 +9,9 @@ overrides: 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.58.0 + minecraft-data: 3.60.0 prismarine-provider-anvil: github:zardoy/prismarine-provider-anvil#everything - minecraft-protocol: github:zardoy/minecraft-protocol#custom-client-extra + minecraft-protocol: github:zardoy/minecraft-protocol#everything react: ^18.2.0 importers: @@ -24,6 +24,9 @@ importers: '@floating-ui/react': specifier: ^0.26.1 version: 0.26.1(react-dom@18.2.0)(react@18.2.0) + '@mui/base': + specifier: 5.0.0-beta.34 + version: 5.0.0-beta.34(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0) '@types/react': specifier: ^18.2.20 version: 18.2.20 @@ -73,8 +76,8 @@ importers: specifier: ^4.18.2 version: 4.18.2 flying-squid: - specifier: github:zardoy/space-squid#everything - version: github.com/zardoy/space-squid/70ac2e0d0520115589180a42b3df87126d41f784 + specifier: npm:@zardoy/flying-squid@^0.0.9 + version: /@zardoy/flying-squid@0.0.9 fs-extra: specifier: ^11.1.1 version: 11.1.1 @@ -94,8 +97,8 @@ importers: specifier: ^1.12.2 version: 1.12.2 minecraft-data: - specifier: 3.58.0 - version: 3.58.0 + specifier: 3.60.0 + version: 3.60.0 net-browserify: specifier: github:zardoy/prismarinejs-net-browserify version: github.com/zardoy/prismarinejs-net-browserify/7d827dba61bd2f9ac9a6086fe2079a0fccadd070 @@ -235,7 +238,7 @@ importers: version: github.com/zardoy/minecraft-inventory-gui/69003692b3041d94a420a65c7d3cc1b37737e838(@types/react@18.2.20)(react@18.2.0) mineflayer: specifier: github:PrismarineJS/mineflayer - version: github.com/PrismarineJS/mineflayer/5c71edf48bb2f2dfa16cddb9af5baa0c4d55cf0d + version: github.com/PrismarineJS/mineflayer/cc98f1307e3ab48477d2a9ff29da4447f42b30bc mineflayer-pathfinder: specifier: ^2.4.4 version: 2.4.4 @@ -317,15 +320,12 @@ importers: minecrafthawkeye: specifier: ^1.3.6 version: 1.3.6 - node-canvas-webgl: - specifier: ^0.3.0 - version: 0.3.0 prismarine-block: specifier: github:zardoy/prismarine-block#next-era version: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-chunk: specifier: ^1.22.0 - version: 1.35.0(minecraft-data@3.58.0) + version: 1.35.0(minecraft-data@3.60.0) prismarine-schematic: specifier: ^1.2.0 version: 1.2.3 @@ -353,6 +353,10 @@ importers: vec3: specifier: ^0.1.7 version: 0.1.8 + optionalDependencies: + node-canvas-webgl: + specifier: ^0.3.0 + version: 0.3.0 prismarine-viewer/viewer/sign-renderer: dependencies: @@ -1644,6 +1648,13 @@ packages: dependencies: regenerator-runtime: 0.14.0 + /@babel/runtime@7.23.9: + resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + dev: false + /@babel/template@7.22.5: resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} @@ -2523,12 +2534,25 @@ packages: dependencies: '@floating-ui/utils': 0.1.6 + /@floating-ui/core@1.6.0: + resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + dependencies: + '@floating-ui/utils': 0.2.1 + dev: false + /@floating-ui/dom@1.5.3: resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} dependencies: '@floating-ui/core': 1.5.0 '@floating-ui/utils': 0.1.6 + /@floating-ui/dom@1.6.1: + resolution: {integrity: sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==} + dependencies: + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.1 + dev: false + /@floating-ui/react-dom@2.0.2(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==} peerDependencies: @@ -2539,6 +2563,17 @@ packages: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + /@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} + peerDependencies: + react: ^18.2.0 + react-dom: '>=16.8.0' + dependencies: + '@floating-ui/dom': 1.6.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + /@floating-ui/react@0.26.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-5gyJIJ2tZOPMgmZ/vEcVhdmQiy75b7LPO71sYIiDsxGcZ4hxLuygQWCuT0YXHqppt//Eese+L6t5KnX/gZ3tVA==} peerDependencies: @@ -2555,9 +2590,15 @@ packages: /@floating-ui/utils@0.1.6: resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} + /@floating-ui/utils@0.2.1: + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + dev: false + /@gar/promisify@1.1.3: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + requiresBuild: true dev: false + optional: true /@humanwhocodes/config-array@0.11.11: resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} @@ -3155,6 +3196,58 @@ packages: engines: {node: '>= 10'} dev: false + /@mui/base@5.0.0-beta.34(@types/react@18.2.20)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-e2mbTGTtReD/y5RFwnhkl1Tgl3XwgJhY040IlfkTVaU9f5LWrVhEnpRsYXu3B1CtLrwiWs4cu7aMHV9yRd4jpw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^18.2.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.9 + '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) + '@mui/types': 7.2.13(@types/react@18.2.20) + '@mui/utils': 5.15.7(@types/react@18.2.20)(react@18.2.0) + '@popperjs/core': 2.11.8 + '@types/react': 18.2.20 + clsx: 2.1.0 + prop-types: 15.8.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@mui/types@7.2.13(@types/react@18.2.20): + resolution: {integrity: sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.20 + dev: false + + /@mui/utils@5.15.7(@types/react@18.2.20)(react@18.2.0): + resolution: {integrity: sha512-8qhsxQRNV6aEOjjSk6YQIYJxkF5klhj8oG1FEEU4z6HV78TjNqRxMP08QGcdsibEbez+nihAaz6vu83b4XqbAg==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^18.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.23.9 + '@types/prop-types': 15.7.11 + '@types/react': 18.2.20 + prop-types: 15.8.1 + react: 18.2.0 + react-is: 18.2.0 + dev: false + /@ndelangen/get-tarball@3.0.9: resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==} dependencies: @@ -3187,19 +3280,23 @@ packages: /@npmcli/fs@2.1.2: resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + requiresBuild: true dependencies: '@gar/promisify': 1.1.3 semver: 7.5.4 dev: false + optional: true /@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 + requiresBuild: true dependencies: mkdirp: 1.0.4 rimraf: 3.0.2 dev: false + optional: true /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -4764,7 +4861,9 @@ packages: /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} + requiresBuild: true dev: false + optional: true /@tweenjs/tween.js@20.0.3: resolution: {integrity: sha512-SYUe1UgY5HM05EB4+0B4arq2IPjvyzKXoklXKxSYrc2IFxGm1cBrqg5XbiB5uwbs0xY5j+rj986NAJMM0KZaUw==} @@ -5017,6 +5116,10 @@ packages: resolution: {integrity: sha512-VjID5MJb1eGKthz2qUerWT8+R4b9N+CHvGCzg9fn4kWZgaF9AhdYikQio3R7wV8YY1NsQKPaCwKz1Yff+aHNUQ==} dev: true + /@types/prop-types@15.7.11: + resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + dev: false + /@types/prop-types@15.7.5: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} @@ -5146,7 +5249,7 @@ packages: resolution: {integrity: sha512-Km7XAtUIduROw7QPgvcft0lIupeG8a8rdKL8RiSyKvlE7dYY31fEn41HVuQsRFDuROA8tA4K2UVL+WdfFmErBA==} requiresBuild: true dependencies: - '@types/node': 20.8.0 + '@types/node': 20.8.10 optional: true /@typescript-eslint/eslint-plugin@6.1.0(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2): @@ -5481,6 +5584,45 @@ packages: tslib: 1.14.1 dev: true + /@zardoy/flying-squid@0.0.9: + resolution: {integrity: sha512-Q7xqm+Uu/Y/8jziVM+sazddDw50t3IoQ7y0BTAgLpYaqEsJDvTAoXmHspd9NRFVEs0CM4M/qZxvztCcdJryGIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + change-case: 4.1.2 + colors: 1.4.0 + diamond-square: github.com/zardoy/diamond-square/789d7090748ddcae22bb89908db15ba448bdfbb0 + emit-then: 2.0.0 + event-promise: 0.0.1 + exit-hook: 2.2.1 + flatmap: 0.0.3 + long: 5.2.3 + minecraft-data: 3.60.0 + minecraft-protocol: github.com/zardoy/minecraft-protocol/2c14a686bfe7cbd9a5c87b629b402295ee86219f + mkdirp: 2.1.6 + moment: 2.29.4 + needle: 2.9.1 + node-gzip: 1.1.2 + node-rsa: 1.1.1 + prismarine-chunk: 1.35.0(minecraft-data@3.60.0) + prismarine-entity: 2.3.1 + prismarine-item: 1.14.0 + prismarine-nbt: 2.5.0 + prismarine-provider-anvil: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.60.0) + prismarine-windows: 2.8.0 + prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 + random-seed: 0.3.0 + range: 0.0.3 + readline: 1.3.0 + typed-emitter: 1.4.0 + uuid-1345: 1.0.2 + vec3: 0.1.8 + yargs: 17.7.2 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + /@zardoy/react-util@0.2.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-glABtx54mh4XSaK6BNALWE3mlshPjcPwPsRj/GnOXEA7WJY/6n43iJoukbaYF3758mGZRU5Fq6gklyFjBg0yHQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5599,9 +5741,11 @@ packages: /agentkeepalive@4.5.0: resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} engines: {node: '>= 8.0.0'} + requiresBuild: true dependencies: humanize-ms: 1.2.1 dev: false + optional: true /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} @@ -5710,10 +5854,12 @@ packages: /are-we-there-yet@3.0.1: resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + requiresBuild: true dependencies: delegates: 1.0.0 readable-stream: 3.6.2 dev: false + optional: true /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -6025,13 +6171,17 @@ packages: /bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + requiresBuild: true dependencies: file-uri-to-path: 1.0.0 dev: false + optional: true /bit-twiddle@1.0.2: resolution: {integrity: sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==} + requiresBuild: true dev: false + optional: true /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -6288,6 +6438,7 @@ packages: /cacache@16.1.3: resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + requiresBuild: true dependencies: '@npmcli/fs': 2.1.2 '@npmcli/move-file': 2.0.1 @@ -6310,6 +6461,7 @@ packages: transitivePeerDependencies: - bluebird dev: false + optional: true /cachedir@2.4.0: resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==} @@ -6578,6 +6730,11 @@ packages: engines: {node: '>=6'} dev: false + /clsx@2.1.0: + resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} + engines: {node: '>=6'} + dev: false + /color-convert@0.5.3: resolution: {integrity: sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==} dev: false @@ -7104,6 +7261,7 @@ packages: /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} + requiresBuild: true dev: false /deep-is@0.1.4: @@ -7553,7 +7711,9 @@ packages: /env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + requiresBuild: true dev: false + optional: true /envinfo@7.10.0: resolution: {integrity: sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==} @@ -7563,7 +7723,9 @@ packages: /err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + requiresBuild: true dev: false + optional: true /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -8349,11 +8511,14 @@ packages: /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} + requiresBuild: true dev: false /exponential-backoff@3.1.1: resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + requiresBuild: true dev: false + optional: true /express-ws@4.0.0(express@4.18.2): resolution: {integrity: sha512-KEyUw8AwRET2iFjFsI1EJQrJ/fHeGiJtgpYgEWG3yDv4l/To/m3a2GaYfeGyB3lsWdvbesjF5XCMx+SVBgAAYw==} @@ -8523,7 +8688,9 @@ packages: /file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + requiresBuild: true dev: false + optional: true /filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} @@ -8773,6 +8940,7 @@ packages: /gauge@4.0.4: resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + requiresBuild: true dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -8783,6 +8951,7 @@ packages: strip-ansi: 6.0.1 wide-align: 1.1.5 dev: false + optional: true /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} @@ -8888,6 +9057,7 @@ packages: /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + requiresBuild: true dev: false /github-slugger@1.5.0: @@ -8910,6 +9080,7 @@ packages: - bluebird - supports-color dev: false + optional: true /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -8964,6 +9135,7 @@ packages: /glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + requiresBuild: true dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -8971,6 +9143,7 @@ packages: minimatch: 5.1.6 once: 1.4.0 dev: false + optional: true /global-dirs@3.0.1: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} @@ -9016,9 +9189,11 @@ packages: /glsl-tokenizer@2.1.5: resolution: {integrity: sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==} + requiresBuild: true dependencies: through2: 0.6.5 dev: false + optional: true /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} @@ -9219,6 +9394,7 @@ packages: /http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} + requiresBuild: true dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 @@ -9226,6 +9402,7 @@ packages: transitivePeerDependencies: - supports-color dev: false + optional: true /http-proxy@1.18.1(debug@4.3.4): resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} @@ -9314,9 +9491,11 @@ packages: /humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + requiresBuild: true dependencies: ms: 2.1.3 dev: false + optional: true /hyphenate-style-name@1.0.4: resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} @@ -9392,7 +9571,9 @@ packages: /infer-owner@1.0.4: resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + requiresBuild: true dev: false + optional: true /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} @@ -9405,6 +9586,7 @@ packages: /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + requiresBuild: true dev: false /ini@2.0.0: @@ -9595,7 +9777,9 @@ packages: /is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + requiresBuild: true dev: false + optional: true /is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} @@ -9733,7 +9917,9 @@ packages: /isarray@0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + requiresBuild: true dev: false + optional: true /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -10349,7 +10535,9 @@ packages: /lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} + requiresBuild: true dev: false + optional: true /macaddress@0.5.3: resolution: {integrity: sha512-vGBKTA+jwM4KgjGZ+S/8/Mkj9rWzePyGY6jManXPGhiWu63RYwW8dKPyk5koP+8qNVhPhHgFa1y/MJ4wrjsNrg==} @@ -10398,6 +10586,7 @@ packages: /make-fetch-happen@10.2.1: resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + requiresBuild: true dependencies: agentkeepalive: 4.5.0 cacache: 16.1.3 @@ -10419,6 +10608,7 @@ packages: - bluebird - supports-color dev: false + optional: true /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -10599,8 +10789,8 @@ packages: resolution: {integrity: sha512-/eMxh3LNjCXOnU6KnQMjBM8dRnoJNpWIg7mD2m2RthraYiQK2FNzPWIKxWm2j3Ufcf5nzFXupgABledE86r4fQ==} dev: false - /minecraft-data@3.58.0: - resolution: {integrity: sha512-ncWZDrlDLJL+BnK8WJ3/pIaMYQhf9k47gPNqTUvc6xwFFjeAdU0rsPiofWIIkel1nKflnhOiqTReG4RcxRaY9Q==} + /minecraft-data@3.60.0: + resolution: {integrity: sha512-zTS2DsFZBvHsYCUaKL+E0mSbrgAAX5DJzYmlskh/6WnVV7lxftW7jDjR8SMgGoBBS1V0TZ79BWp3+aD3r8wKIg==} /minecraft-folder-path@1.2.0: resolution: {integrity: sha512-qaUSbKWoOsH9brn0JQuBhxNAzTDMwrOXorwuRxdJKKKDYvZhtml+6GVCUrY5HRiEsieBEjCUnhVpDuQiKsiFaw==} @@ -10636,7 +10826,7 @@ packages: /mineflayer-pathfinder@2.4.4: resolution: {integrity: sha512-HAXakZrJRb1UC+5dv8EaDrqjW3ZnBnBk3nkb6x/YWyhHCUKn/E7VU0FO+UN9whuqPlkSaVumEdXJdydE6lSYxQ==} dependencies: - minecraft-data: 3.58.0 + minecraft-data: 3.60.0 prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-entity: 2.3.1 prismarine-item: 1.14.0 @@ -10686,13 +10876,16 @@ packages: /minipass-collect@1.0.2: resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} engines: {node: '>= 8'} + requiresBuild: true dependencies: minipass: 3.3.6 dev: false + optional: true /minipass-fetch@2.1.2: resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + requiresBuild: true dependencies: minipass: 3.3.6 minipass-sized: 1.0.3 @@ -10700,27 +10893,34 @@ packages: optionalDependencies: encoding: 0.1.13 dev: false + optional: true /minipass-flush@1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} engines: {node: '>= 8'} + requiresBuild: true dependencies: minipass: 3.3.6 dev: false + optional: true /minipass-pipeline@1.2.4: resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} engines: {node: '>=8'} + requiresBuild: true dependencies: minipass: 3.3.6 dev: false + optional: true /minipass-sized@1.0.3: resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} engines: {node: '>=8'} + requiresBuild: true dependencies: minipass: 3.3.6 dev: false + optional: true /minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} @@ -10841,6 +11041,7 @@ packages: /napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + requiresBuild: true dev: false /natural-compare-lite@1.4.0: @@ -10898,6 +11099,7 @@ packages: /node-abi@3.47.0: resolution: {integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==} engines: {node: '>=10'} + requiresBuild: true dependencies: semver: 7.5.4 dev: false @@ -10908,6 +11110,7 @@ packages: /node-canvas-webgl@0.3.0: resolution: {integrity: sha512-wDRCTEE2TCqKDeSef5cNgtLv8kgjRlnFN3aYgB9yni0kHRNnKBSSP93lT8VIV5GuMWiy5KNXBU0ilyWL5wTvFg==} + requiresBuild: true dependencies: canvas: 2.11.2 gl: 6.0.2 @@ -10916,6 +11119,7 @@ packages: - encoding - supports-color dev: false + optional: true /node-dir@0.1.17: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} @@ -10950,6 +11154,7 @@ packages: resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} engines: {node: ^12.13 || ^14.13 || >=16} hasBin: true + requiresBuild: true dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.1 @@ -10966,6 +11171,7 @@ packages: - bluebird - supports-color dev: false + optional: true /node-gzip@1.1.2: resolution: {integrity: sha512-ZB6zWpfZHGtxZnPMrJSKHVPrRjURoUzaDbLFj3VO70mpLTW5np96vXyHwft4Id0o+PYIzgDkBUjIzaNHhQ8srw==} @@ -11015,9 +11221,11 @@ packages: resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} hasBin: true + requiresBuild: true dependencies: abbrev: 1.1.1 dev: false + optional: true /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -11077,12 +11285,14 @@ packages: /npmlog@6.0.2: resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + requiresBuild: true dependencies: are-we-there-yet: 3.0.1 console-control-strings: 1.1.0 gauge: 4.0.4 set-blocking: 2.0.0 dev: false + optional: true /nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -11683,13 +11893,13 @@ packages: - encoding - supports-color - /prismarine-biome@1.3.0(minecraft-data@3.58.0)(prismarine-registry@1.7.0): + /prismarine-biome@1.3.0(minecraft-data@3.60.0)(prismarine-registry@1.7.0): resolution: {integrity: sha512-GY6nZxq93mTErT7jD7jt8YS1aPrOakbJHh39seYsJFXvueIOdHAmW16kYQVrTVMW5MlWLQVxV/EquRwOgr4MnQ==} peerDependencies: - minecraft-data: 3.58.0 + minecraft-data: 3.60.0 prismarine-registry: ^1.1.0 dependencies: - minecraft-data: 3.58.0 + minecraft-data: 3.60.0 prismarine-registry: 1.7.0 /prismarine-chat@1.9.1: @@ -11697,14 +11907,14 @@ packages: dependencies: mojangson: 2.0.4 prismarine-item: 1.14.0 - prismarine-nbt: 2.2.1 + prismarine-nbt: 2.5.0 prismarine-registry: 1.7.0 - /prismarine-chunk@1.35.0(minecraft-data@3.58.0): + /prismarine-chunk@1.35.0(minecraft-data@3.60.0): resolution: {integrity: sha512-Q1lElMUle7wWxWdQjbZo3j2/dLNG325j90IcbbMmBTnHdQSWIjWFe792XOz3RVBlvrhRJEiZk38S6/eQTQ9esw==} engines: {node: '>=14'} dependencies: - prismarine-biome: 1.3.0(minecraft-data@3.58.0)(prismarine-registry@1.7.0) + prismarine-biome: 1.3.0(minecraft-data@3.60.0)(prismarine-registry@1.7.0) prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-nbt: 2.2.1 prismarine-registry: 1.7.0 @@ -11726,7 +11936,7 @@ packages: /prismarine-item@1.14.0: resolution: {integrity: sha512-udQHYGJ05klFe8Kkc0TOmwoXj5Xl1ZPgHVoMbGUAFB9exN4TFxEa1A39vkSYhxP5Et9PNufQQvFBFVom0nXikA==} dependencies: - prismarine-nbt: 2.2.1 + prismarine-nbt: 2.5.0 prismarine-registry: 1.7.0 /prismarine-nbt@2.2.1: @@ -11734,11 +11944,16 @@ packages: dependencies: protodef: 1.15.0 + /prismarine-nbt@2.5.0: + resolution: {integrity: sha512-F0/8UAa9SDDnAGrBYqZc4nG8h2zj5cE2eAJU5xlDR/IsQQ3moVxkOjE3h3nMv6SbvZrvAcgX7waA/nd9LLHYdA==} + dependencies: + protodef: 1.15.0 + /prismarine-physics@1.8.0: resolution: {integrity: sha512-gbM+S+bmVtOKVv+Z0WGaHMeEeBHISIDsRDRlv8sr0dex3ZJRhuq8djA02CBreguXtI18ZKh6q3TSj2qDr45NHA==} dependencies: - minecraft-data: 3.58.0 - prismarine-nbt: 2.2.1 + minecraft-data: 3.60.0 + prismarine-nbt: 2.5.0 vec3: 0.1.8 dev: true @@ -11762,13 +11977,13 @@ packages: /prismarine-registry@1.7.0: resolution: {integrity: sha512-yyva0FpWI078nNeMhx8ekVza5uUTYhEv+C+ADu3wUQXiG8qhXkvrf0uzsnhTgZL8BLdsi2axgCEiKw9qSKIuxQ==} dependencies: - minecraft-data: 3.58.0 - prismarine-nbt: 2.2.1 + minecraft-data: 3.60.0 + prismarine-nbt: 2.5.0 /prismarine-schematic@1.2.3: resolution: {integrity: sha512-Mwpn43vEHhm3aw3cPhJjWqztkW+nX+QLajDHlTask8lEOTGl1WmpvFja4iwiws4GIvaC8x0Foptf4uvDsnjrAg==} dependencies: - minecraft-data: 3.58.0 + minecraft-data: 3.60.0 prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-nbt: 2.2.1 prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 @@ -11796,12 +12011,14 @@ packages: /promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + requiresBuild: true peerDependencies: bluebird: '*' peerDependenciesMeta: bluebird: optional: true dev: false + optional: true /promise-queue@2.2.5: resolution: {integrity: sha512-p/iXrPSVfnqPft24ZdNNLECw/UrtLTpT3jpAAMzl/o5/rDsGCPo3/CQS2611flL6LkoEJ3oQZw7C8Q80ZISXRQ==} @@ -11811,10 +12028,12 @@ packages: /promise-retry@2.0.1: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} + requiresBuild: true dependencies: err-code: 2.0.3 retry: 0.12.0 dev: false + optional: true /promise@5.0.0: resolution: {integrity: sha512-N2BfLz0Sigf7rsm5NnItRwTNqEDUF2ephwEXTcOAf2cO9NwZ9TnIjOmnQNtC0r70CV0S1+uc9mSMmFH7gxk87Q==} @@ -12046,6 +12265,7 @@ packages: /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true + requiresBuild: true dependencies: deep-extend: 0.6.0 ini: 1.3.8 @@ -12133,7 +12353,6 @@ packages: /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true /react-popper@2.3.0(@popperjs/core@2.11.8)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==} @@ -12331,12 +12550,14 @@ packages: /readable-stream@1.0.34: resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + requiresBuild: true dependencies: core-util-is: 1.0.3 inherits: 2.0.4 isarray: 0.0.1 string_decoder: 0.10.31 dev: false + optional: true /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -12565,7 +12786,9 @@ packages: /retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} + requiresBuild: true dev: false + optional: true /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} @@ -13074,6 +13297,7 @@ packages: /socks-proxy-agent@7.0.0: resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} engines: {node: '>= 10'} + requiresBuild: true dependencies: agent-base: 6.0.2 debug: 4.3.4(supports-color@8.1.1) @@ -13081,14 +13305,17 @@ packages: transitivePeerDependencies: - supports-color dev: false + optional: true /socks@2.7.1: resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + requiresBuild: true dependencies: ip: 2.0.0 smart-buffer: 4.2.0 dev: false + optional: true /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} @@ -13174,9 +13401,11 @@ packages: /ssri@9.0.1: resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + requiresBuild: true dependencies: minipass: 3.3.6 dev: false + optional: true /stack-generator@2.0.10: resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} @@ -13313,7 +13542,9 @@ packages: /string_decoder@0.10.31: resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + requiresBuild: true dev: false + optional: true /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -13378,6 +13609,7 @@ packages: /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} + requiresBuild: true dev: false /strip-json-comments@3.1.1: @@ -13569,10 +13801,12 @@ packages: /through2@0.6.5: resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} + requiresBuild: true dependencies: readable-stream: 1.0.34 xtend: 4.0.2 dev: false + optional: true /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -13829,7 +14063,6 @@ packages: /typed-emitter@1.4.0: resolution: {integrity: sha512-weBmoo3HhpKGgLBOYwe8EB31CzDFuaK7CCL+axXhUYhn4jo6DSkHnbefboCF5i4DQ2aMFe0C/FdTWcPdObgHyg==} - dev: true /typed-emitter@2.1.0: resolution: {integrity: sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==} @@ -13871,6 +14104,7 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + requiresBuild: true /undici@5.25.4: resolution: {integrity: sha512-450yJxT29qKMf3aoudzFpIciqpx6Pji3hEWaXqXmanbXF58LTAGCKxcJjxMXWu3iG+Mudgo3ZUfDB6YDFd/dAw==} @@ -13914,16 +14148,20 @@ packages: /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} + requiresBuild: true dependencies: unique-slug: 3.0.0 dev: false + optional: true /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} + requiresBuild: true dependencies: imurmurhash: 0.1.4 dev: false + optional: true /unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} @@ -14887,18 +15125,18 @@ packages: react: 18.2.0 dev: false - github.com/PrismarineJS/mineflayer/5c71edf48bb2f2dfa16cddb9af5baa0c4d55cf0d: - resolution: {tarball: https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/5c71edf48bb2f2dfa16cddb9af5baa0c4d55cf0d} + github.com/PrismarineJS/mineflayer/cc98f1307e3ab48477d2a9ff29da4447f42b30bc: + resolution: {tarball: https://codeload.github.com/PrismarineJS/mineflayer/tar.gz/cc98f1307e3ab48477d2a9ff29da4447f42b30bc} name: mineflayer - version: 4.17.0 + version: 4.18.0 engines: {node: '>=18'} dependencies: - minecraft-data: 3.58.0 - minecraft-protocol: github.com/zardoy/minecraft-protocol/436e0f2945d82408cfd1eb4262535c205bcba8d0 - prismarine-biome: 1.3.0(minecraft-data@3.58.0)(prismarine-registry@1.7.0) + minecraft-data: 3.60.0 + minecraft-protocol: github.com/zardoy/minecraft-protocol/2c14a686bfe7cbd9a5c87b629b402295ee86219f + prismarine-biome: 1.3.0(minecraft-data@3.60.0)(prismarine-registry@1.7.0) prismarine-block: github.com/zardoy/prismarine-block/ada4ec3fdfbbc1cc20ab01d0e23f0718a77cc1a0 prismarine-chat: 1.9.1 - prismarine-chunk: 1.35.0(minecraft-data@3.58.0) + prismarine-chunk: 1.35.0(minecraft-data@3.60.0) prismarine-entity: 2.3.1 prismarine-item: 1.14.0 prismarine-nbt: 2.2.1 @@ -14930,13 +15168,13 @@ packages: async: 2.6.4 dev: false - github.com/zardoy/diamond-square/94d1cf761fc2de8c3a24a75e4bec434ec4365f73: - resolution: {tarball: https://codeload.github.com/zardoy/diamond-square/tar.gz/94d1cf761fc2de8c3a24a75e4bec434ec4365f73} + github.com/zardoy/diamond-square/789d7090748ddcae22bb89908db15ba448bdfbb0: + resolution: {tarball: https://codeload.github.com/zardoy/diamond-square/tar.gz/789d7090748ddcae22bb89908db15ba448bdfbb0} name: diamond-square version: 1.3.0 dependencies: - minecraft-data: 3.58.0 - prismarine-chunk: 1.35.0(minecraft-data@3.58.0) + minecraft-data: 3.60.0 + prismarine-chunk: 1.35.0(minecraft-data@3.60.0) random-seed: 0.3.0 vec3: 0.1.8 dev: false @@ -14953,10 +15191,10 @@ packages: - react dev: true - github.com/zardoy/minecraft-protocol/436e0f2945d82408cfd1eb4262535c205bcba8d0: - resolution: {tarball: https://codeload.github.com/zardoy/minecraft-protocol/tar.gz/436e0f2945d82408cfd1eb4262535c205bcba8d0} + github.com/zardoy/minecraft-protocol/2c14a686bfe7cbd9a5c87b629b402295ee86219f: + resolution: {tarball: https://codeload.github.com/zardoy/minecraft-protocol/tar.gz/2c14a686bfe7cbd9a5c87b629b402295ee86219f} name: minecraft-protocol - version: 1.44.0 + version: 1.45.0 engines: {node: '>=14'} dependencies: '@types/readable-stream': 4.0.4 @@ -14966,12 +15204,12 @@ packages: endian-toggle: 0.0.0 lodash.get: 4.4.2 lodash.merge: 4.6.2 - minecraft-data: 3.58.0 + minecraft-data: 3.60.0 minecraft-folder-path: 1.2.0 node-fetch: 2.7.0 node-rsa: 0.4.2 prismarine-auth: 2.3.0 - prismarine-nbt: 2.2.1 + prismarine-nbt: 2.5.0 prismarine-realms: 1.3.2 protodef: 1.15.0 readable-stream: 4.4.2 @@ -14986,21 +15224,21 @@ packages: name: prismarine-block version: 1.17.1 dependencies: - minecraft-data: 3.58.0 - prismarine-biome: 1.3.0(minecraft-data@3.58.0)(prismarine-registry@1.7.0) + minecraft-data: 3.60.0 + prismarine-biome: 1.3.0(minecraft-data@3.60.0)(prismarine-registry@1.7.0) prismarine-chat: 1.9.1 prismarine-item: 1.14.0 prismarine-nbt: 2.2.1 prismarine-registry: 1.7.0 - github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.58.0): + github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.60.0): resolution: {tarball: https://codeload.github.com/zardoy/prismarine-provider-anvil/tar.gz/0ddcd9d48574113308e1fbebef60816aced0846f} id: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f name: prismarine-provider-anvil version: 2.7.0 dependencies: - prismarine-chunk: 1.35.0(minecraft-data@3.58.0) - prismarine-nbt: 2.2.1 + prismarine-chunk: 1.35.0(minecraft-data@3.60.0) + prismarine-nbt: 2.5.0 uint4: 0.1.2 vec3: 0.1.8 transitivePeerDependencies: @@ -15028,44 +15266,3 @@ packages: - supports-color - utf-8-validate dev: false - - github.com/zardoy/space-squid/70ac2e0d0520115589180a42b3df87126d41f784: - resolution: {tarball: https://codeload.github.com/zardoy/space-squid/tar.gz/70ac2e0d0520115589180a42b3df87126d41f784} - name: flying-squid - version: 0.0.0-dev - engines: {node: '>=8'} - hasBin: true - requiresBuild: true - dependencies: - change-case: 4.1.2 - colors: 1.4.0 - diamond-square: github.com/zardoy/diamond-square/94d1cf761fc2de8c3a24a75e4bec434ec4365f73 - emit-then: 2.0.0 - event-promise: 0.0.1 - exit-hook: 2.2.1 - flatmap: 0.0.3 - long: 5.2.3 - minecraft-data: 3.58.0 - minecraft-protocol: github.com/zardoy/minecraft-protocol/436e0f2945d82408cfd1eb4262535c205bcba8d0 - mkdirp: 2.1.6 - moment: 2.29.4 - needle: 2.9.1 - node-gzip: 1.1.2 - node-rsa: 1.1.1 - prismarine-chunk: 1.35.0(minecraft-data@3.58.0) - prismarine-entity: 2.3.1 - prismarine-item: 1.14.0 - prismarine-nbt: 2.2.1 - prismarine-provider-anvil: github.com/zardoy/prismarine-provider-anvil/0ddcd9d48574113308e1fbebef60816aced0846f(minecraft-data@3.58.0) - prismarine-windows: 2.8.0 - prismarine-world: github.com/zardoy/prismarine-world/c358222204d21fe7d45379fbfcefb047f926c786 - random-seed: 0.3.0 - range: 0.0.3 - readline: 1.3.0 - uuid-1345: 1.0.2 - vec3: 0.1.8 - yargs: 17.7.2 - transitivePeerDependencies: - - encoding - - supports-color - dev: false diff --git a/prismarine-viewer/package.json b/prismarine-viewer/package.json index 91f228894..529aa9ae4 100644 --- a/prismarine-viewer/package.json +++ b/prismarine-viewer/package.json @@ -28,7 +28,6 @@ "looks-same": "^8.2.3", "minecraft-wrap": "^1.3.0", "minecrafthawkeye": "^1.3.6", - "node-canvas-webgl": "^0.3.0", "prismarine-block": "^1.7.3", "prismarine-chunk": "^1.22.0", "prismarine-schematic": "^1.2.0", @@ -40,5 +39,8 @@ "three.meshline": "^1.3.0", "tsx": "^4.7.0", "vec3": "^0.1.7" + }, + "optionalDependencies": { + "node-canvas-webgl": "^0.3.0" } } diff --git a/prismarine-viewer/viewer/lib/entities.js b/prismarine-viewer/viewer/lib/entities.js index 87df3299f..a3c797b8d 100644 --- a/prismarine-viewer/viewer/lib/entities.js +++ b/prismarine-viewer/viewer/lib/entities.js @@ -80,6 +80,7 @@ export class Entities extends EventEmitter { this.debugMode = 'none' this.onSkinUpdate = () => { } this.clock = new THREE.Clock() + this.visible = true } clear () { @@ -102,6 +103,13 @@ export class Entities extends EventEmitter { } } + setVisible(visible, /** @type {THREE.Object3D?} */entity = null) { + this.visible = visible + for (const mesh of entity ? [entity] : Object.values(this.entities)) { + mesh.visible = visible + } + } + render () { const dt = this.clock.getDelta() for (const entityId of Object.keys(this.entities)) { @@ -284,6 +292,7 @@ export class Entities extends EventEmitter { this.updatePlayerSkin(entity.id, '', stevePng) } this.setDebugMode(this.debugMode, group) + this.setVisible(this.visible, group) } // this can be undefined in case where packet entity_destroy was sent twice (so it was already deleted) diff --git a/prismarine-viewer/viewer/lib/world.ts b/prismarine-viewer/viewer/lib/world.ts index b55df847c..a4ffd69c6 100644 --- a/prismarine-viewer/viewer/lib/world.ts +++ b/prismarine-viewer/viewer/lib/world.ts @@ -85,7 +85,7 @@ export class World { const block = this.blockCache[stateId] block.position = loc - block.biome = this.biomeCache[column.getBiome(locInChunk)] + block.biome = this.biomeCache[column.getBiome(locInChunk)] ?? this.biomeCache[1] ?? this.biomeCache[0] if (block.name === 'redstone_ore') block.transparent = false return block } diff --git a/prismarine-viewer/viewer/lib/worldDataEmitter.ts b/prismarine-viewer/viewer/lib/worldDataEmitter.ts index daa712301..674816253 100644 --- a/prismarine-viewer/viewer/lib/worldDataEmitter.ts +++ b/prismarine-viewer/viewer/lib/worldDataEmitter.ts @@ -1,7 +1,7 @@ import { chunkPos } from './simpleUtils' // todo refactor into its own commons module -import { generateSpiralMatrix, ViewRect } from 'flying-squid/src/utils' +import { generateSpiralMatrix, ViewRect } from 'flying-squid/dist/utils' import { Vec3 } from 'vec3' import { EventEmitter } from 'events' import { BotEvents } from 'mineflayer' diff --git a/prismarine-viewer/viewer/lib/worldrenderer.ts b/prismarine-viewer/viewer/lib/worldrenderer.ts index d0aedd5d4..afa668c2c 100644 --- a/prismarine-viewer/viewer/lib/worldrenderer.ts +++ b/prismarine-viewer/viewer/lib/worldrenderer.ts @@ -24,6 +24,7 @@ export class WorldRenderer { showChunkBorders = false active = false version = undefined as string | undefined + chunkTextures = new Map() loadedChunks = {} sectionsOutstanding = new Set() renderUpdateEmitter = new EventEmitter() @@ -106,7 +107,9 @@ export class WorldRenderer { const [x, y, z] = posKey.split(',') const signBlockEntity = this.blockEntities[posKey] if (!signBlockEntity) continue - object.add(this.renderSign(new Vec3(+x, +y, +z), rotation, isWall, nbt.simplify(signBlockEntity))) + const sign = this.renderSign(new Vec3(+x, +y, +z), rotation, isWall, nbt.simplify(signBlockEntity)); + if (!sign) continue + object.add(sign) } } this.sectionObjects[data.key] = object @@ -142,13 +145,43 @@ export class WorldRenderer { } } - renderSign (position: Vec3, rotation: number, isWall: boolean, blockEntity) { + signsCache = new Map() + + getSignTexture (position: Vec3, blockEntity, 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, 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 + } + + renderSign (position: Vec3, rotation: number, isWall: boolean, blockEntity) { + const tex = this.getSignTexture(position, blockEntity) + + 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 @@ -266,7 +299,17 @@ export class WorldRenderer { } } + 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] + } + } + removeColumn (x, z) { + this.cleanChunkTextures(x, z) + delete this.loadedChunks[`${x},${z}`] for (const worker of this.workers) { worker.postMessage({ type: 'unloadChunk', x, z }) @@ -297,6 +340,7 @@ export class WorldRenderer { } setSectionDirty (pos, value = true) { + this.cleanChunkTextures(pos.x, pos.z) // todo don't do this! // Dispatch sections to workers based on position // This guarantees uniformity accross workers and that a given section // is always dispatched to the same worker diff --git a/prismarine-viewer/viewer/sign-renderer/index.ts b/prismarine-viewer/viewer/sign-renderer/index.ts index b4200c5de..8c0f488c2 100644 --- a/prismarine-viewer/viewer/sign-renderer/index.ts +++ b/prismarine-viewer/viewer/sign-renderer/index.ts @@ -33,20 +33,28 @@ const parseSafe = (text: string, task: string) => { } export const renderSign = (blockEntity: SignBlockEntity, PrismarineChat: typeof ChatMessage, ctxHook = (ctx) => { }) => { - const canvas = document.createElement('canvas') - - const factor = 50 + // todo don't use texture rendering, investigate the font rendering when possible + // or increase factor when needed + const factor = 40 const signboardY = [16, 9] const heightOffset = signboardY[0] - signboardY[1] const heightScalar = heightOffset / 16 - canvas.width = 16 * factor - canvas.height = heightOffset * factor + let canvas: HTMLCanvasElement | undefined + let _ctx: CanvasRenderingContext2D | null = null + const getCtx = () => { + if (_ctx) return _ctx + canvas = document.createElement('canvas') + + canvas.width = 16 * factor + canvas.height = heightOffset * factor - const ctx = canvas.getContext('2d')! - ctx.imageSmoothingEnabled = false + _ctx = canvas.getContext('2d')! + _ctx.imageSmoothingEnabled = false - ctxHook(ctx) + ctxHook(_ctx) + return _ctx + } const texts = 'front_text' in blockEntity ? /* > 1.20 */ blockEntity.front_text.messages : [ blockEntity.Text1, @@ -104,8 +112,13 @@ export const renderSign = (blockEntity: SignBlockEntity, PrismarineChat: typeof if (stop) return false } } + renderText(rendered) + // skip rendering empty lines (and possible signs) + if (!plainText.trim()) continue + + const ctx = getCtx() const fontSize = 1.6 * factor; ctx.font = `${fontSize}px mojangles` const textWidth = ctx.measureText(plainText).width @@ -115,7 +128,7 @@ export const renderSign = (blockEntity: SignBlockEntity, PrismarineChat: typeof // todo strikeStyle, underlineStyle ctx.fillStyle = fillStyle ctx.font = `${fontStyle} ${fontSize}px mojangles` - ctx.fillText(text, (canvas.width - textWidth) / 2 + renderedWidth, fontSize * (lineNum + 1)) + ctx.fillText(text, (canvas!.width - textWidth) / 2 + renderedWidth, fontSize * (lineNum + 1)) renderedWidth += ctx.measureText(text).width // todo isn't the font is monospace? } } diff --git a/prismarine-viewer/viewer/sign-renderer/playground.ts b/prismarine-viewer/viewer/sign-renderer/playground.ts index f8c239b25..4182b1c99 100644 --- a/prismarine-viewer/viewer/sign-renderer/playground.ts +++ b/prismarine-viewer/viewer/sign-renderer/playground.ts @@ -19,8 +19,15 @@ const blockEntity = { "Text1": "{\"extra\":[{\"color\":\"dark_green\",\"text\":\"Minecraft \"},{\"text\":\"Tools\"}],\"text\":\"\"}" } as const +await document.fonts.load('1em mojangles') + const canvas = renderSign(blockEntity, PrismarineChat, (ctx) => { ctx.drawImage(img, 0, 0, ctx.canvas.width, ctx.canvas.height) }) -document.body.appendChild(canvas) +if (canvas) { + canvas.style.imageRendering = 'pixelated' + document.body.appendChild(canvas) +} else { + console.log('Render skipped') +} diff --git a/prismarine-viewer/viewer/sign-renderer/tests.test.ts b/prismarine-viewer/viewer/sign-renderer/tests.test.ts index 03eb43943..4549c6f49 100644 --- a/prismarine-viewer/viewer/sign-renderer/tests.test.ts +++ b/prismarine-viewer/viewer/sign-renderer/tests.test.ts @@ -23,7 +23,7 @@ global.document = { const render = (entity) => { ctxTexts = [] renderSign(entity, PrismarineChat) - return ctxTexts.map(({ text, y }) => [y / 80, text]) + return ctxTexts.map(({ text, y }) => [y / 64, text]) } test('sign renderer', () => { @@ -49,18 +49,6 @@ test('sign renderer', () => { 1, "Tools", ], - [ - 2, - "", - ], - [ - 3, - "", - ], - [ - 4, - "", - ], ] `) diff --git a/prismarine-viewer/viewer/supportedVersions.json b/prismarine-viewer/viewer/supportedVersions.json index f6a1aa2c8..d4fcd3d8e 100644 --- a/prismarine-viewer/viewer/supportedVersions.json +++ b/prismarine-viewer/viewer/supportedVersions.json @@ -1 +1 @@ -["1.8.8", "1.9.4", "1.10.2", "1.11.2", "1.12.2", "1.13.2", "1.14.4", "1.15.2", "1.16.1", "1.16.4", "1.17.1", "1.18.1"] \ No newline at end of file +["1.8.8", "1.9.4", "1.10.2", "1.11.2", "1.12.2", "1.13.2", "1.14.4", "1.15.2", "1.16.1", "1.16.4", "1.17.1", "1.18.1", "1.18.2"] \ No newline at end of file diff --git a/scripts/esbuildPlugins.mjs b/scripts/esbuildPlugins.mjs index f112cf2d9..07938c6ec 100644 --- a/scripts/esbuildPlugins.mjs +++ b/scripts/esbuildPlugins.mjs @@ -4,6 +4,10 @@ import { polyfillNode } from 'esbuild-plugin-polyfill-node' import { join, dirname, basename } from 'path' import * as fs from 'fs' import { filesize } from 'filesize' +import MCProtocol from 'minecraft-protocol' +import MCData from 'minecraft-data' + +const { supportedVersions } = MCProtocol const prod = process.argv.includes('--prod') let connectedClients = [] @@ -23,15 +27,14 @@ const plugins = [ build.onLoad({ filter: /minecraft-data[\/\\]data.js$/, }, (args) => { + const version = supportedVersions.at(-1); + const data = MCData(version) const defaultVersionsObj = { // default protocol data, needed for auto-version - "1.20.1": { - version: { - "minecraftVersion": "1.20.1", - "version": 763, - "majorVersion": "1.20" - }, - protocol: JSON.parse(fs.readFileSync(join(args.path, '..', 'minecraft-data/data/pc/1.20/protocol.json'), 'utf8')), + [version]: { + version: data.version, + // protocol: JSON.parse(fs.readFileSync(join(args.path, '..', 'minecraft-data/data/pc/1.20/protocol.json'), 'utf8')), + protocol: data.protocol, } } return { diff --git a/scripts/optimizeBlockCollisions.ts b/scripts/optimizeBlockCollisions.ts index 5ac2fc718..8a87b3582 100644 --- a/scripts/optimizeBlockCollisions.ts +++ b/scripts/optimizeBlockCollisions.ts @@ -47,6 +47,7 @@ for (const version of [...supportedVersions].reverse()) { if (fs.existsSync(dataPath)) { console.log('using blockCollisionShapes of version', version) const data = JSON.parse(fs.readFileSync(dataPath, 'utf8')) + data.version = version processData(data) fs.writeFileSync('./generated/latestBlockCollisionsShapes.json', JSON.stringify(data), 'utf8') break diff --git a/server.js b/server.js index f8caf3a6a..da40e163e 100644 --- a/server.js +++ b/server.js @@ -60,7 +60,7 @@ const server = isProd ? } if (netInterface) { const address = netInterface.ip4 - console.log(`You can access the server on http://localhost:8080 or http://${address}:${port}`) + console.log(`You can access the server on http://localhost:${port} or http://${address}:${port}`) } } }) diff --git a/src/controls.ts b/src/controls.ts index 8298d5f85..4ddc349d3 100644 --- a/src/controls.ts +++ b/src/controls.ts @@ -12,6 +12,8 @@ import { options } from './optionsStorage' import { openPlayerInventory } from './playerWindows' import { chatInputValueGlobal } from './react/ChatContainer' import { fsState } from './loadSave' +import { showOptionsModal } from './react/SelectOption' +import widgets from './react/widgets' // doesnt seem to work for now const customKeymaps = proxy(JSON.parse(localStorage.keymap || '{}')) @@ -290,6 +292,17 @@ export const f3Keybinds = [ viewer.world.updateShowChunksBorder(options.showChunkBorders) }, mobileTitle: 'Toggle chunk borders', + }, + { + key: 'KeyT', + 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' } ] diff --git a/src/createLocalServer.ts b/src/createLocalServer.ts index 865caa5fb..6c5b2fa97 100644 --- a/src/createLocalServer.ts +++ b/src/createLocalServer.ts @@ -1,12 +1,14 @@ import { LocalServer } from './customServer' -const { createMCServer } = require('flying-squid/src') +const { createMCServer } = require('flying-squid/dist') export const startLocalServer = (serverOptions) => { const passOptions = { ...serverOptions, Server: LocalServer } const server: NonNullable = createMCServer(passOptions) + //@ts-expect-error browser patch server.formatMessage = (message) => `[server] ${message}` server.options = passOptions + //@ts-expect-error todo remove server.looseProtocolMode = true return server } diff --git a/src/flyingSquidUtils.ts b/src/flyingSquidUtils.ts index 00f169c8e..1aef8d07e 100644 --- a/src/flyingSquidUtils.ts +++ b/src/flyingSquidUtils.ts @@ -18,12 +18,14 @@ export function nameToMcOfflineUUID (name) { } export async function savePlayers () { + //@ts-expect-error TODO await localServer!.savePlayersSingleplayer() } // todo flying squid should expose save function instead export const saveServer = async () => { if (!localServer || fsState.isReadonly) return - const worlds = [localServer.overworld] as Array + // todo + const worlds = [(localServer as any).overworld] as Array await Promise.all([savePlayers(), ...worlds.map(async world => world.saveNow())]) } diff --git a/src/getCollisionShapes.ts b/src/getCollisionShapes.ts index 03f3969c8..0faf5b6a4 100644 --- a/src/getCollisionShapes.ts +++ b/src/getCollisionShapes.ts @@ -1,11 +1,12 @@ -import { adoptBlockOrItemNamesFromLatest } from 'flying-squid/src/blockRenames' +import { adoptBlockOrItemNamesFromLatest } from 'flying-squid/dist/blockRenames' import collisionShapesInit from '../generated/latestBlockCollisionsShapes.json' import outputInteractionShapesJson from './interactionShapesGenerated.json' // defining globally to be used in loaded data, not sure of better workaround window.globalGetCollisionShapes = (version) => { // todo use the same in resourcepack - const renamedBlocks = adoptBlockOrItemNamesFromLatest('blocks', version, Object.keys(collisionShapesInit.blocks)) + const versionFrom = collisionShapesInit.version + const renamedBlocks = adoptBlockOrItemNamesFromLatest('blocks', Object.keys(collisionShapesInit.blocks), versionFrom, version) const collisionShapes = { ...collisionShapesInit, blocks: Object.fromEntries(Object.entries(collisionShapesInit.blocks).map(([, shape], i) => [renamedBlocks[i], shape])) @@ -16,11 +17,12 @@ window.globalGetCollisionShapes = (version) => { export default () => { customEvents.on('gameLoaded', () => { // todo also remap block states (e.g. redstone)! - const renamedBlocksInteraction = adoptBlockOrItemNamesFromLatest('blocks', bot.version, Object.keys(outputInteractionShapesJson)) + const renamedBlocksInteraction = adoptBlockOrItemNamesFromLatest('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/globals.d.ts b/src/globals.d.ts index 7c82db6c0..2f6acb5a7 100644 --- a/src/globals.d.ts +++ b/src/globals.d.ts @@ -6,7 +6,7 @@ declare const bot: Omit & { world: import('pr declare const __type_bot: typeof bot declare const viewer: import('prismarine-viewer/viewer/lib/viewer').Viewer declare const worldView: import('prismarine-viewer/viewer/lib/worldDataEmitter').WorldDataEmitter | undefined -declare const localServer: import('flying-squid/dist/types').FullServer & { options } | undefined +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 diff --git a/src/index.ts b/src/index.ts index ea5591beb..a5c6e2c08 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,6 +7,7 @@ import './devtools' import './entities' import initCollisionShapes from './getCollisionShapes' import { onGameLoad } from './playerWindows' +import { supportedVersions } from 'minecraft-protocol' import './menus/components/button' import './menus/components/edit_box' @@ -364,6 +365,16 @@ async function connect (connectOptions: { const serverOptions = _.defaultsDeep({}, connectOptions.serverOverrides ?? {}, options.localServerOptions, defaultServerOptions) Object.assign(serverOptions, connectOptions.serverOverridesFlat ?? {}) const downloadMcData = async (version: string) => { + // todo expose cache + const lastVersion = supportedVersions.at(-1) + if (version === lastVersion) { + // ignore cache hit + versionsByMinecraftVersion.pc[lastVersion]!['dataVersion']!++ + } + if (!document.fonts.check('1em mojangles')) { + // todo instead re-render signs on load + await document.fonts.load('1em mojangles').catch(() => { }) + } setLoadingScreenStatus(`Downloading data for ${version}`) await downloadSoundsIfNeeded() await loadScript(`./mc-data/${toMajorVersion(version)}.js`) @@ -449,11 +460,6 @@ async function connect (connectOptions: { respawn: options.autoRespawn, maxCatchupTicks: 0, async versionSelectedHook (client) { - // todo keep in sync with esbuild preload, expose cache ideally - if (client.version === '1.20.1') { - // ignore cache hit - versionsByMinecraftVersion.pc['1.20.1']!['dataVersion']!++ - } await downloadMcData(client.version) setLoadingScreenStatus(initialLoadingText) } @@ -518,7 +524,7 @@ async function connect (connectOptions: { destroyAll() }) - let lastPacket + let lastPacket = undefined as string | undefined const packetBeforePlay = (_, __, ___, fullBuffer) => { lastPacket = fullBuffer.toString() } @@ -553,8 +559,10 @@ async function connect (connectOptions: { setLoadingScreenStatus('Loading world') }) + const spawnEarlier = !singleplayer && !p2pMultiplayer // don't use spawn event, player can be dead - bot.once('health', () => { + bot.once(spawnEarlier ? 'forcedMove' : 'health', () => { + errorAbortController.abort() const mcData = MinecraftData(bot.version) window.PrismarineBlock = PrismarineBlock(mcData.version.minecraftVersion!) window.loadedData = mcData @@ -725,7 +733,6 @@ async function connect (connectOptions: { hud.style.display = 'block' }) - errorAbortController.abort() if (appStatusState.isError) return setLoadingScreenStatus(undefined) void viewer.waitForChunksToRender().then(() => { @@ -789,6 +796,13 @@ document.body.addEventListener('touchstart', (e) => { }, { passive: false }) // #endregion +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 {} +}).then((config) => { + miscUiState.appConfig = config +}) + downloadAndOpenFile().then((downloadAction) => { if (downloadAction) return @@ -814,3 +828,10 @@ downloadAndOpenFile().then((downloadAction) => { console.error(err) alert(`Failed to download file: ${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' + window.pageLoaded = true +} diff --git a/src/interactionShapesGenerated.json b/src/interactionShapesGenerated.json index 701c0f5eb..425cfb0d7 100644 --- a/src/interactionShapesGenerated.json +++ b/src/interactionShapesGenerated.json @@ -4196,7 +4196,7 @@ 16 ] }, - "light": "LightBlock", + "light": [], "sunflower": [ 0, 0, diff --git a/src/loadSave.ts b/src/loadSave.ts index 874b9fd0e..cb04fbd16 100644 --- a/src/loadSave.ts +++ b/src/loadSave.ts @@ -1,5 +1,5 @@ import fs from 'fs' -import { supportedVersions } from 'flying-squid/src/lib/version' +import { supportedVersions } from 'flying-squid/dist/lib/version' import * as nbt from 'prismarine-nbt' import { proxy } from 'valtio' import { gzip } from 'node-gzip' diff --git a/src/menus/play_screen.js b/src/menus/play_screen.js index 838a55fa0..e9517d9e4 100644 --- a/src/menus/play_screen.js +++ b/src/menus/play_screen.js @@ -1,8 +1,8 @@ //@ts-check const { LitElement, html, css } = require('lit') const viewerSupportedVersions = require('prismarine-viewer/viewer/supportedVersions.json') +const { supportedVersions } = require('minecraft-protocol') const { hideCurrentModal, miscUiState } = require('../globalState') -const { default: supportedVersions } = require('../supportedVersions.mjs') const { commonCss } = require('./components/common') const fullySupporedVersions = viewerSupportedVersions diff --git a/src/optionsStorage.ts b/src/optionsStorage.ts index 27d9c50a7..f579bc496 100644 --- a/src/optionsStorage.ts +++ b/src/optionsStorage.ts @@ -53,6 +53,7 @@ const defaultOptions = { askGuestName: true, /** Actually might be useful */ showCursorBlockInSpectator: false, + renderEntities: true, // advanced bot options autoRespawn: false, diff --git a/src/react/CreateWorld.tsx b/src/react/CreateWorld.tsx index 55b4ab719..4fbc3c914 100644 --- a/src/react/CreateWorld.tsx +++ b/src/react/CreateWorld.tsx @@ -7,7 +7,7 @@ import Button from './Button' import styles from './createWorld.module.css' // const worldTypes = ['default', 'flat', 'largeBiomes', 'amplified', 'customized', 'buffet', 'debug_all_block_states'] -const worldTypes = ['plains', 'flat'/* , 'void' */] +const worldTypes = ['default', 'flat'/* , 'void' */] export const creatingWorldState = proxy({ title: '', diff --git a/src/react/CreateWorldProvider.tsx b/src/react/CreateWorldProvider.tsx index 38a2877f0..2bf0b3213 100644 --- a/src/react/CreateWorldProvider.tsx +++ b/src/react/CreateWorldProvider.tsx @@ -1,4 +1,4 @@ -import { supportedVersions } from 'flying-squid/src/lib/version' +import { supportedVersions } from 'flying-squid/dist/lib/version' import { hideCurrentModal, showModal } from '../globalState' import defaultLocalServerOptions from '../defaultLocalServerOptions' import { mkdirRecursive, uniqueFileNameFromWorldName } from '../browserfs' diff --git a/src/react/FullScreenWidget.tsx b/src/react/FullScreenWidget.tsx new file mode 100644 index 000000000..ecec1813a --- /dev/null +++ b/src/react/FullScreenWidget.tsx @@ -0,0 +1,10 @@ +import Screen from './Screen' +import { useIsWidgetActive } from './utils' + +export default ({ name, title, children }) => { + const isWidgetActive = useIsWidgetActive(name) + + if (!isWidgetActive) return null + + return {children} +} diff --git a/src/react/ModuleSignsViewer.tsx b/src/react/ModuleSignsViewer.tsx new file mode 100644 index 000000000..ea9be503d --- /dev/null +++ b/src/react/ModuleSignsViewer.tsx @@ -0,0 +1,45 @@ +import { useEffect, useRef } from 'react' +import FullScreenWidget from './FullScreenWidget' + +export const name = 'signs' + +export default () => { + const signs = [...viewer.world.chunkTextures.values()].flatMap(textures => { + return Object.entries(textures).map(([signPosKey, texture]) => { + const pos = signPosKey.split(',').map(Number) + return
+
{pos.join(', ')}
+
+ +
+
+ }) + }) + + return +
+ {signs.length} signs currently loaded: +
+ {signs} +
+} + +const AddElem = ({ elem }) => { + const ref = useRef(null) + useEffect(() => { + elem.style.width = '100%' + ref.current!.appendChild(elem) + return () => { + elem.remove() + } + }, []) + + return
+} + +// for (const key of Object.keys(viewer.world.sectionObjects)) { +// const section = viewer.world.sectionObjects[key] +// for (const child of section.children) { +// if (child.name === 'mesh') child.visible = false +// } +// } diff --git a/src/react/appStatus.module.css b/src/react/appStatus.module.css index 13f7a6dfa..b993f7790 100644 --- a/src/react/appStatus.module.css +++ b/src/react/appStatus.module.css @@ -1,5 +1,7 @@ .potential-problem { color: #808080; + word-break: break-all; + padding: 0 10px; } .last-status { diff --git a/src/react/utils.ts b/src/react/utils.ts index 6a7efa530..341c43e6a 100644 --- a/src/react/utils.ts +++ b/src/react/utils.ts @@ -6,6 +6,10 @@ export const useIsModalActive = (modal: string) => { return useSnapshot(activeModalStack).at(-1)?.reactType === modal } +export const useIsWidgetActive = (name: string) => { + return useIsModalActive(`widget-${name}`) +} + export function useDidUpdateEffect (fn, inputs) { const isMountingRef = useRef(false) diff --git a/src/react/widgets.ts b/src/react/widgets.ts new file mode 100644 index 000000000..c5d9599b9 --- /dev/null +++ b/src/react/widgets.ts @@ -0,0 +1,3 @@ +import * as ModuleSignsViewer from './ModuleSignsViewer' + +export default [ModuleSignsViewer] diff --git a/src/reactUi.tsx b/src/reactUi.tsx index ce537cfea..1566c2bcf 100644 --- a/src/reactUi.tsx +++ b/src/reactUi.tsx @@ -16,6 +16,8 @@ import EnterFullscreenButton from './react/EnterFullscreenButton' import ChatProvider from './react/ChatProvider' import SoundMuffler from './react/SoundMuffler' import TouchControls from './react/TouchControls' +import widgets from './react/widgets' +import { useIsWidgetActive } from './react/utils' const Portal = ({ children, to }) => { return createPortal(children, to) @@ -65,11 +67,23 @@ const InGameUi = () => { } +const AllWidgets = () => { + return widgets.map(widget => ) +} + +const WidgetDisplay = ({ name, Component }) => { + const isWidgetActive = useIsWidgetActive(name) + if (!isWidgetActive) return null + + return +} + const App = () => { return
+ diff --git a/src/soundSystem.ts b/src/soundSystem.ts index 8916ca26a..520cd8372 100644 --- a/src/soundSystem.ts +++ b/src/soundSystem.ts @@ -140,6 +140,7 @@ subscribeKey(miscUiState, 'gameLoaded', async () => { let lastStepSound = 0 const movementHappening = async () => { + if (!bot.player) return // no info yet const VELOCITY_THRESHOLD = 0.1 const { x, z, y } = bot.player.entity.velocity if (bot.entity.onGround && Math.abs(x) < VELOCITY_THRESHOLD && (Math.abs(z) > VELOCITY_THRESHOLD || Math.abs(y) > VELOCITY_THRESHOLD)) { diff --git a/src/utils.ts b/src/utils.ts index fb8bf4ad0..4f3a18bdc 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -151,6 +151,7 @@ export const setLoadingScreenStatus = function (status: string | undefined | nul export const disconnect = async () => { if (localServer) { await saveServer() + //@ts-expect-error todo expose! void localServer.quit() // todo investigate we should await } window.history.replaceState({}, '', `${window.location.pathname}`) // remove qs diff --git a/src/watchOptions.ts b/src/watchOptions.ts index 706cf40f1..9b22fdfe1 100644 --- a/src/watchOptions.ts +++ b/src/watchOptions.ts @@ -29,4 +29,8 @@ export const watchOptionsAfterViewerInit = () => { viewer.composer = undefined } }) + + watchValue(options, o => { + viewer.entities.setVisible(o.renderEntities) + }) } diff --git a/src/worldInteractions.ts b/src/worldInteractions.ts index 4e4a652ce..9353670cf 100644 --- a/src/worldInteractions.ts +++ b/src/worldInteractions.ts @@ -189,8 +189,14 @@ class WorldInteraction { //@ts-expect-error todo bot._placeBlockWithOptions(cursorBlock, vecArray[cursorBlock.face], { delta, forceLook: 'ignore' }).catch(console.warn) } else { + // https://discord.com/channels/413438066984747026/413438150594265099/1198724637572477098 + const oldLookAt = bot.lookAt //@ts-expect-error - bot.activateBlock(cursorBlock, vecArray[cursorBlock.face], delta).catch(console.warn) + bot.lookAt = (pos) => { } + //@ts-expect-error + bot.activateBlock(cursorBlock, vecArray[cursorBlock.face], delta).finally(() => { + bot.lookAt = oldLookAt + }).catch(console.warn) } this.lastBlockPlaced = 0 } else {