アーキテクチャとMixinの解説 (MC 26.2)
本書では、Minecraft 26.2 における Item Clumps の内部パッケージ構成、クラス階層、Mixin対象、Shadowメンバー、注入ポイントを解説します。
🌳 パッケージ階層とクラス図
net.instantgratification.item_clumps
│
├── ItemClumpsFabric.java [Main Entrypoint / GameRules Registration]
│
├── config/
│ ├── ItemClumpsConfig.java [Configuration POJO / ConfigHelper Persistence]
│ ├── ModMenuIntegration.java [ModMenuApi Provider / Safe GUI Factory]
│ └── YaclScreenHelper.java [YetAnotherConfigLib v3 Screen Factory]
│
├── mixin/
│ ├── HopperBlockEntityMixin.java [Hopper Drip Extraction Mixin]
│ └── ItemEntityMixin.java [Mega-Stack Aggregation & Smart Pickup Mixin]
│
└── util/
└── ModVersionGuard.java [Knot ClassLoader Runtime Safety Guard]🛠️ Mixinターゲットと注入箇所の完全解説
1. ItemEntityMixin.java
- 対象クラス:
net.minecraft.world.entity.item.ItemEntity - 親クラス拡張:
extends net.minecraft.world.entity.Entity
| メンバー / メソッド | アノテーション | 注入ポイント | 役割 |
|---|---|---|---|
getItem() | @Shadow | なし | アイテムスタックを取得。 |
setItem(ItemStack) | @Shadow | なし | スタックを変更しトラッカー情報を更新。 |
target | @Shadow | なし | 投擲安全用の対象プレイヤーUUID。 |
pickupDelay | @Shadow | なし | 拾得遅延タイマーのティック数。 |
age | @Shadow | なし | 消滅寿命タイマーのティック数 ($0$ 〜 $6000$)。 |
setItem | @Inject | @At("TAIL") | スタック数変更時にネームタグ更新を起動。 |
isMergable | @Inject | @At("HEAD"), cancellable = true | スタック判定を max_clump_size ルールで上書き。 |
mergeWithNeighbours | @Redirect | INVOKE -> AABB.inflate(DDD) | 水平探索半径 ($r \in [1, 10]$) を割り当てなしで拡張。 |
tryToMerge | @Inject | @At("HEAD"), cancellable = true | 64ビット加算、寿命継承、マグネット判定を実行。 |
playerTouch | @Inject | @At("HEAD"), cancellable = true | クリーンなバニラスタックで一括インベントリ分配。 |
2. HopperBlockEntityMixin.java
- 対象クラス:
net.minecraft.world.level.block.entity.HopperBlockEntity
| メソッド | アノテーション | 注入ポイント | 役割 |
|---|---|---|---|
addItem(Container, ItemEntity) | @Inject | @At("HEAD"), cancellable = true | ホッパーにメガスタックから1個ずつ ($2.5$ 個/秒) 抽出。 |
📄 Mixin設定 (item-clumps.mixins.json)
json
{
"required": true,
"package": "net.instantgratification.item_clumps.mixin",
"compatibilityLevel": "JAVA_25",
"refmap": "item-clumps-refmap.json",
"mixins": [
"HopperBlockEntityMixin",
"ItemEntityMixin"
],
"injectors": {
"defaultRequire": 1
}
}