🧩 アーキテクチャと Mixin ターゲット (MC 26.2)
📌 リポジトリソースに関する免責事項: 本 Wiki のドキュメントはリポジトリ内の現在のソースコード状態を反映しており、CurseForge や Modrinth での一般公開リリースビルドに先立つ最新の未リリースコミットや開発中の機能が含まれている場合があります。
| アーキテクチャインフォボックス | 技術パラメータ |
|---|---|
| ルートパッケージ | net.instantgratification.magnet |
| Mixin 設定ファイル | src/main/resources/magnet.mixins.json |
| Access Widener | src/main/resources/magnet.accesswidener |
| 互換性レベル | JAVA_25 |
| Mixin クラス総数 | 2 (MixinEntity, PlayerMixin) |
🌳 パッケージアーキテクチャツリー
text
net.instantgratification.magnet/
├── IMagnetEntity.java # NoClip および磁力化フラグ用エンティティインターフェース
├── IMagnetPlayer.java # トグル状態およびアクセサ用プレイヤーインターフェース
├── MagnetCommand.java # Brigadier コマンドツリー (/magnet toggle, /magnet debug)
├── MagnetDebugLogger.java # ディスクへのスレッドセーフな永続ファイルロガー
├── MagnetManager.java # エンティティスキャンおよび空間処理ループ
├── MagnetMod.java # サーバー/共通 MOD エントリポイントおよびパケット受信
├── MagnetModClient.java # クライアント MOD 初期化、キーバインドおよび通知表示
├── MagnetMovement.java # 軌道ベクトル計算、速度補間 (Lerp) およびパーティクル
├── MagnetTogglePayload.java # ネットワークパケットレコードおよび StreamCodec
├── SecondaryVisionCheck.java # 詳細ブロックレイキャスト (植物、ブロックエンティティ、ガラス)
├── config/
│ ├── MagnetConfig.java # JSON 設定ストレージおよび POJO フィールド
│ ├── ModMenuIntegration.java # リフレクションセーフな ModMenu API エントリポイント
│ └── YaclScreenHelper.java # YetAnotherConfigLib v3 GUI ビルダー
├── mixin/
│ ├── MixinEntity.java # Entity への NoClip および重力キャンセル注入
│ └── PlayerMixin.java # Player への NBT 永続化および即時回収処理の注入
├── registry/
│ └── ModGameRules.java # DynamicGameRuleManager によるゲームルール登録
└── util/
└── ModVersionGuard.java # ランタイム Knot ClassLoader 整合性チェック📋 Mixin 注入ターゲット詳細
1. net.instantgratification.magnet.mixin.MixinEntity
net.minecraft.world.entity.Entity を対象とし、IMagnetEntity を実装します。
| 注入メソッド | 注入ターゲットポイント | 動作および挙動 |
|---|---|---|
ig_magnet$decrementNoClipTicks | @Inject(method = "tick", at = @At("HEAD")) | アクティブ時、noClipTicks カウントダウンを毎ティック 1 減算。 |
ig_magnet$preventPushOut | @Inject(method = "moveTowardsClosestSpace", at = @At("HEAD"), cancellable = true) | サーバー側で noClipTicks > 0 の場合、バニラの押し出し速度をキャンセル。 |
ig_magnet$forceNoClipOnMove | @Inject(method = "move", at = @At("HEAD")) | noClipTicks > 0 の場合、originalNoPhysics をキャッシュして entity.noPhysics = true を強制。 |
ig_magnet$restoreNoPhysicsAfterMove | @Inject(method = "move", at = @At("RETURN")) | 移動完了後、entity.noPhysics = originalNoPhysics を復元。 |
ig_magnet$conditionalCancelGravity | @Inject(method = "applyGravity", at = @At("HEAD"), cancellable = true) | アイテムが固体のブロック内部にある場合のみ下方向の重力加速度をキャンセル。 |
2. net.instantgratification.magnet.mixin.PlayerMixin
net.minecraft.world.entity.player.Player を対象とし、IMagnetPlayer を実装します。
| 注入メソッド | 注入ターゲットポイント | 動作および挙動 |
|---|---|---|
ig_magnet$addAdditionalSaveData | @Inject(method = "addAdditionalSaveData", at = @At("TAIL")) | ValueOutput を介してプレイヤー NBT にブーリアン ig_magnet_enabled を保存。 |
ig_magnet$readAdditionalSaveData | @Inject(method = "readAdditionalSaveData", at = @At("TAIL")) | ValueInput.getBooleanOr() を介してプレイヤー NBT から ig_magnet_enabled を復元。 |
ig_magnet$tick | @Inject(method = "tick", at = @At("HEAD")) | サーバー側で毎ゲームティックごとに MagnetManager.tick(player) を呼び出し。 |
ig_magnet$expandPickupArea | @ModifyVariable(method = "aiStep", at = @At("STORE"), ordinal = 0) | ig:magnet_instant が true の場合、回収判定を拡張 (pickupArea.inflate(range))。 |
🛡️ Knot ClassLoader 整合性チェック (ModVersionGuard)
破損したバージョン、未リリース版、または互換性のない Minecraft バージョンでのワールド読み込みを防ぐためのガードクラスです:
java
public final class ModVersionGuard {
public static void checkClass(String modName, String requiredClassName) {
ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();
// MOD の初期化を続行する前にターゲットクラスの存在を検証...
}
}MagnetMod.onInitialize() 内での呼び出し:
java
ModVersionGuard.checkClass("Magnet", "net.minecraft.world.entity.item.ItemEntity");