Skip to content

🧲 Attraction & Traversée de Phase (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é TechniqueParamètres Techniques
Classe Systèmenet.instantgratification.magnet.MagnetMovement
Événement DéclencheurTick Joueur Serveur (PlayerMixin $\rightarrow$ MagnetManager.tick)
Portée d'Attraction par Défaut12 blocs (ig:magnet_range)
Vitesse Maximale par Défaut80% ($0.8\text{ bloc/tick} = 16.0\text{ m/s}$)
Accélération par Défaut10% (facteur d'interpolation de $0.10\text{ lerp/tick}$)
Traversée de Phase (NoClip)Activée (ig:magnet_noclip = true)
Vecteur CiblePosition des Yeux du Joueur (player.getEyePosition())
Boost d'Élévation au Sol$+0.05\text{ m}$ sur l'axe Y lorsque entity.onGround()

📖 Vue d'Ensemble du Système

Le mécanisme d'aspiration central de Magnet, Let me get that! analyse chaque tick serveur la présence d'instances de ItemEntity dans le rayon configuré du joueur et les attire vers le niveau de ses yeux à l'aide d'une interpolation non linéaire fluide.

Pour éviter que les objets ne restent bloqués contre les rebords de blocs, sous la canopée des arbres ou dans les crevasses de minerai, le mod active la Traversée de Phase (NoClip), permettant aux objets en vol de traverser sans encombre les voxels des blocs solides.

+-------------+      Ligne de Visée OK     +----------------------+      Vélocité Lerp Appliquée     +------------------+
| Entité Obj. | -------------------------> | Définit NoClip (2 t) | ------------------------------> | Pos. Yeux Joueur |
+-------------+                            +----------------------+                                 +------------------+
                                                      |
                                                      v
                                           [Annule Éjection Bloc]
                                           [Ignore Collision Blocs]
                                           [Annule Gravité Murale]

🧮 Physique & Mathématiques Vectorielles

Lors de l'attraction d'un objet, la trajectoire est calculée directement dans l'espace euclidien tridimensionnel :

1. Vecteur vers la Cible

Soit $\vec{p}{\text{entity}} = (x_e, y_e, z_e)$ la position actuelle de l'objet, et $\vec{p}{\text{eye}} = (x_p, y_p + h_{\text{eye}}, z_p)$ la position des yeux du joueur. $$\vec{v}{\text{target}} = \vec{p}{\text{eye}} - \vec{p}{\text{entity}}$$ $$\hat{d} = \frac{\vec{v}{\text{target}}}{|\vec{v}{\text{target}}|} = \frac{\vec{v}{\text{target}}}{\sqrt{\Delta x^2 + \Delta y^2 + \Delta z^2}}$$

2. Vitesse Maximale Cible

Le vecteur de vitesse cible adapte la direction unitaire $\hat{d}$ selon le paramètre de vitesse configuré : $$\text{Scalaire de Vitesse } s = \frac{\text{GameRule}(\text{ig:magnet_speed})}{100.0}$$ $$\vec{u}_{\text{target}} = \hat{d} \times s$$ À la valeur par défaut ($80%$), $s = 0.8\text{ bloc/tick}$. À $20\text{ ticks/s}$, la vitesse terminale est de $16.0\text{ m/s}$.

3. Accélération Non Linéaire (Lerp)

La vitesse est mise à jour via une interpolation linéaire (Vec3.lerp) basée sur le facteur d'accélération $a$ : $$\text{Facteur d'Accélération } a = \frac{\text{GameRule}(\text{ig:magnet_acceleration})}{100.0}$$ $$\vec{v}{\text{new}} = \vec{v}{\text{current}} + (\vec{u}{\text{target}} - \vec{v}{\text{current}}) \times a$$

4. Boost Anti-Frottement au Sol

Si l'objet repose sur une surface solide (entity.onGround() == true), la friction au sol est immédiatement rompue pour empêcher le traînage au sol :

java
if (entity.onGround()) {
    entity.setOnGround(false);
    entity.setPos(entity.position().add(0, 0.05, 0));
}

🧱 Traversée de Phase (Moteur NoClip)

Lorsque ig:magnet_noclip est activé, les objets reçoivent une fenêtre NoClip de 2 ticks :

  1. Activation de l'État : ((IMagnetEntity) entity).ig_magnet$setMagnetNoClip() définit noClipTicks = 2.
  2. Détournement du Mouvement (MixinEntity.java) :
    • move(MoverType, Vec3) : @Inject(at = @At("HEAD")) sauvegarde originalNoPhysics et force entity.noPhysics = true.
    • move(MoverType, Vec3) : @Inject(at = @At("RETURN")) rétablit entity.noPhysics = originalNoPhysics.
  3. Annulation de l'Expulsion : @Inject(method = "moveTowardsClosestSpace", at = @At("HEAD"), cancellable = true) empêche l'algorithme vanilla d'éjecter violemment les objets hors des blocs.
  4. Annulation Conditionnelle de la Gravité : @Inject(method = "applyGravity", at = @At("HEAD"), cancellable = true) annule la gravité descendante uniquement lorsque l'objet intersecte physiquement un bloc solide (!level.noCollision(...)), préservant ainsi les trajectoires paraboliques naturelles en plein air.

⚙️ Configuration & GameRules Pertinentes

GameRuleTypeValeur par DéfautUnité / PlageDescription
ig:magnet_enabledBooléentruetrue/falseBascule principale pour toute la logique d'aspiration.
ig:magnet_rangeEntier121..64 blocsRayon sphérique maximal d'aspiration.
ig:magnet_speedEntier801..1000%Pourcentage de la vitesse maximale ($80 = 0.8\text{ b/t}$).
ig:magnet_accelerationEntier101..1000%Pourcentage d'accélération d'attraction ($10 = 10%\text{ lerp/tick}$).
ig:magnet_noclipBooléentruetrue/falseActive la traversée des blocs solides pendant le vol.

🔗 Documentation Connexe

Official documentation & web portal for Dasik Igaijinn mods.