Skip to content

🧩 Architecture & Cibles Mixin (MC 26.2)

📌 Avertissement sur le Code Source du Dépôt : La documentation de ce Wiki reflète l'état actuel du code source dans le dépôt, qui peut inclure des commits récents non publiés ou des fonctionnalités en développement avant les versions publiques sur CurseForge et Modrinth.

Encadré ArchitectureParamètres Techniques
Paquet Racinenet.instantgratification.magnet
Configuration Mixinsrc/main/resources/magnet.mixins.json
Access Widenersrc/main/resources/magnet.accesswidener
Niveau de CompatibilitéJAVA_25
Nombre Total de Mixins2 (MixinEntity, PlayerMixin)

🌳 Arborescence de l'Architecture des Paquets

text
net.instantgratification.magnet/
├── IMagnetEntity.java                  # Interface d'entité pour NoClip & magnétisation
├── IMagnetPlayer.java                  # Interface joueur pour état de bascule & accesseurs
├── MagnetCommand.java                  # Commandes Brigadier (/magnet toggle, /magnet debug)
├── MagnetDebugLogger.java              # Journalisation persistante thread-safe sur disque
├── MagnetManager.java                  # Boucle de détection spatiale & exécution
├── MagnetMod.java                      # Point d'entrée serveur/universel & récepteurs réseau
├── MagnetModClient.java                # Initialiseur client, touches & notifications overlay
├── MagnetMovement.java                 # Trajectoire vectorielle, vélocité lerp & particules
├── MagnetTogglePayload.java            # Record de paquet réseau & StreamCodec composite
├── SecondaryVisionCheck.java           # Raycast granulaire (Flore, Entités de bloc, Verre)
├── config/
│   ├── MagnetConfig.java               # POJO & persistance de configuration JSON
│   ├── ModMenuIntegration.java         # Point d'entrée ModMenu sécurisé par réflexion
│   └── YaclScreenHelper.java           # Constructeur d'interface YetAnotherConfigLib v3
├── mixin/
│   ├── MixinEntity.java                # Injection NoClip et annulation de gravité dans Entity
│   └── PlayerMixin.java                # Injection persistance NBT & ramassage instantané dans Player
├── registry/
│   └── ModGameRules.java               # Enregistrements DynamicGameRuleManager
└── util/
    └── ModVersionGuard.java            # Vérification de sécurité au runtime Knot ClassLoader

📋 Analyse Détaillée des Injections Mixin

1. net.instantgratification.magnet.mixin.MixinEntity

Cible net.minecraft.world.entity.Entity et implémente IMagnetEntity.

Méthode InjectéePoint d'Injection CibleAction & Comportement
ig_magnet$decrementNoClipTicks@Inject(method = "tick", at = @At("HEAD"))Décrémente le compte à rebours noClipTicks de 1 par tick lorsqu'il est actif.
ig_magnet$preventPushOut@Inject(method = "moveTowardsClosestSpace", at = @At("HEAD"), cancellable = true)Annule l'éjection de bloc vanilla si noClipTicks > 0 sur le serveur.
ig_magnet$forceNoClipOnMove@Inject(method = "move", at = @At("HEAD"))Mémorise originalNoPhysics et force entity.noPhysics = true si noClipTicks > 0.
ig_magnet$restoreNoPhysicsAfterMove@Inject(method = "move", at = @At("RETURN"))Rétablit entity.noPhysics = originalNoPhysics une fois le mouvement achevé.
ig_magnet$conditionalCancelGravity@Inject(method = "applyGravity", at = @At("HEAD"), cancellable = true)Annule la gravité descendante uniquement lorsque l'objet est dans un bloc solide.

2. net.instantgratification.magnet.mixin.PlayerMixin

Cible net.minecraft.world.entity.player.Player et implémente IMagnetPlayer.

Méthode InjectéePoint d'Injection CibleAction & Comportement
ig_magnet$addAdditionalSaveData@Inject(method = "addAdditionalSaveData", at = @At("TAIL"))Sérialise le booléen ig_magnet_enabled dans le NBT joueur via ValueOutput.
ig_magnet$readAdditionalSaveData@Inject(method = "readAdditionalSaveData", at = @At("TAIL"))Désérialise ig_magnet_enabled depuis le NBT joueur via ValueInput.getBooleanOr().
ig_magnet$tick@Inject(method = "tick", at = @At("HEAD"))Invoque MagnetManager.tick(player) sur le serveur à chaque tick de jeu.
ig_magnet$expandPickupArea@ModifyVariable(method = "aiStep", at = @At("STORE"), ordinal = 0)Élargit la boîte de ramassage (pickupArea.inflate(range)) si ig:magnet_instant est actif.

🛡️ Vérification de Cohérence Knot ClassLoader (ModVersionGuard)

Pour prémunir les serveurs et les mondes contre tout chargement sous des versions incompatibles de Minecraft :

java
public final class ModVersionGuard {
    public static void checkClass(String modName, String requiredClassName) {
        ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();
        // Vérifie l'existence de la classe cible avant de poursuivre l'initialisation...
    }
}

Appelé dans MagnetMod.onInitialize() :

java
ModVersionGuard.checkClass("Magnet", "net.minecraft.world.entity.item.ItemEntity");

🔗 Documentation Connexe

Official documentation & web portal for Dasik Igaijinn mods.