🧲 Movimiento de Vacío y Cambio de Fase (MC 26.1.2)
📌 Descargo de Responsabilidad del Código del Repositorio: La documentación de esta Wiki refleja el estado actual del código fuente en el repositorio, que puede incluir confirmaciones recientes no publicadas o características en desarrollo antes de las versiones públicas en CurseForge y Modrinth.
| Infobox de Característica | Parámetros Técnicos |
|---|---|
| Clase del Sistema | net.instantgratification.magnet.MagnetMovement |
| Evento Desencadenante | Tick del Jugador en Servidor (PlayerMixin $\rightarrow$ MagnetManager.tick) |
| Alcance de Atracción por Defecto | 12 bloques (ig:magnet_range) |
| Velocidad Terminal por Defecto | 80% ($0.8\text{ bloques/tick} = 16.0\text{ m/s}$) |
| Aceleración por Defecto | 10% ($0.10\text{ factor lerp/tick}$) |
| Cambio de Fase (NoClip) | Habilitado (ig:magnet_noclip = true) |
| Vector de Destino | Posición de Ojos del Jugador (player.getEyePosition()) |
| Impulso de Despegue en Suelo | $+0.05\text{ m}$ en eje Y cuando entity.onGround() |
📖 Visión General del Sistema
En Minecraft 26.1.2, el motor de aspiración rastrea continuamente las instancias válidas de ItemEntity dentro del radio esférico del jugador y las atrae directamente hacia el nivel de los ojos mediante interpolación lerp.
Con el Cambio de Fase (NoClip) activo, los objetos atraviesan suavemente paredes y bloques sólidos, evitando que las recompensas queden atrapadas detrás de obstáculos durante la minería o el combate.
+---------------+ Línea de Visión OK +------------------------+ Velocidad Lerp Aplicada +--------------------+
| Item Entity | -------------------------> | Activar NoClip (2 Ticks)| ------------------------------> | Pos. Ojos Jugador |
+---------------+ +------------------------+ +--------------------+
|
v
[Cancelar Empuje Pared]
[Ignorar Colisión Bloque]
[Cancelar Grav. en Pared]🧮 Física y Matemáticas Vectoriales
1. Vector Unitario Direccional
$$\vec{v}{\text{target}} = \vec{p}{\text{eye}} - \vec{p}{\text{entity}}$$ $$\hat{d} = \frac{\vec{v}{\text{target}}}{|\vec{v}_{\text{target}}|}$$
2. Interpolación de Velocidad
$$\text{Escalar de Velocidad } s = \frac{\text{GameRule}(\text{ig:magnet_speed})}{100.0} = 0.8\text{ bloques/tick}$$ $$\vec{u}{\text{target}} = \hat{d} \times s$$ $$\text{Factor de Aceleración } a = \frac{\text{GameRule}(\text{ig:magnet_acceleration})}{100.0} = 0.10$$ $$\vec{v}{\text{new}} = \vec{v}{\text{current}} + (\vec{u}{\text{target}} - \vec{v}_{\text{current}}) \times a$$
3. Impulso Antifricción en Suelo
if (entity.onGround()) {
entity.setOnGround(false);
entity.setPos(entity.position().add(0, 0.05, 0));
}🧱 Cambio de Fase (Motor NoClip)
- Activación de Estado:
((IMagnetEntity) entity).ig$setMagnetNoClip()activa una cuenta regresiva de 2 ticks. - Anulación de Físicas (
MixinEntity.java):move(MoverType, Vec3):@Inject(at = @At("HEAD"))guardaoriginalNoPhysicsy estableceentity.noPhysics = true.move(MoverType, Vec3):@Inject(at = @At("RETURN"))restauraentity.noPhysics = originalNoPhysics.
- Prevención de Empuje:
@Inject(method = "moveTowardsClosestSpace", at = @At("HEAD"), cancellable = true)bloquea las fuerzas de eyección de bloques de vanilla. - Cancelación de Gravedad en Pared:
@Inject(method = "applyGravity", at = @At("HEAD"), cancellable = true)cancela la gravedad únicamente cuando el objeto se encuentra físicamente dentro de un vóxel de bloque.
⚙️ Configuración y GameRules Pertinentes
| GameRule | Tipo | Por Defecto | Descripción |
|---|---|---|---|
ig:magnet_enabled | Booleano | true | Interruptor maestro para las mecánicas de atracción. |
ig:magnet_range | Entero | 12 | Radio de atracción en bloques (1 a 64). |
ig:magnet_speed | Entero | 80 | Porcentaje de velocidad terminal ($80 = 0.8\text{ b/t}$). |
ig:magnet_acceleration | Entero | 10 | Porcentaje del factor de aceleración ($10 = 10%\text{ lerp/tick}$). |
ig:magnet_noclip | Booleano | true | Habilita el cambio de fase a través de bloques al atraer. |
