From 50856266d8e036bc7000433f48936b982eeb0b11 Mon Sep 17 00:00:00 2001 From: 3944Realms Date: Sat, 14 Mar 2026 22:21:18 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0Javadoc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/top/r3944realms/lib39/Lib39.java | 23 + .../lib39/base/command/Lib39HelpCommand.java | 2 + .../lib39/client/shader/Lib39Shaders.java | 17 +- .../core/command/ICommandHelpManager.java | 2 + .../lib39/core/command/model/CommandNode.java | 7 + .../lib39/core/compat/CompatManager.java | 35 + .../lib39/core/compat/ICompat.java | 12 + .../lib39/core/sync/INBTSerializable.java | 15 + .../r3944realms/lib39/core/sync/IUpdate.java | 12 + .../lib39/core/sync/NBTEntitySyncData.java | 3 + .../lib39/core/sync/SyncData2Manager.java | 24 +- .../datagen/provider/LanguageProvider.java | 104 +- .../lib39/example/Lib39Example.java | 6 +- .../content/data/AbstractedTestSyncData.java | 41 + .../content/item/AbstractFabricItem.java | 19 + .../content/item/AbstractNeoForgeItem.java | 12 + .../lib39/example/content/item/ForgeItem.java | 5 +- .../minecraft/CreativeModeTabsAccessor.java | 83 ++ .../lib39/mixin/minecraft/ScreenAccessor.java | 8 + .../r3944realms/lib39/platform/Services.java | 17 +- .../platform/services/IHelpCommandHook.java | 10 + .../platform/services/IPlatformHelper.java | 15 + .../lib39/platform/services/IUtilHelper.java | 8 + .../lib39/util/GameProfileHelper.java | 37 + .../r3944realms/lib39/util/IClientOnly.java | 30 + .../r3944realms/lib39/util/IUniPosOwner.java | 25 +- .../util/block/BlockRegistryBuilder.java | 9 + .../lib39/util/villager/TradeBuilder.java | 2 +- .../top/r3944realms/lib39/Lib39Fabric.java | 5 +- .../core/event/FabricCommonEventHandler.java | 2 - .../register/FabricLib39BlockEntities.java | 1 - .../core/register/FabricLib39Blocks.java | 1 - .../lib39/core/register/FabricLib39Items.java | 1 - .../core/register/FabricLib39SoundEvents.java | 2 - .../core/sync/SyncData2LookupManager.java | 4 +- .../content/item/FabricFabricItem.java | 7 - .../core/register/FabricExLib39Items.java | 2 +- .../r3944realms/lib39/mixin/MixinEntity.java | 4 +- .../lib39/platform/FabricPlatformHelper.java | 2 +- .../lib39/core/compat/ForgeCompatManager.java | 5 +- .../register/ForgeLib39BlockEntities.java | 1 - .../lib39/core/register/ForgeLib39Blocks.java | 1 - .../lib39/core/register/ForgeLib39Items.java | 2 - .../core/register/ForgeLib39SoundEvents.java | 2 - .../lib39/core/sync/SyncData2CapManager.java | 4 +- .../example/compat/Lib39CompatManager.java | 1 - .../core/network/ExNetworkHandler.java | 1 - .../1de3d2ee724999f84a11b20b51c37030049be277 | 2 - .../2a65ee2815744be1ef1ffdae1c9a37f2a9cbe2ac | 2 - .../2dbf84d84cf6f7b7a95fea9038e192dbf226e5f5 | 5 - .../3473f48ad2b0675418886c7a50b38f1c5da41e76 | 2 - .../59eb3dbb5f86130e09b3c62d89b9525ee01cf52d | 2 - .../735031f3addf80804addae5e3f53249900116f1e | 2 - .../82018c5420b46ddbb7071e62df09fdecd98133e6 | 2 - .../9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e | 3 - .../bc76051cc963abe6835a2599f9f7cc4f1a1b0fb5 | 1 - .../c622617f6fabf890a00b9275cd5f643584a8a2c8 | 2 - .../assets/lib39/blockstates/doll.json | 64 - .../resources/assets/lib39/lang/en_us.json | 60 - .../resources/assets/lib39/lang/lzh.json | 60 - .../resources/assets/lib39/lang/zh_cn.json | 60 - .../resources/assets/lib39/lang/zh_tw.json | 60 - .../assets/lib39/models/item/doll.json | 3 - .../assets/lib39/models/item/fabric.json | 6 - .../assets/lib39/models/item/forge.json | 6 - .../assets/lib39/models/item/neoforge.json | 6 - .../resources/assets/lib39/sounds.json | 8 - .../lib39/advancements/recipes/misc/doll.json | 35 - .../data/lib39/loot_tables/blocks/doll.json | 21 - .../resources/data/lib39/recipes/doll.json | 15 - .../java/top/r3944realms/lib39/Lib39.java | 140 -- .../api/event/MinecraftSetUpServiceEvent.java | 31 - .../api/event/RegisterCommandHelpEvent.java | 100 -- .../api/event/SyncManagerRegisterEvent.java | 170 --- .../base/command/Lib39CommandHelpManager.java | 36 - .../lib39/base/command/Lib39HelpCommand.java | 404 ------ .../base/datagen/Lib39BaseDataGenEvent.java | 85 -- .../datagen/provider/Lib39BlockLootTable.java | 17 - .../provider/Lib39BlockModelProvider.java | 44 - .../provider/Lib39BlockStatesProvider.java | 74 - .../provider/Lib39ItemModelProvider.java | 123 -- .../datagen/provider/Lib39RecipeProvider.java | 36 - .../Lib39SoundDefinitionsProvider.java | 45 - .../base/datagen/value/Lib39LangKey.java | 874 ------------ .../client/gui/component/WheelWidget.java | 769 ---------- .../lib39/client/model/DollModel.java | 91 -- .../client/renderer/RadialMenuRenderer.java | 381 ----- .../block/DollBlockEntityRenderer.java | 55 - .../renderer/item/DollItemRenderer.java | 98 -- .../lib39/client/shader/Lib39Shaders.java | 73 - .../lib39/content/block/DollBlock.java | 241 ---- .../block/blockentity/DollBlockEntity.java | 98 -- .../content/block/property/DollPose.java | 28 - .../lib39/content/item/DollItem.java | 58 - .../content/register/Lib39BlockEntities.java | 37 - .../lib39/content/register/Lib39Blocks.java | 39 - .../lib39/content/register/Lib39Items.java | 34 - .../content/register/Lib39SoundEvents.java | 48 - .../core/command/ICommandHelpManager.java | 547 ------- .../lib39/core/command/IHelpCommand.java | 133 -- .../command/SimpleCommandHelpManager.java | 87 -- .../lib39/core/command/SimpleHelpCommand.java | 47 - .../lib39/core/command/model/CommandNode.java | 1266 ----------------- .../lib39/core/command/model/CommandPath.java | 127 -- .../lib39/core/command/model/Parameter.java | 78 - .../lib39/core/compat/CompatManager.java | 370 ----- .../lib39/core/compat/ICompat.java | 132 -- .../lib39/core/event/ClientEventHandler.java | 89 -- .../lib39/core/event/CommonEventHandler.java | 292 ---- .../lib39/core/event/ServerEventHandler.java | 50 - .../lib39/core/lang/ClassEncryptor.java | 92 -- .../lib39/core/lang/EncryptedClassLoader.java | 227 --- .../lib39/core/network/NetworkHandler.java | 73 - .../toClient/SyncNBTCapDataEntityS2CPack.java | 94 -- .../lib39/core/registry/LocaleRegistry.java | 78 - .../lib39/core/sync/CachedSyncManager.java | 74 - .../r3944realms/lib39/core/sync/IEntity.java | 13 - .../lib39/core/sync/ISyncData.java | 50 - .../lib39/core/sync/ISyncManager.java | 129 -- .../lib39/core/sync/NBTEntitySyncData.java | 59 - .../lib39/core/sync/SyncData2CapManager.java | 390 ----- .../lib39/core/sync/SyncData2Manager.java | 462 ------ .../provider/SimpleLanguageProvider.java | 104 -- .../provider/SimpleLootTableProvider.java | 42 - .../datagen/provider/SubProvidersWrapper.java | 60 - .../provider/subprovider/BlockLootTables.java | 385 ----- .../lib39/datagen/value/ILangKeyValue.java | 22 - .../value/ILangKeyValueCollection.java | 30 - .../lib39/datagen/value/ILocaleEntry.java | 22 - .../lib39/datagen/value/LangKeyValue.java | 617 -------- .../lib39/datagen/value/McLocale.java | 63 - .../lib39/datagen/value/ModPartEnum.java | 173 --- .../lib39/example/Lib39Example.java | 56 - .../example/client/screen/ForgeScreen.java | 127 -- .../lib39/example/compat/Lib39Compat.java | 58 - .../example/compat/Lib39CompatManager.java | 18 - .../capability/AbstractedTestSyncData.java | 207 --- .../capability/ExCapabilityHandler.java | 40 - .../capability/TestSyncCapProvider.java | 49 - .../content/capability/TestSyncData.java | 376 ----- .../example/content/item/FabricItem.java | 589 -------- .../lib39/example/content/item/ForgeItem.java | 40 - .../example/content/item/NeoForgeItem.java | 284 ---- .../core/event/ExClientEventHandler.java | 16 - .../core/event/ExCommonEventHandler.java | 122 -- .../core/event/ExServerEventHandler.java | 16 - .../core/network/ClientDataPacket.java | 69 - .../core/network/ExNetworkHandler.java | 37 - .../example/core/register/ExLib39Items.java | 62 - .../lib39/mixin/Lib39MixinPlugin.java | 57 - .../carryon/MixinCarriedObjectRender.java | 52 - .../lib39/mixin/init/MixinDedicateServer.java | 53 - .../lib39/mixin/init/MixinMinecraft.java | 77 - .../lib39/util/GameProfileHelper.java | 335 ----- .../util/block/BlockRegistryBuilder.java | 145 -- .../assets/lib39/models/block/base_doll.json | 50 - .../assets/lib39/shaders/core/ring.fsh | 49 - .../assets/lib39/shaders/core/ring.json | 44 - .../assets/lib39/shaders/core/selection.fsh | 23 - .../assets/lib39/shaders/core/selection.json | 45 - .../assets/lib39/sounds/duck_toy.ogg | Bin 13528 -> 0 bytes .../assets/lib39/textures/item/fabric.png | Bin 5867 -> 0 bytes .../assets/lib39/textures/item/forge.png | Bin 3622 -> 0 bytes .../assets/lib39/textures/item/neoforge.png | Bin 280 -> 0 bytes src/main/resources/lib39.mixins.json | 15 - src/main/resources/lib39_logo.png | Bin 664999 -> 0 bytes src/main/templates/META-INF/mods.toml | 88 -- src/main/templates/pack.mcmeta | 6 - .../lib39/CoordinateTransformTest.java | 414 ------ 169 files changed, 573 insertions(+), 14810 deletions(-) delete mode 100644 src/generated/resources/.cache/1de3d2ee724999f84a11b20b51c37030049be277 delete mode 100644 src/generated/resources/.cache/2a65ee2815744be1ef1ffdae1c9a37f2a9cbe2ac delete mode 100644 src/generated/resources/.cache/2dbf84d84cf6f7b7a95fea9038e192dbf226e5f5 delete mode 100644 src/generated/resources/.cache/3473f48ad2b0675418886c7a50b38f1c5da41e76 delete mode 100644 src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d delete mode 100644 src/generated/resources/.cache/735031f3addf80804addae5e3f53249900116f1e delete mode 100644 src/generated/resources/.cache/82018c5420b46ddbb7071e62df09fdecd98133e6 delete mode 100644 src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e delete mode 100644 src/generated/resources/.cache/bc76051cc963abe6835a2599f9f7cc4f1a1b0fb5 delete mode 100644 src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 delete mode 100644 src/generated/resources/assets/lib39/blockstates/doll.json delete mode 100644 src/generated/resources/assets/lib39/lang/en_us.json delete mode 100644 src/generated/resources/assets/lib39/lang/lzh.json delete mode 100644 src/generated/resources/assets/lib39/lang/zh_cn.json delete mode 100644 src/generated/resources/assets/lib39/lang/zh_tw.json delete mode 100644 src/generated/resources/assets/lib39/models/item/doll.json delete mode 100644 src/generated/resources/assets/lib39/models/item/fabric.json delete mode 100644 src/generated/resources/assets/lib39/models/item/forge.json delete mode 100644 src/generated/resources/assets/lib39/models/item/neoforge.json delete mode 100644 src/generated/resources/assets/lib39/sounds.json delete mode 100644 src/generated/resources/data/lib39/advancements/recipes/misc/doll.json delete mode 100644 src/generated/resources/data/lib39/loot_tables/blocks/doll.json delete mode 100644 src/generated/resources/data/lib39/recipes/doll.json delete mode 100644 src/main/java/top/r3944realms/lib39/Lib39.java delete mode 100644 src/main/java/top/r3944realms/lib39/api/event/MinecraftSetUpServiceEvent.java delete mode 100644 src/main/java/top/r3944realms/lib39/api/event/RegisterCommandHelpEvent.java delete mode 100644 src/main/java/top/r3944realms/lib39/api/event/SyncManagerRegisterEvent.java delete mode 100644 src/main/java/top/r3944realms/lib39/base/command/Lib39CommandHelpManager.java delete mode 100644 src/main/java/top/r3944realms/lib39/base/command/Lib39HelpCommand.java delete mode 100644 src/main/java/top/r3944realms/lib39/base/datagen/Lib39BaseDataGenEvent.java delete mode 100644 src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39BlockLootTable.java delete mode 100644 src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39BlockModelProvider.java delete mode 100644 src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39BlockStatesProvider.java delete mode 100644 src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39ItemModelProvider.java delete mode 100644 src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39RecipeProvider.java delete mode 100644 src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39SoundDefinitionsProvider.java delete mode 100644 src/main/java/top/r3944realms/lib39/base/datagen/value/Lib39LangKey.java delete mode 100644 src/main/java/top/r3944realms/lib39/client/gui/component/WheelWidget.java delete mode 100644 src/main/java/top/r3944realms/lib39/client/model/DollModel.java delete mode 100644 src/main/java/top/r3944realms/lib39/client/renderer/RadialMenuRenderer.java delete mode 100644 src/main/java/top/r3944realms/lib39/client/renderer/block/DollBlockEntityRenderer.java delete mode 100644 src/main/java/top/r3944realms/lib39/client/renderer/item/DollItemRenderer.java delete mode 100644 src/main/java/top/r3944realms/lib39/client/shader/Lib39Shaders.java delete mode 100644 src/main/java/top/r3944realms/lib39/content/block/DollBlock.java delete mode 100644 src/main/java/top/r3944realms/lib39/content/block/blockentity/DollBlockEntity.java delete mode 100644 src/main/java/top/r3944realms/lib39/content/block/property/DollPose.java delete mode 100644 src/main/java/top/r3944realms/lib39/content/item/DollItem.java delete mode 100644 src/main/java/top/r3944realms/lib39/content/register/Lib39BlockEntities.java delete mode 100644 src/main/java/top/r3944realms/lib39/content/register/Lib39Blocks.java delete mode 100644 src/main/java/top/r3944realms/lib39/content/register/Lib39Items.java delete mode 100644 src/main/java/top/r3944realms/lib39/content/register/Lib39SoundEvents.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/command/ICommandHelpManager.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/command/IHelpCommand.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/command/SimpleCommandHelpManager.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/command/SimpleHelpCommand.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/command/model/CommandNode.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/command/model/CommandPath.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/command/model/Parameter.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/compat/CompatManager.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/compat/ICompat.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/event/ClientEventHandler.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/event/CommonEventHandler.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/event/ServerEventHandler.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/lang/ClassEncryptor.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/lang/EncryptedClassLoader.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/network/NetworkHandler.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/network/toClient/SyncNBTCapDataEntityS2CPack.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/registry/LocaleRegistry.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/sync/CachedSyncManager.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/sync/IEntity.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/sync/ISyncData.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/sync/ISyncManager.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/sync/NBTEntitySyncData.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/sync/SyncData2CapManager.java delete mode 100644 src/main/java/top/r3944realms/lib39/core/sync/SyncData2Manager.java delete mode 100644 src/main/java/top/r3944realms/lib39/datagen/provider/SimpleLanguageProvider.java delete mode 100644 src/main/java/top/r3944realms/lib39/datagen/provider/SimpleLootTableProvider.java delete mode 100644 src/main/java/top/r3944realms/lib39/datagen/provider/SubProvidersWrapper.java delete mode 100644 src/main/java/top/r3944realms/lib39/datagen/provider/subprovider/BlockLootTables.java delete mode 100644 src/main/java/top/r3944realms/lib39/datagen/value/ILangKeyValue.java delete mode 100644 src/main/java/top/r3944realms/lib39/datagen/value/ILangKeyValueCollection.java delete mode 100644 src/main/java/top/r3944realms/lib39/datagen/value/ILocaleEntry.java delete mode 100644 src/main/java/top/r3944realms/lib39/datagen/value/LangKeyValue.java delete mode 100644 src/main/java/top/r3944realms/lib39/datagen/value/McLocale.java delete mode 100644 src/main/java/top/r3944realms/lib39/datagen/value/ModPartEnum.java delete mode 100644 src/main/java/top/r3944realms/lib39/example/Lib39Example.java delete mode 100644 src/main/java/top/r3944realms/lib39/example/client/screen/ForgeScreen.java delete mode 100644 src/main/java/top/r3944realms/lib39/example/compat/Lib39Compat.java delete mode 100644 src/main/java/top/r3944realms/lib39/example/compat/Lib39CompatManager.java delete mode 100644 src/main/java/top/r3944realms/lib39/example/content/capability/AbstractedTestSyncData.java delete mode 100644 src/main/java/top/r3944realms/lib39/example/content/capability/ExCapabilityHandler.java delete mode 100644 src/main/java/top/r3944realms/lib39/example/content/capability/TestSyncCapProvider.java delete mode 100644 src/main/java/top/r3944realms/lib39/example/content/capability/TestSyncData.java delete mode 100644 src/main/java/top/r3944realms/lib39/example/content/item/FabricItem.java delete mode 100644 src/main/java/top/r3944realms/lib39/example/content/item/ForgeItem.java delete mode 100644 src/main/java/top/r3944realms/lib39/example/content/item/NeoForgeItem.java delete mode 100644 src/main/java/top/r3944realms/lib39/example/core/event/ExClientEventHandler.java delete mode 100644 src/main/java/top/r3944realms/lib39/example/core/event/ExCommonEventHandler.java delete mode 100644 src/main/java/top/r3944realms/lib39/example/core/event/ExServerEventHandler.java delete mode 100644 src/main/java/top/r3944realms/lib39/example/core/network/ClientDataPacket.java delete mode 100644 src/main/java/top/r3944realms/lib39/example/core/network/ExNetworkHandler.java delete mode 100644 src/main/java/top/r3944realms/lib39/example/core/register/ExLib39Items.java delete mode 100644 src/main/java/top/r3944realms/lib39/mixin/Lib39MixinPlugin.java delete mode 100644 src/main/java/top/r3944realms/lib39/mixin/carryon/MixinCarriedObjectRender.java delete mode 100644 src/main/java/top/r3944realms/lib39/mixin/init/MixinDedicateServer.java delete mode 100644 src/main/java/top/r3944realms/lib39/mixin/init/MixinMinecraft.java delete mode 100644 src/main/java/top/r3944realms/lib39/util/GameProfileHelper.java delete mode 100644 src/main/java/top/r3944realms/lib39/util/block/BlockRegistryBuilder.java delete mode 100644 src/main/resources/assets/lib39/models/block/base_doll.json delete mode 100644 src/main/resources/assets/lib39/shaders/core/ring.fsh delete mode 100644 src/main/resources/assets/lib39/shaders/core/ring.json delete mode 100644 src/main/resources/assets/lib39/shaders/core/selection.fsh delete mode 100644 src/main/resources/assets/lib39/shaders/core/selection.json delete mode 100644 src/main/resources/assets/lib39/sounds/duck_toy.ogg delete mode 100644 src/main/resources/assets/lib39/textures/item/fabric.png delete mode 100644 src/main/resources/assets/lib39/textures/item/forge.png delete mode 100644 src/main/resources/assets/lib39/textures/item/neoforge.png delete mode 100644 src/main/resources/lib39.mixins.json delete mode 100644 src/main/resources/lib39_logo.png delete mode 100644 src/main/templates/META-INF/mods.toml delete mode 100644 src/main/templates/pack.mcmeta delete mode 100644 src/test/java/top/r3944realms/lib39/CoordinateTransformTest.java diff --git a/common/src/main/java/top/r3944realms/lib39/Lib39.java b/common/src/main/java/top/r3944realms/lib39/Lib39.java index 1002b8e..7342b49 100644 --- a/common/src/main/java/top/r3944realms/lib39/Lib39.java +++ b/common/src/main/java/top/r3944realms/lib39/Lib39.java @@ -8,14 +8,30 @@ import org.slf4j.LoggerFactory; import top.r3944realms.lib39.example.Lib39Example; import top.r3944realms.lib39.platform.Services; +/** + * The type Lib 39. + */ public class Lib39 { + /** + * The constant MOD_ID. + */ public static final String MOD_ID = "lib39"; + /** + * The constant MOD_NAME. + */ public static final String MOD_NAME = "3944Realms 's Lib Mod"; + /** + * The constant LOGGER. + */ public static final Logger LOGGER = LoggerFactory.getLogger(MOD_NAME); /** * The constant ENABLE_EXAMPLES_PROPERTY_KEY. */ public static final String ENABLE_EXAMPLES_PROPERTY_KEY = "lib39.enable_examples"; + + /** + * Initialize. + */ public static void initialize() { Lib39.LOGGER.info("[Lib39-Common] Lib39-Common start initialization."); if (shouldRegisterExamples()) { @@ -24,6 +40,7 @@ public class Lib39 { } Lib39.LOGGER.info("[Lib39-Common] Finished Lib39-Common!."); } + /** * Rl resource location. * @@ -58,6 +75,11 @@ public class Lib39 { return new ResourceLocation(path); } + /** + * Is client environment boolean. + * + * @return the boolean + */ public static boolean isClientEnvironment() { return Services.PLATFORM.isClientEnvironment(); } @@ -87,6 +109,7 @@ public class Lib39 { LOGGER.error("[Lib39-Common] Failed to demonstrate examples", e); } } + /** * The type Mod info. */ diff --git a/common/src/main/java/top/r3944realms/lib39/base/command/Lib39HelpCommand.java b/common/src/main/java/top/r3944realms/lib39/base/command/Lib39HelpCommand.java index 5b70d17..cbf4050 100644 --- a/common/src/main/java/top/r3944realms/lib39/base/command/Lib39HelpCommand.java +++ b/common/src/main/java/top/r3944realms/lib39/base/command/Lib39HelpCommand.java @@ -28,6 +28,8 @@ public class Lib39HelpCommand extends SimpleHelpCommand { /** * Instantiates a new Lib 39 help command. * + * @param dispatcher the dispatcher + * @param context the context */ public Lib39HelpCommand(CommandDispatcher dispatcher, CommandBuildContext context) { super(dispatcher, context); diff --git a/common/src/main/java/top/r3944realms/lib39/client/shader/Lib39Shaders.java b/common/src/main/java/top/r3944realms/lib39/client/shader/Lib39Shaders.java index 8630849..cf91d9e 100644 --- a/common/src/main/java/top/r3944realms/lib39/client/shader/Lib39Shaders.java +++ b/common/src/main/java/top/r3944realms/lib39/client/shader/Lib39Shaders.java @@ -1,13 +1,6 @@ package top.r3944realms.lib39.client.shader; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; import net.minecraft.client.renderer.ShaderInstance; -import net.minecraft.server.packs.resources.ResourceProvider; -import top.r3944realms.lib39.Lib39; - -import java.io.IOException; -import java.util.function.Consumer; -import java.util.function.Supplier; /** * The type Lib 39 shaders. @@ -36,10 +29,20 @@ public class Lib39Shaders { return selectionShader; } + /** + * Sets ring shader. + * + * @param ringShader the ring shader + */ public static void setRingShader(ShaderInstance ringShader) { Lib39Shaders.ringShader = ringShader; } + /** + * Sets selection shader. + * + * @param selectionShader the selection shader + */ public static void setSelectionShader(ShaderInstance selectionShader) { Lib39Shaders.selectionShader = selectionShader; } diff --git a/common/src/main/java/top/r3944realms/lib39/core/command/ICommandHelpManager.java b/common/src/main/java/top/r3944realms/lib39/core/command/ICommandHelpManager.java index 11a267f..7c6b1de 100644 --- a/common/src/main/java/top/r3944realms/lib39/core/command/ICommandHelpManager.java +++ b/common/src/main/java/top/r3944realms/lib39/core/command/ICommandHelpManager.java @@ -483,6 +483,7 @@ public interface ICommandHelpManager { /** * 获取命令树的字符串表示 * + * @param commandSourceStack the command source stack * @return 命令树列表 command tree */ default List getCommandTree(CommandSourceStack commandSourceStack) { @@ -537,6 +538,7 @@ public interface ICommandHelpManager { /** * Build command tree help mutable component. * + * @param commandSourceStack the command source stack * @return the mutable component */ default MutableComponent buildCommandTreeHelp(CommandSourceStack commandSourceStack) { diff --git a/common/src/main/java/top/r3944realms/lib39/core/command/model/CommandNode.java b/common/src/main/java/top/r3944realms/lib39/core/command/model/CommandNode.java index 1caf181..5d53a16 100644 --- a/common/src/main/java/top/r3944realms/lib39/core/command/model/CommandNode.java +++ b/common/src/main/java/top/r3944realms/lib39/core/command/model/CommandNode.java @@ -35,9 +35,16 @@ public class CommandNode { // 展开/闭合状态 private boolean expanded = true; + /** + * Test permission boolean. + * + * @param source the source + * @return the boolean + */ public boolean testPermission(CommandSourceStack source) { return testPermission.test(source); } + /** * Instantiates a new Command node. * diff --git a/common/src/main/java/top/r3944realms/lib39/core/compat/CompatManager.java b/common/src/main/java/top/r3944realms/lib39/core/compat/CompatManager.java index 4d6abb5..548ebc2 100644 --- a/common/src/main/java/top/r3944realms/lib39/core/compat/CompatManager.java +++ b/common/src/main/java/top/r3944realms/lib39/core/compat/CompatManager.java @@ -14,20 +14,49 @@ import java.util.stream.Collectors; */ @SuppressWarnings("unused") public abstract class CompatManager { + /** + * Gets id. + * + * @return the id + */ public ResourceLocation getId() { return id; } + + /** + * The Logger. + */ protected final Logger logger; + /** + * The Id. + */ protected final ResourceLocation id; + /** + * The Compats. + */ protected final Map compats = new HashMap<>(); + /** + * The Initialized. + */ protected boolean initialized = false; + /** + * The Pending tasks. + */ protected final List pendingTasks = new ArrayList<>(); + /** + * Initialize. + */ public void initialize() { initializeAllCompat(); onLoadComplete(); } + /** + * Instantiates a new Compat manager. + * + * @param id the id + */ public CompatManager(@NotNull ResourceLocation id) { this.id = id; this.logger = LoggerFactory.getLogger(id.toString()); @@ -50,6 +79,12 @@ public abstract class CompatManager { } } + /** + * Do register compat. + * + * @param id the id + * @param compat the compat + */ protected void doRegisterCompat(ResourceLocation id, ICompat compat) { if (compats.containsKey(id)) { logger.warn("Compat with id {} is already registered!", id); diff --git a/common/src/main/java/top/r3944realms/lib39/core/compat/ICompat.java b/common/src/main/java/top/r3944realms/lib39/core/compat/ICompat.java index 89ed5d5..bf8d344 100644 --- a/common/src/main/java/top/r3944realms/lib39/core/compat/ICompat.java +++ b/common/src/main/java/top/r3944realms/lib39/core/compat/ICompat.java @@ -8,8 +8,20 @@ import java.util.concurrent.Callable; * The interface Compat. */ public interface ICompat { + /** + * Sets initialize. + * + * @param initialize the initialize + */ void setInitialize(boolean initialize); + + /** + * Is initialized boolean. + * + * @return the boolean + */ boolean isInitialized(); + /** * Id resource location. * diff --git a/common/src/main/java/top/r3944realms/lib39/core/sync/INBTSerializable.java b/common/src/main/java/top/r3944realms/lib39/core/sync/INBTSerializable.java index 0cb9b4d..81f3729 100644 --- a/common/src/main/java/top/r3944realms/lib39/core/sync/INBTSerializable.java +++ b/common/src/main/java/top/r3944realms/lib39/core/sync/INBTSerializable.java @@ -2,8 +2,23 @@ package top.r3944realms.lib39.core.sync; import net.minecraft.nbt.Tag; +/** + * The interface Inbt serializable. + * + * @param the type parameter + */ public interface INBTSerializable { + /** + * Serialize nbt t. + * + * @return the t + */ T serializeNBT(); + /** + * Deserialize nbt. + * + * @param var1 the var 1 + */ void deserializeNBT(T var1); } diff --git a/common/src/main/java/top/r3944realms/lib39/core/sync/IUpdate.java b/common/src/main/java/top/r3944realms/lib39/core/sync/IUpdate.java index 97091a3..231fb46 100644 --- a/common/src/main/java/top/r3944realms/lib39/core/sync/IUpdate.java +++ b/common/src/main/java/top/r3944realms/lib39/core/sync/IUpdate.java @@ -1,6 +1,18 @@ package top.r3944realms.lib39.core.sync; +/** + * The interface Update. + */ public interface IUpdate { + /** + * Update. + */ void update(); + + /** + * Gets sync data. + * + * @return the sync data + */ NBTEntitySyncData getSyncData(); } diff --git a/common/src/main/java/top/r3944realms/lib39/core/sync/NBTEntitySyncData.java b/common/src/main/java/top/r3944realms/lib39/core/sync/NBTEntitySyncData.java index b1ab889..4d7f29f 100644 --- a/common/src/main/java/top/r3944realms/lib39/core/sync/NBTEntitySyncData.java +++ b/common/src/main/java/top/r3944realms/lib39/core/sync/NBTEntitySyncData.java @@ -4,6 +4,9 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; +/** + * The type Nbt entity sync data. + */ public abstract class NBTEntitySyncData implements IEntity, ISyncData, INBTSerializable, IUpdate { /** * The Dirty. diff --git a/common/src/main/java/top/r3944realms/lib39/core/sync/SyncData2Manager.java b/common/src/main/java/top/r3944realms/lib39/core/sync/SyncData2Manager.java index 999df6e..71b7352 100644 --- a/common/src/main/java/top/r3944realms/lib39/core/sync/SyncData2Manager.java +++ b/common/src/main/java/top/r3944realms/lib39/core/sync/SyncData2Manager.java @@ -12,9 +12,16 @@ import java.util.function.Function; /** * The type Sync data 2 manager. + * + * @param the type parameter */ @SuppressWarnings({"unused", "DuplicatedCode"}) public abstract class SyncData2Manager> { + /** + * Gets typed entries. + * + * @return the typed entries + */ protected abstract Map getTypedEntries(); /** @@ -34,6 +41,12 @@ public abstract class SyncData2Manager getData(K key); } + /** + * The type Typed sync entry. + * + * @param the type parameter + * @param the type parameter + */ protected static class TypedSyncEntry> { /** * The Manager. @@ -397,7 +410,16 @@ public abstract class SyncData2Manager the type parameter + * @param the type parameter + * @param id the id + * @param entry the entry + * @param newDataProvider the new data provider + */ +// 辅助方法:更新条目的数据提供者 @SuppressWarnings("unchecked") protected > void updateDataProviderInEntry( ResourceLocation id, diff --git a/common/src/main/java/top/r3944realms/lib39/datagen/provider/LanguageProvider.java b/common/src/main/java/top/r3944realms/lib39/datagen/provider/LanguageProvider.java index 10b7f6d..d8a2494 100644 --- a/common/src/main/java/top/r3944realms/lib39/datagen/provider/LanguageProvider.java +++ b/common/src/main/java/top/r3944realms/lib39/datagen/provider/LanguageProvider.java @@ -1,12 +1,6 @@ package top.r3944realms.lib39.datagen.provider; import com.google.gson.JsonObject; -import java.nio.file.Path; -import java.util.Map; -import java.util.Objects; -import java.util.TreeMap; -import java.util.concurrent.CompletableFuture; -import java.util.function.Supplier; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataProvider; import net.minecraft.data.PackOutput; @@ -19,18 +13,38 @@ import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.level.block.Block; import org.jetbrains.annotations.NotNull; +import java.nio.file.Path; +import java.util.Map; +import java.util.Objects; +import java.util.TreeMap; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +/** + * The type Language provider. + */ public abstract class LanguageProvider implements DataProvider { private final Map data = new TreeMap<>(); private final PackOutput output; private final String modid; private final String locale; + /** + * Instantiates a new Language provider. + * + * @param output the output + * @param modid the modid + * @param locale the locale + */ public LanguageProvider(PackOutput output, String modid, String locale) { this.output = output; this.modid = modid; this.locale = locale; } + /** + * Add translations. + */ protected abstract void addTranslations(); public @NotNull CompletableFuture run(@NotNull CachedOutput cache) { @@ -49,54 +63,132 @@ public abstract class LanguageProvider implements DataProvider { return DataProvider.saveStable(cache, json, target); } + /** + * Add block. + * + * @param key the key + * @param name the name + */ public void addBlock(@NotNull Supplier key, String name) { this.add(key.get(), name); } + /** + * Add. + * + * @param key the key + * @param name the name + */ public void add(@NotNull Block key, String name) { this.add(key.getDescriptionId(), name); } + /** + * Add item. + * + * @param key the key + * @param name the name + */ public void addItem(@NotNull Supplier key, String name) { this.add(key.get(), name); } + /** + * Add. + * + * @param key the key + * @param name the name + */ public void add(@NotNull Item key, String name) { this.add(key.getDescriptionId(), name); } + /** + * Add item stack. + * + * @param key the key + * @param name the name + */ public void addItemStack(@NotNull Supplier key, String name) { this.add(key.get(), name); } + /** + * Add. + * + * @param key the key + * @param name the name + */ public void add(@NotNull ItemStack key, String name) { this.add(key.getDescriptionId(), name); } + /** + * Add enchantment. + * + * @param key the key + * @param name the name + */ public void addEnchantment(@NotNull Supplier key, String name) { this.add(key.get(), name); } + /** + * Add. + * + * @param key the key + * @param name the name + */ public void add(@NotNull Enchantment key, String name) { this.add(key.getDescriptionId(), name); } + /** + * Add effect. + * + * @param key the key + * @param name the name + */ public void addEffect(@NotNull Supplier key, String name) { this.add(key.get(), name); } + /** + * Add. + * + * @param key the key + * @param name the name + */ public void add(@NotNull MobEffect key, String name) { this.add(key.getDescriptionId(), name); } + /** + * Add entity type. + * + * @param key the key + * @param name the name + */ public void addEntityType(@NotNull Supplier> key, String name) { this.add(key.get(), name); } + /** + * Add. + * + * @param key the key + * @param name the name + */ public void add(@NotNull EntityType key, String name) { this.add(key.getDescriptionId(), name); } + /** + * Add. + * + * @param key the key + * @param value the value + */ public void add(String key, String value) { if (this.data.put(key, value) != null) { throw new IllegalStateException("Duplicate translation key " + key); diff --git a/common/src/main/java/top/r3944realms/lib39/example/Lib39Example.java b/common/src/main/java/top/r3944realms/lib39/example/Lib39Example.java index 5482f33..fea7c5c 100644 --- a/common/src/main/java/top/r3944realms/lib39/example/Lib39Example.java +++ b/common/src/main/java/top/r3944realms/lib39/example/Lib39Example.java @@ -15,7 +15,11 @@ public class Lib39Example { registered = true; } } - public void init() { + + /** + * Init. + */ + public void init() { } diff --git a/common/src/main/java/top/r3944realms/lib39/example/content/data/AbstractedTestSyncData.java b/common/src/main/java/top/r3944realms/lib39/example/content/data/AbstractedTestSyncData.java index e80d583..414c4fd 100644 --- a/common/src/main/java/top/r3944realms/lib39/example/content/data/AbstractedTestSyncData.java +++ b/common/src/main/java/top/r3944realms/lib39/example/content/data/AbstractedTestSyncData.java @@ -10,11 +10,27 @@ import top.r3944realms.lib39.core.sync.NBTEntitySyncData; */ @SuppressWarnings("unused") public abstract class AbstractedTestSyncData extends NBTEntitySyncData { + /** + * The constant DEFAULT_TEST_STRING. + */ public final static String DEFAULT_TEST_STRING = "default_value"; + /** + * The constant DEFAULT_TEST_INT. + */ public final static int DEFAULT_TEST_INT = 42; + /** + * The constant DEFAULT_TEST_BOOLEAN. + */ public final static boolean DEFAULT_TEST_BOOLEAN = true; + /** + * The constant DEFAULT_TEST_DOUBLE. + */ public final static double DEFAULT_TEST_DOUBLE = 3.14159; + /** + * The constant DEFAULT_TEST_DATA. + */ public final static TestData DEFAULT_TEST_DATA = new TestData("default", 100, false); + /** * Instantiates a new Nbt sync data. * @@ -92,6 +108,9 @@ public abstract class AbstractedTestSyncData extends NBTEntitySyncData { */ public abstract void incrementCounter(); + /** + * Clear counter. + */ public abstract void clearCounter(); /** @@ -106,7 +125,11 @@ public abstract class AbstractedTestSyncData extends NBTEntitySyncData { */ public abstract void updateSyncTime(); + /** + * Clear sync time. + */ public abstract void clearSyncTime(); + /** * Gets custom data. * @@ -128,6 +151,9 @@ public abstract class AbstractedTestSyncData extends NBTEntitySyncData { */ public abstract boolean validateData(); + /** + * Reset to defaults. + */ public void resetToDefaults() { setTestString(DEFAULT_TEST_STRING); setTestInt(DEFAULT_TEST_INT); @@ -139,6 +165,9 @@ public abstract class AbstractedTestSyncData extends NBTEntitySyncData { markDirty(); } + /** + * Generate random data. + */ public void generateRandomData() { setTestString("random_" + System.currentTimeMillis()); setTestInt((int) (Math.random() * 1000)); @@ -154,8 +183,20 @@ public abstract class AbstractedTestSyncData extends NBTEntitySyncData { markDirty(); } + /** + * To bytes. + * + * @param buf the buf + */ public abstract void toBytes(FriendlyByteBuf buf); + + /** + * From bytes. + * + * @param buf the buf + */ public abstract void fromBytes(@NotNull FriendlyByteBuf buf); + /** * 测试数据对象 */ diff --git a/common/src/main/java/top/r3944realms/lib39/example/content/item/AbstractFabricItem.java b/common/src/main/java/top/r3944realms/lib39/example/content/item/AbstractFabricItem.java index 1477e83..f92ac32 100644 --- a/common/src/main/java/top/r3944realms/lib39/example/content/item/AbstractFabricItem.java +++ b/common/src/main/java/top/r3944realms/lib39/example/content/item/AbstractFabricItem.java @@ -151,9 +151,20 @@ public abstract class AbstractFabricItem extends Item { player.sendSystemMessage(Component.literal("§c请对准一个生物使用!")); } } + + /** + * Gets data. + * + * @param target the target + * @return the data + */ protected abstract AbstractedTestSyncData getData(Entity target); + /** * 在客户端获取本地数据 + * + * @param target the target + * @return the local client data */ protected AbstractedTestSyncData getLocalClientData(LivingEntity target) { try { @@ -166,6 +177,9 @@ public abstract class AbstractFabricItem extends Item { /** * 发送客户端数据到服务器 + * + * @param clientData the client data + * @param targetEntityId the target entity id */ protected abstract void sendClientDataToServer(AbstractedTestSyncData clientData, int targetEntityId); @@ -299,6 +313,11 @@ public abstract class AbstractFabricItem extends Item { /** * 显示双端比较结果 + * + * @param player the player + * @param target the target + * @param serverData the server data + * @param clientData the client data */ protected static void displayDualEndComparison(ServerPlayer player, LivingEntity target, AbstractedTestSyncData serverData, AbstractedTestSyncData clientData) { player.sendSystemMessage(Component.literal("§6=== 客户端-服务器双端同步检查结果 ===")); diff --git a/common/src/main/java/top/r3944realms/lib39/example/content/item/AbstractNeoForgeItem.java b/common/src/main/java/top/r3944realms/lib39/example/content/item/AbstractNeoForgeItem.java index aabc01d..cbc8193 100644 --- a/common/src/main/java/top/r3944realms/lib39/example/content/item/AbstractNeoForgeItem.java +++ b/common/src/main/java/top/r3944realms/lib39/example/content/item/AbstractNeoForgeItem.java @@ -243,8 +243,20 @@ public abstract class AbstractNeoForgeItem extends Item { } } + /** + * Gets data. + * + * @param entity the entity + * @return the data + */ protected abstract AbstractedTestSyncData getData(Entity entity); + /** + * Gets or create test sync data. + * + * @param entity the entity + * @return the or create test sync data + */ protected AbstractedTestSyncData getOrCreateTestSyncData(Entity entity) { try { return getData(entity); diff --git a/common/src/main/java/top/r3944realms/lib39/example/content/item/ForgeItem.java b/common/src/main/java/top/r3944realms/lib39/example/content/item/ForgeItem.java index 5801d86..dde81e7 100644 --- a/common/src/main/java/top/r3944realms/lib39/example/content/item/ForgeItem.java +++ b/common/src/main/java/top/r3944realms/lib39/example/content/item/ForgeItem.java @@ -32,7 +32,10 @@ public class ForgeItem extends Item { return super.use(level, player, usedHand); } - static class ClientOpt implements IClientOnly { + /** + * The type Client opt. + */ + static class ClientOpt implements IClientOnly { private static void clientUse(@NotNull InteractionHand usedHand) { IClientOnly.check(() -> Minecraft.getInstance().setScreen(new ForgeScreen(usedHand, 0))); } diff --git a/common/src/main/java/top/r3944realms/lib39/mixin/minecraft/CreativeModeTabsAccessor.java b/common/src/main/java/top/r3944realms/lib39/mixin/minecraft/CreativeModeTabsAccessor.java index e21c66d..2786e6c 100644 --- a/common/src/main/java/top/r3944realms/lib39/mixin/minecraft/CreativeModeTabsAccessor.java +++ b/common/src/main/java/top/r3944realms/lib39/mixin/minecraft/CreativeModeTabsAccessor.java @@ -8,83 +8,166 @@ import org.spongepowered.asm.mixin.gen.Accessor; import java.util.Comparator; +/** + * The interface Creative mode tabs accessor. + */ @Mixin(CreativeModeTabs.class) public interface CreativeModeTabsAccessor { + /** + * Gets building blocks. + * + * @return the building blocks + */ @Accessor("BUILDING_BLOCKS") static ResourceKey getBuildingBlocks() { throw new AssertionError(); } + /** + * Gets colored blocks. + * + * @return the colored blocks + */ @Accessor("COLORED_BLOCKS") static ResourceKey getColoredBlocks() { throw new AssertionError(); } + /** + * Gets natural blocks. + * + * @return the natural blocks + */ @Accessor("NATURAL_BLOCKS") static ResourceKey getNaturalBlocks() { throw new AssertionError(); } + /** + * Gets functional blocks. + * + * @return the functional blocks + */ @Accessor("FUNCTIONAL_BLOCKS") static ResourceKey getFunctionalBlocks() { throw new AssertionError(); } + /** + * Gets redstone blocks. + * + * @return the redstone blocks + */ @Accessor("REDSTONE_BLOCKS") static ResourceKey getRedstoneBlocks() { throw new AssertionError(); } + /** + * Gets hotbar. + * + * @return the hotbar + */ @Accessor("HOTBAR") static ResourceKey getHotbar() { throw new AssertionError(); } + /** + * Gets search. + * + * @return the search + */ @Accessor("SEARCH") static ResourceKey getSearch() { throw new AssertionError(); } + /** + * Gets tools and utilities. + * + * @return the tools and utilities + */ @Accessor("TOOLS_AND_UTILITIES") static ResourceKey getToolsAndUtilities() { throw new AssertionError(); } + /** + * Gets combat. + * + * @return the combat + */ @Accessor("COMBAT") static ResourceKey getCombat() { throw new AssertionError(); } + /** + * Gets food and drinks. + * + * @return the food and drinks + */ @Accessor("FOOD_AND_DRINKS") static ResourceKey getFoodAndDrinks() { throw new AssertionError(); } + /** + * Gets ingredients. + * + * @return the ingredients + */ @Accessor("INGREDIENTS") static ResourceKey getIngredients() { throw new AssertionError(); } + /** + * Gets spawn eggs. + * + * @return the spawn eggs + */ @Accessor("SPAWN_EGGS") static ResourceKey getSpawnEggs() { throw new AssertionError(); } + /** + * Gets op blocks. + * + * @return the op blocks + */ @Accessor("OP_BLOCKS") static ResourceKey getOpBlocks() { throw new AssertionError(); } + /** + * Gets inventory. + * + * @return the inventory + */ @Accessor("INVENTORY") static ResourceKey getInventory() { throw new AssertionError(); } + /** + * Gets cached parameters. + * + * @return the cached parameters + */ @Accessor("CACHED_PARAMETERS") static CreativeModeTab.ItemDisplayParameters getCachedParameters() { throw new AssertionError(); } + /** + * Gets painting comparator. + * + * @return the painting comparator + */ @Accessor("PAINTING_COMPARATOR") static Comparator getPaintingComparator() { throw new AssertionError(); diff --git a/common/src/main/java/top/r3944realms/lib39/mixin/minecraft/ScreenAccessor.java b/common/src/main/java/top/r3944realms/lib39/mixin/minecraft/ScreenAccessor.java index 89ac229..44b8d54 100644 --- a/common/src/main/java/top/r3944realms/lib39/mixin/minecraft/ScreenAccessor.java +++ b/common/src/main/java/top/r3944realms/lib39/mixin/minecraft/ScreenAccessor.java @@ -7,8 +7,16 @@ import org.spongepowered.asm.mixin.gen.Accessor; import java.util.List; +/** + * The interface Screen accessor. + */ @Mixin(Screen.class) public interface ScreenAccessor { + /** + * Gets renderables. + * + * @return the renderables + */ @Accessor("renderables") List getrRenderables(); } diff --git a/common/src/main/java/top/r3944realms/lib39/platform/Services.java b/common/src/main/java/top/r3944realms/lib39/platform/Services.java index 86b995b..ee43061 100644 --- a/common/src/main/java/top/r3944realms/lib39/platform/Services.java +++ b/common/src/main/java/top/r3944realms/lib39/platform/Services.java @@ -5,17 +5,30 @@ import top.r3944realms.lib39.platform.services.IPlatformHelper; import java.util.ServiceLoader; +/** + * The type Services. + */ // Service loaders are a built-in Java feature that allow us to locate implementations of an interface that vary from one // environment to another. In the context of MultiLoader we use this feature to access a mock API in the common code that // is swapped out for the platform specific implementation at runtime. public class Services { - // In this example we provide a platform helper which provides information about what platform the mod is running on. + /** + * The constant PLATFORM. + */ +// In this example we provide a platform helper which provides information about what platform the mod is running on. // For example this can be used to check if the code is running on Forge vs Fabric, or to ask the modloader if another // mod is loaded. public static final IPlatformHelper PLATFORM = load(IPlatformHelper.class); - // This code is used to load a service for the current environment. Your implementation of the service must be defined + /** + * Load t. + * + * @param the type parameter + * @param clazz the clazz + * @return the t + */ +// This code is used to load a service for the current environment. Your implementation of the service must be defined // manually by including a text file in META-INF/services named with the fully qualified class name of the service. // Inside the file you should write the fully qualified class name of the implementation to load for the platform. For // example our file on Forge points to ForgePlatformHelper while Fabric points to FabricPlatformHelper. diff --git a/common/src/main/java/top/r3944realms/lib39/platform/services/IHelpCommandHook.java b/common/src/main/java/top/r3944realms/lib39/platform/services/IHelpCommandHook.java index 1eca5f6..443b17a 100644 --- a/common/src/main/java/top/r3944realms/lib39/platform/services/IHelpCommandHook.java +++ b/common/src/main/java/top/r3944realms/lib39/platform/services/IHelpCommandHook.java @@ -5,7 +5,17 @@ import net.minecraft.commands.CommandBuildContext; import net.minecraft.commands.CommandSourceStack; import top.r3944realms.lib39.core.command.ICommandHelpManager; +/** + * The interface Help command hook. + */ @FunctionalInterface public interface IHelpCommandHook { + /** + * On register. + * + * @param tree the tree + * @param manager the manager + * @param context the context + */ void onRegister(LiteralArgumentBuilder tree, ICommandHelpManager manager, CommandBuildContext context); } diff --git a/common/src/main/java/top/r3944realms/lib39/platform/services/IPlatformHelper.java b/common/src/main/java/top/r3944realms/lib39/platform/services/IPlatformHelper.java index 933f542..02ab180 100644 --- a/common/src/main/java/top/r3944realms/lib39/platform/services/IPlatformHelper.java +++ b/common/src/main/java/top/r3944realms/lib39/platform/services/IPlatformHelper.java @@ -36,6 +36,11 @@ public interface IPlatformHelper { return isDevelopmentEnvironment() ? "development" : "production"; } + /** + * Is client environment boolean. + * + * @return the boolean + */ boolean isClientEnvironment(); @@ -46,7 +51,17 @@ public interface IPlatformHelper { */ String getModVersion(); + /** + * Gets util helper. + * + * @return the util helper + */ IUtilHelper getUtilHelper(); + /** + * Gets help command hook. + * + * @return the help command hook + */ IHelpCommandHook getHelpCommandHook(); } \ No newline at end of file diff --git a/common/src/main/java/top/r3944realms/lib39/platform/services/IUtilHelper.java b/common/src/main/java/top/r3944realms/lib39/platform/services/IUtilHelper.java index 07fe001..acd5446 100644 --- a/common/src/main/java/top/r3944realms/lib39/platform/services/IUtilHelper.java +++ b/common/src/main/java/top/r3944realms/lib39/platform/services/IUtilHelper.java @@ -2,6 +2,14 @@ package top.r3944realms.lib39.platform.services; import top.r3944realms.lib39.util.block.BlockRegistryBuilder; +/** + * The interface Util helper. + */ public interface IUtilHelper { + /** + * Gets block registry builder. + * + * @return the block registry builder + */ BlockRegistryBuilder getBlockRegistryBuilder(); } diff --git a/common/src/main/java/top/r3944realms/lib39/util/GameProfileHelper.java b/common/src/main/java/top/r3944realms/lib39/util/GameProfileHelper.java index 53eaf87..d303d47 100644 --- a/common/src/main/java/top/r3944realms/lib39/util/GameProfileHelper.java +++ b/common/src/main/java/top/r3944realms/lib39/util/GameProfileHelper.java @@ -32,12 +32,24 @@ public class GameProfileHelper { * Client Only Class */ public static class ClientOpt implements IClientOnly { + /** + * Resolve skin texture resource location. + * + * @param gameProfile the game profile + * @return the resource location + */ public static @NotNull ResourceLocation resolveSkinTexture(@NotNull GameProfile gameProfile) { return IClientOnly.check(() -> Minecraft.getInstance().getSkinManager() .getInsecureSkinLocation(gameProfile)); } + /** + * Gets skin texture. + * + * @param gameProfile the game profile + * @return the skin texture + */ public static ResourceLocation getSkinTexture(@Nullable GameProfile gameProfile) { return IClientOnly.check(() -> { if (gameProfile == null) { @@ -47,6 +59,12 @@ public class GameProfileHelper { }); } + /** + * Has slim arms client boolean. + * + * @param player the player + * @return the boolean + */ public static boolean hasSlimArmsClient(Player player) { return IClientOnly.check(() -> { if (player instanceof AbstractClientPlayer clientPlayer) { @@ -59,6 +77,12 @@ public class GameProfileHelper { }); } + /** + * Gets skin model name. + * + * @param player the player + * @return the skin model name + */ public static @NotNull String getSkinModelName(@NotNull Player player) { return IClientOnly.check(() -> { if (player.level().isClientSide && player instanceof AbstractClientPlayer) { @@ -71,6 +95,7 @@ public class GameProfileHelper { } } + /** * The constant TAG_BE. */ @@ -80,11 +105,23 @@ public class GameProfileHelper { */ public static final String TAG_OWN_PROFILE = "OwnerProfile"; + /** + * Gets skin texture. + * + * @param gameProfile the game profile + * @return the skin texture + */ public static ResourceLocation getSkinTexture(@Nullable GameProfile gameProfile) { return ClientOpt.getSkinTexture(gameProfile); } + /** + * Resolve skin texture resource location. + * + * @param gameProfile the game profile + * @return the resource location + */ public static @NotNull ResourceLocation resolveSkinTexture(@NotNull GameProfile gameProfile) { return ClientOpt.resolveSkinTexture(gameProfile); } diff --git a/common/src/main/java/top/r3944realms/lib39/util/IClientOnly.java b/common/src/main/java/top/r3944realms/lib39/util/IClientOnly.java index 4816df7..f608212 100644 --- a/common/src/main/java/top/r3944realms/lib39/util/IClientOnly.java +++ b/common/src/main/java/top/r3944realms/lib39/util/IClientOnly.java @@ -4,7 +4,15 @@ import top.r3944realms.lib39.Lib39; import java.util.function.Supplier; +/** + * The interface Client only. + */ public interface IClientOnly { + /** + * Check. + * + * @param runnable the runnable + */ static void check(Runnable runnable) { if (Lib39.isClientEnvironment()) { runnable.run(); @@ -13,6 +21,12 @@ public interface IClientOnly { throw new RuntimeException("This method should be called in ClientEnvironment"); } + /** + * Check. + * + * @param runnable the runnable + * @param fallback the fallback + */ static void check(Runnable runnable, Runnable fallback) { if (Lib39.isClientEnvironment()) { runnable.run(); @@ -20,6 +34,14 @@ public interface IClientOnly { } fallback.run(); } + + /** + * Check t. + * + * @param the type parameter + * @param supplier the supplier + * @return the t + */ static T check(Supplier supplier) { if (Lib39.isClientEnvironment()) { return supplier.get(); @@ -27,6 +49,14 @@ public interface IClientOnly { throw new RuntimeException("This method should be called in ClientEnvironment"); } + /** + * Check t. + * + * @param the type parameter + * @param supplier the supplier + * @param fallback the fallback + * @return the t + */ static T check(Supplier supplier, Supplier fallback) { if (Lib39.isClientEnvironment()) { return supplier.get(); diff --git a/common/src/main/java/top/r3944realms/lib39/util/IUniPosOwner.java b/common/src/main/java/top/r3944realms/lib39/util/IUniPosOwner.java index fef500f..2b41862 100644 --- a/common/src/main/java/top/r3944realms/lib39/util/IUniPosOwner.java +++ b/common/src/main/java/top/r3944realms/lib39/util/IUniPosOwner.java @@ -20,6 +20,7 @@ import java.util.concurrent.TimeUnit; *

重要:由于使用了 weakValues(),实现类必须被其他对象强引用, * 否则会被 GC 清理导致锁自动释放。通常这意味着将实现类实例存储在 * 适当的管理器或容器中。 + * * @author sch246 */ public interface IUniPosOwner { @@ -67,8 +68,7 @@ public interface IUniPosOwner { * * @param level 维度 The level (dimension) of the position. * @param pos 坐标 The position to lock. - * @return true if ownership was successfully claimed or was already held by this object, - * false if the position is owned by another object. + * @return true if ownership was successfully claimed or was already held by this object, false if the position is owned by another object. */ default boolean tryLock(Level level, BlockPos pos) { return UniPosManager.INSTANCE.tryLock(level, pos, this); @@ -88,6 +88,7 @@ public interface IUniPosOwner { /** * 续租,继续持有锁 + * * @param level 维度 * @param pos 位置 */ @@ -97,16 +98,19 @@ public interface IUniPosOwner { } /** - 管理 IUniPosOwner 系统的单例存储。 - 该类是后台实现,大多数类不应直接使用。 - 在同一维度键(ResourceKey) -> 每维度的坐标缓存。 @@ -139,7 +143,7 @@ final class UniPosManager { * * @param level 维度 * @param pos 坐标 - * @return 如果存在所有者,则返回所有者对象;否则返回 null。 + * @return 如果存在所有者 ,则返回所有者对象;否则返回 null。 */ @Nullable public IUniPosOwner getOwner(Level level, BlockPos pos) { @@ -182,6 +186,7 @@ final class UniPosManager { /** * 续租,继续持有锁 + * * @param level 维度 * @param pos 位置 * @param owner 对象 diff --git a/common/src/main/java/top/r3944realms/lib39/util/block/BlockRegistryBuilder.java b/common/src/main/java/top/r3944realms/lib39/util/block/BlockRegistryBuilder.java index 9680f90..0a050fa 100644 --- a/common/src/main/java/top/r3944realms/lib39/util/block/BlockRegistryBuilder.java +++ b/common/src/main/java/top/r3944realms/lib39/util/block/BlockRegistryBuilder.java @@ -23,9 +23,15 @@ public abstract class BlockRegistryBuilder { private boolean needBuildItem; private Item.Properties properties; + /** + * Create block registry builder. + * + * @return the block registry builder + */ public static BlockRegistryBuilder create() { return Services.PLATFORM.getUtilHelper().getBlockRegistryBuilder(); } + /** * 设置注册名称 * @@ -88,6 +94,9 @@ public abstract class BlockRegistryBuilder { /** * 内部方法:注册对应的方块物品 + * + * @param blockObject the block object + * @param creativeTabs the creative tabs */ protected abstract void registerBlockItem(Supplier blockObject, ResourceKey... creativeTabs); diff --git a/common/src/main/java/top/r3944realms/lib39/util/villager/TradeBuilder.java b/common/src/main/java/top/r3944realms/lib39/util/villager/TradeBuilder.java index ff1168d..121c645 100644 --- a/common/src/main/java/top/r3944realms/lib39/util/villager/TradeBuilder.java +++ b/common/src/main/java/top/r3944realms/lib39/util/villager/TradeBuilder.java @@ -28,8 +28,8 @@ import net.minecraft.world.level.saveddata.maps.MapDecoration; import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; - import org.jetbrains.annotations.Nullable; + import java.util.List; import java.util.Map; diff --git a/fabric/src/main/java/top/r3944realms/lib39/Lib39Fabric.java b/fabric/src/main/java/top/r3944realms/lib39/Lib39Fabric.java index 4dc9a87..b52e301 100644 --- a/fabric/src/main/java/top/r3944realms/lib39/Lib39Fabric.java +++ b/fabric/src/main/java/top/r3944realms/lib39/Lib39Fabric.java @@ -2,7 +2,10 @@ package top.r3944realms.lib39; import net.fabricmc.api.ModInitializer; import top.r3944realms.lib39.core.event.FabricCommonEventHandler; -import top.r3944realms.lib39.core.register.*; +import top.r3944realms.lib39.core.register.FabricLib39BlockEntities; +import top.r3944realms.lib39.core.register.FabricLib39Blocks; +import top.r3944realms.lib39.core.register.FabricLib39Items; +import top.r3944realms.lib39.core.register.FabricLib39SoundEvents; import top.r3944realms.lib39.example.FabricLib39Example; public class Lib39Fabric implements ModInitializer { diff --git a/fabric/src/main/java/top/r3944realms/lib39/core/event/FabricCommonEventHandler.java b/fabric/src/main/java/top/r3944realms/lib39/core/event/FabricCommonEventHandler.java index 1e377de..54d9405 100644 --- a/fabric/src/main/java/top/r3944realms/lib39/core/event/FabricCommonEventHandler.java +++ b/fabric/src/main/java/top/r3944realms/lib39/core/event/FabricCommonEventHandler.java @@ -2,13 +2,11 @@ package top.r3944realms.lib39.core.event; import com.mojang.authlib.GameProfile; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; -import net.fabricmc.fabric.api.event.lifecycle.v1.CommonLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerEntityEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; import net.fabricmc.fabric.api.lookup.v1.entity.EntityApiLookup; -import net.fabricmc.loader.impl.launch.FabricLauncher; import net.minecraft.Util; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.network.chat.Component; diff --git a/fabric/src/main/java/top/r3944realms/lib39/core/register/FabricLib39BlockEntities.java b/fabric/src/main/java/top/r3944realms/lib39/core/register/FabricLib39BlockEntities.java index 06a9f2a..0ff87c1 100644 --- a/fabric/src/main/java/top/r3944realms/lib39/core/register/FabricLib39BlockEntities.java +++ b/fabric/src/main/java/top/r3944realms/lib39/core/register/FabricLib39BlockEntities.java @@ -2,7 +2,6 @@ package top.r3944realms.lib39.core.register; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.core.registries.Registries; import net.minecraft.world.level.block.entity.BlockEntityType; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; diff --git a/fabric/src/main/java/top/r3944realms/lib39/core/register/FabricLib39Blocks.java b/fabric/src/main/java/top/r3944realms/lib39/core/register/FabricLib39Blocks.java index aa96d9a..8d206f6 100644 --- a/fabric/src/main/java/top/r3944realms/lib39/core/register/FabricLib39Blocks.java +++ b/fabric/src/main/java/top/r3944realms/lib39/core/register/FabricLib39Blocks.java @@ -3,7 +3,6 @@ package top.r3944realms.lib39.core.register; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntityType; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import top.r3944realms.lib39.Lib39; diff --git a/fabric/src/main/java/top/r3944realms/lib39/core/register/FabricLib39Items.java b/fabric/src/main/java/top/r3944realms/lib39/core/register/FabricLib39Items.java index e413986..34d21e0 100644 --- a/fabric/src/main/java/top/r3944realms/lib39/core/register/FabricLib39Items.java +++ b/fabric/src/main/java/top/r3944realms/lib39/core/register/FabricLib39Items.java @@ -3,7 +3,6 @@ package top.r3944realms.lib39.core.register; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.entity.BlockEntityType; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import top.r3944realms.lib39.Lib39; diff --git a/fabric/src/main/java/top/r3944realms/lib39/core/register/FabricLib39SoundEvents.java b/fabric/src/main/java/top/r3944realms/lib39/core/register/FabricLib39SoundEvents.java index adc25e5..2b8d503 100644 --- a/fabric/src/main/java/top/r3944realms/lib39/core/register/FabricLib39SoundEvents.java +++ b/fabric/src/main/java/top/r3944realms/lib39/core/register/FabricLib39SoundEvents.java @@ -2,9 +2,7 @@ package top.r3944realms.lib39.core.register; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundEvents; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import top.r3944realms.lib39.Lib39; diff --git a/fabric/src/main/java/top/r3944realms/lib39/core/sync/SyncData2LookupManager.java b/fabric/src/main/java/top/r3944realms/lib39/core/sync/SyncData2LookupManager.java index b2a1550..191bb57 100644 --- a/fabric/src/main/java/top/r3944realms/lib39/core/sync/SyncData2LookupManager.java +++ b/fabric/src/main/java/top/r3944realms/lib39/core/sync/SyncData2LookupManager.java @@ -6,7 +6,9 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; public class SyncData2LookupManager extends SyncData2Manager>> { protected final Map> typedEntries = Maps.newConcurrentMap(); diff --git a/fabric/src/main/java/top/r3944realms/lib39/example/content/item/FabricFabricItem.java b/fabric/src/main/java/top/r3944realms/lib39/example/content/item/FabricFabricItem.java index 5199cd6..2b332d5 100644 --- a/fabric/src/main/java/top/r3944realms/lib39/example/content/item/FabricFabricItem.java +++ b/fabric/src/main/java/top/r3944realms/lib39/example/content/item/FabricFabricItem.java @@ -2,24 +2,17 @@ package top.r3944realms.lib39.example.content.item; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.lookup.v1.entity.EntityApiLookup; -import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; -import net.fabricmc.fabric.impl.screenhandler.client.ClientNetworking; import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.players.PlayerList; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.core.event.FabricCommonEventHandler; import top.r3944realms.lib39.example.content.data.AbstractedTestSyncData; import top.r3944realms.lib39.example.content.data.FabricTestSyncData; import top.r3944realms.lib39.example.core.network.FabricClientDataPacket; -import java.util.List; - public class FabricFabricItem extends AbstractFabricItem { public FabricFabricItem(Properties properties) { diff --git a/fabric/src/main/java/top/r3944realms/lib39/example/core/register/FabricExLib39Items.java b/fabric/src/main/java/top/r3944realms/lib39/example/core/register/FabricExLib39Items.java index 18e969a..5a4e0b5 100644 --- a/fabric/src/main/java/top/r3944realms/lib39/example/core/register/FabricExLib39Items.java +++ b/fabric/src/main/java/top/r3944realms/lib39/example/core/register/FabricExLib39Items.java @@ -3,8 +3,8 @@ package top.r3944realms.lib39.example.core.register; import net.minecraft.world.item.Item; import top.r3944realms.lib39.core.register.FabricLib39Items; import top.r3944realms.lib39.example.content.item.FabricFabricItem; -import top.r3944realms.lib39.example.content.item.ForgeItem; import top.r3944realms.lib39.example.content.item.FabricNeoForgeItem; +import top.r3944realms.lib39.example.content.item.ForgeItem; /** * The type Ex lib 39 items. diff --git a/fabric/src/main/java/top/r3944realms/lib39/mixin/MixinEntity.java b/fabric/src/main/java/top/r3944realms/lib39/mixin/MixinEntity.java index e303db8..db2e51c 100644 --- a/fabric/src/main/java/top/r3944realms/lib39/mixin/MixinEntity.java +++ b/fabric/src/main/java/top/r3944realms/lib39/mixin/MixinEntity.java @@ -9,7 +9,9 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import top.r3944realms.lib39.core.event.FabricCommonEventHandler; -import top.r3944realms.lib39.core.sync.*; +import top.r3944realms.lib39.core.sync.ILib39SyncDataHolder; +import top.r3944realms.lib39.core.sync.ISyncData; +import top.r3944realms.lib39.core.sync.NBTEntitySyncData; import java.util.UUID; diff --git a/fabric/src/main/java/top/r3944realms/lib39/platform/FabricPlatformHelper.java b/fabric/src/main/java/top/r3944realms/lib39/platform/FabricPlatformHelper.java index 0053417..2271c65 100644 --- a/fabric/src/main/java/top/r3944realms/lib39/platform/FabricPlatformHelper.java +++ b/fabric/src/main/java/top/r3944realms/lib39/platform/FabricPlatformHelper.java @@ -1,12 +1,12 @@ package top.r3944realms.lib39.platform; import net.fabricmc.api.EnvType; +import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.metadata.ModMetadata; import top.r3944realms.lib39.Lib39; import top.r3944realms.lib39.platform.services.IHelpCommandHook; import top.r3944realms.lib39.platform.services.IPlatformHelper; -import net.fabricmc.loader.api.FabricLoader; import top.r3944realms.lib39.platform.services.IUtilHelper; import java.util.Objects; diff --git a/forge/src/main/java/top/r3944realms/lib39/core/compat/ForgeCompatManager.java b/forge/src/main/java/top/r3944realms/lib39/core/compat/ForgeCompatManager.java index a0af52d..1b6e9db 100644 --- a/forge/src/main/java/top/r3944realms/lib39/core/compat/ForgeCompatManager.java +++ b/forge/src/main/java/top/r3944realms/lib39/core/compat/ForgeCompatManager.java @@ -8,7 +8,10 @@ import net.minecraftforge.fml.common.Mod; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.function.Consumer; /** diff --git a/forge/src/main/java/top/r3944realms/lib39/core/register/ForgeLib39BlockEntities.java b/forge/src/main/java/top/r3944realms/lib39/core/register/ForgeLib39BlockEntities.java index 4ba05f7..78edf16 100644 --- a/forge/src/main/java/top/r3944realms/lib39/core/register/ForgeLib39BlockEntities.java +++ b/forge/src/main/java/top/r3944realms/lib39/core/register/ForgeLib39BlockEntities.java @@ -4,7 +4,6 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; import top.r3944realms.lib39.Lib39; import top.r3944realms.lib39.content.block.blockentity.DollBlockEntity; diff --git a/forge/src/main/java/top/r3944realms/lib39/core/register/ForgeLib39Blocks.java b/forge/src/main/java/top/r3944realms/lib39/core/register/ForgeLib39Blocks.java index ddd2da8..91395a9 100644 --- a/forge/src/main/java/top/r3944realms/lib39/core/register/ForgeLib39Blocks.java +++ b/forge/src/main/java/top/r3944realms/lib39/core/register/ForgeLib39Blocks.java @@ -4,7 +4,6 @@ import net.minecraft.world.level.block.Block; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; import top.r3944realms.lib39.Lib39; import top.r3944realms.lib39.content.block.DollBlock; import top.r3944realms.lib39.util.block.BlockRegistryBuilder; diff --git a/forge/src/main/java/top/r3944realms/lib39/core/register/ForgeLib39Items.java b/forge/src/main/java/top/r3944realms/lib39/core/register/ForgeLib39Items.java index d548e23..5677d6a 100644 --- a/forge/src/main/java/top/r3944realms/lib39/core/register/ForgeLib39Items.java +++ b/forge/src/main/java/top/r3944realms/lib39/core/register/ForgeLib39Items.java @@ -4,9 +4,7 @@ import net.minecraft.world.item.Item; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.content.item.DollItem; import top.r3944realms.lib39.content.item.ForgeDollItem; /** diff --git a/forge/src/main/java/top/r3944realms/lib39/core/register/ForgeLib39SoundEvents.java b/forge/src/main/java/top/r3944realms/lib39/core/register/ForgeLib39SoundEvents.java index 5daf90f..9715845 100644 --- a/forge/src/main/java/top/r3944realms/lib39/core/register/ForgeLib39SoundEvents.java +++ b/forge/src/main/java/top/r3944realms/lib39/core/register/ForgeLib39SoundEvents.java @@ -1,11 +1,9 @@ package top.r3944realms.lib39.core.register; -import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; import top.r3944realms.lib39.Lib39; /** diff --git a/forge/src/main/java/top/r3944realms/lib39/core/sync/SyncData2CapManager.java b/forge/src/main/java/top/r3944realms/lib39/core/sync/SyncData2CapManager.java index 1197529..6a6d1c6 100644 --- a/forge/src/main/java/top/r3944realms/lib39/core/sync/SyncData2CapManager.java +++ b/forge/src/main/java/top/r3944realms/lib39/core/sync/SyncData2CapManager.java @@ -5,7 +5,9 @@ import net.minecraft.resources.ResourceLocation; import net.minecraftforge.common.capabilities.Capability; import org.jetbrains.annotations.Nullable; -import java.util.*; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; /** * The type Sync data 2 manager. diff --git a/forge/src/main/java/top/r3944realms/lib39/example/compat/Lib39CompatManager.java b/forge/src/main/java/top/r3944realms/lib39/example/compat/Lib39CompatManager.java index 68c31cd..8daa1ca 100644 --- a/forge/src/main/java/top/r3944realms/lib39/example/compat/Lib39CompatManager.java +++ b/forge/src/main/java/top/r3944realms/lib39/example/compat/Lib39CompatManager.java @@ -2,7 +2,6 @@ package top.r3944realms.lib39.example.compat; import net.minecraftforge.eventbus.api.IEventBus; import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.core.compat.CompatManager; import top.r3944realms.lib39.core.compat.ForgeCompatManager; public class Lib39CompatManager extends ForgeCompatManager { diff --git a/forge/src/main/java/top/r3944realms/lib39/example/core/network/ExNetworkHandler.java b/forge/src/main/java/top/r3944realms/lib39/example/core/network/ExNetworkHandler.java index 63a37c5..5cc94f2 100644 --- a/forge/src/main/java/top/r3944realms/lib39/example/core/network/ExNetworkHandler.java +++ b/forge/src/main/java/top/r3944realms/lib39/example/core/network/ExNetworkHandler.java @@ -1,6 +1,5 @@ package top.r3944realms.lib39.example.core.network; -import net.minecraft.resources.ResourceLocation; import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.simple.SimpleChannel; import top.r3944realms.lib39.Lib39; diff --git a/src/generated/resources/.cache/1de3d2ee724999f84a11b20b51c37030049be277 b/src/generated/resources/.cache/1de3d2ee724999f84a11b20b51c37030049be277 deleted file mode 100644 index 4556498..0000000 --- a/src/generated/resources/.cache/1de3d2ee724999f84a11b20b51c37030049be277 +++ /dev/null @@ -1,2 +0,0 @@ -// 1.20.1 2026-01-16T18:15:18.0777323 Languages: zh_tw -bd0f71ef9ae49f69627d3122efa3b426a89ecbdf assets/lib39/lang/zh_tw.json diff --git a/src/generated/resources/.cache/2a65ee2815744be1ef1ffdae1c9a37f2a9cbe2ac b/src/generated/resources/.cache/2a65ee2815744be1ef1ffdae1c9a37f2a9cbe2ac deleted file mode 100644 index 4182d45..0000000 --- a/src/generated/resources/.cache/2a65ee2815744be1ef1ffdae1c9a37f2a9cbe2ac +++ /dev/null @@ -1,2 +0,0 @@ -// 1.20.1 2026-01-16T18:15:18.0777323 Languages: zh_cn -5d897b4cc975c19532c77ec60fd1eb487820a69d assets/lib39/lang/zh_cn.json diff --git a/src/generated/resources/.cache/2dbf84d84cf6f7b7a95fea9038e192dbf226e5f5 b/src/generated/resources/.cache/2dbf84d84cf6f7b7a95fea9038e192dbf226e5f5 deleted file mode 100644 index eb6acd4..0000000 --- a/src/generated/resources/.cache/2dbf84d84cf6f7b7a95fea9038e192dbf226e5f5 +++ /dev/null @@ -1,5 +0,0 @@ -// 1.20.1 2026-01-02T15:14:31.7762095 Item Models: lib39 -663f22009a9420c3eeae3c829fc9f37d16f0901b assets/lib39/models/item/doll.json -14f581c8f8e7f0de004c57a180f371e60e7b12ae assets/lib39/models/item/fabric.json -70583055336790fc837836ea6b49d16cfc8b64b8 assets/lib39/models/item/forge.json -447b36747d0aa8748dcd86715f4cce2cff19aca7 assets/lib39/models/item/neoforge.json diff --git a/src/generated/resources/.cache/3473f48ad2b0675418886c7a50b38f1c5da41e76 b/src/generated/resources/.cache/3473f48ad2b0675418886c7a50b38f1c5da41e76 deleted file mode 100644 index 5c6aeea..0000000 --- a/src/generated/resources/.cache/3473f48ad2b0675418886c7a50b38f1c5da41e76 +++ /dev/null @@ -1,2 +0,0 @@ -// 1.20.1 2026-01-02T15:29:13.3418663 Block States: lib39 -af9aae34357e6c630ed5037a6993ff211eba37ee assets/lib39/blockstates/doll.json diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d deleted file mode 100644 index d7280f8..0000000 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ /dev/null @@ -1,2 +0,0 @@ -// 1.20.1 2026-01-02T15:11:02.2242532 Loot Tables -ac8ee9efcf316b2181fb0b56946ff6805b40c6f0 data/lib39/loot_tables/blocks/doll.json diff --git a/src/generated/resources/.cache/735031f3addf80804addae5e3f53249900116f1e b/src/generated/resources/.cache/735031f3addf80804addae5e3f53249900116f1e deleted file mode 100644 index 6f16a66..0000000 --- a/src/generated/resources/.cache/735031f3addf80804addae5e3f53249900116f1e +++ /dev/null @@ -1,2 +0,0 @@ -// 1.20.1 2026-01-02T20:50:48.567559 Sound Definitions -474de39bdc277c91961609c6bddec279a755c846 assets/lib39/sounds.json diff --git a/src/generated/resources/.cache/82018c5420b46ddbb7071e62df09fdecd98133e6 b/src/generated/resources/.cache/82018c5420b46ddbb7071e62df09fdecd98133e6 deleted file mode 100644 index f1fe715..0000000 --- a/src/generated/resources/.cache/82018c5420b46ddbb7071e62df09fdecd98133e6 +++ /dev/null @@ -1,2 +0,0 @@ -// 1.20.1 2026-01-16T18:15:18.0777323 Languages: lzh -4116ca2d84d4244b49a9ff8190c2faf0f2e57dc4 assets/lib39/lang/lzh.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e deleted file mode 100644 index e4d5ae8..0000000 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ /dev/null @@ -1,3 +0,0 @@ -// 1.20.1 2026-01-02T20:34:46.0679751 Recipes -d65b7847071b919cdda2351bee53d2693de856c8 data/lib39/advancements/recipes/misc/doll.json -fbb6d29d5bfc1a2cef3888165671ac5e12ecc40f data/lib39/recipes/doll.json diff --git a/src/generated/resources/.cache/bc76051cc963abe6835a2599f9f7cc4f1a1b0fb5 b/src/generated/resources/.cache/bc76051cc963abe6835a2599f9f7cc4f1a1b0fb5 deleted file mode 100644 index 00a4aec..0000000 --- a/src/generated/resources/.cache/bc76051cc963abe6835a2599f9f7cc4f1a1b0fb5 +++ /dev/null @@ -1 +0,0 @@ -// 1.20.1 2026-01-02T15:11:02.2272522 Block Models: lib39 diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 deleted file mode 100644 index 79f4204..0000000 --- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 +++ /dev/null @@ -1,2 +0,0 @@ -// 1.20.1 2026-01-16T18:15:18.0777323 Languages: en_us -c2a9985bbad60c04fbd5e085bd25bfd00aa8a529 assets/lib39/lang/en_us.json diff --git a/src/generated/resources/assets/lib39/blockstates/doll.json b/src/generated/resources/assets/lib39/blockstates/doll.json deleted file mode 100644 index 37f7db2..0000000 --- a/src/generated/resources/assets/lib39/blockstates/doll.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "variants": { - "facing=east,pose=default,waterlogged=false": { - "model": "lib39:block/base_doll", - "y": 90 - }, - "facing=east,pose=default,waterlogged=true": { - "model": "lib39:block/base_doll", - "y": 90 - }, - "facing=east,pose=further,waterlogged=false": { - "model": "lib39:block/base_doll", - "y": 90 - }, - "facing=east,pose=further,waterlogged=true": { - "model": "lib39:block/base_doll", - "y": 90 - }, - "facing=north,pose=default,waterlogged=false": { - "model": "lib39:block/base_doll" - }, - "facing=north,pose=default,waterlogged=true": { - "model": "lib39:block/base_doll" - }, - "facing=north,pose=further,waterlogged=false": { - "model": "lib39:block/base_doll" - }, - "facing=north,pose=further,waterlogged=true": { - "model": "lib39:block/base_doll" - }, - "facing=south,pose=default,waterlogged=false": { - "model": "lib39:block/base_doll", - "y": 180 - }, - "facing=south,pose=default,waterlogged=true": { - "model": "lib39:block/base_doll", - "y": 180 - }, - "facing=south,pose=further,waterlogged=false": { - "model": "lib39:block/base_doll", - "y": 180 - }, - "facing=south,pose=further,waterlogged=true": { - "model": "lib39:block/base_doll", - "y": 180 - }, - "facing=west,pose=default,waterlogged=false": { - "model": "lib39:block/base_doll", - "y": 270 - }, - "facing=west,pose=default,waterlogged=true": { - "model": "lib39:block/base_doll", - "y": 270 - }, - "facing=west,pose=further,waterlogged=false": { - "model": "lib39:block/base_doll", - "y": 270 - }, - "facing=west,pose=further,waterlogged=true": { - "model": "lib39:block/base_doll", - "y": 270 - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/lib39/lang/en_us.json b/src/generated/resources/assets/lib39/lang/en_us.json deleted file mode 100644 index 24b62db..0000000 --- a/src/generated/resources/assets/lib39/lang/en_us.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "block.lib39.doll": "Doll", - "commands.lib39.calculate": "Calculate sum of two numbers", - "commands.lib39.calculate.result": "%d + %d = %d", - "commands.lib39.config": "Show configuration", - "commands.lib39.debug": "Debug information", - "commands.lib39.demo": "Demo command", - "commands.lib39.demo.message": "This is a demo command showing Lib39 features!", - "commands.lib39.game": "Game control", - "commands.lib39.game.pause": "Pause current game", - "commands.lib39.game.pause.success": "Game paused!", - "commands.lib39.game.resume": "Resume paused game", - "commands.lib39.game.resume.success": "Game resumed!", - "commands.lib39.game.start": "Start a game", - "commands.lib39.game.start.success": "Game '%s' started!", - "commands.lib39.game.stop": "Stop current game", - "commands.lib39.game.stop.success": "Game stopped!", - "commands.lib39.greet.basic": "Greet everyone", - "commands.lib39.greet.default": "Hello everyone from Lib39!", - "commands.lib39.greet.player": "Greet specific player", - "commands.lib39.greet.received": "%s greeted you!", - "commands.lib39.help.basic.help": "Show Help Info", - "commands.lib39.help.click_expand": "Click to expand", - "commands.lib39.help.command_not_found": "Command not found: %s", - "commands.lib39.help.header": "===== %s =====", - "commands.lib39.help.hover.copy": "Copy to clipboard", - "commands.lib39.help.no_entries": "No help entries available", - "commands.lib39.help.node.expand": "%d subcommands collapsed", - "commands.lib39.help.node.toggle.collapse": "Collapse", - "commands.lib39.help.node.toggle.expand": "Expand", - "commands.lib39.help.page_info": "Page %d of %d", - "commands.lib39.help.subcommands_title": "Subcommands:", - "commands.lib39.help.toggle_failed": "Toggle Failed: No Hash Cached", - "commands.lib39.info": "Show player information", - "commands.lib39.info.dimension": "Dimension: %s", - "commands.lib39.info.message": "=== Player Information ===", - "commands.lib39.info.position": "Position: X=%.1f, Y=%.1f, Z=%.1f", - "commands.lib39.reload": "Reload configuration", - "commands.lib39.root": "Lib39 Command System", - "commands.lib39.settings": "Show settings", - "commands.lib39.team": "Team management", - "commands.lib39.team.create": "Create a new team", - "commands.lib39.team.create.success": "Team '%s' created successfully!", - "commands.lib39.team.join": "Join a team", - "commands.lib39.team.join.success": "Joined team '%s'", - "commands.lib39.team.leave": "Leave current team", - "commands.lib39.team.leave.success": "Left the team", - "commands.lib39.teleport": "Teleport to player (OP only)", - "commands.lib39.teleport.success": "Teleported to %s", - "commands.lib39.test": "Test command", - "commands.lib39.test.success": "Test command executed successfully!", - "commands.lib39.test.with_param": "Test command with parameter: %s", - "invalid.player_name.too_long": "§c§lPlayer 's Name is too long than 16 characters.", - "item.lib39.fabric": "Fabric", - "item.lib39.forge": "Forge", - "item.lib39.neoforge": "NeoForge", - "sound.lib39.subtitle.duck_toy": "Duck Doll Sound", - "tooltip.lib39.content.doll.hover.1": "§eSkinOwner §7:§a %s ", - "tooltip.lib39.content.doll.hover.2": "§7Rename with a player name in an anvil to change skin" -} \ No newline at end of file diff --git a/src/generated/resources/assets/lib39/lang/lzh.json b/src/generated/resources/assets/lib39/lang/lzh.json deleted file mode 100644 index ee4342e..0000000 --- a/src/generated/resources/assets/lib39/lang/lzh.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "block.lib39.doll": "偶", - "commands.lib39.calculate": "算二數和", - "commands.lib39.calculate.result": "%d 加 %d 等 %d", - "commands.lib39.config": "示配", - "commands.lib39.debug": "調訊", - "commands.lib39.demo": "演令", - "commands.lib39.demo.message": "此乃展 Lib39 能之演令!", - "commands.lib39.game": "戲控", - "commands.lib39.game.pause": "暫現戲", - "commands.lib39.game.pause.success": "戲已暫!", - "commands.lib39.game.resume": "復暫戲", - "commands.lib39.game.resume.success": "戲已復!", - "commands.lib39.game.start": "啟戲", - "commands.lib39.game.start.success": "戲 '%s' 已啟!", - "commands.lib39.game.stop": "止現戲", - "commands.lib39.game.stop.success": "戲已止!", - "commands.lib39.greet.basic": "問眾安", - "commands.lib39.greet.default": "自 Lib39 問安!", - "commands.lib39.greet.player": "問特者安", - "commands.lib39.greet.received": "%s 問汝安!", - "commands.lib39.help.basic.help": "示助之訊", - "commands.lib39.help.click_expand": "點展", - "commands.lib39.help.command_not_found": "令未見之: %s", - "commands.lib39.help.header": "〇〇 %s 〇〇", - "commands.lib39.help.hover.copy": "點之複刻", - "commands.lib39.help.no_entries": "尚無助之目錄", - "commands.lib39.help.node.expand": "%d 子令已收", - "commands.lib39.help.node.toggle.collapse": "收", - "commands.lib39.help.node.toggle.expand": "展", - "commands.lib39.help.page_info": "第 %d 卷,凡 %d 卷", - "commands.lib39.help.subcommands_title": "子令:", - "commands.lib39.help.toggle_failed": "變更未果: 無貯存之哈希", - "commands.lib39.info": "示者訊", - "commands.lib39.info.dimension": "界:%s", - "commands.lib39.info.message": "〇〇 者訊 〇〇", - "commands.lib39.info.position": "位:X=%.1f, Y=%.1f, Z=%.1f", - "commands.lib39.reload": "重載配", - "commands.lib39.root": "Lib39 令系", - "commands.lib39.settings": "示置", - "commands.lib39.team": "隊管", - "commands.lib39.team.create": "創新隊", - "commands.lib39.team.create.success": "隊 '%s' 創新成!", - "commands.lib39.team.join": "入隊", - "commands.lib39.team.join.success": "已入隊 '%s'", - "commands.lib39.team.leave": "離現隊", - "commands.lib39.team.leave.success": "已離隊", - "commands.lib39.teleport": "送至者(唯管)", - "commands.lib39.teleport.success": "已送至 %s", - "commands.lib39.test": "試令", - "commands.lib39.test.success": "試令行成!", - "commands.lib39.test.with_param": "帶參試令:%s", - "invalid.player_name.too_long": "§c§l玩家名過長,限十六字", - "item.lib39.fabric": "織", - "item.lib39.forge": "砧", - "item.lib39.neoforge": "狸", - "sound.lib39.subtitle.duck_toy": "偶音", - "tooltip.lib39.content.doll.hover.1": "§e膚主§7:§a%s", - "tooltip.lib39.content.doll.hover.2": "§7鐵砧之上,更名以易膚" -} \ No newline at end of file diff --git a/src/generated/resources/assets/lib39/lang/zh_cn.json b/src/generated/resources/assets/lib39/lang/zh_cn.json deleted file mode 100644 index a61d872..0000000 --- a/src/generated/resources/assets/lib39/lang/zh_cn.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "block.lib39.doll": "人偶", - "commands.lib39.calculate": "計算兩個數字的和", - "commands.lib39.calculate.result": "%d + %d = %d", - "commands.lib39.config": "顯示配置", - "commands.lib39.debug": "調試信息", - "commands.lib39.demo": "演示命令", - "commands.lib39.demo.message": "這是一個展示 Lib39 功能的演示命令!", - "commands.lib39.game": "遊戲控制", - "commands.lib39.game.pause": "暫停當前遊戲", - "commands.lib39.game.pause.success": "遊戲已暫停!", - "commands.lib39.game.resume": "恢復暫停的遊戲", - "commands.lib39.game.resume.success": "遊戲已恢復!", - "commands.lib39.game.start": "開始遊戲", - "commands.lib39.game.start.success": "遊戲 '%s' 已開始!", - "commands.lib39.game.stop": "停止當前遊戲", - "commands.lib39.game.stop.success": "遊戲已停止!", - "commands.lib39.greet.basic": "向大家問好", - "commands.lib39.greet.default": "來自 Lib39 的問候!", - "commands.lib39.greet.player": "問候特定玩家", - "commands.lib39.greet.received": "%s 向你問好!", - "commands.lib39.help.basic.help": "显示帮助信息", - "commands.lib39.help.click_expand": "點擊展開", - "commands.lib39.help.command_not_found": "命令不存在: %s", - "commands.lib39.help.header": "===== %s 命令帮助 =====", - "commands.lib39.help.hover.copy": "点击复制", - "commands.lib39.help.no_entries": "暂无帮助条目", - "commands.lib39.help.node.expand": "%d 个子命令已折叠", - "commands.lib39.help.node.toggle.collapse": "折叠", - "commands.lib39.help.node.toggle.expand": "展开", - "commands.lib39.help.page_info": "第 %d 页,共 %d 页", - "commands.lib39.help.subcommands_title": "子命令:", - "commands.lib39.help.toggle_failed": "切换失败: 无缓存Hash", - "commands.lib39.info": "顯示玩家信息", - "commands.lib39.info.dimension": "維度:%s", - "commands.lib39.info.message": "=== 玩家信息 ===", - "commands.lib39.info.position": "位置:X=%.1f, Y=%.1f, Z=%.1f", - "commands.lib39.reload": "重新加載配置", - "commands.lib39.root": "Lib39 命令系統", - "commands.lib39.settings": "顯示設置", - "commands.lib39.team": "隊伍管理", - "commands.lib39.team.create": "創建新隊伍", - "commands.lib39.team.create.success": "隊伍 '%s' 創建成功!", - "commands.lib39.team.join": "加入隊伍", - "commands.lib39.team.join.success": "已加入隊伍 '%s'", - "commands.lib39.team.leave": "離開當前隊伍", - "commands.lib39.team.leave.success": "已離開隊伍", - "commands.lib39.teleport": "傳送到玩家(僅OP)", - "commands.lib39.teleport.success": "已傳送至 %s", - "commands.lib39.test": "測試命令", - "commands.lib39.test.success": "測試命令執行成功!", - "commands.lib39.test.with_param": "帶參數的測試命令:%s", - "invalid.player_name.too_long": "§c§l玩家名称过长(最多16个字符)", - "item.lib39.fabric": "织布", - "item.lib39.forge": "铁砧", - "item.lib39.neoforge": "小狐狸", - "sound.lib39.subtitle.duck_toy": "玩偶声音", - "tooltip.lib39.content.doll.hover.1": "§e皮肤所有者§7:§a%s", - "tooltip.lib39.content.doll.hover.2": "§7在铁砧上可通过重命名对应玩家名来改变皮肤" -} \ No newline at end of file diff --git a/src/generated/resources/assets/lib39/lang/zh_tw.json b/src/generated/resources/assets/lib39/lang/zh_tw.json deleted file mode 100644 index ea721b9..0000000 --- a/src/generated/resources/assets/lib39/lang/zh_tw.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "block.lib39.doll": "人偶", - "commands.lib39.calculate": "計算兩個數字的和", - "commands.lib39.calculate.result": "%d + %d = %d", - "commands.lib39.config": "顯示設定", - "commands.lib39.debug": "除錯資訊", - "commands.lib39.demo": "演示指令", - "commands.lib39.demo.message": "這是一個展示 Lib39 功能的演示指令!", - "commands.lib39.game": "遊戲控制", - "commands.lib39.game.pause": "暫停當前遊戲", - "commands.lib39.game.pause.success": "遊戲已暫停!", - "commands.lib39.game.resume": "恢復暫停的遊戲", - "commands.lib39.game.resume.success": "遊戲已恢復!", - "commands.lib39.game.start": "開始遊戲", - "commands.lib39.game.start.success": "遊戲 '%s' 已開始!", - "commands.lib39.game.stop": "停止當前遊戲", - "commands.lib39.game.stop.success": "遊戲已停止!", - "commands.lib39.greet.basic": "向大家問好", - "commands.lib39.greet.default": "來自 Lib39 的問候!", - "commands.lib39.greet.player": "問候特定玩家", - "commands.lib39.greet.received": "%s 向你問好!", - "commands.lib39.help.basic.help": "顯示幫助信息", - "commands.lib39.help.click_expand": "點擊展開", - "commands.lib39.help.command_not_found": "指令不存在: %s", - "commands.lib39.help.header": "===== %s 命令幫助 =====", - "commands.lib39.help.hover.copy": "點擊複製", - "commands.lib39.help.no_entries": "暫無幫助條目", - "commands.lib39.help.node.expand": "%d 個子指令已折疊", - "commands.lib39.help.node.toggle.collapse": "折疊", - "commands.lib39.help.node.toggle.expand": "展開", - "commands.lib39.help.page_info": "第 %d 頁,共 %d 頁", - "commands.lib39.help.subcommands_title": "子指令:", - "commands.lib39.help.toggle_failed": "切換失敗: 無緩存Hash", - "commands.lib39.info": "顯示玩家資訊", - "commands.lib39.info.dimension": "維度:%s", - "commands.lib39.info.message": "=== 玩家資訊 ===", - "commands.lib39.info.position": "位置:X=%.1f, Y=%.1f, Z=%.1f", - "commands.lib39.reload": "重新載入設定", - "commands.lib39.root": "Lib39 指令系統", - "commands.lib39.settings": "顯示設定", - "commands.lib39.team": "隊伍管理", - "commands.lib39.team.create": "創建新隊伍", - "commands.lib39.team.create.success": "隊伍 '%s' 創建成功!", - "commands.lib39.team.join": "加入隊伍", - "commands.lib39.team.join.success": "已加入隊伍 '%s'", - "commands.lib39.team.leave": "離開當前隊伍", - "commands.lib39.team.leave.success": "已離開隊伍", - "commands.lib39.teleport": "傳送到玩家(僅OP)", - "commands.lib39.teleport.success": "已傳送至 %s", - "commands.lib39.test": "測試指令", - "commands.lib39.test.success": "測試指令執行成功!", - "commands.lib39.test.with_param": "帶參數的測試指令:%s", - "invalid.player_name.too_long": "§c§l玩家名稱過長(最多16個字符)", - "item.lib39.fabric": "織布", - "item.lib39.forge": "铁砧", - "item.lib39.neoforge": "狐狸", - "sound.lib39.subtitle.duck_toy": "玩偶聲音", - "tooltip.lib39.content.doll.hover.1": "§e皮膚所有者§7:§a%s", - "tooltip.lib39.content.doll.hover.2": "§7在鐵砧上可通過重命名對應玩家名來改變皮膚" -} \ No newline at end of file diff --git a/src/generated/resources/assets/lib39/models/item/doll.json b/src/generated/resources/assets/lib39/models/item/doll.json deleted file mode 100644 index 7f6e87a..0000000 --- a/src/generated/resources/assets/lib39/models/item/doll.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "lib39:block/base_doll" -} \ No newline at end of file diff --git a/src/generated/resources/assets/lib39/models/item/fabric.json b/src/generated/resources/assets/lib39/models/item/fabric.json deleted file mode 100644 index 828b259..0000000 --- a/src/generated/resources/assets/lib39/models/item/fabric.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "lib39:item/fabric" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/lib39/models/item/forge.json b/src/generated/resources/assets/lib39/models/item/forge.json deleted file mode 100644 index 8989f8c..0000000 --- a/src/generated/resources/assets/lib39/models/item/forge.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "lib39:item/forge" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/lib39/models/item/neoforge.json b/src/generated/resources/assets/lib39/models/item/neoforge.json deleted file mode 100644 index c0446b5..0000000 --- a/src/generated/resources/assets/lib39/models/item/neoforge.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "lib39:item/neoforge" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/lib39/sounds.json b/src/generated/resources/assets/lib39/sounds.json deleted file mode 100644 index 0bc5c6c..0000000 --- a/src/generated/resources/assets/lib39/sounds.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "duck_toy": { - "sounds": [ - "lib39:duck_toy" - ], - "subtitle": "sound.lib39.subtitle.duck_toy" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/lib39/advancements/recipes/misc/doll.json b/src/generated/resources/data/lib39/advancements/recipes/misc/doll.json deleted file mode 100644 index 2295444..0000000 --- a/src/generated/resources/data/lib39/advancements/recipes/misc/doll.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_armor_stand": { - "conditions": { - "items": [ - { - "items": [ - "minecraft:armor_stand" - ] - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "lib39:doll" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_armor_stand", - "has_the_recipe" - ] - ], - "rewards": { - "recipes": [ - "lib39:doll" - ] - }, - "sends_telemetry_event": false -} \ No newline at end of file diff --git a/src/generated/resources/data/lib39/loot_tables/blocks/doll.json b/src/generated/resources/data/lib39/loot_tables/blocks/doll.json deleted file mode 100644 index 0eea7ef..0000000 --- a/src/generated/resources/data/lib39/loot_tables/blocks/doll.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "lib39:doll" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "lib39:blocks/doll" -} \ No newline at end of file diff --git a/src/generated/resources/data/lib39/recipes/doll.json b/src/generated/resources/data/lib39/recipes/doll.json deleted file mode 100644 index bf0d88f..0000000 --- a/src/generated/resources/data/lib39/recipes/doll.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "category": "misc", - "ingredients": [ - { - "tag": "minecraft:wool" - }, - { - "item": "minecraft:armor_stand" - } - ], - "result": { - "item": "lib39:doll" - } -} \ No newline at end of file diff --git a/src/main/java/top/r3944realms/lib39/Lib39.java b/src/main/java/top/r3944realms/lib39/Lib39.java deleted file mode 100644 index 413a019..0000000 --- a/src/main/java/top/r3944realms/lib39/Lib39.java +++ /dev/null @@ -1,140 +0,0 @@ -package top.r3944realms.lib39; - -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.fml.loading.FMLEnvironment; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import top.r3944realms.lib39.content.register.Lib39BlockEntities; -import top.r3944realms.lib39.content.register.Lib39Blocks; -import top.r3944realms.lib39.content.register.Lib39Items; -import top.r3944realms.lib39.content.register.Lib39SoundEvents; -import top.r3944realms.lib39.core.network.NetworkHandler; -import top.r3944realms.lib39.example.Lib39Example; - -/** - * The type Lib 39. - */ -@Mod(Lib39.MOD_ID) -public class Lib39 { - /** - * The constant MOD_ID. - */ - public static final String MOD_ID = "lib39"; - /** - * The constant LOGGER. - */ - public static final Logger LOGGER = LoggerFactory.getLogger(Lib39.class); - - /** - * Instantiates a new Lib 39. - */ - public Lib39() { - initialize(); - } - - /** - * The constant ENABLE_EXAMPLES_PROPERTY_KEY. - */ - public static final String ENABLE_EXAMPLES_PROPERTY_KEY = "lib39.enable_examples"; - - /** - * Initialize. - */ - public static void initialize() { - LOGGER.info("[Lib39] Initializing Lib39"); - IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); - Lib39Blocks.register(modEventBus); - Lib39BlockEntities.register(modEventBus); - Lib39Items.register(modEventBus); - Lib39SoundEvents.register(modEventBus); - NetworkHandler.register(); - if (shouldRegisterExamples()) { - LOGGER.info("[Lib39] Registering Examples"); - registerExamples(); - } - LOGGER.info("[Lib39] Initialized Lib39"); - - } - - /** - * Rl resource location. - * - * @param path the path - * @return the resource location - */ - @Contract("_ -> new") - public static @NotNull ResourceLocation rl(String path) { - return new ResourceLocation(MOD_ID, path); - } - - /** - * Rl resource location. - * - * @param modId the mod id - * @param path the path - * @return the resource location - */ - @Contract("_, _ -> new") - public static @NotNull ResourceLocation rl(String modId, String path) { - return new ResourceLocation(modId, path); - } - - /** - * Mrl resource location. - * - * @param path the path - * @return the resource location - */ - @Contract("_ -> new") - public static @NotNull ResourceLocation mrl(String path) { - return new ResourceLocation(path); - } - - /** - * The type Mod info. - */ - public static class ModInfo { - /** - * The constant VERSION. - */ - public static final String VERSION; - static { - // 从 ModList 获取当前 ModContainer 的元数据 - VERSION = ModList.get() - .getModContainerById(MOD_ID) - .map(c -> c.getModInfo().getVersion().toString()) - .orElse("UNKNOWN"); - } - } - - /** - * Should register examples boolean. - * - * @return the boolean - */ - public static boolean shouldRegisterExamples() { - return !FMLEnvironment.production || Boolean.getBoolean(ENABLE_EXAMPLES_PROPERTY_KEY); - } - - /** - * Register examples. - */ - static void registerExamples() { - LOGGER.info("[Lib39] Starting example demonstrations"); - try { - // 创建示例实例并演示功能 - Lib39Example example = new Lib39Example(); - example.demonstrateFeature(); - - LOGGER.info("[Lib39] Example demonstrations completed successfully"); - } catch (Exception e) { - LOGGER.error("[Lib39] Failed to demonstrate examples", e); - } - } -} diff --git a/src/main/java/top/r3944realms/lib39/api/event/MinecraftSetUpServiceEvent.java b/src/main/java/top/r3944realms/lib39/api/event/MinecraftSetUpServiceEvent.java deleted file mode 100644 index e15831f..0000000 --- a/src/main/java/top/r3944realms/lib39/api/event/MinecraftSetUpServiceEvent.java +++ /dev/null @@ -1,31 +0,0 @@ -package top.r3944realms.lib39.api.event; - -import net.minecraft.server.Services; -import net.minecraftforge.eventbus.api.Event; - -import java.util.concurrent.Executor; - -/** - * The type Minecraft set up service event. - */ -public class MinecraftSetUpServiceEvent extends Event { - /** - * The Services. - */ - public final Services services; - /** - * The Main thread executor. - */ - public final Executor mainThreadExecutor; - - /** - * Instantiates a new Minecraft set up service event. - * - * @param services the services - * @param mainThreadExecutor the main thread executor - */ - public MinecraftSetUpServiceEvent(Services services, Executor mainThreadExecutor) { - this.services = services; - this.mainThreadExecutor = mainThreadExecutor; - } -} diff --git a/src/main/java/top/r3944realms/lib39/api/event/RegisterCommandHelpEvent.java b/src/main/java/top/r3944realms/lib39/api/event/RegisterCommandHelpEvent.java deleted file mode 100644 index fe267f9..0000000 --- a/src/main/java/top/r3944realms/lib39/api/event/RegisterCommandHelpEvent.java +++ /dev/null @@ -1,100 +0,0 @@ -package top.r3944realms.lib39.api.event; - -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import net.minecraft.commands.CommandBuildContext; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.eventbus.api.Event; -import top.r3944realms.lib39.core.command.ICommandHelpManager; -import top.r3944realms.lib39.core.command.model.CommandNode; -import top.r3944realms.lib39.core.command.model.CommandPath; -import top.r3944realms.lib39.core.command.model.Parameter; - -/** - * The type Register command help event. - */ -public class RegisterCommandHelpEvent extends Event { - private final LiteralArgumentBuilder builder; - private final ICommandHelpManager helpManager; - private final CommandBuildContext context; - - /** - * Instantiates a new Register command help event. - * - * @param builder the builder - * @param helpManager the help manager - * @param source the source - */ - public RegisterCommandHelpEvent(LiteralArgumentBuilder builder, ICommandHelpManager helpManager, CommandBuildContext source) { - this.builder = builder; - this.helpManager = helpManager; - this.context = source; - } - - /** - * Gets id. - * - * @return the id - */ - public ResourceLocation getID() { - return helpManager.getID(); - } - - /** - * Add child. - * - * @param child the child - */ - public void addChild(LiteralArgumentBuilder child) { - this.builder.then(child); - } - - /** - * Get context command build context. - * - * @return the command build context - */ - public CommandBuildContext getContext(){ - return this.context; - } - - /** - * Get tree literal argument builder. - * - * @return the literal argument builder - */ - public LiteralArgumentBuilder getTree(){ - return this.builder; - } - - /** - * 注册命令帮助信息 - * - * @param CommandNode 命令节点 - * @param description 命令描述 - */ - public void registerHelp(CommandNode CommandNode, MutableComponent description) { - this.helpManager.registerCommandHelp(CommandNode, description); - } - - /** - * 注册命令帮助信息 - * - * @param CommandNode 命令节点 - * @param descriptionKey 命令描述的语言键 - */ - public void registerHelp(CommandNode CommandNode, String descriptionKey) { - this.helpManager.registerCommandHelp(CommandNode, descriptionKey); - } - - /** - * 注册命令参数 - * - * @param commandPath 命令节点 - * @param parametersBuilder 参数列表构造器 - */ - public void registerParameters(CommandPath commandPath, Parameter.Builder parametersBuilder) { - this.helpManager.registerCommandParameters(commandPath, parametersBuilder); - } -} diff --git a/src/main/java/top/r3944realms/lib39/api/event/SyncManagerRegisterEvent.java b/src/main/java/top/r3944realms/lib39/api/event/SyncManagerRegisterEvent.java deleted file mode 100644 index 0f106a6..0000000 --- a/src/main/java/top/r3944realms/lib39/api/event/SyncManagerRegisterEvent.java +++ /dev/null @@ -1,170 +0,0 @@ -package top.r3944realms.lib39.api.event; - -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.Entity; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.eventbus.api.Event; -import org.jetbrains.annotations.NotNull; -import top.r3944realms.lib39.core.sync.ISyncData; -import top.r3944realms.lib39.core.sync.ISyncManager; -import top.r3944realms.lib39.core.sync.SyncData2Manager; - -import java.util.Optional; -import java.util.function.Function; - -/** - * The type Sync manager register event. - */ -@SuppressWarnings("unused") -public class SyncManagerRegisterEvent extends Event { - /** - * The Syncs 2 manager. - */ - protected final SyncData2Manager syncs2Manager; - - /** - * Instantiates a new Sync manager register event. - * - * @param syncsManager the syncs manager - */ - public SyncManagerRegisterEvent(SyncData2Manager syncsManager) { - this.syncs2Manager = syncsManager; - } - - /** - * Gets syncs manager. - * - * @return the syncs manager - */ - public SyncData2Manager getSyncsManager() { - return syncs2Manager; - } - - /** - * 类型安全的同步管理器注册 - * - * @param the type parameter - * @param the type parameter - * @param id the id - * @param syncManager the sync manager - * @param capability the capability - */ - public > void registerSyncManager( - ResourceLocation id, - ISyncManager syncManager, - Capability capability - ) { - syncs2Manager.registerManager(id, syncManager, entity -> entity.getCapability(capability).resolve()); - } - - /** - * 类型安全的同步管理器注册 - * - * @param the type parameter - * @param the type parameter - * @param id the id - * @param syncManager the sync manager - * @param dataProvider the dataProvider - */ - public > void registerSyncManager( - ResourceLocation id, - ISyncManager syncManager, - Function> dataProvider - ) { - syncs2Manager.registerManager(id, syncManager, dataProvider); - } - - - /** - * Unregister sync manager. - * - * @param id the id - */ - public void unregisterSyncManager(ResourceLocation id) { - syncs2Manager.removeManager(id); - } - - /** - * 允许实体类 - * - * @param id the id - * @param entityClasses the entity classes - */ - public final void addAllowEntityClass(ResourceLocation id, Class... entityClasses) { - syncs2Manager.allowEntityClass(id, entityClasses); - } - - /** - * 移除允许的实体类 - * - * @param id the id - * @param entityClasses the entity classes - */ - public final void removeAllowEntityClass(ResourceLocation id, Class... entityClasses) { - syncs2Manager.disallowEntityClass(id, entityClasses); - } - - /** - * 绑定能力(用于分离注册的情况) - * - * @param the type parameter - * @param id 必须先注册安全同步管理器,再绑定Cap,否则会抛出{@link IllegalStateException 未找到对应安全同步管理器} - * @param capability the capability - */ - public > void bindCapability(ResourceLocation id, Capability capability) { - syncs2Manager.bindDataGetter(id, entity -> entity.getCapability(capability).resolve()); - } - - /** - * 解绑数据提供者 - * - * @param id the id - */ - public void unbindDataProvider(ResourceLocation id) { - syncs2Manager.unbindDataProvider(id); - } - - /** - * 完整的类型安全注册 - * - * @param the type parameter - * @param the type parameter - * @param id the id - * @param syncManager the sync manager - * @param capability the capability - * @param allowedEntityClasses the allowed entity classes - */ - public > void registerComplete( - ResourceLocation id, - ISyncManager syncManager, - Capability capability, - Class... allowedEntityClasses - ) { - registerSyncManager(id, syncManager, capability); - if (allowedEntityClasses.length > 0) { - addAllowEntityClass(id, allowedEntityClasses); - } - } - - /** - * 完整的类型安全注册 - * - * @param the type parameter - * @param the type parameter - * @param id the id - * @param syncManager the sync manager - * @param dataProvider the capability - * @param allowedEntityClasses the allowed entity classes - */ - public > void registerComplete( - ResourceLocation id, - ISyncManager syncManager, - Function> dataProvider, - Class @NotNull ... allowedEntityClasses - ) { - registerSyncManager(id, syncManager, dataProvider); - if (allowedEntityClasses.length > 0) { - addAllowEntityClass(id, allowedEntityClasses); - } - } -} \ No newline at end of file diff --git a/src/main/java/top/r3944realms/lib39/base/command/Lib39CommandHelpManager.java b/src/main/java/top/r3944realms/lib39/base/command/Lib39CommandHelpManager.java deleted file mode 100644 index bc43ef6..0000000 --- a/src/main/java/top/r3944realms/lib39/base/command/Lib39CommandHelpManager.java +++ /dev/null @@ -1,36 +0,0 @@ -package top.r3944realms.lib39.base.command; - -import net.minecraft.resources.ResourceLocation; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.core.command.SimpleCommandHelpManager; - -/** - * The type Lib 39 command help manager. - */ -public class Lib39CommandHelpManager extends SimpleCommandHelpManager { - /** - * The constant INSTANCE. - */ - public static volatile Lib39CommandHelpManager INSTANCE = new Lib39CommandHelpManager(); - /** - * The Id. - */ - ResourceLocation ID = Lib39.rl("command_helper"); - - /** - * Instantiates a new Lib 39 command help manager. - */ - public Lib39CommandHelpManager() { - initialize(); - } - - @Override - public ResourceLocation getID() { - return ID; - } - - @Override - public String getHeadKey() { - return "lib39"; - } -} diff --git a/src/main/java/top/r3944realms/lib39/base/command/Lib39HelpCommand.java b/src/main/java/top/r3944realms/lib39/base/command/Lib39HelpCommand.java deleted file mode 100644 index 50dd11b..0000000 --- a/src/main/java/top/r3944realms/lib39/base/command/Lib39HelpCommand.java +++ /dev/null @@ -1,404 +0,0 @@ -package top.r3944realms.lib39.base.command; - -import com.mojang.brigadier.Command; -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.arguments.IntegerArgumentType; -import com.mojang.brigadier.arguments.StringArgumentType; -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.Commands; -import net.minecraft.commands.arguments.EntityArgument; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.event.RegisterCommandsEvent; -import org.jetbrains.annotations.NotNull; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.core.command.ICommandHelpManager; -import top.r3944realms.lib39.core.command.SimpleHelpCommand; - -import java.util.Map; - -/** - * The type Lib 39 help command. - */ -public class Lib39HelpCommand extends SimpleHelpCommand { - - /** - * Instantiates a new Lib 39 help command. - * - * @param event the event - */ - public Lib39HelpCommand(@NotNull RegisterCommandsEvent event) { - super(event); - if(Lib39.shouldRegisterExamples()) { - // 在這裡註冊測試命令 - registerTestCommands(event.getDispatcher()); - } - } - - @Override - public ICommandHelpManager getCommandHelpManager() { - return Lib39CommandHelpManager.INSTANCE; - } - - /** - * 註冊測試命令 - */ - private void registerTestCommands(@NotNull CommandDispatcher dispatcher) { - // 註冊幫助系統本身 - dispatcher.register( - getRoot() - .then(Commands.literal("test") - .executes(this::executeTest) - .then(Commands.argument("param", StringArgumentType.string()) - .executes(this::executeTestWithParam)) - ) - .then(Commands.literal("demo") - .executes(this::executeDemo) - ) - ); - - // 註冊其他測試命令 - registerTestCommandTree(dispatcher); - - // 在幫助系統中註冊這些命令 - registerCommandsInHelpSystem(); - } - - /** - * 註冊測試命令樹 - */ - private void registerTestCommandTree(@NotNull CommandDispatcher dispatcher) { - // 基本命令 - dispatcher.register( - Commands.literal("lib39") - .then(Commands.literal("greet") - .executes(this::executeGreet) - .then(Commands.argument("player", EntityArgument.player()) - .executes(this::executeGreetPlayer)) - ) - .then(Commands.literal("calculate") - .then(Commands.argument("a", IntegerArgumentType.integer()) - .then(Commands.argument("b", IntegerArgumentType.integer()) - .executes(this::executeCalculate))) - ) - .then(Commands.literal("teleport") - .requires(source -> source.hasPermission(2)) // 需要OP權限 - .then(Commands.argument("target", EntityArgument.player()) - .executes(this::executeTeleport)) - ) - .then(Commands.literal("info") - .executes(this::executeInfo) - ) - ); - - // 嵌套命令示例 - dispatcher.register( - Commands.literal("lib39") - .then(Commands.literal("team") - .then(Commands.literal("create") - .then(Commands.argument("teamName", StringArgumentType.string()) - .executes(this::executeTeamCreate)) - ) - .then(Commands.literal("join") - .then(Commands.argument("teamName", StringArgumentType.string()) - .executes(this::executeTeamJoin)) - ) - .then(Commands.literal("leave") - .executes(this::executeTeamLeave)) - ) - .then(Commands.literal("game") - .then(Commands.literal("start") - .then(Commands.argument("map", StringArgumentType.string()) - .executes(this::executeGameStart)) - ) - .then(Commands.literal("stop") - .executes(this::executeGameStop)) - .then(Commands.literal("pause") - .executes(this::executeGamePause)) - .then(Commands.literal("resume") - .executes(this::executeGameResume)) - ) - ); - } - - /** - * 在幫助系統中註冊命令 - */ - private void registerCommandsInHelpSystem() { - ICommandHelpManager helpManager = getCommandHelpManager(); - - // 使用Builder模式註冊完整的命令樹 - helpManager.registerCommands(builder -> { - builder.root("lib39", "commands.lib39.root") - .expanded(true) // 根節點默認展開 - - // 問候命令 - 添加多個子命令 - .branch("greet", "commands.lib39.greet.basic", greetBuilder -> { - greetBuilder.expanded(false); // 默認摺疊 - greetBuilder.leaf("hello", "commands.lib39.greet.hello"); - greetBuilder.leaf("morning", "commands.lib39.greet.morning"); - greetBuilder.leaf("evening", "commands.lib39.greet.evening"); - greetBuilder.push("player", "commands.lib39.greet.player") - .required("player") - .pop(); - }) - - // 計算命令 - .push("calculate", "commands.lib39.calculate") - .required("a") - .required("b") - .pop() - - // 傳送命令 - .push("teleport", "commands.lib39.teleport") - .required("target") - .pop() - - // 信息命令 - .leaf("info", "commands.lib39.info") - - // 隊伍系統 - 添加多個子命令 - .branch("team", "commands.lib39.team", teamBuilder -> { - teamBuilder.expanded(false); // 默認摺疊 - teamBuilder.leaf("create", "commands.lib39.team.create") - .required("teamName"); - teamBuilder.leaf("join", "commands.lib39.team.join") - .required("teamName"); - teamBuilder.leaf("leave", "commands.lib39.team.leave"); - teamBuilder.leaf("list", "commands.lib39.team.list"); - teamBuilder.leaf("info", "commands.lib39.team.info"); - }) - - // 遊戲系統 - 添加多個子命令 - .branch("game", "commands.lib39.game", gameBuilder -> { - gameBuilder.expanded(false); // 默認摺疊 - gameBuilder.leaf("start", "commands.lib39.game.start") - .required("map"); - gameBuilder.leaf("stop", "commands.lib39.game.stop"); - gameBuilder.leaf("pause", "commands.lib39.game.pause"); - gameBuilder.leaf("resume", "commands.lib39.game.resume"); - gameBuilder.leaf("status", "commands.lib39.game.status"); - }) - - // 設置命令 - .leavesT(Map.of( - "settings", "commands.lib39.settings", - "config", "commands.lib39.config", - "reload", "commands.lib39.reload", - "debug", "commands.lib39.debug", - "demo", "commands.lib39.demo", - "test", "commands.lib39.test" - )); - }); - } - - // ==================== 命令執行方法 ==================== - - private int executeTest(CommandContext context) { - CommandSourceStack source = context.getSource(); - source.sendSuccess(() -> - Component.translatable("commands.lib39.test.success") - .withStyle(net.minecraft.ChatFormatting.GREEN), - false - ); - return Command.SINGLE_SUCCESS; - } - - private int executeTestWithParam(CommandContext context) { - String param = StringArgumentType.getString(context, "param"); - CommandSourceStack source = context.getSource(); - source.sendSuccess(() -> - Component.translatable("commands.lib39.test.with_param", param) - .withStyle(net.minecraft.ChatFormatting.AQUA), - false - ); - return Command.SINGLE_SUCCESS; - } - - private int executeDemo(CommandContext context) { - CommandSourceStack source = context.getSource(); - source.sendSuccess(() -> - Component.translatable("commands.lib39.demo.message") - .withStyle(net.minecraft.ChatFormatting.GOLD), - false - ); - return Command.SINGLE_SUCCESS; - } - - private int executeGreet(CommandContext context) { - CommandSourceStack source = context.getSource(); - source.sendSuccess(() -> - Component.translatable("commands.lib39.greet.default") - .withStyle(net.minecraft.ChatFormatting.YELLOW), - false - ); - return Command.SINGLE_SUCCESS; - } - - private int executeGreetPlayer(CommandContext context) throws CommandSyntaxException { - ServerPlayer player = EntityArgument.getPlayer(context, "player"); - CommandSourceStack source = context.getSource(); - - source.sendSuccess(() -> - Component.translatable("commands.lib39.greet.player", player.getDisplayName()) - .withStyle(net.minecraft.ChatFormatting.GREEN), - false - ); - - player.sendSystemMessage( - Component.translatable("commands.lib39.greet.received", source.getDisplayName()) - .withStyle(net.minecraft.ChatFormatting.AQUA) - ); - - return Command.SINGLE_SUCCESS; - } - - private int executeCalculate(CommandContext context) { - int a = IntegerArgumentType.getInteger(context, "a"); - int b = IntegerArgumentType.getInteger(context, "b"); - int sum = a + b; - - CommandSourceStack source = context.getSource(); - source.sendSuccess(() -> - Component.translatable("commands.lib39.calculate.result", a, b, sum) - .withStyle(net.minecraft.ChatFormatting.LIGHT_PURPLE), - false - ); - - return Command.SINGLE_SUCCESS; - } - - private int executeTeleport(CommandContext context) throws CommandSyntaxException { - ServerPlayer target = EntityArgument.getPlayer(context, "target"); - CommandSourceStack source = context.getSource(); - - if (source.getEntity() instanceof ServerPlayer player) { - player.teleportTo( - target.serverLevel(), - target.getX(), - target.getY(), - target.getZ(), - target.getYRot(), - target.getXRot() - ); - - source.sendSuccess(() -> - Component.translatable("commands.lib39.teleport.success", target.getDisplayName()) - .withStyle(net.minecraft.ChatFormatting.GREEN), - false - ); - } - - return Command.SINGLE_SUCCESS; - } - - private int executeInfo(CommandContext context) { - CommandSourceStack source = context.getSource(); - ResourceLocation dimension = source.getLevel().dimension().location(); - - source.sendSuccess(() -> - Component.translatable("commands.lib39.info.message") - .append("\n") - .append(Component.translatable("commands.lib39.info.dimension", dimension)) - .append("\n") - .append(Component.translatable("commands.lib39.info.position", - String.format("%.1f", source.getPosition().x()), - String.format("%.1f", source.getPosition().y()), - String.format("%.1f", source.getPosition().z()))) - .withStyle(net.minecraft.ChatFormatting.AQUA), - false - ); - - return Command.SINGLE_SUCCESS; - } - - private int executeTeamCreate(CommandContext context) { - String teamName = StringArgumentType.getString(context, "teamName"); - CommandSourceStack source = context.getSource(); - - source.sendSuccess(() -> - Component.translatable("commands.lib39.team.create.success", teamName) - .withStyle(net.minecraft.ChatFormatting.GREEN), - false - ); - - return Command.SINGLE_SUCCESS; - } - - private int executeTeamJoin(CommandContext context) { - String teamName = StringArgumentType.getString(context, "teamName"); - CommandSourceStack source = context.getSource(); - - source.sendSuccess(() -> - Component.translatable("commands.lib39.team.join.success", teamName) - .withStyle(net.minecraft.ChatFormatting.GREEN), - false - ); - - return Command.SINGLE_SUCCESS; - } - - private int executeTeamLeave(CommandContext context) { - CommandSourceStack source = context.getSource(); - - source.sendSuccess(() -> - Component.translatable("commands.lib39.team.leave.success") - .withStyle(net.minecraft.ChatFormatting.YELLOW), - false - ); - - return Command.SINGLE_SUCCESS; - } - - private int executeGameStart(CommandContext context) { - String map = StringArgumentType.getString(context, "map"); - CommandSourceStack source = context.getSource(); - - source.sendSuccess(() -> - Component.translatable("commands.lib39.game.start.success", map) - .withStyle(net.minecraft.ChatFormatting.GREEN), - false - ); - - return Command.SINGLE_SUCCESS; - } - - private int executeGameStop(CommandContext context) { - CommandSourceStack source = context.getSource(); - - source.sendSuccess(() -> - Component.translatable("commands.lib39.game.stop.success") - .withStyle(net.minecraft.ChatFormatting.RED), - false - ); - - return Command.SINGLE_SUCCESS; - } - - private int executeGamePause(CommandContext context) { - CommandSourceStack source = context.getSource(); - - source.sendSuccess(() -> - Component.translatable("commands.lib39.game.pause.success") - .withStyle(net.minecraft.ChatFormatting.YELLOW), - false - ); - - return Command.SINGLE_SUCCESS; - } - - private int executeGameResume(CommandContext context) { - CommandSourceStack source = context.getSource(); - - source.sendSuccess(() -> - Component.translatable("commands.lib39.game.resume.success") - .withStyle(net.minecraft.ChatFormatting.GREEN), - false - ); - - return Command.SINGLE_SUCCESS; - } -} diff --git a/src/main/java/top/r3944realms/lib39/base/datagen/Lib39BaseDataGenEvent.java b/src/main/java/top/r3944realms/lib39/base/datagen/Lib39BaseDataGenEvent.java deleted file mode 100644 index a8fb271..0000000 --- a/src/main/java/top/r3944realms/lib39/base/datagen/Lib39BaseDataGenEvent.java +++ /dev/null @@ -1,85 +0,0 @@ -package top.r3944realms.lib39.base.datagen; - -import net.minecraft.data.DataProvider; -import net.minecraftforge.data.event.GatherDataEvent; -import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.base.datagen.provider.*; -import top.r3944realms.lib39.base.datagen.value.Lib39LangKey; -import top.r3944realms.lib39.datagen.provider.SimpleLanguageProvider; -import top.r3944realms.lib39.datagen.provider.SimpleLootTableProvider; -import top.r3944realms.lib39.datagen.provider.SubProvidersWrapper; -import top.r3944realms.lib39.datagen.value.McLocale; - -/** - * The type Lib 39 base data gen event. - */ -public class Lib39BaseDataGenEvent { - /** - * The Logger. - */ - static Logger logger = LoggerFactory.getLogger(Lib39BaseDataGenEvent.class); - - /** - * Gather data. - * - * @param event the event - */ - public static void gatherData(GatherDataEvent event) { - logger.info("GatherDataEvent thread: {}", Thread.currentThread().getName()); - LanguageGenerator(event, McLocale.EN_US); - LanguageGenerator(event, McLocale.ZH_CN); - LanguageGenerator(event, McLocale.ZH_TW); - LanguageGenerator(event, McLocale.LZH); - BlockModelDataGenerate(event); - BlockStateDataGenerate(event); - ItemModelDataGenerate(event); - LootTableDataGenerate(event); - SoundDefinitionDataGenerate(event); - RecipeGenerator(event); - } - private static void LanguageGenerator(@NotNull GatherDataEvent event, McLocale language) { - event.getGenerator().addProvider( - event.includeClient(), - (DataProvider.Factory) pOutput -> new SimpleLanguageProvider(pOutput, Lib39.MOD_ID ,language , Lib39LangKey.INSTANCE) - ); - } - private static void ItemModelDataGenerate(@NotNull GatherDataEvent event) { - event.getGenerator().addProvider( - event.includeClient(), - (DataProvider.Factory) pOutput -> new Lib39ItemModelProvider(pOutput, event.getExistingFileHelper()) - ); - } - private static void BlockModelDataGenerate(@NotNull GatherDataEvent event) { - event.getGenerator().addProvider( - event.includeClient(), - (DataProvider.Factory) pOutput -> new Lib39BlockModelProvider(pOutput, event.getExistingFileHelper()) - ); - } - private static void BlockStateDataGenerate(@NotNull GatherDataEvent event) { - event.getGenerator().addProvider( - event.includeClient(), - (DataProvider.Factory) pOutput -> new Lib39BlockStatesProvider(pOutput, event.getExistingFileHelper()) - ); - } - private static void SoundDefinitionDataGenerate(@NotNull GatherDataEvent event) { - event.getGenerator().addProvider( - event.includeClient(), - (DataProvider.Factory) pOutput -> new Lib39SoundDefinitionsProvider(pOutput, event.getExistingFileHelper()) - ); - } - private static void LootTableDataGenerate(@NotNull GatherDataEvent event) { - event.getGenerator().addProvider( - event.includeServer(), - (DataProvider.Factory) pOutput -> new SimpleLootTableProvider(pOutput, new SubProvidersWrapper().addBlockEntry(new Lib39BlockLootTable())) - ); - } - private static void RecipeGenerator(@NotNull GatherDataEvent event) { - event.getGenerator().addProvider( - event.includeServer(), - (DataProvider.Factory) Lib39RecipeProvider::new - ); - } -} diff --git a/src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39BlockLootTable.java b/src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39BlockLootTable.java deleted file mode 100644 index 32ca5fd..0000000 --- a/src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39BlockLootTable.java +++ /dev/null @@ -1,17 +0,0 @@ -package top.r3944realms.lib39.base.datagen.provider; - -import top.r3944realms.lib39.content.register.Lib39Blocks; -import top.r3944realms.lib39.datagen.provider.subprovider.BlockLootTables; - -/** - * The type Lib 39 block loot table. - */ -public class Lib39BlockLootTable extends BlockLootTables { - /** - * Instantiates a new Lib 39 block loot table. - */ - public Lib39BlockLootTable() { - super(Lib39Blocks.BLOCKS); - dropSelf(Lib39Blocks.DOLL); - } -} diff --git a/src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39BlockModelProvider.java b/src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39BlockModelProvider.java deleted file mode 100644 index 3aee570..0000000 --- a/src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39BlockModelProvider.java +++ /dev/null @@ -1,44 +0,0 @@ -package top.r3944realms.lib39.base.datagen.provider; - -import net.minecraft.data.PackOutput; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.client.model.generators.BlockModelProvider; -import net.minecraftforge.common.data.ExistingFileHelper; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.util.PlantHelper; - -/** - * The type Lib 39 block model provider. - */ -public class Lib39BlockModelProvider extends BlockModelProvider { - /** - * Instantiates a new Lib 39 block model provider. - * - * @param output the output - * @param existingFileHelper the existing file helper - */ - public Lib39BlockModelProvider(PackOutput output, ExistingFileHelper existingFileHelper) { - super(output, Lib39.MOD_ID, existingFileHelper); - } - - @Override - protected void registerModels() { -// registerPlants(); - } - - /** - * Register plants. - */ - protected void registerPlants() { - for (PlantHelper.Plant plant: PlantHelper.Plant.values()) { - createPlantsModel(plant); - } - } - private void createPlantsModel(PlantHelper.Plant plant) { - ResourceLocation rl = PlantHelper.getTextureRL(plant); - getBuilder("block/doll_item/" + plant) - .parent(getExistingFile(Lib39.rl("block/base_doll_item"))) - .texture("item", rl) - .ao(false); - } -} diff --git a/src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39BlockStatesProvider.java b/src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39BlockStatesProvider.java deleted file mode 100644 index 6aea18b..0000000 --- a/src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39BlockStatesProvider.java +++ /dev/null @@ -1,74 +0,0 @@ -package top.r3944realms.lib39.base.datagen.provider; - -import net.minecraft.core.Direction; -import net.minecraft.data.PackOutput; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraftforge.client.model.generators.BlockStateProvider; -import net.minecraftforge.client.model.generators.ConfiguredModel; -import net.minecraftforge.client.model.generators.ModelFile; -import net.minecraftforge.common.data.ExistingFileHelper; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.content.register.Lib39Blocks; - -/** - * The type Lib 39 block states provider. - */ -public class Lib39BlockStatesProvider extends BlockStateProvider { - /** - * Instantiates a new Lib 39 block states provider. - * - * @param output the output - * @param exFileHelper the ex file helper - */ - public Lib39BlockStatesProvider(PackOutput output, ExistingFileHelper exFileHelper) { - super(output, Lib39.MOD_ID, exFileHelper); - } - @Override - protected void registerStatesAndModels() { - generateDollBlockStatesSimple(); - } - private void generateDollBlockStatesSimple() { - Block doll = Lib39Blocks.DOLL.get(); - - // 创建GeckoLib模型引用 - ModelFile modelFile = new ModelFile.ExistingModelFile( - Lib39.rl( "block/base_doll"), - models().existingFileHelper - ); - - getVariantBuilder(doll).forAllStates(state -> { - Direction direction = state.getValue(BlockStateProperties.HORIZONTAL_FACING); - int rotationY = getMainNorthRotationY(direction); - - return ConfiguredModel.builder() - .modelFile(modelFile) - .rotationY(rotationY) - .build(); - }); - } - - @Contract(pure = true) - private int getMainWestRotationY(@NotNull Direction direction) { - return switch (direction) { - case WEST -> 0; // 西 - 基准方向,0度 - case NORTH -> 90; // 北 - 相对于西旋转90度 - case EAST -> 180; // 东 - 相对于西旋转180度 - case SOUTH -> 270; // 南 - 相对于西旋转270度 - default -> 0; - }; - } - - @Contract(pure = true) - private int getMainNorthRotationY(@NotNull Direction direction) { - return switch (direction) { - case WEST -> 270; // 西 - 基准方向,270度 - case NORTH -> 0; // 北 - 相对于西旋转0度 - case EAST -> 90; // 东 - 相对于西旋转90度 - case SOUTH -> 180; // 南 - 相对于西旋转180度 - default -> 0; - }; - } -} diff --git a/src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39ItemModelProvider.java b/src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39ItemModelProvider.java deleted file mode 100644 index 563615f..0000000 --- a/src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39ItemModelProvider.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Super Lead rope mod - * Copyright (C) 2025 R3944Realms - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package top.r3944realms.lib39.base.datagen.provider; - -import net.minecraft.data.PackOutput; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Item; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.registries.ForgeRegistries; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.base.datagen.value.Lib39LangKey; -import top.r3944realms.lib39.datagen.value.LangKeyValue; -import top.r3944realms.lib39.datagen.value.ModPartEnum; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -/** - * The type item model provider. - */ -public class Lib39ItemModelProvider extends net.minecraftforge.client.model.generators.ItemModelProvider { - private static List objectList; - /** - * The constant GENERATED. - */ - public static final String GENERATED = "item/generated"; - /** - * The constant HANDHELD. - */ - public static final String HANDHELD = "item/handheld"; - - /** - * Instantiates a new item model provider. - * - * @param output the output - * @param existingFileHelper the existing file helper - */ - public Lib39ItemModelProvider(PackOutput output, ExistingFileHelper existingFileHelper) { - super(output, Lib39.MOD_ID, existingFileHelper); - objectList = new ArrayList<>(); - init(); - } - - @Override - protected void registerModels() { - defaultModItemModelRegister(); - generateDollItemModel(); - } - private void init() { - for(LangKeyValue obj : Lib39LangKey.INSTANCE.getValues()) { - if(!(obj.isDefault() && obj.getMPE().equals(ModPartEnum.ITEM))) continue; - objectList.add(obj.getItem()); - } - } - /** - * @implNote
 先有纹理才会成功构建 - */ - private void defaultModItemModelRegister() { - objectList.forEach(this::basicItem); - } - - /** - * Item generate model. - * - * @param item the item - * @param location the location - */ - public void itemGenerateModel(Item item, ResourceLocation location){ - withExistingParent(itemName(item), GENERATED).texture("layer0", location); - } - - /** - * Item hand held model. - * - * @param item the item - * @param location the location - */ - public void itemHandHeldModel(Item item, ResourceLocation location){ - withExistingParent(itemName(item), HANDHELD).texture("layer0", location); - } - - /** - * Generate doll item model. - */ - protected void generateDollItemModel() { - getBuilder("doll") - .parent(getExistingFile(Lib39.rl("block/base_doll"))); - } - - /** - * Item name string. - * - * @param item the item - * @return the string - */ - public String itemName(Item item){ - return Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(item)).getPath(); - } - - /** - * Resource item resource location. - * - * @param path the path - * @return the resource location - */ - public ResourceLocation resourceItem(String path){ - return modLoc("item/" + path); - } -} diff --git a/src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39RecipeProvider.java b/src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39RecipeProvider.java deleted file mode 100644 index 0e2be5e..0000000 --- a/src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39RecipeProvider.java +++ /dev/null @@ -1,36 +0,0 @@ -package top.r3944realms.lib39.base.datagen.provider; - -import net.minecraft.data.PackOutput; -import net.minecraft.data.recipes.FinishedRecipe; -import net.minecraft.data.recipes.RecipeCategory; -import net.minecraft.data.recipes.RecipeProvider; -import net.minecraft.data.recipes.ShapelessRecipeBuilder; -import net.minecraft.tags.ItemTags; -import net.minecraft.world.item.Items; -import org.jetbrains.annotations.NotNull; -import top.r3944realms.lib39.content.register.Lib39Items; - -import java.util.function.Consumer; - -/** - * The type Lib 39 recipe provider. - */ -public class Lib39RecipeProvider extends RecipeProvider { - /** - * Instantiates a new Lib 39 recipe provider. - * - * @param output the output - */ - public Lib39RecipeProvider(PackOutput output) { - super(output); - } - - @Override - protected void buildRecipes(@NotNull Consumer consumer) { - ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, Lib39Items.DOLL.get()) - .requires(ItemTags.WOOL) - .requires(Items.ARMOR_STAND) - .unlockedBy("has_armor_stand",has(Items.ARMOR_STAND)) - .save(consumer); - } -} diff --git a/src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39SoundDefinitionsProvider.java b/src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39SoundDefinitionsProvider.java deleted file mode 100644 index efe40fa..0000000 --- a/src/main/java/top/r3944realms/lib39/base/datagen/provider/Lib39SoundDefinitionsProvider.java +++ /dev/null @@ -1,45 +0,0 @@ -package top.r3944realms.lib39.base.datagen.provider; - -import net.minecraft.data.PackOutput; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.common.data.SoundDefinition; -import net.minecraftforge.common.data.SoundDefinitionsProvider; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.content.register.Lib39SoundEvents; - -/** - * The type Lib 39 sound definitions provider. - */ -public class Lib39SoundDefinitionsProvider extends SoundDefinitionsProvider { - /** - * Instantiates a new Lib 39 sound definitions provider. - * - * @param output the output - * @param helper the helper - */ - public Lib39SoundDefinitionsProvider(PackOutput output, ExistingFileHelper helper) { - super(output, Lib39.MOD_ID, helper); - } - - /** - * Gets sound definition. - * - * @param subTitle the sub title - * @param sounds the sounds - * @return the sound definition - */ - public SoundDefinition getSoundDefinition(String subTitle, SoundDefinition.Sound... sounds) { - return SoundDefinition.definition().subtitle(subTitle).with(sounds); - } - - @Override - public void registerSounds() { - add( - Lib39SoundEvents.DUCK_TOY, - getSoundDefinition( - Lib39SoundEvents.getSubTitleTranslateKey("duck_toy"), - sound(Lib39SoundEvents.RL_DUCK_TOY, SoundDefinition.SoundType.SOUND) - ) - ); - } -} diff --git a/src/main/java/top/r3944realms/lib39/base/datagen/value/Lib39LangKey.java b/src/main/java/top/r3944realms/lib39/base/datagen/value/Lib39LangKey.java deleted file mode 100644 index a8bc7da..0000000 --- a/src/main/java/top/r3944realms/lib39/base/datagen/value/Lib39LangKey.java +++ /dev/null @@ -1,874 +0,0 @@ -package top.r3944realms.lib39.base.datagen.value; - -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.Unmodifiable; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.content.register.Lib39Blocks; -import top.r3944realms.lib39.content.register.Lib39Items; -import top.r3944realms.lib39.content.register.Lib39SoundEvents; -import top.r3944realms.lib39.datagen.value.ILangKeyValueCollection; -import top.r3944realms.lib39.datagen.value.LangKeyValue; -import top.r3944realms.lib39.datagen.value.ModPartEnum; -import top.r3944realms.lib39.example.core.register.ExLib39Items; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * The enum Lib 39 lang key. - */ -public enum Lib39LangKey implements ILangKeyValueCollection { - /** - * Instance lib 39 lang key. - */ - INSTANCE; - Lib39LangKey() { - initLangKeyValues(); - } - - /** - * The type Message. - */ - public static final class Message { - private static final Set items = new HashSet<>(); - /** - * The constant HELP_HEADER. - */ - public static final LangKeyValue HELP_HEADER = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.help.header", ModPartEnum.MESSAGE, - "===== %s =====", - "===== %s 命令帮助 =====", - "===== %s 命令幫助 =====", - "〇〇 %s 〇〇", // 文言文:用〇〇表示分隔線 - true - ) - ); - - /** - * The constant HELP_CLICK_EXPAND. - */ - public static final LangKeyValue HELP_CLICK_EXPAND = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.help.click_expand", ModPartEnum.MESSAGE, - "Click to expand", - "點擊展開", - "點擊展開", - "點展", - true - ) - ); - - /** - * The constant HELP_PAGE_INFO. - */ - public static final LangKeyValue HELP_PAGE_INFO = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.help.page_info", ModPartEnum.MESSAGE, - "Page %d of %d", - "第 %d 页,共 %d 页", - "第 %d 頁,共 %d 頁", - "第 %d 卷,凡 %d 卷", // 文言文:用「卷」表示頁 - true - ) - ); - - /** - * The constant HELP_NO_ENTRIES. - */ - public static final LangKeyValue HELP_NO_ENTRIES = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.help.no_entries", ModPartEnum.MESSAGE, - "No help entries available", - "暂无帮助条目", - "暫無幫助條目", - "尚無助之目錄", // 文言文:尚無幫助的目錄 - true - ) - ); - - /** - * The constant HELP_TOGGLE_FAILED. - */ - public static final LangKeyValue HELP_TOGGLE_FAILED = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.help.toggle_failed", ModPartEnum.MESSAGE, - "Toggle Failed: No Hash Cached", - "切换失败: 无缓存Hash", - "切換失敗: 無緩存Hash", - "變更未果: 無貯存之哈希", // 文言文:變更沒有成功,沒有貯存的哈希 - true - ) - ); - - /** - * The constant HELP_COMMAND_NOT_FOUND. - */ - public static final LangKeyValue HELP_COMMAND_NOT_FOUND = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.help.command_not_found", ModPartEnum.MESSAGE, - "Command not found: %s", - "命令不存在: %s", - "指令不存在: %s", - "令未見之: %s", // 文言文:命令沒有見到 - true - ) - ); - /** - * The constant DOLL_SOUND. - */ - public static final LangKeyValue DOLL_SOUND = addAndRet( - LangKeyValue.ofKey( - Lib39SoundEvents.getSubTitleTranslateKey("duck_toy"), ModPartEnum.SOUND, - "Duck Doll Sound", - "玩偶声音", - "玩偶聲音", - "偶音", - true - ) - ); - - - /** - * The constant HELP_SUBCOMMANDS_TITLE. - */ - public static final LangKeyValue HELP_SUBCOMMANDS_TITLE = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.help.subcommands_title", ModPartEnum.MESSAGE, - "Subcommands:", - "子命令:", - "子指令:", - "子令:", // 文言文:子命令 - true - ) - ); - - /** - * The constant HELP_NODE_EXPAND. - */ - public static final LangKeyValue HELP_NODE_EXPAND = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.help.node.expand", ModPartEnum.MESSAGE, - "%d subcommands collapsed", - "%d 个子命令已折叠", - "%d 個子指令已折疊", - "%d 子令已收", // 文言文:子命令已經收起 - true - ) - ); - - /** - * The constant HELP_NODE_TOGGLE_EXPAND. - */ - public static final LangKeyValue HELP_NODE_TOGGLE_EXPAND = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.help.node.toggle.expand", ModPartEnum.MESSAGE, - "Expand", - "展开", - "展開", - "展", // 文言文:展開 - true - ) - ); - - /** - * The constant HELP_NODE_TOGGLE_COLLAPSE. - */ - public static final LangKeyValue HELP_NODE_TOGGLE_COLLAPSE = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.help.node.toggle.collapse", ModPartEnum.MESSAGE, - "Collapse", - "折叠", - "折疊", - "收", // 文言文:收起 - true - ) - ); - - /** - * The constant BASIC_HELP. - */ - public static final LangKeyValue BASIC_HELP = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.help.basic.help", ModPartEnum.MESSAGE, - "Show Help Info", - "显示帮助信息", - "顯示幫助信息", - "示助之訊", // 文言文:顯示幫助的訊息 - true - ) - ); - - /** - * The constant HELP_HOVER_COPY_TIP. - */ - public static final LangKeyValue HELP_HOVER_COPY_TIP = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.help.hover.copy", ModPartEnum.MESSAGE, - "Copy to clipboard", - "点击复制", - "點擊複製", - "點之複刻", // 文言文:點之複刻 - true - ) - ); - private static LangKeyValue addAndRet(LangKeyValue item) { - items.add(item); - return item; - } - - /** - * Gets items. - * - * @return the items - */ - public static Set getItems() { - return items; - } - } - - /** - * The Lang key values. - */ - final List langKeyValues = new ArrayList<>(); - - - /** - * Init lang key values. - */ - public void initLangKeyValues() { - Message.getItems().forEach(this::addLang); - LangKeyValue dollName = LangKeyValue.ofSupplier( - Lib39Items.DOLL, ModPartEnum.ITEM, - "Doll", "人偶", "人偶", "偶", false - ); - addLang(dollName); - addLang(LangKeyValue.copyOf( - Lib39Blocks.DOLL, ModPartEnum.BLOCK, dollName - )); - addLang(LangKeyValue.ofKey( - "tooltip.lib39.content.doll.hover.1", ModPartEnum.DESCRIPTION, - "§eSkinOwner §7:§a %s ", "§e皮肤所有者§7:§a%s", "§e皮膚所有者§7:§a%s", "§e膚主§7:§a%s" - )); - addLang(LangKeyValue.ofKey( - "tooltip.lib39.content.doll.hover.2", ModPartEnum.DESCRIPTION, - "§7Rename with a player name in an anvil to change skin", - "§7在铁砧上可通过重命名对应玩家名来改变皮肤", "§7在鐵砧上可通過重命名對應玩家名來改變皮膚", "§7鐵砧之上,更名以易膚" - )); - addLang(LangKeyValue.ofKey( - "invalid.player_name.too_long", ModPartEnum.DESCRIPTION, - "§c§lPlayer 's Name is too long than 16 characters.", - "§c§l玩家名称过长(最多16个字符)", "§c§l玩家名稱過長(最多16個字符)", "§c§l玩家名過長,限十六字" - )); - if (Lib39.shouldRegisterExamples()) { - addLang(LangKeyValue.ofSupplier( - ExLib39Items.FABRIC, ModPartEnum.ITEM, - "Fabric", "织布", "織布", "織", true - )); - addLang(LangKeyValue.ofSupplier( - ExLib39Items.NEOFORGE, ModPartEnum.ITEM, - "NeoForge", "小狐狸", "狐狸", "狸", true - )); - addLang(LangKeyValue.ofSupplier( - ExLib39Items.FORGE, ModPartEnum.ITEM, - "Forge", "铁砧", "铁砧", "砧", true - )); - TestMessage.getItems().forEach(this::addLang); - } - } - - - /** - * Add lang. - * - * @param keyValue the key value - */ - public void addLang(LangKeyValue keyValue) { - langKeyValues.add(keyValue); - } - - /** - * Clear. - */ - public void clear() { - langKeyValues.clear(); - } - - - @Contract(pure = true) - @Override - public @Unmodifiable List getValues() { - return List.copyOf(langKeyValues); - } - - /** - * The type Test message. - */ - @SuppressWarnings("unused") - public static final class TestMessage { - private static final Set items = new HashSet<>(); - - // ===== lib39 測試命令翻譯 ===== - - /** - * The constant LIB39_ROOT. - */ -// 根命令 - public static final LangKeyValue LIB39_ROOT = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.root", ModPartEnum.MESSAGE, - "Lib39 Command System", - "Lib39 命令系統", - "Lib39 指令系統", - "Lib39 令系", - true - ) - ); - - /** - * The constant LIB39_TEST. - */ -// 測試命令 - public static final LangKeyValue LIB39_TEST = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.test", ModPartEnum.MESSAGE, - "Test command", - "測試命令", - "測試指令", - "試令", - true - ) - ); - - /** - * The constant LIB39_TEST_SUCCESS. - */ - public static final LangKeyValue LIB39_TEST_SUCCESS = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.test.success", ModPartEnum.MESSAGE, - "Test command executed successfully!", - "測試命令執行成功!", - "測試指令執行成功!", - "試令行成!", - true - ) - ); - - /** - * The constant LIB39_TEST_WITH_PARAM. - */ - public static final LangKeyValue LIB39_TEST_WITH_PARAM = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.test.with_param", ModPartEnum.MESSAGE, - "Test command with parameter: %s", - "帶參數的測試命令:%s", - "帶參數的測試指令:%s", - "帶參試令:%s", - true - ) - ); - - /** - * The constant LIB39_DEMO. - */ - public static final LangKeyValue LIB39_DEMO = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.demo", ModPartEnum.MESSAGE, - "Demo command", - "演示命令", - "演示指令", - "演令", - true - ) - ); - - /** - * The constant LIB39_DEMO_MESSAGE. - */ - public static final LangKeyValue LIB39_DEMO_MESSAGE = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.demo.message", ModPartEnum.MESSAGE, - "This is a demo command showing Lib39 features!", - "這是一個展示 Lib39 功能的演示命令!", - "這是一個展示 Lib39 功能的演示指令!", - "此乃展 Lib39 能之演令!", - true - ) - ); - - /** - * The constant LIB39_GREET_BASIC. - */ -// 問候命令 - public static final LangKeyValue LIB39_GREET_BASIC = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.greet.basic", ModPartEnum.MESSAGE, - "Greet everyone", - "向大家問好", - "向大家問好", - "問眾安", - true - ) - ); - - /** - * The constant LIB39_GREET_DEFAULT. - */ - public static final LangKeyValue LIB39_GREET_DEFAULT = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.greet.default", ModPartEnum.MESSAGE, - "Hello everyone from Lib39!", - "來自 Lib39 的問候!", - "來自 Lib39 的問候!", - "自 Lib39 問安!", - true - ) - ); - - /** - * The constant LIB39_GREET_PLAYER. - */ - public static final LangKeyValue LIB39_GREET_PLAYER = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.greet.player", ModPartEnum.MESSAGE, - "Greet specific player", - "問候特定玩家", - "問候特定玩家", - "問特者安", - true - ) - ); - - /** - * The constant LIB39_GREET_RECEIVED. - */ - public static final LangKeyValue LIB39_GREET_RECEIVED = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.greet.received", ModPartEnum.MESSAGE, - "%s greeted you!", - "%s 向你問好!", - "%s 向你問好!", - "%s 問汝安!", - true - ) - ); - - /** - * The constant LIB39_CALCULATE. - */ -// 計算命令 - public static final LangKeyValue LIB39_CALCULATE = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.calculate", ModPartEnum.MESSAGE, - "Calculate sum of two numbers", - "計算兩個數字的和", - "計算兩個數字的和", - "算二數和", - true - ) - ); - - /** - * The constant LIB39_CALCULATE_RESULT. - */ - public static final LangKeyValue LIB39_CALCULATE_RESULT = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.calculate.result", ModPartEnum.MESSAGE, - "%d + %d = %d", - "%d + %d = %d", - "%d + %d = %d", - "%d 加 %d 等 %d", - true - ) - ); - - /** - * The constant LIB39_TELEPORT. - */ -// 傳送命令 - public static final LangKeyValue LIB39_TELEPORT = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.teleport", ModPartEnum.MESSAGE, - "Teleport to player (OP only)", - "傳送到玩家(僅OP)", - "傳送到玩家(僅OP)", - "送至者(唯管)", - true - ) - ); - - /** - * The constant LIB39_TELEPORT_SUCCESS. - */ - public static final LangKeyValue LIB39_TELEPORT_SUCCESS = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.teleport.success", ModPartEnum.MESSAGE, - "Teleported to %s", - "已傳送至 %s", - "已傳送至 %s", - "已送至 %s", - true - ) - ); - - /** - * The constant LIB39_INFO. - */ -// 信息命令 - public static final LangKeyValue LIB39_INFO = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.info", ModPartEnum.MESSAGE, - "Show player information", - "顯示玩家信息", - "顯示玩家資訊", - "示者訊", - true - ) - ); - - /** - * The constant LIB39_INFO_MESSAGE. - */ - public static final LangKeyValue LIB39_INFO_MESSAGE = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.info.message", ModPartEnum.MESSAGE, - "=== Player Information ===", - "=== 玩家信息 ===", - "=== 玩家資訊 ===", - "〇〇 者訊 〇〇", - true - ) - ); - - /** - * The constant LIB39_INFO_DIMENSION. - */ - public static final LangKeyValue LIB39_INFO_DIMENSION = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.info.dimension", ModPartEnum.MESSAGE, - "Dimension: %s", - "維度:%s", - "維度:%s", - "界:%s", - true - ) - ); - - /** - * The constant LIB39_INFO_POSITION. - */ - public static final LangKeyValue LIB39_INFO_POSITION = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.info.position", ModPartEnum.MESSAGE, - "Position: X=%.1f, Y=%.1f, Z=%.1f", - "位置:X=%.1f, Y=%.1f, Z=%.1f", - "位置:X=%.1f, Y=%.1f, Z=%.1f", - "位:X=%.1f, Y=%.1f, Z=%.1f", - true - ) - ); - - /** - * The constant LIB39_TEAM. - */ -// 隊伍系統 - public static final LangKeyValue LIB39_TEAM = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.team", ModPartEnum.MESSAGE, - "Team management", - "隊伍管理", - "隊伍管理", - "隊管", - true - ) - ); - - /** - * The constant LIB39_TEAM_CREATE. - */ - public static final LangKeyValue LIB39_TEAM_CREATE = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.team.create", ModPartEnum.MESSAGE, - "Create a new team", - "創建新隊伍", - "創建新隊伍", - "創新隊", - true - ) - ); - - /** - * The constant LIB39_TEAM_CREATE_SUCCESS. - */ - public static final LangKeyValue LIB39_TEAM_CREATE_SUCCESS = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.team.create.success", ModPartEnum.MESSAGE, - "Team '%s' created successfully!", - "隊伍 '%s' 創建成功!", - "隊伍 '%s' 創建成功!", - "隊 '%s' 創新成!", - true - ) - ); - - /** - * The constant LIB39_TEAM_JOIN. - */ - public static final LangKeyValue LIB39_TEAM_JOIN = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.team.join", ModPartEnum.MESSAGE, - "Join a team", - "加入隊伍", - "加入隊伍", - "入隊", - true - ) - ); - - /** - * The constant LIB39_TEAM_JOIN_SUCCESS. - */ - public static final LangKeyValue LIB39_TEAM_JOIN_SUCCESS = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.team.join.success", ModPartEnum.MESSAGE, - "Joined team '%s'", - "已加入隊伍 '%s'", - "已加入隊伍 '%s'", - "已入隊 '%s'", - true - ) - ); - - /** - * The constant LIB39_TEAM_LEAVE. - */ - public static final LangKeyValue LIB39_TEAM_LEAVE = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.team.leave", ModPartEnum.MESSAGE, - "Leave current team", - "離開當前隊伍", - "離開當前隊伍", - "離現隊", - true - ) - ); - - /** - * The constant LIB39_TEAM_LEAVE_SUCCESS. - */ - public static final LangKeyValue LIB39_TEAM_LEAVE_SUCCESS = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.team.leave.success", ModPartEnum.MESSAGE, - "Left the team", - "已離開隊伍", - "已離開隊伍", - "已離隊", - true - ) - ); - - /** - * The constant LIB39_GAME. - */ -// 遊戲系統 - public static final LangKeyValue LIB39_GAME = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.game", ModPartEnum.MESSAGE, - "Game control", - "遊戲控制", - "遊戲控制", - "戲控", - true - ) - ); - - /** - * The constant LIB39_GAME_START. - */ - public static final LangKeyValue LIB39_GAME_START = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.game.start", ModPartEnum.MESSAGE, - "Start a game", - "開始遊戲", - "開始遊戲", - "啟戲", - true - ) - ); - - /** - * The constant LIB39_GAME_START_SUCCESS. - */ - public static final LangKeyValue LIB39_GAME_START_SUCCESS = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.game.start.success", ModPartEnum.MESSAGE, - "Game '%s' started!", - "遊戲 '%s' 已開始!", - "遊戲 '%s' 已開始!", - "戲 '%s' 已啟!", - true - ) - ); - - /** - * The constant LIB39_GAME_STOP. - */ - public static final LangKeyValue LIB39_GAME_STOP = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.game.stop", ModPartEnum.MESSAGE, - "Stop current game", - "停止當前遊戲", - "停止當前遊戲", - "止現戲", - true - ) - ); - - /** - * The constant LIB39_GAME_STOP_SUCCESS. - */ - public static final LangKeyValue LIB39_GAME_STOP_SUCCESS = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.game.stop.success", ModPartEnum.MESSAGE, - "Game stopped!", - "遊戲已停止!", - "遊戲已停止!", - "戲已止!", - true - ) - ); - - /** - * The constant LIB39_GAME_PAUSE. - */ - public static final LangKeyValue LIB39_GAME_PAUSE = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.game.pause", ModPartEnum.MESSAGE, - "Pause current game", - "暫停當前遊戲", - "暫停當前遊戲", - "暫現戲", - true - ) - ); - - /** - * The constant LIB39_GAME_PAUSE_SUCCESS. - */ - public static final LangKeyValue LIB39_GAME_PAUSE_SUCCESS = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.game.pause.success", ModPartEnum.MESSAGE, - "Game paused!", - "遊戲已暫停!", - "遊戲已暫停!", - "戲已暫!", - true - ) - ); - - /** - * The constant LIB39_GAME_RESUME. - */ - public static final LangKeyValue LIB39_GAME_RESUME = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.game.resume", ModPartEnum.MESSAGE, - "Resume paused game", - "恢復暫停的遊戲", - "恢復暫停的遊戲", - "復暫戲", - true - ) - ); - - /** - * The constant LIB39_GAME_RESUME_SUCCESS. - */ - public static final LangKeyValue LIB39_GAME_RESUME_SUCCESS = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.game.resume.success", ModPartEnum.MESSAGE, - "Game resumed!", - "遊戲已恢復!", - "遊戲已恢復!", - "戲已復!", - true - ) - ); - - /** - * The constant LIB39_SETTINGS. - */ -// 設置命令 - public static final LangKeyValue LIB39_SETTINGS = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.settings", ModPartEnum.MESSAGE, - "Show settings", - "顯示設置", - "顯示設定", - "示置", - true - ) - ); - - /** - * The constant LIB39_CONFIG. - */ - public static final LangKeyValue LIB39_CONFIG = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.config", ModPartEnum.MESSAGE, - "Show configuration", - "顯示配置", - "顯示設定", - "示配", - true - ) - ); - - /** - * The constant LIB39_RELOAD. - */ - public static final LangKeyValue LIB39_RELOAD = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.reload", ModPartEnum.MESSAGE, - "Reload configuration", - "重新加載配置", - "重新載入設定", - "重載配", - true - ) - ); - - /** - * The constant LIB39_DEBUG. - */ - public static final LangKeyValue LIB39_DEBUG = addAndRet( - LangKeyValue.ofKey( - "commands.lib39.debug", ModPartEnum.MESSAGE, - "Debug information", - "調試信息", - "除錯資訊", - "調訊", - true - ) - ); - - // ===== 添加缺失的導入 ===== - private static final java.util.function.Consumer addConsumer = items::add; - - private static LangKeyValue addAndRet(LangKeyValue item) { - items.add(item); - return item; - } - - /** - * Gets items. - * - * @return the items - */ - public static Set getItems() { - return items; - } - } - -} diff --git a/src/main/java/top/r3944realms/lib39/client/gui/component/WheelWidget.java b/src/main/java/top/r3944realms/lib39/client/gui/component/WheelWidget.java deleted file mode 100644 index a4ecbfe..0000000 --- a/src/main/java/top/r3944realms/lib39/client/gui/component/WheelWidget.java +++ /dev/null @@ -1,769 +0,0 @@ -package top.r3944realms.lib39.client.gui.component; - -import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraft.client.gui.narration.NarrationElementOutput; -import net.minecraft.client.renderer.ShaderInstance; -import net.minecraft.network.chat.Component; -import org.joml.Matrix4f; -import org.joml.Vector2f; -import top.r3944realms.lib39.client.shader.Lib39Shaders; -import top.r3944realms.lib39.util.MathUtil; -import top.r3944realms.lib39.util.lang.FourConsumer; -import top.r3944realms.lib39.util.lang.Pair; - -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -/** - * The type Wheel widget. - * - * @author QiuShui1012 - */ -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class WheelWidget extends AbstractWidget { - /** - * The constant IGNORE_CURSOR_MOVE_LENGTH. - */ - public static final int IGNORE_CURSOR_MOVE_LENGTH = 15; - private static final Vector2f ROTATION_START = new Vector2f(0, 1); - private static final int SELECTION_EFFECT_COLOR = 0xddFFFF00; - private static final int SELECTION_EFFECT_RADIUS = 20; - - private final Minecraft minecraft = Minecraft.getInstance(); - private final Vector2f centerPos; - private final float ringInnerRadius; - private final float ringOuterRadius; - private final int delay; - private final int animationMs; - private final int closingAnimationMs; //ms - private final int ringColor; - private final int selectionEffectColor; - private final int selectionEffectRadius; - private final float selectionAnimationSpeedFactor; - private final int textColor; - private final float textScale; - private final List sections = new ArrayList<>(); - - private long displayTime = System.currentTimeMillis(); - private float currentAngle = 0; - - /** - * Gets current section index. - * - * @return the current section index - */ - public int getCurrentSectionIndex() { - return currentSectionIndex; - } - - /** - * Is closing animation started boolean. - * - * @return the boolean - */ - public boolean isClosingAnimationStarted() { - return closingAnimationStarted; - } - - private int currentSectionIndex = -1; - private Vector2f selectionEffectPos; - private boolean animationStarted = false; - - /** - * Sets closing animation started. - * - * @param closingAnimationStarted the closing animation started - */ - public void setClosingAnimationStarted(boolean closingAnimationStarted) { - this.closingAnimationStarted = closingAnimationStarted; - } - - private boolean closingAnimationStarted = false; - - /** - * Instantiates a new Wheel widget. - * - * @param x the x - * @param y the y - * @param width the width - * @param height the height - * @param ringInnerRadius the ring inner radius - * @param ringOuterRadius the ring outer radius - * @param textScale the text scale - * @param sections the sections - */ - public WheelWidget( - int x, int y, int width, int height, - float ringInnerRadius, float ringOuterRadius, float textScale, - List>> sections - ) { - this(x, y, width, height, Component.empty(), ringInnerRadius, ringOuterRadius, textScale, sections); - } - - /** - * Instantiates a new Wheel widget. - * - * @param x the x - * @param y the y - * @param width the width - * @param height the height - * @param ringInnerRadius the ring inner radius - * @param ringOuterRadius the ring outer radius - * @param textScale the text scale - * @param degreeOffsetAngle the degree offset angle - * @param sections the sections - */ - public WheelWidget( - int x, int y, int width, int height, - float ringInnerRadius, float ringOuterRadius, float textScale, float degreeOffsetAngle, - List>> sections - ) { - this(x, y, width, height, Component.empty(), ringInnerRadius, ringOuterRadius, textScale, degreeOffsetAngle, sections); - } - - /** - * Instantiates a new Wheel widget. - * - * @param x the x - * @param y the y - * @param width the width - * @param height the height - * @param ringInnerRadius the ring inner radius - * @param ringOuterRadius the ring outer radius - * @param sections the sections - */ - public WheelWidget( - int x, int y, int width, int height, - float ringInnerRadius, float ringOuterRadius, - List>> sections - ) { - this(x, y, width, height, Component.empty(), ringInnerRadius, ringOuterRadius, sections); - } - - /** - * Instantiates a new Wheel widget. - * - * @param x the x - * @param y the y - * @param width the width - * @param height the height - * @param message the message - * @param ringInnerRadius the ring inner radius - * @param ringOuterRadius the ring outer radius - * @param textScale the text scale - * @param degreeOffsetAngle the degree offset angle - * @param sections the sections - */ - public WheelWidget( - int x, int y, int width, int height, Component message, - float ringInnerRadius, float ringOuterRadius, float textScale, float degreeOffsetAngle, - List>> sections - ) { - this( - x, y, width, height, message, - ringInnerRadius, ringOuterRadius, - 150, 300, 150, - 0x00000000, - 0xddffff00, 20, 5f, - 0xfdfdfd, textScale, degreeOffsetAngle, - sections - ); - } - - /** - * Instantiates a new Wheel widget. - * - * @param x the x - * @param y the y - * @param width the width - * @param height the height - * @param message the message - * @param ringInnerRadius the ring inner radius - * @param ringOuterRadius the ring outer radius - * @param sections the sections - */ - public WheelWidget( - int x, int y, int width, int height, Component message, - float ringInnerRadius, float ringOuterRadius, - List>> sections - ) { - this( - x, y, width, height, message, - ringInnerRadius, ringOuterRadius, - 150, 300, 150, - 0x00000000, - 0xddffff00, 20, 5f, - 0xfdfdfd, 1f, 0f, - sections - ); - } - - /** - * Instantiates a new Wheel widget. - * - * @param x the x - * @param y the y - * @param width the width - * @param height the height - * @param message the message - * @param ringInnerRadius the ring inner radius - * @param ringOuterRadius the ring outer radius - * @param degreeOffsetAngle the degree offset angle - * @param sections the sections - */ - public WheelWidget( - int x, int y, int width, int height, Component message, - float ringInnerRadius, float ringOuterRadius, float degreeOffsetAngle, - List>> sections - ) { - this( - x, y, width, height, message, - ringInnerRadius, ringOuterRadius, - 150, 300, 150, - 0x00000000, - 0xddffff00, 20, 5f, - 0xfdfdfd, 1f, degreeOffsetAngle, - sections - ); - } - - /** - * Instantiates a new Wheel widget. - * - * @param x the x - * @param y the y - * @param width the width - * @param height the height - * @param ringInnerRadius the ring inner radius - * @param ringOuterRadius the ring outer radius - * @param delay the delay - * @param animationMs the animation ms - * @param closingAnimationMs the closing animation ms - * @param ringColor the ring color - * @param selectionEffectColor the selection effect color - * @param selectionEffectRadius the selection effect radius - * @param selectionAnimationSpeedFactor the selection animation speed factor - * @param textColor the text color - * @param textScale the text scale - * @param sections the sections - */ - public WheelWidget( - int x, int y, int width, int height, - float ringInnerRadius, float ringOuterRadius, - int delay, int animationMs, int closingAnimationMs, - int ringColor, - int selectionEffectColor, int selectionEffectRadius, float selectionAnimationSpeedFactor, - int textColor, float textScale, - List>> sections - ) { - this( - x, y, width, height, Component.empty(), - ringInnerRadius, ringOuterRadius, - delay, animationMs, closingAnimationMs, - ringColor, - selectionEffectColor, selectionEffectRadius, selectionAnimationSpeedFactor, - textColor, textScale, 0f, - sections - ); - } - - /** - * Instantiates a new Wheel widget. - * - * @param x the x - * @param y the y - * @param width the width - * @param height the height - * @param message the message - * @param ringInnerRadius the ring inner radius - * @param ringOuterRadius the ring outer radius - * @param delay the delay - * @param animationMs the animation ms - * @param closingAnimationMs the closing animation ms - * @param ringColor the ring color - * @param selectionEffectColor the selection effect color - * @param selectionEffectRadius the selection effect radius - * @param selectionAnimationSpeedFactor the selection animation speed factor - * @param textColor the text color - * @param textScale the text scale - * @param degreeOffsetAngle the degree offset angle - * @param sections the sections - */ - public WheelWidget( - int x, int y, int width, int height, Component message, - float ringInnerRadius, float ringOuterRadius, - int delay, int animationMs, int closingAnimationMs, - int ringColor, - int selectionEffectColor, int selectionEffectRadius, float selectionAnimationSpeedFactor, - int textColor, float textScale, float degreeOffsetAngle, - List>> sections - ) { - super(x, y, width, height, message); - this.centerPos = new Vector2f(this.getX() + this.getWidth() / 2f, this.getY() + this.getHeight() / 2f); - this.ringInnerRadius = Math.max(ringInnerRadius, IGNORE_CURSOR_MOVE_LENGTH); - this.ringOuterRadius = ringOuterRadius; - this.delay = delay; - this.animationMs = animationMs; - this.closingAnimationMs = closingAnimationMs; - this.ringColor = ringColor; - this.selectionEffectColor = selectionEffectColor; - this.selectionEffectRadius = selectionEffectRadius; - this.selectionAnimationSpeedFactor = selectionAnimationSpeedFactor; - this.textColor = textColor; - this.textScale = textScale; - float degreeEachRotation = 360f / sections.size(); - for (int i = 0; i < sections.size(); i++) { - Pair> section = sections.get(i); - float rotation = MathUtil.clampWithProportion((degreeEachRotation * i + degreeOffsetAngle) % 360, 0, 360); - Vector2f rotated = MathUtil.rotationDegrees(ROTATION_START, rotation) - .mul(1, -1) - .mul(this.getSectionCircleDiameter()) - .add(this.centerPos); - float detectionStart = (float) (Math.toRadians(rotation - degreeEachRotation / 2f) + Math.PI * 2); - float detectionEnd = (float) (Math.toRadians(rotation + degreeEachRotation / 2f) + Math.PI * 2); - detectionStart = detectionStart % (float) (Math.PI * 2); - detectionEnd = detectionEnd % (float) (Math.PI * 2); - this.sections.add(new WheelSection( - rotated, - (float) (Math.toRadians(rotation) % (Math.PI * 2)), - detectionStart, - detectionEnd, - section.first, - section.second - )); - } - this.selectionEffectPos = MathUtil.rotate( - MathUtil.copy(ROTATION_START) - .mul(this.getSectionCircleDiameter()), - this.currentAngle - ); - } - - /** - * Gets section circle diameter. - * - * @return the section circle diameter - */ -// 滚轮选择器中每个扇形的圆形直径 - public float getSectionCircleDiameter() { - return this.ringOuterRadius + this.ringInnerRadius; - } - - /** - * Sets current index. - * - * @param index the index - * @return the current index - */ - public WheelWidget setCurrentIndex(int index) { - this.currentSectionIndex = index; - this.currentAngle = this.sections.get(index).angle; - this.selectionEffectPos = MathUtil.rotate( - MathUtil.copy(ROTATION_START) - .mul(this.getSectionCircleDiameter()), - this.currentAngle - ); - return this; - } - - /** - * Gets section size. - * - * @return the section size - */ - public int getSectionSize() { - return this.sections.size(); - } - - - @Override - public boolean mouseScrolled(double mouseX, double mouseY, double delta) { - if (delta > 0) { - if (this.currentSectionIndex == this.getSectionSize() - 1) { - this.currentSectionIndex = 0; - } else { - this.currentSectionIndex++; - } - } else if (delta < 0) { - if (this.currentSectionIndex == 0) { - this.currentSectionIndex = this.getSectionSize() - 1; - } else { - this.currentSectionIndex--; - } - } - for (WheelSection section : this.sections) { - if (this.sections.indexOf(section) == this.currentSectionIndex) { - this.currentAngle = section.angle; - return true; - } - } - return true; - } - - /** - * Check mouse pos. - * - * @param mouseX the mouse x - * @param mouseY the mouse y - */ - public void checkMousePos(double mouseX, double mouseY) { - if (this.closingAnimationStarted) return; - float centerX = this.centerPos.x; - float centerY = this.centerPos.y; - // 鼠标距离屏幕中心的位置向量 - Vector2f cursorPos = new Vector2f((float) mouseX - centerX, (float) mouseY - centerY); - - if (cursorPos.length() < IGNORE_CURSOR_MOVE_LENGTH) return; - - Vector2f rotationStart = new Vector2f(0, 1); - cursorPos.normalize(); - // 计算夹角弧度 - double rot = Math.acos(rotationStart.dot(cursorPos) / (rotationStart.length() * cursorPos.length())); - double rotation = cursorPos.x < 0 ? Math.PI - rot : Math.PI + rot; - for (WheelSection section : this.sections) { - if (section.angleStart > section.angleEnd && rotation >= section.angleStart - || rotation >= section.angleStart && rotation <= section.angleEnd - ) { - this.currentAngle = section.angle; - this.currentSectionIndex = this.sections.indexOf(section); - break; - } - } - } - - /** - * Should render boolean. - * - * @return the boolean - */ - public boolean shouldRender() { - if (this.animationStarted) return true; - return (this.displayTime + this.delay) <= System.currentTimeMillis(); - } - - @Override - public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { - this.checkMousePos(mouseX, mouseY); - this.renderWidget(guiGraphics, mouseX, mouseY, partialTick); - } - - @Override - protected void renderWidget(GuiGraphics guiGraphics, int i, int i1, float v) { - RenderSystem.enableDepthTest(); - RenderSystem.enableBlend(); - this.renderClosingAnimation(guiGraphics); - if (!this.shouldRender()) { - return; - } - if (this.closingAnimationStarted) return; - if (!this.animationStarted) { - this.animationStarted = true; - this.displayTime = System.currentTimeMillis(); - } - PoseStack poseStack = guiGraphics.pose(); - float delta = this.displayTime + this.animationMs - System.currentTimeMillis(); - if (delta > 0) { - float progress = 1 - (delta / this.animationMs); - progress = (float) (-Math.pow(progress, 2) + 2 * progress); - if (progress == 0) return; - this.renderProgressAnimation(guiGraphics, progress); - return; - } - renderRing( - guiGraphics, - this.centerPos.x, - this.centerPos.y, - this.ringColor, - this.ringInnerRadius * 2, - this.ringOuterRadius * 2 - ); - this.renderSelection(guiGraphics); - for (WheelSection value : this.sections) { - float x = value.center.x; - float y = value.center.y; - poseStack.pushPose(); - poseStack.translate(x - 10, y - 10, 100); - value.renderer.accept(guiGraphics, poseStack, 20, 20); - poseStack.popPose(); - poseStack.pushPose(); - float coordinateScale = 0.7f; - float offsetX = 0.1f * this.width; - float offsetY = 0.1f * this.height; - float adjustedX = (x - offsetX) / coordinateScale; - float adjustedY = (y - offsetY - 20 * this.textScale) / coordinateScale; - - poseStack.translate(offsetX, offsetY, 0); - poseStack.scale(coordinateScale, coordinateScale, coordinateScale); - poseStack.translate(adjustedX, adjustedY, 0); - poseStack.scale(this.textScale / coordinateScale, this.textScale / coordinateScale, this.textScale / coordinateScale); - guiGraphics.drawCenteredString( - minecraft.font, - value.subTitle, - 0, - 0, - (0xff << 24) | this.textColor - ); - poseStack.popPose(); - } - RenderSystem.disableDepthTest(); - RenderSystem.disableBlend(); - } - - /** - * Render closing animation. - * - * @param guiGraphics the gui graphics - */ - public void renderClosingAnimation(GuiGraphics guiGraphics) { - if (!this.closingAnimationStarted) return; - float delta = this.displayTime + this.closingAnimationMs - System.currentTimeMillis(); - float progress = delta / this.closingAnimationMs; - if(progress >= 1 || progress <= 0) { - this.minecraft.setScreen(null); - } - this.renderProgressAnimation(guiGraphics, progress); - } - private void renderProgressAnimation(GuiGraphics guiGraphics, float progress) { - progress = (float) (-Math.pow(progress, 2) + 2 * progress); - if (progress == 0) return; - PoseStack poseStack = guiGraphics.pose(); - poseStack.pushPose(); - renderRing( - guiGraphics, - this.centerPos.x, - this.centerPos.y, - this.ringColor, - this.ringInnerRadius * 2 * progress, - this.ringOuterRadius * 2 * progress - ); - poseStack.popPose(); - if(this.currentSectionIndex != -1) { - WheelSection section = this.sections.get(this.currentSectionIndex); - Vector2f center = new Vector2f( - (section.center.x - this.centerPos.x) / this.getSectionCircleDiameter(), - (section.center.y - this.centerPos.y) / this.getSectionCircleDiameter() - ).mul(this.getSectionCircleDiameter() * progress).add(this.centerPos.x, this.centerPos.y); - renderSelectionEffect( - guiGraphics, - center.x, - center.y, - this.selectionEffectColor, - this.selectionEffectRadius - ); - } - for (WheelSection value : this.sections) { - if (sections.get(0) != value) continue; - Vector2f center = new Vector2f( - (value.center.x - this.centerPos.x) / this.getSectionCircleDiameter(), - (value.center.y - this.centerPos.y) / this.getSectionCircleDiameter() - ).mul(this.getSectionCircleDiameter() * progress).add(this.centerPos.x, this.centerPos.y); - float x = center.x; - float y = center.y; - poseStack.pushPose(); - poseStack.translate(x - 10, y - 10, 100); - value.renderer.accept(guiGraphics, poseStack, 20, 20); - poseStack.pushPose(); - } - } - - /** - * Render ring. - * - * @param guiGraphics the gui graphics - * @param centerX the center x - * @param centerY the center y - * @param color the color - * @param innerRadius the inner radius - * @param outerRadius the outer radius - */ - public static void renderRing( - GuiGraphics guiGraphics, - float centerX, - float centerY, - int color, - float innerRadius, // 改为半径 - float outerRadius // 改为半径 - ) { - PoseStack poseStack = guiGraphics.pose(); - poseStack.pushPose(); - - Tesselator tesselator = Tesselator.getInstance(); - BufferBuilder buffer = tesselator.getBuilder(); - - // 计算足够大的绘制区域来覆盖整个环形(基于外半径) - float margin = outerRadius + 100f; // 使用半径计算边距 - float x1 = centerX - margin; - float y1 = centerY - margin; - float x2 = centerX + margin; - float y2 = centerY + margin; - - buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); - - Matrix4f matrix = poseStack.last().pose(); - buffer.vertex(matrix, x1, y1, -300).color(color).endVertex(); - buffer.vertex(matrix, x1, y2, -300).color(color).endVertex(); - buffer.vertex(matrix, x2, y2, -300).color(color).endVertex(); - buffer.vertex(matrix, x2, y1, -300).color(color).endVertex(); - - setupRingShader(centerX, centerY, innerRadius, outerRadius); - - BufferUploader.drawWithShader(buffer.end()); - poseStack.popPose(); - } - - private static void setupRingShader(float centerX, float centerY, float innerRadius, float outerRadius) { - Window window = Minecraft.getInstance().getWindow(); - float guiScale = (float) window.getGuiScale(); - - RenderSystem.setShader(Lib39Shaders::getRingShader); - - // 转换到像素坐标(考虑GUI缩放) - float pixelCenterX = centerX * guiScale; - float pixelCenterY = window.getHeight() - (centerY * guiScale); // 翻转Y坐标 - - // 半径考虑GUI缩放 - float pixelInnerRadius = innerRadius * guiScale; - float pixelOuterRadius = outerRadius * guiScale; - float pixelAntiAliasing = 2.0f * guiScale; // 抗锯齿范围 - - System.out.println("Shader Params - Center: (" + pixelCenterX + ", " + pixelCenterY + - "), InnerRadius: " + pixelInnerRadius + ", OuterRadius: " + pixelOuterRadius); - - ShaderInstance shader = Lib39Shaders.getRingShader(); - shader.safeGetUniform("Center").set(pixelCenterX, pixelCenterY); - shader.safeGetUniform("InnerRadius").set(pixelInnerRadius); - shader.safeGetUniform("OuterRadius").set(pixelOuterRadius); - shader.safeGetUniform("AntiAliasing").set(pixelAntiAliasing); - shader.safeGetUniform("ColorModulator").set(1.0f, 1.0f, 1.0f, .5f); - } - - private void renderSelection(GuiGraphics guiGraphics) { - float selectionEffectAngle = MathUtil.angle( - MathUtil.copy(ROTATION_START), - this.selectionEffectPos - ); - - float diffAngle = this.currentAngle - selectionEffectAngle; - - if (diffAngle > Math.PI) { - diffAngle -= (float) (Math.PI * 2); - } else if (diffAngle < -Math.PI) { - diffAngle += (float) (Math.PI * 2); - } - - this.selectionEffectPos = MathUtil.rotate( - this.selectionEffectPos, - diffAngle / this.selectionAnimationSpeedFactor - ); - - Vector2f pos = MathUtil.copy(this.selectionEffectPos) - .mul(1, -1) - .add(this.centerPos); - - // 调用时使用半径 - renderSelectionEffect( - guiGraphics, - pos.x, - pos.y, - SELECTION_EFFECT_COLOR, - SELECTION_EFFECT_RADIUS // 确保这是半径值 - ); - } - - /** - * Render selection effect. - * - * @param guiGraphics the gui graphics - * @param centerX the center x - * @param centerY the center y - * @param color the color - * @param radius the radius - */ - public static void renderSelectionEffect( - GuiGraphics guiGraphics, - float centerX, - float centerY, - int color, - float radius - ) { - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.disableDepthTest(); - PoseStack poseStack = guiGraphics.pose(); - Matrix4f matrix4f = poseStack.last().pose(); - Tesselator tesselator = Tesselator.getInstance(); - BufferBuilder buffer = tesselator.getBuilder(); - buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); - - float x1 = centerX - radius - 5; - float y1 = centerY - radius - 5; - float x2 = centerX + radius + 5; - float y2 = centerY + radius + 5; - buffer.vertex(matrix4f, x1, y1, -200).color(color).endVertex(); - buffer.vertex(matrix4f, x1, y2, -200).color(color).endVertex(); - buffer.vertex(matrix4f, x2, y2, -200).color(color).endVertex(); - buffer.vertex(matrix4f, x2, y1, -200).color(color).endVertex(); - - Window window = Minecraft.getInstance().getWindow(); - float guiScale = (float) window.getGuiScale(); - RenderSystem.setShader(Lib39Shaders::getSelectionShader); - System.out.println("Selection Effect Params:"); - System.out.println(" Center: " + centerX + ", " + centerY); - System.out.println(" Radius: " + radius); - System.out.println(" GUI Scale: " + guiScale); - System.out.println(" Framebuffer: " + window.getWidth() + "x" + window.getHeight()); - Lib39Shaders.getSelectionShader() - .safeGetUniform("Center") - .set(centerX * guiScale, centerY * guiScale); - Lib39Shaders.getSelectionShader() - .safeGetUniform("FramebufferSize") - .set((float) window.getWidth(), (float) window.getHeight()); - Lib39Shaders.getSelectionShader() - .safeGetUniform("Radius") - .set(radius * guiScale); - Lib39Shaders.getSelectionShader() - .safeGetUniform("AntiAliasingRadius") - .set(guiScale); // 根据需要调整 - RenderSystem.setShaderColor(1, 1, 1, 1); - BufferUploader.drawWithShader(Objects.requireNonNull(buffer.end())); - RenderSystem.enableDepthTest(); - } - - /** - * On closing. - */ - public void onClosing() { - if (this.shouldRender() && !this.closingAnimationStarted) { - this.displayTime = System.currentTimeMillis(); - this.closingAnimationStarted = true; - } else { - this.minecraft.setScreen(null); - } - } - - @Override - protected void updateWidgetNarration(NarrationElementOutput narrationElementOutput) { - } - - /** - * The type Wheel section. - */ - public record WheelSection( - Vector2f center, - float angle, - float angleStart, - float angleEnd, - Component subTitle, - FourConsumer renderer - ) { - } -} diff --git a/src/main/java/top/r3944realms/lib39/client/model/DollModel.java b/src/main/java/top/r3944realms/lib39/client/model/DollModel.java deleted file mode 100644 index e96d5a6..0000000 --- a/src/main/java/top/r3944realms/lib39/client/model/DollModel.java +++ /dev/null @@ -1,91 +0,0 @@ -package top.r3944realms.lib39.client.model; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import net.minecraft.client.model.Model; -import net.minecraft.client.model.geom.ModelLayerLocation; -import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.client.model.geom.PartPose; -import net.minecraft.client.model.geom.builders.*; -import net.minecraft.client.renderer.RenderType; -import org.jetbrains.annotations.NotNull; -import top.r3944realms.lib39.Lib39; - -/** - * The type Doll model. - */ -public class DollModel extends Model { - /** - * The constant LAYER_LOCATION. - */ - public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(Lib39.rl("doll_model"), "main"); - /** - * The Slim. - */ - public boolean slim = false; - private final ModelPart head; - private final ModelPart body; - private final ModelPart rightArm; - private final ModelPart leftArm; - private final ModelPart rightLeg; - private final ModelPart rightArmSlim; - private final ModelPart leftArmSlim; - private final ModelPart leftLeg; - - /** - * Instantiates a new Doll model. - * - * @param root the root - */ - public DollModel(ModelPart root) { - super(RenderType::entityTranslucent); - this.head = root.getChild("head"); - this.body = root.getChild("body"); - this.rightArm = root.getChild("right_arm"); - this.leftArm = root.getChild("left_arm"); - this.rightArmSlim = root.getChild("right_arm_slim"); - this.leftArmSlim = root.getChild("left_arm_slim"); - this.rightLeg = root.getChild("right_leg"); - this.leftLeg = root.getChild("left_leg"); - } - - /** - * Create body layer layer definition. - * - * @return the layer definition - */ - public static LayerDefinition createBodyLayer() { - MeshDefinition meshdefinition = new MeshDefinition(); - PartDefinition partdefinition = meshdefinition.getRoot(); - partdefinition.addOrReplaceChild("head", CubeListBuilder.create().texOffs(0, 0).addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.0F)).texOffs(32, 0).addBox(-4.0F, -8.0F, -4.0F, 8.0F, 8.0F, 8.0F, new CubeDeformation(0.5F)), PartPose.offset(0.0F, 9.0F, 0.0F)); - partdefinition.addOrReplaceChild("body", CubeListBuilder.create().texOffs(16, 16).addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)).texOffs(16, 32).addBox(-4.0F, 0.0F, -2.0F, 8.0F, 12.0F, 4.0F, new CubeDeformation(0.25F)), PartPose.offset(0.0F, 9.0F, 0.0F)); - partdefinition.addOrReplaceChild("right_arm", CubeListBuilder.create().texOffs(40, 16).addBox(-3.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)).texOffs(40, 32).addBox(-3.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.25F)), PartPose.offsetAndRotation(-5.0F, 11.0F, 0.0F, 0.0F, 0.0F, 0.3927F)); - partdefinition.addOrReplaceChild("right_arm_slim", CubeListBuilder.create().texOffs(40, 16).addBox(-2.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)).texOffs(40, 32).addBox(-2.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F, new CubeDeformation(0.25F)), PartPose.offsetAndRotation(-5.0F, 11.0F, 0.0F, 0.0F, 0.0F, 0.3927F)); - partdefinition.addOrReplaceChild("left_arm_slim", CubeListBuilder.create().texOffs(32, 48).addBox(-1.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)).texOffs(48, 48).addBox(-1.0F, -2.0F, -2.0F, 3.0F, 12.0F, 4.0F, new CubeDeformation(0.25F)), PartPose.offsetAndRotation(5.0F, 11.0F, 0.0F, 0.0F, 0.0F, -0.3927F)); - partdefinition.addOrReplaceChild("left_arm", CubeListBuilder.create().texOffs(32, 48).addBox(-1.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)).texOffs(48, 48).addBox(-1.0F, -2.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.25F)), PartPose.offsetAndRotation(5.0F, 11.0F, 0.0F, 0.0F, 0.0F, -0.3927F)); - partdefinition.addOrReplaceChild("right_leg", CubeListBuilder.create().texOffs(0, 16).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)).texOffs(0, 32).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.25F)), PartPose.offsetAndRotation(-2.0F, 19.0F, -2.0F, -1.5708F, 0.3927F, 0.0F)); - partdefinition.addOrReplaceChild("left_leg", CubeListBuilder.create().texOffs(16, 48).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.0F)).texOffs(0, 48).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 12.0F, 4.0F, new CubeDeformation(0.25F)), PartPose.offsetAndRotation(2.0F, 19.0F, -2.0F, -1.5708F, -0.3927F, 0.0F)); - return LayerDefinition.create(meshdefinition, 64, 64); - } - - - @Override - public void renderToBuffer(PoseStack poseStack, @NotNull VertexConsumer vertexConsumer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { - poseStack.pushPose(); - poseStack.scale(0.5F, 0.5F, 0.5F); - poseStack.translate(0.0, 1.5010000467300415, 0.0); - this.head.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); - this.body.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); - if (this.slim) { - this.rightArmSlim.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); - this.leftArmSlim.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); - } else { - this.rightArm.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); - this.leftArm.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); - } - - this.rightLeg.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); - this.leftLeg.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); - poseStack.popPose(); - } -} diff --git a/src/main/java/top/r3944realms/lib39/client/renderer/RadialMenuRenderer.java b/src/main/java/top/r3944realms/lib39/client/renderer/RadialMenuRenderer.java deleted file mode 100644 index a20d515..0000000 --- a/src/main/java/top/r3944realms/lib39/client/renderer/RadialMenuRenderer.java +++ /dev/null @@ -1,381 +0,0 @@ -package top.r3944realms.lib39.client.renderer; - -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.network.chat.Component; -import net.minecraft.util.Mth; -import net.minecraft.world.item.ItemStack; -import org.joml.Matrix4f; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Function; - -/** - * 圆形径向菜单渲染器 - * 用于创建美观的圆形选择菜单 - * - * @param the type parameter - */ -public class RadialMenuRenderer { - /** - * The constant DEFAULT_INNER_RADIUS. - */ -// 默认配置常量 - public static final float DEFAULT_INNER_RADIUS = 30f; - /** - * The constant DEFAULT_OUTER_RADIUS. - */ - public static final float DEFAULT_OUTER_RADIUS = 80f; - /** - * The constant DEFAULT_MIDDLE_RADIUS. - */ - public static final float DEFAULT_MIDDLE_RADIUS = 55f; - /** - * The constant DEFAULT_SEGMENTS. - */ - public static final int DEFAULT_SEGMENTS = 64; - - // 配置选项 - private final float innerRadius; - private final float outerRadius; - private final float middleRadius; - private final int segments; - private final boolean enableHoverAnimation; - private final ColorScheme colorScheme; - - // 状态 - private int hoveredIndex = -1; - private final float[] hoverAnimations; - private long lastAnimationTime = 0; - - /** - * The type Color scheme. - */ - public static class ColorScheme { - /** - * The Normal color. - */ - public final float[] normalColor; - /** - * The Hovered color. - */ - public final float[] hoveredColor; - /** - * The Selected color. - */ - public final float[] selectedColor; - /** - * The Background color. - */ - public final float[] backgroundColor; - - /** - * Instantiates a new Color scheme. - * - * @param normalColor the normal color - * @param hoveredColor the hovered color - * @param selectedColor the selected color - * @param backgroundColor the background color - */ - public ColorScheme(float[] normalColor, float[] hoveredColor, float[] selectedColor, float[] backgroundColor) { - this.normalColor = normalColor; - this.hoveredColor = hoveredColor; - this.selectedColor = selectedColor; - this.backgroundColor = backgroundColor; - } - - /** - * The constant DEFAULT. - */ -// 预定义颜色方案 - public static final ColorScheme DEFAULT = new ColorScheme( - new float[]{0.3f, 0.3f, 0.8f, 0.6f}, // 正常 - 蓝色 - new float[]{0.9f, 0.7f, 0.1f, 0.8f}, // 悬停 - 金色 - new float[]{0.2f, 0.8f, 0.2f, 0.9f}, // 选中 - 绿色 - new float[]{0.1f, 0.1f, 0.1f, 0.7f} // 背景 - ); - - /** - * The constant FIRE. - */ - public static final ColorScheme FIRE = new ColorScheme( - new float[]{0.8f, 0.3f, 0.1f, 0.6f}, // 正常 - 红色 - new float[]{1.0f, 0.5f, 0.0f, 0.8f}, // 悬停 - 橙色 - new float[]{1.0f, 0.9f, 0.0f, 0.9f}, // 选中 - 黄色 - new float[]{0.2f, 0.1f, 0.0f, 0.7f} // 背景 - ); - - /** - * The constant NATURE. - */ - public static final ColorScheme NATURE = new ColorScheme( - new float[]{0.2f, 0.6f, 0.3f, 0.6f}, // 正常 - 绿色 - new float[]{0.4f, 0.8f, 0.4f, 0.8f}, // 悬停 - 亮绿 - new float[]{0.1f, 0.9f, 0.7f, 0.9f}, // 选中 - 青绿 - new float[]{0.1f, 0.2f, 0.1f, 0.7f} // 背景 - ); - } - - - /** - * Instantiates a new Radial menu renderer. - */ - public RadialMenuRenderer() { - this(DEFAULT_INNER_RADIUS, DEFAULT_OUTER_RADIUS, ColorScheme.DEFAULT); - } - - /** - * Instantiates a new Radial menu renderer. - * - * @param innerRadius the inner radius - * @param outerRadius the outer radius - */ - public RadialMenuRenderer(float innerRadius, float outerRadius) { - this(innerRadius, outerRadius, ColorScheme.DEFAULT); - } - - /** - * Instantiates a new Radial menu renderer. - * - * @param innerRadius the inner radius - * @param outerRadius the outer radius - * @param colorScheme the color scheme - */ - public RadialMenuRenderer(float innerRadius, float outerRadius, ColorScheme colorScheme) { - this(innerRadius, outerRadius, (innerRadius + outerRadius) / 2f, DEFAULT_SEGMENTS, true, colorScheme); - } - - /** - * Instantiates a new Radial menu renderer. - * - * @param innerRadius the inner radius - * @param outerRadius the outer radius - * @param middleRadius the middle radius - * @param segments the segments - * @param enableHoverAnimation the enable hover animation - * @param colorScheme the color scheme - */ - public RadialMenuRenderer(float innerRadius, float outerRadius, float middleRadius, - int segments, boolean enableHoverAnimation, ColorScheme colorScheme) { - this.innerRadius = innerRadius; - this.outerRadius = outerRadius; - this.middleRadius = middleRadius; - this.segments = segments; - this.enableHoverAnimation = enableHoverAnimation; - this.colorScheme = colorScheme; - this.hoverAnimations = new float[0]; - } - - /** - * 渲染圆形菜单 - * - * @param guiGraphics the gui graphics - * @param entries the entries - * @param titleProvider the title provider - * @param iconProvider the icon provider - * @param selectedIndex the selected index - * @param trackMouse the track mouse - */ - public void render(GuiGraphics guiGraphics, List entries, - Function titleProvider, - Function iconProvider, - int selectedIndex, boolean trackMouse) { - if (entries.isEmpty()) return; - - // 更新动画状态 - updateHoverAnimations(entries.size()); - - // 设置渲染状态 - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.setShader(GameRenderer::getPositionColorShader); - - float centerX = guiGraphics.guiWidth() / 2f; - float centerY = guiGraphics.guiHeight() / 2f; - - guiGraphics.pose().pushPose(); - guiGraphics.pose().translate(centerX, centerY, 0f); - - // 渲染所有扇形区域 - renderSectors(guiGraphics, entries, selectedIndex); - - // 渲染图标和文本 - renderIconsAndText(guiGraphics, entries, titleProvider, iconProvider); - - guiGraphics.pose().popPose(); - - RenderSystem.disableBlend(); - } - - /** - * 渲染扇形区域 - */ - private void renderSectors(GuiGraphics guiGraphics, List entries, int selectedIndex) { - int count = entries.size(); - float angleSize = 360f / count; - - for (int i = 0; i < count; i++) { - float startAngle = -90f + i * angleSize; - float currentOuterRadius = outerRadius; - - // 悬停动画效果 - if (enableHoverAnimation && i < hoverAnimations.length) { - currentOuterRadius += hoverAnimations[i] * 5f; - } - - // 颜色设置 - float[] color = getSectorColor(i, selectedIndex, entries.get(i)); - - // 绘制扇形 - drawSector(guiGraphics, startAngle, angleSize, innerRadius, currentOuterRadius, color); - } - } - - - /** - * 获取扇形颜色 - */ - private float[] getSectorColor(int index, int selectedIndex, T entry) { - if (index == selectedIndex) { - return colorScheme.selectedColor; // 选中状态 - } else if (index == hoveredIndex) { - return colorScheme.hoveredColor; // 悬停状态 - } else { - return colorScheme.normalColor; // 普通状态 - } - } - - /** - * 绘制单个扇形 - */ - private void drawSector(GuiGraphics guiGraphics, float startAngle, float angleSize, - float innerRadius, float outerRadius, float[] color) { - BufferBuilder buffer = Tesselator.getInstance().getBuilder(); - buffer.begin(VertexFormat.Mode.TRIANGLE_STRIP, DefaultVertexFormat.POSITION_COLOR); - - Matrix4f matrix = guiGraphics.pose().last().pose(); - float segments = Math.max(8, this.segments * (angleSize / 360f)); - - for (int i = 0; i <= segments; i++) { - float progress = i / segments; - float angle = startAngle + progress * angleSize; - float rad = angle * Mth.DEG_TO_RAD; - - float cos = Mth.cos(rad); - float sin = Mth.sin(rad); - - // 外圈顶点 - buffer.vertex(matrix, outerRadius * cos, outerRadius * sin, 0) - .color(color[0], color[1], color[2], color[3]).endVertex(); - // 内圈顶点 - buffer.vertex(matrix, innerRadius * cos, innerRadius * sin, 0) - .color(color[0], color[1], color[2], color[3] * 0.6f).endVertex(); - } - - BufferUploader.drawWithShader(buffer.end()); - } - - /** - * 渲染图标和文本 - */ - private void renderIconsAndText(GuiGraphics guiGraphics, List entries, - Function titleProvider, - Function iconProvider) { - int count = entries.size(); - var font = Minecraft.getInstance().font; - - for (int i = 0; i < count; i++) { - T entry = entries.get(i); - float angle = (-90f + 360f * (i + 0.5f) / count) * Mth.DEG_TO_RAD; - - // 计算位置 - float x = Mth.cos(angle) * middleRadius; - float y = Mth.sin(angle) * middleRadius; - - // 渲染图标 - ItemStack icon = iconProvider.apply(entry); - if (!icon.isEmpty()) { - guiGraphics.renderItem(icon, (int)(x - 8), (int)(y - 8)); - } - - // 渲染文本 - Component title = titleProvider.apply(entry); - guiGraphics.pose().pushPose(); - guiGraphics.pose().translate(x, y + 12, 0); - guiGraphics.pose().scale(0.7f, 0.7f, 0.7f); - guiGraphics.drawString(font, title, -font.width(title) / 2, 0, 0xFFFFFF, true); - guiGraphics.pose().popPose(); - } - } - - /** - * 更新悬停动画 - */ - private void updateHoverAnimations(int entryCount) { - if (!enableHoverAnimation) return; - - long currentTime = System.currentTimeMillis(); - float deltaTime = Math.min((currentTime - lastAnimationTime) / 1000f, 0.1f); - lastAnimationTime = currentTime; - - // 确保数组大小正确 - if (hoverAnimations.length != entryCount) { - // 这里需要重新初始化数组,实际使用时应该处理数组大小变化 - } - - // 更新动画值 - for (int i = 0; i < hoverAnimations.length && i < entryCount; i++) { - if (i == hoveredIndex) { - hoverAnimations[i] = Mth.clamp(hoverAnimations[i] + deltaTime * 2f, 0f, 1f); - } else { - hoverAnimations[i] = Mth.clamp(hoverAnimations[i] - deltaTime * 3f, 0f, 1f); - } - } - } - - /** - * 获取鼠标下的条目索引 - * - * @param entries the entries - * @param mouseX the mouse x - * @param mouseY the mouse y - * @return the hovered entry - */ - public int getHoveredEntry(List entries, double mouseX, double mouseY) { - float centerX = Minecraft.getInstance().getWindow().getGuiScaledWidth() / 2f; - float centerY = Minecraft.getInstance().getWindow().getGuiScaledHeight() / 2f; - - double relX = mouseX - centerX; - double relY = mouseY - centerY; - double distance = Math.sqrt(relX * relX + relY * relY); - - // 检查是否在有效范围内 - if (distance < innerRadius || distance > outerRadius) { - hoveredIndex = -1; - return -1; - } - - // 计算角度 - double angle = Math.atan2(relY, relX) * Mth.RAD_TO_DEG; - angle = (angle + 450) % 360; // 标准化到 0-360 - - int count = entries.size(); - int index = (int) (angle / (360f / count)) % count; - - hoveredIndex = index; - return index; - } - - /** - * 清除状态 - */ - public void clearState() { - hoveredIndex = -1; - // 重置动画数组 - Arrays.fill(hoverAnimations, 0f); - } -} diff --git a/src/main/java/top/r3944realms/lib39/client/renderer/block/DollBlockEntityRenderer.java b/src/main/java/top/r3944realms/lib39/client/renderer/block/DollBlockEntityRenderer.java deleted file mode 100644 index fd1796c..0000000 --- a/src/main/java/top/r3944realms/lib39/client/renderer/block/DollBlockEntityRenderer.java +++ /dev/null @@ -1,55 +0,0 @@ -package top.r3944realms.lib39.client.renderer.block; - -import com.mojang.authlib.GameProfile; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Axis; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; -import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.core.Direction; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.block.state.BlockState; -import org.jetbrains.annotations.NotNull; -import top.r3944realms.lib39.client.model.DollModel; -import top.r3944realms.lib39.client.renderer.item.DollItemRenderer; -import top.r3944realms.lib39.content.block.DollBlock; -import top.r3944realms.lib39.content.block.blockentity.DollBlockEntity; -import top.r3944realms.lib39.util.lang.Pair; - -/** - * The type Doll block entity renderer. - */ -public class DollBlockEntityRenderer implements BlockEntityRenderer { - private final DollModel dollModel; - - /** - * Instantiates a new Doll block entity renderer. - * - * @param context the context - */ - public DollBlockEntityRenderer(BlockEntityRendererProvider.@NotNull Context context) { - this.dollModel = new DollModel(context.bakeLayer(DollModel.LAYER_LOCATION)); - } - - @Override - public void render(@NotNull DollBlockEntity dollBlockEntity, float partialTick, @NotNull PoseStack poseStack, @NotNull MultiBufferSource buffer, int packedLight, int packedOverlay) { - BlockState blockState = dollBlockEntity.getBlockState(); - if (blockState.getBlock() instanceof DollBlock) { - Direction facing = blockState.getValue(DollBlock.FACING); - GameProfile profile = dollBlockEntity.getOwnerProfile(); - Pair resourceLocationBooleanPair = DollItemRenderer.loadSkin(profile); - poseStack.pushPose(); - poseStack.translate(0.5, 1.5, 0.5); - poseStack.scale(1.0F, -1.0F, -1.0F); - float rotation = facing.toYRot(); - poseStack.mulPose(Axis.YP.rotationDegrees(rotation)); - VertexConsumer vertexConsumer = buffer.getBuffer(RenderType.entityTranslucent(resourceLocationBooleanPair.first)); - this.dollModel.slim = resourceLocationBooleanPair.second; - this.dollModel.renderToBuffer(poseStack, vertexConsumer, packedLight, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); - poseStack.popPose(); - } - } -} diff --git a/src/main/java/top/r3944realms/lib39/client/renderer/item/DollItemRenderer.java b/src/main/java/top/r3944realms/lib39/client/renderer/item/DollItemRenderer.java deleted file mode 100644 index 7e29275..0000000 --- a/src/main/java/top/r3944realms/lib39/client/renderer/item/DollItemRenderer.java +++ /dev/null @@ -1,98 +0,0 @@ -package top.r3944realms.lib39.client.renderer.item; - -import com.mojang.authlib.GameProfile; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Axis; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.resources.DefaultPlayerSkin; -import net.minecraft.client.resources.SkinManager; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemDisplayContext; -import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; -import top.r3944realms.lib39.client.model.DollModel; -import top.r3944realms.lib39.content.item.DollItem; -import top.r3944realms.lib39.util.GameProfileHelper; -import top.r3944realms.lib39.util.lang.Pair; - -/** - * The type Doll item renderer. - */ -public class DollItemRenderer extends BlockEntityWithoutLevelRenderer { - private static DollItemRenderer instance; - private final DollModel dollModel; - private DollItemRenderer() { - super( - Minecraft.getInstance().getBlockEntityRenderDispatcher(), - Minecraft.getInstance().getEntityModels() - ); - this.dollModel = new DollModel( - Minecraft.getInstance().getEntityModels().bakeLayer(DollModel.LAYER_LOCATION) - ); - } - - /** - * Gets instance. - * - * @return the instance - */ - public static DollItemRenderer getInstance() { - if (instance == null) { - instance = new DollItemRenderer(); - } - return instance; - } - - @Override - public void renderByItem(@NotNull ItemStack stack, @NotNull ItemDisplayContext displayContext, @NotNull PoseStack poseStack, @NotNull MultiBufferSource buffer, int packedLight, int packedOverlay) { - if (!(stack.getItem() instanceof DollItem)) { - return; - } - GameProfile profile = GameProfileHelper.getProfileFromItemStack(stack); - Pair resourceLocationBooleanPair = loadSkin(profile); - ResourceLocation playerSkin = resourceLocationBooleanPair.first; - boolean isSlim = resourceLocationBooleanPair.second; - poseStack.pushPose(); - VertexConsumer vertexConsumer = buffer.getBuffer( - RenderType.entityTranslucent(playerSkin) - ); - - poseStack.translate(0.5, 2.6, 0.8); - poseStack.scale(1.8F, -1.8F, -1.8F); - poseStack.mulPose(Axis.YP.rotationDegrees(180)); - this.dollModel.slim = isSlim; - this.dollModel.renderToBuffer( - poseStack, - vertexConsumer, - packedLight, - packedOverlay, - 1.0F, 1.0F, 1.0F, 1.0F - ); - - poseStack.popPose(); - } - - /** - * Load skin pair. - * - * @param profile the profile - * @return the pair - */ - public static @NotNull Pair loadSkin(GameProfile profile) { - SkinManager skinManager = Minecraft.getInstance().getSkinManager(); - ResourceLocation playerSkin; - boolean isSlim; - if (profile != null) { - playerSkin = skinManager.getInsecureSkinLocation(profile); - isSlim = GameProfileHelper.isSlimArms(profile); - } else { - playerSkin = DefaultPlayerSkin.getDefaultSkin(); //6 new SkinType("textures/entity/player/slim/steve.png", DefaultPlayerSkin.ModelType.SLIM), - isSlim = true; - } - return Pair.of(playerSkin, isSlim); - } -} diff --git a/src/main/java/top/r3944realms/lib39/client/shader/Lib39Shaders.java b/src/main/java/top/r3944realms/lib39/client/shader/Lib39Shaders.java deleted file mode 100644 index 03b7f9b..0000000 --- a/src/main/java/top/r3944realms/lib39/client/shader/Lib39Shaders.java +++ /dev/null @@ -1,73 +0,0 @@ -package top.r3944realms.lib39.client.shader; - -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ShaderInstance; -import net.minecraftforge.client.event.RegisterShadersEvent; -import top.r3944realms.lib39.Lib39; - -/** - * The type Lib 39 shaders. - */ -public class Lib39Shaders { - /** - * The Minecraft. - */ - static final Minecraft MINECRAFT = Minecraft.getInstance(); - - /** - * Gets ring shader. - * - * @return the ring shader - */ - public static ShaderInstance getRingShader() { - return ringShader; - } - - /** - * The Ring shader. - */ - static ShaderInstance ringShader; - - /** - * Gets selection shader. - * - * @return the selection shader - */ - public static ShaderInstance getSelectionShader() { - return selectionShader; - } - - /** - * The Selection shader. - */ - static ShaderInstance selectionShader; - - /** - * Register. - * - * @param event the event - */ - public static void register(RegisterShadersEvent event) { - try { - event.registerShader( - new ShaderInstance( - event.getResourceProvider(), - Lib39.rl("ring"), - DefaultVertexFormat.POSITION_COLOR - ), - it -> ringShader = it - ); - event.registerShader( - new ShaderInstance( - event.getResourceProvider(), - Lib39.rl("selection"), - DefaultVertexFormat.POSITION_COLOR - ), - it -> selectionShader = it - ); - } catch (Exception e) { - Lib39.LOGGER.error("Failed to register shader", e); - } - } -} diff --git a/src/main/java/top/r3944realms/lib39/content/block/DollBlock.java b/src/main/java/top/r3944realms/lib39/content/block/DollBlock.java deleted file mode 100644 index 9d2958b..0000000 --- a/src/main/java/top/r3944realms/lib39/content/block/DollBlock.java +++ /dev/null @@ -1,241 +0,0 @@ -package top.r3944realms.lib39.content.block; - -import com.mojang.authlib.GameProfile; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; -import net.minecraft.world.level.block.state.properties.BooleanProperty; -import net.minecraft.world.level.block.state.properties.EnumProperty; -import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; -import net.minecraft.world.level.material.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.level.material.PushReaction; -import net.minecraft.world.level.storage.loot.LootParams; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.world.phys.HitResult; -import net.minecraft.world.phys.Vec3; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.VoxelShape; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import top.r3944realms.lib39.content.block.blockentity.DollBlockEntity; -import top.r3944realms.lib39.content.block.property.DollPose; -import top.r3944realms.lib39.content.register.Lib39BlockEntities; -import top.r3944realms.lib39.content.register.Lib39Items; -import top.r3944realms.lib39.content.register.Lib39SoundEvents; -import top.r3944realms.lib39.util.GameProfileHelper; - -import java.util.List; - -/** - * The type Doll block. - */ -@SuppressWarnings("deprecation") -public class DollBlock extends HorizontalDirectionalBlock implements SimpleWaterloggedBlock, EntityBlock { - private static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; - /** - * The constant POSE. - */ - public static final EnumProperty POSE = EnumProperty.create("pose", DollPose.class); - - private static final VoxelShape DOLL_SHAPE = Block.box(2.0d, 0.0d, 2.0d, 14.0d, 12.0d, 14.0d); - private static final Properties properties = Properties.of() - .instrument(NoteBlockInstrument.BASEDRUM) - .sound(SoundType.WOOL) - .strength(0f, 10f) - .noOcclusion(); - - private static final double PARTICLE_OFFSET_RANGE = 0.25; - private static final double PARTICLE_HEIGHT_OFFSET = 1.0; - private static final double PARTICLE_HEIGHT_VARIANCE = 0.2; - private static final float NOTE_COLOR_DIVISOR = 24.0F; - private static final int MAX_NOTE_COLORS = 4; - - private static final float BASE_VOLUME = 1.0f; - private static final float PITCH_VARIANCE = 0.5f; - private static final float BASE_PITCH = 0.75f; - - /** - * Instantiates a new Doll block. - */ - public DollBlock() { - super(properties); - this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.SOUTH) - .setValue(POSE, DollPose.DEFAULT) - .setValue(WATERLOGGED, false)); - } - - @Override - public boolean canBeReplaced(@NotNull BlockState state, @NotNull BlockPlaceContext useContext) { - return false; - } - - @Override - public @Nullable PushReaction getPistonPushReaction(BlockState state) { - return PushReaction.DESTROY; - } - - @Override - public @NotNull BlockState updateShape(@NotNull BlockState currentState, @NotNull Direction direction, @NotNull BlockState neighborState, - @NotNull LevelAccessor level, @NotNull BlockPos currentPos, @NotNull BlockPos neighborPos) { - if (currentState.getValue(WATERLOGGED)) { - level.scheduleTick(currentPos, Fluids.WATER, Fluids.WATER.getTickDelay(level)); - } - return super.updateShape(currentState, direction, neighborState, level, currentPos, neighborPos); - } - - @Override - public @NotNull FluidState getFluidState(@NotNull BlockState blockState) { - return blockState.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(blockState); - } - - @Override - public @NotNull InteractionResult use(@NotNull BlockState blockState, @NotNull Level level, @NotNull BlockPos blockPos, @NotNull Player player, - @NotNull InteractionHand hand, @NotNull BlockHitResult hitResult) { - if (level instanceof ServerLevel serverLevel) { - // 播放粒子效果 - spawnNoteParticles(serverLevel, blockPos); - // 播放音效 - playDollSound(serverLevel, blockPos); - } - return InteractionResult.SUCCESS; - } - - /** - * 在玩偶位置生成音符粒子效果 - */ - private void spawnNoteParticles(ServerLevel serverLevel, BlockPos blockPos) { - Vec3 particlePosition = calculateParticlePosition(serverLevel, blockPos); - float noteColor = calculateNoteColor(serverLevel); - - serverLevel.sendParticles(ParticleTypes.NOTE, - particlePosition.x(), particlePosition.y(), particlePosition.z(), - 0, noteColor, 0, 0, 1); - } - - /** - * 计算粒子生成位置,添加随机偏移 - */ - private @NotNull Vec3 calculateParticlePosition(@NotNull ServerLevel serverLevel, BlockPos blockPos) { - return Vec3.atBottomCenterOf(blockPos).add( - (serverLevel.getRandom().nextFloat() - 0.5) * PARTICLE_OFFSET_RANGE * 2, - PARTICLE_HEIGHT_OFFSET + serverLevel.getRandom().nextFloat() * PARTICLE_HEIGHT_VARIANCE, - (serverLevel.getRandom().nextFloat() - 0.5) * PARTICLE_OFFSET_RANGE * 2 - ); - } - - /** - * 计算音符粒子的颜色 - */ - private float calculateNoteColor(@NotNull ServerLevel serverLevel) { - return serverLevel.getRandom().nextInt(MAX_NOTE_COLORS) / NOTE_COLOR_DIVISOR; - } - - /** - * 播放玩偶音效 - */ - private void playDollSound(@NotNull ServerLevel serverLevel, BlockPos blockPos) { - float pitch = BASE_PITCH + serverLevel.random.nextFloat() * PITCH_VARIANCE; - serverLevel.playSound(null, blockPos, Lib39SoundEvents.DUCK_TOY.get(), - SoundSource.BLOCKS, BASE_VOLUME, pitch); - } - - @Override - public @Nullable BlockState getStateForPlacement(@NotNull BlockPlaceContext context) { - FluidState fluidState = context.getLevel().getFluidState(context.getClickedPos()); - boolean isWaterlogged = fluidState.getType() == Fluids.WATER; - - return this.defaultBlockState() - .setValue(FACING, context.getHorizontalDirection().getOpposite()) - .setValue(WATERLOGGED, isWaterlogged) - .setValue(POSE, DollPose.DEFAULT); - } - - @Override - public @NotNull VoxelShape getShape(@NotNull BlockState blockState, @NotNull BlockGetter level, @NotNull BlockPos blockPos, @NotNull CollisionContext context) { - return DOLL_SHAPE; - } - - @Override - protected void createBlockStateDefinition(StateDefinition.@NotNull Builder builder) { - super.createBlockStateDefinition(builder); - builder.add(FACING, WATERLOGGED, POSE); - } - - @Nullable - @Override - public BlockEntity newBlockEntity(@NotNull BlockPos blockPos, @NotNull BlockState blockState) { - return Lib39BlockEntities.DOLL_BLOCK_ENTITY.get().create(blockPos, blockState); - } - - @SuppressWarnings("deprecation") - @Override - public @NotNull RenderShape getRenderShape(@NotNull BlockState state) { - return RenderShape.ENTITYBLOCK_ANIMATED; - } - - @Override - public ItemStack getCloneItemStack(BlockState state, HitResult target, BlockGetter level, BlockPos pos, Player player) { - ItemStack stack = super.getCloneItemStack(state, target, level, pos, player); - - BlockEntity blockEntity = level.getBlockEntity(pos); - if (blockEntity instanceof DollBlockEntity doll) { - GameProfile profile = doll.getOwnerProfile(); - if (profile != null) { - GameProfileHelper.saveProfileToItemStack(stack, profile); - } - } - return stack; - } - - /** - * 最重要的方法:重写掉落逻辑 - */ - @Override - @NotNull - public List getDrops(@NotNull BlockState state, @NotNull LootParams.Builder params) { - // 获取方块实体 - BlockEntity blockEntity = params.getOptionalParameter(LootContextParams.BLOCK_ENTITY); - - if (blockEntity instanceof DollBlockEntity dollEntity) { - List customDrops = getCustomDrops(dollEntity, params); - if (customDrops != null) return customDrops; - } - return super.getDrops(state, params); - } - - /** - * 生成自定义掉落物 - */ - @Nullable - private List getCustomDrops(DollBlockEntity dollEntity, LootParams.Builder params) { - if (params.getOptionalParameter(LootContextParams.THIS_ENTITY) instanceof Player player) { - if (player.isCreative()) { - return List.of(); - } - } - GameProfile profile = dollEntity.getOwnerProfile(); - if (profile != null) { - ItemStack instance = Lib39Items.DOLL.get().getDefaultInstance(); - GameProfileHelper.saveProfileToItemStack(instance, profile); - return List.of(instance); - } - return null; - } -} diff --git a/src/main/java/top/r3944realms/lib39/content/block/blockentity/DollBlockEntity.java b/src/main/java/top/r3944realms/lib39/content/block/blockentity/DollBlockEntity.java deleted file mode 100644 index d2fb61a..0000000 --- a/src/main/java/top/r3944realms/lib39/content/block/blockentity/DollBlockEntity.java +++ /dev/null @@ -1,98 +0,0 @@ -package top.r3944realms.lib39.content.block.blockentity; - -import com.mojang.authlib.GameProfile; -import net.minecraft.Util; -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.SkullBlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import org.jetbrains.annotations.NotNull; -import top.r3944realms.lib39.content.register.Lib39BlockEntities; -import top.r3944realms.lib39.util.GameProfileHelper; -import top.r3944realms.lib39.util.nbt.NBTReader; -import top.r3944realms.lib39.util.nbt.NBTWriter; - -import javax.annotation.Nullable; - -/** - * The type Doll block entity. - */ -public class DollBlockEntity extends BlockEntity { - - @Nullable - private GameProfile owner; - - /** - * Instantiates a new Doll block entity. - * - * @param pos the pos - * @param blockState the block state - */ - public DollBlockEntity(BlockPos pos, BlockState blockState) { - super(Lib39BlockEntities.DOLL_BLOCK_ENTITY.get(), pos, blockState); - } - - protected void saveAdditional(@NotNull CompoundTag tag) { - super.saveAdditional(tag); - NBTWriter.of(tag) - .compoundIf(GameProfileHelper.TAG_OWN_PROFILE, owner != null, () -> NbtUtils.writeGameProfile(new CompoundTag(), this.owner)); - } - - public void load(@NotNull CompoundTag tag) { - super.load(tag); - NBTReader.of(tag) - .compound(GameProfileHelper.TAG_OWN_PROFILE, compoundTag -> setOwner(NbtUtils.readGameProfile(compoundTag))); - } - - /** - * Gets owner profile. - * - * @return the owner profile - */ - @Nullable - public GameProfile getOwnerProfile() { - return this.owner; - } - - - public ClientboundBlockEntityDataPacket getUpdatePacket() { - return ClientboundBlockEntityDataPacket.create(this); - } - - public @NotNull CompoundTag getUpdateTag() { - return this.saveWithoutMetadata(); - } - - /** - * Sets owner. - * - * @param owner the owner - */ - public void setOwner(@Nullable GameProfile owner) { - synchronized (this) { - this.owner = owner; - } - - this.updateOwnerProfile(); - } - - /** - * Sets owner. - * - * @param ownerName the owner name - */ - public void setOwner(@Nullable String ownerName) { - setOwner(new GameProfile(Util.NIL_UUID, ownerName)); - } - - private void updateOwnerProfile() { - SkullBlockEntity.updateGameprofile(this.owner, gameProfile -> { - this.owner = gameProfile; - this.setChanged(); - }); - } - -} diff --git a/src/main/java/top/r3944realms/lib39/content/block/property/DollPose.java b/src/main/java/top/r3944realms/lib39/content/block/property/DollPose.java deleted file mode 100644 index c69b7d7..0000000 --- a/src/main/java/top/r3944realms/lib39/content/block/property/DollPose.java +++ /dev/null @@ -1,28 +0,0 @@ -package top.r3944realms.lib39.content.block.property; - -import net.minecraft.util.StringRepresentable; -import org.jetbrains.annotations.NotNull; - -/** - * The enum Doll pose. - */ -public enum DollPose implements StringRepresentable { - /** - * Default doll pose. - */ - DEFAULT("default"), - /** - * further support - */ - FURTHER("further"), - ; - private final String name; - DollPose(String name) { - this.name = name; - } - - @Override - public @NotNull String getSerializedName() { - return name; - } -} diff --git a/src/main/java/top/r3944realms/lib39/content/item/DollItem.java b/src/main/java/top/r3944realms/lib39/content/item/DollItem.java deleted file mode 100644 index 32de528..0000000 --- a/src/main/java/top/r3944realms/lib39/content/item/DollItem.java +++ /dev/null @@ -1,58 +0,0 @@ -package top.r3944realms.lib39.content.item; - -import com.mojang.authlib.GameProfile; -import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; -import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.Level; -import net.minecraftforge.client.extensions.common.IClientItemExtensions; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import top.r3944realms.lib39.client.renderer.item.DollItemRenderer; -import top.r3944realms.lib39.content.register.Lib39Blocks; -import top.r3944realms.lib39.util.GameProfileHelper; - -import java.util.List; -import java.util.function.Consumer; - -/** - * The type Doll item. - */ -public class DollItem extends BlockItem { - /** - * Instantiates a new Doll item. - * - * @param properties the properties - */ - public DollItem(Properties properties) { - super(Lib39Blocks.DOLL.get(), properties); - } - - @Override - public void initializeClient(@NotNull Consumer consumer) { - consumer.accept(new IClientItemExtensions() { - @Override - public BlockEntityWithoutLevelRenderer getCustomRenderer() { - return DollItemRenderer.getInstance(); - } - }); - } - - @Override - public boolean canEquip(ItemStack stack, EquipmentSlot armorType, Entity entity) { - return armorType == EquipmentSlot.HEAD; - } - - @Override - public void appendHoverText(@NotNull ItemStack stack, @Nullable Level level, @NotNull List tooltip, @NotNull TooltipFlag flag) { - GameProfile profileFromItemStack = GameProfileHelper.getProfileFromItemStack(stack); - if (profileFromItemStack != null && profileFromItemStack.getName() != null) { - tooltip.add(Component.translatable("tooltip.lib39.content.doll.hover.1", profileFromItemStack.getName())); - } - tooltip.add(Component.translatable("tooltip.lib39.content.doll.hover.2")); - } -} diff --git a/src/main/java/top/r3944realms/lib39/content/register/Lib39BlockEntities.java b/src/main/java/top/r3944realms/lib39/content/register/Lib39BlockEntities.java deleted file mode 100644 index 9c9d8e8..0000000 --- a/src/main/java/top/r3944realms/lib39/content/register/Lib39BlockEntities.java +++ /dev/null @@ -1,37 +0,0 @@ -package top.r3944realms.lib39.content.register; - -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.content.block.blockentity.DollBlockEntity; - -/** - * The type Lib 39 block entities. - */ -public class Lib39BlockEntities { - /** - * The constant BLOCK_ENTITY_TYPES. - */ - public static final DeferredRegister> BLOCK_ENTITY_TYPES = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, Lib39.MOD_ID); - /** - * The constant DOLL_BLOCK_ENTITY. - */ - @SuppressWarnings("DataFlowIssue") - public static final RegistryObject> DOLL_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("doll", - () -> BlockEntityType.Builder - .of(DollBlockEntity::new, Lib39Blocks.DOLL.get()) - .build(null) - ); - - /** - * Register. - * - * @param bus the bus - */ - public static void register(IEventBus bus) { - BLOCK_ENTITY_TYPES.register(bus); - } -} diff --git a/src/main/java/top/r3944realms/lib39/content/register/Lib39Blocks.java b/src/main/java/top/r3944realms/lib39/content/register/Lib39Blocks.java deleted file mode 100644 index 40cdede..0000000 --- a/src/main/java/top/r3944realms/lib39/content/register/Lib39Blocks.java +++ /dev/null @@ -1,39 +0,0 @@ -package top.r3944realms.lib39.content.register; - -import net.minecraft.world.level.block.Block; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.content.block.DollBlock; -import top.r3944realms.lib39.util.block.BlockRegistryBuilder; - -/** - * The type Lib 39 blocks. - */ -public class Lib39Blocks { - /** - * The constant BLOCKS. - */ - public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, Lib39.MOD_ID); - - /** - * The constant DOLL. - */ - public static final RegistryObject DOLL = BlockRegistryBuilder - .create() - .withName("doll") - .registerBlock(BLOCKS, DollBlock::new) - .build(); - - - /** - * Register. - * - * @param bus the bus - */ - public static void register(IEventBus bus) { - BLOCKS.register(bus); - } -} diff --git a/src/main/java/top/r3944realms/lib39/content/register/Lib39Items.java b/src/main/java/top/r3944realms/lib39/content/register/Lib39Items.java deleted file mode 100644 index 9931c1a..0000000 --- a/src/main/java/top/r3944realms/lib39/content/register/Lib39Items.java +++ /dev/null @@ -1,34 +0,0 @@ -package top.r3944realms.lib39.content.register; - -import net.minecraft.world.item.Item; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.content.item.DollItem; - -/** - * The type Ex lib 39 items. - */ -public class Lib39Items { - /** - * The constant ITEMS. - */ - public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, Lib39.MOD_ID); - - /** - * The constant DOLL. - */ - public static final RegistryObject DOLL = ITEMS.register("doll", () -> new DollItem(new Item.Properties())); - - /** - * Register. - * - * @param bus the bus - */ - public static void register(IEventBus bus) { - ITEMS.register(bus); - } - -} diff --git a/src/main/java/top/r3944realms/lib39/content/register/Lib39SoundEvents.java b/src/main/java/top/r3944realms/lib39/content/register/Lib39SoundEvents.java deleted file mode 100644 index a062e86..0000000 --- a/src/main/java/top/r3944realms/lib39/content/register/Lib39SoundEvents.java +++ /dev/null @@ -1,48 +0,0 @@ -package top.r3944realms.lib39.content.register; - -import net.minecraft.resources.ResourceLocation; -import net.minecraft.sounds.SoundEvent; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; -import top.r3944realms.lib39.Lib39; - -/** - * The type Lib 39 sound events. - */ -public class Lib39SoundEvents { - /** - * The constant SOUND_EVENTS. - */ - public static final DeferredRegister SOUND_EVENTS = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, Lib39.MOD_ID); - /** - * The constant RL_DUCK_TOY. - */ - public static final ResourceLocation RL_DUCK_TOY = Lib39.rl("duck_toy"); - /** - * The constant DUCK_TOY. - */ - public static final RegistryObject DUCK_TOY = SOUND_EVENTS.register("duck_toy", - () -> SoundEvent.createFixedRangeEvent(RL_DUCK_TOY, 32.0f)); - - /** - * Register. - * - * @param bus the bus - */ - public static void register(IEventBus bus) { - SOUND_EVENTS.register(bus); - } - - - /** - * Gets sub title translate key. - * - * @param name the name - * @return the sub title translate key - */ - public static String getSubTitleTranslateKey(String name) { - return "sound." + Lib39.MOD_ID + ".subtitle." + name; - } -} diff --git a/src/main/java/top/r3944realms/lib39/core/command/ICommandHelpManager.java b/src/main/java/top/r3944realms/lib39/core/command/ICommandHelpManager.java deleted file mode 100644 index 11a267f..0000000 --- a/src/main/java/top/r3944realms/lib39/core/command/ICommandHelpManager.java +++ /dev/null @@ -1,547 +0,0 @@ -package top.r3944realms.lib39.core.command; - -import net.minecraft.ChatFormatting; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.network.chat.*; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import top.r3944realms.lib39.base.datagen.value.Lib39LangKey; -import top.r3944realms.lib39.core.command.model.CommandNode; -import top.r3944realms.lib39.core.command.model.CommandPath; -import top.r3944realms.lib39.core.command.model.Parameter; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.function.Consumer; - -/** - * The interface Command help manager. - */ -public interface ICommandHelpManager { - /** - * The constant NEWLINE. - */ - String NEWLINE = "\n"; - - /** - * Gets id. - * - * @return the id - */ - ResourceLocation getID(); - - /** - * Gets head key. - * - * @return the head key - */ - String getHeadKey(); - - /** - * Gets command head. - * - * @return the command head - */ - default String getCommandHead() { - return getID().getNamespace(); - } - - /** - * Init command node. - * - * @return the command node - */ - default CommandNode init() { - CommandNode root; - root = new CommandNode(this, getCommandHead(), Component.translatable(Lib39LangKey.Message.HELP_HEADER.getKey(), Component.translatable(getHeadKey())), true); - root.addChild(new CommandNode(this, "help", Component.translatable(Lib39LangKey.Message.BASIC_HELP.getKey()))); - return root; - } - - /** - * Gets cache. - * - * @return the cache - */ - Map getCache(); - - /** - * Gets root node. - * - * @return the root node - */ - CommandNode getRootNode(); - - /** - * Register command help. - * - * @param commandNode the command node - * @param description the description - */ - default void registerCommandHelp(@NotNull CommandNode commandNode, MutableComponent description) { - registerCommandHelp(commandNode.getFullPath(), description); - } - - /** - * Register command help. - * - * @param commandNode the command node - * @param descriptionKey the description key - */ - default void registerCommandHelp(@NotNull CommandNode commandNode, String descriptionKey) { - registerCommandHelp(commandNode.getFullPath(), Component.translatable(descriptionKey)); - } - - /** - * Register command help. - * - * @param commandPath the command path - */ - default void registerCommandHelp(@NotNull CommandPath commandPath) { - registerCommandHelp(commandPath.fullPath(), Component.literal("")); - } - - /** - * Register command parameters. - * - * @param commandPath the command path - * @param parameters the parameters - */ - default void registerCommandParameters(@NotNull CommandPath commandPath, @NotNull Parameter.Builder parameters) { - registerCommandParameters(commandPath.fullPath(), parameters.build()); - } - - private void registerCommandHelp(@NotNull String commandPath, MutableComponent description) { - String[] pathParts = commandPath.split(" "); - CommandNode currentNode = getRootNode(); - - int startIndex = pathParts[0].equals(getRootNode().getName()) ? 1 : 0; - - for (int i = startIndex; i < pathParts.length; i++) { - String part = pathParts[i]; - CommandNode child = currentNode.getChild(part); - - if (child == null) { - MutableComponent nodeDescription = (i == pathParts.length - 1) ? description : Component.literal(""); - child = new CommandNode(this, part, nodeDescription); - currentNode.addChild(child); - } - - currentNode = child; - } - } - - /** - * 註冊命令幫助節點 - * - * @param builder the builder - */ - default void registerCommand(@NotNull CommandNode.Builder builder) { - CommandNode newRoot = builder.build(); - mergeTree(getRootNode(), newRoot); - } - - /** - * Merge tree. - * - * @param target the target - * @param source the source - */ - void mergeTree(@NotNull CommandNode target, @NotNull CommandNode source); - - /** - * 使用Builder模式註冊命令樹 - * - * @param builder the builder - */ - default void registerCommandTree(@NotNull CommandNode.Builder builder) { - registerCommand(builder); - } - - /** - * 使用Builder模式快速註冊命令 - * - * @param configurator the configurator - */ - default void registerCommands(@NotNull Consumer configurator) { - CommandNode.Builder builder = CommandNode.Builder.of(this); - configurator.accept(builder); - registerCommand(builder); - } - - /** - * 根据路径查找节点 - * - * @param path the path - * @return the optional - */ - default Optional findNode(CommandPath path) { - CommandNode currentNode = getRootNode(); - String[] segments = path.segments(); - - // 跳过根节点(如果路径包含) - int startIndex = segments[0].equals(getRootNode().getName()) ? 1 : 0; - - for (int i = startIndex; i < segments.length; i++) { - currentNode = currentNode.getChild(segments[i]); - if (currentNode == null) { - return Optional.empty(); - } - } - - return Optional.of(currentNode); - } - - /** - * 检查命令是否存在 - * - * @param path the path - * @return the boolean - */ - default boolean hasCommand(CommandPath path) { - return findNode(path).isPresent(); - } - - private void registerCommandHelp(String commandPath, String descriptionKey) { - registerCommandHelp(commandPath, Component.translatable(descriptionKey)); - } - - private void registerCommandHelp(String commandPath) { - registerCommandHelp(commandPath, Component.literal("")); - } - - /** - * 注册命令参数(支持单个参数可选标记,使用*前缀表示必选参数) - * - * @param commandPath 命令路径,如 "fpsm tacz dummy" - * @param parameters 参数列表,如 "*requiredParam", "optionalParam" - */ - private void registerCommandParameters(@NotNull String commandPath, Parameter... parameters) { - String[] pathParts = commandPath.split(" "); - CommandNode currentNode = getRootNode(); - - // 遍历命令路径,找到目标节点 - int startIndex = pathParts[0].equals(getRootNode().getName()) ? 1 : 0; - - for (int i = startIndex; i < pathParts.length; i++) { - String part = pathParts[i]; - CommandNode child = currentNode.getChild(part); - - if (child == null) { - // 如果节点不存在,创建空描述节点 - child = new CommandNode(this, part, Component.literal("")); - currentNode.addChild(child); - } - - currentNode = child; - } - - // 添加参数,处理可选标记 - for (Parameter param : parameters) { - currentNode.addParameter(param.name(), param.required()); - } - } - - /** - * 动态添加子指令到指定命令路径 - * - * @param commandPath 命令路径,如 "fpsm map modify" - * @param childName 子指令名称 - * @param description 子指令描述 - * @return 是否添加成功 boolean - */ - default boolean addChildCommand(@NotNull String commandPath, String childName, MutableComponent description) { - String[] pathParts = commandPath.split(" "); - CommandNode currentNode = getRootNode(); - - // 遍历命令路径,找到目标父节点 - for (String part : pathParts) { - if (!part.equals(currentNode.getName())) { - CommandNode child = currentNode.getChild(part); - if (child == null) { - // 路径不存在,创建中间节点 - child = new CommandNode(this, part, Component.literal("")); - currentNode.addChild(child); - } - currentNode = child; - } - } - - // 添加子指令 - CommandNode childNode = new CommandNode(this, childName, description); - currentNode.addChild(childNode); - return true; - } - - /** - * 构建单个命令节点的显示格式 - * - * @param node 当前命令节点 - * @param indent 当前缩进 - * @param isRoot 是否为根节点 - * @return 格式化后的命令节点组件 - */ - private @NotNull MutableComponent buildCommandLine(CommandNode node, String indent, boolean isRoot, @Nullable String currentFullPath) { - if (isRoot) { - // 根节点特殊处理 - String rootCommand = "/" + node.getName(); - return Component.literal(rootCommand) - .withStyle(ChatFormatting.AQUA) - .withStyle(Style.EMPTY - .withClickEvent(new ClickEvent( - ClickEvent.Action.SUGGEST_COMMAND, - rootCommand + " " - )) - .withHoverEvent(new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - Component.translatable(Lib39LangKey.Message.HELP_HOVER_COPY_TIP.getKey()) - )) - ); - } else { - // 构建完整命令路径 - String fullCommand = (currentFullPath != null && !currentFullPath.isEmpty()) - ? currentFullPath + " " + node.getName() - : "/" + getRootNode().getName() + " " + node.getFullPath(); - - // 构建建议的命令(带参数占位符) - String suggestedCommand = buildSuggestedCommand(node, fullCommand); - - // 非根节点:显示命令和描述 - MutableComponent prefix = Component.literal(indent + "└─ ").withStyle(ChatFormatting.GRAY); - - // 命令名称(可点击) - MutableComponent commandName = Component.literal(node.getName()) - .withStyle(ChatFormatting.DARK_AQUA) - .withStyle(Style.EMPTY - .withClickEvent(new ClickEvent( - ClickEvent.Action.SUGGEST_COMMAND, - suggestedCommand - )) - .withHoverEvent(new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - Component.translatable(Lib39LangKey.Message.HELP_HOVER_COPY_TIP.getKey(), suggestedCommand) - )) - ); - - MutableComponent displayLine = prefix.append(commandName); - - // 添加参数显示(只显示,不添加额外空格) - if (!node.getParameters().isEmpty()) { - displayLine.append(Component.literal(" ")); // 命令名和参数之间的空格 - - for (int i = 0; i < node.getParameters().size(); i++) { - Parameter param = node.getParameters().get(i); - if (param.required()) { - displayLine.append(Component.literal("<").withStyle(ChatFormatting.GRAY)) - .append(Component.literal(param.name()).withStyle(ChatFormatting.WHITE)) - .append(Component.literal(">").withStyle(ChatFormatting.GRAY)); - } else { - displayLine.append(Component.literal("[").withStyle(ChatFormatting.GRAY)) - .append(Component.literal(param.name()).withStyle(ChatFormatting.WHITE)) - .append(Component.literal("]").withStyle(ChatFormatting.GRAY)); - } - - // 参数之间添加空格(除了最后一个) - if (i < node.getParameters().size() - 1) { - displayLine.append(Component.literal(" ")); - } - } - } - - // 添加分隔符和描述 - displayLine.append(Component.literal(" - ").withStyle(ChatFormatting.DARK_GRAY)) - .append(node.getDescription().copy().withStyle(ChatFormatting.GRAY)); - - // 如果有子节点,添加展开/折叠按钮 - boolean shouldShowToggle = node.hasChildren() && !node.isLeaf(); - - if (shouldShowToggle) { - String toggleKey = node.isExpanded() - ? Lib39LangKey.Message.HELP_NODE_TOGGLE_COLLAPSE.getKey() - : Lib39LangKey.Message.HELP_NODE_TOGGLE_EXPAND.getKey(); - - MutableComponent toggleButton = Component.literal(" [") - .withStyle(ChatFormatting.GRAY) - .append(Component.translatable(toggleKey).withStyle(ChatFormatting.YELLOW)) - .append(Component.literal("]").withStyle(ChatFormatting.GRAY)); - - // 为按钮添加点击事件 - toggleButton.withStyle(Style.EMPTY - .withClickEvent(new ClickEvent( - ClickEvent.Action.RUN_COMMAND, - "/" + getCommandHead() + " help toggle " + node.hashCode() - )) - .withHoverEvent(new HoverEvent( - HoverEvent.Action.SHOW_TEXT, - Component.translatable(Lib39LangKey.Message.HELP_CLICK_EXPAND.getKey()) - .withStyle(ChatFormatting.GRAY) - )) - ); - - displayLine.append(toggleButton); - } - - return displayLine; - } - } - - /** - * 构建建议的命令(包含参数占位符) - */ - private @NotNull String buildSuggestedCommand(@NotNull CommandNode node, @NotNull String baseCommand) { - StringBuilder sb = new StringBuilder(baseCommand); - - // 如果有参数,添加参数占位符 - if (!node.getParameters().isEmpty()) { - for (Parameter param : node.getParameters()) { - sb.append(" "); - if (param.required()) { - sb.append("<").append(param.name()).append(">"); - } else { - sb.append("[").append(param.name()).append("]"); - } - } - } - - // 如果是叶子节点且没有参数,添加空格以便继续输入 - if (node.isLeaf() && node.getParameters().isEmpty()) { - sb.append(" "); - } - - return sb.toString(); - } - - /** - * 檢查節點是否應該顯示摺疊信息 - */ - private boolean shouldShowCollapsedInfo(@NotNull CommandNode node) { - return node.hasChildren() && !node.isExpanded() && !node.getChildren().isEmpty(); - } - - /** - * 獲取有效的子命令數量(過濾掉空描述的命令) - */ - private long getValidChildCount(@NotNull CommandNode node) { - return node.getChildren().stream() - .filter(child -> !child.getDescription().getString().isEmpty()) - .count(); - } - - /** - * 遞歸構建命令樹 - */ - private void buildCommandTreeString(@NotNull CommandNode node, - @NotNull String indent, - @Nullable String currentFullPath, - @NotNull List result, - CommandSourceStack commandSourceStack) { - boolean isRoot = indent.isEmpty(); - if (node.testPermission(commandSourceStack)) { - MutableComponent commandLine = buildCommandLine(node, indent, isRoot, currentFullPath); - result.add(commandLine.append(Component.literal(NEWLINE))); - - // 遞歸處理子節點 - String childIndent = indent + "| "; - if (node.isExpanded()) { - String newFullPath = (currentFullPath != null && !currentFullPath.isEmpty()) - ? currentFullPath + " " + node.getName() - : "/" + node.getName(); - - for (CommandNode child : node.getChildren()) { - // 只顯示有描述的子命令 - if (!child.getDescription().getString().isEmpty() && node.testPermission(commandSourceStack)) { - buildCommandTreeString(child, childIndent, newFullPath, result, commandSourceStack); - } - } - } else if (shouldShowCollapsedInfo(node)) { - long childCount = getValidChildCount(node); - if (childCount > 0) { - MutableComponent collapsedInfo = Component.literal(indent + "| " + "└─ ") - .withStyle(ChatFormatting.GRAY) - .append(Component.translatable( - Lib39LangKey.Message.HELP_NODE_EXPAND.getKey(), - childCount - ).withStyle(ChatFormatting.GRAY)); - - collapsedInfo.withStyle(Style.EMPTY - .withClickEvent(new ClickEvent( - ClickEvent.Action.RUN_COMMAND, - "/" + getCommandHead() + " help toggle " + node.hashCode() - )) - .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.translatable(Lib39LangKey.Message.HELP_CLICK_EXPAND.getKey()))) - ); - - result.add(collapsedInfo.append(Component.literal(NEWLINE))); - } - } - } - } - - /** - * 获取命令树的字符串表示 - * - * @return 命令树列表 command tree - */ - default List getCommandTree(CommandSourceStack commandSourceStack) { - List result = new ArrayList<>(); - buildCommandTreeString(getRootNode(), "", "", result, commandSourceStack); - return result; - } - - /** - * 切换指定节点的展开/闭合状态 - * - * @param hashCode 节点哈希值 - * @return 是否成功切换 boolean - */ - default boolean toggleNodeExpanded(int hashCode) { - CommandNode currentNode = getCache().getOrDefault(hashCode, null); - if (currentNode == null || currentNode.getChildren().isEmpty()) { - return false; - } - currentNode.toggleExpanded(); - return true; - } - - /** - * 构建帮助消息 - * - * @param header 帮助头部 - * @param entries 帮助条目列表 - * @return the mutable component - */ - default MutableComponent buildHelpMessage(@NotNull Component header, @NotNull List entries) { - MutableComponent helpMessage = Component.empty(); - // 添加头部 - helpMessage.append(header.copy()).append(NEWLINE); - - // 添加分隔线 - helpMessage.append(Component.literal("\n")); - - - // 添加当前页的帮助内容 - if (entries.isEmpty()) { - helpMessage.append(Component.translatable(Lib39LangKey.Message.HELP_NO_ENTRIES.getKey())).append(NEWLINE); - } else { - for (MutableComponent entry : entries) { - helpMessage.append(entry); - } - } - - return helpMessage; - } - - /** - * Build command tree help mutable component. - * - * @return the mutable component - */ - default MutableComponent buildCommandTreeHelp(CommandSourceStack commandSourceStack) { - List commandTree = getCommandTree(commandSourceStack); - return buildHelpMessage(Component.translatable(Lib39LangKey.Message.HELP_HEADER.getKey(), Component.translatable(getHeadKey())), commandTree); - } - -} diff --git a/src/main/java/top/r3944realms/lib39/core/command/IHelpCommand.java b/src/main/java/top/r3944realms/lib39/core/command/IHelpCommand.java deleted file mode 100644 index 9878475..0000000 --- a/src/main/java/top/r3944realms/lib39/core/command/IHelpCommand.java +++ /dev/null @@ -1,133 +0,0 @@ -package top.r3944realms.lib39.core.command; - -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.arguments.IntegerArgumentType; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import com.mojang.brigadier.context.CommandContext; -import net.minecraft.commands.CommandBuildContext; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.Commands; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraftforge.common.MinecraftForge; -import org.jetbrains.annotations.NotNull; -import top.r3944realms.lib39.api.event.RegisterCommandHelpEvent; -import top.r3944realms.lib39.base.datagen.value.Lib39LangKey; - -import javax.annotation.Nullable; - -/** - * The interface Help command. - */ -public interface IHelpCommand { - /** - * Should show toggle failed boolean. - * - * @return the boolean - */ - default boolean shouldShowToggleFailed() { - return false; - } - - /** - * Gets help head. - * - * @return the help head - */ - @Nullable - default LiteralArgumentBuilder getHelpHead() { - return null; - } - - /** - * Gets command help manager. - * - * @return the command help manager - */ - ICommandHelpManager getCommandHelpManager(); - - /** - * Build command literal argument builder. - * - * @param dispatcher the dispatcher - * @param context the context - * @return the literal argument builder - */ - default LiteralArgumentBuilder buildCommand(CommandDispatcher dispatcher, CommandBuildContext context) { - LiteralArgumentBuilder head = getHelpHead(); - if (head == null) { - head = LiteralArgumentBuilder.literal(getCommandHelpManager().getID().getNamespace()); - } - LiteralArgumentBuilder tree = head.requires(this::requestPermission) - .then(Commands.literal("help").executes(this::handleHelp) - .then(Commands.literal("toggle") - .then(Commands.argument("hash", IntegerArgumentType.integer()).executes(this::handleHelpToggle)) - )); - RegisterCommandHelpEvent registerHelpCommandEvent = new RegisterCommandHelpEvent(tree, getCommandHelpManager(), context); - MinecraftForge.EVENT_BUS.post(registerHelpCommandEvent); - dispatcher.register(head); - return head; - } - - /** - * Request permission boolean. - * - * @param context the context - * @return the boolean - */ - default boolean requestPermission(CommandSourceStack context) { - return true; - } - - /** - * Handle help int. - * - * @param context the context - * @return the int - */ - default int handleHelp(@NotNull CommandContext context) { - ICommandHelpManager commandHelpManager = getCommandHelpManager(); - MutableComponent helpMessage = commandHelpManager.buildCommandTreeHelp(context.getSource()); - sendSuccess(context.getSource(), helpMessage); - return 1; - } - - /** - * Handle help toggle int. - * - * @param context the context - * @return the int - */ - default int handleHelpToggle(@NotNull CommandContext context) { - int hash = IntegerArgumentType.getInteger(context, "hash"); - ICommandHelpManager commandHelpManager = getCommandHelpManager(); - boolean success = commandHelpManager.toggleNodeExpanded(hash); - if (success) { - MutableComponent helpMessage = Component.literal("\n".repeat(2)).append(commandHelpManager.buildCommandTreeHelp(context.getSource())); - sendSuccess(context.getSource(), helpMessage); - } else if (shouldShowToggleFailed()) { - sendFailure(context.getSource(), Component.translatable(Lib39LangKey.Message.HELP_TOGGLE_FAILED.getKey())); - } - return 1; - } - - /** - * Send success. - * - * @param source the source - * @param key the key - */ - static void sendSuccess(@NotNull CommandSourceStack source, Component key) { - source.sendSuccess(() -> key, true); - } - - /** - * Send failure. - * - * @param source the source - * @param key the key - */ - static void sendFailure(@NotNull CommandSourceStack source, Component key) { - source.sendFailure(key); - } -} diff --git a/src/main/java/top/r3944realms/lib39/core/command/SimpleCommandHelpManager.java b/src/main/java/top/r3944realms/lib39/core/command/SimpleCommandHelpManager.java deleted file mode 100644 index bd0fd05..0000000 --- a/src/main/java/top/r3944realms/lib39/core/command/SimpleCommandHelpManager.java +++ /dev/null @@ -1,87 +0,0 @@ -package top.r3944realms.lib39.core.command; - -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.NotNull; -import top.r3944realms.lib39.core.command.model.CommandNode; -import top.r3944realms.lib39.core.command.model.Parameter; - -import java.util.HashMap; -import java.util.Map; - -/** - * The type Simple command help manager. - */ -public abstract class SimpleCommandHelpManager implements ICommandHelpManager { - private CommandNode root; - private final Map nodeCache = new HashMap<>(); - - /** - * Instantiates a new Simple command help manager. - */ - public SimpleCommandHelpManager() { - // - } - - /** - * 延遲初始化根節點 - */ - public void initialize() { - if (root == null) { - // 現在子類的字段已經初始化完成 - ResourceLocation id = getID(); - if (id == null) { - throw new IllegalStateException("getID() must return non-null"); - } - this.root = init(); - } - } - - @Override - public final @NotNull String getCommandHead() { - return getID().getNamespace(); - } - - @Override - public final Map getCache() { - return nodeCache; - } - @Override - public void mergeTree(@NotNull CommandNode target, @NotNull CommandNode source) { - // 合併參數 - for (Parameter param : source.getParameters()) { - if (!target.getParameters().contains(param)) { - target.addParameter(param.name(), param.required()); - } - } - - // 合併子節點 - for (CommandNode sourceChild : source.getChildren()) { - CommandNode targetChild = target.getChild(sourceChild.getName()); - if (targetChild == null) { - target.addChild(sourceChild.deepCopy()); - } else { - mergeTree(targetChild, sourceChild); - } - } - } - - /** - * 獲取根節點(如果未初始化則初始化) - */ - @Override - public final CommandNode getRootNode() { - if (root == null) { - initialize(); - } - return root; - } - - /** - * 檢查是否已初始化 - * - * @return the boolean - */ - public boolean isInitialized() { - return root != null; - } -} diff --git a/src/main/java/top/r3944realms/lib39/core/command/SimpleHelpCommand.java b/src/main/java/top/r3944realms/lib39/core/command/SimpleHelpCommand.java deleted file mode 100644 index d16d101..0000000 --- a/src/main/java/top/r3944realms/lib39/core/command/SimpleHelpCommand.java +++ /dev/null @@ -1,47 +0,0 @@ -package top.r3944realms.lib39.core.command; - -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import net.minecraft.commands.CommandBuildContext; -import net.minecraft.commands.CommandSourceStack; -import net.minecraftforge.event.RegisterCommandsEvent; -import org.jetbrains.annotations.NotNull; - -/** - * The type Simple help command. - */ -public abstract class SimpleHelpCommand implements IHelpCommand { - /** - * The Root. - */ - protected final LiteralArgumentBuilder root; - - /** - * Instantiates a new Simple help command. - * - * @param event the event - */ - public SimpleHelpCommand(@NotNull RegisterCommandsEvent event) { - root = buildCommand(event.getDispatcher(), event.getBuildContext()); - } - - /** - * Instantiates a new Simple help command. - * - * @param dispatcher the dispatcher - * @param context the context - */ - public SimpleHelpCommand(CommandDispatcher dispatcher, - CommandBuildContext context) { - root = buildCommand(dispatcher, context); - } - - /** - * Gets root. - * - * @return the root - */ - public LiteralArgumentBuilder getRoot() { - return root; - } -} diff --git a/src/main/java/top/r3944realms/lib39/core/command/model/CommandNode.java b/src/main/java/top/r3944realms/lib39/core/command/model/CommandNode.java deleted file mode 100644 index 1caf181..0000000 --- a/src/main/java/top/r3944realms/lib39/core/command/model/CommandNode.java +++ /dev/null @@ -1,1266 +0,0 @@ -package top.r3944realms.lib39.core.command.model; - -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import top.r3944realms.lib39.core.command.ICommandHelpManager; - -import java.util.*; -import java.util.function.Predicate; - -/** - * The type Command node. - */ -public class CommandNode { - private boolean isRoot = false; - private int hashCache = 0; - private boolean hashValid = false; - private final ICommandHelpManager helpManager; - private final String name; - private final Predicate testPermission; - private static final Predicate TRUE = i -> true; - private final MutableComponent description; - private final Map children; - - // 父節點引用,用於構建完整路徑 - @Nullable - private CommandNode parent; - - // 参数列表,用于存储命令参数 - private final List parameters = new ArrayList<>(); - - // 展开/闭合状态 - private boolean expanded = true; - - public boolean testPermission(CommandSourceStack source) { - return testPermission.test(source); - } - /** - * Instantiates a new Command node. - * - * @param helpManager the help manager - * @param name the name - * @param description the description - * @param isRoot the is root - */ - public CommandNode(ICommandHelpManager helpManager, String name, MutableComponent description, boolean isRoot) { - this(helpManager, name, description, isRoot, TRUE); - } - - /** - * Instantiates a new Command node. - * - * @param helpManager the help manager - * @param name the name - * @param description the description - */ - public CommandNode(ICommandHelpManager helpManager, String name, MutableComponent description) { - this(helpManager, name, description, TRUE); - } - - /** - * Instantiates a new Command node. - * - * @param helpManager the help manager - * @param name the name - * @param description the description - * @param isRoot the is root - * @param testPermission test has permission - */ - public CommandNode(ICommandHelpManager helpManager, String name, MutableComponent description, boolean isRoot, Predicate testPermission) { - this.name = name; - this.helpManager = helpManager; - this.description = description; - this.children = new TreeMap<>(); - this.isRoot = isRoot; - this.testPermission = testPermission; - invalidateHash(); - } - - /** - * Instantiates a new Command node. - * - * @param helpManager the help manager - * @param name the name - * @param description the description - * @param testPermission test has permission - */ - public CommandNode(ICommandHelpManager helpManager, String name, MutableComponent description, Predicate testPermission) { - this.name = name; - this.helpManager = helpManager; - this.description = description; - this.children = new TreeMap<>(); - this.testPermission = testPermission; - invalidateHash(); - } - - /** - * Add child. - * - * @param child the child - */ - public void addChild(CommandNode child) { - children.put(child.name, child); - child.parent = this; // 設置父節點引用 - - // 如果不是根節點,確保展開狀態正確 - if (!isRoot) { - this.expanded = false; - } - - invalidateHash(); - } - - /** - * Gets child. - * - * @param name the name - * @return the child - */ - public CommandNode getChild(String name) { - return children.get(name); - } - - /** - * Gets parent. - * - * @return the parent - */ - @Nullable - public CommandNode getParent() { - return parent; - } - - /** - * Has parent boolean. - * - * @return the boolean - */ - public boolean hasParent() { - return parent != null; - } - - - /** - * Gets name. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * Gets description. - * - * @return the description - */ - public MutableComponent getDescription() { - return description; - } - - /** - * Gets children. - * - * @return the children - */ - public Collection getChildren() { - return children.values(); - } - - /** - * Add parameter. - * - * @param parameter the parameter - * @param required the required - */ -// 添加参数 - public void addParameter(String parameter, boolean required) { - parameters.add(new Parameter(parameter, required)); - invalidateHash(); - } - - /** - * Gets parameters. - * - * @return the parameters - */ -// 获取参数列表 - public List getParameters() { - return parameters; - } - - /** - * Is expanded boolean. - * - * @return the boolean - */ -// 获取展开状态 - public boolean isExpanded() { - return expanded; - } - - /** - * Sets expanded. - * - * @param expanded the expanded - */ -// 设置展开状态 - public void setExpanded(boolean expanded) { - this.expanded = expanded; - } - - /** - * Toggle expanded. - */ -// 切换展开状态 - public void toggleExpanded() { - this.expanded = !this.expanded; - } - - @Override - public int hashCode() { - return computeHash(); - } - - /** - * Compute hash int. - * - * @return the int - */ -// 计算节点的Hash值 - public int computeHash() { - if (!hashValid) { - if (hashCache != 0) { - helpManager.getCache().remove(hashCache); - } - int result = 31; - result = 31 * result + name.hashCode(); - result = 31 * result + description.getString().hashCode(); - - // 计算参数的Hash - for (Parameter param : parameters) { - result = 31 * result + param.name().hashCode(); - result = 31 * result + (param.required() ? 1 : 0); - } - - // 计算子节点的Hash - for (CommandNode child : children.values()) { - result = 31 * result + child.computeHash(); - } - - if (!isRoot && children.size() > 1) { - expanded = false; - } - - hashCache = result; - helpManager.getCache().put(result, this); - hashValid = true; - } - return hashCache; - } - - // 使Hash缓存失效 - private void invalidateHash() { - hashValid = false; - computeHash(); - } - - /** - * 递归构建完整路径 - * - * @return the full path - */ - public String getFullPath() { - if (parent == null) { - return name; - } - return parent.getFullPath() + " " + name; - } - - /** - * 獲取完整的命令(以 / 開頭) - * - * @return the full command - */ - public String getFullCommand() { - if (isRoot) { - return "/" + name; - } - return "/" + getFullPath(); - } - - /** - * 檢查是否為葉子節點(沒有子節點) - * - * @return the boolean - */ - public boolean isLeaf() { - return children.isEmpty(); - } - - /** - * 獲取所有葉子節點(可執行的命令) - * - * @return the all leaf nodes - */ - public List getAllLeafNodes() { - List leaves = new ArrayList<>(); - collectLeafNodes(this, leaves); - return leaves; - } - - private void collectLeafNodes(@NotNull CommandNode node, List leaves) { - if (node.isLeaf()) { - leaves.add(node); - } else { - for (CommandNode child : node.getChildren()) { - collectLeafNodes(child, leaves); - } - } - } - - /** - * 獲取節點路徑(從根節點到當前節點的路徑列表) - * - * @return the path segments - */ - public List getPathSegments() { - List segments = new ArrayList<>(); - collectPathSegments(this, segments); - Collections.reverse(segments); // 從根到當前 - return segments; - } - - private void collectPathSegments(@NotNull CommandNode node, @NotNull List segments) { - segments.add(node.name); - if (node.parent != null) { - collectPathSegments(node.parent, segments); - } - } - - /** - * 比較兩個節點是否在同一路徑上 - * - * @param other the other - * @return the boolean - */ - public boolean isAncestorOf(CommandNode other) { - CommandNode current = other; - while (current != null) { - if (current == this) { - return true; - } - current = current.parent; - } - return false; - } - - /** - * 獲取最近的共同祖先 - * - * @param other the other - * @return the common ancestor - */ - @Nullable - public CommandNode getCommonAncestor(CommandNode other) { - Set ancestors = new HashSet<>(); - CommandNode current = this; - - // 收集當前節點的所有祖先 - while (current != null) { - ancestors.add(current); - current = current.parent; - } - - // 從另一個節點向上查找 - current = other; - while (current != null) { - if (ancestors.contains(current)) { - return current; - } - current = current.parent; - } - - return null; - } - - /** - * 複製節點(不包括子節點) - * - * @return the command node - */ - public CommandNode shallowCopy() { - CommandNode copy = new CommandNode(helpManager, name, description.copy(), isRoot); - for (Parameter param : parameters) { - copy.addParameter(param.name(), param.required()); - } - copy.expanded = expanded; - return copy; - } - - /** - * 深複製節點(包括所有子節點) - * - * @return the command node - */ - public CommandNode deepCopy() { - return deepCopy(this, null); - } - - /** - * 深複製節點(遞歸複製所有子節點) - */ - private @NotNull CommandNode deepCopy(@NotNull CommandNode original, @Nullable CommandNode newParent) { - // 複製當前節點 - CommandNode copy = new CommandNode(helpManager, original.name, original.description.copy(), original.isRoot); - copy.parent = newParent; - copy.expanded = original.expanded; - - // 複製參數 - for (Parameter param : original.parameters) { - copy.addParameter(param.name(), param.required()); - } - - // 遞歸複製子節點 - for (CommandNode child : original.children.values()) { - CommandNode childCopy = deepCopy(child, copy); - copy.children.put(childCopy.name, childCopy); - } - - return copy; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - CommandNode that = (CommandNode) o; - return hashCache == that.hashCache && - Objects.equals(name, that.name) && - Objects.equals(helpManager, that.helpManager); - } - - @Override - public String toString() { - return String.format("CommandNode{name='%s', path='%s', children=%d, params=%d}", - name, getFullPath(), children.size(), parameters.size()); - } - - /** - * The type Builder. - */ - public static class Builder { - private final ICommandHelpManager helpManager; - private final Deque nodeStack = new ArrayDeque<>(); - private CommandNode root; - private boolean built = false; - - private Builder(@NotNull final ICommandHelpManager helpManager) { - this.helpManager = helpManager; - } - - /** - * Of builder. - * - * @param helpManager the help manager - * @return the builder - */ - @Contract(value = "_ -> new", pure = true) - public static @NotNull Builder of(@NotNull final ICommandHelpManager helpManager) { - return new Builder(helpManager); - } - - /** - * 添加根節點 - * - * @param name the name - * @param description the description - * @return the builder - */ - public Builder root(@NotNull String name, @NotNull MutableComponent description) { - if (root != null) { - throw new IllegalStateException("Root node already set"); - } - root = new CommandNode(helpManager, name, description, true); - nodeStack.push(root); - return this; - } - - /** - * 添加根節點(使用翻譯鍵) - * - * @param name the name - * @param translationKey the translation key - * @return the builder - */ - public Builder root(@NotNull String name, @NotNull String translationKey) { - return root(name, Component.translatable(translationKey)); - } - - /** - * 添加根節點 - * - * @param name the name - * @param description the description - * @param testPermission the test permission - * @return the builder - */ - public Builder root(@NotNull String name, @NotNull MutableComponent description, Predicate testPermission) { - if (root != null) { - throw new IllegalStateException("Root node already set"); - } - root = new CommandNode(helpManager, name, description, true, testPermission); - nodeStack.push(root); - return this; - } - - /** - * 添加根節點(使用翻譯鍵) - * - * @param name the name - * @param translationKey the translation key - * @param testPermission the test permission - * @return the builder - */ - public Builder root(@NotNull String name, @NotNull String translationKey, Predicate testPermission) { - return root(name, Component.translatable(translationKey), testPermission); - } - - - /** - * 進入子節點(向下移動) - * - * @param name the name - * @param description the description - * @return the builder - */ - public Builder push(@NotNull String name, @NotNull MutableComponent description) { - checkBuilt(); - if (nodeStack.isEmpty()) { - throw new IllegalStateException("No parent node available. Call root() first."); - } - - CommandNode parent = nodeStack.peek(); - CommandNode child = new CommandNode(helpManager, name, description); - - if (!child.isLeaf()) { - child.setExpanded(false); - } - - parent.addChild(child); - nodeStack.push(child); - return this; - } - - /** - * 進入子節點(使用翻譯鍵) - * - * @param name the name - * @param translationKey the translation key - * @return the builder - */ - public Builder push(@NotNull String name, @NotNull String translationKey) { - return push(name, Component.translatable(translationKey)); - } - - /** - * 進入子節點並添加參數 - * - * @param name the name - * @param description the description - * @param parameters the parameters - * @return the builder - */ - public Builder pushWithParams(@NotNull String name, @NotNull MutableComponent description, - @NotNull Parameter... parameters) { - push(name, description); - current().addParameters(parameters); - return this; - } - - /** - * 進入子節點並添加必填參數 - * - * @param name the name - * @param description the description - * @param paramNames the param names - * @return the builder - */ - public Builder pushWithRequiredParams(@NotNull String name, @NotNull MutableComponent description, - @NotNull String @NotNull ... paramNames) { - push(name, description); - for (String paramName : paramNames) { - current().addParameter(paramName, true); - } - return this; - } - - /** - * 進入子節點並添加可選參數 - * - * @param name the name - * @param description the description - * @param paramNames the param names - * @return the builder - */ - public Builder pushWithOptionalParams(@NotNull String name, @NotNull MutableComponent description, - @NotNull String @NotNull ... paramNames) { - push(name, description); - for (String paramName : paramNames) { - current().addParameter(paramName, false); - } - return this; - } - - /** - * 進入子節點(向下移動) - * - * @param name the name - * @param description the description - * @param testPermission the test permission - * @return the builder - */ - public Builder push(@NotNull String name, @NotNull MutableComponent description, Predicate testPermission) { - checkBuilt(); - if (nodeStack.isEmpty()) { - throw new IllegalStateException("No parent node available. Call root() first."); - } - - CommandNode parent = nodeStack.peek(); - CommandNode child = new CommandNode(helpManager, name, description, testPermission); - - if (!child.isLeaf()) { - child.setExpanded(false); - } - - parent.addChild(child); - nodeStack.push(child); - return this; - } - - /** - * 進入子節點(使用翻譯鍵) - * - * @param name the name - * @param translationKey the translation key - * @param testPermission the test permission - * @return the builder - */ - public Builder push(@NotNull String name, @NotNull String translationKey, Predicate testPermission) { - return push(name, Component.translatable(translationKey), testPermission); - } - - /** - * 進入子節點並添加參數 - * - * @param name the name - * @param description the description - * @param testPermission the test permission - * @param parameters the parameters - * @return the builder - */ - public Builder pushWithParams(@NotNull String name, @NotNull MutableComponent description, - Predicate testPermission, @NotNull Parameter... parameters) { - push(name, description, testPermission); - current().addParameters(parameters); - return this; - } - - /** - * 進入子節點並添加必填參數 - * - * @param name the name - * @param description the description - * @param testPermission the test permission - * @param paramNames the param names - * @return the builder - */ - public Builder pushWithRequiredParams(@NotNull String name, @NotNull MutableComponent description, - Predicate testPermission, @NotNull String @NotNull ... paramNames) { - push(name, description, testPermission); - for (String paramName : paramNames) { - current().addParameter(paramName, true); - } - return this; - } - - /** - * 進入子節點並添加可選參數 - * - * @param name the name - * @param description the description - * @param testPermission the test permission - * @param paramNames the param names - * @return the builder - */ - public Builder pushWithOptionalParams(@NotNull String name, @NotNull MutableComponent description, - Predicate testPermission, @NotNull String @NotNull ... paramNames) { - push(name, description, testPermission); - for (String paramName : paramNames) { - current().addParameter(paramName, false); - } - return this; - } - - /** - * 返回上一級節點(向上移動) - * - * @return the builder - */ - public Builder pop() { - checkBuilt(); - if (nodeStack.size() <= 1) { - throw new IllegalStateException("Cannot pop root node"); - } - nodeStack.pop(); - return this; - } - - /** - * 返回到根節點 - * - * @return the builder - */ - public Builder popToRoot() { - checkBuilt(); - while (nodeStack.size() > 1) { - nodeStack.pop(); - } - return this; - } - - /** - * 返回到指定深度的節點 - * - * @param depth the depth - * @return the builder - */ - public Builder popToDepth(int depth) { - checkBuilt(); - if (depth < 0 || depth >= nodeStack.size()) { - throw new IllegalArgumentException("Invalid depth: " + depth); - } - while (nodeStack.size() > depth + 1) { - nodeStack.pop(); - } - return this; - } - - /** - * 獲取當前節點 - * - * @return the command node - */ - public @NotNull CommandNode current() { - checkBuilt(); - if (nodeStack.isEmpty()) { - throw new IllegalStateException("No current node"); - } - return nodeStack.peek(); - } - - /** - * 獲取當前深度 - * - * @return the int - */ - public int depth() { - return nodeStack.size() - 1; - } - - /** - * 為當前節點添加參數 - * - * @param name the name - * @param required the required - * @return the builder - */ - public Builder param(@NotNull String name, boolean required) { - checkBuilt(); - current().addParameter(name, required); - return this; - } - - /** - * 為當前節點添加必填參數 - * - * @param name the name - * @return the builder - */ - public Builder required(@NotNull String name) { - return param(name, true); - } - - /** - * 為當前節點添加可選參數 - * - * @param name the name - * @return the builder - */ - public Builder optional(@NotNull String name) { - return param(name, false); - } - - /** - * 為當前節點添加多個參數 - * - * @param parameters the parameters - * @return the builder - */ - public Builder params(@NotNull Parameter... parameters) { - checkBuilt(); - current().addParameters(parameters); - return this; - } - - /** - * 設置當前節點的展開狀態 - * - * @param expanded the expanded - * @return the builder - */ - public Builder expanded(boolean expanded) { - checkBuilt(); - current().setExpanded(expanded); - // 如果設置為展開,確保父節點知道 - if (expanded && current().hasParent()) { - CommandNode parent = current().getParent(); - if (parent != null && !parent.isExpanded()) { - parent.setExpanded(true); - } - } - return this; - } - - /** - * 添加一個完整的命令分支(鏈式調用) - * - * @param name the name - * @param description the description - * @param configurator the configurator - * @return the builder - */ - public Builder branch(@NotNull String name, @NotNull MutableComponent description, - @NotNull BranchConfigurator configurator) { - push(name, description); - configurator.configure(this); - pop(); - return this; - } - - /** - * 添加一個完整的命令分支(使用翻譯鍵) - * - * @param name the name - * @param translationKey the translation key - * @param configurator the configurator - * @return the builder - */ - public Builder branch(@NotNull String name, @NotNull String translationKey, - @NotNull BranchConfigurator configurator) { - return branch(name, Component.translatable(translationKey), configurator); - } - - /** - * 添加一個完整的命令分支(鏈式調用) - * - * @param name the name - * @param description the description - * @param testPermission the test permission - * @param configurator the configurator - * @return the builder - */ - public Builder branch(@NotNull String name, @NotNull MutableComponent description, - Predicate testPermission, @NotNull BranchConfigurator configurator) { - push(name, description, testPermission); - configurator.configure(this); - pop(); - return this; - } - - /** - * 添加一個完整的命令分支(使用翻譯鍵) - * - * @param name the name - * @param translationKey the translation key - * @param testPermission the test permission - * @param configurator the configurator - * @return the builder - */ - public Builder branch(@NotNull String name, @NotNull String translationKey, - Predicate testPermission, @NotNull BranchConfigurator configurator) { - return branch(name, Component.translatable(translationKey), testPermission, configurator); - } - - /** - * 快速添加葉子節點(沒有子節點的節點) - * - * @param name the name - * @param description the description - * @param testPermission the test permission - * @param parameters the parameters - * @return the builder - */ - public Builder leaf(@NotNull String name, @NotNull MutableComponent description, - Predicate testPermission, @NotNull Parameter @NotNull ... parameters) { - push(name, description, testPermission); - if (parameters.length > 0) { - params(parameters); - } - pop(); - return this; - } - - /** - * 快速添加葉子節點(使用翻譯鍵) - * - * @param name the name - * @param translationKey the translation key - * @param testPermission the test permission - * @param parameters the parameters - * @return the builder - */ - public Builder leaf(@NotNull String name, @NotNull String translationKey, - Predicate testPermission, @NotNull Parameter... parameters) { - return leaf(name, Component.translatable(translationKey), testPermission,parameters); - } - - /** - * 批量添加多個葉子節點 - * - * @param commands the commands - * @param testPermission the test permission - * @return the builder - */ - public Builder leaves(@NotNull Map commands, Predicate testPermission) { - for (Map.Entry entry : commands.entrySet()) { - leaf(entry.getKey(), entry.getValue(), testPermission); - } - return this; - } - - /** - * 批量添加多個葉子節點 - * - * @param commands the commands - * @param testPermission the test permission - * @return the builder - */ - public Builder leavesT(@NotNull Map commands, Predicate testPermission) { - for (Map.Entry entry : commands.entrySet()) { - leaf(entry.getKey(), entry.getValue(), testPermission); - } - return this; - } - - /** - * 批量添加多個帶參數的葉子節點 - * - * @param commands the commands - * @param testPermission the test permission - * @return the builder - */ - public Builder leavesWithParams(@NotNull Map commands, Predicate testPermission) { - for (Map.Entry entry : commands.entrySet()) { - LeafConfig config = entry.getValue(); - push(entry.getKey(), config.description(), testPermission); - if (config.parameters() != null && !config.parameters().isEmpty()) { - for (Parameter param : config.parameters()) { - param(param.name(), param.required()); - } - } - pop(); - } - return this; - } - - /** - * 快速添加葉子節點(沒有子節點的節點) - * - * @param name the name - * @param description the description - * @param parameters the parameters - * @return the builder - */ - public Builder leaf(@NotNull String name, @NotNull MutableComponent description, - @NotNull Parameter @NotNull ... parameters) { - push(name, description); - if (parameters.length > 0) { - params(parameters); - } - pop(); - return this; - } - - /** - * 快速添加葉子節點(使用翻譯鍵) - * - * @param name the name - * @param translationKey the translation key - * @param parameters the parameters - * @return the builder - */ - public Builder leaf(@NotNull String name, @NotNull String translationKey, - @NotNull Parameter... parameters) { - return leaf(name, Component.translatable(translationKey) ,parameters); - } - - /** - * 批量添加多個葉子節點 - * - * @param commands the commands - * @return the builder - */ - public Builder leaves(@NotNull Map commands) { - for (Map.Entry entry : commands.entrySet()) { - leaf(entry.getKey(), entry.getValue()); - } - return this; - } - - /** - * 批量添加多個葉子節點 - * - * @param commands the commands - * @return the builder - */ - public Builder leavesT(@NotNull Map commands) { - for (Map.Entry entry : commands.entrySet()) { - leaf(entry.getKey(), entry.getValue()); - } - return this; - } - - /** - * 批量添加多個帶參數的葉子節點 - * - * @param commands the commands - * @return the builder - */ - public Builder leavesWithParams(@NotNull Map commands) { - for (Map.Entry entry : commands.entrySet()) { - LeafConfig config = entry.getValue(); - push(entry.getKey(), config.description()); - if (config.parameters() != null && !config.parameters().isEmpty()) { - for (Parameter param : config.parameters()) { - param(param.name(), param.required()); - } - } - pop(); - } - return this; - } - - /** - * 構建命令樹 - * - * @return the command node - */ - public @NotNull CommandNode build() { - checkBuilt(); - if (root == null) { - throw new IllegalStateException("Root node not set"); - } - built = true; - return root; - } - - /** - * 重置構建器(重用) - * - * @return the builder - */ - public Builder reset() { - nodeStack.clear(); - root = null; - built = false; - return this; - } - - private void checkBuilt() { - if (built) { - throw new IllegalStateException("Builder has already been built. Call reset() to reuse."); - } - } - - /** - * 分支配置器接口(用於lambda表達式) - */ - @FunctionalInterface - public interface BranchConfigurator { - /** - * Configure. - * - * @param builder the builder - */ - void configure(@NotNull Builder builder); - } - - /** - * 葉子節點配置記錄 - */ - public record LeafConfig(@NotNull MutableComponent description, - @Nullable List parameters) { - - /** - * Of leaf config. - * - * @param description the description - * @return the leaf config - */ - @Contract("_ -> new") - public static @NotNull LeafConfig of(@NotNull MutableComponent description) { - return new LeafConfig(description, null); - } - - /** - * Of leaf config. - * - * @param description the description - * @param parameters the parameters - * @return the leaf config - */ - @Contract("_, _ -> new") - public static @NotNull LeafConfig of(@NotNull MutableComponent description, - @NotNull Parameter... parameters) { - return new LeafConfig(description, Arrays.asList(parameters)); - } - - /** - * Of leaf config. - * - * @param translationKey the translation key - * @return the leaf config - */ - @Contract("_ -> new") - public static @NotNull LeafConfig of(@NotNull String translationKey) { - return new LeafConfig(Component.translatable(translationKey), null); - } - - /** - * Of leaf config. - * - * @param translationKey the translation key - * @param parameters the parameters - * @return the leaf config - */ - @Contract("_, _ -> new") - public static @NotNull LeafConfig of(@NotNull String translationKey, - @NotNull Parameter... parameters) { - return new LeafConfig(Component.translatable(translationKey), Arrays.asList(parameters)); - } - } - } - - // ==================== 新增的輔助方法 ==================== - - /** - * 添加多個參數 - * - * @param parameters the parameters - */ - public void addParameters(@NotNull Parameter @NotNull ... parameters) { - for (Parameter param : parameters) { - addParameter(param.name(), param.required()); - } - } - - /** - * 檢查是否有子節點 - * - * @return the boolean - */ - public boolean hasChildren() { - return !children.isEmpty(); - } - - /** - * 檢查是否有參數 - * - * @return the boolean - */ - public boolean hasParameters() { - return !parameters.isEmpty(); - } - - /** - * 獲取節點深度(根節點為0) - * - * @return the depth - */ - public int getDepth() { - if (isRoot || parent == null) { - return 0; - } - return parent.getDepth() + 1; - } - - /** - * 查找子節點(支持遞歸查找) - * - * @param path the path - * @return the command node - */ - @Nullable - public CommandNode findChild(@NotNull String @NotNull ... path) { - if (path.length == 0) { - return this; - } - - CommandNode current = this; - for (String segment : path) { - current = current.getChild(segment); - if (current == null) { - return null; - } - } - - return current; - } - - /** - * 獲取完整的命令(用於點擊建議) - * - * @return the suggested command - */ - public String getSuggestedCommand() { - StringBuilder sb = new StringBuilder(getFullCommand()); - - // 如果有參數,添加參數佔位符 - for (Parameter param : parameters) { - sb.append(" "); - if (param.required()) { - sb.append("<").append(param.name()).append(">"); - } else { - sb.append("[").append(param.name()).append("]"); - } - } - - // 如果沒有子節點且沒有參數,添加空格以便繼續輸入 - if (children.isEmpty() && parameters.isEmpty()) { - sb.append(" "); - } - - return sb.toString(); - } - - /** - * 獲取根節點 - * - * @return the root - */ - public CommandNode getRoot() { - if (isRoot) { - return this; - } - if (parent == null) { - throw new IllegalStateException("Node has no parent but is not marked as root"); - } - return parent.getRoot(); - } - -} diff --git a/src/main/java/top/r3944realms/lib39/core/command/model/CommandPath.java b/src/main/java/top/r3944realms/lib39/core/command/model/CommandPath.java deleted file mode 100644 index 64f3248..0000000 --- a/src/main/java/top/r3944realms/lib39/core/command/model/CommandPath.java +++ /dev/null @@ -1,127 +0,0 @@ -package top.r3944realms.lib39.core.command.model; - -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -/** - * 命令路径构建器 - 提供编译时类型安全 - */ -public final class CommandPath { - private final List segments; - private final String fullPath; - - private CommandPath(List segments) { - this.segments = List.copyOf(segments); - this.fullPath = String.join(" ", segments); - } - - /** - * Of command path. - * - * @param segments the segments - * @return the command path - */ - @Contract("_ -> new") - public static @NotNull CommandPath of(String... segments) { - validateSegments(segments); - return new CommandPath(List.of(segments)); - } - - /** - * From string command path. - * - * @param path the path - * @return the command path - */ - @Contract("_ -> new") - public static @NotNull CommandPath fromString(@NotNull String path) { - if (path.charAt(0) == '/') { - path = path.substring(1); - } - return of(path.split(" ")); - } - - /** - * Then command path. - * - * @param subSegments the sub segments - * @return the command path - */ - @Contract("_ -> new") - public @NotNull CommandPath then(String... subSegments) { - validateSegments(subSegments); - List newSegments = new ArrayList<>(this.segments); - newSegments.addAll(List.of(subSegments)); - return new CommandPath(newSegments); - } - - /** - * Parent optional. - * - * @return the optional - */ - public Optional parent() { - if (segments.size() <= 1) { - return Optional.empty(); - } - return Optional.of(new CommandPath(segments.subList(0, segments.size() - 1))); - } - - /** - * Last segment string. - * - * @return the string - */ - public String lastSegment() { - return segments.isEmpty() ? "" : segments.get(segments.size() - 1); - } - - /** - * Segments string @ not null [ ]. - * - * @return the string @ not null [ ] - */ - public String @NotNull [] segments() { - return segments.toArray(new String[0]); - } - - /** - * Full path string. - * - * @return the string - */ - public String fullPath() { - return fullPath; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - CommandPath that = (CommandPath) o; - return Objects.equals(fullPath, that.fullPath); - } - - @Override - public int hashCode() { - return fullPath.hashCode(); - } - - @Override - public String toString() { - return fullPath; - } - - private static void validateSegments(String @NotNull [] segments) { - for (String segment : segments) { - if (segment == null || segment.isEmpty() || segment.contains(" ")) { - throw new IllegalArgumentException("Invalid command segment: " + segment); - } - } - } -} diff --git a/src/main/java/top/r3944realms/lib39/core/command/model/Parameter.java b/src/main/java/top/r3944realms/lib39/core/command/model/Parameter.java deleted file mode 100644 index f399d88..0000000 --- a/src/main/java/top/r3944realms/lib39/core/command/model/Parameter.java +++ /dev/null @@ -1,78 +0,0 @@ -package top.r3944realms.lib39.core.command.model; - -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; - -/** - * The type Parameter. - */ -public record Parameter(String name, boolean required) { - - /** - * 獲取參數類型標識 - * - * @return the type indicator - */ - @Contract(pure = true) - public @NotNull String getTypeIndicator() { - return required ? "required" : "optional"; - } - - @Override - public String toString() { - return String.format("Parameter{name='%s', required=%s}", name, required); - } - - /** - * The type Builder. - */ - public static class Builder { - private final List parameters = new ArrayList<>(); - - /** - * Required builder. - * - * @param name the name - * @return the builder - */ - public Builder required(String name) { - parameters.add(new Parameter(name, true)); - return this; - } - - /** - * Optional builder. - * - * @param name the name - * @return the builder - */ - public Builder optional(String name) { - parameters.add(new Parameter(name, false)); - return this; - } - - - /** - * Build parameter [ ]. - * - * @return the parameter [ ] - */ - public Parameter[] build() { - return parameters.toArray(new Parameter[0]); - } - - /** - * Builder parameter . builder. - * - * @return the parameter . builder - */ -// 链式调用的便利方法 - @Contract(" -> new") - public static @NotNull Parameter.Builder builder() { - return new Builder(); - } - } -} diff --git a/src/main/java/top/r3944realms/lib39/core/compat/CompatManager.java b/src/main/java/top/r3944realms/lib39/core/compat/CompatManager.java deleted file mode 100644 index ae26ebd..0000000 --- a/src/main/java/top/r3944realms/lib39/core/compat/CompatManager.java +++ /dev/null @@ -1,370 +0,0 @@ -package top.r3944realms.lib39.core.compat; - -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.event.lifecycle.FMLConstructModEvent; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import top.r3944realms.lib39.Lib39; - -import java.util.*; -import java.util.function.Consumer; -import java.util.stream.Collectors; - -/** - * The type Compat manager. - */ -@SuppressWarnings("unused") -public abstract class CompatManager { - public ResourceLocation getId() { - return id; - } - protected final Logger logger; - protected final ResourceLocation id; - protected final Map compats = new HashMap<>(); - protected boolean initialized = false; - protected final List pendingTasks = new ArrayList<>(); - protected final IEventBus modEventBus, gameEventBus; - - // 存储事件监听器配置 - protected final List listenerConfigs = new ArrayList<>(); - - public void initialize() { - initializeAllCompat(); - } - - public CompatManager(ResourceLocation id, IEventBus modEventBus, IEventBus gameEventBus) { - this.id = id; - this.modEventBus = modEventBus; - this.gameEventBus = gameEventBus; - this.logger = LoggerFactory.getLogger(id.toString()); - } - - /** - * Register compat. - * - * @param id the id - * @param compat the compat - */ - public void registerCompat(ResourceLocation id, ICompat compat) { - if (initialized) { - // 已初始化,直接注册 - doRegisterCompat(id, compat); - } else { - // 未初始化,缓存起来 - pendingTasks.add(() -> doRegisterCompat(id, compat)); - logger.debug("Cached compat registration for: {}", id); - } - } - - private void doRegisterCompat(ResourceLocation id, ICompat compat) { - if (compats.containsKey(id)) { - logger.warn("Compat with id {} is already registered!", id); - return; - } - compats.put(id, compat); - addListenerForCompat(id); - logger.debug("Registered compat: {}", id); - } - - /** - * Register compat. - * - * @param namespace the namespace - * @param path the path - * @param compat the compat - */ - public void registerCompat(String namespace, String path, ICompat compat) { - registerCompat(Lib39.rl(namespace, path), compat); - } - - /** - * 为所有兼容模块配置事件监听器 - * - * @param dists the dists - * @param bus the bus - */ - public void addListenerForAll(@Nullable Dist dists, Mod.EventBusSubscriber.Bus bus) { - listenerConfigs.add(new ListenerConfig(null, dists, bus)); - } - - /** - * 为特定兼容模块配置事件监听器 - * - * @param compatId the compat id - * @param dists the dists - * @param bus the bus - */ - public void addListenerForCompat(ResourceLocation compatId, @Nullable Dist dists, Mod.EventBusSubscriber.Bus bus) { - listenerConfigs.add(new ListenerConfig(compatId, dists, bus)); - } - - /** - * 为特定兼容模块配置事件监听器 - * - * @param compatId the compat id - */ - public void addListenerForCompat(ResourceLocation compatId) { - addListenerForCompat(compatId, null, Mod.EventBusSubscriber.Bus.FORGE); - addListenerForCompat(compatId, null, Mod.EventBusSubscriber.Bus.MOD); - - addListenerForCompat(compatId, Dist.CLIENT, Mod.EventBusSubscriber.Bus.FORGE); - addListenerForCompat(compatId, Dist.CLIENT, Mod.EventBusSubscriber.Bus.MOD); - - addListenerForCompat(compatId, Dist.DEDICATED_SERVER, Mod.EventBusSubscriber.Bus.FORGE); - addListenerForCompat(compatId, Dist.DEDICATED_SERVER, Mod.EventBusSubscriber.Bus.MOD); - } - - /** - * 为已加载的兼容模块配置事件监听器 - * - * @param dists the dists - * @param bus the bus - * @param consumer the consumer - */ - public void addListenerForLoaded(@Nullable Dist dists, Mod.EventBusSubscriber.Bus bus, Consumer consumer) { - listenerConfigs.add(new ListenerConfig(null, dists, bus) { - @Override - boolean shouldApply(@NotNull ICompat compat) { - return super.shouldApply(compat); - } - }); - } - - // ===================== 初始化和管理 ===================== - - /** - * 初始化所有兼容模块并应用事件监听器 - */ - protected synchronized void initializeAllCompat() { - logger.info("Initializing {} compatibility modules", compats.size()); - - // 先处理所有缓存的注册 - pendingTasks.forEach(Runnable::run); - pendingTasks.clear(); - - // 初始化所有兼容模块 - for (Map.Entry entry : compats.entrySet()) { - if (!entry.getValue().isInitialized() && entry.getValue().isModLoaded()) { - try { - entry.getValue().initialize(); - entry.getValue().setInitialize(true); - logger.info("Initialized compat: {}", entry.getKey()); - } catch (Exception e) { - logger.error("Failed to initialize compat: {}", entry.getKey(), e); - } - } - } - initialized = true; - // 2. 然后应用所有事件监听器 - applyAllEventListeners(); - } - - /** - * 应用所有配置的事件监听器到对应的 ICompat 实例 - */ - private void applyAllEventListeners() { - logger.info("Applying {} event listener configurations", listenerConfigs.size()); - - for (ListenerConfig config : listenerConfigs) { - if (config.compatId == null) { - // 应用到所有兼容模块 - applyListenerToAllCompats(config); - } else { - // 应用到特定兼容模块 - applyListenerToCompat(config.compatId, config); - } - } - } - - /** - * 将监听器应用到所有兼容模块 - */ - private void applyListenerToAllCompats(ListenerConfig config) { - for (ICompat compat : compats.values()) { - if(!compat.isInitialized()) { - if (config.shouldApply(compat)) { - applyListenerToCompat(compat, config); - } - } - } - } - - /** - * 将监听器应用到特定兼容模块 - */ - private void applyListenerToCompat(ResourceLocation compatId, ListenerConfig config) { - ICompat compat = compats.get(compatId); - if (compat != null && config.shouldApply(compat)) { - applyListenerToCompat(compat, config); - } - } - - /** - * 将监听器应用到具体的 ICompat 实例 - */ - private void applyListenerToCompat(ICompat compat, ListenerConfig config) { - try { - // 根据配置调用对应的 ICompat 方法 - if (config.dists != null) { - switch (config.dists) { - case CLIENT -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT,() -> () -> { - if (config.bus == Mod.EventBusSubscriber.Bus.FORGE) { - compat.addClientGameListener(gameEventBus); - } else { - compat.addClientModListener(modEventBus); - } - }); - case DEDICATED_SERVER -> DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER,() -> () -> { - if (config.bus == Mod.EventBusSubscriber.Bus.FORGE) { - compat.addServerGameListener(gameEventBus); - } else { - compat.addServerModListener(modEventBus); - } - }); - } - } else { - // 通用监听器 - if (config.bus == Mod.EventBusSubscriber.Bus.FORGE) { - compat.addCommonGameListener(gameEventBus); - } else { - compat.addCommonModListener(modEventBus); - } - } - - logger.debug("Applied {} listener to compat: {}", - getListenerTypeName(config), compat.id()); - - } catch (Exception e) { - logger.error("Failed to apply listener to compat: {}", compat.id(), e); - } - } - - /** - * 获取监听器类型名称(用于日志) - */ - private @NotNull String getListenerTypeName(@NotNull ListenerConfig config) { - if (config.dists != null) { - return config.dists.name().toLowerCase() + " " + - (config.bus == Mod.EventBusSubscriber.Bus.FORGE ? "game" : "mod"); - } else { - return "common " + (config.bus == Mod.EventBusSubscriber.Bus.FORGE ? "game" : "mod"); - } - } - - - /** - * Add listener for compat. - * - * @param compatId the compat id - * @param bus the bus - */ - public void addListenerForCompat(ResourceLocation compatId, Mod.EventBusSubscriber.Bus bus) { - addListenerForCompat(compatId, null, bus); - } - - protected static class ListenerConfig { - /** - * The Compat id. - */ - final ResourceLocation compatId; - /** - * The Dists. - */ - final Dist dists; - /** - * The Bus. - */ - final Mod.EventBusSubscriber.Bus bus; - - /** - * Instantiates a new Listener config. - * - * @param compatId the compat id - * @param dists the dists - * @param bus the bus - */ - ListenerConfig(ResourceLocation compatId, Dist dists, Mod.EventBusSubscriber.Bus bus) { - this.compatId = compatId; - this.dists = dists; - this.bus = bus; - } - - /** - * Should apply boolean. - * - * @param compat the compat - * @return the boolean - */ - boolean shouldApply(@NotNull ICompat compat) { - return compat.isModLoaded(); - } - } - - // ===================== 其他方法 ===================== - - /** - * On load complete. - */ - public void onLoadComplete() { - logger.info("Calling onLoadComplete for {} compatibility modules", compats.size()); - for (Map.Entry entry : compats.entrySet()) { - try { - entry.getValue().onLoadComplete(); - } catch (Exception e) { - logger.error("Error in onLoadComplete for compat: {}", entry.getKey(), e); - } - } - } - - /** - * Gets compat. - * - * @param id the id - * @return the compat - */ - public Optional getCompat(ResourceLocation id) { - return Optional.ofNullable(compats.get(id)); - } - - /** - * Has compat boolean. - * - * @param id the id - * @return the boolean - */ - public boolean hasCompat(ResourceLocation id) { - return compats.containsKey(id); - } - - /** - * Unregister compat. - * - * @param id the id - */ - public void unregisterCompat(ResourceLocation id) { - ICompat removed = compats.remove(id); - if (removed != null) { - logger.debug("Unregistered compat: {}", id); - } - } - - /** - * Gets loaded compats. - * - * @return the loaded compats - */ - public List getLoadedCompats() { - return compats.values().stream() - .filter(ICompat::isModLoaded) - .collect(Collectors.toList()); - } - - -} \ No newline at end of file diff --git a/src/main/java/top/r3944realms/lib39/core/compat/ICompat.java b/src/main/java/top/r3944realms/lib39/core/compat/ICompat.java deleted file mode 100644 index 750fbe8..0000000 --- a/src/main/java/top/r3944realms/lib39/core/compat/ICompat.java +++ /dev/null @@ -1,132 +0,0 @@ -package top.r3944realms.lib39.core.compat; - -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.eventbus.api.IEventBus; - -import java.util.concurrent.Callable; - -/** - * The interface Compat. - */ -public interface ICompat { - void setInitialize(boolean initialize); - boolean isInitialized(); - /** - * Id resource location. - * - * @return the resource location - */ - ResourceLocation id(); - - /** - * Initialize. - */ - void initialize(); - - /** - * On load complete. - */ - default void onLoadComplete() {} - - /** - * Is mod loaded boolean. - * - * @return the boolean - */ - default boolean isModLoaded() { - return false; - } - - /** - * Call if present t. - * - * @param the type parameter - * @param callable the callable - * @return the t - * @throws Exception the exception - */ - default T callIfPresent(Callable callable) throws Exception { - if (isModLoaded()) return callable.call(); - else return null; - } - - /** - * Call if pesent t. - * - * @param the type parameter - * @param callable the callable - * @param elseCall the else call - * @return the t - * @throws Exception the exception - */ - default T callIfPresent(Callable callable, Callable elseCall) throws Exception { - if (isModLoaded()) return callable.call(); - else return elseCall.call(); - } - - /** - * Run if present boolean. - * - * @param runnable the runnable - * @return the boolean - * @throws Exception the exception - */ - default boolean runIfPresent(Runnable runnable) throws Exception { - if (isModLoaded()) runnable.run(); else return false; - return true; - } - - /** - * Add common game listener. - * - * @param gameBus the game bus - */ - default void addCommonGameListener(IEventBus gameBus) { - // 实现通用游戏事件监听器添加逻辑 - } - - /** - * Add common mod listener. - * - * @param modBus the mod bus - */ - default void addCommonModListener(IEventBus modBus) { - // 实现通用模组事件监听器添加逻辑 - } - - /** - * Add client game listener. - * - * @param gameBus the game bus - */ - default void addClientGameListener(IEventBus gameBus) { - // 实现客户端游戏事件监听器添加逻辑 - } - - /** - * Add client mod listener. - * - * @param modBus the mod bus - */ - default void addClientModListener(IEventBus modBus) { - // 实现客户端模组事件监听器添加逻辑 - } - - /** - * Add server game listener. - * - * @param gameBus the game bus - */ - default void addServerGameListener(IEventBus gameBus) { - // 实现服务端游戏事件监听器添加逻辑 - } - - /** - * Add server mod listener. - * - * @param modBus the mod bus - */ - default void addServerModListener(IEventBus modBus) { - // 实现服务端模组事件监听器添加逻辑 - } -} diff --git a/src/main/java/top/r3944realms/lib39/core/event/ClientEventHandler.java b/src/main/java/top/r3944realms/lib39/core/event/ClientEventHandler.java deleted file mode 100644 index 91741ba..0000000 --- a/src/main/java/top/r3944realms/lib39/core/event/ClientEventHandler.java +++ /dev/null @@ -1,89 +0,0 @@ -package top.r3944realms.lib39.core.event; - -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.server.level.ServerLevel; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.EntityRenderersEvent; -import net.minecraftforge.client.event.RegisterShadersEvent; -import net.minecraftforge.event.level.LevelEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.client.model.DollModel; -import top.r3944realms.lib39.client.renderer.block.DollBlockEntityRenderer; -import top.r3944realms.lib39.client.shader.Lib39Shaders; -import top.r3944realms.lib39.content.register.Lib39BlockEntities; -import top.r3944realms.lib39.util.ILevelHelper; - -/** - * The type Client handler. - */ -public class ClientEventHandler { - /** - * The type Mod. - */ - @net.minecraftforge.fml.common.Mod.EventBusSubscriber(value = Dist.CLIENT, bus = net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus.MOD, modid = Lib39.MOD_ID) - public static class Mod extends ClientEventHandler { - /** - * On register shaders. - * - * @param event the event - */ - @SubscribeEvent - public static void onRegisterShaders(RegisterShadersEvent event) { - Lib39Shaders.register(event); - } - - /** - * On register renderer. - * - * @param event the event - */ - @SubscribeEvent - public static void onRegisterRenderer (EntityRenderersEvent.RegisterRenderers event) { - event.registerBlockEntityRenderer(Lib39BlockEntities.DOLL_BLOCK_ENTITY.get(),DollBlockEntityRenderer::new); - } - - /** - * Register layer definitions. - * - * @param event the event - */ - @SubscribeEvent - public static void registerLayerDefinitions(EntityRenderersEvent.RegisterLayerDefinitions event) { - event.registerLayerDefinition(DollModel.LAYER_LOCATION, DollModel::createBodyLayer); - } - - } - - /** - * The type Game. - */ - @net.minecraftforge.fml.common.Mod.EventBusSubscriber(value = Dist.CLIENT, bus = net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus.FORGE, modid = Lib39.MOD_ID) - public static class Game extends ClientEventHandler { - /** - * Register layer definitions. - * - * @param event the event - */ - @SubscribeEvent - public static void registerLayerDefinitions(LevelEvent.Load event) { - if (event.getLevel() != null && event.getLevel() instanceof ClientLevel level) { - ILevelHelper.LevelHelper.CLIENT.setLevel(level); - } - } - - /** - * Register layer definitions. - * - * @param event the event - */ - @SubscribeEvent - public static void registerLayerDefinitions(LevelEvent.Unload event) { - if (event.getLevel() != null && event.getLevel() instanceof ClientLevel level) { - ILevelHelper.LevelHelper.CLIENT.setLevel(null); - } - } - } - -} diff --git a/src/main/java/top/r3944realms/lib39/core/event/CommonEventHandler.java b/src/main/java/top/r3944realms/lib39/core/event/CommonEventHandler.java deleted file mode 100644 index 741338a..0000000 --- a/src/main/java/top/r3944realms/lib39/core/event/CommonEventHandler.java +++ /dev/null @@ -1,292 +0,0 @@ -package top.r3944realms.lib39.core.event; - -import com.mojang.authlib.GameProfile; -import net.minecraft.Util; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.SkullBlockEntity; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.event.AnvilUpdateEvent; -import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; -import net.minecraftforge.event.RegisterCommandsEvent; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.event.entity.EntityJoinLevelEvent; -import net.minecraftforge.event.entity.EntityLeaveLevelEvent; -import net.minecraftforge.event.level.LevelEvent; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.event.lifecycle.FMLConstructModEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.registries.RegistryObject; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.api.event.SyncManagerRegisterEvent; -import top.r3944realms.lib39.base.command.Lib39HelpCommand; -import top.r3944realms.lib39.base.datagen.Lib39BaseDataGenEvent; -import top.r3944realms.lib39.content.item.DollItem; -import top.r3944realms.lib39.content.register.Lib39Items; -import top.r3944realms.lib39.core.compat.CompatManager; -import top.r3944realms.lib39.core.sync.ISyncData; -import top.r3944realms.lib39.core.sync.SyncData2Manager; -import top.r3944realms.lib39.example.compat.Lib39CompatManager; -import top.r3944realms.lib39.util.GameProfileHelper; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * The type Common handler. - */ -public class CommonEventHandler { - /** - * The type Game. - */ - @SuppressWarnings("unused") - @net.minecraftforge.fml.common.Mod.EventBusSubscriber(modid = Lib39.MOD_ID, bus = net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus.FORGE) - public static class Game extends CommonEventHandler { - private static ServerLevel sl; - - /** - * Gets server level. - * - * @return the server level - */ - public static ServerLevel getServerLevel() { - return sl; - } - - /** - * The Sync data 2 manager. - */ - static volatile SyncData2Manager syncData2Manager; - private static boolean isSync2MInitialized = false; - - /** - * Gets sync data 2 manager. - * - * @return the sync data 2 manager - */ - public static SyncData2Manager getSyncData2Manager() { - return syncData2Manager; - } - - /** - * On world load. - * - * @param event the event - */ - @SubscribeEvent - public static void onWorldLoad(LevelEvent.Load event) { - LevelAccessor level = event.getLevel(); - if(level instanceof ServerLevel serverLevel) { - // 只处理主世界(避免多次初始化) - if (!serverLevel.dimension().equals(Level.OVERWORLD)) return; - synchronized (Game.class) { - if (!isSync2MInitialized) { - syncData2Manager = new SyncData2Manager(); - MinecraftForge.EVENT_BUS.post(new SyncManagerRegisterEvent(syncData2Manager)); - isSync2MInitialized = true; - sl = serverLevel; - Lib39.LOGGER.info("SyncData2Manager initialized on Sever load"); - } - - } - } else if (level instanceof ClientLevel clientLevel) { - synchronized (Game.class) { - if (!clientLevel.dimension().equals(Level.OVERWORLD)) return; - if (!isSync2MInitialized) { - syncData2Manager = new SyncData2Manager(); - MinecraftForge.EVENT_BUS.post(new SyncManagerRegisterEvent(syncData2Manager)); - Lib39.LOGGER.info("SyncData2Manager initialized on Client load"); - } - } - } - - } - - /** - * On world unload. - * - * @param event the event - */ - @SubscribeEvent - public static void onWorldUnload(LevelEvent.Unload event) { - if (event.getLevel().isClientSide() || !(event.getLevel() instanceof ServerLevel serverLevel)) return; - if (!serverLevel.dimension().equals(Level.OVERWORLD)) return; - - sl = null; - isSync2MInitialized = false; - } - - /** - * On server tick. - * - * @param event the event - */ - @SubscribeEvent - public static void onServerTick(TickEvent.ServerTickEvent event) { - if (event.phase == TickEvent.Phase.END) { - if (syncData2Manager == null) return; - if (event.getServer().getTickCount() % 10 == 0) - syncData2Manager.forEach(((resourceLocation, iSyncManager) -> iSyncManager.foreach(ISyncData::markDirty))); - syncData2Manager.forEach(((resourceLocation, iSyncManager) -> iSyncManager.foreach(ISyncData::checkIfDirtyThenUpdate))); - } - } - - /** - * On anvil rename. - * - * @param event the event - */ - @SubscribeEvent - public static void onAnvilRename(AnvilUpdateEvent event) { - if (event.getLeft().getItem() instanceof DollItem) { - String name = event.getName(); - if (name != null && name.length() < 15) { - GameProfile profile = new GameProfile(Util.NIL_UUID, name); - ItemStack copied = Lib39Items.DOLL.get().getDefaultInstance(); - SkullBlockEntity.updateGameprofile(profile, - profile1 -> GameProfileHelper.saveProfileToItemStack(copied, profile1) - ); - copied.setCount(event.getLeft().getCount()); - event.setOutput(copied); - event.setCost(1); - } else { - ItemStack defaultInstance = Items.BARRIER.getDefaultInstance(); - defaultInstance.setHoverName(Component.translatable("invalid.player_name.too_long")); - event.setOutput(defaultInstance); - } - } - } - - /** - * On entity join world. - * - * @param event the event - */ - @SubscribeEvent - public static void onEntityJoinWorld(EntityJoinLevelEvent event) { - Entity entity = event.getEntity(); - if (entity.level().isClientSide) return; - - for (ResourceLocation id : syncData2Manager.getRegisteredKeys()) { - if (syncData2Manager.isEntityClassAllowed(id, entity.getClass())) { - syncData2Manager.trackEntityForManager(entity, id); - } - } - } - - /** - * On entity leave world. - * - * @param event the event - */ - @SubscribeEvent - public static void onEntityLeaveWorld(EntityLeaveLevelEvent event) { - Entity entity = event.getEntity(); - if (entity.level().isClientSide) return; - - for (ResourceLocation id : syncData2Manager.getRegisteredKeys()) { - if (syncData2Manager.isEntityClassAllowed(id, entity.getClass())) { - syncData2Manager.untrackEntityForManager(entity, id); - } - } - } - - /** - * On register command. - * - * @param event the event - */ - @SubscribeEvent - public static void onRegisterCommand (RegisterCommandsEvent event) { - Lib39HelpCommand lib39HelpCommand = new Lib39HelpCommand(event); - } - } - - /** - * The type Mod. - */ - @SuppressWarnings("unused") - @net.minecraftforge.fml.common.Mod.EventBusSubscriber(modid = Lib39.MOD_ID, bus = net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus.MOD) - public static class Mod extends CommonEventHandler { - private static final Map, ResourceKey[]> itemAddMap = new ConcurrentHashMap<>(); - private static final Map, List>> tabToItemsMap = new ConcurrentHashMap<>(); - /** - * On fml common setup. - * - * @param event the event - */ - @SubscribeEvent - public static void onFMLCommonSetup(FMLCommonSetupEvent event) { - event.enqueueWork(() -> { - try { - Class.forName("top.r3944realms.lib39.base.command.Lib39CommandHelpManager"); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - }); - } - - /** - * Add item to tabs. - * - * @param item the item - * @param tabs the tabs - */ - @SafeVarargs - public static void addItemToTabs(RegistryObject item, ResourceKey... tabs) { - itemAddMap.put(item, tabs); - - // 更新反向映射 - for (ResourceKey tab : tabs) { - tabToItemsMap.computeIfAbsent(tab, k -> new ArrayList<>()).add(item); - } - } - - /** - * On build creative tab contents. - * - * @param event the event - */ - @SubscribeEvent - public static void onBuildCreativeTabContents(BuildCreativeModeTabContentsEvent event) { - List> itemsForTab = tabToItemsMap.get(event.getTabKey()); - if (itemsForTab != null) { - itemsForTab.forEach(event::accept); - } - } - - /** - * Gather data. - * - * @param event the event - */ - @SubscribeEvent - public static void gatherData(GatherDataEvent event) { - Lib39BaseDataGenEvent.gatherData(event); - } - - /** - * Gets item add map. - * - * @return the item add map - */ - public static Map, ResourceKey[]> getItemAddMap() { - return itemAddMap; - } - } -} diff --git a/src/main/java/top/r3944realms/lib39/core/event/ServerEventHandler.java b/src/main/java/top/r3944realms/lib39/core/event/ServerEventHandler.java deleted file mode 100644 index e75ba20..0000000 --- a/src/main/java/top/r3944realms/lib39/core/event/ServerEventHandler.java +++ /dev/null @@ -1,50 +0,0 @@ -package top.r3944realms.lib39.core.event; - -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.server.level.ServerLevel; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.event.level.LevelEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.util.ILevelHelper; - -/** - * The type Server handler. - */ -public class ServerEventHandler { - /** - * The type Mod. - */ - public static class Mod extends ServerEventHandler {} - - /** - * The type Game. - */ - @net.minecraftforge.fml.common.Mod.EventBusSubscriber(value = Dist.DEDICATED_SERVER, bus = net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus.FORGE, modid = Lib39.MOD_ID) - public static class Game extends ServerEventHandler { - /** - * Register layer definitions. - * - * @param event the event - */ - @SubscribeEvent - public static void registerLayerDefinitions(LevelEvent.Load event) { - if (event.getLevel() != null && event.getLevel() instanceof ServerLevel level) { - ILevelHelper.LevelHelper.SERVER.setLevel(level); - } - } - - /** - * Register layer definitions. - * - * @param event the event - */ - @SubscribeEvent - public static void registerLayerDefinitions(LevelEvent.Unload event) { - if (event.getLevel() != null && event.getLevel() instanceof ServerLevel) { - ILevelHelper.LevelHelper.SERVER.setLevel(null); - } - } - } -} diff --git a/src/main/java/top/r3944realms/lib39/core/lang/ClassEncryptor.java b/src/main/java/top/r3944realms/lib39/core/lang/ClassEncryptor.java deleted file mode 100644 index adce3f9..0000000 --- a/src/main/java/top/r3944realms/lib39/core/lang/ClassEncryptor.java +++ /dev/null @@ -1,92 +0,0 @@ -package top.r3944realms.lib39.core.lang; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.stream.Stream; - -/** - * The type Class encryptor. - */ -public class ClassEncryptor { - static { - System.loadLibrary("ClassEncrypt"); - } - - /** - * Encrypt class byte [ ]. - * - * @param classData the class data - * @param key the key - * @return the byte [ ] - */ - public native byte[] encryptClass(byte[] classData, String key); - - /** - * Decrypt class byte [ ]. - * - * @param encryptedData the encrypted data - * @param key the key - * @return the byte [ ] - */ - public native byte[] decryptClass(byte[] encryptedData, String key); - - /** - * Is encrypted file boolean. - * - * @param fileData the file data - * @return the boolean - */ - public native boolean isEncryptedFile(byte[] fileData); - - /** - * Encrypt class file. - * - * @param inputPath the input path - * @param outputPath the output path - * @param key the key - * @throws IOException the io exception - */ - public void encryptClassFile(String inputPath, String outputPath, String key) - throws IOException { - byte[] classData = Files.readAllBytes(Paths.get(inputPath)); - byte[] encryptedData = encryptClass(classData, key); - Files.write(Paths.get(outputPath), encryptedData); - System.out.println("Encrypted: " + inputPath + " -> " + outputPath); - } - - - /** - * Encrypt directory. - * - * @param inputDir the input dir - * @param outputDir the output dir - * @param key the key - * @throws IOException the io exception - */ - public void encryptDirectory(String inputDir, String outputDir, String key) - throws IOException { - try (Stream walk = Files.walk(Paths.get(inputDir))) { - walk - .filter(Files::isRegularFile) - .filter(p -> p.toString().endsWith(".class")) - .forEach(p -> { - try { - String relativePath = inputDir.equals(p.getParent().toString()) - ? p.getFileName().toString() - : inputDir.equals(p.getParent().getParent().toString()) - ? p.getParent().getFileName() + "/" + p.getFileName() - : p.toString().substring(inputDir.length() + 1); - - Path outputPath = Paths.get(outputDir, relativePath); - Files.createDirectories(outputPath.getParent()); - - encryptClassFile(p.toString(), outputPath.toString(), key); - } catch (Exception e) { - e.printStackTrace(); - } - }); - } - } -} diff --git a/src/main/java/top/r3944realms/lib39/core/lang/EncryptedClassLoader.java b/src/main/java/top/r3944realms/lib39/core/lang/EncryptedClassLoader.java deleted file mode 100644 index 3a9805b..0000000 --- a/src/main/java/top/r3944realms/lib39/core/lang/EncryptedClassLoader.java +++ /dev/null @@ -1,227 +0,0 @@ -package top.r3944realms.lib39.core.lang; - -import java.io.*; -import java.net.URL; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.HashMap; -import java.util.Map; - -/** - * The type Encrypted class loader. - */ -public class EncryptedClassLoader extends ClassLoader { - static { - System.loadLibrary("ClassEncrypt"); - } - - private native byte[] decryptClass(byte[] encryptedData, String key); - - private final String encryptedClassPath; - private final String decryptionKey; - - // 缓存已加载的类字节码,避免重复加载 - private final Map classBytesCache = new HashMap<>(); - - /** - * Instantiates a new Encrypted class loader. - * - * @param encryptedClassPath the encrypted class path - * @param key the key - */ - public EncryptedClassLoader(String encryptedClassPath, String key) { - this.encryptedClassPath = encryptedClassPath; - this.decryptionKey = key; - } - - /** - * Instantiates a new Encrypted class loader. - * - * @param encryptedClassPath the encrypted class path - * @param key the key - * @param parent the parent - */ - public EncryptedClassLoader(String encryptedClassPath, String key, ClassLoader parent) { - super(parent); - this.encryptedClassPath = encryptedClassPath; - this.decryptionKey = key; - } - - @Override - protected Class findClass(String name) throws ClassNotFoundException { - try { - // 从缓存获取或加载类字节码 - byte[] classData; - synchronized (classBytesCache) { - classData = classBytesCache.get(name); - if (classData == null) { - // 1. 读取加密的class文件 - byte[] encryptedData = loadEncryptedClass(name); - - // 2. 使用JNI解密 - classData = decryptClass(encryptedData, decryptionKey); - - // 3. 验证解密后的数据是否是有效的class文件 - if (!isValidClass(classData)) { - throw new ClassNotFoundException("Invalid class data after decryption"); - } - - // 缓存类字节码 - classBytesCache.put(name, classData); - } - } - - // 4. 定义类 - return defineClass(name, classData, 0, classData.length); - - } catch (Exception e) { - throw new ClassNotFoundException("Failed to load encrypted class: " + name, e); - } - } - - private byte [] loadEncryptedClass(String className) throws IOException { - String path = className.replace('.', File.separatorChar) + ".class"; - Path fullPath = Paths.get(encryptedClassPath, path); - - if (!Files.exists(fullPath)) { - // 尝试寻找内部类 - int dollarIndex = className.lastIndexOf('$'); - if (dollarIndex != -1) { - String outerClass = className.substring(0, dollarIndex); - path = outerClass.replace('.', File.separatorChar) + - "$" + className.substring(dollarIndex + 1) + ".class"; - fullPath = Paths.get(encryptedClassPath, path); - } - } - - if (!Files.exists(fullPath)) { - // 尝试其他可能的文件扩展名 - fullPath = Paths.get(encryptedClassPath, className.replace('.', File.separatorChar) + ".enc"); - if (!Files.exists(fullPath)) { - throw new FileNotFoundException("Encrypted class not found: " + className); - } - } - - return Files.readAllBytes(fullPath); - } - - private boolean isValidClass(byte [] data) { - // Java class文件的魔数是0xCAFEBABE - return data.length >= 4 && - data[0] == (byte)0xCA && - data[1] == (byte)0xFE && - data[2] == (byte)0xBA && - data[3] == (byte)0xBE; - } - - @Override - protected Class loadClass(String name, boolean resolve) - throws ClassNotFoundException { - // 优先检查是否已加载 - Class clazz = findLoadedClass(name); - if (clazz != null) { - return clazz; - } - - // Java核心类库使用父加载器 - if (name.startsWith("java.") || name.startsWith("javax.") || - name.startsWith("sun.") || name.startsWith("jdk.")) { - return super.loadClass(name, resolve); - } - - try { - // 尝试用自定义ClassLoader加载 - clazz = findClass(name); - } catch (ClassNotFoundException e) { - // 如果找不到,委托给父加载器 - clazz = super.loadClass(name, resolve); - } - - if (resolve) { - resolveClass(clazz); - } - - return clazz; - } - - /** - * Get class bytes byte [ ]. - * - * @param className the class name - * @return the byte [ ] - * @throws ClassNotFoundException the class not found exception - */ -// 添加获取类字节码的方法 - public byte[] getClassBytes(String className) throws ClassNotFoundException { - synchronized (classBytesCache) { - byte[] bytes = classBytesCache.get(className); - if (bytes == null) { - // 触发类加载以填充缓存 - loadClass(className); - bytes = classBytesCache.get(className); - } - return bytes != null ? bytes.clone() : null; // 返回副本 - } - } - - @Override - public InputStream getResourceAsStream(String name) { - try { - // 处理.class资源请求 - if (name.endsWith(".class")) { - String className = name.substring(0, name.length() - 6) - .replace('/', '.'); - byte[] classData = getClassBytes(className); - if (classData != null) { - return new ByteArrayInputStream(classData); - } - } - - // 处理其他资源文件 - Path resourcePath = Paths.get(encryptedClassPath, name); - if (Files.exists(resourcePath)) { - return Files.newInputStream(resourcePath); - } - - } catch (Exception e) { - // 忽略异常,返回null让父加载器处理 - } - - // 委托给父加载器 - return super.getResourceAsStream(name); - } - - @Override - public URL getResource(String name) { - try { - Path resourcePath = Paths.get(encryptedClassPath, name); - if (Files.exists(resourcePath)) { - return resourcePath.toUri().toURL(); - } - } catch (Exception e) { - // 忽略异常 - } - return super.getResource(name); - } - - /** - * Clear cache. - */ - public void clearCache() { - synchronized (classBytesCache) { - classBytesCache.clear(); - } - } - - /** - * Clear cache. - * - * @param className the class name - */ - public void clearCache(String className) { - synchronized (classBytesCache) { - classBytesCache.remove(className); - } - } -} \ No newline at end of file diff --git a/src/main/java/top/r3944realms/lib39/core/network/NetworkHandler.java b/src/main/java/top/r3944realms/lib39/core/network/NetworkHandler.java deleted file mode 100644 index b9a9897..0000000 --- a/src/main/java/top/r3944realms/lib39/core/network/NetworkHandler.java +++ /dev/null @@ -1,73 +0,0 @@ -package top.r3944realms.lib39.core.network; - -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.NetworkDirection; -import net.minecraftforge.network.NetworkRegistry; -import net.minecraftforge.network.PacketDistributor; -import net.minecraftforge.network.simple.SimpleChannel; -import org.jetbrains.annotations.NotNull; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.core.network.toClient.SyncNBTCapDataEntityS2CPack; - -/** - * The type Network handler. - */ -@SuppressWarnings("unused") -public class NetworkHandler { - private static int cid = 0; - /** - * The constant INSTANCE. - */ - public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel( - Lib39.rl(Lib39.MOD_ID, "main"), - () -> Lib39.ModInfo.VERSION, - Lib39.ModInfo.VERSION::equals, - Lib39.ModInfo.VERSION::equals - ); - - /** - * Register. - */ - public static void register() { - INSTANCE.messageBuilder(SyncNBTCapDataEntityS2CPack.class, cid++, NetworkDirection.PLAY_TO_CLIENT) - .encoder(SyncNBTCapDataEntityS2CPack::encode) - .decoder(SyncNBTCapDataEntityS2CPack::decode) - .consumerNetworkThread(SyncNBTCapDataEntityS2CPack::handle) - .add(); - } - - /** - * Send to player. - * - * @param the type parameter - * @param message the message - * @param player the player - */ - public static void sendToPlayer(MSG message, ServerPlayer player){ - INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), message); - } - - /** - * Send to player. - * - * @param the type parameter - * @param the type parameter - * @param message the message - * @param entity the entity - * @param packetDistributor the packet distributor - */ - public static void sendToPlayer(MSG message, T entity, @NotNull PacketDistributor packetDistributor){ - INSTANCE.send(packetDistributor.with(() -> entity), message); - } - - /** - * Send to player. - * - * @param the type parameter - * @param message the message - */ - public static void sendToAllPlayer(MSG message){ - INSTANCE.send(PacketDistributor.ALL.noArg(), message); - } -} diff --git a/src/main/java/top/r3944realms/lib39/core/network/toClient/SyncNBTCapDataEntityS2CPack.java b/src/main/java/top/r3944realms/lib39/core/network/toClient/SyncNBTCapDataEntityS2CPack.java deleted file mode 100644 index d841474..0000000 --- a/src/main/java/top/r3944realms/lib39/core/network/toClient/SyncNBTCapDataEntityS2CPack.java +++ /dev/null @@ -1,94 +0,0 @@ -package top.r3944realms.lib39.core.network.toClient; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.Entity; -import net.minecraftforge.network.NetworkEvent; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.core.event.CommonEventHandler; -import top.r3944realms.lib39.core.sync.ISyncData; -import top.r3944realms.lib39.core.sync.NBTEntitySyncData; -import top.r3944realms.lib39.core.sync.SyncData2Manager; - -import java.util.Optional; -import java.util.function.Supplier; - -/** - * The type Sync nbt data s 2 c pack. - */ -@SuppressWarnings("unused") -public record SyncNBTCapDataEntityS2CPack(int entityId, ResourceLocation id, CompoundTag data) { - - /** - * Instantiates a new Sync nbt data s 2 c pack. - * - * @param entityId the entity id - * @param id the id - * @param data the data - */ - public SyncNBTCapDataEntityS2CPack(int entityId, ResourceLocation id, @NotNull NBTEntitySyncData data) { - this(entityId, data.id(), data.serializeNBT()); - } - - /** - * Encode. - * - * @param msg the msg - * @param buffer the buffer - */ - public static void encode(@NotNull SyncNBTCapDataEntityS2CPack msg, @NotNull FriendlyByteBuf buffer) { - buffer.writeInt(msg.entityId); - buffer.writeResourceLocation(msg.id); - buffer.writeNbt(msg.data); - } - - /** - * Decode sync nbt data s 2 c pack. - * - * @param buffer the buffer - * @return the sync nbt data s 2 c pack - */ - @Contract("_ -> new") - public static @NotNull SyncNBTCapDataEntityS2CPack decode(@NotNull FriendlyByteBuf buffer) { - return new SyncNBTCapDataEntityS2CPack(buffer.readInt(), buffer.readResourceLocation(), buffer.readNbt()); - } - - /** - * Handle. - * - * @param msg the msg - * @param ctx the ctx - */ - public static void handle(SyncNBTCapDataEntityS2CPack msg, @NotNull Supplier ctx) { - NetworkEvent.Context context = ctx.get(); - context.enqueueWork(() -> { - ClientLevel level = Minecraft.getInstance().level; - if (level != null) { - Entity entity = level.getEntity(msg.entityId); - if (entity != null) { - Optional>> capability = - CommonEventHandler.Game - .getSyncData2Manager() - .getDataProvider(msg.id); - capability.flatMap(dataProvider -> dataProvider.getData(entity)) - .ifPresent(cap -> { - if (cap instanceof NBTEntitySyncData nbtCap) { - CompoundTag current = nbtCap.serializeNBT(); - if (!current.equals(msg.data)) { - nbtCap.deserializeNBT(msg.data); - } - } else Lib39.LOGGER.debug("Unhandled sync data: {}", msg.data); - } - ); - } - } - }); - context.setPacketHandled(true); - } - -} diff --git a/src/main/java/top/r3944realms/lib39/core/registry/LocaleRegistry.java b/src/main/java/top/r3944realms/lib39/core/registry/LocaleRegistry.java deleted file mode 100644 index 6e02b3a..0000000 --- a/src/main/java/top/r3944realms/lib39/core/registry/LocaleRegistry.java +++ /dev/null @@ -1,78 +0,0 @@ -package top.r3944realms.lib39.core.registry; - -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.UnmodifiableView; -import top.r3944realms.lib39.datagen.value.ILocaleEntry; -import top.r3944realms.lib39.datagen.value.McLocale; - -import java.util.*; - -/** - * The type Locale registry. - */ -@SuppressWarnings("unused") -public class LocaleRegistry { - private static final Map REGISTRY = new LinkedHashMap<>(); - - // 初始化:注册所有枚举值 - static { - for (McLocale loc : McLocale.values()) { - register(loc); - } - } - - /** - * 注册(覆盖已有时直接返回旧值) @param entry the entry - * - * @param entry the entry - * @return the locale entry - */ - @SuppressWarnings("UnusedReturnValue") - public static ILocaleEntry register(ILocaleEntry entry) { - return REGISTRY.putIfAbsent(entry.mcCode().toLowerCase(), entry); - } - - /** - * 通过 Minecraft 代码查找 @param code the code - * - * @param code the code - * @return the locale entry - */ - public static ILocaleEntry fromMcCode(@NotNull String code) { - return REGISTRY.get(code.toLowerCase()); - } - - /** - * 列出所有 @return the collection - * - * @return the collection - */ - public static @NotNull @UnmodifiableView Collection allValues() { - return Collections.unmodifiableCollection(REGISTRY.values()); - } - - /** - * 动态注册一个扩展 Locale @param mcCode the mc code - * - * @param mcCode the mc code - * @param locale the locale - * @return the locale entry - */ - public static ILocaleEntry registerDynamic(@NotNull String mcCode, Locale locale) { - return REGISTRY.computeIfAbsent(mcCode.toLowerCase(), - k -> new ExtendedLocale(mcCode.toLowerCase(), locale)); - } - - /** - * 扩展类型 - */ - private record ExtendedLocale(String mcCode, Locale javaLocale) implements ILocaleEntry { - - @Contract(pure = true) - @Override - public @NotNull String toString() { - return "ExtendedLocale[" + mcCode + "]"; - } - } -} diff --git a/src/main/java/top/r3944realms/lib39/core/sync/CachedSyncManager.java b/src/main/java/top/r3944realms/lib39/core/sync/CachedSyncManager.java deleted file mode 100644 index 1c5d91b..0000000 --- a/src/main/java/top/r3944realms/lib39/core/sync/CachedSyncManager.java +++ /dev/null @@ -1,74 +0,0 @@ -package top.r3944realms.lib39.core.sync; - -import java.util.Map; -import java.util.Set; - -/** - * The type Cached sync manager. - * - * @param the type parameter - * @param the type parameter - */ -@SuppressWarnings("unused") -public abstract class CachedSyncManager> implements ISyncManager { - - private volatile Set cachedSet; - private volatile int mapSize = -1; - - @Override - public Set getSyncSet() { - Map syncMap = getSyncMap(); - if (syncMap == null) { - throw new IllegalStateException("SyncMap is not initialized"); - } - - // 检查是否需要更新缓存 - if (cachedSet == null || mapSize != syncMap.size()) { - synchronized (this) { - if (cachedSet == null || mapSize != syncMap.size()) { - cachedSet = Set.copyOf(syncMap.values()); - mapSize = syncMap.size(); - } - } - } - return cachedSet; - } - - /** - * 当Map发生变化时调用此方法清除缓存 - */ - protected void invalidateCache() { - cachedSet = null; - mapSize = -1; - } - - @Override - public void track(K key, T instance) { - Map syncMap = getSyncMap(); - if (syncMap == null) { - throw new IllegalStateException("SyncMap is not initialized"); - } - syncMap.put(key, instance); - invalidateCache(); - } - - @Override - public void untrack(K key, T instance) { - Map syncMap = getSyncMap(); - if (syncMap == null) { - throw new IllegalStateException("SyncMap is not initialized"); - } - // 只有当key对应的value确实是instance时才移除,避免误删 - syncMap.remove(key, instance); - invalidateCache(); - } - - @Override - public void clear() { - Map syncMap = getSyncMap(); - if (syncMap != null) { - syncMap.clear(); - } - invalidateCache(); - } -} \ No newline at end of file diff --git a/src/main/java/top/r3944realms/lib39/core/sync/IEntity.java b/src/main/java/top/r3944realms/lib39/core/sync/IEntity.java deleted file mode 100644 index 249b1af..0000000 --- a/src/main/java/top/r3944realms/lib39/core/sync/IEntity.java +++ /dev/null @@ -1,13 +0,0 @@ -package top.r3944realms.lib39.core.sync; - -/** - * The interface Entity. - */ -public interface IEntity { - /** - * Entity id int. - * - * @return the int - */ - int entityId(); -} diff --git a/src/main/java/top/r3944realms/lib39/core/sync/ISyncData.java b/src/main/java/top/r3944realms/lib39/core/sync/ISyncData.java deleted file mode 100644 index 30f82b5..0000000 --- a/src/main/java/top/r3944realms/lib39/core/sync/ISyncData.java +++ /dev/null @@ -1,50 +0,0 @@ -package top.r3944realms.lib39.core.sync; - -import net.minecraft.resources.ResourceLocation; - -/** - * The interface Sync data. - * - * @param the type parameter - */ -public interface ISyncData { - /** - * Id resource location. - * - * @return the resource location - */ - ResourceLocation id(); - - /** - * Is dirty boolean. - * - * @return the boolean - */ - boolean isDirty(); - - /** - * Sets dirty. - * - * @param dirty the dirty - */ - void setDirty(boolean dirty); - - /** - * Mark dirty. - */ - default void markDirty() { - setDirty(true); - } - - /** - * Copy from. - * - * @param src the src - */ - void copyFrom(T src); - - /** - * Check if dirty then update. - */ - void checkIfDirtyThenUpdate(); -} diff --git a/src/main/java/top/r3944realms/lib39/core/sync/ISyncManager.java b/src/main/java/top/r3944realms/lib39/core/sync/ISyncManager.java deleted file mode 100644 index 661d22e..0000000 --- a/src/main/java/top/r3944realms/lib39/core/sync/ISyncManager.java +++ /dev/null @@ -1,129 +0,0 @@ -package top.r3944realms.lib39.core.sync; - -import java.util.Map; -import java.util.Set; -import java.util.function.Consumer; - -/** - * The interface Sync manager. - * - * @param the type parameter - * @param the type parameter - */ -@SuppressWarnings("unused") -public interface ISyncManager> { - - /** - * 获取同步映射 - * - * @return the sync map - */ - Map getSyncMap(); - - /** - * 获取同步集合 - * - * @return the sync set - */ - default Set getSyncSet() { - Map syncMap = getSyncMap(); - return Set.copyOf(syncMap.values()); - } - - /** - * 跟踪实例 - * - * @param key the key - * @param instance the instance - */ - default void track(K key, T instance) { - Map syncMap = getSyncMap(); - if (syncMap == null) { - throw new IllegalStateException("SyncMap is not initialized"); - } - syncMap.put(key, instance); - } - - /** - * 取消跟踪 - * - * @param key the key - * @param instance the instance - */ - default void untrack(K key, T instance) { - Map syncMap = getSyncMap(); - if (syncMap == null) { - throw new IllegalStateException("SyncMap is not initialized"); - } - // 只有当key对应的value确实是instance时才移除,避免误删 - syncMap.remove(key, instance); - } - - /** - * 遍历操作 - * - * @param consumer the consumer - */ - default void foreach(Consumer consumer) { - Map syncMap = getSyncMap(); - if (syncMap == null) { - throw new IllegalStateException("SyncMap is not initialized"); - } - syncMap.values().forEach(consumer); - } - - /** - * 批量操作 - * - * @param instances the instances - */ - default void trackAll(Map instances) { - Map syncMap = getSyncMap(); - if (syncMap == null) { - throw new IllegalStateException("SyncMap is not initialized"); - } - syncMap.putAll(instances); - } - - /** - * 获取大小 - * - * @return the int - */ - default int size() { - Map syncMap = getSyncMap(); - return syncMap != null ? syncMap.size() : 0; - } - - /** - * 检查是否包含key - * - * @param key the key - * @return the boolean - */ - default boolean containsKey(K key) { - Map syncMap = getSyncMap(); - return syncMap != null && syncMap.containsKey(key); - } - - /** - * 检查是否包含value - * - * @param value the value - * @return the boolean - */ - default boolean containsValue(T value) { - Map syncMap = getSyncMap(); - return syncMap != null && syncMap.containsValue(value); - } - - /** - * 清空所有数据 - */ - default void clear() { - Map syncMap = getSyncMap(); - if (syncMap != null) { - syncMap.clear(); - } - } -} diff --git a/src/main/java/top/r3944realms/lib39/core/sync/NBTEntitySyncData.java b/src/main/java/top/r3944realms/lib39/core/sync/NBTEntitySyncData.java deleted file mode 100644 index 73f3470..0000000 --- a/src/main/java/top/r3944realms/lib39/core/sync/NBTEntitySyncData.java +++ /dev/null @@ -1,59 +0,0 @@ -package top.r3944realms.lib39.core.sync; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.common.util.INBTSerializable; -import org.jetbrains.annotations.NotNull; -import top.r3944realms.lib39.core.network.NetworkHandler; -import top.r3944realms.lib39.core.network.toClient.SyncNBTCapDataEntityS2CPack; - -/** - * The type Nbt sync data. - */ -public abstract class NBTEntitySyncData implements IEntity, ISyncData, INBTSerializable { - /** - * The Dirty. - */ - protected boolean dirty; - /** - * The Id. - */ - protected final ResourceLocation id; - - /** - * Instantiates a new Nbt sync data. - * - * @param id the id - */ - protected NBTEntitySyncData(ResourceLocation id) { - this.id = id; - } - - @Override - public ResourceLocation id() { - return id; - } - - @Override - public boolean isDirty() { - return dirty; - } - - @Override - public void setDirty(boolean dirty) { - this.dirty = dirty; - } - - @Override - public void copyFrom(@NotNull NBTEntitySyncData src) { - this.dirty = src.isDirty(); - } - - @Override - public void checkIfDirtyThenUpdate() { - if (isDirty()) { - NetworkHandler.sendToAllPlayer(new SyncNBTCapDataEntityS2CPack(entityId(), id(), serializeNBT())); - } - dirty = false; - } -} diff --git a/src/main/java/top/r3944realms/lib39/core/sync/SyncData2CapManager.java b/src/main/java/top/r3944realms/lib39/core/sync/SyncData2CapManager.java deleted file mode 100644 index 71919d6..0000000 --- a/src/main/java/top/r3944realms/lib39/core/sync/SyncData2CapManager.java +++ /dev/null @@ -1,390 +0,0 @@ -package top.r3944realms.lib39.core.sync; - -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.Entity; -import net.minecraftforge.common.capabilities.Capability; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; -import java.util.function.BiConsumer; - -/** - * The type Sync data 2 manager. - */ -@SuppressWarnings("unused") -public class SyncData2CapManager { - private final Map> typedEntries = Maps.newConcurrentMap(); - - private static class TypedSyncEntry> { - /** - * The Manager. - */ - final ISyncManager manager; - /** - * The Capability. - */ - @Nullable - Capability capability; - /** - * The Allowed classes. - */ - final Set> allowedClasses; - - /** - * Instantiates a new Typed sync entry. - * - * @param manager the manager - * @param capability the capability - */ - TypedSyncEntry(ISyncManager manager, @Nullable Capability capability) { - this.manager = manager; - this.capability = capability; - this.allowedClasses = Sets.newConcurrentHashSet(); - } - } - - /** - * Register manager. - * - * @param the type parameter - * @param the type parameter - * @param key the key - * @param manager the manager - * @param capability the capability - */ - public > void registerManager( - ResourceLocation key, - ISyncManager manager, - Capability capability - ) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - Objects.requireNonNull(manager, "Sync manager cannot be null"); - Objects.requireNonNull(capability, "Capability cannot be null"); - - typedEntries.put(key, new TypedSyncEntry<>(manager, capability)); - } - - /** - * 向后兼容的注册方法(只注册管理器,不注册能力) - * - * @param key the key - * @param manager the manager - */ - @SuppressWarnings("unchecked") - public void registerManager(ResourceLocation key, ISyncManager> manager) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - Objects.requireNonNull(manager, "Sync manager cannot be null"); - - // 创建一个虚拟的 TypedSyncEntry,但 capability 为 null - // 注意:这种方法会限制类型安全的功能 - typedEntries.put(key, new TypedSyncEntry<>( - (ISyncManager>) manager, - null - )); - } - - /** - * Gets manager. - * - * @param the type parameter - * @param the type parameter - * @param key the key - * @return the manager - */ - @SuppressWarnings("unchecked") - public > Optional> getManager(ResourceLocation key) { - TypedSyncEntry entry = typedEntries.get(key); - return entry != null ? Optional.of((ISyncManager) entry.manager) : Optional.empty(); - } - - /** - * Gets capability. - * - * @param the type parameter - * @param key the key - * @return the capability - */ - @SuppressWarnings("unchecked") - public > Optional> getCapability(ResourceLocation key) { - TypedSyncEntry entry = typedEntries.get(key); - if (entry != null && entry.capability != null) { - return Optional.of((Capability) entry.capability); - } - return Optional.empty(); - } - - /** - * Allow entity class. - * - * @param key the key - * @param classes the classes - */ - public final void allowEntityClass(ResourceLocation key, Class... classes) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - Objects.requireNonNull(classes, "Classes array cannot be null"); - - if (classes.length == 0) { - return; - } - - TypedSyncEntry entry = typedEntries.get(key); - if (entry != null) { - entry.allowedClasses.addAll(Arrays.asList(classes)); - } - } - - /** - * 移除允许的实体类 - * - * @param key the key - * @param classes the classes - */ - public final void disallowEntityClass(ResourceLocation key, Class... classes) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - Objects.requireNonNull(classes, "Classes array cannot be null"); - - TypedSyncEntry entry = typedEntries.get(key); - if (entry != null && classes.length > 0) { - Arrays.asList(classes).forEach(entry.allowedClasses::remove); - - } - } - - /** - * 绑定能力(用于分离注册的情况) - * - * @param the type parameter - * @param key the key - * @param capability the capability - */ - public > void bindCapability(ResourceLocation key, Capability capability) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - Objects.requireNonNull(capability, "Capability cannot be null"); - - TypedSyncEntry entry = typedEntries.get(key); - if (entry != null) { - // 更新现有条目的能力 - updateCapabilityInEntry(key, entry, capability); - } else throw new IllegalArgumentException("No manager found for " + key); - } - - /** - * 解绑能力 - * - * @param key the key - */ - public void unbindCapability(ResourceLocation key) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - - TypedSyncEntry entry = typedEntries.get(key); - if (entry != null) { - // 将能力设置为null,但保留管理器和其他配置 - updateCapabilityInEntry(key, entry, null); - } - } - - /** - * 清除允许的实体类 - * - * @param key the key - */ - public void clearAllowedEntityClasses(ResourceLocation key) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - - TypedSyncEntry entry = typedEntries.get(key); - if (entry != null) { - entry.allowedClasses.clear(); - } - } - - /** - * Is entity class allowed boolean. - * - * @param key the key - * @param entityClass the entity class - * @return the boolean - */ - public boolean isEntityClassAllowed(ResourceLocation key, Class entityClass) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - Objects.requireNonNull(entityClass, "Entity class cannot be null"); - - TypedSyncEntry entry = typedEntries.get(key); - boolean isAllowed = false; - if (entry != null) { - for (Class allowedClass : entry.allowedClasses) { - if (entityClass.isAssignableFrom(allowedClass)) { - isAllowed = true; - break; - } - } - } - return entry != null && isAllowed ; - } - - /** - * Track entity for manager. - * - * @param entity the entity - * @param managerId the manager id - */ -// 类型安全的事件处理 - @SuppressWarnings("unchecked") - public void trackEntityForManager(Entity entity, ResourceLocation managerId) { - TypedSyncEntry entry = (TypedSyncEntry) typedEntries.get(managerId); - if (entry != null) { - trackEntityWithTypedEntry(entity, entry); - } - } - - private > void trackEntityWithTypedEntry(Entity entity, @NotNull TypedSyncEntry entry) { - if (entry.capability != null) { - entity.getCapability(entry.capability) - .ifPresent(cap -> entry.manager.track(entity.getUUID(), cap)); - } - } - - /** - * Untrack entity for manager. - * - * @param entity the entity - * @param managerId the manager id - */ -// 类型安全的事件处理 - 取消跟踪实体 - @SuppressWarnings("unchecked") - public void untrackEntityForManager(Entity entity, ResourceLocation managerId) { - TypedSyncEntry entry = (TypedSyncEntry) typedEntries.get(managerId); - if (entry != null) { - untrackEntityWithTypedEntry(entity, entry); - } - } - - private > void untrackEntityWithTypedEntry(Entity entity, @NotNull TypedSyncEntry entry) { - if (entry.capability != null) { - entity.getCapability(entry.capability) - .ifPresent(cap -> entry.manager.untrack(entity.getUUID(), cap)); - } - } - - /** - * 从所有管理器中移除实体跟踪 - * - * @param entity the entity - */ - public void untrackEntityFromAllManagers(Entity entity) { - for (ResourceLocation id : getRegisteredKeys()) { - if (isEntityClassAllowed(id, entity.getClass())) { - untrackEntityForManager(entity, id); - } - } - } - - /** - * 批量从管理器中移除实体跟踪 - * - * @param entities the entities - * @param managerId the manager id - */ - public void untrackEntitiesForManager(@NotNull Iterable entities, ResourceLocation managerId) { - for (Entity entity : entities) { - untrackEntityForManager(entity, managerId); - } - } - - /** - * 从所有管理器中批量移除实体跟踪 - * - * @param entities the entities - */ - public void untrackEntitiesFromAllManagers(@NotNull Iterable entities) { - for (Entity entity : entities) { - untrackEntityFromAllManagers(entity); - } - } - - /** - * 强制清理管理器中的所有跟踪数据 - * - * @param managerId the manager id - */ - public void clearAllTrackedData(ResourceLocation managerId) { - TypedSyncEntry entry = typedEntries.get(managerId); - if (entry != null) { - clearTrackedDataForEntry(entry); - } - } - - private > void clearTrackedDataForEntry(@NotNull TypedSyncEntry entry) { - // 获取当前跟踪的集合并清空 - Set syncSet = entry.manager.getSyncSet(); - if (syncSet != null) { - syncSet.clear(); - } - } - - /** - * 清理所有管理器的跟踪数据 - */ - public void clearAllTrackedData() { - for (ResourceLocation id : getRegisteredKeys()) { - clearAllTrackedData(id); - } - } - - // 辅助方法:更新条目的能力 - @SuppressWarnings("unchecked") - private > void updateCapabilityInEntry(ResourceLocation id, TypedSyncEntry entry, Capability newCapability) { - TypedSyncEntry typedEntry = (TypedSyncEntry) entry; - //重构了 TypedSyncEntry 使 capability 可变 - typedEntry.capability = newCapability; - typedEntries.computeIfPresent(id, (resourceLocation, typedSyncEntry) -> typedEntry); - } - - - /** - * Gets registered keys. - * - * @return the registered keys - */ - public Set getRegisteredKeys() { - return Collections.unmodifiableSet(typedEntries.keySet()); - } - - /** - * For each. - * - * @param consumer the consumer - */ - public void forEach(BiConsumer> consumer) { - Objects.requireNonNull(consumer, "Consumer cannot be null"); - typedEntries.forEach((key, entry) -> consumer.accept(key, entry.manager)); - } - - /** - * Gets manager count. - * - * @return the manager count - */ - public int getManagerCount() { - return typedEntries.size(); - } - - /** - * Clear all. - */ - public void clearAll() { - typedEntries.clear(); - } - - /** - * 移除管理器(包括所有相关配置) - * - * @param key the key - */ - public void removeManager(ResourceLocation key) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - typedEntries.remove(key); - } -} \ No newline at end of file diff --git a/src/main/java/top/r3944realms/lib39/core/sync/SyncData2Manager.java b/src/main/java/top/r3944realms/lib39/core/sync/SyncData2Manager.java deleted file mode 100644 index bc6e93c..0000000 --- a/src/main/java/top/r3944realms/lib39/core/sync/SyncData2Manager.java +++ /dev/null @@ -1,462 +0,0 @@ -package top.r3944realms.lib39.core.sync; - -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.Entity; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; -import java.util.function.BiConsumer; -import java.util.function.Function; - -/** - * The type Sync data 2 manager. - */ -@SuppressWarnings({"unused", "DuplicatedCode"}) -public class SyncData2Manager { - private final Map> typedEntries = Maps.newConcurrentMap(); - - /** - * 数据提供者接口 - 用于通过键获取数据 - * - * @param the type parameter - * @param the type parameter - */ - @FunctionalInterface - public interface DataProvider { - /** - * 通过键获取数据的 Optional - * - * @param key 键 - * @return 数据的 Optional - */ - Optional getData(K key); - } - - private static class TypedSyncEntry> { - /** - * The Manager. - */ - final ISyncManager manager; - /** - * The Data provider. - */ - @Nullable - final DataProvider dataProvider; - /** - * The Allowed classes. - */ - final Set> allowedClasses; - - /** - * Instantiates a new Typed sync entry. - * - * @param manager the manager - * @param dataProvider the data provider - */ - TypedSyncEntry(ISyncManager manager, @Nullable DataProvider dataProvider) { - this.manager = manager; - this.dataProvider = dataProvider; - this.allowedClasses = Sets.newConcurrentHashSet(); - } - } - - /** - * Register manager with data provider. - * - * @param the type parameter - * @param the type parameter - * @param key the key - * @param manager the manager - * @param dataProvider the data provider - */ - public > void registerManagerWithProvider( - ResourceLocation key, - ISyncManager manager, - DataProvider dataProvider - ) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - Objects.requireNonNull(manager, "Sync manager cannot be null"); - Objects.requireNonNull(dataProvider, "Data provider cannot be null"); - - typedEntries.put(key, new TypedSyncEntry<>(manager, dataProvider)); - } - - /** - * Register manager with function getter. - * - * @param the type parameter - * @param the type parameter - * @param key the key - * @param manager the manager - * @param getter the data getter function - */ - public > void registerManager( - ResourceLocation key, - ISyncManager manager, - Function> getter - ) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - Objects.requireNonNull(manager, "Sync manager cannot be null"); - Objects.requireNonNull(getter, "Data getter function cannot be null"); - - typedEntries.put(key, new TypedSyncEntry<>(manager, getter::apply)); - } - - /** - * 向后兼容的注册方法(只注册管理器,不注册数据提供者) - * - * @param key the key - * @param manager the manager - */ - @SuppressWarnings("unchecked") - public void registerManager(ResourceLocation key, ISyncManager> manager) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - Objects.requireNonNull(manager, "Sync manager cannot be null"); - - // 创建一个没有数据提供者的 TypedSyncEntry - typedEntries.put(key, new TypedSyncEntry<>( - (ISyncManager>) manager, - null - )); - } - - /** - * Gets manager. - * - * @param the type parameter - * @param the type parameter - * @param key the key - * @return the manager - */ - @SuppressWarnings("unchecked") - public > Optional> getManager(ResourceLocation key) { - TypedSyncEntry entry = typedEntries.get(key); - return entry != null ? Optional.of((ISyncManager) entry.manager) : Optional.empty(); - } - - /** - * Gets data provider. - * - * @param the type parameter - * @param key the key - * @return the data provider - */ - @SuppressWarnings("unchecked") - public > Optional> getDataProvider(ResourceLocation key) { - TypedSyncEntry entry = typedEntries.get(key); - if (entry != null && entry.dataProvider != null) { - return Optional.of((DataProvider) entry.dataProvider); - } - return Optional.empty(); - } - - /** - * 获取实体数据 - * - * @param the type parameter - * @param key the key - * @param entity the entity - * @return the entity data - */ - @SuppressWarnings("unchecked") - public > Optional getEntityData(ResourceLocation key, Entity entity) { - return getDataProvider(key) - .flatMap(provider -> { - Optional> result = provider.getData(entity); - return (Optional) result; - }); - } - - /** - * Allow entity class. - * - * @param key the key - * @param classes the classes - */ - public final void allowEntityClass(ResourceLocation key, Class... classes) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - Objects.requireNonNull(classes, "Classes array cannot be null"); - - if (classes.length == 0) { - return; - } - - TypedSyncEntry entry = typedEntries.get(key); - if (entry != null) { - entry.allowedClasses.addAll(Arrays.asList(classes)); - } - } - - /** - * 移除允许的实体类 - * - * @param key the key - * @param classes the classes - */ - public final void disallowEntityClass(ResourceLocation key, Class... classes) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - Objects.requireNonNull(classes, "Classes array cannot be null"); - - TypedSyncEntry entry = typedEntries.get(key); - if (entry != null && classes.length > 0) { - Arrays.asList(classes).forEach(entry.allowedClasses::remove); - } - } - - /** - * 绑定数据提供者(用于分离注册的情况) - * - * @param the type parameter - * @param key the key - * @param dataProvider the data provider - */ - public > void bindDataProvider(ResourceLocation key, DataProvider dataProvider) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - Objects.requireNonNull(dataProvider, "Data provider cannot be null"); - - TypedSyncEntry entry = typedEntries.get(key); - if (entry != null) { - // 更新现有条目的数据提供者 - updateDataProviderInEntry(key, entry, dataProvider); - } else { - throw new IllegalArgumentException("No manager found for " + key); - } - } - - /** - * 绑定简单的数据获取器 - * - * @param the type parameter - * @param key the key - * @param getter the data getter function - */ - public > void bindDataGetter(ResourceLocation key, Function> getter) { - bindDataProvider(key, getter::apply); - } - - /** - * 解绑数据提供者 - * - * @param key the key - */ - public void unbindDataProvider(ResourceLocation key) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - - TypedSyncEntry entry = typedEntries.get(key); - if (entry != null) { - // 将数据提供者设置为null,但保留管理器和其他配置 - updateDataProviderInEntry(key, entry, null); - } - } - - /** - * 清除允许的实体类 - * - * @param key the key - */ - public void clearAllowedEntityClasses(ResourceLocation key) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - - TypedSyncEntry entry = typedEntries.get(key); - if (entry != null) { - entry.allowedClasses.clear(); - } - } - - /** - * Is entity class allowed boolean. - * - * @param key the key - * @param entityClass the entity class - * @return the boolean - */ - public boolean isEntityClassAllowed(ResourceLocation key, Class entityClass) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - Objects.requireNonNull(entityClass, "Entity class cannot be null"); - - TypedSyncEntry entry = typedEntries.get(key); - if (entry == null) { - return false; - } - - // 如果没有设置允许的类,则默认允许所有类 - if (entry.allowedClasses.isEmpty()) { - return true; - } - - // 检查实体类是否在允许的类中 - return entry.allowedClasses.stream() - .anyMatch(allowedClass -> allowedClass.isAssignableFrom(entityClass)); - } - - /** - * Track entity for manager. - * - * @param entity the entity - * @param managerId the manager id - */ - @SuppressWarnings("unchecked") - public void trackEntityForManager(Entity entity, ResourceLocation managerId) { - TypedSyncEntry entry = (TypedSyncEntry) typedEntries.get(managerId); - if (entry != null) { - trackEntityWithTypedEntry(entity, entry); - } - } - - private > void trackEntityWithTypedEntry(Entity entity, @NotNull TypedSyncEntry entry) { - if (entry.dataProvider != null) { - entry.dataProvider.getData(entity) - .ifPresent(data -> entry.manager.track(entity.getUUID(), data)); - } - } - - /** - * Untrack entity for manager. - * - * @param entity the entity - * @param managerId the manager id - */ - @SuppressWarnings("unchecked") - public void untrackEntityForManager(Entity entity, ResourceLocation managerId) { - TypedSyncEntry entry = (TypedSyncEntry) typedEntries.get(managerId); - if (entry != null) { - untrackEntityWithTypedEntry(entity, entry); - } - } - - private > void untrackEntityWithTypedEntry(Entity entity, @NotNull TypedSyncEntry entry) { - if (entry.dataProvider != null) { - entry.dataProvider.getData(entity) - .ifPresent(data -> entry.manager.untrack(entity.getUUID(), data)); - } - } - - /** - * 从所有管理器中移除实体跟踪 - * - * @param entity the entity - */ - public void untrackEntityFromAllManagers(Entity entity) { - for (ResourceLocation id : getRegisteredKeys()) { - if (isEntityClassAllowed(id, entity.getClass())) { - untrackEntityForManager(entity, id); - } - } - } - - /** - * 批量从管理器中移除实体跟踪 - * - * @param entities the entities - * @param managerId the manager id - */ - public void untrackEntitiesForManager(@NotNull Iterable entities, ResourceLocation managerId) { - for (Entity entity : entities) { - untrackEntityForManager(entity, managerId); - } - } - - /** - * 从所有管理器中批量移除实体跟踪 - * - * @param entities the entities - */ - public void untrackEntitiesFromAllManagers(@NotNull Iterable entities) { - for (Entity entity : entities) { - untrackEntityFromAllManagers(entity); - } - } - - /** - * 强制清理管理器中的所有跟踪数据 - * - * @param managerId the manager id - */ - public void clearAllTrackedData(ResourceLocation managerId) { - TypedSyncEntry entry = typedEntries.get(managerId); - if (entry != null) { - clearTrackedDataForEntry(entry); - } - } - - private > void clearTrackedDataForEntry(@NotNull TypedSyncEntry entry) { - Set syncSet = entry.manager.getSyncSet(); - if (syncSet != null) { - syncSet.clear(); - } - } - - /** - * 清理所有管理器的跟踪数据 - */ - public void clearAllTrackedData() { - for (ResourceLocation id : getRegisteredKeys()) { - clearAllTrackedData(id); - } - } - - // 辅助方法:更新条目的数据提供者 - @SuppressWarnings("unchecked") - private > void updateDataProviderInEntry( - ResourceLocation id, - TypedSyncEntry entry, - DataProvider newDataProvider - ) { - // 由于 DataProvider 是 final,我们需要创建一个新的 TypedSyncEntry - TypedSyncEntry newEntry = new TypedSyncEntry<>( - (ISyncManager) entry.manager, - newDataProvider - ); - newEntry.allowedClasses.addAll(entry.allowedClasses); - - typedEntries.put(id, newEntry); - } - - /** - * Gets registered keys. - * - * @return the registered keys - */ - public Set getRegisteredKeys() { - return Collections.unmodifiableSet(typedEntries.keySet()); - } - - /** - * For each. - * - * @param consumer the consumer - */ - public void forEach(BiConsumer> consumer) { - Objects.requireNonNull(consumer, "Consumer cannot be null"); - typedEntries.forEach((key, entry) -> consumer.accept(key, entry.manager)); - } - - /** - * Gets manager count. - * - * @return the manager count - */ - public int getManagerCount() { - return typedEntries.size(); - } - - /** - * Clear all. - */ - public void clearAll() { - typedEntries.clear(); - } - - /** - * 移除管理器(包括所有相关配置) - * - * @param key the key - */ - public void removeManager(ResourceLocation key) { - Objects.requireNonNull(key, "ResourceLocation key cannot be null"); - typedEntries.remove(key); - } -} \ No newline at end of file diff --git a/src/main/java/top/r3944realms/lib39/datagen/provider/SimpleLanguageProvider.java b/src/main/java/top/r3944realms/lib39/datagen/provider/SimpleLanguageProvider.java deleted file mode 100644 index 794a66d..0000000 --- a/src/main/java/top/r3944realms/lib39/datagen/provider/SimpleLanguageProvider.java +++ /dev/null @@ -1,104 +0,0 @@ -package top.r3944realms.lib39.datagen.provider; - -import net.minecraft.data.PackOutput; -import net.minecraftforge.common.data.LanguageProvider; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import top.r3944realms.lib39.datagen.value.ILangKeyValue; -import top.r3944realms.lib39.datagen.value.ILangKeyValueCollection; -import top.r3944realms.lib39.datagen.value.McLocale; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * The type Simple language provider. - */ -public class SimpleLanguageProvider extends LanguageProvider { - private final McLocale language; - private final ILangKeyValueCollection langKeyValueCollection; - @Nullable - private ILangKeyValueCollection[] langKeyValueCollections; - private final Map translationMap; // Better naming - private final List orderedKeys; // Better naming than "objects" - - /** - * Instantiates a new Simple language provider. - * - * @param output the output - * @param modId the mod id - * @param language the language - * @param langKeyValueCollection the lang key value collection - */ - public SimpleLanguageProvider(PackOutput output, String modId, - @NotNull McLocale language, - ILangKeyValueCollection langKeyValueCollection) { - super(output, modId, language.mcCode()); - this.language = language; - this.langKeyValueCollection = langKeyValueCollection; - this.translationMap = new HashMap<>(); - this.orderedKeys = new ArrayList<>(); - initializeTranslations(); - } - - /** - * Instantiates a new Simple language provider. - * - * @param output the output - * @param modId the mod id - * @param language the language - * @param langKeyValueCollection the lang key value collection - */ - public SimpleLanguageProvider(PackOutput output, String modId, - @NotNull McLocale language, - ILangKeyValueCollection... langKeyValueCollection) { - super(output, modId, language.mcCode()); - this.language = language; - this.langKeyValueCollection = null; - this.langKeyValueCollections = langKeyValueCollection; - this.translationMap = new HashMap<>(); - this.orderedKeys = new ArrayList<>(); - initializeTranslations(); - } - - private void initializeTranslations() { - if (langKeyValueCollection != null) { - addToTranslationMap(langKeyValueCollection); - } else if (langKeyValueCollections != null) { - for (ILangKeyValueCollection keyValueCollection : langKeyValueCollections) { - if (keyValueCollection != null) { - addToTranslationMap(keyValueCollection); - } - } - } - } - - private void addToTranslationMap(ILangKeyValueCollection keyValueCollection) { - for (ILangKeyValue langKeyValue : keyValueCollection.getValues()) { - String key = langKeyValue.getKey(); - String value = langKeyValue.getLang(language); - - if (!translationMap.containsKey(key)) { - orderedKeys.add(key); - } - translationMap.put(key, value); - } - } - - @Override - protected void addTranslations() { - orderedKeys.forEach(key -> add(key, translationMap.get(key))); - validateTranslations(); - } - - private void validateTranslations() { - long addedCount = orderedKeys.stream() - .filter(translationMap::containsKey) - .count(); - - LOGGER.info("Added {}/{} translations for {}", - addedCount, orderedKeys.size(), language.mcCode()); - } -} diff --git a/src/main/java/top/r3944realms/lib39/datagen/provider/SimpleLootTableProvider.java b/src/main/java/top/r3944realms/lib39/datagen/provider/SimpleLootTableProvider.java deleted file mode 100644 index 4bc1dcf..0000000 --- a/src/main/java/top/r3944realms/lib39/datagen/provider/SimpleLootTableProvider.java +++ /dev/null @@ -1,42 +0,0 @@ -package top.r3944realms.lib39.datagen.provider; - -import net.minecraft.data.PackOutput; -import net.minecraft.data.loot.LootTableProvider; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.storage.loot.LootTable; -import net.minecraft.world.level.storage.loot.ValidationContext; -import org.jetbrains.annotations.NotNull; - -import java.util.Map; -import java.util.Set; - -/** - * The type Simple loot table provider. - */ -public class SimpleLootTableProvider extends LootTableProvider { - /** - * Instantiates a new Simple loot table provider. - * - * @param output the output - * @param subProvidersWrapper the sub providers wrapper - */ - public SimpleLootTableProvider(PackOutput output, @NotNull SubProvidersWrapper subProvidersWrapper) { - super(output, Set.of(), subProvidersWrapper.entries); - } - - /** - * Instantiates a new Simple loot table provider. - * - * @param output the output - * @param requiredTables the required tables - * @param subProvidersWrapper the sub providers wrapper - */ - public SimpleLootTableProvider(PackOutput output, Set requiredTables, @NotNull SubProvidersWrapper subProvidersWrapper) { - super(output, requiredTables, subProvidersWrapper.entries); - } - - @Override - protected void validate(@NotNull Map map, @NotNull ValidationContext validationcontext) { - map.forEach((id, table) -> table.validate(validationcontext)); - } -} diff --git a/src/main/java/top/r3944realms/lib39/datagen/provider/SubProvidersWrapper.java b/src/main/java/top/r3944realms/lib39/datagen/provider/SubProvidersWrapper.java deleted file mode 100644 index 43ff20d..0000000 --- a/src/main/java/top/r3944realms/lib39/datagen/provider/SubProvidersWrapper.java +++ /dev/null @@ -1,60 +0,0 @@ -package top.r3944realms.lib39.datagen.provider; - -import net.minecraft.data.loot.LootTableProvider; -import net.minecraft.data.loot.LootTableSubProvider; -import net.minecraft.world.level.storage.loot.parameters.LootContextParamSet; -import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; -import top.r3944realms.lib39.datagen.provider.subprovider.BlockLootTables; - -import java.util.ArrayList; -import java.util.List; - -/** - * The type Sub providers wrapper. - */ -public class SubProvidersWrapper { - /** - * The Entries. - */ - public List entries = new ArrayList<>(); - - /** - * Instantiates a new Sub providers wrapper. - */ - public SubProvidersWrapper() {} - - /** - * Add entry sub providers wrapper. - * - * @param entry the entry - * @return the sub providers wrapper - */ - public SubProvidersWrapper addEntry(LootTableProvider.SubProviderEntry entry) { - entries.add(entry); - return this; - } - - /** - * Add entry sub providers wrapper. - * - * @param subProvider the sub provider - * @param subParamSet the sub param set - * @return the sub providers wrapper - */ - public SubProvidersWrapper addEntry(LootTableSubProvider subProvider, LootContextParamSet subParamSet) { - entries.add(new LootTableProvider.SubProviderEntry(() -> subProvider, subParamSet)); - return this; - } - - /** - * Add block entry sub providers wrapper. - * - * @param blockLootTables the block loot tables - * @return the sub providers wrapper - */ - public SubProvidersWrapper addBlockEntry(BlockLootTables blockLootTables) { - entries.add(new LootTableProvider.SubProviderEntry(() -> blockLootTables, LootContextParamSets.BLOCK)); - return this; - } - -} diff --git a/src/main/java/top/r3944realms/lib39/datagen/provider/subprovider/BlockLootTables.java b/src/main/java/top/r3944realms/lib39/datagen/provider/subprovider/BlockLootTables.java deleted file mode 100644 index 767fa9a..0000000 --- a/src/main/java/top/r3944realms/lib39/datagen/provider/subprovider/BlockLootTables.java +++ /dev/null @@ -1,385 +0,0 @@ -package top.r3944realms.lib39.datagen.provider.subprovider; - -import net.minecraft.advancements.critereon.ItemPredicate; -import net.minecraft.data.loot.BlockLootSubProvider; -import net.minecraft.world.flag.FeatureFlags; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.FlowerPotBlock; -import net.minecraft.world.level.block.state.properties.Property; -import net.minecraft.world.level.storage.loot.LootPool; -import net.minecraft.world.level.storage.loot.LootTable; -import net.minecraft.world.level.storage.loot.entries.LootItem; -import net.minecraft.world.level.storage.loot.functions.ApplyBonusCount; -import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; -import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition; -import net.minecraft.world.level.storage.loot.predicates.MatchTool; -import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; -import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.RegistryObject; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; - -/** - * The type Block loot tables. - */ -@SuppressWarnings("unused") -public class BlockLootTables extends BlockLootSubProvider { - - private final List blockEntries = new ArrayList<>(); - private final DeferredRegister knowBlocks; - - /** - * Instantiates a new Block loot tables. - * - * @param deferredRegister the deferred register - */ - public BlockLootTables(DeferredRegister deferredRegister) { - super(Set.of(), FeatureFlags.REGISTRY.allFlags()); - knowBlocks = deferredRegister; - } - - @Override - protected @NotNull Iterable getKnownBlocks() { - return knowBlocks.getEntries().stream().map(RegistryObject::get).collect(Collectors.toSet()); - } - - // ==================== 流畅 API 构建方法 ==================== - - /** - * 添加自掉落的方块 - * - * @param block the block - */ - public void dropSelf(RegistryObject block) { - addEntry(block, this::createSingleItemTable); - } - - /** - * 批量添加自掉落的方块 - * - * @param blocks the blocks - * @return the block loot tables - */ - @Contract("_ -> this") - @SafeVarargs - public final BlockLootTables dropSelf(RegistryObject @NotNull ... blocks) { - for (RegistryObject block : blocks) { - dropSelf(block); - } - return this; - } - - /** - * 添加需要丝绸之触才掉落的方块 - * - * @param block the block - * @return the block loot tables - */ - public BlockLootTables dropWhenSilkTouch(RegistryObject block) { - return addEntry(block, BlockLootSubProvider::createSilkTouchOnlyTable); - } - - /** - * 添加掉落其他物品的方块 - * - * @param block the block - * @param item the item - * @return the block loot tables - */ - public BlockLootTables dropOther(RegistryObject block, RegistryObject item) { - return addEntry(block, pBlock -> this.createSingleItemTable(item.get())); - } - - /** - * 添加只能被剪子剪下的方块 - * - * @param block the block - * @return the block loot tables - */ - public BlockLootTables dropWhenShears(RegistryObject block) { - return addEntry(block, BlockLootSubProvider::createShearsOnlyDrop); - } - - /** - * 添加矿物的掉落表(支持时运附魔) - * - * @param block the block - * @param oreItem the ore item - * @return the block loot tables - */ - public BlockLootTables dropOre(RegistryObject block, RegistryObject oreItem) { - return addEntry(block, b -> this.createOreDrop(b, oreItem.get())); - } - - /** - * 添加红石矿石掉落表 - * - * @param block the block - * @return the block loot tables - */ - public BlockLootTables dropRedstoneOre(RegistryObject block) { - return addEntry(block, this::createRedstoneOreDrops); - } - - /** - * 添加青金石矿石掉落表 - * - * @param block the block - * @return the block loot tables - */ - public BlockLootTables dropLapisOre(RegistryObject block) { - return addEntry(block, this::createLapisOreDrops); - } - - /** - * 添加铜矿石掉落表 - * - * @param block the block - * @return the block loot tables - */ - public BlockLootTables dropCopperOre(RegistryObject block) { - return addEntry(block, this::createCopperOreDrops); - } - - /** - * 添加地毯类方块的掉落(一次掉落2个) - * - * @param block the block - * @return the block loot tables - */ - public BlockLootTables dropCarpet(RegistryObject block) { - return addEntry(block, b -> LootTable.lootTable() - .withPool(LootPool.lootPool() - .setRolls(ConstantValue.exactly(1)) - .add(LootItem.lootTableItem(b) - .apply(SetItemCountFunction.setCount(ConstantValue.exactly(2.0F)))))); - } - - /** - * 添加台阶方块的掉落 - * - * @param block the block - * @return the block loot tables - */ - public BlockLootTables dropSlab(RegistryObject block) { - return addEntry(block, this::createSlabItemTable); - } - - /** - * 添加门方块的掉落(只掉落下半部分) - * - * @param block the block - * @return the block loot tables - */ - public BlockLootTables dropDoor(RegistryObject block) { - return addEntry(block, this::createDoorTable); - } - - /** - * 添加花盆的掉落 - * - * @param block the block - * @return the block loot tables - */ - public BlockLootTables dropFlowerPot(RegistryObject block) { - return addEntry(block, (pBlock) -> this.createPotFlowerItemTable(((FlowerPotBlock)pBlock).getContent())); - } - - /** - * 添加树叶的掉落 - * - * @param leavesBlock the leaves block - * @param saplingBlock the sapling block - * @param chances the chances - * @return the block loot tables - */ - public BlockLootTables dropLeaves(RegistryObject leavesBlock, - RegistryObject saplingBlock, - float... chances) { - return addEntry(leavesBlock, b -> this.createLeavesDrops(b, saplingBlock.get(), chances)); - } - - /** - * 添加橡树叶的掉落(包含苹果) - * - * @param leavesBlock the leaves block - * @param saplingBlock the sapling block - * @param chances the chances - * @return the block loot tables - */ - public BlockLootTables dropOakLeaves(RegistryObject leavesBlock, - RegistryObject saplingBlock, - float... chances) { - return addEntry(leavesBlock, b -> this.createOakLeavesDrops(b, saplingBlock.get(), chances)); - } - - /** - * 添加农作物的掉落 - * - * @param cropBlock the crop block - * @param cropItem the crop item - * @param seedsItem the seeds item - * @param ageProperty the age property - * @param maxAge the max age - * @return the block loot tables - */ - public BlockLootTables dropCrop(RegistryObject cropBlock, - RegistryObject cropItem, - RegistryObject seedsItem, - Property ageProperty, - int maxAge) { - return addEntry(cropBlock, b -> this.createCropDrops( - b, - cropItem.get(), - seedsItem.get(), - LootItemBlockStatePropertyCondition.hasBlockStateProperties(b) - .setProperties(net.minecraft.advancements.critereon.StatePropertiesPredicate.Builder.properties() - .hasProperty(ageProperty, maxAge)) - )); - } - - /** - * 自定义掉落表 - * - * @param block the block - * @param factory the factory - * @return the block loot tables - */ - public BlockLootTables custom(RegistryObject block, Function factory) { - return addEntry(block, factory); - } - - /** - * 没有掉落 - * - * @param block the block - * @return the block loot tables - */ - public BlockLootTables noDrop(RegistryObject block) { - return addEntry(block, b -> noDrop()); - } - - // ==================== 批量操作方法 ==================== - - /** - * 批量操作一系列方块 - * - * @param blocks the blocks - * @param operation the operation - * @return the block loot tables - */ - public BlockLootTables batch(@NotNull Iterable> blocks, - Function, BlockLootTables> operation) { - for (RegistryObject block : blocks) { - operation.apply(block); - } - return this; - } - - /** - * 对一组方块应用相同的操作 - * - * @param operation the operation - * @param blocks the blocks - * @return the block loot tables - */ - @Contract("_, _ -> this") - @SafeVarargs - public final BlockLootTables applyToAll(Function, BlockLootTables> operation, - RegistryObject @NotNull ... blocks) { - for (RegistryObject block : blocks) { - operation.apply(block); - } - return this; - } - - // ==================== 构建方法 ==================== - - /** - * 构建并返回自身(用于流畅API链式调用) - * - * @return the block loot tables - */ - public BlockLootTables build() { - return this; - } - - @Override - protected void generate() { - for (BlockEntry entry : blockEntries) { - this.add(entry.block.get(), entry.factory); - } - } - - // ==================== 内部类和方法 ==================== - - private BlockLootTables addEntry(RegistryObject block, Function factory) { - blockEntries.add(new BlockEntry(block, factory)); - return this; - } - - private record BlockEntry(RegistryObject block, Function factory) {} - - // ==================== 静态工厂方法 ==================== - - /** - * 创建新的战利品表生成器 - * - * @param deferredRegister the deferred register - * @return the block loot tables - */ - @Contract("_ -> new") - public static @NotNull BlockLootTables create(DeferredRegister deferredRegister) { - return new BlockLootTables(deferredRegister); - } - - /** - * 快速创建基本矿物的掉落表 - * - * @param oreBlock the ore block - * @param oreItem the ore item - * @return the loot table .@ not null builder - */ - public static LootTable.@NotNull Builder simpleOreDrop(Block oreBlock, Item oreItem) { - return LootTable.lootTable() - .withPool(LootPool.lootPool() - .setRolls(ConstantValue.exactly(1)) - .add(LootItem.lootTableItem(oreItem) - .when(MatchTool.toolMatches(ItemPredicate.Builder.item() - .hasEnchantment(new net.minecraft.advancements.critereon.EnchantmentPredicate( - Enchantments.SILK_TOUCH, - net.minecraft.advancements.critereon.MinMaxBounds.Ints.atLeast(1) - ))).invert()) - .apply(SetItemCountFunction.setCount(UniformGenerator.between(1, 1))) - .apply(ApplyBonusCount.addOreBonusCount(Enchantments.BLOCK_FORTUNE)))); - } - - /** - * 快速创建石质方块的掉落表(需要镐子) - * - * @param stoneBlock the stone block - * @param dropItem the drop item - * @return the loot table .@ not null builder - */ - public static LootTable.@NotNull Builder stoneDrop(Block stoneBlock, Item dropItem) { - return LootTable.lootTable() - .withPool(LootPool.lootPool() - .setRolls(ConstantValue.exactly(1)) - .add(LootItem.lootTableItem(dropItem) - .when(MatchTool.toolMatches(ItemPredicate.Builder.item() - .hasEnchantment(new net.minecraft.advancements.critereon.EnchantmentPredicate( - Enchantments.SILK_TOUCH, - net.minecraft.advancements.critereon.MinMaxBounds.Ints.atLeast(1) - )))))); - } -} \ No newline at end of file diff --git a/src/main/java/top/r3944realms/lib39/datagen/value/ILangKeyValue.java b/src/main/java/top/r3944realms/lib39/datagen/value/ILangKeyValue.java deleted file mode 100644 index 241aaa1..0000000 --- a/src/main/java/top/r3944realms/lib39/datagen/value/ILangKeyValue.java +++ /dev/null @@ -1,22 +0,0 @@ -package top.r3944realms.lib39.datagen.value; - -/** - * The interface Lang key value. - */ -public interface ILangKeyValue { - /** - * Gets key. - * - * @return the key - */ - String getKey(); - - /** - * Gets lang. - * - * @param locale the locale - * @return the lang - */ - String getLang(McLocale locale); - -} diff --git a/src/main/java/top/r3944realms/lib39/datagen/value/ILangKeyValueCollection.java b/src/main/java/top/r3944realms/lib39/datagen/value/ILangKeyValueCollection.java deleted file mode 100644 index 4785e4d..0000000 --- a/src/main/java/top/r3944realms/lib39/datagen/value/ILangKeyValueCollection.java +++ /dev/null @@ -1,30 +0,0 @@ -package top.r3944realms.lib39.datagen.value; - -import org.jetbrains.annotations.NotNull; - -import java.util.List; - -/** - * The interface Lang key value collection. - */ -public interface ILangKeyValueCollection { - - /** - * Gets values. - * - * @return the values - */ - List getValues(); - - /** - * Gets lang. - * - * @param locale the locale - * @param key the key - * @return the lang - */ - static String getLang(McLocale locale, @NotNull ILangKeyValue key) { - return key.getLang(locale); - } - -} diff --git a/src/main/java/top/r3944realms/lib39/datagen/value/ILocaleEntry.java b/src/main/java/top/r3944realms/lib39/datagen/value/ILocaleEntry.java deleted file mode 100644 index ea4a83b..0000000 --- a/src/main/java/top/r3944realms/lib39/datagen/value/ILocaleEntry.java +++ /dev/null @@ -1,22 +0,0 @@ -package top.r3944realms.lib39.datagen.value; - -import java.util.Locale; - -/** - * The interface Locale entry. - */ -public interface ILocaleEntry { - /** - * Mc code string. - * - * @return the string - */ - String mcCode(); - - /** - * Java locale locale. - * - * @return the locale - */ - Locale javaLocale(); -} diff --git a/src/main/java/top/r3944realms/lib39/datagen/value/LangKeyValue.java b/src/main/java/top/r3944realms/lib39/datagen/value/LangKeyValue.java deleted file mode 100644 index 84c7769..0000000 --- a/src/main/java/top/r3944realms/lib39/datagen/value/LangKeyValue.java +++ /dev/null @@ -1,617 +0,0 @@ -package top.r3944realms.lib39.datagen.value; - -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; - -import java.util.Objects; -import java.util.function.Supplier; - -/** - * The type Lang key value. - */ -@SuppressWarnings("unused") -public class LangKeyValue implements ILangKeyValue { - /** - * The Supplier. - */ - protected final Supplier supplier; - /** - * The Key. - */ - protected final String key; - /** - * The Us en. - */ - protected final String US_EN; - /** - * The Sim cn. - */ - protected final String SIM_CN; - /** - * The Tra cn. - */ - protected final String TRA_CN; - /** - * The Lzh. - */ - protected final String LZH; - /** - * The Default. - */ - protected final Boolean Default; - /** - * The Mpe. - */ - protected final ModPartEnum MPE; - - /** - * Instantiates a new Lang key value. - * - * @param builder the builder - */ - protected LangKeyValue(Builder builder) { - this.supplier = builder.supplier; - this.key = builder.key; - this.MPE = builder.MPE; - this.US_EN = builder.US_EN; - this.SIM_CN = builder.SIM_CN; - this.TRA_CN = builder.TRA_CN; - this.LZH = builder.LZH; - this.Default = builder.Default; - } - - /** - * Builder for LangKeyValue - */ - public static class Builder { - private Supplier supplier; - private String key; - private ModPartEnum MPE; - private String US_EN; - private String SIM_CN; - private String TRA_CN; - private String LZH; - private Boolean Default = false; - - /** - * Set supplier - * - * @param supplier the supplier - * @return the builder - */ - @Contract("_ -> this") - public Builder supplier(Supplier supplier) { - this.supplier = supplier; - return this; - } - - /** - * Set key - * - * @param key the key - * @return the builder - */ - @Contract("_ -> this") - public Builder key(String key) { - this.key = key; - return this; - } - - /** - * Set mod part enum - * - * @param MPE the mpe - * @return the builder - */ - @Contract("_ -> this") - public Builder MPE(ModPartEnum MPE) { - this.MPE = MPE; - return this; - } - - /** - * Set US English translation - * - * @param US_EN the us en - * @return the builder - */ - @Contract("_ -> this") - public Builder US_EN(String US_EN) { - this.US_EN = US_EN; - return this; - } - - /** - * Set Simplified Chinese translation - * - * @param SIM_CN the sim cn - * @return the builder - */ - @Contract("_ -> this") - public Builder SIM_CN(String SIM_CN) { - this.SIM_CN = SIM_CN; - return this; - } - - /** - * Set Traditional Chinese translation - * - * @param TRA_CN the tra cn - * @return the builder - */ - @Contract("_ -> this") - public Builder TRA_CN(String TRA_CN) { - this.TRA_CN = TRA_CN; - return this; - } - - /** - * Set Literary Chinese translation - * - * @param LZH the lzh - * @return the builder - */ - @Contract("_ -> this") - public Builder LZH(String LZH) { - this.LZH = LZH; - return this; - } - - /** - * Set as default - * - * @param isDefault the is default - * @return the builder - */ - @Contract("_ -> this") - public Builder isDefault(Boolean isDefault) { - this.Default = isDefault; - return this; - } - - /** - * Build the LangKeyValue instance - * - * @return the lang key value - */ - @NotNull - public LangKeyValue build() { - // Validate required fields - if (MPE == null) { - throw new IllegalStateException("MPE (ModPartEnum) is required"); - } - if (US_EN == null) { - throw new IllegalStateException("US_EN translation is required"); - } - if (SIM_CN == null) { - throw new IllegalStateException("SIM_CN translation is required"); - } - if (TRA_CN == null) { - throw new IllegalStateException("TRA_CN translation is required"); - } - // Either supplier or key must be provided, but not both - if (supplier == null && key == null) { - throw new IllegalStateException("Either supplier or key must be provided"); - } - if (supplier != null && key != null) { - throw new IllegalStateException("Cannot provide both supplier and key"); - } - return new LangKeyValue(this); - } - } - - /** - * Create a new builder instance - * - * @return the builder - */ - @Contract(" -> new") - public static @NotNull Builder builder() { - return new Builder(); - } - - /** - * Create builder with supplier - * - * @param supplier the supplier - * @return the builder - */ - @Contract("_ -> new") - public static @NotNull Builder withSupplier(Supplier supplier) { - return new Builder().supplier(supplier); - } - - /** - * Create builder with key - * - * @param key the key - * @return the builder - */ - @Contract("_ -> new") - public static @NotNull Builder withKey(String key) { - return new Builder().key(key); - } - - // 保持原有的静态工厂方法作为便捷方法 - - /** - * Of supplier lang key value. - * - * @param supplier the supplier - * @param MPE the mpe - * @param US_EN the us en - * @param SIM_CN the sim cn - * @param TRA_CN the tra cn - * @return the lang key value - */ - @Contract(value = "_, _, _, _, _ -> new", pure = true) - public static @NotNull LangKeyValue ofSupplier(Supplier supplier, ModPartEnum MPE, - String US_EN, String SIM_CN, String TRA_CN) { - return builder() - .supplier(supplier) - .MPE(MPE) - .US_EN(US_EN) - .SIM_CN(SIM_CN) - .TRA_CN(TRA_CN) - .build(); - } - - /** - * Of supplier lang key value. - * - * @param supplier the supplier - * @param MPE the mpe - * @param US_EN the us en - * @param SIM_CN the sim cn - * @param TRA_CN the tra cn - * @param isDefault the is default - * @return the lang key value - */ - @Contract(value = "_, _, _, _, _, _ -> new", pure = true) - public static @NotNull LangKeyValue ofSupplier(Supplier supplier, ModPartEnum MPE, - String US_EN, String SIM_CN, String TRA_CN, boolean isDefault) { - return builder() - .supplier(supplier) - .MPE(MPE) - .US_EN(US_EN) - .SIM_CN(SIM_CN) - .TRA_CN(TRA_CN) - .isDefault(isDefault) - .build(); - } - - /** - * Of supplier lang key value. - * - * @param supplier the supplier - * @param MPE the mpe - * @param US_EN the us en - * @param SIM_CN the sim cn - * @param TRA_CN the tra cn - * @param LZH the lzh - * @return the lang key value - */ - @Contract(value = "_, _, _, _, _, _ -> new", pure = true) - public static @NotNull LangKeyValue ofSupplier(Supplier supplier, ModPartEnum MPE, - String US_EN, String SIM_CN, String TRA_CN, String LZH) { - return builder() - .supplier(supplier) - .MPE(MPE) - .US_EN(US_EN) - .SIM_CN(SIM_CN) - .TRA_CN(TRA_CN) - .LZH(LZH) - .build(); - } - - /** - * Of supplier lang key value. - * - * @param supplier the supplier - * @param MPE the mpe - * @param US_EN the us en - * @param SIM_CN the sim cn - * @param TRA_CN the tra cn - * @param LZH the lzh - * @param isDefault the is default - * @return the lang key value - */ - @Contract(value = "_, _, _, _, _, _, _ -> new", pure = true) - public static @NotNull LangKeyValue ofSupplier(Supplier supplier, ModPartEnum MPE, - String US_EN, String SIM_CN, String TRA_CN, String LZH, boolean isDefault) { - return builder() - .supplier(supplier) - .MPE(MPE) - .US_EN(US_EN) - .SIM_CN(SIM_CN) - .TRA_CN(TRA_CN) - .LZH(LZH) - .isDefault(isDefault) - .build(); - } - - /** - * Of key lang key value. - * - * @param key the key - * @param MPE the mpe - * @param US_EN the us en - * @param SIM_CN the sim cn - * @param TRA_CN the tra cn - * @return the lang key value - */ - @Contract(value = "_, _, _, _, _ -> new", pure = true) - public static @NotNull LangKeyValue ofKey(String key, ModPartEnum MPE, - String US_EN, String SIM_CN, String TRA_CN) { - return builder() - .key(key) - .MPE(MPE) - .US_EN(US_EN) - .SIM_CN(SIM_CN) - .TRA_CN(TRA_CN) - .build(); - } - - /** - * Of key lang key value. - * - * @param key the key - * @param MPE the mpe - * @param US_EN the us en - * @param SIM_CN the sim cn - * @param TRA_CN the tra cn - * @param isDefault the is default - * @return the lang key value - */ - @Contract(value = "_, _, _, _, _, _ -> new", pure = true) - public static @NotNull LangKeyValue ofKey(String key, ModPartEnum MPE, - String US_EN, String SIM_CN, String TRA_CN, boolean isDefault) { - return builder() - .key(key) - .MPE(MPE) - .US_EN(US_EN) - .SIM_CN(SIM_CN) - .TRA_CN(TRA_CN) - .isDefault(isDefault) - .build(); - } - - /** - * Of key lang key value. - * - * @param key the key - * @param MPE the mpe - * @param US_EN the us en - * @param SIM_CN the sim cn - * @param TRA_CN the tra cn - * @param LZH the lzh - * @return the lang key value - */ - @Contract(value = "_, _, _, _, _, _ -> new", pure = true) - public static @NotNull LangKeyValue ofKey(String key, ModPartEnum MPE, - String US_EN, String SIM_CN, String TRA_CN, String LZH) { - return builder() - .key(key) - .MPE(MPE) - .US_EN(US_EN) - .SIM_CN(SIM_CN) - .TRA_CN(TRA_CN) - .LZH(LZH) - .build(); - } - - /** - * Of key lang key value. - * - * @param key the key - * @param MPE the mpe - * @param US_EN the us en - * @param SIM_CN the sim cn - * @param TRA_CN the tra cn - * @param LZH the lzh - * @param isDefault the is default - * @return the lang key value - */ - @Contract(value = "_, _, _, _, _, _, _ -> new", pure = true) - public static @NotNull LangKeyValue ofKey(String key, ModPartEnum MPE, - String US_EN, String SIM_CN, String TRA_CN, String LZH, boolean isDefault) { - return builder() - .key(key) - .MPE(MPE) - .US_EN(US_EN) - .SIM_CN(SIM_CN) - .TRA_CN(TRA_CN) - .LZH(LZH) - .isDefault(isDefault) - .build(); - } - - /** - * Copy of lang key value. - * - * @param supplier the supplier - * @param modPartEnum the mod part enum - * @param other the other - * @return the lang key value - */ - public static @NotNull LangKeyValue copyOf(Supplier supplier, ModPartEnum modPartEnum, @NotNull LangKeyValue other) { - return builder() - .supplier(supplier) - .MPE(modPartEnum) - .US_EN(other.US_EN) - .SIM_CN(other.SIM_CN) - .TRA_CN(other.TRA_CN) - .LZH(other.LZH) - .build(); - } - - /** - * Copy of lang key value. - * - * @param key the key - * @param modPartEnum the mod part enum - * @param other the other - * @return the lang key value - */ - public static @NotNull LangKeyValue copyOf(String key, ModPartEnum modPartEnum, @NotNull LangKeyValue other) { - return builder() - .key(key) - .MPE(modPartEnum) - .US_EN(other.US_EN) - .SIM_CN(other.SIM_CN) - .TRA_CN(other.TRA_CN) - .LZH(other.LZH) - .build(); - } - - /** - * Copy of lang key value. - * - * @param supplier the supplier - * @param modPartEnum the mod part enum - * @param other the other - * @param isDefault the is default - * @return the lang key value - */ - public static @NotNull LangKeyValue copyOf(Supplier supplier, ModPartEnum modPartEnum, @NotNull LangKeyValue other, boolean isDefault) { - return builder() - .supplier(supplier) - .MPE(modPartEnum) - .US_EN(other.US_EN) - .SIM_CN(other.SIM_CN) - .TRA_CN(other.TRA_CN) - .LZH(other.LZH) - .isDefault(isDefault) - .build(); - } - - /** - * Copy of lang key value. - * - * @param key the key - * @param modPartEnum the mod part enum - * @param other the other - * @param isDefault the is default - * @return the lang key value - */ - public static @NotNull LangKeyValue copyOf(String key, ModPartEnum modPartEnum, @NotNull LangKeyValue other, boolean isDefault) { - return builder() - .key(key) - .MPE(modPartEnum) - .US_EN(other.US_EN) - .SIM_CN(other.SIM_CN) - .TRA_CN(other.TRA_CN) - .LZH(other.LZH) - .isDefault(isDefault) - .build(); - } - - - - @Override - public String getKey() { - return Objects.requireNonNullElseGet(key, () -> switch (MPE) { - case ITEM -> getItem().getDescriptionId(); - case BLOCK -> getBlock().getDescriptionId(); - default -> - throw new UnsupportedOperationException("The Key value is NULL! Please use the correct constructor and write the parameters correctly"); - }); - } - - @Override - public String getLang(@NotNull McLocale locale) { - return switch (locale) { - case EN_US, JA_JP, KO_KR, RU_RU, DE_DE, ES_ES, FR_FR -> US_EN; - case ZH_CN -> SIM_CN; - case ZH_TW -> TRA_CN; - case LZH -> LZH != null ? LZH : TRA_CN; // Fallback to TRA_CN if LZH is null - }; - } - - /** - * Gets supplier. - * - * @return the supplier - */ -// Getters for all fields - public Supplier getSupplier() { return supplier; } - - /** - * Gets us en. - * - * @return the us en - */ - public String getUS_EN() { return US_EN; } - - /** - * Gets sim cn. - * - * @return the sim cn - */ - public String getSIM_CN() { return SIM_CN; } - - /** - * Gets tra cn. - * - * @return the tra cn - */ - public String getTRA_CN() { return TRA_CN; } - - /** - * Gets lzh. - * - * @return the lzh - */ - public String getLZH() { return LZH; } - - /** - * Is default boolean. - * - * @return the boolean - */ - public Boolean isDefault() { return Default; } - - /** - * Gets mpe. - * - * @return the mpe - */ - public ModPartEnum getMPE() { return MPE; } - - /** - * Gets item. - * - * @return the item - * @throws IllegalArgumentException the illegal argument exception - */ - public Item getItem() throws IllegalArgumentException { - if(MPE == ModPartEnum.ITEM) { - return (Item) supplier.get(); - } - else throw new IllegalCallerException("Target's MPE is not ModPartEnum#ITEM."); - } - - /** - * Gets block. - * - * @return the block - * @throws IllegalArgumentException the illegal argument exception - */ - public Block getBlock() throws IllegalArgumentException { - if(MPE == ModPartEnum.BLOCK) { - return (Block) supplier.get(); - } - else throw new IllegalCallerException("Target's MPE is not ModPartEnum#BLOCK."); - } - @Override - public String toString() { - return "LangKeyValue{" + - "key='" + key + '\'' + - ", US_EN='" + US_EN + '\'' + - ", SIM_CN='" + SIM_CN + '\'' + - ", MPE=" + MPE + - '}'; - } -} \ No newline at end of file diff --git a/src/main/java/top/r3944realms/lib39/datagen/value/McLocale.java b/src/main/java/top/r3944realms/lib39/datagen/value/McLocale.java deleted file mode 100644 index 91cd9b6..0000000 --- a/src/main/java/top/r3944realms/lib39/datagen/value/McLocale.java +++ /dev/null @@ -1,63 +0,0 @@ -package top.r3944realms.lib39.datagen.value; - -import java.util.Locale; - -/** - * The enum Mc locale. - */ -public enum McLocale implements ILocaleEntry { - /** - * En us mc locale. - */ - EN_US("en_us", Locale.US), - /** - * Zh cn mc locale. - */ - ZH_CN("zh_cn", Locale.SIMPLIFIED_CHINESE), - /** - * Zh tw mc locale. - */ - ZH_TW("zh_tw", Locale.TRADITIONAL_CHINESE), - /** - * The Lzh. - */ - LZH("lzh", new Locale("lzh", "ZH")), - /** - * Ja jp mc locale. - */ - JA_JP("ja_jp", Locale.JAPAN), - /** - * Ko kr mc locale. - */ - KO_KR("ko_kr", Locale.KOREA), - /** - * The Ru ru. - */ - RU_RU("ru_ru", new Locale("ru", "RU")), - /** - * Fr fr mc locale. - */ - FR_FR("fr_fr", Locale.FRANCE), - /** - * De de mc locale. - */ - DE_DE("de_de", Locale.GERMANY), - /** - * The Es es. - */ - ES_ES("es_es", new Locale("es", "ES")); - - private final String mcCode; - private final Locale javaLocale; - - McLocale(String mcCode, Locale javaLocale) { - this.mcCode = mcCode; - this.javaLocale = javaLocale; - } - - @Override - public String mcCode() { return mcCode; } - - @Override - public Locale javaLocale() { return javaLocale; } -} diff --git a/src/main/java/top/r3944realms/lib39/datagen/value/ModPartEnum.java b/src/main/java/top/r3944realms/lib39/datagen/value/ModPartEnum.java deleted file mode 100644 index fe8ea91..0000000 --- a/src/main/java/top/r3944realms/lib39/datagen/value/ModPartEnum.java +++ /dev/null @@ -1,173 +0,0 @@ -package top.r3944realms.lib39.datagen.value; - -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * 模组各部分的类型枚举,用于数据生成与分类。 - */ -public enum ModPartEnum { - /** - * 默认/未指定类型 - */ - DEFAULT, - - /** - * 物品 - */ - ITEM(Item.class), - - /** - * 方块 - */ - BLOCK(Block.class), - - /** - * 附魔 - */ - ENCHANTMENT, - - /** - * 进度标题 - */ - ADVANCEMENT_TITLE, - - /** - * 成就描述 - */ - ADVANCEMENT_DESCRIPTION, - - /** - * 创造模式物品栏 - */ - CREATIVE_TAB, - - /** - * 配置项 - */ - CONFIG, - - /** - * 实体(生物、载具等) - */ - ENTITY, - - /** - * 图形界面 - */ - GUI, - /** - * 容器 - */ - CONTAINER, - /** - * 画作描述 - */ - PAINTING_TITLE, - /** - * 画作作者 - */ - PAINTING_AUTHOR, - - /** - * 标题 - */ - TITLE, - - /** - * 名称 - */ - NAME, - - /** - * 游戏规则(/gamerule) - */ - GAME_RULE, - - /** - * 描述文本 - */ - DESCRIPTION, - - /** - * 一般信息 - */ - INFO, - - /** - * 消息(聊天、提示等) - */ - MESSAGE, - - /** - * 生物群系 - */ - BIOME, - - /** - * 命令 - */ - COMMAND, - - /** - * 声音资源 - */ - SOUND; - ; - @Nullable - private final Class clazz; - ModPartEnum() { - clazz = null; - } - ModPartEnum(@Nullable Class clazz) { - this.clazz = clazz; - } - - /** - * Gets full key. - * - * @param modId the mod id - * @param name the name - * @return the full key - */ - @Contract(pure = true) - public @NotNull String getFullKey(String modId, String name) { - return switch (this) { - case ITEM -> "item." + modId + "." + name; - case BLOCK -> "block." + modId + "." + name; - case ENCHANTMENT -> "enchantment." + modId + "." + name; - case ADVANCEMENT_TITLE -> "advancement." + modId + "." + name + ".title"; - case ADVANCEMENT_DESCRIPTION -> "advancement." + modId + "." + name + ".description"; - case CREATIVE_TAB -> "creativetab." + modId + "." + name; - case BIOME -> "biome." + modId + "." + name; - case CONFIG -> "config." + modId + "." + name; - case ENTITY -> "entity." + modId + "." + name; - case GUI -> "gui." + modId + "." + name; - case CONTAINER -> "container." + modId + "." + name; - case PAINTING_AUTHOR -> "painting." + modId + "." + name + ".author"; - case PAINTING_TITLE -> "painting." + modId + "." + name + ".title"; - case TITLE -> "title." + modId + "." + name; - case NAME -> "name." + modId + "." + name; - case GAME_RULE -> "gamerule."+ modId + "." + name; - case DESCRIPTION -> "description." + modId + "." + name; - case INFO -> "info." + modId + "." + name; - case MESSAGE -> "message." + modId + "." + name; - case COMMAND -> "command." + modId + "." + name; - case SOUND -> "sound." + modId + "." + name; - default -> modId + "." + name; - }; - } - - - /** - * Gets clazz. - * - * @return the clazz - */ - public @Nullable Class getClazz() { - return clazz; - } -} diff --git a/src/main/java/top/r3944realms/lib39/example/Lib39Example.java b/src/main/java/top/r3944realms/lib39/example/Lib39Example.java deleted file mode 100644 index 78c6902..0000000 --- a/src/main/java/top/r3944realms/lib39/example/Lib39Example.java +++ /dev/null @@ -1,56 +0,0 @@ -package top.r3944realms.lib39.example; - -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import top.r3944realms.lib39.example.core.event.ExCommonEventHandler; -import top.r3944realms.lib39.example.core.network.ExNetworkHandler; -import top.r3944realms.lib39.example.core.register.ExLib39Items; - -/** - * The type Lib 39 example. - */ -public class Lib39Example { - private static boolean registered = false; - - /** - * Instantiates a new Lib 39 example. - */ - public Lib39Example() { - if (!registered) { - init(); - registerToEventBus(); - registered = true; - } - } - private void init() { - IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); - ExLib39Items.register(modEventBus); - ExNetworkHandler.register(); - } - - private void registerToEventBus() { - IEventBus modBus = FMLJavaModLoadingContext.get().getModEventBus(); - IEventBus gameBus = MinecraftForge.EVENT_BUS; -// DistExecutor.unsafeCallWhenOn(Dist.CLIENT, () -> { -// modBus.register(ExClientEventHandler.Mod.class); -// gameBus.register(ExClientEventHandler.Game.class); -// return null; -// }); -// DistExecutor.unsafeCallWhenOn(Dist.DEDICATED_SERVER, () -> { -// modBus.register(ExServerEventHandler.Mod.class); -// gameBus.register(ExServerEventHandler.Game.class); -// return null; -// }); - modBus.register(ExCommonEventHandler.Mod.class); - gameBus.register(ExCommonEventHandler.Game.class); - - } - - /** - * Demonstrate feature. - */ - public void demonstrateFeature() { - - } -} diff --git a/src/main/java/top/r3944realms/lib39/example/client/screen/ForgeScreen.java b/src/main/java/top/r3944realms/lib39/example/client/screen/ForgeScreen.java deleted file mode 100644 index 3d4c634..0000000 --- a/src/main/java/top/r3944realms/lib39/example/client/screen/ForgeScreen.java +++ /dev/null @@ -1,127 +0,0 @@ -package top.r3944realms.lib39.example.client.screen; - -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.Renderable; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.network.chat.Component; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; -import org.joml.Vector2f; -import top.r3944realms.lib39.client.gui.component.WheelWidget; -import top.r3944realms.lib39.util.lang.FourConsumer; -import top.r3944realms.lib39.util.lang.Pair; - -import java.util.List; -import java.util.Objects; - -import static top.r3944realms.lib39.client.gui.component.WheelWidget.IGNORE_CURSOR_MOVE_LENGTH; - -/** - * The type Forge screen. - */ -public class ForgeScreen extends Screen { - private final LocalPlayer player = Objects.requireNonNull(Minecraft.getInstance().player); - private final InteractionHand hand; - private final int mode; - - /** - * The Wheel. - */ - public WheelWidget wheel; - - /** - * Instantiates a new Forge screen. - * - * @param hand the hand - * @param mode the mode - */ - public ForgeScreen(InteractionHand hand, int mode) { - super(Component.literal("Test")); - this.hand = hand; - this.mode = mode; - } - - @Override - protected void init() { - int leftPos = (this.width - 75) / 2; - int topPos = (this.height - 75) / 2; - ItemStack holding = player.getItemInHand(this.hand); - WheelWidget wheel = new WheelWidget( - leftPos, topPos, 75, 75, - 12.5f, 32.5f, 0.75f, - List.of( - Pair.of( - Component.literal("auto"), - renderItem(holding)), - Pair.of( - Component.literal("axe"), - renderItem(holding)), - Pair.of( - Component.literal("shovel"), - renderItem(holding)), - Pair.of( - Component.literal("hoe"), - renderItem(holding)), - Pair.of( - Component.literal("pickaxe"), - renderItem(holding)) - ) - ).setCurrentIndex(this.wheel != null ? this.wheel.getCurrentSectionIndex() : this.mode); - this.clearWidgets(); - this.wheel = this.addRenderableWidget(wheel); - } - - @Contract(pure = true) - private static @NotNull FourConsumer renderItem(ItemStack holding) { - return (graphics, pose, width, height) -> { - ItemStack stack = holding.copy(); - graphics.renderItem(stack, 2, 2, 9910597); - }; - } - @Override - public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { - if (wheel != null && wheel.isClosingAnimationStarted()) return true; - float screenCenterX = this.width / 2f; - float screenCenterY = this.height / 2f; - Vector2f cursorVec2 = new Vector2f( - (float) mouseX - screenCenterX, - (float) mouseY - screenCenterY - ); - if (cursorVec2.length() < IGNORE_CURSOR_MOVE_LENGTH) { - return true; - } - return super.mouseDragged(mouseX, mouseY, button, dragX, dragY); - } - - @Override - public boolean mouseReleased(double mouseX, double mouseY, int button) { - if (wheel != null ) { - wheel.onClosing(); - } - return super.mouseReleased(mouseX, mouseY, button); - } - - @Override - public void removed() { - super.removed(); - } - - - @Override - public void render(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { - for (Renderable renderable : this.renderables) { - renderable.render(guiGraphics, mouseX, mouseY, partialTick); - } - } - - @Override - public boolean isPauseScreen() { - return false; - } - -} diff --git a/src/main/java/top/r3944realms/lib39/example/compat/Lib39Compat.java b/src/main/java/top/r3944realms/lib39/example/compat/Lib39Compat.java deleted file mode 100644 index e212b6c..0000000 --- a/src/main/java/top/r3944realms/lib39/example/compat/Lib39Compat.java +++ /dev/null @@ -1,58 +0,0 @@ -package top.r3944realms.lib39.example.compat; - -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import org.jetbrains.annotations.NotNull; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.core.compat.ICompat; - -/** - * The type Lib 39 compat. - */ -public class Lib39Compat implements ICompat { - boolean initialized = false; - /** - * The constant INSTANCE. - */ - public static Lib39Compat INSTANCE = new Lib39Compat(); - /** - * The constant ID. - */ - public static ResourceLocation ID = Lib39.rl("lib39"); - - @Override - public void setInitialize(boolean initialize) { - this.initialized = initialize; - } - - @Override - public boolean isInitialized() { - return initialized; - } - - @Override - public ResourceLocation id() { - return ID; - } - - @Override - public boolean isModLoaded() { - return ModList.get().isLoaded("lib39"); - } - - @Override - public void initialize() { - - } - - @Override - public void addCommonModListener(@NotNull IEventBus modBus) { - modBus.addListener(this::onSetUp); - } - - private void onSetUp (@NotNull FMLCommonSetupEvent event) { - event.enqueueWork(() -> Lib39.LOGGER.info("Loading Lib39 Compat")); - } -} diff --git a/src/main/java/top/r3944realms/lib39/example/compat/Lib39CompatManager.java b/src/main/java/top/r3944realms/lib39/example/compat/Lib39CompatManager.java deleted file mode 100644 index 436d21b..0000000 --- a/src/main/java/top/r3944realms/lib39/example/compat/Lib39CompatManager.java +++ /dev/null @@ -1,18 +0,0 @@ -package top.r3944realms.lib39.example.compat; - -import net.minecraftforge.eventbus.api.IEventBus; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.core.compat.CompatManager; - -public class Lib39CompatManager extends CompatManager { - /** - * Instantiates a new Compat manager. - * - * @param path the path - * @param modEventBus the mod event bus - * @param gameEventBus the game event bus - */ - public Lib39CompatManager(String path, IEventBus modEventBus, IEventBus gameEventBus) { - super(Lib39.rl(path), modEventBus, gameEventBus); - } -} diff --git a/src/main/java/top/r3944realms/lib39/example/content/capability/AbstractedTestSyncData.java b/src/main/java/top/r3944realms/lib39/example/content/capability/AbstractedTestSyncData.java deleted file mode 100644 index 16cc09a..0000000 --- a/src/main/java/top/r3944realms/lib39/example/content/capability/AbstractedTestSyncData.java +++ /dev/null @@ -1,207 +0,0 @@ -package top.r3944realms.lib39.example.content.data; - -import net.minecraft.resources.ResourceLocation; -import top.r3944realms.lib39.core.sync.NBTEntitySyncData; - -/** - * The type Abstracted test sync data. - */ -@SuppressWarnings("unused") -public abstract class AbstractedTestSyncData extends NBTEntitySyncData { - /** - * Instantiates a new Nbt sync data. - * - * @param id the id - */ - protected AbstractedTestSyncData(ResourceLocation id) { - super(id); - } - - /** - * Gets test string. - * - * @return the test string - */ - abstract String getTestString(); - - /** - * Sets test string. - * - * @param value the value - */ - abstract void setTestString(String value); - - /** - * Gets test int. - * - * @return the test int - */ - abstract int getTestInt(); - - /** - * Sets test int. - * - * @param value the value - */ - abstract void setTestInt(int value); - - /** - * Is test boolean boolean. - * - * @return the boolean - */ - abstract boolean isTestBoolean(); - - /** - * Sets test boolean. - * - * @param value the value - */ - abstract void setTestBoolean(boolean value); - - /** - * Gets test double. - * - * @return the test double - */ - abstract double getTestDouble(); - - /** - * Sets test double. - * - * @param value the value - */ - abstract void setTestDouble(double value); - - /** - * Gets counter. - * - * @return the counter - */ -// 计数器,用于测试数据变化 - abstract int getCounter(); - - /** - * Increment counter. - */ - abstract void incrementCounter(); - - /** - * Gets last sync time. - * - * @return the last sync time - */ -// 时间戳,用于测试同步时机 - abstract long getLastSyncTime(); - - /** - * Update sync time. - */ - abstract void updateSyncTime(); - - /** - * Gets custom data. - * - * @return the custom data - */ -// 自定义对象测试 - abstract TestData getCustomData(); - - /** - * Sets custom data. - * - * @param data the data - */ - abstract void setCustomData(TestData data); - - /** - * Validate data boolean. - * - * @return the boolean - */ -// 验证数据完整性 - abstract boolean validateData(); - - /** - * 测试数据对象 - */ - public static class TestData { - private String name; - private int value; - private boolean flag; - - /** - * Instantiates a new Test data. - */ - public TestData() {} - - /** - * Instantiates a new Test data. - * - * @param name the name - * @param value the value - * @param flag the flag - */ - public TestData(String name, int value, boolean flag) { - this.name = name; - this.value = value; - this.flag = flag; - } - - /** - * Gets name. - * - * @return the name - */ -// getters and setters - public String getName() { return name; } - - /** - * Sets name. - * - * @param name the name - */ - public void setName(String name) { this.name = name; } - - /** - * Gets value. - * - * @return the value - */ - public int getValue() { return value; } - - /** - * Sets value. - * - * @param value the value - */ - public void setValue(int value) { this.value = value; } - - /** - * Is flag boolean. - * - * @return the boolean - */ - public boolean isFlag() { return flag; } - - /** - * Sets flag. - * - * @param flag the flag - */ - public void setFlag(boolean flag) { this.flag = flag; } - - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (!(obj instanceof TestData other)) return false; - return value == other.value && flag == other.flag && - java.util.Objects.equals(name, other.name); - } - - @Override - public int hashCode() { - return java.util.Objects.hash(name, value, flag); - } - } -} diff --git a/src/main/java/top/r3944realms/lib39/example/content/capability/ExCapabilityHandler.java b/src/main/java/top/r3944realms/lib39/example/content/capability/ExCapabilityHandler.java deleted file mode 100644 index a65ea21..0000000 --- a/src/main/java/top/r3944realms/lib39/example/content/capability/ExCapabilityHandler.java +++ /dev/null @@ -1,40 +0,0 @@ -package top.r3944realms.lib39.example.content.data; - -import net.minecraft.world.entity.Entity; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.CapabilityManager; -import net.minecraftforge.common.capabilities.CapabilityToken; -import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; -import net.minecraftforge.event.AttachCapabilitiesEvent; -import org.jetbrains.annotations.NotNull; - -/** - * The type Ex capability handler. - */ -public class ExCapabilityHandler { - /** - * The constant TEST_CAP. - */ - public static final Capability TEST_CAP = CapabilityManager.get(new CapabilityToken<>() {}); - - /** - * Register capability. - * - * @param event the event - */ - public static void registerCapability(@NotNull RegisterCapabilitiesEvent event) { - event.register(AbstractedTestSyncData.class); - } - - /** - * Attach capability. - * - * @param event the event - */ - public static void attachCapability(@NotNull AttachCapabilitiesEvent event) { - Object object = event.getObject(); - if(object instanceof Entity entity ) { - event.addCapability(TestSyncCapProvider.TEST_SYNC_REL, new TestSyncCapProvider(entity)); - } - } -} diff --git a/src/main/java/top/r3944realms/lib39/example/content/capability/TestSyncCapProvider.java b/src/main/java/top/r3944realms/lib39/example/content/capability/TestSyncCapProvider.java deleted file mode 100644 index b02addf..0000000 --- a/src/main/java/top/r3944realms/lib39/example/content/capability/TestSyncCapProvider.java +++ /dev/null @@ -1,49 +0,0 @@ -package top.r3944realms.lib39.example.content.data; - -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.Entity; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ICapabilitySerializable; -import net.minecraftforge.common.util.LazyOptional; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import top.r3944realms.lib39.Lib39; - -/** - * The type Test sync cap provider. - */ -public class TestSyncCapProvider implements ICapabilitySerializable { - - /** - * The constant TEST_SYNC_REL. - */ - public static final ResourceLocation TEST_SYNC_REL = Lib39.rl(Lib39.MOD_ID, "test_sync_data"); - private final AbstractedTestSyncData instance; - private final LazyOptional optional; - - /** - * Instantiates a new Test sync cap provider. - * - * @param entity the entity - */ - public TestSyncCapProvider(Entity entity) { - this.instance = new TestSyncData(entity); - this.optional = LazyOptional.of(() -> instance); - } - @Override - public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { - return ExCapabilityHandler.TEST_CAP.orEmpty(cap, optional); - } - - @Override - public CompoundTag serializeNBT() { - return instance.serializeNBT(); - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - instance.deserializeNBT(nbt); - } -} diff --git a/src/main/java/top/r3944realms/lib39/example/content/capability/TestSyncData.java b/src/main/java/top/r3944realms/lib39/example/content/capability/TestSyncData.java deleted file mode 100644 index 0b91786..0000000 --- a/src/main/java/top/r3944realms/lib39/example/content/capability/TestSyncData.java +++ /dev/null @@ -1,376 +0,0 @@ -package top.r3944realms.lib39.example.content.data; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.Entity; -import org.jetbrains.annotations.NotNull; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.util.nbt.NBTReader; -import top.r3944realms.lib39.util.nbt.NBTWriter; - -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicReference; - -/** - * 测试同步数据实现 - */ -@SuppressWarnings("unused") -public class TestSyncData extends AbstractedTestSyncData { - /** - * The constant ID. - */ - public static final ResourceLocation ID = Lib39.rl(Lib39.MOD_ID, "test_sync_data"); - - // NBT 键常量 - private static final String NBT_KEY_STRING = "test_string"; - private static final String NBT_KEY_INT = "test_int"; - private static final String NBT_KEY_BOOLEAN = "test_boolean"; - private static final String NBT_KEY_DOUBLE = "test_double"; - private static final String NBT_KEY_COUNTER = "counter"; - private static final String NBT_KEY_SYNC_TIME = "last_sync_time"; - private static final String NBT_KEY_CUSTOM_DATA = "custom_data"; - private static final String NBT_KEY_CUSTOM_NAME = "name"; - private static final String NBT_KEY_CUSTOM_VALUE = "value"; - private static final String NBT_KEY_CUSTOM_FLAG = "flag"; - - // 数据字段 - private String testString = "default_value"; - private int testInt = 42; - private boolean testBoolean = true; - private double testDouble = 3.14159; - private int counter = 0; - private long lastSyncTime = 0L; - private TestData customData = new TestData("default", 100, false); - private Entity self; - - /** - * 构造函数 - * - * @param entity 关联的实体 - */ - public TestSyncData(Entity entity) { - super(ID); - this.self = entity; - } - - /** - * 构造函数(用于测试) - * - * @param entityId 实体ID - * @param self the self - */ - public TestSyncData(int entityId, Entity self) { - super(ID); - this.self = self; - } - - /** - * 构造函数(用于数据包反序列化) - * - * @param buf 字节缓冲区 - */ - public TestSyncData(FriendlyByteBuf buf) { - super(ID); - this.self = null; // 实体在从数据包重建时可能为null,需要在接收端设置 - fromBytes(buf); - } - - /** - * 将数据写入字节缓冲区(用于网络传输) - * - * @param buf 字节缓冲区 - */ - public void toBytes(FriendlyByteBuf buf) { - // 写入基本类型字段 - buf.writeUtf(testString != null ? testString : ""); - buf.writeInt(testInt); - buf.writeBoolean(testBoolean); - buf.writeDouble(testDouble); - buf.writeInt(counter); - buf.writeLong(lastSyncTime); - - // 写入自定义数据 - if (customData != null) { - buf.writeUtf(customData.getName() != null ? customData.getName() : ""); - buf.writeInt(customData.getValue()); - buf.writeBoolean(customData.isFlag()); - } else { - buf.writeUtf(""); - buf.writeInt(0); - buf.writeBoolean(false); - } - - // 写入实体ID(如果实体存在) - if (self != null) { - buf.writeInt(self.getId()); - } else { - buf.writeInt(-1); - } - - // 写入脏数据状态 - buf.writeBoolean(isDirty()); - } - - /** - * 从字节缓冲区读取数据(用于网络传输) - * - * @param buf 字节缓冲区 - */ - public void fromBytes(@NotNull FriendlyByteBuf buf) { - // 读取基本类型字段 - this.testString = buf.readUtf(32767); // Minecraft字符串最大长度 - this.testInt = buf.readInt(); - this.testBoolean = buf.readBoolean(); - this.testDouble = buf.readDouble(); - this.counter = buf.readInt(); - this.lastSyncTime = buf.readLong(); - - // 读取自定义数据 - String customName = buf.readUtf(); - int customValue = buf.readInt(); - boolean customFlag = buf.readBoolean(); - this.customData = new TestData(customName, customValue, customFlag); - - // 读取实体ID(在接收端可能需要额外处理) - int entityId = buf.readInt(); - - // 读取脏数据状态 - boolean wasDirty = buf.readBoolean(); - if (wasDirty) { - markDirty(); - } - } - - /** - * 静态方法:从字节缓冲区创建 TestSyncData 实例 - * - * @param buf 字节缓冲区 - * @return 新的 TestSyncData 实例 - */ - public static TestSyncData staticFromBytes(FriendlyByteBuf buf) { - return new TestSyncData(buf); - } - - @Override - public String getTestString() { - return testString; - } - - @Override - public void setTestString(String value) { - if (!java.util.Objects.equals(this.testString, value)) { - this.testString = value; - markDirty(); - } - } - - @Override - public int getTestInt() { - return testInt; - } - - @Override - public void setTestInt(int value) { - if (this.testInt != value) { - this.testInt = value; - markDirty(); - } - } - - @Override - public boolean isTestBoolean() { - return testBoolean; - } - - @Override - public void setTestBoolean(boolean value) { - if (this.testBoolean != value) { - this.testBoolean = value; - markDirty(); - } - } - - @Override - public double getTestDouble() { - return testDouble; - } - - @Override - public void setTestDouble(double value) { - if (this.testDouble != value) { - this.testDouble = value; - markDirty(); - } - } - - @Override - public int getCounter() { - return counter; - } - - @Override - public void incrementCounter() { - this.counter++; - markDirty(); - } - - @Override - public long getLastSyncTime() { - return lastSyncTime; - } - - @Override - public void updateSyncTime() { - this.lastSyncTime = System.currentTimeMillis(); - markDirty(); - } - - @Override - public TestData getCustomData() { - return customData; - } - - @Override - public void setCustomData(TestData data) { - if (data == null) { - throw new IllegalArgumentException("Custom data cannot be null"); - } - if (!java.util.Objects.equals(this.customData, data)) { - this.customData = data; - markDirty(); - } - } - - @Override - public boolean validateData() { - return testString != null && - !testString.isEmpty() && - customData != null && - customData.getName() != null && - !customData.getName().isEmpty() && - counter >= 0 && - testInt >= 0; - } - - @Override - public CompoundTag serializeNBT() { - return NBTWriter.builder() - .string(NBT_KEY_STRING, testString) - .intValue(NBT_KEY_INT, testInt) - .booleanValue(NBT_KEY_BOOLEAN, testBoolean) - .doubleValue(NBT_KEY_DOUBLE, testDouble) - .intValue(NBT_KEY_COUNTER, counter) - .longValue(NBT_KEY_SYNC_TIME, lastSyncTime) - .compound( - NBT_KEY_CUSTOM_DATA, - NBTWriter.builder() - .string(NBT_KEY_CUSTOM_NAME, customData.getName()) - .intValue(NBT_KEY_CUSTOM_VALUE, customData.getValue()) - .booleanValue(NBT_KEY_CUSTOM_FLAG, customData.isFlag()) - .build() - ).build(); - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - NBTReader.of(nbt) - .intValue(NBT_KEY_INT, integer -> testInt = integer) - .string(NBT_KEY_STRING, string -> testString = string) - .booleanValue(NBT_KEY_BOOLEAN, bool -> testBoolean = bool) - .intValue(NBT_KEY_COUNTER, integer -> counter = integer) - .doubleValue(NBT_KEY_DOUBLE, dou -> testDouble = dou) - .longValue(NBT_KEY_SYNC_TIME, sync -> lastSyncTime = sync) - .compound(NBT_KEY_CUSTOM_DATA, customDataTag -> { - AtomicReference name = new AtomicReference<>(""); - AtomicInteger value = new AtomicInteger(-1); - AtomicBoolean flag = new AtomicBoolean(false); - NBTReader.of(customDataTag) - .string(NBT_KEY_CUSTOM_NAME, name::set) - .intValue(NBT_KEY_CUSTOM_VALUE, value::set) - .booleanValue(NBT_KEY_CUSTOM_FLAG, flag::set); - this.customData = new TestData(name.get(), value.get(), flag.get()); - }); - } - - @Override - public int entityId() { - return self != null ? self.getId() : -1; - } - - /** - * 设置关联的实体 - * - * @param entity 关联的实体 - */ - public void setEntity(Entity entity) { - this.self = entity; - } - - - /** - * 获取所有数据的字符串表示(用于调试) - */ - @Override - public String toString() { - return String.format( - "TestSyncData{id=%d, string='%s', int=%d, boolean=%s, double=%.2f, counter=%d, lastSync=%d, custom=%s}", - self.getId(), testString, testInt, testBoolean, testDouble, counter, lastSyncTime, customData - ); - } - - /** - * 重置为默认值 - */ - public void resetToDefaults() { - testString = "default_value"; - testInt = 42; - testBoolean = true; - testDouble = 3.14159; - counter = 0; - lastSyncTime = 0L; - customData = new TestData("default", 100, false); - markDirty(); - } - - /** - * 生成随机测试数据 - */ - public void generateRandomData() { - testString = "random_" + System.currentTimeMillis(); - testInt = (int) (Math.random() * 1000); - testBoolean = Math.random() > 0.5; - testDouble = Math.random() * 100.0; - counter++; - lastSyncTime = System.currentTimeMillis(); - customData = new TestData( - "custom_" + counter, - (int) (Math.random() * 500), - Math.random() > 0.5 - ); - markDirty(); - } - - /** - * 创建一个不依赖实体的副本(用于网络传输) - * - * @return 不包含实体引用的副本 test sync data - */ - public TestSyncData createNetworkCopy() { - TestSyncData copy = new TestSyncData((Entity) null); - copy.testString = this.testString; - copy.testInt = this.testInt; - copy.testBoolean = this.testBoolean; - copy.testDouble = this.testDouble; - copy.counter = this.counter; - copy.lastSyncTime = this.lastSyncTime; - copy.customData = new TestData( - this.customData.getName(), - this.customData.getValue(), - this.customData.isFlag() - ); - return copy; - } - -} \ No newline at end of file diff --git a/src/main/java/top/r3944realms/lib39/example/content/item/FabricItem.java b/src/main/java/top/r3944realms/lib39/example/content/item/FabricItem.java deleted file mode 100644 index ee091ee..0000000 --- a/src/main/java/top/r3944realms/lib39/example/content/item/FabricItem.java +++ /dev/null @@ -1,589 +0,0 @@ -package top.r3944realms.lib39.example.content.item; - -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.projectile.ProjectileUtil; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.EntityHitResult; -import net.minecraft.world.phys.Vec3; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.example.content.data.AbstractedTestSyncData; -import top.r3944realms.lib39.example.content.data.ExCapabilityHandler; -import top.r3944realms.lib39.example.content.data.TestSyncData; -import top.r3944realms.lib39.example.core.network.ClientDataPacket; -import top.r3944realms.lib39.example.core.network.ExNetworkHandler; - -import java.util.List; -import java.util.concurrent.CompletableFuture; - -/** - * 用于执行数据查询并检查同步状态的物品 - * Shift + 右键:客户端与服务器双端同时查询检查同步 - * 普通右键:单端查询目标生物数据 - */ -public class FabricItem extends Item { - - /** - * Instantiates a new Fabric item. - * - * @param properties the properties - */ - public FabricItem(Properties properties) { - super(properties); - } - - @Override - public @NotNull InteractionResultHolder use(@NotNull Level level, @NotNull Player player, @NotNull InteractionHand hand) { - ItemStack itemStack = player.getItemInHand(hand); - - if (level.isClientSide()) { - // 客户端逻辑 - if (player.isShiftKeyDown()) { - // Shift + 右键:双端检查 - 先获取客户端数据,然后发送到服务器 - handleClientDualCheck(player); - } else { - // 普通右键:客户端单端查询 - handleClientSideQuery(player); - } - } else { - // 服务器逻辑 - ServerPlayer serverPlayer = (ServerPlayer) player; - - if (player.isShiftKeyDown()) { - // 服务器端已经通过数据包处理双端检查,这里只发送开始消息 - player.sendSystemMessage(Component.literal("§b开始双端同步检查,请等待客户端数据...")); - } else { - // 服务器单端查询 - handleServerSingleEndQuery(serverPlayer); - } - - // 添加冷却时间 - player.getCooldowns().addCooldown(this, 20); // 1秒冷却 - } - - return InteractionResultHolder.sidedSuccess(itemStack, level.isClientSide()); - } - - /** - * 客户端处理双端检查 - */ - private void handleClientDualCheck(Player player) { - Entity targetEntity = getClientTargetedEntity(player); - - if (targetEntity instanceof LivingEntity livingTarget) { - // 在客户端获取本地数据 - TestSyncData clientData = getLocalClientData(livingTarget); - - if (clientData != null) { - // 发送客户端数据到服务器 - sendClientDataToServer(clientData, livingTarget.getId()); - - // 客户端提示 - player.sendSystemMessage(Component.literal("§b已发送客户端数据到服务器,等待对比结果...")); - } else { - player.sendSystemMessage(Component.literal("§c无法获取客户端本地数据")); - } - } else { - if (targetEntity == null && player.isShiftKeyDown()) { - handlePlayerSelfData(player); - } else { - player.sendSystemMessage(Component.literal("§c请对准一个生物进行同步检查!")); - } - } - } - - /** - * 处理玩家自身数据的双端检查 - */ - private void handlePlayerSelfData(Player player) { - // 获取玩家自身的客户端数据 - TestSyncData clientData = getLocalClientData(player); - - if (clientData != null) { - // 发送玩家自身数据到服务器 - sendClientDataToServer(clientData, player.getId()); - - // 客户端提示 - player.sendSystemMessage(Component.literal("§b已发送玩家自身客户端数据到服务器,等待对比结果...")); - } else { - player.sendSystemMessage(Component.literal("§c无法获取玩家自身客户端数据")); - } - } - /** - * 客户端单端查询 - */ - private void handleClientSideQuery(Player player) { - Entity targetEntity = getClientTargetedEntity(player); - - if (targetEntity instanceof LivingEntity livingTarget) { - TestSyncData clientData = getLocalClientData(livingTarget); - - if (clientData != null) { - displayClientSideResults(player, livingTarget, clientData); - } else { - player.sendSystemMessage(Component.literal("§c无法查询客户端本地数据")); - } - } else { - player.sendSystemMessage(Component.literal("§c请对准一个生物使用!")); - } - } - - /** - * 服务器端处理单端查询 - */ - private void handleServerSingleEndQuery(ServerPlayer player) { - Entity targetEntity = getServerTargetedEntity(player); - - if (targetEntity instanceof LivingEntity livingTarget) { - player.sendSystemMessage(Component.literal( - String.format("§b开始查询 §e%s§b 的数据,3秒后显示结果...", livingTarget.getName().getString()) - )); - - // 启动异步数据查询 - startServerSingleEndQuery(player, livingTarget); - } else { - player.sendSystemMessage(Component.literal("§c请对准一个生物使用!")); - } - } - - /** - * 在客户端获取本地数据 - */ - private TestSyncData getLocalClientData(LivingEntity target) { - try { - AbstractedTestSyncData abstractData = target.getCapability(ExCapabilityHandler.TEST_CAP).resolve().orElse(null); - if (abstractData instanceof TestSyncData) { - return (TestSyncData) abstractData; - } - } catch (Exception e) { - Lib39.LOGGER.error("[FabricItem] 获取客户端数据失败", e); - } - return null; - } - - /** - * 发送客户端数据到服务器 - */ - private void sendClientDataToServer(TestSyncData clientData, int targetEntityId) { - // 使用网络系统发送数据包 - ExNetworkHandler.INSTANCE.sendToServer(new ClientDataPacket(clientData, targetEntityId)); - } - - /** - * 服务器端处理客户端发送的数据(从数据包调用) - * - * @param player the player - * @param clientData the client data - * @param targetEntityId the target entity id - */ - public static void handleClientDataFromPacket(@NotNull ServerPlayer player, TestSyncData clientData, int targetEntityId) { - Entity target = player.level().getEntity(targetEntityId); - - if (target instanceof LivingEntity livingTarget) { - // 获取服务器端数据 - TestSyncData serverData = getServerSideData(livingTarget); - - if (serverData != null) { - // 显示双端对比结果 - displayDualEndComparison(player, livingTarget, serverData, clientData); - } else { - player.sendSystemMessage(Component.literal("§c无法获取服务器端数据")); - } - } else { - player.sendSystemMessage(Component.literal("§c目标生物不存在或已消失")); - } - } - - /** - * 获取服务器端数据 - */ - private static @Nullable TestSyncData getServerSideData(LivingEntity target) { - try { - AbstractedTestSyncData abstractData = target.getCapability(ExCapabilityHandler.TEST_CAP).resolve().orElse(null); - if (abstractData instanceof TestSyncData) { - return (TestSyncData) abstractData; - } - } catch (Exception e) { - Lib39.LOGGER.error("[FabricItem] 获取服务器端数据失败", e); - } - return null; - } - - /** - * 启动服务器单端查询 - */ - private void startServerSingleEndQuery(ServerPlayer player, LivingEntity target) { - CompletableFuture.runAsync(() -> { - try { - // 等待 3 秒 - Thread.sleep(3000); - - // 在服务器线程中执行结果处理 - player.server.execute(() -> { - displayServerSingleEndResults(player, target); - }); - - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - Lib39.LOGGER.error("[FabricItem] 数据查询被中断", e); - player.sendSystemMessage(Component.literal("§c数据查询被中断")); - } catch (Exception e) { - Lib39.LOGGER.error("[FabricItem] 数据查询出错", e); - player.server.execute(() -> - player.sendSystemMessage(Component.literal("§c数据查询出错: " + e.getMessage())) - ); - } - }); - } - - /** - * 显示服务器单端查询结果 - */ - private void displayServerSingleEndResults(ServerPlayer player, @NotNull LivingEntity target) { - Lib39.LOGGER.info("[FabricItem] 查询生物 {} 的数据", target.getName().getString()); - - // 获取目标生物的数据 - AbstractedTestSyncData abstractData = getTestSyncData(target); - - if (abstractData instanceof TestSyncData testData) { - // 显示详细数据 - displayServerDetailedData(player, target, testData); - } else { - player.sendSystemMessage(Component.literal( - String.format("§c生物 §e%s§c 没有测试数据或数据无效", target.getName().getString()) - )); - } - } - - /** - * 显示客户端查询结果 - */ - private void displayClientSideResults(Player player, LivingEntity target, TestSyncData clientData) { - player.sendSystemMessage(Component.literal("§6=== 客户端数据查询结果 ===")); - player.sendSystemMessage(Component.literal("§7目标生物: §e" + target.getName().getString())); - player.sendSystemMessage(Component.literal("§7数据来源: §9客户端本地")); - player.sendSystemMessage(Component.literal("")); - - player.sendSystemMessage(Component.literal("§a基础数据:")); - player.sendSystemMessage(Component.literal("§7字符串: §f" + clientData.getTestString())); - player.sendSystemMessage(Component.literal("§7整数值: §f" + clientData.getTestInt())); - player.sendSystemMessage(Component.literal("§7布尔值: §f" + clientData.isTestBoolean())); - player.sendSystemMessage(Component.literal("§7双精度值: §f" + String.format("%.2f", clientData.getTestDouble()))); - player.sendSystemMessage(Component.literal("§7计数器: §f" + clientData.getCounter())); - - // 显示客户端特定信息 - player.sendSystemMessage(Component.literal("")); - player.sendSystemMessage(Component.literal("§e客户端状态:")); - player.sendSystemMessage(Component.literal("§7数据验证: " + (clientData.validateData() ? "§a通过" : "§c失败"))); - player.sendSystemMessage(Component.literal("§7同步状态: " + (clientData.isDirty() ? "§6待同步" : "§a已同步"))); - } - - /** - * 显示服务器详细数据(单端查询) - */ - private void displayServerDetailedData(ServerPlayer player, LivingEntity target, TestSyncData testData) { - player.sendSystemMessage(Component.literal("§6=== 数据查询结果 ===")); - player.sendSystemMessage(Component.literal( - String.format("§7目标生物: §e%s", target.getName().getString()) - )); - player.sendSystemMessage(Component.literal( - String.format("§7实体ID: §e%d", target.getId()) - )); - player.sendSystemMessage(Component.literal("")); - - // 显示基础数据 - player.sendSystemMessage(Component.literal("§a基础数据:")); - player.sendSystemMessage(Component.literal( - String.format("§7字符串: §f%s", testData.getTestString()) - )); - player.sendSystemMessage(Component.literal( - String.format("§7整数值: §f%d", testData.getTestInt()) - )); - player.sendSystemMessage(Component.literal( - String.format("§7布尔值: §f%s", testData.isTestBoolean()) - )); - player.sendSystemMessage(Component.literal( - String.format("§7双精度值: §f%.2f", testData.getTestDouble()) - )); - player.sendSystemMessage(Component.literal( - String.format("§7计数器: §f%d", testData.getCounter()) - )); - player.sendSystemMessage(Component.literal( - String.format("§7最后同步: §f%dms前", System.currentTimeMillis() - testData.getLastSyncTime()) - )); - player.sendSystemMessage(Component.literal("")); - - // 显示自定义数据 - TestSyncData.TestData customData = testData.getCustomData(); - player.sendSystemMessage(Component.literal("§a自定义数据:")); - player.sendSystemMessage(Component.literal( - String.format("§7名称: §f%s", customData.getName()) - )); - player.sendSystemMessage(Component.literal( - String.format("§7数值: §f%d", customData.getValue()) - )); - player.sendSystemMessage(Component.literal( - String.format("§7标志: §f%s", customData.isFlag()) - )); - player.sendSystemMessage(Component.literal("")); - - // 显示验证状态 - boolean isValid = testData.validateData(); - player.sendSystemMessage(Component.literal( - String.format("§7数据验证: %s", isValid ? "§a通过" : "§c失败") - )); - player.sendSystemMessage(Component.literal( - String.format("§7数据状态: %s", testData.isDirty() ? "§6未同步" : "§a已同步") - )); - } - - /** - * 显示双端比较结果 - */ - private static void displayDualEndComparison(ServerPlayer player, LivingEntity target, TestSyncData serverData, TestSyncData clientData) { - player.sendSystemMessage(Component.literal("§6=== 客户端-服务器双端同步检查结果 ===")); - player.sendSystemMessage(Component.literal( - String.format("§7目标生物: §e%s", target.getName().getString()) - )); - player.sendSystemMessage(Component.literal("")); - - // 显示双端数据来源 - player.sendSystemMessage(Component.literal("§a数据来源:")); - player.sendSystemMessage(Component.literal("§7- §c服务器端§7: 实体ID " + serverData.entityId())); - player.sendSystemMessage(Component.literal("§7- §9客户端§7: 实体ID " + clientData.entityId())); - player.sendSystemMessage(Component.literal("")); - - // 比较各个字段 - boolean stringSynced = serverData.getTestString().equals(clientData.getTestString()); - boolean intSynced = serverData.getTestInt() == clientData.getTestInt(); - boolean booleanSynced = serverData.isTestBoolean() == clientData.isTestBoolean(); - boolean doubleSynced = Math.abs(serverData.getTestDouble() - clientData.getTestDouble()) < 0.001; - boolean counterSynced = serverData.getCounter() == clientData.getCounter(); - boolean customDataSynced = compareCustomData(serverData.getCustomData(), clientData.getCustomData()); - - // 显示字段同步状态 - player.sendSystemMessage(Component.literal("§a字段同步状态:")); - displayDualEndSyncStatus(player, "字符串", stringSynced, - serverData.getTestString(), clientData.getTestString()); - displayDualEndSyncStatus(player, "整数值", intSynced, - serverData.getTestInt(), clientData.getTestInt()); - displayDualEndSyncStatus(player, "布尔值", booleanSynced, - serverData.isTestBoolean(), clientData.isTestBoolean()); - displayDualEndSyncStatus(player, "双精度值", doubleSynced, - serverData.getTestDouble(), clientData.getTestDouble()); - displayDualEndSyncStatus(player, "计数器", counterSynced, - serverData.getCounter(), clientData.getCounter()); - displayDualEndSyncStatus(player, "自定义数据", customDataSynced, - serverData.getCustomData().toString(), clientData.getCustomData().toString()); - - player.sendSystemMessage(Component.literal("")); - - // 计算总体同步率 - int totalFields = 6; - int syncedFields = (stringSynced ? 1 : 0) + (intSynced ? 1 : 0) + - (booleanSynced ? 1 : 0) + (doubleSynced ? 1 : 0) + - (counterSynced ? 1 : 0) + (customDataSynced ? 1 : 0); - double syncRate = (double) syncedFields / totalFields * 100; - - // 显示总体同步状态 - player.sendSystemMessage(Component.literal("§a总体同步状态:")); - player.sendSystemMessage(Component.literal( - String.format("§7同步字段: §e%d§7/§e%d", syncedFields, totalFields) - )); - player.sendSystemMessage(Component.literal( - String.format("§7同步率: %s", getSyncRateColor(syncRate) + String.format("%.1f%%", syncRate)) - )); - player.sendSystemMessage(Component.literal( - String.format("§7同步状态: %s", getOverallSyncStatus(syncRate)) - )); - - // 显示数据状态差异 - player.sendSystemMessage(Component.literal("")); - player.sendSystemMessage(Component.literal("§a数据状态差异:")); - player.sendSystemMessage(Component.literal( - String.format("§7服务器脏数据状态: %s", serverData.isDirty() ? "§6脏" : "§a干净") - )); - player.sendSystemMessage(Component.literal( - String.format("§7客户端脏数据状态: %s", clientData.isDirty() ? "§6脏" : "§a干净") - )); - player.sendSystemMessage(Component.literal( - String.format("§7服务器验证状态: %s", serverData.validateData() ? "§a通过" : "§c失败") - )); - player.sendSystemMessage(Component.literal( - String.format("§7客户端验证状态: %s", clientData.validateData() ? "§a通过" : "§c失败") - )); - - // 显示同步建议 - player.sendSystemMessage(Component.literal("")); - player.sendSystemMessage(Component.literal("§e同步建议:")); - if (syncRate == 100) { - player.sendSystemMessage(Component.literal("§a✓ 数据完全同步,无需操作")); - } else if (syncRate >= 80) { - player.sendSystemMessage(Component.literal("§e⚠ 数据基本同步,建议观察")); - } else if (syncRate >= 50) { - player.sendSystemMessage(Component.literal("§6⚠ 数据部分不同步,建议检查网络")); - } else { - player.sendSystemMessage(Component.literal("§c✗ 数据严重不同步,建议重新同步")); - } - } - - /** - * 显示双端同步状态 - */ - private static void displayDualEndSyncStatus(ServerPlayer player, String fieldName, boolean synced, Object serverValue, Object clientValue) { - String status = synced ? "§a✓ 同步" : "§c✗ 不同步"; - if (synced) { - player.sendSystemMessage(Component.literal( - String.format("§7%s: %s §8(值: §7%s§8)", fieldName, status, serverValue) - )); - } else { - player.sendSystemMessage(Component.literal( - String.format("§7%s: %s", fieldName, status) - )); - player.sendSystemMessage(Component.literal( - String.format("§8 §c服务器: §7%s", serverValue) - )); - player.sendSystemMessage(Component.literal( - String.format("§8 §9客户端: §7%s", clientValue) - )); - } - } - - /** - * 比较自定义数据 - */ - private static boolean compareCustomData(TestSyncData.TestData first, TestSyncData.TestData second) { - return first.getName().equals(second.getName()) && - first.getValue() == second.getValue() && - first.isFlag() == second.isFlag(); - } - - /** - * 获取同步率颜色 - */ - private static String getSyncRateColor(double syncRate) { - if (syncRate >= 90) return "§a"; - if (syncRate >= 70) return "§e"; - if (syncRate >= 50) return "§6"; - return "§c"; - } - - /** - * 获取总体同步状态 - */ - private static String getOverallSyncStatus(double syncRate) { - if (syncRate == 100) return "§a完全同步"; - if (syncRate >= 90) return "§a优秀同步"; - if (syncRate >= 70) return "§e良好同步"; - if (syncRate >= 50) return "§6部分同步"; - return "§c同步较差"; - } - - /** - * 客户端获取准星目标实体 - */ - private Entity getClientTargetedEntity(Player player) { - double reachDistance = 20.0; - float partialTicks = 1.0f; // 服务器端通常用1.0 - - // 获取玩家的视线向量和位置 - Vec3 eyePosition = player.getEyePosition(partialTicks); - Vec3 lookVector = player.getViewVector(partialTicks); - Vec3 endPosition = eyePosition.add(lookVector.x * reachDistance, lookVector.y * reachDistance, lookVector.z * reachDistance); - - // 先检测实体 - EntityHitResult entityHit = ProjectileUtil.getEntityHitResult( - player, - eyePosition, - endPosition, - player.getBoundingBox().expandTowards(lookVector.scale(reachDistance)).inflate(1.0), - entity -> !entity.isSpectator() && entity.isPickable(), - reachDistance * reachDistance // 平方距离 - ); - - if (entityHit != null) { - return entityHit.getEntity(); - } - - return null; - } - - /** - * 服务器获取准星目标实体 - */ - private Entity getServerTargetedEntity(ServerPlayer player) { - double reachDistance = 20.0; - float partialTicks = 1.0f; // 服务器端通常用1.0 - - // 获取玩家的视线向量和位置 - Vec3 eyePosition = player.getEyePosition(partialTicks); - Vec3 lookVector = player.getViewVector(partialTicks); - Vec3 endPosition = eyePosition.add(lookVector.x * reachDistance, lookVector.y * reachDistance, lookVector.z * reachDistance); - - // 先检测实体 - EntityHitResult entityHit = ProjectileUtil.getEntityHitResult( - player, - eyePosition, - endPosition, - player.getBoundingBox().expandTowards(lookVector.scale(reachDistance)).inflate(1.0), - entity -> !entity.isSpectator() && entity.isPickable(), - reachDistance * reachDistance // 平方距离 - ); - - if (entityHit != null) { - return entityHit.getEntity(); - } - - return null; - } - - /** - * 获取测试同步数据 - */ - private AbstractedTestSyncData getTestSyncData(Entity entity) { - try { - return entity.getCapability(ExCapabilityHandler.TEST_CAP).resolve().orElse(null); - } catch (Exception e) { - Lib39.LOGGER.debug("[FabricItem] 获取生物 {} 的 TestSyncData 失败: {}", - entity.getName().getString(), e.getMessage()); - return null; - } - } - - @Override - public void appendHoverText(@NotNull ItemStack stack, @Nullable Level level, - @NotNull List tooltip, @NotNull TooltipFlag flag) { - super.appendHoverText(stack, level, tooltip, flag); - - tooltip.add(Component.literal("§7右键点击在 3 秒后执行")); - tooltip.add(Component.literal("§7§e准星瞄准生物§7的数据查询")); - tooltip.add(Component.literal("§7§oShift + 右键§7进行§e客户端-服务器双端同步检查§7")); - tooltip.add(Component.literal("")); - tooltip.add(Component.literal("§6查询延迟: §e3秒")); - tooltip.add(Component.literal("§6瞄准距离: §e20格")); - tooltip.add(Component.literal("§6冷却时间: §e1秒")); - tooltip.add(Component.literal("")); - tooltip.add(Component.literal("§a单端查询内容:")); - tooltip.add(Component.literal("§7- 基础数据字段")); - tooltip.add(Component.literal("§7- 自定义数据结构")); - tooltip.add(Component.literal("§7- 数据验证状态")); - tooltip.add(Component.literal("§7- 同步状态信息")); - tooltip.add(Component.literal("")); - tooltip.add(Component.literal("§e双端同步检查:")); - tooltip.add(Component.literal("§7- 客户端和服务器同时查询")); - tooltip.add(Component.literal("§7- 字段级同步状态对比")); - tooltip.add(Component.literal("§7- 总体同步率计算")); - tooltip.add(Component.literal("§7- 双端数据状态差异")); - tooltip.add(Component.literal("§7- 同步建议")); - } -} \ No newline at end of file diff --git a/src/main/java/top/r3944realms/lib39/example/content/item/ForgeItem.java b/src/main/java/top/r3944realms/lib39/example/content/item/ForgeItem.java deleted file mode 100644 index 47fd599..0000000 --- a/src/main/java/top/r3944realms/lib39/example/content/item/ForgeItem.java +++ /dev/null @@ -1,40 +0,0 @@ -package top.r3944realms.lib39.example.content.item; - -import net.minecraft.client.Minecraft; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import org.jetbrains.annotations.NotNull; -import top.r3944realms.lib39.example.client.screen.ForgeScreen; - -/** - * The type Forge item. - */ -public class ForgeItem extends Item { - /** - * Instantiates a new Forge item. - * - * @param properties the properties - */ - public ForgeItem(Properties properties) { - super(properties); - } - - @Override - public @NotNull InteractionResultHolder use(@NotNull Level level, @NotNull Player player, @NotNull InteractionHand usedHand) { - if (level.isClientSide() && usedHand == InteractionHand.MAIN_HAND) { - clientUse(usedHand); - } - return super.use(level, player, usedHand); - } - - @OnlyIn(Dist.CLIENT) - private static void clientUse(@NotNull InteractionHand usedHand) { - Minecraft.getInstance().setScreen(new ForgeScreen(usedHand, 0)); - } -} \ No newline at end of file diff --git a/src/main/java/top/r3944realms/lib39/example/content/item/NeoForgeItem.java b/src/main/java/top/r3944realms/lib39/example/content/item/NeoForgeItem.java deleted file mode 100644 index 3725bfe..0000000 --- a/src/main/java/top/r3944realms/lib39/example/content/item/NeoForgeItem.java +++ /dev/null @@ -1,284 +0,0 @@ -package top.r3944realms.lib39.example.content.item; - -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.projectile.ProjectileUtil; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.EntityHitResult; -import net.minecraft.world.phys.Vec3; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.example.content.data.AbstractedTestSyncData; -import top.r3944realms.lib39.example.content.data.ExCapabilityHandler; -import top.r3944realms.lib39.example.content.data.TestSyncData; - -import java.util.List; -import java.util.Random; - -/** - * 用于对准星生物触发 TestSyncData 随机变换的物品 - * Shift + 右键:操作自己的数据 - * 普通右键:操作瞄准生物的数据 - */ -public class NeoForgeItem extends Item { - private static final Random RANDOM = new Random(); - - /** - * Instantiates a new Neo forge item. - * - * @param properties the properties - */ - public NeoForgeItem(Properties properties) { - super(properties); - } - - @Override - public @NotNull InteractionResultHolder use(@NotNull Level level, @NotNull Player player, @NotNull InteractionHand hand) { - ItemStack itemStack = player.getItemInHand(hand); - - if (!level.isClientSide()) { - ServerPlayer serverPlayer = (ServerPlayer) player; - - if (player.isShiftKeyDown()) { - // Shift + 右键:操作自己的数据 - handleSelfDataOperation(serverPlayer); - } else { - // 普通右键:操作瞄准生物的数据 - handleTargetDataOperation(serverPlayer); - } - - // 添加冷却时间 - player.getCooldowns().addCooldown(this, 20); // 1秒冷却 - } - - return InteractionResultHolder.sidedSuccess(itemStack, level.isClientSide()); - } - - /** - * 处理玩家自身数据操作 - */ - private void handleSelfDataOperation(ServerPlayer player) { - boolean success = triggerRandomTransformation(player); - - if (success) { - player.sendSystemMessage(Component.literal("§a已触发§e自身§a测试数据的随机变换!")); - Lib39.LOGGER.info("[NeoForgeItem] 玩家 {} 触发了自身数据变换", player.getName().getString()); - } else { - player.sendSystemMessage(Component.literal("§c无法触发自身数据变换")); - } - } - - /** - * 处理目标生物数据操作 - */ - private void handleTargetDataOperation(ServerPlayer player) { - // 获取玩家准星瞄准的生物 - Entity targetEntity = getTargetedEntity(player); - - if (targetEntity instanceof LivingEntity livingTarget) { - // 触发对准星生物的数据变换 - boolean success = triggerRandomTransformation(livingTarget); - - if (success) { - player.sendSystemMessage(Component.literal( - String.format("§a已触发 §e%s§a 的测试数据随机变换!", livingTarget.getName().getString()) - )); - Lib39.LOGGER.info("[NeoForgeItem] 玩家 {} 触发生物 {} 的数据变换", - player.getName().getString(), livingTarget.getName().getString()); - } else { - player.sendSystemMessage(Component.literal( - String.format("§c无法触发 §e%s§c 的数据变换", livingTarget.getName().getString()) - )); - } - } else { - // 没有瞄准生物 - player.sendSystemMessage(Component.literal("§c请对准一个生物使用!")); - } - } - - /** - * 获取玩家准星瞄准的实体 - */ - private Entity getTargetedEntity(ServerPlayer player) { - double reachDistance = 20.0; - float partialTicks = 1.0f; // 服务器端通常用1.0 - - // 获取玩家的视线向量和位置 - Vec3 eyePosition = player.getEyePosition(partialTicks); - Vec3 lookVector = player.getViewVector(partialTicks); - Vec3 endPosition = eyePosition.add(lookVector.x * reachDistance, lookVector.y * reachDistance, lookVector.z * reachDistance); - - // 先检测实体 - EntityHitResult entityHit = ProjectileUtil.getEntityHitResult( - player, - eyePosition, - endPosition, - player.getBoundingBox().expandTowards(lookVector.scale(reachDistance)).inflate(1.0), - entity -> !entity.isSpectator() && entity.isPickable(), - reachDistance * reachDistance // 平方距离 - ); - - if (entityHit != null) { - return entityHit.getEntity(); - } - - return null; - } - - /** - * 为实体触发随机数据变换 - */ - private boolean triggerRandomTransformation(LivingEntity entity) { - try { - AbstractedTestSyncData abstractData = getOrCreateTestSyncData(entity); - if (!(abstractData instanceof TestSyncData testData)) { - return false; - } - - // 随机选择一种变换方式 - int transformationType = RANDOM.nextInt(6); // 增加更多变换类型 - - switch (transformationType) { - case 0 -> { - // 完全随机数据 - testData.generateRandomData(); - Lib39.LOGGER.debug("[NeoForgeItem] 为 {} 生成完全随机数据", getEntityName(entity)); - } - case 1 -> { - // 只修改字符串和计数器 - testData.setTestString("transformed_" + System.currentTimeMillis()); - testData.incrementCounter(); - testData.updateSyncTime(); - Lib39.LOGGER.debug("[NeoForgeItem] 为 {} 修改字符串和计数器", getEntityName(entity)); - } - case 2 -> { - // 修改数值数据 - testData.setTestInt(RANDOM.nextInt(1000)); - testData.setTestDouble(RANDOM.nextDouble() * 100.0); - testData.setTestBoolean(RANDOM.nextBoolean()); - testData.updateSyncTime(); - Lib39.LOGGER.debug("[NeoForgeItem] 为 {} 修改数值数据", getEntityName(entity)); - } - case 3 -> { - // 修改自定义数据 - TestSyncData.TestData newCustomData = new TestSyncData.TestData( - "custom_" + RANDOM.nextInt(100), - RANDOM.nextInt(500), - RANDOM.nextBoolean() - ); - testData.setCustomData(newCustomData); - testData.incrementCounter(); - Lib39.LOGGER.debug("[NeoForgeItem] 为 {} 修改自定义数据", getEntityName(entity)); - } - case 4 -> { - // 重置为默认值 - testData.resetToDefaults(); - Lib39.LOGGER.debug("[NeoForgeItem] 为 {} 重置数据", getEntityName(entity)); - } - case 5 -> { - // 特殊变换:玩家专属数据 - if (entity instanceof Player) { - testData.setTestString("player_special_" + entity.getUUID().toString().substring(0, 8)); - testData.setTestInt(entity.getId() * 10); - testData.setTestDouble(entity.getHealth()); - testData.incrementCounter(); - testData.updateSyncTime(); - Lib39.LOGGER.debug("[NeoForgeItem] 为玩家 {} 设置专属数据", getEntityName(entity)); - } else { - // 非玩家生物使用普通变换 - testData.generateRandomData(); - } - } - } - - // 验证数据有效性 - if (!testData.validateData()) { - Lib39.LOGGER.warn("[NeoForgeItem] {} 的数据验证失败,重置为默认值", getEntityName(entity)); - testData.resetToDefaults(); - } - - // 显示数据预览(仅对玩家自己操作时显示) - if (entity instanceof Player) { - displayDataPreview((Player) entity, testData); - } - - return true; - - } catch (Exception e) { - Lib39.LOGGER.error("[NeoForgeItem] 为 {} 触发数据变换时出错: {}", - getEntityName(entity), e.getMessage()); - return false; - } - } - - /** - * 显示数据预览给玩家 - */ - private void displayDataPreview(Player player, TestSyncData testData) { - player.sendSystemMessage(Component.literal("§6数据预览:")); - player.sendSystemMessage(Component.literal( - String.format("§7字符串: §f%s", testData.getTestString()) - )); - player.sendSystemMessage(Component.literal( - String.format("§7计数器: §f%d", testData.getCounter()) - )); - player.sendSystemMessage(Component.literal( - String.format("§7验证状态: %s", testData.validateData() ? "§a通过" : "§c失败") - )); - } - - /** - * 获取实体名称(用于日志) - */ - private String getEntityName(LivingEntity entity) { - if (entity instanceof Player) { - return "玩家 " + entity.getName().getString(); - } else { - return "生物 " + entity.getName().getString(); - } - } - - private AbstractedTestSyncData getOrCreateTestSyncData(Entity entity) { - try { - return entity.getCapability(ExCapabilityHandler.TEST_CAP).resolve().orElseThrow(); - } catch (Exception e) { - Lib39.LOGGER.error("[NeoForgeItem] 获取 {} 的 TestSyncData 失败: {}", - getEntityName((LivingEntity) entity), e.getMessage()); - return null; - } - } - - @Override - public void appendHoverText(@NotNull ItemStack stack, @Nullable Level level, - @NotNull List tooltip, @NotNull TooltipFlag flag) { - super.appendHoverText(stack, level, tooltip, flag); - - tooltip.add(Component.literal("§7右键点击触发§e准星瞄准生物§7的")); - tooltip.add(Component.literal("§7测试数据随机变换")); - tooltip.add(Component.literal("§7§oShift + 右键§7操作§e自身§7数据")); - tooltip.add(Component.literal("")); - tooltip.add(Component.literal("§6冷却时间: §e1秒")); - tooltip.add(Component.literal("§6瞄准距离: §e20格")); - tooltip.add(Component.literal("")); - tooltip.add(Component.literal("§a变换类型:")); - tooltip.add(Component.literal("§7- 完全随机数据")); - tooltip.add(Component.literal("§7- 字符串+计数器")); - tooltip.add(Component.literal("§7- 数值数据")); - tooltip.add(Component.literal("§7- 自定义数据")); - tooltip.add(Component.literal("§7- 重置默认值")); - tooltip.add(Component.literal("§7- 玩家专属数据")); - tooltip.add(Component.literal("")); - tooltip.add(Component.literal("§e自身操作特性:")); - tooltip.add(Component.literal("§7- 显示数据预览")); - tooltip.add(Component.literal("§7- 玩家专属数据变换")); - } -} \ No newline at end of file diff --git a/src/main/java/top/r3944realms/lib39/example/core/event/ExClientEventHandler.java b/src/main/java/top/r3944realms/lib39/example/core/event/ExClientEventHandler.java deleted file mode 100644 index f391b11..0000000 --- a/src/main/java/top/r3944realms/lib39/example/core/event/ExClientEventHandler.java +++ /dev/null @@ -1,16 +0,0 @@ -package top.r3944realms.lib39.example.core.event; - -/** - * The type Client handler. - */ -public class ExClientEventHandler { - /** - * The type Mod. - */ - public static class Mod extends ExClientEventHandler {} - - /** - * The type Game. - */ - public static class Game extends ExClientEventHandler {} -} diff --git a/src/main/java/top/r3944realms/lib39/example/core/event/ExCommonEventHandler.java b/src/main/java/top/r3944realms/lib39/example/core/event/ExCommonEventHandler.java deleted file mode 100644 index 2577417..0000000 --- a/src/main/java/top/r3944realms/lib39/example/core/event/ExCommonEventHandler.java +++ /dev/null @@ -1,122 +0,0 @@ -package top.r3944realms.lib39.example.core.event; - -import net.minecraft.world.entity.Entity; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; -import net.minecraftforge.event.AttachCapabilitiesEvent; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.event.lifecycle.FMLConstructModEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import top.r3944realms.lib39.api.event.SyncManagerRegisterEvent; -import top.r3944realms.lib39.core.compat.CompatManager; -import top.r3944realms.lib39.core.event.CommonEventHandler; -import top.r3944realms.lib39.core.sync.CachedSyncManager; -import top.r3944realms.lib39.example.compat.Lib39Compat; -import top.r3944realms.lib39.example.compat.Lib39CompatManager; -import top.r3944realms.lib39.example.content.data.AbstractedTestSyncData; -import top.r3944realms.lib39.example.content.data.ExCapabilityHandler; -import top.r3944realms.lib39.example.content.data.TestSyncData; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * The type Common handler. - */ -public class ExCommonEventHandler { - /** - * The type Game. - */ - @SuppressWarnings("unused") - - public static class Game extends ExCommonEventHandler { - /** - * Attach capability. - * - * @param event the event - */ - @SubscribeEvent - public static void attachCapability(AttachCapabilitiesEvent event) { - ExCapabilityHandler.attachCapability(event); - } - - /** - * On register sync. - * - * @param event the event - */ - @SubscribeEvent - public static void onRegisterSync (SyncManagerRegisterEvent event) { - event.registerSyncManager( - TestSyncData.ID, - new CachedSyncManager() { - private final Map syncDataMap = new ConcurrentHashMap<>(); - @Override - public Map getSyncMap() { - return syncDataMap; - } - }, - ExCapabilityHandler.TEST_CAP - - ); - } - - } - - - /** - * The type Mod. - */ - public static class Mod extends ExCommonEventHandler { - public static final IEventBus EVENT_BUS = FMLJavaModLoadingContext.get().getModEventBus(); - /** - * Gets compat manager. - * - * @return the compat manager - */ - public static CompatManager getOrCreateCompatManager() { - if (compatManager == null) { - synchronized (CommonEventHandler.Mod.class) { - if (compatManager == null) { - compatManager = new Lib39CompatManager("compat", EVENT_BUS, MinecraftForge.EVENT_BUS); - } - } - } - return compatManager; - } - - /** - * The Compat manager. - */ - static volatile CompatManager compatManager; - - - /** - * On construct mod. - * - * @param event the event - */ - @SubscribeEvent - public static void onConstructMod(FMLConstructModEvent event) { - event.enqueueWork(() -> { - CompatManager orCreateCompatManager = Mod.getOrCreateCompatManager(); - orCreateCompatManager - .registerCompat(Lib39Compat.ID, Lib39Compat.INSTANCE); - orCreateCompatManager.initialize(); - }); - } - - /** - * Register capability. - * - * @param event the event - */ - @SubscribeEvent - public static void registerCapability(RegisterCapabilitiesEvent event) { - ExCapabilityHandler.registerCapability(event); - } - - } -} diff --git a/src/main/java/top/r3944realms/lib39/example/core/event/ExServerEventHandler.java b/src/main/java/top/r3944realms/lib39/example/core/event/ExServerEventHandler.java deleted file mode 100644 index 9a46faf..0000000 --- a/src/main/java/top/r3944realms/lib39/example/core/event/ExServerEventHandler.java +++ /dev/null @@ -1,16 +0,0 @@ -package top.r3944realms.lib39.example.core.event; - -/** - * The type Server handler. - */ -public class ExServerEventHandler { - /** - * The type Mod. - */ - public static class Mod extends ExServerEventHandler {} - - /** - * The type Game. - */ - public static class Game extends ExServerEventHandler {} -} diff --git a/src/main/java/top/r3944realms/lib39/example/core/network/ClientDataPacket.java b/src/main/java/top/r3944realms/lib39/example/core/network/ClientDataPacket.java deleted file mode 100644 index f99e27d..0000000 --- a/src/main/java/top/r3944realms/lib39/example/core/network/ClientDataPacket.java +++ /dev/null @@ -1,69 +0,0 @@ -package top.r3944realms.lib39.example.core.network; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.network.NetworkEvent; -import top.r3944realms.lib39.example.content.data.TestSyncData; -import top.r3944realms.lib39.example.content.item.FabricItem; - -import java.util.function.Supplier; - -/** - * The type Client data packet. - */ -public class ClientDataPacket { - private final TestSyncData clientData; - private final int targetEntityId; - - /** - * Instantiates a new Client data packet. - * - * @param clientData the client data - * @param targetEntityId the target entity id - */ - public ClientDataPacket(TestSyncData clientData, int targetEntityId) { - this.clientData = clientData; - this.targetEntityId = targetEntityId; - } - - /** - * Instantiates a new Client data packet. - * - * @param buf the buf - */ - public ClientDataPacket(FriendlyByteBuf buf) { - this.clientData = TestSyncData.staticFromBytes(buf); - this.targetEntityId = buf.readInt(); - } - - /** - * To bytes. - * - * @param buf the buf - */ - public void toBytes(FriendlyByteBuf buf) { - clientData.toBytes(buf); - buf.writeInt(targetEntityId); - } - - /** - * Handle. - * - * @param supplier the supplier - */ - public void handle(Supplier supplier) { - NetworkEvent.Context context = supplier.get(); - context.enqueueWork(() -> { - ServerPlayer player = context.getSender(); - if (player != null) { - // 处理客户端发送的数据 - handleClientData(player, clientData, targetEntityId); - } - }); - context.setPacketHandled(true); - } - - private void handleClientData(ServerPlayer player, TestSyncData clientData, int targetEntityId) { - FabricItem.handleClientDataFromPacket(player, clientData, targetEntityId); - } -} \ No newline at end of file diff --git a/src/main/java/top/r3944realms/lib39/example/core/network/ExNetworkHandler.java b/src/main/java/top/r3944realms/lib39/example/core/network/ExNetworkHandler.java deleted file mode 100644 index 63a37c5..0000000 --- a/src/main/java/top/r3944realms/lib39/example/core/network/ExNetworkHandler.java +++ /dev/null @@ -1,37 +0,0 @@ -package top.r3944realms.lib39.example.core.network; - -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.network.NetworkRegistry; -import net.minecraftforge.network.simple.SimpleChannel; -import top.r3944realms.lib39.Lib39; - -/** - * The type Ex network handler. - */ -public class ExNetworkHandler { - /** - * The constant INSTANCE. - */ - public static final SimpleChannel INSTANCE; - private static int ID = 0; - - static { - INSTANCE = NetworkRegistry.newSimpleChannel( - Lib39.rl(Lib39.MOD_ID, "test"), - () -> "1.0", - s -> true, - s -> true - ); - } - - /** - * Register. - */ - public static void register() { - // 注册数据包 - INSTANCE.registerMessage(ID++, ClientDataPacket.class, - ClientDataPacket::toBytes, - ClientDataPacket::new, - ClientDataPacket::handle); - } -} \ No newline at end of file diff --git a/src/main/java/top/r3944realms/lib39/example/core/register/ExLib39Items.java b/src/main/java/top/r3944realms/lib39/example/core/register/ExLib39Items.java deleted file mode 100644 index 78e9561..0000000 --- a/src/main/java/top/r3944realms/lib39/example/core/register/ExLib39Items.java +++ /dev/null @@ -1,62 +0,0 @@ -package top.r3944realms.lib39.example.core.register; - -import net.minecraft.world.item.Item; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; -import top.r3944realms.lib39.Lib39; -import top.r3944realms.lib39.example.content.item.FabricItem; -import top.r3944realms.lib39.example.content.item.ForgeItem; -import top.r3944realms.lib39.example.content.item.NeoForgeItem; - -/** - * The type Ex lib 39 items. - */ -public class ExLib39Items { - /** - * The constant ITEMS. - */ - public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, Lib39.MOD_ID); - /** - * The constant SUPER_LEAD_ROPE. - */ - public static final RegistryObject FABRIC = ITEMS.register( - "fabric", - () -> new FabricItem( - new Item.Properties() - .stacksTo(1) - .fireResistant() - ) - ); - /** - * The constant ETERNAL_POTATO. - */ - public static final RegistryObject NEOFORGE = - ITEMS.register("neoforge", - () -> new NeoForgeItem( - new Item.Properties() - .stacksTo(1) - .fireResistant() - )); - /** - * The constant FORGE. - */ - public static final RegistryObject FORGE = - ITEMS.register("forge", - () -> new ForgeItem( - new Item.Properties() - .stacksTo(1) - .fireResistant() - )); - - /** - * Register. - * - * @param bus the bus - */ - public static void register(IEventBus bus) { - ITEMS.register(bus); - } - -} diff --git a/src/main/java/top/r3944realms/lib39/mixin/Lib39MixinPlugin.java b/src/main/java/top/r3944realms/lib39/mixin/Lib39MixinPlugin.java deleted file mode 100644 index ffceda1..0000000 --- a/src/main/java/top/r3944realms/lib39/mixin/Lib39MixinPlugin.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * * - * * Copyright (c) 2025 R3944Realms. All rights reserved. - * * - * * This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. - * * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/4.0/ - * * or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. - * * - * * 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 - * - */ - -package top.r3944realms.lib39.mixin; - -import com.llamalad7.mixinextras.MixinExtrasBootstrap; -import org.objectweb.asm.tree.ClassNode; -import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; -import org.spongepowered.asm.mixin.extensibility.IMixinInfo; - -import java.util.List; -import java.util.Set; - -/** - * The type Lib 39 mixin plugin. - */ -public class Lib39MixinPlugin implements IMixinConfigPlugin { - public void onLoad(String mixinPackage) { - MixinExtrasBootstrap.init(); - } - - @Override - public String getRefMapperConfig() { - return null; - } - - @Override - public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - return true; - } - - @Override - public void acceptTargets(Set myTargets, Set otherTargets) { - } - - @Override - public List getMixins() { - return null; - } - - @Override - public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { - } - - @Override - public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { - } -} diff --git a/src/main/java/top/r3944realms/lib39/mixin/carryon/MixinCarriedObjectRender.java b/src/main/java/top/r3944realms/lib39/mixin/carryon/MixinCarriedObjectRender.java deleted file mode 100644 index 9eed070..0000000 --- a/src/main/java/top/r3944realms/lib39/mixin/carryon/MixinCarriedObjectRender.java +++ /dev/null @@ -1,52 +0,0 @@ -package top.r3944realms.lib39.mixin.carryon; - -import com.llamalad7.mixinextras.sugar.Local; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import org.spongepowered.asm.mixin.Debug; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Pseudo; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyVariable; -import top.r3944realms.lib39.content.item.DollItem; -import top.r3944realms.lib39.util.GameProfileHelper; -import tschipp.carryon.client.render.CarriedObjectRender; -import tschipp.carryon.common.carry.CarryOnDataManager; - -/** - * The type Mixin carried object render. - */ -@Pseudo -@Mixin(value = CarriedObjectRender.class, remap = false) -public class MixinCarriedObjectRender { - @ModifyVariable( - method = "drawFirstPersonBlock", - at = @At( - value = "LOAD", - target = "Ltschipp/carryon/client/render/CarryRenderHelper;renderBakedModel(Lnet/minecraft/world/item/ItemStack;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/client/resources/model/BakedModel;)V" - ) - ) - private static ItemStack warpDollItem$1(ItemStack stack, @Local(ordinal = 0, argsOnly = true) Player player) { - if (stack.getItem() instanceof DollItem) { - CompoundTag compound = CarryOnDataManager.getCarryData(player).getNbt().getCompound("tile").getCompound(GameProfileHelper.TAG_OWN_PROFILE); - stack.getOrCreateTag().put(GameProfileHelper.TAG_OWN_PROFILE, compound); - } - return stack; - } - @ModifyVariable( - method = "drawThirdPerson", - at = @At( - value = "LOAD", - target = "Ltschipp/carryon/client/render/CarryRenderHelper;renderBakedModel(Lnet/minecraft/world/item/ItemStack;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/client/resources/model/BakedModel;)V" - ) - ) - private static ItemStack warpDollItem$2(ItemStack stack, @Local(ordinal = 0) Player player) { - if (stack.getItem() instanceof DollItem) { - CompoundTag compound = CarryOnDataManager.getCarryData(player).getNbt().getCompound("tile").getCompound(GameProfileHelper.TAG_OWN_PROFILE); - stack.getOrCreateTag().put(GameProfileHelper.TAG_OWN_PROFILE, compound); - } - return stack; - } - -} diff --git a/src/main/java/top/r3944realms/lib39/mixin/init/MixinDedicateServer.java b/src/main/java/top/r3944realms/lib39/mixin/init/MixinDedicateServer.java deleted file mode 100644 index 0d9ce29..0000000 --- a/src/main/java/top/r3944realms/lib39/mixin/init/MixinDedicateServer.java +++ /dev/null @@ -1,53 +0,0 @@ -package top.r3944realms.lib39.mixin.init; - -import com.mojang.datafixers.DataFixer; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.ServerInterface; -import net.minecraft.server.Services; -import net.minecraft.server.WorldStem; -import net.minecraft.server.dedicated.DedicatedServer; -import net.minecraft.server.level.progress.ChunkProgressListenerFactory; -import net.minecraft.server.packs.repository.PackRepository; -import net.minecraft.world.level.storage.LevelStorageSource; -import net.minecraftforge.common.MinecraftForge; -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.CallbackInfoReturnable; -import top.r3944realms.lib39.api.event.MinecraftSetUpServiceEvent; - -import java.net.Proxy; - -/** - * The type Mixin dedicate server. - */ -@Mixin(DedicatedServer.class) -public abstract class MixinDedicateServer extends MinecraftServer implements ServerInterface { - /** - * Instantiates a new Mixin dedicate server. - * - * @param serverThread the server thread - * @param storageSource the storage source - * @param packRepository the pack repository - * @param worldStem the world stem - * @param proxy the proxy - * @param fixerUpper the fixer upper - * @param services the services - * @param progressListenerFactory the progress listener factory - */ - public MixinDedicateServer(Thread serverThread, LevelStorageSource.LevelStorageAccess storageSource, PackRepository packRepository, WorldStem worldStem, Proxy proxy, DataFixer fixerUpper, Services services, ChunkProgressListenerFactory progressListenerFactory) { - super(serverThread, storageSource, packRepository, worldStem, proxy, fixerUpper, services, progressListenerFactory); - } - - @Inject( - method = "initServer", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/server/players/GameProfileCache;setUsesAuthentication(Z)V", - shift = At.Shift.AFTER - ) - ) - private void initServer$setup(CallbackInfoReturnable cir) { - MinecraftForge.EVENT_BUS.post(new MinecraftSetUpServiceEvent(this.services,this)); - } -} diff --git a/src/main/java/top/r3944realms/lib39/mixin/init/MixinMinecraft.java b/src/main/java/top/r3944realms/lib39/mixin/init/MixinMinecraft.java deleted file mode 100644 index 8fdb48f..0000000 --- a/src/main/java/top/r3944realms/lib39/mixin/init/MixinMinecraft.java +++ /dev/null @@ -1,77 +0,0 @@ -package top.r3944realms.lib39.mixin.init; - -import com.llamalad7.mixinextras.sugar.Local; -import com.mojang.blaze3d.platform.WindowEventHandler; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.server.Services; -import net.minecraft.server.WorldStem; -import net.minecraft.server.packs.repository.PackRepository; -import net.minecraft.util.thread.ReentrantBlockableEventLoop; -import net.minecraft.world.level.storage.LevelStorageSource; -import net.minecraftforge.common.MinecraftForge; -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 top.r3944realms.lib39.api.event.MinecraftSetUpServiceEvent; - -/** - * The type Mixin minecraft. - */ -@Mixin(Minecraft.class) -public abstract class MixinMinecraft extends ReentrantBlockableEventLoop implements WindowEventHandler, net.minecraftforge.client.extensions.IForgeMinecraft { - /** - * Instantiates a new Mixin minecraft. - * - * @param name the name - */ - public MixinMinecraft(String name) { - super(name); - } - - /** - * Set level setup. - * - * @param levelClient the level client - * @param ci the ci - * @param services the services - */ - @Inject( - method = "setLevel", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/server/players/GameProfileCache;setUsesAuthentication(Z)V", - shift = At.Shift.AFTER - ) - ) - public void setLevel$setup(ClientLevel levelClient, CallbackInfo ci, - @Local(ordinal = 0) Services services) { - MinecraftForge.EVENT_BUS.post(new MinecraftSetUpServiceEvent(services,this)); - } - - /** - * Do world load setup. - * - * @param levelId the level id - * @param level the level - * @param packRepository the pack repository - * @param worldStem the world stem - * @param newWorld the new world - * @param ci the ci - * @param services the services - */ - @Inject( - method = "doWorldLoad", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/server/players/GameProfileCache;setUsesAuthentication(Z)V", - shift = At.Shift.AFTER - ) - ) - public void doWorldLoad$setup(String levelId, LevelStorageSource.LevelStorageAccess level, PackRepository packRepository, WorldStem worldStem, boolean newWorld, CallbackInfo ci, - @Local(ordinal = 0) Services services) { - MinecraftForge.EVENT_BUS.post(new MinecraftSetUpServiceEvent(services,this)); - } -} - diff --git a/src/main/java/top/r3944realms/lib39/util/GameProfileHelper.java b/src/main/java/top/r3944realms/lib39/util/GameProfileHelper.java deleted file mode 100644 index 56a5dc6..0000000 --- a/src/main/java/top/r3944realms/lib39/util/GameProfileHelper.java +++ /dev/null @@ -1,335 +0,0 @@ -package top.r3944realms.lib39.util; - -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.mojang.authlib.GameProfile; -import com.mojang.authlib.properties.Property; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.PlayerInfo; -import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.client.resources.DefaultPlayerSkin; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import top.r3944realms.lib39.util.nbt.NBTReader; -import top.r3944realms.lib39.util.nbt.NBTWriter; - -import java.nio.charset.StandardCharsets; -import java.util.Base64; -import java.util.Collection; -import java.util.Objects; -import java.util.concurrent.atomic.AtomicReference; - -/** - * The type GameProfile helper. - */ -public class GameProfileHelper { - /** - * The constant TAG_BE. - */ - public static final String TAG_BE = "BlockEntityTag"; - /** - * The constant TAG_OWN_PROFILE. - */ - public static final String TAG_OWN_PROFILE = "OwnerProfile"; - - - /** - * Gets skin texture. - * - * @param gameProfile the game profile - * @return the skin texture - */ - @OnlyIn(Dist.CLIENT) - public static ResourceLocation getSkinTexture(@Nullable GameProfile gameProfile) { - if (gameProfile == null) { - return DefaultPlayerSkin.getDefaultSkin(); - } - return resolveSkinTexture(gameProfile); - } - - /** - * Resolve skin texture resource location. - * - * @param gameProfile the game profile - * @return the resource location - */ - @OnlyIn(Dist.CLIENT) - public static @NotNull ResourceLocation resolveSkinTexture(@NotNull GameProfile gameProfile) { - Minecraft minecraft = Minecraft.getInstance(); - return minecraft.getSkinManager() - .getInsecureSkinLocation(gameProfile); - } - - /** - * Has slim arms boolean. - * - * @param player the player - * @return the boolean - */ -// 判断玩家是否使用纤细手臂 - public static boolean hasSlimArms(@NotNull Player player) { - if (player.level().isClientSide) { - return hasSlimArmsClient(player); - } else { - return hasSlimArmsServer(player); - } - } - - // 客户端判断 - @OnlyIn(Dist.CLIENT) - private static boolean hasSlimArmsClient(Player player) { - if (player instanceof AbstractClientPlayer clientPlayer) { - PlayerInfo playerInfo = Objects.requireNonNull(Minecraft.getInstance() - .getConnection()) - .getPlayerInfo(clientPlayer.getUUID()); - return playerInfo != null && "slim".equals(playerInfo.getModelName()); - } - return false; - } - - // 服务器端判断 - private static boolean hasSlimArmsServer(@NotNull Player player) { - GameProfile profile = player.getGameProfile(); - for (Property property : profile.getProperties().get("textures")) { - try { - String json = new String(Base64.getDecoder().decode(property.getValue())); - JsonObject obj = JsonParser.parseString(json).getAsJsonObject(); - JsonObject textures = obj.getAsJsonObject("textures"); - JsonObject skin = textures.getAsJsonObject("SKIN"); - - if (skin.has("metadata")) { - JsonObject metadata = skin.getAsJsonObject("metadata"); - if (metadata.has("model")) { - return "slim".equals(metadata.get("model").getAsString()); - } - } - } catch (Exception e) { - // 解析失败,使用默认 - } - } - return false; - } - - /** - * Gets skin model name. - * - * @param player the player - * @return the skin model name - */ -// 获取皮肤模型名称 - @OnlyIn(Dist.CLIENT) - public static @NotNull String getSkinModelName(@NotNull Player player) { - if (player.level().isClientSide && player instanceof AbstractClientPlayer) { - PlayerInfo info = Objects.requireNonNull(Minecraft.getInstance().getConnection()) - .getPlayerInfo(player.getUUID()); - return info != null ? info.getModelName() : "default"; - } - return "default"; - } - - /** - * 判断玩家是否为纤细手臂(Alex模型) - * - * @param profile 玩家的GameProfile - * @return true =纤细手臂,false=正常手臂 - */ - public static boolean isSlimArms(GameProfile profile) { - if (profile == null) { - return false; - } - - // 获取textures属性 - Collection textures = profile.getProperties().get("textures"); - if (textures.isEmpty()) { - return false; // 没有皮肤数据,使用默认 - } - - // 获取第一个texture属性(通常是皮肤) - Property textureProperty = textures.iterator().next(); - String value = textureProperty.getValue(); - - try { - return isSlimFromTextureData(value); - } catch (Exception e) { - // 解析失败,使用默认 - return false; - } - } - - /** - * 从Base64编码的皮肤数据判断 - * @param encodedTexture Base64编码的皮肤数据 - * @return true=纤细手臂 - */ - private static boolean isSlimFromTextureData(String encodedTexture) { - if (encodedTexture == null || encodedTexture.isEmpty()) { - return false; - } - - try { - // 1. Base64解码 - byte[] decodedBytes = Base64.getDecoder().decode(encodedTexture); - String jsonString = new String(decodedBytes, StandardCharsets.UTF_8); - - // 2. 解析JSON - JsonObject root = JsonParser.parseString(jsonString).getAsJsonObject(); - - // 3. 导航到textures -> SKIN - JsonObject textures = root.getAsJsonObject("textures"); - if (textures == null) { - return false; - } - - JsonObject skin = textures.getAsJsonObject("SKIN"); - if (skin == null) { - return false; - } - - // 4. 检查metadata -> model - JsonObject metadata = skin.getAsJsonObject("metadata"); - if (metadata == null) { - return false; // 没有metadata,使用默认 - } - - String model = metadata.get("model").getAsString(); - return "slim".equals(model); - - } catch (Exception e) { - // 解析过程中出现任何错误,返回默认值 - return false; - } - } - - /** - * 获取皮肤模型名称 - * - * @param profile GameProfile - * @return "slim" 或 "default" - */ - public static String getSkinModelName(GameProfile profile) { - if (profile == null) { - return "default"; - } - - Collection textures = profile.getProperties().get("textures"); - if (textures.isEmpty()) { - return "default"; - } - - Property textureProperty = textures.iterator().next(); - String value = textureProperty.getValue(); - - try { - byte[] decodedBytes = Base64.getDecoder().decode(value); - String jsonString = new String(decodedBytes, StandardCharsets.UTF_8); - JsonObject root = JsonParser.parseString(jsonString).getAsJsonObject(); - JsonObject texturesObj = root.getAsJsonObject("textures"); - JsonObject skin = texturesObj.getAsJsonObject("SKIN"); - - if (skin.has("metadata")) { - JsonObject metadata = skin.getAsJsonObject("metadata"); - if (metadata.has("model")) { - return metadata.get("model").getAsString(); - } - } - } catch (Exception e) { - // 忽略错误 - } - - return "default"; - } - - /** - * 从ItemStack的NBT中读取GameProfile - * - * @param stack the stack - * @return the profile from item stack - */ - @Nullable - public static GameProfile getProfileFromItemStack(ItemStack stack) { - if (stack.isEmpty()) { - return null; - } - - CompoundTag tag = stack.getTag(); - if (tag == null) { - return null; - } - AtomicReference profileRef = new AtomicReference<>(); - // 检查方块实体数据 - NBTReader.of(tag) - .compound(TAG_BE, compoundTag -> - NBTReader.of(compoundTag) - .compound("OwnerProfile", ct -> profileRef.set(NbtUtils.readGameProfile(ct))) - ) - .compound("OwnerProfile", ct -> { - if (profileRef.get() == null) { //兼容写法 - profileRef.set(NbtUtils.readGameProfile(ct)); - } - }); - return profileRef.get(); - } - - /** - * 将GameProfile保存到ItemStack的NBT - * - * @param stack the stack - * @param profile the profile - */ - public static void saveProfileToItemStack(@NotNull ItemStack stack, @Nullable GameProfile profile) { - if (stack.isEmpty()) { - return; - } - - CompoundTag tag = stack.getOrCreateTag(); - - if (profile == null) { - // 移除现有数据 - NBTReader.of(tag) - .compound(TAG_BE, ct -> tag.remove(TAG_OWN_PROFILE)); - tag.remove(TAG_BE); - tag.remove(TAG_OWN_PROFILE); - return; - } - - // 创建方块实体数据 - NBTWriter.of(tag) - .compound(TAG_BE, writer -> - writer - .compound(TAG_OWN_PROFILE, NbtUtils.writeGameProfile(new CompoundTag(), profile)) - ); - } - - /** - * 检查ItemStack是否有保存的皮肤数据 - * - * @param stack the stack - * @return the boolean - */ - public static boolean hasProfileData(@NotNull ItemStack stack) { - if (stack.isEmpty()) { - return false; - } - - CompoundTag tag = stack.getTag(); - if (tag == null) { - return false; - } - - if (tag.contains(TAG_BE)) { - CompoundTag blockEntityTag = tag.getCompound(TAG_BE); - return blockEntityTag.contains(TAG_OWN_PROFILE); - } - - return tag.contains(TAG_OWN_PROFILE); - } - -} - diff --git a/src/main/java/top/r3944realms/lib39/util/block/BlockRegistryBuilder.java b/src/main/java/top/r3944realms/lib39/util/block/BlockRegistryBuilder.java deleted file mode 100644 index fcd0a6f..0000000 --- a/src/main/java/top/r3944realms/lib39/util/block/BlockRegistryBuilder.java +++ /dev/null @@ -1,145 +0,0 @@ -package top.r3944realms.lib39.util.block; - -import net.minecraft.client.renderer.item.ItemProperties; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.CreativeModeTabs; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.RegistryObject; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; -import top.r3944realms.lib39.core.event.CommonEventHandler; - -import java.util.function.Supplier; - -/** - * The type Block registry builder. - */ -@SuppressWarnings({"UnusedReturnValue", "unused"}) -public class BlockRegistryBuilder { - private String registryName; - private RegistryObject blockObject; - private DeferredRegister items; - private boolean needBuildItem; - private Item.Properties properties; - - /** - * 创建新的构建器实例 - * - * @return the block registry builder - */ - @Contract(value = " -> new", pure = true) - public static @NotNull BlockRegistryBuilder create() { - return new BlockRegistryBuilder(); - } - - /** - * 设置注册名称 - * - * @param name the name - * @return the block registry builder - */ - public BlockRegistryBuilder withName(String name) { - this.registryName = name; - return this; - } - - /** - * 注册方块(不自动注册物品) - * - * @param blockRegister the block register - * @param blockSupplier the block supplier - * @return the block registry builder - */ - public BlockRegistryBuilder registerBlock(@NotNull DeferredRegister blockRegister, Supplier blockSupplier) { - this.blockObject = blockRegister.register(this.registryName, blockSupplier); - return this; - } - - /** - * 注册对应的方块物品 - * - * @param itemRegister the item deferred register - * @return the block registry builder - */ - public BlockRegistryBuilder registerItem(DeferredRegister itemRegister) { - this.items = itemRegister; - needBuildItem = true; - return this; - } - - /** - * 注册对应的方块带有对应属性物品 - * - * @param itemRegister the item deferred register - * @param properties the item properties - * @return the block registry builder - */ - public BlockRegistryBuilder registerItemWithProperties(DeferredRegister itemRegister, Item.Properties properties) { - this.items = itemRegister; - this.properties = properties; - needBuildItem = true; - return this; - } - - /** - * 对应的方块物品属性 - * - * @param properties the item properties - * @return the block registry builder - */ - public BlockRegistryBuilder ItemProperties(Item.Properties properties) { - this.properties = properties; - return this; - } - - /** - * 内部方法:注册对应的方块物品 - */ - @SafeVarargs - private void registerBlockItem(RegistryObject blockObject, ResourceKey... creativeTabs) { - CommonEventHandler.Mod.addItemToTabs(blockObject, creativeTabs); - } - - /** - * 注册方块和物品到建筑标签页 - * - * @param blockRegister the block register - * @param blockSupplier the block supplier - * @return the block registry builder - */ - public BlockRegistryBuilder registerWithBuildingTab(DeferredRegister blockRegister, Supplier blockSupplier) { - registerBlock(blockRegister, blockSupplier); - registerBlockItem(this.blockObject, CreativeModeTabs.BUILDING_BLOCKS); - return this; - } - - /** - * 注册方块和物品到功能标签页 - * - * @param blockRegister the block register - * @param blockSupplier the block supplier - * @return the block registry builder - */ - public BlockRegistryBuilder registerWithFunctionalTab(DeferredRegister blockRegister, Supplier blockSupplier) { - registerBlock(blockRegister, blockSupplier); - registerBlockItem(this.blockObject, CreativeModeTabs.FUNCTIONAL_BLOCKS); - return this; - } - - /** - * 获取注册的方块对象 - * - * @return the registry object - */ - public RegistryObject build() { - if (needBuildItem) { - items.register(this.registryName, () -> new BlockItem(this.blockObject.get(), properties == null ? new Item.Properties() : properties)); - } - return this.blockObject; - } - -} diff --git a/src/main/resources/assets/lib39/models/block/base_doll.json b/src/main/resources/assets/lib39/models/block/base_doll.json deleted file mode 100644 index c8574d2..0000000 --- a/src/main/resources/assets/lib39/models/block/base_doll.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "format_version": "1.9.0", - "credit": "3D Model © 2025 LeisureTimeDock", - "parent": "builtin/entity", - "textures": { - "particle": "minecraft:block/white_wool" - }, - "display": { - "thirdperson_righthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "thirdperson_lefthand": { - "rotation": [75, 45, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 124, 0], - "translation": [2, 3, 0], - "scale": [0.4, 0.4, 0.4] - }, - "firstperson_lefthand": { - "rotation": [0, 120, 0], - "translation": [1.5, 2.75, 0], - "scale": [0.4, 0.4, 0.4] - }, - "ground": { - "translation": [0, 2, 0], - "scale": [0.5, 0.5, 0.5] - }, - "gui": { - "rotation": [30, -135, 0], - "translation": [0.75, -1, 0], - "scale": [0.625, 0.625, 0.625] - }, - "head": { - "translation": [0, 14, -0.75] - }, - "fixed": { - "translation": [0, 0, -2.75], - "scale": [0.5, 0.5, 0.5] - }, - "on_shelf": { - "rotation": [0, -180, 0], - "translation": [0, 0, 5.25] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/lib39/shaders/core/ring.fsh b/src/main/resources/assets/lib39/shaders/core/ring.fsh deleted file mode 100644 index 39aa703..0000000 --- a/src/main/resources/assets/lib39/shaders/core/ring.fsh +++ /dev/null @@ -1,49 +0,0 @@ -#version 150 - -in vec4 vertexColor; - -uniform vec4 ColorModulator; -uniform vec2 Center; -uniform float InnerRadius; -uniform float OuterRadius; -uniform float AntiAliasing; - -out vec4 fragColor; - -void main() { - float dist = distance(gl_FragCoord.xy, Center); - float alpha = 0.0; - - // 确保内外半径合理 - if (OuterRadius <= InnerRadius) { - vec4 color = vertexColor; - color.a = 0; - fragColor = color; - } - - // 计算环形 alpha - if (dist >= InnerRadius && dist <= OuterRadius) { - alpha = 1.0; - - // 内边缘抗锯齿 - if (dist < InnerRadius + AntiAliasing) { - float fade = (dist - InnerRadius) / AntiAliasing; - alpha *= fade; - } - - // 外边缘抗锯齿 - if (dist > OuterRadius - AntiAliasing) { - float fade = 1.0 - (dist - (OuterRadius - AntiAliasing)) / AntiAliasing; - alpha *= fade; - } - } - - vec4 color = vertexColor; - color.a *= alpha; - - if (alpha > 0.0) { - fragColor = color * ColorModulator; - } else { - discard; - } -} \ No newline at end of file diff --git a/src/main/resources/assets/lib39/shaders/core/ring.json b/src/main/resources/assets/lib39/shaders/core/ring.json deleted file mode 100644 index 756ea0c..0000000 --- a/src/main/resources/assets/lib39/shaders/core/ring.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "vertex": "position_color", - "fragment": "lib39:ring", - "samplers": [ - ], - "uniforms": [ - { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, - { - "name": "Center", - "type": "float", - "count": 2, - "values": [ - 0.0, - 0.0 - ] - }, - { - "name": "InnerRadius", - "type": "float", - "count": 1, - "values": [ - 0.0 - ] - }, - { - "name": "OuterRadius", - "type": "float", - "count": 1, - "values": [ - 0.0 - ] - }, - { - "name": "AntiAliasing", - "type": "float", - "count": 1, - "values": [ - 1.25 - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/lib39/shaders/core/selection.fsh b/src/main/resources/assets/lib39/shaders/core/selection.fsh deleted file mode 100644 index 27e9904..0000000 --- a/src/main/resources/assets/lib39/shaders/core/selection.fsh +++ /dev/null @@ -1,23 +0,0 @@ -#version 150 - -in vec4 vertexColor; - -uniform vec4 ColorModulator; -uniform vec2 FramebufferSize; -uniform vec2 Center; -uniform float Radius; -uniform float AntiAliasingRadius; - -out vec4 fragColor; - -void main() { - vec2 fragPos = vec2(gl_FragCoord.x, FramebufferSize.y - gl_FragCoord.y); - float distance = distance(fragPos, Center); - vec4 color = vec4(0, 0, 0, 0); - if (distance <= Radius) { - color = vertexColor; - color.a = smoothstep(Radius, 0.0, distance) * vertexColor.a; - } - - fragColor = color * ColorModulator; -} \ No newline at end of file diff --git a/src/main/resources/assets/lib39/shaders/core/selection.json b/src/main/resources/assets/lib39/shaders/core/selection.json deleted file mode 100644 index b9a2e52..0000000 --- a/src/main/resources/assets/lib39/shaders/core/selection.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "vertex": "position_color", - "fragment": "lib39:selection", - "samplers": [ - ], - "uniforms": [ - { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, - { - "name": "Center", - "type": "float", - "count": 2, - "values": [ - 0.0, - 0.0 - ] - }, - { - "name": "FramebufferSize", - "type": "float", - "count": 2, - "values": [ - 0.0, - 0.0 - ] - }, - { - "name": "Radius", - "type": "float", - "count": 1, - "values": [ - 0.0 - ] - }, - { - "name": "AntiAliasingRadius", - "type": "float", - "count": 1, - "values": [ - 1.5 - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/lib39/sounds/duck_toy.ogg b/src/main/resources/assets/lib39/sounds/duck_toy.ogg deleted file mode 100644 index b74d0067e88c2914449bd4846b7d7f08b160544b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13528 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 D!tIq! diff --git a/src/main/resources/assets/lib39/textures/item/fabric.png b/src/main/resources/assets/lib39/textures/item/fabric.png deleted file mode 100644 index 4ab8370ff4b4de7b4ab665a6628e07b3f94cb44d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5867 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 BTp|Df diff --git a/src/main/resources/assets/lib39/textures/item/forge.png b/src/main/resources/assets/lib39/textures/item/forge.png deleted file mode 100644 index 22a6c8f8dde7c240a4bab7b740f76f872b37fa3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3622 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

bJDWB{ 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

US@2i~KC&9x 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 z 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%0D$Bx7X)z*v~1d)q){?X?JC+Z*g8Kw)5du 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 Y57rd}*Hn}$OaK4?07*qoM6N<$f-|ZOX#fBK diff --git a/src/main/templates/META-INF/mods.toml b/src/main/templates/META-INF/mods.toml deleted file mode 100644 index 07e87be..0000000 --- a/src/main/templates/META-INF/mods.toml +++ /dev/null @@ -1,88 +0,0 @@ -# This is an example mods.toml file. It contains the data relating to the loading mods. -# There are several mandatory fields (#mandatory), and many more that are optional (#optional). -# The overall format is standard TOML format, v0.5.0. -# Note that there are a couple of TOML lists in this file. -# Find more information on toml format here: https://github.com/toml-lang/toml -# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml -modLoader="javafml" #mandatory - -# A version range to match for said mod loader - for regular FML @Mod it will be the Forge version -loaderVersion="${loader_version_range}" #mandatory This is typically bumped every Minecraft version by Forge. See download page for lists of versions. - -# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties. -# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here. -license="${mod_license}" - -# A URL to refer people to when problems occur with this mod -#issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional - -# If your mod is purely client-side and has no multiplayer functionality (be it dedicated servers or Open to LAN), -# set this to true, and Forge will set the correct displayTest for you and skip loading your mod on dedicated servers. -#clientSideOnly=true #optional - defaults to false if absent - -# A list of mods - how many allowed here is determined by the individual mod loader -[[mods]] #mandatory - -# The modid of the mod -modId="${mod_id}" #mandatory - -# The version number of the mod -version="${mod_version}" #mandatory - -# A display name for the mod -displayName="${mod_name}" #mandatory -# A URL to query for updates for this mod. See the JSON update specification https://docs.minecraftforge.net/en/latest/misc/updatechecker/ -#updateJSONURL="https://change.me.example.invalid/updates.json" #optional - -# A URL for the "homepage" for this mod, displayed in the mod UI -#displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional - -# A file name (in the root of the mod JAR) containing a logo for display -logoFile="lib39_logo.png" #optional - -# A text field displayed in the mod UI -credits="${mod_credits}" #optional - -# A text field displayed in the mod UI -authors="${mod_authors}" #optional - -# Display Test controls the display for your mod in the server connection screen -# MATCH_VERSION means that your mod will cause a red X if the versions on client and server differ. This is the default behaviour and should be what you choose if you have server and client elements to your mod. -# IGNORE_SERVER_VERSION means that your mod will not cause a red X if it's present on the server but not on the client. This is what you should use if you're a server only mod. -# IGNORE_ALL_VERSION means that your mod will not cause a red X if it's present on the client or the server. This is a special case and should only be used if your mod has no server component. -# NONE means that no display test is set on your mod. You need to do this yourself, see IExtensionPoint.DisplayTest for more information. You can define any scheme you wish with this value. -# IMPORTANT NOTE: this is NOT an instruction as to which environments (CLIENT or DEDICATED SERVER) your mod loads on. Your mod should load (and maybe do nothing!) whereever it finds itself. -#displayTest="MATCH_VERSION" # if nothing is specified, MATCH_VERSION is the default when clientSideOnly=false, otherwise IGNORE_ALL_VERSION when clientSideOnly=true (#optional) - -# The description text for the mod (multi line!) (#mandatory) -description='''${mod_description}''' - -# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. -[[dependencies.${mod_id}]] #optional - # the modid of the dependency - modId="forge" #mandatory - # Does this dependency have to exist - if not, ordering below must be specified - mandatory=true #mandatory - # The version range of the dependency - versionRange="${forge_version_range}" #mandatory - # An ordering relationship for the dependency - BEFORE or AFTER required if the dependency is not mandatory - # BEFORE - This mod is loaded BEFORE the dependency - # AFTER - This mod is loaded AFTER the dependency - ordering="NONE" - # Side this dependency is applied on - BOTH, CLIENT, or SERVER - side="BOTH" - -# Here's another dependency -[[dependencies.${mod_id}]] - modId="minecraft" - mandatory=true - # This version range declares a minimum of the current minecraft version up to but not including the next major version - versionRange="${minecraft_version_range}" - ordering="NONE" - side="BOTH" - -# Features are specific properties of the game environment, that you may want to declare you require. This example declares -# that your mod requires GL version 3.2 or higher. Other features will be added. They are side aware so declaring this won't -# stop your mod loading on the server for example. -#[features.${mod_id}] -#openGLVersion="[3.2,)" diff --git a/src/main/templates/pack.mcmeta b/src/main/templates/pack.mcmeta deleted file mode 100644 index ae03c9b..0000000 --- a/src/main/templates/pack.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "pack": { - "description": "${mod_name} resources", - "pack_format": 15 - } -} diff --git a/src/test/java/top/r3944realms/lib39/CoordinateTransformTest.java b/src/test/java/top/r3944realms/lib39/CoordinateTransformTest.java deleted file mode 100644 index 69ecec0..0000000 --- a/src/test/java/top/r3944realms/lib39/CoordinateTransformTest.java +++ /dev/null @@ -1,414 +0,0 @@ -//package top.r3944realms.lib39; -// -//import org.joml.*; -//import org.joml.Math; -//import org.junit.jupiter.api.*; -//import org.junit.jupiter.params.*; -//import org.junit.jupiter.params.provider.*; -// -//import static org.assertj.core.api.Assertions.*; -// -//public class CoordinateTransformTest { -// private static final float EPSILON = 0.0001f; -// -// // ==================== 基础变换测试 ==================== -// -// @Test -// void testWorldToLocalTransform() { -// // 创建一个变换:先缩放,再旋转,最后平移 -// Matrix4f transform = new Matrix4f() -// .translate(10, 5, 0) // 平移 -// .rotateY((float) Math.PI / 2) // 绕Y轴旋转90度 -// .scale(2, 1, 1); // X轴缩放2倍 -// -// // 世界坐标 (0,0,0) 应该变换到 (10,5,0) -// Vector4f worldPoint = new Vector4f(0, 0, 0, 1); -// Vector4f localPoint = transform.transform(worldPoint); -// -// assertThat(localPoint.x()).isCloseTo(10.0f, within(EPSILON)); -// assertThat(localPoint.y()).isCloseTo(5.0f, within(EPSILON)); -// assertThat(localPoint.z()).isCloseTo(0.0f, within(EPSILON)); -// } -// -// @Test -// void testLocalToWorldTransform() { -// // 创建一个变换 -// Matrix4f localToWorld = new Matrix4f() -// .translate(5, 3, 2) -// .rotateX((float)Math.PI / 4); -// -// // 逆变换:世界到局部 -// Matrix4f worldToLocal = new Matrix4f(localToWorld).invert(); -// -// // 测试点 -// Vector4f localPoint = new Vector4f(1, 0, 0, 1); -// -// // 局部 -> 世界 -// Vector4f worldPoint = localToWorld.transform(localPoint); -// // 世界 -> 局部 -// Vector4f backToLocal = worldToLocal.transform(worldPoint); -// -// // 应该能回到原点 -// assertThat(backToLocal.x()).isCloseTo(localPoint.x(), within(EPSILON)); -// assertThat(backToLocal.y()).isCloseTo(localPoint.y(), within(EPSILON)); -// assertThat(backToLocal.z()).isCloseTo(localPoint.z(), within(EPSILON)); -// } -// -// // ==================== 旋转测试 ==================== -// -// @ParameterizedTest -// @CsvSource({ -// "0, 1, 0, 0", // 0度旋转 -// "90, 0, 0, -1", // 90度旋转 -// "180, -1, 0, 0", // 180度旋转 -// "270, 0, 0, 1" // 270度旋转 -// }) -// void testRotationAroundYAxis(float degrees, float expectedX, float expectedY, float expectedZ) { -// float radians = (float)Math.toRadians(degrees); -// Matrix4f rotation = new Matrix4f().rotateY(radians); -// -// // 原始点 (1, 0, 0) -// Vector4f point = new Vector4f(1, 0, 0, 1); -// Vector4f rotated = rotation.transform(point); -// -// assertThat(rotated.x()).isCloseTo(expectedX, within(EPSILON)); -// assertThat(rotated.y()).isCloseTo(expectedY, within(EPSILON)); -// assertThat(rotated.z()).isCloseTo(expectedZ, within(EPSILON)); -// } -// -// @Test -// void testRotationComposition() { -// // 绕X轴旋转90度 -// Matrix4f rotX = new Matrix4f().rotateX((float)Math.PI / 2); -// // 绕Z轴旋转90度 -// Matrix4f rotZ = new Matrix4f().rotateZ((float)Math.PI / 2); -// -// // 组合旋转:先X后Z -// Matrix4f combined = rotZ.mul(rotX); -// -// // 点 (1, 0, 0) -// Vector4f point = new Vector4f(1, 0, 0, 1); -// Vector4f transformed = combined.transform(point); -// -// // 手动计算验证 -// // (1,0,0) 绕X转90度 -> (1,0,0) 实际上X轴旋转不影响X轴上的点 -// // 再绕Z转90度 -> (0,1,0) -// assertThat(transformed.x()).isCloseTo(0.0f, within(EPSILON)); -// assertThat(transformed.y()).isCloseTo(1.0f, within(EPSILON)); -// assertThat(transformed.z()).isCloseTo(0.0f, within(EPSILON)); -// } -// -// // ==================== 缩放测试 ==================== -// -// @Test -// void testNonUniformScaling() { -// Matrix4f scale = new Matrix4f().scale(2, 0.5f, 3); -// -// Vector4f point = new Vector4f(1, 2, 3, 1); -// Vector4f scaled = scale.transform(point); -// -// assertThat(scaled.x()).isCloseTo(2.0f, within(EPSILON)); // 1 * 2 -// assertThat(scaled.y()).isCloseTo(1.0f, within(EPSILON)); // 2 * 0.5 -// assertThat(scaled.z()).isCloseTo(9.0f, within(EPSILON)); // 3 * 3 -// } -// -// // ==================== 平移测试 ==================== -// -// @Test -// void testTranslation() { -// Matrix4f translation = new Matrix4f().translate(5, -3, 2.5f); -// -// Vector4f point = new Vector4f(1, 2, 3, 1); -// Vector4f translated = translation.transform(point); -// -// assertThat(translated.x()).isCloseTo(6.0f, within(EPSILON)); // 1 + 5 -// assertThat(translated.y()).isCloseTo(-1.0f, within(EPSILON)); // 2 - 3 -// assertThat(translated.z()).isCloseTo(5.5f, within(EPSILON)); // 3 + 2.5 -// } -// -// // ==================== 变换顺序测试 ==================== -// -// @Test -// void testTransformOrderMatters() { -// Vector4f point = new Vector4f(1, 0, 0, 1); -// -// // 顺序1:先平移后旋转 -// Matrix4f translateThenRotate = new Matrix4f() -// .rotateY((float)Math.PI / 2) // 旋转90度 -// .translate(5, 0, 0); // 平移 -// -// // 顺序2:先旋转后平移 -// Matrix4f rotateThenTranslate = new Matrix4f() -// .translate(5, 0, 0) -// .rotateY((float)Math.PI / 2); -// -// Vector4f result1 = translateThenRotate.transform(point); -// Vector4f result2 = rotateThenTranslate.transform(point); -// -// // 两个结果应该不同 -// assertThat(result1.x()).isNotCloseTo(result2.x(), within(EPSILON)); -// assertThat(result1.z()).isNotCloseTo(result2.z(), within(EPSILON)); -// -// // 验证具体值 -// // 顺序1:点(1,0,0) 先平移->(6,0,0) 再旋转90度->(0,0,-6) -// assertThat(result1.x()).isCloseTo(0.0f, within(EPSILON)); -// assertThat(result1.z()).isCloseTo(-6.0f, within(EPSILON)); -// -// // 顺序2:点(1,0,0) 先旋转90度->(0,0,-1) 再平移->(5,0,-1) -// assertThat(result2.x()).isCloseTo(5.0f, within(EPSILON)); -// assertThat(result2.z()).isCloseTo(-1.0f, within(EPSILON)); -// } -// -// // ==================== 相机视图变换测试 ==================== -// -// @Test -// void testViewTransform() { -// // 相机在 (0,0,5),看向原点 (0,0,0),上方向为Y轴 -// Matrix4f viewMatrix = new Matrix4f() -// .lookAt(0, 0, 5, // 相机位置 -// 0, 0, 0, // 看向的点 -// 0, 1, 0); // 上方向 -// -// // 世界坐标的原点 (0,0,0) 在相机空间中应该在 (0,0,-5) -// Vector4f worldPoint = new Vector4f(0, 0, 0, 1); -// Vector4f viewPoint = viewMatrix.transform(worldPoint); -// -// assertThat(viewPoint.x()).isCloseTo(0.0f, within(EPSILON)); -// assertThat(viewPoint.y()).isCloseTo(0.0f, within(EPSILON)); -// assertThat(viewPoint.z()).isCloseTo(-5.0f, within(EPSILON)); // 相机看向-Z方向 -// } -// -// @Test -// void testLookAtMatrixProperties() { -// Vector3f eye = new Vector3f(10, 5, 10); -// Vector3f center = new Vector3f(0, 0, 0); -// Vector3f up = new Vector3f(0, 1, 0); -// -// Matrix4f view = new Matrix4f().lookAt(eye, center, up); -// -// // 1. 视图矩阵应该是正交矩阵(逆等于转置) -// Matrix4f invView = new Matrix4f(view).invert(); -// Matrix4f transposeView = new Matrix4f(view).transpose(); -// -// for (int i = 0; i < 4; i++) { -// for (int j = 0; j < 4; j++) { -// assertThat(invView.get(i, j)).isCloseTo(transposeView.get(i, j), within(EPSILON)); -// } -// } -// -// // 2. 相机位置在视图空间应该是原点 -// Vector4f eyeHomogeneous = new Vector4f(eye, 1); -// Vector4f eyeInView = view.transform(eyeHomogeneous); -// assertThat(eyeInView.x()).isCloseTo(0.0f, within(EPSILON)); -// assertThat(eyeInView.y()).isCloseTo(0.0f, within(EPSILON)); -// assertThat(eyeInView.z()).isCloseTo(0.0f, within(EPSILON)); -// } -// -// // ==================== 投影变换测试 ==================== -// -// @Test -// void testPerspectiveProjection() { -// float fov = (float)Math.toRadians(60); -// float aspect = 16.0f / 9.0f; -// float near = 0.1f; -// float far = 100.0f; -// -// Matrix4f projection = new Matrix4f().perspective(fov, aspect, near, far); -// -// // 测试近平面上的点 (0,0,-near) 应该映射到 NDC 的 z = -1 -// Vector4f nearPoint = new Vector4f(0, 0, -near, 1); -// Vector4f projected = projection.transform(nearPoint); -// projected.div(projected.w); // 透视除法 -// -// assertThat(projected.z()).isCloseTo(-1.0f, within(EPSILON)); -// -// // 测试远平面上的点 (0,0,-far) 应该映射到 NDC 的 z = 1 -// Vector4f farPoint = new Vector4f(0, 0, -far, 1); -// projected = projection.transform(farPoint); -// projected.div(projected.w); -// -// assertThat(projected.z()).isCloseTo(1.0f, within(EPSILON)); -// } -// -// @Test -// void testOrthographicProjection() { -// float left = -10, right = 10; -// float bottom = -5, top = 5; -// float near = 0.1f, far = 100.0f; -// -// Matrix4f ortho = new Matrix4f().ortho(left, right, bottom, top, near, far); -// -// // 测试边界映射 -// Vector4f leftBottomNear = new Vector4f(left, bottom, -near, 1); -// Vector4f projected = ortho.transform(leftBottomNear); -// -// // 正交投影没有透视除法,直接映射到NDC [-1,1] -// assertThat(projected.x()).isCloseTo(-1.0f, within(EPSILON)); -// assertThat(projected.y()).isCloseTo(-1.0f, within(EPSILON)); -// assertThat(projected.z()).isCloseTo(-1.0f, within(EPSILON)); -// } -// -// // ==================== MVP变换链测试 ==================== -// -// @Test -// void testMVPChain() { -// // 模型变换 -// Matrix4f model = new Matrix4f() -// .translate(5, 0, 0) -// .rotateY((float)Math.PI / 4); -// -// // 视图变换(相机) -// Matrix4f view = new Matrix4f() -// .lookAt(0, 2, 10, 0, 0, 0, 0, 1, 0); -// -// // 投影变换 -// Matrix4f projection = new Matrix4f() -// .perspective((float)Math.toRadians(60), 16.0f/9.0f, 0.1f, 100.0f); -// -// // 完整的MVP矩阵 -// Matrix4f mvp = projection.mul(view.mul(model)); -// -// // 测试局部坐标 (0,0,0) -// Vector4f localPoint = new Vector4f(0, 0, 0, 1); -// Vector4f clipPoint = mvp.transform(localPoint); -// -// // 执行透视除法 -// clipPoint.div(clipPoint.w()); -// -// // 结果应该在NDC范围内 [-1, 1] -// assertThat(clipPoint.x()).isBetween(-1.0f - EPSILON, 1.0f + EPSILON); -// assertThat(clipPoint.y()).isBetween(-1.0f - EPSILON, 1.0f + EPSILON); -// assertThat(clipPoint.z()).isBetween(-1.0f - EPSILON, 1.0f + EPSILON); -// } -// -// // ==================== 法线变换测试 ==================== -// -// @Test -// void testNormalTransformation() { -// // 创建一个包含非均匀缩放的变换 -// Matrix4f model = new Matrix4f() -// .scale(2, 1, 1) // 只在X轴缩放 -// .rotateY((float)Math.PI / 6); -// -// // 原始法线 (1,0,0) -// Vector3f normal = new Vector3f(1, 0, 0); -// -// // 错误的做法:直接使用模型矩阵的3x3部分 -// Matrix3f wrongTransform = new Matrix3f(model); -// Vector3f wrongResult = wrongTransform.transform(normal); -// -// // 正确的做法:使用逆转置矩阵 -// Matrix3f normalMatrix = new Matrix3f(model).invert().transpose(); -// Vector3f correctResult = normalMatrix.transform(normal).normalize(); -// -// // 两个结果应该不同(因为缩放不是均匀的) -// assertThat(wrongResult.x()).isNotCloseTo(correctResult.x(), within(EPSILON)); -// assertThat(wrongResult.y()).isNotCloseTo(correctResult.y(), within(EPSILON)); -// assertThat(wrongResult.z()).isNotCloseTo(correctResult.z(), within(EPSILON)); -// -// // 验证法线变换后仍保持垂直性(简化测试) -// Vector3f vertex = new Vector3f(1, 0, 0); -// Vector3f transformedVertex = new Vector3f(vertex).mul(normalMatrix); -// -// // 法线和顶点变换后的点积应该接近0(垂直) -// float dot = correctResult.dot(transformedVertex); -// assertThat(Math.abs(dot)).isCloseTo(0.0f, within(0.1f)); -// } -// -// // ==================== 四元数旋转测试 ==================== -// -// @Test -// void testQuaternionRotation() { -// // 创建绕Y轴旋转90度的四元数 -// Quaternionf quat = new Quaternionf() -// .rotateY((float)Math.PI / 2); -// -// // 转换为矩阵 -// Matrix4f matrixFromQuat = new Matrix4f().rotation(quat); -// -// // 直接创建矩阵 -// Matrix4f matrixDirect = new Matrix4f().rotateY((float)Math.PI / 2); -// -// // 两个矩阵应该相同 -// for (int i = 0; i < 4; i++) { -// for (int j = 0; j < 4; j++) { -// assertThat(matrixFromQuat.get(i, j)) -// .isCloseTo(matrixDirect.get(i, j), within(EPSILON)); -// } -// } -// -// // 测试四元数旋转点 -// Vector3f point = new Vector3f(1, 0, 0); -// Vector3f rotatedByQuat = quat.transform(point); -// Vector3f rotatedByMatrix = matrixDirect.transformPosition(point, new Vector3f()); -// -// assertThat(rotatedByQuat.x()).isCloseTo(rotatedByMatrix.x(), within(EPSILON)); -// assertThat(rotatedByQuat.y()).isCloseTo(rotatedByMatrix.y(), within(EPSILON)); -// assertThat(rotatedByQuat.z()).isCloseTo(rotatedByMatrix.z(), within(EPSILON)); -// } -// -// // ==================== 性能测试 ==================== -// -// @RepeatedTest(3) -// @DisplayName("变换矩阵性能测试") -// void testTransformPerformance() { -// int iterations = 100000; -// Matrix4f transform = new Matrix4f() -// .translate(1, 2, 3) -// .rotateXYZ(0.1f, 0.2f, 0.3f) -// .scale(1.5f); -// -// Vector4f point = new Vector4f(1, 2, 3, 1); -// -// long startTime = System.nanoTime(); -// -// for (int i = 0; i < iterations; i++) { -// Vector4f result = transform.transform(point); -// // 确保结果被使用(防止被优化掉) -// if (Float.isNaN(result.x())) { -// Assertions.fail("不应该发生"); -// } -// } -// -// long endTime = System.nanoTime(); -// long durationMs = (endTime - startTime) / 1_000_000; -// -// System.out.printf("Transform %d points in %d ms%n", iterations, durationMs); -// assertThat(durationMs).isLessThan(1000); // 应该在1秒内完成 -// } -// -// // ==================== 边缘情况测试 ==================== -// -// @Test -// void testZeroScaling() { -// Matrix4f scale = new Matrix4f().scale(0, 1, 1); -// Vector4f point = new Vector4f(1, 2, 3, 1); -// Vector4f result = scale.transform(point); -// -// assertThat(result.x()).isCloseTo(0.0f, within(EPSILON)); -// assertThat(result.y()).isCloseTo(2.0f, within(EPSILON)); -// assertThat(result.z()).isCloseTo(3.0f, within(EPSILON)); -// } -// -// @Test -// void testNegativeScaling() { -// Matrix4f scale = new Matrix4f().scale(-1, 1, 1); -// Vector4f point = new Vector4f(1, 2, 3, 1); -// Vector4f result = scale.transform(point); -// -// assertThat(result.x()).isCloseTo(-1.0f, within(EPSILON)); -// assertThat(result.y()).isCloseTo(2.0f, within(EPSILON)); -// assertThat(result.z()).isCloseTo(3.0f, within(EPSILON)); -// } -// -// @Test -// void testIdentityTransform() { -// Matrix4f identity = new Matrix4f().identity(); -// Vector4f point = new Vector4f(1, 2, 3, 1); -// Vector4f result = identity.transform(point); -// -// assertThat(result.x()).isCloseTo(point.x(), within(EPSILON)); -// assertThat(result.y()).isCloseTo(point.y(), within(EPSILON)); -// assertThat(result.z()).isCloseTo(point.z(), within(EPSILON)); -// } -//}