From c441af9d8d0d6f8a30a3c3a4770ed4fdabbfa9b8 Mon Sep 17 00:00:00 2001 From: Sakura Ryoko Date: Tue, 22 Oct 2024 20:37:02 -0400 Subject: [PATCH] Squashed commit of the following: commit 1bec8b5faa1642005710614e7190e1289da8d0e6 Author: Sakura Ryoko Date: Tue Oct 22 20:28:59 2024 -0400 Port to REL commit 434de693e9e88f7cf91cd3b5e349f3b2ccdb7476 Author: Sakura Ryoko Date: Mon Oct 21 21:36:54 2024 -0400 minor code cleanup commit 8343ea1f1defbc5d2f341cb40151e3a0aa23d895 Author: Sakura Ryoko Date: Mon Oct 21 20:43:38 2024 -0400 Fix Debug Rendering workflow, and fix Pathfinding, BeeData, and Villager Debug Rendering. commit 425185cd8317b548b1d7b3928d40a59d34f8d794 Author: Sakura Ryoko Date: Sun Oct 20 19:49:38 2024 -0400 port to rc1, bump gradle to 8.10.2, loom 1.8 commit 0181a7c82430898f37f42b92095ef7726145d65f Author: Sakura Ryoko Date: Fri Oct 11 19:30:29 2024 -0400 some debug service fixing commit dfe4f7a635f57130a1ddd82ede04eb823e3e6441 Author: Sakura Ryoko Date: Fri Oct 11 10:40:28 2024 -0400 port to pre3 commit ad9442cc0c6f09ee193bcf5dddf4069877b1d2b7 Author: Sakura Ryoko Date: Thu Oct 10 20:51:19 2024 -0400 port to pre2, fix some of the debug renderers; and with using a new Servux Protocol commit ad42ebc48787a5c7e30b763c1f7e45e89b1f7955 Author: Sakura Ryoko Date: Thu Oct 10 20:35:10 2024 -0400 port to pre2, fix some of the debug renderers; and with using a new Servux Protocol commit a5632944f01d608d0ec03c44851d8f6af7de96a3 Author: Sakura Ryoko Date: Wed Oct 9 19:43:48 2024 -0400 malilib bump commit bd37cd8ed7f4593e76e0c3d551643f8241eb66d8 Author: Sakura Ryoko Date: Tue Oct 8 23:51:33 2024 -0400 malilib bump commit 2d44eb9d1f922885a318a7b916edfbc5d94904cc Author: Sakura Ryoko Date: Tue Oct 8 21:16:56 2024 -0400 fix Furnace XP info line & port to 1.21.2-pre.1 commit 9d1c088ccedf1cfe116abb2de95a07aac1d39765 Author: Sakura Ryoko Date: Sat Oct 5 00:02:00 2024 -0400 fix Recipe Manager Sync, add Player Experience info lines commit 6edafbcb9c4ed466eec3f2bc9d87db1b14d8c434 Author: Sakura Ryoko Date: Fri Oct 4 23:47:20 2024 -0400 fix Recipe Manager Sync, add Player Experience info lines commit cf941f685254f9d22486f4672273d342130fefc6 Author: Sakura Ryoko Date: Fri Oct 4 15:10:41 2024 -0400 Some missing items commit 6b3c348d4a563e4d688704bab389043e716ed435 Author: Sakura Ryoko Date: Fri Oct 4 14:05:04 2024 -0400 Yarn build 9 commit 253a7c23f7c8ff810ac33d640a6fe85eba8f0ecb Author: Sakura Ryoko Date: Thu Oct 3 00:16:10 2024 -0400 HudMetadata channel bootstrap. commit 9e519c1a2aa7d402854aee14a114622c667436c9 Author: Sakura Ryoko Date: Wed Oct 2 15:42:02 2024 -0400 port to 24w40a commit 8c4d43a7e6fcc706a621f3c27c1c56680a65fe0e Author: Sakura Ryoko Date: Tue Oct 1 19:36:24 2024 -0400 add Horse Fix code from 1.21 commit decba79c037726ce2443374145d385616d699800 Author: Sakura Ryoko Date: Mon Sep 30 20:29:23 2024 -0400 merge "villager price range" PR commit 5bc42decd8e39b0d9f024b1909d58b2948320516 Author: DreamingLri <63730641+DreamingLri@users.noreply.github.com> Date: Tue Oct 1 08:20:46 2024 +0800 add villagerOfferPriceRange (#56) commit c707cf99a5a84751c9fc1b45a2c0378bf9a20751 Author: Sakura Ryoko Date: Mon Sep 30 20:12:02 2024 -0400 fix: Slime Chunks shouldn't render when there are none to render commit 631d43313ec16a1e186ebb03b29935daa15a6c70 Author: Sakura Ryoko Date: Mon Sep 30 18:33:41 2024 -0400 fix: MobCapDataHandler.java when in Single Player commit ae75aeb52bb126ff456e3a429e11630ea9a5e70f Author: Sakura Ryoko Date: Mon Sep 30 01:00:07 2024 -0400 Added various Entity Variants, and fixed 'Servux' Info Line to be more useful. commit ac7057c6d54abf132dcfc45afaaaff3188fab0dc Author: Sakura Ryoko Date: Sun Sep 29 14:01:37 2024 -0400 update from yarn & rename Sheep Color to EntityVariant Info Line (Add more later) commit 517276de9663bc1b4126754ee9520b000810e281 Author: Sakura Ryoko Date: Sat Sep 28 10:25:55 2024 -0400 add ID tag to NbtQuery packet replies commit 69e02ffb318b00b4945bcbe7f4ec6ab824e20611 Author: Sakura Ryoko Date: Sat Sep 28 00:37:40 2024 -0400 Add weather handling from Servux, and "Sheep Color" Info Line. Should be useful when using Sheep Farms. commit acf2672ab033917883d416c45a39bcd9cdc6e1cb Author: Sakura Ryoko Date: Thu Sep 26 23:45:36 2024 -0400 NBT-Only Mode works well now for Info Lines. commit 49841dfdc8753d5c66655fae1342f83a4e9989de Author: Sakura Ryoko Date: Wed Sep 25 22:28:01 2024 -0400 Info Lines work begin commit 82a44ceb4c0593ead86e11bd74f6207a84a51ec0 Author: Sakura Ryoko Date: Wed Sep 25 21:29:28 2024 -0400 inventoryPreview/Data Sync seems to function now without needing to store NBT data in the Client World. (Now need to update the Info Lines to use raw NBT data, if available) commit 7767af56561a7374ce888b4df69874ba79041572 Author: Sakura Ryoko Date: Wed Sep 25 14:21:54 2024 -0400 port to 24w39a commit 558e5372c884414341e6e2da1da123569c4c8020 Author: Sakura Ryoko Date: Tue Sep 24 23:23:26 2024 -0400 almost there. commit a977bd25bc6c9f38cd4b9eceac1b5e8e5d0bbd86 Author: Sakura Ryoko Date: Tue Sep 24 00:42:46 2024 -0400 Update gradle.properties commit 23208d76b6f09c46f193c35c406d37dcd59232db Author: Sakura Ryoko Date: Mon Sep 23 17:11:45 2024 -0400 malilib bump commit 6e6d5ebaa4035d9dbbcb19d01140599287e9fe22 Author: Sakura Ryoko Date: Mon Sep 23 00:16:02 2024 -0400 Oops :) commit fb41aa9593c1eaa947a8d189e2ad6d0c7b06e039 Author: Sakura Ryoko Date: Mon Sep 23 00:15:24 2024 -0400 prepare for more debug Renderer work commit 0a56297f48fd8bc432a42f531f93e607e87a378b Author: Sakura Ryoko Date: Sun Sep 22 22:23:11 2024 -0400 add locked slots rendering and fix IntegratedServer Block entities for inventoryPreview commit a59068267903f22ed90446859fbe7d7e438b0b08 Author: Sakura Ryoko <116967773+sakura-ryoko@users.noreply.github.com> Date: Wed Sep 18 15:03:04 2024 -0400 Update gradle.properties commit 0fb027102d8f228a5383bdbadf6aca4a5a7fe351 Author: Sakura Ryoko Date: Wed Sep 18 13:36:00 2024 -0400 port to 24w38a ( Broken FAPI ) commit 5334dc8b2b664f9ff74adac38cab23ae4409c81e Author: Sakura Ryoko Date: Fri Sep 13 16:03:05 2024 -0400 Use System.nanoTime() for RenderHandler commit b702ea22105eb0a66b9496d48a32f3900add6f3f Author: Sakura Ryoko Date: Fri Sep 13 15:58:30 2024 -0400 Use System.nanoTime() for RenderHandler commit 50212ba580f2163d83984c22ea0a826786b2f9d4 Author: Sakura Ryoko Date: Fri Sep 13 00:25:27 2024 -0400 yarn build 4 commit e0c1ddbb3030f5f3957527432ee5973b2429d329 Author: Sakura Ryoko Date: Wed Sep 11 22:32:30 2024 -0400 add worldSeed handling from Servux commit 6ef922bf4879044765568688c70aac96f5267598 Author: Sakura Ryoko Date: Wed Sep 11 19:21:33 2024 -0400 finish 24w37a port commit aaf2e87ff8c61c953e19a87b4db6eaf5c3bfb9d5 Author: Sakura Ryoko Date: Wed Sep 11 15:24:11 2024 -0400 WIP 24w37a commit 0bcf0239a1cd8147cbdaafe16a639a1b7d662910 Author: Sakura Ryoko Date: Tue Sep 10 01:47:31 2024 -0400 Moved Overlay Rendering to "PreWeather" MaLiLib renderPhase. commit 70403299c3f73e7eb787b6e90d7a903cf77d52dd Author: Sakura Ryoko Date: Tue Sep 10 01:33:25 2024 -0400 bump malilib commit 06017b9d44251159c0de2f2ab60f252e5fc5b14a Author: Sakura Ryoko Date: Sat Sep 7 16:19:46 2024 -0400 Clamp BottomY for 'Fabulous!' graphics and Spawn Chunk Renderer... commit 9dafa47d8acd5fbde1a1f660d2598bbe7136e928 Author: Sakura Ryoko Date: Sat Sep 7 13:30:28 2024 -0400 24w36a yarn build 6 commit 391bc30f952ba76346ec756f578883fa8e6bd2b8 Author: Sakura Ryoko Date: Fri Sep 6 17:43:29 2024 -0400 24w36a yarn build 6 commit a4155aa4f90e5677bb8587b27480848f8895907e Author: Sakura Ryoko Date: Thu Sep 5 23:30:51 2024 -0400 24w36a yarn build 5 commit b19e82f41cbf31219d4c3724a9a4d4f23b6465d5 Author: Sakura Ryoko Date: Thu Sep 5 23:30:22 2024 -0400 24w36a yarn build 5 commit dd5a8aebf22f6b1439837a92d4508f0eb731d107 Author: Sakura Ryoko <116967773+sakura-ryoko@users.noreply.github.com> Date: Thu Sep 5 08:29:44 2024 -0400 Update gradle.properties commit 823da5b561e29dd58639aebfbb2a879aed23c9b8 Author: Sakura Ryoko Date: Wed Sep 4 23:29:39 2024 -0400 24w36a yarn build 4 commit 5fd13a2fb7711d20296e98d0085fb0295b180dbc Author: Sakura Ryoko Date: Mon Sep 2 19:17:44 2024 -0400 working on some of the debug renderers commit 463e04700d6b6c8e3f8a8a85efb3145ce5f4ee31 Author: Sakura Ryoko Date: Mon Sep 2 13:36:48 2024 -0400 update Configs applu() commit 53a6d7bb7528c98f71bf831690b6559512cf9f08 Author: Sakura Ryoko Date: Fri Aug 30 01:33:58 2024 -0400 Yarn build 4 commit 3a773764688ebfc68d8494c92d53d9c9cda2050b Author: Sakura Ryoko Date: Thu Aug 29 00:00:24 2024 -0400 34w35a (Added a few Debug Renderer's) commit fe7d34f2651628693fe29590b86b2ff637ac3a96 Author: Sakura Ryoko Date: Tue Aug 27 22:24:32 2024 -0400 update yarn & test Iris commit dd783a6c1eab61d896085ff8d9c18da8242b6ac5 Author: Sakura Ryoko Date: Sun Aug 25 12:02:52 2024 -0400 text line rendering fixed for scaling commit 552be5d7071189726d73025d58e9644fc474ad8b Author: Sakura Ryoko Date: Fri Aug 23 20:59:27 2024 -0400 cleanup some calls commit 200deed5b917bc92cb54f592cce0779b402b89d7 Author: Sakura Ryoko Date: Fri Aug 23 00:55:12 2024 -0400 some strange global stack behavior ... commit c48ca2cb24b0eadf7f03fc2a6c9db83ec86a5857 Author: Sakura Ryoko Date: Thu Aug 22 01:27:07 2024 -0400 fixed shaders commit 8e90c36562b87d54f54dce92cac5e9cd65ad35fd Author: Sakura Ryoko Date: Wed Aug 21 22:41:24 2024 -0400 bump to 24w34a --> rendering broke again due to shaders commit 37d9fdee90912445375a4446920067816c53b237 Author: Sakura Ryoko Date: Wed Aug 21 02:15:48 2024 -0400 bump malilib with loom build 27 commit 9fd966778ca3565f0f0446408b83499056e6c21c Author: Sakura Ryoko Date: Mon Aug 19 23:23:31 2024 -0400 bump malilib, and overlays work again commit 53ac6b52a2449e676d89b7324c7e9eeb58dda84c Author: Sakura Ryoko Date: Sun Aug 18 16:37:31 2024 -0400 ported, fundamentally, but rendering is very broken --- build.gradle | 6 +- gradle.properties | 18 +- gradle/wrapper/gradle-wrapper.jar | Bin 43453 -> 43583 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 7 +- gradlew.bat | 2 + .../java/fi/dy/masa/minihud/InitHandler.java | 12 +- .../fi/dy/masa/minihud/config/Configs.java | 248 +-- .../fi/dy/masa/minihud/config/InfoToggle.java | 8 +- .../minihud/config/RendererCallbacks.java | 33 +- .../masa/minihud/config/RendererToggle.java | 41 +- .../masa/minihud/config/StructureToggle.java | 4 +- .../masa/minihud/data/DebugDataManager.java | 690 +++++++ ...aStorage.java => EntitiesDataManager.java} | 13 +- .../dy/masa/minihud/data/HudDataManager.java | 672 ++++++ .../masa/minihud/event/ClientTickHandler.java | 4 +- .../dy/masa/minihud/event/RenderHandler.java | 227 ++- .../dy/masa/minihud/event/ServerListener.java | 3 +- .../masa/minihud/event/WorldLoadListener.java | 28 +- .../minihud/gui/InventoryOverlayScreen.java | 6 +- .../dy/masa/minihud/hotkeys/KeyCallbacks.java | 2 + .../IMixinAbstractFurnaceBlockEntity.java | 5 +- .../dy/masa/minihud/mixin/IMixinEntity.java | 2 +- .../minihud/mixin/IMixinEntityNavigation.java | 2 +- .../masa/minihud/mixin/IMixinLeashable.java | 9 - .../minihud/mixin/IMixinMerchantEntity.java | 2 +- .../minihud/mixin/IMixinPassiveEntity.java | 2 +- .../mixin/IMixinServerRecipeManager.java | 13 + .../fi/dy/masa/minihud/mixin/IMixinWorld.java | 2 +- .../minihud/mixin/MixinBeaconBlockEntity.java | 4 +- .../MixinClientCommonNetworkHandler.java | 28 + .../mixin/MixinClientPlayNetworkHandler.java | 9 +- .../mixin/MixinConduitBlockEntity.java | 15 +- .../minihud/mixin/MixinDebugInfoSender.java | 20 - .../minihud/mixin/MixinDebugRenderer.java | 25 - .../dy/masa/minihud/mixin/MixinItemStack.java | 15 +- .../minihud/mixin/MixinMinecraftServer.java | 24 +- .../mixin/MixinResourcePackSendS2CPacket.java | 19 + .../masa/minihud/mixin/MixinServerWorld.java | 15 +- .../mixin/debug/IMixinDebugRenderer.java | 15 + .../minihud/mixin/debug/IMixinMobEntity.java | 13 + .../MixinBlockOutlineDebugRenderer.java | 11 +- .../MixinCollisionDebugRenderer.java | 2 +- .../mixin/debug/MixinDebugInfoSender.java | 156 ++ .../mixin/debug/MixinDebugRenderer.java | 38 + .../MixinHeightmapDebugRenderer.java | 11 +- .../MixinNeighborUpdateDebugRenderer.java | 11 +- .../masa/minihud/mixin/debug/MixinPath.java | 33 + .../mixin/debug/MixinSharedConstants.java | 30 + .../minihud/network/ServuxDebugHandler.java | 137 ++ .../minihud/network/ServuxDebugPacket.java | 352 ++++ .../network/ServuxEntitiesHandler.java | 12 +- .../minihud/network/ServuxHudHandler.java | 171 ++ .../masa/minihud/network/ServuxHudPacket.java | 375 ++++ .../network/ServuxStructuresHandler.java | 6 +- .../minihud/renderer/OverlayRenderer.java | 19 +- .../minihud/renderer/OverlayRendererBase.java | 17 +- .../renderer/OverlayRendererBiomeBorders.java | 17 +- .../renderer/OverlayRendererConduitRange.java | 2 +- .../renderer/OverlayRendererLightLevel.java | 10 +- .../OverlayRendererRandomTickableChunks.java | 2 +- .../renderer/OverlayRendererRegion.java | 2 +- .../renderer/OverlayRendererSlimeChunks.java | 10 +- .../renderer/OverlayRendererSpawnChunks.java | 39 +- .../renderer/OverlayRendererVillagerInfo.java | 13 +- .../minihud/renderer/RenderContainer.java | 31 +- .../minihud/renderer/RenderObjectBase.java | 10 +- .../minihud/renderer/RenderObjectVbo.java | 15 +- .../dy/masa/minihud/renderer/RenderUtils.java | 9 +- .../renderer/shapes/ShapeCircleBase.java | 1 + .../fi/dy/masa/minihud/util/ConduitExtra.java | 6 +- .../fi/dy/masa/minihud/util/DataStorage.java | 426 +--- .../dy/masa/minihud/util/DebugInfoUtils.java | 176 +- .../fi/dy/masa/minihud/util/EntityUtils.java | 7 +- .../fi/dy/masa/minihud/util/MiscUtils.java | 85 +- .../dy/masa/minihud/util/RayTraceUtils.java | 18 +- .../resources/assets/minihud/lang/en_us.json | 62 +- .../resources/assets/minihud/lang/zh_cn.json | 1802 +++++++++-------- .../resources/assets/minihud/lang/zh_tw.json | 1800 ++++++++-------- src/main/resources/fabric.mod.json | 4 +- 80 files changed, 5567 insertions(+), 2626 deletions(-) create mode 100644 src/main/java/fi/dy/masa/minihud/data/DebugDataManager.java rename src/main/java/fi/dy/masa/minihud/data/{EntitiesDataStorage.java => EntitiesDataManager.java} (98%) create mode 100644 src/main/java/fi/dy/masa/minihud/data/HudDataManager.java delete mode 100644 src/main/java/fi/dy/masa/minihud/mixin/IMixinLeashable.java create mode 100644 src/main/java/fi/dy/masa/minihud/mixin/IMixinServerRecipeManager.java create mode 100644 src/main/java/fi/dy/masa/minihud/mixin/MixinClientCommonNetworkHandler.java delete mode 100644 src/main/java/fi/dy/masa/minihud/mixin/MixinDebugInfoSender.java delete mode 100644 src/main/java/fi/dy/masa/minihud/mixin/MixinDebugRenderer.java create mode 100644 src/main/java/fi/dy/masa/minihud/mixin/MixinResourcePackSendS2CPacket.java create mode 100644 src/main/java/fi/dy/masa/minihud/mixin/debug/IMixinDebugRenderer.java create mode 100644 src/main/java/fi/dy/masa/minihud/mixin/debug/IMixinMobEntity.java rename src/main/java/fi/dy/masa/minihud/mixin/{ => debug}/MixinBlockOutlineDebugRenderer.java (73%) rename src/main/java/fi/dy/masa/minihud/mixin/{ => debug}/MixinCollisionDebugRenderer.java (87%) create mode 100644 src/main/java/fi/dy/masa/minihud/mixin/debug/MixinDebugInfoSender.java create mode 100644 src/main/java/fi/dy/masa/minihud/mixin/debug/MixinDebugRenderer.java rename src/main/java/fi/dy/masa/minihud/mixin/{ => debug}/MixinHeightmapDebugRenderer.java (73%) rename src/main/java/fi/dy/masa/minihud/mixin/{ => debug}/MixinNeighborUpdateDebugRenderer.java (72%) create mode 100644 src/main/java/fi/dy/masa/minihud/mixin/debug/MixinPath.java create mode 100644 src/main/java/fi/dy/masa/minihud/mixin/debug/MixinSharedConstants.java create mode 100644 src/main/java/fi/dy/masa/minihud/network/ServuxDebugHandler.java create mode 100644 src/main/java/fi/dy/masa/minihud/network/ServuxDebugPacket.java create mode 100644 src/main/java/fi/dy/masa/minihud/network/ServuxHudHandler.java create mode 100644 src/main/java/fi/dy/masa/minihud/network/ServuxHudPacket.java diff --git a/build.gradle b/build.gradle index 8040745d8..6704cfb33 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '1.7-SNAPSHOT' + id 'fabric-loom' version '1.8-SNAPSHOT' } sourceCompatibility = JavaVersion.VERSION_21 @@ -8,7 +8,7 @@ targetCompatibility = JavaVersion.VERSION_21 repositories { maven { url 'https://masa.dy.fi/maven' } maven { url 'https://maven.terraformersmc.com/releases/' } - maven { url 'https://jitpack.io' } + maven { url 'https://jitpack.io' } } dependencies { @@ -21,7 +21,7 @@ dependencies { modImplementation "com.github.sakura-ryoko:malilib:${project.malilib_id}" // Fabric API. This is technically optional, but you probably want it anyway. - //modCompile "net.fabricmc.fabric-api:fabric-api:" + project.fabric_version + //modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}" modCompileOnly "com.terraformersmc:modmenu:${project.mod_menu_version}" } diff --git a/gradle.properties b/gradle.properties index a75516158..6ec82f10c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,17 +9,17 @@ author = masa mod_file_name = minihud-fabric # Current mod version -mod_version = 0.32.50-sakura.1 +mod_version = 0.33.0-sakura.1 # Required malilib version -malilib_version = 0.21.1-sakura.1 -malilib_id = fda2a23dfc +malilib_version = 0.22.0-sakura.1 +malilib_id = cedafa9370 # Minecraft, Fabric Loader and API and mappings versions -minecraft_version_out = 1.21 -minecraft_version = 1.21 -mappings_version = 1.21+build.9 +minecraft_version_out = 1.21.2 +minecraft_version = 1.21.2 +mappings_version = 1.21.2+build.1 -fabric_loader_version = 0.15.11 -mod_menu_version = 11.0.1 -# fabric_api_version = 0.100.7+1.21 +fabric_loader_version = 0.16.7 +mod_menu_version = 12.0.0-beta.1 +# fabric_api_version = 0.106.1+1.21.2 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e6441136f3d4ba8a0da8d277868979cfbc8ad796..a4b76b9530d66f5e68d973ea569d8e19de379189 100644 GIT binary patch delta 12612 zcmY+pRa6|n(lttO3GVLh?(Xh3xVuAe26uONcL=V5;I6?T_zdn2`Oi5I_gl9gx~lft zRjVKRp?B~8Wyrx5$mS3|py!Njy{0Wt4i%@s8v88pK z6fPNA45)|*9+*w5kcg$o)}2g}%JfXe6l9ig4T8ia3Hlw#3f^fAKW63%<~GZJd-0YA z9YjleCs~#Y?V+`#nr+49hhsr$K$k!lg}AZDw@>2j=f7t~5IW6#K|lAX7|^N}lJ)I!km`nrwx> z))1Es16__aXGVzQM0EC8xH+O!nqTFBg9Ci{NwRK*CP<6s`Gq(~#lqb(zOlh6ZDBK* zr$|NDj^s6VanrKa+QC;5>twePaexqRI%RO~OY075y?NN90I|f^(P# zF=b>fZ73b5JzD`#GC3lTQ_B3lMeBWgQUGYnFw*HQC}^z{$6G4j(n4y-pRxPT(d2Wgb%vCH(?+t&Pj z)QM`zc`U`+<~D+9E{4Uj2kc#*6eZMU$4Oj6QMfA^K!rbl`iBix=2sPrs7j@aqIrE zTaZJ2M09>rp$mgyUZ!r2$UK{+DGqgl`n;*qFF~M(r#eh`T{MO?2&j?xgr8FU$u3-` zhRDc_I23LL4)K&xg$^&l-W=!Jp-P(_Ie07q>Je;QLxi8LaEc%;WIacJD_T69egF?7 z;I_Sg_!+qrur8$Hq4grigaiVF>U7uWJ@Hkd&%kmFnQN-P^fq0gB1|uRt!U#X;DnlV zo?yHWTw7g5B;#xxY`adhi4yZn@f(7-Xa(J6S=#d@&rlFw!qfvholE>MEb|VWn^g}G zMSrK&zQ^vDId&ojL!{%{o7?s{7;{+u%L{|tar(gp?Uxq3p?xAysB>0E$eG#$tvkk9 z2Q2gEP17{U6@UD*v({5MP-CTZfvWMItVjb4c;i~WLq&{?Q1(koX&vt7+$z}10{^Id z{KDjGi0JpD7@;~odF__0m|p;5rIrHidOP9^mwKe#-&JX-X@acc)06G{LO1Wu)#gvZ za~y9(fhA%UwkDOVU1LBJ`0ROE z4&)dJKK%mG@+CIm?+wt9f~@xIMr8}UH*K1j| z0pppo{7gv3v{URwxVMeg>Ps!L5IKxm zjac2egjgb0vH5i75$s|sY_RYec#>faqJk|AGgV;v=^%BM(^p{p;(^SVt-88G9f!q; z>p}9E4^f0=01S2pQBE4}9YqE%TV)*hlU^8k9{&=K76+*Ax^r=AkBb%OCP^P2nm0Ri z;D-|Zk?gGeU<12ti2CnPVNA(Pb)02+r|&yTWW-OJO7 zNLb0pps6aN?A~NJp5kj{{IOlf!5KWMleV@-hYLift)D>-7K+tgs=7Ake}oBnIy-y1 z(Hn@Hjw=_(x>dO5ysQsrnE%A*bk0K<-j{1Yqz@#n#jOL^AzCr#wR|WYzqk6i7v)Lf zkXdKxzuu20aP{Tbg$(+9&oh7cd(Uoqqf<#ujb$q4sZ~gxFbQfS zS)kNklyL*{2AELgjZ(LBu*>S(oH5AaJ;YiB@;l@=O%F6B?oanzoYRM^fQ9-<~^=3$H0g^JPMLQo@SZ@QuNvy)tyJ)LSj`+()#fy?{aV4Yg^7dlQ7AQM^3GLCR2dAFR zJjtfKiVqF`l-H_fz0HD|9g>)pOxn}k!vdZ=DO!7Sikm{Z%P6BrRkBS6W?ZB5W&7rT z@uYpf@M@a!z7H&o@-yrcCL^Ff3e7p3T`R9p?@o-acXmbTSa0>ZANzCSgovsd%;i$| zVus`not!oL#(W`L-!9w0jdaECaG4hk{V7IOs676ZquZH~0TX5hDq|)x z6T497l|E?f4)LA>j=S8}b$0LS=I4h|hUFJYJODT8Li@#6kF$k0)@*l{RnM1HQ%?VT ze-Pqlc!~t(oumVC*?5fwR;P6u{tHaZ~*LlD;B)4f? z?lpWfa2P@)g57flVl83Ej%P`2)gGyaPjhvD(%i~{`2b>#3!+y&` z!2nuwHMFA-zUY}f1^0B8<`N)Gr=A4TS@b1qykmd0Pq{?r)+1^^+D(=xasb^Tf!oK9 zBLL+*p6M_#ufgLzgq1zcSwZsZnQWFLC3`Yxdg-2=*tT`J9nrfYt)RF)YryBf8_gW{ zvKbB+oZLehfT)S#<|y1)E0hW^?+AnqPXq9Hu;v3dsMGdr{SVyF63;K<8VcgI#~}1i zLYSBL0K;RTT(;>2x=*!1Di9w0mwr;`CN}kM65|Ay{~z}_^JKOsRaN<~#9O^iiW<5P zYN7r~HV!#Nz~IZU`P>1Xe%4f~K}KcF#X&5kO*G}-)74S*tQ8CietdPcA1Yl;S=Mr# z`#MYY!{s^uo=jn7;k6O%(}fN+*0cWMpt~#n9DR<3NyU?+3D^AgI}S)Cu-Tljg`VY} zX1=fq$?8$DtOeGxE6f8lbS_6Q3C4+LDTO$}_IpM$Xv<|QSC%+Oll^q$y`7o@jD{dp zNDl|&X)r7wETa-#h*d`KXntxI(Y{vLha{$0i7@G8xx^m=c<{lJ9?p-i!^W{%j7-oo z0W^SzZ^(Wkyz*We{lEn%Yhu-ycUOHtrRiVJL4~&S91*D0MrLu}Q>v-Mc?GcWfpyz% zX|UvcN@krFO#@v|CtYM}g|=L3%aMo$E5<@CM%c*;?u>LOTz00@+dt1{yg1y=$h+{|D17U}$*^fE^H&8b431EUE z<9tv0V_#%#&1N#j7AKCj!tTK@J%oFW*ESW<(#Gl#Xs%v<@AitI?s92nLzm<)w3Wkkom1f$gcdUi%g_*jofy&}N#luL<$GVIe{iQkQ)sIHVy zBgItnPBFamrv6Kb{eE($Q(f`ZPeW!Hm%Y@F*OF1sKB{Yy|C>WEv_mfvv-N-jh)B-5 z4a!1WcT@9a+hGaBrc~sz=>G?Q!*Zp^JFRUvBMyNR1;`)j$RhH$6gEyVKhd$&K-CFT zXaWC-Y=fyOnqT84iMn9o5oLEOI(_3fk!W^8-74|q1QhQ|CmT0i=b;6Z3u?E{p7V{? z;f#Q-33!L+4&QQcZ~GAqu$NS{M;u%`+#9=7^Oa5PKvCCCWNG_~l(CidS!+xr-*gg{ z$UQ`_1tLT_9jB=Hckkwu>G{s0b0F4bnR7GibmHo?>TR&<3?D;5Fb#gd8*wYa$$~ar z7epl1qM)L{kwiNjQk}?)CFpNTd?0wAOUZ|gC{Ub|c-7h~+Rm(JbdoRe!RNVBQi!M8 z+~U6E2X&KSA*T6KJvsqwqZl#1&==Dm(#b^&VAKQ>7ygv*Fyr;)q9*^F@dCTg2g!w~ z%hg)UXAUyIpIbLXJv1nZX+a_C)BOH2hUim|>=JHCRf(!dtTidb&*~I!JrfRe+PO>w z@ox$G2a3i9d_N9J=|2$y2m-P&#PTNwe!oLBZFs;z|F5kXvBDn<)WwE0E3$ow=zg3R zK(9;sf0t;VEV3@gAg7jRtnj%-6O@!Hvg*;XcUAw}!=2*aErvB(eQIm(-UGmq^J=XN zTqJo$Y|WKo^HlBF3BXJrA#}7ZLg=r*w`I*~Ix`o&2k8^(0mt8Rp=A>F`&gehhp@Jy z^e^#B2!~$LvNCKugg)8)-G%&THdk~kfextilegP9?#C#()F59U$&eo(h|5>ceo*Em z{PEE79T$YP|Kr7K`WBHbtQwyxFkCl6xX&+oUf90B5xoi3_5KHHCyEE*oPbOQkfMz& z6^hT8_NXd2iWk{q9IKae1{_7hMPH8I7_BMtVOM4 z6jm?E0QJOn$qrgsJ`9w##GB9?G})-GXSQo6(tYS(Q0-Ct$co?Zzl0?NHsDRron?;_ zZZgQg)%XW>P?8_&zoGuF(>Och2kEJXsu1_X&~w87x!b z>~h!a>e7{`p@+#hXF88wI*JeWRZ;J4ev4<}HWf|Z;(7$E!S5l9wzBHFe>^I{2`a;a)QnAwa2xv1e(bq$<}!8o^ofGvYpk7dBR+`*%iE;hUY5 zaHF}OjGO9r*{%lmcK^uFiTHgoUD`^9Nx@~;Bg!V* zuuJ&ti{DQiq7RyJAR94wem{}cPK1J(Yxnn_{=>?USqz-~&QXRStS^s-7TksZ$AEI! z#og36s3JGtGU{CnDHRFtipFqvrE*gw7_K@NN0h+ItTq@4fqN!HeQU1y7*X?9+IfZT4Vxebpt z%#VzgdDK~-&+=Z*#>=n#XUhNvBZp3=Cr41jMqwJkHLf3L7Vm~V#GgJ(Jpii~PmJ#s zA7Ft!{xD@z>9DUb4JbiUBdNEcU4BO$651iN*mp*f)HbRRM`Cx5cR?5IfEcU{IZWwf zz(M6CDv)>xa3x}K6%tP^i15P1&&DOLK=k~+jNR$UK3frSl+|PjSC-dBItvD~LL! z>_g(YYdO4k(5EbPOw+v+;G7~jYm>F@Ai|o`gs%F)F8tDz$dl7Q%aCe|v|$UkAul_R zNlA-beBX^IJU?kgS`E$it7nF4DaI!SJAGq)2P&Few(-|tp z?K+%D3e4{pfkayrcbm0ftu6Ol2ZzdKM+4i!hNP3NRL`EvvZJ3yvNr2MV%igZ4kj``Qrdb_OI$7jWP z;l0DYf&0(-*QcP5zrP`HVznW+SbH63Qx$7_9~NjRNg7eKqI!UJ=XH`g^=t8GiFTu( z?2L{JKEu%jJx&XjNzU(*!ZNmL1@RlJA0G$2_LrAb_7lmjil(GSlSM zwTes`m+3R;3#N~Xg#9owh3ycXV8@ZlaY_16kpPFA={721b~URO4HD3sp%fmkZM}k) zZB0#)kP=RkNB~R-MCk8aljG_bagt4vIb~8)BV%(b8_;)&Kf9GX+%O_cNG|(D$!3&D zL(I8}*LqN5NntipFlN13=`D>6!{D@CFMBH0kW3=HccJV+xW~|$qeFR5i-2{X+iWMu zI2$gepQ)H_B%ip_BlWOQ*|pErXs|4ir{IHccgaIJ84irE{?+$KDABXr&f`jB^V-c% z$$u`uU1YB^{<+UN2cNg#7&0bz@yF?5>j|;)5&IV3wIQp58X#OE-M^$HdyvL|Um5t? zhZlAG!Mz%XkUe3t471JM*Yur}o30vzu6RN7gJyNcf!IItsDO730mcJ*O!~V``y5=3 zNJGp34DZ}wd1H6V`Uuy%es>BiO_aE-S8jzir#$& zyk)@2a5tP$@g%jW^b^JGdo)X@Q%sE`^lDQmY9m%uDFpPX`w9%=yQ+nneMm#OaXcD` z9}{tn5A2b2z9783vL2_jSao?uxJhWJoq%47*RafM4o0@gY(p)F>qT4^XM5GLzV#6j zC+HoGhAne7o_w{WUo(B++z7lU3Y0k1rYv9|TSv0vR-Du(5=VakbbelgZTeDn+a_Wv zq_j-^+Qz1WAl;Zg>ahX|CERbX1V%B!hTKN?M}fGoA07M(WU&NfT&TmN`P@56U2 z^)vLDs|Ln~0iTtn-?KTeQl@T&bskJFuTUS!m+$CS9vnd}8(UMO|Kv6TCfGN9NUu&4 zL{)GTxPq>fwsJ~aU=4Qhuq8*RzDsP(LZh$BHezq&9gK$IS<|DYbm})$QTGCS6T;Dr zEkLct!b+#<1r9OKG@P!f1wm8>=Nz!7OzJm!g<+`?N3;YaA3(P@EL=(sTaRMDD!c8=-XN^4BXp(eVkj$NmEMYPP>YJ4bJ3yUud z<3BeJAJ$6z^TuywnfH5lv#$lgwraNw{IV=tIznPH1DT`v-5yS=!)J<}xxl}uZf9azA2A97Haf!;<3y01hlw?dWNEv@TLi1s-mO4vmIT%O_42nS z$VRWrs9NngqRRkWAnWkn%`Rw@?wH|)7XL`EL5EZu$qyJW31&CB^T_)qwIv!{;E_6 zo-9XAryQRlk-O0>o#-SZO>|6OYq;}<*>Wu1AsVRiXY4f8qb;+sItv3AyS!4Ry+q}) zA!pAB|BmC;=RIOk^^vlsEH(!Q!7_1FK~ZB2err*o!+b(r=m1b?$6d!%zmN+69LXnT z&gRmM+n_R-F@sT*IYv0_mGPvur!u`iWbQO7SqiGFLeY&yga zf`lM&B74FA2C?N@8_z652fjhBEoDUKbP8hL{0{HAF%qDo7)o3=3rg#6)T7%%5^wl% z9R0*S*<~>nzYOdQk2l`9h#t+gJy_xujw6xjV(8S<_DbVg61&pT%Hi42l%D73G?adn znB%UdNM0p}lEF-P2%TAMam2zpQev71e>a$$%i+r~b+D9G9pF|oY_*(-u*89oKsXLY+UIbqq)MQ%(GYS{(*n_S_*RN$*~`zUtab%0aKwhx znc)Yo?{xq1sJCgQD)TeTci1ucvbez9q=A72H(-SB18Kl&6^vHV8^i!p@>iF!DIw17 z+8Q)TNisB7>pwyww4y)yJx*wX6SJO78eLBC-ar1+k$Z9fy;wBD|3kzI{<+l*>PSY^ z_?nLOZaeWbU@C3hfK?X;Di*8CHCPkx2qco6(ZyJdqSzp^TJ_5Lpa0UP{Gy+!b0Lr% z@xYxSjUKoY6L#>$qx~KD$-0=|OF7zhVP~ntMgEALYPIfhj@+ z!;JJ7te>CcovruwHsJH6Lta$nm|%^C@=V-rmhU{+I~0(|XHQ9jt@L7pb{gx#{4r!) zg($FyFTslcgu(~6lYr$nW?)%*l#VJ=R-jxK(x=t1bWlu(nL66T#qj%3aZ@uVhy}Co zDU_q61DD5FqqJ*#c|(M5tV)XBN?Ac^12*q)VN4yKPJ|#==S_`_QD9|0ls!`2)SwuHDRA_OfXQDq3%qW&MZB}Z!=k-9xqev8jHz(H z{^D@cIB~QiK>~wa)A&^Ll^Wi6QgCzU;iv-BHsLBs zH7=jN%|>0S`SjP%M&AF1PNVDp_FZ?2Bm@7`DC&v(pYrw!!yD#4 z6+<=HS0Ln6MhoKxF<%~H`y20{vf#pxh=;j{zY381gvAFekgG|>G1zo8$&az{V=;JR zy_puF4$L$?EMhT?;TpQoR*j16ll`#AS4e96C}yp_aGKkBe?1H|k_;gG-~Xorc<;lI zkB}fB{$c-D2mGA&{rm<*@F5)c3X+6??g~XoEwuzSuch0D@W~P5(2I8v8F$c2$Vw51 zP#YLSBDqtWW^EYBl^QYHF+MA7am6f4DOhwnJM=W9$uvMOsZ%_~?)2C#wb?CkI$7{K zEi)=#|5pFvg^){zK5kpBLjB2kZ+$ZB|L=W|aNwyyb(gC2l7bcpx{E-H@)q6@D6N^xh`{1E%ItF2$eeB_SjI@b2WgTpS1thwg&n`jiIzw^TtXUyB{00($GIq>vbj|}bav}}Q_~wp3>k8!E@hVC;OMUTu|= zAy#vXH*GrUHu7^cNZWe1>y;2(51js9wbu+R3Aa*(wzH9+X0dIsf&gc_x|_LP z>~CF^?(~U}+l~ehe|i>?4eo!xkq&Lk+RR-1duNP#o~>@1x)s&i&u zRaYL@+D&_M|JLI6fHbEr_`U;HgPTh#E3?sB)A$*gqyBgg*ql|a-m*TX5rACbWKCE6 zdeQ`v8m6>g^ugv`p|HY^#1QZrGGUj0^HVDc@{?Q0yhalbBEV{+|HzC^-{&e{5K%z9 z6Bxtnfu1!@Mp+Q&*&~;FOg&*Vm<@4b;{FG0-!UUXX!|)1w}op!B_|7_s~d(+=9Gba zKp8`LaB4D(H=cGcspJ_TjYaOwMb=sGn^gtUVhK!UI~2KKYEE-NC}F>+BEY7IVvy%KRvm00tg!Q`y=er}wpEetX}K@;}(}{s9AzV#q2@ zBy7}->|N?13POrs`;U?(qAG(I$~Gt+Rgw%aNZ_0fs_utVvRJT-7z4!@x36v@=NBX=IqkK{#Kg0w48de@?#Yb4M(Svj5=T+<ONr8-oh7l?Cji@+erqur zFhZ=9|Lk=$`c}v4u`)-!!UI=!9Jo@h&7p4RlS#u! zZ7-prn75JkV?VjptX;@$#`U`{vB!=Z?V`T*FBF>J?vsML7e6@2GbUteMFfX-TUu{2 zLNIG*;dV)8GV8gAgEf#)X3A>p3^CRka1v?~8x^anBhQ=L=LsOl=&pcOYHo98m##ye z34MtGCDK!`ptl?taGMr5q{!zVc? zG00e){TV?`YA9eB;(lA3lXI?RrB4BYQGk?vOmTIUJED=(`_*gtn2DB-t4WW54as*W zb2kD-lWX>lb$+W!VFakki>B^Vc+u$?NLF>)!U%b@Y}gYJ>m2H=^x0=nsE0TF^Yu0h ztgH8-o1%+jCk(+&`|)tTfEVHq0cMeFa{Uz)X$;fCq%Y=SOWML6bYfeP8j5hktL`KK z(18`XrUn&WN9PtFxh&dX`y~YBsmdhi7Kw%tKzM%^VEhdD<_XkulW-x=JN6OPbFI4@ zzDDRN+f=@{0h*MswwOqG6gJ?{NuHx(y-|FUGsxyZ*x0~$MW(eY>vqq4Fh#t7uzw=- zKB?|!0N~!h^AMdLa)oR!Ca#HZ9&Zf)ghuO<^RN)4twRlygHnQG(BE{cDc5E}OF4;xss6gYyV~EcJvJkX)xNWb=@yw!uq0v-sf^rvkp-;?DPWK@*SEw|V;IH=7 zfQqEV_>DjOPT~8X*J|H8=&RnzK4~S7ML~nLX^%s-Vqc^aWy7N$y57qciZGcqy#=zU zs8hcHiI=D$+RB{|62{ohCTiaML6FI4Uhzo5D{Jik@poCs0w7F)*w}F4r0sJ~#u-72 z5bK=ANt=M$Dh5NKnxGsg9NRR?WD-x|FhTwBjd zD<-K>44DB~i%frJOfnzh1R>PRY34kw!6~p3M$JLaD1r@`=h)~Ngks-(gdXh^Q?BTP zZ^Zj5w1AwtuR2$~E7s9iZdF}z%pv1em^V2rM{1tLUY@-+Sc0(9jA|iZWml1;v13=U zHf?y@#mb--7z6$ue>`qjhE~brk$AY-RG90~5wcBbDReXR2)pKg{L>;H(DI`U!MLNQ zY9rFJP@ZQ}jlcMh%WSCo%vf+nd0Gmd*F%KMIe>slCUh)8Ma|;M_I+v#;|ueg9oLg; zq2HtZX%&#F7vdpNlkX?}(C7dGC^y#NB#m4%69RzTNrk%4ol~hSI%>2r6B|*ZkW(*P z;u#s;+faHo{tfy+1L^RzWDi*^JR0iY(zJDB36y_QJ+|E-2x+cY z!V8uLNktH~q>WQZuY!Ap66WP|E!0PA1jK~)^8oJVGbspJs6QL!!-5Qm7 zHYI|_`Actg?vDzdg5{86w@GS$G6ANzff7->6i5pB$T4O}`fZ_;{217Om0gN5zTr12 z5mW{hCzCE-QubjxN$TAE-XgI-8dTY@OZmq`y+y_>dk*(qXF0{nam|q@~i}Utp*k{yurq(DW54hkDT4bbg z=_etM?Nf5W^o-HEu9_?&xEqPg^P^mTxLH8n%u$!mWvFG|{&)jtnU&6|5-`~eaNz0%D1BDo`{ zS1N5(KW5v^2eLdd_%`uaRndF@h0Uo6=M|8?b~KbOLZk{HXEnGmtgZXf2inI*1r%n! zQ3&%RI4r{f&dwW~HwH0Ked9b!k6{>_19H z_Ai>5IChDMY(FfMyG%;30?SQ{iV9KyGru62+Y)~qSQ91}b~}w<&*}R&1c#$O`H@~c z5)2S_eXx}M#N{MuGeQS9@#UJB@;W_j50b}jIhxMPloEFQZdvwxiU^RYycTzgK)-vl3LT&$L8~@68$C8~5_U{cR$E#w*x65(qw&eoL@>%ZHvj zWnEMlSh*(o&oy|J7eJ5OD`ssy%F?*Vp?`Cq;FShyl{ZoKCG5g{y}>usznni#8ki(i zO{w@n{iAj1_ooX@+s*!uW60WcH~*bNOT6z%0jVML5};wVrQp~`Uss_{cO2oud_nNA8^B$?07fJ6?iI)Q zuo9G)O-z)DqstrBqf>B%S05hf-wep0@$BFHKSrkZ{za3D)yVzRz)2{wf8(Wp+xyAM z$rtyx$gi3A=V~V!`Q3;BM0$>*VVtxEM|xDL^gew7ydy3Q6YzD&THRz*q33Ms_D;M- zbCx1Ft#UNB)V3bf`~{ImI72OTp^|bF8?G8#FRj+Biy8ET5#rA3sd|0FR@U(LAJ%w8 zS1%n8Z=Amhw)92rIsof=YVWF4jw&F*j1LG@-`+cR0-~2LqXRH8(Ccne{y#MCPncF64U`0uO zWmi$dlii~1D0rLR{qc|_2M!C$t8^=G7xQY)9!#Y331A|>N)EhmyVdLWL9I3YLJ`7? zZmpqUJB>Ni9oiL)^1IK1UoMyhWE{$9M2M6Xi zPKk7GpMsA6vjZbU7~i+u|J6Nk|Ci!Y3UMUT2|`M;JsNQACdJ%ooo9Yt{?A+0hMpxi znEa~~sxC>rKrU6bd=WRb;%wsH>A#j4{({&1GYSNR57Gama(3)2A;SM>qop}l>Jk2* zn1+C$fIxuwzg3mCU#SOqb-wOCb6mBcYlA5+mt<&_J~sBxc(GQtBFINUO~Mr7<-uu($>P HJ4oML2Lo<@i8BwbL^1~GkG`E7C$SEa_ zF^}Ea+#Je`Xy6;#D0FPnSrR%Y!QGA~NA^{oWmW8C<3dr{x6wWQ{4+bzemqV5W$i5~ z=J0jXZ>uZb>DT@0Ks?4QJ{`z?8JWl3$y;2pj#$XP*pv$>$g(z43{YH9KmmR6<#sIn zA`#=0#sgycaBQ^&}Xba!|KaZ8~b30v~nLt z9%#gz_*=~KD{3t^X~l>480*}PhKN=??g`RV|4Ud{Gyyl187MJ}r(#e+H$GEdI+p1s zq_25h;fV)$EPK%Dw-(G=f`yHB-_tttsC!?k7*#!|4a>`Ahj8nm?&n>NRs%jkZW^3-0P_yMP5&*6a26{MRj1&TPF zyE#|c)5uUHzMWx=rMKpuPih*V=S;W3MzIZTw2uTbr}8`p2bm+Z6Sa%vvWAWSf4H)p(+ zSQ8;EvUa#wqWV+9vmIio(%7wukK2SwjUS8Yl%Rq%=~PU)2$Tvm6`1!r3H@U#_|bB0 zmlT1PS3wPB(b&^+@YY7Y$n4l3mV3-X0$>z|gZp6O*Lhzn&?Gad2ZCF;+#95-Y?#y+ z?*l@Yf=a4w{Px=o!N|3~_XKfk&G;fN>Ps&dp2FpA~qD=0~=!NOS@B#XAKKkND>Y{4>rqxrViKD7;?>j8`R` z&G)3FN|dfsxnaI^!d1G%=>AbTTxZWo;n-DLrQ!sj=f~VAOe5zhGS(dgx|!ls62fbX zV@<7Ck^!}R=`Swr?(7w1rY6Nmq~sfXJ?TiKJLn=&SQdEt9$@0 zA+h1Wbwbri0s-stc8yVq;mRa6@kEf8^KXUz&jcic!+avDvvJFa>k0ioWug=T3oPw; zyj4it&0@>_*uI@2=^+T7sL1_!^aJW@Xfo8aC#3^WtQC7fET8b9C} z*u^ue6Ojn z7@(eskJ2+cNnH9~VyfIh<-|7!je~vGy*odz(sk-u$~SrYF3glruZ*W`{sqnS+9=;Z zh{D@MSG91%lr&ua8%$sJF%y1I<|e;EdfJykY8#D$Hc_81n5`$7;1N|b0tvvPLzSg& zn7!5x?T*@rQUKcUhTIjV(rw*5oQYlm5DbEO?60#mohHfbR$3_x#+PZoYi@Vd4`#YgKyTd^!4n{fN~WZDY61sAOm6 zl!d^i*a01QxpWM9Pcl?&{RgO}uq%ErOk5WpECvnfEh!*YP&1Sl)uTN4hg??Vqs~i5 zYsfufz3?{TtwuBN=`0~Qg1PlWH#OGG$ zLLWU17$v``)CE1cds_7kj8mJ{-+l8{DS|zAQ&3|qpOY=!J|kXUhXue9|H>4gqk|n) z-i34GmxLFj8asb3D#D&=ya*a5`C<=o?G;Ev^LV%;l#nH#O=7Nh@z1Do>j6Q;I5S2P zhg|AZbC&|c7}uSJt57s2IK#rSWuararn-02dkptTjo*R{c5o(bWV}_k3BBnKcE|6l zrHl&ezUyw^DmaMdDFVn<8ZY=7_{u{uW&*F<7Al6};lD(u;SB=RpIwI)PTyL=e25h* zGi{lRT}snjbMK~IUx|EGonH+w;iC2Ws)x>=5_{5$m?K z5(*1jMn%u0V1Y%m@`YS3kskt~`1p(rA4uk;Cs!w^KL$w>MH)+cP6|XKr4FfHIATJH z!EGAK4N>1yFR`-zW|w%ByRe#=&kA&#WyUldDGpt!wf-8SFWiSi!5QZL+l7*CE?u!NW1T$<1rdLJ9y3u{_zvHaM?#Rm4 zFk}^1!ffcrB|XK3gsO-s=wr*sUe&^$yN|KxrA)uW00Gu60%pw_+DcUjW`oW<35OC8 zq2{j8SgC}W$?10pvFU83(SL$%C?Kctu3*cs0aa%q!fjn1%xD*Jrm!F3HGR9-C{b?- zHp(cL;ezXMpL@0-1v0DMWddSDNZ5h?q50cOZyVi#bU3&PWE=(hpVn|M4_KYG5h9LffKNRsfhr^=SYiKg?#r&HNMi2@cd4aYL9lw(5_IvQJ zcB*DD()hUSAD^PdA0y|QrVnqwgI@pUXZXjHq3lG2OU&7sPOxxU$Y3&ytj6Qb=2#cC z;{d-{k|xI*bu+Vy&N+}{i(+1me!M;nshY_*&ZQLTGG*xNw#{RpI`3^eGfHck+*38NRgiGahkFethtVY=czJs#)VVc{T65rhU#3Vf?X)8f0)X{w!J3J{z|Sq|%?)nA+zo?$>L9@o`Kc|*7sJo4UjIqu0Ir~S5k^vEH};6K?-dZ0h*m%-1L zf!VC%YbM1~sZOG5zu&Sh>R;(md*_)kGHP)<;OA44W?y53PI%{&@MEN}9TOiqu+1a3AGetBr$c)Ao3OX>iGxmA;^^_alwS818r4Pn&uYe^;z6dh z)68T|AN=hjNdGpF7n>y+RTAZc9&opTXf zqWfK_dUv=mW{p_vN>|(cIkd(+Jy}qnK{IW%X*3!l`^H~FbAHwof+vLZ0C2ZXN1$v7 zgN&R9c8IO`fkR{6U%ERq8FN<1DQYbAN0-pH7EfcA{A&nhT!Be>jj>J!bNRw4NF|}! z1c70_#fkk!VQ!q1h2ff@`yDyrI1`np>*e#D4-Z~*!T^8#o*$V~!8bWQaie?P@KGBb z8rXc!YDL!$3ZgZZ%;-%~0Kn<+d+{xJ$stQbtN8GWV?MCJvzPU|(E(1z;rFw{&6vy) z3*@y%7Tx8rH-p$boS>bLyod?OKRE8v`QSBvGfY6f}_{Zo1q85xoyOF16n~yHx2W ziydUoYLkJmzq|n&2S(O!ZmLdP1(o1Jsq88cX)x3V-BK5eF&0e_0G!5?U7&3KN0`mc zH&Lt)q8!d_VgzxyL^(@xrbp2y)Hmr^V48));RSfE=*Ly0uh9!$3dv-vMZr2URf@l5zdwLjGZB zugY>7_fd_vbV*Qv1?H~>Z%RD%nEeFSI$n$$Lrpc6g>i4+XdBB!%zM$Bhrz5Swzyg? z$~I~n@~-wTBY3-T&pr+|gC+OHDoR?I(eLWa{Z#Rsh>lc~%u0!&R|s0pA*w<7QZ}{i z*AFr~0F3y~f$MGh_HDL7J_1?SxKL}fWIk!$G}`^{)xh*dZ5kK>xGL9>V`WZZg_ z)^Vm)EQK`yfh5KiR(vb&aHvhich z_5o+{d~0+4BEBqYJXyXBIEb1UgVDs;a!N2$9WA>CbfrWryqT25)S4E4)QXBd*3jN} z?phkAt`1rKW?xoLzEm!*IfkH|P>BtECVr0l8-IGk_`UjE#IWkUGqvyS+dMrCnFl<7RCgSMX^qn|Ld_4iYRldO zY&cHhv)GDo8nKvKwAbfyLR%t?9gG?R7~PSD#4D-;?F&!kV59O}neYut5AGbKwy-(U zqyBi=&Mgj|VIo>$u!DHM`R7O?W8-idbePuxiJMH``6c_5L-chKd}=rGC5Gfrc{f!* zWFEBm?l@_b7kzY7%1RQQbG5V<4=ZlkZ%sF74Q|mKOc7Ak7dP2#quiGcZ0_J%7Q?j{ zv9{WFw;n5G-Mn%r#0R;{jLt{yy}9J6rQ(>X9pJ`7Xy?Zv z=lNit#qXaq?CnElK^zF~sG}U5oCpR0T>FH=ZX}Prju$);?;VOhFH8L3I><9P_A|C+ z{;>~dk%9rrq(snjsEm}oUz2FQ21MCG*e?g)?{!&|eg7PX@I+Q0!hL6C7ZVY|g2E>i zr!Ri2@OfEu$)d52+>+cpgh6Z;cLYCZ&EMR0i<^~4&wEu_bdo;y^6}+U2GIQgW$|Od z_jg{O=pU>0-H$P-EOlWyQy#W0r@@_uT}Lg+!d5NxMii7aT1=|qm6BRaWOf{Pws54v zTu=}LR!V(JzI07>QR;;px0+zq=(s+XH-0~rVbmGp8<)7G+Jf)UYs<$Dd>-K+4}CsD zS}KYLmkbRvjwBO3PB%2@j(vOpm)!JABH_E7X^f#V-bzifSaKtE)|QrczC1$sC<<*Y z$hY*3E10fYk`2W09gM_U<2>+r^+ro$Bqh-O7uSa)cfPE_<#^O) zF+5V;-8LaCLKdIh3UB@idQZL`0Vx8`OE#6*1<;8(zi&E7MWB1S%~HAm%axyIHN2vd zA(pJGm_PraB0Aat3~?obWBs?iSc*NhM!{-l_WNCx4@F7I?)5&oI|z{o@JKd1HZ}zf*#}JjK3$ z-;3V*WJZvUcKvSOBH4c7C{fl8oRw8-vfgKQjNiR|KhQ%k6hWNEke(k8w-Ro| z7Y3)FsY-?7%;VT64vRM)l0%&HI~BXkSAOV#F3Bf#|3QLZM%6C{paqLTb3MU-_)`{R zRdfVQ)uX90VCa3ja$8m;cdtxQ*(tNjIfVb%#TCJWeH?o4RY#LWpyZBJHR| z6G-!4W5O^Z8U}e5GfZ!_M{B``ve{r0Z#CXV0x@~X#Pc;}{{ClY_uw^=wWurj0RKnoFzeY` z;gS!PCLCo*c}-hLc?C&wv&>P1hH75=p#;D3{Q8UZ0ctX!b)_@Ur=WCMEuz>pTs$@s z#7bIutL9Pm2FDb~d+H}uBI#pu6R}T{nzpz9U0XLb9lu@=9bTY&PEyFwhHHtXFX~6C zrcg|qqTk(|MIM%KQ<@j=DOjt|V)+8K26wE_CBNnZTg+Z+s}AU|jp6CFoIptG1{J*# z7Ne~l;ba*=bSwAMQ|Vq#fW~+je4PXA91YFzBubNF?ovIOw-$C-8=Ehed{lGD0}(Id zRe4sh8L>&T%{>8o))he}eE;5_ zxoXk3wX?MyNl-xF!q1d$G?=wp^`@09(jU&X zOqZIBI#dN`2PJNdATR3ivtub|nO$dulSaP|e4)WXF1YAGN1pDQIbIjXFG!oC85Mt; zW$eteoL{y^5t4TMRwP$jNPjZFpGsWnGe=jMMqKtcZm9Y9PFZLi*1p@qoKKub^T@2+ zk$@*KYdQ?Z`}<%4ALwk*Yc{(WTf@#u;as(fvE^9{Gk)lWbJP*SjttWofV0s?AB({~l zZI1hZVWFT~W-T?nfMMcnCS4-#6H-MU7H$KxD;yaM46K4Kc@~Q>xzB+QnD_I`b_l3m zo9pRx46b!p?a^&zCDwygqqV3epjs(s0NQI6ARA1n!Yy-qduipxQ& zUAlqRpNjBS+y-ZheD(!R;F}&^V_}b_gqH%tVZ5%%ziO7k^w=es+wZtK^i*vmrWNLMs{oWu_CIov|s1raZiS)>38>pYu;i+-t zI_DiNe6aA4KTZ2P09qPj(0~K4nUq^0+f(2$g`229zkG4jLzRvJUWE0oF1XHL4t3UN zDH466G56sy9hTZoAJB!C3;@F;ONxEk5u6Mv%zdo}Rq`=* zw1n7MOhfNSV48TS989ArIcj`C%Gk8~93~u>)!Yt2b4ZriKj9x2d`H2HQNJ=I>hkDlcZn zqRj>!;oRMTIOu zx|Zfsu~v76T{z7AC(jxj^c@tnJHZtGPsq$DE!8kqvkDx5W?KUJPL+!Ffpwfa+|5z5 zKPCiOPqZZrAG;2%OH0T$W|`C@C*!Z`@Wkop{CTjB&Tk`+{XPnt`ND`Haz;xV`H^RS zyXYtw@WlqTvToi;=mq1<-|IQ(gcOpU%)b#_46|IuWL#4$oYLbqwuk6=Q@xZaJSKVF zZcHs~ZBl;&lF3=+nK; zF`4gSCeZXlwmC_t4I`#PUNQ*)Uv&oGxMALip|sxv^lyVV73tKI7)+QY5=tEMas{vTD-BaTJ^*Y6gq~PU;F5X!sxqiq$iFCo+Uv7m%1w((=e}Vf*=dtds|6 zbX}91!G?C*KG03eHoN}RZS9DJxa&8YwNCT8?JxMXyZqZr13NA|GB{+vG`08C{V(yy zf*Lw$+tYSU_+dI`3n{bMrPdDb`A=Mkg!O=k>1|*3MC8j~- zXL79J4E=U^H=iBLTeHE_OKzE&dws8RNynsSJ!d;`zK?P92U{f)xvD7VQVosrXZrL+ z6lMVdD1YgL;%(1cq{#bS6yXmp|DS@nax#AqqlZhtUQdh<^2vr5`EpAO

LGYq)sa(w9^3-f}NHy=GR4v%t2YZly3m1G@5y`xBh_HGrD%f z>;|Ty?9FiJAc&UVD(StT4I` zfVQwxhE9bXE6r2mKO8Ag7{L^jCyqQb0QqKDPE=RAgqn8q1O^>(z7h5kE(6va%QqRZ zkIOmp(})rLSS(2{=C12e&@!W2=Jel-^_R``0xHO^+t!(oXbcv5yhD4g*$t_F)_5Dl zSVCgesW%;DtYPCFs{G;GX_o?1J3;QQPPv)rWw;>} zJ&KwnUqwNXloNXlK_+pNDfI~hON#SokVJb&ilg8d7^NWo2ZQymCqQMnjfi>ePibjr z-Z@q!?RGN$Mj}Nk){X_vaj6?Mj$>ACR*z|6MsXy3VZ^PFn@yHkPo(>m(iWepn8SC@ z>D2;R4m+gDRZ=SIX!b+CP(qE=JDIUkn=D$aUu+Ihn9-+k1LS3PreQg0N5eWIG@x${nC3v^7caS>1!PKNAY9J z#}E}Q9w#SP>(GY7Hbj&z4$Li6o5taBO|4+F`yS9zq*LJ<38wy4I>HA9(&GYrk4dLajKGww))BWli6Ln1A^Lda@N~p+snkb9C z@OthI+<##vp8!HVQT4Wk(=@zQ{OvZ$EKWS73+JHb)eYLGD-cqi6^|vd$<+IHuc?Nq zW7JertT~3))4?J|28n$I@nAD0c1%9C&IVhEZX~mUsf{efyS(XNG%ch;!N~d7S(Ri7 zb&=BuON95aVA&kLn6&MVU|x}xPMp7xwWxNU1wS+F6#y}1@^wQZB*(&ecT?RnQcI}Y z2*z!^!D?gDUhc@;M^OpLs4mq>C&p{}OWVv<)S9KMars@0JQ{c_ScGsFo3BJ)Irg++ zAWwypJdTO-_{Uh8m(Z!3KL7K{ZZzKHj;{M8I$mV>k znTM?sa0);^=X^cglL`uC+^J)M7nEa$w=VwFULg~%DJllw+7dJAj3{qnP5i3@wr7%y zjXp?Wl2%Th=my&3u?Q$RV6N5tzKMSPTsc#J+-cDDp~qFB6bL2C8AS7Y3PKtVhdhl) zIaLqH5+OnWPWSt(lQCgkN8lczc-V%_iZ{>#1%Z$N*>lu#S;0MZ$T2Y8Kg!U;hAZj> z6S#%$DQ_`Ic%Zr@?}GgjRXg@qTj^17n`65oJ@Wj0u1X8&+UVd|Xs?J+i_^GZ94m6= zUc96~Q`OJvlKB_Lr15*Yw_PUPEr?f?H&00b^-W%26mD)(n(rGGNfK9~2h=C>p-7BZ zFd&*&Msdu{w~(eyFOglwCPH^Rb}O(N7LtS+nnEwDx*pGD?|&9Si~M43a+*L(b0$5A zv`T`(G3xO;I_sx;FwTP21ZlfDpz zOo?}Vlgf~fo{YWm@n_JyD*frOg{XsvBA~|Tn4V6hu>Gd>89-rblfVJUaGvj6X%NZ} z$tFF9sx=4_$*c~G`9iPLGh@=sV+O{D2-t*K@J7H=`V+oVt}8?04WwU3h1BgS!f%1P zFak-T#7`TtLcR=Yz>g0R!ZQrH!YiZOQN=_V-UyncN1Rc18?KY?#O`v#JK+pq0K$~H z3D@v9DZF42R)b9#BBX{^$DOMlJ!g)Gc za{o-1e%F6NvgKq9tC8pV+9S$;9*zNv{J*)n&dmf~anP1)4~N%~h#c(=B#3*KgzhCKhFdgDoWi2IDog{RVyzK|Y`rCUs3T~pJMmdZJy4?b z&s5G=zhf**(t7Y^oC_mcTsE-{^}wiaoUu&?kojLKs>SJPxjcP>{a5CbXCx92AcBE) zHtqP}LjZ{W>PH?Tu(E0X=%{PBMW@F_?#7b&#!^q`<-5$ur+-q6 z{dn=(^UZw6*3-XM_(=@<1_*i&XM4=0t5u!gm6 z{UlmNGPKgO_;e;q9|#esq~Sq`<}%d{+sRmhvsA{5i*91=tub>OZZ%)xUA#4q$dDyy z1`w4%?OPLg3JeZb#cqSMO?*Xn%|-FCcuH2i2fn_{IFusub6;NQdN|7TD1N?%E8*g? z$apAt@cEe!I%jB=*q$p_3=t_5R0ph%{qaq+QDg!c99Y!Xa!&oDZOeis_ot)gNXr{l zdY$|So2Qed2Y7KMNBrS^E169kG%h<+z{Z_p_;shB!uY)>yAVcK=&!bg`lVg)4T1|7 z0}7FpfydVH4F87K@c!nEG+WGKm{Ouo)Slpl;#qcEIQ0zdMfLA#;dBxYw;p;KoVv6| z3_D5&7rJdG12CnDSvZUW?$UC6^UVSW^|vw|o-_4bz)(w5(3AiVhpeT(|=f#x_}E?s#qHZF#xA6AF_ujl$G z-jHD%q(d2}v2PhXx&6YWps~m(^+RXl91Q#xRRJBhjKl$FG4bk);|ag;ieUZ&!Ii3$ z(iGz1+0m7#g5>ASldBbNZL=ZHh=tmmJt$!71; zIML2GhEz1pg@1rQN(M^_691wAGkJ@Pga_05WuQ6! zG5RkGY2^`@(H~pp7&Ga+Pwh3L!Njj!-rc;^bTIfo5hP@H##1X8xUZJckrx>id`bAd3QUx9GuomqBYZ!uN1-&o zvTxC?;p8vL67&fW8fw(YOqt>L@bdLrEF*3OgYe$4n4{ zEB40LiU#6-0@5jdN`0w}N0qi@c0~oT2FP z)LNk&a82my?jv(tQpiMi$TK_L@lub#lsM$R{Dk?Ya@%%%huZkct~tSWM714c!45k}-ZLVA-bVM`>|_ZBbW_m-7| z3U%xrAhi}n?T(2F{_n4EZ10inkIFl#y09?7$uwBoJgqY8vylwev)fDOn;>0R!aEnV zBz%j0Mqpx~EZU3q@%+oV7;}|vt7$~ou@faEIq{p?FY$XXg&6*K)b_LP=}gi9`Bij3 zN`zEo|B6*|-;>S`rNa^BKRDbDAk>X#MsR`EvL>6bqU@SaDDs z8>bu@3YdRaWs*Te@G-UHjU%F~kTHw5(0PVJ+pwh#ha2u;DB+UMo@A5UYIl#5rtBV- zGX_hIpw}3C@H*Us(Cc-d#-gNrG#w$(9+S=GxO>3SR`SE2fHZ2KrDc#_C^$jI>Y}#; zMwY=R6@+dWi~0RXw(c@3GZ&%~9K(q&ee0Zw;pwL`E_tZak-#8^_b)Dpyi73^he?xV zXJ08&wh5-M&}qy4f7!D&=E)puDD(Nmg1d_(j`4LvxM5x_huNg-pGG%9rYqO6mImyJ@}*3Y>^3OvcnTG%EV1) zq_Ap?Z!Iw__7#D=pOWnQN$gB!Mr0!9yx|g<4icJh{cFOu3B8}&RiYm+Mb;VEK``LK zL(NcpcTiGieOIssSjr?ob}^``nNf&UcJhXyncO9m{6gD$kqSD`S69(aF8dkWz5>!9 zBLe4Sib7Hs2x_L2Ls6Ish$MGVKrGt5+_2zCyP1byaCg3upo+-I}R4&$m)8 zQ7|jc1Z^VWggpuQj*cP;>Zo9LS!VSzrqmZczaf;u`d0J(f%Z9r%An@s!e>n9%y=n!IZ_tVGu{Jmsbp}Fk%HJIU?a+-~bjfLTuH|JExA8EROowzr zqW9{YyZhR0a4clRK>1I4Ncx&WER~{iE;F^$T7K%X@3PGOA%6#Z%p3TS^&M;Dnjw@i z^o!$9nhcsmcHcY4?4j9+ofL_CWsZ4Hcch(rjsGfGD(nsH>w}^ERqGnz%iGj0j{g}h z7wMkJ-2Z2~eS>2!i}0~B63i;>SyFJU2+>VCS^AxaDOx%g6-t0eM^P<3+*z`ztvOqrG3)&#$K?& z_Y0wbWID47@cU`E1A6A&!`aZk0ZE@z-h#l1NqX2#`$Uev2gepW`rf8*!=rD5&;Jb{ zl08rU>dPo=K%-1Ao1~G-@4ve~y5#9E8x;TE0k5d^TC(=Zc>mwjW^c=+U-<9}b0ku~}gj z3sbW>R2M6DR!g#NUP;nxo>)@7*=RP{U18SDop6b2&PHce^&h97@xx3t+VK+!keE#} z;(Uf&89as9k8{$nkLbuB!-d7TP`_VJpL^Xs8OKB~ri$YUbW8fch64}7|0EWoT(TRj{ z*GT<7Y<7DsrCi79ZsM)z#c(!nNOGySOCkY1fAuQOq12&iUVC!a`#O;dBLf=d?&4*B zI~LgAO7E0qxK(uRTM;IgJ}+z^gD+bi-6I!3x{r9`l~%8TRP%UE0V8E*Sz>Nl1NVG<<7(wDHZ+HcOkQm$O&k+vyx)y)x{Pz!U8hS$*m zByc0h6BUI*BOpuL==P+H|Hx%`>7!W+1H!l9vi&)`V zyn2o9{z=lc+VX*!Vh~SF=)L}Z40XeG>LF6cP^b+R$NxSeUqbK^Q*UTalKzP8X%{9@RSCXm_NhF>{=S2 zi}ezam_^P`S!!-cyEW9y7DBbK93roz@Raccy*v}?mKXScU9E_4g;hBU7}zSofAFda zKYEe?{{I54 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 09523c0e5..df97d72b8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 1aa94a426..f5feea6d6 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/gradlew.bat b/gradlew.bat index 25da30dbd..9d21a2183 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## diff --git a/src/main/java/fi/dy/masa/minihud/InitHandler.java b/src/main/java/fi/dy/masa/minihud/InitHandler.java index 5ef7f36b3..91cc37810 100644 --- a/src/main/java/fi/dy/masa/minihud/InitHandler.java +++ b/src/main/java/fi/dy/masa/minihud/InitHandler.java @@ -4,7 +4,9 @@ import fi.dy.masa.malilib.event.*; import fi.dy.masa.malilib.interfaces.IInitializationHandler; import fi.dy.masa.minihud.config.Configs; -import fi.dy.masa.minihud.data.EntitiesDataStorage; +import fi.dy.masa.minihud.data.DebugDataManager; +import fi.dy.masa.minihud.data.EntitiesDataManager; +import fi.dy.masa.minihud.data.HudDataManager; import fi.dy.masa.minihud.event.*; import fi.dy.masa.minihud.hotkeys.KeyCallbacks; import fi.dy.masa.minihud.util.DataStorage; @@ -16,7 +18,9 @@ public void registerModHandlers() { ConfigManager.getInstance().registerConfigHandler(Reference.MOD_ID, new Configs()); DataStorage.getInstance().onGameInit(); - EntitiesDataStorage.getInstance().onGameInit(); + HudDataManager.getInstance().onGameInit(); + EntitiesDataManager.getInstance().onGameInit(); + DebugDataManager.getInstance().onGameInit(); InputEventHandler.getKeybindManager().registerKeybindProvider(InputHandler.getInstance()); InputEventHandler.getInputManager().registerMouseInputHandler(InputHandler.getInstance()); @@ -24,7 +28,7 @@ public void registerModHandlers() RenderHandler renderer = RenderHandler.getInstance(); RenderEventHandler.getInstance().registerGameOverlayRenderer(renderer); RenderEventHandler.getInstance().registerTooltipLastRenderer(renderer); - RenderEventHandler.getInstance().registerWorldLastRenderer(renderer); + RenderEventHandler.getInstance().registerWorldPreWeatherRenderer(renderer); WorldLoadListener listener = new WorldLoadListener(); WorldLoadHandler.getInstance().registerWorldLoadPreHandler(listener); @@ -34,7 +38,7 @@ public void registerModHandlers() ServerHandler.getInstance().registerServerHandler(serverListener); TickHandler.getInstance().registerClientTickHandler(new ClientTickHandler()); - TickHandler.getInstance().registerClientTickHandler(EntitiesDataStorage.getInstance()); + TickHandler.getInstance().registerClientTickHandler(EntitiesDataManager.getInstance()); KeyCallbacks.init(); } diff --git a/src/main/java/fi/dy/masa/minihud/config/Configs.java b/src/main/java/fi/dy/masa/minihud/config/Configs.java index cf55af3d1..4dc08d279 100644 --- a/src/main/java/fi/dy/masa/minihud/config/Configs.java +++ b/src/main/java/fi/dy/masa/minihud/config/Configs.java @@ -26,91 +26,93 @@ public class Configs implements IConfigHandler private static final String CONFIG_FILE_NAME = Reference.MOD_ID + ".json"; private static final int CONFIG_VERSION = 1; + private static final String GENERIC_KEY = Reference.MOD_ID+".config.generic"; public static class Generic { - public static final ConfigBoolean AXOLOTL_TOOLTIPS = new ConfigBoolean("axolotlTooltips", false, "minihud.config.generic.comment.axolotlTooltips").translatedName("minihud.config.generic.name.axolotlTooltips"); - public static final ConfigBoolean BEE_TOOLTIPS = new ConfigBoolean("beeTooltips", false, "minihud.config.generic.comment.beeTooltips").translatedName("minihud.config.generic.name.beeTooltips"); - public static final ConfigBoolean HONEY_TOOLTIPS = new ConfigBoolean("honeyTooltips", false, "minihud.config.generic.comment.honeyTooltips").translatedName("minihud.config.generic.name.honeyTooltips"); - public static final ConfigInteger BIOME_OVERLAY_RANGE = new ConfigInteger("biomeOverlayRange", 4, 0, 32, "minihud.config.generic.comment.biomeOverlayRange").translatedName("minihud.config.generic.name.biomeOverlayRange"); - public static final ConfigInteger BIOME_OVERLAY_RANGE_VERTICAL = new ConfigInteger("biomeOverlayRangeVertical", 0, 0, 32, "minihud.config.generic.comment.biomeOverlayRangeVertical").translatedName("minihud.config.generic.name.biomeOverlayRangeVertical"); - public static final ConfigBoolean BIOME_OVERLAY_SINGLE_COLOR = new ConfigBoolean("biomeOverlaySingleColor", true, "minihud.config.generic.comment.biomeOverlaySingleColor").translatedName("minihud.config.generic.name.biomeOverlaySingleColor"); - public static final ConfigString BLOCK_POS_FORMAT_STRING = new ConfigString("blockPosFormat", "Block: %d, %d, %d", "minihud.config.generic.comment.blockPosFormat").translatedName("minihud.config.generic.name.blockPosFormat"); - public static final ConfigOptionList BLOCK_GRID_OVERLAY_MODE = new ConfigOptionList("blockGridOverlayMode", BlockGridMode.ALL, "minihud.config.generic.comment.blockGridOverlayMode").translatedName("minihud.config.generic.name.blockGridOverlayMode"); - public static final ConfigInteger BLOCK_GRID_OVERLAY_RADIUS = new ConfigInteger("blockGridOverlayRadius", 32, 0, 128, "minihud.config.generic.comment.blockGridOverlayRadius").translatedName("minihud.config.generic.name.blockGridOverlayRadius"); - public static final ConfigString COORDINATE_FORMAT_STRING = new ConfigString("coordinateFormat", "x: %.1f y: %.1f z: %.1f", "minihud.config.generic.comment.coordinateFormat").translatedName("minihud.config.generic.name.coordinateFormat"); - public static final ConfigString DATE_FORMAT_REAL = new ConfigString("dateFormatReal", "yyyy-MM-dd HH:mm:ss", "minihud.config.generic.comment.dateFormatReal").translatedName("minihud.config.generic.name.dateFormatReal"); - public static final ConfigString DATE_FORMAT_MINECRAFT = new ConfigString("dateFormatMinecraft", "MC time: (day {DAY}) {HOUR}:{MIN}:xx", "minihud.config.generic.comment.dateFormatMinecraft").translatedName("minihud.config.generic.name.dateFormatMinecraft"); - public static final ConfigBoolean DEBUG_MESSAGES = new ConfigBoolean("debugMessages", false, "minihud.config.generic.comment.debugMessages").translatedName("minihud.config.generic.name.debugMessages"); - //public static final ConfigBoolean DEBUG_RENDERER_PATH_MAX_DIST = new ConfigBoolean("debugRendererPathFindingEnablePointWidth", true, "minihud.config.generic.comment.debugRendererPathFindingEnablePointWidth").translatedName("minihud.config.generic.name.debugRendererPathFindingEnablePointWidth"); - public static final ConfigBoolean DONT_RESET_SEED_ON_DIMENSION_CHANGE = new ConfigBoolean("dontClearStoredSeedOnDimensionChange", true, "minihud.config.generic.comment.dontClearStoredSeedOnDimensionChange").translatedName("minihud.config.generic.name.dontClearStoredSeedOnDimensionChange"); - public static final ConfigBoolean ENTITY_DATA_SYNC = new ConfigBoolean("entityDataSync", true, "minihud.config.generic.comment.entityDataSync").translatedName("minihud.config.generic.name.entityDataSync"); - public static final ConfigBoolean ENTITY_DATA_SYNC_BACKUP = new ConfigBoolean("entityDataSyncBackup", true, "minihud.config.generic.comment.entityDataSyncBackup").translatedName("minihud.config.generic.name.entityDataSyncBackup"); - public static final ConfigBoolean ENTITY_DATA_LOAD_NBT = new ConfigBoolean("entityDataSyncLoadNbt", false, "minihud.config.generic.comment.entityDataSyncLoadNbt").translatedName("minihud.config.generic.name.entityDataSyncLoadNbt"); - //public static final ConfigBoolean FIX_VANILLA_DEBUG_RENDERERS = new ConfigBoolean("enableVanillaDebugRendererFix", true, "minihud.config.generic.comment.enableVanillaDebugRendererFix").translatedName("minihud.config.generic.name.enableVanillaDebugRendererFix"); - public static final ConfigDouble FONT_SCALE = new ConfigDouble("fontScale", 0.5, 0.01, 100.0, "minihud.config.generic.comment.fontScale").translatedName("minihud.config.generic.name.fontScale"); - public static final ConfigOptionList HUD_ALIGNMENT = new ConfigOptionList("hudAlignment", HudAlignment.TOP_LEFT, "minihud.config.generic.comment.hudAlignment").translatedName("minihud.config.generic.name.hudAlignment"); - public static final ConfigBoolean INFO_LINES_USES_NBT = new ConfigBoolean("infoLinesUsesNbt", true, "minihud.config.generic.comment.infoLinesUsesNbt").translatedName("minihud.config.generic.name.infoLinesUsesNbt"); - public static final ConfigHotkey INVENTORY_PREVIEW = new ConfigHotkey("inventoryPreview", "LEFT_ALT", KeybindSettings.PRESS_ALLOWEXTRA, "minihud.config.generic.comment.inventoryPreview").translatedName("minihud.config.generic.name.inventoryPreview"); - public static final ConfigBoolean INVENTORY_PREVIEW_ENABLED = new ConfigBoolean("inventoryPreviewEnabled", false, "minihud.config.generic.comment.inventoryPreviewEnabled").translatedName("minihud.config.generic.name.inventoryPreviewEnabled"); - public static final ConfigHotkey INVENTORY_PREVIEW_TOGGLE_SCREEN = new ConfigHotkey("inventoryPreviewToggleScreen", "BUTTON_3", KeybindSettings.create(KeybindSettings.Context.ANY, KeyAction.PRESS, true, true, false, true), "minihud.config.generic.comment.inventoryPreviewToggleScreen").translatedName("minihud.config.generic.name.inventoryPreviewToggleScreen"); - public static final ConfigBoolean LIGHT_LEVEL_AUTO_HEIGHT = new ConfigBoolean("lightLevelAutoHeight", false, "minihud.config.generic.comment.lightLevelAutoHeight").translatedName("minihud.config.generic.name.lightLevelAutoHeight"); - public static final ConfigBoolean LIGHT_LEVEL_COLORED_NUMBERS = new ConfigBoolean("lightLevelColoredNumbers", true, "minihud.config.generic.comment.lightLevelColoredNumbers").translatedName("minihud.config.generic.name.lightLevelColoredNumbers"); - public static final ConfigBoolean LIGHT_LEVEL_COLLISION_CHECK = new ConfigBoolean("lightLevelCollisionCheck", false, "minihud.config.generic.comment.lightLevelCollisionCheck").translatedName("minihud.config.generic.name.lightLevelCollisionCheck"); - public static final ConfigOptionList LIGHT_LEVEL_MARKER_CONDITION = new ConfigOptionList("lightLevelMarkerCondition", LightLevelRenderCondition.SPAWNABLE, "minihud.config.generic.comment.lightLevelMarkerCondition").translatedName("minihud.config.generic.name.lightLevelMarkerCondition"); - public static final ConfigOptionList LIGHT_LEVEL_MARKER_MODE = new ConfigOptionList("lightLevelMarkers", LightLevelMarkerMode.SQUARE, "minihud.config.generic.comment.lightLevelMarkers").translatedName("minihud.config.generic.name.lightLevelMarkers"); - public static final ConfigDouble LIGHT_LEVEL_MARKER_SIZE = new ConfigDouble("lightLevelMarkerSize", 0.84, 0.0, 1.0, "minihud.config.generic.comment.lightLevelMarkerSize").translatedName("minihud.config.generic.name.lightLevelMarkerSize"); - public static final ConfigOptionList LIGHT_LEVEL_NUMBER_CONDITION = new ConfigOptionList("lightLevelNumberCondition", LightLevelRenderCondition.ALWAYS, "minihud.config.generic.comment.lightLevelNumberCondition").translatedName("minihud.config.generic.name.lightLevelNumberCondition"); - public static final ConfigOptionList LIGHT_LEVEL_NUMBER_MODE = new ConfigOptionList("lightLevelNumbers", LightLevelNumberMode.BLOCK, "minihud.config.generic.comment.lightLevelNumbers").translatedName("minihud.config.generic.name.lightLevelNumbers"); - public static final ConfigDouble LIGHT_LEVEL_NUMBER_OFFSET_BLOCK_X = new ConfigDouble("lightLevelNumberOffsetBlockX", 0.26, 0.0, 1.0, "minihud.config.generic.comment.lightLevelNumberOffsetBlockX").translatedName("minihud.config.generic.name.lightLevelNumberOffsetBlockX"); - public static final ConfigDouble LIGHT_LEVEL_NUMBER_OFFSET_BLOCK_Y = new ConfigDouble("lightLevelNumberOffsetBlockY", 0.32, 0.0, 1.0, "minihud.config.generic.comment.lightLevelNumberOffsetBlockY").translatedName("minihud.config.generic.name.lightLevelNumberOffsetBlockY"); - public static final ConfigDouble LIGHT_LEVEL_NUMBER_OFFSET_SKY_X = new ConfigDouble("lightLevelNumberOffsetSkyX", 0.42, 0.0, 1.0, "minihud.config.generic.comment.lightLevelNumberOffsetSkyX").translatedName("minihud.config.generic.name.lightLevelNumberOffsetSkyX"); - public static final ConfigDouble LIGHT_LEVEL_NUMBER_OFFSET_SKY_Y = new ConfigDouble("lightLevelNumberOffsetSkyY", 0.56, 0.0, 1.0, "minihud.config.generic.comment.lightLevelNumberOffsetSkyY").translatedName("minihud.config.generic.name.lightLevelNumberOffsetSkyY"); - public static final ConfigBoolean LIGHT_LEVEL_NUMBER_ROTATION = new ConfigBoolean("lightLevelNumberRotation", true, "minihud.config.generic.comment.lightLevelNumberRotation").translatedName("minihud.config.generic.name.lightLevelNumberRotation"); - public static final ConfigInteger LIGHT_LEVEL_RANGE = new ConfigInteger("lightLevelRange", 24, 1, 64, "minihud.config.generic.comment.lightLevelRange").translatedName("minihud.config.generic.name.lightLevelRange"); - public static final ConfigDouble LIGHT_LEVEL_RENDER_OFFSET = new ConfigDouble("lightLevelRenderOffset", 0.005, 0.0, 1.0, "minihud.config.generic.comment.lightLevelRenderOffset").translatedName("minihud.config.generic.name.lightLevelRenderOffset"); - public static final ConfigBoolean LIGHT_LEVEL_RENDER_THROUGH = new ConfigBoolean("lightLevelRenderThrough", false, "minihud.config.generic.comment.lightLevelRenderThrough").translatedName("minihud.config.generic.name.lightLevelRenderThrough"); - public static final ConfigBoolean LIGHT_LEVEL_SKIP_BLOCK_CHECK = new ConfigBoolean("lightLevelSkipBlockCheck", false, "minihud.config.generic.comment.lightLevelSkipBlockCheck").translatedName("minihud.config.generic.name.lightLevelSkipBlockCheck"); - public static final ConfigInteger LIGHT_LEVEL_THRESHOLD_DIM = new ConfigInteger("lightLevelThresholdDim", 0, 0, 15, "minihud.config.generic.comment.lightLevelThresholdDim").translatedName("minihud.config.generic.name.lightLevelThresholdDim"); - public static final ConfigInteger LIGHT_LEVEL_THRESHOLD_SAFE = new ConfigInteger("lightLevelThresholdSafe", 1, 0, 15, "minihud.config.generic.comment.lightLevelThresholdSafe").translatedName("minihud.config.generic.name.lightLevelThresholdSafe"); - public static final ConfigBoolean LIGHT_LEVEL_UNDER_WATER = new ConfigBoolean("lightLevelUnderWater", false, "minihud.config.generic.comment.lightLevelUnderWater").translatedName("minihud.config.generic.name.lightLevelUnderWater"); - public static final ConfigBooleanHotkeyed MAIN_RENDERING_TOGGLE = new ConfigBooleanHotkeyed("mainRenderingToggle", true, "H", KeybindSettings.RELEASE_EXCLUSIVE, "minihud.config.generic.comment.mainRenderingToggle", "minihud.config.generic.prettyName.mainRenderingToggle").translatedName("minihud.config.generic.name.mainRenderingToggle"); - public static final ConfigBoolean MAP_PREVIEW = new ConfigBoolean("mapPreview", false, "minihud.config.generic.comment.mapPreview").translatedName("minihud.config.generic.name.mapPreview"); - public static final ConfigBoolean MAP_PREVIEW_REQUIRE_SHIFT = new ConfigBoolean("mapPreviewRequireShift", true, "minihud.config.generic.comment.mapPreviewRequireShift").translatedName("minihud.config.generic.name.mapPreviewRequireShift"); - public static final ConfigInteger MAP_PREVIEW_SIZE = new ConfigInteger("mapPreviewSize", 160, 16, 512, "minihud.config.generic.comment.mapPreviewSize").translatedName("minihud.config.generic.name.mapPreviewSize"); - public static final ConfigHotkey MOVE_SHAPE_TO_PLAYER = new ConfigHotkey("moveShapeToPlayer", "", "minihud.config.generic.comment.moveShapeToPlayer").translatedName("minihud.config.generic.name.moveShapeToPlayer"); - public static final ConfigBoolean OFFSET_SUBTITLE_HUD = new ConfigBoolean("offsetSubtitleHud", true, "minihud.config.generic.comment.offsetSubtitleHud").translatedName("minihud.config.generic.name.offsetSubtitleHud"); - public static final ConfigHotkey OPEN_CONFIG_GUI = new ConfigHotkey("openConfigGui", "H,C", "minihud.config.generic.comment.openConfigGui").translatedName("minihud.config.generic.name.openConfigGui"); - public static final ConfigBoolean REQUIRE_SNEAK = new ConfigBoolean("requireSneak", false, "minihud.config.generic.comment.requireSneak").translatedName("minihud.config.generic.name.requireSneak"); - public static final ConfigHotkey REQUIRED_KEY = new ConfigHotkey("requiredKey", "", KeybindSettings.MODIFIER_INGAME_EMPTY, "minihud.config.generic.comment.requiredKey").translatedName("minihud.config.generic.name.requiredKey"); - public static final ConfigInteger SERVER_NBT_REQUEST_RATE = new ConfigInteger("serverNbtRequestRate", 2, "minihud.config.generic.comment.serverNbtRequestRate").translatedName("minihud.config.generic.name.serverNbtRequestRate"); - public static final ConfigHotkey SET_DISTANCE_REFERENCE_POINT = new ConfigHotkey("setDistanceReferencePoint", "", "minihud.config.generic.comment.setDistanceReferencePoint").translatedName("minihud.config.generic.name.setDistanceReferencePoint"); - public static final ConfigHotkey SHAPE_EDITOR = new ConfigHotkey("shapeEditor", "", "minihud.config.generic.comment.shapeEditor").translatedName("minihud.config.generic.name.shapeEditor"); - public static final ConfigBoolean SHULKER_BOX_PREVIEW = new ConfigBoolean("shulkerBoxPreview", false, "minihud.config.generic.comment.shulkerBoxPreview").translatedName("minihud.config.generic.name.shulkerBoxPreview"); - public static final ConfigBoolean SHULKER_DISPLAY_BACKGROUND_COLOR = new ConfigBoolean("shulkerDisplayBgColor", true, "minihud.config.generic.comment.shulkerDisplayBgColor").translatedName("minihud.config.generic.name.shulkerDisplayBgColor"); - public static final ConfigBoolean SHULKER_DISPLAY_REQUIRE_SHIFT = new ConfigBoolean("shulkerDisplayRequireShift", true, "minihud.config.generic.comment.shulkerDisplayRequireShift").translatedName("minihud.config.generic.name.shulkerDisplayRequireShift"); - public static final ConfigBoolean SLIME_CHUNK_TOP_TO_PLAYER = new ConfigBoolean("slimeChunkTopToPlayer", true, "minihud.config.generic.comment.slimeChunkTopToPlayer").translatedName("minihud.config.generic.name.slimeChunkTopToPlayer"); - public static final ConfigInteger SLIME_CHUNK_OVERLAY_RADIUS = new ConfigInteger("slimeChunkOverlayRadius", -1, -1, 40, "minihud.config.generic.comment.slimeChunkOverlayRadius").translatedName("minihud.config.generic.name.slimeChunkOverlayRadius"); - public static final ConfigBoolean SORT_LINES_BY_LENGTH = new ConfigBoolean("sortLinesByLength", false, "minihud.config.generic.comment.sortLinesByLength").translatedName("minihud.config.generic.name.sortLinesByLength"); - public static final ConfigBoolean SORT_LINES_REVERSED = new ConfigBoolean("sortLinesReversed", false, "minihud.config.generic.comment.sortLinesReversed").translatedName("minihud.config.generic.name.sortLinesReversed"); - public static final ConfigBoolean SPAWN_PLAYER_OUTER_OVERLAY_ENABLED = new ConfigBoolean("spawnPlayerOuterOverlayEnabled", false, "minihud.config.generic.comment.spawnPlayerOuterOverlayEnabled").translatedName("minihud.config.generic.name.spawnPlayerOuterOverlayEnabled"); - public static final ConfigBoolean SPAWN_PLAYER_REDSTONE_OVERLAY_ENABLED= new ConfigBoolean("spawnPlayerRedstoneOverlayEnabled", false, "minihud.config.generic.comment.spawnPlayerRedstoneOverlayEnabled").translatedName("minihud.config.generic.name.spawnPlayerRedstoneOverlayEnabled"); - public static final ConfigBoolean SPAWN_REAL_OUTER_OVERLAY_ENABLED = new ConfigBoolean("spawnRealOuterOverlayEnabled", false, "minihud.config.generic.comment.spawnRealOuterOverlayEnabled").translatedName("minihud.config.generic.name.spawnRealOuterOverlayEnabled"); - public static final ConfigBoolean SPAWN_REAL_REDSTONE_OVERLAY_ENABLED = new ConfigBoolean("spawnRealRedstoneOverlayEnabled", false, "minihud.config.generic.comment.spawnRealRedstoneOverlayEnabled").translatedName("minihud.config.generic.name.spawnRealRedstoneOverlayEnabled"); - public static final ConfigInteger SPAWNABLE_COLUMNS_OVERLAY_RADIUS = new ConfigInteger("spawnableColumnHeightsOverlayRadius", 40, 0, 128, "minihud.config.generic.comment.spawnableColumnHeightsOverlayRadius").translatedName("minihud.config.generic.name.spawnableColumnHeightsOverlayRadius"); - public static final ConfigBoolean STRUCTURES_RENDER_THROUGH = new ConfigBoolean("structuresRenderThrough", false, "minihud.config.generic.comment.structuresRenderThrough").translatedName("minihud.config.generic.name.structuresRenderThrough"); - public static final ConfigInteger TEXT_POS_X = new ConfigInteger("textPosX", 4, 0, 8192, "minihud.config.generic.comment.textPosX").translatedName("minihud.config.generic.name.textPosX"); - public static final ConfigInteger TEXT_POS_Y = new ConfigInteger("textPosY", 4, 0, 8192, "minihud.config.generic.comment.textPosY").translatedName("minihud.config.generic.name.textPosY"); - public static final ConfigInteger TIME_DAY_DIVISOR = new ConfigInteger("timeDayDivisor", 24000, 1, Integer.MAX_VALUE, "minihud.config.generic.comment.timeDayDivisor").translatedName("minihud.config.generic.name.timeDayDivisor"); - public static final ConfigInteger TIME_TOTAL_DIVISOR = new ConfigInteger("timeTotalDivisor", 24000, 1, Integer.MAX_VALUE, "minihud.config.generic.comment.timeTotalDivisor").translatedName("minihud.config.generic.name.timeTotalDivisor"); - public static final ConfigBoolean USE_CUSTOMIZED_COORDINATES = new ConfigBoolean("useCustomizedCoordinateFormat", true, "minihud.config.generic.comment.useCustomizedCoordinateFormat").translatedName("minihud.config.generic.name.useCustomizedCoordinateFormat"); - public static final ConfigBoolean USE_FONT_SHADOW = new ConfigBoolean("useFontShadow", false, "minihud.config.generic.comment.useFontShadow").translatedName("minihud.config.generic.name.useFontShadow"); - public static final ConfigBoolean USE_TEXT_BACKGROUND = new ConfigBoolean("useTextBackground", true, "minihud.config.generic.comment.useTextBackground").translatedName("minihud.config.generic.name.useTextBackground"); - public static final ConfigBoolean VILLAGER_CONVERSION_TICKS = new ConfigBoolean("villagerConversionTicks", true, "minihud.config.generic.comment.villagerConversionTicks").translatedName("minihud.config.generic.name.villagerConversionTicks"); - public static final ConfigBoolean VILLAGER_OFFER_ENCHANTMENT_BOOKS = new ConfigBoolean("villagerOfferEnchantmentBooks", true, "minihud.config.generic.comment.villagerOfferEnchantmentBooks").translatedName("minihud.config.generic.name.villagerOfferEnchantmentBooks"); - public static final ConfigBoolean VILLAGER_OFFER_PRICE_RANGE = new ConfigBoolean("villagerOfferPriceRange", true, "minihud.config.generic.comment.villagerOfferPriceRange").translatedName("minihud.config.generic.name.villagerOfferPriceRange"); - public static final ConfigBoolean VILLAGER_OFFER_HIGHEST_LEVEL_ONLY = new ConfigBoolean("villagerOfferHighestLevelOnly", false, "minihud.config.generic.comment.villagerOfferHighestLevelOnly").translatedName("minihud.config.generic.name.villagerOfferHighestLevelOnly"); - public static final ConfigBoolean VILLAGER_OFFER_LOWEST_PRICE_NEARBY = new ConfigBoolean("villagerOfferLowestPriceNearby" , false, "minihud.config.generic.comment.villagerOfferLowestPriceNearby").translatedName("minihud.config.generic.name.villagerOfferLowestPriceNearby"); - public static final ConfigDouble VILLAGER_OFFER_PRICE_THRESHOLD = new ConfigDouble("villagerOfferPriceThreshold", 1, 0, 1, "minihud.config.generic.comment.villagerOfferPriceThreshold").translatedName("minihud.config.generic.name.villagerOfferPriceThreshold"); + public static final ConfigBoolean AXOLOTL_TOOLTIPS = new ConfigBoolean("axolotlTooltips", false).apply(GENERIC_KEY); + public static final ConfigBoolean BEE_TOOLTIPS = new ConfigBoolean("beeTooltips", false).apply(GENERIC_KEY); + public static final ConfigBoolean HONEY_TOOLTIPS = new ConfigBoolean("honeyTooltips", false).apply(GENERIC_KEY); + public static final ConfigInteger BIOME_OVERLAY_RANGE = new ConfigInteger("biomeOverlayRange", 4, 0, 32).apply(GENERIC_KEY); + public static final ConfigInteger BIOME_OVERLAY_RANGE_VERTICAL = new ConfigInteger("biomeOverlayRangeVertical", 0, 0, 32).apply(GENERIC_KEY); + public static final ConfigBoolean BIOME_OVERLAY_SINGLE_COLOR = new ConfigBoolean("biomeOverlaySingleColor", true).apply(GENERIC_KEY); + public static final ConfigString BLOCK_POS_FORMAT_STRING = new ConfigString("blockPosFormat", "Block: %d, %d, %d").apply(GENERIC_KEY); + public static final ConfigOptionList BLOCK_GRID_OVERLAY_MODE = new ConfigOptionList("blockGridOverlayMode", BlockGridMode.ALL).apply(GENERIC_KEY); + public static final ConfigInteger BLOCK_GRID_OVERLAY_RADIUS = new ConfigInteger("blockGridOverlayRadius", 32, 0, 128).apply(GENERIC_KEY); + public static final ConfigString COORDINATE_FORMAT_STRING = new ConfigString("coordinateFormat", "x: %.1f y: %.1f z: %.1f").apply(GENERIC_KEY); + public static final ConfigString DATE_FORMAT_REAL = new ConfigString("dateFormatReal", "yyyy-MM-dd HH:mm:ss").apply(GENERIC_KEY); + public static final ConfigString DATE_FORMAT_MINECRAFT = new ConfigString("dateFormatMinecraft", "MC time: (day {DAY}) {HOUR}:{MIN}:xx").apply(GENERIC_KEY); + public static final ConfigBoolean DEBUG_MESSAGES = new ConfigBoolean("debugMessages", false).apply(GENERIC_KEY); + //public static final ConfigBoolean DEBUG_DEVELOPMENT_MODE = new ConfigBoolean("debugDevelopmentMode", false).apply(GENERIC_KEY); + //public static final ConfigBoolean DEBUG_RENDERER_PATH_MAX_DIST = new ConfigBoolean("debugRendererPathFindingEnablePointWidth", true).apply(GENERIC_KEY); + public static final ConfigBoolean DONT_RESET_SEED_ON_DIMENSION_CHANGE = new ConfigBoolean("dontClearStoredSeedOnDimensionChange", true).apply(GENERIC_KEY); + public static final ConfigBoolean ENTITY_DATA_SYNC = new ConfigBoolean("entityDataSync", true).apply(GENERIC_KEY); + public static final ConfigBoolean ENTITY_DATA_SYNC_BACKUP = new ConfigBoolean("entityDataSyncBackup", true).apply(GENERIC_KEY); + public static final ConfigBoolean ENTITY_DATA_LOAD_NBT = new ConfigBoolean("entityDataSyncLoadNbt", false).apply(GENERIC_KEY); + //public static final ConfigBoolean FIX_VANILLA_DEBUG_RENDERERS = new ConfigBoolean("enableVanillaDebugRendererFix", true).apply(GENERIC_KEY); + public static final ConfigDouble FONT_SCALE = new ConfigDouble("fontScale", 0.5, 0.01, 100.0).apply(GENERIC_KEY); + public static final ConfigOptionList HUD_ALIGNMENT = new ConfigOptionList("hudAlignment", HudAlignment.TOP_LEFT).apply(GENERIC_KEY); + public static final ConfigBoolean INFO_LINES_USES_NBT = new ConfigBoolean("infoLinesUsesNbt", true).apply(GENERIC_KEY); + public static final ConfigHotkey INVENTORY_PREVIEW = new ConfigHotkey("inventoryPreview", "LEFT_ALT", KeybindSettings.PRESS_ALLOWEXTRA).apply(GENERIC_KEY); + public static final ConfigBoolean INVENTORY_PREVIEW_ENABLED = new ConfigBoolean("inventoryPreviewEnabled", false).apply(GENERIC_KEY); + public static final ConfigHotkey INVENTORY_PREVIEW_TOGGLE_SCREEN = new ConfigHotkey("inventoryPreviewToggleScreen", "BUTTON_3", KeybindSettings.create(KeybindSettings.Context.ANY, KeyAction.PRESS, true, true, false, true)).apply(GENERIC_KEY); + public static final ConfigBoolean LIGHT_LEVEL_AUTO_HEIGHT = new ConfigBoolean("lightLevelAutoHeight", false).apply(GENERIC_KEY); + public static final ConfigBoolean LIGHT_LEVEL_COLORED_NUMBERS = new ConfigBoolean("lightLevelColoredNumbers", true).apply(GENERIC_KEY); + public static final ConfigBoolean LIGHT_LEVEL_COLLISION_CHECK = new ConfigBoolean("lightLevelCollisionCheck", false).apply(GENERIC_KEY); + public static final ConfigOptionList LIGHT_LEVEL_MARKER_CONDITION = new ConfigOptionList("lightLevelMarkerCondition", LightLevelRenderCondition.SPAWNABLE).apply(GENERIC_KEY); + public static final ConfigOptionList LIGHT_LEVEL_MARKER_MODE = new ConfigOptionList("lightLevelMarkers", LightLevelMarkerMode.SQUARE).apply(GENERIC_KEY); + public static final ConfigDouble LIGHT_LEVEL_MARKER_SIZE = new ConfigDouble("lightLevelMarkerSize", 0.84, 0.0, 1.0).apply(GENERIC_KEY); + public static final ConfigOptionList LIGHT_LEVEL_NUMBER_CONDITION = new ConfigOptionList("lightLevelNumberCondition", LightLevelRenderCondition.ALWAYS).apply(GENERIC_KEY); + public static final ConfigOptionList LIGHT_LEVEL_NUMBER_MODE = new ConfigOptionList("lightLevelNumbers", LightLevelNumberMode.BLOCK).apply(GENERIC_KEY); + public static final ConfigDouble LIGHT_LEVEL_NUMBER_OFFSET_BLOCK_X = new ConfigDouble("lightLevelNumberOffsetBlockX", 0.26, 0.0, 1.0).apply(GENERIC_KEY); + public static final ConfigDouble LIGHT_LEVEL_NUMBER_OFFSET_BLOCK_Y = new ConfigDouble("lightLevelNumberOffsetBlockY", 0.32, 0.0, 1.0).apply(GENERIC_KEY); + public static final ConfigDouble LIGHT_LEVEL_NUMBER_OFFSET_SKY_X = new ConfigDouble("lightLevelNumberOffsetSkyX", 0.42, 0.0, 1.0).apply(GENERIC_KEY); + public static final ConfigDouble LIGHT_LEVEL_NUMBER_OFFSET_SKY_Y = new ConfigDouble("lightLevelNumberOffsetSkyY", 0.56, 0.0, 1.0).apply(GENERIC_KEY); + public static final ConfigBoolean LIGHT_LEVEL_NUMBER_ROTATION = new ConfigBoolean("lightLevelNumberRotation", true).apply(GENERIC_KEY); + public static final ConfigInteger LIGHT_LEVEL_RANGE = new ConfigInteger("lightLevelRange", 24, 1, 64).apply(GENERIC_KEY); + public static final ConfigDouble LIGHT_LEVEL_RENDER_OFFSET = new ConfigDouble("lightLevelRenderOffset", 0.005, 0.0, 1.0).apply(GENERIC_KEY); + public static final ConfigBoolean LIGHT_LEVEL_RENDER_THROUGH = new ConfigBoolean("lightLevelRenderThrough", false).apply(GENERIC_KEY); + public static final ConfigBoolean LIGHT_LEVEL_SKIP_BLOCK_CHECK = new ConfigBoolean("lightLevelSkipBlockCheck", false).apply(GENERIC_KEY); + public static final ConfigInteger LIGHT_LEVEL_THRESHOLD_DIM = new ConfigInteger("lightLevelThresholdDim", 0, 0, 15).apply(GENERIC_KEY); + public static final ConfigInteger LIGHT_LEVEL_THRESHOLD_SAFE = new ConfigInteger("lightLevelThresholdSafe", 1, 0, 15).apply(GENERIC_KEY); + public static final ConfigBoolean LIGHT_LEVEL_UNDER_WATER = new ConfigBoolean("lightLevelUnderWater", false).apply(GENERIC_KEY); + public static final ConfigBooleanHotkeyed MAIN_RENDERING_TOGGLE = new ConfigBooleanHotkeyed("mainRenderingToggle", true, "H", KeybindSettings.RELEASE_EXCLUSIVE).apply(GENERIC_KEY); + public static final ConfigBoolean MAP_PREVIEW = new ConfigBoolean("mapPreview", false).apply(GENERIC_KEY); + public static final ConfigBoolean MAP_PREVIEW_REQUIRE_SHIFT = new ConfigBoolean("mapPreviewRequireShift", true).apply(GENERIC_KEY); + public static final ConfigInteger MAP_PREVIEW_SIZE = new ConfigInteger("mapPreviewSize", 160, 16, 512).apply(GENERIC_KEY); + public static final ConfigHotkey MOVE_SHAPE_TO_PLAYER = new ConfigHotkey("moveShapeToPlayer", "").apply(GENERIC_KEY); + public static final ConfigBoolean OFFSET_SUBTITLE_HUD = new ConfigBoolean("offsetSubtitleHud", true).apply(GENERIC_KEY); + public static final ConfigHotkey OPEN_CONFIG_GUI = new ConfigHotkey("openConfigGui", "H,C").apply(GENERIC_KEY); + public static final ConfigBoolean REQUIRE_SNEAK = new ConfigBoolean("requireSneak", false).apply(GENERIC_KEY); + public static final ConfigHotkey REQUIRED_KEY = new ConfigHotkey("requiredKey", "", KeybindSettings.MODIFIER_INGAME_EMPTY).apply(GENERIC_KEY); + public static final ConfigInteger SERVER_NBT_REQUEST_RATE = new ConfigInteger("serverNbtRequestRate", 2).apply(GENERIC_KEY); + public static final ConfigHotkey SET_DISTANCE_REFERENCE_POINT = new ConfigHotkey("setDistanceReferencePoint", "").apply(GENERIC_KEY); + public static final ConfigHotkey SHAPE_EDITOR = new ConfigHotkey("shapeEditor", "").apply(GENERIC_KEY); + public static final ConfigBoolean SHULKER_BOX_PREVIEW = new ConfigBoolean("shulkerBoxPreview", false).apply(GENERIC_KEY); + public static final ConfigBoolean SHULKER_DISPLAY_BACKGROUND_COLOR = new ConfigBoolean("shulkerDisplayBgColor", true).apply(GENERIC_KEY); + public static final ConfigBoolean SHULKER_DISPLAY_REQUIRE_SHIFT = new ConfigBoolean("shulkerDisplayRequireShift", true).apply(GENERIC_KEY); + public static final ConfigBoolean SLIME_CHUNK_TOP_TO_PLAYER = new ConfigBoolean("slimeChunkTopToPlayer", true).apply(GENERIC_KEY); + public static final ConfigInteger SLIME_CHUNK_OVERLAY_RADIUS = new ConfigInteger("slimeChunkOverlayRadius", -1, -1, 40).apply(GENERIC_KEY); + public static final ConfigBoolean SORT_LINES_BY_LENGTH = new ConfigBoolean("sortLinesByLength", false).apply(GENERIC_KEY); + public static final ConfigBoolean SORT_LINES_REVERSED = new ConfigBoolean("sortLinesReversed", false).apply(GENERIC_KEY); + public static final ConfigBoolean SPAWN_PLAYER_OUTER_OVERLAY_ENABLED = new ConfigBoolean("spawnPlayerOuterOverlayEnabled", false).apply(GENERIC_KEY); + public static final ConfigBoolean SPAWN_PLAYER_REDSTONE_OVERLAY_ENABLED= new ConfigBoolean("spawnPlayerRedstoneOverlayEnabled", false).apply(GENERIC_KEY); + public static final ConfigBoolean SPAWN_REAL_OUTER_OVERLAY_ENABLED = new ConfigBoolean("spawnRealOuterOverlayEnabled", false).apply(GENERIC_KEY); + public static final ConfigBoolean SPAWN_REAL_REDSTONE_OVERLAY_ENABLED = new ConfigBoolean("spawnRealRedstoneOverlayEnabled", false).apply(GENERIC_KEY); + public static final ConfigInteger SPAWNABLE_COLUMNS_OVERLAY_RADIUS = new ConfigInteger("spawnableColumnHeightsOverlayRadius", 40, 0, 128).apply(GENERIC_KEY); + public static final ConfigBoolean STRUCTURES_RENDER_THROUGH = new ConfigBoolean("structuresRenderThrough", false).apply(GENERIC_KEY); + public static final ConfigInteger TEXT_POS_X = new ConfigInteger("textPosX", 4, 0, 8192).apply(GENERIC_KEY); + public static final ConfigInteger TEXT_POS_Y = new ConfigInteger("textPosY", 4, 0, 8192).apply(GENERIC_KEY); + public static final ConfigInteger TIME_DAY_DIVISOR = new ConfigInteger("timeDayDivisor", 24000, 1, Integer.MAX_VALUE).apply(GENERIC_KEY); + public static final ConfigInteger TIME_TOTAL_DIVISOR = new ConfigInteger("timeTotalDivisor", 24000, 1, Integer.MAX_VALUE).apply(GENERIC_KEY); + public static final ConfigBoolean USE_CUSTOMIZED_COORDINATES = new ConfigBoolean("useCustomizedCoordinateFormat", true).apply(GENERIC_KEY); + public static final ConfigBoolean USE_FONT_SHADOW = new ConfigBoolean("useFontShadow", false).apply(GENERIC_KEY); + public static final ConfigBoolean USE_TEXT_BACKGROUND = new ConfigBoolean("useTextBackground", true).apply(GENERIC_KEY); + public static final ConfigBoolean VILLAGER_CONVERSION_TICKS = new ConfigBoolean("villagerConversionTicks", true).apply(GENERIC_KEY); + public static final ConfigBoolean VILLAGER_OFFER_ENCHANTMENT_BOOKS = new ConfigBoolean("villagerOfferEnchantmentBooks", true).apply(GENERIC_KEY); + public static final ConfigBoolean VILLAGER_OFFER_PRICE_RANGE = new ConfigBoolean("villagerOfferPriceRange", true).apply(GENERIC_KEY); + public static final ConfigBoolean VILLAGER_OFFER_HIGHEST_LEVEL_ONLY = new ConfigBoolean("villagerOfferHighestLevelOnly", false).apply(GENERIC_KEY); + public static final ConfigBoolean VILLAGER_OFFER_LOWEST_PRICE_NEARBY = new ConfigBoolean("villagerOfferLowestPriceNearby" , false).apply(GENERIC_KEY); + public static final ConfigDouble VILLAGER_OFFER_PRICE_THRESHOLD = new ConfigDouble("villagerOfferPriceThreshold", 1, 0, 1).apply(GENERIC_KEY); public static final ImmutableList OPTIONS = ImmutableList.of( AXOLOTL_TOOLTIPS, @@ -118,6 +120,7 @@ public static class Generic HONEY_TOOLTIPS, BIOME_OVERLAY_SINGLE_COLOR, DEBUG_MESSAGES, + //DEBUG_DEVELOPMENT_MODE, //DEBUG_RENDERER_PATH_MAX_DIST, DONT_RESET_SEED_ON_DIMENSION_CHANGE, ENTITY_DATA_SYNC, @@ -213,47 +216,48 @@ public static class Generic ); } + private static final String COLORS_KEY = Reference.MOD_ID+".config.colors"; public static class Colors { - public static final ConfigColor BEACON_RANGE_LVL1_OVERLAY_COLOR = new ConfigColor("beaconRangeLvl1", "#20E060FF", "minihud.config.colors.comment.beaconRangeLvl1").translatedName("minihud.config.colors.name.beaconRangeLvl1"); - public static final ConfigColor BEACON_RANGE_LVL2_OVERLAY_COLOR = new ConfigColor("beaconRangeLvl2", "#20FFB040", "minihud.config.colors.comment.beaconRangeLvl2").translatedName("minihud.config.colors.name.beaconRangeLvl2"); - public static final ConfigColor BEACON_RANGE_LVL3_OVERLAY_COLOR = new ConfigColor("beaconRangeLvl3", "#20FFF040", "minihud.config.colors.comment.beaconRangeLvl3").translatedName("minihud.config.colors.name.beaconRangeLvl3"); - public static final ConfigColor BEACON_RANGE_LVL4_OVERLAY_COLOR = new ConfigColor("beaconRangeLvl4", "#2060FF40", "minihud.config.colors.comment.beaconRangeLvl4").translatedName("minihud.config.colors.name.beaconRangeLvl4"); - public static final ConfigColor BLOCK_GRID_OVERLAY_COLOR = new ConfigColor("blockGridOverlayColor", "#80FFFFFF", "minihud.config.colors.comment.blockGridOverlayColor").translatedName("minihud.config.colors.name.blockGridOverlayColor"); - public static final ConfigColor CONDUIT_RANGE_OVERLAY_COLOR = new ConfigColor("conduitRange", "#2030FFFF", "minihud.config.colors.comment.conduitRange").translatedName("minihud.config.colors.name.conduitRange"); - public static final ConfigColor LIGHT_LEVEL_MARKER_BLOCK_LIT = new ConfigColor("lightLevelMarkerBlockLit", "#FF209040", "minihud.config.colors.comment.lightLevelMarkerBlockLit").translatedName("minihud.config.colors.name.lightLevelMarkerBlockLit"); - public static final ConfigColor LIGHT_LEVEL_MARKER_DARK = new ConfigColor("lightLevelMarkerDark", "#FFFF4848", "minihud.config.colors.comment.lightLevelMarkerDark").translatedName("minihud.config.colors.name.lightLevelMarkerDark"); - public static final ConfigColor LIGHT_LEVEL_MARKER_DIM = new ConfigColor("lightLevelMarkerDim", "#FFC0C040", "minihud.config.colors.comment.lightLevelMarkerDim").translatedName("minihud.config.colors.name.lightLevelMarkerDim"); - public static final ConfigColor LIGHT_LEVEL_MARKER_SKY_LIT = new ConfigColor("lightLevelMarkerSkyLit", "#FFFFFF33", "minihud.config.colors.comment.lightLevelMarkerSkyLit").translatedName("minihud.config.colors.name.lightLevelMarkerSkyLit"); - public static final ConfigColor LIGHT_LEVEL_NUMBER_BLOCK_DARK = new ConfigColor("lightLevelNumberBlockDark", "#FFC03030", "minihud.config.colors.comment.lightLevelNumberBlockDark").translatedName("minihud.config.colors.name.lightLevelNumberBlockDark"); - public static final ConfigColor LIGHT_LEVEL_NUMBER_BLOCK_DIM = new ConfigColor("lightLevelNumberBlockDim", "#FFC0C040", "minihud.config.colors.comment.lightLevelNumberBlockDim").translatedName("minihud.config.colors.name.lightLevelNumberBlockDim"); - public static final ConfigColor LIGHT_LEVEL_NUMBER_BLOCK_LIT = new ConfigColor("lightLevelNumberBlockLit", "#FF20FF40", "minihud.config.colors.comment.lightLevelNumberBlockLit").translatedName("minihud.config.colors.name.lightLevelNumberBlockLit"); - public static final ConfigColor LIGHT_LEVEL_NUMBER_SKY_DARK = new ConfigColor("lightLevelNumberSkyDark", "#FFFFF030", "minihud.config.colors.comment.lightLevelNumberSkyDark").translatedName("minihud.config.colors.name.lightLevelNumberSkyDark"); - public static final ConfigColor LIGHT_LEVEL_NUMBER_SKY_DIM = new ConfigColor("lightLevelNumberSkyDim", "#FFC0C030", "minihud.config.colors.comment.lightLevelNumberSkyDim").translatedName("minihud.config.colors.name.lightLevelNumberSkyDim"); - public static final ConfigColor LIGHT_LEVEL_NUMBER_SKY_LIT = new ConfigColor("lightLevelNumberSkyLit", "#FF40E0FF", "minihud.config.colors.comment.lightLevelNumberSkyLit").translatedName("minihud.config.colors.name.lightLevelNumberSkyLit"); - public static final ConfigColor RANDOM_TICKS_FIXED_OVERLAY_COLOR = new ConfigColor("randomTicksFixedOverlayColor", "#30F9F225", "minihud.config.colors.comment.randomTicksFixedOverlayColor").translatedName("minihud.config.colors.name.randomTicksFixedOverlayColor"); - public static final ConfigColor RANDOM_TICKS_PLAYER_OVERLAY_COLOR = new ConfigColor("randomTicksPlayerOverlayColor", "#3030FE73", "minihud.config.colors.comment.randomTicksPlayerOverlayColor").translatedName("minihud.config.colors.name.randomTicksPlayerOverlayColor"); - public static final ConfigColor REGION_OVERLAY_COLOR = new ConfigColor("regionOverlayColor", "#30FF8019", "minihud.config.colors.comment.regionOverlayColor").translatedName("minihud.config.colors.name.regionOverlayColor"); - public static final ConfigColor SHAPE_ADJUSTABLE_SPAWN_SPHERE = new ConfigColor("shapeAdjustableSpawnSphere", "#6030B0B0", "minihud.config.colors.comment.shapeAdjustableSpawnSphere").translatedName("minihud.config.colors.name.shapeAdjustableSpawnSphere"); - public static final ConfigColor SHAPE_BOX = new ConfigColor("shapeBox", "#6050A0A0", "minihud.config.colors.comment.shapeBox").translatedName("minihud.config.colors.name.shapeBox"); - public static final ConfigColor SHAPE_CAN_DESPAWN_SPHERE = new ConfigColor("shapeCanDespawnSphere", "#60A04050", "minihud.config.colors.comment.shapeCanDespawnSphere").translatedName("minihud.config.colors.name.shapeCanDespawnSphere"); - public static final ConfigColor SHAPE_CAN_SPAWN_SPHERE = new ConfigColor("shapeCanSpawnSphere", "#60A04050", "minihud.config.colors.comment.shapeCanSpawnSphere").translatedName("minihud.config.colors.name.shapeCanSpawnSphere"); - public static final ConfigColor SHAPE_CIRCLE = new ConfigColor("shapeCircle", "#6030B0B0", "minihud.config.colors.comment.shapeCircle").translatedName("minihud.config.colors.name.shapeCircle"); - public static final ConfigColor SHAPE_DESPAWN_SPHERE = new ConfigColor("shapeDespawnSphere", "#60A04050", "minihud.config.colors.comment.shapeDespawnSphere").translatedName("minihud.config.colors.name.shapeDespawnSphere"); - public static final ConfigColor SHAPE_LINE_BLOCKY = new ConfigColor("shapeLineBlocky", "#6030F0B0", "minihud.config.colors.comment.shapeLineBlocky").translatedName("minihud.config.colors.name.shapeLineBlocky"); - public static final ConfigColor SHAPE_SPHERE_BLOCKY = new ConfigColor("shapeSphereBlocky", "#6030B0B0", "minihud.config.colors.comment.shapeSphereBlocky").translatedName("minihud.config.colors.name.shapeSphereBlocky"); - public static final ConfigColor SLIME_CHUNKS_OVERLAY_COLOR = new ConfigColor("slimeChunksOverlayColor", "#3020F020", "minihud.config.colors.comment.slimeChunksOverlayColor").translatedName("minihud.config.colors.name.slimeChunksOverlayColor"); - public static final ConfigColor SPAWN_PLAYER_ENTITY_OVERLAY_COLOR = new ConfigColor("spawnPlayerEntityOverlayColor", "#302050D0", "minihud.config.colors.comment.spawnPlayerEntityOverlayColor").translatedName("minihud.config.colors.name.spawnPlayerEntityOverlayColor"); - public static final ConfigColor SPAWN_PLAYER_REDSTONE_OVERLAY_COLOR = new ConfigColor("spawnPlayerRedstoneOverlayColor", "#30F8D641", "minihud.config.colors.comment.spawnPlayerRedstoneOverlayColor").translatedName("minihud.config.colors.name.spawnPlayerRedstoneOverlayColor"); - public static final ConfigColor SPAWN_PLAYER_LAZY_OVERLAY_COLOR = new ConfigColor("spawnPlayerLazyOverlayColor", "#30D030D0", "minihud.config.colors.comment.spawnPlayerLazyOverlayColor").translatedName("minihud.config.colors.name.spawnPlayerLazyOverlayColor"); - public static final ConfigColor SPAWN_PLAYER_OUTER_OVERLAY_COLOR = new ConfigColor("spawnPlayerOuterOverlayColor", "#306900D2", "minihud.config.colors.comment.spawnPlayerOuterOverlayColor").translatedName("minihud.config.colors.name.spawnPlayerOuterOverlayColor"); - public static final ConfigColor SPAWN_REAL_ENTITY_OVERLAY_COLOR = new ConfigColor("spawnRealEntityOverlayColor", "#3030FF20", "minihud.config.colors.comment.spawnRealEntityOverlayColor").translatedName("minihud.config.colors.name.spawnRealEntityOverlayColor"); - public static final ConfigColor SPAWN_REAL_REDSTONE_OVERLAY_COLOR = new ConfigColor("spawnRealRedstoneOverlayColor", "#30F8D641", "minihud.config.colors.comment.spawnRealRedstoneOverlayColor").translatedName("minihud.config.colors.name.spawnRealRedstoneOverlayColor"); - public static final ConfigColor SPAWN_REAL_LAZY_OVERLAY_COLOR = new ConfigColor("spawnRealLazyOverlayColor", "#30FF3020", "minihud.config.colors.comment.spawnRealLazyOverlayColor").translatedName("minihud.config.colors.name.spawnRealLazyOverlayColor"); - public static final ConfigColor SPAWN_REAL_OUTER_OVERLAY_COLOR = new ConfigColor("spawnRealOuterOverlayColor", "#309D581A", "minihud.config.colors.comment.spawnRealOuterOverlayColor").translatedName("minihud.config.colors.name.spawnRealOuterOverlayColor"); - public static final ConfigColor SPAWNABLE_COLUMNS_OVERLAY_COLOR = new ConfigColor("spawnableColumnHeightsOverlayColor", "#A0FF00FF", "minihud.config.colors.comment.spawnableColumnHeightsOverlayColor").translatedName("minihud.config.colors.name.spawnableColumnHeightsOverlayColor"); - public static final ConfigColor TEXT_BACKGROUND_COLOR = new ConfigColor("textBackgroundColor", "#A0505050", "minihud.config.colors.comment.textBackgroundColor").translatedName("minihud.config.colors.name.textBackgroundColor"); - public static final ConfigColor TEXT_COLOR = new ConfigColor("textColor", "#FFE0E0E0", "minihud.config.colors.comment.textColor").translatedName("minihud.config.colors.name.textColor"); + public static final ConfigColor BEACON_RANGE_LVL1_OVERLAY_COLOR = new ConfigColor("beaconRangeLvl1", "#20E060FF").apply(COLORS_KEY); + public static final ConfigColor BEACON_RANGE_LVL2_OVERLAY_COLOR = new ConfigColor("beaconRangeLvl2", "#20FFB040").apply(COLORS_KEY); + public static final ConfigColor BEACON_RANGE_LVL3_OVERLAY_COLOR = new ConfigColor("beaconRangeLvl3", "#20FFF040").apply(COLORS_KEY); + public static final ConfigColor BEACON_RANGE_LVL4_OVERLAY_COLOR = new ConfigColor("beaconRangeLvl4", "#2060FF40").apply(COLORS_KEY); + public static final ConfigColor BLOCK_GRID_OVERLAY_COLOR = new ConfigColor("blockGridOverlayColor", "#80FFFFFF").apply(COLORS_KEY); + public static final ConfigColor CONDUIT_RANGE_OVERLAY_COLOR = new ConfigColor("conduitRange", "#2030FFFF").apply(COLORS_KEY); + public static final ConfigColor LIGHT_LEVEL_MARKER_BLOCK_LIT = new ConfigColor("lightLevelMarkerBlockLit", "#FF209040").apply(COLORS_KEY); + public static final ConfigColor LIGHT_LEVEL_MARKER_DARK = new ConfigColor("lightLevelMarkerDark", "#FFFF4848").apply(COLORS_KEY); + public static final ConfigColor LIGHT_LEVEL_MARKER_DIM = new ConfigColor("lightLevelMarkerDim", "#FFC0C040").apply(COLORS_KEY); + public static final ConfigColor LIGHT_LEVEL_MARKER_SKY_LIT = new ConfigColor("lightLevelMarkerSkyLit", "#FFFFFF33").apply(COLORS_KEY); + public static final ConfigColor LIGHT_LEVEL_NUMBER_BLOCK_DARK = new ConfigColor("lightLevelNumberBlockDark", "#FFC03030").apply(COLORS_KEY); + public static final ConfigColor LIGHT_LEVEL_NUMBER_BLOCK_DIM = new ConfigColor("lightLevelNumberBlockDim", "#FFC0C040").apply(COLORS_KEY); + public static final ConfigColor LIGHT_LEVEL_NUMBER_BLOCK_LIT = new ConfigColor("lightLevelNumberBlockLit", "#FF20FF40").apply(COLORS_KEY); + public static final ConfigColor LIGHT_LEVEL_NUMBER_SKY_DARK = new ConfigColor("lightLevelNumberSkyDark", "#FFFFF030").apply(COLORS_KEY); + public static final ConfigColor LIGHT_LEVEL_NUMBER_SKY_DIM = new ConfigColor("lightLevelNumberSkyDim", "#FFC0C030").apply(COLORS_KEY); + public static final ConfigColor LIGHT_LEVEL_NUMBER_SKY_LIT = new ConfigColor("lightLevelNumberSkyLit", "#FF40E0FF").apply(COLORS_KEY); + public static final ConfigColor RANDOM_TICKS_FIXED_OVERLAY_COLOR = new ConfigColor("randomTicksFixedOverlayColor", "#30F9F225").apply(COLORS_KEY); + public static final ConfigColor RANDOM_TICKS_PLAYER_OVERLAY_COLOR = new ConfigColor("randomTicksPlayerOverlayColor", "#3030FE73").apply(COLORS_KEY); + public static final ConfigColor REGION_OVERLAY_COLOR = new ConfigColor("regionOverlayColor", "#30FF8019").apply(COLORS_KEY); + public static final ConfigColor SHAPE_ADJUSTABLE_SPAWN_SPHERE = new ConfigColor("shapeAdjustableSpawnSphere", "#6030B0B0").apply(COLORS_KEY); + public static final ConfigColor SHAPE_BOX = new ConfigColor("shapeBox", "#6050A0A0").apply(COLORS_KEY); + public static final ConfigColor SHAPE_CAN_DESPAWN_SPHERE = new ConfigColor("shapeCanDespawnSphere", "#60A04050").apply(COLORS_KEY); + public static final ConfigColor SHAPE_CAN_SPAWN_SPHERE = new ConfigColor("shapeCanSpawnSphere", "#60A04050").apply(COLORS_KEY); + public static final ConfigColor SHAPE_CIRCLE = new ConfigColor("shapeCircle", "#6030B0B0").apply(COLORS_KEY); + public static final ConfigColor SHAPE_DESPAWN_SPHERE = new ConfigColor("shapeDespawnSphere", "#60A04050").apply(COLORS_KEY); + public static final ConfigColor SHAPE_LINE_BLOCKY = new ConfigColor("shapeLineBlocky", "#6030F0B0").apply(COLORS_KEY); + public static final ConfigColor SHAPE_SPHERE_BLOCKY = new ConfigColor("shapeSphereBlocky", "#6030B0B0").apply(COLORS_KEY); + public static final ConfigColor SLIME_CHUNKS_OVERLAY_COLOR = new ConfigColor("slimeChunksOverlayColor", "#3020F020").apply(COLORS_KEY); + public static final ConfigColor SPAWN_PLAYER_ENTITY_OVERLAY_COLOR = new ConfigColor("spawnPlayerEntityOverlayColor", "#302050D0").apply(COLORS_KEY); + public static final ConfigColor SPAWN_PLAYER_REDSTONE_OVERLAY_COLOR = new ConfigColor("spawnPlayerRedstoneOverlayColor", "#30F8D641").apply(COLORS_KEY); + public static final ConfigColor SPAWN_PLAYER_LAZY_OVERLAY_COLOR = new ConfigColor("spawnPlayerLazyOverlayColor", "#30D030D0").apply(COLORS_KEY); + public static final ConfigColor SPAWN_PLAYER_OUTER_OVERLAY_COLOR = new ConfigColor("spawnPlayerOuterOverlayColor", "#306900D2").apply(COLORS_KEY); + public static final ConfigColor SPAWN_REAL_ENTITY_OVERLAY_COLOR = new ConfigColor("spawnRealEntityOverlayColor", "#3030FF20").apply(COLORS_KEY); + public static final ConfigColor SPAWN_REAL_REDSTONE_OVERLAY_COLOR = new ConfigColor("spawnRealRedstoneOverlayColor", "#30F8D641").apply(COLORS_KEY); + public static final ConfigColor SPAWN_REAL_LAZY_OVERLAY_COLOR = new ConfigColor("spawnRealLazyOverlayColor", "#30FF3020").apply(COLORS_KEY); + public static final ConfigColor SPAWN_REAL_OUTER_OVERLAY_COLOR = new ConfigColor("spawnRealOuterOverlayColor", "#309D581A").apply(COLORS_KEY); + public static final ConfigColor SPAWNABLE_COLUMNS_OVERLAY_COLOR = new ConfigColor("spawnableColumnHeightsOverlayColor", "#A0FF00FF").apply(COLORS_KEY); + public static final ConfigColor TEXT_BACKGROUND_COLOR = new ConfigColor("textBackgroundColor", "#A0505050").apply(COLORS_KEY); + public static final ConfigColor TEXT_COLOR = new ConfigColor("textColor", "#FFE0E0E0").apply(COLORS_KEY); public static final ImmutableList OPTIONS = ImmutableList.of( BEACON_RANGE_LVL1_OVERLAY_COLOR, diff --git a/src/main/java/fi/dy/masa/minihud/config/InfoToggle.java b/src/main/java/fi/dy/masa/minihud/config/InfoToggle.java index 1b0b589ef..7b6e139f8 100644 --- a/src/main/java/fi/dy/masa/minihud/config/InfoToggle.java +++ b/src/main/java/fi/dy/masa/minihud/config/InfoToggle.java @@ -36,6 +36,7 @@ public enum InfoToggle implements IConfigInteger, IHotkeyTogglable // Player BLOCK_BREAK_SPEED ("infoBlockBreakSpeed", false, ""), + PLAYER_EXPERIENCE ("infoPlayerExperience", false, ""), SPEED ("infoSpeed", false, ""), SPEED_AXIS ("infoSpeedAxis", false, ""), SPEED_HV ("infoSpeedHV", false, ""), @@ -80,9 +81,10 @@ public enum InfoToggle implements IConfigInteger, IHotkeyTogglable FURNACE_XP ("infoFurnaceXp", false, ""), // Entity - LOOKING_AT_ENTITY ("infoLookingAtEntity", false, ""), ENTITY_REG_NAME ("infoEntityRegistryName", false, ""), + LOOKING_AT_ENTITY ("infoLookingAtEntity", false, ""), LOOKING_AT_EFFECTS ("infoLookingAtEffects", false, ""), + LOOKING_AT_PLAYER_EXP ("infoLookingAtPlayerExp", false, ""), ZOMBIE_CONVERSION ("infoZombieConversion", false, ""), HORSE_SPEED ("infoHorseSpeed", false, ""), HORSE_JUMP ("infoHorseJump", false, ""), @@ -91,7 +93,7 @@ public enum InfoToggle implements IConfigInteger, IHotkeyTogglable ; public static final ImmutableList VALUES = ImmutableList.copyOf(values()); - private static final String translateNameBase = Reference.MOD_ID+".config.info_toggle"; + private static final String INFO_KEY = Reference.MOD_ID+".config.info_toggle"; private final String name; private final String comment; @@ -220,7 +222,7 @@ public String getTranslatedName() private static String buildTranslateName(String name, String type) { - return translateNameBase + "." + type + "." + name; + return INFO_KEY + "." + type + "." + name; } @Override diff --git a/src/main/java/fi/dy/masa/minihud/config/RendererCallbacks.java b/src/main/java/fi/dy/masa/minihud/config/RendererCallbacks.java index 941f4cc73..0e5855b95 100644 --- a/src/main/java/fi/dy/masa/minihud/config/RendererCallbacks.java +++ b/src/main/java/fi/dy/masa/minihud/config/RendererCallbacks.java @@ -10,6 +10,8 @@ import fi.dy.masa.malilib.util.EntityUtils; import fi.dy.masa.malilib.util.InfoUtils; import fi.dy.masa.malilib.util.StringUtils; +import fi.dy.masa.minihud.data.DebugDataManager; +import fi.dy.masa.minihud.data.HudDataManager; import fi.dy.masa.minihud.renderer.OverlayRendererBeaconRange; import fi.dy.masa.minihud.renderer.OverlayRendererBiomeBorders; import fi.dy.masa.minihud.renderer.OverlayRendererConduitRange; @@ -122,8 +124,8 @@ public static void onSpawnChunksRealToggled(IConfigBoolean config) { if (config.getBooleanValue()) { - BlockPos spawn = DataStorage.getInstance().getWorldSpawn(); - int radius = DataStorage.getInstance().getSpawnChunkRadius(); + BlockPos spawn = HudDataManager.getInstance().getWorldSpawn(); + int radius = HudDataManager.getInstance().getSpawnChunkRadius(); String green = GuiBase.TXT_GREEN; String red = GuiBase.TXT_RED; String rst = GuiBase.TXT_RST; @@ -131,7 +133,7 @@ public static void onSpawnChunksRealToggled(IConfigBoolean config) if (radius < 0) { - DataStorage.getInstance().setSpawnChunkRadius(2, true); // 1.20.5 Vanilla Default + HudDataManager.getInstance().setSpawnChunkRadius(2, true); // 1.20.5 Vanilla Default radius = 2; } if (radius > 0) @@ -140,9 +142,9 @@ public static void onSpawnChunksRealToggled(IConfigBoolean config) String strPos = String.format("x: %d, y: %d, z: %d [R: %d]", spawn.getX(), spawn.getY(), spawn.getZ(), radius); message = StringUtils.translate("minihud.message.toggled_using_world_spawn", config.getPrettyName(), strStatus, strPos); - if (mc.isIntegratedServerRunning() == false && DataStorage.getInstance().hasServuxServer()) + if (mc.isIntegratedServerRunning() == false && HudDataManager.getInstance().hasServuxServer()) { - DataStorage.getInstance().requestSpawnMetadata(); + HudDataManager.getInstance().requestSpawnMetadata(); } else { @@ -188,4 +190,25 @@ public static void onStructuresToggled(IConfigBoolean config) } } } + + public static void onDebugServiceToggled(IConfigBoolean config) + { + MinecraftClient mc = MinecraftClient.getInstance(); + + if (mc != null && mc.player != null) + { + if (!mc.isIntegratedServerRunning() && !DataStorage.getInstance().hasIntegratedServer()) + { + if (config.getBooleanValue()) + { + DebugDataManager.getInstance().registerDebugService(); + DebugDataManager.getInstance().requestMetadata(); + } + else + { + DebugDataManager.getInstance().unregisterDebugService(); + } + } + } + } } diff --git a/src/main/java/fi/dy/masa/minihud/config/RendererToggle.java b/src/main/java/fi/dy/masa/minihud/config/RendererToggle.java index 26fa95469..982f6fd37 100644 --- a/src/main/java/fi/dy/masa/minihud/config/RendererToggle.java +++ b/src/main/java/fi/dy/masa/minihud/config/RendererToggle.java @@ -15,6 +15,7 @@ import fi.dy.masa.malilib.util.InfoUtils; import fi.dy.masa.malilib.util.StringUtils; import fi.dy.masa.minihud.MiniHUD; +import fi.dy.masa.minihud.Reference; import javax.annotation.Nullable; @@ -36,17 +37,39 @@ public enum RendererToggle implements IHotkeyTogglable, IConfigNotifiable VALUES = ImmutableList.copyOf(values()); - private static final String translateNameBase = "minihud.config.render_toggle"; + private static final String RENDER_KEY = Reference.MOD_ID+".config.render_toggle"; private final String name; private final String comment; @@ -62,6 +85,11 @@ public enum RendererToggle implements IHotkeyTogglable, IConfigNotifiable getColorConfigs() private String buildTranslateName(String name, String type) { - return translateNameBase + "." + type + "." + name; + return STRUCTURES_KEY + "." + type + "." + name; } } diff --git a/src/main/java/fi/dy/masa/minihud/data/DebugDataManager.java b/src/main/java/fi/dy/masa/minihud/data/DebugDataManager.java new file mode 100644 index 000000000..8bd8de6fe --- /dev/null +++ b/src/main/java/fi/dy/masa/minihud/data/DebugDataManager.java @@ -0,0 +1,690 @@ +package fi.dy.masa.minihud.data; + +import java.util.*; +import java.util.stream.Collectors; +import com.google.common.collect.Lists; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import org.jetbrains.annotations.Nullable; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ai.brain.*; +import net.minecraft.entity.ai.brain.task.Task; +import net.minecraft.entity.ai.goal.GoalSelector; +import net.minecraft.entity.ai.pathing.Path; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.mob.BreezeEntity; +import net.minecraft.entity.mob.MobEntity; +import net.minecraft.entity.mob.WardenEntity; +import net.minecraft.entity.passive.BeeEntity; +import net.minecraft.entity.passive.VillagerEntity; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.network.packet.CustomPayload; +import net.minecraft.network.packet.Packet; +import net.minecraft.network.packet.s2c.common.CustomPayloadS2CPacket; +import net.minecraft.network.packet.s2c.custom.*; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.registry.tag.StructureTags; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.structure.StructureStart; +import net.minecraft.util.Identifier; +import net.minecraft.util.NameGenerator; +import net.minecraft.util.Nameable; +import net.minecraft.util.math.*; +import net.minecraft.village.VillageGossipType; +import net.minecraft.village.raid.Raid; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.event.GameEvent; +import net.minecraft.world.event.listener.GameEventListener; +import net.minecraft.world.gen.structure.Structure; + +import fi.dy.masa.malilib.network.ClientPlayHandler; +import fi.dy.masa.malilib.network.IPluginClientPlayHandler; +import fi.dy.masa.minihud.MiniHUD; +import fi.dy.masa.minihud.Reference; +import fi.dy.masa.minihud.config.RendererToggle; +import fi.dy.masa.minihud.mixin.debug.IMixinMobEntity; +import fi.dy.masa.minihud.network.ServuxDebugHandler; +import fi.dy.masa.minihud.network.ServuxDebugPacket; +import fi.dy.masa.minihud.util.DataStorage; + +@SuppressWarnings({"unchecked", "deprecation"}) +public class DebugDataManager +{ + private static final DebugDataManager INSTANCE = new DebugDataManager(); + + private final static ServuxDebugHandler HANDLER = ServuxDebugHandler.getInstance(); + + private boolean servuxServer; + private boolean hasInValidServux; + private String servuxVersion; + private boolean shouldRegisterDebugService; + + public DebugDataManager() + { + this.servuxServer = false; + this.hasInValidServux = false; + this.servuxVersion = ""; + } + + public static DebugDataManager getInstance() {return INSTANCE;} + + public void onGameInit() + { + ClientPlayHandler.getInstance().registerClientPlayHandler(HANDLER); + HANDLER.registerPlayPayload(ServuxDebugPacket.Payload.ID, ServuxDebugPacket.Payload.CODEC, IPluginClientPlayHandler.BOTH_CLIENT); + } + + public Identifier getNetworkChannel() {return ServuxDebugHandler.CHANNEL_ID;} + + public IPluginClientPlayHandler getNetworkHandler() {return HANDLER;} + + public void reset(boolean isLogout) + { + if (isLogout) + { + MiniHUD.printDebug("DebugDataManager#reset() - log-out"); + HANDLER.reset(this.getNetworkChannel()); + HANDLER.resetFailures(this.getNetworkChannel()); + + this.servuxServer = false; + this.hasInValidServux = false; + this.servuxVersion = ""; + } + } + + public void onWorldPre() + { + if (!DataStorage.getInstance().hasIntegratedServer()) + { + HANDLER.registerPlayReceiver(ServuxDebugPacket.Payload.ID, HANDLER::receivePlayPayload); + } + } + + public void onWorldJoin() + { + MiniHUD.printDebug("DebugDataManager#onWorldJoin()"); + + if (!DataStorage.getInstance().hasIntegratedServer()) + { + if (RendererToggle.DEBUG_DATA_MAIN_TOGGLE.getBooleanValue()) + { + this.registerDebugService(); + } + else + { + this.unregisterDebugService(); + } + } + } + + public void setIsServuxServer() + { + this.servuxServer = true; + if (this.hasInValidServux) + { + this.hasInValidServux = false; + } + } + + public void setServuxVersion(String ver) + { + if (ver != null && !ver.isEmpty()) + { + this.servuxVersion = ver; + } + else + { + this.servuxVersion = "unknown"; + } + } + + public String getServuxVersion() + { + if (this.hasServuxServer()) + { + return this.servuxVersion; + } + + return "not_connected"; + } + + public boolean hasServuxServer() { return this.servuxServer; } + + public void registerDebugService() + { + this.shouldRegisterDebugService = true; + + if (!this.hasServuxServer() && !DataStorage.getInstance().hasIntegratedServer() && !this.hasInValidServux) + { + if (HANDLER.isPlayRegistered(this.getNetworkChannel())) + { + MiniHUD.printDebug("DebugDataManager#registerDebugService(): sending DEBUG_SERVICE_REGISTER to Servux"); + + NbtCompound nbt = new NbtCompound(); + nbt.putString("version", Reference.MOD_STRING); + + HANDLER.encodeClientData(ServuxDebugPacket.DebugServiceRegister(nbt)); + } + } + else + { + this.shouldRegisterDebugService = false; + } + } + + public void requestMetadata() + { + if (this.shouldRegisterDebugService) + { + if (!this.hasServuxServer() && !DataStorage.getInstance().hasIntegratedServer() && !this.hasInValidServux) + { + if (HANDLER.isPlayRegistered(this.getNetworkChannel())) + { + MiniHUD.printDebug("DebugDataManager#requestMetadata(): sending REQUEST_METADATA to Servux"); + + NbtCompound nbt = new NbtCompound(); + nbt.putString("version", Reference.MOD_STRING); + + HANDLER.encodeClientData(ServuxDebugPacket.MetadataRequest(nbt)); + } + } + } + } + + public boolean receiveMetadata(NbtCompound data) + { + if (!this.hasServuxServer() && !DataStorage.getInstance().hasIntegratedServer() && + this.shouldRegisterDebugService) + { + MiniHUD.printDebug("DebugDataManager#receiveMetadata(): received METADATA from Servux"); + + if (data.getInt("version") != ServuxDebugPacket.PROTOCOL_VERSION) + { + MiniHUD.logger.warn("debugDataChannel: Mis-matched protocol version!"); + } + + this.setServuxVersion(data.getString("servux")); + this.setIsServuxServer(); + + if (RendererToggle.DEBUG_DATA_MAIN_TOGGLE.getBooleanValue()) + { + this.shouldRegisterDebugService = true; + + NbtCompound nbt = new NbtCompound(); + nbt.putString("version", Reference.MOD_STRING); + + HANDLER.encodeClientData(ServuxDebugPacket.MetadataConfirm(nbt)); + return true; + } + else + { + this.unregisterDebugService(); + } + } + + return false; + } + + public void unregisterDebugService() + { + if (this.hasServuxServer() || !RendererToggle.DEBUG_DATA_MAIN_TOGGLE.getBooleanValue()) + { + this.servuxServer = false; + if (!this.hasInValidServux) + { + MiniHUD.printDebug("DebugDataManager#unregisterDebugService(): for {}", this.servuxVersion != null ? this.servuxVersion : ""); + + HANDLER.encodeClientData(ServuxDebugPacket.DebugServiceUnregister(new NbtCompound())); + HANDLER.reset(HANDLER.getPayloadChannel()); + } + } + this.shouldRegisterDebugService = false; + } + + public void onPacketFailure() + { + // Define how to handle multiple sendPayload failures + this.shouldRegisterDebugService = false; + this.servuxServer = false; + this.hasInValidServux = true; + } + + public boolean isEnabled() + { + return RendererToggle.DEBUG_DATA_MAIN_TOGGLE.getBooleanValue() && + DataStorage.getInstance().hasIntegratedServer(); + } + + // Integrated Server Methods + private void sendDebugData(ServerWorld world, CustomPayload payload) + { + if (this.isEnabled()) + { + Packet packet = new CustomPayloadS2CPacket(payload); + + for (ServerPlayerEntity player : world.getPlayers()) + { + if (player.networkHandler.accepts(packet)) + { + player.networkHandler.sendPacket(packet); + } + } + } + } + + public void sendChunkWatchingChange(ServerWorld world, ChunkPos pos) + { + if (this.isEnabled() == false) + { + return; + } + if (RendererToggle.DEBUG_WORLDGEN.getBooleanValue()) + { + this.sendDebugData(world, new DebugWorldgenAttemptCustomPayload(pos.getStartPos().up(100), 1.0F, 1.0F, 1.0F, 1.0F, 1.0F)); + } + } + + public void sendPoiAdditions(ServerWorld world, BlockPos pos) + { + if (this.isEnabled() == false) + { + return; + } + // DEBUG_VILLAGE_POI + if (RendererToggle.DEBUG_VILLAGE_SECTIONS.getBooleanValue()) + { + world.getPointOfInterestStorage().getType(pos).ifPresent((registryEntry) -> + { + int tickets = world.getPointOfInterestStorage().getFreeTickets(pos); + String name = registryEntry.getIdAsString(); + this.sendDebugData(world, new DebugPoiAddedCustomPayload(pos, name, tickets)); + }); + } + } + + public void sendPoiRemoval(ServerWorld world, BlockPos pos) + { + if (this.isEnabled() == false) + { + return; + } + if (RendererToggle.DEBUG_VILLAGE_SECTIONS.getBooleanValue()) + { + this.sendDebugData(world, new DebugPoiRemovedCustomPayload(pos)); + } + } + + public void sendPointOfInterest(ServerWorld world, BlockPos pos) + { + if (this.isEnabled() == false) + { + return; + } + if (RendererToggle.DEBUG_VILLAGE_SECTIONS.getBooleanValue()) + { + int tickets = world.getPointOfInterestStorage().getFreeTickets(pos); + this.sendDebugData(world, new DebugPoiTicketCountCustomPayload(pos, tickets)); + } + + } + + public void sendPoi(ServerWorld world, BlockPos pos) + { + if (this.isEnabled() == false) + { + return; + } + if (RendererToggle.DEBUG_VILLAGE_SECTIONS.getBooleanValue()) + { + Registry registry = world.getRegistryManager().getOrThrow(RegistryKeys.STRUCTURE); + ChunkSectionPos chunkSectionPos = ChunkSectionPos.from(pos); + Iterator> iterator = registry.iterateEntries(StructureTags.VILLAGE).iterator(); + + RegistryEntry entry; + do + { + if (!iterator.hasNext()) + { + this.sendDebugData(world, new DebugVillageSectionsCustomPayload(Set.of(), Set.of(chunkSectionPos))); + return; + } + + entry = iterator.next(); + } + while (world.getStructureAccessor().getStructureStarts(chunkSectionPos, entry.value()).isEmpty()); + + this.sendDebugData(world, new DebugVillageSectionsCustomPayload(Set.of(chunkSectionPos), Set.of())); + } + } + + // FIXME -- WARNING! Causes CustomPayload Crash + public void sendPathfindingData(ServerWorld world, MobEntity mob, @Nullable Path path, float nodeReachProximity) + { + if (this.isEnabled() == false) + { + return; + } + if (RendererToggle.DEBUG_PATH_FINDING.getBooleanValue()) + { + if (path != null) + { + this.sendDebugData(world, new DebugPathCustomPayload(mob.getId(), path, nodeReachProximity)); + } + } + } + + // Masa already wrote something for this; just have it here in case I want to swap it out + /* + public void sendNeighborUpdate(ServerWorld world, BlockPos pos) + { + if (this.isEnabled() == false) + { + return; + } + if (RendererToggle.DEBUG_NEIGHBOR_UPDATES.getBooleanValue()) + { + this.sendDebugData(world, new DebugNeighborsUpdateCustomPayload(world.getTime(), pos)); + } + } + */ + + public void sendStructureStart(StructureWorldAccess world, StructureStart structureStart) + { + if (this.isEnabled() == false) + { + return; + } + if (RendererToggle.DEBUG_STRUCTURES.getBooleanValue()) + { + List pieces = new ArrayList<>(); + + for (int i = 0; i < structureStart.getChildren().size(); ++i) + { + pieces.add(new DebugStructuresCustomPayload.Piece(structureStart.getChildren().get(i).getBoundingBox(), i == 0)); + } + + ServerWorld serverWorld = world.toServerWorld(); + this.sendDebugData(serverWorld, new DebugStructuresCustomPayload(serverWorld.getRegistryKey(), structureStart.getBoundingBox(), pieces)); + } + } + + public void sendGoalSelector(ServerWorld world, MobEntity mob, GoalSelector goalSelector) + { + if (this.isEnabled() == false) + { + return; + } + if (RendererToggle.DEBUG_GOAL_SELECTOR.getBooleanValue()) + { + List goals = ((IMixinMobEntity) mob).minihud_getGoalSelector().getGoals().stream().map((goal) -> + new DebugGoalSelectorCustomPayload.Goal(goal.getPriority(), goal.isRunning(), goal.getGoal().toString())).toList(); + + this.sendDebugData(world, new DebugGoalSelectorCustomPayload(mob.getId(), mob.getBlockPos(), goals)); + } + } + + public void sendRaids(ServerWorld world, Collection raids) + { + if (this.isEnabled() == false) + { + return; + } + if (RendererToggle.DEBUG_RAID_CENTER.getBooleanValue()) + { + this.sendDebugData(world, new DebugRaidsCustomPayload(raids.stream().map(Raid::getCenter).toList())); + } + } + + // FIXME -- WARNING! Causes CustomPayload Crash + public void sendBrainDebugData(ServerWorld serverWorld, LivingEntity livingEntity) + { + if (this.isEnabled() == false) + { + return; + } + if (RendererToggle.DEBUG_BRAIN.getBooleanValue()) + { + MobEntity entity = (MobEntity) livingEntity; + int angerLevel; + + if (entity instanceof WardenEntity wardenEntity) + { + angerLevel = wardenEntity.getAnger(); + } + else + { + angerLevel = -1; + } + + List gossips = new ArrayList<>(); + Set pois = new HashSet<>(); + Set potentialPois = new HashSet<>(); + String profession; + int xp; + String inventory; + boolean wantsGolem; + + if (entity instanceof VillagerEntity villager) + { + profession = villager.getVillagerData().getProfession().toString(); + xp = villager.getExperience(); + inventory = villager.getInventory().toString(); + wantsGolem = villager.canSummonGolem(serverWorld.getTime()); + villager.getGossip().getEntityReputationAssociatedGossips().forEach((uuid, associatedGossip) -> + { + Entity gossipEntity = serverWorld.getEntity(uuid); + + if (gossipEntity != null) + { + String name = NameGenerator.name(gossipEntity); + + for (Object2IntMap.Entry typeEntry : associatedGossip.object2IntEntrySet()) + { + Map.Entry entry = (Map.Entry) typeEntry; + gossips.add(name + ": " + entry.getKey().asString() + " " + entry.getValue()); + } + } + }); + + Brain brain = villager.getBrain(); + addPoi(brain, MemoryModuleType.HOME, pois); + addPoi(brain, MemoryModuleType.JOB_SITE, pois); + addPoi(brain, MemoryModuleType.MEETING_POINT, pois); + addPoi(brain, MemoryModuleType.HIDING_PLACE, pois); + addPoi(brain, MemoryModuleType.POTENTIAL_JOB_SITE, potentialPois); + } + else + { + profession = ""; + xp = 0; + inventory = ""; + wantsGolem = false; + } + + this.sendDebugData(serverWorld, new DebugBrainCustomPayload(new DebugBrainCustomPayload.Brain( + entity.getUuid(), entity.getId(), entity.getName().getString(), + profession, xp, entity.getHealth(), entity.getMaxHealth(), + entity.getPos(), inventory, entity.getNavigation().getCurrentPath(), + wantsGolem, angerLevel, + entity.getBrain().getPossibleActivities().stream().map(Activity::toString).toList(), + entity.getBrain().getRunningTasks().stream().map(Task::getName).toList(), + this.listMemories(entity, serverWorld.getTime()), + gossips, pois, potentialPois))); + } + } + + // FIXME -- WARNING! Causes CustomPayload Crash + public void sendBeeDebugData(ServerWorld world, BeeEntity bee) + { + if (this.isEnabled() == false) + { + return; + } + if (RendererToggle.DEBUG_BEEDATA.getBooleanValue()) + { + this.sendDebugData(world, new DebugBeeCustomPayload( + new DebugBeeCustomPayload.Bee(bee.getUuid(), bee.getId(), bee.getPos(), + bee.getNavigation().getCurrentPath(), bee.getHivePos(), bee.getFlowerPos(), bee.getMoveGoalTicks(), + bee.getGoalSelector().getGoals().stream().map((prioritizedGoal) -> + prioritizedGoal.getGoal().toString()).collect(Collectors.toSet()), bee.getPossibleHives()))); + + } + } + + public void sendBreezeDebugData(ServerWorld world, BreezeEntity breeze) + { + if (this.isEnabled() == false) + { + return; + } + if (RendererToggle.DEBUG_BREEZE_JUMP.getBooleanValue()) + { + this.sendDebugData(world, new DebugBreezeCustomPayload(new DebugBreezeCustomPayload.BreezeInfo( + breeze.getUuid(), breeze.getId(), breeze.getTarget() == null ? null : breeze.getTarget().getId(), + breeze.getBrain().getOptionalRegisteredMemory(MemoryModuleType.BREEZE_JUMP_TARGET).orElse(null)))); + } + } + + public void sendGameEvent(ServerWorld world, RegistryEntry event, Vec3d pos) + { + if (this.isEnabled() == false) + { + return; + } + if (RendererToggle.DEBUG_GAME_EVENT.getBooleanValue()) + { + event.getKey().ifPresent((key) -> this.sendDebugData(world, new DebugGameEventCustomPayload(key, pos))); + } + } + + public void sendGameEventListener(ServerWorld world, GameEventListener eventListener) + { + if (this.isEnabled() == false) + { + return; + } + if (RendererToggle.DEBUG_GAME_EVENT.getBooleanValue()) + { + this.sendDebugData(world, new DebugGameEventListenersCustomPayload(eventListener.getPositionSource(), eventListener.getRange())); + } + } + + // Tools + private void addPoi(Brain brain, MemoryModuleType memoryModuleType, Set set) + { + Optional opt = brain.getOptionalRegisteredMemory(memoryModuleType).map(GlobalPos::pos); + + Objects.requireNonNull(set); + opt.ifPresent(set::add); + } + + public List listMemories(LivingEntity entity, long currentTime) + { + Map, Optional>> map = entity.getBrain().getMemories(); + List list = Lists.newArrayList(); + + for (Map.Entry, Optional>> memoryModuleTypeOptionalEntry : map.entrySet()) + { + MemoryModuleType memoryModuleType = memoryModuleTypeOptionalEntry.getKey(); + Optional> optional = memoryModuleTypeOptionalEntry.getValue(); + String string; + + if (optional.isPresent()) + { + Memory memory = optional.get(); + Object object = memory.getValue(); + + if (memoryModuleType == MemoryModuleType.HEARD_BELL_TIME) + { + long l = currentTime - (Long) object; + string = l + " ticks ago"; + } + else if (memory.isTimed()) + { + String var10000 = this.format((ServerWorld) entity.getWorld(), object); + string = var10000 + " (ttl: " + memory.getExpiry() + ")"; + } + else + { + string = this.format((ServerWorld) entity.getWorld(), object); + } + } + else + { + string = "-"; + } + + String type = Registries.MEMORY_MODULE_TYPE.getId(memoryModuleType).getPath(); + list.add(type + ": " + string); + } + + list.sort(String::compareTo); + return list; + } + + private String format(ServerWorld world, @Nullable Object object) + { + if (object == null) + { + return "-"; + } + else if (object instanceof UUID) + { + return format(world, world.getEntity((UUID) object)); + } + else + { + Entity entity; + if (object instanceof LivingEntity) + { + entity = (Entity) object; + return NameGenerator.name(entity); + } + else if (object instanceof Nameable) + { + return ((Nameable) object).getName().getString(); + } + else if (object instanceof WalkTarget) + { + return format(world, ((WalkTarget) object).getLookTarget()); + } + else if (object instanceof EntityLookTarget) + { + return format(world, ((EntityLookTarget) object).getEntity()); + } + else if (object instanceof GlobalPos) + { + return format(world, ((GlobalPos) object).pos()); + } + else if (object instanceof BlockPosLookTarget) + { + return format(world, ((BlockPosLookTarget) object).getBlockPos()); + } + else if (object instanceof DamageSource) + { + entity = ((DamageSource) object).getAttacker(); + return entity == null ? object.toString() : format(world, entity); + } + else if (!(object instanceof Collection)) + { + return object.toString(); + } + else + { + List list = Lists.newArrayList(); + + for (Object object2 : (Iterable) object) + { + list.add(format(world, object2)); + } + + return list.toString(); + } + } + } +} diff --git a/src/main/java/fi/dy/masa/minihud/data/EntitiesDataStorage.java b/src/main/java/fi/dy/masa/minihud/data/EntitiesDataManager.java similarity index 98% rename from src/main/java/fi/dy/masa/minihud/data/EntitiesDataStorage.java rename to src/main/java/fi/dy/masa/minihud/data/EntitiesDataManager.java index e1c2a961d..96ba9ae26 100644 --- a/src/main/java/fi/dy/masa/minihud/data/EntitiesDataStorage.java +++ b/src/main/java/fi/dy/masa/minihud/data/EntitiesDataManager.java @@ -54,11 +54,12 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; -public class EntitiesDataStorage implements IClientTickHandler +@SuppressWarnings("deprecation") +public class EntitiesDataManager implements IClientTickHandler { - private static final EntitiesDataStorage INSTANCE = new EntitiesDataStorage(); + private static final EntitiesDataManager INSTANCE = new EntitiesDataManager(); - public static EntitiesDataStorage getInstance() + public static EntitiesDataManager getInstance() { return INSTANCE; } @@ -98,7 +99,7 @@ private ClientWorld getClientWorld() return clientWorld; } - private EntitiesDataStorage() { } + private EntitiesDataManager() { } @Override public void onClientTick(MinecraftClient mc) @@ -227,7 +228,7 @@ private void tickCache() if (nowTime - pair.getLeft() > blockTimeout || pair.getLeft() - nowTime > 0) { - //MiniHUD.printDebug("entityCache: be at pos [{}] has timed out", pos.toShortString()); + MiniHUD.printDebug("entityCache: be at pos [{}] has timed out", pos.toShortString()); this.blockEntityCache.remove(pos); count++; } @@ -244,7 +245,7 @@ private void tickCache() if (nowTime - pair.getLeft() > entityTimeout || pair.getLeft() - nowTime > 0) { - //MiniHUD.printDebug("entityCache: enity Id [{}] has timed out", entityId); + MiniHUD.printDebug("entityCache: enity Id [{}] has timed out", entityId); this.entityCache.remove(entityId); count++; } diff --git a/src/main/java/fi/dy/masa/minihud/data/HudDataManager.java b/src/main/java/fi/dy/masa/minihud/data/HudDataManager.java new file mode 100644 index 000000000..2a0a85708 --- /dev/null +++ b/src/main/java/fi/dy/masa/minihud/data/HudDataManager.java @@ -0,0 +1,672 @@ +package fi.dy.masa.minihud.data; + +import java.util.ArrayList; +import java.util.Collection; +import javax.annotation.Nullable; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; + +import com.mojang.datafixers.util.Pair; +import net.minecraft.client.MinecraftClient; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; +import net.minecraft.nbt.NbtList; +import net.minecraft.nbt.NbtOps; +import net.minecraft.recipe.PreparedRecipes; +import net.minecraft.recipe.Recipe; +import net.minecraft.recipe.RecipeEntry; +import net.minecraft.recipe.RecipeManager; +import net.minecraft.registry.RegistryKey; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import fi.dy.masa.malilib.gui.GuiBase; +import fi.dy.masa.malilib.network.ClientPlayHandler; +import fi.dy.masa.malilib.network.IPluginClientPlayHandler; +import fi.dy.masa.malilib.util.Constants; +import fi.dy.masa.malilib.util.InfoUtils; +import fi.dy.masa.malilib.util.JsonUtils; +import fi.dy.masa.malilib.util.StringUtils; +import fi.dy.masa.minihud.MiniHUD; +import fi.dy.masa.minihud.Reference; +import fi.dy.masa.minihud.config.Configs; +import fi.dy.masa.minihud.config.RendererToggle; +import fi.dy.masa.minihud.mixin.IMixinServerRecipeManager; +import fi.dy.masa.minihud.network.ServuxHudHandler; +import fi.dy.masa.minihud.network.ServuxHudPacket; +import fi.dy.masa.minihud.network.ServuxStructuresPacket; +import fi.dy.masa.minihud.renderer.OverlayRendererSpawnChunks; +import fi.dy.masa.minihud.util.DataStorage; + +public class HudDataManager +{ + private static final HudDataManager INSTANCE = new HudDataManager(); + + private final static ServuxHudHandler HANDLER = ServuxHudHandler.getInstance(); + private final MinecraftClient mc = MinecraftClient.getInstance(); + + private boolean servuxServer; + private boolean hasInValidServux; + private String servuxVersion; + + private long worldSeed; + private int spawnChunkRadius; + private BlockPos worldSpawn; + + private boolean worldSeedValid; + private boolean spawnChunkRadiusValid; + private boolean worldSpawnValid; + + private boolean isRaining; + private boolean isThundering; + private int weatherTimer; + + private PreparedRecipes preparedRecipes; + private int recipeCount; + + public HudDataManager() + { + this.servuxServer = false; + this.hasInValidServux = false; + this.servuxVersion = ""; + this.worldSeed = -1; + this.spawnChunkRadius = -1; + this.worldSpawn = BlockPos.ORIGIN; + this.worldSeedValid = false; + this.spawnChunkRadiusValid = false; + this.worldSpawnValid = false; + this.isRaining = false; + this.isThundering = false; + this.weatherTimer = -1; + this.preparedRecipes = PreparedRecipes.EMPTY; + this.recipeCount = 0; + } + + public static HudDataManager getInstance() { return INSTANCE; } + + public void onGameInit() + { + ClientPlayHandler.getInstance().registerClientPlayHandler(HANDLER); + HANDLER.registerPlayPayload(ServuxHudPacket.Payload.ID, ServuxHudPacket.Payload.CODEC, IPluginClientPlayHandler.BOTH_CLIENT); + } + + public Identifier getNetworkChannel() { return ServuxHudHandler.CHANNEL_ID; } + + public IPluginClientPlayHandler getNetworkHandler() { return HANDLER; } + + public void reset(boolean isLogout) + { + if (isLogout) + { + MiniHUD.printDebug("HudDataStorage#reset() - log-out"); + HANDLER.reset(this.getNetworkChannel()); + HANDLER.resetFailures(this.getNetworkChannel()); + + this.servuxServer = false; + this.hasInValidServux = false; + this.servuxVersion = ""; + this.spawnChunkRadius = -1; + this.worldSpawn = BlockPos.ORIGIN; + this.worldSpawnValid = false; + this.spawnChunkRadiusValid = false; + this.preparedRecipes = PreparedRecipes.EMPTY; + this.recipeCount = 0; + } + + this.isRaining = false; + this.isThundering = false; + this.weatherTimer = -1; + + if (isLogout || !Configs.Generic.DONT_RESET_SEED_ON_DIMENSION_CHANGE.getBooleanValue()) + { + this.worldSeedValid = false; + this.worldSeed = 0; + } + } + + public void onWorldPre() + { + if (!DataStorage.getInstance().hasIntegratedServer()) + { + HANDLER.registerPlayReceiver(ServuxHudPacket.Payload.ID, HANDLER::receivePlayPayload); + } + } + + public void onWorldJoin() + { + MiniHUD.printDebug("HudDataStorage#onWorldJoin()"); + } + + public void onPacketFailure() + { + // Define how to handle multiple sendPayload failures + this.servuxServer = false; + this.hasInValidServux = true; + } + + public void setIsServuxServer() + { + this.servuxServer = true; + if (this.hasInValidServux) + { + this.hasInValidServux = false; + } + } + + public void setServuxVersion(String ver) + { + if (ver != null && !ver.isEmpty()) + { + this.servuxVersion = ver; + } + else + { + this.servuxVersion = "unknown"; + } + } + + public String getServuxVersion() + { + if (this.hasServuxServer()) + { + return this.servuxVersion; + } + + return "not_connected"; + } + + public boolean hasServuxServer() { return this.servuxServer; } + + public void setWorldSeed(long seed) + { + if (this.worldSeed != seed) + { + MiniHUD.printDebug("HudDataStorage#setWorldSeed(): set world seed [{}] -> [{}]", this.worldSeed, seed); + } + this.worldSeed = seed; + this.worldSeedValid = true; + } + + public void setWorldSpawn(BlockPos spawn) + { + if (!this.worldSpawn.equals(spawn)) + { + OverlayRendererSpawnChunks.setNeedsUpdate(); + MiniHUD.printDebug("HudDataStorage#setWorldSpawn(): set world spawn [{}] -> [{}]", this.worldSpawn.toShortString(), spawn.toShortString()); + } + this.worldSpawn = spawn; + this.worldSpawnValid = true; + } + + public void setSpawnChunkRadius(int radius, boolean message) + { + if (radius >= 0 && radius <= 32) + { + if (this.spawnChunkRadius != radius) + { + if (message) + { + String strRadius = radius > 0 ? GuiBase.TXT_GREEN + String.format("%d", radius) + GuiBase.TXT_RST : GuiBase.TXT_RED + String.format("%d", radius) + GuiBase.TXT_RST; + InfoUtils.printActionbarMessage(StringUtils.translate("minihud.message.spawn_chunk_radius_set", strRadius)); + } + + OverlayRendererSpawnChunks.setNeedsUpdate(); + MiniHUD.printDebug("HudDataStorage#setSpawnChunkRadius(): set spawn chunk radius [{}] -> [{}]", this.spawnChunkRadius, radius); + } + this.spawnChunkRadius = radius; + this.spawnChunkRadiusValid = true; + } + else + { + this.spawnChunkRadius = -1; + this.spawnChunkRadiusValid = false; + } + } + + public void setWorldSpawnIfUnknown(BlockPos spawn) + { + if (!this.worldSpawnValid) + { + this.setWorldSpawn(spawn); + OverlayRendererSpawnChunks.setNeedsUpdate(); + } + } + + public void setSpawnChunkRadiusIfUnknown(int radius) + { + if (!this.spawnChunkRadiusValid) + { + this.setSpawnChunkRadius(radius, true); + OverlayRendererSpawnChunks.setNeedsUpdate(); + } + } + + public boolean isWorldSeedKnown(World world) + { + if (this.worldSeedValid) + { + return true; + } + else if (this.mc.isIntegratedServerRunning()) + { + MinecraftServer server = this.mc.getServer(); + assert server != null; + World worldTmp = server.getWorld(world.getRegistryKey()); + return worldTmp != null; + } + + return false; + } + + public boolean hasStoredWorldSeed() + { + return this.worldSeedValid; + } + + public long worldSeed() { return this.worldSeed; } + + public long getWorldSeed(World world) + { + if (!this.worldSeedValid && this.mc.isIntegratedServerRunning()) + { + MinecraftServer server = this.mc.getServer(); + assert server != null; + ServerWorld worldTmp = server.getWorld(world.getRegistryKey()); + + if (worldTmp != null) + { + this.setWorldSeed(worldTmp.getSeed()); + } + } + + return this.worldSeed; + } + + /** + * This function checks the Integrated Server's World Seed at Server Launch. + * This happens before the WorldLoadListener/fromJson load which works fine for Multiplayer; + * But if we own the Server, use this value as valid, overriding the value from the JSON file. + * This is because your default "New World" .json files' seed tends to eventually get stale + * without using the /seed command continuously, or deleting the json files. + * @param server (Server Object to get the data from) + */ + public void checkWorldSeed(MinecraftServer server) + { + if (this.mc.isIntegratedServerRunning()) + { + ServerWorld worldTmp = server.getOverworld(); + + if (worldTmp != null) + { + long seedTmp = worldTmp.getSeed(); + + if (seedTmp != this.worldSeed) + { + this.setWorldSeed(seedTmp); + } + } + } + } + + public boolean isWorldSpawnKnown() + { + return this.worldSpawnValid; + } + + public BlockPos getWorldSpawn() + { + return this.worldSpawn; + } + + public boolean isSpawnChunkRadiusKnown() + { + return this.spawnChunkRadiusValid; + } + + public int getSpawnChunkRadius() + { + if (this.spawnChunkRadius > -1) + { + return this.spawnChunkRadius; + } + + return 2; + } + + public boolean isWeatherClear() + { + return this.getClearTime() > -1; + } + + public int getClearTime() + { + if (!this.isRaining && !this.isThundering) + { + return this.weatherTimer; + } + + return -1; + } + + public boolean isWeatherRain() + { + return this.getRainTime() > -1; + } + + public int getRainTime() + { + if (this.isRaining && !this.isThundering) + { + return this.weatherTimer; + } + + return -1; + } + + public boolean isWeatherThunder() + { + return this.getThunderTime() > -1; + } + + public int getThunderTime() + { + if (this.isThundering && !this.isRaining) + { + return this.weatherTimer; + } + + return -1; + } + + public boolean hasRecipes() + { + return !this.preparedRecipes.equals(PreparedRecipes.EMPTY); + } + + public @Nullable PreparedRecipes getPreparedRecipes() + { + if (DataStorage.getInstance().hasIntegratedServer() && this.getRecipeManager() != null) + { + return ((IMixinServerRecipeManager) this.getRecipeManager()).minihud_getPreparedRecipes(); + } + else if (this.hasRecipes()) + { + return this.preparedRecipes; + } + + return null; + } + + public int getRecipeCount() + { + return this.recipeCount; + } + + public @Nullable RecipeManager getRecipeManager() + { + if (DataStorage.getInstance().hasIntegratedServer() && mc.getServer() != null) + { + return mc.getServer().getRecipeManager(); + } + else if (mc.world != null) + { + return mc.world.getRecipeManager(); + } + + return null; + } + + public void onClientTickPost(MinecraftClient mc) + { + if (!DataStorage.getInstance().hasIntegratedServer() && this.weatherTimer > 0) + { + this.weatherTimer--; + } + } + + public void onServerWeatherTick(int clearTime, int rainTime, boolean isThundering) + { + if (rainTime > 1) + { + if (isThundering) + { + this.isThundering = true; + this.isRaining = false; + } + else + { + this.isThundering = false; + this.isRaining = true; + } + + this.weatherTimer = rainTime; + } + else if (clearTime > 1) + { + this.isThundering = false; + this.isRaining = false; + this.weatherTimer = clearTime; + } + else + { + this.isThundering = false; + this.isRaining = false; + this.weatherTimer = -1; + } + } + + public boolean receiveMetadata(NbtCompound data) + { + if (!this.servuxServer && !DataStorage.getInstance().hasIntegratedServer()) + { + MiniHUD.printDebug("HudDataStorage#receiveMetadata(): received METADATA from Servux"); + + if (data.getInt("version") != ServuxStructuresPacket.PROTOCOL_VERSION) + { + MiniHUD.logger.warn("hudDataChannel: Mis-matched protocol version!"); + } + + this.setServuxVersion(data.getString("servux")); + this.setWorldSpawn(new BlockPos(data.getInt("spawnPosX"), data.getInt("spawnPosY"), data.getInt("spawnPosZ"))); + this.setSpawnChunkRadius(data.getInt("spawnChunkRadius"), true); + + if (data.contains("worldSeed", Constants.NBT.TAG_LONG)) + { + this.setWorldSeed(data.getLong("worldSeed")); + } + + this.setIsServuxServer(); + this.requestRecipeManager(); + + return true; + } + + return false; + } + + public void requestSpawnMetadata() + { + if (!DataStorage.getInstance().hasIntegratedServer() && this.hasServuxServer()) + { + NbtCompound nbt = new NbtCompound(); + nbt.putString("version", Reference.MOD_STRING); + + HANDLER.encodeClientData(ServuxHudPacket.SpawnRequest(nbt)); + } + } + + public void receiveSpawnMetadata(NbtCompound data) + { + if (!DataStorage.getInstance().hasIntegratedServer()) + { + MiniHUD.printDebug("HudDataStorage#receiveSpawnMetadata(): from Servux"); + + this.setServuxVersion(data.getString("servux")); + this.setWorldSpawn(new BlockPos(data.getInt("spawnPosX"), data.getInt("spawnPosY"), data.getInt("spawnPosZ"))); + this.setSpawnChunkRadius(data.getInt("spawnChunkRadius"), true); + if (data.contains("worldSeed", Constants.NBT.TAG_LONG)) + { + this.setWorldSeed(data.getLong("worldSeed")); + } + + if (this.hasInValidServux) + { + this.hasInValidServux = false; + } + } + } + + public void receiveWeatherData(NbtCompound data) + { + if (!DataStorage.getInstance().hasIntegratedServer()) + { + //MiniHUD.printDebug("HudDataStorage#receiveWeatherData(): from Servux"); + + if (data.contains("SetRaining", Constants.NBT.TAG_INT)) + { + this.isThundering = false; + this.isRaining = true; + this.weatherTimer = data.getInt("SetRaining"); + } + else if (data.contains("SetThundering", Constants.NBT.TAG_INT)) + { + this.isThundering = true; + this.isRaining = false; + this.weatherTimer = data.getInt("SetThundering"); + } + else if (data.contains("SetClear", Constants.NBT.TAG_INT)) + { + this.isRaining = false; + this.isThundering = false; + this.weatherTimer = data.getInt("SetClear"); + } + + if (this.hasInValidServux) + { + this.hasInValidServux = false; + } + } + } + + public void requestRecipeManager() + { + if (!DataStorage.getInstance().hasIntegratedServer() && this.hasServuxServer()) + { + NbtCompound nbt = new NbtCompound(); + nbt.putString("version", Reference.MOD_STRING); + + HANDLER.encodeClientData(ServuxHudPacket.RecipeManagerRequest(nbt)); + } + } + + public void receiveRecipeManager(NbtCompound data) + { + if (!DataStorage.getInstance().hasIntegratedServer() && data.contains("RecipeManager")) + { + Collection> recipes = new ArrayList<>(); + NbtList list = data.getList("RecipeManager", Constants.NBT.TAG_COMPOUND); + int count = 0; + + this.preparedRecipes = PreparedRecipes.EMPTY; + this.recipeCount = 0; + + for (int i = 0; i < list.size(); i++) + { + NbtCompound item = list.getCompound(i); + Identifier idReg = Identifier.tryParse(item.getString("id_reg")); + Identifier idValue = Identifier.tryParse(item.getString("id_value")); + + if (idReg == null || idValue == null) + { + continue; + } + + try + { + RegistryKey> key = RegistryKey.of(RegistryKey.ofRegistry(idReg), idValue); + Pair, NbtElement> pair = Recipe.CODEC.decode(DataStorage.getInstance().getWorldRegistryManager().getOps(NbtOps.INSTANCE), item.getCompound("recipe")).getOrThrow(); + RecipeEntry entry = new RecipeEntry<>(key, pair.getFirst()); + recipes.add(entry); + count++; + } + catch (Exception e) + { + MiniHUD.logger.error("receiveRecipeManager: index [{}], Exception reading packet, {}", i, e.getMessage()); + } + } + + if (!recipes.isEmpty()) + { + this.preparedRecipes = PreparedRecipes.of(recipes); + this.recipeCount = count; + MiniHUD.printDebug("HudDataStorage#receiveRecipeManager(): finished loading Recipe Manager: Read [{}] Recipes from Servux", count); + } + else + { + MiniHUD.logger.warn("receiveRecipeManager: failed to read Recipe Manager from Servux (Collection was empty!)"); + } + } + } + + public JsonObject toJson() + { + JsonObject obj = new JsonObject(); + + if (this.worldSeedValid) + { + obj.add("seed", new JsonPrimitive(this.worldSeed)); + } + if (this.isSpawnChunkRadiusKnown()) + { + obj.add("spawn_chunk_radius", new JsonPrimitive(this.spawnChunkRadius)); + } + + return obj; + } + + /** + * This function now checks for stale JSON data. + * It only compares it if we have an Integrated Server running, and they are marked as valid. + * @param obj () + */ + public void fromJson(JsonObject obj) + { + if (JsonUtils.hasLong(obj, "seed")) + { + long seedTmp = JsonUtils.getLong(obj, "seed"); + + if (DataStorage.getInstance().hasIntegratedServer() && this.hasStoredWorldSeed() && this.worldSeed != seedTmp) + { + MiniHUD.printDebug("HudDataStorage#fromJson(): ignoring stale WorldSeed [{}], keeping [{}] as valid from the integrated server", seedTmp, this.worldSeed); + } + else + { + this.setWorldSeed(seedTmp); + } + } + if (JsonUtils.hasInteger(obj, "spawn_chunk_radius")) + { + int spawnRadiusTmp = JsonUtils.getIntegerOrDefault(obj, "spawn_chunk_radius", 2); + + if (DataStorage.getInstance().hasIntegratedServer() && this.isSpawnChunkRadiusKnown() && this.spawnChunkRadius != spawnRadiusTmp) + { + MiniHUD.printDebug("HudDataStorage#fromJson(): ignoring stale Spawn Chunk Radius [{}], keeping [{}] as valid from the integrated server", spawnRadiusTmp, this.spawnChunkRadius); + } + else + { + this.setSpawnChunkRadius(spawnRadiusTmp, false); + } + + // Force RenderToggle OFF if SPAWN_CHUNK_RADIUS is set to 0 + if (this.getSpawnChunkRadius() == 0 && RendererToggle.OVERLAY_SPAWN_CHUNK_OVERLAY_REAL.getBooleanValue()) + { + MiniHUD.logger.warn("HudDataStorage#fromJson(): toggling feature OFF since SPAWN_CHUNK_RADIUS is set to 0"); + RendererToggle.OVERLAY_SPAWN_CHUNK_OVERLAY_REAL.setBooleanValue(false); + OverlayRendererSpawnChunks.setNeedsUpdate(); + } + } + } +} diff --git a/src/main/java/fi/dy/masa/minihud/event/ClientTickHandler.java b/src/main/java/fi/dy/masa/minihud/event/ClientTickHandler.java index 1f3f4f34f..b88d686a6 100644 --- a/src/main/java/fi/dy/masa/minihud/event/ClientTickHandler.java +++ b/src/main/java/fi/dy/masa/minihud/event/ClientTickHandler.java @@ -3,7 +3,7 @@ import fi.dy.masa.malilib.interfaces.IClientTickHandler; import net.minecraft.client.MinecraftClient; -import fi.dy.masa.minihud.util.DataStorage; +import fi.dy.masa.minihud.data.HudDataManager; public class ClientTickHandler implements IClientTickHandler { @@ -13,7 +13,7 @@ public void onClientTick(MinecraftClient mc) if (mc.world != null && mc.player != null) { RenderHandler.getInstance().updateData(mc); - DataStorage.getInstance().onClientTickPost(mc); + HudDataManager.getInstance().onClientTickPost(mc); } } } diff --git a/src/main/java/fi/dy/masa/minihud/event/RenderHandler.java b/src/main/java/fi/dy/masa/minihud/event/RenderHandler.java index d6310a905..7f47e2f58 100644 --- a/src/main/java/fi/dy/masa/minihud/event/RenderHandler.java +++ b/src/main/java/fi/dy/masa/minihud/event/RenderHandler.java @@ -10,7 +10,8 @@ import fi.dy.masa.minihud.config.Configs; import fi.dy.masa.minihud.config.InfoToggle; import fi.dy.masa.minihud.config.RendererToggle; -import fi.dy.masa.minihud.data.EntitiesDataStorage; +import fi.dy.masa.minihud.data.EntitiesDataManager; +import fi.dy.masa.minihud.data.HudDataManager; import fi.dy.masa.minihud.data.MobCapDataHandler; import fi.dy.masa.minihud.mixin.*; import fi.dy.masa.minihud.renderer.OverlayRenderer; @@ -29,6 +30,7 @@ import net.minecraft.client.gui.DrawContext; import net.minecraft.client.network.PlayerListEntry; import net.minecraft.client.render.Camera; +import net.minecraft.client.render.Fog; import net.minecraft.client.render.Frustum; import net.minecraft.component.DataComponentTypes; import net.minecraft.entity.Entity; @@ -51,11 +53,11 @@ import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.server.integrated.IntegratedServer; +import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.OptionalChunk; import net.minecraft.server.world.ServerChunkManager; import net.minecraft.server.world.ServerWorld; import net.minecraft.util.DyeColor; -import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; import net.minecraft.util.Util; import net.minecraft.util.hit.BlockHitResult; @@ -77,7 +79,7 @@ import net.minecraft.world.chunk.light.LightingProvider; import com.llamalad7.mixinextras.lib.apache.commons.tuple.Pair; -import org.apache.commons.lang3.time.DurationFormatUtils; +import org.apache.commons.lang3.tuple.Triple; import org.joml.Matrix4f; import javax.annotation.Nonnull; @@ -86,12 +88,15 @@ import java.util.*; import java.util.concurrent.CompletableFuture; +import com.mojang.blaze3d.systems.RenderSystem; + public class RenderHandler implements IRenderer { private static final RenderHandler INSTANCE = new RenderHandler(); private final MinecraftClient mc; private final DataStorage data; + private final HudDataManager hudData; private final Date date; private final Map>> chunkFutures = new HashMap<>(); private final Set addedTypes = new HashSet<>(); @@ -107,6 +112,7 @@ public RenderHandler() { this.mc = MinecraftClient.getInstance(); this.data = DataStorage.getInstance(); + this.hudData = HudDataManager.getInstance(); this.date = new Date(); } @@ -120,18 +126,25 @@ public DataStorage getDataStorage() return this.data; } + public HudDataManager getHudData() + { + return this.hudData; + } + public static void fixDebugRendererState() { - //if (Configs.Generic.FIX_VANILLA_DEBUG_RENDERERS.getBooleanValue()) - //{ - //RenderSystem.disableLighting(); - //RenderUtils.color(1, 1, 1, 1); - //OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240f, 240f); - //} + /* + if (Configs.Generic.FIX_VANILLA_DEBUG_RENDERERS.getBooleanValue()) + { + RenderSystem.disableLighting(); + RenderUtils.color(1, 1, 1, 1); + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240f, 240f); + } + */ } @Override - public void onRenderGameOverlayPost(DrawContext drawContext) + public void onRenderGameOverlayPostAdvanced(DrawContext drawContext, float partialTicks, Profiler profiler, MinecraftClient mc) { if (Configs.Generic.MAIN_RENDERING_TOGGLE.getBooleanValue() == false) { @@ -163,6 +176,7 @@ public void onRenderGameOverlayPost(DrawContext drawContext) boolean useShadow = Configs.Generic.USE_FONT_SHADOW.getBooleanValue(); RenderUtils.renderText(x, y, Configs.Generic.FONT_SCALE.getDoubleValue(), textColor, bgColor, alignment, useBackground, useShadow, this.lines, drawContext); + RenderUtils.forceDraw(drawContext); } if (Configs.Generic.INVENTORY_PREVIEW_ENABLED.getBooleanValue() && @@ -189,7 +203,7 @@ public void onRenderTooltipLast(DrawContext drawContext, ItemStack stack, int x, if (Configs.Generic.MAP_PREVIEW.getBooleanValue() && (Configs.Generic.MAP_PREVIEW_REQUIRE_SHIFT.getBooleanValue() == false || GuiBase.isShiftDown())) { - RenderUtils.renderMapPreview(stack, x, y, Configs.Generic.MAP_PREVIEW_SIZE.getIntegerValue(), false); + RenderUtils.renderMapPreview(stack, x, y, Configs.Generic.MAP_PREVIEW_SIZE.getIntegerValue(), false, drawContext); } } else if (stack.getComponents().contains(DataComponentTypes.CONTAINER) && InventoryUtils.shulkerBoxHasItems(stack)) @@ -203,12 +217,12 @@ else if (stack.getComponents().contains(DataComponentTypes.CONTAINER) && Invento } @Override - public void onRenderWorldLast(Matrix4f matrix4f, Matrix4f projMatrix) + public void onRenderWorldPreWeather(Matrix4f posMatrix, Matrix4f projMatrix, Frustum frustum, Camera camera, Fog fog, Profiler profiler) { if (Configs.Generic.MAIN_RENDERING_TOGGLE.getBooleanValue() && this.mc.world != null && this.mc.player != null && this.mc.options.hudHidden == false) { - OverlayRenderer.renderOverlays(matrix4f, projMatrix, this.mc); + OverlayRenderer.renderOverlays(posMatrix, projMatrix, this.mc, frustum, camera, fog, profiler); } } @@ -444,9 +458,9 @@ else if (type == InfoToggle.SERVER_TPS) } else if (type == InfoToggle.SERVUX) { - if (EntitiesDataStorage.getInstance().hasServuxServer()) + if (EntitiesDataManager.getInstance().hasServuxServer()) { - this.addLineI18n("minihud.info_line.servux", EntitiesDataStorage.getInstance().getServuxVersion()); + this.addLineI18n("minihud.info_line.servux", EntitiesDataManager.getInstance().getServuxVersion()); } else if (this.getDataStorage().hasServuxServer()) { @@ -456,31 +470,31 @@ else if (this.getDataStorage().hasIntegratedServer() == false) { this.addLineI18n("minihud.info_line.servux.not_connected"); } - if (EntitiesDataStorage.getInstance().hasServuxServer()) + if (EntitiesDataManager.getInstance().hasServuxServer()) { this.addLineI18n("minihud.info_line.servux.entity_sync", - EntitiesDataStorage.getInstance().getBlockEntityCacheCount(), - EntitiesDataStorage.getInstance().getPendingBlockEntitiesCount(), - EntitiesDataStorage.getInstance().getEntityCacheCount(), - EntitiesDataStorage.getInstance().getPendingEntitiesCount() + EntitiesDataManager.getInstance().getBlockEntityCacheCount(), + EntitiesDataManager.getInstance().getPendingBlockEntitiesCount(), + EntitiesDataManager.getInstance().getEntityCacheCount(), + EntitiesDataManager.getInstance().getPendingEntitiesCount() ); } if (this.getDataStorage().hasServuxServer()) { this.addLineI18n("minihud.info_line.servux.structures", this.getDataStorage().getStrucutreCount(), - this.getDataStorage().getSpawnChunkRadius(), - this.getDataStorage().getWorldSpawn().toShortString(), - this.getDataStorage().isWorldSpawnKnown() ? StringUtils.translate("minihud.info_line.slime_chunk.yes") : StringUtils.translate("minihud.info_line.slime_chunk.no") + this.getHudData().getSpawnChunkRadius(), + this.getHudData().getWorldSpawn().toShortString(), + this.getHudData().isWorldSpawnKnown() ? StringUtils.translate("minihud.info_line.slime_chunk.yes") : StringUtils.translate("minihud.info_line.slime_chunk.no") ); } else if (this.getDataStorage().hasIntegratedServer()) { this.addLineI18n("minihud.info_line.servux.structures_integrated", this.getDataStorage().getStrucutreCount(), - this.getDataStorage().getSpawnChunkRadius(), - this.getDataStorage().getWorldSpawn().toShortString(), - this.getDataStorage().isWorldSpawnKnown() ? StringUtils.translate("minihud.info_line.slime_chunk.yes") : StringUtils.translate("minihud.info_line.slime_chunk.no") + this.getHudData().getSpawnChunkRadius(), + this.getHudData().getWorldSpawn().toShortString(), + this.getHudData().isWorldSpawnKnown() ? StringUtils.translate("minihud.info_line.slime_chunk.yes") : StringUtils.translate("minihud.info_line.slime_chunk.no") ); } } @@ -494,20 +508,20 @@ else if (type == InfoToggle.WEATHER) { return; } - if (this.data.isWeatherThunder()) + if (this.getHudData().isWeatherClear()) { - weatherType = "thundering"; - weatherTime = this.data.getThunderTime(); + weatherType = "clear"; + weatherTime = this.getHudData().getClearTime(); } - else if (this.data.isWeatherRain()) + else if (this.getHudData().isWeatherRain()) { weatherType = "raining"; - weatherTime = this.data.getRainTime(); + weatherTime = this.getHudData().getRainTime(); } - else if (this.data.isWeatherClear()) + else if (this.getHudData().isWeatherThunder()) { - weatherType = "clear"; - weatherTime = this.data.getClearTime(); + weatherType = "thundering"; + weatherTime = this.getHudData().getThunderTime(); } /* if (bestWorld.getLevelProperties().isThundering()) @@ -537,7 +551,7 @@ else if (bestWorld.getLevelProperties().isRaining()) // 50 = 1000 (ms/s) / 20 (ticks/s) this.addLineI18n("minihud.info_line.weather", StringUtils.translate("minihud.info_line.weather." + weatherType), - ", " + DurationFormatUtils.formatDurationWords(weatherTime * 50L, true, true) + ", " + StringUtils.getDurationString(weatherTime * 50L) + " " + StringUtils.translate("minihud.info_line.remaining") ); } @@ -764,7 +778,8 @@ else if (type == InfoToggle.BEE_COUNT) return; } if (Configs.Generic.INFO_LINES_USES_NBT.getBooleanValue() && - BlockUtils.getBlockEntityTypeFromNbt(pair.getRight()).equals(BlockEntityType.BEEHIVE)) + BlockUtils.getBlockEntityTypeFromNbt(pair.getRight()).equals(BlockEntityType.BEEHIVE) && + !pair.getRight().isEmpty()) { Pair, BlockPos> bees = BlockUtils.getBeesDataFromNbt(pair.getRight()); this.addLineI18n("minihud.info_line.bee_count.flower_pos", bees.getLeft().size(), bees.getRight().toShortString()); @@ -774,6 +789,15 @@ else if (pair.getLeft() instanceof BeehiveBlockEntity be) this.addLineI18n("minihud.info_line.bee_count", ((BeehiveBlockEntity) be).getBeeCount()); } } + else if (type == InfoToggle.HONEY_LEVEL) + { + BlockState state = this.getTargetedBlock(mc); + + if (state != null && state.getBlock() instanceof BeehiveBlock) + { + this.addLineI18n("minihud.info_line.honey_level", BeehiveBlockEntity.getHoneyLevel(state)); + } + } else if (type == InfoToggle.FURNACE_XP) { World bestWorld = WorldUtils.getBestWorld(mc); @@ -783,7 +807,8 @@ else if (type == InfoToggle.FURNACE_XP) { return; } - if (Configs.Generic.INFO_LINES_USES_NBT.getBooleanValue()) + + if (Configs.Generic.INFO_LINES_USES_NBT.getBooleanValue() && !pair.getRight().isEmpty()) { BlockEntityType beType = BlockUtils.getBlockEntityTypeFromNbt(pair.getRight()); @@ -791,21 +816,46 @@ else if (type == InfoToggle.FURNACE_XP) beType.equals(BlockEntityType.BLAST_FURNACE) || beType.equals(BlockEntityType.SMOKER)) { - this.addLineI18n("minihud.info_line.furnace_xp", MiscUtils.getFurnaceXpAmount(bestWorld, pair.getRight())); + if (bestWorld instanceof ServerWorld serverWorld) + { + int exp = MiscUtils.getFurnaceXpAmount(serverWorld, pair.getRight()); + + if (exp > 0) + { + this.addLineI18n("minihud.info_line.furnace_xp", exp); + } + } + else if (this.getHudData().hasServuxServer() && this.getHudData().hasRecipes()) + { + int exp = MiscUtils.getFurnaceXpAmount(pair.getRight()); + + if (exp > 0) + { + this.addLineI18n("minihud.info_line.furnace_xp", exp); + } + } } } else if (pair.getLeft() instanceof AbstractFurnaceBlockEntity furnace) { - this.addLineI18n("minihud.info_line.furnace_xp", MiscUtils.getFurnaceXpAmount(bestWorld, furnace)); - } - } - else if (type == InfoToggle.HONEY_LEVEL) - { - BlockState state = this.getTargetedBlock(mc); + if (bestWorld instanceof ServerWorld serverWorld) + { + int exp = MiscUtils.getFurnaceXpAmount(serverWorld, furnace); - if (state != null && state.getBlock() instanceof BeehiveBlock) - { - this.addLineI18n("minihud.info_line.honey_level", BeehiveBlockEntity.getHoneyLevel(state)); + if (exp > 0) + { + this.addLineI18n("minihud.info_line.furnace_xp", exp); + } + } + else if (this.getHudData().hasServuxServer() && this.getHudData().hasRecipes()) + { + int exp = MiscUtils.getFurnaceXpAmount(furnace); + + if (exp > 0) + { + this.addLineI18n("minihud.info_line.furnace_xp", exp); + } + } } } else if (type == InfoToggle.HORSE_SPEED || @@ -840,7 +890,7 @@ else if (type == InfoToggle.HORSE_SPEED || float speed = 0f; double jump = 0d; - if (pair != null && Configs.Generic.INFO_LINES_USES_NBT.getBooleanValue()) + if (pair != null && Configs.Generic.INFO_LINES_USES_NBT.getBooleanValue() && !pair.getRight().isEmpty()) { NbtCompound nbt = pair.getRight(); EntityType entityType = EntityUtils.getEntityTypeFromNbt(nbt); @@ -861,8 +911,8 @@ else if (type == InfoToggle.HORSE_SPEED || } else { - speed = horse.getMovementSpeed() > 0 ? horse.getMovementSpeed() : (float) horse.getAttributeValue(EntityAttributes.GENERIC_MOVEMENT_SPEED); - jump = horse.getAttributeValue(EntityAttributes.GENERIC_JUMP_STRENGTH); + speed = horse.getMovementSpeed() > 0 ? horse.getMovementSpeed() : (float) horse.getAttributeValue(EntityAttributes.MOVEMENT_SPEED); + jump = horse.getAttributeValue(EntityAttributes.JUMP_STRENGTH); } if (InfoToggle.HORSE_SPEED.getBooleanValue() && speed > 0f) { @@ -973,7 +1023,7 @@ else if (type == InfoToggle.PANDA_GENE) { return; } - if (Configs.Generic.INFO_LINES_USES_NBT.getBooleanValue()) + if (Configs.Generic.INFO_LINES_USES_NBT.getBooleanValue() && !pair.getRight().isEmpty()) { NbtCompound nbt = pair.getRight(); EntityType entityType = EntityUtils.getEntityTypeFromNbt(nbt); @@ -1034,7 +1084,7 @@ else if (type == InfoToggle.BIOME) if (clientChunk.isEmpty() == false) { Biome biome = mc.world.getBiome(pos).value(); - Identifier id = mc.world.getRegistryManager().get(RegistryKeys.BIOME).getId(biome); + Identifier id = mc.world.getRegistryManager().getOrThrow(RegistryKeys.BIOME).getId(biome); this.addLineI18n("minihud.info_line.biome", StringUtils.translate("biome." + id.toString().replace(":", "."))); } } @@ -1045,7 +1095,7 @@ else if (type == InfoToggle.BIOME_REG_NAME) if (clientChunk.isEmpty() == false) { Biome biome = mc.world.getBiome(pos).value(); - Identifier rl = mc.world.getRegistryManager().get(RegistryKeys.BIOME).getId(biome); + Identifier rl = mc.world.getRegistryManager().getOrThrow(RegistryKeys.BIOME).getId(biome); String name = rl != null ? rl.toString() : "?"; this.addLineI18n("minihud.info_line.biome_reg_name", name); } @@ -1097,9 +1147,9 @@ else if (type == InfoToggle.SLIME_CHUNK) String result; - if (this.data.isWorldSeedKnown(world)) + if (this.getHudData().isWorldSeedKnown(world)) { - long seed = this.data.getWorldSeed(world); + long seed = this.getHudData().getWorldSeed(world); if (MiscUtils.canSlimeSpawnAt(pos.getX(), pos.getZ(), seed)) { @@ -1128,7 +1178,7 @@ else if (type == InfoToggle.LOOKING_AT_ENTITY) return; } if (Configs.Generic.INFO_LINES_USES_NBT.getBooleanValue() && - pair.getLeft() instanceof LivingEntity living) + pair.getLeft() instanceof LivingEntity living && !pair.getRight().isEmpty()) { NbtCompound nbt = pair.getRight(); Pair healthPair = EntityUtils.getHealthFromNbt(nbt); @@ -1158,7 +1208,7 @@ else if (type == InfoToggle.LOOKING_AT_ENTITY) if (agePair.getLeft() < 0) { int untilGrown = agePair.getLeft() * (-1); - entityLine = entityLine+ " [" + DurationFormatUtils.formatDurationWords((untilGrown * 50), true, true) + " " + StringUtils.translate("minihud.info_line.remaining") + "]"; + entityLine = entityLine+ " [" + StringUtils.getDurationString(untilGrown * 50) + " " + StringUtils.translate("minihud.info_line.remaining") + "]"; } this.addLine(entityLine); } @@ -1178,8 +1228,8 @@ else if (pair.getLeft() instanceof LivingEntity living) { if (passive.getBreedingAge() < 0) { - int untilGrown = ((IMixinPassiveEntity) passive).getRealBreedingAge() * (-1); - entityLine = entityLine+ " [" + DurationFormatUtils.formatDurationWords((untilGrown * 50), true, true) + " " + StringUtils.translate("minihud.info_line.remaining") + "]"; + int untilGrown = ((IMixinPassiveEntity) passive).minihud_getRealBreedingAge() * (-1); + entityLine = entityLine+ " [" + StringUtils.getDurationString(untilGrown * 50) + " " + StringUtils.translate("minihud.info_line.remaining") + "]"; } } @@ -1202,7 +1252,7 @@ else if (type == InfoToggle.ENTITY_VARIANT) return; } if (Configs.Generic.INFO_LINES_USES_NBT.getBooleanValue() && - pair.getLeft() instanceof LivingEntity living) + pair.getLeft() instanceof LivingEntity living && !pair.getRight().isEmpty()) { NbtCompound nbt = pair.getRight(); EntityType entityType = EntityUtils.getEntityTypeFromNbt(nbt); @@ -1328,7 +1378,7 @@ else if (type == InfoToggle.LOOKING_AT_EFFECTS) return; } if (Configs.Generic.INFO_LINES_USES_NBT.getBooleanValue() && - pair.getLeft() instanceof LivingEntity) + pair.getLeft() instanceof LivingEntity && !pair.getRight().isEmpty()) { NbtCompound nbt = pair.getRight(); Map, StatusEffectInstance> effects = EntityUtils.getActiveStatusEffectsFromNbt(nbt); @@ -1348,7 +1398,7 @@ else if (type == InfoToggle.LOOKING_AT_EFFECTS) effectType.value().getName().getString(), effect.getAmplifier() > 0 ? StringUtils.translate("minihud.info_line.looking_at_effects.amplifier", effect.getAmplifier() + 1) : "", effect.isInfinite() ? StringUtils.translate("minihud.info_line.looking_at_effects.infinite") : - DurationFormatUtils.formatDurationWords((effect.getDuration() / 20) * 1000L, true, true), + StringUtils.getDurationString((effect.getDuration() / 20) * 1000L), StringUtils.translate("minihud.info_line.remaining") ); } @@ -1369,7 +1419,7 @@ else if (pair.getLeft() instanceof LivingEntity living) effect.getEffectType().value().getName().getString(), effect.getAmplifier() > 0 ? StringUtils.translate("minihud.info_line.looking_at_effects.amplifier", effect.getAmplifier() + 1) : "", effect.isInfinite() ? StringUtils.translate("minihud.info_line.looking_at_effects.infinite") : - DurationFormatUtils.formatDurationWords((effect.getDuration() / 20) * 1000L, true, true), + StringUtils.getDurationString((effect.getDuration() / 20) * 1000L), StringUtils.translate("minihud.info_line.remaining") ); } @@ -1391,7 +1441,7 @@ else if (type == InfoToggle.ZOMBIE_CONVERSION) String zombieType = pair.getLeft().getType().getName().getString(); int conversionTimer = -1; - if (Configs.Generic.INFO_LINES_USES_NBT.getBooleanValue()) + if (Configs.Generic.INFO_LINES_USES_NBT.getBooleanValue() && !pair.getRight().isEmpty()) { NbtCompound nbt = pair.getRight(); EntityType entityType = EntityUtils.getEntityTypeFromNbt(nbt); @@ -1430,7 +1480,7 @@ else if (pair.getLeft() instanceof SkeletonEntity skeleton) } if (conversionTimer > 0) { - this.addLineI18n("minihud.info_line.zombie_conversion", zombieType, DurationFormatUtils.formatDurationWords((conversionTimer / 20) * 1000L, true, true)); + this.addLineI18n("minihud.info_line.zombie_conversion", zombieType, StringUtils.getDurationString((conversionTimer / 20) * 1000L)); } } } @@ -1439,6 +1489,7 @@ else if (type == InfoToggle.ENTITY_REG_NAME) if (mc.crosshairTarget != null && mc.crosshairTarget.getType() == HitResult.Type.ENTITY) { Pair pair = this.getTargetEntity(world, mc); + if (pair == null) { return; @@ -1451,6 +1502,44 @@ else if (type == InfoToggle.ENTITY_REG_NAME) } } } + else if (type == InfoToggle.PLAYER_EXPERIENCE) + { + if (mc.player != null) + { + this.addLineI18n("minihud.info_line.player_experience", mc.player.experienceLevel, mc.player.experienceProgress, mc.player.totalExperience); + } + } + else if (type == InfoToggle.LOOKING_AT_PLAYER_EXP) + { + if (mc.crosshairTarget != null && mc.crosshairTarget.getType() == HitResult.Type.ENTITY) + { + Pair pair = this.getTargetEntity(world, mc); + + if (pair == null) + { + return; + } + if (Configs.Generic.INFO_LINES_USES_NBT.getBooleanValue() && !pair.getRight().isEmpty()) + { + NbtCompound nbt = pair.getRight(); + EntityType entityType = EntityUtils.getEntityTypeFromNbt(nbt); + + if (entityType.equals(EntityType.PLAYER)) + { + Triple triple = EntityUtils.getPlayerExpFromNbt(nbt); + + if (triple.getLeft() > 0) + { + this.addLineI18n("minihud.info_line.looking_at_player_exp", triple.getLeft(), triple.getRight(), triple.getMiddle()); + } + } + } + else if (pair.getLeft() instanceof ServerPlayerEntity player) + { + this.addLineI18n("minihud.info_line.looking_at_player_exp", player.experienceLevel, player.experienceProgress, player.totalExperience); + } + } + } else if (type == InfoToggle.LOOKING_AT_BLOCK || type == InfoToggle.LOOKING_AT_BLOCK_CHUNK) { @@ -1510,7 +1599,7 @@ public Pair getTargetEntity(World world, MinecraftClient mc } else { - pair = EntitiesDataStorage.getInstance().requestEntity(lookedEntity.getId()); + pair = EntitiesDataManager.getInstance().requestEntity(lookedEntity.getId()); } // Remember the last entity so the "refresh time" is smoothed over. @@ -1568,7 +1657,7 @@ public Pair getTargetedBlockEntity(World world, Minecr } else { - pair = EntitiesDataStorage.getInstance().requestBlockEntity(world, posLooking); + pair = EntitiesDataManager.getInstance().requestBlockEntity(world, posLooking); } // Remember the last entity so the "refresh time" is smoothed over. @@ -1594,7 +1683,7 @@ public Pair requestBlockEntityAt(World world, BlockPos { if (!(world instanceof ServerWorld)) { - Pair pair = EntitiesDataStorage.getInstance().requestBlockEntity(world, pos); + Pair pair = EntitiesDataManager.getInstance().requestBlockEntity(world, pos); BlockState state = world.getBlockState(pos); @@ -1604,7 +1693,7 @@ public Pair requestBlockEntityAt(World world, BlockPos if (type != ChestType.SINGLE) { - return EntitiesDataStorage.getInstance().requestBlockEntity(world, pos.offset(ChestBlock.getFacing(state))); + return EntitiesDataManager.getInstance().requestBlockEntity(world, pos.offset(ChestBlock.getFacing(state))); } } diff --git a/src/main/java/fi/dy/masa/minihud/event/ServerListener.java b/src/main/java/fi/dy/masa/minihud/event/ServerListener.java index 49df47feb..738c8e87f 100644 --- a/src/main/java/fi/dy/masa/minihud/event/ServerListener.java +++ b/src/main/java/fi/dy/masa/minihud/event/ServerListener.java @@ -3,6 +3,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.integrated.IntegratedServer; import fi.dy.masa.malilib.interfaces.IServerListener; +import fi.dy.masa.minihud.data.HudDataManager; import fi.dy.masa.minihud.util.DataStorage; public class ServerListener implements IServerListener @@ -10,7 +11,7 @@ public class ServerListener implements IServerListener @Override public void onServerStarted(MinecraftServer server) { - DataStorage.getInstance().checkWorldSeed(server); + HudDataManager.getInstance().checkWorldSeed(server); } @Override diff --git a/src/main/java/fi/dy/masa/minihud/event/WorldLoadListener.java b/src/main/java/fi/dy/masa/minihud/event/WorldLoadListener.java index be0a23ecd..377248505 100644 --- a/src/main/java/fi/dy/masa/minihud/event/WorldLoadListener.java +++ b/src/main/java/fi/dy/masa/minihud/event/WorldLoadListener.java @@ -12,7 +12,9 @@ import fi.dy.masa.malilib.util.StringUtils; import fi.dy.masa.minihud.MiniHUD; import fi.dy.masa.minihud.Reference; -import fi.dy.masa.minihud.data.EntitiesDataStorage; +import fi.dy.masa.minihud.data.DebugDataManager; +import fi.dy.masa.minihud.data.EntitiesDataManager; +import fi.dy.masa.minihud.data.HudDataManager; import fi.dy.masa.minihud.renderer.OverlayRenderer; import fi.dy.masa.minihud.renderer.RenderContainer; import fi.dy.masa.minihud.renderer.shapes.ShapeManager; @@ -37,7 +39,9 @@ public void onWorldLoadPre(@Nullable ClientWorld worldBefore, @Nullable ClientWo if (worldAfter != null) { DataStorage.getInstance().onWorldPre(); - EntitiesDataStorage.getInstance().onWorldPre(); + HudDataManager.getInstance().onWorldPre(); + EntitiesDataManager.getInstance().onWorldPre(); + DebugDataManager.getInstance().onWorldPre(); } } @@ -46,7 +50,9 @@ public void onWorldLoadPost(@Nullable ClientWorld worldBefore, @Nullable ClientW { // Clear the cached data DataStorage.getInstance().reset(worldAfter == null); - EntitiesDataStorage.getInstance().reset(worldAfter == null); + HudDataManager.getInstance().reset(worldAfter == null); + EntitiesDataManager.getInstance().reset(worldAfter == null); + DebugDataManager.getInstance().reset(worldAfter == null); // Logging in to a world or changing dimensions or respawning if (worldAfter != null) @@ -61,7 +67,9 @@ public void onWorldLoadPost(@Nullable ClientWorld worldBefore, @Nullable ClientW OverlayRenderer.resetRenderTimeout(); DataStorage.getInstance().onWorldJoin(); DataStorage.getInstance().setWorldRegistryManager(worldAfter.getRegistryManager()); - EntitiesDataStorage.getInstance().onWorldJoin(); + HudDataManager.getInstance().onWorldJoin(); + EntitiesDataManager.getInstance().onWorldJoin(); + DebugDataManager.getInstance().onWorldJoin(); } } @@ -71,7 +79,8 @@ private void writeDataPerDimension() JsonObject root = new JsonObject(); root.add("data_storage", DataStorage.getInstance().toJson()); - root.add("block_entities", EntitiesDataStorage.getInstance().toJson()); + root.add("hud_data", HudDataManager.getInstance().toJson()); + root.add("entities", EntitiesDataManager.getInstance().toJson()); root.add("shapes", ShapeManager.INSTANCE.toJson()); JsonUtils.writeJsonToFile(root, file); @@ -107,9 +116,14 @@ private void readStoredDataPerDimension() DataStorage.getInstance().fromJson(JsonUtils.getNestedObject(root, "data_storage", false)); } - if (JsonUtils.hasObject(root, "block_entities")) + if (JsonUtils.hasObject(root, "hud_data")) { - EntitiesDataStorage.getInstance().fromJson(JsonUtils.getNestedObject(root, "block_entities", false)); + HudDataManager.getInstance().fromJson(JsonUtils.getNestedObject(root, "hud_data", false)); + } + + if (JsonUtils.hasObject(root, "entities")) + { + EntitiesDataManager.getInstance().fromJson(JsonUtils.getNestedObject(root, "entities", false)); } } } diff --git a/src/main/java/fi/dy/masa/minihud/gui/InventoryOverlayScreen.java b/src/main/java/fi/dy/masa/minihud/gui/InventoryOverlayScreen.java index 7257872a5..123a3c7a8 100644 --- a/src/main/java/fi/dy/masa/minihud/gui/InventoryOverlayScreen.java +++ b/src/main/java/fi/dy/masa/minihud/gui/InventoryOverlayScreen.java @@ -27,7 +27,7 @@ import fi.dy.masa.malilib.util.GuiUtils; import fi.dy.masa.malilib.util.WorldUtils; import fi.dy.masa.minihud.config.Configs; -import fi.dy.masa.minihud.data.EntitiesDataStorage; +import fi.dy.masa.minihud.data.EntitiesDataManager; import fi.dy.masa.minihud.event.RenderHandler; import fi.dy.masa.minihud.util.RayTraceUtils; @@ -89,7 +89,7 @@ else if (previewData.entity() instanceof WolfEntity) /* MiniHUD.logger.warn("render():0: type [{}], previewData.type [{}], previewData.inv [{}], previewData.be [{}], previewData.ent [{}], previewData.nbt [{}]", type.toString(), previewData.type().toString(), - previewData.inv() != null, previewData.be() != null, previewData.entity() != null, previewData.nbt() != null ? previewData.nbt().getString("id") : null); + previewData.inv() != null, previewData.be() != null, previewData.entity() != null, previewData.nbt() != null ? previewData.nbt().getString("id") : null); MiniHUD.logger.error("0: -> inv.type [{}] // nbt.type [{}]", previewData.inv() != null ? InventoryOverlay.getInventoryType(previewData.inv()) : null, previewData.nbt() != null ? InventoryOverlay.getInventoryType(previewData.nbt()) : null); */ @@ -165,7 +165,7 @@ else if (previewData.nbt() != null && previewData.nbt().contains("disabled_slots } else if (previewData.entity() != null) { - EntitiesDataStorage.getInstance().requestEntity(previewData.entity().getId()); + EntitiesDataManager.getInstance().requestEntity(previewData.entity().getId()); previewData = RayTraceUtils.getTargetInventoryFromEntity(previewData.entity(), previewData.nbt()); } diff --git a/src/main/java/fi/dy/masa/minihud/hotkeys/KeyCallbacks.java b/src/main/java/fi/dy/masa/minihud/hotkeys/KeyCallbacks.java index 560ed4a4d..6555a2b8a 100644 --- a/src/main/java/fi/dy/masa/minihud/hotkeys/KeyCallbacks.java +++ b/src/main/java/fi/dy/masa/minihud/hotkeys/KeyCallbacks.java @@ -74,11 +74,13 @@ public static void init() RendererToggle.OVERLAY_SPAWN_CHUNK_OVERLAY_REAL.setValueChangeCallback(RendererCallbacks::onSpawnChunksRealToggled); RendererToggle.OVERLAY_STRUCTURE_MAIN_TOGGLE.setValueChangeCallback(RendererCallbacks::onStructuresToggled); + RendererToggle.DEBUG_DATA_MAIN_TOGGLE.setValueChangeCallback(RendererCallbacks::onDebugServiceToggled); RendererToggle.DEBUG_CHUNK_BORDER.setValueChangeCallback(DebugInfoUtils::toggleDebugRenderer); RendererToggle.DEBUG_CHUNK_INFO.setValueChangeCallback(DebugInfoUtils::toggleDebugRenderer); RendererToggle.DEBUG_CHUNK_OCCLUSION.setValueChangeCallback(DebugInfoUtils::toggleDebugRenderer); RendererToggle.DEBUG_NEIGHBOR_UPDATES.setValueChangeCallback(DebugInfoUtils::toggleDebugRenderer); //RendererToggle.DEBUG_PATH_FINDING.setValueChangeCallback(DebugInfoUtils::toggleDebugRenderer); + RendererToggle.DEBUG_OCTREEE.setValueChangeCallback(DebugInfoUtils::toggleDebugRenderer); } private static void updateBeaconOverlay() diff --git a/src/main/java/fi/dy/masa/minihud/mixin/IMixinAbstractFurnaceBlockEntity.java b/src/main/java/fi/dy/masa/minihud/mixin/IMixinAbstractFurnaceBlockEntity.java index 477553540..2c21b6c35 100644 --- a/src/main/java/fi/dy/masa/minihud/mixin/IMixinAbstractFurnaceBlockEntity.java +++ b/src/main/java/fi/dy/masa/minihud/mixin/IMixinAbstractFurnaceBlockEntity.java @@ -1,5 +1,8 @@ package fi.dy.masa.minihud.mixin; +import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; +import net.minecraft.recipe.Recipe; +import net.minecraft.registry.RegistryKey; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import net.minecraft.block.entity.AbstractFurnaceBlockEntity; @@ -10,5 +13,5 @@ public interface IMixinAbstractFurnaceBlockEntity { @Accessor("recipesUsed") - Object2IntOpenHashMap minihud_getUsedRecipes(); + Reference2IntOpenHashMap>> minihud_getUsedRecipes(); } diff --git a/src/main/java/fi/dy/masa/minihud/mixin/IMixinEntity.java b/src/main/java/fi/dy/masa/minihud/mixin/IMixinEntity.java index 8f2d14884..cb59812f2 100644 --- a/src/main/java/fi/dy/masa/minihud/mixin/IMixinEntity.java +++ b/src/main/java/fi/dy/masa/minihud/mixin/IMixinEntity.java @@ -9,5 +9,5 @@ public interface IMixinEntity { @Invoker("readCustomDataFromNbt") - void readCustomDataFromNbt(NbtCompound nbt); + void minihud_readCustomDataFromNbt(NbtCompound nbt); } diff --git a/src/main/java/fi/dy/masa/minihud/mixin/IMixinEntityNavigation.java b/src/main/java/fi/dy/masa/minihud/mixin/IMixinEntityNavigation.java index d1b0e4092..44d6a8ea3 100644 --- a/src/main/java/fi/dy/masa/minihud/mixin/IMixinEntityNavigation.java +++ b/src/main/java/fi/dy/masa/minihud/mixin/IMixinEntityNavigation.java @@ -8,5 +8,5 @@ public interface IMixinEntityNavigation { @Accessor("nodeReachProximity") - float getMaxDistanceToWaypoint(); + float minihud_getMaxDistanceToWaypoint(); } diff --git a/src/main/java/fi/dy/masa/minihud/mixin/IMixinLeashable.java b/src/main/java/fi/dy/masa/minihud/mixin/IMixinLeashable.java deleted file mode 100644 index 586a90b3b..000000000 --- a/src/main/java/fi/dy/masa/minihud/mixin/IMixinLeashable.java +++ /dev/null @@ -1,9 +0,0 @@ -package fi.dy.masa.minihud.mixin; - -import net.minecraft.entity.Leashable; -import org.spongepowered.asm.mixin.Mixin; - -@Mixin(Leashable.class) -public interface IMixinLeashable -{ -} diff --git a/src/main/java/fi/dy/masa/minihud/mixin/IMixinMerchantEntity.java b/src/main/java/fi/dy/masa/minihud/mixin/IMixinMerchantEntity.java index 7967bd2f2..a73d01e5a 100644 --- a/src/main/java/fi/dy/masa/minihud/mixin/IMixinMerchantEntity.java +++ b/src/main/java/fi/dy/masa/minihud/mixin/IMixinMerchantEntity.java @@ -9,5 +9,5 @@ public interface IMixinMerchantEntity { @Accessor("offers") - TradeOfferList offers(); + TradeOfferList minihud_offers(); } diff --git a/src/main/java/fi/dy/masa/minihud/mixin/IMixinPassiveEntity.java b/src/main/java/fi/dy/masa/minihud/mixin/IMixinPassiveEntity.java index 95b367434..ddd4b721f 100644 --- a/src/main/java/fi/dy/masa/minihud/mixin/IMixinPassiveEntity.java +++ b/src/main/java/fi/dy/masa/minihud/mixin/IMixinPassiveEntity.java @@ -8,5 +8,5 @@ public interface IMixinPassiveEntity { @Accessor("breedingAge") - int getRealBreedingAge(); + int minihud_getRealBreedingAge(); } diff --git a/src/main/java/fi/dy/masa/minihud/mixin/IMixinServerRecipeManager.java b/src/main/java/fi/dy/masa/minihud/mixin/IMixinServerRecipeManager.java new file mode 100644 index 000000000..0c0ada2a2 --- /dev/null +++ b/src/main/java/fi/dy/masa/minihud/mixin/IMixinServerRecipeManager.java @@ -0,0 +1,13 @@ +package fi.dy.masa.minihud.mixin; + +import net.minecraft.recipe.PreparedRecipes; +import net.minecraft.recipe.ServerRecipeManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ServerRecipeManager.class) +public interface IMixinServerRecipeManager +{ + @Accessor("preparedRecipes") + PreparedRecipes minihud_getPreparedRecipes(); +} diff --git a/src/main/java/fi/dy/masa/minihud/mixin/IMixinWorld.java b/src/main/java/fi/dy/masa/minihud/mixin/IMixinWorld.java index 000659850..c82d4a49c 100644 --- a/src/main/java/fi/dy/masa/minihud/mixin/IMixinWorld.java +++ b/src/main/java/fi/dy/masa/minihud/mixin/IMixinWorld.java @@ -10,5 +10,5 @@ public interface IMixinWorld { @Invoker("getEntityLookup") - EntityLookup getEntityLookup(); + EntityLookup minihud_getEntityLookup(); } diff --git a/src/main/java/fi/dy/masa/minihud/mixin/MixinBeaconBlockEntity.java b/src/main/java/fi/dy/masa/minihud/mixin/MixinBeaconBlockEntity.java index 522ac3c22..1d08c838f 100644 --- a/src/main/java/fi/dy/masa/minihud/mixin/MixinBeaconBlockEntity.java +++ b/src/main/java/fi/dy/masa/minihud/mixin/MixinBeaconBlockEntity.java @@ -3,6 +3,7 @@ import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -18,8 +19,7 @@ public abstract class MixinBeaconBlockEntity extends BlockEntity { @Shadow int level; - - private int levelPre = -1; + @Unique private int levelPre = -1; private MixinBeaconBlockEntity(BlockEntityType type, BlockPos pos, BlockState state) { diff --git a/src/main/java/fi/dy/masa/minihud/mixin/MixinClientCommonNetworkHandler.java b/src/main/java/fi/dy/masa/minihud/mixin/MixinClientCommonNetworkHandler.java new file mode 100644 index 000000000..1ca4fca80 --- /dev/null +++ b/src/main/java/fi/dy/masa/minihud/mixin/MixinClientCommonNetworkHandler.java @@ -0,0 +1,28 @@ +package fi.dy.masa.minihud.mixin; + +import net.minecraft.client.network.ClientCommonNetworkHandler; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(value = ClientCommonNetworkHandler.class, priority = 999) +public abstract class MixinClientCommonNetworkHandler +{ + /* + @Shadow @Final protected net.minecraft.client.MinecraftClient client; + + @Inject(method = "onCustomPayload(Lnet/minecraft/network/packet/s2c/common/CustomPayloadS2CPacket;)V", + at = @At("HEAD"), cancellable = true) + private void minihud_onCustomPayloadFix(CustomPayloadS2CPacket packet, CallbackInfo ci) + { + CustomPayload payload = packet.payload(); + + MiniHUD.logger.error("CustomPayload ID: [{}] // Class: [{}]", payload.getId().id(), payload.getClass().getCanonicalName()); + if (payload instanceof DebugBrainCustomPayload) + { + NetworkThreadUtils.forceMainThread(packet, (ClientCommonPacketListener) this, this.client); + DebugBrainCustomPayload brainCustomPayload = (DebugBrainCustomPayload) payload; + this.client.debugRenderer.villageDebugRenderer.addBrain(brainCustomPayload.brainDump()); + ci.cancel(); + } + } + */ +} diff --git a/src/main/java/fi/dy/masa/minihud/mixin/MixinClientPlayNetworkHandler.java b/src/main/java/fi/dy/masa/minihud/mixin/MixinClientPlayNetworkHandler.java index 1bf96c518..68cc2ca62 100644 --- a/src/main/java/fi/dy/masa/minihud/mixin/MixinClientPlayNetworkHandler.java +++ b/src/main/java/fi/dy/masa/minihud/mixin/MixinClientPlayNetworkHandler.java @@ -7,7 +7,8 @@ import net.minecraft.network.packet.s2c.play.GameJoinS2CPacket; import net.minecraft.network.packet.s2c.play.NbtQueryResponseS2CPacket; import fi.dy.masa.minihud.config.Configs; -import fi.dy.masa.minihud.data.EntitiesDataStorage; +import fi.dy.masa.minihud.data.EntitiesDataManager; +import fi.dy.masa.minihud.data.HudDataManager; import fi.dy.masa.minihud.util.DataStorage; import fi.dy.masa.minihud.util.NotificationUtils; @@ -49,13 +50,13 @@ private void onHandlePlayerListHeaderFooter(net.minecraft.network.packet.s2c.pla @Inject(method = "onWorldTimeUpdate", at = @At("RETURN")) private void onTimeUpdate(net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket packetIn, CallbackInfo ci) { - DataStorage.getInstance().onServerTimeUpdate(packetIn.getTime()); + DataStorage.getInstance().onServerTimeUpdate(packetIn.time()); } @Inject(method = "onPlayerSpawnPosition", at = @At("RETURN")) private void onSetSpawn(net.minecraft.network.packet.s2c.play.PlayerSpawnPositionS2CPacket packet, CallbackInfo ci) { - DataStorage.getInstance().setWorldSpawn(packet.getPos()); + HudDataManager.getInstance().setWorldSpawn(packet.getPos()); } @Inject(method = "onGameJoin", at = @At("RETURN")) @@ -69,7 +70,7 @@ private void onQueryResponse(NbtQueryResponseS2CPacket packet, CallbackInfo ci) { if (Configs.Generic.ENTITY_DATA_SYNC_BACKUP.getBooleanValue()) { - EntitiesDataStorage.getInstance().handleVanillaQueryNbt(packet.getTransactionId(), packet.getNbt()); + EntitiesDataManager.getInstance().handleVanillaQueryNbt(packet.getTransactionId(), packet.getNbt()); } } } diff --git a/src/main/java/fi/dy/masa/minihud/mixin/MixinConduitBlockEntity.java b/src/main/java/fi/dy/masa/minihud/mixin/MixinConduitBlockEntity.java index f31003fe5..0d0aa15c0 100644 --- a/src/main/java/fi/dy/masa/minihud/mixin/MixinConduitBlockEntity.java +++ b/src/main/java/fi/dy/masa/minihud/mixin/MixinConduitBlockEntity.java @@ -4,6 +4,7 @@ import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -19,22 +20,22 @@ public abstract class MixinConduitBlockEntity implements ConduitExtra { @Shadow @Final private List activatingBlocks; - private int minihud_activatingBlockCount; + @Unique private int minihud_activatingBlockCount; @Override - public int getCurrentActivatingBlockCount() + public int minihud$getCurrentActivatingBlockCount() { return this.activatingBlocks.size(); } @Override - public int getStoredActivatingBlockCount() + public int minihud$getStoredActivatingBlockCount() { return this.minihud_activatingBlockCount; } @Override - public void setActivatingBlockCount(int count) + public void minihud$setActivatingBlockCount(int count) { this.minihud_activatingBlockCount = count; } @@ -47,13 +48,13 @@ private static void minihud_postActiveBlockScan(World world, BlockPos pos, Block { if (RendererToggle.OVERLAY_CONDUIT_RANGE.getBooleanValue()) { - int count = ((ConduitExtra) blockEntity).getCurrentActivatingBlockCount(); - int countBefore = ((ConduitExtra) blockEntity).getStoredActivatingBlockCount(); + int count = ((ConduitExtra) blockEntity).minihud$getCurrentActivatingBlockCount(); + int countBefore = ((ConduitExtra) blockEntity).minihud$getStoredActivatingBlockCount(); if (count != countBefore) { OverlayRendererConduitRange.INSTANCE.onBlockStatusChange(pos); - ((ConduitExtra) blockEntity).setActivatingBlockCount(count); + ((ConduitExtra) blockEntity).minihud$setActivatingBlockCount(count); } } } diff --git a/src/main/java/fi/dy/masa/minihud/mixin/MixinDebugInfoSender.java b/src/main/java/fi/dy/masa/minihud/mixin/MixinDebugInfoSender.java deleted file mode 100644 index 04cd51a3f..000000000 --- a/src/main/java/fi/dy/masa/minihud/mixin/MixinDebugInfoSender.java +++ /dev/null @@ -1,20 +0,0 @@ -package fi.dy.masa.minihud.mixin; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.server.network.DebugInfoSender; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import fi.dy.masa.minihud.util.DebugInfoUtils; - -@Mixin(DebugInfoSender.class) -public abstract class MixinDebugInfoSender -{ - @Inject(method = "sendNeighborUpdate", at = @At("HEAD")) - private static void onSendNeighborUpdate(World world, BlockPos pos, CallbackInfo ci) - { - DebugInfoUtils.onNeighborUpdate(world, pos); - } -} diff --git a/src/main/java/fi/dy/masa/minihud/mixin/MixinDebugRenderer.java b/src/main/java/fi/dy/masa/minihud/mixin/MixinDebugRenderer.java deleted file mode 100644 index 7d747a30e..000000000 --- a/src/main/java/fi/dy/masa/minihud/mixin/MixinDebugRenderer.java +++ /dev/null @@ -1,25 +0,0 @@ -package fi.dy.masa.minihud.mixin; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.debug.DebugRenderer; -import net.minecraft.client.util.math.MatrixStack; -import fi.dy.masa.minihud.config.Configs; -import fi.dy.masa.minihud.util.DebugInfoUtils; - -@Mixin(DebugRenderer.class) -public abstract class MixinDebugRenderer -{ - @Inject(method = "render", at = @At("RETURN")) - private void renderDebugRenderers(MatrixStack matrixStack, VertexConsumerProvider.Immediate vtx, - double cameraX, double cameraY, double cameraZ, CallbackInfo ci) - { - if (Configs.Generic.MAIN_RENDERING_TOGGLE.getBooleanValue()) - { - DebugInfoUtils.renderVanillaDebug(matrixStack, vtx, cameraX, cameraY, cameraZ); - } - } -} diff --git a/src/main/java/fi/dy/masa/minihud/mixin/MixinItemStack.java b/src/main/java/fi/dy/masa/minihud/mixin/MixinItemStack.java index 6ee83c65b..bc255a74b 100644 --- a/src/main/java/fi/dy/masa/minihud/mixin/MixinItemStack.java +++ b/src/main/java/fi/dy/masa/minihud/mixin/MixinItemStack.java @@ -2,12 +2,7 @@ import java.util.List; import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + import net.minecraft.block.BeehiveBlock; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItem; @@ -16,6 +11,12 @@ import net.minecraft.item.Items; import net.minecraft.item.tooltip.TooltipType; import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + import fi.dy.masa.minihud.config.Configs; import fi.dy.masa.minihud.util.MiscUtils; @@ -25,7 +26,7 @@ public abstract class MixinItemStack @Shadow public abstract Item getItem(); - @Inject(method = "getTooltip", at = @At("RETURN"), locals = LocalCapture.CAPTURE_FAILSOFT) + @Inject(method = "getTooltip", at = @At("RETURN")) private void onGetTooltip(Item.TooltipContext context, @Nullable PlayerEntity player, TooltipType type, CallbackInfoReturnable> cir) { List list = cir.getReturnValue(); diff --git a/src/main/java/fi/dy/masa/minihud/mixin/MixinMinecraftServer.java b/src/main/java/fi/dy/masa/minihud/mixin/MixinMinecraftServer.java index 5b1b47983..40d9828a4 100644 --- a/src/main/java/fi/dy/masa/minihud/mixin/MixinMinecraftServer.java +++ b/src/main/java/fi/dy/masa/minihud/mixin/MixinMinecraftServer.java @@ -1,17 +1,17 @@ package fi.dy.masa.minihud.mixin; import java.util.function.BooleanSupplier; +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.WorldGenerationProgressListener; +import net.minecraft.util.math.BlockPos; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.WorldGenerationProgressListener; -import net.minecraft.server.world.ServerChunkManager; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import fi.dy.masa.minihud.util.DataStorage; + +import fi.dy.masa.minihud.data.HudDataManager; import fi.dy.masa.minihud.util.DebugInfoUtils; @Mixin(MinecraftServer.class) @@ -24,12 +24,12 @@ public void onServerTickPost(BooleanSupplier supplier, CallbackInfo ci) } @Inject(method = "prepareStartRegion", at = @At(value = "INVOKE", - target = "Lnet/minecraft/util/math/MathHelper;square(I)I", shift = At.Shift.BEFORE), - locals = LocalCapture.CAPTURE_FAILHARD) + target = "Lnet/minecraft/util/math/MathHelper;square(I)I", shift = At.Shift.BEFORE) + ) private void onPrepareStartRegion(WorldGenerationProgressListener worldGenerationProgressListener, CallbackInfo ci, - ServerWorld serverWorld, BlockPos blockPos, ServerChunkManager serverChunkManager, int i) + @Local BlockPos blockPos, @Local int i) { - DataStorage.getInstance().setWorldSpawn(blockPos); - DataStorage.getInstance().setSpawnChunkRadius(i, true); + HudDataManager.getInstance().setWorldSpawn(blockPos); + HudDataManager.getInstance().setSpawnChunkRadius(i, true); } } diff --git a/src/main/java/fi/dy/masa/minihud/mixin/MixinResourcePackSendS2CPacket.java b/src/main/java/fi/dy/masa/minihud/mixin/MixinResourcePackSendS2CPacket.java new file mode 100644 index 000000000..35805cd91 --- /dev/null +++ b/src/main/java/fi/dy/masa/minihud/mixin/MixinResourcePackSendS2CPacket.java @@ -0,0 +1,19 @@ +package fi.dy.masa.minihud.mixin; + +import net.minecraft.network.packet.s2c.common.ResourcePackSendS2CPacket; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(value = ResourcePackSendS2CPacket.class) +public class MixinResourcePackSendS2CPacket +{ + /* + @Mutable + @Shadow @Final private Optional prompt; + + @Inject(method = "", at = @At("TAIL")) + private void minihud_fixNull(UUID uUID, String string, String string2, boolean bl, Optional optional, CallbackInfo ci) + { + this.prompt = optional == null ? Optional.empty() : optional; + } + */ +} diff --git a/src/main/java/fi/dy/masa/minihud/mixin/MixinServerWorld.java b/src/main/java/fi/dy/masa/minihud/mixin/MixinServerWorld.java index d20feda22..ef92f2de5 100644 --- a/src/main/java/fi/dy/masa/minihud/mixin/MixinServerWorld.java +++ b/src/main/java/fi/dy/masa/minihud/mixin/MixinServerWorld.java @@ -2,14 +2,15 @@ import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import fi.dy.masa.minihud.util.DataStorage; + +import fi.dy.masa.minihud.data.HudDataManager; @Mixin(ServerWorld.class) public class MixinServerWorld @@ -19,16 +20,16 @@ public class MixinServerWorld @Inject(method = "setSpawnPos", at = @At("TAIL")) private void minihud_checkSpawnPos(BlockPos pos, float angle, CallbackInfo ci) { - DataStorage.getInstance().setWorldSpawn(pos); - DataStorage.getInstance().setSpawnChunkRadius(this.spawnChunkRadius - 1, true); + HudDataManager.getInstance().setWorldSpawn(pos); + HudDataManager.getInstance().setSpawnChunkRadius(this.spawnChunkRadius - 1, true); } @Inject(method = "tickWeather()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/ServerWorldProperties;setRaining(Z)V")) - private void minihud_onTickWeather(CallbackInfo ci, + private void servux_onTickWeather(CallbackInfo ci, @Local(ordinal = 0) int i, @Local(ordinal = 1) int j, @Local(ordinal = 2) int k, @Local(ordinal = 1) boolean bl2) { - DataStorage.getInstance().onServerWeatherTick(i, bl2 ? j : k, bl2); + HudDataManager.getInstance().onServerWeatherTick(i, bl2 ? j : k, bl2); } } diff --git a/src/main/java/fi/dy/masa/minihud/mixin/debug/IMixinDebugRenderer.java b/src/main/java/fi/dy/masa/minihud/mixin/debug/IMixinDebugRenderer.java new file mode 100644 index 000000000..c9b836aff --- /dev/null +++ b/src/main/java/fi/dy/masa/minihud/mixin/debug/IMixinDebugRenderer.java @@ -0,0 +1,15 @@ +package fi.dy.masa.minihud.mixin.debug; + +import net.minecraft.client.render.debug.DebugRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(value = DebugRenderer.class) +public interface IMixinDebugRenderer +{ + @Accessor("showChunkBorder") + boolean minihud_getShowChunkBorder(); + + @Accessor("showOctree") + boolean minihud_getShowOctree(); +} diff --git a/src/main/java/fi/dy/masa/minihud/mixin/debug/IMixinMobEntity.java b/src/main/java/fi/dy/masa/minihud/mixin/debug/IMixinMobEntity.java new file mode 100644 index 000000000..487a7ae38 --- /dev/null +++ b/src/main/java/fi/dy/masa/minihud/mixin/debug/IMixinMobEntity.java @@ -0,0 +1,13 @@ +package fi.dy.masa.minihud.mixin.debug; + +import net.minecraft.entity.ai.goal.GoalSelector; +import net.minecraft.entity.mob.MobEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(MobEntity.class) +public interface IMixinMobEntity +{ + @Accessor("goalSelector") + GoalSelector minihud_getGoalSelector(); +} diff --git a/src/main/java/fi/dy/masa/minihud/mixin/MixinBlockOutlineDebugRenderer.java b/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinBlockOutlineDebugRenderer.java similarity index 73% rename from src/main/java/fi/dy/masa/minihud/mixin/MixinBlockOutlineDebugRenderer.java rename to src/main/java/fi/dy/masa/minihud/mixin/debug/MixinBlockOutlineDebugRenderer.java index 0e0f74117..b670ae961 100644 --- a/src/main/java/fi/dy/masa/minihud/mixin/MixinBlockOutlineDebugRenderer.java +++ b/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinBlockOutlineDebugRenderer.java @@ -1,18 +1,19 @@ -package fi.dy.masa.minihud.mixin; +package fi.dy.masa.minihud.mixin.debug; +import net.minecraft.client.render.debug.BlockOutlineDebugRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import fi.dy.masa.minihud.event.RenderHandler; -import net.minecraft.client.render.debug.BlockOutlineDebugRenderer; -@Mixin(BlockOutlineDebugRenderer.class) +//@Mixin(BlockOutlineDebugRenderer.class) public abstract class MixinBlockOutlineDebugRenderer { + /* @Inject(method = "render", at = @At("HEAD")) public void fixDebugRendererState(CallbackInfo ci) { - RenderHandler.fixDebugRendererState(); + //RenderHandler.fixDebugRendererState(); } + */ } diff --git a/src/main/java/fi/dy/masa/minihud/mixin/MixinCollisionDebugRenderer.java b/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinCollisionDebugRenderer.java similarity index 87% rename from src/main/java/fi/dy/masa/minihud/mixin/MixinCollisionDebugRenderer.java rename to src/main/java/fi/dy/masa/minihud/mixin/debug/MixinCollisionDebugRenderer.java index 90414b767..f816fef89 100644 --- a/src/main/java/fi/dy/masa/minihud/mixin/MixinCollisionDebugRenderer.java +++ b/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinCollisionDebugRenderer.java @@ -1,4 +1,4 @@ -package fi.dy.masa.minihud.mixin; +package fi.dy.masa.minihud.mixin.debug; //@Mixin(CollisionDebugRenderer.class) public abstract class MixinCollisionDebugRenderer diff --git a/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinDebugInfoSender.java b/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinDebugInfoSender.java new file mode 100644 index 000000000..2483f4647 --- /dev/null +++ b/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinDebugInfoSender.java @@ -0,0 +1,156 @@ +package fi.dy.masa.minihud.mixin.debug; + +import java.util.Collection; + +import javax.annotation.Nullable; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.ai.goal.GoalSelector; +import net.minecraft.entity.ai.pathing.Path; +import net.minecraft.entity.mob.BreezeEntity; +import net.minecraft.entity.mob.MobEntity; +import net.minecraft.entity.passive.BeeEntity; +import net.minecraft.network.packet.s2c.custom.DebugRedstoneUpdateOrderCustomPayload; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.server.network.DebugInfoSender; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.structure.StructureStart; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.village.raid.Raid; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.World; +import net.minecraft.world.event.GameEvent; +import net.minecraft.world.event.listener.GameEventListener; + +import fi.dy.masa.minihud.data.DebugDataManager; +import fi.dy.masa.minihud.util.DebugInfoUtils; + +@Mixin(value = DebugInfoSender.class) +public abstract class MixinDebugInfoSender +{ + @Inject(method = "sendChunkWatchingChange", at = @At("HEAD")) + private static void servux_onChunkWatchingChange(ServerWorld world, ChunkPos pos, CallbackInfo ci) + { + DebugDataManager.getInstance().sendChunkWatchingChange(world, pos); + } + + @Inject(method = "sendPoiAddition", at = @At("HEAD")) + private static void servux_onSendPoiAddition(ServerWorld world, BlockPos pos, CallbackInfo ci) + { + DebugDataManager.getInstance().sendPoiAdditions(world, pos); + } + + @Inject(method = "sendPoiRemoval", at = @At("HEAD")) + private static void servux_onSendPoiRemoval(ServerWorld world, BlockPos pos, CallbackInfo ci) + { + DebugDataManager.getInstance().sendPoiRemoval(world, pos); + } + + @Inject(method = "sendPointOfInterest", at = @At("HEAD")) + private static void servux_onSendPointOfInterest(ServerWorld world, BlockPos pos, CallbackInfo ci) + { + DebugDataManager.getInstance().sendPointOfInterest(world, pos); + } + + @Inject(method = "sendPoi", at = @At("HEAD")) + private static void servux_onSendPoi(ServerWorld world, BlockPos pos, CallbackInfo ci) + { + DebugDataManager.getInstance().sendPoi(world, pos); + } + + //FIXME (CustomPayload Error) + @Inject(method = "sendPathfindingData", at = @At("HEAD")) + private static void servux_onSendPathfindingData(World world, MobEntity mob, @Nullable Path path, float nodeReachProximity, CallbackInfo ci) + { + if (world instanceof ServerWorld serverWorld) + { + DebugDataManager.getInstance().sendPathfindingData(serverWorld, mob, path, nodeReachProximity); + } + } + + @Inject(method = "sendRedstoneUpdateOrder", at = @At("HEAD")) + private static void servux_onSendRedstoneUpdateOrder(World world, DebugRedstoneUpdateOrderCustomPayload payload, CallbackInfo ci) + { + // NO-OP + } + + @Inject(method = "sendNeighborUpdate", at = @At("HEAD")) + private static void onSendNeighborUpdate(World world, BlockPos pos, CallbackInfo ci) + { + DebugInfoUtils.onNeighborUpdate(world, pos); + } + + @Inject(method = "sendStructureStart", at = @At("HEAD")) + private static void servux_onSendStructureStart(StructureWorldAccess world, StructureStart structureStart, CallbackInfo ci) + { + DebugDataManager.getInstance().sendStructureStart(world, structureStart); + } + + @Inject(method = "sendGoalSelector", at = @At("HEAD")) + private static void servux_onSendGoalSelector(World world, MobEntity mob, GoalSelector goalSelector, CallbackInfo ci) + { + if (world instanceof ServerWorld serverWorld) + { + DebugDataManager.getInstance().sendGoalSelector(serverWorld, mob, goalSelector); + } + } + + @Inject(method = "sendRaids", at = @At("HEAD")) + private static void servux_onSendRaids(ServerWorld server, Collection raids, CallbackInfo ci) + { + DebugDataManager.getInstance().sendRaids(server, raids); + } + + //FIXME (CustomPayload Error) + @Inject(method = "sendBrainDebugData", at = @At("HEAD")) + private static void servux_onSendBrainDebugData(LivingEntity living, CallbackInfo ci) + { + if (living.getWorld() instanceof ServerWorld world) + { + DebugDataManager.getInstance().sendBrainDebugData(world, living); + } + } + + //FIXME (CustomPayload Error) + @Inject(method = "sendBeeDebugData", at = @At("HEAD")) + private static void servux_onSendBeeDebugData(BeeEntity bee, CallbackInfo ci) + { + if (bee.getWorld() instanceof ServerWorld world) + { + DebugDataManager.getInstance().sendBeeDebugData(world, bee); + } + } + + @Inject(method = "sendBreezeDebugData", at = @At("HEAD")) + private static void servux_onSendBreezeDebugData(BreezeEntity breeze, CallbackInfo ci) + { + if (breeze.getWorld() instanceof ServerWorld world) + { + DebugDataManager.getInstance().sendBreezeDebugData(world, breeze); + } + } + + @Inject(method = "sendGameEvent", at = @At("HEAD")) + private static void servux_onSendGameEvent(World world, RegistryEntry event, Vec3d pos, CallbackInfo ci) + { + if (world instanceof ServerWorld serverWorld) + { + DebugDataManager.getInstance().sendGameEvent(serverWorld, event, pos); + } + } + + @Inject(method = "sendGameEventListener", at = @At("HEAD")) + private static void servux_onSendGameEventListener(World world, GameEventListener eventListener, CallbackInfo ci) + { + if (world instanceof ServerWorld serverWorld) + { + DebugDataManager.getInstance().sendGameEventListener(serverWorld, eventListener); + } + } +} diff --git a/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinDebugRenderer.java b/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinDebugRenderer.java new file mode 100644 index 000000000..76834097a --- /dev/null +++ b/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinDebugRenderer.java @@ -0,0 +1,38 @@ +package fi.dy.masa.minihud.mixin.debug; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.client.render.Frustum; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.debug.DebugRenderer; +import net.minecraft.client.util.math.MatrixStack; +import fi.dy.masa.minihud.config.Configs; +import fi.dy.masa.minihud.util.DebugInfoUtils; + +@Mixin(DebugRenderer.class) +public abstract class MixinDebugRenderer +{ + @Inject(method = "render", at = @At("RETURN")) + private void renderDebugRenderers(MatrixStack matrices, Frustum frustum, VertexConsumerProvider.Immediate immediate, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) + { + if (Configs.Generic.MAIN_RENDERING_TOGGLE.getBooleanValue()) + { + DebugInfoUtils.renderVanillaDebug(matrices, frustum, immediate, cameraX, cameraY, cameraZ); + } + } + + @Inject(method = "toggleShowChunkBorder", at = @At("RETURN")) + private void renderDebugToggleChunkBorders(CallbackInfoReturnable cir) + { + DebugInfoUtils.onToggleVanillaDebugChunkBorder(cir.getReturnValue()); + } + + @Inject(method = "toggleShowOctree", at = @At("RETURN")) + private void renderDebugToggleOctree(CallbackInfoReturnable cir) + { + DebugInfoUtils.onToggleVanillaDebugOctree(cir.getReturnValue()); + } +} diff --git a/src/main/java/fi/dy/masa/minihud/mixin/MixinHeightmapDebugRenderer.java b/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinHeightmapDebugRenderer.java similarity index 73% rename from src/main/java/fi/dy/masa/minihud/mixin/MixinHeightmapDebugRenderer.java rename to src/main/java/fi/dy/masa/minihud/mixin/debug/MixinHeightmapDebugRenderer.java index 804569bdd..54e5dc8c5 100644 --- a/src/main/java/fi/dy/masa/minihud/mixin/MixinHeightmapDebugRenderer.java +++ b/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinHeightmapDebugRenderer.java @@ -1,18 +1,19 @@ -package fi.dy.masa.minihud.mixin; +package fi.dy.masa.minihud.mixin.debug; +import net.minecraft.client.render.debug.HeightmapDebugRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import fi.dy.masa.minihud.event.RenderHandler; -import net.minecraft.client.render.debug.HeightmapDebugRenderer; -@Mixin(HeightmapDebugRenderer.class) +//@Mixin(HeightmapDebugRenderer.class) public abstract class MixinHeightmapDebugRenderer { + /* @Inject(method = "render", at = @At("HEAD")) public void fixDebugRendererState(CallbackInfo ci) { - RenderHandler.fixDebugRendererState(); + //RenderHandler.fixDebugRendererState(); } + */ } diff --git a/src/main/java/fi/dy/masa/minihud/mixin/MixinNeighborUpdateDebugRenderer.java b/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinNeighborUpdateDebugRenderer.java similarity index 72% rename from src/main/java/fi/dy/masa/minihud/mixin/MixinNeighborUpdateDebugRenderer.java rename to src/main/java/fi/dy/masa/minihud/mixin/debug/MixinNeighborUpdateDebugRenderer.java index 469a1a859..521580baf 100644 --- a/src/main/java/fi/dy/masa/minihud/mixin/MixinNeighborUpdateDebugRenderer.java +++ b/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinNeighborUpdateDebugRenderer.java @@ -1,18 +1,19 @@ -package fi.dy.masa.minihud.mixin; +package fi.dy.masa.minihud.mixin.debug; +import net.minecraft.client.render.debug.NeighborUpdateDebugRenderer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import fi.dy.masa.minihud.event.RenderHandler; -import net.minecraft.client.render.debug.NeighborUpdateDebugRenderer; -@Mixin(NeighborUpdateDebugRenderer.class) +//@Mixin(NeighborUpdateDebugRenderer.class) public abstract class MixinNeighborUpdateDebugRenderer { + /* @Inject(method = "render", at = @At("HEAD")) public void fixDebugRendererState(CallbackInfo ci) { - RenderHandler.fixDebugRendererState(); + //RenderHandler.fixDebugRendererState(); } + */ } diff --git a/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinPath.java b/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinPath.java new file mode 100644 index 000000000..126b6b113 --- /dev/null +++ b/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinPath.java @@ -0,0 +1,33 @@ +package fi.dy.masa.minihud.mixin.debug; + +import java.util.List; +import java.util.Set; +import javax.annotation.Nullable; + +import net.minecraft.entity.ai.pathing.Path; +import net.minecraft.entity.ai.pathing.PathNode; +import net.minecraft.entity.ai.pathing.TargetPathNode; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.util.math.BlockPos; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Path.class) +public class MixinPath +{ + @Shadow @Final private List nodes; + @Shadow @Nullable private Path.DebugNodeInfo debugNodeInfos; + @Shadow @Final private BlockPos target; + + @Inject(method = "toBuf", at = @At("HEAD")) + private void minihud_PathfindingFix(PacketByteBuf buf, CallbackInfo ci) + { + this.debugNodeInfos = new Path.DebugNodeInfo(this.nodes.stream().filter((pathNode) -> + !pathNode.visited).toArray(PathNode[]::new), this.nodes.stream().filter((pathNode) -> + pathNode.visited).toArray(PathNode[]::new), Set.of(new TargetPathNode(this.target.getX(), this.target.getY(), this.target.getZ()))); + } +} diff --git a/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinSharedConstants.java b/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinSharedConstants.java new file mode 100644 index 000000000..994d8479c --- /dev/null +++ b/src/main/java/fi/dy/masa/minihud/mixin/debug/MixinSharedConstants.java @@ -0,0 +1,30 @@ +package fi.dy.masa.minihud.mixin.debug; + +import net.minecraft.SharedConstants; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import fi.dy.masa.minihud.config.Configs; + +@Mixin(SharedConstants.class) +public abstract class MixinSharedConstants +{ + @Shadow @Mutable public static boolean isDevelopment; + + public MixinSharedConstants() {} + + /* + @Inject(method = "", at = @At("TAIL")) + private static void minihud_enableDevelopmentMode(CallbackInfo ci) + { + if (Configs.Generic.DEBUG_DEVELOPMENT_MODE.getBooleanValue()) + { + isDevelopment = true; + } + } + */ +} diff --git a/src/main/java/fi/dy/masa/minihud/network/ServuxDebugHandler.java b/src/main/java/fi/dy/masa/minihud/network/ServuxDebugHandler.java new file mode 100644 index 000000000..bb61a2f5e --- /dev/null +++ b/src/main/java/fi/dy/masa/minihud/network/ServuxDebugHandler.java @@ -0,0 +1,137 @@ +package fi.dy.masa.minihud.network; + +import java.util.Objects; + +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.packet.CustomPayload; +import net.minecraft.util.Identifier; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; + +import fi.dy.masa.malilib.network.IClientPayloadData; +import fi.dy.masa.malilib.network.IPluginClientPlayHandler; +import fi.dy.masa.minihud.MiniHUD; +import fi.dy.masa.minihud.data.DebugDataManager; + +@Environment(EnvType.CLIENT) +public abstract class ServuxDebugHandler implements IPluginClientPlayHandler +{ + private static final ServuxDebugHandler INSTANCE = new ServuxDebugHandler<>() { + @Override + public void receive(ServuxDebugPacket.Payload payload, ClientPlayNetworking.Context context) + { + ServuxDebugHandler.INSTANCE.receivePlayPayload(payload, context); + } + }; + public static ServuxDebugHandler getInstance() { return INSTANCE; } + + public static final Identifier CHANNEL_ID = Identifier.of("servux", "debug_service"); + + private boolean servuxRegistered; + private boolean payloadRegistered = false; + private int failures = 0; + private static final int MAX_FAILURES = 4; + //private long readingSessionKey = -1; + + @Override + public Identifier getPayloadChannel() { return CHANNEL_ID; } + + @Override + public boolean isPlayRegistered(Identifier channel) + { + if (channel.equals(CHANNEL_ID)) + { + return this.payloadRegistered; + } + + return false; + } + + @Override + public void setPlayRegistered(Identifier channel) + { + if (channel.equals(CHANNEL_ID)) + { + this.payloadRegistered = true; + } + } + + @Override + public

void decodeClientData(Identifier channel, P data) + { + ServuxDebugPacket packet = (ServuxDebugPacket) data; + + if (!channel.equals(CHANNEL_ID) || packet == null) + { + return; + } + if (Objects.requireNonNull(packet.getType()) == ServuxDebugPacket.Type.PACKET_S2C_METADATA) + { + if (DebugDataManager.getInstance().receiveMetadata(packet.getCompound())) + { + this.servuxRegistered = true; + } + } + else + { + MiniHUD.logger.warn("ServuxDebugHandler#decodeClientData(): received unhandled packetType {} of size {} bytes.", packet.getPacketType(), packet.getTotalSize()); + } + } + + @Override + public void reset(Identifier channel) + { + if (channel.equals(CHANNEL_ID) && this.servuxRegistered) + { + this.servuxRegistered = false; + this.failures = 0; + //this.readingSessionKey = -1; + } + } + + public void resetFailures(Identifier channel) + { + if (channel.equals(CHANNEL_ID) && this.failures > 0) + { + this.failures = 0; + } + } + + @Override + public void encodeWithSplitter(PacketByteBuf buf, ClientPlayNetworkHandler handler) + { + // NO-OP + } + + @Override + public void receivePlayPayload(T payload, ClientPlayNetworking.Context ctx) + { + if (payload.getId().id().equals(CHANNEL_ID)) + { + ServuxDebugHandler.INSTANCE.decodeClientData(CHANNEL_ID, ((ServuxDebugPacket.Payload) payload).data()); + } + } + + @Override + public

void encodeClientData(P data) + { + ServuxDebugPacket packet = (ServuxDebugPacket) data; + + if (!ServuxDebugHandler.INSTANCE.sendPlayPayload(new ServuxDebugPacket.Payload(packet))) + { + if (this.failures > MAX_FAILURES) + { + MiniHUD.printDebug("encodeClientData(): encountered [{}] sendPayload failures, cancelling any Servux join attempt(s)", MAX_FAILURES); + this.servuxRegistered = false; + ServuxDebugHandler.INSTANCE.unregisterPlayReceiver(); + DebugDataManager.getInstance().onPacketFailure(); + } + else + { + this.failures++; + } + } + } +} diff --git a/src/main/java/fi/dy/masa/minihud/network/ServuxDebugPacket.java b/src/main/java/fi/dy/masa/minihud/network/ServuxDebugPacket.java new file mode 100644 index 000000000..17d542a5b --- /dev/null +++ b/src/main/java/fi/dy/masa/minihud/network/ServuxDebugPacket.java @@ -0,0 +1,352 @@ +package fi.dy.masa.minihud.network; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import io.netty.buffer.Unpooled; + +import net.minecraft.nbt.NbtCompound; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.packet.CustomPayload; + +import fi.dy.masa.malilib.network.IClientPayloadData; +import fi.dy.masa.minihud.MiniHUD; + +public class ServuxDebugPacket implements IClientPayloadData +{ + private Type packetType; + private NbtCompound nbt; + private PacketByteBuf buffer; + public static final int PROTOCOL_VERSION = 1; + + private ServuxDebugPacket(Type type) + { + this.packetType = type; + this.nbt = new NbtCompound(); + this.clearPacket(); + } + + public static ServuxDebugPacket MetadataRequest(@Nullable NbtCompound nbt) + { + var packet = new ServuxDebugPacket(Type.PACKET_C2S_METADATA_REQUEST); + if (nbt != null) + { + packet.nbt.copyFrom(nbt); + } + return packet; + } + + public static ServuxDebugPacket MetadataResponse(@Nullable NbtCompound nbt) + { + var packet = new ServuxDebugPacket(Type.PACKET_S2C_METADATA); + if (nbt != null) + { + packet.nbt.copyFrom(nbt); + } + return packet; + } + + public static ServuxDebugPacket MetadataConfirm(@Nullable NbtCompound nbt) + { + var packet = new ServuxDebugPacket(Type.PACKET_C2S_METADATA_CONFIRM); + if (nbt != null) + { + packet.nbt.copyFrom(nbt); + } + return packet; + } + + public static ServuxDebugPacket DebugServiceRegister(@Nullable NbtCompound nbt) + { + var packet = new ServuxDebugPacket(Type.PACKET_C2S_DEBUG_SERVICE_REGISTER); + if (nbt != null) + { + packet.nbt.copyFrom(nbt); + } + return packet; + } + + public static ServuxDebugPacket DebugServiceUnregister(@Nullable NbtCompound nbt) + { + var packet = new ServuxDebugPacket(Type.PACKET_C2S_DEBUG_SERVICE_UNREGISTER); + if (nbt != null) + { + packet.nbt.copyFrom(nbt); + } + return packet; + } + + // Nbt Packet, using Packet Splitter + public static ServuxDebugPacket ResponseS2CStart(@Nonnull NbtCompound nbt) + { + var packet = new ServuxDebugPacket(Type.PACKET_S2C_NBT_RESPONSE_START); + packet.nbt.copyFrom(nbt); + return packet; + } + + public static ServuxDebugPacket ResponseS2CData(@Nonnull PacketByteBuf buffer) + { + var packet = new ServuxDebugPacket(Type.PACKET_S2C_NBT_RESPONSE_DATA); + packet.buffer = buffer; + packet.nbt = new NbtCompound(); + return packet; + } + + private void clearPacket() + { + if (this.buffer != null) + { + this.buffer.clear(); + this.buffer = new PacketByteBuf(Unpooled.buffer()); + } + } + + @Override + public int getVersion() + { + return PROTOCOL_VERSION; + } + + @Override + public int getPacketType() + { + return this.packetType.get(); + } + + @Override + public int getTotalSize() + { + int total = 2; + + if (this.nbt != null && !this.nbt.isEmpty()) + { + total += this.nbt.getSizeInBytes(); + } + if (this.buffer != null) + { + total += this.buffer.readableBytes(); + } + + return total; + } + + public Type getType() + { + return this.packetType; + } + + public NbtCompound getCompound() + { + return this.nbt; + } + + public PacketByteBuf getBuffer() + { + return this.buffer; + } + + public boolean hasBuffer() { return this.buffer != null && this.buffer.isReadable(); } + + public boolean hasNbt() { return this.nbt != null && !this.nbt.isEmpty(); } + + @Override + public boolean isEmpty() + { + return !this.hasBuffer() && !this.hasNbt(); + } + + @Override + public void toPacket(PacketByteBuf output) + { + output.writeVarInt(this.packetType.get()); + + switch (this.packetType) + { + case PACKET_S2C_NBT_RESPONSE_DATA -> + { + // Write Packet Buffer (Slice) + try + { + output.writeBytes(this.buffer.readBytes(this.buffer.readableBytes())); + } + catch (Exception e) + { + MiniHUD.logger.error("ServuxDebugPacket#toPacket: error writing buffer data to packet: [{}]", e.getLocalizedMessage()); + } + } + case PACKET_C2S_METADATA_REQUEST, PACKET_S2C_METADATA, PACKET_C2S_METADATA_CONFIRM, PACKET_C2S_DEBUG_SERVICE_REGISTER, PACKET_C2S_DEBUG_SERVICE_UNREGISTER -> + { + // Write NBT + try + { + output.writeNbt(this.nbt); + } + catch (Exception e) + { + MiniHUD.logger.error("ServuxDebugPacket#toPacket: error writing NBT to packet: [{}]", e.getLocalizedMessage()); + } + } + default -> MiniHUD.logger.error("ServuxDebugPacket#toPacket: Unknown packet type!"); + } + } + + @Nullable + public static ServuxDebugPacket fromPacket(PacketByteBuf input) + { + int i = input.readVarInt(); + Type type = getType(i); + + if (type == null) + { + // Invalid Type + MiniHUD.logger.warn("ServuxDebugPacket#fromPacket: invalid packet type received"); + return null; + } + switch (type) + { + case PACKET_S2C_NBT_RESPONSE_DATA -> + { + // Read Packet Buffer Slice + try + { + return ServuxDebugPacket.ResponseS2CData(new PacketByteBuf(input.readBytes(input.readableBytes()))); + } + catch (Exception e) + { + MiniHUD.logger.error("ServuxDebugPacket#fromPacket: error reading S2C Bulk Response Buffer from packet: [{}]", e.getLocalizedMessage()); + } + } + case PACKET_C2S_METADATA_REQUEST -> + { + // Read Nbt + try + { + return ServuxDebugPacket.MetadataRequest(input.readNbt()); + } + catch (Exception e) + { + MiniHUD.logger.error("ServuxDebugPacket#fromPacket: error reading Metadata Request from packet: [{}]", e.getLocalizedMessage()); + } + } + case PACKET_S2C_METADATA -> + { + // Read Nbt + try + { + return ServuxDebugPacket.MetadataResponse(input.readNbt()); + } + catch (Exception e) + { + MiniHUD.logger.error("ServuxDebugPacket#fromPacket: error reading Metadata Response from packet: [{}]", e.getLocalizedMessage()); + } + } + case PACKET_C2S_METADATA_CONFIRM -> + { + // Read Nbt + try + { + return ServuxDebugPacket.MetadataConfirm(input.readNbt()); + } + catch (Exception e) + { + MiniHUD.logger.error("ServuxDebugPacket#fromPacket: error reading Metadata Confirm from packet: [{}]", e.getLocalizedMessage()); + } + } + case PACKET_C2S_DEBUG_SERVICE_REGISTER -> + { + // Read Nbt + try + { + return ServuxDebugPacket.DebugServiceRegister(input.readNbt()); + } + catch (Exception e) + { + MiniHUD.logger.error("ServuxDebugPacket#fromPacket: error reading Spawn Data Request from packet: [{}]", e.getLocalizedMessage()); + } + } + case PACKET_C2S_DEBUG_SERVICE_UNREGISTER -> + { + // Read Nbt + try + { + return ServuxDebugPacket.DebugServiceUnregister(input.readNbt()); + } + catch (Exception e) + { + MiniHUD.logger.error("ServuxDebugPacket#fromPacket: error reading Spawn Data Response from packet: [{}]", e.getLocalizedMessage()); + } + } + default -> MiniHUD.logger.error("ServuxDebugPacket#fromPacket: Unknown packet type!"); + } + + return null; + } + + @Override + public void clear() + { + if (this.nbt != null && !this.nbt.isEmpty()) + { + this.nbt = new NbtCompound(); + } + this.clearPacket(); + this.packetType = null; + } + + @Nullable + public static Type getType(int input) + { + for (Type type : Type.values()) + { + if (type.get() == input) + { + return type; + } + } + + return null; + } + + public enum Type + { + PACKET_S2C_METADATA(1), + PACKET_C2S_METADATA_REQUEST(2), + PACKET_C2S_METADATA_CONFIRM(3), + PACKET_C2S_DEBUG_SERVICE_REGISTER(4), + PACKET_C2S_DEBUG_SERVICE_UNREGISTER(5), + // For Packet Splitter (Oversize Packets, S2C) + PACKET_S2C_NBT_RESPONSE_START(10), + PACKET_S2C_NBT_RESPONSE_DATA(11); + + private final int type; + + Type(int type) + { + this.type = type; + } + + int get() { return this.type; } + } + + public record Payload(ServuxDebugPacket data) implements CustomPayload + { + public static final Id ID = new Id<>(ServuxDebugHandler.CHANNEL_ID); + public static final PacketCodec CODEC = CustomPayload.codecOf(Payload::write, Payload::new); + + public Payload(PacketByteBuf input) + { + this(fromPacket(input)); + } + + private void write(PacketByteBuf output) + { + data.toPacket(output); + } + + @Override + public Id getId() + { + return ID; + } + } +} diff --git a/src/main/java/fi/dy/masa/minihud/network/ServuxEntitiesHandler.java b/src/main/java/fi/dy/masa/minihud/network/ServuxEntitiesHandler.java index ac1980b3c..8af3a4e1d 100644 --- a/src/main/java/fi/dy/masa/minihud/network/ServuxEntitiesHandler.java +++ b/src/main/java/fi/dy/masa/minihud/network/ServuxEntitiesHandler.java @@ -17,7 +17,7 @@ import fi.dy.masa.malilib.network.IPluginClientPlayHandler; import fi.dy.masa.malilib.network.PacketSplitter; import fi.dy.masa.minihud.MiniHUD; -import fi.dy.masa.minihud.data.EntitiesDataStorage; +import fi.dy.masa.minihud.data.EntitiesDataManager; @Environment(EnvType.CLIENT) public abstract class ServuxEntitiesHandler implements IPluginClientPlayHandler @@ -76,13 +76,13 @@ public

void decodeClientData(Identifier channel, { case PACKET_S2C_METADATA -> { - if (EntitiesDataStorage.getInstance().receiveServuxMetadata(packet.getCompound())) + if (EntitiesDataManager.getInstance().receiveServuxMetadata(packet.getCompound())) { this.servuxRegistered = true; } } - case PACKET_S2C_BLOCK_NBT_RESPONSE_SIMPLE -> EntitiesDataStorage.getInstance().handleBlockEntityData(packet.getPos(), packet.getCompound(), null); - case PACKET_S2C_ENTITY_NBT_RESPONSE_SIMPLE -> EntitiesDataStorage.getInstance().handleEntityData(packet.getEntityId(), packet.getCompound()); + case PACKET_S2C_BLOCK_NBT_RESPONSE_SIMPLE -> EntitiesDataManager.getInstance().handleBlockEntityData(packet.getPos(), packet.getCompound(), null); + case PACKET_S2C_ENTITY_NBT_RESPONSE_SIMPLE -> EntitiesDataManager.getInstance().handleEntityData(packet.getEntityId(), packet.getCompound()); case PACKET_S2C_NBT_RESPONSE_DATA -> { if (this.readingSessionKey == -1) @@ -98,7 +98,7 @@ public

void decodeClientData(Identifier channel, try { this.readingSessionKey = -1; - EntitiesDataStorage.getInstance().handleBulkEntityData(fullPacket.readVarInt(), (NbtCompound) fullPacket.readNbt(NbtSizeTracker.ofUnlimitedBytes())); + EntitiesDataManager.getInstance().handleBulkEntityData(fullPacket.readVarInt(), (NbtCompound) fullPacket.readNbt(NbtSizeTracker.ofUnlimitedBytes())); } catch (Exception e) { @@ -164,7 +164,7 @@ else if (!ServuxEntitiesHandler.INSTANCE.sendPlayPayload(new ServuxEntitiesPacke MiniHUD.printDebug("encodeClientData(): encountered [{}] sendPayload failures, cancelling any Servux join attempt(s)", MAX_FAILURES); this.servuxRegistered = false; ServuxEntitiesHandler.INSTANCE.unregisterPlayReceiver(); - EntitiesDataStorage.getInstance().onPacketFailure(); + EntitiesDataManager.getInstance().onPacketFailure(); } else { diff --git a/src/main/java/fi/dy/masa/minihud/network/ServuxHudHandler.java b/src/main/java/fi/dy/masa/minihud/network/ServuxHudHandler.java new file mode 100644 index 000000000..16889dc01 --- /dev/null +++ b/src/main/java/fi/dy/masa/minihud/network/ServuxHudHandler.java @@ -0,0 +1,171 @@ +package fi.dy.masa.minihud.network; + +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtSizeTracker; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.packet.CustomPayload; +import net.minecraft.util.Identifier; +import net.minecraft.util.Util; +import net.minecraft.util.math.random.Random; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; + +import fi.dy.masa.malilib.network.IClientPayloadData; +import fi.dy.masa.malilib.network.IPluginClientPlayHandler; +import fi.dy.masa.malilib.network.PacketSplitter; +import fi.dy.masa.minihud.MiniHUD; +import fi.dy.masa.minihud.data.HudDataManager; + +@Environment(EnvType.CLIENT) +public abstract class ServuxHudHandler implements IPluginClientPlayHandler +{ + private static final ServuxHudHandler INSTANCE = new ServuxHudHandler<>() { + @Override + public void receive(ServuxHudPacket.Payload payload, ClientPlayNetworking.Context context) + { + ServuxHudHandler.INSTANCE.receivePlayPayload(payload, context); + } + }; + public static ServuxHudHandler getInstance() { return INSTANCE; } + + public static final Identifier CHANNEL_ID = Identifier.of("servux", "hud_metadata"); + + private boolean servuxRegistered; + private boolean payloadRegistered = false; + private int failures = 0; + private static final int MAX_FAILURES = 4; + private long readingSessionKey = -1; + + @Override + public Identifier getPayloadChannel() { return CHANNEL_ID; } + + @Override + public boolean isPlayRegistered(Identifier channel) + { + if (channel.equals(CHANNEL_ID)) + { + return payloadRegistered; + } + + return false; + } + + @Override + public void setPlayRegistered(Identifier channel) + { + if (channel.equals(CHANNEL_ID)) + { + this.payloadRegistered = true; + } + } + + @Override + public

void decodeClientData(Identifier channel, P data) + { + ServuxHudPacket packet = (ServuxHudPacket) data; + + if (!channel.equals(CHANNEL_ID) || packet == null) + { + return; + } + switch (packet.getType()) + { + case PACKET_S2C_METADATA -> + { + if (HudDataManager.getInstance().receiveMetadata(packet.getCompound())) + { + this.servuxRegistered = true; + } + } + case PACKET_S2C_SPAWN_DATA -> + { + HudDataManager.getInstance().receiveSpawnMetadata(packet.getCompound()); + } + case PACKET_S2C_WEATHER_TICK -> + { + HudDataManager.getInstance().receiveWeatherData(packet.getCompound()); + } + case PACKET_S2C_NBT_RESPONSE_DATA -> + { + if (this.readingSessionKey == -1) + { + this.readingSessionKey = Random.create(Util.getMeasuringTimeMs()).nextLong(); + } + + MiniHUD.printDebug("ServuxHudHandler#decodeClientData(): received Entity Data Packet Slice of size {} (in bytes) // reading session key [{}]", packet.getTotalSize(), this.readingSessionKey); + PacketByteBuf fullPacket = PacketSplitter.receive(this, this.readingSessionKey, packet.getBuffer()); + + if (fullPacket != null) + { + try + { + this.readingSessionKey = -1; + HudDataManager.getInstance().receiveRecipeManager((NbtCompound) fullPacket.readNbt(NbtSizeTracker.ofUnlimitedBytes())); + } + catch (Exception e) + { + MiniHUD.logger.error("ServuxHudHandler#decodeClientData(): Entity Data: error reading fullBuffer [{}]", e.getLocalizedMessage()); + } + } + } + default -> MiniHUD.logger.warn("ServuxHudHandler#decodeClientData(): received unhandled packetType {} of size {} bytes.", packet.getPacketType(), packet.getTotalSize()); + } + } + + @Override + public void reset(Identifier channel) + { + if (channel.equals(CHANNEL_ID) && this.servuxRegistered) + { + this.servuxRegistered = false; + this.failures = 0; + this.readingSessionKey = -1; + } + } + + public void resetFailures(Identifier channel) + { + if (channel.equals(CHANNEL_ID) && this.failures > 0) + { + this.failures = 0; + } + } + + @Override + public void encodeWithSplitter(PacketByteBuf buf, ClientPlayNetworkHandler handler) + { + // NO-OP + } + + @Override + public void receivePlayPayload(T payload, ClientPlayNetworking.Context ctx) + { + if (payload.getId().id().equals(CHANNEL_ID)) + { + ServuxHudHandler.INSTANCE.decodeClientData(CHANNEL_ID, ((ServuxHudPacket.Payload) payload).data()); + } + } + + @Override + public

void encodeClientData(P data) + { + ServuxHudPacket packet = (ServuxHudPacket) data; + + if (!ServuxHudHandler.INSTANCE.sendPlayPayload(new ServuxHudPacket.Payload(packet))) + { + if (this.failures > MAX_FAILURES) + { + MiniHUD.printDebug("encodeClientData(): encountered [{}] sendPayload failures, cancelling any Servux join attempt(s)", MAX_FAILURES); + this.servuxRegistered = false; + ServuxHudHandler.INSTANCE.unregisterPlayReceiver(); + HudDataManager.getInstance().onPacketFailure(); + } + else + { + this.failures++; + } + } + } +} diff --git a/src/main/java/fi/dy/masa/minihud/network/ServuxHudPacket.java b/src/main/java/fi/dy/masa/minihud/network/ServuxHudPacket.java new file mode 100644 index 000000000..8f7f258de --- /dev/null +++ b/src/main/java/fi/dy/masa/minihud/network/ServuxHudPacket.java @@ -0,0 +1,375 @@ +package fi.dy.masa.minihud.network; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import io.netty.buffer.Unpooled; + +import net.minecraft.nbt.NbtCompound; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.packet.CustomPayload; + +import fi.dy.masa.malilib.network.IClientPayloadData; +import fi.dy.masa.minihud.MiniHUD; + +public class ServuxHudPacket implements IClientPayloadData +{ + private Type packetType; + private NbtCompound nbt; + private PacketByteBuf buffer; + public static final int PROTOCOL_VERSION = 1; + + private ServuxHudPacket(Type type) + { + this.packetType = type; + this.nbt = new NbtCompound(); + this.clearPacket(); + } + + public static ServuxHudPacket MetadataRequest(@Nullable NbtCompound nbt) + { + var packet = new ServuxHudPacket(Type.PACKET_C2S_METADATA_REQUEST); + if (nbt != null) + { + packet.nbt.copyFrom(nbt); + } + return packet; + } + + public static ServuxHudPacket MetadataResponse(@Nullable NbtCompound nbt) + { + var packet = new ServuxHudPacket(Type.PACKET_S2C_METADATA); + if (nbt != null) + { + packet.nbt.copyFrom(nbt); + } + return packet; + } + + public static ServuxHudPacket SpawnRequest(@Nullable NbtCompound nbt) + { + var packet = new ServuxHudPacket(Type.PACKET_C2S_SPAWN_DATA_REQUEST); + if (nbt != null) + { + packet.nbt.copyFrom(nbt); + } + return packet; + } + + public static ServuxHudPacket SpawnResponse(@Nullable NbtCompound nbt) + { + var packet = new ServuxHudPacket(Type.PACKET_S2C_SPAWN_DATA); + if (nbt != null) + { + packet.nbt.copyFrom(nbt); + } + return packet; + } + + public static ServuxHudPacket WeatherTick(@Nullable NbtCompound nbt) + { + var packet = new ServuxHudPacket(Type.PACKET_S2C_WEATHER_TICK); + if (nbt != null) + { + packet.nbt.copyFrom(nbt); + } + return packet; + } + + public static ServuxHudPacket RecipeManagerRequest(@Nullable NbtCompound nbt) + { + var packet = new ServuxHudPacket(Type.PACKET_C2S_RECIPE_MANAGER_REQUEST); + if (nbt != null) + { + packet.nbt.copyFrom(nbt); + } + return packet; + } + + // Nbt Packet, using Packet Splitter + public static ServuxHudPacket ResponseS2CStart(@Nonnull NbtCompound nbt) + { + var packet = new ServuxHudPacket(Type.PACKET_S2C_NBT_RESPONSE_START); + packet.nbt.copyFrom(nbt); + return packet; + } + + public static ServuxHudPacket ResponseS2CData(@Nonnull PacketByteBuf buffer) + { + var packet = new ServuxHudPacket(Type.PACKET_S2C_NBT_RESPONSE_DATA); + packet.buffer = buffer; + packet.nbt = new NbtCompound(); + return packet; + } + + private void clearPacket() + { + if (this.buffer != null) + { + this.buffer.clear(); + this.buffer = new PacketByteBuf(Unpooled.buffer()); + } + } + + @Override + public int getVersion() + { + return PROTOCOL_VERSION; + } + + @Override + public int getPacketType() + { + return this.packetType.get(); + } + + @Override + public int getTotalSize() + { + int total = 2; + + if (this.nbt != null && !this.nbt.isEmpty()) + { + total += this.nbt.getSizeInBytes(); + } + if (this.buffer != null) + { + total += this.buffer.readableBytes(); + } + + return total; + } + + public Type getType() + { + return this.packetType; + } + + public NbtCompound getCompound() + { + return this.nbt; + } + + public PacketByteBuf getBuffer() + { + return this.buffer; + } + + public boolean hasBuffer() { return this.buffer != null && this.buffer.isReadable(); } + + public boolean hasNbt() { return this.nbt != null && !this.nbt.isEmpty(); } + + @Override + public boolean isEmpty() + { + return !this.hasBuffer() && !this.hasNbt(); + } + + @Override + public void toPacket(PacketByteBuf output) + { + output.writeVarInt(this.packetType.get()); + + switch (this.packetType) + { + case PACKET_S2C_NBT_RESPONSE_DATA -> + { + // Write Packet Buffer (Slice) + try + { + output.writeBytes(this.buffer.readBytes(this.buffer.readableBytes())); + } + catch (Exception e) + { + MiniHUD.logger.error("ServuxHudPacket#toPacket: error writing buffer data to packet: [{}]", e.getLocalizedMessage()); + } + } + case PACKET_C2S_METADATA_REQUEST, PACKET_S2C_METADATA, PACKET_C2S_SPAWN_DATA_REQUEST, PACKET_S2C_SPAWN_DATA, PACKET_S2C_WEATHER_TICK, PACKET_C2S_RECIPE_MANAGER_REQUEST -> + { + // Write NBT + try + { + output.writeNbt(this.nbt); + } + catch (Exception e) + { + MiniHUD.logger.error("ServuxHudPacket#toPacket: error writing NBT to packet: [{}]", e.getLocalizedMessage()); + } + } + default -> MiniHUD.logger.error("ServuxHudPacket#toPacket: Unknown packet type!"); + } + } + + @Nullable + public static ServuxHudPacket fromPacket(PacketByteBuf input) + { + int i = input.readVarInt(); + Type type = getType(i); + + if (type == null) + { + // Invalid Type + MiniHUD.logger.warn("ServuxHudPacket#fromPacket: invalid packet type received"); + return null; + } + switch (type) + { + case PACKET_S2C_NBT_RESPONSE_DATA -> + { + // Read Packet Buffer Slice + try + { + return ServuxHudPacket.ResponseS2CData(new PacketByteBuf(input.readBytes(input.readableBytes()))); + } + catch (Exception e) + { + MiniHUD.logger.error("ServuxHudPacket#fromPacket: error reading S2C Bulk Response Buffer from packet: [{}]", e.getLocalizedMessage()); + } + } + case PACKET_C2S_METADATA_REQUEST -> + { + // Read Nbt + try + { + return ServuxHudPacket.MetadataRequest(input.readNbt()); + } + catch (Exception e) + { + MiniHUD.logger.error("ServuxHudPacket#fromPacket: error reading Metadata Request from packet: [{}]", e.getLocalizedMessage()); + } + } + case PACKET_S2C_METADATA -> + { + // Read Nbt + try + { + return ServuxHudPacket.MetadataResponse(input.readNbt()); + } + catch (Exception e) + { + MiniHUD.logger.error("ServuxHudPacket#fromPacket: error reading Metadata Response from packet: [{}]", e.getLocalizedMessage()); + } + } + case PACKET_C2S_SPAWN_DATA_REQUEST -> + { + // Read Nbt + try + { + return ServuxHudPacket.SpawnRequest(input.readNbt()); + } + catch (Exception e) + { + MiniHUD.logger.error("ServuxHudPacket#fromPacket: error reading Spawn Data Request from packet: [{}]", e.getLocalizedMessage()); + } + } + case PACKET_S2C_SPAWN_DATA -> + { + // Read Nbt + try + { + return ServuxHudPacket.SpawnResponse(input.readNbt()); + } + catch (Exception e) + { + MiniHUD.logger.error("ServuxHudPacket#fromPacket: error reading Spawn Data Response from packet: [{}]", e.getLocalizedMessage()); + } + } + case PACKET_S2C_WEATHER_TICK -> + { + // Read Nbt + try + { + return ServuxHudPacket.WeatherTick(input.readNbt()); + } + catch (Exception e) + { + MiniHUD.logger.error("ServuxHudPacket#fromPacket: error reading Weather Tick from packet: [{}]", e.getLocalizedMessage()); + } + } + case PACKET_C2S_RECIPE_MANAGER_REQUEST -> + { + // Read Nbt + try + { + return ServuxHudPacket.RecipeManagerRequest(input.readNbt()); + } + catch (Exception e) + { + MiniHUD.logger.error("ServuxHudPacket#fromPacket: error reading Recipe Request from packet: [{}]", e.getLocalizedMessage()); + } + } + default -> MiniHUD.logger.error("ServuxHudPacket#fromPacket: Unknown packet type!"); + } + + return null; + } + + @Override + public void clear() + { + if (this.nbt != null && !this.nbt.isEmpty()) + { + this.nbt = new NbtCompound(); + } + this.clearPacket(); + this.packetType = null; + } + + @Nullable + public static Type getType(int input) + { + for (Type type : Type.values()) + { + if (type.get() == input) + { + return type; + } + } + + return null; + } + + public enum Type + { + PACKET_S2C_METADATA(1), + PACKET_C2S_METADATA_REQUEST(2), + PACKET_S2C_SPAWN_DATA(3), + PACKET_C2S_SPAWN_DATA_REQUEST(4), + PACKET_S2C_WEATHER_TICK(5), + PACKET_C2S_RECIPE_MANAGER_REQUEST(6), + // For Packet Splitter (Oversize Packets, S2C) + PACKET_S2C_NBT_RESPONSE_START(10), + PACKET_S2C_NBT_RESPONSE_DATA(11); + + private final int type; + + Type(int type) + { + this.type = type; + } + + int get() { return this.type; } + } + + public record Payload(ServuxHudPacket data) implements CustomPayload + { + public static final Id ID = new Id<>(ServuxHudHandler.CHANNEL_ID); + public static final PacketCodec CODEC = CustomPayload.codecOf(Payload::write, Payload::new); + + public Payload(PacketByteBuf input) + { + this(fromPacket(input)); + } + + private void write(PacketByteBuf output) + { + data.toPacket(output); + } + + @Override + public Id getId() + { + return ID; + } + } +} diff --git a/src/main/java/fi/dy/masa/minihud/network/ServuxStructuresHandler.java b/src/main/java/fi/dy/masa/minihud/network/ServuxStructuresHandler.java index ca3f81ee2..8a524cc55 100644 --- a/src/main/java/fi/dy/masa/minihud/network/ServuxStructuresHandler.java +++ b/src/main/java/fi/dy/masa/minihud/network/ServuxStructuresHandler.java @@ -16,6 +16,7 @@ import fi.dy.masa.malilib.network.PacketSplitter; import fi.dy.masa.malilib.util.Constants; import fi.dy.masa.minihud.MiniHUD; +import fi.dy.masa.minihud.data.HudDataManager; import fi.dy.masa.minihud.util.DataStorage; @Environment(EnvType.CLIENT) @@ -111,8 +112,9 @@ public void decodeStructuresPacket(Identifier channel, ServuxStructuresPacket pa this.servuxRegistered = true; } } - case PACKET_S2C_SPAWN_METADATA -> DataStorage.getInstance().receiveSpawnMetadata(packet.getCompound()); - case PACKET_S2C_WEATHER_DATA -> DataStorage.getInstance().receiveWeatherData(packet.getCompound()); + // For backwards compat + case PACKET_S2C_SPAWN_METADATA -> HudDataManager.getInstance().receiveSpawnMetadata(packet.getCompound()); + case PACKET_S2C_WEATHER_DATA -> HudDataManager.getInstance().receiveWeatherData(packet.getCompound()); default -> MiniHUD.logger.warn("decodeStructuresPacket(): received unhandled packetType {} of size {} bytes.", packet.getPacketType(), packet.getTotalSize()); } } diff --git a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRenderer.java b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRenderer.java index 548f08646..7c0d47da1 100644 --- a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRenderer.java +++ b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRenderer.java @@ -1,14 +1,18 @@ package fi.dy.masa.minihud.renderer; -import com.mojang.blaze3d.systems.RenderSystem; import org.joml.Matrix4f; + +import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.block.Blocks; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gl.ShaderProgramKeys; import net.minecraft.client.render.*; import net.minecraft.entity.Entity; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.util.math.Vec3d; +import net.minecraft.util.profiler.Profiler; + import fi.dy.masa.malilib.util.Color4f; import fi.dy.masa.malilib.util.EntityUtils; import fi.dy.masa.minihud.config.RendererToggle; @@ -24,7 +28,7 @@ public static void resetRenderTimeout() loginTime = System.currentTimeMillis(); } - public static void renderOverlays(Matrix4f matrix4f, Matrix4f projMatrix, MinecraftClient mc) + public static void renderOverlays(Matrix4f matrix4f, Matrix4f projMatrix, MinecraftClient mc, Frustum frustum, Camera camera, Fog fog, Profiler profiler) { Entity entity = EntityUtils.getCameraEntity(); @@ -50,12 +54,12 @@ public static void renderOverlays(Matrix4f matrix4f, Matrix4f projMatrix, Minecr if (RendererToggle.OVERLAY_BEACON_RANGE.getBooleanValue()) { - mc.getProfiler().push(() -> "BeaconRangeHeldItem"); + profiler.push(() -> "BeaconRangeHeldItem"); renderBeaconBoxForPlayerIfHoldingItem(entity, mc); - mc.getProfiler().pop(); + profiler.pop(); } - RenderContainer.INSTANCE.render(entity, matrix4f, projMatrix, mc); + RenderContainer.INSTANCE.render(entity, matrix4f, projMatrix, mc, camera, profiler); } @@ -106,8 +110,9 @@ private static void renderBeaconBoxForPlayer(Entity entity, MinecraftClient mc) BufferBuilder buffer = tessellator.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR); BuiltBuffer builtBuffer; - RenderSystem.setShader(GameRenderer::getPositionColorProgram); - RenderSystem.applyModelViewMatrix(); + RenderSystem.setShader(ShaderProgramKeys.POSITION_COLOR); + //RenderSystem.setShader(GameRenderer::getPositionColorProgram); + //RenderSystem.applyModelViewMatrix(); fi.dy.masa.malilib.render.RenderUtils.drawBoxAllSidesBatchedQuads(minX, minY, minZ, maxX, maxY, maxZ, Color4f.fromColor(color, 0.3f), buffer); diff --git a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererBase.java b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererBase.java index d388f90cd..abfb17f24 100644 --- a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererBase.java +++ b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererBase.java @@ -2,13 +2,17 @@ import java.util.ArrayList; import java.util.List; -import java.util.function.Supplier; import javax.annotation.Nullable; import com.google.gson.JsonObject; -import com.mojang.blaze3d.systems.RenderSystem; import org.joml.Matrix4f; -import net.minecraft.client.gl.ShaderProgram; -import net.minecraft.client.render.*; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.gl.ShaderProgramKey; +import net.minecraft.client.gl.ShaderProgramKeys; +import net.minecraft.client.render.BufferBuilder; +import net.minecraft.client.render.Tessellator; +import net.minecraft.client.render.VertexFormat; +import net.minecraft.client.render.VertexFormats; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -100,7 +104,8 @@ public void deleteGlResources() */ protected RenderObjectBase allocateBuffer(VertexFormat.DrawMode glMode) { - return this.allocateBuffer(glMode, VertexFormats.POSITION_COLOR, GameRenderer::getPositionColorProgram); + //return this.allocateBuffer(glMode, VertexFormats.POSITION_COLOR, GameRenderer::getPositionColorProgram); + return this.allocateBuffer(glMode, VertexFormats.POSITION_COLOR, ShaderProgramKeys.POSITION_COLOR); } /** @@ -108,7 +113,7 @@ protected RenderObjectBase allocateBuffer(VertexFormat.DrawMode glMode) * @param glMode * @return */ - protected RenderObjectBase allocateBuffer(VertexFormat.DrawMode glMode, VertexFormat format, Supplier shader) + protected RenderObjectBase allocateBuffer(VertexFormat.DrawMode glMode, VertexFormat format, ShaderProgramKey shader) { RenderObjectBase obj = new RenderObjectVbo(glMode, format, shader); this.renderObjects.add(obj); diff --git a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererBiomeBorders.java b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererBiomeBorders.java index 4bdf6a92f..bf80fef5e 100644 --- a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererBiomeBorders.java +++ b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererBiomeBorders.java @@ -10,23 +10,22 @@ import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; + import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.VertexFormats; import net.minecraft.entity.Entity; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vec3i; +import net.minecraft.util.math.*; import net.minecraft.world.World; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.BiomeAccess; import net.minecraft.world.chunk.ChunkStatus; import net.minecraft.world.chunk.WorldChunk; + import fi.dy.masa.malilib.util.Color4f; import fi.dy.masa.malilib.util.SubChunkPos; import fi.dy.masa.minihud.MiniHUD; @@ -159,7 +158,7 @@ protected List getSubChunksWithinRange(Entity cameraEntity, Minecra int chunkY = MathHelper.floor(cameraEntity.getY()) >> 4; int chunkZ = MathHelper.floor(cameraEntity.getZ()) >> 4; int minCY = Math.max(world.getBottomY() >> 4, chunkY - viewDistanceVertical); - int maxCY = Math.min((world.getTopY() - 1) >> 4, chunkY + viewDistanceVertical); + int maxCY = Math.min((world.getTopYInclusive()) >> 4, chunkY + viewDistanceVertical); List chunks = new ArrayList<>(); for (int cz = chunkZ - viewDistance; cz <= chunkZ + viewDistance; ++cz) @@ -551,7 +550,7 @@ private void createBiomeMapping(World world) } else { - final Registry registry = world.getRegistryManager().get(RegistryKeys.BIOME); + final Registry registry = world.getRegistryManager().getOrThrow(RegistryKeys.BIOME); int count = 0; int maxId = 0; @@ -696,11 +695,11 @@ private void assignColor(String biomeId, int color, ColorSetter setter, Registry { try { - Optional optional = registry.getOrEmpty(Identifier.tryParse(biomeId)); + Optional> optional = registry.getEntry(Identifier.tryParse(biomeId)); if (optional.isPresent()) { - int id = this.biomeMapping.getInt(optional.get()); + int id = this.biomeMapping.getInt(optional.get().value()); if (id >= 0) { diff --git a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererConduitRange.java b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererConduitRange.java index 3f4853747..cec4297c4 100644 --- a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererConduitRange.java +++ b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererConduitRange.java @@ -80,7 +80,7 @@ protected void renderBlockRange(World world, BlockPos pos, ConduitBlockEntity be return; } - int range = ((ConduitExtra) be).getStoredActivatingBlockCount() / 7 * 16; + int range = ((ConduitExtra) be).minihud$getStoredActivatingBlockCount() / 7 * 16; Color4f color = Configs.Colors.CONDUIT_RANGE_OVERLAY_COLOR.getColor(); LongOpenHashSet positions = new LongOpenHashSet(); diff --git a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererLightLevel.java b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererLightLevel.java index abe41654d..e7a3f5d6b 100644 --- a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererLightLevel.java +++ b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererLightLevel.java @@ -2,11 +2,12 @@ import java.util.ArrayList; import java.util.List; + import net.minecraft.block.BlockState; import net.minecraft.block.FluidBlock; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gl.ShaderProgramKeys; import net.minecraft.client.render.BufferBuilder; -import net.minecraft.client.render.GameRenderer; import net.minecraft.client.render.VertexFormat; import net.minecraft.client.render.VertexFormats; import net.minecraft.entity.Entity; @@ -25,6 +26,7 @@ import net.minecraft.world.chunk.ChunkSection; import net.minecraft.world.chunk.WorldChunk; import net.minecraft.world.chunk.light.LightingProvider; + import fi.dy.masa.malilib.config.IConfigDouble; import fi.dy.masa.malilib.config.options.ConfigColor; import fi.dy.masa.malilib.gui.Message; @@ -155,8 +157,8 @@ protected void preRender() @Override public void allocateGlResources() { - this.allocateBuffer(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_TEXTURE_COLOR, GameRenderer::getPositionTexColorProgram); - this.allocateBuffer(VertexFormat.DrawMode.DEBUG_LINES, VertexFormats.POSITION_COLOR, GameRenderer::getPositionColorProgram); + this.allocateBuffer(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_TEXTURE_COLOR, ShaderProgramKeys.POSITION_TEX_COLOR); + this.allocateBuffer(VertexFormat.DrawMode.DEBUG_LINES, VertexFormats.POSITION_COLOR, ShaderProgramKeys.POSITION_COLOR); } private void renderLightLevels(Vec3d cameraPos, MinecraftClient mc) @@ -429,7 +431,7 @@ private boolean updateLightLevels(World world, BlockPos center) final int maxCZ = (maxZ >> 4); LightingProvider lightingProvider = world.getChunkManager().getLightingProvider(); BlockPos.Mutable mutablePos = new BlockPos.Mutable(); - final int worldTopHeight = world.getTopY(); + final int worldTopHeight = world.getTopYInclusive() + 1; final boolean collisionCheck = Configs.Generic.LIGHT_LEVEL_COLLISION_CHECK.getBooleanValue(); final boolean underWater = Configs.Generic.LIGHT_LEVEL_UNDER_WATER.getBooleanValue(); final boolean autoHeight = Configs.Generic.LIGHT_LEVEL_AUTO_HEIGHT.getBooleanValue(); diff --git a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererRandomTickableChunks.java b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererRandomTickableChunks.java index d1043b981..89185c55b 100644 --- a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererRandomTickableChunks.java +++ b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererRandomTickableChunks.java @@ -180,7 +180,7 @@ private void renderChunkEdge(ChunkPos pos, Direction side, Vec3d cameraPos, Colo } int minY = world != null ? world.getBottomY() : -64; - int maxY = world != null ? world.getTopY() : 320; + int maxY = world != null ? world.getTopYInclusive() + 1 : 320; RenderUtils.renderWallWithLines(minX, minY, minZ, maxX, maxY, maxZ, 16, 16, true, cameraPos, color, BUFFER_1, BUFFER_2); } diff --git a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererRegion.java b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererRegion.java index 07273a026..49a507030 100644 --- a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererRegion.java +++ b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererRegion.java @@ -62,7 +62,7 @@ public void update(Vec3d cameraPos, Entity entity, MinecraftClient mc) World world = entity.getEntityWorld(); int minY = world != null ? world.getBottomY() : -64; - int maxY = world != null ? world.getTopY() : 320; + int maxY = world != null ? world.getTopYInclusive() + 1 : 320; int rx = MathHelper.floor(entity.getX()) & ~0x1FF; int rz = MathHelper.floor(entity.getZ()) & ~0x1FF; BlockPos pos1 = new BlockPos(rx, minY, rz ); diff --git a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererSlimeChunks.java b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererSlimeChunks.java index 5b1757af8..e602e9d4b 100644 --- a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererSlimeChunks.java +++ b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererSlimeChunks.java @@ -16,7 +16,7 @@ import fi.dy.masa.malilib.util.JsonUtils; import fi.dy.masa.minihud.config.Configs; import fi.dy.masa.minihud.config.RendererToggle; -import fi.dy.masa.minihud.util.DataStorage; +import fi.dy.masa.minihud.data.HudDataManager; import fi.dy.masa.minihud.util.MiscUtils; public class OverlayRendererSlimeChunks extends OverlayRendererBase @@ -64,7 +64,7 @@ public static void onEnabled() public boolean shouldRender(MinecraftClient mc) { return RendererToggle.OVERLAY_SLIME_CHUNKS_OVERLAY.getBooleanValue() && mc.world != null && - DataStorage.getInstance().isWorldSeedKnown(mc.world) && + HudDataManager.getInstance().isWorldSeedKnown(mc.world) && MiscUtils.isOverworld(mc.world); } @@ -77,8 +77,8 @@ public boolean needsUpdate(Entity entity, MinecraftClient mc) } World world = entity.getEntityWorld(); - boolean isSeedKnown = DataStorage.getInstance().isWorldSeedKnown(world); - long seed = DataStorage.getInstance().getWorldSeed(world); + boolean isSeedKnown = HudDataManager.getInstance().isWorldSeedKnown(world); + long seed = HudDataManager.getInstance().getWorldSeed(world); if (this.topY != overlayTopY || this.wasSeedKnown != isSeedKnown || this.seed != seed) { @@ -96,7 +96,7 @@ public boolean needsUpdate(Entity entity, MinecraftClient mc) @Override public void update(Vec3d cameraPos, Entity entity, MinecraftClient mc) { - DataStorage data = DataStorage.getInstance(); + HudDataManager data = HudDataManager.getInstance(); World world = entity.getEntityWorld(); this.topY = overlayTopY; this.wasSeedKnown = data.isWorldSeedKnown(world); diff --git a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererSpawnChunks.java b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererSpawnChunks.java index b3c6e5095..6edd2ff5e 100644 --- a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererSpawnChunks.java +++ b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererSpawnChunks.java @@ -16,6 +16,7 @@ import fi.dy.masa.minihud.MiniHUD; import fi.dy.masa.minihud.config.Configs; import fi.dy.masa.minihud.config.RendererToggle; +import fi.dy.masa.minihud.data.HudDataManager; import fi.dy.masa.minihud.util.DataStorage; import fi.dy.masa.minihud.util.MiscUtils; @@ -49,7 +50,7 @@ public boolean shouldRender(MinecraftClient mc) return this.toggle.getBooleanValue() && (this.isPlayerFollowing || (mc.world != null && MiscUtils.isOverworld(mc.world) && - DataStorage.getInstance().isWorldSpawnKnown())); + HudDataManager.getInstance().isWorldSpawnKnown())); } @Override @@ -84,7 +85,7 @@ public void update(Vec3d cameraPos, Entity entity, MinecraftClient mc) // Use the client player, to allow looking from the camera perspective entity = this.isPlayerFollowing ? mc.player : entity; - DataStorage data = DataStorage.getInstance(); + HudDataManager data = HudDataManager.getInstance(); BlockPos spawn; int spawnChunkRadius; int red; @@ -195,23 +196,49 @@ protected Pair getSpawnChunkCorners(BlockPos worldSpawn, int int cx = (worldSpawn.getX() >> 4); int cz = (worldSpawn.getZ() >> 4); - int minY = world != null ? world.getBottomY() : -64; - int maxY = world != null ? world.getTopY() : 320; + int minY = this.getMinY(world); + int maxY = world != null ? world.getTopYInclusive() + 1 : 320; BlockPos pos1 = new BlockPos( (cx - chunkRange) << 4 , minY, (cz - chunkRange) << 4); BlockPos pos2 = new BlockPos(((cx + chunkRange) << 4) + 15, maxY, ((cz + chunkRange) << 4) + 15); return Pair.of(pos1, pos2); } + private int getMinY(World world) + { + MinecraftClient mc = MinecraftClient.getInstance(); + int minY; + + // For whatever reason, in Fabulous! Graphics, the Y level gets rendered through to -64, + // so let's make use of the player's current Y position, and seaLevel. + if (MinecraftClient.isFabulousGraphicsOrBetter() && world != null && mc.player != null) + { + if (mc.player.getBlockPos().getY() >= world.getSeaLevel()) + { + minY = world.getSeaLevel() - 2; + } + else + { + minY = world.getBottomY(); + } + } + else + { + minY = world != null ? world.getBottomY() : -64; + } + + return minY; + } + protected int getSpawnChunkRadius(@Nullable MinecraftServer server) { if (server != null) { return server.getOverworld().getGameRules().getInt(GameRules.SPAWN_CHUNK_RADIUS); } - else if (DataStorage.getInstance().isSpawnChunkRadiusKnown()) + else if (HudDataManager.getInstance().isSpawnChunkRadiusKnown()) { - return DataStorage.getInstance().getSpawnChunkRadius(); + return HudDataManager.getInstance().getSpawnChunkRadius(); } return 2; diff --git a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererVillagerInfo.java b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererVillagerInfo.java index 709a96486..154b56519 100644 --- a/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererVillagerInfo.java +++ b/src/main/java/fi/dy/masa/minihud/renderer/OverlayRendererVillagerInfo.java @@ -24,7 +24,7 @@ import fi.dy.masa.malilib.util.WorldUtils; import fi.dy.masa.minihud.config.Configs; import fi.dy.masa.minihud.config.RendererToggle; -import fi.dy.masa.minihud.data.EntitiesDataStorage; +import fi.dy.masa.minihud.data.EntitiesDataManager; import fi.dy.masa.minihud.mixin.IMixinMerchantEntity; import fi.dy.masa.minihud.mixin.IMixinZombieVillagerEntity; import fi.dy.masa.minihud.util.EntityUtils; @@ -67,7 +67,7 @@ public void update(Vec3d cameraPos, Entity entity, MinecraftClient mc) { for (VillagerEntity librarian : librarians) { - TradeOfferList offers = ((IMixinMerchantEntity) librarian).offers(); + TradeOfferList offers = ((IMixinMerchantEntity) librarian).minihud_offers(); if (offers != null) { for (TradeOffer tradeOffer : offers) @@ -101,10 +101,10 @@ public void update(Vec3d cameraPos, Entity entity, MinecraftClient mc) { if (librarian.isClient()) { - EntitiesDataStorage.getInstance().requestEntity(librarian.getId()); + EntitiesDataManager.getInstance().requestEntity(librarian.getId()); } List overlay = new ArrayList<>(); - TradeOfferList offers = ((IMixinMerchantEntity) librarian).offers(); + TradeOfferList offers = ((IMixinMerchantEntity) librarian).minihud_offers(); if (offers == null) { continue; @@ -163,7 +163,8 @@ else if (Configs.Generic.VILLAGER_OFFER_HIGHEST_LEVEL_ONLY.getBooleanValue()) // Can add additional formatting if you like, but this works as is sb.append(emeraldCost); // Add Village Offer Price Range - if (Configs.Generic.VILLAGER_OFFER_PRICE_RANGE.getBooleanValue()){ + if (Configs.Generic.VILLAGER_OFFER_PRICE_RANGE.getBooleanValue()) + { sb.append(' ').append('(').append(lowest).append('-').append(highest).append(')'); } sb.append(GuiBase.TXT_RST); @@ -185,7 +186,7 @@ else if (Configs.Generic.VILLAGER_OFFER_HIGHEST_LEVEL_ONLY.getBooleanValue()) { if (villager.getWorld().isClient) { - EntitiesDataStorage.getInstance().requestEntity(villager.getId()); + EntitiesDataManager.getInstance().requestEntity(villager.getId()); } int conversionTimer = ((IMixinZombieVillagerEntity) villager).minihud_conversionTimer(); diff --git a/src/main/java/fi/dy/masa/minihud/renderer/RenderContainer.java b/src/main/java/fi/dy/masa/minihud/renderer/RenderContainer.java index 5a7d5f00b..936b6c5fd 100644 --- a/src/main/java/fi/dy/masa/minihud/renderer/RenderContainer.java +++ b/src/main/java/fi/dy/masa/minihud/renderer/RenderContainer.java @@ -7,8 +7,11 @@ import fi.dy.masa.malilib.util.PositionUtils; import fi.dy.masa.minihud.config.RendererToggle; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.Camera; import net.minecraft.entity.Entity; import net.minecraft.util.math.Vec3d; +import net.minecraft.util.profiler.Profiler; + import org.joml.Matrix4f; import org.joml.Matrix4fStack; @@ -61,23 +64,23 @@ public void removeRenderer(OverlayRendererBase renderer) } } - public void render(Entity entity, Matrix4f matrix4f, Matrix4f projMatrix, MinecraftClient mc) + public void render(Entity entity, Matrix4f matrix4f, Matrix4f projMatrix, MinecraftClient mc, Camera camera, Profiler profiler) { - Vec3d cameraPos = mc.gameRenderer.getCamera().getPos(); + //Vec3d cameraPos = mc.gameRenderer.getCamera().getPos(); - this.update(cameraPos, entity, mc); - this.draw(cameraPos, matrix4f, projMatrix, mc); + this.update(camera.getPos(), entity, mc, profiler); + this.draw(camera.getPos(), matrix4f, projMatrix, mc, profiler); } - protected void update(Vec3d cameraPos, Entity entity, MinecraftClient mc) + protected void update(Vec3d cameraPos, Entity entity, MinecraftClient mc, Profiler profiler) { - mc.getProfiler().push(() -> "RenderContainer#update()"); + profiler.push(() -> "RenderContainer#update()"); this.allocateResourcesIfNeeded(); this.countActive = 0; for (OverlayRendererBase renderer : this.renderers) { - mc.getProfiler().push(renderer::getName); + profiler.push(renderer::getName); if (renderer.shouldRender(mc)) { @@ -91,17 +94,17 @@ protected void update(Vec3d cameraPos, Entity entity, MinecraftClient mc) ++this.countActive; } - mc.getProfiler().pop(); + profiler.pop(); } - mc.getProfiler().pop(); + profiler.pop(); } - protected void draw(Vec3d cameraPos, Matrix4f matrix4f, Matrix4f projMatrix, MinecraftClient mc) + protected void draw(Vec3d cameraPos, Matrix4f matrix4f, Matrix4f projMatrix, MinecraftClient mc, Profiler profiler) { if (this.resourcesAllocated && this.countActive > 0) { - mc.getProfiler().push(() -> "RenderContainer#draw()"); + profiler.push(() -> "RenderContainer#draw()"); RenderSystem.disableCull(); RenderSystem.enableDepthTest(); @@ -116,7 +119,7 @@ protected void draw(Vec3d cameraPos, Matrix4f matrix4f, Matrix4f projMatrix, Min for (IOverlayRenderer renderer : this.renderers) { - mc.getProfiler().push(() -> renderer.getClass().getName()); + profiler.push(() -> renderer.getClass().getName()); if (renderer.shouldRender(mc)) { @@ -128,7 +131,7 @@ protected void draw(Vec3d cameraPos, Matrix4f matrix4f, Matrix4f projMatrix, Min matrix4fstack.popMatrix(); } - mc.getProfiler().pop(); + profiler.pop(); } RenderSystem.polygonOffset(0f, 0f); @@ -139,7 +142,7 @@ protected void draw(Vec3d cameraPos, Matrix4f matrix4f, Matrix4f projMatrix, Min RenderSystem.enableCull(); RenderSystem.depthMask(true); - mc.getProfiler().pop(); + profiler.pop(); } } diff --git a/src/main/java/fi/dy/masa/minihud/renderer/RenderObjectBase.java b/src/main/java/fi/dy/masa/minihud/renderer/RenderObjectBase.java index 42b71ed82..8d0e44757 100644 --- a/src/main/java/fi/dy/masa/minihud/renderer/RenderObjectBase.java +++ b/src/main/java/fi/dy/masa/minihud/renderer/RenderObjectBase.java @@ -1,17 +1,17 @@ package fi.dy.masa.minihud.renderer; -import java.util.function.Supplier; import org.joml.Matrix4f; -import net.minecraft.client.gl.ShaderProgram; + +import net.minecraft.client.gl.ShaderProgramKey; import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.VertexFormat; public abstract class RenderObjectBase { protected final VertexFormat.DrawMode glMode; - protected final Supplier shader; + protected final ShaderProgramKey shader; - public RenderObjectBase(VertexFormat.DrawMode glMode, Supplier shader) + public RenderObjectBase(VertexFormat.DrawMode glMode, ShaderProgramKey shader) { this.glMode = glMode; this.shader = shader; @@ -22,7 +22,7 @@ public VertexFormat.DrawMode getGlMode() return this.glMode; } - public Supplier getShader() + public ShaderProgramKey getShader() { return this.shader; } diff --git a/src/main/java/fi/dy/masa/minihud/renderer/RenderObjectVbo.java b/src/main/java/fi/dy/masa/minihud/renderer/RenderObjectVbo.java index ce49f1826..e877e1ba4 100644 --- a/src/main/java/fi/dy/masa/minihud/renderer/RenderObjectVbo.java +++ b/src/main/java/fi/dy/masa/minihud/renderer/RenderObjectVbo.java @@ -1,9 +1,11 @@ package fi.dy.masa.minihud.renderer; -import java.util.function.Supplier; -import com.mojang.blaze3d.systems.RenderSystem; import org.joml.Matrix4f; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.gl.GlUsage; import net.minecraft.client.gl.ShaderProgram; +import net.minecraft.client.gl.ShaderProgramKey; import net.minecraft.client.gl.VertexBuffer; import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.BuiltBuffer; @@ -17,11 +19,11 @@ public class RenderObjectVbo extends RenderObjectBase protected final boolean hasTexture; protected boolean hasData; - public RenderObjectVbo(VertexFormat.DrawMode glMode, VertexFormat format, Supplier shader) + public RenderObjectVbo(VertexFormat.DrawMode glMode, VertexFormat format, ShaderProgramKey shader) { super(glMode, shader); - this.vertexBuffer = new VertexBuffer(VertexBuffer.Usage.STATIC); + this.vertexBuffer = new VertexBuffer(GlUsage.STATIC_WRITE); this.format = format; boolean hasTexture = false; @@ -65,9 +67,9 @@ public void draw(Matrix4f matrix4f, Matrix4f projMatrix) { if (this.hasData) { - RenderSystem.setShader(this.getShader()); + ShaderProgram program = RenderSystem.setShader(this.getShader()); this.vertexBuffer.bind(); - this.vertexBuffer.draw(matrix4f, projMatrix, this.getShader().get()); + this.vertexBuffer.draw(matrix4f, projMatrix, program); VertexBuffer.unbind(); } } @@ -76,5 +78,6 @@ public void draw(Matrix4f matrix4f, Matrix4f projMatrix) public void deleteGlResources() { this.vertexBuffer.close(); + this.hasData = false; } } diff --git a/src/main/java/fi/dy/masa/minihud/renderer/RenderUtils.java b/src/main/java/fi/dy/masa/minihud/renderer/RenderUtils.java index 938439340..d7e8d2566 100644 --- a/src/main/java/fi/dy/masa/minihud/renderer/RenderUtils.java +++ b/src/main/java/fi/dy/masa/minihud/renderer/RenderUtils.java @@ -4,13 +4,14 @@ import java.util.HashSet; import java.util.Set; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; + import net.minecraft.block.Block; import net.minecraft.block.CrafterBlock; import net.minecraft.block.ShulkerBoxBlock; import net.minecraft.block.entity.CrafterBlockEntity; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.render.BufferBuilder; +import net.minecraft.client.render.*; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.passive.AbstractHorseEntity; @@ -28,10 +29,11 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; import net.minecraft.world.World; + import fi.dy.masa.malilib.render.InventoryOverlay; import fi.dy.masa.malilib.util.*; import fi.dy.masa.minihud.config.Configs; -import fi.dy.masa.minihud.data.EntitiesDataStorage; +import fi.dy.masa.minihud.data.EntitiesDataManager; import fi.dy.masa.minihud.gui.InventoryOverlayScreen; import fi.dy.masa.minihud.mixin.IMixinAbstractHorseEntity; import fi.dy.masa.minihud.renderer.shapes.SideQuad; @@ -164,7 +166,6 @@ else if (minZ == maxZ) } } - /** * Assumes a BufferBuilder in GL_QUADS mode has been initialized */ @@ -573,7 +574,7 @@ else if (trace.getType() == HitResult.Type.ENTITY) if (entity.getWorld().isClient && Configs.Generic.ENTITY_DATA_SYNC.getBooleanValue()) { - EntitiesDataStorage.getInstance().requestEntity(entity.getId()); + EntitiesDataManager.getInstance().requestEntity(entity.getId()); } if (entity instanceof LivingEntity) diff --git a/src/main/java/fi/dy/masa/minihud/renderer/shapes/ShapeCircleBase.java b/src/main/java/fi/dy/masa/minihud/renderer/shapes/ShapeCircleBase.java index 99ef8116b..033b129ff 100644 --- a/src/main/java/fi/dy/masa/minihud/renderer/shapes/ShapeCircleBase.java +++ b/src/main/java/fi/dy/masa/minihud/renderer/shapes/ShapeCircleBase.java @@ -116,6 +116,7 @@ public void setBlockSnap(BlockSnap snap) protected void updateEffectiveCenter() { this.effectiveCenter = this.getBlockSnappedPosition(this.center); + //System.out.printf("ShapeCircleBase - updateEffectiveCenter: center: [%s], effectiveCenter [%s] // radius: [%f]\n", this.center.toString(), this.effectiveCenter.toString(), this.radius); this.setRenderPerimeter(this.effectiveCenter, this.radius + 512); this.setNeedsUpdate(); } diff --git a/src/main/java/fi/dy/masa/minihud/util/ConduitExtra.java b/src/main/java/fi/dy/masa/minihud/util/ConduitExtra.java index 110c00492..36462ca35 100644 --- a/src/main/java/fi/dy/masa/minihud/util/ConduitExtra.java +++ b/src/main/java/fi/dy/masa/minihud/util/ConduitExtra.java @@ -2,9 +2,9 @@ public interface ConduitExtra { - int getCurrentActivatingBlockCount(); + int minihud$getCurrentActivatingBlockCount(); - int getStoredActivatingBlockCount(); + int minihud$getStoredActivatingBlockCount(); - void setActivatingBlockCount(int count); + void minihud$setActivatingBlockCount(int count); } diff --git a/src/main/java/fi/dy/masa/minihud/util/DataStorage.java b/src/main/java/fi/dy/masa/minihud/util/DataStorage.java index ac603ba77..634d2a440 100644 --- a/src/main/java/fi/dy/masa/minihud/util/DataStorage.java +++ b/src/main/java/fi/dy/masa/minihud/util/DataStorage.java @@ -13,7 +13,7 @@ import com.google.common.collect.Queues; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; + import net.minecraft.client.MinecraftClient; import net.minecraft.entity.Entity; import net.minecraft.nbt.NbtCompound; @@ -41,14 +41,13 @@ import net.minecraft.world.chunk.ChunkStatus; import net.minecraft.world.gen.structure.Structure; import fi.dy.masa.malilib.gui.GuiBase; -import fi.dy.masa.malilib.interfaces.IClientTickHandler; import fi.dy.masa.malilib.network.ClientPlayHandler; import fi.dy.masa.malilib.network.IPluginClientPlayHandler; import fi.dy.masa.malilib.util.*; import fi.dy.masa.minihud.MiniHUD; import fi.dy.masa.minihud.Reference; -import fi.dy.masa.minihud.config.Configs; import fi.dy.masa.minihud.config.RendererToggle; +import fi.dy.masa.minihud.data.HudDataManager; import fi.dy.masa.minihud.data.MobCapDataHandler; import fi.dy.masa.minihud.mixin.IMixinMinecraftServer; import fi.dy.masa.minihud.network.ServuxStructuresHandler; @@ -66,15 +65,11 @@ public class DataStorage private static final DataStorage INSTANCE = new DataStorage(); private final MobCapDataHandler mobCapData = new MobCapDataHandler(); private final static ServuxStructuresHandler HANDLER = ServuxStructuresHandler.getInstance(); - private boolean worldSeedValid = false; private boolean carpetServer = false; private boolean servuxServer = false; private boolean hasInValidServux = false; private boolean hasIntegratedServer = false; - private int spawnChunkRadius = -1; - private boolean spawnChunkRadiusValid = false; private int simulationDistance = -1; - private boolean worldSpawnValid = false; private int structureDataTimeout = 30 * 20; private boolean serverTPSValid; private boolean hasSyncedTime; @@ -84,10 +79,6 @@ public class DataStorage private boolean structureRendererNeedsUpdate; private boolean structuresNeedUpdating; private boolean shouldRegisterStructureChannel; - private boolean isRaining; - private boolean isThundering; - private int weatherTimer; - private long worldSeed; private long lastServerTick; private long lastServerTimeUpdate; private BlockPos lastStructureUpdatePos; @@ -99,7 +90,6 @@ public class DataStorage private final MinecraftClient mc = MinecraftClient.getInstance(); private IntegratedServer integratedServer; private DynamicRegistryManager registryManager = DynamicRegistryManager.EMPTY; - private BlockPos worldSpawn = BlockPos.ORIGIN; private final PriorityBlockingQueue taskQueue = Queues.newPriorityBlockingQueue(); private final Thread workerThread; private final ThreadWorker worker; @@ -155,12 +145,8 @@ public void reset(boolean isLogout) this.servuxServer = false; this.hasInValidServux = false; this.structureDataTimeout = 30 * 20; - this.spawnChunkRadius = -1; this.registryManager = DynamicRegistryManager.EMPTY; - this.worldSpawn = BlockPos.ORIGIN; this.carpetServer = false; - this.worldSpawnValid = false; - this.spawnChunkRadiusValid = false; this.setHasIntegratedServer(false, null); } else @@ -174,9 +160,6 @@ public void reset(boolean isLogout) this.structuresNeedUpdating = true; this.hasStructureDataFromServer = false; this.structureRendererNeedsUpdate = true; - this.isRaining = false; - this.isThundering = false; - this.weatherTimer = -1; this.lastStructureUpdatePos = null; this.structures.clear(); @@ -188,12 +171,6 @@ public void reset(boolean isLogout) OverlayRendererConduitRange.INSTANCE.clear(); OverlayRendererBiomeBorders.INSTANCE.clear(); OverlayRendererLightLevel.reset(); - - if (isLogout || Configs.Generic.DONT_RESET_SEED_ON_DIMENSION_CHANGE.getBooleanValue() == false) - { - this.worldSeedValid = false; - this.worldSeed = 0; - } } public void clearTasks() @@ -328,81 +305,6 @@ public DynamicRegistryManager getWorldRegistryManager() } } - public void requestSpawnMetadata() - { - if (this.hasIntegratedServer == false && this.hasServuxServer()) - { - NbtCompound nbt = new NbtCompound(); - nbt.putString("version", Reference.MOD_STRING); - - HANDLER.encodeStructuresPacket(new ServuxStructuresPacket(ServuxStructuresPacket.Type.PACKET_C2S_REQUEST_SPAWN_METADATA, nbt)); - } - } - - public void setWorldSeed(long seed) - { - if (this.worldSeed != seed) - { - MiniHUD.printDebug("DataStorage#setWorldSeed(): set world seed [{}] -> [{}]", this.worldSeed, seed); - } - this.worldSeed = seed; - this.worldSeedValid = true; - } - - public void setWorldSpawn(BlockPos spawn) - { - if (this.worldSpawn.equals(spawn) == false) - { - OverlayRendererSpawnChunks.setNeedsUpdate(); - MiniHUD.printDebug("DataStorage#setWorldSpawn(): set world spawn [{}] -> [{}]", this.worldSpawn.toShortString(), spawn.toShortString()); - } - this.worldSpawn = spawn; - this.worldSpawnValid = true; - } - - public void setSpawnChunkRadius(int radius, boolean message) - { - if (radius >= 0 && radius <= 32) - { - if (this.spawnChunkRadius != radius) - { - if (message) - { - String strRadius = radius > 0 ? GuiBase.TXT_GREEN + String.format("%d", radius) + GuiBase.TXT_RST : GuiBase.TXT_RED + String.format("%d", radius) + GuiBase.TXT_RST; - InfoUtils.printActionbarMessage(StringUtils.translate("minihud.message.spawn_chunk_radius_set", strRadius)); - } - - OverlayRendererSpawnChunks.setNeedsUpdate(); - MiniHUD.printDebug("DataStorage#setSpawnChunkRadius(): set spawn chunk radius [{}] -> [{}]", this.spawnChunkRadius, radius); - } - this.spawnChunkRadius = radius; - this.spawnChunkRadiusValid = true; - } - else - { - this.spawnChunkRadius = -1; - this.spawnChunkRadiusValid = false; - } - } - - public void setWorldSpawnIfUnknown(BlockPos spawn) - { - if (this.worldSpawnValid == false) - { - this.setWorldSpawn(spawn); - OverlayRendererSpawnChunks.setNeedsUpdate(); - } - } - - public void setSpawnChunkRadiusIfUnknown(int radius) - { - if (this.spawnChunkRadiusValid == false) - { - this.setSpawnChunkRadius(radius, true); - OverlayRendererSpawnChunks.setNeedsUpdate(); - } - } - public void setSimulationDistance(int distance) { if (distance >= 0) @@ -420,139 +322,6 @@ public void setSimulationDistance(int distance) } } - public boolean isWorldSeedKnown(World world) - { - if (this.worldSeedValid) - { - return true; - } - else if (this.mc.isIntegratedServerRunning()) - { - MinecraftServer server = this.mc.getServer(); - World worldTmp = server.getWorld(world.getRegistryKey()); - return worldTmp != null; - } - - return false; - } - - public boolean hasStoredWorldSeed() - { - return this.worldSeedValid; - } - - public long getWorldSeed(World world) - { - if (this.worldSeedValid == false && this.mc.isIntegratedServerRunning()) - { - MinecraftServer server = this.mc.getServer(); - ServerWorld worldTmp = server.getWorld(world.getRegistryKey()); - - if (worldTmp != null) - { - this.setWorldSeed(worldTmp.getSeed()); - } - } - - return this.worldSeed; - } - - public boolean isWeatherClear() - { - return this.getClearTime() > -1; - } - - public int getClearTime() - { - if (this.isRaining == false && this.isThundering == false) - { - return this.weatherTimer; - } - - return -1; - } - - public boolean isWeatherRain() - { - return this.getRainTime() > -1; - } - - public int getRainTime() - { - if (this.isRaining && this.isThundering == false) - { - return this.weatherTimer; - } - - return -1; - } - - public boolean isWeatherThunder() - { - return this.getThunderTime() > -1; - } - - public int getThunderTime() - { - if (this.isThundering && this.isRaining == false) - { - return this.weatherTimer; - } - - return -1; - } - - /** - * This function checks the Integrated Server's World Seed at Server Launch. - * This happens before the WorldLoadListener/fromJson load which works fine for Multiplayer; - * But if we own the Server, use this value as valid, overriding the value from the JSON file. - * This is because your default "New World" .json files' seed tends to eventually get stale - * without using the /seed command continuously, or deleting the json files. - * @param server (Server Object to get the data from) - */ - public void checkWorldSeed(MinecraftServer server) - { - if (this.hasIntegratedServer) - { - ServerWorld worldTmp = server.getOverworld(); - - if (worldTmp != null) - { - long seedTmp = worldTmp.getSeed(); - - if (seedTmp != this.worldSeed) - { - this.setWorldSeed(seedTmp); - } - } - } - } - - public boolean isWorldSpawnKnown() - { - return this.worldSpawnValid; - } - - public BlockPos getWorldSpawn() - { - return this.worldSpawn; - } - - public boolean isSpawnChunkRadiusKnown() - { - return this.spawnChunkRadiusValid; - } - - public int getSpawnChunkRadius() - { - if (this.spawnChunkRadius > -1) - { - return this.spawnChunkRadius; - } - - return 2; - } - public boolean isSimulationDistanceKnown() { return this.simulationDistance >= 0; @@ -643,14 +412,6 @@ public void onClientTickPre(MinecraftClient mc) } } - public void onClientTickPost(MinecraftClient mc) - { - if (this.hasIntegratedServer == false && this.weatherTimer > 1) - { - this.weatherTimer--; - } - } - public void onPlayerBlockBreak(MinecraftClient mc) { if (mc.world != null) @@ -675,8 +436,8 @@ public boolean onSendChatMessage(String message) { try { - this.setWorldSeed(Long.parseLong(parts[1])); - InfoUtils.printActionbarMessage("minihud.message.seed_set", this.worldSeed); + HudDataManager.getInstance().setWorldSeed(Long.parseLong(parts[1])); + InfoUtils.printActionbarMessage("minihud.message.seed_set", HudDataManager.getInstance().worldSeed()); } catch (NumberFormatException e) { @@ -685,9 +446,9 @@ public boolean onSendChatMessage(String message) } else if (parts.length == 1) { - if (this.worldSeedValid) + if (HudDataManager.getInstance().hasStoredWorldSeed()) { - InfoUtils.printActionbarMessage("minihud.message.seed_is", this.worldSeed); + InfoUtils.printActionbarMessage("minihud.message.seed_is", HudDataManager.getInstance().worldSeed()); } else { @@ -707,7 +468,7 @@ else if (parts.length > 0 && (parts[0].equals("minihud-spawnchunkradius") || par if (radius >= 0 && radius <= 32) { - this.setSpawnChunkRadius(radius, true); + HudDataManager.getInstance().setSpawnChunkRadius(radius, true); } else { @@ -721,9 +482,10 @@ else if (parts.length > 0 && (parts[0].equals("minihud-spawnchunkradius") || par } else if (parts.length == 1) { - if (this.spawnChunkRadiusValid) + if (HudDataManager.getInstance().isSpawnChunkRadiusKnown()) { - String strRadius = this.spawnChunkRadius > 0 ? GuiBase.TXT_GREEN + String.format("%d", this.spawnChunkRadius) + GuiBase.TXT_RST : GuiBase.TXT_RED + String.format("%d", this.spawnChunkRadius) + GuiBase.TXT_RST; + int radius = HudDataManager.getInstance().getSpawnChunkRadius(); + String strRadius = radius > 0 ? GuiBase.TXT_GREEN + String.format("%d", radius) + GuiBase.TXT_RST : GuiBase.TXT_RED + String.format("%d", radius) + GuiBase.TXT_RST; InfoUtils.printActionbarMessage(StringUtils.translate("minihud.message.spawn_chunk_radius_is", strRadius)); } else @@ -759,9 +521,9 @@ public void onChatMessage(Text message) //if (i1 != -1 && i2 != -1) { //this.setWorldSeed(Long.parseLong(str.substring(i1 + 1, i2))); - this.setWorldSeed(Long.parseLong(str)); - MiniHUD.logger.info("Received world seed from the vanilla /seed command: {}", this.worldSeed); - InfoUtils.printActionbarMessage("minihud.message.seed_set", this.worldSeed); + HudDataManager.getInstance().setWorldSeed(Long.parseLong(str)); + MiniHUD.logger.info("Received world seed from the vanilla /seed command: {}", HudDataManager.getInstance().worldSeed()); + InfoUtils.printActionbarMessage("minihud.message.seed_set", HudDataManager.getInstance().worldSeed()); } } catch (Exception e) @@ -774,9 +536,9 @@ else if ("jed.commands.seed.success".equals(text.getKey())) { try { - this.setWorldSeed(Long.parseLong(text.getArgs()[1].toString())); - MiniHUD.logger.info("Received world seed from the JED '/jed seed' command: {}", this.worldSeed); - InfoUtils.printActionbarMessage("minihud.message.seed_set", this.worldSeed); + HudDataManager.getInstance().setWorldSeed(Long.parseLong(text.getArgs()[1].toString())); + MiniHUD.logger.info("Received world seed from the JED '/jed seed' command: {}", HudDataManager.getInstance().worldSeed()); + InfoUtils.printActionbarMessage("minihud.message.seed_set", HudDataManager.getInstance().worldSeed()); } catch (Exception e) { @@ -792,9 +554,10 @@ else if ("commands.setworldspawn.success".equals(text.getKey()) && text.getArgs( int y = Integer.parseInt(o[1].toString()); int z = Integer.parseInt(o[2].toString()); - this.setWorldSpawn(new BlockPos(x, y, z)); + BlockPos newSpawn = new BlockPos(x, y, z); + HudDataManager.getInstance().setWorldSpawn(newSpawn); - String spawnStr = String.format("x: %d, y: %d, z: %d", this.worldSpawn.getX(), this.worldSpawn.getY(), this.worldSpawn.getZ()); + String spawnStr = String.format("x: %d, y: %d, z: %d", newSpawn.getX(), newSpawn.getY(), newSpawn.getZ()); MiniHUD.logger.info("Received world spawn from the vanilla /setworldspawn command: {}", spawnStr); InfoUtils.printActionbarMessage("minihud.message.spawn_set", spawnStr); } @@ -814,14 +577,15 @@ else if (("commands.gamerule.set".equals(text.getKey()) || "commands.gamerule.qu { int value = Integer.parseInt(o[1].toString()); - if (this.spawnChunkRadius != value) + if (HudDataManager.getInstance().getSpawnChunkRadius() != value) { - MiniHUD.logger.info("Received spawn chunk radius from the vanilla /gamerule command: {}", this.spawnChunkRadius); - this.setSpawnChunkRadius(value, true); + MiniHUD.logger.info("Received spawn chunk radius from the vanilla /gamerule command: {}", HudDataManager.getInstance().getSpawnChunkRadius()); + HudDataManager.getInstance().setSpawnChunkRadius(value, true); } else { - String strRadius = this.spawnChunkRadius > 0 ? GuiBase.TXT_GREEN + String.format("%d", this.spawnChunkRadius) + GuiBase.TXT_RST : GuiBase.TXT_RED + String.format("%d", this.spawnChunkRadius) + GuiBase.TXT_RST; + int radius = HudDataManager.getInstance().getSpawnChunkRadius(); + String strRadius = radius > 0 ? GuiBase.TXT_GREEN + String.format("%d", radius) + GuiBase.TXT_RST : GuiBase.TXT_RED + String.format("%d", radius) + GuiBase.TXT_RST; InfoUtils.printActionbarMessage(StringUtils.translate("minihud.message.spawn_chunk_radius_is", strRadius)); } } @@ -860,35 +624,6 @@ public void onServerTimeUpdate(long totalWorldTime) } } - public void onServerWeatherTick(int clearTime, int rainTime, boolean isThundering) - { - if (rainTime > 1) - { - if (isThundering) - { - this.isThundering = true; - this.isRaining = false; - } - else - { - this.isThundering = false; - this.isRaining = true; - } - - this.weatherTimer = rainTime; - } - else if (clearTime > 1 && (this.isRaining || this.isThundering)) - { - this.isThundering = false; - this.isRaining = false; - } - - if (clearTime > 1) - { - this.weatherTimer = clearTime; - } - } - public void updateIntegratedServerTPS() { if (this.mc != null && this.mc.player != null && this.mc.getServer() != null) @@ -1046,11 +781,17 @@ public boolean receiveServuxStrucutresMetadata(NbtCompound data) } this.servuxTimeout = data.getInt("timeout"); this.setServuxVersion(data.getString("servux")); - this.setWorldSpawn(new BlockPos(data.getInt("spawnPosX"), data.getInt("spawnPosY"), data.getInt("spawnPosZ"))); - this.setSpawnChunkRadius(data.getInt("spawnChunkRadius"), true); + if (data.contains("spawnPosX", Constants.NBT.TAG_INT)) + { + HudDataManager.getInstance().setWorldSpawn(new BlockPos(data.getInt("spawnPosX"), data.getInt("spawnPosY"), data.getInt("spawnPosZ"))); + } + if (data.contains("spawnChunkRadius", Constants.NBT.TAG_INT)) + { + HudDataManager.getInstance().setSpawnChunkRadius(data.getInt("spawnChunkRadius"), true); + } if (data.contains("worldSeed", Constants.NBT.TAG_LONG)) { - this.setWorldSeed(data.getLong("worldSeed")); + HudDataManager.getInstance().setWorldSeed(data.getLong("worldSeed")); } this.setIsServuxServer(); @@ -1068,59 +809,6 @@ public boolean receiveServuxStrucutresMetadata(NbtCompound data) return false; } - public void receiveSpawnMetadata(NbtCompound data) - { - if (this.hasIntegratedServer == false) - { - MiniHUD.printDebug("DataStorage#receiveSpawnMetadata(): from Servux"); - - this.setServuxVersion(data.getString("servux")); - this.setWorldSpawn(new BlockPos(data.getInt("spawnPosX"), data.getInt("spawnPosY"), data.getInt("spawnPosZ"))); - this.setSpawnChunkRadius(data.getInt("spawnChunkRadius"), true); - if (data.contains("worldSeed", Constants.NBT.TAG_LONG)) - { - this.setWorldSeed(data.getLong("worldSeed")); - } - - if (this.hasInValidServux) - { - this.hasInValidServux = false; - } - } - } - - public void receiveWeatherData(NbtCompound data) - { - if (this.hasIntegratedServer == false) - { - //MiniHUD.printDebug("DataStorage#receiveWeatherData(): from Servux"); - - if (data.contains("SetRaining", Constants.NBT.TAG_INT)) - { - this.isThundering = false; - this.isRaining = true; - this.weatherTimer = data.getInt("SetRaining"); - } - else if (data.contains("SetThundering", Constants.NBT.TAG_INT)) - { - this.isThundering = true; - this.isRaining = false; - this.weatherTimer = data.getInt("SetThundering"); - } - else if (data.contains("SetClear", Constants.NBT.TAG_INT)) - { - this.isRaining = false; - this.isThundering = false; - this.weatherTimer = data.getInt("SetClear"); - } - - if (this.hasInValidServux) - { - this.hasInValidServux = false; - } - } - } - public void unregisterStructureChannel() { if (this.servuxServer || RendererToggle.OVERLAY_STRUCTURE_MAIN_TOGGLE.getBooleanValue() == false) @@ -1281,7 +969,7 @@ private void addStructureDataFromGenerator(ServerWorld world, BlockPos playerPos { Structure structure = entry.getKey(); StructureStart start = entry.getValue(); - Identifier id = world.getRegistryManager().get(RegistryKeys.STRUCTURE).getId(structure); + Identifier id = world.getRegistryManager().getOrThrow(RegistryKeys.STRUCTURE).getId(structure); StructureType type = StructureType.fromStructureId(id != null ? id.toString() : "?"); if (type.isEnabled() && @@ -1331,62 +1019,22 @@ public JsonObject toJson() obj.add("distance_pos", JsonUtils.vec3dToJson(this.distanceReferencePoint)); - if (this.worldSeedValid) - { - obj.add("seed", new JsonPrimitive(this.worldSeed)); - } - if (this.isSpawnChunkRadiusKnown()) - { - obj.add("spawn_chunk_radius", new JsonPrimitive(this.spawnChunkRadius)); - } - return obj; } - /** - * This function now checks for stale JSON data. - * It only compares it if we have an Integrated Server running, and they are marked as valid. - * @param obj () - */ public void fromJson(JsonObject obj) { Vec3d pos = JsonUtils.vec3dFromJson(obj, "distance_pos"); - this.distanceReferencePoint = Objects.requireNonNullElse(pos, Vec3d.ZERO); + // Backwards compat if (JsonUtils.hasLong(obj, "seed")) { - long seedTmp = JsonUtils.getLong(obj, "seed"); - - if (this.hasIntegratedServer && this.hasStoredWorldSeed() && this.worldSeed != seedTmp) - { - MiniHUD.printDebug("DataStorage#fromJson(): ignoring stale WorldSeed [{}], keeping [{}] as valid from the integrated server", seedTmp, this.worldSeed); - } - else - { - this.setWorldSeed(seedTmp); - } + HudDataManager.getInstance().setWorldSeed(JsonUtils.getLong(obj, "seed")); } if (JsonUtils.hasInteger(obj, "spawn_chunk_radius")) { - int spawnRadiusTmp = JsonUtils.getIntegerOrDefault(obj, "spawn_chunk_radius", 2); - - if (this.hasIntegratedServer && this.isSpawnChunkRadiusKnown() && this.spawnChunkRadius != spawnRadiusTmp) - { - MiniHUD.printDebug("DataStorage#fromJson(): ignoring stale Spawn Chunk Radius [{}], keeping [{}] as valid from the integrated server", spawnRadiusTmp, this.spawnChunkRadius); - } - else - { - this.setSpawnChunkRadius(spawnRadiusTmp, false); - } - - // Force RenderToggle OFF if SPAWN_CHUNK_RADIUS is set to 0 - if (this.getSpawnChunkRadius() == 0 && RendererToggle.OVERLAY_SPAWN_CHUNK_OVERLAY_REAL.getBooleanValue()) - { - MiniHUD.logger.warn("DataStorage#fromJson(): toggling feature OFF since SPAWN_CHUNK_RADIUS is set to 0"); - RendererToggle.OVERLAY_SPAWN_CHUNK_OVERLAY_REAL.setBooleanValue(false); - OverlayRendererSpawnChunks.setNeedsUpdate(); - } + HudDataManager.getInstance().setSpawnChunkRadius(JsonUtils.getIntegerOrDefault(obj, "spawn_chunk_radius", 2), false); } } } diff --git a/src/main/java/fi/dy/masa/minihud/util/DebugInfoUtils.java b/src/main/java/fi/dy/masa/minihud/util/DebugInfoUtils.java index fae1057e2..8385afe7d 100644 --- a/src/main/java/fi/dy/masa/minihud/util/DebugInfoUtils.java +++ b/src/main/java/fi/dy/masa/minihud/util/DebugInfoUtils.java @@ -4,10 +4,11 @@ import java.util.Map; import java.util.function.Predicate; import com.google.common.collect.MapMaker; -import com.mojang.blaze3d.systems.RenderSystem; import io.netty.buffer.Unpooled; +import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.Frustum; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.debug.DebugRenderer; import net.minecraft.client.render.debug.NeighborUpdateDebugRenderer; @@ -29,15 +30,19 @@ import net.minecraft.world.World; import fi.dy.masa.malilib.config.IConfigBoolean; +import fi.dy.masa.minihud.MiniHUD; import fi.dy.masa.minihud.config.RendererToggle; +import fi.dy.masa.minihud.mixin.debug.IMixinDebugRenderer; public class DebugInfoUtils { private static boolean neighborUpdateEnabled; - private static boolean pathfindingEnabled = false; + //private static boolean pathfindingEnabled = false; private static int tickCounter; - private static final Map OLD_PATHS = new MapMaker().weakKeys().weakValues().makeMap(); + //private static final Map OLD_PATHS = new MapMaker().weakKeys().weakValues().makeMap(); + // Moved to DebugDataManager + /* public static void sendPacketDebugPath(MinecraftServer server, int entityId, Path path, float maxDistance) { // FIXME --> This causes a custom_payload crash (Unregistered Vanilla channel) @@ -68,12 +73,20 @@ private static Path copyPath(Path path) return Path.fromBuf(buf); } + */ + // Could move this, but it works fine. public static void onNeighborUpdate(World world, BlockPos pos) { + if (RendererToggle.DEBUG_DATA_MAIN_TOGGLE.getBooleanValue() == false) + { + return; + } + // This will only work in single player... // We are catching updates from the server world, and adding them to the debug renderer directly - if (neighborUpdateEnabled && world.isClient == false) + //if (neighborUpdateEnabled && world.isClient == false) + if (world.isClient == false) { MinecraftClient mc = MinecraftClient.getInstance(); mc.execute(() -> ((NeighborUpdateDebugRenderer) mc.debugRenderer.neighborUpdateDebugRenderer).addNeighborUpdate(world.getTime(), pos.toImmutable())); @@ -82,9 +95,16 @@ public static void onNeighborUpdate(World world, BlockPos pos) public static void onServerTickEnd(MinecraftServer server) { - MinecraftClient mc = MinecraftClient.getInstance(); + if (RendererToggle.DEBUG_DATA_MAIN_TOGGLE.getBooleanValue() == false) + { + return; + } + // Moved to DebugDataManager // Send the custom packet with the Path data, if that debug renderer is enabled + /* + MinecraftClient mc = MinecraftClient.getInstance(); + if (pathfindingEnabled && mc.world != null && ++tickCounter >= 10) { tickCounter = 0; @@ -132,8 +152,10 @@ public static void onServerTickEnd(MinecraftServer server) } } } + */ } + /* private static boolean isAnyPlayerWithinRange(ServerWorld world, Entity entity, double range) { List players = world.getPlayers(); @@ -151,9 +173,14 @@ private static boolean isAnyPlayerWithinRange(ServerWorld world, Entity entity, return false; } + */ public static void toggleDebugRenderer(IConfigBoolean config) { + if (RendererToggle.DEBUG_DATA_MAIN_TOGGLE.getBooleanValue() == false) + { + return; + } if (config == RendererToggle.DEBUG_NEIGHBOR_UPDATES) { neighborUpdateEnabled = config.getBooleanValue(); @@ -167,7 +194,13 @@ else if (config == RendererToggle.DEBUG_PATH_FINDING) */ else if (config == RendererToggle.DEBUG_CHUNK_BORDER) { - boolean enabled = MinecraftClient.getInstance().debugRenderer.toggleShowChunkBorder(); + boolean enabled = ((IMixinDebugRenderer) MinecraftClient.getInstance().debugRenderer).minihud_getShowChunkBorder(); + + if (enabled != RendererToggle.DEBUG_CHUNK_BORDER.getBooleanValue()) + { + enabled = MinecraftClient.getInstance().debugRenderer.toggleShowChunkBorder(); + } + debugWarn(enabled ? "debug.chunk_boundaries.on" : "debug.chunk_boundaries.off"); } else if (config == RendererToggle.DEBUG_CHUNK_INFO) @@ -178,6 +211,24 @@ else if (config == RendererToggle.DEBUG_CHUNK_OCCLUSION) { MinecraftClient.getInstance().debugChunkOcclusion = config.getBooleanValue(); } + else if (config == RendererToggle.DEBUG_OCTREEE) + { + boolean enabled = ((IMixinDebugRenderer) MinecraftClient.getInstance().debugRenderer).minihud_getShowOctree(); + + if (enabled != RendererToggle.DEBUG_OCTREEE.getBooleanValue()) + { + enabled = MinecraftClient.getInstance().debugRenderer.toggleShowOctree(); + } + + if (enabled) + { + MiniHUD.logger.warn("Toggled Vanilla 'Octree' Debug Renderer ON."); + } + else + { + MiniHUD.logger.warn("Toggled Vanilla 'Octree' Debug Renderer OFF."); + } + } } private static void debugWarn(String key, Object... args) @@ -188,37 +239,130 @@ private static void debugWarn(String key, Object... args) .append(Text.translatable(key, args))); } - public static void renderVanillaDebug(MatrixStack matrixStack, VertexConsumerProvider.Immediate vtx, - double cameraX, double cameraY, double cameraZ) + public static void renderVanillaDebug(MatrixStack matrixStack, Frustum frustum, + VertexConsumerProvider.Immediate vtx, + double cameraX, double cameraY, double cameraZ) { + if (RendererToggle.DEBUG_DATA_MAIN_TOGGLE.getBooleanValue() == false) + { + return; + } + DebugRenderer renderer = MinecraftClient.getInstance().debugRenderer; if (RendererToggle.DEBUG_COLLISION_BOXES.getBooleanValue()) { renderer.collisionDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); } - if (RendererToggle.DEBUG_NEIGHBOR_UPDATES.getBooleanValue()) { renderer.neighborUpdateDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); } - // FIXME This causes a custom_payload crash - /* + if (RendererToggle.DEBUG_SOLID_FACES.getBooleanValue()) + { + RenderSystem.enableDepthTest(); + renderer.blockOutlineDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + if (RendererToggle.DEBUG_WATER.getBooleanValue()) + { + renderer.waterDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + if (RendererToggle.DEBUG_CHUNK_LOADING.getBooleanValue()) + { + renderer.chunkLoadingDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + if (RendererToggle.DEBUG_CHUNK_DEBUG.getBooleanValue()) + { + renderer.chunkDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + if (RendererToggle.DEBUG_SUPPORTING_BLOCK.getBooleanValue()) + { + renderer.supportingBlockDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + if (RendererToggle.DEBUG_HEIGHTMAP.getBooleanValue()) + { + renderer.heightmapDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + if (RendererToggle.DEBUG_WORLDGEN.getBooleanValue()) + { + renderer.worldGenAttemptDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + if (RendererToggle.DEBUG_STRUCTURES.getBooleanValue()) + { + renderer.structureDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + if (RendererToggle.DEBUG_VILLAGE_SECTIONS.getBooleanValue()) + { + renderer.villageSectionsDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + if (RendererToggle.DEBUG_BREEZE_JUMP.getBooleanValue()) + { + renderer.breezeDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + if (RendererToggle.DEBUG_RAID_CENTER.getBooleanValue()) + { + renderer.raidCenterDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + if (RendererToggle.DEBUG_GOAL_SELECTOR.getBooleanValue()) + { + renderer.goalSelectorDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + if (RendererToggle.DEBUG_SKYLIGHT.getBooleanValue()) + { + renderer.skyLightDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + if (RendererToggle.DEBUG_GAME_EVENT.getBooleanValue()) + { + renderer.gameEventDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + if (RendererToggle.DEBUG_LIGHT.getBooleanValue()) + { + renderer.lightDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + + // FIXME These cause a custom_payload crash when used if (RendererToggle.DEBUG_PATH_FINDING.getBooleanValue()) { renderer.pathfindingDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + if (RendererToggle.DEBUG_VILLAGE.getBooleanValue()) + { + renderer.villageDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + if (RendererToggle.DEBUG_BEEDATA.getBooleanValue()) + { + renderer.beeDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + /* + if (RendererToggle.DEBUG_REDSTONE_UPDATE_ORDER.getBooleanValue()) + { + renderer.redstoneUpdateOrderDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + } + if (RendererToggle.DEBUG_GAME_TEST.getBooleanValue()) + { + renderer.gameTestDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + //vtx.draw(); } */ + } - if (RendererToggle.DEBUG_SOLID_FACES.getBooleanValue()) + /** + * Fixes Desync between MiniHUD config and the actual toggles in game. + * @param toggle + */ + public static void onToggleVanillaDebugChunkBorder(boolean toggle) + { + if (toggle != RendererToggle.DEBUG_CHUNK_BORDER.getBooleanValue()) { - RenderSystem.enableDepthTest(); - renderer.blockOutlineDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + RendererToggle.DEBUG_CHUNK_BORDER.setBooleanValue(toggle); } + } - if (RendererToggle.DEBUG_WATER.getBooleanValue()) + public static void onToggleVanillaDebugOctree(boolean toggle) + { + if (toggle != RendererToggle.DEBUG_OCTREEE.getBooleanValue()) { - renderer.waterDebugRenderer.render(matrixStack, vtx, cameraX, cameraY, cameraZ); + RendererToggle.DEBUG_OCTREEE.setBooleanValue(toggle); } } } diff --git a/src/main/java/fi/dy/masa/minihud/util/EntityUtils.java b/src/main/java/fi/dy/masa/minihud/util/EntityUtils.java index 6c742dcbd..4662897b6 100644 --- a/src/main/java/fi/dy/masa/minihud/util/EntityUtils.java +++ b/src/main/java/fi/dy/masa/minihud/util/EntityUtils.java @@ -66,7 +66,7 @@ public static void loadNbtIntoEntity(Entity entity, NbtCompound nbt) } else { - ((IMixinEntity) entity).readCustomDataFromNbt(nbt); + ((IMixinEntity) entity).minihud_readCustomDataFromNbt(nbt); } } @@ -75,18 +75,19 @@ private static void readLeashableEntityCustomData(Entity entity, NbtCompound nbt MinecraftClient mc = MinecraftClient.getInstance(); assert entity instanceof Leashable; Leashable leashable = (Leashable) entity; - ((IMixinEntity) entity).readCustomDataFromNbt(nbt); + ((IMixinEntity) entity).minihud_readCustomDataFromNbt(nbt); if (leashable.getLeashData() != null && leashable.getLeashData().unresolvedLeashData != null) { leashable.getLeashData().unresolvedLeashData .ifLeft(uuid -> // We MUST use client-side world here. - leashable.attachLeash(((IMixinWorld) mc.world).getEntityLookup().get(uuid), false)) + leashable.attachLeash(((IMixinWorld) mc.world).minihud_getEntityLookup().get(uuid), false)) .ifRight(pos -> leashable.attachLeash(LeashKnotEntity.getOrCreate(mc.world, pos), false)); } } + @SuppressWarnings("unchecked") public static List getEntitiesByClass(MinecraftClient mc, Class entityClass, Box box, Predicate predicate) { if (mc.world == null) diff --git a/src/main/java/fi/dy/masa/minihud/util/MiscUtils.java b/src/main/java/fi/dy/masa/minihud/util/MiscUtils.java index 73d497cd6..57549bd98 100644 --- a/src/main/java/fi/dy/masa/minihud/util/MiscUtils.java +++ b/src/main/java/fi/dy/masa/minihud/util/MiscUtils.java @@ -4,8 +4,8 @@ import java.util.Random; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import it.unimi.dsi.fastutil.objects.Object2IntMap; -import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import it.unimi.dsi.fastutil.objects.Reference2IntMap; +import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; import net.minecraft.block.entity.AbstractFurnaceBlockEntity; import net.minecraft.block.entity.BeehiveBlockEntity; @@ -16,13 +16,14 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.recipe.AbstractCookingRecipe; +import net.minecraft.recipe.Recipe; import net.minecraft.recipe.RecipeEntry; +import net.minecraft.registry.RegistryKey; import net.minecraft.server.world.ServerWorld; import net.minecraft.state.property.Properties; import net.minecraft.text.MutableText; import net.minecraft.text.Style; import net.minecraft.text.Text; -import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockBox; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -30,6 +31,7 @@ import fi.dy.masa.malilib.util.BlockUtils; import fi.dy.masa.malilib.util.Constants; import fi.dy.masa.malilib.util.IntBoundingBox; +import fi.dy.masa.minihud.data.HudDataManager; import fi.dy.masa.minihud.mixin.IMixinAbstractFurnaceBlockEntity; public class MiscUtils @@ -229,36 +231,93 @@ public static void addHoneyTooltip(ItemStack stack, List lines) } } - public static int getFurnaceXpAmount(World world, AbstractFurnaceBlockEntity be) + public static int getFurnaceXpAmount(ServerWorld world, AbstractFurnaceBlockEntity be) { - Object2IntOpenHashMap recipes = ((IMixinAbstractFurnaceBlockEntity) be).minihud_getUsedRecipes(); + Reference2IntOpenHashMap>> recipes = ((IMixinAbstractFurnaceBlockEntity) be).minihud_getUsedRecipes(); double xp = 0.0; - for (Object2IntMap.Entry entry : recipes.object2IntEntrySet()) + if (recipes == null || recipes.isEmpty()) + { + return -1; + } + + for (Reference2IntMap.Entry>> entry : recipes.reference2IntEntrySet()) { RecipeEntry recipeEntry = world.getRecipeManager().get(entry.getKey()).orElse(null); - if (recipeEntry != null && recipeEntry.value() instanceof AbstractCookingRecipe recipe) + if (recipeEntry != null) { - xp += entry.getIntValue() * recipe.getExperience(); + xp += entry.getIntValue() * ((AbstractCookingRecipe) recipeEntry.value()).getExperience(); } } return (int) xp; } - public static int getFurnaceXpAmount(World world, @Nonnull NbtCompound nbt) + public static int getFurnaceXpAmount(ServerWorld world, @Nonnull NbtCompound nbt) { - Object2IntOpenHashMap recipes = BlockUtils.getRecipesUsedFromNbt(nbt); + Reference2IntOpenHashMap>> recipes = BlockUtils.getRecipesUsedFromNbt(nbt); double xp = 0.0; - for (Object2IntMap.Entry entry : recipes.object2IntEntrySet()) + if (recipes.isEmpty()) + { + return -1; + } + + for (Reference2IntMap.Entry>> entry : recipes.reference2IntEntrySet()) { RecipeEntry recipeEntry = world.getRecipeManager().get(entry.getKey()).orElse(null); - if (recipeEntry != null && recipeEntry.value() instanceof AbstractCookingRecipe recipe) + if (recipeEntry != null) + { + xp += entry.getIntValue() * ((AbstractCookingRecipe) recipeEntry.value()).getExperience(); + } + } + + return (int) xp; + } + + // Servux Synced Recipe Manager required + public static int getFurnaceXpAmount(AbstractFurnaceBlockEntity be) + { + Reference2IntOpenHashMap>> recipes = ((IMixinAbstractFurnaceBlockEntity) be).minihud_getUsedRecipes(); + double xp = 0.0; + + if (recipes == null || recipes.isEmpty() || HudDataManager.getInstance().getPreparedRecipes() == null) + { + return -1; + } + + for (Reference2IntMap.Entry>> entry : recipes.reference2IntEntrySet()) + { + RecipeEntry recipeEntry = HudDataManager.getInstance().getPreparedRecipes().get(entry.getKey()); + + if (recipeEntry != null) + { + xp += entry.getIntValue() * ((AbstractCookingRecipe) recipeEntry.value()).getExperience(); + } + } + + return (int) xp; + } + + public static int getFurnaceXpAmount(@Nonnull NbtCompound nbt) + { + Reference2IntOpenHashMap>> recipes = BlockUtils.getRecipesUsedFromNbt(nbt); + double xp = 0.0; + + if (recipes.isEmpty() || HudDataManager.getInstance().getPreparedRecipes() == null) + { + return -1; + } + + for (Reference2IntMap.Entry>> entry : recipes.reference2IntEntrySet()) + { + RecipeEntry recipeEntry = HudDataManager.getInstance().getPreparedRecipes().get(entry.getKey()); + + if (recipeEntry != null) { - xp += entry.getIntValue() * recipe.getExperience(); + xp += entry.getIntValue() * ((AbstractCookingRecipe) recipeEntry.value()).getExperience(); } } diff --git a/src/main/java/fi/dy/masa/minihud/util/RayTraceUtils.java b/src/main/java/fi/dy/masa/minihud/util/RayTraceUtils.java index 507389764..eb19d6fa6 100644 --- a/src/main/java/fi/dy/masa/minihud/util/RayTraceUtils.java +++ b/src/main/java/fi/dy/masa/minihud/util/RayTraceUtils.java @@ -34,11 +34,11 @@ import net.minecraft.world.World; import fi.dy.masa.malilib.render.InventoryOverlay; +import fi.dy.masa.malilib.util.*; import fi.dy.masa.malilib.util.EntityUtils; import fi.dy.masa.malilib.util.InventoryUtils; -import fi.dy.masa.malilib.util.*; import fi.dy.masa.minihud.config.Configs; -import fi.dy.masa.minihud.data.EntitiesDataStorage; +import fi.dy.masa.minihud.data.EntitiesDataManager; import fi.dy.masa.minihud.event.RenderHandler; import fi.dy.masa.minihud.mixin.IMixinAbstractHorseEntity; import fi.dy.masa.minihud.mixin.IMixinPiglinEntity; @@ -187,7 +187,7 @@ else if (trace.getType() == HitResult.Type.ENTITY) } else { - Pair pair = EntitiesDataStorage.getInstance().requestEntity(entity.getId()); + Pair pair = EntitiesDataManager.getInstance().requestEntity(entity.getId()); if (pair != null) { @@ -235,7 +235,7 @@ else if (trace.getType() == HitResult.Type.ENTITY) } } - inv = EntitiesDataStorage.getInstance().getBlockInventory(world, pos, false); + inv = EntitiesDataManager.getInstance().getBlockInventory(world, pos, false); } if (nbt != null && !nbt.isEmpty()) @@ -298,13 +298,13 @@ else if (entity instanceof PiglinEntity) // Fix for empty horse inv if (inv != null && inv.size() == 1 && - nbt.contains(NbtKeys.ITEMS) && - nbt.getList(NbtKeys.ITEMS, Constants.NBT.TAG_COMPOUND).size() > 1 && - !DataStorage.getInstance().hasIntegratedServer()) + nbt.contains(NbtKeys.ITEMS) && + nbt.getList(NbtKeys.ITEMS, Constants.NBT.TAG_COMPOUND).size() > 1 && + !DataStorage.getInstance().hasIntegratedServer()) { if (entity instanceof AbstractHorseEntity) { - inv2 = fi.dy.masa.minihud.util.InventoryUtils.getNbtInventoryHorseFix(nbt, -1, entity.getRegistryManager()); + inv2 = InventoryUtils.getNbtInventoryHorseFix(nbt, -1, entity.getRegistryManager()); } else { @@ -317,7 +317,7 @@ else if (inv != null && inv.size() == 1 && nbt.contains(NbtKeys.SADDLE) && !DataStorage.getInstance().hasIntegratedServer()) { - inv2 = fi.dy.masa.minihud.util.InventoryUtils.getNbtInventoryHorseFix(nbt, -1, entity.getRegistryManager()); + inv2 = InventoryUtils.getNbtInventoryHorseFix(nbt, -1, entity.getRegistryManager()); inv = null; } // Fix for empty Villager/Piglin inv diff --git a/src/main/resources/assets/minihud/lang/en_us.json b/src/main/resources/assets/minihud/lang/en_us.json index 448539022..bb5079602 100644 --- a/src/main/resources/assets/minihud/lang/en_us.json +++ b/src/main/resources/assets/minihud/lang/en_us.json @@ -284,11 +284,13 @@ "minihud.config.info_toggle.name.infoLookingAtBlockInChunk": "infoLookingAtBlockInChunk", "minihud.config.info_toggle.name.infoLookingAtEntity": "infoLookingAtEntity", "minihud.config.info_toggle.name.infoLookingAtEffects": "infoLookingAtEffects", + "minihud.config.info_toggle.name.infoLookingAtPlayerExp": "infoLookingAtPlayerExp", "minihud.config.info_toggle.name.infoMemoryUsage": "infoMemoryUsage", "minihud.config.info_toggle.name.infoMobCaps": "infoMobCaps", "minihud.config.info_toggle.name.infoLoadedChunksCount": "infoLoadedChunksCount", "minihud.config.info_toggle.name.infoPandaGene": "infoPandaGene", "minihud.config.info_toggle.name.infoParticleCount": "infoParticleCount", + "minihud.config.info_toggle.name.infoPlayerExperience": "infoPlayerExperience", "minihud.config.info_toggle.name.infoPing": "infoPing", "minihud.config.info_toggle.name.infoRegionFile": "infoRegionFile", "minihud.config.info_toggle.name.infoRotationPitch": "infoRotationPitch", @@ -340,11 +342,13 @@ "minihud.config.info_toggle.comment.infoLookingAtBlockInChunk": "Show which block within its containing chunk\nthe player is currently looking at", "minihud.config.info_toggle.comment.infoLookingAtEntity": "Show the entity name and health when looked at.\nMore data can be seen if used with Servux", "minihud.config.info_toggle.comment.infoLookingAtEffects": "Show the entities active status effects when looked at.\nMore data can be seen if used with Servux", + "minihud.config.info_toggle.comment.infoLookingAtPlayerExp": "Show another Player's experience values.", "minihud.config.info_toggle.comment.infoMemoryUsage": "Show the memory usage and allocation", "minihud.config.info_toggle.comment.infoMobCaps": "Show the mob caps\n\n§dNote: Currently only works on Carpet servers!\n§6The data is currently only parsed from the player list footer on Carpet servers,\n§6if you have subscribed to the data with '/log mobcaps'", "minihud.config.info_toggle.comment.infoLoadedChunksCount": "Show the number of loaded chunks on the client", "minihud.config.info_toggle.comment.infoPandaGene": "Show the gene of the panda being looked at", "minihud.config.info_toggle.comment.infoParticleCount": "Show the currently renderer particle count (P from F3)", + "minihud.config.info_toggle.comment.infoPlayerExperience": "Show the Player's Experience values", "minihud.config.info_toggle.comment.infoPing": "Show the current ping to the server", "minihud.config.info_toggle.comment.infoRegionFile": "Show the region file the player is currently within", "minihud.config.info_toggle.comment.infoRotationPitch": "Show the player's pitch rotation", @@ -380,18 +384,34 @@ "minihud.config.render_toggle.name.overlayStructureMainToggle": "overlayStructureMainToggle", "minihud.config.render_toggle.name.overlayVillagerInfo": "overlayVillagerInfo", "minihud.config.render_toggle.name.shapeRenderer": "shapeRenderer", + "minihud.config.render_toggle.name.debugDataMainToggle": "debugDataMainToggle", + "minihud.config.render_toggle.name.debugBeeDataEnabled": "debugBeeDataEnabled", + "minihud.config.render_toggle.name.debugBrainEnabled": "debugBrainEnabled", + "minihud.config.render_toggle.name.debugBreezeJumpEnabled": "debugBreezeJumpEnabled", "minihud.config.render_toggle.name.debugChunkBorder": "debugChunkBorder", + "minihud.config.render_toggle.name.debugChunkDebug": "debugChunkDebug", "minihud.config.render_toggle.name.debugChunkInfo": "debugChunkInfo", "minihud.config.render_toggle.name.debugChunkLoading": "debugChunkLoading", "minihud.config.render_toggle.name.debugChunkOcclusion": "debugChunkOcclusion", "minihud.config.render_toggle.name.debugCollisionBoxEnabled": "debugCollisionBoxEnabled", + "minihud.config.render_toggle.name.debugHeightmapEnabled": "debugHeightmapEnabled", + "minihud.config.render_toggle.name.debugLightEnabled": "debugLightEnabled", "minihud.config.render_toggle.name.debugNeighborsUpdateEnabled": "debugNeighborsUpdateEnabled", + "minihud.config.render_toggle.name.debugGameTestEnabled": "debugGameTestEnabled", + "minihud.config.render_toggle.name.debugGameEventsEnabled": "debugGameEventsEnabled", + "minihud.config.render_toggle.name.debugGoalSelectorEnabled": "debugGoalSelectorEnabled", "minihud.config.render_toggle.name.debugOctreeEnabled": "debugOctreeEnabled", "minihud.config.render_toggle.name.debugPathfindingEnabled": "debugPathfindingEnabled", + "minihud.config.render_toggle.name.debugRaidCenterEnabled": "debugRaidCenterEnabled", "minihud.config.render_toggle.name.debugRedstoneUpdateOrder": "debugRedstoneUpdateOrder", + "minihud.config.render_toggle.name.debugSkylightEnabled": "debugSkylightEnabled", "minihud.config.render_toggle.name.debugSolidFaceEnabled": "debugSolidFaceEnabled", + "minihud.config.render_toggle.name.debugStructuresEnabled": "debugStructuresEnabled", "minihud.config.render_toggle.name.debugSupportingBlock": "debugSupportingBlock", "minihud.config.render_toggle.name.debugWaterEnabled": "debugWaterEnabled", + "minihud.config.render_toggle.name.debugVillageEnabled": "debugVillageEnabled", + "minihud.config.render_toggle.name.debugVillageSectionsEnabled": "debugVillageSectionsEnabled", + "minihud.config.render_toggle.name.debugWorldGenEnabled": "debugWorldGenEnabled", "minihud.config.render_toggle.comment.overlayBeaconRange": "Toggle the Beacon Range overlay renderer", "minihud.config.render_toggle.comment.overlayBiomeBorder": "Toggle the Biome Border overlay renderer", @@ -408,18 +428,35 @@ "minihud.config.render_toggle.comment.overlayStructureMainToggle": "Main toggle for all structure bounding boxes", "minihud.config.render_toggle.comment.overlayVillagerInfo": "Toggle the villager offers render.\nDisplays the enchantment books it sells.", "minihud.config.render_toggle.comment.shapeRenderer": "The main toggle for the shape renderer", + + "minihud.config.render_toggle.comment.debugDataMainToggle": "Toggles the Debug Data Service from either\nSingle Player, or via Servux, and this\ndisables all optional Debug Renderers.", + "minihud.config.render_toggle.comment.debugBrainEnabled": "Toggles the vanilla Brain debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugBeeDataEnabled": "Toggles the vanilla Bee Data debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugBreezeJumpEnabled": "Toggles the vanilla Breeze Jump debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux", "minihud.config.render_toggle.comment.debugChunkBorder": "Toggles the vanilla Chunk Border debug renderer", + "minihud.config.render_toggle.comment.debugChunkDebug": "Toggles the vanilla Chunk Debug debug renderer", "minihud.config.render_toggle.comment.debugChunkInfo": "Toggles the vanilla Chunk Info debug renderer", "minihud.config.render_toggle.comment.debugChunkLoading": "Toggles the vanilla Chunk Loading debug renderer", "minihud.config.render_toggle.comment.debugChunkOcclusion": "Toggles the vanilla Chunk Occlusion debug renderer", "minihud.config.render_toggle.comment.debugCollisionBoxEnabled": "Toggles the vanilla Block Collision Boxes debug renderer", - "minihud.config.render_toggle.comment.debugNeighborsUpdateEnabled": "Toggles the vanilla Block Neighbor Updates debug renderer", + "minihud.config.render_toggle.comment.debugHeightmapEnabled": "Toggles the vanilla Heightmap debug renderer", + "minihud.config.render_toggle.comment.debugLightEnabled": "Toggles the vanilla Light debug renderer", + "minihud.config.render_toggle.comment.debugNeighborsUpdateEnabled": "Toggles the vanilla Block Neighbor Updates debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugGameTestEnabled": "Toggles the vanilla Game Test debug renderer\n§6WARNING! This requires Server-Side data\n§6and it is currently broken.", + "minihud.config.render_toggle.comment.debugGameEventsEnabled": "Toggles the vanilla Game Events debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugGoalSelectorEnabled": "Toggles the vanilla Goal Selector debug renderer", "minihud.config.render_toggle.comment.debugOctreeEnabled": "Toggles the vanilla Octree debug renderer", - "minihud.config.render_toggle.comment.debugPathfindingEnabled": "Toggles the vanilla Pathfinding debug renderer", - "minihud.config.render_toggle.comment.debugRedstoneUpdateOrder": "Toggles the vanilla Redstone Update Order debug renderer", + "minihud.config.render_toggle.comment.debugPathfindingEnabled": "Toggles the vanilla Pathfinding debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugRaidCenterEnabled": "Toggles the vanilla Raid Center debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugRedstoneUpdateOrder": "Toggles the vanilla Redstone Update Order debug renderer\n§6WARNING! This requires Server-Side data\n§6and it is currently broken.", + "minihud.config.render_toggle.comment.debugSkylightEnabled": "Toggles the vanilla Skylight debug renderer", "minihud.config.render_toggle.comment.debugSolidFaceEnabled": "Toggles the vanilla Block Solid Faces debug renderer", + "minihud.config.render_toggle.comment.debugStructuresEnabled": "Toggles the vanilla Structures debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", "minihud.config.render_toggle.comment.debugSupportingBlock": "Toggles the vanilla Supporting Block debug renderer", "minihud.config.render_toggle.comment.debugWaterEnabled": "Toggles the vanilla Water debug renderer", + "minihud.config.render_toggle.comment.debugVillageEnabled": "Toggles the vanilla Village debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugVillageSectionsEnabled": "Toggles the vanilla Village Sections debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugWorldGenEnabled": "Toggles the vanilla World Gen debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", "minihud.config.render_toggle.prettyName.overlayBeaconRange": "Beacon Range overlay", "minihud.config.render_toggle.prettyName.overlayBiomeBorder": "Biome Border overlay", @@ -436,18 +473,35 @@ "minihud.config.render_toggle.prettyName.overlayStructureMainToggle": "Structure Bounding Boxes main", "minihud.config.render_toggle.prettyName.overlayVillagerInfo": "Villager offers overlay", "minihud.config.render_toggle.prettyName.shapeRenderer": "Shape Renderer", + + "minihud.config.render_toggle.prettyName.debugDataMainToggle": "Debug Data Main Toggle", + "minihud.config.render_toggle.prettyName.debugBrainEnabled": "Brain Data", + "minihud.config.render_toggle.prettyName.debugBeeDataEnabled": "Bee Data", + "minihud.config.render_toggle.prettyName.debugBreezeJumpEnabled": "Breeze Jump", "minihud.config.render_toggle.prettyName.debugChunkBorder": "Chunk Border", + "minihud.config.render_toggle.prettyName.debugChunkDebug": "Chunk Debug", "minihud.config.render_toggle.prettyName.debugChunkInfo": "Chunk Info", "minihud.config.render_toggle.prettyName.debugChunkLoading": "Chunk Loading", "minihud.config.render_toggle.prettyName.debugChunkOcclusion": "Chunk Occlusion", "minihud.config.render_toggle.prettyName.debugCollisionBoxEnabled": "Block Collision Boxes", + "minihud.config.render_toggle.prettyName.debugHeightmapEnabled": "Heightmap", + "minihud.config.render_toggle.prettyName.debugLightEnabled": "Light", "minihud.config.render_toggle.prettyName.debugNeighborsUpdateEnabled": "Block Neighbor Updates", + "minihud.config.render_toggle.prettyName.debugGameTestEnabled": "Game Test", + "minihud.config.render_toggle.prettyName.debugGameEventsEnabled": "Game Events", + "minihud.config.render_toggle.prettyName.debugGoalSelectorEnabled": "Goal Selector", "minihud.config.render_toggle.prettyName.debugOctreeEnabled": "Octree Debug", "minihud.config.render_toggle.prettyName.debugPathfindingEnabled": "Pathfinding", + "minihud.config.render_toggle.prettyName.debugRaidCenterEnabled": "Raid Center", "minihud.config.render_toggle.prettyName.debugRedstoneUpdateOrder": "Redstone Update Order", + "minihud.config.render_toggle.prettyName.debugSkylightEnabled": "Sky Light", "minihud.config.render_toggle.prettyName.debugSolidFaceEnabled": "Block Solid Faces", + "minihud.config.render_toggle.prettyName.debugStructuresEnabled": "Structures", "minihud.config.render_toggle.prettyName.debugSupportingBlock": "Supporting Block", "minihud.config.render_toggle.prettyName.debugWaterEnabled": "Water", + "minihud.config.render_toggle.prettyName.debugVillageEnabled": "Village", + "minihud.config.render_toggle.prettyName.debugVillageSectionsEnabled": "Village Sections", + "minihud.config.render_toggle.prettyName.debugWorldGenEnabled": "World Gen", "minihud.config.structure_toggle.name.ancient_city": "Ancient City", "minihud.config.structure_toggle.comment.ancient_city": "Toggle Ancient City structure bounding boxes rendering", @@ -912,6 +966,7 @@ "minihud.info_line.tile_entities": "Client world TE - L: ?, T: ? - TODO 1.17", "minihud.info_line.entities_client_world": "Entities - Client: %d", "minihud.info_line.entities_client_world.server": "Entities - Client: %d - Server: %d", + "minihud.info_line.player_experience": "Experience: %d / %.2f%% (total %d)", "minihud.info_line.slime_chunk": "Slime chunk: %s", "minihud.info_line.slime_chunk.yes": "§aYES§r", "minihud.info_line.slime_chunk.no": "§cNO§r", @@ -922,6 +977,7 @@ "minihud.info_line.looking_at_effects": "Status Effect: %s / %s%s %s", "minihud.info_line.looking_at_effects.amplifier": "x%d / ", "minihud.info_line.looking_at_effects.infinite": "INF", + "minihud.info_line.looking_at_player_exp": "Target Experience: %d / %.2f%% (total %d)", "minihud.info_line.entity_variant.axolotl": "Axolotl Color: §b%s§r", "minihud.info_line.entity_variant.cat": "Cat Variant: §b%s§r (%s collar)", "minihud.info_line.entity_variant.frog": "Frog Variant: §b%s§r", diff --git a/src/main/resources/assets/minihud/lang/zh_cn.json b/src/main/resources/assets/minihud/lang/zh_cn.json index 2c1c68b37..4f5960898 100644 --- a/src/main/resources/assets/minihud/lang/zh_cn.json +++ b/src/main/resources/assets/minihud/lang/zh_cn.json @@ -1,875 +1,929 @@ { - "malilib.gui.button.render_layers_gui.set_to_player": "定位至玩家", - "minihud.config.generic.name.axolotlTooltips": "显示美西螈桶种类", - "minihud.config.generic.name.beeTooltips": "显示蜂巢物品蜜蜂信息", - "minihud.config.generic.name.honeyTooltips": "显示蜂巢物品蜂蜜信息", - "minihud.config.generic.name.biomeOverlayRange": "群系水平渲染范围", - "minihud.config.generic.name.biomeOverlayRangeVertical": "群系垂直渲染范围", - "minihud.config.generic.name.biomeOverlaySingleColor": "群系边界单一颜色模式", - "minihud.config.generic.name.blockPosFormat": "玩家方块位置格式", - "minihud.config.generic.name.blockGridOverlayMode": "方块网格叠加模式", - "minihud.config.generic.name.blockGridOverlayRadius": "方块网格覆盖半径", - "minihud.config.generic.name.coordinateFormat": "玩家坐标格式", - "minihud.config.generic.name.dateFormatReal": "现实时间格式", - "minihud.config.generic.name.dateFormatMinecraft": "游戏时间格式", - "minihud.config.generic.name.debugMessages": "调试信息", - "minihud.config.generic.name.debugRendererPathFindingEnablePointWidth": "寻路指示器路径点宽度", - "minihud.config.generic.name.dontClearStoredSeedOnDimensionChange": "改变维度不清除种子", - "minihud.config.generic.name.entityDataSync": "实体数据同步", - "minihud.config.generic.name.entityDataSyncBackup": "备用实体数据同步", - "minihud.config.generic.name.enableVanillaDebugRendererFix": "原版调试渲染器修复", - "minihud.config.generic.name.fontScale": "字体大小", - "minihud.config.generic.name.hudAlignment": "HUD 位置", - "minihud.config.generic.name.inventoryPreview": "容器预览快捷键", - "minihud.config.generic.name.inventoryPreviewEnabled": "启用容器预览", - "minihud.config.generic.name.inventoryPreviewToggleScreen": "容器预览鼠标释放", - "minihud.config.generic.name.lightLevelAutoHeight": "光照等级渲染自动高度", - "minihud.config.generic.name.lightLevelColoredNumbers": "光照等级渲染彩色数字", - "minihud.config.generic.name.lightLevelCollisionCheck": "光照等级渲染碰撞箱检查", - "minihud.config.generic.name.lightLevelMarkerCondition": "光照等级标记渲染条件", - "minihud.config.generic.name.lightLevelMarkers": "亮度不足标记类型", - "minihud.config.generic.name.lightLevelMarkerSize": "亮度不足标记大小", - "minihud.config.generic.name.lightLevelNumberCondition": "光照等级渲染显示数字条件", - "minihud.config.generic.name.lightLevelNumbers": "光照等级渲染显示类型", - "minihud.config.generic.name.lightLevelNumberOffsetBlockX": "方块光照等级显示横移", - "minihud.config.generic.name.lightLevelNumberOffsetBlockY": "方块光照等级显示纵移", - "minihud.config.generic.name.lightLevelNumberOffsetSkyX": "天空光照等级显示横移", - "minihud.config.generic.name.lightLevelNumberOffsetSkyY": "天空光照等级显示纵移", - "minihud.config.generic.name.lightLevelNumberRotation": "光照等级渲染旋转", - "minihud.config.generic.name.lightLevelRange": "光照等级渲染范围", - "minihud.config.generic.name.lightLevelRenderOffset": "光照渲染 Y 轴偏移", - "minihud.config.generic.name.lightLevelRenderThrough": "光照等级渲染透视", - "minihud.config.generic.name.lightLevelSkipBlockCheck": "光照等级渲染略过生成检测", - "minihud.config.generic.name.lightLevelThresholdDim": "光照等级渲染 Dim 阈值", - "minihud.config.generic.name.lightLevelThresholdSafe": "光照等级渲染 Safe 阈值", - "minihud.config.generic.name.lightLevelUnderWater": "强制水下渲染光照等级", - "minihud.config.generic.name.mainRenderingToggle": "主开关", - "minihud.config.generic.name.mapPreview": "地图预览", - "minihud.config.generic.name.mapPreviewRequireShift": "地图预览需要 Shift", - "minihud.config.generic.name.mapPreviewSize": "地图预览尺寸", - "minihud.config.generic.name.moveShapeToPlayer": "将形状移动到玩家", - "minihud.config.generic.name.offsetSubtitleHud": "HUD子标题文字偏移", - "minihud.config.generic.name.openConfigGui": "打开设置界面", - "minihud.config.generic.name.requireSneak": "需要潜行", - "minihud.config.generic.name.requiredKey": "渲染按键", - "minihud.config.generic.name.serverNbtRequestRate": "服务器 Nbt 请求速率", - "minihud.config.generic.name.setDistanceReferencePoint": "设置距离参考点", - "minihud.config.generic.name.shapeEditor": "形状编辑器", - "minihud.config.generic.name.shulkerBoxPreview": "潜影盒预览", - "minihud.config.generic.name.shulkerDisplayBgColor": "潜影盒预览背景色", - "minihud.config.generic.name.shulkerDisplayRequireShift": "潜影盒预览是否需要按住 Shift 键", - "minihud.config.generic.name.slimeChunkTopToPlayer": "史莱姆区块最高点跟随玩家", - "minihud.config.generic.name.slimeChunkOverlayRadius": "史莱姆区块渲染半径", - "minihud.config.generic.name.sortLinesByLength": "按文本长度排序", - "minihud.config.generic.name.sortLinesReversed": "文本长度反序", - "minihud.config.generic.name.spawnPlayerOuterOverlayEnabled": "渲染玩家世界生成范围", - "minihud.config.generic.name.spawnPlayerRedstoneOverlayEnabled": "渲染玩家弱加载范围", - "minihud.config.generic.name.spawnRealOuterOverlayEnabled": "渲染出生点世界生成范围", - "minihud.config.generic.name.spawnRealRedstoneOverlayEnabled": "渲染出生点弱加载范围", - "minihud.config.generic.name.spawnableColumnHeightsOverlayRadius": "顶层方块显示范围", - "minihud.config.generic.name.structuresRenderThrough": "结构渲染穿透", - "minihud.config.generic.name.textPosX": "HUD 横移", - "minihud.config.generic.name.textPosY": "HUD 纵移", - "minihud.config.generic.name.timeDayDivisor": "时间因数", - "minihud.config.generic.name.timeTotalDivisor": "总时间因数", - "minihud.config.generic.name.useCustomizedCoordinateFormat": "使用自定义坐标格式", - "minihud.config.generic.name.useFontShadow": "使用字体阴影", - "minihud.config.generic.name.useTextBackground": "使用文本背景", - "minihud.config.generic.name.villagerConversionTicks": "僵尸村民治疗计时", - "minihud.config.generic.name.villagerOfferEnchantmentBooks": "显示村民交易附魔书", - "minihud.config.generic.name.villagerOfferPriceRange": "显示村民交易附魔书价格区间", - "minihud.config.generic.name.villagerOfferHighestLevelOnly": "仅显示村民最高等级附魔书", - "minihud.config.generic.name.villagerOfferLowestPriceNearby": "仅显示村民最低价格附魔书", - "minihud.config.generic.name.villagerOfferPriceThreshold": "村民交易价格阈值", - "minihud.config.generic.comment.axolotlTooltips": "在美西螈桶的提示框中显示品种", - "minihud.config.generic.comment.beeTooltips": "在蜂箱和蜂巢物品的提示框中显示蜜蜂数量", - "minihud.config.generic.comment.honeyTooltips": "在蜂箱和蜂巢物品的提示框中显示蜂蜜等级\n(译注:一般生存模式下不会起作用)", - "minihud.config.generic.comment.biomeOverlayRange": "生物群系边界渲染器的水平区块半径\n需要开启 §6[生物群系边界显示]§f", - "minihud.config.generic.comment.biomeOverlayRangeVertical": "生物群系边界渲染器的垂直(子)区块半径\n需要开启 §6[生物群系边界显示]§f", - "minihud.config.generic.comment.biomeOverlaySingleColor": "开启后,那么生物群落边界叠加时将为所有生物群落使用相同的颜色。\n当相邻的生物群系的颜色和线条没有混合成一大堆乱七八糟的颜色时,\n会看起来「不会那么凌乱」。\n需要开启 §6[生物群系边界显示]§f", - "minihud.config.generic.comment.blockPosFormat": "§6[玩家所在方块坐标]§f 中显示格式的字符串。\n字符串中需要至少三个\"%%d\"\n预设值: \"Block: %%d, %%d, %%d\"", - "minihud.config.generic.comment.blockGridOverlayMode": "方块网格的渲染模式\n需要开启 §6[方块网格显示]§f", - "minihud.config.generic.comment.blockGridOverlayRadius": "方块网格的渲染范围半径\n需要开启 §6[方块网格显示]§f", - "minihud.config.generic.comment.coordinateFormat": "§6[玩家坐标信息]§f 中显示格式的字符串。\n字符串中需要至少三个\"%%f\"\n预设值: \"x: %%.1f y: %%.1f z: %%.1f\"", - "minihud.config.generic.comment.dateFormatReal": "§6[现实时间信息]§f 中显示日期格式的字符串,请参阅 Java SimpleDateFormat 格式", - "minihud.config.generic.comment.dateFormatMinecraft": "§6[格式化游戏时间]§f 中显示格式的字符串\n支持的占位符有:\n{DAY_1}(初始值为 1 的日)、{DAY}(初始值为 0 的日)、\n{HOUR}(小时)、{MIN}(分钟)、{SEC}(秒)、\n{MOON}(月相)。", - "minihud.config.generic.comment.debugMessages": "在控制台中启用调试信息", - "minihud.config.generic.comment.debugRendererPathFindingEnablePointWidth": "开启后,原版寻路指示器将显示路径点宽度的框线。", - "minihud.config.generic.comment.dontClearStoredSeedOnDimensionChange": "当只是改变维度时,不要清除存储的世界种子。\n有些 Mod 可能会在每个维度使用不同的种子,所以你可能需要修改这个,\n以防你的服务器 Mod 中不同维度有不同的世界种子。", - "minihud.config.generic.comment.entityDataSync": "使用 Servux 的实体同步协议获取服务端实体数据", - "minihud.config.generic.comment.entityDataSyncBackup": "当 Servux 不可用时使用原版 NBT 查询协议同步实体数据。\n这需要 OP 权限。(译注:需要2级及以上权限)", - "minihud.config.generic.comment.enableVanillaDebugRendererFix": "如果该选项启用,那么 OpenGL 所显示的状态是固定的。", - "minihud.config.generic.comment.fontScale": "HUD 中字体的缩放系数。\n默认值:0.5", - "minihud.config.generic.comment.hudAlignment": "HUD 的位置", - "minihud.config.generic.comment.inventoryPreview": "用于激活容器预览的按键", - "minihud.config.generic.comment.inventoryPreviewEnabled": "是否启用容器预览功能。", - "minihud.config.generic.comment.inventoryPreviewToggleScreen": "按下后释放鼠标指针,以便查看具体的物品信息。", - "minihud.config.generic.comment.lightLevelAutoHeight": "如果启用,那么光照等级的覆盖层将自动提升到方块的顶部。\n§6注:这将使覆盖层也会呈现在像半砖一样的东西上,即使在那里生物将不能生成。\n§6你可以打开 §6[光照等级渲染碰撞箱检查]§f 选项来阻止它显示。", - "minihud.config.generic.comment.lightLevelColoredNumbers": "设定光照等级的数字显示是使用彩色还是白色\n(§4这就是你用 True 和 False 的理由?——ZMDF§r)", - "minihud.config.generic.comment.lightLevelCollisionCheck": "如果启用,那么如果存在任何带有碰撞箱的方块,光照等级的覆盖层将不会被渲染。\n§6注意:这不能检查该方块是否能够刷怪!\n§6开启该功能后将忽略在不同状态下可以刷怪的方块,\n§6例如,打开活板门或门时可以阻止覆盖层显示,但它们以然可以刷怪。", - "minihud.config.generic.comment.lightLevelMarkerCondition": "何时该渲染光照等级的彩色标记", - "minihud.config.generic.comment.lightLevelMarkers": "在满足 §6[光照等级标记渲染条件]§f 的条件时\n应该使用哪种方式标记满足条件的方块", - "minihud.config.generic.comment.lightLevelMarkerSize": "在满足 §6[光照等级标记渲染条件]§f 的条件时标记的大小。\n范围:0.0 - 1.0", - "minihud.config.generic.comment.lightLevelNumberCondition": "何时渲染光照等级", - "minihud.config.generic.comment.lightLevelNumbers": "调整光照等级显示需要显示的亮度来源。", - "minihud.config.generic.comment.lightLevelNumberOffsetBlockX": "显示方块亮度的光照等级时,横向位移的距离。\n范围:0.0 - 1.0", - "minihud.config.generic.comment.lightLevelNumberOffsetBlockY": "显示方块亮度的光照等级时,纵向位移的距离。\n范围:0.0 - 1.0", - "minihud.config.generic.comment.lightLevelNumberOffsetSkyX": "显示天空亮度的光照等级时,横向位移的距离。\n范围:0.0 - 1.0", - "minihud.config.generic.comment.lightLevelNumberOffsetSkyY": "显示天空亮度的光照等级时,纵向位移的距离。\n范围:0.0 - 1.0", - "minihud.config.generic.comment.lightLevelNumberRotation": "开启后,亮度显示将跟随玩家旋转。", - "minihud.config.generic.comment.lightLevelRange": "亮度显示渲染的范围\n以玩家脚为中心,数值等于体心到面心距离的正方体", - "minihud.config.generic.comment.lightLevelRenderOffset": "光照等级渲染层的相对垂直偏移量。\n这是为了帮助解决方块表面潜在的 Y 轴冲突的问题。\n范围:0.0 - 1.0", - "minihud.config.generic.comment.lightLevelRenderThrough": "开启后,那么光照等级的覆盖层将穿过方块进行渲染。\n(§4填洞小帮手,就是眼得瞎 ——ZMDF§r)", - "minihud.config.generic.comment.lightLevelSkipBlockCheck": "光照等级渲染是否跳过下面方块的怪物生成检查。\n这将使覆盖层也出现在半砖和玻璃等方块的顶部。\n(§4妈妈再也不用担心做冰道的时候看不见光照等级了 ——ZMDF§r)", - "minihud.config.generic.comment.lightLevelThresholdDim": "被认为是「§oDim(昏暗)§r」的最大亮度。\n这是一个介于「Dark(§c红色数字§r)」和「Safe(§a绿色数字§r)」\n之间的用户可配置的额外级别。将其设置在安全阈值以下以禁用它。", - "minihud.config.generic.comment.lightLevelThresholdSafe": "被认为是「Safe(§a绿色数字§r)」的最低光照等级。", - "minihud.config.generic.comment.lightLevelUnderWater": "光照覆盖层是否应在水下呈现", - "minihud.config.generic.comment.mainRenderingToggle": "MiniHUD 的主开关,包括信息行和所有渲染器。", - "minihud.config.generic.comment.mapPreview": "开启后,当鼠标悬停在地图上时,按住 Shift 键可以预览地图。", - "minihud.config.generic.comment.mapPreviewRequireShift": "预览地图是否需要按住 Shift 按键。", - "minihud.config.generic.comment.mapPreviewSize": "预览地图渲染的大小", - "minihud.config.generic.comment.moveShapeToPlayer": "将当前选择的形状移动到玩家(或玩家摄影机)的位置。", - "minihud.config.generic.comment.offsetSubtitleHud": "当 HUD 显示在右下角,且字幕启用时,\n字幕将被偏移显示在信息 HUD 上方。", - "minihud.config.generic.comment.openConfigGui": "打开游戏内配置 GUI 的热键", - "minihud.config.generic.comment.requireSneak": "只有当玩家潜行时,才显示 HUD", - "minihud.config.generic.comment.requiredKey": "只有按下此快捷键时,才显示 HUD", - "minihud.config.generic.comment.serverNbtRequestRate": "向服务器请求实体数据同步的速率", - "minihud.config.generic.comment.setDistanceReferencePoint": "储存玩家位置的快捷键\n用于设置距离参考点位", - "minihud.config.generic.comment.shapeEditor": "打开所选形状的形状编辑界面", - "minihud.config.generic.comment.shulkerBoxPreview": "启用后, 在按住Shift的同时将鼠标位于潜影盒将预览潜影盒内的物品", - "minihud.config.generic.comment.shulkerDisplayBgColor": "将 §6[潜影盒预览]§f 功能预览界面的背景颜色设定为潜影盒的颜色。", - "minihud.config.generic.comment.shulkerDisplayRequireShift": "打开潜影盒预览是否需要按住Shift", - "minihud.config.generic.comment.slimeChunkTopToPlayer": "开启时, 在开启史莱姆区块显示时显示的最高点将会设为玩家的y坐标.\n关闭时, 在开启史莱姆区块显示时最高点将设为y = 40", - "minihud.config.generic.comment.slimeChunkOverlayRadius": "渲染史莱姆区块显示的区块半径\n有效范围为 -1 到 40\n特别的 -1 = 当前区块渲染范围", - "minihud.config.generic.comment.sortLinesByLength": "对显示的信息根据其长度\n由长至短自上而下进行排列", - "minihud.config.generic.comment.sortLinesReversed": "在启用 §6[按文本长度排序]§f 后,激活该选项会使得按长度排序反向\n关闭状态——由长至短自上而下\n开启状态——由短至长自上而下", - "minihud.config.generic.comment.spawnPlayerOuterOverlayEnabled": "启用玩家世界生成范围的渲染器(紫)\n需要开启 §6[玩家加载范围显示]§f", - "minihud.config.generic.comment.spawnPlayerRedstoneOverlayEnabled": "启用玩家弱加载范围的渲染器(黄)\n需要开启 §6[玩家加载范围显示]§f", - "minihud.config.generic.comment.spawnRealOuterOverlayEnabled": "启用出生点世界生成范围的渲染器(棕)\n需要开启 §6[出生点加载范围显示]§f", - "minihud.config.generic.comment.spawnRealRedstoneOverlayEnabled": "启用出生点弱加载范围的渲染器(黄)\n需要开启 §6[出生点加载范围显示]§f", - "minihud.config.generic.comment.spawnableColumnHeightsOverlayRadius": "顶层方块显示的渲染范围\n以玩家为中心,数值等于体心到面心距离的正方体,\n范围:0 - 128", - "minihud.config.generic.comment.structuresRenderThrough": "开启后,结构轮廓覆盖层将穿过方块进行渲染。", - "minihud.config.generic.comment.textPosX": "HUD 距离屏幕边缘的横向距离(默认为 4)", - "minihud.config.generic.comment.textPosY": "HUD 距离屏幕边缘的纵向距离(默认为 4)", - "minihud.config.generic.comment.timeDayDivisor": "一天时间的模型因数\n(译注:可以理解为把一天分为多少份)", - "minihud.config.generic.comment.timeTotalDivisor": "整体世界时间的模型因数\n(译注:可以理解为把一天分为多少份)", - "minihud.config.generic.comment.useCustomizedCoordinateFormat": "是否在 §6[玩家坐标信息]§f 中使用 §6[玩家坐标格式]§f 的自定义格式", - "minihud.config.generic.comment.useFontShadow": "使用文本阴影", - "minihud.config.generic.comment.useTextBackground": "在 HUD 中使用纯色背景色,使其拥有底色。", - "minihud.config.generic.comment.villagerConversionTicks": "显示僵尸村民的转换时间。\n需要开启 §6[村民信息显示]§f", - "minihud.config.generic.comment.villagerOfferEnchantmentBooks": "显示村民售卖附魔书的价格\n需要开启 §6[村民信息显示]§f", - "minihud.config.generic.comment.villagerOfferPriceRange": "显示村民交易附魔书的价格区间\n需要开启 §6[村民信息显示]§f", - "minihud.config.generic.comment.villagerOfferHighestLevelOnly": "只显示售卖最高等级的附魔书的村民交易\n需要开启 §6[村民信息显示]§f", - "minihud.config.generic.comment.villagerOfferLowestPriceNearby": "只显示相同附魔最便宜的村民交易\n需要开启 §6[村民信息显示]§f", - "minihud.config.generic.comment.villagerOfferPriceThreshold": "只显示价格低于此比例的村民交易\n若要显示全部请设为1.0\n需要开启 §6[村民信息显示]§f", - "minihud.config.generic.prettyName.mainRenderingToggle": "MiniHUD 主开关", - "minihud.config.colors.name.beaconRangeLvl1": "1 级信标颜色", - "minihud.config.colors.name.beaconRangeLvl2": "2 级信标颜色", - "minihud.config.colors.name.beaconRangeLvl3": "3 级信标颜色", - "minihud.config.colors.name.beaconRangeLvl4": "4 级信标颜色", - "minihud.config.colors.name.blockGridOverlayColor": "方块网格颜色", - "minihud.config.colors.name.conduitRange": "潮涌核心范围颜色", - "minihud.config.colors.name.lightLevelMarkerBlockLit": "亮度充足标记颜色", - "minihud.config.colors.name.lightLevelMarkerDark": "亮度不足标记颜色", - "minihud.config.colors.name.lightLevelMarkerDim": "亮度昏暗标记颜色", - "minihud.config.colors.name.lightLevelMarkerSkyLit": "天空亮度标记颜色", - "minihud.config.colors.name.lightLevelNumberBlockDark": "方块亮度不足颜色", - "minihud.config.colors.name.lightLevelNumberBlockDim": "方块亮度昏暗数字颜色", - "minihud.config.colors.name.lightLevelNumberBlockLit": "方块亮度充足颜色", - "minihud.config.colors.name.lightLevelNumberSkyDark": "天空亮度不足颜色", - "minihud.config.colors.name.lightLevelNumberSkyDim": "天空亮度昏暗数字颜色", - "minihud.config.colors.name.lightLevelNumberSkyLit": "天空亮度充足颜色", - "minihud.config.colors.name.randomTicksFixedOverlayColor": "固定随机刻范围颜色", - "minihud.config.colors.name.randomTicksPlayerOverlayColor": "跟随玩家移动随机刻范围颜色", - "minihud.config.colors.name.regionOverlayColor": "区域边界颜色", - "minihud.config.colors.name.shapeAdjustableSpawnSphere": "可调节生成球体颜色", - "minihud.config.colors.name.shapeBox": "长方体颜色", - "minihud.config.colors.name.shapeCanDespawnSphere": "怪物可能消失范围球体颜色", - "minihud.config.colors.name.shapeCanSpawnSphere": "可刷怪范围球体颜色", - "minihud.config.colors.name.shapeCircle": "圆环颜色", - "minihud.config.colors.name.shapeDespawnSphere": "怪物强制卸载范围球体颜色", - "minihud.config.colors.name.shapeLineBlocky": "直线颜色", - "minihud.config.colors.name.shapeSphereBlocky": "球体颜色", - "minihud.config.colors.name.slimeChunksOverlayColor": "史莱姆区块颜色", - "minihud.config.colors.name.spawnPlayerEntityOverlayColor": "玩家强加载范围颜色", - "minihud.config.colors.name.spawnPlayerRedstoneOverlayColor": "玩家弱加载范围颜色", - "minihud.config.colors.name.spawnPlayerLazyOverlayColor": "玩家加载边界范围颜色", - "minihud.config.colors.name.spawnPlayerOuterOverlayColor": "玩家世界生成范围颜色", - "minihud.config.colors.name.spawnRealEntityOverlayColor": "出生点强加载范围颜色", - "minihud.config.colors.name.spawnRealRedstoneOverlayColor": "出生点弱加载范围颜色", - "minihud.config.colors.name.spawnRealLazyOverlayColor": "出生点加载边界范围颜色", - "minihud.config.colors.name.spawnRealOuterOverlayColor": "出生点世界生成范围颜色", - "minihud.config.colors.name.spawnableColumnHeightsOverlayColor": "顶层方块显示颜色", - "minihud.config.colors.name.textBackgroundColor": "文本背景颜色", - "minihud.config.colors.name.textColor": "文本颜色", - "minihud.config.colors.comment.beaconRangeLvl1": "1级信标范围的颜色", - "minihud.config.colors.comment.beaconRangeLvl2": "2级信标范围的颜色", - "minihud.config.colors.comment.beaconRangeLvl3": "3级信标范围的颜色", - "minihud.config.colors.comment.beaconRangeLvl4": "4级信标范围的颜色", - "minihud.config.colors.comment.blockGridOverlayColor": "方块网格覆盖颜色", - "minihud.config.colors.comment.conduitRange": "潮涌核心覆盖范围的颜色", - "minihud.config.colors.comment.lightLevelMarkerBlockLit": "安全点标记的颜色 (白天)", - "minihud.config.colors.comment.lightLevelMarkerDark": "可生成点的标记颜色", - "minihud.config.colors.comment.lightLevelMarkerDim": "\"dim\"标记的颜色 (用户可定义等级)", - "minihud.config.colors.comment.lightLevelMarkerSkyLit": "安全点标记的颜色 (白天)", - "minihud.config.colors.comment.lightLevelNumberBlockDark": "方块亮度低于 §6[光照等级渲染 Safe 阈值]§f时标记的颜色", - "minihud.config.colors.comment.lightLevelNumberBlockDim": "方块亮度大于 §6[光照等级渲染 Dim 阈值]§f \n且小于 §6[光照等级渲染 Safe 阈值]§f 时标记的颜色", - "minihud.config.colors.comment.lightLevelNumberBlockLit": "方块亮度大于等于 §6[光照等级渲染 Safe 阈值]§f时标记的颜色", - "minihud.config.colors.comment.lightLevelNumberSkyDark": "天空亮度低于 §6[光照等级渲染 Safe 阈值]§f时标记的颜色", - "minihud.config.colors.comment.lightLevelNumberSkyDim": "天空亮度大于 §6[光照等级渲染 Dim 阈值]§f \n且小于 §6[光照等级渲染 Safe 阈值]§f 时标记的颜色", - "minihud.config.colors.comment.lightLevelNumberSkyLit": "天空亮度大于等于 §6[光照等级渲染 Safe 阈值]§f时标记的颜色", - "minihud.config.colors.comment.randomTicksFixedOverlayColor": "开启时位置的随机刻区域的颜色", - "minihud.config.colors.comment.randomTicksPlayerOverlayColor": "跟随玩家运动显示的随机刻区域的颜色", - "minihud.config.colors.comment.regionOverlayColor": "区域文件边界的颜色", - "minihud.config.colors.comment.shapeAdjustableSpawnSphere": "§6[可调节生成球体]§f的默认颜色。\n每个球体的颜色可以通过其配置 GUI 进行更改。", - "minihud.config.colors.comment.shapeBox": "§6[长方体]§f 的默认颜色。\n每个长方体的颜色可以通过其配置 GUI 进行更改。", - "minihud.config.colors.comment.shapeCanDespawnSphere": "§6[怪物可能消失范围球体]§f的默认颜色。\n每个球体的颜色可以通过其配置 GUI 进行更改。", - "minihud.config.colors.comment.shapeCanSpawnSphere": "§6[可刷怪范围球体]§f的默认颜色。\n每个球体的颜色可以通过其配置 GUI 进行更改。", - "minihud.config.colors.comment.shapeCircle": "§6[圆环]§f 的默认颜色。\n每个圆环的颜色可以通过其配置 GUI 进行更改。", - "minihud.config.colors.comment.shapeDespawnSphere": "§6[怪物强制卸载范围球体]§f的默认颜色。\n每个球体的颜色可以通过其配置 GUI 进行更改。", - "minihud.config.colors.comment.shapeLineBlocky": "§6[直线]§f 的默认颜色。\n每个直线的颜色可以通过其配置 GUI 进行更改。", - "minihud.config.colors.comment.shapeSphereBlocky": "§6[球体]§f 的默认颜色。\n每个球体的颜色可以通过其配置 GUI 进行更改。", - "minihud.config.colors.comment.slimeChunksOverlayColor": "渲染史莱姆区块时的颜色", - "minihud.config.colors.comment.spawnPlayerEntityOverlayColor": "玩家加载范围中强加载区块的颜色\n§9蓝 - 强加载区块", - "minihud.config.colors.comment.spawnPlayerRedstoneOverlayColor": "玩家加载范围中弱加载区块的颜色\n§e黄 - 弱加载区块(默认关闭)", - "minihud.config.colors.comment.spawnPlayerLazyOverlayColor": "玩家加载范围中加载边界区块的颜色\n§d粉 - 加载边界区块", - "minihud.config.colors.comment.spawnPlayerOuterOverlayColor": "玩家加载范围中世界生成区块的颜色\n§5紫 - 世界生成区块,范围外的区块完全不加载(默认关闭)", - "minihud.config.colors.comment.spawnRealEntityOverlayColor": "出生点加载范围中强加载区块的颜色\n§a绿 - 强加载区块", - "minihud.config.colors.comment.spawnRealRedstoneOverlayColor": "出生点加载范围中弱加载区块的颜色\n§e黄 - 弱加载区块(默认关闭)", - "minihud.config.colors.comment.spawnRealLazyOverlayColor": "出生点加载范围中加载边界区块的颜色\n§c红 - 加载边界区块", - "minihud.config.colors.comment.spawnRealOuterOverlayColor": "出生点加载范围中世界生成区块的颜色\n§6棕 - 世界生成区块,范围外的区块完全不加载(默认关闭)", - "minihud.config.colors.comment.spawnableColumnHeightsOverlayColor": "区块最高位置的方块所显示的颜色", - "minihud.config.colors.comment.textBackgroundColor": "HUD中文本背景的颜色", - "minihud.config.colors.comment.textColor": "HUD中文本的颜色", - "minihud.config.info_toggle.name.infoBeeCount": "蜜蜂数量信息", - "minihud.config.info_toggle.name.infoBiome": "生物群系信息", - "minihud.config.info_toggle.name.infoBiomeRegistryName": "生物群系注册名信息", - "minihud.config.info_toggle.name.infoBlockBreakSpeed": "挖掘速度信息", - "minihud.config.info_toggle.name.infoBlockInChunk": "区块内方块信息", - "minihud.config.info_toggle.name.infoBlockPosition": "方块位置信息", - "minihud.config.info_toggle.name.infoBlockProperties": "方块属性信息", - "minihud.config.info_toggle.name.infoChunkPosition": "区块位置信息", - "minihud.config.info_toggle.name.infoChunkSections": "渲染区块信息", - "minihud.config.info_toggle.name.infoChunkSectionsLine": "渲染区块完整信息", - "minihud.config.info_toggle.name.infoChunkUpdates": "区块更新信息", - "minihud.config.info_toggle.name.infoCoordinates": "玩家坐标信息", - "minihud.config.info_toggle.name.infoCoordinatesScaled": "坐标映射信息", - "minihud.config.info_toggle.name.infoDifficulty": "区域难度信息", - "minihud.config.info_toggle.name.infoDimensionId": "维度信息", - "minihud.config.info_toggle.name.infoDistance": "距离信息", - "minihud.config.info_toggle.name.infoEntities": "实体数量信息", - "minihud.config.info_toggle.name.infoEntitiesClientWorld": "客户端世界实体信息", - "minihud.config.info_toggle.name.infoEntityRegistryName": "实体注册名信息", - "minihud.config.info_toggle.name.infoFacing": "朝向信息", - "minihud.config.info_toggle.name.infoFurnaceXp": "熔炉经验信息", - "minihud.config.info_toggle.name.infoFPS": "帧率信息", - "minihud.config.info_toggle.name.infoHoneyLevel": "蜂蜜等级信息", - "minihud.config.info_toggle.name.infoHorseSpeed": "马匹速度信息", - "minihud.config.info_toggle.name.infoHorseJump": "马匹跳跃信息", - "minihud.config.info_toggle.name.infoLightLevel": "光照等级信息", - "minihud.config.info_toggle.name.infoLookingAtBlock": "注视方块信息", - "minihud.config.info_toggle.name.infoLookingAtBlockInChunk": "注视区块内方块信息", - "minihud.config.info_toggle.name.infoLookingAtEntity": "注视实体信息", - "minihud.config.info_toggle.name.infoLookingAtEffects": "注视实体效果信息", - "minihud.config.info_toggle.name.infoMemoryUsage": "内存使用情况信息", - "minihud.config.info_toggle.name.infoMobCaps": "生物上限信息", - "minihud.config.info_toggle.name.infoLoadedChunksCount": "已加载区块数量", - "minihud.config.info_toggle.name.infoPandaGene": "熊猫基因信息", - "minihud.config.info_toggle.name.infoParticleCount": "粒子数量", - "minihud.config.info_toggle.name.infoPing": "延迟信息", - "minihud.config.info_toggle.name.infoRegionFile": "区域文件信息", - "minihud.config.info_toggle.name.infoRotationPitch": "旋转俯仰角信息", - "minihud.config.info_toggle.name.infoRotationYaw": "旋转方向角信息", - "minihud.config.info_toggle.name.infoServerTPS": "服务器TPS信息", - "minihud.config.info_toggle.name.infoServux": "服务器Servux信息", - "minihud.config.info_toggle.name.infoSlimeChunk": "史莱姆区块信息", - "minihud.config.info_toggle.name.infoSpeed": "速度信息", - "minihud.config.info_toggle.name.infoSpeedAxis": "轴速度信息", - "minihud.config.info_toggle.name.infoSpeedHV": "速度分量信息", - "minihud.config.info_toggle.name.infoSprinting": "奔跑信息", - "minihud.config.info_toggle.name.infoTileEntities": "方块实体信息", - "minihud.config.info_toggle.name.infoTimeDayModulo": "时间周期因数信息", - "minihud.config.info_toggle.name.infoTimeIRL": "现实时间信息", - "minihud.config.info_toggle.name.infoTimeTotalModulo": "总时间周期因数信息", - "minihud.config.info_toggle.name.infoTimeWorld": "世界开放时间信息", - "minihud.config.info_toggle.name.infoWorldTimeFormatted": "格式化游戏时间信息", - "minihud.config.info_toggle.name.infoWeather": "天气信息", - "minihud.config.info_toggle.name.infoZombieConversion": "僵尸村民转化信息", - "minihud.config.info_toggle.comment.infoBeeCount": "显示目标蜂巢或巢穴中的蜜蜂数量.\n§6注意:这仅在单人游戏中有效(没有服务器端支持时,\n§6将无法正常显示,但会在服务器存在Servux时正常显示)", - "minihud.config.info_toggle.comment.infoBiome": "显示当前生物群系的名称", - "minihud.config.info_toggle.comment.infoBiomeRegistryName": "显示当前生物群系的注册名称", - "minihud.config.info_toggle.comment.infoBlockBreakSpeed": "显示玩家在过去 100 个刻 (5 秒) 内\n的方块破坏速度", - "minihud.config.info_toggle.comment.infoBlockInChunk": "显示玩家在区块中的当前方块位置", - "minihud.config.info_toggle.comment.infoBlockPosition": "显示玩家当前的方块位置", - "minihud.config.info_toggle.comment.infoBlockProperties": "显示方块状态的属性和值", - "minihud.config.info_toggle.comment.infoChunkPosition": "显示玩家当前所在的区块", - "minihud.config.info_toggle.comment.infoChunkSections": "显示当前渲染的区块部分数量\n(F3 中的 C 值)", - "minihud.config.info_toggle.comment.infoChunkSectionsLine": "显示 F3 中 C 值的整行", - "minihud.config.info_toggle.comment.infoChunkUpdates": "显示当前每秒更新的区块数量", - "minihud.config.info_toggle.comment.infoCoordinates": "显示玩家的坐标", - "minihud.config.info_toggle.comment.infoCoordinatesScaled": "显示玩家的坐标,按维度的坐标比例进行缩放。\n仅在主世界和下界且其坐标比例是原版的系数时有效", - "minihud.config.info_toggle.comment.infoDifficulty": "显示当前的区域难度", - "minihud.config.info_toggle.comment.infoDimensionId": "显示当前维度 ID\n(结果可能不准确,\n这个问题取决于服务器 (Sponge?)!)", - "minihud.config.info_toggle.comment.infoDistance": "显示到当前参考点的距离。\n使用 §6[设置距离参考点]§f 设置参考点", - "minihud.config.info_toggle.comment.infoEntities": "显示可见/已加载的实体数量", - "minihud.config.info_toggle.comment.infoEntitiesClientWorld": "显示世界列表/地图中的实体数量", - "minihud.config.info_toggle.comment.infoEntityRegistryName": "显示玩家当前注视实体的注册名称", - "minihud.config.info_toggle.comment.infoFacing": "显示玩家当前的朝向", - "minihud.config.info_toggle.comment.infoFurnaceXp": "显示注视的熔炉中的经验数量。\n§6注意:这仅在单人游戏中有效(没有服务器端支持时,\n§6将无法正常显示,但会在服务器存在Servux时正常显示)", - "minihud.config.info_toggle.comment.infoFPS": "显示当前的帧率", - "minihud.config.info_toggle.comment.infoHoneyLevel": "显示注视中的蜂巢或蜂窝的蜂蜜等级.\n§6注意:这仅在单人游戏中有效(没有服务器端支持时,\n§6将无法正常显示,但会在服务器存在Servux时正常显示)", - "minihud.config.info_toggle.comment.infoHorseSpeed": "显示正在骑乘的马的速度 (米/秒)", - "minihud.config.info_toggle.comment.infoHorseJump": "显示正在骑乘的马的跳跃高度", - "minihud.config.info_toggle.comment.infoLightLevel": "显示当前光照等级", - "minihud.config.info_toggle.comment.infoLookingAtBlock": "显示当前玩家正在观察的方块", - "minihud.config.info_toggle.comment.infoLookingAtBlockInChunk": "显示玩家正在观察的方块所处的区块位置信息", - "minihud.config.info_toggle.comment.infoLookingAtEntity": "显示玩家看到的实体名称和生命值。\n如果服务器存在 Servux,可以看到更多数据。", - "minihud.config.info_toggle.comment.infoLookingAtEffects": "显示玩家看到的实体的状态效果。\n如果服务器存在 Servux,可以看到更多数据。", - "minihud.config.info_toggle.comment.infoMemoryUsage": "显示内存的使用和分配情况", - "minihud.config.info_toggle.comment.infoMobCaps": "显示刷怪占用\n\n§d注意:目前只适用于地毯端服务器!\n§6数据目前只能从 Carpet 服务器上的 list 列表解析(Tab 显示)\n§6当然前提是如果您已使用「/log mobcaps」向服务器获取了数据", - "minihud.config.info_toggle.comment.infoLoadedChunksCount": "显示客户端上加载区块的数量", - "minihud.config.info_toggle.comment.infoPandaGene": "显示玩家看向的熊猫的基因信息", - "minihud.config.info_toggle.comment.infoParticleCount": "显示当前渲染的粒子数量 (F3 中的 P)", - "minihud.config.info_toggle.comment.infoPing": "显示当前服务器延迟", - "minihud.config.info_toggle.comment.infoRegionFile": "显示玩家当前所在的区块文件", - "minihud.config.info_toggle.comment.infoRotationPitch": "显示玩家的俯仰旋转角度", - "minihud.config.info_toggle.comment.infoRotationYaw": "显示玩家的方向旋转角度", - "minihud.config.info_toggle.comment.infoServerTPS": "显示当前服务器的TPS和ms/tick(MSPT)\n注意: 这个值仅在使用Carpet服务端并且开启了TPS display carpet规则的时候是准确的, 其他情况下都是客户端基于当前世界时间更新估算的并且仅能检测到TPS小于20的数值", - "minihud.config.info_toggle.comment.infoServux": "显示 Servux 版本和实体数据同步协议版本", - "minihud.config.info_toggle.comment.infoSlimeChunk": "显示玩家当前是否在史莱姆区块中\n注意:这仅在单人游戏中有效\n在服务器中,玩家需要:\n 1) 成为管理员/OP 并在 每次加入或更改维度时手动运行 /seed 命令\n 2) 通过控制台输入种子,例如: \"minihud-seed 12345\"", - "minihud.config.info_toggle.comment.infoSpeed": "显示玩家当前的移动速度", - "minihud.config.info_toggle.comment.infoSpeedAxis": "显示玩家当前每个方向的移动速度", - "minihud.config.info_toggle.comment.infoSpeedHV": "显示玩家水平和垂直方向的移动速度", - "minihud.config.info_toggle.comment.infoSprinting": "展示玩家冲刺状态", - "minihud.config.info_toggle.comment.infoTileEntities": "显示客户端世界中的TileEntities数量", - "minihud.config.info_toggle.comment.infoTimeDayModulo": "显示当前一天的时间因数\n可以在配置中设置", - "minihud.config.info_toggle.comment.infoTimeIRL": "根据 §6[现实时间格式]§f 的格式化显示当前现实时间", - "minihud.config.info_toggle.comment.infoTimeTotalModulo": "显示当前世界总时间的时间因数\n可以在配置中设置", - "minihud.config.info_toggle.comment.infoTimeWorld": "显示当前世界开放的时间刻\n可以理解为开服时间", - "minihud.config.info_toggle.comment.infoWorldTimeFormatted": "按照天、小时、分钟的格式展示当前时间", - "minihud.config.info_toggle.comment.infoWeather": "显示当前天气", - "minihud.config.info_toggle.comment.infoZombieConversion": "显示僵尸村民距离转换剩余的时间", - "minihud.config.render_toggle.name.overlayBeaconRange": "信标范围显示", - "minihud.config.render_toggle.name.overlayBiomeBorder": "生物群系边界显示", - "minihud.config.render_toggle.name.overlayBlockGrid": "方块网格显示", - "minihud.config.render_toggle.name.overlayConduitRange": "潮涌核心范围显示", - "minihud.config.render_toggle.name.overlayLightLevel": "光照等级显示", - "minihud.config.render_toggle.name.overlayRandomTicksFixed": "固定随机刻区域显示", - "minihud.config.render_toggle.name.overlayRandomTicksPlayer": "玩家跟随随机刻区域显示", - "minihud.config.render_toggle.name.overlayRegionFile": "区域文件边界显示", - "minihud.config.render_toggle.name.overlaySlimeChunks": "史莱姆区块显示", - "minihud.config.render_toggle.name.overlaySpawnableColumnHeights": "顶层方块显示", - "minihud.config.render_toggle.name.overlaySpawnChunkReal": "出生点加载范围显示", - "minihud.config.render_toggle.name.overlaySpawnChunkPlayer": "玩家加载范围显示", - "minihud.config.render_toggle.name.overlayStructureMainToggle": "结构渲染器", - "minihud.config.render_toggle.name.overlayVillagerInfo": "村民信息显示", - "minihud.config.render_toggle.name.shapeRenderer": "图形渲染器", - "minihud.config.render_toggle.name.debugChunkBorder": "区块边界显示", - "minihud.config.render_toggle.name.debugChunkInfo": "区块调试信息显示", - "minihud.config.render_toggle.name.debugChunkOcclusion": "封闭区块显示", - "minihud.config.render_toggle.name.debugCollisionBoxEnabled": "碰撞箱显示", - "minihud.config.render_toggle.name.debugNeighborsUpdateEnabled": "方块更新显示", - "minihud.config.render_toggle.name.debugPathfindingEnabled": "寻路更新显示", - "minihud.config.render_toggle.name.debugSolidFaceEnabled": "块面调试显示", - "minihud.config.render_toggle.name.debugWaterEnabled": "水面调试信息显示", - "minihud.config.render_toggle.comment.overlayBeaconRange": "切换是否显示信标范围", - "minihud.config.render_toggle.comment.overlayBiomeBorder": "切换是否显示群系边界", - "minihud.config.render_toggle.comment.overlayBlockGrid": "切换是否显示方块网格\n(§4屌用没有还晃眼——ZMDF§r)", - "minihud.config.render_toggle.comment.overlayConduitRange": "切换是否显示潮涌核心覆盖范围", - "minihud.config.render_toggle.comment.overlayLightLevel": "切换是否显示光照等级显示", - "minihud.config.render_toggle.comment.overlayRandomTicksFixed": "切换是否显示随机刻固定点位区域", - "minihud.config.render_toggle.comment.overlayRandomTicksPlayer": "切换是否显示随机刻区域\n(以玩家为中心可移动)", - "minihud.config.render_toggle.comment.overlayRegionFile": "切换是否显示区域文件内边界\n(区域文件为 32*32 的区块组成)", - "minihud.config.render_toggle.comment.overlaySlimeChunks": "切换是否显示史莱姆区块", - "minihud.config.render_toggle.comment.overlaySpawnableColumnHeights": "切换是否显示区块最高位置的方块", - "minihud.config.render_toggle.comment.overlaySpawnChunkReal": "出生点加载范围的渲染器\n§a绿 - 强加载区块\n§e黄 - 强加载区块(默认关闭)\n§c红 - 加载边界区块\n§6棕 - 世界生成区块,范围外的区块完全不加载(默认关闭)", - "minihud.config.render_toggle.comment.overlaySpawnChunkPlayer": "玩家加载范围的渲染器\n§9蓝 - 强加载区块\n§e黄 - 弱加载区块(默认关闭)\n§d粉 - 加载边界区块\n§5紫 - 世界生成区块,范围外的区块完全不加载(默认关闭)", - "minihud.config.render_toggle.comment.overlayStructureMainToggle": "切换是否显示所有的结构的边框", - "minihud.config.render_toggle.comment.overlayVillagerInfo": "切换是否显示村民的各种信息", - "minihud.config.render_toggle.comment.shapeRenderer": "切换是否显示图形渲染器渲染的图形", - "minihud.config.render_toggle.comment.debugChunkBorder": "打开区块边界显示,效果与 F3 + G 一样。", - "minihud.config.render_toggle.comment.debugChunkInfo": "切换是否显示原版区块信息调试(16*16*16 的空间)", - "minihud.config.render_toggle.comment.debugChunkOcclusion": "切换是否显示封闭区块的显示(16*16*16 的空间)", - "minihud.config.render_toggle.comment.debugCollisionBoxEnabled": "切换是否显示碰撞箱调试渲染", - "minihud.config.render_toggle.comment.debugNeighborsUpdateEnabled": "切换是否显示方块更新调试渲染", - "minihud.config.render_toggle.comment.debugPathfindingEnabled": "切换是否显示生物寻路更新调试渲染", - "minihud.config.render_toggle.comment.debugSolidFaceEnabled": "切换是否显示方块表面是否完整更新调试渲染", - "minihud.config.render_toggle.comment.debugWaterEnabled": "切换是否显示水面流动距离(只对水有效)", - "minihud.config.render_toggle.prettyName.overlayBeaconRange": "信标范围", - "minihud.config.render_toggle.prettyName.overlayBiomeBorder": "群系边界", - "minihud.config.render_toggle.prettyName.overlayBlockGrid": "方块网格覆盖层", - "minihud.config.render_toggle.prettyName.overlayConduitRange": "信标范围", - "minihud.config.render_toggle.prettyName.overlayLightLevel": "光照等级", - "minihud.config.render_toggle.prettyName.overlayRandomTicksFixed": "随机刻区域(固定)", - "minihud.config.render_toggle.prettyName.overlayRandomTicksPlayer": "随机刻区域(跟随)", - "minihud.config.render_toggle.prettyName.overlayRegionFile": "区域文件边界", - "minihud.config.render_toggle.prettyName.overlaySlimeChunks": "史莱姆区块", - "minihud.config.render_toggle.prettyName.overlaySpawnableColumnHeights": "顶层方块渲染", - "minihud.config.render_toggle.prettyName.overlaySpawnChunkReal": "出生点加载范围", - "minihud.config.render_toggle.prettyName.overlaySpawnChunkPlayer": "玩家加载范围", - "minihud.config.render_toggle.prettyName.overlayStructureMainToggle": "结构边框", - "minihud.config.render_toggle.prettyName.overlayVillagerInfo": "村民信息", - "minihud.config.render_toggle.prettyName.shapeRenderer": "形状渲染器", - "minihud.config.render_toggle.prettyName.debugChunkBorder": "区块边界", - "minihud.config.render_toggle.prettyName.debugChunkInfo": "区块信息", - "minihud.config.render_toggle.prettyName.debugChunkOcclusion": "封闭区块信息", - "minihud.config.render_toggle.prettyName.debugCollisionBoxEnabled": "碰撞箱显示", - "minihud.config.render_toggle.prettyName.debugNeighborsUpdateEnabled": "方块更新显示", - "minihud.config.render_toggle.prettyName.debugPathfindingEnabled": "寻路", - "minihud.config.render_toggle.prettyName.debugSolidFaceEnabled": "方块实面调试信息", - "minihud.config.render_toggle.prettyName.debugWaterEnabled": "水面调试信息", - "minihud.config.structure_toggle.name.ancient_city": "远古城市", - "minihud.config.structure_toggle.comment.ancient_city": "切换远古城市结构边框渲染", - "minihud.config.structure_toggle.prettyName.ancient_city": "远古城市", - "minihud.config.structure_toggle.full_box.name.ancient_city": "远古城市主体", - "minihud.config.structure_toggle.full_box.comment.ancient_city": "远古城市主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.ancient_city": "远古城市整体边框", - "minihud.config.structure_toggle.components.name.ancient_city": "远古城市结构", - "minihud.config.structure_toggle.components.comment.ancient_city": "远古城市结构颜色", - "minihud.config.structure_toggle.components.prettyName.ancient_city": "远古城市结构", - "minihud.config.structure_toggle.name.bastion_remnant": "堡垒遗迹", - "minihud.config.structure_toggle.comment.bastion_remnant": "切换堡垒遗迹结构边框渲染", - "minihud.config.structure_toggle.prettyName.bastion_remnant": "堡垒遗迹", - "minihud.config.structure_toggle.full_box.name.bastion_remnant": "堡垒遗迹主体", - "minihud.config.structure_toggle.full_box.comment.bastion_remnant": "堡垒遗迹主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.bastion_remnant": "堡垒遗迹整体边框", - "minihud.config.structure_toggle.components.name.bastion_remnant": "堡垒遗迹结构", - "minihud.config.structure_toggle.components.comment.bastion_remnant": "堡垒遗迹结构颜色", - "minihud.config.structure_toggle.components.prettyName.bastion_remnant": "堡垒遗迹结构", - "minihud.config.structure_toggle.name.buried_treasure": "埋藏的宝藏", - "minihud.config.structure_toggle.comment.buried_treasure": "切换埋藏的宝藏结构边框渲染", - "minihud.config.structure_toggle.prettyName.buried_treasure": "埋藏的宝藏", - "minihud.config.structure_toggle.full_box.name.buried_treasure": "埋藏的宝藏主体", - "minihud.config.structure_toggle.full_box.comment.buried_treasure": "埋藏的宝藏主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.buried_treasure": "埋藏的宝藏整体边框", - "minihud.config.structure_toggle.components.name.buried_treasure": "埋藏的宝藏结构", - "minihud.config.structure_toggle.components.comment.buried_treasure": "埋藏的宝藏结构颜色", - "minihud.config.structure_toggle.components.prettyName.buried_treasure": "埋藏的宝藏结构", - "minihud.config.structure_toggle.name.desert_pyramid": "沙漠神殿", - "minihud.config.structure_toggle.comment.desert_pyramid": "切换沙漠神殿结构边框渲染", - "minihud.config.structure_toggle.prettyName.desert_pyramid": "沙漠神殿", - "minihud.config.structure_toggle.full_box.name.desert_pyramid": "沙漠神殿主体", - "minihud.config.structure_toggle.full_box.comment.desert_pyramid": "沙漠神殿主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.desert_pyramid": "沙漠神殿整体边框", - "minihud.config.structure_toggle.components.name.desert_pyramid": "沙漠神殿结构", - "minihud.config.structure_toggle.components.comment.desert_pyramid": "沙漠神殿结构颜色", - "minihud.config.structure_toggle.components.prettyName.desert_pyramid": "沙漠神殿结构", - "minihud.config.structure_toggle.name.end_city": "末地城", - "minihud.config.structure_toggle.comment.end_city": "切换末地城结构边框渲染", - "minihud.config.structure_toggle.prettyName.end_city": "末地城", - "minihud.config.structure_toggle.full_box.name.end_city": "末地城主体", - "minihud.config.structure_toggle.full_box.comment.end_city": "末地城主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.end_city": "末地城整体边框", - "minihud.config.structure_toggle.components.name.end_city": "末地城结构", - "minihud.config.structure_toggle.components.comment.end_city": "末地城结构颜色", - "minihud.config.structure_toggle.components.prettyName.end_city": "末地城结构", - "minihud.config.structure_toggle.name.igloo": "雪屋", - "minihud.config.structure_toggle.comment.igloo": "切换雪屋结构边框渲染", - "minihud.config.structure_toggle.prettyName.igloo": "雪屋结构", - "minihud.config.structure_toggle.full_box.name.igloo": "雪屋主体", - "minihud.config.structure_toggle.full_box.comment.igloo": "雪屋主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.igloo": "雪屋结构整体边框", - "minihud.config.structure_toggle.components.name.igloo": "雪屋结构", - "minihud.config.structure_toggle.components.comment.igloo": "雪屋结构颜色", - "minihud.config.structure_toggle.components.prettyName.igloo": "雪屋结构细节", - "minihud.config.structure_toggle.name.jungle_pyramid": "丛林神庙", - "minihud.config.structure_toggle.comment.jungle_pyramid": "切换丛林神庙结构边框渲染", - "minihud.config.structure_toggle.prettyName.jungle_pyramid": "丛林神庙", - "minihud.config.structure_toggle.full_box.name.jungle_pyramid": "丛林神庙主体", - "minihud.config.structure_toggle.full_box.comment.jungle_pyramid": "丛林神庙主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.jungle_pyramid": "丛林神庙整体边框", - "minihud.config.structure_toggle.components.name.jungle_pyramid": "丛林神庙结构", - "minihud.config.structure_toggle.components.comment.jungle_pyramid": "丛林神庙结构颜色", - "minihud.config.structure_toggle.components.prettyName.jungle_pyramid": "丛林神庙结构", - "minihud.config.structure_toggle.name.mansion": "林地府邸", - "minihud.config.structure_toggle.comment.mansion": "切换林地府邸结构边框渲染", - "minihud.config.structure_toggle.prettyName.mansion": "林地府邸结构", - "minihud.config.structure_toggle.full_box.name.mansion": "林地府邸主体", - "minihud.config.structure_toggle.full_box.comment.mansion": "林地府邸主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.mansion": "林地府邸整体边框", - "minihud.config.structure_toggle.components.name.mansion": "林地府邸结构", - "minihud.config.structure_toggle.components.comment.mansion": "林地府邸结构颜色", - "minihud.config.structure_toggle.components.prettyName.mansion": "林地府邸结构细节", - "minihud.config.structure_toggle.name.mineshaft": "废弃矿井", - "minihud.config.structure_toggle.comment.mineshaft": "切换废弃矿井结构边框渲染", - "minihud.config.structure_toggle.prettyName.mineshaft": "废弃矿井结构", - "minihud.config.structure_toggle.full_box.name.mineshaft": "废弃矿井主体", - "minihud.config.structure_toggle.full_box.comment.mineshaft": "废弃矿井主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.mineshaft": "废弃矿井整体边框", - "minihud.config.structure_toggle.components.name.mineshaft": "废弃矿井结构", - "minihud.config.structure_toggle.components.comment.mineshaft": "废弃矿井结构颜色", - "minihud.config.structure_toggle.components.prettyName.mineshaft": "废弃矿井结构细节", - "minihud.config.structure_toggle.name.fortress": "下界要塞", - "minihud.config.structure_toggle.comment.fortress": "切换下界要塞结构边框渲染", - "minihud.config.structure_toggle.prettyName.fortress": "下界要塞", - "minihud.config.structure_toggle.full_box.name.fortress": "下界要塞主体", - "minihud.config.structure_toggle.full_box.comment.fortress": "下界要塞主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.fortress": "下届要塞整体边框", - "minihud.config.structure_toggle.components.name.fortress": "下界要塞结构", - "minihud.config.structure_toggle.components.comment.fortress": "下界要塞结构颜色", - "minihud.config.structure_toggle.components.prettyName.fortress": "下界要塞结构", - "minihud.config.structure_toggle.name.nether_fossil": "下界化石", - "minihud.config.structure_toggle.comment.nether_fossil": "切换下界化石结构边框渲染", - "minihud.config.structure_toggle.prettyName.nether_fossil": "下界化石", - "minihud.config.structure_toggle.full_box.name.nether_fossil": "下界化石主体", - "minihud.config.structure_toggle.full_box.comment.nether_fossil": "下界化石主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.nether_fossil": "下届化石整体边框", - "minihud.config.structure_toggle.components.name.nether_fossil": "下界化石结构", - "minihud.config.structure_toggle.components.comment.nether_fossil": "下界化石结构颜色", - "minihud.config.structure_toggle.components.prettyName.nether_fossil": "下界化石结构", - "minihud.config.structure_toggle.name.monument": "海底神殿", - "minihud.config.structure_toggle.comment.monument": "切换海底神殿结构边框渲染", - "minihud.config.structure_toggle.prettyName.monument": "海底神殿", - "minihud.config.structure_toggle.full_box.name.monument": "海底神殿主体", - "minihud.config.structure_toggle.full_box.comment.monument": "海底神殿主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.monument": "海底神殿整体边框", - "minihud.config.structure_toggle.components.name.monument": "海底神殿结构", - "minihud.config.structure_toggle.components.comment.monument": "海底神殿结构颜色", - "minihud.config.structure_toggle.components.prettyName.monument": "海底神殿结构", - "minihud.config.structure_toggle.name.ocean_ruin": "海底废墟", - "minihud.config.structure_toggle.comment.ocean_ruin": "切换海底废墟结构边框渲染", - "minihud.config.structure_toggle.prettyName.ocean_ruin": "海底废墟", - "minihud.config.structure_toggle.full_box.name.ocean_ruin": "海底废墟主体", - "minihud.config.structure_toggle.full_box.comment.ocean_ruin": "海底废墟主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.ocean_ruin": "海底废墟整体边框", - "minihud.config.structure_toggle.components.name.ocean_ruin": "海底废墟结构", - "minihud.config.structure_toggle.components.comment.ocean_ruin": "海底废墟结构颜色", - "minihud.config.structure_toggle.components.prettyName.ocean_ruin": "海底废墟结构", - "minihud.config.structure_toggle.name.pillager_outpost": "掠夺者前哨站", - "minihud.config.structure_toggle.comment.pillager_outpost": "切换掠夺者前哨站结构边框渲染", - "minihud.config.structure_toggle.prettyName.pillager_outpost": "掠夺者前哨站", - "minihud.config.structure_toggle.full_box.name.pillager_outpost": "掠夺者前哨站主体", - "minihud.config.structure_toggle.full_box.comment.pillager_outpost": "掠夺者前哨站主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.pillager_outpost": "掠夺者前哨站整体边框", - "minihud.config.structure_toggle.components.name.pillager_outpost": "掠夺者前哨站结构", - "minihud.config.structure_toggle.components.comment.pillager_outpost": "掠夺者前哨站结构颜色", - "minihud.config.structure_toggle.components.prettyName.pillager_outpost": "掠夺者前哨站结构", - "minihud.config.structure_toggle.name.ruined_portal": "废弃传送门", - "minihud.config.structure_toggle.comment.ruined_portal": "切换废弃传送门结构边框渲染", - "minihud.config.structure_toggle.prettyName.ruined_portal": "废弃传送门", - "minihud.config.structure_toggle.full_box.name.ruined_portal": "废弃传送门主体", - "minihud.config.structure_toggle.full_box.comment.ruined_portal": "废弃传送门主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.ruined_portal": "废弃传送门整体边框", - "minihud.config.structure_toggle.components.name.ruined_portal": "废弃传送门结构", - "minihud.config.structure_toggle.components.comment.ruined_portal": "废弃传送门结构颜色", - "minihud.config.structure_toggle.components.prettyName.ruined_portal": "废弃传送门结构", - "minihud.config.structure_toggle.name.shipwreck": "沉船", - "minihud.config.structure_toggle.comment.shipwreck": "切换沉船结构边框渲染", - "minihud.config.structure_toggle.prettyName.shipwreck": "沉船", - "minihud.config.structure_toggle.full_box.name.shipwreck": "沉船主体", - "minihud.config.structure_toggle.full_box.comment.shipwreck": "沉船主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.shipwreck": "沉船整体边框", - "minihud.config.structure_toggle.components.name.shipwreck": "沉船结构", - "minihud.config.structure_toggle.components.comment.shipwreck": "沉船结构颜色", - "minihud.config.structure_toggle.components.prettyName.shipwreck": "沉船结构", - "minihud.config.structure_toggle.name.stronghold": "要塞", - "minihud.config.structure_toggle.comment.stronghold": "切换要塞结构边框渲染", - "minihud.config.structure_toggle.prettyName.stronghold": "要塞", - "minihud.config.structure_toggle.full_box.name.stronghold": "要塞主体", - "minihud.config.structure_toggle.full_box.comment.stronghold": "要塞主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.stronghold": "要塞整体边框", - "minihud.config.structure_toggle.components.name.stronghold": "要塞结构", - "minihud.config.structure_toggle.components.comment.stronghold": "要塞结构颜色", - "minihud.config.structure_toggle.components.prettyName.stronghold": "要塞结构", - "minihud.config.structure_toggle.name.trial_chambers": "试炼密室", - "minihud.config.structure_toggle.comment.trial_chambers": "切换试炼密室结构边框渲染", - "minihud.config.structure_toggle.prettyName.trial_chambers": "试炼密室", - "minihud.config.structure_toggle.full_box.name.trial_chambers": "试炼密室主体", - "minihud.config.structure_toggle.full_box.comment.trial_chambers": "试炼密室主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.trial_chambers": "试炼密室整体边框", - "minihud.config.structure_toggle.components.name.trial_chambers": "试炼密室结构", - "minihud.config.structure_toggle.components.comment.trial_chambers": "试炼密室结构颜色", - "minihud.config.structure_toggle.components.prettyName.trial_chambers": "试炼密室结构", - "minihud.config.structure_toggle.name.village": "村庄", - "minihud.config.structure_toggle.comment.village": "切换村庄结构边界框渲染\n注意:这是村庄的世界生成结构\n不适用于刷铁机等生电结构", - "minihud.config.structure_toggle.prettyName.village": "村庄", - "minihud.config.structure_toggle.full_box.name.village": "村庄主体", - "minihud.config.structure_toggle.full_box.comment.village": "村庄主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.village": "村庄整体边框", - "minihud.config.structure_toggle.components.name.village": "村庄结构", - "minihud.config.structure_toggle.components.comment.village": "村庄结构颜色", - "minihud.config.structure_toggle.components.prettyName.village": "村庄结构", - "minihud.config.structure_toggle.name.swamp_hut": "沼泽小屋", - "minihud.config.structure_toggle.comment.swamp_hut": "切换沼泽小屋结构边框渲染", - "minihud.config.structure_toggle.prettyName.swamp_hut": "沼泽小屋", - "minihud.config.structure_toggle.full_box.name.swamp_hut": "沼泽小屋主体", - "minihud.config.structure_toggle.full_box.comment.swamp_hut": "沼泽小屋主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.swamp_hut": "沼泽小屋整体边框", - "minihud.config.structure_toggle.components.name.swamp_hut": "沼泽小屋结构", - "minihud.config.structure_toggle.components.comment.swamp_hut": "沼泽小屋结构颜色", - "minihud.config.structure_toggle.components.prettyName.swamp_hut": "沼泽小屋结构", - "minihud.config.structure_toggle.name.trail_ruins": "古迹废墟", - "minihud.config.structure_toggle.comment.trail_ruins": "切换古迹废墟结构边框渲染", - "minihud.config.structure_toggle.prettyName.trail_ruins": "古迹废墟", - "minihud.config.structure_toggle.full_box.name.trail_ruins": "古迹废墟主体", - "minihud.config.structure_toggle.full_box.comment.trail_ruins": "古迹废墟主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.trail_ruins": "古迹废墟整体边框", - "minihud.config.structure_toggle.components.name.trail_ruins": "古迹废墟结构", - "minihud.config.structure_toggle.components.comment.trail_ruins": "古迹废墟结构颜色", - "minihud.config.structure_toggle.components.prettyName.trail_ruins": "古迹废墟结构", - "minihud.config.structure_toggle.name.unknown": "未知结构", - "minihud.config.structure_toggle.comment.unknown": "切换未知结构边框渲染", - "minihud.config.structure_toggle.prettyName.unknown": "未知结构", - "minihud.config.structure_toggle.full_box.name.unknown": "未知主体", - "minihud.config.structure_toggle.full_box.comment.unknown": "未知主体颜色", - "minihud.config.structure_toggle.full_box.prettyName.unknown": "未知结构整体边框", - "minihud.config.structure_toggle.components.name.unknown": "未知结构", - "minihud.config.structure_toggle.components.comment.unknown": "未知结构颜色", - "minihud.config.structure_toggle.components.prettyName.unknown": "未知结构细节", - "minihud.gui.button.config_gui.colors": "颜色", - "minihud.gui.button.config_gui.generic": "通用", - "minihud.gui.button.config_gui.info_lines": "信息", - "minihud.gui.button.config_gui.renderers": "渲染器", - "minihud.gui.button.config_gui.shapes": "形状", - "minihud.gui.button.config_gui.structures": "结构", - "minihud.gui.button.add_shape": "添加形状", - "minihud.gui.button.configure": "配置", - "minihud.gui.button.remove": "删除", - "minihud.gui.button.shape_entry.enabled": "启用: %s", - "minihud.gui.button.shape_renderer.spawn_sphere.toggle_use_quadrants": "使用角象限生成:%s", - "minihud.gui.button.shape_renderer_toggle": "形状渲染器: %s", - "minihud.gui.button.shape_renderer.toggle_combine_quads": "合并显示:%s", - "minihud.gui.button.hover.shape_renderer.spawn_sphere.toggle_use_quadrants": "§7角象限生成基本上是在由中心和边缘距离定义的\n§7矩形区域的四角上生成了 4 个独立的球体。\n§7角象限生成是旧的生成方式,此时如果半径增加\n§7到一定数量,它就会变得离谱(特别是在基点)。\n§7新的生成方式将不再使用角象限生成,\n§7而是「在边缘滑动生成球体」来创建最终的形状。", - "minihud.gui.label.center_colon": "中心:", - "minihud.gui.label.color": "颜色:", - "minihud.gui.label.display_name_colon": "显示名称:", - "minihud.gui.label.height_colon": "高度:", - "minihud.gui.label.margin_colon": "边距:", - "minihud.gui.label.radius_colon": "半径:", - "minihud.gui.hover.shape.block_snap": "§7方块对齐:§b%s", - "minihud.gui.hover.shape.box.box_side": "§7渲染框架的 %s 面", - "minihud.gui.hover.shape.center_value": "§7中心点:x: §9%s§7, y: §9%s§7, z: §9%s", - "minihud.gui.hover.shape.circle.main_axis_value": "§7轴:§b%s", - "minihud.gui.hover.shape.effective_center_value": "§7有效中心点:x: §9%s§7, y: §9%s§7, z: §9%s", - "minihud.gui.hover.shape.height_value": "§7高度:§6%s", - "minihud.gui.hover.shape.margin_value": "§7边距:§6%s", - "minihud.gui.hover.shape.radius_value": "§7半径:§6%s", - "minihud.gui.hover.shape.type_value": "§7类型:§b%s", - "minihud.gui.label.shape.block_snap": "方块对齐:%s", - "minihud.gui.label.shape.box.corner_1": "角 1", - "minihud.gui.label.shape.box.corner_2": "角 2", - "minihud.gui.label.shape.box.grid_enabled": "启用网格:%s", - "minihud.gui.label.shape.box.max_corner": "§7最大值:x: §9%s§7, y: §9%s§7, z: §9%s", - "minihud.gui.label.shape.box.maximum_coord": "最大值", - "minihud.gui.label.shape.box.min_corner": "§7最小值:x: §9%s§7, y: §9%s§7, z: §9%s", - "minihud.gui.label.shape.box.minimum_coord": "最小值", - "minihud.gui.label.shape.box.grid_end_offset": "网格终点偏移值", - "minihud.gui.label.shape.box.grid_size": "网格大小", - "minihud.gui.label.shape.box.grid_start_offset": "网格起点偏移值", - "minihud.gui.label.shape.circle.main_axis_colon": "轴向:", - "minihud.gui.label.shape.line.start": "§7位置 1: x: §9%s§7, y: §9%s§7, z: §9%s", - "minihud.gui.label.shape.line.end": "§7位置 2: x: §9%s§7, y: §9%s§7, z: §9%s", - "minihud.gui.label.shape.render_type_colon": "渲染类型:", - "minihud.gui.name.box.box_side.down": "下方", - "minihud.gui.name.box.box_side.up": "上方", - "minihud.gui.name.box.box_side.north": "北面", - "minihud.gui.name.box.box_side.south": "南面", - "minihud.gui.name.box.box_side.west": "西面", - "minihud.gui.name.box.box_side.east": "东面", - "minihud.gui.title.configs": "MiniHUD 配置 - %s", - "minihud.gui.title.shape_editor": "形状编辑 (%s)", - "minihud.gui.title.shape_manager": "形状管理", - "minihud.label.axolotl_tooltip.label": "§7品种: ", - "minihud.label.axolotl_tooltip.value": "%s [%s]", - "minihud.label.bee_tooltip.count": "§7包含 §b%s§7 只蜜蜂", - "minihud.label.bee_tooltip.count_babies": "§7包含 §b%s§7 只蜜蜂,(§b%s§7 只幼蜂)", - "minihud.label.bee_tooltip.name": "§7- %s", - "minihud.label.honey_info.level": "§7蜜蜂等级 §b%s§7/5", - "minihud.label.blockgridmode.all": "全部", - "minihud.label.blockgridmode.non_air": "非空气", - "minihud.label.blockgridmode.adjacent": "相邻非空气方块", - "minihud.label.light_level_marker_mode.cross": "十字", - "minihud.label.light_level_marker_mode.none": "无", - "minihud.label.light_level_marker_mode.square": "正方形", - "minihud.label.light_level_number_mode.none": "无", - "minihud.label.light_level_number_mode.block": "方块", - "minihud.label.light_level_number_mode.both": "两者", - "minihud.label.light_level_number_mode.sky": "天空", - "minihud.label.light_level_render_condition.always": "总是", - "minihud.label.light_level_render_condition.dim": "昏暗", - "minihud.label.light_level_render_condition.never": "从不", - "minihud.label.light_level_render_condition.safe": "安全", - "minihud.label.light_level_render_condition.spawnable": "可生成", - "minihud.label.shape_render_type.full_block": "完整方块", - "minihud.label.shape_render_type.inner_edge": "内部边缘", - "minihud.label.shape_render_type.outer_edge": "外部边缘", - "minihud.label.shapes.adjustable_spawn_sphere": "可调节生成球体", - "minihud.label.shapes.box": "盒", - "minihud.label.shapes.can_spawn_sphere": "可刷怪范围球体(> 24)", - "minihud.label.shapes.can_despawn_sphere": "怪物可能消失范围球体(> 32)", - "minihud.label.shapes.circle": "圆环/圆柱", - "minihud.label.shapes.despawn_sphere": "怪物强制卸载范围球体(> 128)", - "minihud.label.shapes.block_line": "线(基于方块)", - "minihud.label.shapes.sphere_blocky": "球体(基于方块)", - "minihud.hotkeys.category.generic_hotkeys": "通用快捷键", - "minihud.hotkeys.category.info_toggle_hotkeys": "信息开关快捷键", - "minihud.hotkeys.category.renderer_toggle_hotkeys": "渲染器开关快捷键", - "minihud.hotkeys.category.structure_toggle_hotkeys": "结构渲染开关快捷键", - "minihud.message.toggled_debug_mode.collisions": "碰撞箱调试已切换为 %s", - "minihud.message.toggled_debug_mode.height_map": "已切换高度图调试渲染为 %s", - "minihud.message.toggled_debug_mode.neighbor_updates": "方块更新调试已切换为 %s", - "minihud.message.toggled_debug_mode.pathfinding": "寻路调试已切换为 %s", - "minihud.message.toggled_debug_mode.solid_faces": "方块表面调试已切换为 %s", - "minihud.message.toggled_debug_mode.water": "水体调试渲染已切换为 %s", - "minihud.message.toggled_using_center_position": "%s 切换为 %s,使用中心位置 %s", - "minihud.message.toggled_using_position": "%s 切换为 %s,使用位置 %s", - "minihud.message.toggled_using_world_spawn": "%s 切换为 %s,使用世界出生点 %s", - "minihud.message.toggled_using_player_spawn": "%s 切换为 %s,使用模拟距离 %s", - "minihud.message.error.invalid_dropped_chunks_hash_size": "无法解析来自聊天的区块哈希集大小", - "minihud.message.error.invalid_seed": "无法从聊天框中解析世界种子", - "minihud.message.error.invalid_spawn_chunk_radius": "无法解析聊天中的生成区块半径 (0 < 32)", - "minihud.message.error.shapes.select_shape_from_dropdown": "从下拉菜单中选择要创建的形状类型", - "minihud.message.distance_reference_point_set": "将距离参考点设置为 %s", - "minihud.message.no_seed": "MiniHUD: 世界种子未知", - "minihud.message.seed_is": "MiniHUD 中的世界种子当前设置为 '%s'", - "minihud.message.seed_set": "MiniHUD: 将世界种子设置为 '%s'", - "minihud.message.spawn_set": "MiniHUD: 将世界生成点设置为 %s", - "minihud.message.no_spawn_chunk_radius": "MiniHUD: 生成区块半径未知 (默认值为 2)", - "minihud.message.spawn_chunk_radius_is": "MiniHUD 当前的生成区块半径设置为 '%s'", - "minihud.message.spawn_chunk_radius_set": "MiniHUD: 将生成区块半径设置为 %s", - "minihud.info_line.invalid_value": "无效", - "minihud.info_line.remaining": "剩余", - "minihud.info_line.fps": "帧数 %d", - "minihud.info_line.memory_usage": "内存:% 2d%% %03d/%03dMB | 已分配:% 2d%% %03dMB", - "minihud.info_line.time.exception": "日期格式化失败 - 格式化字符串可能无效", - "minihud.info_line.time_real": "NOT USED", - "minihud.info_line.time_world": "世界时间:%5d - 总计:%d", - "minihud.info_line.time_world_formatted": "NOT USED", - "minihud.info_line.time_world_formatted.moon_0": "满月", - "minihud.info_line.time_world_formatted.moon_1": "亏凸月", - "minihud.info_line.time_world_formatted.moon_2": "上弦月", - "minihud.info_line.time_world_formatted.moon_3": "残月", - "minihud.info_line.time_world_formatted.moon_4": "新月", - "minihud.info_line.time_world_formatted.moon_5": "蛾眉月", - "minihud.info_line.time_world_formatted.moon_6": "上弦月", - "minihud.info_line.time_world_formatted.moon_7": "盈凸月", - "minihud.info_line.time_day_modulo": "白天时间 %% %d: %5d", - "minihud.info_line.time_total_modulo": "总时间 %% %d: %5d", - "minihud.info_line.server_tps": "服务器 TPS: %s%.1f%s MSPT: %s%.1f%s", - "minihud.info_line.server_tps.est": "服务器 TPS: %s%.1f%s (MSPT [估计]: %s%.1f%s)", - "minihud.info_line.server_tps.invalid": "服务器 TPS: <无可用数据>", - "minihud.info_line.weather": "天气: %s%s", - "minihud.info_line.weather.thundering": "雷暴", - "minihud.info_line.weather.raining": "降雨", - "minihud.info_line.weather.clear": "晴天", - "minihud.info_line.mobcap.data": "生物上限:Ho: %s Pa: %s Am: %s, Ax: %s, UWC: %s, WC: %s, WA: %s, Mi: %s", - "minihud.info_line.mobcap.no_data": "生物上限:<无可用数据>", - "minihud.info_line.mobcap.cap.ambient.full": "§7§l%s§r§7 / %s§r", - "minihud.info_line.mobcap.cap.ambient.nonfull": "§7%s / %s§r", - "minihud.info_line.mobcap.cap.axolotls.full": "§d§l%s§r§7 / %s§r", - "minihud.info_line.mobcap.cap.axolotls.nonfull": "§d%s / %s§r", - "minihud.info_line.mobcap.cap.creature.full": "§a§l%s§r§a / %s§r", - "minihud.info_line.mobcap.cap.creature.nonfull": "§a%s / %s§r", - "minihud.info_line.mobcap.cap.misc.full": "§f§l%s§r§b / %s§r", - "minihud.info_line.mobcap.cap.misc.nonfull": "§f%s / %s§r", - "minihud.info_line.mobcap.cap.monster.full": "§c§l%s§r§c / %s§r", - "minihud.info_line.mobcap.cap.monster.nonfull": "§c%s / %s§r", - "minihud.info_line.mobcap.cap.underground_water_creature.full": "§9§l%s§r§b / %s§r", - "minihud.info_line.mobcap.cap.underground_water_creature.nonfull": "§9%s / %s§r", - "minihud.info_line.mobcap.cap.water_ambient.full": "§9§l%s§r§b / %s§r", - "minihud.info_line.mobcap.cap.water_ambient.nonfull": "§9%s / %s§r", - "minihud.info_line.mobcap.cap.water_creature.full": "§b§l%s§r§b / %s§r", - "minihud.info_line.mobcap.cap.water_creature.nonfull": "§b%s / %s§r", - "minihud.info_line.ping": "延迟:%d ms", - "minihud.info_line.coordinates.exception": "错误的坐标格式字符串!", - "minihud.info_line.coordinates.format": "XYZ: %.2f / %.4f / %.2f", - "minihud.info_line.coordinates_scaled.overworld": "主世界: ", - "minihud.info_line.coordinates_scaled.nether": "下界: ", - "minihud.info_line.dimension": "维度: ", - "minihud.info_line.block_pos.exception": "错误的方块位置格式字符串!", - "minihud.info_line.chunk_pos": "子区块:%d, %d, %d", - "minihud.info_line.region_file": "区域:r.%d.%d", - "minihud.info_line.block_in_chunk": "方块:%d, %d, %d 位于子区块:%d, %d, %d", - "minihud.info_line.block_break_speed": "破坏速度:%.2f", - "minihud.info_line.sprinting": "§6奔跑中", - "minihud.info_line.distance": "距离:%.2f (x: %.2f y: %.2f z: %.2f) [x: %.2f y: %.2f z: %.2f]", - "minihud.info_line.facing": "朝向:%s(%s)", - "minihud.info_line.facing.north.name": "北", - "minihud.info_line.facing.south.name": "南", - "minihud.info_line.facing.west.name": "西", - "minihud.info_line.facing.east.name": "东", - "minihud.info_line.facing.north": "Z轴负方向", - "minihud.info_line.facing.south": "Z轴正方向", - "minihud.info_line.facing.west": "X轴负方向", - "minihud.info_line.facing.east": "X轴正方向", - "minihud.info_line.light_level": "方块亮度:%d", - "minihud.info_line.bee_count": "蜜蜂:§b%d", - "minihud.info_line.bee_count.flower_pos": "蜜蜂:§b%d§r [花 %s]", - "minihud.info_line.furnace_xp": "熔炉内经验:§b%d", - "minihud.info_line.honey_level": "蜂蜜:§b%d", - "minihud.info_line.horse_speed": "%s 速度:%.3f 米/秒", - "minihud.info_line.horse_jump": "%s 跳跃高度:%.3f 米", - "minihud.info_line.rotation_yaw": "方向角: %.1f", - "minihud.info_line.rotation_pitch": "俯仰角: %.1f", - "minihud.info_line.speed": "速度:%.3f 米/秒", - "minihud.info_line.speed_hv": "速度:xz: %.3f y: %.3f 米/秒", - "minihud.info_line.speed_axis": "速度:x: %.3f y: %.3f z: %.3f 米/秒", - "minihud.info_line.chunk_sections": "C: %d", - "minihud.info_line.chunk_updates": "TODO", - "minihud.info_line.loaded_chunks_count.server": "服务器:%d / %d - 客户端:%s", - "minihud.info_line.panda_gene.main_gene": "主要基因:%s(%s)", - "minihud.info_line.panda_gene.hidden_gene": "隐藏基因:%s(%s)", - "minihud.info_line.panda_gene.dominant_gene": "显性", - "minihud.info_line.panda_gene.recessive_gene": "隐性", - "minihud.info_line.panda_gene.gene.normal": "普通", - "minihud.info_line.panda_gene.gene.lazy": "懒惰", - "minihud.info_line.panda_gene.gene.worried": "忧郁", - "minihud.info_line.panda_gene.gene.playful": "顽皮", - "minihud.info_line.panda_gene.gene.brown": "棕色", - "minihud.info_line.panda_gene.gene.weak": "体弱", - "minihud.info_line.panda_gene.gene.aggressive": "好斗", - "minihud.info_line.particle_count": "P: %s", - "minihud.info_line.difficulty": "区域难度:%.2f // %.2f (%d天)", - "minihud.info_line.biome": "生物群系:%s", - "minihud.info_line.biome_reg_name": "生物群系注册名:%s", - "minihud.info_line.tile_entities": "Client world TE - L: ?, T: ? - TODO 1.17", - "minihud.info_line.entities_client_world": "实体数量 - 客户端:%d", - "minihud.info_line.entities_client_world.server": "实体数量 - 客户端:%d - 服务端:%d", - "minihud.info_line.slime_chunk": "史莱姆区块:%s", - "minihud.info_line.slime_chunk.yes": "§a是§r", - "minihud.info_line.slime_chunk.no": "§c否§r", - "minihud.info_line.slime_chunk.no_seed": "<未设置世界种子>", - "minihud.info_line.looking_at_entity": "实体:%s", - "minihud.info_line.looking_at_entity.livingentity": "实体:%s - 生命值:%.1f / %.1f", - "minihud.info_line.looking_at_entity.owner": "主人", - "minihud.info_line.looking_at_effects": "状态效果:%s / %s%s %s", - "minihud.info_line.looking_at_effects.amplifier": "x%d / ", - "minihud.info_line.looking_at_effects.infinite": "持续时间无限", - "minihud.info_line.zombie_conversion": "僵尸村民治疗剩余时间:%s", - "minihud.info_line.entity_reg_name": "实体注册名:%s", - "minihud.info_line.looking_at_block": "注视的方块:%d, %d, %d", - "minihud.info_line.looking_at_block_chunk": "方块:%d, %d, %d 在子区块:%d, %d, %d", - "minihud.config.generic.name.debugDevelopmentMode": "debugDevelopmentMode", - "minihud.config.generic.name.entityDataSyncLoadNbt": "entityDataSyncLoadNbt", - "minihud.config.generic.name.infoLinesUsesNbt": "infoLinesUsesNbt", - "minihud.config.generic.comment.debugDevelopmentMode": "Enables the Vanilla Development Mode toggle", - "minihud.config.generic.comment.entityDataSyncLoadNbt": "Load the synced NBT data into the Client World.\n§6WARNING! This feature will cause incompatibility\n§6with other mods that rely on this data.", - "minihud.config.generic.comment.infoLinesUsesNbt": "Force the Info Lines data to strictly use the Raw NBT data.\nThis setting helps ensure compatibility with\nother mods by relying ONLY on obtained NBT tags.", - "minihud.config.info_toggle.name.infoEntityVariant": "infoEntityVariant", - "minihud.config.info_toggle.comment.infoEntityVariant": "Show the looked-at Entity variant information,\nsuch as Sheep Color, or Wolf Type", - "minihud.config.render_toggle.name.debugChunkLoading": "debugChunkLoading", - "minihud.config.render_toggle.name.debugOctreeEnabled": "debugOctreeEnabled", - "minihud.config.render_toggle.name.debugRedstoneUpdateOrder": "debugRedstoneUpdateOrder", - "minihud.config.render_toggle.name.debugSupportingBlock": "debugSupportingBlock", - "minihud.config.render_toggle.comment.debugChunkLoading": "Toggles the vanilla Chunk Loading debug renderer", - "minihud.config.render_toggle.comment.debugOctreeEnabled": "Toggles the vanilla Octree debug renderer", - "minihud.config.render_toggle.comment.debugRedstoneUpdateOrder": "Toggles the vanilla Redstone Update Order debug renderer", - "minihud.config.render_toggle.comment.debugSupportingBlock": "Toggles the vanilla Supporting Block debug renderer", - "minihud.config.render_toggle.prettyName.debugChunkLoading": "Chunk Loading", - "minihud.config.render_toggle.prettyName.debugOctreeEnabled": "Octree Debug", - "minihud.config.render_toggle.prettyName.debugRedstoneUpdateOrder": "Redstone Update Order", - "minihud.config.render_toggle.prettyName.debugSupportingBlock": "Supporting Block", - "minihud.info_line.servux": "Servux Version: %s", - "minihud.info_line.servux.not_connected": "Servux Version: §cnot_connected§r", - "minihud.info_line.servux.entity_sync": "EntitySync: cB: %02d, pB: %02d, cE: %02d, pE: %02d", - "minihud.info_line.servux.structures": "Structures: sC: %02d, sR: %02d (%s), wS: %s", - "minihud.info_line.servux.structures_integrated": "Structures (Integrated Server): sC: %02d, sR: %02d (%s), wS: %s", - "minihud.info_line.entity_variant.axolotl": "Axolotl Color: §b%s§r", - "minihud.info_line.entity_variant.cat": "Cat Variant: §b%s§r (%s collar)", - "minihud.info_line.entity_variant.frog": "Frog Variant: §b%s§r", - "minihud.info_line.entity_variant.horse": "Horse Variant: §b%s / %s§r", - "minihud.info_line.entity_variant.parrot": "Parrot Variant: §b%s§r", - "minihud.info_line.entity_variant.sheep": "Sheep Color: §b%s§r", - "minihud.info_line.entity_variant.tropical_fish": "Tropical Fish Variant: §b%s§r", - "minihud.info_line.entity_variant.wolf": "Wolf Variant: §b%s§r (%s collar)" -} + "malilib.gui.button.render_layers_gui.set_to_player": "定位至玩家", + "minihud.config.generic.name.axolotlTooltips": "显示美西螈桶种类", + "minihud.config.generic.name.beeTooltips": "显示蜂巢物品蜜蜂信息", + "minihud.config.generic.name.honeyTooltips": "显示蜂巢物品蜂蜜信息", + "minihud.config.generic.name.biomeOverlayRange": "群系水平渲染范围", + "minihud.config.generic.name.biomeOverlayRangeVertical": "群系垂直渲染范围", + "minihud.config.generic.name.biomeOverlaySingleColor": "群系边界单一颜色模式", + "minihud.config.generic.name.blockPosFormat": "玩家方块位置格式", + "minihud.config.generic.name.blockGridOverlayMode": "方块网格叠加模式", + "minihud.config.generic.name.blockGridOverlayRadius": "方块网格覆盖半径", + "minihud.config.generic.name.coordinateFormat": "玩家坐标格式", + "minihud.config.generic.name.dateFormatReal": "现实时间格式", + "minihud.config.generic.name.dateFormatMinecraft": "游戏时间格式", + "minihud.config.generic.name.debugMessages": "调试信息", + "minihud.config.generic.name.debugDevelopmentMode": "debugDevelopmentMode", + "minihud.config.generic.name.debugRendererPathFindingEnablePointWidth": "寻路指示器路径点宽度", + "minihud.config.generic.name.dontClearStoredSeedOnDimensionChange": "改变维度不清除种子", + "minihud.config.generic.name.entityDataSync": "实体数据同步", + "minihud.config.generic.name.entityDataSyncBackup": "备用实体数据同步", + "minihud.config.generic.name.entityDataSyncLoadNbt": "entityDataSyncLoadNbt", + "minihud.config.generic.name.enableVanillaDebugRendererFix": "原版调试渲染器修复", + "minihud.config.generic.name.fontScale": "字体大小", + "minihud.config.generic.name.hudAlignment": "HUD 位置", + "minihud.config.generic.name.infoLinesUsesNbt": "infoLinesUsesNbt", + "minihud.config.generic.name.inventoryPreview": "容器预览快捷键", + "minihud.config.generic.name.inventoryPreviewEnabled": "启用容器预览", + "minihud.config.generic.name.inventoryPreviewToggleScreen": "容器预览鼠标释放", + "minihud.config.generic.name.lightLevelAutoHeight": "光照等级渲染自动高度", + "minihud.config.generic.name.lightLevelColoredNumbers": "光照等级渲染彩色数字", + "minihud.config.generic.name.lightLevelCollisionCheck": "光照等级渲染碰撞箱检查", + "minihud.config.generic.name.lightLevelMarkerCondition": "光照等级标记渲染条件", + "minihud.config.generic.name.lightLevelMarkers": "亮度不足标记类型", + "minihud.config.generic.name.lightLevelMarkerSize": "亮度不足标记大小", + "minihud.config.generic.name.lightLevelNumberCondition": "光照等级渲染显示数字条件", + "minihud.config.generic.name.lightLevelNumbers": "光照等级渲染显示类型", + "minihud.config.generic.name.lightLevelNumberOffsetBlockX": "方块光照等级显示横移", + "minihud.config.generic.name.lightLevelNumberOffsetBlockY": "方块光照等级显示纵移", + "minihud.config.generic.name.lightLevelNumberOffsetSkyX": "天空光照等级显示横移", + "minihud.config.generic.name.lightLevelNumberOffsetSkyY": "天空光照等级显示纵移", + "minihud.config.generic.name.lightLevelNumberRotation": "光照等级渲染旋转", + "minihud.config.generic.name.lightLevelRange": "光照等级渲染范围", + "minihud.config.generic.name.lightLevelRenderOffset": "光照渲染 Y 轴偏移", + "minihud.config.generic.name.lightLevelRenderThrough": "光照等级渲染透视", + "minihud.config.generic.name.lightLevelSkipBlockCheck": "光照等级渲染略过生成检测", + "minihud.config.generic.name.lightLevelThresholdDim": "光照等级渲染 Dim 阈值", + "minihud.config.generic.name.lightLevelThresholdSafe": "光照等级渲染 Safe 阈值", + "minihud.config.generic.name.lightLevelUnderWater": "强制水下渲染光照等级", + "minihud.config.generic.name.mainRenderingToggle": "主开关", + "minihud.config.generic.name.mapPreview": "地图预览", + "minihud.config.generic.name.mapPreviewRequireShift": "地图预览需要 Shift", + "minihud.config.generic.name.mapPreviewSize": "地图预览尺寸", + "minihud.config.generic.name.moveShapeToPlayer": "将形状移动到玩家", + "minihud.config.generic.name.offsetSubtitleHud": "HUD子标题文字偏移", + "minihud.config.generic.name.openConfigGui": "打开设置界面", + "minihud.config.generic.name.requireSneak": "需要潜行", + "minihud.config.generic.name.requiredKey": "渲染按键", + "minihud.config.generic.name.serverNbtRequestRate": "服务器 Nbt 请求速率", + "minihud.config.generic.name.setDistanceReferencePoint": "设置距离参考点", + "minihud.config.generic.name.shapeEditor": "形状编辑器", + "minihud.config.generic.name.shulkerBoxPreview": "潜影盒预览", + "minihud.config.generic.name.shulkerDisplayBgColor": "潜影盒预览背景色", + "minihud.config.generic.name.shulkerDisplayRequireShift": "潜影盒预览是否需要按住 Shift 键", + "minihud.config.generic.name.slimeChunkTopToPlayer": "史莱姆区块最高点跟随玩家", + "minihud.config.generic.name.slimeChunkOverlayRadius": "史莱姆区块渲染半径", + "minihud.config.generic.name.sortLinesByLength": "按文本长度排序", + "minihud.config.generic.name.sortLinesReversed": "文本长度反序", + "minihud.config.generic.name.spawnPlayerOuterOverlayEnabled": "渲染玩家世界生成范围", + "minihud.config.generic.name.spawnPlayerRedstoneOverlayEnabled": "渲染玩家弱加载范围", + "minihud.config.generic.name.spawnRealOuterOverlayEnabled": "渲染出生点世界生成范围", + "minihud.config.generic.name.spawnRealRedstoneOverlayEnabled": "渲染出生点弱加载范围", + "minihud.config.generic.name.spawnableColumnHeightsOverlayRadius": "顶层方块显示范围", + "minihud.config.generic.name.structuresRenderThrough": "结构渲染穿透", + "minihud.config.generic.name.textPosX": "HUD 横移", + "minihud.config.generic.name.textPosY": "HUD 纵移", + "minihud.config.generic.name.timeDayDivisor": "时间因数", + "minihud.config.generic.name.timeTotalDivisor": "总时间因数", + "minihud.config.generic.name.useCustomizedCoordinateFormat": "使用自定义坐标格式", + "minihud.config.generic.name.useFontShadow": "使用字体阴影", + "minihud.config.generic.name.useTextBackground": "使用文本背景", + "minihud.config.generic.name.villagerConversionTicks": "僵尸村民治疗计时", + "minihud.config.generic.name.villagerOfferEnchantmentBooks": "显示村民交易附魔书", + "minihud.config.generic.name.villagerOfferPriceRange": "显示村民交易附魔书价格区间", + "minihud.config.generic.name.villagerOfferHighestLevelOnly": "仅显示村民最高等级附魔书", + "minihud.config.generic.name.villagerOfferLowestPriceNearby": "仅显示村民最低价格附魔书", + "minihud.config.generic.name.villagerOfferPriceThreshold": "村民交易价格阈值", + "minihud.config.generic.comment.axolotlTooltips": "在美西螈桶的提示框中显示品种", + "minihud.config.generic.comment.beeTooltips": "在蜂箱和蜂巢物品的提示框中显示蜜蜂数量", + "minihud.config.generic.comment.honeyTooltips": "在蜂箱和蜂巢物品的提示框中显示蜂蜜等级\n(译注:一般生存模式下不会起作用)", + "minihud.config.generic.comment.biomeOverlayRange": "生物群系边界渲染器的水平区块半径\n需要开启 §6[生物群系边界显示]§f", + "minihud.config.generic.comment.biomeOverlayRangeVertical": "生物群系边界渲染器的垂直(子)区块半径\n需要开启 §6[生物群系边界显示]§f", + "minihud.config.generic.comment.biomeOverlaySingleColor": "开启后,那么生物群落边界叠加时将为所有生物群落使用相同的颜色。\n当相邻的生物群系的颜色和线条没有混合成一大堆乱七八糟的颜色时,\n会看起来「不会那么凌乱」。\n需要开启 §6[生物群系边界显示]§f", + "minihud.config.generic.comment.blockPosFormat": "§6[玩家所在方块坐标]§f 中显示格式的字符串。\n字符串中需要至少三个\"%%d\"\n预设值: \"Block: %%d, %%d, %%d\"", + "minihud.config.generic.comment.blockGridOverlayMode": "方块网格的渲染模式\n需要开启 §6[方块网格显示]§f", + "minihud.config.generic.comment.blockGridOverlayRadius": "方块网格的渲染范围半径\n需要开启 §6[方块网格显示]§f", + "minihud.config.generic.comment.coordinateFormat": "§6[玩家坐标信息]§f 中显示格式的字符串。\n字符串中需要至少三个\"%%f\"\n预设值: \"x: %%.1f y: %%.1f z: %%.1f\"", + "minihud.config.generic.comment.dateFormatReal": "§6[现实时间信息]§f 中显示日期格式的字符串,请参阅 Java SimpleDateFormat 格式", + "minihud.config.generic.comment.dateFormatMinecraft": "§6[格式化游戏时间]§f 中显示格式的字符串\n支持的占位符有:\n{DAY_1}(初始值为 1 的日)、{DAY}(初始值为 0 的日)、\n{HOUR}(小时)、{MIN}(分钟)、{SEC}(秒)、\n{MOON}(月相)。", + "minihud.config.generic.comment.debugMessages": "在控制台中启用调试信息", + "minihud.config.generic.comment.debugDevelopmentMode": "Enables the Vanilla Development Mode toggle", + "minihud.config.generic.comment.debugRendererPathFindingEnablePointWidth": "开启后,原版寻路指示器将显示路径点宽度的框线。", + "minihud.config.generic.comment.dontClearStoredSeedOnDimensionChange": "当只是改变维度时,不要清除存储的世界种子。\n有些 Mod 可能会在每个维度使用不同的种子,所以你可能需要修改这个,\n以防你的服务器 Mod 中不同维度有不同的世界种子。", + "minihud.config.generic.comment.entityDataSync": "使用 Servux 的实体同步协议获取服务端实体数据", + "minihud.config.generic.comment.entityDataSyncBackup": "当 Servux 不可用时使用原版 NBT 查询协议同步实体数据。\n这需要 OP 权限。(译注:需要2级及以上权限)", + "minihud.config.generic.comment.entityDataSyncLoadNbt": "Load the synced NBT data into the Client World.\n§6WARNING! This feature will cause incompatibility\n§6with other mods that rely on this data.", + "minihud.config.generic.comment.enableVanillaDebugRendererFix": "如果该选项启用,那么 OpenGL 所显示的状态是固定的。", + "minihud.config.generic.comment.fontScale": "HUD 中字体的缩放系数。\n默认值:0.5", + "minihud.config.generic.comment.hudAlignment": "HUD 的位置", + "minihud.config.generic.comment.infoLinesUsesNbt": "Force the Info Lines data to strictly use the Raw NBT data.\nThis setting helps ensure compatibility with\nother mods by relying ONLY on obtained NBT tags.", + "minihud.config.generic.comment.inventoryPreview": "用于激活容器预览的按键", + "minihud.config.generic.comment.inventoryPreviewEnabled": "是否启用容器预览功能。", + "minihud.config.generic.comment.inventoryPreviewToggleScreen": "按下后释放鼠标指针,以便查看具体的物品信息。", + "minihud.config.generic.comment.lightLevelAutoHeight": "如果启用,那么光照等级的覆盖层将自动提升到方块的顶部。\n§6注:这将使覆盖层也会呈现在像半砖一样的东西上,即使在那里生物将不能生成。\n§6你可以打开 §6[光照等级渲染碰撞箱检查]§f 选项来阻止它显示。", + "minihud.config.generic.comment.lightLevelColoredNumbers": "设定光照等级的数字显示是使用彩色还是白色\n(§4这就是你用 True 和 False 的理由?——ZMDF§r)", + "minihud.config.generic.comment.lightLevelCollisionCheck": "如果启用,那么如果存在任何带有碰撞箱的方块,光照等级的覆盖层将不会被渲染。\n§6注意:这不能检查该方块是否能够刷怪!\n§6开启该功能后将忽略在不同状态下可以刷怪的方块,\n§6例如,打开活板门或门时可以阻止覆盖层显示,但它们以然可以刷怪。", + "minihud.config.generic.comment.lightLevelMarkerCondition": "何时该渲染光照等级的彩色标记", + "minihud.config.generic.comment.lightLevelMarkers": "在满足 §6[光照等级标记渲染条件]§f 的条件时\n应该使用哪种方式标记满足条件的方块", + "minihud.config.generic.comment.lightLevelMarkerSize": "在满足 §6[光照等级标记渲染条件]§f 的条件时标记的大小。\n范围:0.0 - 1.0", + "minihud.config.generic.comment.lightLevelNumberCondition": "何时渲染光照等级", + "minihud.config.generic.comment.lightLevelNumbers": "调整光照等级显示需要显示的亮度来源。", + "minihud.config.generic.comment.lightLevelNumberOffsetBlockX": "显示方块亮度的光照等级时,横向位移的距离。\n范围:0.0 - 1.0", + "minihud.config.generic.comment.lightLevelNumberOffsetBlockY": "显示方块亮度的光照等级时,纵向位移的距离。\n范围:0.0 - 1.0", + "minihud.config.generic.comment.lightLevelNumberOffsetSkyX": "显示天空亮度的光照等级时,横向位移的距离。\n范围:0.0 - 1.0", + "minihud.config.generic.comment.lightLevelNumberOffsetSkyY": "显示天空亮度的光照等级时,纵向位移的距离。\n范围:0.0 - 1.0", + "minihud.config.generic.comment.lightLevelNumberRotation": "开启后,亮度显示将跟随玩家旋转。", + "minihud.config.generic.comment.lightLevelRange": "亮度显示渲染的范围\n以玩家脚为中心,数值等于体心到面心距离的正方体", + "minihud.config.generic.comment.lightLevelRenderOffset": "光照等级渲染层的相对垂直偏移量。\n这是为了帮助解决方块表面潜在的 Y 轴冲突的问题。\n范围:0.0 - 1.0", + "minihud.config.generic.comment.lightLevelRenderThrough": "开启后,那么光照等级的覆盖层将穿过方块进行渲染。\n(§4填洞小帮手,就是眼得瞎 ——ZMDF§r)", + "minihud.config.generic.comment.lightLevelSkipBlockCheck": "光照等级渲染是否跳过下面方块的怪物生成检查。\n这将使覆盖层也出现在半砖和玻璃等方块的顶部。\n(§4妈妈再也不用担心做冰道的时候看不见光照等级了 ——ZMDF§r)", + "minihud.config.generic.comment.lightLevelThresholdDim": "被认为是「§oDim(昏暗)§r」的最大亮度。\n这是一个介于「Dark(§c红色数字§r)」和「Safe(§a绿色数字§r)」\n之间的用户可配置的额外级别。将其设置在安全阈值以下以禁用它。", + "minihud.config.generic.comment.lightLevelThresholdSafe": "被认为是「Safe(§a绿色数字§r)」的最低光照等级。", + "minihud.config.generic.comment.lightLevelUnderWater": "光照覆盖层是否应在水下呈现", + "minihud.config.generic.comment.mainRenderingToggle": "MiniHUD 的主开关,包括信息行和所有渲染器。", + "minihud.config.generic.comment.mapPreview": "开启后,当鼠标悬停在地图上时,按住 Shift 键可以预览地图。", + "minihud.config.generic.comment.mapPreviewRequireShift": "预览地图是否需要按住 Shift 按键。", + "minihud.config.generic.comment.mapPreviewSize": "预览地图渲染的大小", + "minihud.config.generic.comment.moveShapeToPlayer": "将当前选择的形状移动到玩家(或玩家摄影机)的位置。", + "minihud.config.generic.comment.offsetSubtitleHud": "当 HUD 显示在右下角,且字幕启用时,\n字幕将被偏移显示在信息 HUD 上方。", + "minihud.config.generic.comment.openConfigGui": "打开游戏内配置 GUI 的热键", + "minihud.config.generic.comment.requireSneak": "只有当玩家潜行时,才显示 HUD", + "minihud.config.generic.comment.requiredKey": "只有按下此快捷键时,才显示 HUD", + "minihud.config.generic.comment.serverNbtRequestRate": "向服务器请求实体数据同步的速率", + "minihud.config.generic.comment.setDistanceReferencePoint": "储存玩家位置的快捷键\n用于设置距离参考点位", + "minihud.config.generic.comment.shapeEditor": "打开所选形状的形状编辑界面", + "minihud.config.generic.comment.shulkerBoxPreview": "启用后, 在按住Shift的同时将鼠标位于潜影盒将预览潜影盒内的物品", + "minihud.config.generic.comment.shulkerDisplayBgColor": "将 §6[潜影盒预览]§f 功能预览界面的背景颜色设定为潜影盒的颜色。", + "minihud.config.generic.comment.shulkerDisplayRequireShift": "打开潜影盒预览是否需要按住Shift", + "minihud.config.generic.comment.slimeChunkTopToPlayer": "开启时, 在开启史莱姆区块显示时显示的最高点将会设为玩家的y坐标.\n关闭时, 在开启史莱姆区块显示时最高点将设为y = 40", + "minihud.config.generic.comment.slimeChunkOverlayRadius": "渲染史莱姆区块显示的区块半径\n有效范围为 -1 到 40\n特别的 -1 = 当前区块渲染范围", + "minihud.config.generic.comment.sortLinesByLength": "对显示的信息根据其长度\n由长至短自上而下进行排列", + "minihud.config.generic.comment.sortLinesReversed": "在启用 §6[按文本长度排序]§f 后,激活该选项会使得按长度排序反向\n关闭状态——由长至短自上而下\n开启状态——由短至长自上而下", + "minihud.config.generic.comment.spawnPlayerOuterOverlayEnabled": "启用玩家世界生成范围的渲染器(紫)\n需要开启 §6[玩家加载范围显示]§f", + "minihud.config.generic.comment.spawnPlayerRedstoneOverlayEnabled": "启用玩家弱加载范围的渲染器(黄)\n需要开启 §6[玩家加载范围显示]§f", + "minihud.config.generic.comment.spawnRealOuterOverlayEnabled": "启用出生点世界生成范围的渲染器(棕)\n需要开启 §6[出生点加载范围显示]§f", + "minihud.config.generic.comment.spawnRealRedstoneOverlayEnabled": "启用出生点弱加载范围的渲染器(黄)\n需要开启 §6[出生点加载范围显示]§f", + "minihud.config.generic.comment.spawnableColumnHeightsOverlayRadius": "顶层方块显示的渲染范围\n以玩家为中心,数值等于体心到面心距离的正方体,\n范围:0 - 128", + "minihud.config.generic.comment.structuresRenderThrough": "开启后,结构轮廓覆盖层将穿过方块进行渲染。", + "minihud.config.generic.comment.textPosX": "HUD 距离屏幕边缘的横向距离(默认为 4)", + "minihud.config.generic.comment.textPosY": "HUD 距离屏幕边缘的纵向距离(默认为 4)", + "minihud.config.generic.comment.timeDayDivisor": "一天时间的模型因数\n(译注:可以理解为把一天分为多少份)", + "minihud.config.generic.comment.timeTotalDivisor": "整体世界时间的模型因数\n(译注:可以理解为把一天分为多少份)", + "minihud.config.generic.comment.useCustomizedCoordinateFormat": "是否在 §6[玩家坐标信息]§f 中使用 §6[玩家坐标格式]§f 的自定义格式", + "minihud.config.generic.comment.useFontShadow": "使用文本阴影", + "minihud.config.generic.comment.useTextBackground": "在 HUD 中使用纯色背景色,使其拥有底色。", + "minihud.config.generic.comment.villagerConversionTicks": "显示僵尸村民的转换时间。\n需要开启 §6[村民信息显示]§f", + "minihud.config.generic.comment.villagerOfferEnchantmentBooks": "显示村民售卖附魔书的价格\n需要开启 §6[村民信息显示]§f", + "minihud.config.generic.comment.villagerOfferPriceRange": "显示村民交易附魔书的价格区间\n需要开启 §6[村民信息显示]§f", + "minihud.config.generic.comment.villagerOfferHighestLevelOnly": "只显示售卖最高等级的附魔书的村民交易\n需要开启 §6[村民信息显示]§f", + "minihud.config.generic.comment.villagerOfferLowestPriceNearby": "只显示相同附魔最便宜的村民交易\n需要开启 §6[村民信息显示]§f", + "minihud.config.generic.comment.villagerOfferPriceThreshold": "只显示价格低于此比例的村民交易\n若要显示全部请设为1.0\n需要开启 §6[村民信息显示]§f", + "minihud.config.generic.prettyName.mainRenderingToggle": "MiniHUD 主开关", + "minihud.config.colors.name.beaconRangeLvl1": "1 级信标颜色", + "minihud.config.colors.name.beaconRangeLvl2": "2 级信标颜色", + "minihud.config.colors.name.beaconRangeLvl3": "3 级信标颜色", + "minihud.config.colors.name.beaconRangeLvl4": "4 级信标颜色", + "minihud.config.colors.name.blockGridOverlayColor": "方块网格颜色", + "minihud.config.colors.name.conduitRange": "潮涌核心范围颜色", + "minihud.config.colors.name.lightLevelMarkerBlockLit": "亮度充足标记颜色", + "minihud.config.colors.name.lightLevelMarkerDark": "亮度不足标记颜色", + "minihud.config.colors.name.lightLevelMarkerDim": "亮度昏暗标记颜色", + "minihud.config.colors.name.lightLevelMarkerSkyLit": "天空亮度标记颜色", + "minihud.config.colors.name.lightLevelNumberBlockDark": "方块亮度不足颜色", + "minihud.config.colors.name.lightLevelNumberBlockDim": "方块亮度昏暗数字颜色", + "minihud.config.colors.name.lightLevelNumberBlockLit": "方块亮度充足颜色", + "minihud.config.colors.name.lightLevelNumberSkyDark": "天空亮度不足颜色", + "minihud.config.colors.name.lightLevelNumberSkyDim": "天空亮度昏暗数字颜色", + "minihud.config.colors.name.lightLevelNumberSkyLit": "天空亮度充足颜色", + "minihud.config.colors.name.randomTicksFixedOverlayColor": "固定随机刻范围颜色", + "minihud.config.colors.name.randomTicksPlayerOverlayColor": "跟随玩家移动随机刻范围颜色", + "minihud.config.colors.name.regionOverlayColor": "区域边界颜色", + "minihud.config.colors.name.shapeAdjustableSpawnSphere": "可调节生成球体颜色", + "minihud.config.colors.name.shapeBox": "长方体颜色", + "minihud.config.colors.name.shapeCanDespawnSphere": "怪物可能消失范围球体颜色", + "minihud.config.colors.name.shapeCanSpawnSphere": "可刷怪范围球体颜色", + "minihud.config.colors.name.shapeCircle": "圆环颜色", + "minihud.config.colors.name.shapeDespawnSphere": "怪物强制卸载范围球体颜色", + "minihud.config.colors.name.shapeLineBlocky": "直线颜色", + "minihud.config.colors.name.shapeSphereBlocky": "球体颜色", + "minihud.config.colors.name.slimeChunksOverlayColor": "史莱姆区块颜色", + "minihud.config.colors.name.spawnPlayerEntityOverlayColor": "玩家强加载范围颜色", + "minihud.config.colors.name.spawnPlayerRedstoneOverlayColor": "玩家弱加载范围颜色", + "minihud.config.colors.name.spawnPlayerLazyOverlayColor": "玩家加载边界范围颜色", + "minihud.config.colors.name.spawnPlayerOuterOverlayColor": "玩家世界生成范围颜色", + "minihud.config.colors.name.spawnRealEntityOverlayColor": "出生点强加载范围颜色", + "minihud.config.colors.name.spawnRealRedstoneOverlayColor": "出生点弱加载范围颜色", + "minihud.config.colors.name.spawnRealLazyOverlayColor": "出生点加载边界范围颜色", + "minihud.config.colors.name.spawnRealOuterOverlayColor": "出生点世界生成范围颜色", + "minihud.config.colors.name.spawnableColumnHeightsOverlayColor": "顶层方块显示颜色", + "minihud.config.colors.name.textBackgroundColor": "文本背景颜色", + "minihud.config.colors.name.textColor": "文本颜色", + "minihud.config.colors.comment.beaconRangeLvl1": "1级信标范围的颜色", + "minihud.config.colors.comment.beaconRangeLvl2": "2级信标范围的颜色", + "minihud.config.colors.comment.beaconRangeLvl3": "3级信标范围的颜色", + "minihud.config.colors.comment.beaconRangeLvl4": "4级信标范围的颜色", + "minihud.config.colors.comment.blockGridOverlayColor": "方块网格覆盖颜色", + "minihud.config.colors.comment.conduitRange": "潮涌核心覆盖范围的颜色", + "minihud.config.colors.comment.lightLevelMarkerBlockLit": "安全点标记的颜色 (白天)", + "minihud.config.colors.comment.lightLevelMarkerDark": "可生成点的标记颜色", + "minihud.config.colors.comment.lightLevelMarkerDim": "\"dim\"标记的颜色 (用户可定义等级)", + "minihud.config.colors.comment.lightLevelMarkerSkyLit": "安全点标记的颜色 (白天)", + "minihud.config.colors.comment.lightLevelNumberBlockDark": "方块亮度低于 §6[光照等级渲染 Safe 阈值]§f时标记的颜色", + "minihud.config.colors.comment.lightLevelNumberBlockDim": "方块亮度大于 §6[光照等级渲染 Dim 阈值]§f \n且小于 §6[光照等级渲染 Safe 阈值]§f 时标记的颜色", + "minihud.config.colors.comment.lightLevelNumberBlockLit": "方块亮度大于等于 §6[光照等级渲染 Safe 阈值]§f时标记的颜色", + "minihud.config.colors.comment.lightLevelNumberSkyDark": "天空亮度低于 §6[光照等级渲染 Safe 阈值]§f时标记的颜色", + "minihud.config.colors.comment.lightLevelNumberSkyDim": "天空亮度大于 §6[光照等级渲染 Dim 阈值]§f \n且小于 §6[光照等级渲染 Safe 阈值]§f 时标记的颜色", + "minihud.config.colors.comment.lightLevelNumberSkyLit": "天空亮度大于等于 §6[光照等级渲染 Safe 阈值]§f时标记的颜色", + "minihud.config.colors.comment.randomTicksFixedOverlayColor": "开启时位置的随机刻区域的颜色", + "minihud.config.colors.comment.randomTicksPlayerOverlayColor": "跟随玩家运动显示的随机刻区域的颜色", + "minihud.config.colors.comment.regionOverlayColor": "区域文件边界的颜色", + "minihud.config.colors.comment.shapeAdjustableSpawnSphere": "§6[可调节生成球体]§f的默认颜色。\n每个球体的颜色可以通过其配置 GUI 进行更改。", + "minihud.config.colors.comment.shapeBox": "§6[长方体]§f 的默认颜色。\n每个长方体的颜色可以通过其配置 GUI 进行更改。", + "minihud.config.colors.comment.shapeCanDespawnSphere": "§6[怪物可能消失范围球体]§f的默认颜色。\n每个球体的颜色可以通过其配置 GUI 进行更改。", + "minihud.config.colors.comment.shapeCanSpawnSphere": "§6[可刷怪范围球体]§f的默认颜色。\n每个球体的颜色可以通过其配置 GUI 进行更改。", + "minihud.config.colors.comment.shapeCircle": "§6[圆环]§f 的默认颜色。\n每个圆环的颜色可以通过其配置 GUI 进行更改。", + "minihud.config.colors.comment.shapeDespawnSphere": "§6[怪物强制卸载范围球体]§f的默认颜色。\n每个球体的颜色可以通过其配置 GUI 进行更改。", + "minihud.config.colors.comment.shapeLineBlocky": "§6[直线]§f 的默认颜色。\n每个直线的颜色可以通过其配置 GUI 进行更改。", + "minihud.config.colors.comment.shapeSphereBlocky": "§6[球体]§f 的默认颜色。\n每个球体的颜色可以通过其配置 GUI 进行更改。", + "minihud.config.colors.comment.slimeChunksOverlayColor": "渲染史莱姆区块时的颜色", + "minihud.config.colors.comment.spawnPlayerEntityOverlayColor": "玩家加载范围中强加载区块的颜色\n§9蓝 - 强加载区块", + "minihud.config.colors.comment.spawnPlayerRedstoneOverlayColor": "玩家加载范围中弱加载区块的颜色\n§e黄 - 弱加载区块(默认关闭)", + "minihud.config.colors.comment.spawnPlayerLazyOverlayColor": "玩家加载范围中加载边界区块的颜色\n§d粉 - 加载边界区块", + "minihud.config.colors.comment.spawnPlayerOuterOverlayColor": "玩家加载范围中世界生成区块的颜色\n§5紫 - 世界生成区块,范围外的区块完全不加载(默认关闭)", + "minihud.config.colors.comment.spawnRealEntityOverlayColor": "出生点加载范围中强加载区块的颜色\n§a绿 - 强加载区块", + "minihud.config.colors.comment.spawnRealRedstoneOverlayColor": "出生点加载范围中弱加载区块的颜色\n§e黄 - 弱加载区块(默认关闭)", + "minihud.config.colors.comment.spawnRealLazyOverlayColor": "出生点加载范围中加载边界区块的颜色\n§c红 - 加载边界区块", + "minihud.config.colors.comment.spawnRealOuterOverlayColor": "出生点加载范围中世界生成区块的颜色\n§6棕 - 世界生成区块,范围外的区块完全不加载(默认关闭)", + "minihud.config.colors.comment.spawnableColumnHeightsOverlayColor": "区块最高位置的方块所显示的颜色", + "minihud.config.colors.comment.textBackgroundColor": "HUD中文本背景的颜色", + "minihud.config.colors.comment.textColor": "HUD中文本的颜色", + "minihud.config.info_toggle.name.infoBeeCount": "蜜蜂数量信息", + "minihud.config.info_toggle.name.infoBiome": "生物群系信息", + "minihud.config.info_toggle.name.infoBiomeRegistryName": "生物群系注册名信息", + "minihud.config.info_toggle.name.infoBlockBreakSpeed": "挖掘速度信息", + "minihud.config.info_toggle.name.infoBlockInChunk": "区块内方块信息", + "minihud.config.info_toggle.name.infoBlockPosition": "方块位置信息", + "minihud.config.info_toggle.name.infoBlockProperties": "方块属性信息", + "minihud.config.info_toggle.name.infoChunkPosition": "区块位置信息", + "minihud.config.info_toggle.name.infoChunkSections": "渲染区块信息", + "minihud.config.info_toggle.name.infoChunkSectionsLine": "渲染区块完整信息", + "minihud.config.info_toggle.name.infoChunkUpdates": "区块更新信息", + "minihud.config.info_toggle.name.infoCoordinates": "玩家坐标信息", + "minihud.config.info_toggle.name.infoCoordinatesScaled": "坐标映射信息", + "minihud.config.info_toggle.name.infoDifficulty": "区域难度信息", + "minihud.config.info_toggle.name.infoDimensionId": "维度信息", + "minihud.config.info_toggle.name.infoDistance": "距离信息", + "minihud.config.info_toggle.name.infoEntities": "实体数量信息", + "minihud.config.info_toggle.name.infoEntitiesClientWorld": "客户端世界实体信息", + "minihud.config.info_toggle.name.infoEntityRegistryName": "实体注册名信息", + "minihud.config.info_toggle.name.infoEntityVariant": "infoEntityVariant", + "minihud.config.info_toggle.name.infoFacing": "朝向信息", + "minihud.config.info_toggle.name.infoFurnaceXp": "熔炉经验信息", + "minihud.config.info_toggle.name.infoFPS": "帧率信息", + "minihud.config.info_toggle.name.infoHoneyLevel": "蜂蜜等级信息", + "minihud.config.info_toggle.name.infoHorseSpeed": "马匹速度信息", + "minihud.config.info_toggle.name.infoHorseJump": "马匹跳跃信息", + "minihud.config.info_toggle.name.infoLightLevel": "光照等级信息", + "minihud.config.info_toggle.name.infoLookingAtBlock": "注视方块信息", + "minihud.config.info_toggle.name.infoLookingAtBlockInChunk": "注视区块内方块信息", + "minihud.config.info_toggle.name.infoLookingAtEntity": "注视实体信息", + "minihud.config.info_toggle.name.infoLookingAtEffects": "注视实体效果信息", + "minihud.config.info_toggle.name.infoLookingAtPlayerExp": "infoLookingAtPlayerExp", + "minihud.config.info_toggle.name.infoMemoryUsage": "内存使用情况信息", + "minihud.config.info_toggle.name.infoMobCaps": "生物上限信息", + "minihud.config.info_toggle.name.infoLoadedChunksCount": "已加载区块数量", + "minihud.config.info_toggle.name.infoPandaGene": "熊猫基因信息", + "minihud.config.info_toggle.name.infoParticleCount": "粒子数量", + "minihud.config.info_toggle.name.infoPlayerExperience": "infoPlayerExperience", + "minihud.config.info_toggle.name.infoPing": "延迟信息", + "minihud.config.info_toggle.name.infoRegionFile": "区域文件信息", + "minihud.config.info_toggle.name.infoRotationPitch": "旋转俯仰角信息", + "minihud.config.info_toggle.name.infoRotationYaw": "旋转方向角信息", + "minihud.config.info_toggle.name.infoServerTPS": "服务器TPS信息", + "minihud.config.info_toggle.name.infoServux": "服务器Servux信息", + "minihud.config.info_toggle.name.infoSlimeChunk": "史莱姆区块信息", + "minihud.config.info_toggle.name.infoSpeed": "速度信息", + "minihud.config.info_toggle.name.infoSpeedAxis": "轴速度信息", + "minihud.config.info_toggle.name.infoSpeedHV": "速度分量信息", + "minihud.config.info_toggle.name.infoSprinting": "奔跑信息", + "minihud.config.info_toggle.name.infoTileEntities": "方块实体信息", + "minihud.config.info_toggle.name.infoTimeDayModulo": "时间周期因数信息", + "minihud.config.info_toggle.name.infoTimeIRL": "现实时间信息", + "minihud.config.info_toggle.name.infoTimeTotalModulo": "总时间周期因数信息", + "minihud.config.info_toggle.name.infoTimeWorld": "世界开放时间信息", + "minihud.config.info_toggle.name.infoWorldTimeFormatted": "格式化游戏时间信息", + "minihud.config.info_toggle.name.infoWeather": "天气信息", + "minihud.config.info_toggle.name.infoZombieConversion": "僵尸村民转化信息", + "minihud.config.info_toggle.comment.infoBeeCount": "显示目标蜂巢或巢穴中的蜜蜂数量.\n§6注意:这仅在单人游戏中有效(没有服务器端支持时,\n§6将无法正常显示,但会在服务器存在Servux时正常显示)", + "minihud.config.info_toggle.comment.infoBiome": "显示当前生物群系的名称", + "minihud.config.info_toggle.comment.infoBiomeRegistryName": "显示当前生物群系的注册名称", + "minihud.config.info_toggle.comment.infoBlockBreakSpeed": "显示玩家在过去 100 个刻 (5 秒) 内\n的方块破坏速度", + "minihud.config.info_toggle.comment.infoBlockInChunk": "显示玩家在区块中的当前方块位置", + "minihud.config.info_toggle.comment.infoBlockPosition": "显示玩家当前的方块位置", + "minihud.config.info_toggle.comment.infoBlockProperties": "显示方块状态的属性和值", + "minihud.config.info_toggle.comment.infoChunkPosition": "显示玩家当前所在的区块", + "minihud.config.info_toggle.comment.infoChunkSections": "显示当前渲染的区块部分数量\n(F3 中的 C 值)", + "minihud.config.info_toggle.comment.infoChunkSectionsLine": "显示 F3 中 C 值的整行", + "minihud.config.info_toggle.comment.infoChunkUpdates": "显示当前每秒更新的区块数量", + "minihud.config.info_toggle.comment.infoCoordinates": "显示玩家的坐标", + "minihud.config.info_toggle.comment.infoCoordinatesScaled": "显示玩家的坐标,按维度的坐标比例进行缩放。\n仅在主世界和下界且其坐标比例是原版的系数时有效", + "minihud.config.info_toggle.comment.infoDifficulty": "显示当前的区域难度", + "minihud.config.info_toggle.comment.infoDimensionId": "显示当前维度 ID\n(结果可能不准确,\n这个问题取决于服务器 (Sponge?)!)", + "minihud.config.info_toggle.comment.infoDistance": "显示到当前参考点的距离。\n使用 §6[设置距离参考点]§f 设置参考点", + "minihud.config.info_toggle.comment.infoEntities": "显示可见/已加载的实体数量", + "minihud.config.info_toggle.comment.infoEntitiesClientWorld": "显示世界列表/地图中的实体数量", + "minihud.config.info_toggle.comment.infoEntityRegistryName": "显示玩家当前注视实体的注册名称", + "minihud.config.info_toggle.comment.infoEntityVariant": "Show the looked-at Entity variant information,\nsuch as Sheep Color, or Wolf Type", + "minihud.config.info_toggle.comment.infoFacing": "显示玩家当前的朝向", + "minihud.config.info_toggle.comment.infoFurnaceXp": "显示注视的熔炉中的经验数量。\n§6注意:这仅在单人游戏中有效(没有服务器端支持时,\n§6将无法正常显示,但会在服务器存在Servux时正常显示)", + "minihud.config.info_toggle.comment.infoFPS": "显示当前的帧率", + "minihud.config.info_toggle.comment.infoHoneyLevel": "显示注视中的蜂巢或蜂窝的蜂蜜等级.\n§6注意:这仅在单人游戏中有效(没有服务器端支持时,\n§6将无法正常显示,但会在服务器存在Servux时正常显示)", + "minihud.config.info_toggle.comment.infoHorseSpeed": "显示正在骑乘的马的速度 (米/秒)", + "minihud.config.info_toggle.comment.infoHorseJump": "显示正在骑乘的马的跳跃高度", + "minihud.config.info_toggle.comment.infoLightLevel": "显示当前光照等级", + "minihud.config.info_toggle.comment.infoLookingAtBlock": "显示当前玩家正在观察的方块", + "minihud.config.info_toggle.comment.infoLookingAtBlockInChunk": "显示玩家正在观察的方块所处的区块位置信息", + "minihud.config.info_toggle.comment.infoLookingAtEntity": "显示玩家看到的实体名称和生命值。\n如果服务器存在 Servux,可以看到更多数据。", + "minihud.config.info_toggle.comment.infoLookingAtEffects": "显示玩家看到的实体的状态效果。\n如果服务器存在 Servux,可以看到更多数据。", + "minihud.config.info_toggle.comment.infoLookingAtPlayerExp": "Show another Player's experience values.", + "minihud.config.info_toggle.comment.infoMemoryUsage": "显示内存的使用和分配情况", + "minihud.config.info_toggle.comment.infoMobCaps": "显示刷怪占用\n\n§d注意:目前只适用于地毯端服务器!\n§6数据目前只能从 Carpet 服务器上的 list 列表解析(Tab 显示)\n§6当然前提是如果您已使用「/log mobcaps」向服务器获取了数据", + "minihud.config.info_toggle.comment.infoLoadedChunksCount": "显示客户端上加载区块的数量", + "minihud.config.info_toggle.comment.infoPandaGene": "显示玩家看向的熊猫的基因信息", + "minihud.config.info_toggle.comment.infoParticleCount": "显示当前渲染的粒子数量 (F3 中的 P)", + "minihud.config.info_toggle.comment.infoPlayerExperience": "Show the Player's Experience values", + "minihud.config.info_toggle.comment.infoPing": "显示当前服务器延迟", + "minihud.config.info_toggle.comment.infoRegionFile": "显示玩家当前所在的区块文件", + "minihud.config.info_toggle.comment.infoRotationPitch": "显示玩家的俯仰旋转角度", + "minihud.config.info_toggle.comment.infoRotationYaw": "显示玩家的方向旋转角度", + "minihud.config.info_toggle.comment.infoServerTPS": "显示当前服务器的TPS和ms/tick(MSPT)\n注意: 这个值仅在使用Carpet服务端并且开启了TPS display carpet规则的时候是准确的, 其他情况下都是客户端基于当前世界时间更新估算的并且仅能检测到TPS小于20的数值", + "minihud.config.info_toggle.comment.infoServux": "显示 Servux 版本和实体数据同步协议版本", + "minihud.config.info_toggle.comment.infoSlimeChunk": "显示玩家当前是否在史莱姆区块中\n注意:这仅在单人游戏中有效\n在服务器中,玩家需要:\n 1) 成为管理员/OP 并在 每次加入或更改维度时手动运行 /seed 命令\n 2) 通过控制台输入种子,例如: \"minihud-seed 12345\"", + "minihud.config.info_toggle.comment.infoSpeed": "显示玩家当前的移动速度", + "minihud.config.info_toggle.comment.infoSpeedAxis": "显示玩家当前每个方向的移动速度", + "minihud.config.info_toggle.comment.infoSpeedHV": "显示玩家水平和垂直方向的移动速度", + "minihud.config.info_toggle.comment.infoSprinting": "展示玩家冲刺状态", + "minihud.config.info_toggle.comment.infoTileEntities": "显示客户端世界中的TileEntities数量", + "minihud.config.info_toggle.comment.infoTimeDayModulo": "显示当前一天的时间因数\n可以在配置中设置", + "minihud.config.info_toggle.comment.infoTimeIRL": "根据 §6[现实时间格式]§f 的格式化显示当前现实时间", + "minihud.config.info_toggle.comment.infoTimeTotalModulo": "显示当前世界总时间的时间因数\n可以在配置中设置", + "minihud.config.info_toggle.comment.infoTimeWorld": "显示当前世界开放的时间刻\n可以理解为开服时间", + "minihud.config.info_toggle.comment.infoWorldTimeFormatted": "按照天、小时、分钟的格式展示当前时间", + "minihud.config.info_toggle.comment.infoWeather": "显示当前天气", + "minihud.config.info_toggle.comment.infoZombieConversion": "显示僵尸村民距离转换剩余的时间", + "minihud.config.render_toggle.name.overlayBeaconRange": "信标范围显示", + "minihud.config.render_toggle.name.overlayBiomeBorder": "生物群系边界显示", + "minihud.config.render_toggle.name.overlayBlockGrid": "方块网格显示", + "minihud.config.render_toggle.name.overlayConduitRange": "潮涌核心范围显示", + "minihud.config.render_toggle.name.overlayLightLevel": "光照等级显示", + "minihud.config.render_toggle.name.overlayRandomTicksFixed": "固定随机刻区域显示", + "minihud.config.render_toggle.name.overlayRandomTicksPlayer": "玩家跟随随机刻区域显示", + "minihud.config.render_toggle.name.overlayRegionFile": "区域文件边界显示", + "minihud.config.render_toggle.name.overlaySlimeChunks": "史莱姆区块显示", + "minihud.config.render_toggle.name.overlaySpawnableColumnHeights": "顶层方块显示", + "minihud.config.render_toggle.name.overlaySpawnChunkReal": "出生点加载范围显示", + "minihud.config.render_toggle.name.overlaySpawnChunkPlayer": "玩家加载范围显示", + "minihud.config.render_toggle.name.overlayStructureMainToggle": "结构渲染器", + "minihud.config.render_toggle.name.overlayVillagerInfo": "村民信息显示", + "minihud.config.render_toggle.name.shapeRenderer": "图形渲染器", + "minihud.config.render_toggle.name.debugDataMainToggle": "debugDataMainToggle", + "minihud.config.render_toggle.name.debugBeeDataEnabled": "debugBeeDataEnabled", + "minihud.config.render_toggle.name.debugBrainEnabled": "debugBrainEnabled", + "minihud.config.render_toggle.name.debugBreezeJumpEnabled": "debugBreezeJumpEnabled", + "minihud.config.render_toggle.name.debugChunkBorder": "区块边界显示", + "minihud.config.render_toggle.name.debugChunkDebug": "debugChunkDebug", + "minihud.config.render_toggle.name.debugChunkInfo": "区块调试信息显示", + "minihud.config.render_toggle.name.debugChunkLoading": "debugChunkLoading", + "minihud.config.render_toggle.name.debugChunkOcclusion": "封闭区块显示", + "minihud.config.render_toggle.name.debugCollisionBoxEnabled": "碰撞箱显示", + "minihud.config.render_toggle.name.debugHeightmapEnabled": "debugHeightmapEnabled", + "minihud.config.render_toggle.name.debugLightEnabled": "debugLightEnabled", + "minihud.config.render_toggle.name.debugNeighborsUpdateEnabled": "方块更新显示", + "minihud.config.render_toggle.name.debugGameTestEnabled": "debugGameTestEnabled", + "minihud.config.render_toggle.name.debugGameEventsEnabled": "debugGameEventsEnabled", + "minihud.config.render_toggle.name.debugGoalSelectorEnabled": "debugGoalSelectorEnabled", + "minihud.config.render_toggle.name.debugOctreeEnabled": "debugOctreeEnabled", + "minihud.config.render_toggle.name.debugPathfindingEnabled": "寻路更新显示", + "minihud.config.render_toggle.name.debugRaidCenterEnabled": "debugRaidCenterEnabled", + "minihud.config.render_toggle.name.debugRedstoneUpdateOrder": "debugRedstoneUpdateOrder", + "minihud.config.render_toggle.name.debugSkylightEnabled": "debugSkylightEnabled", + "minihud.config.render_toggle.name.debugSolidFaceEnabled": "块面调试显示", + "minihud.config.render_toggle.name.debugStructuresEnabled": "debugStructuresEnabled", + "minihud.config.render_toggle.name.debugSupportingBlock": "debugSupportingBlock", + "minihud.config.render_toggle.name.debugWaterEnabled": "水面调试信息显示", + "minihud.config.render_toggle.name.debugVillageEnabled": "debugVillageEnabled", + "minihud.config.render_toggle.name.debugVillageSectionsEnabled": "debugVillageSectionsEnabled", + "minihud.config.render_toggle.name.debugWorldGenEnabled": "debugWorldGenEnabled", + "minihud.config.render_toggle.comment.overlayBeaconRange": "切换是否显示信标范围", + "minihud.config.render_toggle.comment.overlayBiomeBorder": "切换是否显示群系边界", + "minihud.config.render_toggle.comment.overlayBlockGrid": "切换是否显示方块网格\n(§4屌用没有还晃眼——ZMDF§r)", + "minihud.config.render_toggle.comment.overlayConduitRange": "切换是否显示潮涌核心覆盖范围", + "minihud.config.render_toggle.comment.overlayLightLevel": "切换是否显示光照等级显示", + "minihud.config.render_toggle.comment.overlayRandomTicksFixed": "切换是否显示随机刻固定点位区域", + "minihud.config.render_toggle.comment.overlayRandomTicksPlayer": "切换是否显示随机刻区域\n(以玩家为中心可移动)", + "minihud.config.render_toggle.comment.overlayRegionFile": "切换是否显示区域文件内边界\n(区域文件为 32*32 的区块组成)", + "minihud.config.render_toggle.comment.overlaySlimeChunks": "切换是否显示史莱姆区块", + "minihud.config.render_toggle.comment.overlaySpawnableColumnHeights": "切换是否显示区块最高位置的方块", + "minihud.config.render_toggle.comment.overlaySpawnChunkReal": "出生点加载范围的渲染器\n§a绿 - 强加载区块\n§e黄 - 强加载区块(默认关闭)\n§c红 - 加载边界区块\n§6棕 - 世界生成区块,范围外的区块完全不加载(默认关闭)", + "minihud.config.render_toggle.comment.overlaySpawnChunkPlayer": "玩家加载范围的渲染器\n§9蓝 - 强加载区块\n§e黄 - 弱加载区块(默认关闭)\n§d粉 - 加载边界区块\n§5紫 - 世界生成区块,范围外的区块完全不加载(默认关闭)", + "minihud.config.render_toggle.comment.overlayStructureMainToggle": "切换是否显示所有的结构的边框", + "minihud.config.render_toggle.comment.overlayVillagerInfo": "切换是否显示村民的各种信息", + "minihud.config.render_toggle.comment.shapeRenderer": "切换是否显示图形渲染器渲染的图形", + "minihud.config.render_toggle.comment.debugDataMainToggle": "Toggles the Debug Data Service from either\nSingle Player, or via Servux, and this\ndisables all optional Debug Renderers.", + "minihud.config.render_toggle.comment.debugBrainEnabled": "Toggles the vanilla Brain debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugBeeDataEnabled": "Toggles the vanilla Bee Data debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugBreezeJumpEnabled": "Toggles the vanilla Breeze Jump debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux", + "minihud.config.render_toggle.comment.debugChunkBorder": "打开区块边界显示,效果与 F3 + G 一样。", + "minihud.config.render_toggle.comment.debugChunkDebug": "Toggles the vanilla Chunk Debug debug renderer", + "minihud.config.render_toggle.comment.debugChunkInfo": "切换是否显示原版区块信息调试(16*16*16 的空间)", + "minihud.config.render_toggle.comment.debugChunkLoading": "Toggles the vanilla Chunk Loading debug renderer", + "minihud.config.render_toggle.comment.debugChunkOcclusion": "切换是否显示封闭区块的显示(16*16*16 的空间)", + "minihud.config.render_toggle.comment.debugCollisionBoxEnabled": "切换是否显示碰撞箱调试渲染", + "minihud.config.render_toggle.comment.debugHeightmapEnabled": "Toggles the vanilla Heightmap debug renderer", + "minihud.config.render_toggle.comment.debugLightEnabled": "Toggles the vanilla Light debug renderer", + "minihud.config.render_toggle.comment.debugNeighborsUpdateEnabled": "切换是否显示方块更新调试渲染", + "minihud.config.render_toggle.comment.debugGameTestEnabled": "Toggles the vanilla Game Test debug renderer\n§6WARNING! This requires Server-Side data\n§6and it is currently broken.", + "minihud.config.render_toggle.comment.debugGameEventsEnabled": "Toggles the vanilla Game Events debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugGoalSelectorEnabled": "Toggles the vanilla Goal Selector debug renderer", + "minihud.config.render_toggle.comment.debugOctreeEnabled": "Toggles the vanilla Octree debug renderer", + "minihud.config.render_toggle.comment.debugPathfindingEnabled": "切换是否显示生物寻路更新调试渲染", + "minihud.config.render_toggle.comment.debugRaidCenterEnabled": "Toggles the vanilla Raid Center debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugRedstoneUpdateOrder": "Toggles the vanilla Redstone Update Order debug renderer\n§6WARNING! This requires Server-Side data\n§6and it is currently broken.", + "minihud.config.render_toggle.comment.debugSkylightEnabled": "Toggles the vanilla Skylight debug renderer", + "minihud.config.render_toggle.comment.debugSolidFaceEnabled": "切换是否显示方块表面是否完整更新调试渲染", + "minihud.config.render_toggle.comment.debugStructuresEnabled": "Toggles the vanilla Structures debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugSupportingBlock": "Toggles the vanilla Supporting Block debug renderer", + "minihud.config.render_toggle.comment.debugWaterEnabled": "切换是否显示水面流动距离(只对水有效)", + "minihud.config.render_toggle.comment.debugVillageEnabled": "Toggles the vanilla Village debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugVillageSectionsEnabled": "Toggles the vanilla Village Sections debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugWorldGenEnabled": "Toggles the vanilla World Gen debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.prettyName.overlayBeaconRange": "信标范围", + "minihud.config.render_toggle.prettyName.overlayBiomeBorder": "群系边界", + "minihud.config.render_toggle.prettyName.overlayBlockGrid": "方块网格覆盖层", + "minihud.config.render_toggle.prettyName.overlayConduitRange": "信标范围", + "minihud.config.render_toggle.prettyName.overlayLightLevel": "光照等级", + "minihud.config.render_toggle.prettyName.overlayRandomTicksFixed": "随机刻区域(固定)", + "minihud.config.render_toggle.prettyName.overlayRandomTicksPlayer": "随机刻区域(跟随)", + "minihud.config.render_toggle.prettyName.overlayRegionFile": "区域文件边界", + "minihud.config.render_toggle.prettyName.overlaySlimeChunks": "史莱姆区块", + "minihud.config.render_toggle.prettyName.overlaySpawnableColumnHeights": "顶层方块渲染", + "minihud.config.render_toggle.prettyName.overlaySpawnChunkReal": "出生点加载范围", + "minihud.config.render_toggle.prettyName.overlaySpawnChunkPlayer": "玩家加载范围", + "minihud.config.render_toggle.prettyName.overlayStructureMainToggle": "结构边框", + "minihud.config.render_toggle.prettyName.overlayVillagerInfo": "村民信息", + "minihud.config.render_toggle.prettyName.shapeRenderer": "形状渲染器", + "minihud.config.render_toggle.prettyName.debugDataMainToggle": "Debug Data Main Toggle", + "minihud.config.render_toggle.prettyName.debugBrainEnabled": "Brain Data", + "minihud.config.render_toggle.prettyName.debugBeeDataEnabled": "Bee Data", + "minihud.config.render_toggle.prettyName.debugBreezeJumpEnabled": "Breeze Jump", + "minihud.config.render_toggle.prettyName.debugChunkBorder": "区块边界", + "minihud.config.render_toggle.prettyName.debugChunkDebug": "Chunk Debug", + "minihud.config.render_toggle.prettyName.debugChunkInfo": "区块信息", + "minihud.config.render_toggle.prettyName.debugChunkLoading": "Chunk Loading", + "minihud.config.render_toggle.prettyName.debugChunkOcclusion": "封闭区块信息", + "minihud.config.render_toggle.prettyName.debugCollisionBoxEnabled": "碰撞箱显示", + "minihud.config.render_toggle.prettyName.debugHeightmapEnabled": "Heightmap", + "minihud.config.render_toggle.prettyName.debugLightEnabled": "Light", + "minihud.config.render_toggle.prettyName.debugNeighborsUpdateEnabled": "方块更新显示", + "minihud.config.render_toggle.prettyName.debugGameTestEnabled": "Game Test", + "minihud.config.render_toggle.prettyName.debugGameEventsEnabled": "Game Events", + "minihud.config.render_toggle.prettyName.debugGoalSelectorEnabled": "Goal Selector", + "minihud.config.render_toggle.prettyName.debugOctreeEnabled": "Octree Debug", + "minihud.config.render_toggle.prettyName.debugPathfindingEnabled": "寻路", + "minihud.config.render_toggle.prettyName.debugRaidCenterEnabled": "Raid Center", + "minihud.config.render_toggle.prettyName.debugRedstoneUpdateOrder": "Redstone Update Order", + "minihud.config.render_toggle.prettyName.debugSkylightEnabled": "Sky Light", + "minihud.config.render_toggle.prettyName.debugSolidFaceEnabled": "方块实面调试信息", + "minihud.config.render_toggle.prettyName.debugStructuresEnabled": "Structures", + "minihud.config.render_toggle.prettyName.debugSupportingBlock": "Supporting Block", + "minihud.config.render_toggle.prettyName.debugWaterEnabled": "水面调试信息", + "minihud.config.render_toggle.prettyName.debugVillageEnabled": "Village", + "minihud.config.render_toggle.prettyName.debugVillageSectionsEnabled": "Village Sections", + "minihud.config.render_toggle.prettyName.debugWorldGenEnabled": "World Gen", + "minihud.config.structure_toggle.name.ancient_city": "远古城市", + "minihud.config.structure_toggle.comment.ancient_city": "切换远古城市结构边框渲染", + "minihud.config.structure_toggle.prettyName.ancient_city": "远古城市", + "minihud.config.structure_toggle.full_box.name.ancient_city": "远古城市主体", + "minihud.config.structure_toggle.full_box.comment.ancient_city": "远古城市主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.ancient_city": "远古城市整体边框", + "minihud.config.structure_toggle.components.name.ancient_city": "远古城市结构", + "minihud.config.structure_toggle.components.comment.ancient_city": "远古城市结构颜色", + "minihud.config.structure_toggle.components.prettyName.ancient_city": "远古城市结构", + "minihud.config.structure_toggle.name.bastion_remnant": "堡垒遗迹", + "minihud.config.structure_toggle.comment.bastion_remnant": "切换堡垒遗迹结构边框渲染", + "minihud.config.structure_toggle.prettyName.bastion_remnant": "堡垒遗迹", + "minihud.config.structure_toggle.full_box.name.bastion_remnant": "堡垒遗迹主体", + "minihud.config.structure_toggle.full_box.comment.bastion_remnant": "堡垒遗迹主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.bastion_remnant": "堡垒遗迹整体边框", + "minihud.config.structure_toggle.components.name.bastion_remnant": "堡垒遗迹结构", + "minihud.config.structure_toggle.components.comment.bastion_remnant": "堡垒遗迹结构颜色", + "minihud.config.structure_toggle.components.prettyName.bastion_remnant": "堡垒遗迹结构", + "minihud.config.structure_toggle.name.buried_treasure": "埋藏的宝藏", + "minihud.config.structure_toggle.comment.buried_treasure": "切换埋藏的宝藏结构边框渲染", + "minihud.config.structure_toggle.prettyName.buried_treasure": "埋藏的宝藏", + "minihud.config.structure_toggle.full_box.name.buried_treasure": "埋藏的宝藏主体", + "minihud.config.structure_toggle.full_box.comment.buried_treasure": "埋藏的宝藏主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.buried_treasure": "埋藏的宝藏整体边框", + "minihud.config.structure_toggle.components.name.buried_treasure": "埋藏的宝藏结构", + "minihud.config.structure_toggle.components.comment.buried_treasure": "埋藏的宝藏结构颜色", + "minihud.config.structure_toggle.components.prettyName.buried_treasure": "埋藏的宝藏结构", + "minihud.config.structure_toggle.name.desert_pyramid": "沙漠神殿", + "minihud.config.structure_toggle.comment.desert_pyramid": "切换沙漠神殿结构边框渲染", + "minihud.config.structure_toggle.prettyName.desert_pyramid": "沙漠神殿", + "minihud.config.structure_toggle.full_box.name.desert_pyramid": "沙漠神殿主体", + "minihud.config.structure_toggle.full_box.comment.desert_pyramid": "沙漠神殿主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.desert_pyramid": "沙漠神殿整体边框", + "minihud.config.structure_toggle.components.name.desert_pyramid": "沙漠神殿结构", + "minihud.config.structure_toggle.components.comment.desert_pyramid": "沙漠神殿结构颜色", + "minihud.config.structure_toggle.components.prettyName.desert_pyramid": "沙漠神殿结构", + "minihud.config.structure_toggle.name.end_city": "末地城", + "minihud.config.structure_toggle.comment.end_city": "切换末地城结构边框渲染", + "minihud.config.structure_toggle.prettyName.end_city": "末地城", + "minihud.config.structure_toggle.full_box.name.end_city": "末地城主体", + "minihud.config.structure_toggle.full_box.comment.end_city": "末地城主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.end_city": "末地城整体边框", + "minihud.config.structure_toggle.components.name.end_city": "末地城结构", + "minihud.config.structure_toggle.components.comment.end_city": "末地城结构颜色", + "minihud.config.structure_toggle.components.prettyName.end_city": "末地城结构", + "minihud.config.structure_toggle.name.igloo": "雪屋", + "minihud.config.structure_toggle.comment.igloo": "切换雪屋结构边框渲染", + "minihud.config.structure_toggle.prettyName.igloo": "雪屋结构", + "minihud.config.structure_toggle.full_box.name.igloo": "雪屋主体", + "minihud.config.structure_toggle.full_box.comment.igloo": "雪屋主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.igloo": "雪屋结构整体边框", + "minihud.config.structure_toggle.components.name.igloo": "雪屋结构", + "minihud.config.structure_toggle.components.comment.igloo": "雪屋结构颜色", + "minihud.config.structure_toggle.components.prettyName.igloo": "雪屋结构细节", + "minihud.config.structure_toggle.name.jungle_pyramid": "丛林神庙", + "minihud.config.structure_toggle.comment.jungle_pyramid": "切换丛林神庙结构边框渲染", + "minihud.config.structure_toggle.prettyName.jungle_pyramid": "丛林神庙", + "minihud.config.structure_toggle.full_box.name.jungle_pyramid": "丛林神庙主体", + "minihud.config.structure_toggle.full_box.comment.jungle_pyramid": "丛林神庙主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.jungle_pyramid": "丛林神庙整体边框", + "minihud.config.structure_toggle.components.name.jungle_pyramid": "丛林神庙结构", + "minihud.config.structure_toggle.components.comment.jungle_pyramid": "丛林神庙结构颜色", + "minihud.config.structure_toggle.components.prettyName.jungle_pyramid": "丛林神庙结构", + "minihud.config.structure_toggle.name.mansion": "林地府邸", + "minihud.config.structure_toggle.comment.mansion": "切换林地府邸结构边框渲染", + "minihud.config.structure_toggle.prettyName.mansion": "林地府邸结构", + "minihud.config.structure_toggle.full_box.name.mansion": "林地府邸主体", + "minihud.config.structure_toggle.full_box.comment.mansion": "林地府邸主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.mansion": "林地府邸整体边框", + "minihud.config.structure_toggle.components.name.mansion": "林地府邸结构", + "minihud.config.structure_toggle.components.comment.mansion": "林地府邸结构颜色", + "minihud.config.structure_toggle.components.prettyName.mansion": "林地府邸结构细节", + "minihud.config.structure_toggle.name.mineshaft": "废弃矿井", + "minihud.config.structure_toggle.comment.mineshaft": "切换废弃矿井结构边框渲染", + "minihud.config.structure_toggle.prettyName.mineshaft": "废弃矿井结构", + "minihud.config.structure_toggle.full_box.name.mineshaft": "废弃矿井主体", + "minihud.config.structure_toggle.full_box.comment.mineshaft": "废弃矿井主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.mineshaft": "废弃矿井整体边框", + "minihud.config.structure_toggle.components.name.mineshaft": "废弃矿井结构", + "minihud.config.structure_toggle.components.comment.mineshaft": "废弃矿井结构颜色", + "minihud.config.structure_toggle.components.prettyName.mineshaft": "废弃矿井结构细节", + "minihud.config.structure_toggle.name.fortress": "下界要塞", + "minihud.config.structure_toggle.comment.fortress": "切换下界要塞结构边框渲染", + "minihud.config.structure_toggle.prettyName.fortress": "下界要塞", + "minihud.config.structure_toggle.full_box.name.fortress": "下界要塞主体", + "minihud.config.structure_toggle.full_box.comment.fortress": "下界要塞主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.fortress": "下届要塞整体边框", + "minihud.config.structure_toggle.components.name.fortress": "下界要塞结构", + "minihud.config.structure_toggle.components.comment.fortress": "下界要塞结构颜色", + "minihud.config.structure_toggle.components.prettyName.fortress": "下界要塞结构", + "minihud.config.structure_toggle.name.nether_fossil": "下界化石", + "minihud.config.structure_toggle.comment.nether_fossil": "切换下界化石结构边框渲染", + "minihud.config.structure_toggle.prettyName.nether_fossil": "下界化石", + "minihud.config.structure_toggle.full_box.name.nether_fossil": "下界化石主体", + "minihud.config.structure_toggle.full_box.comment.nether_fossil": "下界化石主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.nether_fossil": "下届化石整体边框", + "minihud.config.structure_toggle.components.name.nether_fossil": "下界化石结构", + "minihud.config.structure_toggle.components.comment.nether_fossil": "下界化石结构颜色", + "minihud.config.structure_toggle.components.prettyName.nether_fossil": "下界化石结构", + "minihud.config.structure_toggle.name.monument": "海底神殿", + "minihud.config.structure_toggle.comment.monument": "切换海底神殿结构边框渲染", + "minihud.config.structure_toggle.prettyName.monument": "海底神殿", + "minihud.config.structure_toggle.full_box.name.monument": "海底神殿主体", + "minihud.config.structure_toggle.full_box.comment.monument": "海底神殿主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.monument": "海底神殿整体边框", + "minihud.config.structure_toggle.components.name.monument": "海底神殿结构", + "minihud.config.structure_toggle.components.comment.monument": "海底神殿结构颜色", + "minihud.config.structure_toggle.components.prettyName.monument": "海底神殿结构", + "minihud.config.structure_toggle.name.ocean_ruin": "海底废墟", + "minihud.config.structure_toggle.comment.ocean_ruin": "切换海底废墟结构边框渲染", + "minihud.config.structure_toggle.prettyName.ocean_ruin": "海底废墟", + "minihud.config.structure_toggle.full_box.name.ocean_ruin": "海底废墟主体", + "minihud.config.structure_toggle.full_box.comment.ocean_ruin": "海底废墟主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.ocean_ruin": "海底废墟整体边框", + "minihud.config.structure_toggle.components.name.ocean_ruin": "海底废墟结构", + "minihud.config.structure_toggle.components.comment.ocean_ruin": "海底废墟结构颜色", + "minihud.config.structure_toggle.components.prettyName.ocean_ruin": "海底废墟结构", + "minihud.config.structure_toggle.name.pillager_outpost": "掠夺者前哨站", + "minihud.config.structure_toggle.comment.pillager_outpost": "切换掠夺者前哨站结构边框渲染", + "minihud.config.structure_toggle.prettyName.pillager_outpost": "掠夺者前哨站", + "minihud.config.structure_toggle.full_box.name.pillager_outpost": "掠夺者前哨站主体", + "minihud.config.structure_toggle.full_box.comment.pillager_outpost": "掠夺者前哨站主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.pillager_outpost": "掠夺者前哨站整体边框", + "minihud.config.structure_toggle.components.name.pillager_outpost": "掠夺者前哨站结构", + "minihud.config.structure_toggle.components.comment.pillager_outpost": "掠夺者前哨站结构颜色", + "minihud.config.structure_toggle.components.prettyName.pillager_outpost": "掠夺者前哨站结构", + "minihud.config.structure_toggle.name.ruined_portal": "废弃传送门", + "minihud.config.structure_toggle.comment.ruined_portal": "切换废弃传送门结构边框渲染", + "minihud.config.structure_toggle.prettyName.ruined_portal": "废弃传送门", + "minihud.config.structure_toggle.full_box.name.ruined_portal": "废弃传送门主体", + "minihud.config.structure_toggle.full_box.comment.ruined_portal": "废弃传送门主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.ruined_portal": "废弃传送门整体边框", + "minihud.config.structure_toggle.components.name.ruined_portal": "废弃传送门结构", + "minihud.config.structure_toggle.components.comment.ruined_portal": "废弃传送门结构颜色", + "minihud.config.structure_toggle.components.prettyName.ruined_portal": "废弃传送门结构", + "minihud.config.structure_toggle.name.shipwreck": "沉船", + "minihud.config.structure_toggle.comment.shipwreck": "切换沉船结构边框渲染", + "minihud.config.structure_toggle.prettyName.shipwreck": "沉船", + "minihud.config.structure_toggle.full_box.name.shipwreck": "沉船主体", + "minihud.config.structure_toggle.full_box.comment.shipwreck": "沉船主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.shipwreck": "沉船整体边框", + "minihud.config.structure_toggle.components.name.shipwreck": "沉船结构", + "minihud.config.structure_toggle.components.comment.shipwreck": "沉船结构颜色", + "minihud.config.structure_toggle.components.prettyName.shipwreck": "沉船结构", + "minihud.config.structure_toggle.name.stronghold": "要塞", + "minihud.config.structure_toggle.comment.stronghold": "切换要塞结构边框渲染", + "minihud.config.structure_toggle.prettyName.stronghold": "要塞", + "minihud.config.structure_toggle.full_box.name.stronghold": "要塞主体", + "minihud.config.structure_toggle.full_box.comment.stronghold": "要塞主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.stronghold": "要塞整体边框", + "minihud.config.structure_toggle.components.name.stronghold": "要塞结构", + "minihud.config.structure_toggle.components.comment.stronghold": "要塞结构颜色", + "minihud.config.structure_toggle.components.prettyName.stronghold": "要塞结构", + "minihud.config.structure_toggle.name.trial_chambers": "试炼密室", + "minihud.config.structure_toggle.comment.trial_chambers": "切换试炼密室结构边框渲染", + "minihud.config.structure_toggle.prettyName.trial_chambers": "试炼密室", + "minihud.config.structure_toggle.full_box.name.trial_chambers": "试炼密室主体", + "minihud.config.structure_toggle.full_box.comment.trial_chambers": "试炼密室主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.trial_chambers": "试炼密室整体边框", + "minihud.config.structure_toggle.components.name.trial_chambers": "试炼密室结构", + "minihud.config.structure_toggle.components.comment.trial_chambers": "试炼密室结构颜色", + "minihud.config.structure_toggle.components.prettyName.trial_chambers": "试炼密室结构", + "minihud.config.structure_toggle.name.village": "村庄", + "minihud.config.structure_toggle.comment.village": "切换村庄结构边界框渲染\n注意:这是村庄的世界生成结构\n不适用于刷铁机等生电结构", + "minihud.config.structure_toggle.prettyName.village": "村庄", + "minihud.config.structure_toggle.full_box.name.village": "村庄主体", + "minihud.config.structure_toggle.full_box.comment.village": "村庄主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.village": "村庄整体边框", + "minihud.config.structure_toggle.components.name.village": "村庄结构", + "minihud.config.structure_toggle.components.comment.village": "村庄结构颜色", + "minihud.config.structure_toggle.components.prettyName.village": "村庄结构", + "minihud.config.structure_toggle.name.swamp_hut": "沼泽小屋", + "minihud.config.structure_toggle.comment.swamp_hut": "切换沼泽小屋结构边框渲染", + "minihud.config.structure_toggle.prettyName.swamp_hut": "沼泽小屋", + "minihud.config.structure_toggle.full_box.name.swamp_hut": "沼泽小屋主体", + "minihud.config.structure_toggle.full_box.comment.swamp_hut": "沼泽小屋主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.swamp_hut": "沼泽小屋整体边框", + "minihud.config.structure_toggle.components.name.swamp_hut": "沼泽小屋结构", + "minihud.config.structure_toggle.components.comment.swamp_hut": "沼泽小屋结构颜色", + "minihud.config.structure_toggle.components.prettyName.swamp_hut": "沼泽小屋结构", + "minihud.config.structure_toggle.name.trail_ruins": "古迹废墟", + "minihud.config.structure_toggle.comment.trail_ruins": "切换古迹废墟结构边框渲染", + "minihud.config.structure_toggle.prettyName.trail_ruins": "古迹废墟", + "minihud.config.structure_toggle.full_box.name.trail_ruins": "古迹废墟主体", + "minihud.config.structure_toggle.full_box.comment.trail_ruins": "古迹废墟主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.trail_ruins": "古迹废墟整体边框", + "minihud.config.structure_toggle.components.name.trail_ruins": "古迹废墟结构", + "minihud.config.structure_toggle.components.comment.trail_ruins": "古迹废墟结构颜色", + "minihud.config.structure_toggle.components.prettyName.trail_ruins": "古迹废墟结构", + "minihud.config.structure_toggle.name.unknown": "未知结构", + "minihud.config.structure_toggle.comment.unknown": "切换未知结构边框渲染", + "minihud.config.structure_toggle.prettyName.unknown": "未知结构", + "minihud.config.structure_toggle.full_box.name.unknown": "未知主体", + "minihud.config.structure_toggle.full_box.comment.unknown": "未知主体颜色", + "minihud.config.structure_toggle.full_box.prettyName.unknown": "未知结构整体边框", + "minihud.config.structure_toggle.components.name.unknown": "未知结构", + "minihud.config.structure_toggle.components.comment.unknown": "未知结构颜色", + "minihud.config.structure_toggle.components.prettyName.unknown": "未知结构细节", + "minihud.gui.button.config_gui.colors": "颜色", + "minihud.gui.button.config_gui.generic": "通用", + "minihud.gui.button.config_gui.info_lines": "信息", + "minihud.gui.button.config_gui.renderers": "渲染器", + "minihud.gui.button.config_gui.shapes": "形状", + "minihud.gui.button.config_gui.structures": "结构", + "minihud.gui.button.add_shape": "添加形状", + "minihud.gui.button.configure": "配置", + "minihud.gui.button.remove": "删除", + "minihud.gui.button.shape_entry.enabled": "启用: %s", + "minihud.gui.button.shape_renderer.spawn_sphere.toggle_use_quadrants": "使用角象限生成:%s", + "minihud.gui.button.shape_renderer_toggle": "形状渲染器: %s", + "minihud.gui.button.shape_renderer.toggle_combine_quads": "合并显示:%s", + "minihud.gui.button.hover.shape_renderer.spawn_sphere.toggle_use_quadrants": "§7角象限生成基本上是在由中心和边缘距离定义的\n§7矩形区域的四角上生成了 4 个独立的球体。\n§7角象限生成是旧的生成方式,此时如果半径增加\n§7到一定数量,它就会变得离谱(特别是在基点)。\n§7新的生成方式将不再使用角象限生成,\n§7而是「在边缘滑动生成球体」来创建最终的形状。", + "minihud.gui.label.center_colon": "中心:", + "minihud.gui.label.color": "颜色:", + "minihud.gui.label.display_name_colon": "显示名称:", + "minihud.gui.label.height_colon": "高度:", + "minihud.gui.label.margin_colon": "边距:", + "minihud.gui.label.radius_colon": "半径:", + "minihud.gui.hover.shape.block_snap": "§7方块对齐:§b%s", + "minihud.gui.hover.shape.box.box_side": "§7渲染框架的 %s 面", + "minihud.gui.hover.shape.center_value": "§7中心点:x: §9%s§7, y: §9%s§7, z: §9%s", + "minihud.gui.hover.shape.circle.main_axis_value": "§7轴:§b%s", + "minihud.gui.hover.shape.effective_center_value": "§7有效中心点:x: §9%s§7, y: §9%s§7, z: §9%s", + "minihud.gui.hover.shape.height_value": "§7高度:§6%s", + "minihud.gui.hover.shape.margin_value": "§7边距:§6%s", + "minihud.gui.hover.shape.radius_value": "§7半径:§6%s", + "minihud.gui.hover.shape.type_value": "§7类型:§b%s", + "minihud.gui.label.shape.block_snap": "方块对齐:%s", + "minihud.gui.label.shape.box.corner_1": "角 1", + "minihud.gui.label.shape.box.corner_2": "角 2", + "minihud.gui.label.shape.box.grid_enabled": "启用网格:%s", + "minihud.gui.label.shape.box.max_corner": "§7最大值:x: §9%s§7, y: §9%s§7, z: §9%s", + "minihud.gui.label.shape.box.maximum_coord": "最大值", + "minihud.gui.label.shape.box.min_corner": "§7最小值:x: §9%s§7, y: §9%s§7, z: §9%s", + "minihud.gui.label.shape.box.minimum_coord": "最小值", + "minihud.gui.label.shape.box.grid_end_offset": "网格终点偏移值", + "minihud.gui.label.shape.box.grid_size": "网格大小", + "minihud.gui.label.shape.box.grid_start_offset": "网格起点偏移值", + "minihud.gui.label.shape.circle.main_axis_colon": "轴向:", + "minihud.gui.label.shape.line.start": "§7位置 1: x: §9%s§7, y: §9%s§7, z: §9%s", + "minihud.gui.label.shape.line.end": "§7位置 2: x: §9%s§7, y: §9%s§7, z: §9%s", + "minihud.gui.label.shape.render_type_colon": "渲染类型:", + "minihud.gui.name.box.box_side.down": "下方", + "minihud.gui.name.box.box_side.up": "上方", + "minihud.gui.name.box.box_side.north": "北面", + "minihud.gui.name.box.box_side.south": "南面", + "minihud.gui.name.box.box_side.west": "西面", + "minihud.gui.name.box.box_side.east": "东面", + "minihud.gui.title.configs": "MiniHUD 配置 - %s", + "minihud.gui.title.shape_editor": "形状编辑 (%s)", + "minihud.gui.title.shape_manager": "形状管理", + "minihud.label.axolotl_tooltip.label": "§7品种: ", + "minihud.label.axolotl_tooltip.value": "%s [%s]", + "minihud.label.bee_tooltip.count": "§7包含 §b%s§7 只蜜蜂", + "minihud.label.bee_tooltip.count_babies": "§7包含 §b%s§7 只蜜蜂,(§b%s§7 只幼蜂)", + "minihud.label.bee_tooltip.name": "§7- %s", + "minihud.label.honey_info.level": "§7蜜蜂等级 §b%s§7/5", + "minihud.label.blockgridmode.all": "全部", + "minihud.label.blockgridmode.non_air": "非空气", + "minihud.label.blockgridmode.adjacent": "相邻非空气方块", + "minihud.label.light_level_marker_mode.cross": "十字", + "minihud.label.light_level_marker_mode.none": "无", + "minihud.label.light_level_marker_mode.square": "正方形", + "minihud.label.light_level_number_mode.none": "无", + "minihud.label.light_level_number_mode.block": "方块", + "minihud.label.light_level_number_mode.both": "两者", + "minihud.label.light_level_number_mode.sky": "天空", + "minihud.label.light_level_render_condition.always": "总是", + "minihud.label.light_level_render_condition.dim": "昏暗", + "minihud.label.light_level_render_condition.never": "从不", + "minihud.label.light_level_render_condition.safe": "安全", + "minihud.label.light_level_render_condition.spawnable": "可生成", + "minihud.label.shape_render_type.full_block": "完整方块", + "minihud.label.shape_render_type.inner_edge": "内部边缘", + "minihud.label.shape_render_type.outer_edge": "外部边缘", + "minihud.label.shapes.adjustable_spawn_sphere": "可调节生成球体", + "minihud.label.shapes.box": "盒", + "minihud.label.shapes.can_spawn_sphere": "可刷怪范围球体(> 24)", + "minihud.label.shapes.can_despawn_sphere": "怪物可能消失范围球体(> 32)", + "minihud.label.shapes.circle": "圆环/圆柱", + "minihud.label.shapes.despawn_sphere": "怪物强制卸载范围球体(> 128)", + "minihud.label.shapes.block_line": "线(基于方块)", + "minihud.label.shapes.sphere_blocky": "球体(基于方块)", + "minihud.hotkeys.category.generic_hotkeys": "通用快捷键", + "minihud.hotkeys.category.info_toggle_hotkeys": "信息开关快捷键", + "minihud.hotkeys.category.renderer_toggle_hotkeys": "渲染器开关快捷键", + "minihud.hotkeys.category.structure_toggle_hotkeys": "结构渲染开关快捷键", + "minihud.message.toggled_debug_mode.collisions": "碰撞箱调试已切换为 %s", + "minihud.message.toggled_debug_mode.height_map": "已切换高度图调试渲染为 %s", + "minihud.message.toggled_debug_mode.neighbor_updates": "方块更新调试已切换为 %s", + "minihud.message.toggled_debug_mode.pathfinding": "寻路调试已切换为 %s", + "minihud.message.toggled_debug_mode.solid_faces": "方块表面调试已切换为 %s", + "minihud.message.toggled_debug_mode.water": "水体调试渲染已切换为 %s", + "minihud.message.toggled_using_center_position": "%s 切换为 %s,使用中心位置 %s", + "minihud.message.toggled_using_position": "%s 切换为 %s,使用位置 %s", + "minihud.message.toggled_using_world_spawn": "%s 切换为 %s,使用世界出生点 %s", + "minihud.message.toggled_using_player_spawn": "%s 切换为 %s,使用模拟距离 %s", + "minihud.message.error.invalid_dropped_chunks_hash_size": "无法解析来自聊天的区块哈希集大小", + "minihud.message.error.invalid_seed": "无法从聊天框中解析世界种子", + "minihud.message.error.invalid_spawn_chunk_radius": "无法解析聊天中的生成区块半径 (0 < 32)", + "minihud.message.error.shapes.select_shape_from_dropdown": "从下拉菜单中选择要创建的形状类型", + "minihud.message.distance_reference_point_set": "将距离参考点设置为 %s", + "minihud.message.no_seed": "MiniHUD: 世界种子未知", + "minihud.message.seed_is": "MiniHUD 中的世界种子当前设置为 '%s'", + "minihud.message.seed_set": "MiniHUD: 将世界种子设置为 '%s'", + "minihud.message.spawn_set": "MiniHUD: 将世界生成点设置为 %s", + "minihud.message.no_spawn_chunk_radius": "MiniHUD: 生成区块半径未知 (默认值为 2)", + "minihud.message.spawn_chunk_radius_is": "MiniHUD 当前的生成区块半径设置为 '%s'", + "minihud.message.spawn_chunk_radius_set": "MiniHUD: 将生成区块半径设置为 %s", + "minihud.info_line.invalid_value": "无效", + "minihud.info_line.remaining": "剩余", + "minihud.info_line.fps": "帧数 %d", + "minihud.info_line.memory_usage": "内存:% 2d%% %03d/%03dMB | 已分配:% 2d%% %03dMB", + "minihud.info_line.time.exception": "日期格式化失败 - 格式化字符串可能无效", + "minihud.info_line.time_real": "NOT USED", + "minihud.info_line.time_world": "世界时间:%5d - 总计:%d", + "minihud.info_line.time_world_formatted": "NOT USED", + "minihud.info_line.time_world_formatted.moon_0": "满月", + "minihud.info_line.time_world_formatted.moon_1": "亏凸月", + "minihud.info_line.time_world_formatted.moon_2": "上弦月", + "minihud.info_line.time_world_formatted.moon_3": "残月", + "minihud.info_line.time_world_formatted.moon_4": "新月", + "minihud.info_line.time_world_formatted.moon_5": "蛾眉月", + "minihud.info_line.time_world_formatted.moon_6": "上弦月", + "minihud.info_line.time_world_formatted.moon_7": "盈凸月", + "minihud.info_line.time_day_modulo": "白天时间 %% %d: %5d", + "minihud.info_line.time_total_modulo": "总时间 %% %d: %5d", + "minihud.info_line.server_tps": "服务器 TPS: %s%.1f%s MSPT: %s%.1f%s", + "minihud.info_line.server_tps.est": "服务器 TPS: %s%.1f%s (MSPT [估计]: %s%.1f%s)", + "minihud.info_line.server_tps.invalid": "服务器 TPS: <无可用数据>", + "minihud.info_line.servux": "Servux Version: %s", + "minihud.info_line.servux.not_connected": "Servux Version: §cnot_connected§r", + "minihud.info_line.servux.entity_sync": "EntitySync: cB: %02d, pB: %02d, cE: %02d, pE: %02d", + "minihud.info_line.servux.structures": "Structures: sC: %02d, sR: %02d (%s), wS: %s", + "minihud.info_line.servux.structures_integrated": "Structures (Integrated Server): sC: %02d, sR: %02d (%s), wS: %s", + "minihud.info_line.weather": "天气: %s%s", + "minihud.info_line.weather.thundering": "雷暴", + "minihud.info_line.weather.raining": "降雨", + "minihud.info_line.weather.clear": "晴天", + "minihud.info_line.mobcap.data": "生物上限:Ho: %s Pa: %s Am: %s, Ax: %s, UWC: %s, WC: %s, WA: %s, Mi: %s", + "minihud.info_line.mobcap.no_data": "生物上限:<无可用数据>", + "minihud.info_line.mobcap.cap.ambient.full": "§7§l%s§r§7 / %s§r", + "minihud.info_line.mobcap.cap.ambient.nonfull": "§7%s / %s§r", + "minihud.info_line.mobcap.cap.axolotls.full": "§d§l%s§r§7 / %s§r", + "minihud.info_line.mobcap.cap.axolotls.nonfull": "§d%s / %s§r", + "minihud.info_line.mobcap.cap.creature.full": "§a§l%s§r§a / %s§r", + "minihud.info_line.mobcap.cap.creature.nonfull": "§a%s / %s§r", + "minihud.info_line.mobcap.cap.misc.full": "§f§l%s§r§b / %s§r", + "minihud.info_line.mobcap.cap.misc.nonfull": "§f%s / %s§r", + "minihud.info_line.mobcap.cap.monster.full": "§c§l%s§r§c / %s§r", + "minihud.info_line.mobcap.cap.monster.nonfull": "§c%s / %s§r", + "minihud.info_line.mobcap.cap.underground_water_creature.full": "§9§l%s§r§b / %s§r", + "minihud.info_line.mobcap.cap.underground_water_creature.nonfull": "§9%s / %s§r", + "minihud.info_line.mobcap.cap.water_ambient.full": "§9§l%s§r§b / %s§r", + "minihud.info_line.mobcap.cap.water_ambient.nonfull": "§9%s / %s§r", + "minihud.info_line.mobcap.cap.water_creature.full": "§b§l%s§r§b / %s§r", + "minihud.info_line.mobcap.cap.water_creature.nonfull": "§b%s / %s§r", + "minihud.info_line.ping": "延迟:%d ms", + "minihud.info_line.coordinates.exception": "错误的坐标格式字符串!", + "minihud.info_line.coordinates.format": "XYZ: %.2f / %.4f / %.2f", + "minihud.info_line.coordinates_scaled.overworld": "主世界: ", + "minihud.info_line.coordinates_scaled.nether": "下界: ", + "minihud.info_line.dimension": "维度: ", + "minihud.info_line.block_pos.exception": "错误的方块位置格式字符串!", + "minihud.info_line.chunk_pos": "子区块:%d, %d, %d", + "minihud.info_line.region_file": "区域:r.%d.%d", + "minihud.info_line.block_in_chunk": "方块:%d, %d, %d 位于子区块:%d, %d, %d", + "minihud.info_line.block_break_speed": "破坏速度:%.2f", + "minihud.info_line.sprinting": "§6奔跑中", + "minihud.info_line.distance": "距离:%.2f (x: %.2f y: %.2f z: %.2f) [x: %.2f y: %.2f z: %.2f]", + "minihud.info_line.facing": "朝向:%s(%s)", + "minihud.info_line.facing.north.name": "北", + "minihud.info_line.facing.south.name": "南", + "minihud.info_line.facing.west.name": "西", + "minihud.info_line.facing.east.name": "东", + "minihud.info_line.facing.north": "Z轴负方向", + "minihud.info_line.facing.south": "Z轴正方向", + "minihud.info_line.facing.west": "X轴负方向", + "minihud.info_line.facing.east": "X轴正方向", + "minihud.info_line.light_level": "方块亮度:%d", + "minihud.info_line.bee_count": "蜜蜂:§b%d", + "minihud.info_line.bee_count.flower_pos": "蜜蜂:§b%d§r [花 %s]", + "minihud.info_line.furnace_xp": "熔炉内经验:§b%d", + "minihud.info_line.honey_level": "蜂蜜:§b%d", + "minihud.info_line.horse_speed": "%s 速度:%.3f 米/秒", + "minihud.info_line.horse_jump": "%s 跳跃高度:%.3f 米", + "minihud.info_line.rotation_yaw": "方向角: %.1f", + "minihud.info_line.rotation_pitch": "俯仰角: %.1f", + "minihud.info_line.speed": "速度:%.3f 米/秒", + "minihud.info_line.speed_hv": "速度:xz: %.3f y: %.3f 米/秒", + "minihud.info_line.speed_axis": "速度:x: %.3f y: %.3f z: %.3f 米/秒", + "minihud.info_line.chunk_sections": "C: %d", + "minihud.info_line.chunk_updates": "TODO", + "minihud.info_line.loaded_chunks_count.server": "服务器:%d / %d - 客户端:%s", + "minihud.info_line.panda_gene.main_gene": "主要基因:%s(%s)", + "minihud.info_line.panda_gene.hidden_gene": "隐藏基因:%s(%s)", + "minihud.info_line.panda_gene.dominant_gene": "显性", + "minihud.info_line.panda_gene.recessive_gene": "隐性", + "minihud.info_line.panda_gene.gene.normal": "普通", + "minihud.info_line.panda_gene.gene.lazy": "懒惰", + "minihud.info_line.panda_gene.gene.worried": "忧郁", + "minihud.info_line.panda_gene.gene.playful": "顽皮", + "minihud.info_line.panda_gene.gene.brown": "棕色", + "minihud.info_line.panda_gene.gene.weak": "体弱", + "minihud.info_line.panda_gene.gene.aggressive": "好斗", + "minihud.info_line.particle_count": "P: %s", + "minihud.info_line.difficulty": "区域难度:%.2f // %.2f (%d天)", + "minihud.info_line.biome": "生物群系:%s", + "minihud.info_line.biome_reg_name": "生物群系注册名:%s", + "minihud.info_line.tile_entities": "Client world TE - L: ?, T: ? - TODO 1.17", + "minihud.info_line.entities_client_world": "实体数量 - 客户端:%d", + "minihud.info_line.entities_client_world.server": "实体数量 - 客户端:%d - 服务端:%d", + "minihud.info_line.player_experience": "Experience: %d / %.2f%% (total %d)", + "minihud.info_line.slime_chunk": "史莱姆区块:%s", + "minihud.info_line.slime_chunk.yes": "§a是§r", + "minihud.info_line.slime_chunk.no": "§c否§r", + "minihud.info_line.slime_chunk.no_seed": "<未设置世界种子>", + "minihud.info_line.looking_at_entity": "实体:%s", + "minihud.info_line.looking_at_entity.livingentity": "实体:%s - 生命值:%.1f / %.1f", + "minihud.info_line.looking_at_entity.owner": "主人", + "minihud.info_line.looking_at_effects": "状态效果:%s / %s%s %s", + "minihud.info_line.looking_at_effects.amplifier": "x%d / ", + "minihud.info_line.looking_at_effects.infinite": "持续时间无限", + "minihud.info_line.looking_at_player_exp": "Target Experience: %d / %.2f%% (total %d)", + "minihud.info_line.entity_variant.axolotl": "Axolotl Color: §b%s§r", + "minihud.info_line.entity_variant.cat": "Cat Variant: §b%s§r (%s collar)", + "minihud.info_line.entity_variant.frog": "Frog Variant: §b%s§r", + "minihud.info_line.entity_variant.horse": "Horse Variant: §b%s / %s§r", + "minihud.info_line.entity_variant.parrot": "Parrot Variant: §b%s§r", + "minihud.info_line.entity_variant.sheep": "Sheep Color: §b%s§r", + "minihud.info_line.entity_variant.tropical_fish": "Tropical Fish Variant: §b%s§r", + "minihud.info_line.entity_variant.wolf": "Wolf Variant: §b%s§r (%s collar)", + "minihud.info_line.zombie_conversion": "僵尸村民治疗剩余时间:%s", + "minihud.info_line.entity_reg_name": "实体注册名:%s", + "minihud.info_line.looking_at_block": "注视的方块:%d, %d, %d", + "minihud.info_line.looking_at_block_chunk": "方块:%d, %d, %d 在子区块:%d, %d, %d" +} \ No newline at end of file diff --git a/src/main/resources/assets/minihud/lang/zh_tw.json b/src/main/resources/assets/minihud/lang/zh_tw.json index d86efd2e9..f5e050467 100644 --- a/src/main/resources/assets/minihud/lang/zh_tw.json +++ b/src/main/resources/assets/minihud/lang/zh_tw.json @@ -1,875 +1,929 @@ { - "malilib.gui.button.render_layers_gui.set_to_player": "定位至玩家", - "minihud.config.generic.name.axolotlTooltips": "顯示蠑螈桶種類", - "minihud.config.generic.name.beeTooltips": "顯示蜂巢物品蜜蜂資訊", - "minihud.config.generic.name.honeyTooltips": "顯示蜂巢物品蜂蜜資訊", - "minihud.config.generic.name.biomeOverlayRange": "生態域水平渲染範圍", - "minihud.config.generic.name.biomeOverlayRangeVertical": "生態域垂直渲染範圍", - "minihud.config.generic.name.biomeOverlaySingleColor": "生態域邊界單一顏色模式", - "minihud.config.generic.name.blockPosFormat": "玩家方塊位置格式", - "minihud.config.generic.name.blockGridOverlayMode": "方塊網格疊加模式", - "minihud.config.generic.name.blockGridOverlayRadius": "方塊網格覆蓋半徑", - "minihud.config.generic.name.coordinateFormat": "玩家座標格式", - "minihud.config.generic.name.dateFormatReal": "現實時間格式", - "minihud.config.generic.name.dateFormatMinecraft": "遊戲時間格式", - "minihud.config.generic.name.debugMessages": "除錯資訊", - "minihud.config.generic.name.debugRendererPathFindingEnablePointWidth": "尋路指示器路徑點寬度", - "minihud.config.generic.name.dontClearStoredSeedOnDimensionChange": "改變維度不清除種子", - "minihud.config.generic.name.entityDataSync": "實體資料同步", - "minihud.config.generic.name.entityDataSyncBackup": "備用實體資料同步", - "minihud.config.generic.name.enableVanillaDebugRendererFix": "原版除錯渲染器修復", - "minihud.config.generic.name.fontScale": "字型大小", - "minihud.config.generic.name.hudAlignment": "HUD 位置", - "minihud.config.generic.name.inventoryPreview": "容器預覽快速鍵", - "minihud.config.generic.name.inventoryPreviewEnabled": "啟用容器預覽", - "minihud.config.generic.name.inventoryPreviewToggleScreen": "容器預覽滑鼠釋放", - "minihud.config.generic.name.lightLevelAutoHeight": "光照等級渲染自動高度", - "minihud.config.generic.name.lightLevelColoredNumbers": "光照等級渲染彩色數字", - "minihud.config.generic.name.lightLevelCollisionCheck": "光照等級渲染碰撞箱檢查", - "minihud.config.generic.name.lightLevelMarkerCondition": "光照等級標記渲染條件", - "minihud.config.generic.name.lightLevelMarkers": "亮度不足標記型別", - "minihud.config.generic.name.lightLevelMarkerSize": "亮度不足標記大小", - "minihud.config.generic.name.lightLevelNumberCondition": "光照等級渲染顯示數字條件", - "minihud.config.generic.name.lightLevelNumbers": "光照等級渲染顯示型別", - "minihud.config.generic.name.lightLevelNumberOffsetBlockX": "方塊光照等級顯示橫移", - "minihud.config.generic.name.lightLevelNumberOffsetBlockY": "方塊光照等級顯示縱移", - "minihud.config.generic.name.lightLevelNumberOffsetSkyX": "天空光照等級顯示橫移", - "minihud.config.generic.name.lightLevelNumberOffsetSkyY": "天空光照等級顯示縱移", - "minihud.config.generic.name.lightLevelNumberRotation": "光照等級渲染旋轉", - "minihud.config.generic.name.lightLevelRange": "光照等級渲染範圍", - "minihud.config.generic.name.lightLevelRenderOffset": "光照渲染 Y 軸偏移", - "minihud.config.generic.name.lightLevelRenderThrough": "光照等級渲染透視", - "minihud.config.generic.name.lightLevelSkipBlockCheck": "光照等級渲染略過生成檢測", - "minihud.config.generic.name.lightLevelThresholdDim": "光照等級渲染 Dim 閾值", - "minihud.config.generic.name.lightLevelThresholdSafe": "光照等級渲染 Safe 閾值", - "minihud.config.generic.name.lightLevelUnderWater": "強制水下渲染光照等級", - "minihud.config.generic.name.mainRenderingToggle": "主開關", - "minihud.config.generic.name.mapPreview": "地圖預覽", - "minihud.config.generic.name.mapPreviewRequireShift": "地圖預覽需要 Shift", - "minihud.config.generic.name.mapPreviewSize": "地圖預覽尺寸", - "minihud.config.generic.name.moveShapeToPlayer": "將形狀移動到玩家", - "minihud.config.generic.name.offsetSubtitleHud": "HUD子標題文字偏移", - "minihud.config.generic.name.openConfigGui": "開啟設定界面", - "minihud.config.generic.name.requireSneak": "需要潛行", - "minihud.config.generic.name.requiredKey": "渲染按鍵", - "minihud.config.generic.name.serverNbtRequestRate": "伺服器 NBT 請求速率", - "minihud.config.generic.name.setDistanceReferencePoint": "設定距離參考點", - "minihud.config.generic.name.shapeEditor": "形狀編輯器", - "minihud.config.generic.name.shulkerBoxPreview": "界伏盒預覽", - "minihud.config.generic.name.shulkerDisplayBgColor": "界伏盒預覽背景色", - "minihud.config.generic.name.shulkerDisplayRequireShift": "界伏盒預覽是否需要按住 Shift 鍵", - "minihud.config.generic.name.slimeChunkTopToPlayer": "史萊姆區塊最高點跟隨玩家", - "minihud.config.generic.name.slimeChunkOverlayRadius": "史萊姆區塊渲染半徑", - "minihud.config.generic.name.sortLinesByLength": "按文字長度排序", - "minihud.config.generic.name.sortLinesReversed": "文字長度反序", - "minihud.config.generic.name.spawnPlayerOuterOverlayEnabled": "渲染玩家世界生成範圍", - "minihud.config.generic.name.spawnPlayerRedstoneOverlayEnabled": "渲染玩家弱加載範圍", - "minihud.config.generic.name.spawnRealOuterOverlayEnabled": "渲染出生點世界生成範圍", - "minihud.config.generic.name.spawnRealRedstoneOverlayEnabled": "渲染出生點弱加載範圍", - "minihud.config.generic.name.spawnableColumnHeightsOverlayRadius": "頂層方塊顯示範圍", - "minihud.config.generic.name.structuresRenderThrough": "結構渲染穿透", - "minihud.config.generic.name.textPosX": "HUD 橫移", - "minihud.config.generic.name.textPosY": "HUD 縱移", - "minihud.config.generic.name.timeDayDivisor": "時間因數", - "minihud.config.generic.name.timeTotalDivisor": "總時間因數", - "minihud.config.generic.name.useCustomizedCoordinateFormat": "使用自定義座標格式", - "minihud.config.generic.name.useFontShadow": "使用字型陰影", - "minihud.config.generic.name.useTextBackground": "使用文字背景", - "minihud.config.generic.name.villagerConversionTicks": "殭屍村民治療計時", - "minihud.config.generic.name.villagerOfferEnchantmentBooks": "顯示村民交易附魔書", - "minihud.config.generic.name.villagerOfferPriceRange": "顯示村民交易附魔書價格範圍", - "minihud.config.generic.name.villagerOfferHighestLevelOnly": "僅顯示村民最高等級附魔書", - "minihud.config.generic.name.villagerOfferLowestPriceNearby": "僅顯示村民最低價格附魔書", - "minihud.config.generic.name.villagerOfferPriceThreshold": "村民交易價格閾值", - "minihud.config.generic.comment.axolotlTooltips": "在蠑螈桶的提示框中顯示品種", - "minihud.config.generic.comment.beeTooltips": "在蜂箱和蜂巢物品的提示框中顯示蜜蜂數量", - "minihud.config.generic.comment.honeyTooltips": "在蜂箱和蜂巢物品的提示框中顯示蜂蜜等級\n(譯註:一般生存模式下不會起作用)", - "minihud.config.generic.comment.biomeOverlayRange": "生態域邊界渲染器的水平區塊半徑\n需要開啟 §6[生態域邊界顯示]§f", - "minihud.config.generic.comment.biomeOverlayRangeVertical": "生態域邊界渲染器的垂直(子)區塊半徑\n需要開啟 §6[生態域邊界顯示]§f", - "minihud.config.generic.comment.biomeOverlaySingleColor": "開啟後,那麼生物群落邊界疊加時將為所有生物群落使用相同的顏色。\n當相鄰的生態域的顏色和線條沒有混合成一大堆亂七八糟的顏色時,\n會看起來「不會那麼凌亂」。\n需要開啟 §6[生態域邊界顯示]§f", - "minihud.config.generic.comment.blockPosFormat": "§6[玩家所在方塊座標]§f 中顯示格式的字串。\n字串中需要至少三個\"%%d\"\n預設值: \"Block: %%d, %%d, %%d\"", - "minihud.config.generic.comment.blockGridOverlayMode": "方塊網格的渲染模式\n需要開啟 §6[方塊網格顯示]§f", - "minihud.config.generic.comment.blockGridOverlayRadius": "方塊網格的渲染範圍半徑\n需要開啟 §6[方塊網格顯示]§f", - "minihud.config.generic.comment.coordinateFormat": "§6[玩家座標資訊]§f 中顯示格式的字串。\n字串中需要至少三個\"%%f\"\n預設值: \"x: %%.1f y: %%.1f z: %%.1f\"", - "minihud.config.generic.comment.dateFormatReal": "§6[現實時間資訊]§f 中顯示日期格式的字串,請參閱 Java SimpleDateFormat 格式", - "minihud.config.generic.comment.dateFormatMinecraft": "§6[格式化遊戲時間]§f 中顯示格式的字串\n支援的佔位符有:\n{DAY_1}(初始值為 1 的日)、{DAY}(初始值為 0 的日)、\n{HOUR}(小時)、{MIN}(分鐘)、{SEC}(秒)、\n{MOON}(月相)。", - "minihud.config.generic.comment.debugMessages": "在控制台中啟用除錯資訊", - "minihud.config.generic.comment.debugRendererPathFindingEnablePointWidth": "開啟後,原版尋路指示器將顯示路徑點寬度的框線。", - "minihud.config.generic.comment.dontClearStoredSeedOnDimensionChange": "當只是改變維度時,不要清除儲存的世界種子。\n有些 Mod 可能會在每個維度使用不同的種子,所以你可能需要修改這個,\n以防你的伺服器 Mod 中不同維度有不同的世界種子。", - "minihud.config.generic.comment.entityDataSync": "使用 Servux 的實體同步協議獲取伺服器端實體資料", - "minihud.config.generic.comment.entityDataSyncBackup": "當 Servux 不可用時使用原版 NBT 查詢協議同步實體資料。\n這需要 OP 許可權。(譯註:需要2級及以上許可權)", - "minihud.config.generic.comment.enableVanillaDebugRendererFix": "如果該選項啟用,那麼 OpenGL 所顯示的狀態是固定的。", - "minihud.config.generic.comment.fontScale": "HUD 中字型的縮放係數。\n預設值:0.5", - "minihud.config.generic.comment.hudAlignment": "HUD 的位置", - "minihud.config.generic.comment.inventoryPreview": "用於啟用容器預覽的按鍵", - "minihud.config.generic.comment.inventoryPreviewEnabled": "是否啟用容器預覽功能。", - "minihud.config.generic.comment.inventoryPreviewToggleScreen": "按下後釋放滑鼠指標,以便檢視具體的物品資訊。", - "minihud.config.generic.comment.lightLevelAutoHeight": "如果啟用,那麼光照等級的覆蓋層將自動提升到方塊的頂部。\n§6注:這將使覆蓋層也會呈現在像半磚一樣的東西上,即使在那裡生物將不能生成。\n§6你可以開啟 §6[光照等級渲染碰撞箱檢查]§f 選項來阻止它顯示。", - "minihud.config.generic.comment.lightLevelColoredNumbers": "設定光照等級的數字顯示是使用彩色還是白色\n(§4這就是你用 True 和 False 的理由?——ZMDF§r)", - "minihud.config.generic.comment.lightLevelCollisionCheck": "如果啟用,那麼如果存在任何帶有碰撞箱的方塊,光照等級的覆蓋層將不會被渲染。\n§6注意:這不能檢查該方塊是否能夠刷怪!\n§6開啟該功能後將忽略在不同狀態下可以刷怪的方塊,\n§6例如,開啟活板門或門時可以阻止覆蓋層顯示,但它們以然可以刷怪。", - "minihud.config.generic.comment.lightLevelMarkerCondition": "何時該渲染光照等級的彩色標記", - "minihud.config.generic.comment.lightLevelMarkers": "在滿足 §6[光照等級標記渲染條件]§f 的條件時\n應該使用哪種方式標記滿足條件的方塊", - "minihud.config.generic.comment.lightLevelMarkerSize": "在滿足 §6[光照等級標記渲染條件]§f 的條件時標記的大小。\n範圍:0.0 - 1.0", - "minihud.config.generic.comment.lightLevelNumberCondition": "何時渲染光照等級", - "minihud.config.generic.comment.lightLevelNumbers": "調整光照等級顯示需要顯示的亮度來源。", - "minihud.config.generic.comment.lightLevelNumberOffsetBlockX": "顯示方塊亮度的光照等級時,橫向位移的距離。\n範圍:0.0 - 1.0", - "minihud.config.generic.comment.lightLevelNumberOffsetBlockY": "顯示方塊亮度的光照等級時,縱向位移的距離。\n範圍:0.0 - 1.0", - "minihud.config.generic.comment.lightLevelNumberOffsetSkyX": "顯示天空亮度的光照等級時,橫向位移的距離。\n範圍:0.0 - 1.0", - "minihud.config.generic.comment.lightLevelNumberOffsetSkyY": "顯示天空亮度的光照等級時,縱向位移的距離。\n範圍:0.0 - 1.0", - "minihud.config.generic.comment.lightLevelNumberRotation": "開啟後,亮度顯示將跟隨玩家旋轉。", - "minihud.config.generic.comment.lightLevelRange": "亮度顯示渲染的範圍\n以玩家腳為中心,數值等於體心到面心距離的正方體", - "minihud.config.generic.comment.lightLevelRenderOffset": "光照等級渲染層的相對垂直偏移量。\n這是為了幫助解決方塊表面潛在的 Y 軸衝突的問題。\n範圍:0.0 - 1.0", - "minihud.config.generic.comment.lightLevelRenderThrough": "開啟後,那麼光照等級的覆蓋層將穿過方塊進行渲染。\n(§4填洞小幫手,就是眼得瞎 ——ZMDF§r)", - "minihud.config.generic.comment.lightLevelSkipBlockCheck": "光照等級渲染是否跳過下面方塊的怪物生成檢查。\n這將使覆蓋層也出現在半磚和玻璃等方塊的頂部。\n(§4媽媽再也不用擔心做冰道的時候看不見光照等級了 ——ZMDF§r)", - "minihud.config.generic.comment.lightLevelThresholdDim": "被認為是「§oDim(昏暗)§r」的最大亮度。\n這是一個介於「Dark(§c紅色數字§r)」和「Safe(§a綠色數字§r)」\n之間的使用者可設定的額外級別。將其設定在安全閾值以下以禁用它。", - "minihud.config.generic.comment.lightLevelThresholdSafe": "被認為是「Safe(§a綠色數字§r)」的最低光照等級。", - "minihud.config.generic.comment.lightLevelUnderWater": "光照覆蓋層是否應在水下呈現", - "minihud.config.generic.comment.mainRenderingToggle": "MiniHUD 的主開關,包括資訊行和所有渲染器。", - "minihud.config.generic.comment.mapPreview": "開啟後,當滑鼠懸停在地圖上時,按住 Shift 鍵可以預覽地圖。", - "minihud.config.generic.comment.mapPreviewRequireShift": "預覽地圖是否需要按住 Shift 按鍵。", - "minihud.config.generic.comment.mapPreviewSize": "預覽地圖渲染的大小", - "minihud.config.generic.comment.moveShapeToPlayer": "將當前選擇的形狀移動到玩家(或玩家攝影機)的位置。", - "minihud.config.generic.comment.offsetSubtitleHud": "當 HUD 顯示在右下角,且字幕啟用時,\n字幕將被偏移顯示在資訊 HUD 上方。", - "minihud.config.generic.comment.openConfigGui": "開啟遊戲內設定 GUI 的快速鍵", - "minihud.config.generic.comment.requireSneak": "只有當玩家潛行時,才顯示 HUD", - "minihud.config.generic.comment.requiredKey": "只有按下此快速鍵時,才顯示 HUD", - "minihud.config.generic.comment.serverNbtRequestRate": "向伺服器請求實體資料同步的速率", - "minihud.config.generic.comment.setDistanceReferencePoint": "儲存玩家位置的快速鍵\n用於設定距離參考點位", - "minihud.config.generic.comment.shapeEditor": "開啟所選形狀的形狀編輯界面", - "minihud.config.generic.comment.shulkerBoxPreview": "啟用後, 在按住Shift的同時將滑鼠位於界伏盒將預覽界伏盒內的物品", - "minihud.config.generic.comment.shulkerDisplayBgColor": "將 §6[界伏盒預覽]§f 功能預覽界面的背景顏色設定為界伏盒的顏色。", - "minihud.config.generic.comment.shulkerDisplayRequireShift": "開啟界伏盒預覽是否需要按住Shift", - "minihud.config.generic.comment.slimeChunkTopToPlayer": "開啟時, 在開啟史萊姆區塊顯示時顯示的最高點將會設為玩家的y座標.\n關閉時, 在開啟史萊姆區塊顯示時最高點將設為y = 40", - "minihud.config.generic.comment.slimeChunkOverlayRadius": "渲染史萊姆區塊顯示的區塊半徑\n有效範圍為 -1 到 40\n特別的 -1 = 當前區塊渲染範圍", - "minihud.config.generic.comment.sortLinesByLength": "對顯示的資訊根據其長度\n由長至短自上而下進行排列", - "minihud.config.generic.comment.sortLinesReversed": "在啟用 §6[按文字長度排序]§f 後,啟用該選項會使得按長度排序反向\n關閉狀態——由長至短自上而下\n開啟狀態——由短至長自上而下", - "minihud.config.generic.comment.spawnPlayerOuterOverlayEnabled": "啟用玩家世界生成範圍的渲染器(紫)\n需要開啟 §6[玩家加載範圍顯示]§f", - "minihud.config.generic.comment.spawnPlayerRedstoneOverlayEnabled": "啟用玩家弱加載範圍的渲染器(黃)\n需要開啟 §6[玩家加載範圍顯示]§f", - "minihud.config.generic.comment.spawnRealOuterOverlayEnabled": "啟用出生點世界生成範圍的渲染器(棕)\n需要開啟 §6[出生點加載範圍顯示]§f", - "minihud.config.generic.comment.spawnRealRedstoneOverlayEnabled": "啟用出生點弱加載範圍的渲染器(黃)\n需要開啟 §6[出生點加載範圍顯示]§f", - "minihud.config.generic.comment.spawnableColumnHeightsOverlayRadius": "頂層方塊顯示的渲染範圍\n以玩家為中心,數值等於體心到面心距離的正方體,\n範圍:0 - 128", - "minihud.config.generic.comment.structuresRenderThrough": "開啟後,結構輪廓覆蓋層將穿過方塊進行渲染。", - "minihud.config.generic.comment.textPosX": "HUD 距離螢幕邊緣的橫向距離(預設為 4)", - "minihud.config.generic.comment.textPosY": "HUD 距離螢幕邊緣的縱向距離(預設為 4)", - "minihud.config.generic.comment.timeDayDivisor": "一天時間的模型因數\n(譯註:可以理解為把一天分為多少份)", - "minihud.config.generic.comment.timeTotalDivisor": "整體世界時間的模型因數\n(譯註:可以理解為把一天分為多少份)", - "minihud.config.generic.comment.useCustomizedCoordinateFormat": "是否在 §6[玩家座標資訊]§f 中使用 §6[玩家座標格式]§f 的自定義格式", - "minihud.config.generic.comment.useFontShadow": "使用文字陰影", - "minihud.config.generic.comment.useTextBackground": "在 HUD 中使用純色背景色,使其擁有底色。", - "minihud.config.generic.comment.villagerConversionTicks": "顯示殭屍村民的轉換時間。\n需要開啟 §6[村民資訊顯示]§f", - "minihud.config.generic.comment.villagerOfferEnchantmentBooks": "顯示村民售賣附魔書的價格\n需要開啟 §6[村民資訊顯示]§f", - "minihud.config.generic.comment.villagerOfferPriceRange": "顯示村民售賣附魔書的價格範圍\n需要開啟 §6[村民資訊顯示]§f", - "minihud.config.generic.comment.villagerOfferHighestLevelOnly": "只顯示售賣最高等級的附魔書的村民交易\n需要開啟 §6[村民資訊顯示]§f", - "minihud.config.generic.comment.villagerOfferLowestPriceNearby": "只顯示相同附魔最便宜的村民交易\n需要開啟 §6[村民資訊顯示]§f", - "minihud.config.generic.comment.villagerOfferPriceThreshold": "只顯示價格低於此比例的村民交易\n若要顯示全部請設為1.0\n需要開啟 §6[村民資訊顯示]§f", - "minihud.config.generic.prettyName.mainRenderingToggle": "MiniHUD 主開關", - "minihud.config.colors.name.beaconRangeLvl1": "1 級烽火台顏色", - "minihud.config.colors.name.beaconRangeLvl2": "2 級烽火台顏色", - "minihud.config.colors.name.beaconRangeLvl3": "3 級烽火台顏色", - "minihud.config.colors.name.beaconRangeLvl4": "4 級烽火台顏色", - "minihud.config.colors.name.blockGridOverlayColor": "方塊網格顏色", - "minihud.config.colors.name.conduitRange": "海靈核心範圍顏色", - "minihud.config.colors.name.lightLevelMarkerBlockLit": "亮度充足標記顏色", - "minihud.config.colors.name.lightLevelMarkerDark": "亮度不足標記顏色", - "minihud.config.colors.name.lightLevelMarkerDim": "亮度昏暗標記顏色", - "minihud.config.colors.name.lightLevelMarkerSkyLit": "天空亮度標記顏色", - "minihud.config.colors.name.lightLevelNumberBlockDark": "方塊亮度不足顏色", - "minihud.config.colors.name.lightLevelNumberBlockDim": "方塊亮度昏暗數字顏色", - "minihud.config.colors.name.lightLevelNumberBlockLit": "方塊亮度充足顏色", - "minihud.config.colors.name.lightLevelNumberSkyDark": "天空亮度不足顏色", - "minihud.config.colors.name.lightLevelNumberSkyDim": "天空亮度昏暗數字顏色", - "minihud.config.colors.name.lightLevelNumberSkyLit": "天空亮度充足顏色", - "minihud.config.colors.name.randomTicksFixedOverlayColor": "固定隨機刻範圍顏色", - "minihud.config.colors.name.randomTicksPlayerOverlayColor": "跟隨玩家移動隨機刻範圍顏色", - "minihud.config.colors.name.regionOverlayColor": "區域邊界顏色", - "minihud.config.colors.name.shapeAdjustableSpawnSphere": "可調節生成球體顏色", - "minihud.config.colors.name.shapeBox": "長方體顏色", - "minihud.config.colors.name.shapeCanDespawnSphere": "怪物可能消失範圍球體顏色", - "minihud.config.colors.name.shapeCanSpawnSphere": "可刷怪範圍球體顏色", - "minihud.config.colors.name.shapeCircle": "圓環顏色", - "minihud.config.colors.name.shapeDespawnSphere": "怪物強制卸載範圍球體顏色", - "minihud.config.colors.name.shapeLineBlocky": "直線顏色", - "minihud.config.colors.name.shapeSphereBlocky": "球體顏色", - "minihud.config.colors.name.slimeChunksOverlayColor": "史萊姆區塊顏色", - "minihud.config.colors.name.spawnPlayerEntityOverlayColor": "玩家強加載範圍顏色", - "minihud.config.colors.name.spawnPlayerRedstoneOverlayColor": "玩家弱加載範圍顏色", - "minihud.config.colors.name.spawnPlayerLazyOverlayColor": "玩家加載邊界範圍顏色", - "minihud.config.colors.name.spawnPlayerOuterOverlayColor": "玩家世界生成範圍顏色", - "minihud.config.colors.name.spawnRealEntityOverlayColor": "出生點強加載範圍顏色", - "minihud.config.colors.name.spawnRealRedstoneOverlayColor": "出生點弱加載範圍顏色", - "minihud.config.colors.name.spawnRealLazyOverlayColor": "出生點加載邊界範圍顏色", - "minihud.config.colors.name.spawnRealOuterOverlayColor": "出生點世界生成範圍顏色", - "minihud.config.colors.name.spawnableColumnHeightsOverlayColor": "頂層方塊顯示顏色", - "minihud.config.colors.name.textBackgroundColor": "文字背景顏色", - "minihud.config.colors.name.textColor": "文字顏色", - "minihud.config.colors.comment.beaconRangeLvl1": "1級烽火台範圍的顏色", - "minihud.config.colors.comment.beaconRangeLvl2": "2級烽火台範圍的顏色", - "minihud.config.colors.comment.beaconRangeLvl3": "3級烽火台範圍的顏色", - "minihud.config.colors.comment.beaconRangeLvl4": "4級烽火台範圍的顏色", - "minihud.config.colors.comment.blockGridOverlayColor": "方塊網格覆蓋顏色", - "minihud.config.colors.comment.conduitRange": "海靈核心覆蓋範圍的顏色", - "minihud.config.colors.comment.lightLevelMarkerBlockLit": "安全點標記的顏色 (白天)", - "minihud.config.colors.comment.lightLevelMarkerDark": "可生成點的標記顏色", - "minihud.config.colors.comment.lightLevelMarkerDim": "\"dim\"標記的顏色 (使用者可定義等級)", - "minihud.config.colors.comment.lightLevelMarkerSkyLit": "安全點標記的顏色 (白天)", - "minihud.config.colors.comment.lightLevelNumberBlockDark": "方塊亮度低於 §6[光照等級渲染 Safe 閾值]§f時標記的顏色", - "minihud.config.colors.comment.lightLevelNumberBlockDim": "方塊亮度大於 §6[光照等級渲染 Dim 閾值]§f \n且小於 §6[光照等級渲染 Safe 閾值]§f 時標記的顏色", - "minihud.config.colors.comment.lightLevelNumberBlockLit": "方塊亮度大於等於 §6[光照等級渲染 Safe 閾值]§f時標記的顏色", - "minihud.config.colors.comment.lightLevelNumberSkyDark": "天空亮度低於 §6[光照等級渲染 Safe 閾值]§f時標記的顏色", - "minihud.config.colors.comment.lightLevelNumberSkyDim": "天空亮度大於 §6[光照等級渲染 Dim 閾值]§f \n且小於 §6[光照等級渲染 Safe 閾值]§f 時標記的顏色", - "minihud.config.colors.comment.lightLevelNumberSkyLit": "天空亮度大於等於 §6[光照等級渲染 Safe 閾值]§f時標記的顏色", - "minihud.config.colors.comment.randomTicksFixedOverlayColor": "開啟時位置的隨機刻區域的顏色", - "minihud.config.colors.comment.randomTicksPlayerOverlayColor": "跟隨玩家運動顯示的隨機刻區域的顏色", - "minihud.config.colors.comment.regionOverlayColor": "區域檔案邊界的顏色", - "minihud.config.colors.comment.shapeAdjustableSpawnSphere": "§6[可調節生成球體]§f的預設顏色。\n每個球體的顏色可以透過其設定 GUI 進行更改。", - "minihud.config.colors.comment.shapeBox": "§6[長方體]§f 的預設顏色。\n每個長方體的顏色可以透過其設定 GUI 進行更改。", - "minihud.config.colors.comment.shapeCanDespawnSphere": "§6[怪物可能消失範圍球體]§f的預設顏色。\n每個球體的顏色可以透過其設定 GUI 進行更改。", - "minihud.config.colors.comment.shapeCanSpawnSphere": "§6[可刷怪範圍球體]§f的預設顏色。\n每個球體的顏色可以透過其設定 GUI 進行更改。", - "minihud.config.colors.comment.shapeCircle": "§6[圓環]§f 的預設顏色。\n每個圓環的顏色可以透過其設定 GUI 進行更改。", - "minihud.config.colors.comment.shapeDespawnSphere": "§6[怪物強制卸載範圍球體]§f的預設顏色。\n每個球體的顏色可以透過其設定 GUI 進行更改。", - "minihud.config.colors.comment.shapeLineBlocky": "§6[直線]§f 的預設顏色。\n每個直線的顏色可以透過其設定 GUI 進行更改。", - "minihud.config.colors.comment.shapeSphereBlocky": "§6[球體]§f 的預設顏色。\n每個球體的顏色可以透過其設定 GUI 進行更改。", - "minihud.config.colors.comment.slimeChunksOverlayColor": "渲染史萊姆區塊時的顏色", - "minihud.config.colors.comment.spawnPlayerEntityOverlayColor": "玩家加載範圍中強加載區塊的顏色\n§9藍 - 強加載區塊", - "minihud.config.colors.comment.spawnPlayerRedstoneOverlayColor": "玩家加載範圍中弱加載區塊的顏色\n§e黃 - 弱加載區塊(預設關閉)", - "minihud.config.colors.comment.spawnPlayerLazyOverlayColor": "玩家加載範圍中加載邊界區塊的顏色\n§d粉 - 加載邊界區塊", - "minihud.config.colors.comment.spawnPlayerOuterOverlayColor": "玩家加載範圍中世界生成區塊的顏色\n§5紫 - 世界生成區塊,範圍外的區塊完全不加載(預設關閉)", - "minihud.config.colors.comment.spawnRealEntityOverlayColor": "出生點加載範圍中強加載區塊的顏色\n§a綠 - 強加載區塊", - "minihud.config.colors.comment.spawnRealRedstoneOverlayColor": "出生點加載範圍中弱加載區塊的顏色\n§e黃 - 弱加載區塊(預設關閉)", - "minihud.config.colors.comment.spawnRealLazyOverlayColor": "出生點加載範圍中加載邊界區塊的顏色\n§c紅 - 加載邊界區塊", - "minihud.config.colors.comment.spawnRealOuterOverlayColor": "出生點加載範圍中世界生成區塊的顏色\n§6棕 - 世界生成區塊,範圍外的區塊完全不加載(預設關閉)", - "minihud.config.colors.comment.spawnableColumnHeightsOverlayColor": "區塊最高位置的方塊所顯示的顏色", - "minihud.config.colors.comment.textBackgroundColor": "HUD中文字背景的顏色", - "minihud.config.colors.comment.textColor": "HUD中文字的顏色", - "minihud.config.info_toggle.name.infoBeeCount": "蜜蜂數量資訊", - "minihud.config.info_toggle.name.infoBiome": "生態域資訊", - "minihud.config.info_toggle.name.infoBiomeRegistryName": "生態域註冊名資訊", - "minihud.config.info_toggle.name.infoBlockBreakSpeed": "挖掘速度資訊", - "minihud.config.info_toggle.name.infoBlockInChunk": "區塊內方塊資訊", - "minihud.config.info_toggle.name.infoBlockPosition": "方塊位置資訊", - "minihud.config.info_toggle.name.infoBlockProperties": "方塊屬性資訊", - "minihud.config.info_toggle.name.infoChunkPosition": "區塊位置資訊", - "minihud.config.info_toggle.name.infoChunkSections": "渲染區塊資訊", - "minihud.config.info_toggle.name.infoChunkSectionsLine": "渲染區塊完整資訊", - "minihud.config.info_toggle.name.infoChunkUpdates": "區塊更新資訊", - "minihud.config.info_toggle.name.infoCoordinates": "玩家座標資訊", - "minihud.config.info_toggle.name.infoCoordinatesScaled": "座標對映資訊", - "minihud.config.info_toggle.name.infoDifficulty": "區域難度資訊", - "minihud.config.info_toggle.name.infoDimensionId": "維度資訊", - "minihud.config.info_toggle.name.infoDistance": "距離資訊", - "minihud.config.info_toggle.name.infoEntities": "實體數量資訊", - "minihud.config.info_toggle.name.infoEntitiesClientWorld": "客戶端世界實體資訊", - "minihud.config.info_toggle.name.infoEntityRegistryName": "實體註冊名資訊", - "minihud.config.info_toggle.name.infoFacing": "朝向資訊", - "minihud.config.info_toggle.name.infoFurnaceXp": "熔爐經驗資訊", - "minihud.config.info_toggle.name.infoFPS": "幀率資訊", - "minihud.config.info_toggle.name.infoHoneyLevel": "蜂蜜等級資訊", - "minihud.config.info_toggle.name.infoHorseSpeed": "馬匹速度資訊", - "minihud.config.info_toggle.name.infoHorseJump": "馬匹跳躍資訊", - "minihud.config.info_toggle.name.infoLightLevel": "光照等級資訊", - "minihud.config.info_toggle.name.infoLookingAtBlock": "注視方塊資訊", - "minihud.config.info_toggle.name.infoLookingAtBlockInChunk": "注視區塊內方塊資訊", - "minihud.config.info_toggle.name.infoLookingAtEntity": "注視實體資訊", - "minihud.config.info_toggle.name.infoLookingAtEffects": "注視實體效果資訊", - "minihud.config.info_toggle.name.infoMemoryUsage": "記憶體使用情況資訊", - "minihud.config.info_toggle.name.infoMobCaps": "生物上限資訊", - "minihud.config.info_toggle.name.infoLoadedChunksCount": "已加載區塊數量", - "minihud.config.info_toggle.name.infoPandaGene": "熊貓基因資訊", - "minihud.config.info_toggle.name.infoParticleCount": "粒子數量", - "minihud.config.info_toggle.name.infoPing": "延遲資訊", - "minihud.config.info_toggle.name.infoRegionFile": "區域檔案資訊", - "minihud.config.info_toggle.name.infoRotationPitch": "旋轉俯仰角資訊", - "minihud.config.info_toggle.name.infoRotationYaw": "旋轉方向角資訊", - "minihud.config.info_toggle.name.infoServerTPS": "伺服器TPS資訊", - "minihud.config.info_toggle.name.infoServux": "伺服器Servux資訊", - "minihud.config.info_toggle.name.infoSlimeChunk": "史萊姆區塊資訊", - "minihud.config.info_toggle.name.infoSpeed": "速度資訊", - "minihud.config.info_toggle.name.infoSpeedAxis": "軸速度資訊", - "minihud.config.info_toggle.name.infoSpeedHV": "速度分量資訊", - "minihud.config.info_toggle.name.infoSprinting": "奔跑資訊", - "minihud.config.info_toggle.name.infoTileEntities": "方塊實體資訊", - "minihud.config.info_toggle.name.infoTimeDayModulo": "時間週期因數資訊", - "minihud.config.info_toggle.name.infoTimeIRL": "現實時間資訊", - "minihud.config.info_toggle.name.infoTimeTotalModulo": "總時間週期因數資訊", - "minihud.config.info_toggle.name.infoTimeWorld": "世界開放時間資訊", - "minihud.config.info_toggle.name.infoWorldTimeFormatted": "格式化遊戲時間資訊", - "minihud.config.info_toggle.name.infoWeather": "天氣資訊", - "minihud.config.info_toggle.name.infoZombieConversion": "殭屍村民轉化資訊", - "minihud.config.info_toggle.comment.infoBeeCount": "顯示目標蜂巢或巢穴中的蜜蜂數量.\n§6注意:這僅在單人遊戲中有效(沒有伺服器端支援時,\n§6將無法正常顯示,但會在伺服器存在Servux時正常顯示)", - "minihud.config.info_toggle.comment.infoBiome": "顯示當前生態域的名稱", - "minihud.config.info_toggle.comment.infoBiomeRegistryName": "顯示當前生態域的註冊名稱", - "minihud.config.info_toggle.comment.infoBlockBreakSpeed": "顯示玩家在過去 100 個刻 (5 秒) 內\n的方塊破壞速度", - "minihud.config.info_toggle.comment.infoBlockInChunk": "顯示玩家在區塊中的當前方塊位置", - "minihud.config.info_toggle.comment.infoBlockPosition": "顯示玩家當前的方塊位置", - "minihud.config.info_toggle.comment.infoBlockProperties": "顯示方塊狀態的屬性和值", - "minihud.config.info_toggle.comment.infoChunkPosition": "顯示玩家當前所在的區塊", - "minihud.config.info_toggle.comment.infoChunkSections": "顯示當前渲染的區塊部分數量\n(F3 中的 C 值)", - "minihud.config.info_toggle.comment.infoChunkSectionsLine": "顯示 F3 中 C 值的整行", - "minihud.config.info_toggle.comment.infoChunkUpdates": "顯示當前每秒更新的區塊數量", - "minihud.config.info_toggle.comment.infoCoordinates": "顯示玩家的座標", - "minihud.config.info_toggle.comment.infoCoordinatesScaled": "顯示玩家的座標,按維度的座標比例進行縮放。\n僅在主世界和地獄且其座標比例是原版的係數時有效", - "minihud.config.info_toggle.comment.infoDifficulty": "顯示當前的區域難度", - "minihud.config.info_toggle.comment.infoDimensionId": "顯示當前維度 ID\n(結果可能不準確,\n這個問題取決於伺服器 (Sponge?)!)", - "minihud.config.info_toggle.comment.infoDistance": "顯示到當前參考點的距離。\n使用 §6[設定距離參考點]§f 設定參考點", - "minihud.config.info_toggle.comment.infoEntities": "顯示可見/已加載的實體數量", - "minihud.config.info_toggle.comment.infoEntitiesClientWorld": "顯示世界列表/地圖中的實體數量", - "minihud.config.info_toggle.comment.infoEntityRegistryName": "顯示玩家當前注視實體的註冊名稱", - "minihud.config.info_toggle.comment.infoFacing": "顯示玩家當前的朝向", - "minihud.config.info_toggle.comment.infoFurnaceXp": "顯示注視的熔爐中的經驗數量。\n§6注意:這僅在單人遊戲中有效(沒有伺服器端支援時,\n§6將無法正常顯示,但會在伺服器存在Servux時正常顯示)", - "minihud.config.info_toggle.comment.infoFPS": "顯示當前的幀率", - "minihud.config.info_toggle.comment.infoHoneyLevel": "顯示注視中的蜂巢或蜂窩的蜂蜜等級.\n§6注意:這僅在單人遊戲中有效(沒有伺服器端支援時,\n§6將無法正常顯示,但會在伺服器存在Servux時正常顯示)", - "minihud.config.info_toggle.comment.infoHorseSpeed": "顯示正在騎乘的馬的速度 (米/秒)", - "minihud.config.info_toggle.comment.infoHorseJump": "顯示正在騎乘的馬的跳躍高度", - "minihud.config.info_toggle.comment.infoLightLevel": "顯示當前光照等級", - "minihud.config.info_toggle.comment.infoLookingAtBlock": "顯示當前玩家正在觀察的方塊", - "minihud.config.info_toggle.comment.infoLookingAtBlockInChunk": "顯示玩家正在觀察的方塊所處的區塊位置資訊", - "minihud.config.info_toggle.comment.infoLookingAtEntity": "顯示玩家看到的實體名稱和生命值。\n如果伺服器存在 Servux,可以看到更多資料。", - "minihud.config.info_toggle.comment.infoLookingAtEffects": "顯示玩家看到的實體的狀態效果。\n如果伺服器存在 Servux,可以看到更多資料。", - "minihud.config.info_toggle.comment.infoMemoryUsage": "顯示記憶體的使用和分配情況", - "minihud.config.info_toggle.comment.infoMobCaps": "顯示刷怪佔用\n\n§d注意:目前只適用於地毯端伺服器!\n§6資料目前只能從 Carpet 伺服器上的 list 列表解析(Tab 顯示)\n§6當然前提是如果您已使用「/log mobcaps」向伺服器獲取了資料", - "minihud.config.info_toggle.comment.infoLoadedChunksCount": "顯示客戶端上加載區塊的數量", - "minihud.config.info_toggle.comment.infoPandaGene": "顯示玩家看向的熊貓的基因資訊", - "minihud.config.info_toggle.comment.infoParticleCount": "顯示當前渲染的粒子數量 (F3 中的 P)", - "minihud.config.info_toggle.comment.infoPing": "顯示當前伺服器延遲", - "minihud.config.info_toggle.comment.infoRegionFile": "顯示玩家當前所在的區塊檔案", - "minihud.config.info_toggle.comment.infoRotationPitch": "顯示玩家的俯仰旋轉角度", - "minihud.config.info_toggle.comment.infoRotationYaw": "顯示玩家的方向旋轉角度", - "minihud.config.info_toggle.comment.infoServerTPS": "顯示當前伺服器的TPS和ms/tick(MSPT)\n注意: 這個值僅在使用Carpet伺服器端並且開啟了TPS display carpet規則的時候是準確的, 其他情況下都是客戶端基於當前世界時間更新估算的並且僅能檢測到TPS小於20的數值", - "minihud.config.info_toggle.comment.infoServux": "顯示 Servux 版本和實體資料同步協議版本", - "minihud.config.info_toggle.comment.infoSlimeChunk": "顯示玩家當前是否在史萊姆區塊中\n注意:這僅在單人遊戲中有效\n在伺服器中,玩家需要:\n 1) 成為管理員/OP 並在 每次加入或更改維度時手動執行 /seed 命令\n 2) 透過控制台輸入種子,例如: \"minihud-seed 12345\"", - "minihud.config.info_toggle.comment.infoSpeed": "顯示玩家當前的移動速度", - "minihud.config.info_toggle.comment.infoSpeedAxis": "顯示玩家當前每個方向的移動速度", - "minihud.config.info_toggle.comment.infoSpeedHV": "顯示玩家水平和垂直方向的移動速度", - "minihud.config.info_toggle.comment.infoSprinting": "展示玩家衝刺狀態", - "minihud.config.info_toggle.comment.infoTileEntities": "顯示客戶端世界中的TileEntities數量", - "minihud.config.info_toggle.comment.infoTimeDayModulo": "顯示當前一天的時間因數\n可以在設定中設定", - "minihud.config.info_toggle.comment.infoTimeIRL": "根據 §6[現實時間格式]§f 的格式化顯示當前現實時間", - "minihud.config.info_toggle.comment.infoTimeTotalModulo": "顯示當前世界總時間的時間因數\n可以在設定中設定", - "minihud.config.info_toggle.comment.infoTimeWorld": "顯示當前世界開放的時間刻\n可以理解為開服時間", - "minihud.config.info_toggle.comment.infoWorldTimeFormatted": "按照天、小時、分鐘的格式展示當前時間", - "minihud.config.info_toggle.comment.infoWeather": "顯示當前天氣", - "minihud.config.info_toggle.comment.infoZombieConversion": "顯示殭屍村民距離轉換剩餘的時間", - "minihud.config.render_toggle.name.overlayBeaconRange": "烽火台範圍顯示", - "minihud.config.render_toggle.name.overlayBiomeBorder": "生態域邊界顯示", - "minihud.config.render_toggle.name.overlayBlockGrid": "方塊網格顯示", - "minihud.config.render_toggle.name.overlayConduitRange": "海靈核心範圍顯示", - "minihud.config.render_toggle.name.overlayLightLevel": "光照等級顯示", - "minihud.config.render_toggle.name.overlayRandomTicksFixed": "固定隨機刻區域顯示", - "minihud.config.render_toggle.name.overlayRandomTicksPlayer": "玩家跟隨隨機刻區域顯示", - "minihud.config.render_toggle.name.overlayRegionFile": "區域檔案邊界顯示", - "minihud.config.render_toggle.name.overlaySlimeChunks": "史萊姆區塊顯示", - "minihud.config.render_toggle.name.overlaySpawnableColumnHeights": "頂層方塊顯示", - "minihud.config.render_toggle.name.overlaySpawnChunkReal": "出生點加載範圍顯示", - "minihud.config.render_toggle.name.overlaySpawnChunkPlayer": "玩家加載範圍顯示", - "minihud.config.render_toggle.name.overlayStructureMainToggle": "結構渲染器", - "minihud.config.render_toggle.name.overlayVillagerInfo": "村民資訊顯示", - "minihud.config.render_toggle.name.shapeRenderer": "圖形渲染器", - "minihud.config.render_toggle.name.debugChunkBorder": "區塊邊界顯示", - "minihud.config.render_toggle.name.debugChunkInfo": "區塊除錯資訊顯示", - "minihud.config.render_toggle.name.debugChunkOcclusion": "封閉區塊顯示", - "minihud.config.render_toggle.name.debugCollisionBoxEnabled": "碰撞箱顯示", - "minihud.config.render_toggle.name.debugNeighborsUpdateEnabled": "方塊更新顯示", - "minihud.config.render_toggle.name.debugPathfindingEnabled": "尋路更新顯示", - "minihud.config.render_toggle.name.debugSolidFaceEnabled": "塊面除錯顯示", - "minihud.config.render_toggle.name.debugWaterEnabled": "水面除錯資訊顯示", - "minihud.config.render_toggle.comment.overlayBeaconRange": "切換是否顯示烽火台範圍", - "minihud.config.render_toggle.comment.overlayBiomeBorder": "切換是否顯示生態域邊界", - "minihud.config.render_toggle.comment.overlayBlockGrid": "切換是否顯示方塊網格\n(§4屌用沒有還晃眼——ZMDF§r)", - "minihud.config.render_toggle.comment.overlayConduitRange": "切換是否顯示海靈核心覆蓋範圍", - "minihud.config.render_toggle.comment.overlayLightLevel": "切換是否顯示光照等級顯示", - "minihud.config.render_toggle.comment.overlayRandomTicksFixed": "切換是否顯示隨機刻固定點位區域", - "minihud.config.render_toggle.comment.overlayRandomTicksPlayer": "切換是否顯示隨機刻區域\n(以玩家為中心可移動)", - "minihud.config.render_toggle.comment.overlayRegionFile": "切換是否顯示區域檔案內邊界\n(區域檔案為 32*32 的區塊組成)", - "minihud.config.render_toggle.comment.overlaySlimeChunks": "切換是否顯示史萊姆區塊", - "minihud.config.render_toggle.comment.overlaySpawnableColumnHeights": "切換是否顯示區塊最高位置的方塊", - "minihud.config.render_toggle.comment.overlaySpawnChunkReal": "出生點加載範圍的渲染器\n§a綠 - 強加載區塊\n§e黃 - 強加載區塊(預設關閉)\n§c紅 - 加載邊界區塊\n§6棕 - 世界生成區塊,範圍外的區塊完全不加載(預設關閉)", - "minihud.config.render_toggle.comment.overlaySpawnChunkPlayer": "玩家加載範圍的渲染器\n§9藍 - 強加載區塊\n§e黃 - 弱加載區塊(預設關閉)\n§d粉 - 加載邊界區塊\n§5紫 - 世界生成區塊,範圍外的區塊完全不加載(預設關閉)", - "minihud.config.render_toggle.comment.overlayStructureMainToggle": "切換是否顯示所有的結構的邊框", - "minihud.config.render_toggle.comment.overlayVillagerInfo": "切換是否顯示村民的各種資訊", - "minihud.config.render_toggle.comment.shapeRenderer": "切換是否顯示圖形渲染器渲染的圖形", - "minihud.config.render_toggle.comment.debugChunkBorder": "開啟區塊邊界顯示,效果與 F3 + G 一樣。", - "minihud.config.render_toggle.comment.debugChunkInfo": "切換是否顯示原版區塊資訊除錯(16*16*16 的空間)", - "minihud.config.render_toggle.comment.debugChunkOcclusion": "切換是否顯示封閉區塊的顯示(16*16*16 的空間)", - "minihud.config.render_toggle.comment.debugCollisionBoxEnabled": "切換是否顯示碰撞箱除錯渲染", - "minihud.config.render_toggle.comment.debugNeighborsUpdateEnabled": "切換是否顯示方塊更新除錯渲染", - "minihud.config.render_toggle.comment.debugPathfindingEnabled": "切換是否顯示生物尋路更新除錯渲染", - "minihud.config.render_toggle.comment.debugSolidFaceEnabled": "切換是否顯示方塊表面是否完整更新除錯渲染", - "minihud.config.render_toggle.comment.debugWaterEnabled": "切換是否顯示水面流動距離(只對水有效)", - "minihud.config.render_toggle.prettyName.overlayBeaconRange": "烽火台範圍", - "minihud.config.render_toggle.prettyName.overlayBiomeBorder": "生態域邊界", - "minihud.config.render_toggle.prettyName.overlayBlockGrid": "方塊網格覆蓋層", - "minihud.config.render_toggle.prettyName.overlayConduitRange": "烽火台範圍", - "minihud.config.render_toggle.prettyName.overlayLightLevel": "光照等級", - "minihud.config.render_toggle.prettyName.overlayRandomTicksFixed": "隨機刻區域(固定)", - "minihud.config.render_toggle.prettyName.overlayRandomTicksPlayer": "隨機刻區域(跟隨)", - "minihud.config.render_toggle.prettyName.overlayRegionFile": "區域檔案邊界", - "minihud.config.render_toggle.prettyName.overlaySlimeChunks": "史萊姆區塊", - "minihud.config.render_toggle.prettyName.overlaySpawnableColumnHeights": "頂層方塊渲染", - "minihud.config.render_toggle.prettyName.overlaySpawnChunkReal": "出生點加載範圍", - "minihud.config.render_toggle.prettyName.overlaySpawnChunkPlayer": "玩家加載範圍", - "minihud.config.render_toggle.prettyName.overlayStructureMainToggle": "結構邊框", - "minihud.config.render_toggle.prettyName.overlayVillagerInfo": "村民資訊", - "minihud.config.render_toggle.prettyName.shapeRenderer": "形狀渲染器", - "minihud.config.render_toggle.prettyName.debugChunkBorder": "區塊邊界", - "minihud.config.render_toggle.prettyName.debugChunkInfo": "區塊資訊", - "minihud.config.render_toggle.prettyName.debugChunkOcclusion": "封閉區塊資訊", - "minihud.config.render_toggle.prettyName.debugCollisionBoxEnabled": "碰撞箱顯示", - "minihud.config.render_toggle.prettyName.debugNeighborsUpdateEnabled": "方塊更新顯示", - "minihud.config.render_toggle.prettyName.debugPathfindingEnabled": "尋路", - "minihud.config.render_toggle.prettyName.debugSolidFaceEnabled": "方塊實面除錯資訊", - "minihud.config.render_toggle.prettyName.debugWaterEnabled": "水面除錯資訊", - "minihud.config.structure_toggle.name.ancient_city": "遠古城市", - "minihud.config.structure_toggle.comment.ancient_city": "切換遠古城市結構邊框渲染", - "minihud.config.structure_toggle.prettyName.ancient_city": "遠古城市", - "minihud.config.structure_toggle.full_box.name.ancient_city": "遠古城市主體", - "minihud.config.structure_toggle.full_box.comment.ancient_city": "遠古城市主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.ancient_city": "遠古城市整體邊框", - "minihud.config.structure_toggle.components.name.ancient_city": "遠古城市結構", - "minihud.config.structure_toggle.components.comment.ancient_city": "遠古城市結構顏色", - "minihud.config.structure_toggle.components.prettyName.ancient_city": "遠古城市結構", - "minihud.config.structure_toggle.name.bastion_remnant": "堡壘遺蹟", - "minihud.config.structure_toggle.comment.bastion_remnant": "切換堡壘遺蹟結構邊框渲染", - "minihud.config.structure_toggle.prettyName.bastion_remnant": "堡壘遺蹟", - "minihud.config.structure_toggle.full_box.name.bastion_remnant": "堡壘遺蹟主體", - "minihud.config.structure_toggle.full_box.comment.bastion_remnant": "堡壘遺蹟主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.bastion_remnant": "堡壘遺蹟整體邊框", - "minihud.config.structure_toggle.components.name.bastion_remnant": "堡壘遺蹟結構", - "minihud.config.structure_toggle.components.comment.bastion_remnant": "堡壘遺蹟結構顏色", - "minihud.config.structure_toggle.components.prettyName.bastion_remnant": "堡壘遺蹟結構", - "minihud.config.structure_toggle.name.buried_treasure": "埋藏的寶藏", - "minihud.config.structure_toggle.comment.buried_treasure": "切換埋藏的寶藏結構邊框渲染", - "minihud.config.structure_toggle.prettyName.buried_treasure": "埋藏的寶藏", - "minihud.config.structure_toggle.full_box.name.buried_treasure": "埋藏的寶藏主體", - "minihud.config.structure_toggle.full_box.comment.buried_treasure": "埋藏的寶藏主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.buried_treasure": "埋藏的寶藏整體邊框", - "minihud.config.structure_toggle.components.name.buried_treasure": "埋藏的寶藏結構", - "minihud.config.structure_toggle.components.comment.buried_treasure": "埋藏的寶藏結構顏色", - "minihud.config.structure_toggle.components.prettyName.buried_treasure": "埋藏的寶藏結構", - "minihud.config.structure_toggle.name.desert_pyramid": "沙漠神殿", - "minihud.config.structure_toggle.comment.desert_pyramid": "切換沙漠神殿結構邊框渲染", - "minihud.config.structure_toggle.prettyName.desert_pyramid": "沙漠神殿", - "minihud.config.structure_toggle.full_box.name.desert_pyramid": "沙漠神殿主體", - "minihud.config.structure_toggle.full_box.comment.desert_pyramid": "沙漠神殿主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.desert_pyramid": "沙漠神殿整體邊框", - "minihud.config.structure_toggle.components.name.desert_pyramid": "沙漠神殿結構", - "minihud.config.structure_toggle.components.comment.desert_pyramid": "沙漠神殿結構顏色", - "minihud.config.structure_toggle.components.prettyName.desert_pyramid": "沙漠神殿結構", - "minihud.config.structure_toggle.name.end_city": "終界城", - "minihud.config.structure_toggle.comment.end_city": "切換終界城結構邊框渲染", - "minihud.config.structure_toggle.prettyName.end_city": "終界城", - "minihud.config.structure_toggle.full_box.name.end_city": "終界城主體", - "minihud.config.structure_toggle.full_box.comment.end_city": "終界城主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.end_city": "終界城整體邊框", - "minihud.config.structure_toggle.components.name.end_city": "終界城結構", - "minihud.config.structure_toggle.components.comment.end_city": "終界城結構顏色", - "minihud.config.structure_toggle.components.prettyName.end_city": "終界城結構", - "minihud.config.structure_toggle.name.igloo": "雪屋", - "minihud.config.structure_toggle.comment.igloo": "切換雪屋結構邊框渲染", - "minihud.config.structure_toggle.prettyName.igloo": "雪屋結構", - "minihud.config.structure_toggle.full_box.name.igloo": "雪屋主體", - "minihud.config.structure_toggle.full_box.comment.igloo": "雪屋主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.igloo": "雪屋結構整體邊框", - "minihud.config.structure_toggle.components.name.igloo": "雪屋結構", - "minihud.config.structure_toggle.components.comment.igloo": "雪屋結構顏色", - "minihud.config.structure_toggle.components.prettyName.igloo": "雪屋結構細節", - "minihud.config.structure_toggle.name.jungle_pyramid": "叢林神廟", - "minihud.config.structure_toggle.comment.jungle_pyramid": "切換叢林神廟結構邊框渲染", - "minihud.config.structure_toggle.prettyName.jungle_pyramid": "叢林神廟", - "minihud.config.structure_toggle.full_box.name.jungle_pyramid": "叢林神廟主體", - "minihud.config.structure_toggle.full_box.comment.jungle_pyramid": "叢林神廟主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.jungle_pyramid": "叢林神廟整體邊框", - "minihud.config.structure_toggle.components.name.jungle_pyramid": "叢林神廟結構", - "minihud.config.structure_toggle.components.comment.jungle_pyramid": "叢林神廟結構顏色", - "minihud.config.structure_toggle.components.prettyName.jungle_pyramid": "叢林神廟結構", - "minihud.config.structure_toggle.name.mansion": "林地府邸", - "minihud.config.structure_toggle.comment.mansion": "切換林地府邸結構邊框渲染", - "minihud.config.structure_toggle.prettyName.mansion": "林地府邸結構", - "minihud.config.structure_toggle.full_box.name.mansion": "林地府邸主體", - "minihud.config.structure_toggle.full_box.comment.mansion": "林地府邸主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.mansion": "林地府邸整體邊框", - "minihud.config.structure_toggle.components.name.mansion": "林地府邸結構", - "minihud.config.structure_toggle.components.comment.mansion": "林地府邸結構顏色", - "minihud.config.structure_toggle.components.prettyName.mansion": "林地府邸結構細節", - "minihud.config.structure_toggle.name.mineshaft": "廢棄礦井", - "minihud.config.structure_toggle.comment.mineshaft": "切換廢棄礦井結構邊框渲染", - "minihud.config.structure_toggle.prettyName.mineshaft": "廢棄礦井結構", - "minihud.config.structure_toggle.full_box.name.mineshaft": "廢棄礦井主體", - "minihud.config.structure_toggle.full_box.comment.mineshaft": "廢棄礦井主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.mineshaft": "廢棄礦井整體邊框", - "minihud.config.structure_toggle.components.name.mineshaft": "廢棄礦井結構", - "minihud.config.structure_toggle.components.comment.mineshaft": "廢棄礦井結構顏色", - "minihud.config.structure_toggle.components.prettyName.mineshaft": "廢棄礦井結構細節", - "minihud.config.structure_toggle.name.fortress": "地獄要塞", - "minihud.config.structure_toggle.comment.fortress": "切換地獄要塞結構邊框渲染", - "minihud.config.structure_toggle.prettyName.fortress": "地獄要塞", - "minihud.config.structure_toggle.full_box.name.fortress": "地獄要塞主體", - "minihud.config.structure_toggle.full_box.comment.fortress": "地獄要塞主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.fortress": "下屆要塞整體邊框", - "minihud.config.structure_toggle.components.name.fortress": "地獄要塞結構", - "minihud.config.structure_toggle.components.comment.fortress": "地獄要塞結構顏色", - "minihud.config.structure_toggle.components.prettyName.fortress": "地獄要塞結構", - "minihud.config.structure_toggle.name.nether_fossil": "地獄化石", - "minihud.config.structure_toggle.comment.nether_fossil": "切換地獄化石結構邊框渲染", - "minihud.config.structure_toggle.prettyName.nether_fossil": "地獄化石", - "minihud.config.structure_toggle.full_box.name.nether_fossil": "地獄化石主體", - "minihud.config.structure_toggle.full_box.comment.nether_fossil": "地獄化石主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.nether_fossil": "下屆化石整體邊框", - "minihud.config.structure_toggle.components.name.nether_fossil": "地獄化石結構", - "minihud.config.structure_toggle.components.comment.nether_fossil": "地獄化石結構顏色", - "minihud.config.structure_toggle.components.prettyName.nether_fossil": "地獄化石結構", - "minihud.config.structure_toggle.name.monument": "海底神殿", - "minihud.config.structure_toggle.comment.monument": "切換海底神殿結構邊框渲染", - "minihud.config.structure_toggle.prettyName.monument": "海底神殿", - "minihud.config.structure_toggle.full_box.name.monument": "海底神殿主體", - "minihud.config.structure_toggle.full_box.comment.monument": "海底神殿主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.monument": "海底神殿整體邊框", - "minihud.config.structure_toggle.components.name.monument": "海底神殿結構", - "minihud.config.structure_toggle.components.comment.monument": "海底神殿結構顏色", - "minihud.config.structure_toggle.components.prettyName.monument": "海底神殿結構", - "minihud.config.structure_toggle.name.ocean_ruin": "海底廢墟", - "minihud.config.structure_toggle.comment.ocean_ruin": "切換海底廢墟結構邊框渲染", - "minihud.config.structure_toggle.prettyName.ocean_ruin": "海底廢墟", - "minihud.config.structure_toggle.full_box.name.ocean_ruin": "海底廢墟主體", - "minihud.config.structure_toggle.full_box.comment.ocean_ruin": "海底廢墟主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.ocean_ruin": "海底廢墟整體邊框", - "minihud.config.structure_toggle.components.name.ocean_ruin": "海底廢墟結構", - "minihud.config.structure_toggle.components.comment.ocean_ruin": "海底廢墟結構顏色", - "minihud.config.structure_toggle.components.prettyName.ocean_ruin": "海底廢墟結構", - "minihud.config.structure_toggle.name.pillager_outpost": "掠奪者前哨站", - "minihud.config.structure_toggle.comment.pillager_outpost": "切換掠奪者前哨站結構邊框渲染", - "minihud.config.structure_toggle.prettyName.pillager_outpost": "掠奪者前哨站", - "minihud.config.structure_toggle.full_box.name.pillager_outpost": "掠奪者前哨站主體", - "minihud.config.structure_toggle.full_box.comment.pillager_outpost": "掠奪者前哨站主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.pillager_outpost": "掠奪者前哨站整體邊框", - "minihud.config.structure_toggle.components.name.pillager_outpost": "掠奪者前哨站結構", - "minihud.config.structure_toggle.components.comment.pillager_outpost": "掠奪者前哨站結構顏色", - "minihud.config.structure_toggle.components.prettyName.pillager_outpost": "掠奪者前哨站結構", - "minihud.config.structure_toggle.name.ruined_portal": "廢棄傳送門", - "minihud.config.structure_toggle.comment.ruined_portal": "切換廢棄傳送門結構邊框渲染", - "minihud.config.structure_toggle.prettyName.ruined_portal": "廢棄傳送門", - "minihud.config.structure_toggle.full_box.name.ruined_portal": "廢棄傳送門主體", - "minihud.config.structure_toggle.full_box.comment.ruined_portal": "廢棄傳送門主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.ruined_portal": "廢棄傳送門整體邊框", - "minihud.config.structure_toggle.components.name.ruined_portal": "廢棄傳送門結構", - "minihud.config.structure_toggle.components.comment.ruined_portal": "廢棄傳送門結構顏色", - "minihud.config.structure_toggle.components.prettyName.ruined_portal": "廢棄傳送門結構", - "minihud.config.structure_toggle.name.shipwreck": "沉船", - "minihud.config.structure_toggle.comment.shipwreck": "切換沉船結構邊框渲染", - "minihud.config.structure_toggle.prettyName.shipwreck": "沉船", - "minihud.config.structure_toggle.full_box.name.shipwreck": "沉船主體", - "minihud.config.structure_toggle.full_box.comment.shipwreck": "沉船主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.shipwreck": "沉船整體邊框", - "minihud.config.structure_toggle.components.name.shipwreck": "沉船結構", - "minihud.config.structure_toggle.components.comment.shipwreck": "沉船結構顏色", - "minihud.config.structure_toggle.components.prettyName.shipwreck": "沉船結構", - "minihud.config.structure_toggle.name.stronghold": "要塞", - "minihud.config.structure_toggle.comment.stronghold": "切換要塞結構邊框渲染", - "minihud.config.structure_toggle.prettyName.stronghold": "要塞", - "minihud.config.structure_toggle.full_box.name.stronghold": "要塞主體", - "minihud.config.structure_toggle.full_box.comment.stronghold": "要塞主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.stronghold": "要塞整體邊框", - "minihud.config.structure_toggle.components.name.stronghold": "要塞結構", - "minihud.config.structure_toggle.components.comment.stronghold": "要塞結構顏色", - "minihud.config.structure_toggle.components.prettyName.stronghold": "要塞結構", - "minihud.config.structure_toggle.name.trial_chambers": "試煉密室", - "minihud.config.structure_toggle.comment.trial_chambers": "切換試煉密室結構邊框渲染", - "minihud.config.structure_toggle.prettyName.trial_chambers": "試煉密室", - "minihud.config.structure_toggle.full_box.name.trial_chambers": "試煉密室主體", - "minihud.config.structure_toggle.full_box.comment.trial_chambers": "試煉密室主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.trial_chambers": "試煉密室整體邊框", - "minihud.config.structure_toggle.components.name.trial_chambers": "試煉密室結構", - "minihud.config.structure_toggle.components.comment.trial_chambers": "試煉密室結構顏色", - "minihud.config.structure_toggle.components.prettyName.trial_chambers": "試煉密室結構", - "minihud.config.structure_toggle.name.village": "村莊", - "minihud.config.structure_toggle.comment.village": "切換村莊結構邊界框渲染\n注意:這是村莊的世界生成結構\n不適用於刷鐵機等生電結構", - "minihud.config.structure_toggle.prettyName.village": "村莊", - "minihud.config.structure_toggle.full_box.name.village": "村莊主體", - "minihud.config.structure_toggle.full_box.comment.village": "村莊主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.village": "村莊整體邊框", - "minihud.config.structure_toggle.components.name.village": "村莊結構", - "minihud.config.structure_toggle.components.comment.village": "村莊結構顏色", - "minihud.config.structure_toggle.components.prettyName.village": "村莊結構", - "minihud.config.structure_toggle.name.swamp_hut": "沼澤小屋", - "minihud.config.structure_toggle.comment.swamp_hut": "切換沼澤小屋結構邊框渲染", - "minihud.config.structure_toggle.prettyName.swamp_hut": "沼澤小屋", - "minihud.config.structure_toggle.full_box.name.swamp_hut": "沼澤小屋主體", - "minihud.config.structure_toggle.full_box.comment.swamp_hut": "沼澤小屋主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.swamp_hut": "沼澤小屋整體邊框", - "minihud.config.structure_toggle.components.name.swamp_hut": "沼澤小屋結構", - "minihud.config.structure_toggle.components.comment.swamp_hut": "沼澤小屋結構顏色", - "minihud.config.structure_toggle.components.prettyName.swamp_hut": "沼澤小屋結構", - "minihud.config.structure_toggle.name.trail_ruins": "古蹟廢墟", - "minihud.config.structure_toggle.comment.trail_ruins": "切換古蹟廢墟結構邊框渲染", - "minihud.config.structure_toggle.prettyName.trail_ruins": "古蹟廢墟", - "minihud.config.structure_toggle.full_box.name.trail_ruins": "古蹟廢墟主體", - "minihud.config.structure_toggle.full_box.comment.trail_ruins": "古蹟廢墟主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.trail_ruins": "古蹟廢墟整體邊框", - "minihud.config.structure_toggle.components.name.trail_ruins": "古蹟廢墟結構", - "minihud.config.structure_toggle.components.comment.trail_ruins": "古蹟廢墟結構顏色", - "minihud.config.structure_toggle.components.prettyName.trail_ruins": "古蹟廢墟結構", - "minihud.config.structure_toggle.name.unknown": "未知結構", - "minihud.config.structure_toggle.comment.unknown": "切換未知結構邊框渲染", - "minihud.config.structure_toggle.prettyName.unknown": "未知結構", - "minihud.config.structure_toggle.full_box.name.unknown": "未知主體", - "minihud.config.structure_toggle.full_box.comment.unknown": "未知主體顏色", - "minihud.config.structure_toggle.full_box.prettyName.unknown": "未知結構整體邊框", - "minihud.config.structure_toggle.components.name.unknown": "未知結構", - "minihud.config.structure_toggle.components.comment.unknown": "未知結構顏色", - "minihud.config.structure_toggle.components.prettyName.unknown": "未知結構細節", - "minihud.gui.button.config_gui.colors": "顏色", - "minihud.gui.button.config_gui.generic": "通用", - "minihud.gui.button.config_gui.info_lines": "資訊", - "minihud.gui.button.config_gui.renderers": "渲染器", - "minihud.gui.button.config_gui.shapes": "形狀", - "minihud.gui.button.config_gui.structures": "結構", - "minihud.gui.button.add_shape": "新增形狀", - "minihud.gui.button.configure": "設定", - "minihud.gui.button.remove": "刪除", - "minihud.gui.button.shape_entry.enabled": "啟用: %s", - "minihud.gui.button.shape_renderer.spawn_sphere.toggle_use_quadrants": "使用角象限生成:%s", - "minihud.gui.button.shape_renderer_toggle": "形狀渲染器: %s", - "minihud.gui.button.shape_renderer.toggle_combine_quads": "合併顯示:%s", - "minihud.gui.button.hover.shape_renderer.spawn_sphere.toggle_use_quadrants": "§7角象限生成基本上是在由中心和邊緣距離定義的\n§7矩形區域的四角上生成了 4 個獨立的球體。\n§7角象限生成是舊的生成方式,此時如果半徑增加\n§7到一定數量,它就會變得離譜(特別是在基點)。\n§7新的生成方式將不再使用角象限生成,\n§7而是「在邊緣滑動生成球體」來建立最終的形狀。", - "minihud.gui.label.center_colon": "中心:", - "minihud.gui.label.color": "顏色:", - "minihud.gui.label.display_name_colon": "顯示名稱:", - "minihud.gui.label.height_colon": "高度:", - "minihud.gui.label.margin_colon": "邊距:", - "minihud.gui.label.radius_colon": "半徑:", - "minihud.gui.hover.shape.block_snap": "§7方塊對齊:§b%s", - "minihud.gui.hover.shape.box.box_side": "§7渲染框架的 %s 面", - "minihud.gui.hover.shape.center_value": "§7中心點:x: §9%s§7, y: §9%s§7, z: §9%s", - "minihud.gui.hover.shape.circle.main_axis_value": "§7軸:§b%s", - "minihud.gui.hover.shape.effective_center_value": "§7有效中心點:x: §9%s§7, y: §9%s§7, z: §9%s", - "minihud.gui.hover.shape.height_value": "§7高度:§6%s", - "minihud.gui.hover.shape.margin_value": "§7邊距:§6%s", - "minihud.gui.hover.shape.radius_value": "§7半徑:§6%s", - "minihud.gui.hover.shape.type_value": "§7型別:§b%s", - "minihud.gui.label.shape.block_snap": "方塊對齊:%s", - "minihud.gui.label.shape.box.corner_1": "角 1", - "minihud.gui.label.shape.box.corner_2": "角 2", - "minihud.gui.label.shape.box.grid_enabled": "啟用網格:%s", - "minihud.gui.label.shape.box.max_corner": "§7最大值:x: §9%s§7, y: §9%s§7, z: §9%s", - "minihud.gui.label.shape.box.maximum_coord": "最大值", - "minihud.gui.label.shape.box.min_corner": "§7最小值:x: §9%s§7, y: §9%s§7, z: §9%s", - "minihud.gui.label.shape.box.minimum_coord": "最小值", - "minihud.gui.label.shape.box.grid_end_offset": "網格終點偏移值", - "minihud.gui.label.shape.box.grid_size": "網格大小", - "minihud.gui.label.shape.box.grid_start_offset": "網格起點偏移值", - "minihud.gui.label.shape.circle.main_axis_colon": "軸向:", - "minihud.gui.label.shape.line.start": "§7位置 1: x: §9%s§7, y: §9%s§7, z: §9%s", - "minihud.gui.label.shape.line.end": "§7位置 2: x: §9%s§7, y: §9%s§7, z: §9%s", - "minihud.gui.label.shape.render_type_colon": "渲染型別:", - "minihud.gui.name.box.box_side.down": "下方", - "minihud.gui.name.box.box_side.up": "上方", - "minihud.gui.name.box.box_side.north": "北面", - "minihud.gui.name.box.box_side.south": "南面", - "minihud.gui.name.box.box_side.west": "西面", - "minihud.gui.name.box.box_side.east": "東面", - "minihud.gui.title.configs": "MiniHUD 設定 - %s", - "minihud.gui.title.shape_editor": "形狀編輯 (%s)", - "minihud.gui.title.shape_manager": "形狀管理", - "minihud.label.axolotl_tooltip.label": "§7品種: ", - "minihud.label.axolotl_tooltip.value": "%s [%s]", - "minihud.label.bee_tooltip.count": "§7包含 §b%s§7 隻蜜蜂", - "minihud.label.bee_tooltip.count_babies": "§7包含 §b%s§7 隻蜜蜂,(§b%s§7 隻幼蜂)", - "minihud.label.bee_tooltip.name": "§7- %s", - "minihud.label.honey_info.level": "§7蜜蜂等級 §b%s§7/5", - "minihud.label.blockgridmode.all": "全部", - "minihud.label.blockgridmode.non_air": "非空氣", - "minihud.label.blockgridmode.adjacent": "相鄰非空氣方塊", - "minihud.label.light_level_marker_mode.cross": "十字", - "minihud.label.light_level_marker_mode.none": "無", - "minihud.label.light_level_marker_mode.square": "正方形", - "minihud.label.light_level_number_mode.none": "無", - "minihud.label.light_level_number_mode.block": "方塊", - "minihud.label.light_level_number_mode.both": "兩者", - "minihud.label.light_level_number_mode.sky": "天空", - "minihud.label.light_level_render_condition.always": "總是", - "minihud.label.light_level_render_condition.dim": "昏暗", - "minihud.label.light_level_render_condition.never": "從不", - "minihud.label.light_level_render_condition.safe": "安全", - "minihud.label.light_level_render_condition.spawnable": "可生成", - "minihud.label.shape_render_type.full_block": "完整方塊", - "minihud.label.shape_render_type.inner_edge": "內部邊緣", - "minihud.label.shape_render_type.outer_edge": "外部邊緣", - "minihud.label.shapes.adjustable_spawn_sphere": "可調節生成球體", - "minihud.label.shapes.box": "盒", - "minihud.label.shapes.can_spawn_sphere": "可刷怪範圍球體(> 24)", - "minihud.label.shapes.can_despawn_sphere": "怪物可能消失範圍球體(> 32)", - "minihud.label.shapes.circle": "圓環/圓柱", - "minihud.label.shapes.despawn_sphere": "怪物強制卸載範圍球體(> 128)", - "minihud.label.shapes.block_line": "線(基於方塊)", - "minihud.label.shapes.sphere_blocky": "球體(基於方塊)", - "minihud.hotkeys.category.generic_hotkeys": "通用快速鍵", - "minihud.hotkeys.category.info_toggle_hotkeys": "資訊開關快速鍵", - "minihud.hotkeys.category.renderer_toggle_hotkeys": "渲染器開關快速鍵", - "minihud.hotkeys.category.structure_toggle_hotkeys": "結構渲染開關快速鍵", - "minihud.message.toggled_debug_mode.collisions": "碰撞箱除錯已切換為 %s", - "minihud.message.toggled_debug_mode.height_map": "已切換高度圖除錯渲染為 %s", - "minihud.message.toggled_debug_mode.neighbor_updates": "方塊更新除錯已切換為 %s", - "minihud.message.toggled_debug_mode.pathfinding": "尋路除錯已切換為 %s", - "minihud.message.toggled_debug_mode.solid_faces": "方塊表面除錯已切換為 %s", - "minihud.message.toggled_debug_mode.water": "水體除錯渲染已切換為 %s", - "minihud.message.toggled_using_center_position": "%s 切換為 %s,使用中心位置 %s", - "minihud.message.toggled_using_position": "%s 切換為 %s,使用位置 %s", - "minihud.message.toggled_using_world_spawn": "%s 切換為 %s,使用世界出生點 %s", - "minihud.message.toggled_using_player_spawn": "%s 切換為 %s,使用模擬距離 %s", - "minihud.message.error.invalid_dropped_chunks_hash_size": "無法解析來自聊天的區塊雜湊集大小", - "minihud.message.error.invalid_seed": "無法從聊天框中解析世界種子", - "minihud.message.error.invalid_spawn_chunk_radius": "無法解析聊天中的生成區塊半徑 (0 < 32)", - "minihud.message.error.shapes.select_shape_from_dropdown": "從下拉選單中選擇要建立的形狀型別", - "minihud.message.distance_reference_point_set": "將距離參考點設定為 %s", - "minihud.message.no_seed": "MiniHUD: 世界種子未知", - "minihud.message.seed_is": "MiniHUD 中的世界種子當前設定為 '%s'", - "minihud.message.seed_set": "MiniHUD: 將世界種子設定為 '%s'", - "minihud.message.spawn_set": "MiniHUD: 將世界生成點設定為 %s", - "minihud.message.no_spawn_chunk_radius": "MiniHUD: 生成區塊半徑未知 (預設值為 2)", - "minihud.message.spawn_chunk_radius_is": "MiniHUD 當前的生成區塊半徑設定為 '%s'", - "minihud.message.spawn_chunk_radius_set": "MiniHUD: 將生成區塊半徑設定為 %s", - "minihud.info_line.invalid_value": "無效", - "minihud.info_line.remaining": "剩餘", - "minihud.info_line.fps": "幀數 %d", - "minihud.info_line.memory_usage": "記憶體:% 2d%% %03d/%03dMB | 已分配:% 2d%% %03dMB", - "minihud.info_line.time.exception": "日期格式化失敗 - 格式化字串可能無效", - "minihud.info_line.time_real": "NOT USED", - "minihud.info_line.time_world": "世界時間:%5d - 總計:%d", - "minihud.info_line.time_world_formatted": "NOT USED", - "minihud.info_line.time_world_formatted.moon_0": "滿月", - "minihud.info_line.time_world_formatted.moon_1": "虧凸月", - "minihud.info_line.time_world_formatted.moon_2": "上弦月", - "minihud.info_line.time_world_formatted.moon_3": "殘月", - "minihud.info_line.time_world_formatted.moon_4": "新月", - "minihud.info_line.time_world_formatted.moon_5": "蛾眉月", - "minihud.info_line.time_world_formatted.moon_6": "上弦月", - "minihud.info_line.time_world_formatted.moon_7": "盈凸月", - "minihud.info_line.time_day_modulo": "白天時間 %% %d: %5d", - "minihud.info_line.time_total_modulo": "總時間 %% %d: %5d", - "minihud.info_line.server_tps": "伺服器 TPS: %s%.1f%s MSPT: %s%.1f%s", - "minihud.info_line.server_tps.est": "伺服器 TPS: %s%.1f%s (MSPT [估計]: %s%.1f%s)", - "minihud.info_line.server_tps.invalid": "伺服器 TPS: <無可用資料>", - "minihud.info_line.weather": "天氣: %s%s", - "minihud.info_line.weather.thundering": "雷暴", - "minihud.info_line.weather.raining": "降雨", - "minihud.info_line.weather.clear": "晴天", - "minihud.info_line.mobcap.data": "生物上限:Ho: %s Pa: %s Am: %s, Ax: %s, UWC: %s, WC: %s, WA: %s, Mi: %s", - "minihud.info_line.mobcap.no_data": "生物上限:<無可用資料>", - "minihud.info_line.mobcap.cap.ambient.full": "§7§l%s§r§7 / %s§r", - "minihud.info_line.mobcap.cap.ambient.nonfull": "§7%s / %s§r", - "minihud.info_line.mobcap.cap.axolotls.full": "§d§l%s§r§7 / %s§r", - "minihud.info_line.mobcap.cap.axolotls.nonfull": "§d%s / %s§r", - "minihud.info_line.mobcap.cap.creature.full": "§a§l%s§r§a / %s§r", - "minihud.info_line.mobcap.cap.creature.nonfull": "§a%s / %s§r", - "minihud.info_line.mobcap.cap.misc.full": "§f§l%s§r§b / %s§r", - "minihud.info_line.mobcap.cap.misc.nonfull": "§f%s / %s§r", - "minihud.info_line.mobcap.cap.monster.full": "§c§l%s§r§c / %s§r", - "minihud.info_line.mobcap.cap.monster.nonfull": "§c%s / %s§r", - "minihud.info_line.mobcap.cap.underground_water_creature.full": "§9§l%s§r§b / %s§r", - "minihud.info_line.mobcap.cap.underground_water_creature.nonfull": "§9%s / %s§r", - "minihud.info_line.mobcap.cap.water_ambient.full": "§9§l%s§r§b / %s§r", - "minihud.info_line.mobcap.cap.water_ambient.nonfull": "§9%s / %s§r", - "minihud.info_line.mobcap.cap.water_creature.full": "§b§l%s§r§b / %s§r", - "minihud.info_line.mobcap.cap.water_creature.nonfull": "§b%s / %s§r", - "minihud.info_line.ping": "延遲:%d ms", - "minihud.info_line.coordinates.exception": "錯誤的座標格式字串!", - "minihud.info_line.coordinates.format": "XYZ: %.2f / %.4f / %.2f", - "minihud.info_line.coordinates_scaled.overworld": "主世界: ", - "minihud.info_line.coordinates_scaled.nether": "地獄: ", - "minihud.info_line.dimension": "維度: ", - "minihud.info_line.block_pos.exception": "錯誤的方塊位置格式字串!", - "minihud.info_line.chunk_pos": "子區塊:%d, %d, %d", - "minihud.info_line.region_file": "區域:r.%d.%d", - "minihud.info_line.block_in_chunk": "方塊:%d, %d, %d 位於子區塊:%d, %d, %d", - "minihud.info_line.block_break_speed": "破壞速度:%.2f", - "minihud.info_line.sprinting": "§6奔跑中", - "minihud.info_line.distance": "距離:%.2f (x: %.2f y: %.2f z: %.2f) [x: %.2f y: %.2f z: %.2f]", - "minihud.info_line.facing": "朝向:%s(%s)", - "minihud.info_line.facing.north.name": "北", - "minihud.info_line.facing.south.name": "南", - "minihud.info_line.facing.west.name": "西", - "minihud.info_line.facing.east.name": "東", - "minihud.info_line.facing.north": "Z軸負方向", - "minihud.info_line.facing.south": "Z軸正方向", - "minihud.info_line.facing.west": "X軸負方向", - "minihud.info_line.facing.east": "X軸正方向", - "minihud.info_line.light_level": "方塊亮度:%d", - "minihud.info_line.bee_count": "蜜蜂:§b%d", - "minihud.info_line.bee_count.flower_pos": "蜜蜂:§b%d§r [花 %s]", - "minihud.info_line.furnace_xp": "熔爐內經驗:§b%d", - "minihud.info_line.honey_level": "蜂蜜:§b%d", - "minihud.info_line.horse_speed": "%s 速度:%.3f 米/秒", - "minihud.info_line.horse_jump": "%s 跳躍高度:%.3f 米", - "minihud.info_line.rotation_yaw": "方向角: %.1f", - "minihud.info_line.rotation_pitch": "俯仰角: %.1f", - "minihud.info_line.speed": "速度:%.3f 米/秒", - "minihud.info_line.speed_hv": "速度:xz: %.3f y: %.3f 米/秒", - "minihud.info_line.speed_axis": "速度:x: %.3f y: %.3f z: %.3f 米/秒", - "minihud.info_line.chunk_sections": "C: %d", - "minihud.info_line.chunk_updates": "TODO", - "minihud.info_line.loaded_chunks_count.server": "伺服器:%d / %d - 客戶端:%s", - "minihud.info_line.panda_gene.main_gene": "主要基因:%s(%s)", - "minihud.info_line.panda_gene.hidden_gene": "隱藏基因:%s(%s)", - "minihud.info_line.panda_gene.dominant_gene": "顯性", - "minihud.info_line.panda_gene.recessive_gene": "隱性", - "minihud.info_line.panda_gene.gene.normal": "普通", - "minihud.info_line.panda_gene.gene.lazy": "懶惰", - "minihud.info_line.panda_gene.gene.worried": "憂鬱", - "minihud.info_line.panda_gene.gene.playful": "頑皮", - "minihud.info_line.panda_gene.gene.brown": "棕色", - "minihud.info_line.panda_gene.gene.weak": "體弱", - "minihud.info_line.panda_gene.gene.aggressive": "好鬥", - "minihud.info_line.particle_count": "P: %s", - "minihud.info_line.difficulty": "區域難度:%.2f // %.2f (%d天)", - "minihud.info_line.biome": "生態域:%s", - "minihud.info_line.biome_reg_name": "生態域註冊名:%s", - "minihud.info_line.tile_entities": "Client world TE - L: ?, T: ? - TODO 1.17", - "minihud.info_line.entities_client_world": "實體數量 - 客戶端:%d", - "minihud.info_line.entities_client_world.server": "實體數量 - 客戶端:%d - 伺服器端:%d", - "minihud.info_line.slime_chunk": "史萊姆區塊:%s", - "minihud.info_line.slime_chunk.yes": "§a是§r", - "minihud.info_line.slime_chunk.no": "§c否§r", - "minihud.info_line.slime_chunk.no_seed": "<未設定世界種子>", - "minihud.info_line.looking_at_entity": "實體:%s", - "minihud.info_line.looking_at_entity.livingentity": "實體:%s - 生命值:%.1f / %.1f", - "minihud.info_line.looking_at_entity.owner": "主人", - "minihud.info_line.looking_at_effects": "狀態效果:%s / %s%s %s", - "minihud.info_line.looking_at_effects.amplifier": "x%d / ", - "minihud.info_line.looking_at_effects.infinite": "持續時間無限", - "minihud.info_line.zombie_conversion": "殭屍村民治療剩餘時間:%s", - "minihud.info_line.entity_reg_name": "實體註冊名:%s", - "minihud.info_line.looking_at_block": "注視的方塊:%d, %d, %d", - "minihud.info_line.looking_at_block_chunk": "方塊:%d, %d, %d 在子區塊:%d, %d, %d", - "minihud.config.generic.name.debugDevelopmentMode": "debugDevelopmentMode", - "minihud.config.generic.name.entityDataSyncLoadNbt": "entityDataSyncLoadNbt", - "minihud.config.generic.name.infoLinesUsesNbt": "infoLinesUsesNbt", - "minihud.config.generic.comment.debugDevelopmentMode": "Enables the Vanilla Development Mode toggle", - "minihud.config.generic.comment.entityDataSyncLoadNbt": "Load the synced NBT data into the Client World.\n§6WARNING! This feature will cause incompatibility\n§6with other mods that rely on this data.", - "minihud.config.generic.comment.infoLinesUsesNbt": "Force the Info Lines data to strictly use the Raw NBT data.\nThis setting helps ensure compatibility with\nother mods by relying ONLY on obtained NBT tags.", - "minihud.config.info_toggle.name.infoEntityVariant": "infoEntityVariant", - "minihud.config.info_toggle.comment.infoEntityVariant": "Show the looked-at Entity variant information,\nsuch as Sheep Color, or Wolf Type", - "minihud.config.render_toggle.name.debugChunkLoading": "debugChunkLoading", - "minihud.config.render_toggle.name.debugOctreeEnabled": "debugOctreeEnabled", - "minihud.config.render_toggle.name.debugRedstoneUpdateOrder": "debugRedstoneUpdateOrder", - "minihud.config.render_toggle.name.debugSupportingBlock": "debugSupportingBlock", - "minihud.config.render_toggle.comment.debugChunkLoading": "Toggles the vanilla Chunk Loading debug renderer", - "minihud.config.render_toggle.comment.debugOctreeEnabled": "Toggles the vanilla Octree debug renderer", - "minihud.config.render_toggle.comment.debugRedstoneUpdateOrder": "Toggles the vanilla Redstone Update Order debug renderer", - "minihud.config.render_toggle.comment.debugSupportingBlock": "Toggles the vanilla Supporting Block debug renderer", - "minihud.config.render_toggle.prettyName.debugChunkLoading": "Chunk Loading", - "minihud.config.render_toggle.prettyName.debugOctreeEnabled": "Octree Debug", - "minihud.config.render_toggle.prettyName.debugRedstoneUpdateOrder": "Redstone Update Order", - "minihud.config.render_toggle.prettyName.debugSupportingBlock": "Supporting Block", - "minihud.info_line.servux": "Servux Version: %s", - "minihud.info_line.servux.not_connected": "Servux Version: §cnot_connected§r", - "minihud.info_line.servux.entity_sync": "EntitySync: cB: %02d, pB: %02d, cE: %02d, pE: %02d", - "minihud.info_line.servux.structures": "Structures: sC: %02d, sR: %02d (%s), wS: %s", - "minihud.info_line.servux.structures_integrated": "Structures (Integrated Server): sC: %02d, sR: %02d (%s), wS: %s", - "minihud.info_line.entity_variant.axolotl": "Axolotl Color: §b%s§r", - "minihud.info_line.entity_variant.cat": "Cat Variant: §b%s§r (%s collar)", - "minihud.info_line.entity_variant.frog": "Frog Variant: §b%s§r", - "minihud.info_line.entity_variant.horse": "Horse Variant: §b%s / %s§r", - "minihud.info_line.entity_variant.parrot": "Parrot Variant: §b%s§r", - "minihud.info_line.entity_variant.sheep": "Sheep Color: §b%s§r", - "minihud.info_line.entity_variant.tropical_fish": "Tropical Fish Variant: §b%s§r", - "minihud.info_line.entity_variant.wolf": "Wolf Variant: §b%s§r (%s collar)" + "malilib.gui.button.render_layers_gui.set_to_player": "定位至玩家", + "minihud.config.generic.name.axolotlTooltips": "顯示蠑螈桶種類", + "minihud.config.generic.name.beeTooltips": "顯示蜂巢物品蜜蜂資訊", + "minihud.config.generic.name.honeyTooltips": "顯示蜂巢物品蜂蜜資訊", + "minihud.config.generic.name.biomeOverlayRange": "生態域水平渲染範圍", + "minihud.config.generic.name.biomeOverlayRangeVertical": "生態域垂直渲染範圍", + "minihud.config.generic.name.biomeOverlaySingleColor": "生態域邊界單一顏色模式", + "minihud.config.generic.name.blockPosFormat": "玩家方塊位置格式", + "minihud.config.generic.name.blockGridOverlayMode": "方塊網格疊加模式", + "minihud.config.generic.name.blockGridOverlayRadius": "方塊網格覆蓋半徑", + "minihud.config.generic.name.coordinateFormat": "玩家座標格式", + "minihud.config.generic.name.dateFormatReal": "現實時間格式", + "minihud.config.generic.name.dateFormatMinecraft": "遊戲時間格式", + "minihud.config.generic.name.debugMessages": "除錯資訊", + "minihud.config.generic.name.debugDevelopmentMode": "debugDevelopmentMode", + "minihud.config.generic.name.debugRendererPathFindingEnablePointWidth": "尋路指示器路徑點寬度", + "minihud.config.generic.name.dontClearStoredSeedOnDimensionChange": "改變維度不清除種子", + "minihud.config.generic.name.entityDataSync": "實體資料同步", + "minihud.config.generic.name.entityDataSyncBackup": "備用實體資料同步", + "minihud.config.generic.name.entityDataSyncLoadNbt": "entityDataSyncLoadNbt", + "minihud.config.generic.name.enableVanillaDebugRendererFix": "原版除錯渲染器修復", + "minihud.config.generic.name.fontScale": "字型大小", + "minihud.config.generic.name.hudAlignment": "HUD 位置", + "minihud.config.generic.name.infoLinesUsesNbt": "infoLinesUsesNbt", + "minihud.config.generic.name.inventoryPreview": "容器預覽快速鍵", + "minihud.config.generic.name.inventoryPreviewEnabled": "啟用容器預覽", + "minihud.config.generic.name.inventoryPreviewToggleScreen": "容器預覽滑鼠釋放", + "minihud.config.generic.name.lightLevelAutoHeight": "光照等級渲染自動高度", + "minihud.config.generic.name.lightLevelColoredNumbers": "光照等級渲染彩色數字", + "minihud.config.generic.name.lightLevelCollisionCheck": "光照等級渲染碰撞箱檢查", + "minihud.config.generic.name.lightLevelMarkerCondition": "光照等級標記渲染條件", + "minihud.config.generic.name.lightLevelMarkers": "亮度不足標記型別", + "minihud.config.generic.name.lightLevelMarkerSize": "亮度不足標記大小", + "minihud.config.generic.name.lightLevelNumberCondition": "光照等級渲染顯示數字條件", + "minihud.config.generic.name.lightLevelNumbers": "光照等級渲染顯示型別", + "minihud.config.generic.name.lightLevelNumberOffsetBlockX": "方塊光照等級顯示橫移", + "minihud.config.generic.name.lightLevelNumberOffsetBlockY": "方塊光照等級顯示縱移", + "minihud.config.generic.name.lightLevelNumberOffsetSkyX": "天空光照等級顯示橫移", + "minihud.config.generic.name.lightLevelNumberOffsetSkyY": "天空光照等級顯示縱移", + "minihud.config.generic.name.lightLevelNumberRotation": "光照等級渲染旋轉", + "minihud.config.generic.name.lightLevelRange": "光照等級渲染範圍", + "minihud.config.generic.name.lightLevelRenderOffset": "光照渲染 Y 軸偏移", + "minihud.config.generic.name.lightLevelRenderThrough": "光照等級渲染透視", + "minihud.config.generic.name.lightLevelSkipBlockCheck": "光照等級渲染略過生成檢測", + "minihud.config.generic.name.lightLevelThresholdDim": "光照等級渲染 Dim 閾值", + "minihud.config.generic.name.lightLevelThresholdSafe": "光照等級渲染 Safe 閾值", + "minihud.config.generic.name.lightLevelUnderWater": "強制水下渲染光照等級", + "minihud.config.generic.name.mainRenderingToggle": "主開關", + "minihud.config.generic.name.mapPreview": "地圖預覽", + "minihud.config.generic.name.mapPreviewRequireShift": "地圖預覽需要 Shift", + "minihud.config.generic.name.mapPreviewSize": "地圖預覽尺寸", + "minihud.config.generic.name.moveShapeToPlayer": "將形狀移動到玩家", + "minihud.config.generic.name.offsetSubtitleHud": "HUD子標題文字偏移", + "minihud.config.generic.name.openConfigGui": "開啟設定界面", + "minihud.config.generic.name.requireSneak": "需要潛行", + "minihud.config.generic.name.requiredKey": "渲染按鍵", + "minihud.config.generic.name.serverNbtRequestRate": "伺服器 NBT 請求速率", + "minihud.config.generic.name.setDistanceReferencePoint": "設定距離參考點", + "minihud.config.generic.name.shapeEditor": "形狀編輯器", + "minihud.config.generic.name.shulkerBoxPreview": "界伏盒預覽", + "minihud.config.generic.name.shulkerDisplayBgColor": "界伏盒預覽背景色", + "minihud.config.generic.name.shulkerDisplayRequireShift": "界伏盒預覽是否需要按住 Shift 鍵", + "minihud.config.generic.name.slimeChunkTopToPlayer": "史萊姆區塊最高點跟隨玩家", + "minihud.config.generic.name.slimeChunkOverlayRadius": "史萊姆區塊渲染半徑", + "minihud.config.generic.name.sortLinesByLength": "按文字長度排序", + "minihud.config.generic.name.sortLinesReversed": "文字長度反序", + "minihud.config.generic.name.spawnPlayerOuterOverlayEnabled": "渲染玩家世界生成範圍", + "minihud.config.generic.name.spawnPlayerRedstoneOverlayEnabled": "渲染玩家弱加載範圍", + "minihud.config.generic.name.spawnRealOuterOverlayEnabled": "渲染出生點世界生成範圍", + "minihud.config.generic.name.spawnRealRedstoneOverlayEnabled": "渲染出生點弱加載範圍", + "minihud.config.generic.name.spawnableColumnHeightsOverlayRadius": "頂層方塊顯示範圍", + "minihud.config.generic.name.structuresRenderThrough": "結構渲染穿透", + "minihud.config.generic.name.textPosX": "HUD 橫移", + "minihud.config.generic.name.textPosY": "HUD 縱移", + "minihud.config.generic.name.timeDayDivisor": "時間因數", + "minihud.config.generic.name.timeTotalDivisor": "總時間因數", + "minihud.config.generic.name.useCustomizedCoordinateFormat": "使用自定義座標格式", + "minihud.config.generic.name.useFontShadow": "使用字型陰影", + "minihud.config.generic.name.useTextBackground": "使用文字背景", + "minihud.config.generic.name.villagerConversionTicks": "殭屍村民治療計時", + "minihud.config.generic.name.villagerOfferEnchantmentBooks": "顯示村民交易附魔書", + "minihud.config.generic.name.villagerOfferPriceRange": "顯示村民交易附魔書價格範圍", + "minihud.config.generic.name.villagerOfferHighestLevelOnly": "僅顯示村民最高等級附魔書", + "minihud.config.generic.name.villagerOfferLowestPriceNearby": "僅顯示村民最低價格附魔書", + "minihud.config.generic.name.villagerOfferPriceThreshold": "村民交易價格閾值", + "minihud.config.generic.comment.axolotlTooltips": "在蠑螈桶的提示框中顯示品種", + "minihud.config.generic.comment.beeTooltips": "在蜂箱和蜂巢物品的提示框中顯示蜜蜂數量", + "minihud.config.generic.comment.honeyTooltips": "在蜂箱和蜂巢物品的提示框中顯示蜂蜜等級\n(譯註:一般生存模式下不會起作用)", + "minihud.config.generic.comment.biomeOverlayRange": "生態域邊界渲染器的水平區塊半徑\n需要開啟 §6[生態域邊界顯示]§f", + "minihud.config.generic.comment.biomeOverlayRangeVertical": "生態域邊界渲染器的垂直(子)區塊半徑\n需要開啟 §6[生態域邊界顯示]§f", + "minihud.config.generic.comment.biomeOverlaySingleColor": "開啟後,那麼生物群落邊界疊加時將為所有生物群落使用相同的顏色。\n當相鄰的生態域的顏色和線條沒有混合成一大堆亂七八糟的顏色時,\n會看起來「不會那麼凌亂」。\n需要開啟 §6[生態域邊界顯示]§f", + "minihud.config.generic.comment.blockPosFormat": "§6[玩家所在方塊座標]§f 中顯示格式的字串。\n字串中需要至少三個\"%%d\"\n預設值: \"Block: %%d, %%d, %%d\"", + "minihud.config.generic.comment.blockGridOverlayMode": "方塊網格的渲染模式\n需要開啟 §6[方塊網格顯示]§f", + "minihud.config.generic.comment.blockGridOverlayRadius": "方塊網格的渲染範圍半徑\n需要開啟 §6[方塊網格顯示]§f", + "minihud.config.generic.comment.coordinateFormat": "§6[玩家座標資訊]§f 中顯示格式的字串。\n字串中需要至少三個\"%%f\"\n預設值: \"x: %%.1f y: %%.1f z: %%.1f\"", + "minihud.config.generic.comment.dateFormatReal": "§6[現實時間資訊]§f 中顯示日期格式的字串,請參閱 Java SimpleDateFormat 格式", + "minihud.config.generic.comment.dateFormatMinecraft": "§6[格式化遊戲時間]§f 中顯示格式的字串\n支援的佔位符有:\n{DAY_1}(初始值為 1 的日)、{DAY}(初始值為 0 的日)、\n{HOUR}(小時)、{MIN}(分鐘)、{SEC}(秒)、\n{MOON}(月相)。", + "minihud.config.generic.comment.debugMessages": "在控制台中啟用除錯資訊", + "minihud.config.generic.comment.debugDevelopmentMode": "Enables the Vanilla Development Mode toggle", + "minihud.config.generic.comment.debugRendererPathFindingEnablePointWidth": "開啟後,原版尋路指示器將顯示路徑點寬度的框線。", + "minihud.config.generic.comment.dontClearStoredSeedOnDimensionChange": "當只是改變維度時,不要清除儲存的世界種子。\n有些 Mod 可能會在每個維度使用不同的種子,所以你可能需要修改這個,\n以防你的伺服器 Mod 中不同維度有不同的世界種子。", + "minihud.config.generic.comment.entityDataSync": "使用 Servux 的實體同步協議獲取伺服器端實體資料", + "minihud.config.generic.comment.entityDataSyncBackup": "當 Servux 不可用時使用原版 NBT 查詢協議同步實體資料。\n這需要 OP 許可權。(譯註:需要2級及以上許可權)", + "minihud.config.generic.comment.entityDataSyncLoadNbt": "Load the synced NBT data into the Client World.\n§6WARNING! This feature will cause incompatibility\n§6with other mods that rely on this data.", + "minihud.config.generic.comment.enableVanillaDebugRendererFix": "如果該選項啟用,那麼 OpenGL 所顯示的狀態是固定的。", + "minihud.config.generic.comment.fontScale": "HUD 中字型的縮放係數。\n預設值:0.5", + "minihud.config.generic.comment.hudAlignment": "HUD 的位置", + "minihud.config.generic.comment.infoLinesUsesNbt": "Force the Info Lines data to strictly use the Raw NBT data.\nThis setting helps ensure compatibility with\nother mods by relying ONLY on obtained NBT tags.", + "minihud.config.generic.comment.inventoryPreview": "用於啟用容器預覽的按鍵", + "minihud.config.generic.comment.inventoryPreviewEnabled": "是否啟用容器預覽功能。", + "minihud.config.generic.comment.inventoryPreviewToggleScreen": "按下後釋放滑鼠指標,以便檢視具體的物品資訊。", + "minihud.config.generic.comment.lightLevelAutoHeight": "如果啟用,那麼光照等級的覆蓋層將自動提升到方塊的頂部。\n§6注:這將使覆蓋層也會呈現在像半磚一樣的東西上,即使在那裡生物將不能生成。\n§6你可以開啟 §6[光照等級渲染碰撞箱檢查]§f 選項來阻止它顯示。", + "minihud.config.generic.comment.lightLevelColoredNumbers": "設定光照等級的數字顯示是使用彩色還是白色\n(§4這就是你用 True 和 False 的理由?——ZMDF§r)", + "minihud.config.generic.comment.lightLevelCollisionCheck": "如果啟用,那麼如果存在任何帶有碰撞箱的方塊,光照等級的覆蓋層將不會被渲染。\n§6注意:這不能檢查該方塊是否能夠刷怪!\n§6開啟該功能後將忽略在不同狀態下可以刷怪的方塊,\n§6例如,開啟活板門或門時可以阻止覆蓋層顯示,但它們以然可以刷怪。", + "minihud.config.generic.comment.lightLevelMarkerCondition": "何時該渲染光照等級的彩色標記", + "minihud.config.generic.comment.lightLevelMarkers": "在滿足 §6[光照等級標記渲染條件]§f 的條件時\n應該使用哪種方式標記滿足條件的方塊", + "minihud.config.generic.comment.lightLevelMarkerSize": "在滿足 §6[光照等級標記渲染條件]§f 的條件時標記的大小。\n範圍:0.0 - 1.0", + "minihud.config.generic.comment.lightLevelNumberCondition": "何時渲染光照等級", + "minihud.config.generic.comment.lightLevelNumbers": "調整光照等級顯示需要顯示的亮度來源。", + "minihud.config.generic.comment.lightLevelNumberOffsetBlockX": "顯示方塊亮度的光照等級時,橫向位移的距離。\n範圍:0.0 - 1.0", + "minihud.config.generic.comment.lightLevelNumberOffsetBlockY": "顯示方塊亮度的光照等級時,縱向位移的距離。\n範圍:0.0 - 1.0", + "minihud.config.generic.comment.lightLevelNumberOffsetSkyX": "顯示天空亮度的光照等級時,橫向位移的距離。\n範圍:0.0 - 1.0", + "minihud.config.generic.comment.lightLevelNumberOffsetSkyY": "顯示天空亮度的光照等級時,縱向位移的距離。\n範圍:0.0 - 1.0", + "minihud.config.generic.comment.lightLevelNumberRotation": "開啟後,亮度顯示將跟隨玩家旋轉。", + "minihud.config.generic.comment.lightLevelRange": "亮度顯示渲染的範圍\n以玩家腳為中心,數值等於體心到面心距離的正方體", + "minihud.config.generic.comment.lightLevelRenderOffset": "光照等級渲染層的相對垂直偏移量。\n這是為了幫助解決方塊表面潛在的 Y 軸衝突的問題。\n範圍:0.0 - 1.0", + "minihud.config.generic.comment.lightLevelRenderThrough": "開啟後,那麼光照等級的覆蓋層將穿過方塊進行渲染。\n(§4填洞小幫手,就是眼得瞎 ——ZMDF§r)", + "minihud.config.generic.comment.lightLevelSkipBlockCheck": "光照等級渲染是否跳過下面方塊的怪物生成檢查。\n這將使覆蓋層也出現在半磚和玻璃等方塊的頂部。\n(§4媽媽再也不用擔心做冰道的時候看不見光照等級了 ——ZMDF§r)", + "minihud.config.generic.comment.lightLevelThresholdDim": "被認為是「§oDim(昏暗)§r」的最大亮度。\n這是一個介於「Dark(§c紅色數字§r)」和「Safe(§a綠色數字§r)」\n之間的使用者可設定的額外級別。將其設定在安全閾值以下以禁用它。", + "minihud.config.generic.comment.lightLevelThresholdSafe": "被認為是「Safe(§a綠色數字§r)」的最低光照等級。", + "minihud.config.generic.comment.lightLevelUnderWater": "光照覆蓋層是否應在水下呈現", + "minihud.config.generic.comment.mainRenderingToggle": "MiniHUD 的主開關,包括資訊行和所有渲染器。", + "minihud.config.generic.comment.mapPreview": "開啟後,當滑鼠懸停在地圖上時,按住 Shift 鍵可以預覽地圖。", + "minihud.config.generic.comment.mapPreviewRequireShift": "預覽地圖是否需要按住 Shift 按鍵。", + "minihud.config.generic.comment.mapPreviewSize": "預覽地圖渲染的大小", + "minihud.config.generic.comment.moveShapeToPlayer": "將當前選擇的形狀移動到玩家(或玩家攝影機)的位置。", + "minihud.config.generic.comment.offsetSubtitleHud": "當 HUD 顯示在右下角,且字幕啟用時,\n字幕將被偏移顯示在資訊 HUD 上方。", + "minihud.config.generic.comment.openConfigGui": "開啟遊戲內設定 GUI 的快速鍵", + "minihud.config.generic.comment.requireSneak": "只有當玩家潛行時,才顯示 HUD", + "minihud.config.generic.comment.requiredKey": "只有按下此快速鍵時,才顯示 HUD", + "minihud.config.generic.comment.serverNbtRequestRate": "向伺服器請求實體資料同步的速率", + "minihud.config.generic.comment.setDistanceReferencePoint": "儲存玩家位置的快速鍵\n用於設定距離參考點位", + "minihud.config.generic.comment.shapeEditor": "開啟所選形狀的形狀編輯界面", + "minihud.config.generic.comment.shulkerBoxPreview": "啟用後, 在按住Shift的同時將滑鼠位於界伏盒將預覽界伏盒內的物品", + "minihud.config.generic.comment.shulkerDisplayBgColor": "將 §6[界伏盒預覽]§f 功能預覽界面的背景顏色設定為界伏盒的顏色。", + "minihud.config.generic.comment.shulkerDisplayRequireShift": "開啟界伏盒預覽是否需要按住Shift", + "minihud.config.generic.comment.slimeChunkTopToPlayer": "開啟時, 在開啟史萊姆區塊顯示時顯示的最高點將會設為玩家的y座標.\n關閉時, 在開啟史萊姆區塊顯示時最高點將設為y = 40", + "minihud.config.generic.comment.slimeChunkOverlayRadius": "渲染史萊姆區塊顯示的區塊半徑\n有效範圍為 -1 到 40\n特別的 -1 = 當前區塊渲染範圍", + "minihud.config.generic.comment.sortLinesByLength": "對顯示的資訊根據其長度\n由長至短自上而下進行排列", + "minihud.config.generic.comment.sortLinesReversed": "在啟用 §6[按文字長度排序]§f 後,啟用該選項會使得按長度排序反向\n關閉狀態——由長至短自上而下\n開啟狀態——由短至長自上而下", + "minihud.config.generic.comment.spawnPlayerOuterOverlayEnabled": "啟用玩家世界生成範圍的渲染器(紫)\n需要開啟 §6[玩家加載範圍顯示]§f", + "minihud.config.generic.comment.spawnPlayerRedstoneOverlayEnabled": "啟用玩家弱加載範圍的渲染器(黃)\n需要開啟 §6[玩家加載範圍顯示]§f", + "minihud.config.generic.comment.spawnRealOuterOverlayEnabled": "啟用出生點世界生成範圍的渲染器(棕)\n需要開啟 §6[出生點加載範圍顯示]§f", + "minihud.config.generic.comment.spawnRealRedstoneOverlayEnabled": "啟用出生點弱加載範圍的渲染器(黃)\n需要開啟 §6[出生點加載範圍顯示]§f", + "minihud.config.generic.comment.spawnableColumnHeightsOverlayRadius": "頂層方塊顯示的渲染範圍\n以玩家為中心,數值等於體心到面心距離的正方體,\n範圍:0 - 128", + "minihud.config.generic.comment.structuresRenderThrough": "開啟後,結構輪廓覆蓋層將穿過方塊進行渲染。", + "minihud.config.generic.comment.textPosX": "HUD 距離螢幕邊緣的橫向距離(預設為 4)", + "minihud.config.generic.comment.textPosY": "HUD 距離螢幕邊緣的縱向距離(預設為 4)", + "minihud.config.generic.comment.timeDayDivisor": "一天時間的模型因數\n(譯註:可以理解為把一天分為多少份)", + "minihud.config.generic.comment.timeTotalDivisor": "整體世界時間的模型因數\n(譯註:可以理解為把一天分為多少份)", + "minihud.config.generic.comment.useCustomizedCoordinateFormat": "是否在 §6[玩家座標資訊]§f 中使用 §6[玩家座標格式]§f 的自定義格式", + "minihud.config.generic.comment.useFontShadow": "使用文字陰影", + "minihud.config.generic.comment.useTextBackground": "在 HUD 中使用純色背景色,使其擁有底色。", + "minihud.config.generic.comment.villagerConversionTicks": "顯示殭屍村民的轉換時間。\n需要開啟 §6[村民資訊顯示]§f", + "minihud.config.generic.comment.villagerOfferEnchantmentBooks": "顯示村民售賣附魔書的價格\n需要開啟 §6[村民資訊顯示]§f", + "minihud.config.generic.comment.villagerOfferPriceRange": "顯示村民售賣附魔書的價格範圍\n需要開啟 §6[村民資訊顯示]§f", + "minihud.config.generic.comment.villagerOfferHighestLevelOnly": "只顯示售賣最高等級的附魔書的村民交易\n需要開啟 §6[村民資訊顯示]§f", + "minihud.config.generic.comment.villagerOfferLowestPriceNearby": "只顯示相同附魔最便宜的村民交易\n需要開啟 §6[村民資訊顯示]§f", + "minihud.config.generic.comment.villagerOfferPriceThreshold": "只顯示價格低於此比例的村民交易\n若要顯示全部請設為1.0\n需要開啟 §6[村民資訊顯示]§f", + "minihud.config.generic.prettyName.mainRenderingToggle": "MiniHUD 主開關", + "minihud.config.colors.name.beaconRangeLvl1": "1 級烽火台顏色", + "minihud.config.colors.name.beaconRangeLvl2": "2 級烽火台顏色", + "minihud.config.colors.name.beaconRangeLvl3": "3 級烽火台顏色", + "minihud.config.colors.name.beaconRangeLvl4": "4 級烽火台顏色", + "minihud.config.colors.name.blockGridOverlayColor": "方塊網格顏色", + "minihud.config.colors.name.conduitRange": "海靈核心範圍顏色", + "minihud.config.colors.name.lightLevelMarkerBlockLit": "亮度充足標記顏色", + "minihud.config.colors.name.lightLevelMarkerDark": "亮度不足標記顏色", + "minihud.config.colors.name.lightLevelMarkerDim": "亮度昏暗標記顏色", + "minihud.config.colors.name.lightLevelMarkerSkyLit": "天空亮度標記顏色", + "minihud.config.colors.name.lightLevelNumberBlockDark": "方塊亮度不足顏色", + "minihud.config.colors.name.lightLevelNumberBlockDim": "方塊亮度昏暗數字顏色", + "minihud.config.colors.name.lightLevelNumberBlockLit": "方塊亮度充足顏色", + "minihud.config.colors.name.lightLevelNumberSkyDark": "天空亮度不足顏色", + "minihud.config.colors.name.lightLevelNumberSkyDim": "天空亮度昏暗數字顏色", + "minihud.config.colors.name.lightLevelNumberSkyLit": "天空亮度充足顏色", + "minihud.config.colors.name.randomTicksFixedOverlayColor": "固定隨機刻範圍顏色", + "minihud.config.colors.name.randomTicksPlayerOverlayColor": "跟隨玩家移動隨機刻範圍顏色", + "minihud.config.colors.name.regionOverlayColor": "區域邊界顏色", + "minihud.config.colors.name.shapeAdjustableSpawnSphere": "可調節生成球體顏色", + "minihud.config.colors.name.shapeBox": "長方體顏色", + "minihud.config.colors.name.shapeCanDespawnSphere": "怪物可能消失範圍球體顏色", + "minihud.config.colors.name.shapeCanSpawnSphere": "可刷怪範圍球體顏色", + "minihud.config.colors.name.shapeCircle": "圓環顏色", + "minihud.config.colors.name.shapeDespawnSphere": "怪物強制卸載範圍球體顏色", + "minihud.config.colors.name.shapeLineBlocky": "直線顏色", + "minihud.config.colors.name.shapeSphereBlocky": "球體顏色", + "minihud.config.colors.name.slimeChunksOverlayColor": "史萊姆區塊顏色", + "minihud.config.colors.name.spawnPlayerEntityOverlayColor": "玩家強加載範圍顏色", + "minihud.config.colors.name.spawnPlayerRedstoneOverlayColor": "玩家弱加載範圍顏色", + "minihud.config.colors.name.spawnPlayerLazyOverlayColor": "玩家加載邊界範圍顏色", + "minihud.config.colors.name.spawnPlayerOuterOverlayColor": "玩家世界生成範圍顏色", + "minihud.config.colors.name.spawnRealEntityOverlayColor": "出生點強加載範圍顏色", + "minihud.config.colors.name.spawnRealRedstoneOverlayColor": "出生點弱加載範圍顏色", + "minihud.config.colors.name.spawnRealLazyOverlayColor": "出生點加載邊界範圍顏色", + "minihud.config.colors.name.spawnRealOuterOverlayColor": "出生點世界生成範圍顏色", + "minihud.config.colors.name.spawnableColumnHeightsOverlayColor": "頂層方塊顯示顏色", + "minihud.config.colors.name.textBackgroundColor": "文字背景顏色", + "minihud.config.colors.name.textColor": "文字顏色", + "minihud.config.colors.comment.beaconRangeLvl1": "1級烽火台範圍的顏色", + "minihud.config.colors.comment.beaconRangeLvl2": "2級烽火台範圍的顏色", + "minihud.config.colors.comment.beaconRangeLvl3": "3級烽火台範圍的顏色", + "minihud.config.colors.comment.beaconRangeLvl4": "4級烽火台範圍的顏色", + "minihud.config.colors.comment.blockGridOverlayColor": "方塊網格覆蓋顏色", + "minihud.config.colors.comment.conduitRange": "海靈核心覆蓋範圍的顏色", + "minihud.config.colors.comment.lightLevelMarkerBlockLit": "安全點標記的顏色 (白天)", + "minihud.config.colors.comment.lightLevelMarkerDark": "可生成點的標記顏色", + "minihud.config.colors.comment.lightLevelMarkerDim": "\"dim\"標記的顏色 (使用者可定義等級)", + "minihud.config.colors.comment.lightLevelMarkerSkyLit": "安全點標記的顏色 (白天)", + "minihud.config.colors.comment.lightLevelNumberBlockDark": "方塊亮度低於 §6[光照等級渲染 Safe 閾值]§f時標記的顏色", + "minihud.config.colors.comment.lightLevelNumberBlockDim": "方塊亮度大於 §6[光照等級渲染 Dim 閾值]§f \n且小於 §6[光照等級渲染 Safe 閾值]§f 時標記的顏色", + "minihud.config.colors.comment.lightLevelNumberBlockLit": "方塊亮度大於等於 §6[光照等級渲染 Safe 閾值]§f時標記的顏色", + "minihud.config.colors.comment.lightLevelNumberSkyDark": "天空亮度低於 §6[光照等級渲染 Safe 閾值]§f時標記的顏色", + "minihud.config.colors.comment.lightLevelNumberSkyDim": "天空亮度大於 §6[光照等級渲染 Dim 閾值]§f \n且小於 §6[光照等級渲染 Safe 閾值]§f 時標記的顏色", + "minihud.config.colors.comment.lightLevelNumberSkyLit": "天空亮度大於等於 §6[光照等級渲染 Safe 閾值]§f時標記的顏色", + "minihud.config.colors.comment.randomTicksFixedOverlayColor": "開啟時位置的隨機刻區域的顏色", + "minihud.config.colors.comment.randomTicksPlayerOverlayColor": "跟隨玩家運動顯示的隨機刻區域的顏色", + "minihud.config.colors.comment.regionOverlayColor": "區域檔案邊界的顏色", + "minihud.config.colors.comment.shapeAdjustableSpawnSphere": "§6[可調節生成球體]§f的預設顏色。\n每個球體的顏色可以透過其設定 GUI 進行更改。", + "minihud.config.colors.comment.shapeBox": "§6[長方體]§f 的預設顏色。\n每個長方體的顏色可以透過其設定 GUI 進行更改。", + "minihud.config.colors.comment.shapeCanDespawnSphere": "§6[怪物可能消失範圍球體]§f的預設顏色。\n每個球體的顏色可以透過其設定 GUI 進行更改。", + "minihud.config.colors.comment.shapeCanSpawnSphere": "§6[可刷怪範圍球體]§f的預設顏色。\n每個球體的顏色可以透過其設定 GUI 進行更改。", + "minihud.config.colors.comment.shapeCircle": "§6[圓環]§f 的預設顏色。\n每個圓環的顏色可以透過其設定 GUI 進行更改。", + "minihud.config.colors.comment.shapeDespawnSphere": "§6[怪物強制卸載範圍球體]§f的預設顏色。\n每個球體的顏色可以透過其設定 GUI 進行更改。", + "minihud.config.colors.comment.shapeLineBlocky": "§6[直線]§f 的預設顏色。\n每個直線的顏色可以透過其設定 GUI 進行更改。", + "minihud.config.colors.comment.shapeSphereBlocky": "§6[球體]§f 的預設顏色。\n每個球體的顏色可以透過其設定 GUI 進行更改。", + "minihud.config.colors.comment.slimeChunksOverlayColor": "渲染史萊姆區塊時的顏色", + "minihud.config.colors.comment.spawnPlayerEntityOverlayColor": "玩家加載範圍中強加載區塊的顏色\n§9藍 - 強加載區塊", + "minihud.config.colors.comment.spawnPlayerRedstoneOverlayColor": "玩家加載範圍中弱加載區塊的顏色\n§e黃 - 弱加載區塊(預設關閉)", + "minihud.config.colors.comment.spawnPlayerLazyOverlayColor": "玩家加載範圍中加載邊界區塊的顏色\n§d粉 - 加載邊界區塊", + "minihud.config.colors.comment.spawnPlayerOuterOverlayColor": "玩家加載範圍中世界生成區塊的顏色\n§5紫 - 世界生成區塊,範圍外的區塊完全不加載(預設關閉)", + "minihud.config.colors.comment.spawnRealEntityOverlayColor": "出生點加載範圍中強加載區塊的顏色\n§a綠 - 強加載區塊", + "minihud.config.colors.comment.spawnRealRedstoneOverlayColor": "出生點加載範圍中弱加載區塊的顏色\n§e黃 - 弱加載區塊(預設關閉)", + "minihud.config.colors.comment.spawnRealLazyOverlayColor": "出生點加載範圍中加載邊界區塊的顏色\n§c紅 - 加載邊界區塊", + "minihud.config.colors.comment.spawnRealOuterOverlayColor": "出生點加載範圍中世界生成區塊的顏色\n§6棕 - 世界生成區塊,範圍外的區塊完全不加載(預設關閉)", + "minihud.config.colors.comment.spawnableColumnHeightsOverlayColor": "區塊最高位置的方塊所顯示的顏色", + "minihud.config.colors.comment.textBackgroundColor": "HUD中文字背景的顏色", + "minihud.config.colors.comment.textColor": "HUD中文字的顏色", + "minihud.config.info_toggle.name.infoBeeCount": "蜜蜂數量資訊", + "minihud.config.info_toggle.name.infoBiome": "生態域資訊", + "minihud.config.info_toggle.name.infoBiomeRegistryName": "生態域註冊名資訊", + "minihud.config.info_toggle.name.infoBlockBreakSpeed": "挖掘速度資訊", + "minihud.config.info_toggle.name.infoBlockInChunk": "區塊內方塊資訊", + "minihud.config.info_toggle.name.infoBlockPosition": "方塊位置資訊", + "minihud.config.info_toggle.name.infoBlockProperties": "方塊屬性資訊", + "minihud.config.info_toggle.name.infoChunkPosition": "區塊位置資訊", + "minihud.config.info_toggle.name.infoChunkSections": "渲染區塊資訊", + "minihud.config.info_toggle.name.infoChunkSectionsLine": "渲染區塊完整資訊", + "minihud.config.info_toggle.name.infoChunkUpdates": "區塊更新資訊", + "minihud.config.info_toggle.name.infoCoordinates": "玩家座標資訊", + "minihud.config.info_toggle.name.infoCoordinatesScaled": "座標對映資訊", + "minihud.config.info_toggle.name.infoDifficulty": "區域難度資訊", + "minihud.config.info_toggle.name.infoDimensionId": "維度資訊", + "minihud.config.info_toggle.name.infoDistance": "距離資訊", + "minihud.config.info_toggle.name.infoEntities": "實體數量資訊", + "minihud.config.info_toggle.name.infoEntitiesClientWorld": "客戶端世界實體資訊", + "minihud.config.info_toggle.name.infoEntityRegistryName": "實體註冊名資訊", + "minihud.config.info_toggle.name.infoEntityVariant": "infoEntityVariant", + "minihud.config.info_toggle.name.infoFacing": "朝向資訊", + "minihud.config.info_toggle.name.infoFurnaceXp": "熔爐經驗資訊", + "minihud.config.info_toggle.name.infoFPS": "幀率資訊", + "minihud.config.info_toggle.name.infoHoneyLevel": "蜂蜜等級資訊", + "minihud.config.info_toggle.name.infoHorseSpeed": "馬匹速度資訊", + "minihud.config.info_toggle.name.infoHorseJump": "馬匹跳躍資訊", + "minihud.config.info_toggle.name.infoLightLevel": "光照等級資訊", + "minihud.config.info_toggle.name.infoLookingAtBlock": "注視方塊資訊", + "minihud.config.info_toggle.name.infoLookingAtBlockInChunk": "注視區塊內方塊資訊", + "minihud.config.info_toggle.name.infoLookingAtEntity": "注視實體資訊", + "minihud.config.info_toggle.name.infoLookingAtEffects": "注視實體效果資訊", + "minihud.config.info_toggle.name.infoLookingAtPlayerExp": "infoLookingAtPlayerExp", + "minihud.config.info_toggle.name.infoMemoryUsage": "記憶體使用情況資訊", + "minihud.config.info_toggle.name.infoMobCaps": "生物上限資訊", + "minihud.config.info_toggle.name.infoLoadedChunksCount": "已加載區塊數量", + "minihud.config.info_toggle.name.infoPandaGene": "熊貓基因資訊", + "minihud.config.info_toggle.name.infoParticleCount": "粒子數量", + "minihud.config.info_toggle.name.infoPlayerExperience": "infoPlayerExperience", + "minihud.config.info_toggle.name.infoPing": "延遲資訊", + "minihud.config.info_toggle.name.infoRegionFile": "區域檔案資訊", + "minihud.config.info_toggle.name.infoRotationPitch": "旋轉俯仰角資訊", + "minihud.config.info_toggle.name.infoRotationYaw": "旋轉方向角資訊", + "minihud.config.info_toggle.name.infoServerTPS": "伺服器TPS資訊", + "minihud.config.info_toggle.name.infoServux": "伺服器Servux資訊", + "minihud.config.info_toggle.name.infoSlimeChunk": "史萊姆區塊資訊", + "minihud.config.info_toggle.name.infoSpeed": "速度資訊", + "minihud.config.info_toggle.name.infoSpeedAxis": "軸速度資訊", + "minihud.config.info_toggle.name.infoSpeedHV": "速度分量資訊", + "minihud.config.info_toggle.name.infoSprinting": "奔跑資訊", + "minihud.config.info_toggle.name.infoTileEntities": "方塊實體資訊", + "minihud.config.info_toggle.name.infoTimeDayModulo": "時間週期因數資訊", + "minihud.config.info_toggle.name.infoTimeIRL": "現實時間資訊", + "minihud.config.info_toggle.name.infoTimeTotalModulo": "總時間週期因數資訊", + "minihud.config.info_toggle.name.infoTimeWorld": "世界開放時間資訊", + "minihud.config.info_toggle.name.infoWorldTimeFormatted": "格式化遊戲時間資訊", + "minihud.config.info_toggle.name.infoWeather": "天氣資訊", + "minihud.config.info_toggle.name.infoZombieConversion": "殭屍村民轉化資訊", + "minihud.config.info_toggle.comment.infoBeeCount": "顯示目標蜂巢或巢穴中的蜜蜂數量.\n§6注意:這僅在單人遊戲中有效(沒有伺服器端支援時,\n§6將無法正常顯示,但會在伺服器存在Servux時正常顯示)", + "minihud.config.info_toggle.comment.infoBiome": "顯示當前生態域的名稱", + "minihud.config.info_toggle.comment.infoBiomeRegistryName": "顯示當前生態域的註冊名稱", + "minihud.config.info_toggle.comment.infoBlockBreakSpeed": "顯示玩家在過去 100 個刻 (5 秒) 內\n的方塊破壞速度", + "minihud.config.info_toggle.comment.infoBlockInChunk": "顯示玩家在區塊中的當前方塊位置", + "minihud.config.info_toggle.comment.infoBlockPosition": "顯示玩家當前的方塊位置", + "minihud.config.info_toggle.comment.infoBlockProperties": "顯示方塊狀態的屬性和值", + "minihud.config.info_toggle.comment.infoChunkPosition": "顯示玩家當前所在的區塊", + "minihud.config.info_toggle.comment.infoChunkSections": "顯示當前渲染的區塊部分數量\n(F3 中的 C 值)", + "minihud.config.info_toggle.comment.infoChunkSectionsLine": "顯示 F3 中 C 值的整行", + "minihud.config.info_toggle.comment.infoChunkUpdates": "顯示當前每秒更新的區塊數量", + "minihud.config.info_toggle.comment.infoCoordinates": "顯示玩家的座標", + "minihud.config.info_toggle.comment.infoCoordinatesScaled": "顯示玩家的座標,按維度的座標比例進行縮放。\n僅在主世界和地獄且其座標比例是原版的係數時有效", + "minihud.config.info_toggle.comment.infoDifficulty": "顯示當前的區域難度", + "minihud.config.info_toggle.comment.infoDimensionId": "顯示當前維度 ID\n(結果可能不準確,\n這個問題取決於伺服器 (Sponge?)!)", + "minihud.config.info_toggle.comment.infoDistance": "顯示到當前參考點的距離。\n使用 §6[設定距離參考點]§f 設定參考點", + "minihud.config.info_toggle.comment.infoEntities": "顯示可見/已加載的實體數量", + "minihud.config.info_toggle.comment.infoEntitiesClientWorld": "顯示世界列表/地圖中的實體數量", + "minihud.config.info_toggle.comment.infoEntityRegistryName": "顯示玩家當前注視實體的註冊名稱", + "minihud.config.info_toggle.comment.infoEntityVariant": "Show the looked-at Entity variant information,\nsuch as Sheep Color, or Wolf Type", + "minihud.config.info_toggle.comment.infoFacing": "顯示玩家當前的朝向", + "minihud.config.info_toggle.comment.infoFurnaceXp": "顯示注視的熔爐中的經驗數量。\n§6注意:這僅在單人遊戲中有效(沒有伺服器端支援時,\n§6將無法正常顯示,但會在伺服器存在Servux時正常顯示)", + "minihud.config.info_toggle.comment.infoFPS": "顯示當前的幀率", + "minihud.config.info_toggle.comment.infoHoneyLevel": "顯示注視中的蜂巢或蜂窩的蜂蜜等級.\n§6注意:這僅在單人遊戲中有效(沒有伺服器端支援時,\n§6將無法正常顯示,但會在伺服器存在Servux時正常顯示)", + "minihud.config.info_toggle.comment.infoHorseSpeed": "顯示正在騎乘的馬的速度 (米/秒)", + "minihud.config.info_toggle.comment.infoHorseJump": "顯示正在騎乘的馬的跳躍高度", + "minihud.config.info_toggle.comment.infoLightLevel": "顯示當前光照等級", + "minihud.config.info_toggle.comment.infoLookingAtBlock": "顯示當前玩家正在觀察的方塊", + "minihud.config.info_toggle.comment.infoLookingAtBlockInChunk": "顯示玩家正在觀察的方塊所處的區塊位置資訊", + "minihud.config.info_toggle.comment.infoLookingAtEntity": "顯示玩家看到的實體名稱和生命值。\n如果伺服器存在 Servux,可以看到更多資料。", + "minihud.config.info_toggle.comment.infoLookingAtEffects": "顯示玩家看到的實體的狀態效果。\n如果伺服器存在 Servux,可以看到更多資料。", + "minihud.config.info_toggle.comment.infoLookingAtPlayerExp": "Show another Player's experience values.", + "minihud.config.info_toggle.comment.infoMemoryUsage": "顯示記憶體的使用和分配情況", + "minihud.config.info_toggle.comment.infoMobCaps": "顯示刷怪佔用\n\n§d注意:目前只適用於地毯端伺服器!\n§6資料目前只能從 Carpet 伺服器上的 list 列表解析(Tab 顯示)\n§6當然前提是如果您已使用「/log mobcaps」向伺服器獲取了資料", + "minihud.config.info_toggle.comment.infoLoadedChunksCount": "顯示客戶端上加載區塊的數量", + "minihud.config.info_toggle.comment.infoPandaGene": "顯示玩家看向的熊貓的基因資訊", + "minihud.config.info_toggle.comment.infoParticleCount": "顯示當前渲染的粒子數量 (F3 中的 P)", + "minihud.config.info_toggle.comment.infoPlayerExperience": "Show the Player's Experience values", + "minihud.config.info_toggle.comment.infoPing": "顯示當前伺服器延遲", + "minihud.config.info_toggle.comment.infoRegionFile": "顯示玩家當前所在的區塊檔案", + "minihud.config.info_toggle.comment.infoRotationPitch": "顯示玩家的俯仰旋轉角度", + "minihud.config.info_toggle.comment.infoRotationYaw": "顯示玩家的方向旋轉角度", + "minihud.config.info_toggle.comment.infoServerTPS": "顯示當前伺服器的TPS和ms/tick(MSPT)\n注意: 這個值僅在使用Carpet伺服器端並且開啟了TPS display carpet規則的時候是準確的, 其他情況下都是客戶端基於當前世界時間更新估算的並且僅能檢測到TPS小於20的數值", + "minihud.config.info_toggle.comment.infoServux": "顯示 Servux 版本和實體資料同步協議版本", + "minihud.config.info_toggle.comment.infoSlimeChunk": "顯示玩家當前是否在史萊姆區塊中\n注意:這僅在單人遊戲中有效\n在伺服器中,玩家需要:\n 1) 成為管理員/OP 並在 每次加入或更改維度時手動執行 /seed 命令\n 2) 透過控制台輸入種子,例如: \"minihud-seed 12345\"", + "minihud.config.info_toggle.comment.infoSpeed": "顯示玩家當前的移動速度", + "minihud.config.info_toggle.comment.infoSpeedAxis": "顯示玩家當前每個方向的移動速度", + "minihud.config.info_toggle.comment.infoSpeedHV": "顯示玩家水平和垂直方向的移動速度", + "minihud.config.info_toggle.comment.infoSprinting": "展示玩家衝刺狀態", + "minihud.config.info_toggle.comment.infoTileEntities": "顯示客戶端世界中的TileEntities數量", + "minihud.config.info_toggle.comment.infoTimeDayModulo": "顯示當前一天的時間因數\n可以在設定中設定", + "minihud.config.info_toggle.comment.infoTimeIRL": "根據 §6[現實時間格式]§f 的格式化顯示當前現實時間", + "minihud.config.info_toggle.comment.infoTimeTotalModulo": "顯示當前世界總時間的時間因數\n可以在設定中設定", + "minihud.config.info_toggle.comment.infoTimeWorld": "顯示當前世界開放的時間刻\n可以理解為開服時間", + "minihud.config.info_toggle.comment.infoWorldTimeFormatted": "按照天、小時、分鐘的格式展示當前時間", + "minihud.config.info_toggle.comment.infoWeather": "顯示當前天氣", + "minihud.config.info_toggle.comment.infoZombieConversion": "顯示殭屍村民距離轉換剩餘的時間", + "minihud.config.render_toggle.name.overlayBeaconRange": "烽火台範圍顯示", + "minihud.config.render_toggle.name.overlayBiomeBorder": "生態域邊界顯示", + "minihud.config.render_toggle.name.overlayBlockGrid": "方塊網格顯示", + "minihud.config.render_toggle.name.overlayConduitRange": "海靈核心範圍顯示", + "minihud.config.render_toggle.name.overlayLightLevel": "光照等級顯示", + "minihud.config.render_toggle.name.overlayRandomTicksFixed": "固定隨機刻區域顯示", + "minihud.config.render_toggle.name.overlayRandomTicksPlayer": "玩家跟隨隨機刻區域顯示", + "minihud.config.render_toggle.name.overlayRegionFile": "區域檔案邊界顯示", + "minihud.config.render_toggle.name.overlaySlimeChunks": "史萊姆區塊顯示", + "minihud.config.render_toggle.name.overlaySpawnableColumnHeights": "頂層方塊顯示", + "minihud.config.render_toggle.name.overlaySpawnChunkReal": "出生點加載範圍顯示", + "minihud.config.render_toggle.name.overlaySpawnChunkPlayer": "玩家加載範圍顯示", + "minihud.config.render_toggle.name.overlayStructureMainToggle": "結構渲染器", + "minihud.config.render_toggle.name.overlayVillagerInfo": "村民資訊顯示", + "minihud.config.render_toggle.name.shapeRenderer": "圖形渲染器", + "minihud.config.render_toggle.name.debugDataMainToggle": "debugDataMainToggle", + "minihud.config.render_toggle.name.debugBeeDataEnabled": "debugBeeDataEnabled", + "minihud.config.render_toggle.name.debugBrainEnabled": "debugBrainEnabled", + "minihud.config.render_toggle.name.debugBreezeJumpEnabled": "debugBreezeJumpEnabled", + "minihud.config.render_toggle.name.debugChunkBorder": "區塊邊界顯示", + "minihud.config.render_toggle.name.debugChunkDebug": "debugChunkDebug", + "minihud.config.render_toggle.name.debugChunkInfo": "區塊除錯資訊顯示", + "minihud.config.render_toggle.name.debugChunkLoading": "debugChunkLoading", + "minihud.config.render_toggle.name.debugChunkOcclusion": "封閉區塊顯示", + "minihud.config.render_toggle.name.debugCollisionBoxEnabled": "碰撞箱顯示", + "minihud.config.render_toggle.name.debugHeightmapEnabled": "debugHeightmapEnabled", + "minihud.config.render_toggle.name.debugLightEnabled": "debugLightEnabled", + "minihud.config.render_toggle.name.debugNeighborsUpdateEnabled": "方塊更新顯示", + "minihud.config.render_toggle.name.debugGameTestEnabled": "debugGameTestEnabled", + "minihud.config.render_toggle.name.debugGameEventsEnabled": "debugGameEventsEnabled", + "minihud.config.render_toggle.name.debugGoalSelectorEnabled": "debugGoalSelectorEnabled", + "minihud.config.render_toggle.name.debugOctreeEnabled": "debugOctreeEnabled", + "minihud.config.render_toggle.name.debugPathfindingEnabled": "尋路更新顯示", + "minihud.config.render_toggle.name.debugRaidCenterEnabled": "debugRaidCenterEnabled", + "minihud.config.render_toggle.name.debugRedstoneUpdateOrder": "debugRedstoneUpdateOrder", + "minihud.config.render_toggle.name.debugSkylightEnabled": "debugSkylightEnabled", + "minihud.config.render_toggle.name.debugSolidFaceEnabled": "塊面除錯顯示", + "minihud.config.render_toggle.name.debugStructuresEnabled": "debugStructuresEnabled", + "minihud.config.render_toggle.name.debugSupportingBlock": "debugSupportingBlock", + "minihud.config.render_toggle.name.debugWaterEnabled": "水面除錯資訊顯示", + "minihud.config.render_toggle.name.debugVillageEnabled": "debugVillageEnabled", + "minihud.config.render_toggle.name.debugVillageSectionsEnabled": "debugVillageSectionsEnabled", + "minihud.config.render_toggle.name.debugWorldGenEnabled": "debugWorldGenEnabled", + "minihud.config.render_toggle.comment.overlayBeaconRange": "切換是否顯示烽火台範圍", + "minihud.config.render_toggle.comment.overlayBiomeBorder": "切換是否顯示生態域邊界", + "minihud.config.render_toggle.comment.overlayBlockGrid": "切換是否顯示方塊網格\n(§4屌用沒有還晃眼——ZMDF§r)", + "minihud.config.render_toggle.comment.overlayConduitRange": "切換是否顯示海靈核心覆蓋範圍", + "minihud.config.render_toggle.comment.overlayLightLevel": "切換是否顯示光照等級顯示", + "minihud.config.render_toggle.comment.overlayRandomTicksFixed": "切換是否顯示隨機刻固定點位區域", + "minihud.config.render_toggle.comment.overlayRandomTicksPlayer": "切換是否顯示隨機刻區域\n(以玩家為中心可移動)", + "minihud.config.render_toggle.comment.overlayRegionFile": "切換是否顯示區域檔案內邊界\n(區域檔案為 32*32 的區塊組成)", + "minihud.config.render_toggle.comment.overlaySlimeChunks": "切換是否顯示史萊姆區塊", + "minihud.config.render_toggle.comment.overlaySpawnableColumnHeights": "切換是否顯示區塊最高位置的方塊", + "minihud.config.render_toggle.comment.overlaySpawnChunkReal": "出生點加載範圍的渲染器\n§a綠 - 強加載區塊\n§e黃 - 強加載區塊(預設關閉)\n§c紅 - 加載邊界區塊\n§6棕 - 世界生成區塊,範圍外的區塊完全不加載(預設關閉)", + "minihud.config.render_toggle.comment.overlaySpawnChunkPlayer": "玩家加載範圍的渲染器\n§9藍 - 強加載區塊\n§e黃 - 弱加載區塊(預設關閉)\n§d粉 - 加載邊界區塊\n§5紫 - 世界生成區塊,範圍外的區塊完全不加載(預設關閉)", + "minihud.config.render_toggle.comment.overlayStructureMainToggle": "切換是否顯示所有的結構的邊框", + "minihud.config.render_toggle.comment.overlayVillagerInfo": "切換是否顯示村民的各種資訊", + "minihud.config.render_toggle.comment.shapeRenderer": "切換是否顯示圖形渲染器渲染的圖形", + "minihud.config.render_toggle.comment.debugDataMainToggle": "Toggles the Debug Data Service from either\nSingle Player, or via Servux, and this\ndisables all optional Debug Renderers.", + "minihud.config.render_toggle.comment.debugBrainEnabled": "Toggles the vanilla Brain debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugBeeDataEnabled": "Toggles the vanilla Bee Data debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugBreezeJumpEnabled": "Toggles the vanilla Breeze Jump debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux", + "minihud.config.render_toggle.comment.debugChunkBorder": "開啟區塊邊界顯示,效果與 F3 + G 一樣。", + "minihud.config.render_toggle.comment.debugChunkDebug": "Toggles the vanilla Chunk Debug debug renderer", + "minihud.config.render_toggle.comment.debugChunkInfo": "切換是否顯示原版區塊資訊除錯(16*16*16 的空間)", + "minihud.config.render_toggle.comment.debugChunkLoading": "Toggles the vanilla Chunk Loading debug renderer", + "minihud.config.render_toggle.comment.debugChunkOcclusion": "切換是否顯示封閉區塊的顯示(16*16*16 的空間)", + "minihud.config.render_toggle.comment.debugCollisionBoxEnabled": "切換是否顯示碰撞箱除錯渲染", + "minihud.config.render_toggle.comment.debugHeightmapEnabled": "Toggles the vanilla Heightmap debug renderer", + "minihud.config.render_toggle.comment.debugLightEnabled": "Toggles the vanilla Light debug renderer", + "minihud.config.render_toggle.comment.debugNeighborsUpdateEnabled": "切換是否顯示方塊更新除錯渲染", + "minihud.config.render_toggle.comment.debugGameTestEnabled": "Toggles the vanilla Game Test debug renderer\n§6WARNING! This requires Server-Side data\n§6and it is currently broken.", + "minihud.config.render_toggle.comment.debugGameEventsEnabled": "Toggles the vanilla Game Events debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugGoalSelectorEnabled": "Toggles the vanilla Goal Selector debug renderer", + "minihud.config.render_toggle.comment.debugOctreeEnabled": "Toggles the vanilla Octree debug renderer", + "minihud.config.render_toggle.comment.debugPathfindingEnabled": "切換是否顯示生物尋路更新除錯渲染", + "minihud.config.render_toggle.comment.debugRaidCenterEnabled": "Toggles the vanilla Raid Center debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugRedstoneUpdateOrder": "Toggles the vanilla Redstone Update Order debug renderer\n§6WARNING! This requires Server-Side data\n§6and it is currently broken.", + "minihud.config.render_toggle.comment.debugSkylightEnabled": "Toggles the vanilla Skylight debug renderer", + "minihud.config.render_toggle.comment.debugSolidFaceEnabled": "切換是否顯示方塊表面是否完整更新除錯渲染", + "minihud.config.render_toggle.comment.debugStructuresEnabled": "Toggles the vanilla Structures debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugSupportingBlock": "Toggles the vanilla Supporting Block debug renderer", + "minihud.config.render_toggle.comment.debugWaterEnabled": "切換是否顯示水面流動距離(只對水有效)", + "minihud.config.render_toggle.comment.debugVillageEnabled": "Toggles the vanilla Village debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugVillageSectionsEnabled": "Toggles the vanilla Village Sections debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.comment.debugWorldGenEnabled": "Toggles the vanilla World Gen debug renderer\n§6WARNING! This requires Server-Side data\n§6from Single Player or Servux.", + "minihud.config.render_toggle.prettyName.overlayBeaconRange": "烽火台範圍", + "minihud.config.render_toggle.prettyName.overlayBiomeBorder": "生態域邊界", + "minihud.config.render_toggle.prettyName.overlayBlockGrid": "方塊網格覆蓋層", + "minihud.config.render_toggle.prettyName.overlayConduitRange": "烽火台範圍", + "minihud.config.render_toggle.prettyName.overlayLightLevel": "光照等級", + "minihud.config.render_toggle.prettyName.overlayRandomTicksFixed": "隨機刻區域(固定)", + "minihud.config.render_toggle.prettyName.overlayRandomTicksPlayer": "隨機刻區域(跟隨)", + "minihud.config.render_toggle.prettyName.overlayRegionFile": "區域檔案邊界", + "minihud.config.render_toggle.prettyName.overlaySlimeChunks": "史萊姆區塊", + "minihud.config.render_toggle.prettyName.overlaySpawnableColumnHeights": "頂層方塊渲染", + "minihud.config.render_toggle.prettyName.overlaySpawnChunkReal": "出生點加載範圍", + "minihud.config.render_toggle.prettyName.overlaySpawnChunkPlayer": "玩家加載範圍", + "minihud.config.render_toggle.prettyName.overlayStructureMainToggle": "結構邊框", + "minihud.config.render_toggle.prettyName.overlayVillagerInfo": "村民資訊", + "minihud.config.render_toggle.prettyName.shapeRenderer": "形狀渲染器", + "minihud.config.render_toggle.prettyName.debugDataMainToggle": "Debug Data Main Toggle", + "minihud.config.render_toggle.prettyName.debugBrainEnabled": "Brain Data", + "minihud.config.render_toggle.prettyName.debugBeeDataEnabled": "Bee Data", + "minihud.config.render_toggle.prettyName.debugBreezeJumpEnabled": "Breeze Jump", + "minihud.config.render_toggle.prettyName.debugChunkBorder": "區塊邊界", + "minihud.config.render_toggle.prettyName.debugChunkDebug": "Chunk Debug", + "minihud.config.render_toggle.prettyName.debugChunkInfo": "區塊資訊", + "minihud.config.render_toggle.prettyName.debugChunkLoading": "Chunk Loading", + "minihud.config.render_toggle.prettyName.debugChunkOcclusion": "封閉區塊資訊", + "minihud.config.render_toggle.prettyName.debugCollisionBoxEnabled": "碰撞箱顯示", + "minihud.config.render_toggle.prettyName.debugHeightmapEnabled": "Heightmap", + "minihud.config.render_toggle.prettyName.debugLightEnabled": "Light", + "minihud.config.render_toggle.prettyName.debugNeighborsUpdateEnabled": "方塊更新顯示", + "minihud.config.render_toggle.prettyName.debugGameTestEnabled": "Game Test", + "minihud.config.render_toggle.prettyName.debugGameEventsEnabled": "Game Events", + "minihud.config.render_toggle.prettyName.debugGoalSelectorEnabled": "Goal Selector", + "minihud.config.render_toggle.prettyName.debugOctreeEnabled": "Octree Debug", + "minihud.config.render_toggle.prettyName.debugPathfindingEnabled": "尋路", + "minihud.config.render_toggle.prettyName.debugRaidCenterEnabled": "Raid Center", + "minihud.config.render_toggle.prettyName.debugRedstoneUpdateOrder": "Redstone Update Order", + "minihud.config.render_toggle.prettyName.debugSkylightEnabled": "Sky Light", + "minihud.config.render_toggle.prettyName.debugSolidFaceEnabled": "方塊實面除錯資訊", + "minihud.config.render_toggle.prettyName.debugStructuresEnabled": "Structures", + "minihud.config.render_toggle.prettyName.debugSupportingBlock": "Supporting Block", + "minihud.config.render_toggle.prettyName.debugWaterEnabled": "水面除錯資訊", + "minihud.config.render_toggle.prettyName.debugVillageEnabled": "Village", + "minihud.config.render_toggle.prettyName.debugVillageSectionsEnabled": "Village Sections", + "minihud.config.render_toggle.prettyName.debugWorldGenEnabled": "World Gen", + "minihud.config.structure_toggle.name.ancient_city": "遠古城市", + "minihud.config.structure_toggle.comment.ancient_city": "切換遠古城市結構邊框渲染", + "minihud.config.structure_toggle.prettyName.ancient_city": "遠古城市", + "minihud.config.structure_toggle.full_box.name.ancient_city": "遠古城市主體", + "minihud.config.structure_toggle.full_box.comment.ancient_city": "遠古城市主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.ancient_city": "遠古城市整體邊框", + "minihud.config.structure_toggle.components.name.ancient_city": "遠古城市結構", + "minihud.config.structure_toggle.components.comment.ancient_city": "遠古城市結構顏色", + "minihud.config.structure_toggle.components.prettyName.ancient_city": "遠古城市結構", + "minihud.config.structure_toggle.name.bastion_remnant": "堡壘遺蹟", + "minihud.config.structure_toggle.comment.bastion_remnant": "切換堡壘遺蹟結構邊框渲染", + "minihud.config.structure_toggle.prettyName.bastion_remnant": "堡壘遺蹟", + "minihud.config.structure_toggle.full_box.name.bastion_remnant": "堡壘遺蹟主體", + "minihud.config.structure_toggle.full_box.comment.bastion_remnant": "堡壘遺蹟主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.bastion_remnant": "堡壘遺蹟整體邊框", + "minihud.config.structure_toggle.components.name.bastion_remnant": "堡壘遺蹟結構", + "minihud.config.structure_toggle.components.comment.bastion_remnant": "堡壘遺蹟結構顏色", + "minihud.config.structure_toggle.components.prettyName.bastion_remnant": "堡壘遺蹟結構", + "minihud.config.structure_toggle.name.buried_treasure": "埋藏的寶藏", + "minihud.config.structure_toggle.comment.buried_treasure": "切換埋藏的寶藏結構邊框渲染", + "minihud.config.structure_toggle.prettyName.buried_treasure": "埋藏的寶藏", + "minihud.config.structure_toggle.full_box.name.buried_treasure": "埋藏的寶藏主體", + "minihud.config.structure_toggle.full_box.comment.buried_treasure": "埋藏的寶藏主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.buried_treasure": "埋藏的寶藏整體邊框", + "minihud.config.structure_toggle.components.name.buried_treasure": "埋藏的寶藏結構", + "minihud.config.structure_toggle.components.comment.buried_treasure": "埋藏的寶藏結構顏色", + "minihud.config.structure_toggle.components.prettyName.buried_treasure": "埋藏的寶藏結構", + "minihud.config.structure_toggle.name.desert_pyramid": "沙漠神殿", + "minihud.config.structure_toggle.comment.desert_pyramid": "切換沙漠神殿結構邊框渲染", + "minihud.config.structure_toggle.prettyName.desert_pyramid": "沙漠神殿", + "minihud.config.structure_toggle.full_box.name.desert_pyramid": "沙漠神殿主體", + "minihud.config.structure_toggle.full_box.comment.desert_pyramid": "沙漠神殿主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.desert_pyramid": "沙漠神殿整體邊框", + "minihud.config.structure_toggle.components.name.desert_pyramid": "沙漠神殿結構", + "minihud.config.structure_toggle.components.comment.desert_pyramid": "沙漠神殿結構顏色", + "minihud.config.structure_toggle.components.prettyName.desert_pyramid": "沙漠神殿結構", + "minihud.config.structure_toggle.name.end_city": "終界城", + "minihud.config.structure_toggle.comment.end_city": "切換終界城結構邊框渲染", + "minihud.config.structure_toggle.prettyName.end_city": "終界城", + "minihud.config.structure_toggle.full_box.name.end_city": "終界城主體", + "minihud.config.structure_toggle.full_box.comment.end_city": "終界城主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.end_city": "終界城整體邊框", + "minihud.config.structure_toggle.components.name.end_city": "終界城結構", + "minihud.config.structure_toggle.components.comment.end_city": "終界城結構顏色", + "minihud.config.structure_toggle.components.prettyName.end_city": "終界城結構", + "minihud.config.structure_toggle.name.igloo": "雪屋", + "minihud.config.structure_toggle.comment.igloo": "切換雪屋結構邊框渲染", + "minihud.config.structure_toggle.prettyName.igloo": "雪屋結構", + "minihud.config.structure_toggle.full_box.name.igloo": "雪屋主體", + "minihud.config.structure_toggle.full_box.comment.igloo": "雪屋主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.igloo": "雪屋結構整體邊框", + "minihud.config.structure_toggle.components.name.igloo": "雪屋結構", + "minihud.config.structure_toggle.components.comment.igloo": "雪屋結構顏色", + "minihud.config.structure_toggle.components.prettyName.igloo": "雪屋結構細節", + "minihud.config.structure_toggle.name.jungle_pyramid": "叢林神廟", + "minihud.config.structure_toggle.comment.jungle_pyramid": "切換叢林神廟結構邊框渲染", + "minihud.config.structure_toggle.prettyName.jungle_pyramid": "叢林神廟", + "minihud.config.structure_toggle.full_box.name.jungle_pyramid": "叢林神廟主體", + "minihud.config.structure_toggle.full_box.comment.jungle_pyramid": "叢林神廟主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.jungle_pyramid": "叢林神廟整體邊框", + "minihud.config.structure_toggle.components.name.jungle_pyramid": "叢林神廟結構", + "minihud.config.structure_toggle.components.comment.jungle_pyramid": "叢林神廟結構顏色", + "minihud.config.structure_toggle.components.prettyName.jungle_pyramid": "叢林神廟結構", + "minihud.config.structure_toggle.name.mansion": "林地府邸", + "minihud.config.structure_toggle.comment.mansion": "切換林地府邸結構邊框渲染", + "minihud.config.structure_toggle.prettyName.mansion": "林地府邸結構", + "minihud.config.structure_toggle.full_box.name.mansion": "林地府邸主體", + "minihud.config.structure_toggle.full_box.comment.mansion": "林地府邸主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.mansion": "林地府邸整體邊框", + "minihud.config.structure_toggle.components.name.mansion": "林地府邸結構", + "minihud.config.structure_toggle.components.comment.mansion": "林地府邸結構顏色", + "minihud.config.structure_toggle.components.prettyName.mansion": "林地府邸結構細節", + "minihud.config.structure_toggle.name.mineshaft": "廢棄礦井", + "minihud.config.structure_toggle.comment.mineshaft": "切換廢棄礦井結構邊框渲染", + "minihud.config.structure_toggle.prettyName.mineshaft": "廢棄礦井結構", + "minihud.config.structure_toggle.full_box.name.mineshaft": "廢棄礦井主體", + "minihud.config.structure_toggle.full_box.comment.mineshaft": "廢棄礦井主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.mineshaft": "廢棄礦井整體邊框", + "minihud.config.structure_toggle.components.name.mineshaft": "廢棄礦井結構", + "minihud.config.structure_toggle.components.comment.mineshaft": "廢棄礦井結構顏色", + "minihud.config.structure_toggle.components.prettyName.mineshaft": "廢棄礦井結構細節", + "minihud.config.structure_toggle.name.fortress": "地獄要塞", + "minihud.config.structure_toggle.comment.fortress": "切換地獄要塞結構邊框渲染", + "minihud.config.structure_toggle.prettyName.fortress": "地獄要塞", + "minihud.config.structure_toggle.full_box.name.fortress": "地獄要塞主體", + "minihud.config.structure_toggle.full_box.comment.fortress": "地獄要塞主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.fortress": "下屆要塞整體邊框", + "minihud.config.structure_toggle.components.name.fortress": "地獄要塞結構", + "minihud.config.structure_toggle.components.comment.fortress": "地獄要塞結構顏色", + "minihud.config.structure_toggle.components.prettyName.fortress": "地獄要塞結構", + "minihud.config.structure_toggle.name.nether_fossil": "地獄化石", + "minihud.config.structure_toggle.comment.nether_fossil": "切換地獄化石結構邊框渲染", + "minihud.config.structure_toggle.prettyName.nether_fossil": "地獄化石", + "minihud.config.structure_toggle.full_box.name.nether_fossil": "地獄化石主體", + "minihud.config.structure_toggle.full_box.comment.nether_fossil": "地獄化石主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.nether_fossil": "下屆化石整體邊框", + "minihud.config.structure_toggle.components.name.nether_fossil": "地獄化石結構", + "minihud.config.structure_toggle.components.comment.nether_fossil": "地獄化石結構顏色", + "minihud.config.structure_toggle.components.prettyName.nether_fossil": "地獄化石結構", + "minihud.config.structure_toggle.name.monument": "海底神殿", + "minihud.config.structure_toggle.comment.monument": "切換海底神殿結構邊框渲染", + "minihud.config.structure_toggle.prettyName.monument": "海底神殿", + "minihud.config.structure_toggle.full_box.name.monument": "海底神殿主體", + "minihud.config.structure_toggle.full_box.comment.monument": "海底神殿主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.monument": "海底神殿整體邊框", + "minihud.config.structure_toggle.components.name.monument": "海底神殿結構", + "minihud.config.structure_toggle.components.comment.monument": "海底神殿結構顏色", + "minihud.config.structure_toggle.components.prettyName.monument": "海底神殿結構", + "minihud.config.structure_toggle.name.ocean_ruin": "海底廢墟", + "minihud.config.structure_toggle.comment.ocean_ruin": "切換海底廢墟結構邊框渲染", + "minihud.config.structure_toggle.prettyName.ocean_ruin": "海底廢墟", + "minihud.config.structure_toggle.full_box.name.ocean_ruin": "海底廢墟主體", + "minihud.config.structure_toggle.full_box.comment.ocean_ruin": "海底廢墟主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.ocean_ruin": "海底廢墟整體邊框", + "minihud.config.structure_toggle.components.name.ocean_ruin": "海底廢墟結構", + "minihud.config.structure_toggle.components.comment.ocean_ruin": "海底廢墟結構顏色", + "minihud.config.structure_toggle.components.prettyName.ocean_ruin": "海底廢墟結構", + "minihud.config.structure_toggle.name.pillager_outpost": "掠奪者前哨站", + "minihud.config.structure_toggle.comment.pillager_outpost": "切換掠奪者前哨站結構邊框渲染", + "minihud.config.structure_toggle.prettyName.pillager_outpost": "掠奪者前哨站", + "minihud.config.structure_toggle.full_box.name.pillager_outpost": "掠奪者前哨站主體", + "minihud.config.structure_toggle.full_box.comment.pillager_outpost": "掠奪者前哨站主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.pillager_outpost": "掠奪者前哨站整體邊框", + "minihud.config.structure_toggle.components.name.pillager_outpost": "掠奪者前哨站結構", + "minihud.config.structure_toggle.components.comment.pillager_outpost": "掠奪者前哨站結構顏色", + "minihud.config.structure_toggle.components.prettyName.pillager_outpost": "掠奪者前哨站結構", + "minihud.config.structure_toggle.name.ruined_portal": "廢棄傳送門", + "minihud.config.structure_toggle.comment.ruined_portal": "切換廢棄傳送門結構邊框渲染", + "minihud.config.structure_toggle.prettyName.ruined_portal": "廢棄傳送門", + "minihud.config.structure_toggle.full_box.name.ruined_portal": "廢棄傳送門主體", + "minihud.config.structure_toggle.full_box.comment.ruined_portal": "廢棄傳送門主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.ruined_portal": "廢棄傳送門整體邊框", + "minihud.config.structure_toggle.components.name.ruined_portal": "廢棄傳送門結構", + "minihud.config.structure_toggle.components.comment.ruined_portal": "廢棄傳送門結構顏色", + "minihud.config.structure_toggle.components.prettyName.ruined_portal": "廢棄傳送門結構", + "minihud.config.structure_toggle.name.shipwreck": "沉船", + "minihud.config.structure_toggle.comment.shipwreck": "切換沉船結構邊框渲染", + "minihud.config.structure_toggle.prettyName.shipwreck": "沉船", + "minihud.config.structure_toggle.full_box.name.shipwreck": "沉船主體", + "minihud.config.structure_toggle.full_box.comment.shipwreck": "沉船主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.shipwreck": "沉船整體邊框", + "minihud.config.structure_toggle.components.name.shipwreck": "沉船結構", + "minihud.config.structure_toggle.components.comment.shipwreck": "沉船結構顏色", + "minihud.config.structure_toggle.components.prettyName.shipwreck": "沉船結構", + "minihud.config.structure_toggle.name.stronghold": "要塞", + "minihud.config.structure_toggle.comment.stronghold": "切換要塞結構邊框渲染", + "minihud.config.structure_toggle.prettyName.stronghold": "要塞", + "minihud.config.structure_toggle.full_box.name.stronghold": "要塞主體", + "minihud.config.structure_toggle.full_box.comment.stronghold": "要塞主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.stronghold": "要塞整體邊框", + "minihud.config.structure_toggle.components.name.stronghold": "要塞結構", + "minihud.config.structure_toggle.components.comment.stronghold": "要塞結構顏色", + "minihud.config.structure_toggle.components.prettyName.stronghold": "要塞結構", + "minihud.config.structure_toggle.name.trial_chambers": "試煉密室", + "minihud.config.structure_toggle.comment.trial_chambers": "切換試煉密室結構邊框渲染", + "minihud.config.structure_toggle.prettyName.trial_chambers": "試煉密室", + "minihud.config.structure_toggle.full_box.name.trial_chambers": "試煉密室主體", + "minihud.config.structure_toggle.full_box.comment.trial_chambers": "試煉密室主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.trial_chambers": "試煉密室整體邊框", + "minihud.config.structure_toggle.components.name.trial_chambers": "試煉密室結構", + "minihud.config.structure_toggle.components.comment.trial_chambers": "試煉密室結構顏色", + "minihud.config.structure_toggle.components.prettyName.trial_chambers": "試煉密室結構", + "minihud.config.structure_toggle.name.village": "村莊", + "minihud.config.structure_toggle.comment.village": "切換村莊結構邊界框渲染\n注意:這是村莊的世界生成結構\n不適用於刷鐵機等生電結構", + "minihud.config.structure_toggle.prettyName.village": "村莊", + "minihud.config.structure_toggle.full_box.name.village": "村莊主體", + "minihud.config.structure_toggle.full_box.comment.village": "村莊主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.village": "村莊整體邊框", + "minihud.config.structure_toggle.components.name.village": "村莊結構", + "minihud.config.structure_toggle.components.comment.village": "村莊結構顏色", + "minihud.config.structure_toggle.components.prettyName.village": "村莊結構", + "minihud.config.structure_toggle.name.swamp_hut": "沼澤小屋", + "minihud.config.structure_toggle.comment.swamp_hut": "切換沼澤小屋結構邊框渲染", + "minihud.config.structure_toggle.prettyName.swamp_hut": "沼澤小屋", + "minihud.config.structure_toggle.full_box.name.swamp_hut": "沼澤小屋主體", + "minihud.config.structure_toggle.full_box.comment.swamp_hut": "沼澤小屋主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.swamp_hut": "沼澤小屋整體邊框", + "minihud.config.structure_toggle.components.name.swamp_hut": "沼澤小屋結構", + "minihud.config.structure_toggle.components.comment.swamp_hut": "沼澤小屋結構顏色", + "minihud.config.structure_toggle.components.prettyName.swamp_hut": "沼澤小屋結構", + "minihud.config.structure_toggle.name.trail_ruins": "古蹟廢墟", + "minihud.config.structure_toggle.comment.trail_ruins": "切換古蹟廢墟結構邊框渲染", + "minihud.config.structure_toggle.prettyName.trail_ruins": "古蹟廢墟", + "minihud.config.structure_toggle.full_box.name.trail_ruins": "古蹟廢墟主體", + "minihud.config.structure_toggle.full_box.comment.trail_ruins": "古蹟廢墟主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.trail_ruins": "古蹟廢墟整體邊框", + "minihud.config.structure_toggle.components.name.trail_ruins": "古蹟廢墟結構", + "minihud.config.structure_toggle.components.comment.trail_ruins": "古蹟廢墟結構顏色", + "minihud.config.structure_toggle.components.prettyName.trail_ruins": "古蹟廢墟結構", + "minihud.config.structure_toggle.name.unknown": "未知結構", + "minihud.config.structure_toggle.comment.unknown": "切換未知結構邊框渲染", + "minihud.config.structure_toggle.prettyName.unknown": "未知結構", + "minihud.config.structure_toggle.full_box.name.unknown": "未知主體", + "minihud.config.structure_toggle.full_box.comment.unknown": "未知主體顏色", + "minihud.config.structure_toggle.full_box.prettyName.unknown": "未知結構整體邊框", + "minihud.config.structure_toggle.components.name.unknown": "未知結構", + "minihud.config.structure_toggle.components.comment.unknown": "未知結構顏色", + "minihud.config.structure_toggle.components.prettyName.unknown": "未知結構細節", + "minihud.gui.button.config_gui.colors": "顏色", + "minihud.gui.button.config_gui.generic": "通用", + "minihud.gui.button.config_gui.info_lines": "資訊", + "minihud.gui.button.config_gui.renderers": "渲染器", + "minihud.gui.button.config_gui.shapes": "形狀", + "minihud.gui.button.config_gui.structures": "結構", + "minihud.gui.button.add_shape": "新增形狀", + "minihud.gui.button.configure": "設定", + "minihud.gui.button.remove": "刪除", + "minihud.gui.button.shape_entry.enabled": "啟用: %s", + "minihud.gui.button.shape_renderer.spawn_sphere.toggle_use_quadrants": "使用角象限生成:%s", + "minihud.gui.button.shape_renderer_toggle": "形狀渲染器: %s", + "minihud.gui.button.shape_renderer.toggle_combine_quads": "合併顯示:%s", + "minihud.gui.button.hover.shape_renderer.spawn_sphere.toggle_use_quadrants": "§7角象限生成基本上是在由中心和邊緣距離定義的\n§7矩形區域的四角上生成了 4 個獨立的球體。\n§7角象限生成是舊的生成方式,此時如果半徑增加\n§7到一定數量,它就會變得離譜(特別是在基點)。\n§7新的生成方式將不再使用角象限生成,\n§7而是「在邊緣滑動生成球體」來建立最終的形狀。", + "minihud.gui.label.center_colon": "中心:", + "minihud.gui.label.color": "顏色:", + "minihud.gui.label.display_name_colon": "顯示名稱:", + "minihud.gui.label.height_colon": "高度:", + "minihud.gui.label.margin_colon": "邊距:", + "minihud.gui.label.radius_colon": "半徑:", + "minihud.gui.hover.shape.block_snap": "§7方塊對齊:§b%s", + "minihud.gui.hover.shape.box.box_side": "§7渲染框架的 %s 面", + "minihud.gui.hover.shape.center_value": "§7中心點:x: §9%s§7, y: §9%s§7, z: §9%s", + "minihud.gui.hover.shape.circle.main_axis_value": "§7軸:§b%s", + "minihud.gui.hover.shape.effective_center_value": "§7有效中心點:x: §9%s§7, y: §9%s§7, z: §9%s", + "minihud.gui.hover.shape.height_value": "§7高度:§6%s", + "minihud.gui.hover.shape.margin_value": "§7邊距:§6%s", + "minihud.gui.hover.shape.radius_value": "§7半徑:§6%s", + "minihud.gui.hover.shape.type_value": "§7型別:§b%s", + "minihud.gui.label.shape.block_snap": "方塊對齊:%s", + "minihud.gui.label.shape.box.corner_1": "角 1", + "minihud.gui.label.shape.box.corner_2": "角 2", + "minihud.gui.label.shape.box.grid_enabled": "啟用網格:%s", + "minihud.gui.label.shape.box.max_corner": "§7最大值:x: §9%s§7, y: §9%s§7, z: §9%s", + "minihud.gui.label.shape.box.maximum_coord": "最大值", + "minihud.gui.label.shape.box.min_corner": "§7最小值:x: §9%s§7, y: §9%s§7, z: §9%s", + "minihud.gui.label.shape.box.minimum_coord": "最小值", + "minihud.gui.label.shape.box.grid_end_offset": "網格終點偏移值", + "minihud.gui.label.shape.box.grid_size": "網格大小", + "minihud.gui.label.shape.box.grid_start_offset": "網格起點偏移值", + "minihud.gui.label.shape.circle.main_axis_colon": "軸向:", + "minihud.gui.label.shape.line.start": "§7位置 1: x: §9%s§7, y: §9%s§7, z: §9%s", + "minihud.gui.label.shape.line.end": "§7位置 2: x: §9%s§7, y: §9%s§7, z: §9%s", + "minihud.gui.label.shape.render_type_colon": "渲染型別:", + "minihud.gui.name.box.box_side.down": "下方", + "minihud.gui.name.box.box_side.up": "上方", + "minihud.gui.name.box.box_side.north": "北面", + "minihud.gui.name.box.box_side.south": "南面", + "minihud.gui.name.box.box_side.west": "西面", + "minihud.gui.name.box.box_side.east": "東面", + "minihud.gui.title.configs": "MiniHUD 設定 - %s", + "minihud.gui.title.shape_editor": "形狀編輯 (%s)", + "minihud.gui.title.shape_manager": "形狀管理", + "minihud.label.axolotl_tooltip.label": "§7品種: ", + "minihud.label.axolotl_tooltip.value": "%s [%s]", + "minihud.label.bee_tooltip.count": "§7包含 §b%s§7 隻蜜蜂", + "minihud.label.bee_tooltip.count_babies": "§7包含 §b%s§7 隻蜜蜂,(§b%s§7 隻幼蜂)", + "minihud.label.bee_tooltip.name": "§7- %s", + "minihud.label.honey_info.level": "§7蜜蜂等級 §b%s§7/5", + "minihud.label.blockgridmode.all": "全部", + "minihud.label.blockgridmode.non_air": "非空氣", + "minihud.label.blockgridmode.adjacent": "相鄰非空氣方塊", + "minihud.label.light_level_marker_mode.cross": "十字", + "minihud.label.light_level_marker_mode.none": "無", + "minihud.label.light_level_marker_mode.square": "正方形", + "minihud.label.light_level_number_mode.none": "無", + "minihud.label.light_level_number_mode.block": "方塊", + "minihud.label.light_level_number_mode.both": "兩者", + "minihud.label.light_level_number_mode.sky": "天空", + "minihud.label.light_level_render_condition.always": "總是", + "minihud.label.light_level_render_condition.dim": "昏暗", + "minihud.label.light_level_render_condition.never": "從不", + "minihud.label.light_level_render_condition.safe": "安全", + "minihud.label.light_level_render_condition.spawnable": "可生成", + "minihud.label.shape_render_type.full_block": "完整方塊", + "minihud.label.shape_render_type.inner_edge": "內部邊緣", + "minihud.label.shape_render_type.outer_edge": "外部邊緣", + "minihud.label.shapes.adjustable_spawn_sphere": "可調節生成球體", + "minihud.label.shapes.box": "盒", + "minihud.label.shapes.can_spawn_sphere": "可刷怪範圍球體(> 24)", + "minihud.label.shapes.can_despawn_sphere": "怪物可能消失範圍球體(> 32)", + "minihud.label.shapes.circle": "圓環/圓柱", + "minihud.label.shapes.despawn_sphere": "怪物強制卸載範圍球體(> 128)", + "minihud.label.shapes.block_line": "線(基於方塊)", + "minihud.label.shapes.sphere_blocky": "球體(基於方塊)", + "minihud.hotkeys.category.generic_hotkeys": "通用快速鍵", + "minihud.hotkeys.category.info_toggle_hotkeys": "資訊開關快速鍵", + "minihud.hotkeys.category.renderer_toggle_hotkeys": "渲染器開關快速鍵", + "minihud.hotkeys.category.structure_toggle_hotkeys": "結構渲染開關快速鍵", + "minihud.message.toggled_debug_mode.collisions": "碰撞箱除錯已切換為 %s", + "minihud.message.toggled_debug_mode.height_map": "已切換高度圖除錯渲染為 %s", + "minihud.message.toggled_debug_mode.neighbor_updates": "方塊更新除錯已切換為 %s", + "minihud.message.toggled_debug_mode.pathfinding": "尋路除錯已切換為 %s", + "minihud.message.toggled_debug_mode.solid_faces": "方塊表面除錯已切換為 %s", + "minihud.message.toggled_debug_mode.water": "水體除錯渲染已切換為 %s", + "minihud.message.toggled_using_center_position": "%s 切換為 %s,使用中心位置 %s", + "minihud.message.toggled_using_position": "%s 切換為 %s,使用位置 %s", + "minihud.message.toggled_using_world_spawn": "%s 切換為 %s,使用世界出生點 %s", + "minihud.message.toggled_using_player_spawn": "%s 切換為 %s,使用模擬距離 %s", + "minihud.message.error.invalid_dropped_chunks_hash_size": "無法解析來自聊天的區塊雜湊集大小", + "minihud.message.error.invalid_seed": "無法從聊天框中解析世界種子", + "minihud.message.error.invalid_spawn_chunk_radius": "無法解析聊天中的生成區塊半徑 (0 < 32)", + "minihud.message.error.shapes.select_shape_from_dropdown": "從下拉選單中選擇要建立的形狀型別", + "minihud.message.distance_reference_point_set": "將距離參考點設定為 %s", + "minihud.message.no_seed": "MiniHUD: 世界種子未知", + "minihud.message.seed_is": "MiniHUD 中的世界種子當前設定為 '%s'", + "minihud.message.seed_set": "MiniHUD: 將世界種子設定為 '%s'", + "minihud.message.spawn_set": "MiniHUD: 將世界生成點設定為 %s", + "minihud.message.no_spawn_chunk_radius": "MiniHUD: 生成區塊半徑未知 (預設值為 2)", + "minihud.message.spawn_chunk_radius_is": "MiniHUD 當前的生成區塊半徑設定為 '%s'", + "minihud.message.spawn_chunk_radius_set": "MiniHUD: 將生成區塊半徑設定為 %s", + "minihud.info_line.invalid_value": "無效", + "minihud.info_line.remaining": "剩餘", + "minihud.info_line.fps": "幀數 %d", + "minihud.info_line.memory_usage": "記憶體:% 2d%% %03d/%03dMB | 已分配:% 2d%% %03dMB", + "minihud.info_line.time.exception": "日期格式化失敗 - 格式化字串可能無效", + "minihud.info_line.time_real": "NOT USED", + "minihud.info_line.time_world": "世界時間:%5d - 總計:%d", + "minihud.info_line.time_world_formatted": "NOT USED", + "minihud.info_line.time_world_formatted.moon_0": "滿月", + "minihud.info_line.time_world_formatted.moon_1": "虧凸月", + "minihud.info_line.time_world_formatted.moon_2": "上弦月", + "minihud.info_line.time_world_formatted.moon_3": "殘月", + "minihud.info_line.time_world_formatted.moon_4": "新月", + "minihud.info_line.time_world_formatted.moon_5": "蛾眉月", + "minihud.info_line.time_world_formatted.moon_6": "上弦月", + "minihud.info_line.time_world_formatted.moon_7": "盈凸月", + "minihud.info_line.time_day_modulo": "白天時間 %% %d: %5d", + "minihud.info_line.time_total_modulo": "總時間 %% %d: %5d", + "minihud.info_line.server_tps": "伺服器 TPS: %s%.1f%s MSPT: %s%.1f%s", + "minihud.info_line.server_tps.est": "伺服器 TPS: %s%.1f%s (MSPT [估計]: %s%.1f%s)", + "minihud.info_line.server_tps.invalid": "伺服器 TPS: <無可用資料>", + "minihud.info_line.servux": "Servux Version: %s", + "minihud.info_line.servux.not_connected": "Servux Version: §cnot_connected§r", + "minihud.info_line.servux.entity_sync": "EntitySync: cB: %02d, pB: %02d, cE: %02d, pE: %02d", + "minihud.info_line.servux.structures": "Structures: sC: %02d, sR: %02d (%s), wS: %s", + "minihud.info_line.servux.structures_integrated": "Structures (Integrated Server): sC: %02d, sR: %02d (%s), wS: %s", + "minihud.info_line.weather": "天氣: %s%s", + "minihud.info_line.weather.thundering": "雷暴", + "minihud.info_line.weather.raining": "降雨", + "minihud.info_line.weather.clear": "晴天", + "minihud.info_line.mobcap.data": "生物上限:Ho: %s Pa: %s Am: %s, Ax: %s, UWC: %s, WC: %s, WA: %s, Mi: %s", + "minihud.info_line.mobcap.no_data": "生物上限:<無可用資料>", + "minihud.info_line.mobcap.cap.ambient.full": "§7§l%s§r§7 / %s§r", + "minihud.info_line.mobcap.cap.ambient.nonfull": "§7%s / %s§r", + "minihud.info_line.mobcap.cap.axolotls.full": "§d§l%s§r§7 / %s§r", + "minihud.info_line.mobcap.cap.axolotls.nonfull": "§d%s / %s§r", + "minihud.info_line.mobcap.cap.creature.full": "§a§l%s§r§a / %s§r", + "minihud.info_line.mobcap.cap.creature.nonfull": "§a%s / %s§r", + "minihud.info_line.mobcap.cap.misc.full": "§f§l%s§r§b / %s§r", + "minihud.info_line.mobcap.cap.misc.nonfull": "§f%s / %s§r", + "minihud.info_line.mobcap.cap.monster.full": "§c§l%s§r§c / %s§r", + "minihud.info_line.mobcap.cap.monster.nonfull": "§c%s / %s§r", + "minihud.info_line.mobcap.cap.underground_water_creature.full": "§9§l%s§r§b / %s§r", + "minihud.info_line.mobcap.cap.underground_water_creature.nonfull": "§9%s / %s§r", + "minihud.info_line.mobcap.cap.water_ambient.full": "§9§l%s§r§b / %s§r", + "minihud.info_line.mobcap.cap.water_ambient.nonfull": "§9%s / %s§r", + "minihud.info_line.mobcap.cap.water_creature.full": "§b§l%s§r§b / %s§r", + "minihud.info_line.mobcap.cap.water_creature.nonfull": "§b%s / %s§r", + "minihud.info_line.ping": "延遲:%d ms", + "minihud.info_line.coordinates.exception": "錯誤的座標格式字串!", + "minihud.info_line.coordinates.format": "XYZ: %.2f / %.4f / %.2f", + "minihud.info_line.coordinates_scaled.overworld": "主世界: ", + "minihud.info_line.coordinates_scaled.nether": "地獄: ", + "minihud.info_line.dimension": "維度: ", + "minihud.info_line.block_pos.exception": "錯誤的方塊位置格式字串!", + "minihud.info_line.chunk_pos": "子區塊:%d, %d, %d", + "minihud.info_line.region_file": "區域:r.%d.%d", + "minihud.info_line.block_in_chunk": "方塊:%d, %d, %d 位於子區塊:%d, %d, %d", + "minihud.info_line.block_break_speed": "破壞速度:%.2f", + "minihud.info_line.sprinting": "§6奔跑中", + "minihud.info_line.distance": "距離:%.2f (x: %.2f y: %.2f z: %.2f) [x: %.2f y: %.2f z: %.2f]", + "minihud.info_line.facing": "朝向:%s(%s)", + "minihud.info_line.facing.north.name": "北", + "minihud.info_line.facing.south.name": "南", + "minihud.info_line.facing.west.name": "西", + "minihud.info_line.facing.east.name": "東", + "minihud.info_line.facing.north": "Z軸負方向", + "minihud.info_line.facing.south": "Z軸正方向", + "minihud.info_line.facing.west": "X軸負方向", + "minihud.info_line.facing.east": "X軸正方向", + "minihud.info_line.light_level": "方塊亮度:%d", + "minihud.info_line.bee_count": "蜜蜂:§b%d", + "minihud.info_line.bee_count.flower_pos": "蜜蜂:§b%d§r [花 %s]", + "minihud.info_line.furnace_xp": "熔爐內經驗:§b%d", + "minihud.info_line.honey_level": "蜂蜜:§b%d", + "minihud.info_line.horse_speed": "%s 速度:%.3f 米/秒", + "minihud.info_line.horse_jump": "%s 跳躍高度:%.3f 米", + "minihud.info_line.rotation_yaw": "方向角: %.1f", + "minihud.info_line.rotation_pitch": "俯仰角: %.1f", + "minihud.info_line.speed": "速度:%.3f 米/秒", + "minihud.info_line.speed_hv": "速度:xz: %.3f y: %.3f 米/秒", + "minihud.info_line.speed_axis": "速度:x: %.3f y: %.3f z: %.3f 米/秒", + "minihud.info_line.chunk_sections": "C: %d", + "minihud.info_line.chunk_updates": "TODO", + "minihud.info_line.loaded_chunks_count.server": "伺服器:%d / %d - 客戶端:%s", + "minihud.info_line.panda_gene.main_gene": "主要基因:%s(%s)", + "minihud.info_line.panda_gene.hidden_gene": "隱藏基因:%s(%s)", + "minihud.info_line.panda_gene.dominant_gene": "顯性", + "minihud.info_line.panda_gene.recessive_gene": "隱性", + "minihud.info_line.panda_gene.gene.normal": "普通", + "minihud.info_line.panda_gene.gene.lazy": "懶惰", + "minihud.info_line.panda_gene.gene.worried": "憂鬱", + "minihud.info_line.panda_gene.gene.playful": "頑皮", + "minihud.info_line.panda_gene.gene.brown": "棕色", + "minihud.info_line.panda_gene.gene.weak": "體弱", + "minihud.info_line.panda_gene.gene.aggressive": "好鬥", + "minihud.info_line.particle_count": "P: %s", + "minihud.info_line.difficulty": "區域難度:%.2f // %.2f (%d天)", + "minihud.info_line.biome": "生態域:%s", + "minihud.info_line.biome_reg_name": "生態域註冊名:%s", + "minihud.info_line.tile_entities": "Client world TE - L: ?, T: ? - TODO 1.17", + "minihud.info_line.entities_client_world": "實體數量 - 客戶端:%d", + "minihud.info_line.entities_client_world.server": "實體數量 - 客戶端:%d - 伺服器端:%d", + "minihud.info_line.player_experience": "Experience: %d / %.2f%% (total %d)", + "minihud.info_line.slime_chunk": "史萊姆區塊:%s", + "minihud.info_line.slime_chunk.yes": "§a是§r", + "minihud.info_line.slime_chunk.no": "§c否§r", + "minihud.info_line.slime_chunk.no_seed": "<未設定世界種子>", + "minihud.info_line.looking_at_entity": "實體:%s", + "minihud.info_line.looking_at_entity.livingentity": "實體:%s - 生命值:%.1f / %.1f", + "minihud.info_line.looking_at_entity.owner": "主人", + "minihud.info_line.looking_at_effects": "狀態效果:%s / %s%s %s", + "minihud.info_line.looking_at_effects.amplifier": "x%d / ", + "minihud.info_line.looking_at_effects.infinite": "持續時間無限", + "minihud.info_line.looking_at_player_exp": "Target Experience: %d / %.2f%% (total %d)", + "minihud.info_line.entity_variant.axolotl": "Axolotl Color: §b%s§r", + "minihud.info_line.entity_variant.cat": "Cat Variant: §b%s§r (%s collar)", + "minihud.info_line.entity_variant.frog": "Frog Variant: §b%s§r", + "minihud.info_line.entity_variant.horse": "Horse Variant: §b%s / %s§r", + "minihud.info_line.entity_variant.parrot": "Parrot Variant: §b%s§r", + "minihud.info_line.entity_variant.sheep": "Sheep Color: §b%s§r", + "minihud.info_line.entity_variant.tropical_fish": "Tropical Fish Variant: §b%s§r", + "minihud.info_line.entity_variant.wolf": "Wolf Variant: §b%s§r (%s collar)", + "minihud.info_line.zombie_conversion": "殭屍村民治療剩餘時間:%s", + "minihud.info_line.entity_reg_name": "實體註冊名:%s", + "minihud.info_line.looking_at_block": "注視的方塊:%d, %d, %d", + "minihud.info_line.looking_at_block_chunk": "方塊:%d, %d, %d 在子區塊:%d, %d, %d" } \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index e31c0f504..13c2fd556 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -34,7 +34,7 @@ ], "depends": { - "minecraft": ">=1.21 <=1.21.1", - "malilib": ">=0.21.1-sakura.1" + "minecraft": "1.21.2", + "malilib": ">=0.22.0-sakura.1" } }