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
+ })
+ })
+
+ 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 {