diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 4e02c95c3d..6ce1aba4f8 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -6,7 +6,8 @@ body: id: mc-version attributes: label: Minecraft Version - description: What version of Minecraft are you using? + description: | + What version of Minecraft are you using? If your version is not listed, please try to reproduce on one of the supported versions. options: - 1.20.1 - 1.21.x @@ -26,8 +27,5 @@ body: label: Details description: | Description of the bug. Please include the following: - - Logs: These will be located in the `logs/` directory of your Minecraft - instance. Please upload them as a gist or directly into this editor. - - Detailed reproduction steps: sometimes I can spot a bug pretty easily, - but often it's much more obscure. The more information I have to help - reproduce it, the quicker it'll get fixed. + - Logs: These will be located in the `logs/` directory of your Minecraft instance. This is always useful, even if it doesn't include errors, so please upload this! + - Detailed reproduction steps: sometimes I can spot a bug pretty easily, but often it's much more obscure. The more information I have to help reproduce it, the quicker it'll get fixed. diff --git a/.github/workflows/main-ci.yml b/.github/workflows/main-ci.yml index c51b4cb74e..497a3556a9 100644 --- a/.github/workflows/main-ci.yml +++ b/.github/workflows/main-ci.yml @@ -30,8 +30,16 @@ jobs: - name: โš’๏ธ Build run: ./gradlew assemble || ./gradlew assemble + - name: Cache pre-commit + uses: actions/cache@v4 + with: + path: ~/.cache/pre-commit + key: pre-commit-3|${{ env.pythonLocation }}|${{ hashFiles('.pre-commit-config.yaml') }} + - name: ๐Ÿ’ก Lint - uses: pre-commit/action@v3.0.0 + run: | + pipx install pre-commit + pre-commit run --show-diff-on-failure --color=always - name: ๐Ÿงช Run tests run: ./gradlew test validateMixinNames checkChangelog @@ -42,11 +50,6 @@ jobs: - name: ๐Ÿงช Run integration tests run: ./gradlew runGametest - - name: ๐Ÿงช Run client tests - run: ./gradlew runGametestClient # Not checkClient, as no point running rendering tests. - # These are a little flaky on GH actions: its useful to run them, but don't break the build. - continue-on-error: true - - name: ๐Ÿงช Parse test reports run: ./tools/parse-reports.py if: ${{ failure() }} @@ -63,9 +66,6 @@ jobs: name: CC-Tweaked path: ./jars - - name: ๐Ÿ“ค Upload coverage - uses: codecov/codecov-action@v4 - build-core: strategy: fail-fast: false diff --git a/buildSrc/src/main/kotlin/cc/tweaked/gradle/CCTweakedExtension.kt b/buildSrc/src/main/kotlin/cc/tweaked/gradle/CCTweakedExtension.kt index 09be926cb8..70b3d1f3e9 100644 --- a/buildSrc/src/main/kotlin/cc/tweaked/gradle/CCTweakedExtension.kt +++ b/buildSrc/src/main/kotlin/cc/tweaked/gradle/CCTweakedExtension.kt @@ -269,7 +269,7 @@ abstract class CCTweakedExtension( companion object { private val COMMIT_COUNTS = Pattern.compile("""^\s*[0-9]+\s+(.*)$""") private val IGNORED_USERS = setOf( - "GitHub", "Daniel Ratcliffe", "Weblate", + "GitHub", "Daniel Ratcliffe", "NotSquidDev", "Weblate", ) private fun gitProvider(project: Project, default: T, supplier: () -> T): Provider { diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml index bf8face88d..9347a36224 100644 --- a/config/checkstyle/checkstyle.xml +++ b/config/checkstyle/checkstyle.xml @@ -21,6 +21,15 @@ SPDX-License-Identifier: MPL-2.0 + + + + + + diff --git a/crowdin.yml b/crowdin.yml index 1f86638a31..5a1b4d18ce 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,12 +1,13 @@ # SPDX-FileCopyrightText: 2017 The CC: Tweaked Developers # # SPDX-License-Identifier: MPL-2.0 + files: - source: projects/common/src/generated/resources/assets/computercraft/lang/en_us.json translation: /projects/common/src/main/resources/assets/computercraft/lang/%locale_with_underscore%.json languages_mapping: locale_with_underscore: - cs: cs_cs # Czech + cs: cs_cz # Czech da: da_dk # Danish de: de_de # German es-ES: es_es # Spanish @@ -21,6 +22,7 @@ files: ru: ru_ru # Russian sv-SE: sv_se # Sweedish tok: tok # Toki Pona + tr: tr_tr # Turkish uk: uk_ua # Ukraine vi: vi_vn # Vietnamese zh-CN: zh_cn # Chinese Simplified diff --git a/doc/events/redstone.md b/doc/events/redstone.md index d097fc2b50..736363bf03 100644 --- a/doc/events/redstone.md +++ b/doc/events/redstone.md @@ -8,7 +8,7 @@ SPDX-FileCopyrightText: 2021 The CC: Tweaked Developers SPDX-License-Identifier: MPL-2.0 --> -The [`event!redstone`] event is fired whenever any redstone inputs on the computer change. +The [`event!redstone`] event is fired whenever any redstone inputs on the computer or [relay][`redstone_relay`] change. ## Return values 1. [`string`]: The event name. @@ -21,3 +21,7 @@ while true do print("A redstone input has changed!") end ``` + +## See also + - [The `redstone` API on computers][`module!redstone`] + - [The `redstone_relay` peripheral][`redstone_relay`] diff --git a/doc/reference/feature_compat.md b/doc/reference/feature_compat.md index 72f9b18d81..1fc50c355e 100644 --- a/doc/reference/feature_compat.md +++ b/doc/reference/feature_compat.md @@ -81,7 +81,7 @@ compatibility for these newer versions. | `string.dump` strip argument | โœ” | | | `string.pack`/`string.unpack`/`string.packsize` | โœ” | | | `table.move` | โœ” | | -| `math.atan2` -> `math.atan` | โŒ | | +| `math.atan2` -> `math.atan` | ๐Ÿ”ถ | `math.atan` supports its two argument form. | | Removed `math.frexp`, `math.ldexp`, `math.pow`, `math.cosh`, `math.sinh`, `math.tanh` | โŒ | | | `math.maxinteger`/`math.mininteger` | โŒ | | | `math.tointeger` | โŒ | | diff --git a/gradle.properties b/gradle.properties index f7f78fa35c..baad6cf6d7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ neogradle.subsystems.conventions.runs.enabled=false # Mod properties isUnstable=true -modVersion=1.113.1 +modVersion=1.114.0 # Minecraft properties: We want to configure this here so we can read it in settings.gradle mcVersion=1.21.1 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 47433d5ec7..598c257771 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -26,7 +26,7 @@ slf4j = "2.0.9" asm = "9.6" autoService = "1.1.1" checkerFramework = "3.42.0" -cobalt = { strictly = "0.9.3" } +cobalt = { strictly = "0.9.5" } commonsCli = "1.6.0" jetbrainsAnnotations = "24.1.0" jsr305 = "3.0.2" @@ -57,8 +57,8 @@ junit = "5.10.1" jmh = "1.37" # Build tools -cctJavadoc = "1.8.2" -checkstyle = "10.14.1" +cctJavadoc = "1.8.3" +checkstyle = "10.20.1" curseForgeGradle = "1.1.18" errorProne-core = "2.27.0" errorProne-plugin = "3.1.0" @@ -66,7 +66,7 @@ fabric-loom = "1.7.1" githubRelease = "2.5.2" gradleVersions = "0.50.0" ideaExt = "1.1.7" -illuaminate = "0.1.0-73-g43ee16c" +illuaminate = "0.1.0-74-gf1551d5" lwjgl = "3.3.3" minotaur = "2.8.7" neoGradle = "7.0.170" diff --git a/package-lock.json b/package-lock.json index df19d98a2f..3ef49d2719 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,10 +16,10 @@ }, "devDependencies": { "@rollup/plugin-node-resolve": "^15.2.1", - "@rollup/plugin-typescript": "^11.0.0", + "@rollup/plugin-typescript": "^12.0.0", "@rollup/plugin-url": "^8.0.1", "@swc/core": "^1.3.92", - "@types/node": "^20.8.3", + "@types/node": "^22.0.0", "lightningcss": "^1.22.0", "preact-render-to-string": "^6.2.1", "rehype": "^13.0.0", @@ -31,383 +31,423 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", - "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", + "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.1", "is-module": "^1.0.0", "resolve": "^1.22.1" }, @@ -424,10 +464,11 @@ } }, "node_modules/@rollup/plugin-typescript": { - "version": "11.1.6", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz", - "integrity": "sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==", + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.1.tgz", + "integrity": "sha512-t7O653DpfB5MbFrqPe/VcKFFkvRuFNp9qId3xq4Eth5xlyymzxNpye2z8Hrl0RIMuXTSr5GGcFpkdlMeacUiFQ==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.1.0", "resolve": "^1.22.1" @@ -454,6 +495,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-url/-/plugin-url-8.0.2.tgz", "integrity": "sha512-5yW2LP5NBEgkvIRSSEdJkmxe5cUNZKG3eenKtfJvSkxVm/xTTu7w+ayBtNwhozl1ZnTUCU0xFaRQR+cBl2H7TQ==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "make-dir": "^3.1.0", @@ -472,14 +514,15 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", + "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "picomatch": "^4.0.2" }, "engines": { "node": ">=14.0.0" @@ -494,169 +537,238 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", - "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.1.tgz", + "integrity": "sha512-j2llrtCTwNu68yp1wybgkTUW8CrR8AZvGZzIO/qwNAetVP3FHidylyz1s0dU2zXG9uqqpoUIhWKmMypGMcdM2Q==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", - "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.1.tgz", + "integrity": "sha512-y65R3hM9sJVAXV3qh/dJ5o2OCVzwy6d994qmi+rGw1i1onYY5AoV9dREDYoizaZvc9esEqOs07CyFgPzz4DBqg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", - "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.1.tgz", + "integrity": "sha512-K9iOc75U9HpDffjop9qVPwNoBEPXS0Q6RrVSvh13gs38ynurJ2+HuS7NJbsx+fwiDA+eJYfBi7sablI8G2/3oA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", - "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.1.tgz", + "integrity": "sha512-Ufz0fX79W9937euBI4qEdh2xLb0Lzo4GiZ7xxDpueEZxWdPbow6gnTRokSzSgtqRFs1vFgcgm7Ci/KnOo15MIg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.1.tgz", + "integrity": "sha512-IfG1khuwe10V2EBfFIrcd7P6X0stdhHQM71NyaG5TPgy6dXr2nzAa5TMNFA35tr41gihUPqp/w8StayYG7jXYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", - "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.1.tgz", + "integrity": "sha512-W+drJRBL1+N1/zaq+8y/CtQ3VP5wxMXwCy7obFl9r5jJ5EFNEYAqchuPfYTleYOoA46bwXAprCL+OVK3BTrWWw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.1.tgz", + "integrity": "sha512-mKngr0zxo4FMSDqiq4F4G/1IPqjpNO7MyjAM6+YxDIADO4ZSI4m05bZYD4po12Jid6+n9YJRWdIcvi4JztMVcw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", - "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.1.tgz", + "integrity": "sha512-Rh12WITgvLydYFR9XAjmCRArU71nMfi5lDVLhpRV8dR2sCGtZESVkfD66mi3owp4q1scwysT35nNMPleRTQOow==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", - "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.1.tgz", + "integrity": "sha512-zOLu7V1iBpJMIrrmZjpmAZ9txFlnGgqQMnjNmRrqmV1vQaou9SIT3qI3JE1kt+DQE8zCdB3n2/mAjIU90AfjEg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.1.tgz", + "integrity": "sha512-h9ipTGhMzTBAJL/bg1HsElhGPWLGeCKE8JkxgvrJ5O/S1MXH9RxMUTl++tzlpzxdOBCAGqygZIMBj3wIDf/kJw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", - "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.1.tgz", + "integrity": "sha512-PNKCMA1xRBARR7/j6KXMSB1z0/eGenC/t2wdQl5et3jnrHA+igIaLVNUEPfnVjmZIZJign7u/dobvV2VkPxMiw==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.1.tgz", + "integrity": "sha512-mkl3uWq/ix18gAfzBUIecSwioPyJkbR6QXVaNuOGM7Qbs7f1EfDLP4XtLSJx4GL6mO8GrKhB3cmhUc3zjUrQSg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", - "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.1.tgz", + "integrity": "sha512-j0RPQWteEXAAxRQI+IcX3i7WQb7hFe7CW94H3l0edBVyJMIPOlr/hqc5CGG1FBDW9gNr0ZC2IzwSta1iSNJIoA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", - "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.1.tgz", + "integrity": "sha512-UrwXowd3gyT+/ijoeSzMyHHGUaV3WhiJL77eTZE8/Pq+9K6auacIJ264biAUhHJ3FjAHsXNhzEmxGnj4tpDz2g==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", - "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.1.tgz", + "integrity": "sha512-wexHPBkBa2/tPhbGcxLqOM2AFZ7BQsZ0pk3dVxRL5Ec0SsXnkpcMucZ4j4woyoD5DbRdFP6Roptd9TRsGVTvUA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", - "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.1.tgz", + "integrity": "sha512-IW2axCCdiC+kgj5/50Mt5v8qG0LYaDichBGKXM4Oo2NaWStAs0oQp1dqVzCV1XOXNvNNDRFw0EaT+JMs6BX+WQ==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", - "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.1.tgz", + "integrity": "sha512-b9IK2buRXwm7owl4Hd8fselCQ7/gr2WaErv0e/IPgRQuJfFS+O0cFJA4t13+FKAZeQh97iEyBG06g613IJLirQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -666,20 +778,22 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@squid-dev/cc-web-term/-/cc-web-term-2.0.1.tgz", "integrity": "sha512-zHivNbvZgOQHy3abEX72CleeiJbwBICzJbUkUtDFSyve1q2x40hsvoJpv8an/4JVT37ytzM+u52s3Mx46lh5WA==", + "license": "BSD-3-Clause", "dependencies": { "gif.js": "^0.2.0", "preact": "^10.5.5" } }, "node_modules/@swc/core": { - "version": "1.3.106", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.106.tgz", - "integrity": "sha512-++QPSPkFq2qELYVScxNHJC42hKQChjiTWS2P0QQ5JWT4NHb9lmNSfrc1ylFIyImwRnxsW2MTBALLYLf95EFAsg==", + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.40.tgz", + "integrity": "sha512-0HIzM5vigVT5IvNum+pPuST9p8xFhN6mhdIKju7qYYeNuZG78lwms/2d8WgjTJJlzp6JlPguXGrMMNzjQw0qNg==", "dev": true, "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@swc/counter": "^0.1.1", - "@swc/types": "^0.1.5" + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.13" }, "engines": { "node": ">=10" @@ -689,19 +803,19 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.3.106", - "@swc/core-darwin-x64": "1.3.106", - "@swc/core-linux-arm-gnueabihf": "1.3.106", - "@swc/core-linux-arm64-gnu": "1.3.106", - "@swc/core-linux-arm64-musl": "1.3.106", - "@swc/core-linux-x64-gnu": "1.3.106", - "@swc/core-linux-x64-musl": "1.3.106", - "@swc/core-win32-arm64-msvc": "1.3.106", - "@swc/core-win32-ia32-msvc": "1.3.106", - "@swc/core-win32-x64-msvc": "1.3.106" + "@swc/core-darwin-arm64": "1.7.40", + "@swc/core-darwin-x64": "1.7.40", + "@swc/core-linux-arm-gnueabihf": "1.7.40", + "@swc/core-linux-arm64-gnu": "1.7.40", + "@swc/core-linux-arm64-musl": "1.7.40", + "@swc/core-linux-x64-gnu": "1.7.40", + "@swc/core-linux-x64-musl": "1.7.40", + "@swc/core-win32-arm64-msvc": "1.7.40", + "@swc/core-win32-ia32-msvc": "1.7.40", + "@swc/core-win32-x64-msvc": "1.7.40" }, "peerDependencies": { - "@swc/helpers": "^0.5.0" + "@swc/helpers": "*" }, "peerDependenciesMeta": { "@swc/helpers": { @@ -710,13 +824,14 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.3.106", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.106.tgz", - "integrity": "sha512-XYcbViNyHnnm7RWOAO1YipMmthM7m2aXF32b0y+JMLYFBEyFpjVX9btLkzeL7wRx/5B3I35yJNhE+xyx0Q1Gkw==", + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.40.tgz", + "integrity": "sha512-LRRrCiRJLb1kpQtxMNNsr5W82Inr0dy5Imho+4HQzVx/Ismi0qX4hQBgzJAnyOBNLK1+OBVb/912UVhKXppdfQ==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" @@ -726,13 +841,14 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.3.106", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.106.tgz", - "integrity": "sha512-YKDPhUdfuwhmOUS9+CaIwl/0Tp+f1b73BH2EIESuxSNsogZf18a8HQ8O0fQEwdiwmA5LEqw47cj+kfOWV/0+kw==", + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.40.tgz", + "integrity": "sha512-Lpl0XK/4fLzS5jsK48opUuGXrqJXwqJckYYPwyGbCfCXm4MsBe+7dX2hq/Kc4YMY25+NeTmzAXhla8TT4WYD/g==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" @@ -742,13 +858,14 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.3.106", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.106.tgz", - "integrity": "sha512-bHxxJXogvFfocLL5inZxxtx/x/WgKozigp80Vbx0viac1fPDJrqKBw2X4MzpMiuTRAGVQ03jJI6pDwbSBf+yDw==", + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.40.tgz", + "integrity": "sha512-4bEvvjptpoc5BRPr/R419h6fXTEuub+frpxxlxBOEKxgXjAF/S3xdxyPijUAakmW/xXBF0u7OC4KYI+38yQp6g==", "cpu": [ "arm" ], "dev": true, + "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -758,13 +875,14 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.3.106", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.106.tgz", - "integrity": "sha512-c7jue++CHLgtpeaakEukoCLT9eNrImizbleE9Y7Is8CHqLq/7DG4s+7ma9DFKXIzW2MpTg9byIEQfpqSphVW6A==", + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.40.tgz", + "integrity": "sha512-v2fBlHJ/6Ovz0L2xFAI9TRiKyl9DTdx139PuAHD9gyzp16Utl/W0MPd4t2cYdkI6hPXE9PsJCSzMOrduh+YoDg==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -774,13 +892,14 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.3.106", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.106.tgz", - "integrity": "sha512-51EaC3Q8qAhLtWVnAVqoYX/gk3tK31cCBzUpwCcmhianhEBM2/WtKRAS4MqPhE8VVZuN3WjO2c2JaF2mX0yuoA==", + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.40.tgz", + "integrity": "sha512-uMkduQuU4LFVkW6txv8AVArT8GjJVJ5IHoWloXaUBMT447iE8NALmpePdZWhMyj6KV7j0y23CM5rzV/I2eNGLg==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -790,13 +909,14 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.3.106", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.106.tgz", - "integrity": "sha512-tOUi8BB6jAeCXgx7ESLNnX7nrbMVKQ/XajK77v7Ad4SXf9HYArnimBJpXUUyVFJTXLSv4e6c7s6XHHqXb5Lwcg==", + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.40.tgz", + "integrity": "sha512-4LZdY1MBSnXyTpW5fpBU/+JGAhkuHT+VnFTDNegRboN5nSPh7y0Yvn4LmIioESV+sWzjKkEXujJPGjrp+oSp5w==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -806,13 +926,14 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.3.106", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.106.tgz", - "integrity": "sha512-binLw4Lbd83NPy4/m/teH2nbaifxveSD+sKDvpxywRbvYW2I0w/iCBpUBcbnl16TQF4TPOGpq5YwG9lVxPVw5g==", + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.40.tgz", + "integrity": "sha512-FPjOwT3SgI6PAwH1O8bhOGBPzuvzOlzKeCtxLaCjruHJu9V8KKBrMTWOZT/FJyYC9mX5Ip1+l9j30UqUZdQxtA==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -822,13 +943,14 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.3.106", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.106.tgz", - "integrity": "sha512-n4ttBWr8tM7DPzwcEOIBTyTMHZTzCmbic/HTtxEsPyMAf/Daen+yrTKzjPP6k2usfSrjkxA780RSJJxI1N8r2w==", + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.40.tgz", + "integrity": "sha512-//ovXdD9GsTmhPmXJlXnIbRQkeuL6PSrYSr7uCMNcclrUdJG0YkO0GMM2afUKYbdJcunylDDWsSS8PFWn0QxmA==", "cpu": [ "arm64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -838,13 +960,14 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.3.106", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.106.tgz", - "integrity": "sha512-GhDNIwxE5FhkujESI6h/4ysT3wxwmrzTUlZYaR8rRui6a6SdX9feIPUHPEE5o5hpyp+xqlmvRxKkRxOnwsq8iA==", + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.40.tgz", + "integrity": "sha512-iD/1auVhHGlhWAPrWmfRWL3w4AvXIWGVXZiSA109/xnRIPiHKb/HqqTp/qB94E/ZHMPRgLKkLTNwamlkueUs8g==", "cpu": [ "ia32" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -854,13 +977,14 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.3.106", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.106.tgz", - "integrity": "sha512-2M6yWChuMS1+/MPo3Dor0SOMkvmiugonWlzsZBAu/oZboH2xKrHSRv7brsBujb2Oe47r+NsbV+vq9tnnP9Vl1Q==", + "version": "1.7.40", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.40.tgz", + "integrity": "sha512-ZlFAV1WFPhhWQ/8esiygmetkb905XIcMMtHRRG0FBGCllO+HVL5nikUaLDgTClz1onmEY9sMXUFQeoPtvliV+w==", "cpu": [ "x64" ], "dev": true, + "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -870,55 +994,65 @@ } }, "node_modules/@swc/counter": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz", - "integrity": "sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==", - "dev": true + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/@swc/types": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", - "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", - "dev": true + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.13.tgz", + "integrity": "sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/ms": "*" } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/estree-jsx": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.3.tgz", - "integrity": "sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*" } }, "node_modules/@types/hast": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz", - "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "*" } }, "node_modules/@types/mdast": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", - "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "*" } @@ -927,62 +1061,57 @@ "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.11.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.7.tgz", - "integrity": "sha512-GPmeN1C3XAyV5uybAf4cMLWT9fDWcmQhZVtMFu7OR32WjrqGG+Wnk2V1d0bmtUyE/Zy1QJ9BxyiTih9z8Oks8A==", + "version": "22.8.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.1.tgz", + "integrity": "sha512-k6Gi8Yyo8EtrNtkHXutUu2corfDf9su95VYVP10aGYMMROM6SAItZi0w1XszA6RtWTHSVp5OeFof37w0IEqCQg==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.8" } }, "node_modules/@types/resolve": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", - "dev": true + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -993,6 +1122,7 @@ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -1003,6 +1133,7 @@ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -1013,6 +1144,7 @@ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -1023,6 +1155,7 @@ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -1033,18 +1166,20 @@ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -1060,6 +1195,7 @@ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", "dev": true, + "license": "MIT", "dependencies": { "character-entities": "^2.0.0" }, @@ -1073,6 +1209,7 @@ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -1082,6 +1219,7 @@ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1091,6 +1229,7 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "dev": true, + "license": "Apache-2.0", "bin": { "detect-libc": "bin/detect-libc.js" }, @@ -1103,6 +1242,7 @@ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "dev": true, + "license": "MIT", "dependencies": { "dequal": "^2.0.0" }, @@ -1116,6 +1256,7 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -1124,41 +1265,43 @@ } }, "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" } }, "node_modules/estree-util-is-identifier-name": { @@ -1166,6 +1309,7 @@ "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", "dev": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -1175,13 +1319,15 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fsevents": { "version": "2.3.3", @@ -1189,6 +1335,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1202,15 +1349,17 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", "dev": true, + "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -1221,13 +1370,15 @@ "node_modules/gif.js": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/gif.js/-/gif.js-0.2.0.tgz", - "integrity": "sha512-bYxCoT8OZKmbxY8RN4qDiYuj4nrQDTzgLRcFVovyona1PTWNePzI4nzOmotnlOFIzTk/ZxAHtv+TfVLiBWj/hw==" + "integrity": "sha512-bYxCoT8OZKmbxY8RN4qDiYuj4nrQDTzgLRcFVovyona1PTWNePzI4nzOmotnlOFIzTk/ZxAHtv+TfVLiBWj/hw==", + "license": "MIT" }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -1236,10 +1387,11 @@ } }, "node_modules/hast-util-from-html": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz", - "integrity": "sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", "dev": true, + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", @@ -1258,6 +1410,7 @@ "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -1278,6 +1431,7 @@ "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", "dev": true, + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -1291,6 +1445,7 @@ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", "dev": true, + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -1299,42 +1454,17 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-raw": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz", - "integrity": "sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==", - "dev": true, - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/hast-util-to-html": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.0.tgz", - "integrity": "sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", + "integrity": "sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==", "dev": true, + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", - "hast-util-raw": "^9.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", @@ -1349,10 +1479,11 @@ } }, "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", - "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz", + "integrity": "sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", @@ -1375,30 +1506,12 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", - "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", - "dev": true, - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/hast-util-to-text": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.0.tgz", - "integrity": "sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", "dev": true, + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -1415,6 +1528,7 @@ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", "dev": true, + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -1428,6 +1542,7 @@ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", "dev": true, + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", @@ -1445,6 +1560,7 @@ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz", "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=12.0.0" } @@ -1454,22 +1570,25 @@ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/inline-style-parser": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.2.tgz", - "integrity": "sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==", - "dev": true + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "dev": true, + "license": "MIT" }, "node_modules/is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -1480,6 +1599,7 @@ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", "dev": true, + "license": "MIT", "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" @@ -1489,28 +1609,17 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, + "license": "MIT", "dependencies": { - "builtin-modules": "^3.3.0" + "hasown": "^2.0.2" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1521,6 +1630,7 @@ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -1531,6 +1641,7 @@ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -1540,13 +1651,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -1555,10 +1668,11 @@ } }, "node_modules/lightningcss": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.23.0.tgz", - "integrity": "sha512-SEArWKMHhqn/0QzOtclIwH5pXIYQOUEkF8DgICd/105O+GCgd7jxjNod/QPnBCSWvpRHQBGVz5fQ9uScby03zA==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.27.0.tgz", + "integrity": "sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ==", "dev": true, + "license": "MPL-2.0", "dependencies": { "detect-libc": "^1.0.3" }, @@ -1570,25 +1684,27 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.23.0", - "lightningcss-darwin-x64": "1.23.0", - "lightningcss-freebsd-x64": "1.23.0", - "lightningcss-linux-arm-gnueabihf": "1.23.0", - "lightningcss-linux-arm64-gnu": "1.23.0", - "lightningcss-linux-arm64-musl": "1.23.0", - "lightningcss-linux-x64-gnu": "1.23.0", - "lightningcss-linux-x64-musl": "1.23.0", - "lightningcss-win32-x64-msvc": "1.23.0" + "lightningcss-darwin-arm64": "1.27.0", + "lightningcss-darwin-x64": "1.27.0", + "lightningcss-freebsd-x64": "1.27.0", + "lightningcss-linux-arm-gnueabihf": "1.27.0", + "lightningcss-linux-arm64-gnu": "1.27.0", + "lightningcss-linux-arm64-musl": "1.27.0", + "lightningcss-linux-x64-gnu": "1.27.0", + "lightningcss-linux-x64-musl": "1.27.0", + "lightningcss-win32-arm64-msvc": "1.27.0", + "lightningcss-win32-x64-msvc": "1.27.0" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.23.0.tgz", - "integrity": "sha512-kl4Pk3Q2lnE6AJ7Qaij47KNEfY2/UXRZBT/zqGA24B8qwkgllr/j7rclKOf1axcslNXvvUdztjo4Xqh39Yq1aA==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.27.0.tgz", + "integrity": "sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MPL-2.0", "optional": true, "os": [ "darwin" @@ -1602,13 +1718,14 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.23.0.tgz", - "integrity": "sha512-KeRFCNoYfDdcolcFXvokVw+PXCapd2yHS1Diko1z1BhRz/nQuD5XyZmxjWdhmhN/zj5sH8YvWsp0/lPLVzqKpg==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.27.0.tgz", + "integrity": "sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==", "cpu": [ "x64" ], "dev": true, + "license": "MPL-2.0", "optional": true, "os": [ "darwin" @@ -1622,13 +1739,14 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.23.0.tgz", - "integrity": "sha512-xhnhf0bWPuZxcqknvMDRFFo2TInrmQRWZGB0f6YoAsZX8Y+epfjHeeOIGCfAmgF0DgZxHwYc8mIR5tQU9/+ROA==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.27.0.tgz", + "integrity": "sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==", "cpu": [ "x64" ], "dev": true, + "license": "MPL-2.0", "optional": true, "os": [ "freebsd" @@ -1642,13 +1760,14 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.23.0.tgz", - "integrity": "sha512-fBamf/bULvmWft9uuX+bZske236pUZEoUlaHNBjnueaCTJ/xd8eXgb0cEc7S5o0Nn6kxlauMBnqJpF70Bgq3zg==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.27.0.tgz", + "integrity": "sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==", "cpu": [ "arm" ], "dev": true, + "license": "MPL-2.0", "optional": true, "os": [ "linux" @@ -1662,13 +1781,14 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.23.0.tgz", - "integrity": "sha512-RS7sY77yVLOmZD6xW2uEHByYHhQi5JYWmgVumYY85BfNoVI3DupXSlzbw+b45A9NnVKq45+oXkiN6ouMMtTwfg==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.27.0.tgz", + "integrity": "sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==", "cpu": [ "arm64" ], "dev": true, + "license": "MPL-2.0", "optional": true, "os": [ "linux" @@ -1682,13 +1802,14 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.23.0.tgz", - "integrity": "sha512-cU00LGb6GUXCwof6ACgSMKo3q7XYbsyTj0WsKHLi1nw7pV0NCq8nFTn6ZRBYLoKiV8t+jWl0Hv8KkgymmK5L5g==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.27.0.tgz", + "integrity": "sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==", "cpu": [ "arm64" ], "dev": true, + "license": "MPL-2.0", "optional": true, "os": [ "linux" @@ -1702,13 +1823,14 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.23.0.tgz", - "integrity": "sha512-q4jdx5+5NfB0/qMbXbOmuC6oo7caPnFghJbIAV90cXZqgV8Am3miZhC4p+sQVdacqxfd+3nrle4C8icR3p1AYw==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.27.0.tgz", + "integrity": "sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==", "cpu": [ "x64" ], "dev": true, + "license": "MPL-2.0", "optional": true, "os": [ "linux" @@ -1722,13 +1844,14 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.23.0.tgz", - "integrity": "sha512-G9Ri3qpmF4qef2CV/80dADHKXRAQeQXpQTLx7AiQrBYQHqBjB75oxqj06FCIe5g4hNCqLPnM9fsO4CyiT1sFSQ==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.27.0.tgz", + "integrity": "sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==", "cpu": [ "x64" ], "dev": true, + "license": "MPL-2.0", "optional": true, "os": [ "linux" @@ -1741,14 +1864,36 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.27.0.tgz", + "integrity": "sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.23.0.tgz", - "integrity": "sha512-1rcBDJLU+obPPJM6qR5fgBUiCdZwZLafZM5f9kwjFLkb/UBNIzmae39uCSmh71nzPCTXZqHbvwu23OWnWEz+eg==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.27.0.tgz", + "integrity": "sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==", "cpu": [ "x64" ], "dev": true, + "license": "MPL-2.0", "optional": true, "os": [ "win32" @@ -1766,6 +1911,7 @@ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -1776,6 +1922,7 @@ "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-3.1.0.tgz", "integrity": "sha512-CEbNVoSikAxwDMDPjXlqlFYiZLkDJHwyGu/MfOsJnF3d7f3tds5J3z8s/l9TMXhzfsJCCJEAsD78842mwmg0PQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.0.0", @@ -1791,6 +1938,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -1802,10 +1950,11 @@ } }, "node_modules/mdast-util-from-markdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", "dev": true, + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -1826,10 +1975,11 @@ } }, "node_modules/mdast-util-mdx-expression": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", - "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -1844,10 +1994,11 @@ } }, "node_modules/mdast-util-mdx-jsx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.0.0.tgz", - "integrity": "sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz", + "integrity": "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -1859,7 +2010,6 @@ "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^5.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" }, @@ -1873,6 +2023,7 @@ "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -1887,10 +2038,11 @@ } }, "node_modules/mdast-util-phrasing": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz", - "integrity": "sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "dev": true, + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" @@ -1901,10 +2053,11 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", - "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", "dev": true, + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -1926,6 +2079,7 @@ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -1946,6 +2100,7 @@ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "dev": true, + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0" }, @@ -1969,6 +2124,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", @@ -1990,9 +2146,9 @@ } }, "node_modules/micromark-core-commonmark": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", - "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", "dev": true, "funding": [ { @@ -2004,6 +2160,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", @@ -2038,6 +2195,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -2059,6 +2217,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -2081,6 +2240,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -2101,6 +2261,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -2123,6 +2284,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -2131,9 +2293,9 @@ } }, "node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "dev": true, "funding": [ { @@ -2145,6 +2307,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -2165,6 +2328,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } @@ -2184,6 +2348,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -2205,6 +2370,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -2225,6 +2391,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } @@ -2244,6 +2411,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -2265,7 +2433,8 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.0", @@ -2281,7 +2450,8 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-normalize-identifier": { "version": "2.0.0", @@ -2298,6 +2468,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } @@ -2317,6 +2488,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" } @@ -2336,6 +2508,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", @@ -2343,9 +2516,9 @@ } }, "node_modules/micromark-util-subtokenize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", - "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", "dev": true, "funding": [ { @@ -2357,6 +2530,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -2378,7 +2552,8 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-types": { "version": "2.0.0", @@ -2394,13 +2569,15 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/mime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -2409,16 +2586,18 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/parse-entities": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", "character-entities": "^2.0.0", @@ -2435,18 +2614,20 @@ } }, "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", - "dev": true + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "dev": true, + "license": "MIT" }, "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz", + "integrity": "sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==", "dev": true, + "license": "MIT", "dependencies": { - "entities": "^4.4.0" + "entities": "^4.5.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -2456,62 +2637,59 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/preact": { - "version": "10.19.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.3.tgz", - "integrity": "sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==", + "version": "10.24.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz", + "integrity": "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" } }, "node_modules/preact-render-to-string": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.3.1.tgz", - "integrity": "sha512-NQ28WrjLtWY6lKDlTxnFpKHZdpjfF+oE6V4tZ0rTrunHrtZp6Dm0oFrcJalt/5PNeqJz4j1DuZDS0Y6rCBoqDA==", + "version": "6.5.11", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.5.11.tgz", + "integrity": "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw==", "dev": true, - "dependencies": { - "pretty-format": "^3.8.0" - }, + "license": "MIT", "peerDependencies": { "preact": ">=10" } }, - "node_modules/pretty-format": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", - "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==", - "dev": true - }, "node_modules/property-information": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", - "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/rehype": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.1.tgz", - "integrity": "sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", "dev": true, + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "rehype-parse": "^9.0.0", @@ -2524,10 +2702,11 @@ } }, "node_modules/rehype-highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-highlight/-/rehype-highlight-7.0.0.tgz", - "integrity": "sha512-QtobgRgYoQaK6p1eSr2SD1i61f7bjF2kZHAQHxeCHAuJf7ZUDMvQ7owDq9YTkmar5m5TSUol+2D3bp3KfJf/oA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/rehype-highlight/-/rehype-highlight-7.0.1.tgz", + "integrity": "sha512-dB/vVGFsbm7xPglqnYbg0ABg6rAuIWKycTvuXaOO27SgLoOFNoTlniTBtAxp3n5ZyMioW1a3KwiNqgjkb6Skjg==", "dev": true, + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-text": "^4.0.0", @@ -2541,10 +2720,11 @@ } }, "node_modules/rehype-parse": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.0.tgz", - "integrity": "sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", "dev": true, + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-html": "^2.0.0", @@ -2560,6 +2740,7 @@ "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-8.0.0.tgz", "integrity": "sha512-vzo0YxYbB2HE+36+9HWXVdxNoNDubx63r5LBzpxBGVWM8s9mdnMdbmuJBAX6TTyuGdZjZix6qU3GcSuKCIWivw==", "dev": true, + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", @@ -2571,10 +2752,11 @@ } }, "node_modules/rehype-stringify": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.0.tgz", - "integrity": "sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", "dev": true, + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-html": "^9.0.0", @@ -2590,6 +2772,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -2607,17 +2790,19 @@ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, "node_modules/rollup": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", - "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", + "version": "4.24.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.1.tgz", + "integrity": "sha512-2lhtdsnyxlfBAZVh9tfriEc1nV9HxjQGnqEpd7z7cWXuLbI4jHWDhAvw6JGs0AVcnYqv0gL7Mjuj/utxW2wPBw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -2627,19 +2812,24 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.6", - "@rollup/rollup-android-arm64": "4.9.6", - "@rollup/rollup-darwin-arm64": "4.9.6", - "@rollup/rollup-darwin-x64": "4.9.6", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", - "@rollup/rollup-linux-arm64-gnu": "4.9.6", - "@rollup/rollup-linux-arm64-musl": "4.9.6", - "@rollup/rollup-linux-riscv64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-gnu": "4.9.6", - "@rollup/rollup-linux-x64-musl": "4.9.6", - "@rollup/rollup-win32-arm64-msvc": "4.9.6", - "@rollup/rollup-win32-ia32-msvc": "4.9.6", - "@rollup/rollup-win32-x64-msvc": "4.9.6", + "@rollup/rollup-android-arm-eabi": "4.24.1", + "@rollup/rollup-android-arm64": "4.24.1", + "@rollup/rollup-darwin-arm64": "4.24.1", + "@rollup/rollup-darwin-x64": "4.24.1", + "@rollup/rollup-freebsd-arm64": "4.24.1", + "@rollup/rollup-freebsd-x64": "4.24.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.1", + "@rollup/rollup-linux-arm-musleabihf": "4.24.1", + "@rollup/rollup-linux-arm64-gnu": "4.24.1", + "@rollup/rollup-linux-arm64-musl": "4.24.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.1", + "@rollup/rollup-linux-riscv64-gnu": "4.24.1", + "@rollup/rollup-linux-s390x-gnu": "4.24.1", + "@rollup/rollup-linux-x64-gnu": "4.24.1", + "@rollup/rollup-linux-x64-musl": "4.24.1", + "@rollup/rollup-win32-arm64-msvc": "4.24.1", + "@rollup/rollup-win32-ia32-msvc": "4.24.1", + "@rollup/rollup-win32-x64-msvc": "4.24.1", "fsevents": "~2.3.2" } }, @@ -2648,6 +2838,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -2655,23 +2846,26 @@ "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" }, "node_modules/space-separated-tokens": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/stringify-entities": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", - "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "dev": true, + "license": "MIT", "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" @@ -2682,12 +2876,13 @@ } }, "node_modules/style-to-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.5.tgz", - "integrity": "sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", "dev": true, + "license": "MIT", "dependencies": { - "inline-style-parser": "0.2.2" + "inline-style-parser": "0.2.4" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -2695,6 +2890,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2707,34 +2903,38 @@ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/trough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", - "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" }, "node_modules/tsx": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", - "integrity": "sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", "dev": true, + "license": "MIT", "dependencies": { - "esbuild": "~0.19.10", - "get-tsconfig": "^4.7.2" + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" }, "bin": { "tsx": "dist/cli.mjs" @@ -2747,10 +2947,11 @@ } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2760,16 +2961,18 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" }, "node_modules/unified": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", - "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", @@ -2789,6 +2992,7 @@ "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" @@ -2803,6 +3007,7 @@ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -2816,6 +3021,7 @@ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -2824,25 +3030,12 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -2856,6 +3049,7 @@ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", @@ -2871,6 +3065,7 @@ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" @@ -2881,13 +3076,13 @@ } }, "node_modules/vfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", - "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" }, "funding": { @@ -2896,10 +3091,11 @@ } }, "node_modules/vfile-location": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", - "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" @@ -2914,6 +3110,7 @@ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dev": true, + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" @@ -2928,6 +3125,7 @@ "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2938,6 +3136,7 @@ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" diff --git a/package.json b/package.json index f93484952c..9a39417b08 100644 --- a/package.json +++ b/package.json @@ -13,10 +13,10 @@ }, "devDependencies": { "@rollup/plugin-node-resolve": "^15.2.1", - "@rollup/plugin-typescript": "^11.0.0", + "@rollup/plugin-typescript": "^12.0.0", "@rollup/plugin-url": "^8.0.1", "@swc/core": "^1.3.92", - "@types/node": "^20.8.3", + "@types/node": "^22.0.0", "lightningcss": "^1.22.0", "preact-render-to-string": "^6.2.1", "rehype": "^13.0.0", diff --git a/projects/common-api/build.gradle.kts b/projects/common-api/build.gradle.kts index 6ce14aff7a..0eeb0a534b 100644 --- a/projects/common-api/build.gradle.kts +++ b/projects/common-api/build.gradle.kts @@ -8,6 +8,8 @@ plugins { id("cc-tweaked.vanilla") } +val mcVersion: String by extra + java { withJavadocJar() } @@ -17,8 +19,36 @@ dependencies { } tasks.javadoc { + title = "CC: Tweaked $version Minecraft $mcVersion" include("dan200/computercraft/api/**/*.java") + options { + (this as StandardJavadocDocletOptions) + + groups = mapOf( + "Common" to listOf( + "dan200.computercraft.api", + "dan200.computercraft.api.lua", + "dan200.computercraft.api.peripheral", + ), + "Upgrades" to listOf( + "dan200.computercraft.api.client.turtle", + "dan200.computercraft.api.pocket", + "dan200.computercraft.api.turtle", + "dan200.computercraft.api.upgrades", + ), + ) + + addBooleanOption("-allow-script-in-comments", true) + bottom( + """ + + + + """.trimIndent(), + ) + } + // Include the core-api in our javadoc export. This is wrong, but it means we can export a single javadoc dump. source(project(":core-api").sourceSets.main.map { it.allJava }) diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java b/projects/common-api/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java index bf82da6cb8..604cbaa957 100644 --- a/projects/common-api/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java +++ b/projects/common-api/src/main/java/dan200/computercraft/api/ComputerCraftAPI.java @@ -173,14 +173,14 @@ public static PacketNetwork getWirelessNetwork(MinecraftServer server) { * This may be used with {@link IComputerSystem#getComponent(ComputerComponent)} to only attach APIs to specific * computers. For example, one can add an additional API just to turtles with the following code: * - *
{@code
+     * {@snippet lang="java":
      * ComputerCraftAPI.registerAPIFactory(computer -> {
      *   // Read the turtle component.
      *   var turtle = computer.getComponent(ComputerComponents.TURTLE);
      *   // If present then add our API.
      *   return turtle == null ? null : new MyCustomTurtleApi(turtle);
      * });
-     * }
+ * } * * @param factory The factory for your API subclass. * @see ILuaAPIFactory diff --git a/projects/common-api/src/main/java/dan200/computercraft/api/network/wired/WiredElement.java b/projects/common-api/src/main/java/dan200/computercraft/api/network/wired/WiredElement.java index 0d58975f38..01d197ebdc 100644 --- a/projects/common-api/src/main/java/dan200/computercraft/api/network/wired/WiredElement.java +++ b/projects/common-api/src/main/java/dan200/computercraft/api/network/wired/WiredElement.java @@ -14,7 +14,7 @@ * as a proxy for all network objects. Whilst the node may change networks, an element's node should remain constant * for its lifespan. *

- * Elements are generally tied to a block or tile entity in world. In such as case, one should provide the + * Elements are generally tied to a block or block entity in world. In such as case, one should provide the * {@link WiredElement} capability for the appropriate sides. */ public interface WiredElement extends WiredSender { diff --git a/projects/common/src/client/java/dan200/computercraft/client/ClientHooks.java b/projects/common/src/client/java/dan200/computercraft/client/ClientHooks.java index bd45f9310a..8df73d8644 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/ClientHooks.java +++ b/projects/common/src/client/java/dan200/computercraft/client/ClientHooks.java @@ -64,6 +64,9 @@ public static void onRenderTick() { public static void onWorldUnload() { MonitorRenderState.destroyAll(); SpeakerManager.reset(); + } + + public static void onDisconnect() { ClientPocketComputers.reset(); } diff --git a/projects/common/src/generated/resources/assets/computercraft/blockstates/redstone_relay.json b/projects/common/src/generated/resources/assets/computercraft/blockstates/redstone_relay.json new file mode 100644 index 0000000000..5a813aa867 --- /dev/null +++ b/projects/common/src/generated/resources/assets/computercraft/blockstates/redstone_relay.json @@ -0,0 +1,8 @@ +{ + "variants": { + "facing=east": {"model": "computercraft:block/redstone_relay", "y": 90}, + "facing=north": {"model": "computercraft:block/redstone_relay", "y": 0}, + "facing=south": {"model": "computercraft:block/redstone_relay", "y": 180}, + "facing=west": {"model": "computercraft:block/redstone_relay", "y": 270} + } +} diff --git a/projects/common/src/generated/resources/assets/computercraft/lang/en_us.json b/projects/common/src/generated/resources/assets/computercraft/lang/en_us.json index db6f6b97e1..dd334cb3cf 100644 --- a/projects/common/src/generated/resources/assets/computercraft/lang/en_us.json +++ b/projects/common/src/generated/resources/assets/computercraft/lang/en_us.json @@ -17,6 +17,7 @@ "block.computercraft.monitor_advanced": "Advanced Monitor", "block.computercraft.monitor_normal": "Monitor", "block.computercraft.printer": "Printer", + "block.computercraft.redstone_relay": "Redstone Relay", "block.computercraft.speaker": "Speaker", "block.computercraft.turtle_advanced": "Advanced Turtle", "block.computercraft.turtle_advanced.upgraded": "Advanced %s Turtle", @@ -38,8 +39,6 @@ "commands.computercraft.generic.additional_rows": "%d additional rowsโ€ฆ", "commands.computercraft.generic.exception": "Unhandled exception (%s)", "commands.computercraft.generic.no": "N", - "commands.computercraft.generic.no_position": "", - "commands.computercraft.generic.position": "%s, %s, %s", "commands.computercraft.generic.yes": "Y", "commands.computercraft.help.desc": "Displays this help message", "commands.computercraft.help.no_children": "%s has no sub-commands", diff --git a/projects/common/src/generated/resources/assets/computercraft/models/block/redstone_relay.json b/projects/common/src/generated/resources/assets/computercraft/models/block/redstone_relay.json new file mode 100644 index 0000000000..e35b88836a --- /dev/null +++ b/projects/common/src/generated/resources/assets/computercraft/models/block/redstone_relay.json @@ -0,0 +1,9 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "bottom": "computercraft:block/redstone_relay_bottom", + "front": "computercraft:block/redstone_relay_front", + "side": "computercraft:block/redstone_relay_side", + "top": "computercraft:block/redstone_relay_top" + } +} diff --git a/projects/common/src/generated/resources/assets/computercraft/models/item/redstone_relay.json b/projects/common/src/generated/resources/assets/computercraft/models/item/redstone_relay.json new file mode 100644 index 0000000000..3ffb62221e --- /dev/null +++ b/projects/common/src/generated/resources/assets/computercraft/models/item/redstone_relay.json @@ -0,0 +1 @@ +{"parent": "computercraft:block/redstone_relay"} diff --git a/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/redstone_relay.json b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/redstone_relay.json new file mode 100644 index 0000000000..792e3a6e50 --- /dev/null +++ b/projects/common/src/generated/resources/data/computercraft/advancement/recipes/redstone/redstone_relay.json @@ -0,0 +1,15 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_cable": { + "conditions": {"items": [{"items": "computercraft:wired_modem"}]}, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": {"recipe": "computercraft:redstone_relay"}, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [["has_the_recipe", "has_cable"]], + "rewards": {"recipes": ["computercraft:redstone_relay"]} +} diff --git a/projects/common/src/generated/resources/data/computercraft/loot_table/blocks/redstone_relay.json b/projects/common/src/generated/resources/data/computercraft/loot_table/blocks/redstone_relay.json new file mode 100644 index 0000000000..1f2b43ff5a --- /dev/null +++ b/projects/common/src/generated/resources/data/computercraft/loot_table/blocks/redstone_relay.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [{"condition": "minecraft:survives_explosion"}], + "entries": [{"type": "minecraft:item", "name": "computercraft:redstone_relay"}], + "rolls": 1.0 + } + ], + "random_sequence": "computercraft:blocks/redstone_relay" +} diff --git a/projects/common/src/generated/resources/data/computercraft/recipe/redstone_relay.json b/projects/common/src/generated/resources/data/computercraft/recipe/redstone_relay.json new file mode 100644 index 0000000000..80fa4c8e67 --- /dev/null +++ b/projects/common/src/generated/resources/data/computercraft/recipe/redstone_relay.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "C": {"item": "computercraft:wired_modem"}, + "R": {"tag": "c:dusts/redstone"}, + "S": {"item": "minecraft:stone"} + }, + "pattern": ["SRS", "RCR", "SRS"], + "result": {"count": 1, "id": "computercraft:redstone_relay"} +} diff --git a/projects/common/src/generated/resources/data/minecraft/tags/block/mineable/axe.json b/projects/common/src/generated/resources/data/minecraft/tags/block/mineable/axe.json new file mode 100644 index 0000000000..6e36891c88 --- /dev/null +++ b/projects/common/src/generated/resources/data/minecraft/tags/block/mineable/axe.json @@ -0,0 +1 @@ +{"values": ["computercraft:lectern"]} diff --git a/projects/common/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json b/projects/common/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json index e5a4c9d201..7e4df4d4c5 100644 --- a/projects/common/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json +++ b/projects/common/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json @@ -12,6 +12,7 @@ "computercraft:wireless_modem_normal", "computercraft:wireless_modem_advanced", "computercraft:wired_modem_full", - "computercraft:cable" + "computercraft:cable", + "computercraft:redstone_relay" ] } diff --git a/projects/common/src/main/java/dan200/computercraft/data/BlockModelProvider.java b/projects/common/src/main/java/dan200/computercraft/data/BlockModelProvider.java index 36f573f752..9424936a44 100644 --- a/projects/common/src/main/java/dan200/computercraft/data/BlockModelProvider.java +++ b/projects/common/src/main/java/dan200/computercraft/data/BlockModelProvider.java @@ -97,6 +97,8 @@ public static void addBlockModels(BlockModelGenerators generators) { registerCable(generators); + registerRedstoneControl(generators); + registerTurtleUpgrade(generators, "block/turtle_crafting_table", "block/turtle_crafty_face"); registerTurtleUpgrade(generators, "block/turtle_speaker", "block/turtle_speaker_face"); registerTurtleModem(generators, "block/turtle_modem_normal", "block/wireless_modem_normal_face"); @@ -355,6 +357,18 @@ private static void registerCable(BlockModelGenerators generators) { generators.blockStateOutput.accept(generator); } + private static void registerRedstoneControl(BlockModelGenerators generators) { + var redstoneControl = ModRegistry.Blocks.REDSTONE_RELAY.get(); + var model = ModelTemplates.CUBE_ORIENTABLE_TOP_BOTTOM.create( + redstoneControl, TextureMapping.orientableCube(redstoneControl), generators.modelOutput + ); + generators.blockStateOutput.accept( + MultiVariantGenerator.multiVariant(redstoneControl, Variant.variant().with(VariantProperties.MODEL, model)) + .with(createHorizontalFacingDispatch()) + ); + } + + private static final BooleanProperty[] CABLE_DIRECTIONS = { CableBlock.DOWN, CableBlock.UP, CableBlock.NORTH, CableBlock.SOUTH, CableBlock.WEST, CableBlock.EAST }; private static final boolean[] BOOLEANS = new boolean[]{ false, true }; diff --git a/projects/common/src/main/java/dan200/computercraft/data/LanguageProvider.java b/projects/common/src/main/java/dan200/computercraft/data/LanguageProvider.java index 35a59652fd..14be73d9da 100644 --- a/projects/common/src/main/java/dan200/computercraft/data/LanguageProvider.java +++ b/projects/common/src/main/java/dan200/computercraft/data/LanguageProvider.java @@ -82,6 +82,7 @@ private void addTranslations() { add(ModRegistry.Items.WIRED_MODEM.get(), "Wired Modem"); add(ModRegistry.Items.CABLE.get(), "Networking Cable"); add(ModRegistry.Items.WIRED_MODEM_FULL.get(), "Wired Modem"); + add(ModRegistry.Items.REDSTONE_RELAY.get(), "Redstone Relay"); add(ModRegistry.Items.TURTLE_NORMAL.get(), "Turtle"); add(ModRegistry.Blocks.TURTLE_NORMAL.get().getDescriptionId() + ".upgraded", "%s Turtle"); @@ -164,8 +165,6 @@ private void addTranslations() { add("commands.computercraft.queue.synopsis", "Send a computer_command event to a command computer"); add("commands.computercraft.queue.desc", "Send a computer_command event to a command computer, passing through the additional arguments. This is mostly designed for map makers, acting as a more computer-friendly version of /trigger. Any player can run the command, which would most likely be done through a text component's click event."); - add("commands.computercraft.generic.no_position", ""); - add("commands.computercraft.generic.position", "%s, %s, %s"); add("commands.computercraft.generic.yes", "Y"); add("commands.computercraft.generic.no", "N"); add("commands.computercraft.generic.exception", "Unhandled exception (%s)"); diff --git a/projects/common/src/main/java/dan200/computercraft/data/LootTableProvider.java b/projects/common/src/main/java/dan200/computercraft/data/LootTableProvider.java index fab4164b1e..cca624a53c 100644 --- a/projects/common/src/main/java/dan200/computercraft/data/LootTableProvider.java +++ b/projects/common/src/main/java/dan200/computercraft/data/LootTableProvider.java @@ -50,6 +50,7 @@ private static void registerBlocks(BiConsumer, LootTable. selfDrop(add, ModRegistry.Blocks.WIRED_MODEM_FULL); selfDrop(add, ModRegistry.Blocks.WIRELESS_MODEM_NORMAL); selfDrop(add, ModRegistry.Blocks.WIRELESS_MODEM_ADVANCED); + selfDrop(add, ModRegistry.Blocks.REDSTONE_RELAY); computerDrop(add, ModRegistry.Blocks.COMPUTER_NORMAL); computerDrop(add, ModRegistry.Blocks.COMPUTER_ADVANCED); diff --git a/projects/common/src/main/java/dan200/computercraft/data/RecipeProvider.java b/projects/common/src/main/java/dan200/computercraft/data/RecipeProvider.java index 257b0a8817..de8a208633 100644 --- a/projects/common/src/main/java/dan200/computercraft/data/RecipeProvider.java +++ b/projects/common/src/main/java/dan200/computercraft/data/RecipeProvider.java @@ -491,6 +491,17 @@ private void basicRecipes(RecipeOutput add) { .unlockedBy("has_printer", inventoryChange(ModRegistry.Items.PRINTER.get())) .build(x -> new PrintoutRecipe(x, pages, 1)) .save(add); + + ShapedRecipeBuilder + .shaped(RecipeCategory.REDSTONE, ModRegistry.Blocks.REDSTONE_RELAY.get()) + .pattern("SRS") + .pattern("RCR") + .pattern("SRS") + .define('S', Items.STONE) + .define('R', ingredients.redstone()) + .define('C', ModRegistry.Blocks.CABLE.get()) + .unlockedBy("has_cable", inventoryChange(ModRegistry.Blocks.CABLE.get())) + .save(add); } private static DyeColor ofColour(Colour colour) { diff --git a/projects/common/src/main/java/dan200/computercraft/data/TagProvider.java b/projects/common/src/main/java/dan200/computercraft/data/TagProvider.java index cbc92c6c75..a184a6cc97 100644 --- a/projects/common/src/main/java/dan200/computercraft/data/TagProvider.java +++ b/projects/common/src/main/java/dan200/computercraft/data/TagProvider.java @@ -79,9 +79,12 @@ public static void blockTags(TagConsumer tags) { ModRegistry.Blocks.WIRELESS_MODEM_NORMAL.get(), ModRegistry.Blocks.WIRELESS_MODEM_ADVANCED.get(), ModRegistry.Blocks.WIRED_MODEM_FULL.get(), - ModRegistry.Blocks.CABLE.get() + ModRegistry.Blocks.CABLE.get(), + ModRegistry.Blocks.REDSTONE_RELAY.get() ); + tags.tag(BlockTags.MINEABLE_WITH_AXE).add(ModRegistry.Blocks.LECTERN.get()); + tags.tag(BlockTags.WITHER_IMMUNE).add(ModRegistry.Blocks.COMPUTER_COMMAND.get()); tags.tag(ExternalModTags.Blocks.CREATE_BRITTLE).add( diff --git a/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java b/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java index 72388e40db..b3817d601c 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java @@ -62,6 +62,8 @@ import dan200.computercraft.shared.peripheral.printer.PrinterBlock; import dan200.computercraft.shared.peripheral.printer.PrinterBlockEntity; import dan200.computercraft.shared.peripheral.printer.PrinterMenu; +import dan200.computercraft.shared.peripheral.redstone.RedstoneRelayBlock; +import dan200.computercraft.shared.peripheral.redstone.RedstoneRelayBlockEntity; import dan200.computercraft.shared.peripheral.speaker.SpeakerBlock; import dan200.computercraft.shared.peripheral.speaker.SpeakerBlockEntity; import dan200.computercraft.shared.platform.PlatformHelper; @@ -145,7 +147,7 @@ private static BlockBehaviour.Properties properties() { return BlockBehaviour.Properties.of().strength(2); } - private static BlockBehaviour.Properties computerProperties() { + private static BlockBehaviour.Properties redstoneConductor() { // Computers shouldn't conduct redstone through them, so set isRedstoneConductor to false. This still allows // redstone to connect to computers though as it's a signal source. return properties().isRedstoneConductor((block, level, blockPos) -> false); @@ -160,11 +162,11 @@ private static BlockBehaviour.Properties modemProperties() { } public static final RegistryEntry> COMPUTER_NORMAL = REGISTRY.register("computer_normal", - () -> new ComputerBlock<>(computerProperties().mapColor(MapColor.STONE), BlockEntities.COMPUTER_NORMAL)); + () -> new ComputerBlock<>(redstoneConductor().mapColor(MapColor.STONE), BlockEntities.COMPUTER_NORMAL)); public static final RegistryEntry> COMPUTER_ADVANCED = REGISTRY.register("computer_advanced", - () -> new ComputerBlock<>(computerProperties().mapColor(MapColor.GOLD), BlockEntities.COMPUTER_ADVANCED)); + () -> new ComputerBlock<>(redstoneConductor().mapColor(MapColor.GOLD), BlockEntities.COMPUTER_ADVANCED)); public static final RegistryEntry> COMPUTER_COMMAND = REGISTRY.register("computer_command", - () -> new CommandComputerBlock<>(computerProperties().strength(-1, 6000000.0F), BlockEntities.COMPUTER_COMMAND)); + () -> new CommandComputerBlock<>(redstoneConductor().strength(-1, 6000000.0F), BlockEntities.COMPUTER_COMMAND)); public static final RegistryEntry TURTLE_NORMAL = REGISTRY.register("turtle_normal", () -> new TurtleBlock(turtleProperties().mapColor(MapColor.STONE), BlockEntities.TURTLE_NORMAL)); @@ -192,6 +194,9 @@ private static BlockBehaviour.Properties modemProperties() { public static final RegistryEntry LECTERN = REGISTRY.register("lectern", () -> new CustomLecternBlock( BlockBehaviour.Properties.of().mapColor(MapColor.WOOD).instrument(NoteBlockInstrument.BASS).strength(2.5F).sound(SoundType.WOOD).ignitedByLava() )); + + public static final RegistryEntry REDSTONE_RELAY = REGISTRY.register("redstone_relay", + () -> new RedstoneRelayBlock(redstoneConductor().mapColor(MapColor.STONE))); } public static class BlockEntities { @@ -235,6 +240,8 @@ private static RegistryEntry> ofBlock ofBlock(Blocks.WIRELESS_MODEM_ADVANCED, (p, s) -> new WirelessModemBlockEntity(BlockEntities.WIRELESS_MODEM_ADVANCED.get(), p, s, true)); public static final RegistryEntry> LECTERN = ofBlock(Blocks.LECTERN, CustomLecternBlockEntity::new); + + public static final RegistryEntry> REDSTONE_RELAY = ofBlock(Blocks.REDSTONE_RELAY, RedstoneRelayBlockEntity::new); } public static final class Items { @@ -284,6 +291,7 @@ private static Item.Properties printoutProperties() { public static final RegistryEntry WIRELESS_MODEM_NORMAL = ofBlock(Blocks.WIRELESS_MODEM_NORMAL, BlockItem::new); public static final RegistryEntry WIRELESS_MODEM_ADVANCED = ofBlock(Blocks.WIRELESS_MODEM_ADVANCED, BlockItem::new); public static final RegistryEntry WIRED_MODEM_FULL = ofBlock(Blocks.WIRED_MODEM_FULL, BlockItem::new); + public static final RegistryEntry REDSTONE_RELAY = ofBlock(Blocks.REDSTONE_RELAY, BlockItem::new); public static final RegistryEntry CABLE = REGISTRY.register("cable", () -> new CableBlockItem.Cable(Blocks.CABLE.get(), properties())); @@ -546,6 +554,7 @@ static class CreativeTabs { out.accept(Items.CABLE.get()); out.accept(Items.WIRED_MODEM.get()); out.accept(Items.WIRED_MODEM_FULL.get()); + out.accept(Items.REDSTONE_RELAY.get()); out.accept(Items.MONITOR_NORMAL.get()); out.accept(Items.MONITOR_ADVANCED.get()); diff --git a/projects/common/src/main/java/dan200/computercraft/shared/command/text/ChatHelpers.java b/projects/common/src/main/java/dan200/computercraft/shared/command/text/ChatHelpers.java index 5485515ac0..b307f54147 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/command/text/ChatHelpers.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/command/text/ChatHelpers.java @@ -39,9 +39,8 @@ public static MutableComponent list(Component... children) { return component; } - public static MutableComponent position(@Nullable BlockPos pos) { - if (pos == null) return Component.translatable("commands.computercraft.generic.no_position"); - return Component.translatable("commands.computercraft.generic.position", pos.getX(), pos.getY(), pos.getZ()); + public static MutableComponent position(BlockPos pos) { + return Component.literal(pos.toShortString()); } public static MutableComponent bool(boolean value) { diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/apis/CommandAPI.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/apis/CommandAPI.java index c489c7b817..03627b8f5d 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/computer/apis/CommandAPI.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/apis/CommandAPI.java @@ -256,7 +256,7 @@ public final Object[] getBlockPosition() { * Get some basic information about a block. *

* The returned table contains the current name, metadata and block state (as - * with [`turtle.inspect`]). If there is a tile entity for that block, its NBT + * with [`turtle.inspect`]). If there is a block entity for that block, its NBT * will also be returned. * * @param x The x position of the block to query. diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/AbstractComputerBlockEntity.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/AbstractComputerBlockEntity.java index 803009ebad..adf89a6c32 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/AbstractComputerBlockEntity.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/blocks/AbstractComputerBlockEntity.java @@ -128,7 +128,7 @@ protected void serverTick() { // Update the block state if needed. updateBlockState(computer.getState()); - var changes = computer.pollAndResetChanges(); + var changes = computer.pollRedstoneChanges(); if (changes != 0) { for (var direction : DirectionUtil.FACINGS) { if ((changes & (1 << remapToLocalSide(direction).ordinal())) != 0) updateRedstoneTo(direction); @@ -221,8 +221,10 @@ private void updateRedstoneInput(ServerComputer computer, Direction dir, BlockPo var offsetSide = dir.getOpposite(); var localDir = remapToLocalSide(dir); - computer.setRedstoneInput(localDir, RedstoneUtil.getRedstoneInput(getLevel(), targetPos, dir)); - computer.setBundledRedstoneInput(localDir, BundledRedstone.getOutput(getLevel(), targetPos, offsetSide)); + computer.setRedstoneInput(localDir, + RedstoneUtil.getRedstoneInput(getLevel(), targetPos, dir), + BundledRedstone.getOutput(getLevel(), targetPos, offsetSide) + ); } /** diff --git a/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java b/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java index 9b2f3d10a9..f0ed52abfd 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/computer/core/ServerComputer.java @@ -132,8 +132,8 @@ boolean hasTimedOut() { * * @return What sides on the computer have changed. */ - public int pollAndResetChanges() { - return computer.pollAndResetChanges(); + public int pollRedstoneChanges() { + return computer.pollRedstoneChanges(); } public UUID register() { @@ -216,19 +216,15 @@ public void queueEvent(String event, @Nullable Object[] arguments) { } public int getRedstoneOutput(ComputerSide side) { - return computer.getEnvironment().getExternalRedstoneOutput(side); + return computer.isOn() ? computer.getRedstone().getExternalOutput(side) : 0; } - public void setRedstoneInput(ComputerSide side, int level) { - computer.getEnvironment().setRedstoneInput(side, level); + public void setRedstoneInput(ComputerSide side, int level, int bundledState) { + computer.getRedstone().setInput(side, level, bundledState); } public int getBundledRedstoneOutput(ComputerSide side) { - return computer.getEnvironment().getExternalBundledRedstoneOutput(side); - } - - public void setBundledRedstoneInput(ComputerSide side, int combination) { - computer.getEnvironment().setBundledRedstoneInput(side, combination); + return computer.isOn() ? computer.getRedstone().getExternalBundledOutput(side) : 0; } public void setPeripheral(ComputerSide side, @Nullable IPeripheral peripheral) { diff --git a/projects/common/src/main/java/dan200/computercraft/shared/data/HasComputerIdLootCondition.java b/projects/common/src/main/java/dan200/computercraft/shared/data/HasComputerIdLootCondition.java index cb1f4f3192..63c328c927 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/data/HasComputerIdLootCondition.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/data/HasComputerIdLootCondition.java @@ -15,7 +15,7 @@ import java.util.Set; /** - * A loot condition which checks if the tile entity has a non-0 ID. + * A loot condition which checks if the block entity has a computer ID. */ public final class HasComputerIdLootCondition implements LootItemCondition { public static final HasComputerIdLootCondition INSTANCE = new HasComputerIdLootCondition(); diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/AbstractInventoryMethods.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/AbstractInventoryMethods.java index c83d4922f3..e72d9f4de3 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/AbstractInventoryMethods.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/AbstractInventoryMethods.java @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2020 The CC: Tweaked Developers // -// SPDX-License-Identifier: LicenseRef-CCPL +// SPDX-License-Identifier: MPL-2.0 package dan200.computercraft.shared.peripheral.generic.methods; diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorBlockEntity.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorBlockEntity.java index 6235d0c49c..5b03b23774 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorBlockEntity.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/monitor/MonitorBlockEntity.java @@ -5,6 +5,7 @@ package dan200.computercraft.shared.peripheral.monitor; import com.google.common.annotations.VisibleForTesting; +import dan200.computercraft.api.peripheral.AttachedComputerSet; import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.core.terminal.Terminal; @@ -25,9 +26,6 @@ import org.slf4j.LoggerFactory; import javax.annotation.Nullable; -import java.util.Collections; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; public class MonitorBlockEntity extends BlockEntity { @@ -53,7 +51,7 @@ public class MonitorBlockEntity extends BlockEntity { private @Nullable ClientMonitor clientMonitor; private @Nullable MonitorPeripheral peripheral; - private final Set computers = Collections.newSetFromMap(new ConcurrentHashMap<>()); + private final AttachedComputerSet computers = new AttachedComputerSet(); private boolean needsUpdate = false; private boolean needsValidating = false; @@ -487,7 +485,7 @@ private void eachComputer(Consumer fun) { var monitor = getLoadedMonitor(x, y).getMonitor(); if (monitor == null) continue; - for (var computer : monitor.computers) fun.accept(computer); + computers.forEach(fun); } } } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/redstone/RedstoneRelayBlock.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/redstone/RedstoneRelayBlock.java new file mode 100644 index 0000000000..49ef224589 --- /dev/null +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/redstone/RedstoneRelayBlock.java @@ -0,0 +1,92 @@ +// SPDX-FileCopyrightText: 2024 The CC: Tweaked Developers +// +// SPDX-License-Identifier: MPL-2.0 +package dan200.computercraft.shared.peripheral.redstone; + +import com.mojang.serialization.MapCodec; +import dan200.computercraft.shared.common.IBundledRedstoneBlock; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; + +import javax.annotation.Nonnull; + +/** + * The block for redstone relays. This mostly just forwards method calls to the {@linkplain RedstoneRelayBlockEntity + * block entity}. + */ +public final class RedstoneRelayBlock extends HorizontalDirectionalBlock implements EntityBlock, IBundledRedstoneBlock { + private static final MapCodec CODEC = simpleCodec(RedstoneRelayBlock::new); + + public RedstoneRelayBlock(Properties properties) { + super(properties); + registerDefaultState(defaultBlockState().setValue(FACING, Direction.NORTH)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder properties) { + properties.add(FACING); + } + + @Override + protected MapCodec codec() { + return CODEC; + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext placement) { + return defaultBlockState().setValue(FACING, placement.getHorizontalDirection()); + } + + @Override + @Deprecated + public void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + super.tick(state, level, pos, random); + + if (level.getBlockEntity(pos) instanceof RedstoneRelayBlockEntity relay) relay.update(); + } + + @Override + @Deprecated + public boolean isSignalSource(@Nonnull BlockState state) { + return true; + } + + @Override + @Deprecated + public int getDirectSignal(@Nonnull BlockState state, BlockGetter level, @Nonnull BlockPos pos, @Nonnull Direction incomingSide) { + return level.getBlockEntity(pos) instanceof RedstoneRelayBlockEntity relay ? relay.getRedstoneOutput(incomingSide.getOpposite()) : 0; + } + + @Override + @Deprecated + public int getSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { + return getDirectSignal(state, level, pos, direction); + } + + @Override + public int getBundledRedstoneOutput(Level level, BlockPos pos, Direction side) { + return level.getBlockEntity(pos) instanceof RedstoneRelayBlockEntity relay ? relay.getBundledRedstoneOutput(side) : 0; + } + + @Override + @Deprecated + public void neighborChanged(@Nonnull BlockState state, @Nonnull Level world, @Nonnull BlockPos pos, @Nonnull Block neighbourBlock, @Nonnull BlockPos neighbourPos, boolean isMoving) { + if (world.getBlockEntity(pos) instanceof RedstoneRelayBlockEntity relay) relay.neighborChanged(neighbourPos); + } + + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new RedstoneRelayBlockEntity(pos, state); + } +} diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/redstone/RedstoneRelayBlockEntity.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/redstone/RedstoneRelayBlockEntity.java new file mode 100644 index 0000000000..833b0d4ad2 --- /dev/null +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/redstone/RedstoneRelayBlockEntity.java @@ -0,0 +1,92 @@ +// SPDX-FileCopyrightText: 2024 The CC: Tweaked Developers +// +// SPDX-License-Identifier: MPL-2.0 +package dan200.computercraft.shared.peripheral.redstone; + +import dan200.computercraft.api.peripheral.IPeripheral; +import dan200.computercraft.core.computer.ComputerSide; +import dan200.computercraft.core.redstone.RedstoneState; +import dan200.computercraft.impl.BundledRedstone; +import dan200.computercraft.shared.ModRegistry; +import dan200.computercraft.shared.util.DirectionUtil; +import dan200.computercraft.shared.util.RedstoneUtil; +import dan200.computercraft.shared.util.TickScheduler; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +public final class RedstoneRelayBlockEntity extends BlockEntity { + private final TickScheduler.Token tickToken = new TickScheduler.Token(this); + + private final RedstoneState redstoneState = new RedstoneState(() -> TickScheduler.schedule(tickToken)); + private final RedstoneRelayPeripheral peripheral = new RedstoneRelayPeripheral(redstoneState); + + public RedstoneRelayBlockEntity(BlockPos pos, BlockState blockState) { + super(ModRegistry.BlockEntities.REDSTONE_RELAY.get(), pos, blockState); + } + + @Override + public void clearRemoved() { + super.clearRemoved(); + TickScheduler.schedule(tickToken); + } + + void update() { + var changes = redstoneState.updateOutput(); + if (changes != 0) { + for (var direction : DirectionUtil.FACINGS) { + if ((changes & (1 << mapSide(direction).ordinal())) != 0) updateRedstoneTo(direction); + } + } + + if (redstoneState.pollInputChanged()) peripheral.queueRedstoneEvent(); + } + + void neighborChanged(BlockPos neighbour) { + for (var dir : DirectionUtil.FACINGS) { + var offset = getBlockPos().relative(dir); + if (offset.equals(neighbour)) { + updateRedstoneInput(dir, offset, false); + return; + } + } + + // If the position is not any adjacent one, update all inputs. This is pretty terrible, but some redstone mods + // handle this incorrectly. + for (var dir : DirectionUtil.FACINGS) updateRedstoneInput(dir, getBlockPos().relative(dir), false); + } + + private void updateRedstoneTo(Direction direction) { + RedstoneUtil.propagateRedstoneOutput(getLevel(), getBlockPos(), direction); + updateRedstoneInput(direction, getBlockPos().relative(direction), true); + } + + private void updateRedstoneInput(Direction dir, BlockPos targetPos, boolean ticking) { + var changed = redstoneState.setInput(mapSide(dir), + RedstoneUtil.getRedstoneInput(getLevel(), targetPos, dir), + BundledRedstone.getOutput(getLevel(), targetPos, dir.getOpposite()) + ); + + // If the input has changed, and we're not currently in update(), then schedule a new tick so we can queue a + // redstone event. + if (changed && !ticking) TickScheduler.schedule(tickToken); + } + + private ComputerSide mapSide(Direction globalSide) { + return DirectionUtil.toLocal(getBlockState().getValue(HorizontalDirectionalBlock.FACING), globalSide); + } + + int getRedstoneOutput(Direction side) { + return redstoneState.getExternalOutput(mapSide(side)); + } + + int getBundledRedstoneOutput(Direction side) { + return redstoneState.getExternalBundledOutput(mapSide(side)); + } + + public IPeripheral peripheral() { + return peripheral; + } +} diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/redstone/RedstoneRelayPeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/redstone/RedstoneRelayPeripheral.java new file mode 100644 index 0000000000..7f03cc9cde --- /dev/null +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/redstone/RedstoneRelayPeripheral.java @@ -0,0 +1,73 @@ +// SPDX-FileCopyrightText: 2024 The CC: Tweaked Developers +// +// SPDX-License-Identifier: MPL-2.0 +package dan200.computercraft.shared.peripheral.redstone; + +import dan200.computercraft.api.peripheral.AttachedComputerSet; +import dan200.computercraft.api.peripheral.IComputerAccess; +import dan200.computercraft.api.peripheral.IPeripheral; +import dan200.computercraft.core.apis.RedstoneAPI; +import dan200.computercraft.core.apis.RedstoneMethods; +import dan200.computercraft.core.redstone.RedstoneAccess; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +/** + * The redstone relay is a peripheral that allows reading and outputting redstone signals. While this is not very useful + * on its own (as computers have the same functionality [built-in][`redstone`]), this can be used with [wired + * modems][`modem`] to interact with multiple redstone signals from the same computer. + *

+ * The peripheral provides largely identical methods to a computer's built-in {@link RedstoneAPI} API, allowing setting + * signals on all six sides of the block ("top", "bottom", "left", "right", "front" and "back"). + * + *

+ * ## Recipe + *

+ * + *
+ * + * @cc.usage Toggle the redstone signal above the computer every 0.5 seconds. + * + *
{@code
+ * local relay = peripheral.find("redstone_relay")
+ * while true do
+ *   relay.setOutput("top", not relay.getOutput("top"))
+ *   sleep(0.5)
+ * end
+ * }
+ * @cc.module redstone_relay + * @cc.since 1.114.0 + */ +public final class RedstoneRelayPeripheral extends RedstoneMethods implements IPeripheral { + private final AttachedComputerSet computers = new AttachedComputerSet(); + + RedstoneRelayPeripheral(RedstoneAccess access) { + super(access); + } + + @Nonnull + @Override + public String getType() { + return "redstone_relay"; + } + + @Override + public boolean equals(@Nullable IPeripheral other) { + return this == other; + } + + @Override + public void attach(IComputerAccess computer) { + computers.add(computer); + } + + @Override + public void detach(IComputerAccess computer) { + computers.remove(computer); + } + + void queueRedstoneEvent() { + computers.queueEvent("redstone"); + } +} diff --git a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java index c57ed92055..8b92b426fa 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/peripheral/speaker/SpeakerPeripheral.java @@ -4,11 +4,11 @@ package dan200.computercraft.shared.peripheral.speaker; -import com.google.errorprone.annotations.concurrent.GuardedBy; import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.LuaTable; +import dan200.computercraft.api.peripheral.AttachedComputerSet; import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.core.util.Nullability; @@ -59,7 +59,7 @@ public abstract class SpeakerPeripheral implements IPeripheral { public static final int SAMPLE_RATE = 48000; private final UUID source = UUID.randomUUID(); - private final @GuardedBy("computers") Set computers = new HashSet<>(); + private final AttachedComputerSet computers = new AttachedComputerSet(); private long clock = 0; private long lastPositionTime; @@ -139,11 +139,7 @@ public void update() { syncedPosition(position); // And notify computers that we have space for more audio. - synchronized (computers) { - for (var computer : computers) { - computer.queueEvent("speaker_audio_empty", computer.getAttachmentName()); - } - } + computers.forEach(c -> c.queueEvent("speaker_audio_empty", c.getAttachmentName())); } // Push position updates to any speakers which have ever played a note, @@ -356,16 +352,12 @@ private void syncedPosition(SpeakerPosition position) { @Override public void attach(IComputerAccess computer) { - synchronized (computers) { - computers.add(computer); - } + computers.add(computer); } @Override public void detach(IComputerAccess computer) { - synchronized (computers) { - computers.remove(computer); - } + computers.remove(computer); } static double clampVolume(double volume) { diff --git a/projects/common/src/main/java/dan200/computercraft/shared/pocket/core/PocketBrain.java b/projects/common/src/main/java/dan200/computercraft/shared/pocket/core/PocketBrain.java index 5e2269a2a0..5b6fcbf8d2 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/pocket/core/PocketBrain.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/pocket/core/PocketBrain.java @@ -21,6 +21,7 @@ import net.minecraft.world.phys.Vec3; import javax.annotation.Nullable; +import java.util.Objects; /** * Holds additional state for a pocket computer. This includes pocket computer upgrade, @@ -169,6 +170,8 @@ public void invalidatePeripheral() { */ @Override public void setUpgrade(@Nullable UpgradeData upgrade) { + if (Objects.equals(this.upgrade, upgrade)) return; + this.upgrade = upgrade; dirty = true; invalidatePeripheral(); diff --git a/projects/common/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItem.java b/projects/common/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItem.java index a3d9eaecc7..46abd4f8cd 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItem.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/pocket/items/PocketComputerItem.java @@ -226,6 +226,18 @@ public static PocketServerComputer getServerComputer(MinecraftServer server, Ite return getServerComputer(ServerContext.get(server).registry(), stack); } + @Override + public void onCraftedPostProcess(ItemStack stack, Level level) { + // Normally we treat the computer instance as the source of truth, and copy the computer's state back to the + // item. However, if we've just crafted the computer with an upgrade, we should sync the other way, and update + // the computer. + var server = level.getServer(); + if (server != null) { + var computer = getServerComputer(server, stack); + if (computer != null) computer.getBrain().setUpgrade(getUpgradeWithData(stack)); + } + } + public ComputerFamily getFamily() { return family; } diff --git a/projects/common/src/main/resources/assets/computercraft/lang/cs_cz.json b/projects/common/src/main/resources/assets/computercraft/lang/cs_cz.json index 8051fa6e48..80090e400e 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/cs_cz.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/cs_cz.json @@ -32,8 +32,6 @@ "commands.computercraft.generic.additional_rows": "%d ล™รกdkลฏ navรญcโ€ฆ", "commands.computercraft.generic.exception": "Neoฤekรกvanรก chyba (%s)", "commands.computercraft.generic.no": "N", - "commands.computercraft.generic.no_position": "<ลพรกdnรก pozice>", - "commands.computercraft.generic.position": "%s, %s, %s", "commands.computercraft.generic.yes": "A", "commands.computercraft.help.desc": "Ukรกลพe tuto pomocnou zprรกvu", "commands.computercraft.help.no_children": "%s nemรก ลพรกdnรฉ podpล™รญkazy", @@ -98,6 +96,7 @@ "gui.computercraft.config.http.max_requests.tooltip": "Poฤet HTTP poลพadavkลฏ kterรฉ poฤรญtaฤ mลฏลพe udฤ›lat v jednรฉ chvรญli. Poลพadavky navรญc\nbudou zaslรกny do fronty, a poslรกny kdyลพ bฤ›ลพรญcรญ poลพadavky byly dokonฤeny. Nastav\nna 0 pro neomezeno.\nRozsah: > 0", "gui.computercraft.config.http.max_websockets": "Maximรกlnรญ soubฤ›ลพnรฉ websockety", "gui.computercraft.config.http.max_websockets.tooltip": "Poฤet websocketลฏ kterรฉ mลฏลพe mรญt poฤรญtaฤ otevล™enรฉ najednou: Nastav na 0 pro neomezeno.\nRozsah: > 1", + "gui.computercraft.config.http.proxy": "Proxy", "gui.computercraft.config.http.proxy.host": "Nรกzev hostitele", "gui.computercraft.config.http.proxy.host.tooltip": "Nรกzev hostitele nebo IP adresa proxy serveru.", "gui.computercraft.config.http.proxy.port": "Port", @@ -164,6 +163,7 @@ "gui.computercraft.config.turtle.normal_fuel_limit.tooltip": "Limit paliva pro roboty.\nRozsah: > 0", "gui.computercraft.config.turtle.tooltip": "Rลฏznรฉ moลพnosti o robotech.", "gui.computercraft.config.upload_max_size": "Limit velikosti nahrรกvanรฉho souboru (v bajtech)", + "gui.computercraft.config.upload_max_size.tooltip": "Limit velikosti nahrรกvanรฉho souboru v bytech. Musรญ bรฝt v rozmezรญ od 1 KiB do 16 MiB.\nMฤ›j na pamฤ›ti, ลพe nahrรกvรกnรญ souborลฏ je zpracovรกvรกno v jednom ticku - velkรฉ soubory nebo\nลกpatnรฝ vรฝkon sรญtฤ› mohou zpomalit sรญลฅovรฉ vlรกkno. A nezapomeลˆ na mรญsto na disku!\nRozsah: 1024 ~ 16777216", "gui.computercraft.config.upload_nag_delay": "Nahrรกnรญ zpoลพdฤ›nรญ nag", "gui.computercraft.config.upload_nag_delay.tooltip": "Zpoลพdฤ›nรญ v sekundรกch po kterรฉm oznรกmรญme o nezpracovanรฝch importech. Nastav na 0 pro vypnutรญ.\nRozsah: 0 ~ 60", "gui.computercraft.pocket_computer_overlay": "Kapesnรญ poฤรญtaฤ otevล™en. Zmรกฤkni ESC pro uzavล™enรญ.", @@ -195,6 +195,10 @@ "item.computercraft.printed_pages": "Tisknutรฉ strรกnky", "item.computercraft.treasure_disk": "Disketa", "itemGroup.computercraft": "ComputerCraft", + "tag.item.computercraft.computer": "Poฤรญtaฤe", + "tag.item.computercraft.monitor": "Monitory", + "tag.item.computercraft.turtle": "Roboti", + "tag.item.computercraft.wired_modem": "Drรกtovรฉ modemy", "tracking_field.computercraft.avg": "%s (prลฏmฤ›r)", "tracking_field.computercraft.computer_tasks.name": "รšlohy", "tracking_field.computercraft.count": "%s (poฤet)", @@ -216,11 +220,5 @@ "upgrade.minecraft.diamond_hoe.adjective": "Farmรกล™skรฝ", "upgrade.minecraft.diamond_pickaxe.adjective": "Tฤ›ลพebnรญ", "upgrade.minecraft.diamond_shovel.adjective": "Kopacรญ", - "upgrade.minecraft.diamond_sword.adjective": "Bojovรฝ", - "tag.item.computercraft.computer": "Poฤรญtaฤe", - "tag.item.computercraft.monitor": "Monitory", - "tag.item.computercraft.turtle": "Roboti", - "tag.item.computercraft.wired_modem": "Drรกtovรฉ modemy", - "gui.computercraft.config.http.proxy": "Proxy", - "gui.computercraft.config.upload_max_size.tooltip": "Limit velikosti nahrรกvanรฉho souboru v bytech. Musรญ bรฝt v rozmezรญ od 1 KiB do 16 MiB.\nMฤ›j na pamฤ›ti, ลพe nahrรกvรกnรญ souborลฏ je zpracovรกvรกno v jednom ticku - velkรฉ soubory nebo\nลกpatnรฝ vรฝkon sรญtฤ› mohou zpomalit sรญลฅovรฉ vlรกkno. A nezapomeลˆ na mรญsto na disku!\nRozsah: 1024 ~ 16777216" + "upgrade.minecraft.diamond_sword.adjective": "Bojovรฝ" } diff --git a/projects/common/src/main/resources/assets/computercraft/lang/de_de.json b/projects/common/src/main/resources/assets/computercraft/lang/de_de.json index e41421b74a..c18c52d8bc 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/de_de.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/de_de.json @@ -1,8 +1,13 @@ { "argument.computercraft.argument_expected": "Parameter erwartet", + "argument.computercraft.computer.family": "Computer familie", + "argument.computercraft.computer.id": "Computer ID", + "argument.computercraft.computer.instance": "einzigartige Instanz ID", + "argument.computercraft.computer.label": "Computer name", "argument.computercraft.computer.many_matching": "Mehrere Computer passen auf '%s' (Instanzen %s)", "argument.computercraft.computer.no_matching": "Kein Computer passt auf '%s'", "argument.computercraft.tracking_field.no_field": "Unbekanntes Feld '%s'", + "argument.computercraft.unknown_computer_family": "Unbekannte computer familie '%s'", "block.computercraft.cable": "Netzwerkkabel", "block.computercraft.computer_advanced": "Erweiterter Computer", "block.computercraft.computer_command": "Befehlscomputer", @@ -32,8 +37,6 @@ "commands.computercraft.generic.additional_rows": "%d zusรคtzliche Zeilenโ€ฆ", "commands.computercraft.generic.exception": "Unbehandelte Ausnahme (%s)", "commands.computercraft.generic.no": "N", - "commands.computercraft.generic.no_position": "", - "commands.computercraft.generic.position": "%s, %s, %s", "commands.computercraft.generic.yes": "J", "commands.computercraft.help.desc": "Zeigt diese Hilfe Nachricht", "commands.computercraft.help.no_children": "%s hat keine Unterbefehle", @@ -82,8 +85,16 @@ "gui.computercraft.config.execution.max_main_computer_time": "Computer Servertick Zeitlimit", "gui.computercraft.config.execution.max_main_computer_time.tooltip": "Die ideale maximale Zeit, in der ein Computer laufen kann im innerhalb von einem tick in Millisekunden.\nBeachte, dass wir wahrscheinlich รผber diesen Limit gehen werden, da es unmรถglich ist zu bestimmen,\nwie lange ein Computer brauchen wird. Dies wird also die hรถhere Grenze der durchschnittlichen Zeit darstellen.\nBereich: > 1", "gui.computercraft.config.execution.max_main_global_time": "Globales Servertick Zeitlimit", + "gui.computercraft.config.execution.max_main_global_time.tooltip": "Die maximale Zeit in millisekunden, in der Aufgaben ausgefรผhrt werden.\nAnmerkung: Diese Zeit wird hรถchstwarscheinlich รผberschritten und dient nur als ungefรคhre Grenze.\nLimit: > 1", "gui.computercraft.config.floppy_space_limit": "Speicherplatz von Disketten (Bytes)", + "gui.computercraft.config.floppy_space_limit.tooltip": "Die maximale Dateisystem GrรถรŸe von Disketten (in bytes).", "gui.computercraft.config.http": "HTTP", + "gui.computercraft.config.http.bandwidth": "Bandbreite", + "gui.computercraft.config.http.bandwidth.global_download": "Globales download limit", + "gui.computercraft.config.http.bandwidth.global_download.tooltip": "Die maximale Geschwindigkeit aller Computer in bytes/s mit der Heruntergeladen werden kann.\nBereich: > 1", + "gui.computercraft.config.http.bandwidth.global_upload": "Globales upload limit", + "gui.computercraft.config.http.bandwidth.global_upload.tooltip": "Die maximale Hochladungs Geschwindigkeit aller Computer in bytes/s.\nBereich: > 1", + "gui.computercraft.config.http.bandwidth.tooltip": "Limitiert die Bandbreite der Computer.", "gui.computercraft.config.http.enabled": "HTTP-API aktivieren", "gui.computercraft.config.http.max_requests": "Maximale Anzahl gleichzeitiger Anfragen", "gui.computercraft.config.http.max_websockets": "Maximale Anzahl gleichzeitiger Websockets", @@ -130,18 +141,5 @@ "upgrade.minecraft.diamond_hoe.adjective": "Ackerbau", "upgrade.minecraft.diamond_pickaxe.adjective": "Bergbau", "upgrade.minecraft.diamond_shovel.adjective": "Graben", - "upgrade.minecraft.diamond_sword.adjective": "Nahkampf", - "argument.computercraft.computer.id": "Computer ID", - "argument.computercraft.computer.instance": "einzigartige Instanz ID", - "argument.computercraft.computer.label": "Computer name", - "argument.computercraft.unknown_computer_family": "Unbekannte computer familie '%s'", - "gui.computercraft.config.floppy_space_limit.tooltip": "Die maximale Dateisystem GrรถรŸe von Disketten (in bytes).", - "gui.computercraft.config.http.bandwidth": "Bandbreite", - "gui.computercraft.config.http.bandwidth.global_upload": "Globales upload limit", - "gui.computercraft.config.http.bandwidth.global_download.tooltip": "Die maximale Geschwindigkeit aller Computer in bytes/s mit der Heruntergeladen werden kann.\nBereich: > 1", - "gui.computercraft.config.http.bandwidth.global_download": "Globales download limit", - "gui.computercraft.config.http.bandwidth.tooltip": "Limitiert die Bandbreite der Computer.", - "argument.computercraft.computer.family": "Computer familie", - "gui.computercraft.config.execution.max_main_global_time.tooltip": "Die maximale Zeit in millisekunden, in der Aufgaben ausgefรผhrt werden.\nAnmerkung: Diese Zeit wird hรถchstwarscheinlich รผberschritten und dient nur als ungefรคhre Grenze.\nLimit: > 1", - "gui.computercraft.config.http.bandwidth.global_upload.tooltip": "Die maximale Hochladungs Geschwindigkeit aller Computer in bytes/s.\nBereich: > 1" + "upgrade.minecraft.diamond_sword.adjective": "Nahkampf" } diff --git a/projects/common/src/main/resources/assets/computercraft/lang/es_es.json b/projects/common/src/main/resources/assets/computercraft/lang/es_es.json index 2620152efc..e3f06e0be7 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/es_es.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/es_es.json @@ -1,6 +1,14 @@ { "argument.computercraft.argument_expected": "Argumento esperado", + "argument.computercraft.computer.distance": "Distancia a entidad", + "argument.computercraft.computer.family": "Familia de computadoras", + "argument.computercraft.computer.id": "ID de la computadora", + "argument.computercraft.computer.instance": "ID de instancia รบnico", + "argument.computercraft.computer.label": "Etiqueta de la computadora", "argument.computercraft.computer.many_matching": "Varias computadoras que coinciden con ' %s' (instancias %s)", + "argument.computercraft.computer.no_matching": "No hay ordenadores que coincidan con '%s'", + "argument.computercraft.tracking_field.no_field": "Campo desconocido '%s'", + "argument.computercraft.unknown_computer_family": "Familia de ordenadores desconocida '%s'", "block.computercraft.cable": "Cable de red", "block.computercraft.computer_advanced": "Ordenador avanzado", "block.computercraft.computer_command": "Ordenador de Comandos", @@ -22,31 +30,167 @@ "block.computercraft.wireless_modem_normal": "Mรณdem sin cables", "chat.computercraft.wired_modem.peripheral_connected": "El perifรฉrico \"%s\" se conectรณ a la red", "chat.computercraft.wired_modem.peripheral_disconnected": "El perifรฉrico \"%s\" se desconectรณ de la red", + "commands.computercraft.desc": "El comando /computercraft proporciona varias herramientas de depuraciรณn y administraciรณn para controlar e interactuar con computadoras.", + "commands.computercraft.dump.action": "Ver mรกs info acerca de esta computadora", + "commands.computercraft.dump.desc": "Muestra el estado de todas las computadoras o informaciรณn especรญfica sobre una computadora. Puedes especificar el id de instancia de la computadora (ej. 123), el id de la computadora (ej. #123) o su etiqueta (ej. \"@Mi computadora\").", + "commands.computercraft.dump.open_path": "Ver los archivos de esta computadora", + "commands.computercraft.dump.synopsis": "Mostrar el estado de las computadoras.", "commands.computercraft.generic.additional_rows": "%d filas adicionalesโ€ฆ", + "commands.computercraft.generic.exception": "Excepciรณn no controlada (%s)", "commands.computercraft.generic.no": "N", - "commands.computercraft.generic.no_position": "", - "commands.computercraft.generic.position": "%s, %s, %s", "commands.computercraft.generic.yes": "Y", "commands.computercraft.help.desc": "Muestra este mensaje de ayuda", + "commands.computercraft.help.no_children": "%s no tiene sub-comandos", "commands.computercraft.help.no_command": "Sin comando '%s'", + "commands.computercraft.help.synopsis": "Provee ayuda para un comando especรญfico", + "commands.computercraft.queue.desc": "Envรญa un evento computer_command a un ordenador de comandos, pasรกndole los argumentos adicionales. Esto estรก diseรฑado principalmente para los map makers, actuando como una versiรณn mรกs amigable con el ordenador de /trigger. Cualquier jugador puede ejecutar el comando, lo que probablemente se harรญa a travรฉs de un evento de clic de un componente de texto.", + "commands.computercraft.queue.synopsis": "Envรญa un evento computer_command a un ordenador de comandos", + "commands.computercraft.shutdown.desc": "Apagar las computadoras listadas o todas si ninguna se especifica. Puedes especificar el id de la instancia de la computadora (ej. 123), el id de la computadora (ej. #123) o la etiqueta (ej. \"@Mi Computadora\").", "commands.computercraft.shutdown.done": "Apague %s/%s computadoras", "commands.computercraft.shutdown.synopsis": "Apague las computadoras de forma remota.", + "commands.computercraft.synopsis": "Varios comandos para controlar computadoras.", + "commands.computercraft.tp.action": "Teletransportarse a esta computadora", + "commands.computercraft.tp.desc": "Teletransportarse a la ubicaciรณn de una computadora. Puedes especificar tanto el id de la instancia de la computadora (ej. 123) o el id de la computadora (ej. #123).", + "commands.computercraft.tp.synopsis": "Teletransportarse a una computadora especรญfica.", + "commands.computercraft.track.desc": "Seguimiento de quรฉ tanto se ejecutan las computadoras, y tambiรฉn cuรกntos eventos manejan. Esto presenta informaciรณn en una manera similar a /forge track y puede ser รบtil para diagnosticar lag.", + "commands.computercraft.track.dump.computer": "Computadora", + "commands.computercraft.track.dump.desc": "Volcar los รบltimos resultados del seguimiento de computadoras.", + "commands.computercraft.track.dump.no_timings": "No hay temporizaciones disponibles", + "commands.computercraft.track.dump.synopsis": "Volcar los รบltimos resultados de seguimiento", + "commands.computercraft.track.start.desc": "Comenzar el seguimiento de todos los tiempos y conteo de eventos de las computadoras. Esto va a descartar los resultados de ejecuciones previas.", + "commands.computercraft.track.start.stop": "Ejecute %s para detener el seguimiento y ver los resultados", + "commands.computercraft.track.start.synopsis": "Comenzar el seguimiento de todas las computadoras", + "commands.computercraft.track.stop.action": "Clic para detener el seguimiento", + "commands.computercraft.track.stop.desc": "Detener el seguimiento de todos los eventos y tiempos de ejecuciรณn de las computadoras", + "commands.computercraft.track.stop.not_enabled": "Actualmente no hay computadoras en seguimiento", + "commands.computercraft.track.stop.synopsis": "Dejar de seguir a todas las computadoras", + "commands.computercraft.track.synopsis": "Seguimiento de tiempos de ejecuciรณn para computadoras.", + "commands.computercraft.turn_on.desc": "Encender las computadoras listadas. Puedes especificar el id de la instancia de la computadora (ej. 123), el id de la computadora (ej. #123) o la etiqueta (ej. \"@Mi computadora\").", + "commands.computercraft.turn_on.done": "Encendidas %s/%s computadoras", + "commands.computercraft.turn_on.synopsis": "Encender computadoras remotamente.", + "commands.computercraft.view.action": "Ver esta computadora", + "commands.computercraft.view.desc": "Abrir la terminal de una computadora, permitiendo el control remoto de esta. Esto no proporciona acceso al inventario de tortugas. Puede tanto especificar el Id de instancia de la computadora (ej. 123) o el Id de la computadora (ej. #123).", + "commands.computercraft.view.not_player": "No se puede abrir la terminal para un no-jugador", + "commands.computercraft.view.synopsis": "Ver la terminal de una computadora", + "gui.computercraft.config.command_require_creative": "Las computadoras de comando requieren creativo", + "gui.computercraft.config.command_require_creative.tooltip": "Requiere que los jugadores estรฉn en modo creativo y sean operadores para\ninteractuar con las computadoras de comandos. Este es el comportamiento\npredeterminado para los bloques de comandos en vanilla.", "gui.computercraft.config.computer_space_limit": "Lรญmite de memoria de ordenadores (en bytes)", + "gui.computercraft.config.computer_space_limit.tooltip": "Lรญmite de espacio en disco para computadoras y tortugas, en bytes.", "gui.computercraft.config.default_computer_settings": "Configuraciรณn de Ordenador por defecto", + "gui.computercraft.config.default_computer_settings.tooltip": "Una lista separada por comas de los ajustes predeterminados para establecer en nuevas computadoras.\nEjemplo: \"shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false\"\ndeshabilitarรก todo el autocompletado.", + "gui.computercraft.config.disabled_generic_methods": "Mรฉtodos genรฉricos desactivados", + "gui.computercraft.config.disabled_generic_methods.tooltip": "Una lista de mรฉtodos genรฉricos o mรฉtodos de fuente para deshabilitar. Los\nmรฉtodos genรฉricos son mรฉtodos aรฑadidos a un bloque/block entity cuando no hay\nun proveedor de perifรฉrico explรญcito. Esto incluye mรฉtodos de inventario (ej.\ninventory.getItemDetail, inventory.pushItems), y (si estรก en Forge), los\nmรฉtodos fluid_storage y energy_storage.\nLos mรฉtodos en esta lista pueden ser tanto un grupo entero de mรฉtodos\n(computercraft:inventory) o un mรฉtodo en particular\n(computercraft:inventory#pushItems).\n", + "gui.computercraft.config.execution": "Ejecuciรณn", + "gui.computercraft.config.execution.computer_threads": "Hilos de la computadora", + "gui.computercraft.config.execution.computer_threads.tooltip": "Establece el nรบmero de hilos en los que las computadoras pueden correr. Un nรบmero\nmรกs alto significa que mรกs computadoras pueden ejecutarse a la vez, pero podrรญan\ninducir lag. Ten en cuenta que algunos mods podrรญan no funcionar con un nรบmero de\nhilos mayor a 1. Usar con precauciรณn.\nRango: > 1", + "gui.computercraft.config.execution.max_main_computer_time": "Lรญmite de tiempo de la computadora en un tick del servidor", + "gui.computercraft.config.execution.max_main_global_time": "Lรญmite de tiempo global en un tick del servidor", + "gui.computercraft.config.execution.tooltip": "Controla el comportamiento de ejecuciรณn de las computadoras. Esto es\nen gran medida destinado al control fino para servidores, y generalmente no\ndeberรญa ser cambiado.", "gui.computercraft.config.floppy_space_limit": "Lรญmite de memoria de disquetes (en bytes)", + "gui.computercraft.config.floppy_space_limit.tooltip": "El lรญmite de espacio en disco para los disquetes, en bytes.", + "gui.computercraft.config.http": "HTTP", + "gui.computercraft.config.http.bandwidth": "Ancho de banda", + "gui.computercraft.config.http.bandwidth.global_download": "Lรญmite de descarga global", + "gui.computercraft.config.http.bandwidth.global_download.tooltip": "El nรบmero de bytes que se pueden descargar por segundo. Esto es compartido para todas las computadoras. (bytes/s).\nRango: > 1", + "gui.computercraft.config.http.bandwidth.global_upload": "Lรญmite de subida global", + "gui.computercraft.config.http.bandwidth.global_upload.tooltip": "El nรบmero de bytes que se pueden subir por segundo. Esto es compartido para todas las computadoras. (bytes/s).\nRango: > 1", + "gui.computercraft.config.http.bandwidth.tooltip": "Limita el ancho de banda usado por las computadoras.", "gui.computercraft.config.http.enabled": "Habilitar API de HTTP", + "gui.computercraft.config.http.enabled.tooltip": "Habilitar la API \"http\" en computadoras. Deshabilitar esto tambiรฉn desactiva los\nprogramas \"pastebin\" y \"wget\", los cuales muchos usuarios dependen. Se recomienda\ndejar esto encendido y usar la opciรณn \"reglas\" en configuraciรณn para imponer un\ncontrol mรกs fino.", + "gui.computercraft.config.http.max_requests": "Mรกximo de solicitudes simultรกneas", + "gui.computercraft.config.http.max_requests.tooltip": "El nรบmero de solicitudes http que un equipo puede hacer a la vez. Las solicitudes\nadicionales se pondrรกn en cola, y se enviarรกn cuando las solicitudes en ejecuciรณn\nhayan finalizado. Establezca 0 para ilimitado.\nRango: > 0", + "gui.computercraft.config.http.max_websockets": "Mรกximos websockets concurrentes", + "gui.computercraft.config.http.max_websockets.tooltip": "El nรบmero de websockets que una computadora puede tener abierto\nen el mismo momento.\nRango: > 1", + "gui.computercraft.config.http.proxy": "Proxy", + "gui.computercraft.config.http.proxy.host": "Nombre del host", + "gui.computercraft.config.http.proxy.host.tooltip": "El nombre del host o la direcciรณn IP del servidor proxy.", + "gui.computercraft.config.http.proxy.port": "Puerto", + "gui.computercraft.config.http.proxy.port.tooltip": "El puerto del servidor proxy.\nRango: 1 ~ 65536", + "gui.computercraft.config.http.proxy.tooltip": "Pasa los pedidos HTTP y websocket a travรฉs de un servidor proxy. Solo afecta a las\nreglas HTTP con \"use_proxy\" puesto en verdadero (falso por defecto).\nSi se requiere autenticaciรณn para el proxy, crea un archivo\n\"computercraft-proxy.pw\" en la misma carpeta que se encuentra\n\"computercraft-server.toml\", conteniendo el nombre de usuario y contraseรฑa\nseparada por dos puntos, por ejemplo: \"miusuario:micontraseรฑa\". Para proxys\nSOCKS4 solo se requiere el nombre de usuario.", + "gui.computercraft.config.http.proxy.type": "Tipo de proxy", + "gui.computercraft.config.http.proxy.type.tooltip": "El tipo de proxy a utilizar.\nValores permitidos: HTTP, HTTPS, SOCKS4, SOCKS5", + "gui.computercraft.config.http.rules": "Reglas de permitir/denegar", + "gui.computercraft.config.http.rules.tooltip": "Una lista de reglas que controlan el comportamiento de la API \"http\" para dominios\nespecรญficos o IPs. Cada regla aplica a un hostname y un puerto opcional, y luego\nestablece varias propiedades para el pedido. Las reglas son evaluadas en orden,\nlo que quiere decir que las reglas primeras sobreescriben a las de despuรฉs.\n\nPropiedades vรกlidas:\n - \"host\" (requerido): El dominio o direcciรณn IP con el que la regla va a operar.\n Este puede ser nombre de dominio (\"pastebin.com\"), wildcard (\"*.pastebin.com\")\n o notaciรณn CIDR (\"127.0.0.0/8\").\n - \"port\" (opcional): Solo aplicar a pedidos para un puerto especรญfico, como 80\n o 443.\n - \"action\" (opcional): Permitir o denegar este pedido.\n - \"max_download\" (opcional): El tamaรฑo mรกximo (en bytes) que una computadora \n puede descargar en este pedido.\n - \"max_upload\" (opcional): El tamaรฑo mรกximo (en bytes) que una computadora puede\n subir en este pedido.\n - \"max_websocket_message\" (opcional): El tamaรฑo mรกximo (en bytes) que una\n computadora puede enviar en un paquete websocket.\n - \"use_proxy\" (opcional): Habilitar el uso de el proxy HTTP/SOCKS si estรก\n configurado.", + "gui.computercraft.config.http.tooltip": "Controla la API HTTP", + "gui.computercraft.config.http.websocket_enabled": "Habilitar websockets", + "gui.computercraft.config.http.websocket_enabled.tooltip": "Habilita el uso de websockets http. Esto requiere que la opciรณn \"http_enable\" sea verdadera.", "gui.computercraft.config.log_computer_errors": "Grabar errores perifรฉricos", + "gui.computercraft.config.log_computer_errors.tooltip": "Registra excepciones lanzadas por los perifรฉricos y otros objetos de Lua. Esto facilita\ndepurar problemas para los autores de mods, pero puede resultar en spam en el\nregistro si la gente utiliza mรฉtodos con errores potenciales.", "gui.computercraft.config.maximum_open_files": "Archivos abiertos mรกximos por cada ordenador", + "gui.computercraft.config.maximum_open_files.tooltip": "Establece cuรกntos archivos puede tener abiertos una computadora al mismo tiempo. Establezca 0 para ilimitados.\nRango: > 0", + "gui.computercraft.config.monitor_distance": "Distancia al monitor", + "gui.computercraft.config.monitor_distance.tooltip": "La distancia mรกxima a la que los monitores se renderizarรกn. El valor\npredeterminado es el lรญmite de los tile entities, pero puede ser extendido si quieres\nconstruir monitores mรกs grandes.\nRango: 16 ~ 1024", + "gui.computercraft.config.monitor_renderer": "Renderizador del monitor", + "gui.computercraft.config.monitor_renderer.tooltip": "El renderizador a usar en monitores. Generalmente esto debe estar en \"BEST\"\n(mejor) - si los monitores tienen problemas de rendimiento, podrรญas querer\nexperimentar con renderizadores alternativos.\nValores permitidos: BEST, TBO, VBO", + "gui.computercraft.config.peripheral": "Perifรฉricos", "gui.computercraft.config.peripheral.command_block_enabled": "Habilitar bloque de comandos perifรฉrico", + "gui.computercraft.config.peripheral.command_block_enabled.tooltip": "Habilitar soporte del perifรฉrico Bloque de Comandos", "gui.computercraft.config.peripheral.max_notes_per_tick": "Notas mรกximas que un ordenador puede tocar a la vez", + "gui.computercraft.config.peripheral.max_notes_per_tick.tooltip": "Cantidad mรกxima de notas que un parlante puede reproducir a la vez.\nRango: > 1", "gui.computercraft.config.peripheral.modem_high_altitude_range": "Rango del mรณdem (en altitud)", + "gui.computercraft.config.peripheral.modem_high_altitude_range.tooltip": "El rango de los Modems inalรกmbricos a mรกxima altitud en clima despejado, en metros.\nRango: 0 ~ 100000", "gui.computercraft.config.peripheral.modem_high_altitude_range_during_storm": "Rango del mรณdem (en altitud con mal tiempo)", + "gui.computercraft.config.peripheral.modem_high_altitude_range_during_storm.tooltip": "El rango de los Modems inalรกmbricos a mรกxima altitud durante las tormentas, en metros.\nRango: 0 ~ 100000", "gui.computercraft.config.peripheral.modem_range": "Rango del mรณdem (Por defecto)", + "gui.computercraft.config.peripheral.modem_range.tooltip": "El rango de los Modems inalรกmbricos a baja altitud en clima despejado, en metros.\nRango: 0 ~ 100000", "gui.computercraft.config.peripheral.modem_range_during_storm": "Rango del mรณdem (mal tiempo)", + "gui.computercraft.config.peripheral.modem_range_during_storm.tooltip": "El rango de los Modems inalรกmbricos a baja altitud durante las tormentas, en metros.\nRango: 0 ~ 100000", + "gui.computercraft.config.peripheral.monitor_bandwidth": "Ancho de banda del monitor", + "gui.computercraft.config.peripheral.monitor_bandwidth.tooltip": "El lรญmite de datos que un monitor puede enviar *por tick* Nota:\n - El ancho de banda es medido antes de la compresiรณn, asรญ que los datos enviados\n al cliente son mรกs pequeรฑos.\n - Esto ignora el nรบmero de jugadores a los que se les envรญan los paquetes.\n Actualizar un monitor para un jugador consume lo mismo que actualizarlo para\n 20.\n - Un monitor del tamaรฑo mรกs grande envรญa ~25kb de datos. Asรญ que el lรญmite\n predeterminado (1MB) permite actualizar ~40 monitores en un solo tick.\nEstablezca en 0 para desactivar.\nRango: > 0", + "gui.computercraft.config.peripheral.tooltip": "Varias opciones relacionadas con los perifรฉricos.", + "gui.computercraft.config.term_sizes": "Tamaรฑos de la terminal", + "gui.computercraft.config.term_sizes.computer": "Computadora", + "gui.computercraft.config.term_sizes.computer.height": "Altura de la terminal", + "gui.computercraft.config.term_sizes.computer.height.tooltip": "Rango: 1 ~ 255", + "gui.computercraft.config.term_sizes.computer.tooltip": "Tamaรฑo de la terminal de las computadoras.", + "gui.computercraft.config.term_sizes.computer.width": "Ancho de la terminal", + "gui.computercraft.config.term_sizes.computer.width.tooltip": "Rango: 1 ~ 255", + "gui.computercraft.config.term_sizes.monitor": "Monitor", + "gui.computercraft.config.term_sizes.monitor.height": "Altura mรกxima del monitor", + "gui.computercraft.config.term_sizes.monitor.height.tooltip": "Rango: 1 ~ 32", + "gui.computercraft.config.term_sizes.monitor.tooltip": "Tamaรฑo mรกximo de los monitores (en bloques).", + "gui.computercraft.config.term_sizes.monitor.width": "Anchura mรกxima del monitor", + "gui.computercraft.config.term_sizes.monitor.width.tooltip": "Rango: 1 ~ 32", + "gui.computercraft.config.term_sizes.pocket_computer": "Computadora de bolsillo", + "gui.computercraft.config.term_sizes.pocket_computer.height": "Altura de la terminal", + "gui.computercraft.config.term_sizes.pocket_computer.height.tooltip": "Rango: 1 ~ 255", + "gui.computercraft.config.term_sizes.pocket_computer.tooltip": "Tamaรฑo de la terminal de las computadoras de bolsillo.", + "gui.computercraft.config.term_sizes.pocket_computer.width": "Ancho de la terminal", + "gui.computercraft.config.term_sizes.pocket_computer.width.tooltip": "Rango: 1 ~ 255", + "gui.computercraft.config.term_sizes.tooltip": "Configura el tamaรฑo de las terminales de varias computadoras.\nTerminales mรกs grandes requieren mayor ancho de banda, asรญ que รบselo con cuidado.", + "gui.computercraft.config.turtle": "Tortugas", "gui.computercraft.config.turtle.advanced_fuel_limit": "Lรญmite de combustible de las tortugas avanzadas", + "gui.computercraft.config.turtle.advanced_fuel_limit.tooltip": "El lรญmite de combustible para Tortugas Avanzadas.\nRango: > 0", "gui.computercraft.config.turtle.can_push": "Las tortugas pueden empujar entidades", + "gui.computercraft.config.turtle.can_push.tooltip": "Si es verdadero, las tortugas empujarรกn a las entidades de su camino en\nlugar de detenerse si hay espacio para hacerlo.", "gui.computercraft.config.turtle.need_fuel": "Habilitar combustible", + "gui.computercraft.config.turtle.need_fuel.tooltip": "Establece si las tortugas requieren combustible para moverse.", "gui.computercraft.config.turtle.normal_fuel_limit": "Lรญmite de combustible de las tortugas", + "gui.computercraft.config.turtle.normal_fuel_limit.tooltip": "Lรญmite de combustible para las Tortugas.\nRango: > 0", + "gui.computercraft.config.turtle.tooltip": "Varias opciones relacionadas con las tortugas.", + "gui.computercraft.config.upload_max_size": "Lรญmite de tamaรฑo del archivo subido (bytes)", + "gui.computercraft.config.upload_max_size.tooltip": "El lรญmite de subida por archivo, en bytes. Debe estar en un rango de entre 1 KiB y 16 MiB.\nTen en cuenta que las subidas son procesadas en un un solo tick - archivos grandes o\nun rendimiento de internet malo puede paralizar el hilo de red. Y tamiรฉn ten en cuenta el espacio en disco!\nRango: 1024 ~ 16777216", + "gui.computercraft.config.upload_nag_delay": "Retraso de subida nag", + "gui.computercraft.config.upload_nag_delay.tooltip": "El retraso en segundos despuรฉs de los cuales notificaremos las importaciones no manejadas. Establecer en 0 para deshabilitar.\nRango: 0 ~ 60", + "gui.computercraft.pocket_computer_overlay": "Computadora de bolsillo abierta. Pulsa ESC para cerrar.", + "gui.computercraft.terminal": "Terminal de la Computadora", + "gui.computercraft.tooltip.computer_id": "ID de la Computadora: %s", + "gui.computercraft.tooltip.copy": "Copiar al portapapeles", + "gui.computercraft.tooltip.disk_id": "ID del disquete: %s", + "gui.computercraft.tooltip.terminate": "Detener el cรณdigo en ejecuciรณn", + "gui.computercraft.tooltip.terminate.key": "Mantenga Ctrl+T", + "gui.computercraft.tooltip.turn_off": "Apagar esta computadora", + "gui.computercraft.tooltip.turn_off.key": "Mantenga Ctrl+S", + "gui.computercraft.tooltip.turn_on": "Encender esta computadora", + "gui.computercraft.upload.failed": "Subida fallida", + "gui.computercraft.upload.failed.computer_off": "Debes encender la computadora antes de subir archivos.", + "gui.computercraft.upload.failed.corrupted": "Archivos corruptos al subir. Por favor, intรฉntelo de nuevo.", + "gui.computercraft.upload.failed.generic": "Error al subir archivos (%s)", + "gui.computercraft.upload.failed.name_too_long": "Los nombres de los archivos son demasiado largos para ser cargados.", + "gui.computercraft.upload.failed.too_many_files": "No se pueden subir tantos archivos.", + "gui.computercraft.upload.failed.too_much": "Tus archivos son demasiado grandes para ser subidos.", + "gui.computercraft.upload.no_response": "Transfiriendo archivos", + "gui.computercraft.upload.no_response.msg": "Tu computadora no ha usado tus archivos transferidos. Es posible que debas ejecutar el programa %s e intentar de nuevo.", "item.computercraft.disk": "Disquete", "item.computercraft.pocket_computer_advanced": "Ordenador de bolsillo avanzado", "item.computercraft.pocket_computer_advanced.upgraded": "Ordenador de bolsillo %s avanzado", @@ -56,6 +200,25 @@ "item.computercraft.printed_page": "Pรกgina impresa", "item.computercraft.printed_pages": "Pรกginas impresas", "item.computercraft.treasure_disk": "Disquete (Tesoro)", + "itemGroup.computercraft": "ComputerCraft", + "tag.item.computercraft.computer": "Computadoras", + "tag.item.computercraft.monitor": "Monitores", + "tag.item.computercraft.turtle": "Tortugas", + "tag.item.computercraft.wired_modem": "Mรณdems cableados", + "tracking_field.computercraft.avg": "%s (promedio)", + "tracking_field.computercraft.computer_tasks.name": "Tareas", + "tracking_field.computercraft.count": "%s (cuenta)", + "tracking_field.computercraft.fs.name": "Operaciones del sistema de archivos", + "tracking_field.computercraft.http_download.name": "Descarga HTTP", + "tracking_field.computercraft.http_requests.name": "Peticiones HTTP", + "tracking_field.computercraft.http_upload.name": "Subida HTTP", + "tracking_field.computercraft.java_allocation.name": "Asignaciones de Java", + "tracking_field.computercraft.max": "%s (max)", + "tracking_field.computercraft.peripheral.name": "Llamadas del perifรฉrico", + "tracking_field.computercraft.server_tasks.name": "Tareas del servidor", + "tracking_field.computercraft.turtle_ops.name": "Operaciones de la Tortuga", + "tracking_field.computercraft.websocket_incoming.name": "Websocket entrante", + "tracking_field.computercraft.websocket_outgoing.name": "Websocket saliente", "upgrade.computercraft.speaker.adjective": "ruidosa", "upgrade.computercraft.wireless_modem_advanced.adjective": "ender", "upgrade.computercraft.wireless_modem_normal.adjective": "sin cables", diff --git a/projects/common/src/main/resources/assets/computercraft/lang/fr_fr.json b/projects/common/src/main/resources/assets/computercraft/lang/fr_fr.json index f719fcc61e..ba0a20149d 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/fr_fr.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/fr_fr.json @@ -32,8 +32,6 @@ "commands.computercraft.generic.additional_rows": "%d lignes supplรฉmentairesโ€ฆ", "commands.computercraft.generic.exception": "Exception non gรฉrรฉe (%s)", "commands.computercraft.generic.no": "N", - "commands.computercraft.generic.no_position": "", - "commands.computercraft.generic.position": "%s, %s, %s", "commands.computercraft.generic.yes": "O", "commands.computercraft.help.desc": "Affiche ce message d'aide", "commands.computercraft.help.no_children": "%s n'a pas de sous-commandes", diff --git a/projects/common/src/main/resources/assets/computercraft/lang/it_it.json b/projects/common/src/main/resources/assets/computercraft/lang/it_it.json index c9ac0babcf..e328c054ca 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/it_it.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/it_it.json @@ -1,15 +1,19 @@ { "argument.computercraft.argument_expected": "รˆ previsto un argomento", + "argument.computercraft.computer.distance": "Distanza dall'entitร ", + "argument.computercraft.computer.family": "Famiglia computer", + "argument.computercraft.computer.id": "ID computer", + "argument.computercraft.computer.instance": "ID istanza unica", + "argument.computercraft.computer.label": "Etichetta computer", "argument.computercraft.computer.many_matching": "Molteplici computer che combaciano con '%s' (istanze %s)", "argument.computercraft.computer.no_matching": "Nessun computer che combacia con '%s'", "argument.computercraft.tracking_field.no_field": "Campo sconosciuto '%s'", + "argument.computercraft.unknown_computer_family": "Famiglia computer '%s' sconosciuta", "block.computercraft.cable": "Cavo Di Rete", "block.computercraft.computer_advanced": "Computer Avanzato", "block.computercraft.computer_command": "Computer Comando", - "block.computercraft.computer_normal": "Computer", "block.computercraft.disk_drive": "Lettore Di Dischi", "block.computercraft.monitor_advanced": "Monitor Avanzato", - "block.computercraft.monitor_normal": "Monitor", "block.computercraft.printer": "Stampante", "block.computercraft.speaker": "Altoparlante", "block.computercraft.turtle_advanced": "Tartaruga Avanzata", @@ -31,9 +35,6 @@ "commands.computercraft.dump.synopsis": "Mostra lo stato dei computer.", "commands.computercraft.generic.additional_rows": "%d colonne aggiuntiveโ€ฆ", "commands.computercraft.generic.exception": "Eccezione non gestita (%s)", - "commands.computercraft.generic.no": "N", - "commands.computercraft.generic.no_position": "", - "commands.computercraft.generic.position": "%s, %s, %s", "commands.computercraft.generic.yes": "S", "commands.computercraft.help.desc": "Mostra questo messaggio d'aiuto", "commands.computercraft.help.no_children": "%s non ha sottocomandi", @@ -49,7 +50,6 @@ "commands.computercraft.tp.desc": "Teletrasporta alla posizione di un computer. Puoi specificare il computer con l'instance id (e.g. 123) o con l'id (e.g. #123).", "commands.computercraft.tp.synopsis": "Teletrasporta al computer specificato.", "commands.computercraft.track.desc": "Monitora per quanto tempo i computer vengono eseguiti e quanti eventi ricevono. Questo comando fornisce le informazioni in modo simile a /forge track e puรฒ essere utile per diagnosticare il lag.", - "commands.computercraft.track.dump.computer": "Computer", "commands.computercraft.track.dump.desc": "Cancella gli ultimi risultati del monitoraggio dei computer.", "commands.computercraft.track.dump.no_timings": "No ci sono tempi disponibili", "commands.computercraft.track.dump.synopsis": "Cancella gli ultimi risultati monitorati", @@ -74,6 +74,8 @@ "gui.computercraft.config.computer_space_limit.tooltip": "Limite di spazio di archiviazione per i computer e le tartarughe, in byte.", "gui.computercraft.config.default_computer_settings": "Impostazioni Computer predefinite", "gui.computercraft.config.default_computer_settings.tooltip": "Una lista di impostazioni predefinite per i nuovi computer, separate da virgola.\nEsempio: \"shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false\"\ndisattiverร  tutti gli autocompletamenti.", + "gui.computercraft.config.disabled_generic_methods": "Metodi generici disattivati", + "gui.computercraft.config.disabled_generic_methods.tooltip": "Una lista di metodi generici o sorgenti di metodi da disattivare. I metodi generici sono\nmetodi aggiunti a blocchi/entitร  blocchi quando non c'รจ un provider della periferica esplicito.\nQuesto include metodi dell'inventario (ad es. inventory.getItemDetail, inventory.pushItems) e,\nse su Forge, i metodi fluid_storage e energy_storage.\nI metodi in questa lista possono essere sia un gruppo intero di metodi (computer:inventory)\no un singolo metodo (computer:inventory#pushItems).\n", "gui.computercraft.config.execution": "Esecuzione", "gui.computercraft.config.execution.computer_threads": "Threads computer", "gui.computercraft.config.execution.computer_threads.tooltip": "Imposta la quantitร  di thread che possono eseguire i computer. Un numero piรน alto significa\nche piรน computer possono essere eseguiti alla volta, ma puรฒ indurre a lag. Alcune mod potrebbero\nnon funzionare con numeri di thread maggiore a 1. Usare con cautela.\nRange: > 1", @@ -84,7 +86,6 @@ "gui.computercraft.config.execution.tooltip": "Controlla comportamento esecuzione dei computer. Questo รจ largamente utilizzato\nper ritoccare la performance dei server, e generale non dovrebbe essere toccato.", "gui.computercraft.config.floppy_space_limit": "Limite spazio Disco Floppy (bytes)", "gui.computercraft.config.floppy_space_limit.tooltip": "Limite di spazio di archiviazione per i dischi floppy, in byte.", - "gui.computercraft.config.http": "HTTP", "gui.computercraft.config.http.bandwidth": "Banda larga", "gui.computercraft.config.http.bandwidth.global_download": "Limite download globale", "gui.computercraft.config.http.bandwidth.global_download.tooltip": "Numero di byte che possono essere scaricati in un secondo. Questo รจ condiviso tra tutti i computer. (bytes/s).\nRange: > 1", @@ -97,7 +98,6 @@ "gui.computercraft.config.http.max_requests.tooltip": "Il numero di richieste http che un computer puรฒ fare alla volta. Ulteriori richieste\nverranno messe in coda, ed inviate quando le richieste correnti sono terminate.\nImposta a 0 per illimitato.\nRange: > 0", "gui.computercraft.config.http.max_websockets": "Connessioni websocket massime", "gui.computercraft.config.http.max_websockets.tooltip": "Il numero di websocket che un computer puรฒ avere aperte allo stesso momento.\nImposta a 0 per illimitato.\nRange: > 1", - "gui.computercraft.config.http.proxy": "Proxy", "gui.computercraft.config.http.proxy.host": "Nome host", "gui.computercraft.config.http.proxy.host.tooltip": "Il nome dell'host o l'indirizzo IP del server proxy.", "gui.computercraft.config.http.proxy.port": "Porta", @@ -135,24 +135,17 @@ "gui.computercraft.config.peripheral.monitor_bandwidth.tooltip": "Il limite di quanti dati dei monitor possono essere inviati *al tick*. Nota:\n - La banda larga รจ misurata prima della compressione, cosรฌ che il dato inviato al client รจ\n piรน piccolo.\n - Questo ignora il numero di giocatori a cui viene inviato il pacchetto. Aggiornare un monitor\n per un giocatore consuma lo stesso limite di banda larga dell'invio a 20 giocatori.\n - Un monitor alla massima grandezza invia ~25kb di dati. Quindi il valore predefinito (1MB) concede\n ~40 monitor di essere aggiornati in un singolo tick.\nImposta a 0 per disattivare.\nRange: > 0", "gui.computercraft.config.peripheral.tooltip": "Opzioni varie riguardo le periferiche.", "gui.computercraft.config.term_sizes": "Dimensioni terminale", - "gui.computercraft.config.term_sizes.computer": "Computer", "gui.computercraft.config.term_sizes.computer.height": "Altezza terminale", - "gui.computercraft.config.term_sizes.computer.height.tooltip": "Range: 1 ~ 255", "gui.computercraft.config.term_sizes.computer.tooltip": "Dimensioni del terminale dei computer.", "gui.computercraft.config.term_sizes.computer.width": "Larghezza terminale", "gui.computercraft.config.term_sizes.computer.width.tooltip": "Intervallo: 1 ~ 255", - "gui.computercraft.config.term_sizes.monitor": "Monitor", "gui.computercraft.config.term_sizes.monitor.height": "Massima altezza del monitor", - "gui.computercraft.config.term_sizes.monitor.height.tooltip": "Range: 1 ~ 32", "gui.computercraft.config.term_sizes.monitor.tooltip": "Massima grandezza dei monitor (in blocchi).", "gui.computercraft.config.term_sizes.monitor.width": "Larghezza massima del monitor", - "gui.computercraft.config.term_sizes.monitor.width.tooltip": "Range: 1 ~ 32", "gui.computercraft.config.term_sizes.pocket_computer": "Computer Tascabile", "gui.computercraft.config.term_sizes.pocket_computer.height": "Altezza terminale", - "gui.computercraft.config.term_sizes.pocket_computer.height.tooltip": "Range: 1 ~ 255", "gui.computercraft.config.term_sizes.pocket_computer.tooltip": "Dimensioni del terminale dei computer tascabili.", "gui.computercraft.config.term_sizes.pocket_computer.width": "Larghezza terminale", - "gui.computercraft.config.term_sizes.pocket_computer.width.tooltip": "Range: 1 ~ 255", "gui.computercraft.config.term_sizes.tooltip": "Configura le dimensioni dei terminali di vari computer.\nTerminali piรน grandi richiedono piรน banda larga, usa con cautela.", "gui.computercraft.config.turtle": "Tartarughe", "gui.computercraft.config.turtle.advanced_fuel_limit": "Limite carburante tartarughe avanzate", @@ -196,7 +189,10 @@ "item.computercraft.printed_page": "Pagina Stampata", "item.computercraft.printed_pages": "Pagine Stampate", "item.computercraft.treasure_disk": "Disco Floppy", - "itemGroup.computercraft": "ComputerCraft", + "tag.item.computercraft.computer": "Computer", + "tag.item.computercraft.monitor": "Monitor", + "tag.item.computercraft.turtle": "Tartarughe", + "tag.item.computercraft.wired_modem": "Modem cablati", "tracking_field.computercraft.avg": "%s (media)", "tracking_field.computercraft.computer_tasks.name": "Attivitร ", "tracking_field.computercraft.count": "%s (conta)", @@ -204,6 +200,7 @@ "tracking_field.computercraft.http_download.name": "Download HTTP", "tracking_field.computercraft.http_requests.name": "Richieste HTTP", "tracking_field.computercraft.http_upload.name": "Upload HTTP", + "tracking_field.computercraft.java_allocation.name": "Allocazioni Java", "tracking_field.computercraft.max": "%s (massimo)", "tracking_field.computercraft.peripheral.name": "Chiamate alle periferiche", "tracking_field.computercraft.server_tasks.name": "Attivitร  server", @@ -211,25 +208,10 @@ "tracking_field.computercraft.websocket_incoming.name": "Websocket in arrivo", "tracking_field.computercraft.websocket_outgoing.name": "Websocket in uscita", "upgrade.computercraft.speaker.adjective": "Rumoroso", - "upgrade.computercraft.wireless_modem_advanced.adjective": "Ender", - "upgrade.computercraft.wireless_modem_normal.adjective": "Wireless", "upgrade.minecraft.crafting_table.adjective": "Artigiana", "upgrade.minecraft.diamond_axe.adjective": "Taglialegna", "upgrade.minecraft.diamond_hoe.adjective": "Contadina", "upgrade.minecraft.diamond_pickaxe.adjective": "Minatrice", "upgrade.minecraft.diamond_shovel.adjective": "Scavatrice", - "upgrade.minecraft.diamond_sword.adjective": "Da Combattimento", - "tag.item.computercraft.computer": "Computer", - "tag.item.computercraft.wired_modem": "Modem cablati", - "argument.computercraft.computer.distance": "Distanza dall'entitร ", - "argument.computercraft.computer.family": "Famiglia computer", - "argument.computercraft.computer.id": "ID computer", - "argument.computercraft.computer.instance": "ID istanza unica", - "argument.computercraft.computer.label": "Etichetta computer", - "argument.computercraft.unknown_computer_family": "Famiglia computer '%s' sconosciuta", - "gui.computercraft.config.disabled_generic_methods": "Metodi generici disattivati", - "gui.computercraft.config.disabled_generic_methods.tooltip": "Una lista di metodi generici o sorgenti di metodi da disattivare. I metodi generici sono\nmetodi aggiunti a blocchi/entitร  blocchi quando non c'รจ un provider della periferica esplicito.\nQuesto include metodi dell'inventario (ad es. inventory.getItemDetail, inventory.pushItems) e,\nse su Forge, i metodi fluid_storage e energy_storage.\nI metodi in questa lista possono essere sia un gruppo intero di metodi (computer:inventory)\no un singolo metodo (computer:inventory#pushItems).\n", - "tag.item.computercraft.monitor": "Monitor", - "tag.item.computercraft.turtle": "Tartarughe", - "tracking_field.computercraft.java_allocation.name": "Allocazioni Java" + "upgrade.minecraft.diamond_sword.adjective": "Da Combattimento" } diff --git a/projects/common/src/main/resources/assets/computercraft/lang/ja_jp.json b/projects/common/src/main/resources/assets/computercraft/lang/ja_jp.json index eaf63c94d0..1c897fb2f8 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/ja_jp.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/ja_jp.json @@ -38,8 +38,6 @@ "commands.computercraft.generic.additional_rows": "%d่กŒใ‚’่ฟฝๅŠ โ€ฆ", "commands.computercraft.generic.exception": "ๆœชๅ‡ฆ็†ใฎไพ‹ๅค– (%s)", "commands.computercraft.generic.no": "N", - "commands.computercraft.generic.no_position": "", - "commands.computercraft.generic.position": "%s, %s, %s", "commands.computercraft.generic.yes": "Y", "commands.computercraft.help.desc": "ใ“ใฎใƒ˜ใƒซใƒ—ใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’่กจ็คบใ—ใพใ™", "commands.computercraft.help.no_children": "%s ใซใ‚ตใƒ–ใ‚ณใƒžใƒณใƒ‰ใฏใ‚ใ‚Šใพใ›ใ‚“", diff --git a/projects/common/src/main/resources/assets/computercraft/lang/ko_kr.json b/projects/common/src/main/resources/assets/computercraft/lang/ko_kr.json index db2c5071fe..dcce4feeac 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/ko_kr.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/ko_kr.json @@ -32,8 +32,6 @@ "commands.computercraft.generic.additional_rows": "%d๊ฐœ์˜ ์ถ”๊ฐ€ ํ–‰โ€ฆ", "commands.computercraft.generic.exception": "์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ (%s)", "commands.computercraft.generic.no": "N", - "commands.computercraft.generic.no_position": "", - "commands.computercraft.generic.position": "%s, %s, %s", "commands.computercraft.generic.yes": "Y", "commands.computercraft.help.desc": "์ด ๋„์›€๋ง ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.", "commands.computercraft.help.no_children": "%s์—๋Š” ํ•˜์œ„ ๋ช…๋ น์–ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.", diff --git a/projects/common/src/main/resources/assets/computercraft/lang/nb_no.json b/projects/common/src/main/resources/assets/computercraft/lang/nb_no.json index 294a6129eb..d54d002dc6 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/nb_no.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/nb_no.json @@ -10,7 +10,6 @@ "block.computercraft.disk_drive": "Diskstasjon", "block.computercraft.monitor_advanced": "Avansert Skjerm", "block.computercraft.monitor_normal": "Skjerm", - "block.computercraft.printer": "Printer", "block.computercraft.speaker": "Hรธytaler", "block.computercraft.turtle_advanced": "Avansert Skilpadde", "block.computercraft.turtle_advanced.upgraded": "Avansert %s Skilpadde", @@ -20,7 +19,6 @@ "block.computercraft.turtle_normal.upgraded_twice": "%s %s Skilpadde", "block.computercraft.wired_modem": "Kablet Modem", "block.computercraft.wired_modem_full": "Kablet Modem", - "block.computercraft.wireless_modem_advanced": "Ender Modem", "block.computercraft.wireless_modem_normal": "Trรฅdlรธst Modem", "chat.computercraft.wired_modem.peripheral_connected": "Perifer \"%s\" koblet til nettverk", "chat.computercraft.wired_modem.peripheral_disconnected": "Perifer \"%s\" koblet fra nettverk", @@ -31,9 +29,6 @@ "commands.computercraft.dump.synopsis": "Viser statusen av datamaskiner.", "commands.computercraft.generic.additional_rows": "%d flere raderโ€ฆ", "commands.computercraft.generic.exception": "Uhรฅndtert unntak (%s)", - "commands.computercraft.generic.no": "N", - "commands.computercraft.generic.no_position": "", - "commands.computercraft.generic.position": "%s, %s, %s", "commands.computercraft.generic.yes": "J", "commands.computercraft.help.desc": "Viser denne hjelpemeldingen", "commands.computercraft.help.no_children": "%s har ingen underkommandoer", @@ -69,7 +64,6 @@ "commands.computercraft.view.not_player": "Kan kun รฅpne terminal for spillere", "commands.computercraft.view.synopsis": "Vis terminal til en datamaskin.", "gui.computercraft.config.command_require_creative": "Kommando datamaskiner trenger kreativ", - "gui.computercraft.config.http": "HTTP", "gui.computercraft.config.http.enabled": "Slรฅ pรฅ HTTP APIen", "gui.computercraft.config.http.rules": "Godta/Avslรฅ regler", "gui.computercraft.config.monitor_distance": "Skjerm distanse", @@ -88,7 +82,6 @@ "gui.computercraft.terminal": "Datamaskin terminal", "gui.computercraft.tooltip.computer_id": "Datamaskin ID: %s", "gui.computercraft.tooltip.copy": "Kopier til utklippstavle", - "gui.computercraft.tooltip.disk_id": "Disk ID: %s", "gui.computercraft.tooltip.terminate": "Stopp den kjรธrende koden", "gui.computercraft.tooltip.terminate.key": "Hold Ctrl + T", "gui.computercraft.tooltip.turn_off": "Skru denne datamaskinen av", @@ -102,7 +95,6 @@ "gui.computercraft.upload.failed.too_many_files": "Kan ikke laste opp sรฅ mange filer.", "gui.computercraft.upload.failed.too_much": "Filene dine er for store for รฅ kunne bli lastet opp.", "gui.computercraft.upload.no_response": "Overfรธrer Filer", - "item.computercraft.disk": "Floppy Disk", "item.computercraft.pocket_computer_advanced": "Avansert Lomme Datamaskin", "item.computercraft.pocket_computer_advanced.upgraded": "Avansert %s Lomme Datamaskin", "item.computercraft.pocket_computer_normal": "Lomme datamaskin", @@ -110,8 +102,6 @@ "item.computercraft.printed_book": "Printet Bok", "item.computercraft.printed_page": "Printet Side", "item.computercraft.printed_pages": "Printet Sider", - "item.computercraft.treasure_disk": "Floppy Disk", - "itemGroup.computercraft": "ComputerCraft", "tracking_field.computercraft.computer_tasks.name": "Oppgaver", "tracking_field.computercraft.count": "%s (antall)", "tracking_field.computercraft.fs.name": "Filsystem operasjoner", @@ -123,7 +113,6 @@ "tracking_field.computercraft.websocket_incoming.name": "Innkommende Websocket", "tracking_field.computercraft.websocket_outgoing.name": "Utgรฅende Websocket", "upgrade.computercraft.speaker.adjective": "Hรธylydt", - "upgrade.computercraft.wireless_modem_advanced.adjective": "Ender", "upgrade.computercraft.wireless_modem_normal.adjective": "Trรฅdlรธs", "upgrade.minecraft.crafting_table.adjective": "Hรฅndverks", "upgrade.minecraft.diamond_axe.adjective": "Hoggende", diff --git a/projects/common/src/main/resources/assets/computercraft/lang/nl_nl.json b/projects/common/src/main/resources/assets/computercraft/lang/nl_nl.json index c1127468c6..acca2cfc90 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/nl_nl.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/nl_nl.json @@ -32,8 +32,6 @@ "commands.computercraft.generic.additional_rows": "%d additionele rijenโ€ฆ", "commands.computercraft.generic.exception": "Niet-afgehandelde exception (%s)", "commands.computercraft.generic.no": "N", - "commands.computercraft.generic.no_position": "", - "commands.computercraft.generic.position": "%s, %s, %s", "commands.computercraft.generic.yes": "J", "commands.computercraft.help.desc": "Geeft dit hulpbericht weer", "commands.computercraft.help.no_children": "%s heeft geen sub-commando's", diff --git a/projects/common/src/main/resources/assets/computercraft/lang/pl_pl.json b/projects/common/src/main/resources/assets/computercraft/lang/pl_pl.json index f1f645104d..b899719cdd 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/pl_pl.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/pl_pl.json @@ -19,8 +19,6 @@ "commands.computercraft.dump.desc": "Wyล›wietla status wszystkich komputerรณw lub informacje o jednym komputerze. Moลผesz wybraฤ‡ numer sesji komputera (np. 123), ID komputera (np. #123) lub jego etykietฤ™ (np. \"@Mรณj Komputer\").", "commands.computercraft.dump.open_path": "Przeglฤ…daj pliki tego komputera", "commands.computercraft.dump.synopsis": "Wyล›wietl stan komputerรณw.", - "commands.computercraft.generic.no_position": "", - "commands.computercraft.generic.position": "%s, %s, %s", "commands.computercraft.generic.yes": "T", "commands.computercraft.help.no_children": "%s nie ma pod-komend", "commands.computercraft.help.no_command": "Nie odnaleziono komendy '%s'", diff --git a/projects/common/src/main/resources/assets/computercraft/lang/pt_br.json b/projects/common/src/main/resources/assets/computercraft/lang/pt_br.json index 15ae05a885..a813aad5ab 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/pt_br.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/pt_br.json @@ -1,4 +1,14 @@ { + "argument.computercraft.argument_expected": "Argumento esperado", + "argument.computercraft.computer.distance": "Distรขncia para a entidade", + "argument.computercraft.computer.family": "Famรญlia de Computadores", + "argument.computercraft.computer.id": "ID do Computador", + "argument.computercraft.computer.instance": "ID de Instรขncia รšnica", + "argument.computercraft.computer.label": "Rรณtulo do Computador", + "argument.computercraft.computer.many_matching": "Vรกrios computadores correspondendo a '%s' (instรขncias %s)", + "argument.computercraft.computer.no_matching": "Sem computadores correspondentes a '%s'", + "argument.computercraft.tracking_field.no_field": "Campo desconhecido '%s'", + "argument.computercraft.unknown_computer_family": "Famรญlia de computador desconhecida '%s'", "block.computercraft.cable": "Cabo de Rede", "block.computercraft.computer_advanced": "Computador Avanรงado", "block.computercraft.computer_command": "Computador de Comandos", @@ -23,43 +33,166 @@ "commands.computercraft.desc": "O comando /computercraft providencia vรกrias ferramentas de depuraรงรฃo e administraรงรฃo para controle e interaรงรฃo com computadores.", "commands.computercraft.dump.action": "Ver mais informaรงรฃo sobre este computador", "commands.computercraft.dump.desc": "Mostra o status de todos os computadores ou uma informaรงรฃo especรญfica sobre um computador. Vocรช pode especificar o id de instรขncia do computador (ex.: 123), id do computador (ex.: #123) ou o rรณtulo (ex.: \"@MeuComputador\").", + "commands.computercraft.dump.open_path": "Ver arquivos deste computador", "commands.computercraft.dump.synopsis": "Mostra status de computadores.", + "commands.computercraft.generic.additional_rows": "%d linhas adicionaisโ€ฆ", + "commands.computercraft.generic.exception": "Exceรงรฃo nรฃo tratada (%s)", + "commands.computercraft.generic.no": "N", + "commands.computercraft.generic.yes": "S", "commands.computercraft.help.desc": "Mostra essa mensagem de ajuda", "commands.computercraft.help.no_children": "%s nรฃo tem sub-comandos", "commands.computercraft.help.no_command": "Comando '%s' nรฃo existe", "commands.computercraft.help.synopsis": "Providencia ajuda para um comando especรญfico", + "commands.computercraft.queue.desc": "Envie um evento computer_command para um computador de comando, passando os argumentos adicionais. Isso รฉ projetado principalmente para criadores de mapas, funcionando como uma versรฃo mais amigรกvel do computador do comando /trigger. Qualquer jogador pode executar o comando, que provavelmente serรก feito por meio do evento de clique de um componente de texto.", + "commands.computercraft.queue.synopsis": "Envie um evento computer_command para um computador de comando", "commands.computercraft.shutdown.desc": "Desliga os computadores em escuta ou todos caso nรฃo tenha sido especificado. Vocรช pode especificar o id de instรขncia do computador (ex.: 123), id do computador (ex.: #123) ou o rรณtulo (ex.: \"@MeuComputador\").", "commands.computercraft.shutdown.done": "Desliga %s/%s computadores", "commands.computercraft.shutdown.synopsis": "Desliga computadores remotamente.", "commands.computercraft.synopsis": "Vรกrios comandos para controlar computadores.", + "commands.computercraft.tp.action": "Teletransportar para este computador", + "commands.computercraft.tp.desc": "Teletransporte para a localizaรงรฃo de um computador. Vocรช pode especificar o Id da instรขncia do computador (por exemplo, 123) ou o Id do computador (por exemplo, #123).", "commands.computercraft.tp.synopsis": "Teleprota para um computador especรญfico.", + "commands.computercraft.track.desc": "Rastreie quanto tempo os computadores executam, bem como quantos eventos eles manipulam. Isso apresenta informaรงรตes de maneira semelhante ao /forge track e pode ser รบtil para diagnosticar lag.", + "commands.computercraft.track.dump.computer": "Computador", + "commands.computercraft.track.dump.desc": "Despeje os รบltimos resultados do rastreamento de computadores.", + "commands.computercraft.track.dump.no_timings": "Nenhum tempo disponรญvel", + "commands.computercraft.track.dump.synopsis": "Despeje os รบltimos resultados de rastreamento", + "commands.computercraft.track.start.desc": "Comece a rastrear os tempos de execuรงรฃo e contagens de eventos de todos os computadores. Isso descartarรก os resultados de execuรงรตes anteriores.", + "commands.computercraft.track.start.stop": "Execute %s para parar o rastreamento e visualizar os resultados", + "commands.computercraft.track.start.synopsis": "Comece a rastrear todos os computadores", + "commands.computercraft.track.stop.action": "Clique para parar o rastreamento", + "commands.computercraft.track.stop.desc": "Parar de rastrear eventos de todos os computadores e tempos de execuรงรฃo", + "commands.computercraft.track.stop.not_enabled": "Nรฃo estรก rastreando computadores", + "commands.computercraft.track.stop.synopsis": "Parar de rastrear todos os computadores", + "commands.computercraft.track.synopsis": "Acompanhe os tempos de execuรงรฃo para computadores.", "commands.computercraft.turn_on.desc": "Liga os computadores em escuta. Vocรช pode especificar o id de instรขncia do computador (ex.: 123), id do computador (ex.: #123) ou o rรณtulo (ex.: \"@MeuComputador\").", "commands.computercraft.turn_on.done": "Ligou %s/%s computadores", "commands.computercraft.turn_on.synopsis": "Liga computadores remotamente.", + "commands.computercraft.view.action": "Visualizar este computador", + "commands.computercraft.view.desc": "Abra o terminal de um computador, permitindo o controle remoto de um computador. Isso nรฃo fornece acesso aos inventรกrios das tartarugas. Vocรช pode especificar o Id da instรขncia do computador (por exemplo, 123) ou o Id do computador (por exemplo, #123).", + "commands.computercraft.view.not_player": "Nรฃo รฉ possรญvel abrir terminal para um nรฃo-jogador", + "commands.computercraft.view.synopsis": "Ver o terminal de um computador.", + "gui.computercraft.config.command_require_creative": "Computadores de comando requerem criativo", + "gui.computercraft.config.command_require_creative.tooltip": "Exigir que os jogadores estejam no modo criativo e tenham permissรตes de operador (opped) para interagir com computadores de comando. Este รฉ o comportamento padrรฃo dos blocos de comando no modo vanilla.", "gui.computercraft.config.computer_space_limit": "Limite de espaรงo dos Computadores (bytes)", + "gui.computercraft.config.computer_space_limit.tooltip": "O limite de espaรงo em disco para computadores e tartarugas, em bytes.", "gui.computercraft.config.default_computer_settings": "Configuraรงรตes padrรฃo para Computadores", + "gui.computercraft.config.default_computer_settings.tooltip": "Uma lista separada por vรญrgulas das configuraรงรตes padrรฃo do sistema a serem definidas em novos computadores. \nExemplo: \"shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false\" desativarรก todas as funcionalidades de autocompletar.", + "gui.computercraft.config.disabled_generic_methods": "Mรฉtodos genรฉricos desativados", + "gui.computercraft.config.disabled_generic_methods.tooltip": "Uma lista de mรฉtodos genรฉricos ou fontes de mรฉtodos a serem desativados. Mรฉtodos genรฉricos sรฃo aqueles adicionados a um bloco ou entidade de bloco quando nรฃo hรก um provedor de perifรฉricos explรญcito. Isso inclui mรฉtodos de inventรกrio (ou seja, inventory.getItemDetail, inventory.pushItems) e, se estiver usando Forge, os mรฉtodos fluid_storage e energy_storage. \nOs mรฉtodos nesta lista podem ser um grupo inteiro de mรฉtodos (computercraft:inventory) ou um รบnico mรฉtodo (computercraft:inventory#pushItems).\n", + "gui.computercraft.config.execution": "Execuรงรฃo", "gui.computercraft.config.execution.computer_threads": "Threads por computador", + "gui.computercraft.config.execution.computer_threads.tooltip": "Defina o nรบmero de threads que os computadores podem utilizar. Um nรบmero maior significa que mais computadores podem ser executados ao mesmo tempo, mas pode causar lag. Observe que alguns mods podem nรฃo funcionar com uma contagem de threads superior a 1. Use com cautela. \nIntervalo: > 1", + "gui.computercraft.config.execution.max_main_computer_time": "Limite de tempo do computador por tick do servidor", + "gui.computercraft.config.execution.max_main_computer_time.tooltip": "O tempo mรกximo ideal que um computador pode executar em um tick, em milissegundos. \nObserve que รฉ bastante provรกvel que ultrapassemos esse limite, pois nรฃo hรก como saber exatamente quanto tempo uma operaรงรฃo levarรก - isso visa ser o limite superior do tempo mรฉdio. \nIntervalo: > 1", + "gui.computercraft.config.execution.max_main_global_time": "Limite de tempo global por tick do servidor", + "gui.computercraft.config.execution.max_main_global_time.tooltip": "O tempo mรกximo que pode ser gasto executando tarefas em um รบnico tick, em milissegundos. \nObserve que รฉ bastante provรกvel que ultrapassemos esse limite, pois nรฃo hรก como saber exatamente quanto tempo uma operaรงรฃo levarรก - isso visa ser o limite superior do tempo mรฉdio. \nIntervalo: > 1", + "gui.computercraft.config.execution.tooltip": "Controla o comportamento de execuรงรฃo dos computadores. Isso รฉ principalmente destinado ao ajuste fino dos servidores e, geralmente, nรฃo deve ser alterado.", "gui.computercraft.config.floppy_space_limit": "Limite de espaรงo dos Disquetes (bytes)", + "gui.computercraft.config.floppy_space_limit.tooltip": "O limite de espaรงo em disco para disquete em bytes.", "gui.computercraft.config.http": "HTTP", + "gui.computercraft.config.http.bandwidth": "Largura de banda", + "gui.computercraft.config.http.bandwidth.global_download": "Limite de download global", + "gui.computercraft.config.http.bandwidth.global_download.tooltip": "O nรบmero de bytes que podem ser baixados em um segundo. Isso รฉ compartilhado entre todos os computadores. (bytes/s). \nIntervalo: > 1", + "gui.computercraft.config.http.bandwidth.global_upload": "Limite de upload global", + "gui.computercraft.config.http.bandwidth.global_upload.tooltip": "O nรบmero de bytes que podem ser enviados em um segundo. Isso รฉ compartilhado entre todos os computadores. (bytes/s). \nIntervalo: > 1", + "gui.computercraft.config.http.bandwidth.tooltip": "Limita a banda usada pelos computadores.", "gui.computercraft.config.http.enabled": "Habilitar a biblioteca de HTTP", + "gui.computercraft.config.http.enabled.tooltip": "Ative a API \"http\" nos Computadores. Desativar isso tambรฉm desativa os programas \"pastebin\" e \"wget\", dos quais muitos usuรกrios dependem. ร‰ recomendado deixar isso ativado e usar a opรงรฃo de configuraรงรฃo \"rules\" para impor um controle mais detalhado.", "gui.computercraft.config.http.max_requests": "Limite de conexรตes paralelas", + "gui.computercraft.config.http.max_requests.tooltip": "O nรบmero de solicitaรงรตes Http que um computador pode fazer ao mesmo tempo. Solicitaรงรตes adicionais serรฃo enfileiradas e enviadas quando as solicitaรงรตes em execuรงรฃo forem concluรญdas. Defina como 0 para ilimitado.\nIntervalo: > 0", "gui.computercraft.config.http.max_websockets": "Limite de conexรตes websocket", + "gui.computercraft.config.http.max_websockets.tooltip": "O nรบmero de websockets que um computador pode ter abertos ao mesmo tempo.\nIntervalo: > 1", + "gui.computercraft.config.http.proxy": "Proxy", + "gui.computercraft.config.http.proxy.host": "Nome de host", + "gui.computercraft.config.http.proxy.host.tooltip": "O nome do host ou endereรงo IP do servidor proxy.", + "gui.computercraft.config.http.proxy.port": "Porta", + "gui.computercraft.config.http.proxy.port.tooltip": "A porta do servidor proxy.\nIntervalo: 1 ~ 65536", + "gui.computercraft.config.http.proxy.tooltip": "Tunรฉis de solicitaรงรตes HTTP e websocket atravรฉs de um servidor proxy. Afeta apenas as regras HTTP com \"use_proxy\" definido como verdadeiro (desligado por padrรฃo). Se a autenticaรงรฃo for necessรกria para o proxy, crie um arquivo \"computercraft-proxy.pw\" no mesmo diretรณrio que \"computercraft-server.toml\", contendo o nome de usuรกrio e a senha separados por dois pontos, por exemplo, \"meuusuario:minhasenha\". Para proxies SOCKS4, apenas o nome de usuรกrio รฉ necessรกrio.", + "gui.computercraft.config.http.proxy.type": "Tipo de proxy", + "gui.computercraft.config.http.proxy.type.tooltip": "O tipo de proxy para usar.\nValores permitidos: HTTP, HTTPS, SOCKS4, SOCKS5", + "gui.computercraft.config.http.rules": "Regras Permitir/Negar", + "gui.computercraft.config.http.rules.tooltip": "Uma lista de regras que controlam o comportamento da API \"http\" para domรญnios ou IPs especรญficos. Cada regra corresponde a um nome de host e uma porta opcional, e entรฃo define vรกrias propriedades para a solicitaรงรฃo. As regras sรฃo avaliadas em ordem, o que significa que regras anteriores sobrescrevem as posteriores.\n\nPropriedades vรกlidas:\n- \"host\" (obrigatรณrio): O domรญnio ou endereรงo IP que esta regra corresponde. Isso pode ser um nome de domรญnio (\"pastebin.com\"), um curinga (\"*.pastebin.com\") ou notaรงรฃo CIDR (\"127.0.0.0/8\").\n- \"port\" (opcional): Corresponder apenas a solicitaรงรตes para uma porta especรญfica, como 80 ou 443.\n\n- \"action\" (opcional): Se permitir ou negar esta solicitaรงรฃo.\n- \"max_download\" (opcional): O tamanho mรกximo (em bytes) que um computador pode baixar nesta solicitaรงรฃo.\n- \"max_upload\" (opcional): O tamanho mรกximo (em bytes) que um computador pode enviar em uma solicitaรงรฃo.\n- \"max_websocket_message\" (opcional): O tamanho mรกximo (em bytes) que um computador pode enviar ou receber em um pacote websocket.\n- \"use_proxy\" (opcional): Habilitar o uso do proxy HTTP/SOCKS se estiver configurado.", + "gui.computercraft.config.http.tooltip": "Controla a API HTTP", "gui.computercraft.config.http.websocket_enabled": "Habilitar websockets", + "gui.computercraft.config.http.websocket_enabled.tooltip": "Habilitar o uso de websockets Http. Isso requer que a opรงรฃo \"http_enable\" tambรฉm esteja definida como verdadeira.", "gui.computercraft.config.log_computer_errors": "Registrar erros de computadores", + "gui.computercraft.config.log_computer_errors.tooltip": "Registrar exceรงรตes lanรงadas por perifรฉricos e outros objetos Lua. Isso facilita a depuraรงรฃo de problemas para os autores de mods, mas pode resultar em excesso de registros caso as pessoas utilizem mรฉtodos com falhas.", "gui.computercraft.config.maximum_open_files": "Nรบmero mรกximo de arquivos em um computador", + "gui.computercraft.config.maximum_open_files.tooltip": "Defina quantos arquivos um computador pode ter aberto ao mesmo tempo. Defina como 0 para ilimitado.\nIntervalo: > 0", + "gui.computercraft.config.monitor_distance": "Distรขncia do monitor", + "gui.computercraft.config.monitor_distance.tooltip": "A distรขncia mรกxima que os monitores renderizarรฃo. Isso padrรฃo รฉ o limite padrรฃo de entidades de tile, mas pode ser estendido se vocรช desejar construir monitores maiores. \nIntervalo: 16 ~ 1024", + "gui.computercraft.config.monitor_renderer": "Renderizador do monitor", + "gui.computercraft.config.monitor_renderer.tooltip": "O renderizador a ser utilizado para os monitores. Geralmente, isso deve ser mantido em \"best\" - se os monitores apresentarem problemas de desempenho, vocรช pode querer experimentar renderizadores alternativos. \nValores Permitidos: BEST, TBO, VBO", "gui.computercraft.config.peripheral": "Perifรฉricos", "gui.computercraft.config.peripheral.command_block_enabled": "Habilitar perifรฉrico do bloco de comando", + "gui.computercraft.config.peripheral.command_block_enabled.tooltip": "Habilitar perifรฉrico do bloco de comando", "gui.computercraft.config.peripheral.max_notes_per_tick": "Nรบmero de notas que um computador pode tocar simultรขneamente", + "gui.computercraft.config.peripheral.max_notes_per_tick.tooltip": "Quantidade mรกxima de notas que um alto-falante pode jogar de uma vez.\nIntervalo: > 1", "gui.computercraft.config.peripheral.modem_high_altitude_range": "Alcance do modem (altitude elevada)", + "gui.computercraft.config.peripheral.modem_high_altitude_range.tooltip": "O intervalo de Modems Sem Fio a altitude mรกxima em tempo limpo, em metros.\nIntervalo: 0 ~ 100000", "gui.computercraft.config.peripheral.modem_high_altitude_range_during_storm": "Alcance do modem (altitude elevada, clima ruim)", + "gui.computercraft.config.peripheral.modem_high_altitude_range_during_storm.tooltip": "O intervalo de Modems Sem Fio ร  altitude mรกxima em clima tempestuoso, em metros.\nIntervalo: 0 ~ 100000", "gui.computercraft.config.peripheral.modem_range": "Alcance do modem (padrรฃo)", + "gui.computercraft.config.peripheral.modem_range.tooltip": "O alcance de Modems Sem Fio a baixa altitude em clima limpo, em metros.\nIntervalo: 0 ~ 100000", "gui.computercraft.config.peripheral.modem_range_during_storm": "Alcance do modem (clima ruim)", + "gui.computercraft.config.peripheral.modem_range_during_storm.tooltip": "A variedade de Modems Sem Fio a baixa altitude em clima tempestuoso, em metros.\nIntervalo: 0 ~ 100000", + "gui.computercraft.config.peripheral.monitor_bandwidth": "Monitorar banda", + "gui.computercraft.config.peripheral.monitor_bandwidth.tooltip": "O limite de quanta informaรงรฃo de monitor pode ser enviada *por tick*. Nota:\n- A largura de banda รฉ medida antes da compressรฃo, entรฃo os dados enviados ao cliente sรฃo menores.\n- Isso ignora o nรบmero de jogadores para os quais um pacote รฉ enviado. Atualizar um monitor para um jogador consome o mesmo limite de largura de banda que enviar para 20.\n- Um monitor de tamanho completo envia ~25kb de dados. Portanto, o padrรฃo (1MB) permite que ~40 monitores sejam atualizados em um รบnico tick. \nDefina como 0 para desativar. \nIntervalo: > 0", + "gui.computercraft.config.peripheral.tooltip": "Vรกrias opรงรตes relacionadas com os perifรฉricos.", + "gui.computercraft.config.term_sizes": "Tamanhos do terminal", + "gui.computercraft.config.term_sizes.computer": "Computador", + "gui.computercraft.config.term_sizes.computer.height": "Altura do terminal", + "gui.computercraft.config.term_sizes.computer.height.tooltip": "Intervalo: 1 ~ 255", + "gui.computercraft.config.term_sizes.computer.tooltip": "Tamanho do terminal dos computadores portรกtil.", + "gui.computercraft.config.term_sizes.computer.width": "Largura do terminal", + "gui.computercraft.config.term_sizes.computer.width.tooltip": "Intervalo: 1 ~ 255", + "gui.computercraft.config.term_sizes.monitor": "Monitor", + "gui.computercraft.config.term_sizes.monitor.height": "Altura mรกxima da monitor", + "gui.computercraft.config.term_sizes.monitor.height.tooltip": "Intervalo: 1 ~ 32", + "gui.computercraft.config.term_sizes.monitor.tooltip": "Tamanho mรกximo de monitores (em blocos).", + "gui.computercraft.config.term_sizes.monitor.width": "Largura mรกxima do monitor", + "gui.computercraft.config.term_sizes.monitor.width.tooltip": "Intervalo: 1 ~ 32", + "gui.computercraft.config.term_sizes.pocket_computer": "Computador Portรกtil", + "gui.computercraft.config.term_sizes.pocket_computer.height": "Altura do terminal", + "gui.computercraft.config.term_sizes.pocket_computer.height.tooltip": "Intervalo: 1 ~ 255", + "gui.computercraft.config.term_sizes.pocket_computer.tooltip": "Tamanho do terminal dos computadores portรกtil.", + "gui.computercraft.config.term_sizes.pocket_computer.width": "Largura do terminal", + "gui.computercraft.config.term_sizes.pocket_computer.width.tooltip": "Intervalo: 1 ~ 255", + "gui.computercraft.config.term_sizes.tooltip": "Configure o tamanho dos terminais de vรกrios computadores. Terminais maiores exigem mais largura de banda, portanto, use com cuidado.", "gui.computercraft.config.turtle": "Tartarugas", "gui.computercraft.config.turtle.advanced_fuel_limit": "Limite de combustรญvel de Tartarugas Avanรงadas", + "gui.computercraft.config.turtle.advanced_fuel_limit.tooltip": "O limite de combustรญvel para Advanced Turtles. \nIntervalo: > 0", "gui.computercraft.config.turtle.can_push": "Tartarugas podem empurrar entidades", + "gui.computercraft.config.turtle.can_push.tooltip": "Se definido como verdadeiro, as Tartarugas empurrarรฃo entidades para o lado em vez de parar, caso haja espaรงo para isso.", "gui.computercraft.config.turtle.need_fuel": "Habilitar combustรญvel", + "gui.computercraft.config.turtle.need_fuel.tooltip": "Defina se as tartarugas requerem combustรญvel para se mover.", "gui.computercraft.config.turtle.normal_fuel_limit": "Limite de combustรญvel de Tartarugas", + "gui.computercraft.config.turtle.normal_fuel_limit.tooltip": "O limite de combustรญvel para Advanced Turtles. \nIntervalo: > 0", + "gui.computercraft.config.turtle.tooltip": "Vรกrias opรงรตes relacionadas ร s Tartarugas.", + "gui.computercraft.config.upload_max_size": "Tamanho mรกximo para upload de arquivos (bytes)", + "gui.computercraft.config.upload_max_size.tooltip": "O limite de tamanho de upload de arquivos, em bytes. Deve estar na faixa de 1 KiB a 16 MiB. \nTenha em mente que os uploads sรฃo processados em um รบnico tick - arquivos grandes ou desempenho de rede ruim podem travar a thread de rede. E cuidado com o espaรงo em disco! \nIntervalo: 1024 ~ 16777216", + "gui.computercraft.config.upload_nag_delay": "Atraso de notificaรงรฃo de upload", + "gui.computercraft.config.upload_nag_delay.tooltip": "O atraso em segundos apรณs o qual seremos notificados sobre importaรงรตes nรฃo tratadas. Defina como 0 para desabilitar. \nIntervalo: 0 ~ 60", + "gui.computercraft.pocket_computer_overlay": "Computador portรกtil aberto. Pressione ESC para fechar.", + "gui.computercraft.terminal": "Terminal do Computador", + "gui.computercraft.tooltip.computer_id": "ID do Computador: %s", "gui.computercraft.tooltip.copy": "Copiar para a รกrea de transferรชncia", + "gui.computercraft.tooltip.disk_id": "ID do Disco: %s", + "gui.computercraft.tooltip.terminate": "Parar o cรณdigo atualmente em execuรงรฃo", + "gui.computercraft.tooltip.terminate.key": "Segure Ctrl+T", + "gui.computercraft.tooltip.turn_off": "Desligar este computador", + "gui.computercraft.tooltip.turn_off.key": "Segure Ctrl+S", + "gui.computercraft.tooltip.turn_on": "Ligar este computador", + "gui.computercraft.upload.failed": "Falha no Upload", + "gui.computercraft.upload.failed.computer_off": "Vocรช deve ligar o computador antes de fazer o upload de arquivos.", + "gui.computercraft.upload.failed.corrupted": "Arquivos corrompidos ao dar upload. Por favor, tente novamente.", + "gui.computercraft.upload.failed.generic": "Upload de arquivos falhou (%s)", + "gui.computercraft.upload.failed.name_too_long": "Nomes de arquivos sรฃo muito longos para dar upload.", + "gui.computercraft.upload.failed.too_many_files": "Nรฃo รฉ possรญvel dar upload nesta quantidade de arquivos.", + "gui.computercraft.upload.failed.too_much": "Seus arquivos sรฃo muito grandes para dar upload.", + "gui.computercraft.upload.no_response": "Transferindo Arquivos", + "gui.computercraft.upload.no_response.msg": "Seu computador nรฃo usou os arquivos transferidos. Vocรช pode precisar executar o programa %s e tentar novamente.", "item.computercraft.disk": "Disquete", "item.computercraft.pocket_computer_advanced": "Computador Portรกtil Avanรงado", "item.computercraft.pocket_computer_advanced.upgraded": "Computador Portรกtil Avanรงado %s", @@ -69,6 +202,25 @@ "item.computercraft.printed_page": "Pรกgina Impressa", "item.computercraft.printed_pages": "Pรกginas Impressas", "item.computercraft.treasure_disk": "Disquete", + "itemGroup.computercraft": "ComputerCraft", + "tag.item.computercraft.computer": "Computadores", + "tag.item.computercraft.monitor": "Monitores", + "tag.item.computercraft.turtle": "Tartarugas", + "tag.item.computercraft.wired_modem": "Modems com Fio", + "tracking_field.computercraft.avg": "%s (mรฉdia)", + "tracking_field.computercraft.computer_tasks.name": "Tarefas", + "tracking_field.computercraft.count": "%s (contagem)", + "tracking_field.computercraft.fs.name": "Operaรงรตes de sistema", + "tracking_field.computercraft.http_download.name": "Download HTTP", + "tracking_field.computercraft.http_requests.name": "Solicitaรงรตes HTTP", + "tracking_field.computercraft.http_upload.name": "Upload de HTTP", + "tracking_field.computercraft.java_allocation.name": "Alocaรงรตes Java", + "tracking_field.computercraft.max": "%s (mรกximo)", + "tracking_field.computercraft.peripheral.name": "Chamadas Perifรฉricas", + "tracking_field.computercraft.server_tasks.name": "Tarefas do servidor", + "tracking_field.computercraft.turtle_ops.name": "Operaรงรตes de tartaruga", + "tracking_field.computercraft.websocket_incoming.name": "Entrada do Websocket", + "tracking_field.computercraft.websocket_outgoing.name": "Saรญda do Websocket", "upgrade.computercraft.speaker.adjective": "(Alto-Falante)", "upgrade.computercraft.wireless_modem_advanced.adjective": "Ender", "upgrade.computercraft.wireless_modem_normal.adjective": "sem Fio", diff --git a/projects/common/src/main/resources/assets/computercraft/lang/ru_ru.json b/projects/common/src/main/resources/assets/computercraft/lang/ru_ru.json index c777127cf8..aa1e11a868 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/ru_ru.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/ru_ru.json @@ -32,8 +32,6 @@ "commands.computercraft.generic.additional_rows": "%d ะดะพะฟะพะปะฝะธั‚ะตะปัŒะฝั‹ั… ัั‚ั€ะพะบ โ€ฆ", "commands.computercraft.generic.exception": "ะะตะพะฑั€ะฐะฑะพั‚ะฐะฝะฝะพะต ะธัะบะปัŽั‡ะตะฝะธะต (%s)", "commands.computercraft.generic.no": "N", - "commands.computercraft.generic.no_position": "<ะฝะตั‚ ะฟะพะทะธั†ะธะธ>", - "commands.computercraft.generic.position": "%s, %s, %s", "commands.computercraft.generic.yes": "Y", "commands.computercraft.help.desc": "ะžั‚ะพะฑั€ะฐะถะฐะตั‚ ัั‚ะพ ัะพะพะฑั‰ะตะฝะธะต ัะฟั€ะฐะฒะบะธ", "commands.computercraft.help.no_children": "%s ะฝะต ะธะผะตะตั‚ ะฟะพะดะบะพะผะฐะฝะด", diff --git a/projects/common/src/main/resources/assets/computercraft/lang/sv_se.json b/projects/common/src/main/resources/assets/computercraft/lang/sv_se.json index 94c9583ff6..04fd86b5b9 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/sv_se.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/sv_se.json @@ -32,8 +32,6 @@ "commands.computercraft.generic.additional_rows": "%d ytterligare raderโ€ฆ", "commands.computercraft.generic.exception": "Ohanterat felfall (%s)", "commands.computercraft.generic.no": "N", - "commands.computercraft.generic.no_position": "", - "commands.computercraft.generic.position": "%s, %s, %s", "commands.computercraft.generic.yes": "J", "commands.computercraft.help.desc": "Visa detta hjรคlpmeddelande", "commands.computercraft.help.no_children": "%s har inget underkommando", diff --git a/projects/common/src/main/resources/assets/computercraft/lang/tok.json b/projects/common/src/main/resources/assets/computercraft/lang/tok.json index 8d32734ae0..c48d065f2f 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/tok.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/tok.json @@ -31,8 +31,6 @@ "commands.computercraft.dump.synopsis": "mi pana e sona pi ilo sona.", "commands.computercraft.generic.additional_rows": "mute %dโ€ฆ", "commands.computercraft.generic.exception": "pakala awen ala (%s)", - "commands.computercraft.generic.no_position": "", - "commands.computercraft.generic.position": "%s, %s, %s", "commands.computercraft.help.desc": "mi pana e toki ni", "commands.computercraft.help.no_children": "toki wawa '%s' li jo ala e toki wawa insa", "commands.computercraft.help.no_command": "toki wawa '%s' li lon ala", diff --git a/projects/common/src/main/resources/assets/computercraft/lang/tr_tr.json b/projects/common/src/main/resources/assets/computercraft/lang/tr_tr.json new file mode 100644 index 0000000000..2973b84d2f --- /dev/null +++ b/projects/common/src/main/resources/assets/computercraft/lang/tr_tr.json @@ -0,0 +1,233 @@ +{ + "argument.computercraft.argument_expected": "Beklenen Argรผman", + "argument.computercraft.computer.distance": "VarlฤฑฤŸa olan mesafe", + "argument.computercraft.computer.family": "Bilgisayar ailesi", + "argument.computercraft.computer.id": "Bilgisayar KimliฤŸi", + "argument.computercraft.computer.instance": "EลŸsiz oluลŸum kimliฤŸi", + "argument.computercraft.computer.label": "Bilgisayar etiketi", + "argument.computercraft.computer.many_matching": "'%s' ile birden fazla bilgisayar eลŸleลŸiyor (%s oluลŸumlarฤฑ)", + "argument.computercraft.computer.no_matching": "'%s' ile eลŸleลŸen bilgisayar yok", + "argument.computercraft.tracking_field.no_field": "Bilinmeyen alan '%s'", + "argument.computercraft.unknown_computer_family": "Bilinmeyen bilgisayar ailesi '%s'", + "block.computercraft.cable": "AฤŸ Kablosu", + "block.computercraft.computer_advanced": "GeliลŸmiลŸ Bilgisayar", + "block.computercraft.computer_command": "Komut Bilgisayarฤฑ", + "block.computercraft.computer_normal": "Bilgisayar", + "block.computercraft.disk_drive": "Disk Sรผrรผcรผsรผ", + "block.computercraft.monitor_advanced": "GeliลŸmiลŸ Monitรถr", + "block.computercraft.monitor_normal": "Monitรถr", + "block.computercraft.printer": "Yazฤฑcฤฑ", + "block.computercraft.speaker": "Hoparlรถr", + "block.computercraft.turtle_advanced": "GeliลŸmiลŸ Turtle", + "block.computercraft.turtle_advanced.upgraded": "GeliลŸmiลŸ %s Turtle", + "block.computercraft.turtle_advanced.upgraded_twice": "GeliลŸmiลŸ %s %s Turtle", + "block.computercraft.turtle_normal": "Turtle", + "block.computercraft.turtle_normal.upgraded": "%s Turtle", + "block.computercraft.turtle_normal.upgraded_twice": "%s %s Turtle", + "block.computercraft.wired_modem": "Kablolu Modem", + "block.computercraft.wired_modem_full": "Kablolu Modem", + "block.computercraft.wireless_modem_advanced": "Ender Modemi", + "block.computercraft.wireless_modem_normal": "Kablosuz Modem", + "chat.computercraft.wired_modem.peripheral_connected": "ร‡evre birimi \"%s\" aฤŸa baฤŸlandฤฑ", + "chat.computercraft.wired_modem.peripheral_disconnected": "ร‡evre birimi \"%s\" aฤŸdan koptu", + "commands.computercraft.desc": "/computercraft komutu, bilgisayar kontrolรผ ve etkileลŸimi iรงin รงeลŸitli hata ayฤฑklama ve yรถnetici araรงlarฤฑ saฤŸlar.", + "commands.computercraft.dump.action": "Bu bilgisayar hakkฤฑnda daha fazla bilgi gรถrรผntรผle", + "commands.computercraft.dump.desc": "Tรผm bilgisayarlarฤฑn durumunu veya bir bilgisayara รถzgรผ bilgileri gรถster. Bilgisayarฤฑn oluลŸum kimliฤŸini (รถrn. 123), bilgisayar kimliฤŸini (รถrn. #123) ya da etiketini (รถrn. \"@Bilgisayarฤฑm\") belirtebilirsiniz.", + "commands.computercraft.dump.open_path": "Bu bilgisayarฤฑn dosyalarฤฑnฤฑ gรถrรผntรผle", + "commands.computercraft.dump.synopsis": "Bilgisayarlarฤฑn durumunu gรถster.", + "commands.computercraft.generic.additional_rows": "Fazladan %d satฤฑrโ€ฆ", + "commands.computercraft.generic.exception": "Beklenmeyen durum (%s)", + "commands.computercraft.generic.no": "N", + "commands.computercraft.generic.yes": "Y", + "commands.computercraft.help.desc": "Bu yardฤฑm mesajฤฑnฤฑ gรถsterir", + "commands.computercraft.help.no_children": "%s, hiรงbir alt komuta sahip deฤŸil", + "commands.computercraft.help.no_command": "'%s' gibi bir komut yok", + "commands.computercraft.help.synopsis": "Belirli bir komut hakkฤฑnda yardฤฑm gรถster", + "commands.computercraft.queue.desc": "Bir komut bilgisayarฤฑna ek argรผmanlarฤฑ da girerek bir computer_command olayฤฑ gรถnder. Bu esasen harita yapฤฑmcฤฑlarฤฑ iรงin tasarlanmฤฑลŸtฤฑr ve /trigger komutunun daha bilgisayar dostu bir versiyonu olarak iลŸlev gรถrรผr. Bu komut herhangi bir oyuncu tarafฤฑndan รงalฤฑลŸtฤฑrฤฑlabilir, bu da bรผyรผk ihtimalle bir metin bileลŸeninin tฤฑklama olayฤฑ ile olur.", + "commands.computercraft.queue.synopsis": "Bir komut bilgisayarฤฑna computer_command olayฤฑ gรถnder", + "commands.computercraft.shutdown.desc": "Listelenen bilgisayarlarฤฑ veya hiรงbiri belirtilmemiลŸse tรผmรผnรผ kapat. Bilgisayarฤฑn oluลŸum kimliฤŸini (รถrn. 123), bilgisayar kimliฤŸini (รถrn. #123) ya da etiketini (รถrn. \"@Bilgisayarฤฑm\") belirtebilirsiniz.", + "commands.computercraft.shutdown.done": "%s/%s bilgisayar kapatฤฑldฤฑ", + "commands.computercraft.shutdown.synopsis": "Bilgisayarlarฤฑ uzaktan kapat.", + "commands.computercraft.synopsis": "Bilgisayarlarฤฑ kontrol etmek iรงin รงeลŸitli komutlar.", + "commands.computercraft.tp.action": "Bu bilgisayara ฤฑลŸฤฑnla", + "commands.computercraft.tp.desc": "Bir bilgisayarฤฑn konumuna ฤฑลŸฤฑnla. Bilgisayarฤฑn oluลŸum kimliฤŸini (รถrn. 123) ya da bilgisayar kimliฤŸini (รถrn. #123) belirtebilirsiniz.", + "commands.computercraft.tp.synopsis": "Belirli bir bilgisayara ฤฑลŸฤฑnla.", + "commands.computercraft.track.desc": "Bilgisayarlarฤฑn ne kadar sรผre รงalฤฑลŸtฤฑฤŸฤฑnฤฑ ve kaรง olay iลŸlediฤŸini izlemeye al. Bu, /forge track komutuna benzer ลŸekilde bilgi sunar ve gecikmeyi tanฤฑlamaya yardฤฑmcฤฑ olabilir.", + "commands.computercraft.track.dump.computer": "Bilgisayar", + "commands.computercraft.track.dump.desc": "Bilgisayar izlemenin en son sonuรง dรถkรผmรผnรผ gรถster.", + "commands.computercraft.track.dump.no_timings": "Hiรงbir zamanlama mevcut deฤŸil", + "commands.computercraft.track.dump.synopsis": "En son izleme sonuรง dรถkรผmรผnรผ gรถster", + "commands.computercraft.track.start.desc": "Tรผm bilgisayarlarฤฑn yรผrรผtme sรผrelerini ve olay sayฤฑlarฤฑnฤฑ izlemeye baลŸla. Bu, รถnceki รงalฤฑลŸtฤฑrmalarฤฑn sonuรงlarฤฑnฤฑ silecektir.", + "commands.computercraft.track.start.stop": "%s ile izlemeyi durdur ve sonuรงlarฤฑ gรถrรผntรผle", + "commands.computercraft.track.start.synopsis": "Tรผm bilgisayarlarฤฑ izlemeye baลŸla", + "commands.computercraft.track.stop.action": "ฤฐzlemeyi durdurmak iรงin tฤฑkla", + "commands.computercraft.track.stop.desc": "Tรผm bilgisayarlarฤฑn yรผrรผtme sรผrelerini ve olaylarฤฑnฤฑ izlemeyi durdur", + "commands.computercraft.track.stop.not_enabled": "ลžu anda hiรงbir bilgisayar izlenmiyor", + "commands.computercraft.track.stop.synopsis": "Tรผm bilgisayarlarฤฑ izlemeyi durdur", + "commands.computercraft.track.synopsis": "Bilgisayarlarฤฑn yรผrรผtme sรผrelerini izlemeye al.", + "commands.computercraft.turn_on.desc": "Listelenen bilgisayarlarฤฑ aรง. Bilgisayarฤฑn oluลŸum kimliฤŸini (รถrn. 123), bilgisayar kimliฤŸini (รถrn. #123) ya da etiketini (รถrn. \"@Bilgisayarฤฑm\") belirtebilirsiniz.", + "commands.computercraft.turn_on.done": "%s/%s bilgisayar aรงฤฑldฤฑ", + "commands.computercraft.turn_on.synopsis": "Bilgisayarlarฤฑ uzaktan aรง.", + "commands.computercraft.view.action": "Bu bilgisayarฤฑ gรถrรผntรผle", + "commands.computercraft.view.desc": "Bir bilgisayarฤฑn terminalini aรง ve uzaktan kontrole izin ver. Bununla Turtle envanterlerine eriลŸilemez. Bilgisayarฤฑn oluลŸum kimliฤŸini (รถrn. 123) ya da bilgisayar kimliฤŸini (รถrn. #123) belirtebilirsiniz.", + "commands.computercraft.view.not_player": "Oyuncu olmayanlar iรงin terminal aรงฤฑlamaz", + "commands.computercraft.view.synopsis": "Bir bilgisayarฤฑn terminalini gรถrรผntรผle.", + "gui.computercraft.config.command_require_creative": "Komut bilgisayarlarฤฑ yaratฤฑcฤฑ modu gerektirir", + "gui.computercraft.config.command_require_creative.tooltip": "Oyuncularฤฑn komut bilgisayarฤฑyla etkileลŸime girebilmesi iรงin yaratฤฑcฤฑ modda\nve yetkili olmalarฤฑnฤฑ gerektir. Bu, vanilla Komut bloklarฤฑ iรงin varsayฤฑlan davranฤฑลŸtฤฑr.", + "gui.computercraft.config.computer_space_limit": "Bilgisayar alan sฤฑnฤฑrฤฑ (bayt)", + "gui.computercraft.config.computer_space_limit.tooltip": "Bilgisayar ve Turtle iรงin bayt cinsinden disk alanฤฑ sฤฑnฤฑrฤฑ.", + "gui.computercraft.config.default_computer_settings": "Varsayฤฑlan Bilgisayar ayarlarฤฑ", + "gui.computercraft.config.default_computer_settings.tooltip": "Yeni bilgisayarlarda kullanฤฑlacak varsayฤฑlan sistem ayarlarฤฑnฤฑn virgรผlle ayrฤฑlmฤฑลŸ listesi.\nร–rnek: \"shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false\"\ntรผm otomatik tamamlamayฤฑ devre dฤฑลŸฤฑ bฤฑrakacaktฤฑr.", + "gui.computercraft.config.disabled_generic_methods": "Devre dฤฑลŸฤฑ bฤฑrakฤฑlmฤฑลŸ genelleyici fonksiyonlar", + "gui.computercraft.config.disabled_generic_methods.tooltip": "Devre dฤฑลŸฤฑ bฤฑrakฤฑlacak genelleyici fonksiyonlarฤฑn veya fonksiyon kaynaklarฤฑnฤฑn\nbir listesi. Genelleyici fonksiyonlar (generic methods), bir bloฤŸa/blok varlฤฑฤŸฤฑna\nbariz bir รงevre birimi saฤŸlayฤฑcฤฑ yok ise eklenen fonksiyonlardฤฑr. Bu,\nenvanter fonksiyonlarฤฑnฤฑ (yani inventory.getItemDetail, inventory.pushItems)\nve (Forge'da ise) fluid_storage ve energy_storage fonksiyonlarฤฑnฤฑ iรงerir.\nBu listedeki fonksiyonlar ya tรผm bir fonksiyon grubu (computercraft:inventory)\nya da tek bir fonksiyon (computercraft:inventory#pushItems) olabilir.\n", + "gui.computercraft.config.execution": "Yรผrรผtme", + "gui.computercraft.config.execution.computer_threads": "Bilgisayar iลŸ parรงacฤฑklarฤฑ", + "gui.computercraft.config.execution.computer_threads.tooltip": "Bilgisayarlarฤฑn รงalฤฑลŸabileceฤŸi iลŸ parรงacฤฑฤŸฤฑ sayฤฑsฤฑnฤฑ ayarla. Yรผksek sayฤฑlar, aynฤฑ anda\ndaha fazla bilgisayarฤฑn รงalฤฑลŸabileceฤŸi anlamฤฑna gelir, ancak gecikmeye neden olabilir. \nLรผtfen bazฤฑ modlarฤฑn 1'den fazla iลŸ parรงacฤฑฤŸฤฑ ile รงalฤฑลŸamayacaฤŸฤฑnฤฑ unutmayฤฑn. \nDikkatli kullanฤฑn.\nAralฤฑk: > 1", + "gui.computercraft.config.execution.max_main_computer_time": "Sunucu tik bilgisayar zaman sฤฑnฤฑrฤฑ", + "gui.computercraft.config.execution.max_main_computer_time.tooltip": "Milisaniye cinsinden, bilgisayarฤฑn bir tik iรงinde yรผrรผtebileceฤŸi ideal maksimum sรผre.\nUnutmayฤฑn, ne kadar sรผreceฤŸini sรถylemenin bir yolu olmadฤฑฤŸฤฑ iรงin bรผyรผk olasฤฑlฤฑkla\nbu sฤฑnฤฑrฤฑ aลŸacaฤŸฤฑz - bu, ortalama sรผrenin รผst sฤฑnฤฑrฤฑ olmayฤฑ\namaรงlamaktadฤฑr.\nAralฤฑk: > 1", + "gui.computercraft.config.execution.max_main_global_time": "Sunucu tik genel zaman sฤฑnฤฑrฤฑ", + "gui.computercraft.config.execution.max_main_global_time.tooltip": "Milisaniye cinsinden, tek bir tikte gรถrevleri yรผrรผtmek iรงin harcanabilecek\nmaksimum sรผre.\nUnutmayฤฑn, ne kadar sรผreceฤŸini sรถylemenin bir yolu olmadฤฑฤŸฤฑ iรงin bรผyรผk\nolasฤฑlฤฑkla bu sฤฑnฤฑrฤฑ aลŸacaฤŸฤฑz - bu, ortalama sรผrenin รผst sฤฑnฤฑrฤฑ olmayฤฑ\namaรงlamaktadฤฑr.\nAralฤฑk: > 1", + "gui.computercraft.config.execution.tooltip": "Bilgisayarlarฤฑn yรผrรผtme davranฤฑลŸฤฑnฤฑ kontrol eder. Bu, bรผyรผk รถlรงรผde sunuculara\nince ayar yapmak iรงin tasarlanmฤฑลŸtฤฑr ve genellikle dokunulmasฤฑ gerekmez.", + "gui.computercraft.config.floppy_space_limit": "Disket alan sฤฑnฤฑrฤฑ (bayt)", + "gui.computercraft.config.floppy_space_limit.tooltip": "Disketler iรงin bayt cinsinden disk alanฤฑ sฤฑnฤฑrฤฑ.", + "gui.computercraft.config.http": "HTTP", + "gui.computercraft.config.http.bandwidth": "Bant GeniลŸliฤŸi", + "gui.computercraft.config.http.bandwidth.global_download": "Genel indirme sฤฑnฤฑrฤฑ", + "gui.computercraft.config.http.bandwidth.global_download.tooltip": "Bir saniye iรงinde indirilebilecek bayt sayฤฑsฤฑ. Bu tรผm bilgisayarlar arasฤฑnda paylaลŸฤฑlฤฑr. (bayt/s).\nAralฤฑk: > 1", + "gui.computercraft.config.http.bandwidth.global_upload": "Genel yรผkleme sฤฑnฤฑrฤฑ", + "gui.computercraft.config.http.bandwidth.global_upload.tooltip": "Bir saniye iรงinde yรผklenebilecek bayt sayฤฑsฤฑ. Bu tรผm bilgisayarlar arasฤฑnda paylaลŸฤฑlฤฑr. (bayt/s).\nAralฤฑk: > 1", + "gui.computercraft.config.http.bandwidth.tooltip": "Bilgisayarlar tarafฤฑndan kullanฤฑlan bant geniลŸliฤŸini sฤฑnฤฑrlar.", + "gui.computercraft.config.http.enabled": "HTTP API'sini etkinleลŸtir", + "gui.computercraft.config.http.enabled.tooltip": "Bilgisayarlarda \"http\" API'sini etkinleลŸtir. Bunu devre dฤฑลŸฤฑ bฤฑrakmak, birรงok kullanฤฑcฤฑnฤฑn gรผvendiฤŸi \"pastebin\" ve\n\"wget\" programlarฤฑnฤฑ da devre dฤฑลŸฤฑ bฤฑrakฤฑr. Bunu aรงฤฑk bฤฑrakmanฤฑz ve daha ayrฤฑntฤฑlฤฑ denetim uygulamak iรงin\n\"rules\" yapฤฑlandฤฑrma seรงeneฤŸini kullanmanฤฑz รถnerilir.", + "gui.computercraft.config.http.max_requests": "Maksimum eลŸzamanlฤฑ istekler", + "gui.computercraft.config.http.max_requests.tooltip": "Bir bilgisayarฤฑn tek seferde yapabileceฤŸi http isteฤŸi sayฤฑsฤฑ. Ek istekler\nkuyruฤŸa alฤฑnacak ve รงalฤฑลŸan istekler bittiฤŸinde gรถnderilecektir. Sฤฑnฤฑrsฤฑz iรงin\n0 olarak ayarla.\nAralฤฑk: > 0", + "gui.computercraft.config.http.max_websockets": "Maksimum eลŸzamanlฤฑ websocketleri", + "gui.computercraft.config.http.max_websockets.tooltip": "Bir bilgisayarฤฑn tek seferde aรงฤฑk tutabileceฤŸi websocket sayฤฑsฤฑ.\nAralฤฑk: > 1", + "gui.computercraft.config.http.proxy": "Vekil sunucu", + "gui.computercraft.config.http.proxy.host": "Ana bilgisayar adฤฑ", + "gui.computercraft.config.http.proxy.host.tooltip": "Proxy sunucusunun ana bilgisayar adฤฑ veya IP adresi.", + "gui.computercraft.config.http.proxy.port": "Port", + "gui.computercraft.config.http.proxy.port.tooltip": "Proxy sunucusunun portu.\nAralฤฑk: 1 ~ 65536", + "gui.computercraft.config.http.proxy.tooltip": "HTTP ve websocket isteklerini bir proxy sunucusu รผzerinden aktarฤฑr. Yalnฤฑzca \n\"use_proxy\" olan HTTP kurallarฤฑnฤฑ etkiler, true olarak ayarla (varsayฤฑlan\nolarak kapalฤฑdฤฑr).\nProxy iรงin kimlik doฤŸrulamasฤฑ gerekiyorsa, \"computercraft-server.toml\" ile\naynฤฑ dizinde, iki nokta รผst รผste ile ayrฤฑlmฤฑลŸ kullanฤฑcฤฑ adฤฑ ve parolayฤฑ iรงeren\nbir \"computercraft-proxy.pw\" dosyasฤฑ oluลŸtur. รถrn. \"myuser:mypassword\".\nSOCKS4 proxy'leri iรงin yalnฤฑzca kullanฤฑcฤฑ adฤฑ gereklidir.", + "gui.computercraft.config.http.proxy.type": "Proxy tรผrรผ", + "gui.computercraft.config.http.proxy.type.tooltip": "Kullanฤฑlacak proxy tรผrรผ.\nฤฐzin Verilen DeฤŸerler: HTTP, HTTPS, SOCKS4, SOCKS5", + "gui.computercraft.config.http.rules": "Kurallara izin ver/reddet", + "gui.computercraft.config.http.rules.tooltip": "Belirli alan adlarฤฑ veya IP'ler iรงin \"http\" API davranฤฑลŸฤฑnฤฑ denetleyen\nkurallar listesi. Her kural bir ana bilgisayar adฤฑ ve isteฤŸe baฤŸlฤฑ bir port ile\neลŸleลŸir ve ardฤฑndan istek iรงin รงeลŸitli รถzellikler ayarlar. Kurallar sฤฑrayla\ndeฤŸerlendirilir, yani รถnceki kurallar sonrakileri geรงersiz kฤฑlar.\n\nGeรงerli รถzellikler:\n - \"host\" (gerekli): Bu kuralฤฑn eลŸleลŸtiฤŸi alan adฤฑ veya IP adresi. Bu bir alan adฤฑ olabilir\n (\"pastebin.com\"), wildcard (\"*.pastebin.com\") ya da CIDR gรถsterimi (\"127.0.0.0/8\").\n - \"port\" (isteฤŸe baฤŸlฤฑ): Belirli bir porta yรถnelik istekleri eลŸleลŸtir\n80 veya 443 gibi\n\n - \"action\" (isteฤŸe baฤŸlฤฑ): Bu isteฤŸe izin verilip verilmeyeceฤŸi veya\nreddedilip reddedilmeyeceฤŸi.\n - \"max_download\" (isteฤŸe baฤŸlฤฑ): Bir bilgisayarฤฑn bu istekte indirebileceฤŸi\nmaksimum boyut (bayt cinsinden).\n - \"max_upload\" (isteฤŸe baฤŸlฤฑ): Bir bilgisayarฤฑn bu istekte yรผkleyebileceฤŸi\nmaksimum boyut (bayt cinsinden).\n - \"max_websocket_message\" (isteฤŸe baฤŸlฤฑ): Bir bilgisayarฤฑn bir websocket\npaketinde gรถnderebileceฤŸi veya alabileceฤŸi maksimum boyut (bayt cinsinden).\n - \"use_proxy\" (isteฤŸe baฤŸlฤฑ): YapฤฑlandฤฑrฤฑlmฤฑลŸsa HTTP/SOCKS proxy'sinin kullanฤฑmฤฑnฤฑ etkinleลŸtir.", + "gui.computercraft.config.http.tooltip": "HTTP API'sini kontrol eder", + "gui.computercraft.config.http.websocket_enabled": "Websocket'leri etkinleลŸtir", + "gui.computercraft.config.http.websocket_enabled.tooltip": "Http websocket kullanฤฑmฤฑnฤฑ etkinleลŸtir. Bunun iรงin \"http_enable\" seรงeneฤŸinin de true olmasฤฑ gerekir.", + "gui.computercraft.config.log_computer_errors": "Bilgisayar hatalarฤฑnฤฑ gรผnlรผฤŸe kaydet", + "gui.computercraft.config.log_computer_errors.tooltip": "ร‡evre birimleri ve diฤŸer Lua nesneleri tarafฤฑndan atฤฑlan istisnalarฤฑ\ngรผnlรผฤŸe kaydet. Bu, mod yapฤฑmcฤฑlarฤฑnฤฑn sorunlarฤฑ ayฤฑklamasฤฑnฤฑ kolaylaลŸtฤฑrฤฑr\nancak insanlarฤฑn hatalฤฑ yรถntemler kullanmasฤฑ durumunda gรผnlรผk spam'ฤฑna neden\nolabilir.", + "gui.computercraft.config.maximum_open_files": "Bilgisayar baลŸฤฑna maksimum aรงฤฑk dosya", + "gui.computercraft.config.maximum_open_files.tooltip": "Bir bilgisayarda aynฤฑ anda kaรง dosyanฤฑn aรงฤฑk olabileceฤŸini ayarla. Sฤฑnฤฑrsฤฑz iรงin 0 olarak ayarla.\nAralฤฑk: > 0", + "gui.computercraft.config.monitor_distance": "Monitรถr mesafesi", + "gui.computercraft.config.monitor_distance.tooltip": "Monitรถrlerin gรถrรผntรผ oluลŸturacaฤŸฤฑ maksimum mesafe. Bu, varsayฤฑlan olarak\nstandart tile entity sฤฑnฤฑrฤฑdฤฑr, ancak daha bรผyรผk monitรถrler oluลŸturmak\nisterseniz geniลŸletilebilir.\nAralฤฑk: 16 ~ 1024", + "gui.computercraft.config.monitor_renderer": "Monitรถr oluลŸturucu", + "gui.computercraft.config.monitor_renderer.tooltip": "Monitรถrler iรงin kullanฤฑlacak oluลŸturucu. Genellikle bu \"best\" deฤŸerinde\ntutulmalฤฑdฤฑr - monitรถrlerde performans sorunlarฤฑ varsa, alternatif oluลŸturucularฤฑ\ndenemek isteyebilirsiniz.\nฤฐzin Verilen DeฤŸerler: BEST, TBO, VBO", + "gui.computercraft.config.peripheral": "ร‡evre birimleri", + "gui.computercraft.config.peripheral.command_block_enabled": "Komut bloฤŸu รงevresel birimini etkinleลŸtir", + "gui.computercraft.config.peripheral.command_block_enabled.tooltip": "Komut BloฤŸu รงevre birimi desteฤŸini etkinleลŸtir", + "gui.computercraft.config.peripheral.max_notes_per_tick": "Bir bilgisayarฤฑn aynฤฑ anda รงalabileceฤŸi maksimum nota sayฤฑsฤฑ", + "gui.computercraft.config.peripheral.max_notes_per_tick.tooltip": "Bir hoparlรถrรผn aynฤฑ anda รงalabileceฤŸi maksimum nota miktarฤฑ.\nAralฤฑk: > 1", + "gui.computercraft.config.peripheral.modem_high_altitude_range": "Modem menzili (yรผksek irtifa)", + "gui.computercraft.config.peripheral.modem_high_altitude_range.tooltip": "Kablosuz Modemlerin aรงฤฑk havada maksimum irtifadaki menzili, metre cinsinden.\nAralฤฑk: 0 ~ 100000", + "gui.computercraft.config.peripheral.modem_high_altitude_range_during_storm": "Modem menzili (yรผksek irtifa, kรถtรผ hava koลŸullarฤฑ)", + "gui.computercraft.config.peripheral.modem_high_altitude_range_during_storm.tooltip": "Kablosuz Modemlerin fฤฑrtฤฑnalฤฑ havalarda maksimum irtifadaki menzili, metre cinsinden.\nAralฤฑk: 0 ~ 100000", + "gui.computercraft.config.peripheral.modem_range": "Modem menzili (varsayฤฑlan)", + "gui.computercraft.config.peripheral.modem_range.tooltip": "Kablosuz Modemlerin aรงฤฑk havada alรงak irtifadaki menzili, metre cinsinden.\nAralฤฑk: 0 ~ 100000", + "gui.computercraft.config.peripheral.modem_range_during_storm": "Modem menzili (kรถtรผ hava koลŸullarฤฑ)", + "gui.computercraft.config.peripheral.modem_range_during_storm.tooltip": "Kablosuz Modemlerin fฤฑrtฤฑnalฤฑ havalarda alรงak irtifadaki menzili, metre cinsinden.\nAralฤฑk: 0 ~ 100000", + "gui.computercraft.config.peripheral.monitor_bandwidth": "Monitรถr bant geniลŸliฤŸi", + "gui.computercraft.config.peripheral.monitor_bandwidth.tooltip": "Tik baลŸฤฑna* ne kadar monitรถr verisi gรถnderilebileceฤŸinin sฤฑnฤฑrฤฑ. Not:\n - Bant geniลŸliฤŸi sฤฑkฤฑลŸtฤฑrmadan รถnce รถlรงรผlรผr, bu nedenle istemciye gรถnderilen veriler\n daha kรผรงรผktรผr.\n - Bu, bir paketin gรถnderildiฤŸi oyuncu sayฤฑsฤฑnฤฑ gรถz ardฤฑ eder. Bir oyuncu iรงin bir\nmonitรถrรผ gรผncellemek, 20 oyuncuya gรถndermekle aynฤฑ bant geniลŸliฤŸi sฤฑnฤฑrฤฑnฤฑ tรผketir.\n - Tam boyutlu bir monitรถr ~25kb veri gรถnderir. Dolayฤฑsฤฑyla varsayฤฑlan deฤŸer (1MB)\ntek bir tikte ~40 monitรถrรผn gรผncellenmesine izin verir.\nDevre dฤฑลŸฤฑ bฤฑrakmak iรงin 0 olarak ayarla.\nAralฤฑk: > 0", + "gui.computercraft.config.peripheral.tooltip": "ร‡evre birimlerine iliลŸkin รงeลŸitli seรงenekler.", + "gui.computercraft.config.term_sizes": "Terminal boyutlarฤฑ", + "gui.computercraft.config.term_sizes.computer": "Bilgisayar", + "gui.computercraft.config.term_sizes.computer.height": "Terminal yรผksekliฤŸi", + "gui.computercraft.config.term_sizes.computer.height.tooltip": "Aralฤฑk: 1 ~ 255", + "gui.computercraft.config.term_sizes.computer.tooltip": "Bilgisayarlarฤฑn terminal boyutu.", + "gui.computercraft.config.term_sizes.computer.width": "Terminal geniลŸliฤŸi", + "gui.computercraft.config.term_sizes.computer.width.tooltip": "Aralฤฑk: 1 ~ 255", + "gui.computercraft.config.term_sizes.monitor": "Monitรถr", + "gui.computercraft.config.term_sizes.monitor.height": "Maks monitรถr yรผksekliฤŸi", + "gui.computercraft.config.term_sizes.monitor.height.tooltip": "Aralฤฑk: 1 ~ 32", + "gui.computercraft.config.term_sizes.monitor.tooltip": "Maksimum monitรถr boyutu (blok olarak).", + "gui.computercraft.config.term_sizes.monitor.width": "Maks monitรถr geniลŸliฤŸi", + "gui.computercraft.config.term_sizes.monitor.width.tooltip": "Aralฤฑk: 1 ~ 32", + "gui.computercraft.config.term_sizes.pocket_computer": "Cep Bilgisayarฤฑ", + "gui.computercraft.config.term_sizes.pocket_computer.height": "Terminal yรผksekliฤŸi", + "gui.computercraft.config.term_sizes.pocket_computer.height.tooltip": "Aralฤฑk: 1 ~ 255", + "gui.computercraft.config.term_sizes.pocket_computer.tooltip": "Cep bilgisayarlarฤฑnฤฑn terminal boyutu.", + "gui.computercraft.config.term_sizes.pocket_computer.width": "Terminal geniลŸliฤŸi", + "gui.computercraft.config.term_sizes.pocket_computer.width.tooltip": "Aralฤฑk: 1 ~ 255", + "gui.computercraft.config.term_sizes.tooltip": "ร‡eลŸitli bilgisayar terminallerinin boyutunu yapฤฑlandฤฑr.\nDaha bรผyรผk terminaller daha fazla bant geniลŸliฤŸi gerektirir, bu nedenle dikkatli\nkullanฤฑn.", + "gui.computercraft.config.turtle": "KaplumbaฤŸalar", + "gui.computercraft.config.turtle.advanced_fuel_limit": "GeliลŸmiลŸ KaplumbaฤŸa yakฤฑt limiti", + "gui.computercraft.config.turtle.advanced_fuel_limit.tooltip": "GeliลŸmiลŸ KaplumbaฤŸalarฤฑn yakฤฑt limiti.\nAralฤฑk: > 0", + "gui.computercraft.config.turtle.can_push": "KaplumbaฤŸalar varlฤฑklarฤฑ itebilir", + "gui.computercraft.config.turtle.can_push.tooltip": "true olarak ayarlanฤฑrsa, KaplumbaฤŸalar yer varsa durmak yerine varlฤฑklarฤฑ yolun\ndฤฑลŸฤฑna iter.", + "gui.computercraft.config.turtle.need_fuel": "Yakฤฑtฤฑ etkinleลŸtir", + "gui.computercraft.config.turtle.need_fuel.tooltip": "KaplumbaฤŸalarฤฑn hareket etmek iรงin yakฤฑta ihtiyaรง duyup duymadฤฑฤŸฤฑnฤฑ ayarla.", + "gui.computercraft.config.turtle.normal_fuel_limit": "KaplumbaฤŸa yakฤฑt limiti", + "gui.computercraft.config.turtle.normal_fuel_limit.tooltip": "KaplumbaฤŸalarฤฑn yakฤฑt limiti.\nAralฤฑk: > 0", + "gui.computercraft.config.turtle.tooltip": "KaplumbaฤŸalarla ilgili รงeลŸitli seรงenekler.", + "gui.computercraft.config.upload_max_size": "Dosya yรผkleme boyut sฤฑnฤฑrฤฑ (bayt)", + "gui.computercraft.config.upload_max_size.tooltip": "Bayt cinsinden dosya yรผkleme boyut sฤฑnฤฑrฤฑ. 1 KiB ve 16 MiB aralฤฑฤŸฤฑnda olmalฤฑdฤฑr.\nYรผklemelerin tek bir tikte iลŸlendiฤŸini unutmayฤฑn - bรผyรผk dosyalar veya dรผลŸรผk aฤŸ\nperformansฤฑ aฤŸ iลŸ parรงacฤฑฤŸฤฑnฤฑ bekletebilir. Ve disk alanฤฑna dikkat edin!\nAralฤฑk: 1024 ~ 16777216", + "gui.computercraft.config.upload_nag_delay": "Yรผkleme nag gecikmesi", + "gui.computercraft.config.upload_nag_delay.tooltip": "Beklenmeyen iรงe aktarmalar hakkฤฑnda bildirimde bulunacaฤŸฤฑmฤฑz saniye cinsinden gecikme. Devre dฤฑลŸฤฑ bฤฑrakmak iรงin 0 olarak ayarla.\nAralฤฑk: 0 ~ 60", + "gui.computercraft.pocket_computer_overlay": "Cep bilgisayarฤฑ aรงฤฑk. Kapatmak iรงin ESC tuลŸuna basฤฑn.", + "gui.computercraft.terminal": "Bilgisayar terminali", + "gui.computercraft.tooltip.computer_id": "Bilgisayar KimliฤŸi: %s", + "gui.computercraft.tooltip.copy": "Panoya kopyala", + "gui.computercraft.tooltip.disk_id": "Disk KimliฤŸi: %s", + "gui.computercraft.tooltip.terminate": "ร‡alฤฑลŸmakta olan kodu durdur", + "gui.computercraft.tooltip.terminate.key": "Ctrl+T tuลŸlarฤฑnฤฑ basฤฑlฤฑ tut", + "gui.computercraft.tooltip.turn_off": "Bu bilgisayarฤฑ kapat", + "gui.computercraft.tooltip.turn_off.key": "Ctrl+S tuลŸlarฤฑnฤฑ basฤฑlฤฑ tut", + "gui.computercraft.tooltip.turn_on": "Bu bilgisayarฤฑ aรง", + "gui.computercraft.upload.failed": "KarลŸฤฑya Yรผkleme BaลŸarฤฑsฤฑz", + "gui.computercraft.upload.failed.computer_off": "Dosyalarฤฑ yรผklemeden รถnce bilgisayarฤฑ aรงmalฤฑsฤฑnฤฑz.", + "gui.computercraft.upload.failed.corrupted": "Dosyalar karลŸฤฑya yรผklenirken bozuldu. Lรผtfen tekrar deneyin.", + "gui.computercraft.upload.failed.generic": "Dosya yรผkleme baลŸarฤฑsฤฑz (%s)", + "gui.computercraft.upload.failed.name_too_long": "Dosya adlarฤฑ karลŸฤฑya yรผkleme iรงin fazla uzun.", + "gui.computercraft.upload.failed.too_many_files": "Bu kadar รงok dosya karลŸฤฑya yรผklenemez.", + "gui.computercraft.upload.failed.too_much": "Dosyalarฤฑnฤฑzฤฑn boyutu karลŸฤฑya yรผkleme iรงin fazla bรผyรผk.", + "gui.computercraft.upload.no_response": "Dosyalar Aktarฤฑlฤฑyor", + "gui.computercraft.upload.no_response.msg": "Bilgisayarฤฑnฤฑz aktarฤฑlan dosyalarฤฑnฤฑzฤฑ kullanmadฤฑ. %s programฤฑnฤฑ รงalฤฑลŸtฤฑrฤฑp tekrar denemeniz gerekebilir.", + "item.computercraft.disk": "Disket", + "item.computercraft.pocket_computer_advanced": "GeliลŸmiลŸ Cep Bilgisayarฤฑ", + "item.computercraft.pocket_computer_advanced.upgraded": "GeliลŸmiลŸ %s Cep Bilgisayarฤฑ", + "item.computercraft.pocket_computer_normal": "Cep Bilgisayarฤฑ", + "item.computercraft.pocket_computer_normal.upgraded": "%s Cep Bilgisayarฤฑ", + "item.computercraft.printed_book": "YazdฤฑrฤฑlmฤฑลŸ Kitap", + "item.computercraft.printed_page": "YazdฤฑrฤฑlmฤฑลŸ Sayfa", + "item.computercraft.printed_pages": "YazdฤฑrฤฑlmฤฑลŸ Sayfalar", + "item.computercraft.treasure_disk": "Disket", + "itemGroup.computercraft": "ComputerCraft", + "tag.item.computercraft.computer": "Bilgisayarlar", + "tag.item.computercraft.monitor": "Monitรถrler", + "tag.item.computercraft.turtle": "Turtlelar", + "tag.item.computercraft.wired_modem": "Kablolu modemler", + "tracking_field.computercraft.avg": "%s (ort.)", + "tracking_field.computercraft.computer_tasks.name": "Gรถrevler", + "tracking_field.computercraft.count": "%s (sayฤฑ)", + "tracking_field.computercraft.fs.name": "Dosya sistemi iลŸlemleri", + "tracking_field.computercraft.http_download.name": "HTTP indirme", + "tracking_field.computercraft.http_requests.name": "HTTP istekleri", + "tracking_field.computercraft.http_upload.name": "HTTP yรผkleme", + "tracking_field.computercraft.java_allocation.name": "Java'ya Ayrฤฑlan", + "tracking_field.computercraft.max": "%s (azami)", + "tracking_field.computercraft.peripheral.name": "ร‡evre birimi รงaฤŸrฤฑlarฤฑ", + "tracking_field.computercraft.server_tasks.name": "Sunucu gรถrevleri", + "tracking_field.computercraft.turtle_ops.name": "Turtle iลŸlemleri", + "tracking_field.computercraft.websocket_incoming.name": "Websocket gelen", + "tracking_field.computercraft.websocket_outgoing.name": "Websocket giden", + "upgrade.computercraft.speaker.adjective": "Sesli", + "upgrade.computercraft.wireless_modem_advanced.adjective": "Enderli", + "upgrade.computercraft.wireless_modem_normal.adjective": "Kablosuz", + "upgrade.minecraft.crafting_table.adjective": "รœretken", + "upgrade.minecraft.diamond_axe.adjective": "AฤŸaรง Kesen", + "upgrade.minecraft.diamond_hoe.adjective": "ร‡iftรงi", + "upgrade.minecraft.diamond_pickaxe.adjective": "Madenci", + "upgrade.minecraft.diamond_shovel.adjective": "Kazฤฑcฤฑ", + "upgrade.minecraft.diamond_sword.adjective": "DรถvรผลŸรงรผ" +} diff --git a/projects/common/src/main/resources/assets/computercraft/lang/uk_ua.json b/projects/common/src/main/resources/assets/computercraft/lang/uk_ua.json index efea67c236..8aad479d8d 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/uk_ua.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/uk_ua.json @@ -32,8 +32,6 @@ "commands.computercraft.generic.additional_rows": "%d ะดะพะดะฐั‚ะบะพะฒะธั… ั€ัะดะบั–ะฒ โ€ฆ", "commands.computercraft.generic.exception": "ะะตะพะฑั€ะพะฑะปะตะฝะธะน ะฒะธะฝัั‚ะพะบ (%s)", "commands.computercraft.generic.no": "N", - "commands.computercraft.generic.no_position": "<ะฝะตะผะฐั” ะฟะพะทะธั†ั–ั—>", - "commands.computercraft.generic.position": "%s, %s, %s", "commands.computercraft.generic.yes": "Y", "commands.computercraft.help.desc": "ะŸะพะบะฐะทัƒั” ั†ะต ะฟะพะฒั–ะดะพะผะปะตะฝะฝั ะดะพะฒั–ะดะบะธ", "commands.computercraft.help.no_children": "%s ะฝะต ะผะฐั” ะฟั–ะดะบะพะผะฐะฝะด", @@ -74,6 +72,7 @@ "gui.computercraft.config.computer_space_limit.tooltip": "ะžะฑะผะตะถะตะฝะฝั ะฝะฐ ะทะฐะนะผะฐั”ะผะต ะผั–ัั†ะต ะฝะฐ ะดะธัะบัƒ ะบะพะผะฟ'ัŽั‚ะตั€ะฐะผะธ ั‚ะฐ ั‡ะตั€ะตะฟะฐั…ะฐะผะธ, ะฒ ะฑะฐะนั‚ะฐั….", "gui.computercraft.config.default_computer_settings": "ะะฐะปะฐัˆั‚ัƒะฒะฐะฝะฝั ะบะพะผะฟ'ัŽั‚ะตั€ะฐ ะทะฐ ะทะฐะผะพะฒั‡ัƒะฒะฐะฝะฝัะผ", "gui.computercraft.config.default_computer_settings.tooltip": "ะกะฟะธัะพะบ ะปะฐัˆะฐั‚ัƒะฒะฐะฝัŒ ะทะฐ ะทะฐะผะพะฒั‡ัƒะฒะฐะฝะฝัะผ, ั€ะพะทะดั–ะปะตะฝะธั… ะบะพะผะพัŽ, ั‰ะพ ะฑัƒะดัƒั‚ัŒ ะฝะฐัˆะฐะปั‚ะพะฒะฐะฝั– ะฝะฐ ะฝะพะฒะธั… ะบะพะผะฟ'ัŽั‚ะตั€ะฐั…\nะะฐะฟั€ะธะบะปะฐะด: \"shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false\"\nะฒั–ะดะบะปัŽั‡ะธั‚ัŒ ัƒัั– ะฐะฒั‚ะพะดะพะฟะพะฒะฝะตะฝะฝั.", + "gui.computercraft.config.disabled_generic_methods.tooltip": "ะกะฟะธัะพะบ ะทะฐะณะฐะปัŒะฝะธั… ะผะตั‚ะพะดั–ะฒ ะฐะฑะพ ะดะถะตั€ะตะป ะผะตั‚ะพะดั–ะฒ, ัะบั– ัะปั–ะด ะฒะธะผะบะฝัƒั‚ะธ. ะ—ะฐะณะฐะปัŒะฝั– ะผะตั‚ะพะดะธ - ั†ะต ะผะตั‚ะพะดะธ, ะดะพะดะฐะฝั– ะดะพ ะฑะปะพะบัƒ/ััƒั‚ะฝะพัั‚ั– ะฑะปะพะบัƒ, ะบะพะปะธ ะฝะตะผะฐั” ัะฒะฝะพะณะพ ะฟะพัั‚ะฐั‡ะฐะปัŒะฝะธะบะฐ ะฟะตั€ะธั„ะตั€ั–ั—. ะ”ะพ ะฝะธั… ะฝะฐะปะตะถะฐั‚ัŒ ะผะตั‚ะพะดะธ ั–ะฝะฒะตะฝั‚ะฐั€ะธะทะฐั†ั–ั— (ะฝะฐะฟั€ะธะบะปะฐะด, inventory.getItemDetail, inventory.pushItems), ะฐ ั‚ะฐะบะพะถ (ัะบั‰ะพ ะฝะฐ Forge), ะผะตั‚ะพะดะธ fluid_storage ั‚ะฐ energy_storage.\nะœะตั‚ะพะดะธ ัƒ ั†ัŒะพะผัƒ ัะฟะธัะบัƒ ะผะพะถัƒั‚ัŒ ะฑัƒั‚ะธ ัะบ ั†ั–ะปะพัŽ ะณั€ัƒะฟะพัŽ ะผะตั‚ะพะดั–ะฒ (computercraft:inventory),\nั‚ะฐะบ ั– ะพะดะฝะธะผ ะผะตั‚ะพะดะพะผ (computercraft:inventory#pushItems).\n", "gui.computercraft.config.execution": "ะ’ะธะบะพะฝะฐะฝะฝั", "gui.computercraft.config.execution.computer_threads": "ะŸะพั‚ะพะบะธ ะดะปั ะบะพะผะฟ'ัŽั‚ะตั€ั–ะฒ", "gui.computercraft.config.execution.computer_threads.tooltip": "ะ’ัั‚ะฐะฝะพะฒะปัŽั” ะบั–ะปัŒะบั–ัั‚ัŒ ะฟะพั‚ะพะบั–ะฒ, ะฝะฐ ัะบะธั… ะทะฐะฟัƒัะบะฐัŽั‚ัŒัั ะบะพะผะฟ'ัŽั‚ะตั€ะธ. ะ‘ั–ะปัŒัˆะต ั‡ะธัะปะพ\nะพะทะฝะฐั‡ะฐั” ะฑั–ะปัŒัˆัƒ ะบั–ะปัŒะบั–ัั‚ัŒ ะบะพะผะฟ'ัŽั‚ะตั€ั–ะฒ, ัะบั– ะฟั€ะฐั†ัŽัŽั‚ัŒ ะฟะฐั€ะฐะปะตะปัŒะฝะพ, ะฐะปะต ะผะพะถะต ะฟั€ะธะทะฒะตัั‚ะธ ะดะพ ะฟั€ะพะฑะปะตะผ ั–ะท ะฟั€ะพะดัƒะบั‚ะธะฒะฝั–ัั‚ัŽ.\nะ—ะฐัƒะฒะฐะถั‚ะต, ั‰ะพ ะดะตัะบั– ะผะพะดะธั„ั–ะบะฐั†ั–ั— ะผะพะถัƒั‚ัŒ ะฝะต ะฟั€ะฐั†ัŽะฒะฐั‚ะธ ั–ะท ะบั–ะปัŒะบั–ัั‚ัŽ ะฟะพั‚ะพะบั–ะฒ ะฑั–ะปัŒัˆะต ะทะฐ 1. ะ’ะธะบะพั€ะธัั‚ะพะฒัƒะนั‚ะต ะท ะพะฑะตั€ะตะถะฝั–ัั‚ัŽ.\nะžะฑะผะตะถะตะฝะฝั: > 1", @@ -88,6 +87,13 @@ "gui.computercraft.config.http.bandwidth": "ะขั€ะฐั„ั–ะบ", "gui.computercraft.config.http.bandwidth.global_download": "ะ“ะปะพะฑะฐะปัŒะฝะต ะพะฑะผะตะถะตะฝะฝั ะฝะฐ ะทะฐะฒะฐะฝั‚ะฐะถะตะฝะฝั", "gui.computercraft.config.http.bandwidth.global_download.tooltip": "ะงะธัะปะพ ะฑะฐะนั‚ั–ะฒ, ัะบั– ะผะพะถัƒั‚ัŒ ะฑัƒั‚ะธ ะทะฐะฒะฐะฝั‚ะฐะถะตะฝั– ะฒ ั…ะฒะธะปะธะฝัƒ. ะฆะต ะพะฑะผะตะถะตะฝะฝั ะฝะฐ ะฒัั– ะบะพะผะฟ'ัŽั‚ะตั€ะธ ะฒั–ะดั€ะฐะทัƒ (ะฑะฐะนั‚ะธ ะฒ ัะตะบัƒะฝะดัƒ)\nะžะฑะผะตะถะตะฝะฝั: > 1", + "gui.computercraft.config.http.bandwidth.global_upload.tooltip": "ะšั–ะปัŒะบั–ัั‚ัŒ ะฑะฐะนั‚, ัะบัƒ ะผะพะถะฝะฐ ะทะฐะฒะฐะฝั‚ะฐะถะธั‚ะธ ะทะฐ ัะตะบัƒะฝะดัƒ. ะ’ะพะฝะฐ ั” ัะฟั–ะปัŒะฝะพัŽ ะดะปั ะฒัั–ั… ะบะพะผะฟ'ัŽั‚ะตั€ั–ะฒ. (ะฑะฐะนั‚/ั)", + "gui.computercraft.config.http.max_websockets.tooltip": "ะšั–ะปัŒะบั–ัั‚ัŒ ะฒะตะฑัะพะบะตั‚ั–ะฒ, ัะบั– ะบะพะผะฟ'ัŽั‚ะตั€ ะผะพะถะต ะผะฐั‚ะธ ะฒั–ะดะบั€ะธั‚ะธะผะธ ะพะดะฝะพั‡ะฐัะฝะพ. ะ”ั–ะฐะฟะฐะทะพะฝ: > 1", + "gui.computercraft.config.http.proxy.tooltip": "ะขัƒะฝะตะปัŽั” HTTP-ะทะฐะฟะธั‚ะธ ั– ะทะฐะฟะธั‚ะธ ะฒะตะฑ-ัะพะบะตั‚ั–ะฒ ั‡ะตั€ะตะท ะฟั€ะพะบัั–-ัะตั€ะฒะตั€. ะ’ะฟะปะธะฒะฐั” ะปะธัˆะต ะฝะฐ HTTP-ะฟั€ะฐะฒะธะปะฐ ะท ะฟะฐั€ะฐะผะตั‚ั€ะพะผ \"use_proxy\", ะฒัั‚ะฐะฝะพะฒะปะตะฝะธะผ ัƒ true (ะทะฐ ะทะฐะผะพะฒั‡ัƒะฒะฐะฝะฝัะผ ะฒะธะผะบะฝะตะฝะพ). ะฏะบั‰ะพ ะดะปั ะฟั€ะพะบัั–-ัะตั€ะฒะตั€ะฐ ะฟะพั‚ั€ั–ะฑะฝะฐ ะฐะฒั‚ะตะฝั‚ะธั„ั–ะบะฐั†ั–ั, ัั‚ะฒะพั€ั–ั‚ัŒ ั„ะฐะนะป \"computercraft-proxy.pw\" ัƒ ั‚ะพะผัƒ ะถ ะบะฐั‚ะฐะปะพะทั–, ั‰ะพ ั– \"computercraft-server.toml\", ั‰ะพ ะผั–ัั‚ะธั‚ัŒ ั–ะผ'ั ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ ั– ะฟะฐั€ะพะปัŒ, ั€ะพะทะดั–ะปะตะฝั– ะดะฒะพะบั€ะฐะฟะบะพัŽ, ะฝะฐะฟั€ะธะบะปะฐะด, \"myuser:mypassword\". ะ”ะปั ะฟั€ะพะบัั– SOCKS4 ะฟะพั‚ั€ั–ะฑะฝะพ ะปะธัˆะต ั–ะผ'ั ะบะพั€ะธัั‚ัƒะฒะฐั‡ะฐ.", + "gui.computercraft.config.log_computer_errors.tooltip": "ะ–ัƒั€ะฝะฐะป ะฒะธะฝัั‚ะบั–ะฒ, ัะฟั€ะธั‡ะธะฝะตะฝะธั… ะฟะตั€ะธั„ะตั€ั–ะนะฝะธะผะธ ะฟั€ะธัั‚ั€ะพัะผะธ ั‚ะฐ ั–ะฝัˆะธะผะธ ะพะฑ'ั”ะบั‚ะฐะผะธ Lua. ะฆะต ะฟะพะปะตะณัˆัƒั” ะฐะฒั‚ะพั€ะฐะผ ะผะพะด ะฝะฐะปะฐะณะพะดะถะตะฝะฝั ะฟั€ะพะฑะปะตะผ, ะฐะปะต ะผะพะถะต ะฟั€ะธะทะฒะตัั‚ะธ ะดะพ ัะฟะฐะผัƒ ัƒ ะถัƒั€ะฝะฐะปั–, ัะบั‰ะพ ะปัŽะดะธ ะฒะธะบะพั€ะธัั‚ะพะฒัƒะฒะฐั‚ะธะผัƒั‚ัŒ ะฝะตะบะพั€ะตะบั‚ะฝั– ะผะตั‚ะพะดะธ.", + "gui.computercraft.config.monitor_distance.tooltip": "ะœะฐะบัะธะผะฐะปัŒะฝะฐ ะฒั–ะดัั‚ะฐะฝัŒ, ะฝะฐ ัะบั–ะน ะฑัƒะดัƒั‚ัŒ ะฒั–ะทัƒะฐะปั–ะทัƒะฒะฐั‚ะธััŒ ะผะพะฝั–ั‚ะพั€ะธ. ะ—ะฐ ะทะฐะผะพะฒั‡ัƒะฒะฐะฝะฝัะผ ั†ะต ะทะฝะฐั‡ะตะฝะฝั ะดะพั€ั–ะฒะฝัŽั” ัั‚ะฐะฝะดะฐั€ั‚ะฝั–ะน ะฒั–ะดัั‚ะฐะฝั– ะผั–ะถ ะฟะปะธั‚ะบะฐะผะธ, ะฐะปะต ะผะพะถะต ะฑัƒั‚ะธ ะทะฑั–ะปัŒัˆะตะฝะพ, ัะบั‰ะพ ะฒะธ ะฑะฐะถะฐั”ั‚ะต ัั‚ะฒะพั€ะธั‚ะธ ะฑั–ะปัŒัˆั– ะผะพะฝั–ั‚ะพั€ะธ. ะ”ั–ะฐะฟะฐะทะพะฝ: 16 ~ 1024", + "gui.computercraft.config.monitor_renderer": "ะ’ั–ะทัƒะฐะปั–ะทะฐั†ั–ั ะผะพะฝั–ั‚ะพั€ะฐ", + "gui.computercraft.config.monitor_renderer.tooltip": "ะ’ั–ะทัƒะฐะปั–ะทะฐั‚ะพั€, ัะบะธะน ะฑัƒะดะต ะฒะธะบะพั€ะธัั‚ะพะฒัƒะฒะฐั‚ะธัั ะดะปั ะผะพะฝั–ั‚ะพั€ั–ะฒ. ะ—ะฐะทะฒะธั‡ะฐะน ั†ะตะน ะฟะฐั€ะฐะผะตั‚ั€ ัะปั–ะด ะทะฐะปะธัˆะฐั‚ะธ ะฝะฐ ั€ั–ะฒะฝั– \"ะฝะฐะนะบั€ะฐั‰ะธะน\" - ัะบั‰ะพ ัƒ ะผะพะฝั–ั‚ะพั€ั–ะฒ ั” ะฟั€ะพะฑะปะตะผะธ ะท ะฟั€ะพะดัƒะบั‚ะธะฒะฝั–ัั‚ัŽ, ะฒะธ ะผะพะถะตั‚ะต ะฟะพะตะบัะฟะตั€ะธะผะตะฝั‚ัƒะฒะฐั‚ะธ ะท ะฐะปัŒั‚ะตั€ะฝะฐั‚ะธะฒะฝะธะผะธ ะ’ั–ะทัƒะฐะปั–ะทะฐั‚ะพั€ะฐะผะธ.\nะ”ะพะฟัƒัั‚ะธะผั– ะทะฝะฐั‡ะตะฝะฝั: BEST, TBO, VBO", "gui.computercraft.pocket_computer_overlay": "ะšะธัˆะตะฝัŒะบะพะฒะธะน ะบะพะผะฟ'ัŽั‚ะตั€ ะฒั–ะดะบั€ะธั‚ะธะน. ะะฐั‚ะธัะฝั–ั‚ัŒ ESC, ั‰ะพะฑ ะทะฐะบั€ะธั‚ะธ.", "gui.computercraft.tooltip.computer_id": "ะ†ะดะตะฝั‚ะธั„ั–ะบะฐั‚ะพั€ ะบะพะผะฟ'ัŽั‚ะตั€ะฐ: %s", "gui.computercraft.tooltip.copy": "ะกะบะพะฟั–ะนะพะฒะฐะฝะพ ะฒ ะ‘ัƒั„ะตั€ ะพะฑะผั–ะฝัƒ", diff --git a/projects/common/src/main/resources/assets/computercraft/lang/zh_cn.json b/projects/common/src/main/resources/assets/computercraft/lang/zh_cn.json index 0d3ad1317b..7f14b4fdc9 100644 --- a/projects/common/src/main/resources/assets/computercraft/lang/zh_cn.json +++ b/projects/common/src/main/resources/assets/computercraft/lang/zh_cn.json @@ -1,8 +1,14 @@ { "argument.computercraft.argument_expected": "้ข„ๆœŸ่‡ชๅ˜้‡", + "argument.computercraft.computer.distance": "ๅฎžไฝ“่ท็ฆป", + "argument.computercraft.computer.family": "็”ต่„‘็ฑปๅˆซ", + "argument.computercraft.computer.id": "็”ต่„‘ID", + "argument.computercraft.computer.instance": "ๅ”ฏไธ€ๅฎžไพ‹ID", + "argument.computercraft.computer.label": "็”ต่„‘ๆ ‡็ญพ", "argument.computercraft.computer.many_matching": "ๅคšๅฐ่ฎก็ฎ—ๆœบๅŒน้…'%s' (ๅฎžไพ‹%s)", "argument.computercraft.computer.no_matching": "ๆฒกๆœ‰่ฎก็ฎ—ๆœบๅŒน้…'%s'", "argument.computercraft.tracking_field.no_field": "ๆœช็Ÿฅๅญ—ๆฎต'%s'", + "argument.computercraft.unknown_computer_family": "ๆœช็Ÿฅ็”ต่„‘็ฑปๅˆซ '%s'", "block.computercraft.cable": "็ฝ‘็ปœ็”ต็ผ†", "block.computercraft.computer_advanced": "้ซ˜็บง่ฎก็ฎ—ๆœบ", "block.computercraft.computer_command": "ๅ‘ฝไปค็”ต่„‘", @@ -27,13 +33,13 @@ "commands.computercraft.desc": "/computercraftๅ‘ฝไปคๆไพ›ๅ„็ง่ฐƒ่ฏ•ๅ’Œ็ฎก็†ๅทฅๅ…ท๏ผŒ็”จไบŽๆŽงๅˆถๅ’ŒไธŽ่ฎก็ฎ—ๆœบไบคไบ’.", "commands.computercraft.dump.action": "ๆŸฅ็œ‹ๆœ‰ๅ…ณๆญค่ฎก็ฎ—ๆœบ็š„ๆ›ดๅคšไฟกๆฏ", "commands.computercraft.dump.desc": "ๆ˜พ็คบๆ‰€ๆœ‰่ฎก็ฎ—ๆœบ็š„็Šถๆ€ๆˆ–ๆŸๅฐ่ฎก็ฎ—ๆœบ็š„็‰นๅฎšไฟกๆฏ. ไฝ ๅฏไปฅๆŒ‡ๅฎš่ฎก็ฎ—ๆœบ็š„ๅฎžไพ‹id (ไพ‹ๅฆ‚. 123), ่ฎก็ฎ—ๆœบid (ไพ‹ๅฆ‚. #123)ๆˆ–ๆ ‡็ญพ(ไพ‹ๅฆ‚. \"@My Computer\").", + "commands.computercraft.dump.open_path": "ๆŸฅ็œ‹่ฏฅ็”ต่„‘็š„ๆ–‡ไปถ", "commands.computercraft.dump.synopsis": "ๆ˜พ็คบ่ฎก็ฎ—ๆœบ็š„็Šถๆ€.", "commands.computercraft.generic.additional_rows": "%d้ขๅค–็š„่กŒโ€ฆ", "commands.computercraft.generic.exception": "ๆœชๅค„็†็š„ๅผ‚ๅธธ(%s)", "commands.computercraft.generic.no": "N", - "commands.computercraft.generic.no_position": "<ๆ— ไฝ็ฝฎ>", - "commands.computercraft.generic.position": "%s, %s, %s", "commands.computercraft.generic.yes": "Y", + "commands.computercraft.help.desc": "ๆ˜พ็คบ่ฏฅๅธฎๅŠฉไฟกๆฏ", "commands.computercraft.help.no_children": "%sๆฒกๆœ‰ๅญๅ‘ฝไปค", "commands.computercraft.help.no_command": "ๆฒกๆœ‰่ฟ™ๆ ท็š„ๅ‘ฝไปค'%s'", "commands.computercraft.help.synopsis": "ไธบ็‰นๅฎš็š„ๅ‘ฝไปคๆไพ›ๅธฎๅŠฉ", @@ -66,17 +72,36 @@ "commands.computercraft.view.desc": "ๆ‰“ๅผ€่ฎก็ฎ—ๆœบ็š„็ปˆ็ซฏ๏ผŒๅ…่ฎธ่ฟœ็จ‹ๆŽงๅˆถ่ฎก็ฎ—ๆœบ. ่ฟ™ไธๆไพ›ๅฏนๆตท้พŸๅบ“ๅญ˜็š„่ฎฟ้—ฎ. ไฝ ๅฏไปฅๆŒ‡ๅฎš่ฎก็ฎ—ๆœบ็š„ๅฎžไพ‹id (ไพ‹ๅฆ‚. 123)ๆˆ–่ฎก็ฎ—ๆœบid (ไพ‹ๅฆ‚. #123).", "commands.computercraft.view.not_player": "ๆ— ๆณ•ไธบ้ž็Žฉๅฎถๆ‰“ๅผ€็ปˆ็ซฏ", "commands.computercraft.view.synopsis": "ๆŸฅ็œ‹่ฎก็ฎ—ๆœบ็š„็ปˆ็ซฏ.", + "gui.computercraft.config.command_require_creative": "ๅ‘ฝไปค็”ต่„‘้œ€่ฆๅˆ›้€ ๆจกๅผ", + "gui.computercraft.config.command_require_creative.tooltip": "็Žฉๅฎถ้œ€่ฆๅค„ไบŽๅˆ›้€ ๆจกๅผๅนถไธบ็ฎก็†ๅ‘˜ๆ‰่ƒฝไธŽๅ‘ฝไปค่ฎก็ฎ—ๆœบไบคไบ’ใ€‚\n่ฟ™ๆ˜ฏๅŽŸ็‰ˆๅ‘ฝไปคๆ–นๅ—็š„้ป˜่ฎค่กŒไธบใ€‚", "gui.computercraft.config.computer_space_limit": "่ฎก็ฎ—ๆœบ็ฉบ้—ด้™ๅˆถ(ๅญ—่Š‚)", + "gui.computercraft.config.computer_space_limit.tooltip": "่ฎก็ฎ—ๆœบๅ’Œๆตท้พŸ็š„็ฃ็›˜็ฉบ้—ด้™ๅˆถ๏ผŒไปฅๅญ—่Š‚ไธบๅ•ไฝใ€‚", "gui.computercraft.config.default_computer_settings": "้ป˜่ฎค่ฎก็ฎ—ๆœบ่ฎพ็ฝฎ", + "gui.computercraft.config.disabled_generic_methods": "็ฆ็”จ็š„้€š็”จๆ–นๆณ•", "gui.computercraft.config.execution": "ๆ‰ง่กŒ", "gui.computercraft.config.execution.computer_threads": "่ฎก็ฎ—ๆœบ็บฟ็จ‹ๆ•ฐ", "gui.computercraft.config.execution.max_main_computer_time": "ๆœๅŠกๅ™จ่ฎก็ฎ—ๆœบtickๆ—ถ้—ด้™ๅˆถ", "gui.computercraft.config.execution.max_main_global_time": "ๆœๅŠกๅ™จๅ…จๅฑ€tickๆ—ถ้—ด้™ๅˆถ", "gui.computercraft.config.floppy_space_limit": "่ฝฏ็›˜็ฉบ้—ด้™ๅˆถ(ๅญ—่Š‚)", "gui.computercraft.config.http": "HTTP", + "gui.computercraft.config.http.bandwidth": "ๅธฆๅฎฝ", + "gui.computercraft.config.http.bandwidth.global_download": "ๅ…จๅฑ€ไธ‹่ฝฝ้™้€Ÿ", + "gui.computercraft.config.http.bandwidth.global_download.tooltip": "ๆฏ็ง’้’Ÿๅฏไปฅไธ‹่ฝฝ็š„ๅญ—่Š‚ๆ•ฐ. ๆ‰€ๆœ‰็”ต่„‘ๅ…ฑไบซ่ฏฅ่ฎพ็ฝฎ (bytes/s).\n่Œƒๅ›ด: > 1", + "gui.computercraft.config.http.bandwidth.global_upload": "ๅ…จๅฑ€ไธŠไผ ้™้€Ÿ", + "gui.computercraft.config.http.bandwidth.global_upload.tooltip": "ๆฏ็ง’้’ŸๅฏไปฅไธŠไผ ็š„ๅญ—่Š‚ๆ•ฐ. ๆ‰€ๆœ‰็”ต่„‘ๅ…ฑไบซ่ฏฅ่ฎพ็ฝฎ (bytes/s).\n่Œƒๅ›ด: > 1", + "gui.computercraft.config.http.bandwidth.tooltip": "้™ๅˆถ็”ต่„‘ๅฏไปฅไฝฟ็”จ็š„ๅธฆๅฎฝ.", "gui.computercraft.config.http.enabled": "ๅฏ็”จHTTP API", "gui.computercraft.config.http.max_requests": "ๆœ€ๅคงๅนถๅ‘่ฏทๆฑ‚ๆ•ฐ", "gui.computercraft.config.http.max_websockets": "ๆœ€ๅคงๅนถๅ‘websocketsๆ•ฐ", + "gui.computercraft.config.http.proxy": "ไปฃ็†", + "gui.computercraft.config.http.proxy.host": "ไธปๆœบๅ", + "gui.computercraft.config.http.proxy.host.tooltip": "ไปฃ็†ๆœๅŠกๅ™จ็š„ไธปๆœบๅๆˆ–IPๅœฐๅ€.", + "gui.computercraft.config.http.proxy.port": "็ซฏๅฃ", + "gui.computercraft.config.http.proxy.port.tooltip": "ไปฃ็†ๆœๅŠกๅ™จ็š„็ซฏๅฃ.\n่Œƒๅ›ด: 1 ~ 65536", + "gui.computercraft.config.http.proxy.type": "ไปฃ็†็ฑปๅž‹", + "gui.computercraft.config.http.proxy.type.tooltip": "ไปฃ็†ไฝฟ็”จ็š„ๅ่ฎฎ.\nๅ…่ฎธ: HTTP, HTTPS, SOCKS4, SOCKS5", + "gui.computercraft.config.http.rules": "ๅ…่ฎธ/้˜ปๆญข่ง„ๅˆ™", + "gui.computercraft.config.http.tooltip": "ๆŽงๅˆถHTTP API", "gui.computercraft.config.http.websocket_enabled": "ๅฏ็”จwebsockets", "gui.computercraft.config.log_computer_errors": "่ฎฐๅฝ•่ฎก็ฎ—ๆœบ้”™่ฏฏ", "gui.computercraft.config.maximum_open_files": "ๆฏๅฐ่ฎก็ฎ—ๆœบๆ‰“ๅผ€็š„ๆœ€ๅคงๆ–‡ไปถๆ•ฐ", @@ -105,10 +130,19 @@ "item.computercraft.printed_pages": "ๆ‰“ๅฐ็บธ็ฐ‡", "item.computercraft.treasure_disk": "่ฝฏ็›˜", "itemGroup.computercraft": "ComputerCraft", + "tag.item.computercraft.turtle": "ๆตท้พŸ", + "tag.item.computercraft.wired_modem": "ๆœ‰็บฟ่ฐƒๅˆถ่งฃ่ฐƒๅ™จ", + "tracking_field.computercraft.avg": "%s (ๅนณๅ‡)", + "tracking_field.computercraft.computer_tasks.name": "ไปปๅŠก", + "tracking_field.computercraft.count": "%s (่ฎกๆ•ฐ)", "tracking_field.computercraft.fs.name": "ๆ–‡ไปถ็ณป็ปŸๆ“ไฝœ", "tracking_field.computercraft.http_download.name": "HTTPไธ‹่ฝฝ", + "tracking_field.computercraft.http_requests.name": "HTTP่ฏทๆฑ‚", "tracking_field.computercraft.http_upload.name": "HTTPไธŠไผ ", + "tracking_field.computercraft.java_allocation.name": "Javaๅˆ†้…", + "tracking_field.computercraft.max": "%s (ๆœ€ๅคง)", "tracking_field.computercraft.peripheral.name": "ๅค–้ƒจ่ฎพๅค‡ๅ‘ผๅซ", + "tracking_field.computercraft.server_tasks.name": "ๆœๅŠกๅ™จไปปๅŠก", "tracking_field.computercraft.turtle_ops.name": "ๆตท้พŸ่กŒๅŠจ", "tracking_field.computercraft.websocket_incoming.name": "Websocketไผ ๅ…ฅ", "tracking_field.computercraft.websocket_outgoing.name": "Websocketไผ ๅ‡บ", @@ -120,41 +154,5 @@ "upgrade.minecraft.diamond_hoe.adjective": "่€•็ง", "upgrade.minecraft.diamond_pickaxe.adjective": "้‡‡ๆŽ˜", "upgrade.minecraft.diamond_shovel.adjective": "ๆŒ–ๆŽ˜", - "upgrade.minecraft.diamond_sword.adjective": "ๆˆ˜ๆ–—", - "argument.computercraft.computer.instance": "ๅ”ฏไธ€ๅฎžไพ‹ID", - "commands.computercraft.dump.open_path": "ๆŸฅ็œ‹่ฏฅ็”ต่„‘็š„ๆ–‡ไปถ", - "gui.computercraft.config.command_require_creative": "ๅ‘ฝไปค็”ต่„‘้œ€่ฆๅˆ›้€ ๆจกๅผ", - "gui.computercraft.config.command_require_creative.tooltip": "็Žฉๅฎถ้œ€่ฆๅค„ไบŽๅˆ›้€ ๆจกๅผๅนถไธบ็ฎก็†ๅ‘˜ๆ‰่ƒฝไธŽๅ‘ฝไปค่ฎก็ฎ—ๆœบไบคไบ’ใ€‚\n่ฟ™ๆ˜ฏๅŽŸ็‰ˆๅ‘ฝไปคๆ–นๅ—็š„้ป˜่ฎค่กŒไธบใ€‚", - "gui.computercraft.config.http.bandwidth": "ๅธฆๅฎฝ", - "gui.computercraft.config.http.bandwidth.global_download.tooltip": "ๆฏ็ง’้’Ÿๅฏไปฅไธ‹่ฝฝ็š„ๅญ—่Š‚ๆ•ฐ. ๆ‰€ๆœ‰็”ต่„‘ๅ…ฑไบซ่ฏฅ่ฎพ็ฝฎ (bytes/s).\n่Œƒๅ›ด: > 1", - "gui.computercraft.config.http.proxy.type.tooltip": "ไปฃ็†ไฝฟ็”จ็š„ๅ่ฎฎ.\nๅ…่ฎธ: HTTP, HTTPS, SOCKS4, SOCKS5", - "argument.computercraft.computer.id": "็”ต่„‘ID", - "argument.computercraft.computer.distance": "ๅฎžไฝ“่ท็ฆป", - "argument.computercraft.computer.family": "็”ต่„‘็ฑปๅˆซ", - "argument.computercraft.computer.label": "็”ต่„‘ๆ ‡็ญพ", - "argument.computercraft.unknown_computer_family": "ๆœช็Ÿฅ็”ต่„‘็ฑปๅˆซ '%s'", - "commands.computercraft.help.desc": "ๆ˜พ็คบ่ฏฅๅธฎๅŠฉไฟกๆฏ", - "gui.computercraft.config.computer_space_limit.tooltip": "่ฎก็ฎ—ๆœบๅ’Œๆตท้พŸ็š„็ฃ็›˜็ฉบ้—ด้™ๅˆถ๏ผŒไปฅๅญ—่Š‚ไธบๅ•ไฝใ€‚", - "gui.computercraft.config.disabled_generic_methods": "็ฆ็”จ็š„้€š็”จๆ–นๆณ•", - "gui.computercraft.config.http.bandwidth.global_upload": "ๅ…จๅฑ€ไธŠไผ ้™้€Ÿ", - "gui.computercraft.config.http.bandwidth.global_download": "ๅ…จๅฑ€ไธ‹่ฝฝ้™้€Ÿ", - "gui.computercraft.config.http.bandwidth.global_upload.tooltip": "ๆฏ็ง’้’ŸๅฏไปฅไธŠไผ ็š„ๅญ—่Š‚ๆ•ฐ. ๆ‰€ๆœ‰็”ต่„‘ๅ…ฑไบซ่ฏฅ่ฎพ็ฝฎ (bytes/s).\n่Œƒๅ›ด: > 1", - "gui.computercraft.config.http.bandwidth.tooltip": "้™ๅˆถ็”ต่„‘ๅฏไปฅไฝฟ็”จ็š„ๅธฆๅฎฝ.", - "gui.computercraft.config.http.proxy": "ไปฃ็†", - "gui.computercraft.config.http.proxy.host": "ไธปๆœบๅ", - "gui.computercraft.config.http.proxy.host.tooltip": "ไปฃ็†ๆœๅŠกๅ™จ็š„ไธปๆœบๅๆˆ–IPๅœฐๅ€.", - "gui.computercraft.config.http.proxy.port": "็ซฏๅฃ", - "gui.computercraft.config.http.proxy.port.tooltip": "ไปฃ็†ๆœๅŠกๅ™จ็š„็ซฏๅฃ.\n่Œƒๅ›ด: 1 ~ 65536", - "gui.computercraft.config.http.proxy.type": "ไปฃ็†็ฑปๅž‹", - "gui.computercraft.config.http.rules": "ๅ…่ฎธ/้˜ปๆญข่ง„ๅˆ™", - "gui.computercraft.config.http.tooltip": "ๆŽงๅˆถHTTP API", - "tracking_field.computercraft.java_allocation.name": "Javaๅˆ†้…", - "tracking_field.computercraft.max": "%s (ๆœ€ๅคง)", - "tracking_field.computercraft.server_tasks.name": "ๆœๅŠกๅ™จไปปๅŠก", - "tag.item.computercraft.turtle": "ๆตท้พŸ", - "tag.item.computercraft.wired_modem": "ๆœ‰็บฟ่ฐƒๅˆถ่งฃ่ฐƒๅ™จ", - "tracking_field.computercraft.avg": "%s (ๅนณๅ‡)", - "tracking_field.computercraft.computer_tasks.name": "ไปปๅŠก", - "tracking_field.computercraft.count": "%s (่ฎกๆ•ฐ)", - "tracking_field.computercraft.http_requests.name": "HTTP่ฏทๆฑ‚" + "upgrade.minecraft.diamond_sword.adjective": "ๆˆ˜ๆ–—" } diff --git a/projects/common/src/main/resources/assets/computercraft/textures/block/redstone_relay_bottom.png b/projects/common/src/main/resources/assets/computercraft/textures/block/redstone_relay_bottom.png new file mode 100644 index 0000000000..cad4772d69 Binary files /dev/null and b/projects/common/src/main/resources/assets/computercraft/textures/block/redstone_relay_bottom.png differ diff --git a/projects/common/src/main/resources/assets/computercraft/textures/block/redstone_relay_front.png b/projects/common/src/main/resources/assets/computercraft/textures/block/redstone_relay_front.png new file mode 100644 index 0000000000..c4bea99a9a Binary files /dev/null and b/projects/common/src/main/resources/assets/computercraft/textures/block/redstone_relay_front.png differ diff --git a/projects/common/src/main/resources/assets/computercraft/textures/block/redstone_relay_side.png b/projects/common/src/main/resources/assets/computercraft/textures/block/redstone_relay_side.png new file mode 100644 index 0000000000..16322ab6a7 Binary files /dev/null and b/projects/common/src/main/resources/assets/computercraft/textures/block/redstone_relay_side.png differ diff --git a/projects/common/src/main/resources/assets/computercraft/textures/block/redstone_relay_top.png b/projects/common/src/main/resources/assets/computercraft/textures/block/redstone_relay_top.png new file mode 100644 index 0000000000..a0f0d4993a Binary files /dev/null and b/projects/common/src/main/resources/assets/computercraft/textures/block/redstone_relay_top.png differ diff --git a/projects/common/src/testMod/java/dan200/computercraft/export/Exporter.java b/projects/common/src/testMod/java/dan200/computercraft/export/Exporter.java index 43b2b80a99..f42a6da40a 100644 --- a/projects/common/src/testMod/java/dan200/computercraft/export/Exporter.java +++ b/projects/common/src/testMod/java/dan200/computercraft/export/Exporter.java @@ -9,7 +9,6 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; @@ -20,8 +19,8 @@ import dan200.computercraft.shared.util.RegistryHelper; import net.minecraft.client.Minecraft; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.ShapedRecipe; @@ -33,9 +32,8 @@ import java.io.Writer; import java.nio.file.Files; import java.nio.file.Path; -import java.util.HashSet; import java.util.Objects; -import java.util.Set; +import java.util.stream.Collectors; /** * Provides a {@literal /ccexport } command which exports icons and recipes for all ComputerCraft items. @@ -73,14 +71,10 @@ private static void run(String path) { private static void export(Path root, ImageRenderer renderer) throws IOException { var dump = new JsonDump(); - Set items = new HashSet<>(); - // First find all CC items - for (var item : BuiltInRegistries.ITEM) { - if (RegistryHelper.getKeyOrThrow(BuiltInRegistries.ITEM, item).getNamespace().equals(ComputerCraftAPI.MOD_ID)) { - items.add(item); - } - } + var items = BuiltInRegistries.ITEM.stream() + .filter(x -> BuiltInRegistries.ITEM.getKey(x).getNamespace().equals(ComputerCraftAPI.MOD_ID)) + .collect(Collectors.toSet()); // Now find all CC recipes. var level = Objects.requireNonNull(Minecraft.getInstance().level); @@ -124,10 +118,6 @@ private static void export(Path root, ImageRenderer renderer) throws IOException var itemDir = root.resolve("items"); if (Files.exists(itemDir)) MoreFiles.deleteRecursively(itemDir, RecursiveDeleteOption.ALLOW_INSECURE); - renderer.setupState(); - var transform = new PoseStack(); - transform.setIdentity(); - for (var item : items) { var stack = new ItemStack(item); var location = RegistryHelper.getKeyOrThrow(BuiltInRegistries.ITEM, item); @@ -135,11 +125,13 @@ private static void export(Path root, ImageRenderer renderer) throws IOException dump.itemNames.put(location.toString(), stack.getHoverName().getString()); renderer.captureRender(itemDir.resolve(location.getNamespace()).resolve(location.getPath() + ".png"), () -> { - // TODO: Minecraft.getInstance().getItemRenderer().ren(transform, stack, 0, 0) + + var graphics = new GuiGraphics(Minecraft.getInstance(), Minecraft.getInstance().renderBuffers().bufferSource()); + graphics.renderItem(stack, 0, 0); + graphics.flush(); } ); } - renderer.clearState(); try (Writer writer = Files.newBufferedWriter(root.resolve("index.json")); var jsonWriter = new PrettyJsonWriter(writer)) { GSON.toJson(dump, JsonDump.class, jsonWriter); diff --git a/projects/common/src/testMod/java/dan200/computercraft/export/ImageRenderer.java b/projects/common/src/testMod/java/dan200/computercraft/export/ImageRenderer.java index 0212ec0f55..3f448c9ddb 100644 --- a/projects/common/src/testMod/java/dan200/computercraft/export/ImageRenderer.java +++ b/projects/common/src/testMod/java/dan200/computercraft/export/ImageRenderer.java @@ -5,15 +5,14 @@ package dan200.computercraft.export; import com.mojang.blaze3d.pipeline.TextureTarget; +import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.platform.NativeImage; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.VertexSorting; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.FogRenderer; import org.joml.Matrix4f; -import org.lwjgl.opengl.GL12; -import javax.annotation.Nullable; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -28,39 +27,43 @@ public class ImageRenderer implements AutoCloseable { private final TextureTarget framebuffer = new TextureTarget(WIDTH, HEIGHT, true, Minecraft.ON_OSX); private final NativeImage image = new NativeImage(WIDTH, HEIGHT, Minecraft.ON_OSX); - private @Nullable Matrix4f projectionMatrix; - public ImageRenderer() { framebuffer.setClearColor(0, 0, 0, 0); framebuffer.clear(Minecraft.ON_OSX); } - public void setupState() { - projectionMatrix = RenderSystem.getProjectionMatrix(); - RenderSystem.setProjectionMatrix(new Matrix4f().identity().ortho(0, 16, 0, 16, 1000, 3000), VertexSorting.DISTANCE_TO_ORIGIN); + public void captureRender(Path output, Runnable render) throws IOException { + Files.createDirectories(output.getParent()); + + framebuffer.setClearColor(0, 0, 0, 0); + framebuffer.clear(Minecraft.ON_OSX); + framebuffer.bindWrite(true); + + // Setup rendering state + var projectionMatrix = RenderSystem.getProjectionMatrix(); + RenderSystem.setProjectionMatrix(new Matrix4f().identity().ortho(0, 16, 16, 0, 1000, 3000), VertexSorting.ORTHOGRAPHIC_Z); var transform = RenderSystem.getModelViewStack(); transform.pushMatrix(); transform.identity(); transform.translate(0.0f, 0.0f, -2000.0f); + RenderSystem.applyModelViewMatrix(); + Lighting.setupFor3DItems(); FogRenderer.setupNoFog(); - } - public void clearState() { - if (projectionMatrix == null) throw new IllegalStateException("Not currently rendering"); + // Render + render.run(); + + // Restore rendering state RenderSystem.setProjectionMatrix(projectionMatrix, VertexSorting.DISTANCE_TO_ORIGIN); RenderSystem.getModelViewStack().popMatrix(); - } - - public void captureRender(Path output, Runnable render) throws IOException { - Files.createDirectories(output.getParent()); + RenderSystem.applyModelViewMatrix(); - framebuffer.bindWrite(true); - RenderSystem.clear(GL12.GL_COLOR_BUFFER_BIT | GL12.GL_DEPTH_BUFFER_BIT, Minecraft.ON_OSX); - render.run(); framebuffer.unbindWrite(); + Minecraft.getInstance().getMainRenderTarget().bindWrite(true); + // And save the image framebuffer.bindRead(); image.downloadTexture(0, false); image.flipY(); diff --git a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Relay_Test.kt b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Relay_Test.kt new file mode 100644 index 0000000000..842233f042 --- /dev/null +++ b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Relay_Test.kt @@ -0,0 +1,99 @@ +// SPDX-FileCopyrightText: 2024 The CC: Tweaked Developers +// +// SPDX-License-Identifier: MPL-2.0 + +package dan200.computercraft.gametest + +import dan200.computercraft.core.computer.ComputerSide +import dan200.computercraft.gametest.api.assertBlockHas +import dan200.computercraft.gametest.api.getBlockEntity +import dan200.computercraft.gametest.api.modifyBlock +import dan200.computercraft.gametest.api.sequence +import dan200.computercraft.shared.ModRegistry +import dan200.computercraft.shared.peripheral.redstone.RedstoneRelayPeripheral +import net.minecraft.core.BlockPos +import net.minecraft.gametest.framework.GameTest +import net.minecraft.gametest.framework.GameTestHelper +import net.minecraft.world.level.block.Blocks +import net.minecraft.world.level.block.LeverBlock +import net.minecraft.world.level.block.RedstoneLampBlock +import org.junit.jupiter.api.Assertions.assertEquals + +class Relay_Test { + /** + * Ensures redstone signals do not travel through relay. + * + * @see [Computer_Test.No_through_signal] + */ + @GameTest + fun No_through_signal(context: GameTestHelper) = context.sequence { + val lamp = BlockPos(2, 2, 4) + val lever = BlockPos(2, 2, 0) + thenExecute { + context.assertBlockHas(lamp, RedstoneLampBlock.LIT, false, "Lamp should not be lit") + context.modifyBlock(lever) { x -> x.setValue(LeverBlock.POWERED, true) } + } + thenIdle(3) + thenExecute { context.assertBlockHas(lamp, RedstoneLampBlock.LIT, false, "Lamp should still not be lit") } + } + + /** + * Similar to the above, but with a repeater before the relay + * + * @see [Computer_Test.No_through_signal_reverse] + */ + @GameTest + fun No_through_signal_reverse(context: GameTestHelper) = context.sequence { + val lamp = BlockPos(2, 2, 4) + val lever = BlockPos(2, 2, 0) + thenExecute { + context.assertBlockHas(lamp, RedstoneLampBlock.LIT, false, "Lamp should not be lit") + context.modifyBlock(lever) { x -> x.setValue(LeverBlock.POWERED, true) } + } + thenIdle(3) + thenExecute { context.assertBlockHas(lamp, RedstoneLampBlock.LIT, false, "Lamp should still not be lit") } + } + + /** + * Check relays propagate redstone to surrounding blocks. + * + * @see [Computer_Test.Set_and_destroy] + */ + @GameTest + fun Set_and_destroy(context: GameTestHelper) = context.sequence { + val lamp = BlockPos(2, 2, 3) + + thenExecute { + val peripheral = context.getBlockEntity(BlockPos(2, 2, 2), ModRegistry.BlockEntities.REDSTONE_RELAY.get()) + .peripheral() + as RedstoneRelayPeripheral + peripheral.setOutput(ComputerSide.BACK, true) + } + thenIdle(1) + thenExecute { context.assertBlockHas(lamp, RedstoneLampBlock.LIT, true, "Lamp should be lit") } + thenExecute { context.setBlock(BlockPos(2, 2, 2), Blocks.AIR) } + thenIdle(4) + thenExecute { context.assertBlockHas(lamp, RedstoneLampBlock.LIT, false, "Lamp should not be lit") } + } + + /** + * Check relays pick up propagated redstone to surrounding blocks. + * + * @see [Computer_Test.Self_output_update] + */ + @GameTest + fun Self_output_update(context: GameTestHelper) = context.sequence { + fun relay() = context.getBlockEntity(BlockPos(2, 2, 2), ModRegistry.BlockEntities.REDSTONE_RELAY.get()) + .peripheral() as RedstoneRelayPeripheral + + thenExecute { relay().setOutput(ComputerSide.BACK, true) } + thenIdle(2) + thenExecute { assertEquals(true, relay().getInput(ComputerSide.BACK), "Input should be on") } + + thenIdle(2) + + thenExecute { relay().setOutput(ComputerSide.BACK, false) } + thenIdle(2) + thenExecute { assertEquals(false, relay().getInput(ComputerSide.BACK), "Input should be off") } + } +} diff --git a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Turtle_Test.kt b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Turtle_Test.kt index 191152e748..960d13b92d 100644 --- a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Turtle_Test.kt +++ b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/Turtle_Test.kt @@ -716,6 +716,34 @@ class Turtle_Test { } } + /** + * `turtle.craft` leaves a remainder + * + * @see [#2007](https://github.com/cc-tweaked/CC-Tweaked/issues/2007) + */ + @GameTest + fun Craft_remainder(helper: GameTestHelper) = helper.sequence { + thenOnComputer { + callPeripheral("left", "craft", 1).assertArrayEquals(true) + } + thenExecute { + val turtle = helper.getBlockEntity(BlockPos(2, 2, 2), ModRegistry.BlockEntities.TURTLE_NORMAL.get()) + + val turtleStack = ItemStack(ModRegistry.Items.TURTLE_NORMAL.get()) + + assertThat( + "Inventory is as expected.", + turtle.items, + contains( + isStack(turtleStack), isStack(Items.WET_SPONGE, 1), isStack(ItemStack.EMPTY), isStack(ItemStack.EMPTY), + isStack(ItemStack.EMPTY), isStack(ItemStack.EMPTY), isStack(ItemStack.EMPTY), isStack(ItemStack.EMPTY), + isStack(ItemStack.EMPTY), isStack(ItemStack.EMPTY), isStack(ItemStack.EMPTY), isStack(ItemStack.EMPTY), + isStack(ItemStack.EMPTY), isStack(ItemStack.EMPTY), isStack(ItemStack.EMPTY), isStack(ItemStack.EMPTY), + ), + ) + } + } + /** * `turtle.equipLeft` equips a tool. */ diff --git a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/TestHooks.kt b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/TestHooks.kt index b4878effc1..0517274b61 100644 --- a/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/TestHooks.kt +++ b/projects/common/src/testMod/kotlin/dan200/computercraft/gametest/core/TestHooks.kt @@ -104,6 +104,7 @@ object TestHooks { Printer_Test::class.java, Printout_Test::class.java, Recipe_Test::class.java, + Relay_Test::class.java, Speaker_Test::class.java, Turtle_Test::class.java, ) diff --git a/projects/common/src/testMod/resources/data/cctest/structures/relay_test.no_through_signal.snbt b/projects/common/src/testMod/resources/data/cctest/structures/relay_test.no_through_signal.snbt new file mode 100644 index 0000000000..008775e567 --- /dev/null +++ b/projects/common/src/testMod/resources/data/cctest/structures/relay_test.no_through_signal.snbt @@ -0,0 +1,141 @@ +{ + DataVersion: 2730, + size: [5, 5, 5], + data: [ + {pos: [0, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [0, 1, 0], state: "minecraft:air"}, + {pos: [0, 1, 1], state: "minecraft:air"}, + {pos: [0, 1, 2], state: "minecraft:air"}, + {pos: [0, 1, 3], state: "minecraft:air"}, + {pos: [0, 1, 4], state: "minecraft:air"}, + {pos: [1, 1, 0], state: "minecraft:air"}, + {pos: [1, 1, 1], state: "minecraft:air"}, + {pos: [1, 1, 2], state: "minecraft:air"}, + {pos: [1, 1, 3], state: "minecraft:air"}, + {pos: [1, 1, 4], state: "minecraft:air"}, + {pos: [2, 1, 0], state: "minecraft:lever{face:floor,facing:south,powered:false}"}, + {pos: [2, 1, 1], state: "minecraft:repeater{delay:1,facing:north,locked:false,powered:false}"}, + {pos: [2, 1, 2], state: "computercraft:redstone_relay{facing:north}"}, + {pos: [2, 1, 3], state: "minecraft:redstone_wire{east:none,north:side,power:0,south:none,west:none}"}, + {pos: [2, 1, 4], state: "minecraft:redstone_lamp{lit:false}"}, + {pos: [3, 1, 0], state: "minecraft:air"}, + {pos: [3, 1, 1], state: "minecraft:air"}, + {pos: [3, 1, 2], state: "minecraft:air"}, + {pos: [3, 1, 3], state: "minecraft:air"}, + {pos: [3, 1, 4], state: "minecraft:air"}, + {pos: [4, 1, 0], state: "minecraft:air"}, + {pos: [4, 1, 1], state: "minecraft:air"}, + {pos: [4, 1, 2], state: "minecraft:air"}, + {pos: [4, 1, 3], state: "minecraft:air"}, + {pos: [4, 1, 4], state: "minecraft:air"}, + {pos: [0, 2, 0], state: "minecraft:air"}, + {pos: [0, 2, 1], state: "minecraft:air"}, + {pos: [0, 2, 2], state: "minecraft:air"}, + {pos: [0, 2, 3], state: "minecraft:air"}, + {pos: [0, 2, 4], state: "minecraft:air"}, + {pos: [1, 2, 0], state: "minecraft:air"}, + {pos: [1, 2, 1], state: "minecraft:air"}, + {pos: [1, 2, 2], state: "minecraft:air"}, + {pos: [1, 2, 3], state: "minecraft:air"}, + {pos: [1, 2, 4], state: "minecraft:air"}, + {pos: [2, 2, 0], state: "minecraft:air"}, + {pos: [2, 2, 1], state: "minecraft:air"}, + {pos: [2, 2, 2], state: "minecraft:air"}, + {pos: [2, 2, 3], state: "minecraft:air"}, + {pos: [2, 2, 4], state: "minecraft:air"}, + {pos: [3, 2, 0], state: "minecraft:air"}, + {pos: [3, 2, 1], state: "minecraft:air"}, + {pos: [3, 2, 2], state: "minecraft:air"}, + {pos: [3, 2, 3], state: "minecraft:air"}, + {pos: [3, 2, 4], state: "minecraft:air"}, + {pos: [4, 2, 0], state: "minecraft:air"}, + {pos: [4, 2, 1], state: "minecraft:air"}, + {pos: [4, 2, 2], state: "minecraft:air"}, + {pos: [4, 2, 3], state: "minecraft:air"}, + {pos: [4, 2, 4], state: "minecraft:air"}, + {pos: [0, 3, 0], state: "minecraft:air"}, + {pos: [0, 3, 1], state: "minecraft:air"}, + {pos: [0, 3, 2], state: "minecraft:air"}, + {pos: [0, 3, 3], state: "minecraft:air"}, + {pos: [0, 3, 4], state: "minecraft:air"}, + {pos: [1, 3, 0], state: "minecraft:air"}, + {pos: [1, 3, 1], state: "minecraft:air"}, + {pos: [1, 3, 2], state: "minecraft:air"}, + {pos: [1, 3, 3], state: "minecraft:air"}, + {pos: [1, 3, 4], state: "minecraft:air"}, + {pos: [2, 3, 0], state: "minecraft:air"}, + {pos: [2, 3, 1], state: "minecraft:air"}, + {pos: [2, 3, 2], state: "minecraft:air"}, + {pos: [2, 3, 3], state: "minecraft:air"}, + {pos: [2, 3, 4], state: "minecraft:air"}, + {pos: [3, 3, 0], state: "minecraft:air"}, + {pos: [3, 3, 1], state: "minecraft:air"}, + {pos: [3, 3, 2], state: "minecraft:air"}, + {pos: [3, 3, 3], state: "minecraft:air"}, + {pos: [3, 3, 4], state: "minecraft:air"}, + {pos: [4, 3, 0], state: "minecraft:air"}, + {pos: [4, 3, 1], state: "minecraft:air"}, + {pos: [4, 3, 2], state: "minecraft:air"}, + {pos: [4, 3, 3], state: "minecraft:air"}, + {pos: [4, 3, 4], state: "minecraft:air"}, + {pos: [0, 4, 0], state: "minecraft:air"}, + {pos: [0, 4, 1], state: "minecraft:air"}, + {pos: [0, 4, 2], state: "minecraft:air"}, + {pos: [0, 4, 3], state: "minecraft:air"}, + {pos: [0, 4, 4], state: "minecraft:air"}, + {pos: [1, 4, 0], state: "minecraft:air"}, + {pos: [1, 4, 1], state: "minecraft:air"}, + {pos: [1, 4, 2], state: "minecraft:air"}, + {pos: [1, 4, 3], state: "minecraft:air"}, + {pos: [1, 4, 4], state: "minecraft:air"}, + {pos: [2, 4, 0], state: "minecraft:air"}, + {pos: [2, 4, 1], state: "minecraft:air"}, + {pos: [2, 4, 2], state: "minecraft:air"}, + {pos: [2, 4, 3], state: "minecraft:air"}, + {pos: [2, 4, 4], state: "minecraft:air"}, + {pos: [3, 4, 0], state: "minecraft:air"}, + {pos: [3, 4, 1], state: "minecraft:air"}, + {pos: [3, 4, 2], state: "minecraft:air"}, + {pos: [3, 4, 3], state: "minecraft:air"}, + {pos: [3, 4, 4], state: "minecraft:air"}, + {pos: [4, 4, 0], state: "minecraft:air"}, + {pos: [4, 4, 1], state: "minecraft:air"}, + {pos: [4, 4, 2], state: "minecraft:air"}, + {pos: [4, 4, 3], state: "minecraft:air"}, + {pos: [4, 4, 4], state: "minecraft:air"} + ], + entities: [], + palette: [ + "minecraft:polished_andesite", + "minecraft:redstone_lamp{lit:false}", + "computercraft:redstone_relay{facing:north}", + "minecraft:air", + "minecraft:lever{face:floor,facing:south,powered:false}", + "minecraft:repeater{delay:1,facing:north,locked:false,powered:false}", + "minecraft:redstone_wire{east:none,north:side,power:0,south:none,west:none}" + ] +} diff --git a/projects/common/src/testMod/resources/data/cctest/structures/relay_test.no_through_signal_reverse.snbt b/projects/common/src/testMod/resources/data/cctest/structures/relay_test.no_through_signal_reverse.snbt new file mode 100644 index 0000000000..d49021b89f --- /dev/null +++ b/projects/common/src/testMod/resources/data/cctest/structures/relay_test.no_through_signal_reverse.snbt @@ -0,0 +1,141 @@ +{ + DataVersion: 3120, + size: [5, 5, 5], + data: [ + {pos: [0, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [0, 1, 0], state: "minecraft:air"}, + {pos: [0, 1, 1], state: "minecraft:air"}, + {pos: [0, 1, 2], state: "minecraft:air"}, + {pos: [0, 1, 3], state: "minecraft:air"}, + {pos: [0, 1, 4], state: "minecraft:air"}, + {pos: [1, 1, 0], state: "minecraft:air"}, + {pos: [1, 1, 1], state: "minecraft:air"}, + {pos: [1, 1, 2], state: "minecraft:air"}, + {pos: [1, 1, 3], state: "minecraft:air"}, + {pos: [1, 1, 4], state: "minecraft:air"}, + {pos: [2, 1, 0], state: "minecraft:lever{face:floor,facing:south,powered:false}"}, + {pos: [2, 1, 1], state: "minecraft:repeater{delay:1,facing:north,locked:false,powered:false}"}, + {pos: [2, 1, 2], state: "computercraft:redstone_relay{facing:north}"}, + {pos: [2, 1, 3], state: "minecraft:redstone_wire{east:none,north:side,power:0,south:side,west:none}"}, + {pos: [2, 1, 4], state: "minecraft:redstone_lamp{lit:false}"}, + {pos: [3, 1, 0], state: "minecraft:air"}, + {pos: [3, 1, 1], state: "minecraft:air"}, + {pos: [3, 1, 2], state: "minecraft:air"}, + {pos: [3, 1, 3], state: "minecraft:air"}, + {pos: [3, 1, 4], state: "minecraft:air"}, + {pos: [4, 1, 0], state: "minecraft:air"}, + {pos: [4, 1, 1], state: "minecraft:air"}, + {pos: [4, 1, 2], state: "minecraft:air"}, + {pos: [4, 1, 3], state: "minecraft:air"}, + {pos: [4, 1, 4], state: "minecraft:air"}, + {pos: [0, 2, 0], state: "minecraft:air"}, + {pos: [0, 2, 1], state: "minecraft:air"}, + {pos: [0, 2, 2], state: "minecraft:air"}, + {pos: [0, 2, 3], state: "minecraft:air"}, + {pos: [0, 2, 4], state: "minecraft:air"}, + {pos: [1, 2, 0], state: "minecraft:air"}, + {pos: [1, 2, 1], state: "minecraft:air"}, + {pos: [1, 2, 2], state: "minecraft:air"}, + {pos: [1, 2, 3], state: "minecraft:air"}, + {pos: [1, 2, 4], state: "minecraft:air"}, + {pos: [2, 2, 0], state: "minecraft:air"}, + {pos: [2, 2, 1], state: "minecraft:air"}, + {pos: [2, 2, 2], state: "minecraft:air"}, + {pos: [2, 2, 3], state: "minecraft:air"}, + {pos: [2, 2, 4], state: "minecraft:air"}, + {pos: [3, 2, 0], state: "minecraft:air"}, + {pos: [3, 2, 1], state: "minecraft:air"}, + {pos: [3, 2, 2], state: "minecraft:air"}, + {pos: [3, 2, 3], state: "minecraft:air"}, + {pos: [3, 2, 4], state: "minecraft:air"}, + {pos: [4, 2, 0], state: "minecraft:air"}, + {pos: [4, 2, 1], state: "minecraft:air"}, + {pos: [4, 2, 2], state: "minecraft:air"}, + {pos: [4, 2, 3], state: "minecraft:air"}, + {pos: [4, 2, 4], state: "minecraft:air"}, + {pos: [0, 3, 0], state: "minecraft:air"}, + {pos: [0, 3, 1], state: "minecraft:air"}, + {pos: [0, 3, 2], state: "minecraft:air"}, + {pos: [0, 3, 3], state: "minecraft:air"}, + {pos: [0, 3, 4], state: "minecraft:air"}, + {pos: [1, 3, 0], state: "minecraft:air"}, + {pos: [1, 3, 1], state: "minecraft:air"}, + {pos: [1, 3, 2], state: "minecraft:air"}, + {pos: [1, 3, 3], state: "minecraft:air"}, + {pos: [1, 3, 4], state: "minecraft:air"}, + {pos: [2, 3, 0], state: "minecraft:air"}, + {pos: [2, 3, 1], state: "minecraft:air"}, + {pos: [2, 3, 2], state: "minecraft:air"}, + {pos: [2, 3, 3], state: "minecraft:air"}, + {pos: [2, 3, 4], state: "minecraft:air"}, + {pos: [3, 3, 0], state: "minecraft:air"}, + {pos: [3, 3, 1], state: "minecraft:air"}, + {pos: [3, 3, 2], state: "minecraft:air"}, + {pos: [3, 3, 3], state: "minecraft:air"}, + {pos: [3, 3, 4], state: "minecraft:air"}, + {pos: [4, 3, 0], state: "minecraft:air"}, + {pos: [4, 3, 1], state: "minecraft:air"}, + {pos: [4, 3, 2], state: "minecraft:air"}, + {pos: [4, 3, 3], state: "minecraft:air"}, + {pos: [4, 3, 4], state: "minecraft:air"}, + {pos: [0, 4, 0], state: "minecraft:air"}, + {pos: [0, 4, 1], state: "minecraft:air"}, + {pos: [0, 4, 2], state: "minecraft:air"}, + {pos: [0, 4, 3], state: "minecraft:air"}, + {pos: [0, 4, 4], state: "minecraft:air"}, + {pos: [1, 4, 0], state: "minecraft:air"}, + {pos: [1, 4, 1], state: "minecraft:air"}, + {pos: [1, 4, 2], state: "minecraft:air"}, + {pos: [1, 4, 3], state: "minecraft:air"}, + {pos: [1, 4, 4], state: "minecraft:air"}, + {pos: [2, 4, 0], state: "minecraft:air"}, + {pos: [2, 4, 1], state: "minecraft:air"}, + {pos: [2, 4, 2], state: "minecraft:air"}, + {pos: [2, 4, 3], state: "minecraft:air"}, + {pos: [2, 4, 4], state: "minecraft:air"}, + {pos: [3, 4, 0], state: "minecraft:air"}, + {pos: [3, 4, 1], state: "minecraft:air"}, + {pos: [3, 4, 2], state: "minecraft:air"}, + {pos: [3, 4, 3], state: "minecraft:air"}, + {pos: [3, 4, 4], state: "minecraft:air"}, + {pos: [4, 4, 0], state: "minecraft:air"}, + {pos: [4, 4, 1], state: "minecraft:air"}, + {pos: [4, 4, 2], state: "minecraft:air"}, + {pos: [4, 4, 3], state: "minecraft:air"}, + {pos: [4, 4, 4], state: "minecraft:air"} + ], + entities: [], + palette: [ + "minecraft:polished_andesite", + "minecraft:redstone_lamp{lit:false}", + "minecraft:air", + "minecraft:lever{face:floor,facing:south,powered:false}", + "minecraft:repeater{delay:1,facing:north,locked:false,powered:false}", + "minecraft:redstone_wire{east:none,north:side,power:0,south:side,west:none}", + "computercraft:redstone_relay{facing:north}" + ] +} diff --git a/projects/common/src/testMod/resources/data/cctest/structures/relay_test.self_output_update.snbt b/projects/common/src/testMod/resources/data/cctest/structures/relay_test.self_output_update.snbt new file mode 100644 index 0000000000..c0aacd1f4b --- /dev/null +++ b/projects/common/src/testMod/resources/data/cctest/structures/relay_test.self_output_update.snbt @@ -0,0 +1,137 @@ +{ + DataVersion: 3120, + size: [5, 5, 5], + data: [ + {pos: [0, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [0, 1, 0], state: "minecraft:air"}, + {pos: [0, 1, 1], state: "minecraft:air"}, + {pos: [0, 1, 2], state: "minecraft:air"}, + {pos: [0, 1, 3], state: "minecraft:air"}, + {pos: [0, 1, 4], state: "minecraft:air"}, + {pos: [1, 1, 0], state: "minecraft:air"}, + {pos: [1, 1, 1], state: "minecraft:air"}, + {pos: [1, 1, 2], state: "minecraft:air"}, + {pos: [1, 1, 3], state: "minecraft:air"}, + {pos: [1, 1, 4], state: "minecraft:air"}, + {pos: [2, 1, 0], state: "minecraft:air"}, + {pos: [2, 1, 1], state: "minecraft:air"}, + {pos: [2, 1, 2], state: "computercraft:redstone_relay{facing:north}"}, + {pos: [2, 1, 3], state: "minecraft:polished_andesite"}, + {pos: [2, 1, 4], state: "minecraft:air"}, + {pos: [3, 1, 0], state: "minecraft:air"}, + {pos: [3, 1, 1], state: "minecraft:air"}, + {pos: [3, 1, 2], state: "minecraft:air"}, + {pos: [3, 1, 3], state: "minecraft:air"}, + {pos: [3, 1, 4], state: "minecraft:air"}, + {pos: [4, 1, 0], state: "minecraft:air"}, + {pos: [4, 1, 1], state: "minecraft:air"}, + {pos: [4, 1, 2], state: "minecraft:air"}, + {pos: [4, 1, 3], state: "minecraft:air"}, + {pos: [4, 1, 4], state: "minecraft:air"}, + {pos: [0, 2, 0], state: "minecraft:air"}, + {pos: [0, 2, 1], state: "minecraft:air"}, + {pos: [0, 2, 2], state: "minecraft:air"}, + {pos: [0, 2, 3], state: "minecraft:air"}, + {pos: [0, 2, 4], state: "minecraft:air"}, + {pos: [1, 2, 0], state: "minecraft:air"}, + {pos: [1, 2, 1], state: "minecraft:air"}, + {pos: [1, 2, 2], state: "minecraft:air"}, + {pos: [1, 2, 3], state: "minecraft:air"}, + {pos: [1, 2, 4], state: "minecraft:air"}, + {pos: [2, 2, 0], state: "minecraft:air"}, + {pos: [2, 2, 1], state: "minecraft:air"}, + {pos: [2, 2, 2], state: "minecraft:air"}, + {pos: [2, 2, 3], state: "minecraft:air"}, + {pos: [2, 2, 4], state: "minecraft:air"}, + {pos: [3, 2, 0], state: "minecraft:air"}, + {pos: [3, 2, 1], state: "minecraft:air"}, + {pos: [3, 2, 2], state: "minecraft:air"}, + {pos: [3, 2, 3], state: "minecraft:air"}, + {pos: [3, 2, 4], state: "minecraft:air"}, + {pos: [4, 2, 0], state: "minecraft:air"}, + {pos: [4, 2, 1], state: "minecraft:air"}, + {pos: [4, 2, 2], state: "minecraft:air"}, + {pos: [4, 2, 3], state: "minecraft:air"}, + {pos: [4, 2, 4], state: "minecraft:air"}, + {pos: [0, 3, 0], state: "minecraft:air"}, + {pos: [0, 3, 1], state: "minecraft:air"}, + {pos: [0, 3, 2], state: "minecraft:air"}, + {pos: [0, 3, 3], state: "minecraft:air"}, + {pos: [0, 3, 4], state: "minecraft:air"}, + {pos: [1, 3, 0], state: "minecraft:air"}, + {pos: [1, 3, 1], state: "minecraft:air"}, + {pos: [1, 3, 2], state: "minecraft:air"}, + {pos: [1, 3, 3], state: "minecraft:air"}, + {pos: [1, 3, 4], state: "minecraft:air"}, + {pos: [2, 3, 0], state: "minecraft:air"}, + {pos: [2, 3, 1], state: "minecraft:air"}, + {pos: [2, 3, 2], state: "minecraft:air"}, + {pos: [2, 3, 3], state: "minecraft:air"}, + {pos: [2, 3, 4], state: "minecraft:air"}, + {pos: [3, 3, 0], state: "minecraft:air"}, + {pos: [3, 3, 1], state: "minecraft:air"}, + {pos: [3, 3, 2], state: "minecraft:air"}, + {pos: [3, 3, 3], state: "minecraft:air"}, + {pos: [3, 3, 4], state: "minecraft:air"}, + {pos: [4, 3, 0], state: "minecraft:air"}, + {pos: [4, 3, 1], state: "minecraft:air"}, + {pos: [4, 3, 2], state: "minecraft:air"}, + {pos: [4, 3, 3], state: "minecraft:air"}, + {pos: [4, 3, 4], state: "minecraft:air"}, + {pos: [0, 4, 0], state: "minecraft:air"}, + {pos: [0, 4, 1], state: "minecraft:air"}, + {pos: [0, 4, 2], state: "minecraft:air"}, + {pos: [0, 4, 3], state: "minecraft:air"}, + {pos: [0, 4, 4], state: "minecraft:air"}, + {pos: [1, 4, 0], state: "minecraft:air"}, + {pos: [1, 4, 1], state: "minecraft:air"}, + {pos: [1, 4, 2], state: "minecraft:air"}, + {pos: [1, 4, 3], state: "minecraft:air"}, + {pos: [1, 4, 4], state: "minecraft:air"}, + {pos: [2, 4, 0], state: "minecraft:air"}, + {pos: [2, 4, 1], state: "minecraft:air"}, + {pos: [2, 4, 2], state: "minecraft:air"}, + {pos: [2, 4, 3], state: "minecraft:air"}, + {pos: [2, 4, 4], state: "minecraft:air"}, + {pos: [3, 4, 0], state: "minecraft:air"}, + {pos: [3, 4, 1], state: "minecraft:air"}, + {pos: [3, 4, 2], state: "minecraft:air"}, + {pos: [3, 4, 3], state: "minecraft:air"}, + {pos: [3, 4, 4], state: "minecraft:air"}, + {pos: [4, 4, 0], state: "minecraft:air"}, + {pos: [4, 4, 1], state: "minecraft:air"}, + {pos: [4, 4, 2], state: "minecraft:air"}, + {pos: [4, 4, 3], state: "minecraft:air"}, + {pos: [4, 4, 4], state: "minecraft:air"} + ], + entities: [], + palette: [ + "minecraft:polished_andesite", + "minecraft:air", + "computercraft:redstone_relay{facing:north}" + ] +} diff --git a/projects/common/src/testMod/resources/data/cctest/structures/relay_test.set_and_destroy.snbt b/projects/common/src/testMod/resources/data/cctest/structures/relay_test.set_and_destroy.snbt new file mode 100644 index 0000000000..2078950b02 --- /dev/null +++ b/projects/common/src/testMod/resources/data/cctest/structures/relay_test.set_and_destroy.snbt @@ -0,0 +1,138 @@ +{ + DataVersion: 3120, + size: [5, 5, 5], + data: [ + {pos: [0, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [0, 1, 0], state: "minecraft:air"}, + {pos: [0, 1, 1], state: "minecraft:air"}, + {pos: [0, 1, 2], state: "minecraft:air"}, + {pos: [0, 1, 3], state: "minecraft:air"}, + {pos: [0, 1, 4], state: "minecraft:air"}, + {pos: [1, 1, 0], state: "minecraft:air"}, + {pos: [1, 1, 1], state: "minecraft:air"}, + {pos: [1, 1, 2], state: "minecraft:air"}, + {pos: [1, 1, 3], state: "minecraft:air"}, + {pos: [1, 1, 4], state: "minecraft:air"}, + {pos: [2, 1, 0], state: "minecraft:air"}, + {pos: [2, 1, 1], state: "minecraft:air"}, + {pos: [2, 1, 2], state: "computercraft:redstone_relay{facing:north}"}, + {pos: [2, 1, 3], state: "minecraft:redstone_lamp{lit:false}"}, + {pos: [2, 1, 4], state: "minecraft:air"}, + {pos: [3, 1, 0], state: "minecraft:air"}, + {pos: [3, 1, 1], state: "minecraft:air"}, + {pos: [3, 1, 2], state: "minecraft:air"}, + {pos: [3, 1, 3], state: "minecraft:air"}, + {pos: [3, 1, 4], state: "minecraft:air"}, + {pos: [4, 1, 0], state: "minecraft:air"}, + {pos: [4, 1, 1], state: "minecraft:air"}, + {pos: [4, 1, 2], state: "minecraft:air"}, + {pos: [4, 1, 3], state: "minecraft:air"}, + {pos: [4, 1, 4], state: "minecraft:air"}, + {pos: [0, 2, 0], state: "minecraft:air"}, + {pos: [0, 2, 1], state: "minecraft:air"}, + {pos: [0, 2, 2], state: "minecraft:air"}, + {pos: [0, 2, 3], state: "minecraft:air"}, + {pos: [0, 2, 4], state: "minecraft:air"}, + {pos: [1, 2, 0], state: "minecraft:air"}, + {pos: [1, 2, 1], state: "minecraft:air"}, + {pos: [1, 2, 2], state: "minecraft:air"}, + {pos: [1, 2, 3], state: "minecraft:air"}, + {pos: [1, 2, 4], state: "minecraft:air"}, + {pos: [2, 2, 0], state: "minecraft:air"}, + {pos: [2, 2, 1], state: "minecraft:air"}, + {pos: [2, 2, 2], state: "minecraft:air"}, + {pos: [2, 2, 3], state: "minecraft:air"}, + {pos: [2, 2, 4], state: "minecraft:air"}, + {pos: [3, 2, 0], state: "minecraft:air"}, + {pos: [3, 2, 1], state: "minecraft:air"}, + {pos: [3, 2, 2], state: "minecraft:air"}, + {pos: [3, 2, 3], state: "minecraft:air"}, + {pos: [3, 2, 4], state: "minecraft:air"}, + {pos: [4, 2, 0], state: "minecraft:air"}, + {pos: [4, 2, 1], state: "minecraft:air"}, + {pos: [4, 2, 2], state: "minecraft:air"}, + {pos: [4, 2, 3], state: "minecraft:air"}, + {pos: [4, 2, 4], state: "minecraft:air"}, + {pos: [0, 3, 0], state: "minecraft:air"}, + {pos: [0, 3, 1], state: "minecraft:air"}, + {pos: [0, 3, 2], state: "minecraft:air"}, + {pos: [0, 3, 3], state: "minecraft:air"}, + {pos: [0, 3, 4], state: "minecraft:air"}, + {pos: [1, 3, 0], state: "minecraft:air"}, + {pos: [1, 3, 1], state: "minecraft:air"}, + {pos: [1, 3, 2], state: "minecraft:air"}, + {pos: [1, 3, 3], state: "minecraft:air"}, + {pos: [1, 3, 4], state: "minecraft:air"}, + {pos: [2, 3, 0], state: "minecraft:air"}, + {pos: [2, 3, 1], state: "minecraft:air"}, + {pos: [2, 3, 2], state: "minecraft:air"}, + {pos: [2, 3, 3], state: "minecraft:air"}, + {pos: [2, 3, 4], state: "minecraft:air"}, + {pos: [3, 3, 0], state: "minecraft:air"}, + {pos: [3, 3, 1], state: "minecraft:air"}, + {pos: [3, 3, 2], state: "minecraft:air"}, + {pos: [3, 3, 3], state: "minecraft:air"}, + {pos: [3, 3, 4], state: "minecraft:air"}, + {pos: [4, 3, 0], state: "minecraft:air"}, + {pos: [4, 3, 1], state: "minecraft:air"}, + {pos: [4, 3, 2], state: "minecraft:air"}, + {pos: [4, 3, 3], state: "minecraft:air"}, + {pos: [4, 3, 4], state: "minecraft:air"}, + {pos: [0, 4, 0], state: "minecraft:air"}, + {pos: [0, 4, 1], state: "minecraft:air"}, + {pos: [0, 4, 2], state: "minecraft:air"}, + {pos: [0, 4, 3], state: "minecraft:air"}, + {pos: [0, 4, 4], state: "minecraft:air"}, + {pos: [1, 4, 0], state: "minecraft:air"}, + {pos: [1, 4, 1], state: "minecraft:air"}, + {pos: [1, 4, 2], state: "minecraft:air"}, + {pos: [1, 4, 3], state: "minecraft:air"}, + {pos: [1, 4, 4], state: "minecraft:air"}, + {pos: [2, 4, 0], state: "minecraft:air"}, + {pos: [2, 4, 1], state: "minecraft:air"}, + {pos: [2, 4, 2], state: "minecraft:air"}, + {pos: [2, 4, 3], state: "minecraft:air"}, + {pos: [2, 4, 4], state: "minecraft:air"}, + {pos: [3, 4, 0], state: "minecraft:air"}, + {pos: [3, 4, 1], state: "minecraft:air"}, + {pos: [3, 4, 2], state: "minecraft:air"}, + {pos: [3, 4, 3], state: "minecraft:air"}, + {pos: [3, 4, 4], state: "minecraft:air"}, + {pos: [4, 4, 0], state: "minecraft:air"}, + {pos: [4, 4, 1], state: "minecraft:air"}, + {pos: [4, 4, 2], state: "minecraft:air"}, + {pos: [4, 4, 3], state: "minecraft:air"}, + {pos: [4, 4, 4], state: "minecraft:air"} + ], + entities: [], + palette: [ + "minecraft:polished_andesite", + "minecraft:redstone_lamp{lit:false}", + "minecraft:air", + "computercraft:redstone_relay{facing:north}" + ] +} diff --git a/projects/common/src/testMod/resources/data/cctest/structures/turtle_test.craft_remainder.snbt b/projects/common/src/testMod/resources/data/cctest/structures/turtle_test.craft_remainder.snbt new file mode 100644 index 0000000000..414b09b7d1 --- /dev/null +++ b/projects/common/src/testMod/resources/data/cctest/structures/turtle_test.craft_remainder.snbt @@ -0,0 +1,137 @@ +{ + DataVersion: 3465, + size: [5, 5, 5], + data: [ + {pos: [0, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [0, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [1, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [2, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [3, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 0], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 1], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 2], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 3], state: "minecraft:polished_andesite"}, + {pos: [4, 0, 4], state: "minecraft:polished_andesite"}, + {pos: [0, 1, 0], state: "minecraft:air"}, + {pos: [0, 1, 1], state: "minecraft:air"}, + {pos: [0, 1, 2], state: "minecraft:air"}, + {pos: [0, 1, 3], state: "minecraft:air"}, + {pos: [0, 1, 4], state: "minecraft:air"}, + {pos: [1, 1, 0], state: "minecraft:air"}, + {pos: [1, 1, 1], state: "minecraft:air"}, + {pos: [1, 1, 2], state: "minecraft:air"}, + {pos: [1, 1, 3], state: "minecraft:air"}, + {pos: [1, 1, 4], state: "minecraft:air"}, + {pos: [2, 1, 0], state: "minecraft:air"}, + {pos: [2, 1, 1], state: "minecraft:air"}, + {pos: [2, 1, 2], state: "computercraft:turtle_normal{facing:north,waterlogged:false}", nbt: {ComputerId: 1, Fuel: 0, Items: [{Count: 1b, Slot: 0b, id: "computercraft:turtle_normal", tag: {Color: 13388876}}, {Count: 1b, Slot: 1b, id: "minecraft:wet_sponge"}], Label: "turtle_test.craft_remainder", LeftUpgrade: "minecraft:crafting_table", LeftUpgradeNbt: {}, On: 1b, Slot: 0, id: "computercraft:turtle_normal"}}, + {pos: [2, 1, 3], state: "minecraft:air"}, + {pos: [2, 1, 4], state: "minecraft:air"}, + {pos: [3, 1, 0], state: "minecraft:air"}, + {pos: [3, 1, 1], state: "minecraft:air"}, + {pos: [3, 1, 2], state: "minecraft:air"}, + {pos: [3, 1, 3], state: "minecraft:air"}, + {pos: [3, 1, 4], state: "minecraft:air"}, + {pos: [4, 1, 0], state: "minecraft:air"}, + {pos: [4, 1, 1], state: "minecraft:air"}, + {pos: [4, 1, 2], state: "minecraft:air"}, + {pos: [4, 1, 3], state: "minecraft:air"}, + {pos: [4, 1, 4], state: "minecraft:air"}, + {pos: [0, 2, 0], state: "minecraft:air"}, + {pos: [0, 2, 1], state: "minecraft:air"}, + {pos: [0, 2, 2], state: "minecraft:air"}, + {pos: [0, 2, 3], state: "minecraft:air"}, + {pos: [0, 2, 4], state: "minecraft:air"}, + {pos: [1, 2, 0], state: "minecraft:air"}, + {pos: [1, 2, 1], state: "minecraft:air"}, + {pos: [1, 2, 2], state: "minecraft:air"}, + {pos: [1, 2, 3], state: "minecraft:air"}, + {pos: [1, 2, 4], state: "minecraft:air"}, + {pos: [2, 2, 0], state: "minecraft:air"}, + {pos: [2, 2, 1], state: "minecraft:air"}, + {pos: [2, 2, 2], state: "minecraft:air"}, + {pos: [2, 2, 3], state: "minecraft:air"}, + {pos: [2, 2, 4], state: "minecraft:air"}, + {pos: [3, 2, 0], state: "minecraft:air"}, + {pos: [3, 2, 1], state: "minecraft:air"}, + {pos: [3, 2, 2], state: "minecraft:air"}, + {pos: [3, 2, 3], state: "minecraft:air"}, + {pos: [3, 2, 4], state: "minecraft:air"}, + {pos: [4, 2, 0], state: "minecraft:air"}, + {pos: [4, 2, 1], state: "minecraft:air"}, + {pos: [4, 2, 2], state: "minecraft:air"}, + {pos: [4, 2, 3], state: "minecraft:air"}, + {pos: [4, 2, 4], state: "minecraft:air"}, + {pos: [0, 3, 0], state: "minecraft:air"}, + {pos: [0, 3, 1], state: "minecraft:air"}, + {pos: [0, 3, 2], state: "minecraft:air"}, + {pos: [0, 3, 3], state: "minecraft:air"}, + {pos: [0, 3, 4], state: "minecraft:air"}, + {pos: [1, 3, 0], state: "minecraft:air"}, + {pos: [1, 3, 1], state: "minecraft:air"}, + {pos: [1, 3, 2], state: "minecraft:air"}, + {pos: [1, 3, 3], state: "minecraft:air"}, + {pos: [1, 3, 4], state: "minecraft:air"}, + {pos: [2, 3, 0], state: "minecraft:air"}, + {pos: [2, 3, 1], state: "minecraft:air"}, + {pos: [2, 3, 2], state: "minecraft:air"}, + {pos: [2, 3, 3], state: "minecraft:air"}, + {pos: [2, 3, 4], state: "minecraft:air"}, + {pos: [3, 3, 0], state: "minecraft:air"}, + {pos: [3, 3, 1], state: "minecraft:air"}, + {pos: [3, 3, 2], state: "minecraft:air"}, + {pos: [3, 3, 3], state: "minecraft:air"}, + {pos: [3, 3, 4], state: "minecraft:air"}, + {pos: [4, 3, 0], state: "minecraft:air"}, + {pos: [4, 3, 1], state: "minecraft:air"}, + {pos: [4, 3, 2], state: "minecraft:air"}, + {pos: [4, 3, 3], state: "minecraft:air"}, + {pos: [4, 3, 4], state: "minecraft:air"}, + {pos: [0, 4, 0], state: "minecraft:air"}, + {pos: [0, 4, 1], state: "minecraft:air"}, + {pos: [0, 4, 2], state: "minecraft:air"}, + {pos: [0, 4, 3], state: "minecraft:air"}, + {pos: [0, 4, 4], state: "minecraft:air"}, + {pos: [1, 4, 0], state: "minecraft:air"}, + {pos: [1, 4, 1], state: "minecraft:air"}, + {pos: [1, 4, 2], state: "minecraft:air"}, + {pos: [1, 4, 3], state: "minecraft:air"}, + {pos: [1, 4, 4], state: "minecraft:air"}, + {pos: [2, 4, 0], state: "minecraft:air"}, + {pos: [2, 4, 1], state: "minecraft:air"}, + {pos: [2, 4, 2], state: "minecraft:air"}, + {pos: [2, 4, 3], state: "minecraft:air"}, + {pos: [2, 4, 4], state: "minecraft:air"}, + {pos: [3, 4, 0], state: "minecraft:air"}, + {pos: [3, 4, 1], state: "minecraft:air"}, + {pos: [3, 4, 2], state: "minecraft:air"}, + {pos: [3, 4, 3], state: "minecraft:air"}, + {pos: [3, 4, 4], state: "minecraft:air"}, + {pos: [4, 4, 0], state: "minecraft:air"}, + {pos: [4, 4, 1], state: "minecraft:air"}, + {pos: [4, 4, 2], state: "minecraft:air"}, + {pos: [4, 4, 3], state: "minecraft:air"}, + {pos: [4, 4, 4], state: "minecraft:air"} + ], + entities: [], + palette: [ + "minecraft:polished_andesite", + "minecraft:air", + "computercraft:turtle_normal{facing:north,waterlogged:false}" + ] +} diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/lua/Coerced.java b/projects/core-api/src/main/java/dan200/computercraft/api/lua/Coerced.java index 50b40bcdfa..0d981641c5 100644 --- a/projects/core-api/src/main/java/dan200/computercraft/api/lua/Coerced.java +++ b/projects/core-api/src/main/java/dan200/computercraft/api/lua/Coerced.java @@ -11,12 +11,12 @@ * the given type, rather than requiring an exact type. * *

Example:

- *
{@code
+ * {@snippet lang="java" :
  * @LuaFunction
  * public final void doSomething(Coerced myString) {
  *   var value = myString.value();
  * }
- * }
+ * } * * @param value The argument value. * @param The type of the underlying value. diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/lua/GenericSource.java b/projects/core-api/src/main/java/dan200/computercraft/api/lua/GenericSource.java index 515967ed72..5ea1fa811b 100644 --- a/projects/core-api/src/main/java/dan200/computercraft/api/lua/GenericSource.java +++ b/projects/core-api/src/main/java/dan200/computercraft/api/lua/GenericSource.java @@ -21,16 +21,16 @@ *

* For example, the main CC: Tweaked mod defines a generic source for inventories, which works on {@code IItemHandler}s: * - *

{@code
+ * {@snippet lang="java" :
  * public class InventoryMethods implements GenericSource {
- *     \@LuaFunction( mainThread = true )
+ *     @LuaFunction(mainThread = true)
  *     public int size(IItemHandler inventory) {
  *         return inventory.getSlots();
  *     }
  *
  *     // ...
  * }
- * }
+ * } *

* New capabilities or block lookups (those not built into Forge/Fabric) must be explicitly registered using the * loader-specific API. diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/package-info.java b/projects/core-api/src/main/java/dan200/computercraft/api/package-info.java index a19a3583d0..9d15df9beb 100644 --- a/projects/core-api/src/main/java/dan200/computercraft/api/package-info.java +++ b/projects/core-api/src/main/java/dan200/computercraft/api/package-info.java @@ -7,11 +7,13 @@ *

* You probably want to start in the following places: *

    - *
  • {@link dan200.computercraft.api.peripheral.IPeripheral} for registering new peripherals.
  • + *
  • {@link dan200.computercraft.api.peripheral} for registering new peripherals.
  • *
  • * {@link dan200.computercraft.api.lua.LuaFunction} and {@link dan200.computercraft.api.lua.IArguments} for * adding methods to your peripheral or Lua objects. *
  • + *
  • {@link dan200.computercraft.api.turtle.ITurtleUpgrade} for turtle upgrades.
  • + *
  • {@link dan200.computercraft.api.pocket.IPocketUpgrade} for pocket upgrades.
  • *
*/ @DefaultQualifier(value = NonNull.class, locations = { diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/AttachedComputerSet.java b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/AttachedComputerSet.java new file mode 100644 index 0000000000..e55061f277 --- /dev/null +++ b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/AttachedComputerSet.java @@ -0,0 +1,129 @@ +// SPDX-FileCopyrightText: 2024 The CC: Tweaked Developers +// +// SPDX-License-Identifier: MPL-2.0 + +package dan200.computercraft.api.peripheral; + +import javax.annotation.Nullable; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.function.Consumer; + +/** + * A thread-safe collection of computers. + *

+ * This collection is intended to be used by peripherals that need to maintain a set of all attached computers. + *

+ * It is recommended to use over Java's built-in concurrent collections (e.g. {@link CopyOnWriteArraySet} or + * {@link ConcurrentHashMap}), as {@link AttachedComputerSet} ensures that computers cannot be accessed after they are + * detached, guaranteeing that {@link NotAttachedException}s will not be thrown. + *

+ * To ensure this, {@link AttachedComputerSet} is not directly iterable, as we cannot ensure that computers are not + * detached while the iterator is running (and so trying to use the computer would error). Instead, computers should be + * looped over using {@link #forEach(Consumer)}. + * + *

Example

+ * + * {@snippet lang="java" : + * public class MyPeripheral implements IPeripheral { + * private final AttachedComputerSet computers = new ComputerCollection(); + * + * @Override + * public void attach(IComputerAccess computer) { + * computers.add(computer); + * } + * + * @Override + * public void detach(IComputerAccess computer) { + * computers.remove(computer); + * } + * } + * } + * + * @see IComputerAccess + * @see IPeripheral#attach(IComputerAccess) + * @see IPeripheral#detach(IComputerAccess) + */ +public final class AttachedComputerSet { + private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + private final Set computers = new HashSet<>(0); + + /** + * Add a computer to this collection of computers. This should be called from + * {@link IPeripheral#attach(IComputerAccess)}. + * + * @param computer The computer to add. + */ + public void add(IComputerAccess computer) { + lock.writeLock().lock(); + try { + computers.add(computer); + } finally { + lock.writeLock().unlock(); + } + } + + /** + * Remove a computer from this collection of computers. This should be called from + * {@link IPeripheral#detach(IComputerAccess)}. + * + * @param computer The computer to remove. + */ + public void remove(IComputerAccess computer) { + lock.writeLock().lock(); + try { + computers.remove(computer); + } finally { + lock.writeLock().unlock(); + } + } + + /** + * Apply an action to each computer in this collection. + * + * @param action The action to apply. + */ + public void forEach(Consumer action) { + lock.readLock().lock(); + try { + computers.forEach(action); + } finally { + lock.readLock().unlock(); + } + } + + /** + * {@linkplain IComputerAccess#queueEvent(String, Object...) Queue an event} on all computers. + * + * @param event The name of the event to queue. + * @param arguments The arguments for this event. + * @see IComputerAccess#queueEvent(String, Object...) + */ + public void queueEvent(String event, @Nullable Object... arguments) { + forEach(c -> c.queueEvent(event, arguments)); + } + + /** + * Determine if this collection contains any computers. + *

+ * This method is primarily intended for presentation purposes (such as rendering an icon in the UI if a computer + * is attached to your peripheral). Due to the multi-threaded nature of peripherals, it is not recommended to guard + * any logic behind this check. + *

+ * For instance, {@code if(computers.hasComputers()) computers.queueEvent("foo");} contains a race condition, as + * there's no guarantee that any computers are still attached within the body of the if statement. + * + * @return Whether this collection is non-empty. + */ + public boolean hasComputers() { + lock.readLock().lock(); + try { + return !computers.isEmpty(); + } finally { + lock.readLock().unlock(); + } + } +} diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/GenericPeripheral.java b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/GenericPeripheral.java index bb866976e8..e288ee4494 100644 --- a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/GenericPeripheral.java +++ b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/GenericPeripheral.java @@ -19,17 +19,17 @@ public interface GenericPeripheral extends GenericSource { * Unlike normal {@link IPeripheral}s, {@link GenericPeripheral} do not have to have a type. By default, the * resulting peripheral uses the resource name of the wrapped block entity (for instance {@code minecraft:chest}). *

- * However, in some cases it may be more appropriate to specify a more readable name. Overriding this method allows - * you to do so. + * However, in some cases it may be more appropriate to specify a more readable name, or provide + * {@linkplain PeripheralType#getAdditionalTypes() additional types}. Overriding this method allows you to do so. *

- * When multiple {@link GenericPeripheral}s return a non-empty peripheral type for a single tile entity, the - * lexicographically smallest will be chosen. In order to avoid this conflict, this method should only be - * implemented when your peripheral targets a single tile entity AND it's likely that you're the - * only mod to do so. Similarly this should NOT be implemented when your methods target a - * capability or other interface (such as Forge's {@code IItemHandler}). + * When multiple {@link GenericPeripheral}s provide a {@linkplain PeripheralType#getPrimaryType() primary peripheral + * type} for a single block entity, the lexicographically smallest will be chosen. In order to avoid this conflict, + * primary types should only be used when your peripheral targets a single block entity AND it's + * likely that you're the only mod to do so. * * @return The type of this peripheral or {@link PeripheralType#untyped()}. * @see IPeripheral#getType() + * @see IPeripheral#getAdditionalTypes() */ default PeripheralType getType() { return PeripheralType.untyped(); diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/IDynamicPeripheral.java b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/IDynamicPeripheral.java index 6d2b96c4a3..230f7694fb 100644 --- a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/IDynamicPeripheral.java +++ b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/IDynamicPeripheral.java @@ -10,7 +10,6 @@ * A peripheral whose methods are not known at runtime. *

* This behaves similarly to {@link IDynamicLuaObject}, though also accepting the current {@link IComputerAccess}. - * Generally one may use {@link LuaFunction} instead of implementing this interface. */ public interface IDynamicPeripheral extends IPeripheral { /** diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java index ca3123a61a..1b80787f0c 100644 --- a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java +++ b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/IPeripheral.java @@ -4,19 +4,28 @@ package dan200.computercraft.api.peripheral; +import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.api.lua.LuaTask; import javax.annotation.Nullable; import java.util.Set; /** - * The interface that defines a peripheral. + * A peripheral is an external device that a computer can interact with. *

- * In order to expose a peripheral for your block or block entity, you should either attach a capability (Forge) or - * use the block lookup API (Fabric). This interface cannot be implemented directly on the block entity. + * Peripherals can be supplied by both a block (or block entity), or from + * {@linkplain dan200.computercraft.api.turtle.ITurtleUpgrade#createPeripheral(dan200.computercraft.api.turtle.ITurtleAccess, dan200.computercraft.api.turtle.TurtleSide) turtle} + * or {@linkplain dan200.computercraft.api.pocket.IPocketUpgrade#createPeripheral(dan200.computercraft.api.pocket.IPocketAccess) pocket} + * upgrades. *

- * Peripherals should provide a series of methods to the user, either using {@link LuaFunction} or by implementing - * {@link IDynamicPeripheral}. + * See the {@linkplain dan200.computercraft.api.peripheral package documentation} for more information on registering peripherals. + *

+ * Peripherals should provide a series of methods to the user, typically by annotating Java methods with + * {@link LuaFunction}. Alternatively, {@link IDynamicPeripheral} may be used to provide a dynamic set of methods. + * Remember that peripheral methods are called on the computer thread, and so it is not safe to interact with + * the Minecraft world by default. One should use {@link LuaFunction#mainThread()} or + * {@link ILuaContext#executeMainThreadTask(LuaTask)} to run code on the main server thread. */ public interface IPeripheral { /** @@ -24,6 +33,7 @@ public interface IPeripheral { * This can be queried from lua by calling {@code peripheral.getType()} * * @return A string identifying the type of peripheral. + * @see PeripheralType#getPrimaryType() */ String getType(); @@ -48,8 +58,9 @@ default Set getAdditionalTypes() { * {@code peripheral.call()}. This method can be used to keep track of which computers are attached to the * peripheral, or to take action when attachment occurs. *

- * Be aware that will be called from both the server thread and ComputerCraft Lua thread, and so must be thread-safe - * and reentrant. + * Be aware that may be called from both the server thread and ComputerCraft Lua thread, and so must be thread-safe + * and reentrant. If you need to store a list of attached computers, it is recommended you use a + * {@link AttachedComputerSet}. * * @param computer The interface to the computer that is being attached. Remember that multiple computers can be * attached to a peripheral at once. @@ -68,8 +79,9 @@ default void attach(IComputerAccess computer) { * This method can be used to keep track of which computers are attached to the peripheral, or to take action when * detachment occurs. *

- * Be aware that this will be called from both the server and ComputerCraft Lua thread, and must be thread-safe - * and reentrant. + * Be aware that this may be called from both the server and ComputerCraft Lua thread, and must be thread-safe + * and reentrant. If you need to store a list of attached computers, it is recommended you use a + * {@link AttachedComputerSet}. * * @param computer The interface to the computer that is being detached. Remember that multiple computers can be * attached to a peripheral at once. @@ -79,7 +91,7 @@ default void detach(IComputerAccess computer) { } /** - * Get the object that this peripheral provides methods for. This will generally be the tile entity + * Get the object that this peripheral provides methods for. This will generally be the block entity * or block, but may be an inventory, entity, etc... * * @return The object this peripheral targets @@ -93,7 +105,7 @@ default Object getTarget() { * Determine whether this peripheral is equivalent to another one. *

* The minimal example should at least check whether they are the same object. However, you may wish to check if - * they point to the same block or tile entity. + * they point to the same block or block entity. * * @param other The peripheral to compare against. This may be {@code null}. * @return Whether these peripherals are equivalent. diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/PeripheralType.java b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/PeripheralType.java index 08cc97448d..e651df0063 100644 --- a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/PeripheralType.java +++ b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/PeripheralType.java @@ -96,6 +96,7 @@ public static PeripheralType ofAdditional(String... additionalTypes) { * Get the name of this peripheral type. This may be {@code null}. * * @return The type of this peripheral. + * @see IPeripheral#getType() */ @Nullable public String getPrimaryType() { @@ -107,6 +108,7 @@ public String getPrimaryType() { * a peripheral might have. * * @return All additional types. + * @see IPeripheral#getAdditionalTypes() */ public Set getAdditionalTypes() { return additionalTypes; diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/WorkMonitor.java b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/WorkMonitor.java index 265285c869..49d44da1ca 100644 --- a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/WorkMonitor.java +++ b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/WorkMonitor.java @@ -11,7 +11,7 @@ * Monitors "work" associated with a computer, keeping track of how much a computer has done, and ensuring every * computer receives a fair share of any processing time. *

- * This is primarily intended for work done by peripherals on the main thread (such as on a tile entity's tick), but + * This is primarily intended for work done by peripherals on the main thread (such as on a block entity's tick), but * could be used for other purposes (such as complex computations done on another thread). *

* Before running a task, one should call {@link #canWork()} to determine if the computer is currently allowed to diff --git a/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/package-info.java b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/package-info.java new file mode 100644 index 0000000000..1ab029773b --- /dev/null +++ b/projects/core-api/src/main/java/dan200/computercraft/api/peripheral/package-info.java @@ -0,0 +1,155 @@ +// SPDX-FileCopyrightText: 2024 The CC: Tweaked Developers +// +// SPDX-License-Identifier: MPL-2.0 + +/** + * Peripherals for blocks and upgrades. + *

+ * A peripheral is an external device that a computer can interact with. Peripherals can be supplied by both a block (or + * block entity), or from {@linkplain dan200.computercraft.api.turtle.ITurtleUpgrade#createPeripheral(dan200.computercraft.api.turtle.ITurtleAccess, dan200.computercraft.api.turtle.TurtleSide) turtle} + * or {@linkplain dan200.computercraft.api.pocket.IPocketUpgrade#createPeripheral(dan200.computercraft.api.pocket.IPocketAccess) pocket} + * upgrades. + * + *

Creating peripherals for blocks

+ * One of the most common things you'll want to do with ComputerCraft's API is register new peripherals. This is + * relatively simple once you know how to do it, but may be a bit confusing the first time round. + *

+ * There are currently two possible ways to define a peripheral in ComputerCraft: + *

    + *
  • + *

    + * With a {@linkplain dan200.computercraft.api.peripheral.GenericPeripheral generic peripheral}: + * Generic peripherals are a way to add peripheral methods to any block entity, in a trait-based manner. This + * allows multiple mods to add methods to the same block entity. + *

    + * This is the recommended approach if you just want to add a couple of methods, and do not need any advanced + * functionality. + *

  • + *
  • + *

    + * With an {@link dan200.computercraft.api.peripheral.IPeripheral}: If your peripheral needs + * more advanced behaviour, such as knowing which computers it is attached to, then you can use an + * {@link dan200.computercraft.api.peripheral.IPeripheral}. + *

    + * These peripherals are currently NOT compatible with the generic peripheral system, so + * methods added by other mods (including CC's built-in inventory methods) will not be available. + *

  • + *
+ *

+ * In the following examples, we'll write a peripheral method that returns the remaining burn time of a furnace, and + * demonstrate how to register this peripheral. + * + *

Creating a generic peripheral

+ * First, we'll need to create a new {@code final} class, that implements {@link dan200.computercraft.api.peripheral.GenericPeripheral}. + * You'll need to implement {@link dan200.computercraft.api.peripheral.GenericPeripheral#id()}, which should just return + * some namespaced-string with your mod id. + *

+ * Then, we can start adding methods to your block entity. Each method should take its target type as the first + * argument, which in this case is a {@code AbstractFurnaceBlockEntity}. We then annotate this method with + * {@link dan200.computercraft.api.lua.LuaFunction} to expose it to computers. + *

+ * {@snippet lang="java" : + * import dan200.computercraft.api.lua.LuaFunction; + * import dan200.computercraft.api.peripheral.GenericPeripheral; + * import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; + * + * public final class FurnacePeripheral implements GenericPeripheral { + * @Override + * public String id() { + * return "mymod:furnace"; + * } + * + * @LuaFunction(mainThread = true) + * public int getBurnTime(AbstractFurnaceBlockEntity furnace) { + * return furnace.litTime; + * } + * } + * } + *

+ * Finally, we need to register our peripheral, so that ComputerCraft is aware of it: + *

+ * {@snippet lang="java" : + * import dan200.computercraft.api.ComputerCraftAPI; + * + * public class ComputerCraftCompat { + * public static void register() { + * ComputerCraftAPI.registerGenericSource(new FurnacePeripheral()); + * } + * } + * } + * + *

Creating a {@code IPeripheral}

+ * First, we'll need to create a new class that implements {@link dan200.computercraft.api.peripheral.IPeripheral}. This + * requires a couple of boilerplate methods: one to get the type of the peripheral, and an equality function. + *

+ * We can then start adding peripheral methods to our class. Each method should be {@code final}, and annotated with + * {@link dan200.computercraft.api.lua.LuaFunction}. + *

+ * {@snippet lang="java" : + * import dan200.computercraft.api.lua.LuaFunction; + * import dan200.computercraft.api.peripheral.IPeripheral; + * import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; + * import org.jetbrains.annotations.Nullable; + * + * public class FurnacePeripheral implements IPeripheral { + * private final AbstractFurnaceBlockEntity furnace; + * + * public FurnacePeripheral(AbstractFurnaceBlockEntity furnace) { + * this.furnace = furnace; + * } + * + * @Override + * public String getType() { + * return "furnace"; + * } + * + * @LuaFunction(mainThread = true) + * public final int getBurnTime() { + * return furnace.litTime; + * } + * + * @Override + * public boolean equals(@Nullable IPeripheral other) { + * return this == other || other instanceof FurnacePeripheral p && furnace == p.furnace; + * } + * } + * } + *

+ * Finally, we'll need to register our peripheral. This is done with capabilities on Forge, or the block lookup API on + * Fabric. + * + *

Registering {@code IPeripheral} on Forge

+ * Registering a peripheral on Forge can be done by using the capability API, via {@code PeripheralCapability}. + * + * {@snippet lang="java" : + * import dan200.computercraft.api.peripheral.PeripheralCapability; + * import net.minecraft.world.level.block.entity.BlockEntityType; + * import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; + * + * public class ComputerCraftCompat { + * public static void register(RegisterCapabilitiesEvent event) { + * event.registerBlockEntity(PeripheralCapability.get(), BlockEntityType.FURNACE, (f, s) -> new FurnacePeripheral(f)); + * event.registerBlockEntity(PeripheralCapability.get(), BlockEntityType.BLAST_FURNACE, (f, s) -> new FurnacePeripheral(f)); + * event.registerBlockEntity(PeripheralCapability.get(), BlockEntityType.SMOKER, (f, s) -> new FurnacePeripheral(f)); + * } + * } + * } + * + *

Registering {@code IPeripheral} on Fabric

+ * Registering a peripheral on Fabric can be done using the block lookup API, via {@code PeripheralLookup}. + * + * {@snippet lang="java" : + * import dan200.computercraft.api.peripheral.PeripheralLookup; + * import dan200.computercraft.example.FurnacePeripheral; + * import net.minecraft.world.level.block.entity.BlockEntityType; + * + * public class ComputerCraftCompat { + * public static void register() { + * PeripheralLookup.get().registerForBlockEntity((f, s) -> new FurnacePeripheral(f), BlockEntityType.FURNACE); + * PeripheralLookup.get().registerForBlockEntity((f, s) -> new FurnacePeripheral(f), BlockEntityType.BLAST_FURNACE); + * PeripheralLookup.get().registerForBlockEntity((f, s) -> new FurnacePeripheral(f), BlockEntityType.SMOKER); + * } + * } + * } + */ +package dan200.computercraft.api.peripheral; diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/IAPIEnvironment.java b/projects/core/src/main/java/dan200/computercraft/core/apis/IAPIEnvironment.java index a8b3e9112d..046fc3ac95 100644 --- a/projects/core/src/main/java/dan200/computercraft/core/apis/IAPIEnvironment.java +++ b/projects/core/src/main/java/dan200/computercraft/core/apis/IAPIEnvironment.java @@ -43,18 +43,6 @@ interface IPeripheralChangeListener { void queueEvent(String event, @Nullable Object... args); - void setOutput(ComputerSide side, int output); - - int getOutput(ComputerSide side); - - int getInput(ComputerSide side); - - void setBundledOutput(ComputerSide side, int output); - - int getBundledOutput(ComputerSide side); - - int getBundledInput(ComputerSide side); - void setPeripheralChangeListener(@Nullable IPeripheralChangeListener listener); @Nullable diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/OSAPI.java b/projects/core/src/main/java/dan200/computercraft/core/apis/OSAPI.java index 49c75e8cb6..3251004c3f 100644 --- a/projects/core/src/main/java/dan200/computercraft/core/apis/OSAPI.java +++ b/projects/core/src/main/java/dan200/computercraft/core/apis/OSAPI.java @@ -403,21 +403,39 @@ public final long epoch(Optional args) throws LuaException { * function. The format string can also be prefixed with an exclamation mark * ({@code !}) to use UTC time instead of the server's local timezone. *

- * If the format is exactly {@code *t} (optionally prefixed with {@code !}), a - * table will be returned instead. This table has fields for the year, month, - * day, hour, minute, second, day of the week, day of the year, and whether - * Daylight Savings Time is in effect. This table can be converted to a UNIX - * timestamp (days since 1 January 1970) with {@link #date}. + * If the format is exactly {@code "*t"} (or {@code "!*t"} ), a table + * representation of the timestamp will be returned instead. This table has + * fields for the year, month, day, hour, minute, second, day of the week, + * day of the year, and whether Daylight Savings Time is in effect. This + * table can be converted back to a timestamp with {@link #time(IArguments)}. * * @param formatA The format of the string to return. This defaults to {@code %c}, which expands to a string similar to "Sat Dec 24 16:58:00 2011". - * @param timeA The time to convert to a string. This defaults to the current time. - * @return The resulting format string. + * @param timeA The timestamp to convert to a string. This defaults to the current time. + * @return The resulting formated string, or table. * @throws LuaException If an invalid format is passed. * @cc.since 1.83.0 * @cc.usage Print the current date in a user-friendly string. *

{@code
      * os.date("%A %d %B %Y") -- See the reference above!
      * }
+ * + * @cc.usage Convert a timestamp to a table. + *
{@code
+     * os.date("!*t", 1242534247)
+     * --[=[ {
+     *   -- Date
+     *   year  = 2009,
+     *   month = 5,
+     *   day   = 17,
+     *   yday  = 137,
+     *   wday  = 1,
+     *   -- Time
+     *   hour  = 4,
+     *   min   = 24,
+     *   sec   = 7,
+     *   isdst = false,
+     * } ]=]
+     * }
*/ @LuaFunction public final Object date(Optional formatA, Optional timeA) throws LuaException { diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/RedstoneAPI.java b/projects/core/src/main/java/dan200/computercraft/core/apis/RedstoneAPI.java index 66f52ad314..212afca300 100644 --- a/projects/core/src/main/java/dan200/computercraft/core/apis/RedstoneAPI.java +++ b/projects/core/src/main/java/dan200/computercraft/core/apis/RedstoneAPI.java @@ -5,9 +5,9 @@ package dan200.computercraft.core.apis; import dan200.computercraft.api.lua.ILuaAPI; -import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.core.computer.ComputerSide; +import dan200.computercraft.core.redstone.RedstoneAccess; import java.util.List; @@ -53,11 +53,9 @@ * the Minecraft wiki." * @cc.module redstone */ -public class RedstoneAPI implements ILuaAPI { - private final IAPIEnvironment environment; - - public RedstoneAPI(IAPIEnvironment environment) { - this.environment = environment; +public class RedstoneAPI extends RedstoneMethods implements ILuaAPI { + public RedstoneAPI(RedstoneAccess environment) { + super(environment); } @Override @@ -76,131 +74,4 @@ public String[] getNames() { public final List getSides() { return ComputerSide.NAMES; } - - /** - * Turn the redstone signal of a specific side on or off. - * - * @param side The side to set. - * @param on Whether the redstone signal should be on or off. When on, a signal strength of 15 is emitted. - */ - @LuaFunction - public final void setOutput(ComputerSide side, boolean on) { - environment.setOutput(side, on ? 15 : 0); - } - - /** - * Get the current redstone output of a specific side. - * - * @param side The side to get. - * @return Whether the redstone output is on or off. - * @see #setOutput - */ - @LuaFunction - public final boolean getOutput(ComputerSide side) { - return environment.getOutput(side) > 0; - } - - /** - * Get the current redstone input of a specific side. - * - * @param side The side to get. - * @return Whether the redstone input is on or off. - */ - @LuaFunction - public final boolean getInput(ComputerSide side) { - return environment.getInput(side) > 0; - } - - /** - * Set the redstone signal strength for a specific side. - * - * @param side The side to set. - * @param value The signal strength between 0 and 15. - * @throws LuaException If {@code value} is not between 0 and 15. - * @cc.since 1.51 - */ - @LuaFunction({ "setAnalogOutput", "setAnalogueOutput" }) - public final void setAnalogOutput(ComputerSide side, int value) throws LuaException { - if (value < 0 || value > 15) throw new LuaException("Expected number in range 0-15"); - environment.setOutput(side, value); - } - - /** - * Get the redstone output signal strength for a specific side. - * - * @param side The side to get. - * @return The output signal strength, between 0 and 15. - * @cc.since 1.51 - * @see #setAnalogOutput - */ - @LuaFunction({ "getAnalogOutput", "getAnalogueOutput" }) - public final int getAnalogOutput(ComputerSide side) { - return environment.getOutput(side); - } - - /** - * Get the redstone input signal strength for a specific side. - * - * @param side The side to get. - * @return The input signal strength, between 0 and 15. - * @cc.since 1.51 - */ - @LuaFunction({ "getAnalogInput", "getAnalogueInput" }) - public final int getAnalogInput(ComputerSide side) { - return environment.getInput(side); - } - - /** - * Set the bundled cable output for a specific side. - * - * @param side The side to set. - * @param output The colour bitmask to set. - * @cc.see colors.subtract For removing a colour from the bitmask. - * @cc.see colors.combine For adding a color to the bitmask. - */ - @LuaFunction - public final void setBundledOutput(ComputerSide side, int output) { - environment.setBundledOutput(side, output); - } - - /** - * Get the bundled cable output for a specific side. - * - * @param side The side to get. - * @return The bundle cable's output. - */ - @LuaFunction - public final int getBundledOutput(ComputerSide side) { - return environment.getBundledOutput(side); - } - - /** - * Get the bundled cable input for a specific side. - * - * @param side The side to get. - * @return The bundle cable's input. - * @see #testBundledInput To determine if a specific colour is set. - */ - @LuaFunction - public final int getBundledInput(ComputerSide side) { - return environment.getBundledInput(side); - } - - /** - * Determine if a specific combination of colours are on for the given side. - * - * @param side The side to test. - * @param mask The mask to test. - * @return If the colours are on. - * @cc.usage Check if [`colors.white`] and [`colors.black`] are on above the computer. - *
{@code
-     * print(redstone.testBundledInput("top", colors.combine(colors.white, colors.black)))
-     * }
- * @see #getBundledInput - */ - @LuaFunction - public final boolean testBundledInput(ComputerSide side, int mask) { - var input = environment.getBundledInput(side); - return (input & mask) == mask; - } } diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/RedstoneMethods.java b/projects/core/src/main/java/dan200/computercraft/core/apis/RedstoneMethods.java new file mode 100644 index 0000000000..cd029a3f9c --- /dev/null +++ b/projects/core/src/main/java/dan200/computercraft/core/apis/RedstoneMethods.java @@ -0,0 +1,147 @@ +// Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission. +// +// SPDX-License-Identifier: LicenseRef-CCPL +package dan200.computercraft.core.apis; + +import dan200.computercraft.api.lua.LuaException; +import dan200.computercraft.api.lua.LuaFunction; +import dan200.computercraft.core.computer.ComputerSide; +import dan200.computercraft.core.redstone.RedstoneAccess; + +/** + * A base class for all blocks with redstone integration. + */ +public class RedstoneMethods { + private final RedstoneAccess redstone; + + public RedstoneMethods(RedstoneAccess redstone) { + this.redstone = redstone; + } + + /** + * Turn the redstone signal of a specific side on or off. + * + * @param side The side to set. + * @param on Whether the redstone signal should be on or off. When on, a signal strength of 15 is emitted. + */ + @LuaFunction + public final void setOutput(ComputerSide side, boolean on) { + redstone.setOutput(side, on ? 15 : 0); + } + + /** + * Get the current redstone output of a specific side. + * + * @param side The side to get. + * @return Whether the redstone output is on or off. + * @see #setOutput + */ + @LuaFunction + public final boolean getOutput(ComputerSide side) { + return redstone.getOutput(side) > 0; + } + + /** + * Get the current redstone input of a specific side. + * + * @param side The side to get. + * @return Whether the redstone input is on or off. + */ + @LuaFunction + public final boolean getInput(ComputerSide side) { + return redstone.getInput(side) > 0; + } + + /** + * Set the redstone signal strength for a specific side. + * + * @param side The side to set. + * @param value The signal strength between 0 and 15. + * @throws LuaException If {@code value} is not between 0 and 15. + * @cc.since 1.51 + */ + @LuaFunction({ "setAnalogOutput", "setAnalogueOutput" }) + public final void setAnalogOutput(ComputerSide side, int value) throws LuaException { + if (value < 0 || value > 15) throw new LuaException("Expected number in range 0-15"); + redstone.setOutput(side, value); + } + + /** + * Get the redstone output signal strength for a specific side. + * + * @param side The side to get. + * @return The output signal strength, between 0 and 15. + * @cc.since 1.51 + * @see #setAnalogOutput + */ + @LuaFunction({ "getAnalogOutput", "getAnalogueOutput" }) + public final int getAnalogOutput(ComputerSide side) { + return redstone.getOutput(side); + } + + /** + * Get the redstone input signal strength for a specific side. + * + * @param side The side to get. + * @return The input signal strength, between 0 and 15. + * @cc.since 1.51 + */ + @LuaFunction({ "getAnalogInput", "getAnalogueInput" }) + public final int getAnalogInput(ComputerSide side) { + return redstone.getInput(side); + } + + /** + * Set the bundled cable output for a specific side. + * + * @param side The side to set. + * @param output The colour bitmask to set. + * @cc.see colors.subtract For removing a colour from the bitmask. + * @cc.see colors.combine For adding a color to the bitmask. + */ + @LuaFunction + public final void setBundledOutput(ComputerSide side, int output) { + redstone.setBundledOutput(side, output); + } + + /** + * Get the bundled cable output for a specific side. + * + * @param side The side to get. + * @return The bundle cable's output. + */ + @LuaFunction + public final int getBundledOutput(ComputerSide side) { + return redstone.getBundledOutput(side); + } + + /** + * Get the bundled cable input for a specific side. + * + * @param side The side to get. + * @return The bundle cable's input. + * @see #testBundledInput To determine if a specific colour is set. + */ + @LuaFunction + public final int getBundledInput(ComputerSide side) { + return redstone.getBundledInput(side); + } + + /** + * Determine if a specific combination of colours are on for the given side. + * + * @param side The side to test. + * @param mask The mask to test. + * @return If the colours are on. + * @cc.usage Check if [`colors.white`] and [`colors.black`] are on above this block. + *
{@code
+     * print(redstone.testBundledInput("top", colors.combine(colors.white, colors.black)))
+     * }
+ * @see #getBundledInput + */ + @LuaFunction + public final boolean testBundledInput(ComputerSide side, int mask) { + var input = redstone.getBundledInput(side); + return (input & mask) == mask; + } +} diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/http/request/HttpRequestHandler.java b/projects/core/src/main/java/dan200/computercraft/core/apis/http/request/HttpRequestHandler.java index 7cba7a803f..005440e597 100644 --- a/projects/core/src/main/java/dan200/computercraft/core/apis/http/request/HttpRequestHandler.java +++ b/projects/core/src/main/java/dan200/computercraft/core/apis/http/request/HttpRequestHandler.java @@ -4,7 +4,6 @@ package dan200.computercraft.core.apis.http.request; -import dan200.computercraft.core.Logging; import dan200.computercraft.core.apis.handles.ArrayByteChannel; import dan200.computercraft.core.apis.handles.ReadHandle; import dan200.computercraft.core.apis.http.HTTPRequestException; @@ -162,7 +161,7 @@ public void channelRead0(ChannelHandlerContext ctx, HttpObject message) { @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { - LOG.error(Logging.HTTP_ERROR, "Error handling HTTP response", cause); + ctx.close(); request.failure(NetworkUtils.toFriendlyError(cause)); } diff --git a/projects/core/src/main/java/dan200/computercraft/core/apis/http/websocket/WebsocketHandle.java b/projects/core/src/main/java/dan200/computercraft/core/apis/http/websocket/WebsocketHandle.java index eafd04df02..11c4da7fe8 100644 --- a/projects/core/src/main/java/dan200/computercraft/core/apis/http/websocket/WebsocketHandle.java +++ b/projects/core/src/main/java/dan200/computercraft/core/apis/http/websocket/WebsocketHandle.java @@ -62,7 +62,7 @@ public final MethodResult receive(Optional timeout) throws LuaException ? environment.startTimer(Math.round(checkFinite(0, timeout.get()) / 0.05)) : -1; - return new ReceiveCallback(timeoutId).pull; + return new ReceiveCallback(environment, timeoutId).pull; } /** @@ -110,18 +110,22 @@ private void checkOpen() throws LuaException { private final class ReceiveCallback implements ILuaCallback { final MethodResult pull = MethodResult.pullEvent(null, this); + private final IAPIEnvironment environment; private final int timeoutId; - ReceiveCallback(int timeoutId) { + ReceiveCallback(IAPIEnvironment environment, int timeoutId) { this.timeoutId = timeoutId; + this.environment = environment; } @Override public MethodResult resume(Object[] event) { if (event.length >= 3 && Objects.equals(event[0], MESSAGE_EVENT) && Objects.equals(event[1], address)) { + environment.cancelTimer(timeoutId); return MethodResult.of(Arrays.copyOfRange(event, 2, event.length)); } else if (event.length >= 2 && Objects.equals(event[0], CLOSE_EVENT) && Objects.equals(event[1], address) && websocket.isClosed()) { // If the socket is closed abort. + environment.cancelTimer(timeoutId); return MethodResult.of(); } else if (event.length >= 2 && timeoutId != -1 && Objects.equals(event[0], TIMER_EVENT) && event[1] instanceof Number id && id.intValue() == timeoutId) { diff --git a/projects/core/src/main/java/dan200/computercraft/core/computer/Computer.java b/projects/core/src/main/java/dan200/computercraft/core/computer/Computer.java index 9b853bab6b..e3cb9f2e73 100644 --- a/projects/core/src/main/java/dan200/computercraft/core/computer/Computer.java +++ b/projects/core/src/main/java/dan200/computercraft/core/computer/Computer.java @@ -12,10 +12,10 @@ import dan200.computercraft.core.apis.IAPIEnvironment; import dan200.computercraft.core.computer.mainthread.MainThreadScheduler; import dan200.computercraft.core.filesystem.FileSystem; +import dan200.computercraft.core.redstone.RedstoneState; import dan200.computercraft.core.terminal.Terminal; import javax.annotation.Nullable; -import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; /** @@ -54,8 +54,7 @@ public class Computer { // Additional state about the computer and its environment. private final Environment internalEnvironment; - - private final AtomicInteger externalOutputChanges = new AtomicInteger(); + private final RedstoneState redstone = new RedstoneState(); private boolean startRequested; private int ticksSinceStart = -1; @@ -87,6 +86,10 @@ public Environment getEnvironment() { return internalEnvironment; } + public RedstoneState getRedstone() { + return redstone; + } + public IAPIEnvironment getAPIEnvironment() { return internalEnvironment; } @@ -157,10 +160,8 @@ public void tick() { executor.tick(); // Update the environment's internal state. + if (redstone.pollInputChanged()) queueEvent("redstone", null); internalEnvironment.tick(); - - // Propagate the environment's output to the world. - externalOutputChanges.accumulateAndGet(internalEnvironment.updateOutput(), (x, y) -> x | y); } /** @@ -168,8 +169,8 @@ public void tick() { * * @return What sides on the computer have changed. */ - public int pollAndResetChanges() { - return externalOutputChanges.getAndSet(0); + public int pollRedstoneChanges() { + return redstone.updateOutput(); } public boolean isBlinking() { diff --git a/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java b/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java index 4abed1117c..d9db834722 100644 --- a/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java +++ b/projects/core/src/main/java/dan200/computercraft/core/computer/ComputerExecutor.java @@ -153,11 +153,11 @@ final class ComputerExecutor implements ComputerScheduler.Worker { luaMethods = context.luaMethods(); executor = context.computerScheduler().createExecutor(this, metrics); - var environment = computer.getEnvironment(); + var environment = computer.getAPIEnvironment(); // Add all default APIs to the loaded list. addApi(new TermAPI(environment)); - addApi(new RedstoneAPI(environment)); + addApi(new RedstoneAPI(computer.getRedstone())); addApi(new FSAPI(environment)); addApi(new PeripheralAPI(environment, context.peripheralMethods())); addApi(new OSAPI(environment)); @@ -434,14 +434,13 @@ private void shutdown() throws InterruptedException { // Shutdown our APIs for (var api : apis) api.shutdown(); computer.getEnvironment().reset(); + computer.getRedstone().clearOutput(); // Unload filesystem if (fileSystem != null) { fileSystem.close(); fileSystem = null; } - - computer.getEnvironment().resetOutput(); } finally { isOnLock.unlock(); } diff --git a/projects/core/src/main/java/dan200/computercraft/core/computer/Environment.java b/projects/core/src/main/java/dan200/computercraft/core/computer/Environment.java index 15d38bfa1d..d1e10d5c45 100644 --- a/projects/core/src/main/java/dan200/computercraft/core/computer/Environment.java +++ b/projects/core/src/main/java/dan200/computercraft/core/computer/Environment.java @@ -16,24 +16,12 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import javax.annotation.Nullable; -import java.util.Arrays; import java.util.Iterator; /** * Represents the "environment" that a {@link Computer} exists in. *

- * This handles storing and updating of peripherals and redstone. - * - *

Redstone

- * We holds three kinds of arrays for redstone, in normal and bundled versions: - *
    - *
  • {@link #internalOutput} is the redstone output which the computer has currently set. This is read on both - * threads, and written on the computer thread.
  • - *
  • {@link #externalOutput} is the redstone output currently propagated to the world. This is only read and written - * on the main thread.
  • - *
  • {@link #input} is the redstone input from external sources. This is read on both threads, and written on the main - * thread.
  • - *
+ * This handles storing and updating of peripherals and timers. * *

Peripheral

* We also keep track of peripherals. These are read on both threads, and only written on the main thread. @@ -43,17 +31,6 @@ public final class Environment implements IAPIEnvironment { private final ComputerEnvironment environment; private final MetricsObserver metrics; - private boolean internalOutputChanged = false; - private final int[] internalOutput = new int[ComputerSide.COUNT]; - private final int[] internalBundledOutput = new int[ComputerSide.COUNT]; - - private final int[] externalOutput = new int[ComputerSide.COUNT]; - private final int[] externalBundledOutput = new int[ComputerSide.COUNT]; - - private boolean inputChanged = false; - private final int[] input = new int[ComputerSide.COUNT]; - private final int[] bundledInput = new int[ComputerSide.COUNT]; - private final IPeripheral[] peripherals = new IPeripheral[ComputerSide.COUNT]; private @Nullable IPeripheralChangeListener peripheralListener = null; @@ -111,76 +88,6 @@ public void queueEvent(String event, @Nullable Object... args) { computer.queueEvent(event, args); } - @Override - public int getInput(ComputerSide side) { - return input[side.ordinal()]; - } - - @Override - public int getBundledInput(ComputerSide side) { - return bundledInput[side.ordinal()]; - } - - @Override - public void setOutput(ComputerSide side, int output) { - var index = side.ordinal(); - synchronized (internalOutput) { - if (internalOutput[index] != output) { - internalOutput[index] = output; - internalOutputChanged = true; - } - } - } - - @Override - public int getOutput(ComputerSide side) { - synchronized (internalOutput) { - return computer.isOn() ? internalOutput[side.ordinal()] : 0; - } - } - - @Override - public void setBundledOutput(ComputerSide side, int output) { - var index = side.ordinal(); - synchronized (internalOutput) { - if (internalBundledOutput[index] != output) { - internalBundledOutput[index] = output; - internalOutputChanged = true; - } - } - } - - @Override - public int getBundledOutput(ComputerSide side) { - synchronized (internalOutput) { - return computer.isOn() ? internalBundledOutput[side.ordinal()] : 0; - } - } - - public int getExternalRedstoneOutput(ComputerSide side) { - return computer.isOn() ? externalOutput[side.ordinal()] : 0; - } - - public int getExternalBundledRedstoneOutput(ComputerSide side) { - return computer.isOn() ? externalBundledOutput[side.ordinal()] : 0; - } - - public void setRedstoneInput(ComputerSide side, int level) { - var index = side.ordinal(); - if (input[index] != level) { - input[index] = level; - inputChanged = true; - } - } - - public void setBundledRedstoneInput(ComputerSide side, int combination) { - var index = side.ordinal(); - if (bundledInput[index] != combination) { - bundledInput[index] = combination; - inputChanged = true; - } - } - /** * Called when the computer starts up or shuts down, to reset any internal state. * @@ -197,11 +104,6 @@ void reset() { * Called on the main thread to update the internal state of the computer. */ void tick() { - if (inputChanged) { - inputChanged = false; - queueEvent("redstone"); - } - synchronized (timers) { // Countdown all of our active timers Iterator> it = timers.int2ObjectEntrySet().iterator(); @@ -218,45 +120,6 @@ void tick() { } } - /** - * Called on the main thread to propagate the internal outputs to the external ones. - * - * @return If the outputs have changed. - */ - int updateOutput() { - // Mark output as changed if the internal redstone has changed - synchronized (internalOutput) { - if (!internalOutputChanged) return 0; - - var changed = 0; - - for (var i = 0; i < ComputerSide.COUNT; i++) { - if (externalOutput[i] != internalOutput[i]) { - externalOutput[i] = internalOutput[i]; - changed |= 1 << i; - } - - if (externalBundledOutput[i] != internalBundledOutput[i]) { - externalBundledOutput[i] = internalBundledOutput[i]; - changed |= 1 << i; - } - } - - internalOutputChanged = false; - - return changed; - } - } - - void resetOutput() { - // Reset redstone output - synchronized (internalOutput) { - Arrays.fill(internalOutput, 0); - Arrays.fill(internalBundledOutput, 0); - internalOutputChanged = true; - } - } - @Nullable @Override public IPeripheral getPeripheral(ComputerSide side) { diff --git a/projects/core/src/main/java/dan200/computercraft/core/computer/mainthread/MainThreadExecutor.java b/projects/core/src/main/java/dan200/computercraft/core/computer/mainthread/MainThreadExecutor.java index adf92fa7e8..e72978d253 100644 --- a/projects/core/src/main/java/dan200/computercraft/core/computer/mainthread/MainThreadExecutor.java +++ b/projects/core/src/main/java/dan200/computercraft/core/computer/mainthread/MainThreadExecutor.java @@ -30,7 +30,7 @@ *

* Now, if anywhere during this period, we use more than our allocated time slice, the executor is marked as * {@link State#HOT}. This means it will no longer be able to execute {@link MainThread} tasks (though will still - * execute tile entity tasks, in order to prevent the main thread from exhausting work every tick). + * execute block entity tasks, in order to prevent the main thread from exhausting work every tick). *

* At the beginning of the next tick, we increment the budget e by {@link MainThreadConfig#maxComputerTime()} and any * {@link State#HOT} executors are marked as {@link State#COOLING}. They will remain cooling until their budget is fully diff --git a/projects/core/src/main/java/dan200/computercraft/core/redstone/RedstoneAccess.java b/projects/core/src/main/java/dan200/computercraft/core/redstone/RedstoneAccess.java new file mode 100644 index 0000000000..524983e682 --- /dev/null +++ b/projects/core/src/main/java/dan200/computercraft/core/redstone/RedstoneAccess.java @@ -0,0 +1,63 @@ +// SPDX-FileCopyrightText: 2024 The CC: Tweaked Developers +// +// SPDX-License-Identifier: MPL-2.0 +package dan200.computercraft.core.redstone; + +import dan200.computercraft.core.apis.RedstoneMethods; +import dan200.computercraft.core.computer.ComputerSide; + +/** + * Common interface between blocks which provide and consume a redstone signal. + * + * @see RedstoneMethods Lua-facing methods wrapping this interface. + * @see RedstoneState A concrete implementation of this class. + */ +public interface RedstoneAccess { + /** + * Set the redstone output on a given side. + * + * @param side The side to set. + * @param output The output level, between 0 and 15. + */ + void setOutput(ComputerSide side, int output); + + /** + * Get the redstone output on a given side. + * + * @param side The side to get. + * @return The output level, between 0 and 15. + */ + int getOutput(ComputerSide side); + + /** + * Get the redstone input on a given side. + * + * @param side The side to get. + * @return The input level, between 0 and 15. + */ + int getInput(ComputerSide side); + + /** + * Set the bundled redstone output on a given side. + * + * @param side The side to set. + * @param output The output state, as a 16-bit bitmask. + */ + void setBundledOutput(ComputerSide side, int output); + + /** + * Get the bundled redstone output on a given side. + * + * @param side The side to get. + * @return The output state, as a 16-bit bitmask. + */ + int getBundledOutput(ComputerSide side); + + /** + * Set the bundled redstone input on a given side. + * + * @param side The side to get. + * @return The input state, as a 16-bit bitmask. + */ + int getBundledInput(ComputerSide side); +} diff --git a/projects/core/src/main/java/dan200/computercraft/core/redstone/RedstoneState.java b/projects/core/src/main/java/dan200/computercraft/core/redstone/RedstoneState.java new file mode 100644 index 0000000000..e2a6f0d9f8 --- /dev/null +++ b/projects/core/src/main/java/dan200/computercraft/core/redstone/RedstoneState.java @@ -0,0 +1,248 @@ +// Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission. +// +// SPDX-License-Identifier: LicenseRef-CCPL +package dan200.computercraft.core.redstone; + +import dan200.computercraft.core.computer.ComputerSide; + +import javax.annotation.Nullable; +import javax.annotation.concurrent.GuardedBy; +import java.util.Arrays; +import java.util.concurrent.locks.ReentrantLock; + +/** + * Manages the state of redstone inputs and ouputs on a computer (or other redstone emitting block). + *

+ * As computers execute on a separate thread to the main Minecraft world, computers cannot immediately read or write + * redstone values. Instead, we maintain a copy of the block's redstone inputs and outputs, and sync that with the + * Minecraft world when needed. + * + *

Input

+ * Redstone inputs should be propagated immediately to the internal state of the computer. Computers (and other redstone + * blocks) listen for block updates, fetch their neighbour's redstone state, and then call + * {@link #setInput(ComputerSide, int, int)}. + *

+ * However, we do not want to immediately schedule a {@code "redstone"} event, as otherwise we could schedule many + * events in a single tick. Instead, the next time the block is ticked, the consumer should call + * {@link #pollInputChanged()} and queue an event if needed. + * + *

Output

+ * In order to reduce block updates, we maintain a separate "internal" and "external" output state. Whenever a computer + * sets a redstone output, the "internal" state is updated, and a dirty flag is set. When the computer is ticked, + * {@link #updateOutput()} should be called, to copy the internal state to the external state. This returns a bitmask + * indicating which sides have changed. The external outputs may then be read with {@link #getExternalOutput(ComputerSide)} + * and {@link #getExternalBundledOutput(ComputerSide)}. + */ +public final class RedstoneState implements RedstoneAccess { + private final @Nullable Runnable onOutputChanged; + + private final ReentrantLock outputLock = new ReentrantLock(); + private @GuardedBy("outputLock") boolean internalOutputChanged = false; + private final @GuardedBy("outputLock") int[] internalOutput = new int[ComputerSide.COUNT]; + private final @GuardedBy("outputLock") int[] internalBundledOutput = new int[ComputerSide.COUNT]; + + private final int[] externalOutput = new int[ComputerSide.COUNT]; + private final int[] externalBundledOutput = new int[ComputerSide.COUNT]; + + private final ReentrantLock inputLock = new ReentrantLock(); + private boolean inputChanged = false; + private final @GuardedBy("inputLock") int[] input = new int[ComputerSide.COUNT]; + private final @GuardedBy("inputLock") int[] bundledInput = new int[ComputerSide.COUNT]; + + public RedstoneState() { + this(null); + } + + /** + * Construct a new {@link RedstoneState}, with a callback function to invoke when the internal output has + * changed. This function is called from the computer thread. + * + * @param outputChanged The function to invoke when output has changed. + */ + public RedstoneState(@Nullable Runnable outputChanged) { + this.onOutputChanged = outputChanged; + } + + @Override + public int getInput(ComputerSide side) { + inputLock.lock(); + try { + return input[side.ordinal()]; + } finally { + inputLock.unlock(); + } + } + + @Override + public int getBundledInput(ComputerSide side) { + inputLock.lock(); + try { + return bundledInput[side.ordinal()]; + } finally { + inputLock.unlock(); + } + } + + @Override + public void setOutput(ComputerSide side, int output) { + var index = side.ordinal(); + + outputLock.lock(); + try { + if (internalOutput[index] == output) return; + internalOutput[index] = output; + setOutputChanged(); + } finally { + outputLock.unlock(); + } + } + + @Override + public int getOutput(ComputerSide side) { + outputLock.lock(); + try { + return internalOutput[side.ordinal()]; + } finally { + outputLock.unlock(); + } + } + + @Override + public void setBundledOutput(ComputerSide side, int output) { + var index = side.ordinal(); + outputLock.lock(); + try { + if (internalBundledOutput[index] == output) return; + internalBundledOutput[index] = output; + setOutputChanged(); + } finally { + outputLock.unlock(); + } + } + + @Override + public int getBundledOutput(ComputerSide side) { + outputLock.lock(); + try { + return internalBundledOutput[side.ordinal()]; + } finally { + outputLock.unlock(); + } + } + + @GuardedBy("outputLock") + private void setOutputChanged() { + if (internalOutputChanged) return; + internalOutputChanged = true; + if (onOutputChanged != null) onOutputChanged.run(); + } + + /** + * Propagate redstone changes from the computer to the outside world. The effective outputs can be acquired with + * {@link #getExternalOutput(ComputerSide)} and {@link #getExternalBundledOutput(ComputerSide)}. + * + * @return A bitmask indicating which sides have changed (indexed via {@link ComputerSide#ordinal()}). + */ + public int updateOutput() { + outputLock.lock(); + try { + if (!internalOutputChanged) return 0; + + var changed = 0; + + for (var i = 0; i < ComputerSide.COUNT; i++) { + if (externalOutput[i] != internalOutput[i]) { + externalOutput[i] = internalOutput[i]; + changed |= 1 << i; + } + + if (externalBundledOutput[i] != internalBundledOutput[i]) { + externalBundledOutput[i] = internalBundledOutput[i]; + changed |= 1 << i; + } + } + + internalOutputChanged = false; + + return changed; + } finally { + outputLock.unlock(); + } + } + + /** + * Get the redstone output for a given side. + * + * @param side The side to get. + * @return The effective redstone output. + */ + public int getExternalOutput(ComputerSide side) { + return externalOutput[side.ordinal()]; + } + + /** + * Get the bundled redstone output for a given side. + * + * @param side The side to get. + * @return The effective bundled redstone output. + */ + public int getExternalBundledOutput(ComputerSide side) { + return externalBundledOutput[side.ordinal()]; + } + + /** + * Reset any redstone output set by the computer. + */ + public void clearOutput() { + outputLock.lock(); + try { + Arrays.fill(internalOutput, 0); + Arrays.fill(internalBundledOutput, 0); + internalOutputChanged = true; + } finally { + outputLock.unlock(); + } + } + + /** + * Set the redstone input for a given side. + * + * @param side The side to update. + * @param level The redstone level. + * @param bundledState The bundled redstone state. + * @return Whether the input has changed. + */ + public boolean setInput(ComputerSide side, int level, int bundledState) { + var index = side.ordinal(); + inputLock.lock(); + try { + var changed = false; + if (input[index] != level) { + input[index] = level; + changed = true; + } + + if (bundledInput[index] != bundledState) { + bundledInput[index] = bundledState; + changed = true; + } + + inputChanged |= changed; + return changed; + } finally { + inputLock.unlock(); + } + } + + /** + * Check whether any redstone inputs set by {@link #setInput(ComputerSide, int, int)} have changed since the last + * call to this function. + * + * @return Whether any redstone inputs has changed. + */ + public boolean pollInputChanged() { + var changed = inputChanged; + inputChanged = false; + return changed; + } +} diff --git a/projects/core/src/main/resources/data/computercraft/lua/rom/apis/gps.lua b/projects/core/src/main/resources/data/computercraft/lua/rom/apis/gps.lua index a884af2536..e9c33b833c 100644 --- a/projects/core/src/main/resources/data/computercraft/lua/rom/apis/gps.lua +++ b/projects/core/src/main/resources/data/computercraft/lua/rom/apis/gps.lua @@ -196,6 +196,8 @@ function locate(_nTimeout, _bDebug) modem.close(CHANNEL_GPS) end + os.cancelTimer(timeout) + -- Return the response if pos1 and pos2 then if _bDebug then diff --git a/projects/core/src/main/resources/data/computercraft/lua/rom/apis/rednet.lua b/projects/core/src/main/resources/data/computercraft/lua/rom/apis/rednet.lua index 097086a516..969e6082cb 100644 --- a/projects/core/src/main/resources/data/computercraft/lua/rom/apis/rednet.lua +++ b/projects/core/src/main/resources/data/computercraft/lua/rom/apis/rednet.lua @@ -298,6 +298,7 @@ function receive(protocol_filter, timeout) -- Return the first matching rednet_message local sender_id, message, protocol = p1, p2, p3 if protocol_filter == nil or protocol == protocol_filter then + if timer then os.cancelTimer(timer) end return sender_id, message, protocol end elseif event == "timer" then @@ -431,6 +432,7 @@ function lookup(protocol, hostname) if hostname == nil then table.insert(results, sender_id) elseif message.sHostname == hostname then + os.cancelTimer(timer) return sender_id end end @@ -440,6 +442,9 @@ function lookup(protocol, hostname) break end end + + os.cancelTimer(timer) + if results then return table.unpack(results) end diff --git a/projects/core/src/main/resources/data/computercraft/lua/rom/help/changelog.md b/projects/core/src/main/resources/data/computercraft/lua/rom/help/changelog.md index d0176a9969..d4bec476c5 100644 --- a/projects/core/src/main/resources/data/computercraft/lua/rom/help/changelog.md +++ b/projects/core/src/main/resources/data/computercraft/lua/rom/help/changelog.md @@ -1,3 +1,15 @@ +# New features in CC: Tweaked 1.114.0 + +* Add redstone relay peripheral. +* Add support for `math.atan(x, y)`. +* Update several translations. + +Several bug fixes: +* Fix pocket upgrades not appearing after crafting. +* Cancel `rednet.receive` and `Websocket.receive` timers after a message is received. +* Fix several issues with parsing and printing large doubles. +* Fix in-hand pocket computer being blank after changing dimension. + # New features in CC: Tweaked 1.113.1 * Update Japanese translation (konumatakaki). diff --git a/projects/core/src/main/resources/data/computercraft/lua/rom/help/whatsnew.md b/projects/core/src/main/resources/data/computercraft/lua/rom/help/whatsnew.md index c3684a6322..7828adb8a5 100644 --- a/projects/core/src/main/resources/data/computercraft/lua/rom/help/whatsnew.md +++ b/projects/core/src/main/resources/data/computercraft/lua/rom/help/whatsnew.md @@ -1,10 +1,13 @@ -New features in CC: Tweaked 1.113.1 +New features in CC: Tweaked 1.114.0 -* Update Japanese translation (konumatakaki). -* Improve performance of `textutils.urlEncode`. +* Add redstone relay peripheral. +* Add support for `math.atan(x, y)`. +* Update several translations. Several bug fixes: -* Fix overflow when converting recursive objects from Java to Lua. -* Fix websocket compression not working under Forge. +* Fix pocket upgrades not appearing after crafting. +* Cancel `rednet.receive` and `Websocket.receive` timers after a message is received. +* Fix several issues with parsing and printing large doubles. +* Fix in-hand pocket computer being blank after changing dimension. Type "help changelog" to see the full version history. diff --git a/projects/core/src/test/resources/test-rom/spec/apis/rednet_spec.lua b/projects/core/src/test/resources/test-rom/spec/apis/rednet_spec.lua index d808f13955..1554680031 100644 --- a/projects/core/src/test/resources/test-rom/spec/apis/rednet_spec.lua +++ b/projects/core/src/test/resources/test-rom/spec/apis/rednet_spec.lua @@ -171,6 +171,36 @@ describe("The rednet library", function() fake_computer.run_all { computer_1, computer_2 } end) + describe("timeouts", function() + it("can time out messages", function() + local computer = computer_with_rednet(1, function(rednet) + local id = rednet.receive(1) + expect(id):eq(nil) + end, { open = true }) + + local computers = { computer } + fake_computer.run_all(computers, false) + fake_computer.advance_all(computers, 1) + fake_computer.run_all(computers) + end) + + it("cancels the pending timer", function() + local computer = computer_with_rednet(1, function(rednet) + -- Send a message to ourselves with a timer + rednet.send(1, "hello") + local id = rednet.receive(1) + expect(id):eq(1) + end, { open = true }) + + fake_computer.run_all({ computer }) + + -- Our pending timer list only contains the rednet.run timer. + expect(computer.pending_timers):same { + [debugx.getupvalue(computer.env.rednet.run, "prune_received_timer")] = 10, + } + end) + end) + it("repeats messages between computers", function() local computer_1, modem_1 = computer_with_rednet(1, function(rednet) rednet.send(3, "Hello") diff --git a/projects/core/src/test/resources/test-rom/spec/support/fake_computer.lua b/projects/core/src/test/resources/test-rom/spec/support/fake_computer.lua index a07cc73420..e6d3a7d3e7 100644 --- a/projects/core/src/test/resources/test-rom/spec/support/fake_computer.lua +++ b/projects/core/src/test/resources/test-rom/spec/support/fake_computer.lua @@ -50,6 +50,7 @@ local function make_computer(id, fn) pending_timers[t], next_timer = clock + delay, next_timer + 1 return t end, + cancelTimer = function(id) pending_timers[id] = nil end, clock = function() return clock end, sleep = function(time) local timer = env.os.startTimer(time or 0) @@ -98,7 +99,16 @@ local function make_computer(id, fn) local position = vector.new(0, 0, 0) - return { env = env, peripherals = peripherals, queue_event = queue_event, step = step, co = co, advance = advance, position = position } + return { + env = env, + peripherals = peripherals, + queue_event = queue_event, + step = step, + co = co, + advance = advance, + position = position, + pending_timers = pending_timers, + } end local function parse_channel(c) diff --git a/projects/core/src/testFixtures/java/dan200/computercraft/test/core/apis/BasicApiEnvironment.java b/projects/core/src/testFixtures/java/dan200/computercraft/test/core/apis/BasicApiEnvironment.java index 9e9b76388a..dd75d2a32f 100644 --- a/projects/core/src/testFixtures/java/dan200/computercraft/test/core/apis/BasicApiEnvironment.java +++ b/projects/core/src/testFixtures/java/dan200/computercraft/test/core/apis/BasicApiEnvironment.java @@ -63,34 +63,6 @@ public void shutdown() { public void reboot() { } - @Override - public void setOutput(ComputerSide side, int output) { - } - - @Override - public int getOutput(ComputerSide side) { - return 0; - } - - @Override - public int getInput(ComputerSide side) { - return 0; - } - - @Override - public void setBundledOutput(ComputerSide side, int output) { - } - - @Override - public int getBundledOutput(ComputerSide side) { - return 0; - } - - @Override - public int getBundledInput(ComputerSide side) { - return 0; - } - @Override public void setPeripheralChangeListener(@Nullable IPeripheralChangeListener listener) { } diff --git a/projects/fabric/src/client/java/dan200/computercraft/mixin/client/MinecraftMixin.java b/projects/fabric/src/client/java/dan200/computercraft/mixin/client/MinecraftMixin.java index 476f21d8c6..7288723b97 100644 --- a/projects/fabric/src/client/java/dan200/computercraft/mixin/client/MinecraftMixin.java +++ b/projects/fabric/src/client/java/dan200/computercraft/mixin/client/MinecraftMixin.java @@ -7,6 +7,7 @@ import dan200.computercraft.client.ClientHooks; import dan200.computercraft.client.ClientRegistry; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.main.GameConfig; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.server.packs.resources.ReloadableResourceManager; @@ -29,6 +30,12 @@ private void updateLevelInEngines(ClientLevel screen, CallbackInfo ci) { ClientHooks.onWorldUnload(); } + @Inject(method = "disconnect(Lnet/minecraft/client/gui/screens/Screen;Z)V", at = @At("HEAD")) + @SuppressWarnings("unused") + private void disconnect(Screen screen, boolean keepResourcePacks, CallbackInfo ci) { + ClientHooks.onDisconnect(); + } + @Inject( method = "(Lnet/minecraft/client/main/GameConfig;)V", at = @At( diff --git a/projects/fabric/src/main/java/dan200/computercraft/shared/ComputerCraft.java b/projects/fabric/src/main/java/dan200/computercraft/shared/ComputerCraft.java index f1ad204115..6b583831b9 100644 --- a/projects/fabric/src/main/java/dan200/computercraft/shared/ComputerCraft.java +++ b/projects/fabric/src/main/java/dan200/computercraft/shared/ComputerCraft.java @@ -95,6 +95,7 @@ public static void init() { PeripheralLookup.get().registerForBlockEntity(WirelessModemBlockEntity::getPeripheral, ModRegistry.BlockEntities.WIRELESS_MODEM_ADVANCED.get()); PeripheralLookup.get().registerForBlockEntity(WiredModemFullBlockEntity::getPeripheral, ModRegistry.BlockEntities.WIRED_MODEM_FULL.get()); PeripheralLookup.get().registerForBlockEntity(CableBlockEntity::getPeripheral, ModRegistry.BlockEntities.CABLE.get()); + PeripheralLookup.get().registerForBlockEntity((b, d) -> b.peripheral(), ModRegistry.BlockEntities.REDSTONE_RELAY.get()); WiredElementLookup.get().registerForBlockEntity((b, d) -> b.getElement(), ModRegistry.BlockEntities.WIRED_MODEM_FULL.get()); WiredElementLookup.get().registerForBlockEntity(CableBlockEntity::getWiredElement, ModRegistry.BlockEntities.CABLE.get()); diff --git a/projects/forge/src/client/java/dan200/computercraft/client/ForgeClientHooks.java b/projects/forge/src/client/java/dan200/computercraft/client/ForgeClientHooks.java index 722dbb2032..f96fa88bc6 100644 --- a/projects/forge/src/client/java/dan200/computercraft/client/ForgeClientHooks.java +++ b/projects/forge/src/client/java/dan200/computercraft/client/ForgeClientHooks.java @@ -37,6 +37,10 @@ public static void onWorldUnload(LevelEvent.Unload event) { if (event.getLevel().isClientSide()) ClientHooks.onWorldUnload(); } + @SubscribeEvent + public static void onDisconnect(ClientPlayerNetworkEvent.LoggingOut event) { + ClientHooks.onDisconnect(); + } @SubscribeEvent public static void drawHighlight(RenderHighlightEvent.Block event) { diff --git a/projects/forge/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java b/projects/forge/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java index 2f327ec7c6..78287e2766 100644 --- a/projects/forge/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java +++ b/projects/forge/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java @@ -1,6 +1,6 @@ // SPDX-FileCopyrightText: 2020 The CC: Tweaked Developers // -// SPDX-License-Identifier: LicenseRef-CCPL +// SPDX-License-Identifier: MPL-2.0 package dan200.computercraft.shared.peripheral.generic.methods; diff --git a/projects/web/src/htmlTransform/export/index.json b/projects/web/src/htmlTransform/export/index.json index 90794b5d78..b44d6e582b 100644 --- a/projects/web/src/htmlTransform/export/index.json +++ b/projects/web/src/htmlTransform/export/index.json @@ -14,6 +14,7 @@ "computercraft:printed_page": "Printed Page", "computercraft:printed_pages": "Printed Pages", "computercraft:printer": "Printer", + "computercraft:redstone_relay": "Redstone Relay", "computercraft:speaker": "Speaker", "computercraft:treasure_disk": "Floppy Disk", "computercraft:turtle_advanced": "Advanced Turtle", @@ -48,6 +49,7 @@ "minecraft:purple_dye": "Purple Dye", "minecraft:red_dye": "Red Dye", "minecraft:redstone": "Redstone Dust", + "minecraft:stick": "Stick", "minecraft:stone": "Stone", "minecraft:string": "String", "minecraft:white_dye": "White Dye", @@ -90,7 +92,7 @@ ["minecraft:gold_ingot"], ["minecraft:gold_ingot"], ["minecraft:gold_ingot"], - ["computercraft:computer_advanced"], + ["computercraft:computer_normal"], ["minecraft:gold_ingot"], ["minecraft:gold_ingot"], null, @@ -281,6 +283,21 @@ "output": "computercraft:printer", "count": 1 }, + "computercraft:redstone_relay": { + "inputs": [ + ["minecraft:stone"], + ["minecraft:redstone"], + ["minecraft:stone"], + ["minecraft:redstone"], + ["computercraft:wired_modem"], + ["minecraft:redstone"], + ["minecraft:stone"], + ["minecraft:redstone"], + ["minecraft:stone"] + ], + "output": "computercraft:redstone_relay", + "count": 1 + }, "computercraft:speaker": { "inputs": [ ["minecraft:stone"], @@ -311,13 +328,43 @@ "output": "computercraft:turtle_advanced", "count": 1 }, + "computercraft:turtle_advanced_overlays/turtle_rainbow_overlay": { + "inputs": [ + ["minecraft:red_dye"], + ["minecraft:orange_dye"], + ["minecraft:yellow_dye"], + ["minecraft:green_dye"], + ["minecraft:blue_dye"], + ["minecraft:purple_dye"], + ["minecraft:stick"], + ["computercraft:turtle_advanced"], + null + ], + "output": "computercraft:turtle_advanced", + "count": 1 + }, + "computercraft:turtle_advanced_overlays/turtle_trans_overlay": { + "inputs": [ + ["minecraft:light_blue_dye"], + ["minecraft:pink_dye"], + ["minecraft:white_dye"], + ["minecraft:stick"], + ["computercraft:turtle_advanced"], + null, + null, + null, + null + ], + "output": "computercraft:turtle_advanced", + "count": 1 + }, "computercraft:turtle_advanced_upgrade": { "inputs": [ ["minecraft:gold_ingot"], ["minecraft:gold_ingot"], ["minecraft:gold_ingot"], ["minecraft:gold_ingot"], - ["computercraft:computer_advanced"], + ["computercraft:turtle_normal"], ["minecraft:gold_ingot"], null, ["minecraft:gold_block"], @@ -341,6 +388,36 @@ "output": "computercraft:turtle_normal", "count": 1 }, + "computercraft:turtle_normal_overlays/turtle_rainbow_overlay": { + "inputs": [ + ["minecraft:red_dye"], + ["minecraft:orange_dye"], + ["minecraft:yellow_dye"], + ["minecraft:green_dye"], + ["minecraft:blue_dye"], + ["minecraft:purple_dye"], + ["minecraft:stick"], + ["computercraft:turtle_normal"], + null + ], + "output": "computercraft:turtle_normal", + "count": 1 + }, + "computercraft:turtle_normal_overlays/turtle_trans_overlay": { + "inputs": [ + ["minecraft:light_blue_dye"], + ["minecraft:pink_dye"], + ["minecraft:white_dye"], + ["minecraft:stick"], + ["computercraft:turtle_normal"], + null, + null, + null, + null + ], + "output": "computercraft:turtle_normal", + "count": 1 + }, "computercraft:wired_modem": { "inputs": [ ["minecraft:stone"], @@ -397,4 +474,4 @@ "count": 1 } } -} +} \ No newline at end of file diff --git a/projects/web/src/htmlTransform/export/items/computercraft/redstone_relay.png b/projects/web/src/htmlTransform/export/items/computercraft/redstone_relay.png new file mode 100644 index 0000000000..fd4e6e7963 Binary files /dev/null and b/projects/web/src/htmlTransform/export/items/computercraft/redstone_relay.png differ diff --git a/projects/web/src/htmlTransform/export/items/minecraft/stick.png b/projects/web/src/htmlTransform/export/items/minecraft/stick.png new file mode 100644 index 0000000000..de8d2cd6ec Binary files /dev/null and b/projects/web/src/htmlTransform/export/items/minecraft/stick.png differ diff --git a/projects/web/src/main/java/cc/tweaked/web/stub/ReentrantLock.java b/projects/web/src/main/java/cc/tweaked/web/stub/ReentrantLock.java index ebe15a2f75..28fe99018e 100644 --- a/projects/web/src/main/java/cc/tweaked/web/stub/ReentrantLock.java +++ b/projects/web/src/main/java/cc/tweaked/web/stub/ReentrantLock.java @@ -8,6 +8,9 @@ * A no-op stub for {@link java.util.concurrent.locks.ReentrantLock}. */ public class ReentrantLock { + public void lock() { + } + public boolean tryLock() { return true; }