Skip to content

アーキテクチャとMixin記述子 (26.2)

アーキテクチャ特性
ルートパッケージnet.instantgratification.durabilitymultiplier
互換性レベルJAVA_25
Mixin設定durability-multiplier.mixins.json
デフォルト注入必須数1
再突入防止ガードThreadLocal<Boolean> dm$processing

🌳 ASCIIパッケージ階層

net.instantgratification.durabilitymultiplier/
├── DurabilityHelper.java               # Stateless damage reduction & classification engine
├── DurabilityMultiplier.java           # Common mod initializer & logger
├── DurabilityMultiplierFabric.java     # Fabric main entrypoint
├── DurabilityMultiplierFabricClient.java # Client entrypoint & network receiver
├── config/
│   ├── ClothConfigScreenHelper.java    # Optional Cloth Config GUI builder
│   ├── DurabilityConfig.java           # JSON configuration loader & save handler
│   └── ModMenuIntegration.java         # ModMenu entrypoint hook
├── mixin/
│   ├── GameRulesMixin.java             # Intercepts GameRules.set() for network sync
│   ├── ItemStackDurabilityMixin.java   # Intercepts hurtAndBreak() for damage reduction
│   └── ItemStackTooltipMixin.java      # Intercepts addDetailsToTooltip() for status lines
├── network/
│   ├── DurabilityClientState.java      # Client-side cache of 73 GameRules & dynamic mod rules
│   ├── DurabilityNetworking.java       # S2C packet registration & player sync logic
│   └── DurabilityPayload.java          # CustomPacketPayload record definition
└── registry/
    └── DurabilityRules.java            # GameRuleCategory & 73 GameRules definitions

💉 Mixinターゲットの詳細解説

1. ItemStackDurabilityMixin

  • 対象クラス: net.minecraft.world.item.ItemStack
  • 対象メソッド: hurtAndBreak(ILnet/minecraft/server/level/ServerLevel;Lnet/minecraft/server/level/ServerPlayer;Ljava/util/function/Consumer;)V
  • 注入ポイント: @At("HEAD"), cancellable = true
  • ハンドラメソッド: dm$hurtAndBreak(int amount, ServerLevel level, @Nullable ServerPlayer player, Consumer<Item> onBreak, CallbackInfo ci)
  • 設計意図: 全アイテムダメージの集約ポイント。再計算後のダメージでhurtAndBreakを再呼び出しする際の無限ループを防ぐため、ThreadLocal<Boolean> dm$processingで再突入をガードしています。

2. ItemStackTooltipMixin

  • 対象クラス: net.minecraft.world.item.ItemStack
  • 対象メソッド: addDetailsToTooltip(Item.TooltipContext, TooltipDisplay, Player, TooltipFlag, Consumer<Component>)V
  • 注入ポイント: @At("TAIL")
  • ハンドラメソッド: dm$addDurabilityTooltip(...)
  • 設計意図: ホバーツールチップに金字太字の✦ UNBREAKABLE、灰色の⟨SINGLE-USE⟩、または⟨Nx カテゴリ耐久度⟩ / ⟨P% カテゴリ耐久度⟩を追加します。

3. GameRulesMixin

  • 対象クラス: net.minecraft.world.level.gamerules.GameRules
  • 対象メソッド: set(GameRule<T>, T, MinecraftServer)V
  • 注入ポイント: @At("TAIL")
  • ハンドラメソッド: onSet(GameRule<T> key, T value, @Nullable MinecraftServer server, CallbackInfo ci)
  • 設計意図: DURABILITY_MULTIPLIERカテゴリのルールが変更された際、DurabilityNetworking.syncToAll(server)を発火して最新の値をリアルタイムで同期します。

🔄 動的Modアイテムレジストリスキャン

動的なアイテム登録は**DasikLibrary**のDynamicRegistryScannerによって支えられています:

  • フックメソッド: DynamicRegistryScanner.subscribe(BuiltInRegistries.ITEM, DurabilityRules::isItemDamageable, (id, item) -> { ... })
  • ライフサイクル: ユニバーサル3段階探索スキャナー(起動時スキャン、外部Mod読み込み中のライブコールバック、サーバー起動時の安全スキャン)。
  • 独自レジストリMixinゼロ: 手動のレジストリMixinを、クラッシュゼロでクラスローダー安全な標準イベントコールバックに置き換えています。

Official documentation & web portal for Dasik Igaijinn mods.