Skip to content

🧩 Arquitetura & Alvos de Mixin (MC 26.2)

📌 Aviso sobre o Código-Fonte do Repositório: A documentação nesta Wiki reflete o estado atual do código-fonte no repositório, que pode incluir commits recentes ainda não lançados ou recursos em desenvolvimento antes das compilações públicas oficiais no CurseForge e Modrinth.

Infobox de ArquiteturaParâmetros Técnicos
Pacote Raiznet.instantgratification.magnet
Configuração do Mixinsrc/main/resources/magnet.mixins.json
Access Widenersrc/main/resources/magnet.accesswidener
Nível de CompatibilidadeJAVA_25
Total de Classes Mixin2 (MixinEntity, PlayerMixin)

🌳 Árvore de Arquitetura de Pacotes

text
net.instantgratification.magnet/
├── IMagnetEntity.java                  # Interface de entidade para flags de NoClip e magnetização
├── IMagnetPlayer.java                  # Interface de jogador para estado de alternância e getters/setters
├── MagnetCommand.java                  # Árvores de comandos Brigadier (/magnet toggle, /magnet debug)
├── MagnetDebugLogger.java              # Gravação thread-safe de logs detalhados persistentes em disco
├── MagnetManager.java                  # Loop de varredura espacial e execução de entidades
├── MagnetMod.java                      # Ponto de entrada do mod servidor/universal e receptores de pacotes
├── MagnetModClient.java                # Inicializador do cliente, tecla de atalho e avisos na actionbar
├── MagnetMovement.java                 # Matemática vetorial de trajetória, velocidade lerp e partículas
├── MagnetTogglePayload.java            # Registro de pacote de rede e composição com StreamCodec
├── SecondaryVisionCheck.java           # Raycasting granular de blocos (Flora, Entidades de Bloco, Vidro)
├── config/
│   ├── MagnetConfig.java               # Armazenamento da configuração JSON e campos POJO
│   ├── ModMenuIntegration.java         # Ponto de entrada seguro contra reflexão da API ModMenu
│   └── YaclScreenHelper.java           # Construtor da interface YetAnotherConfigLib v3
├── mixin/
│   ├── MixinEntity.java                # Injeta NoClip e cancelamento de gravidade em Entity
│   └── PlayerMixin.java                # Injeta persistência NBT e coleta instantânea em Player
├── registry/
│   └── ModGameRules.java               # Registros no DynamicGameRuleManager
└── util/
    └── ModVersionGuard.java            # Verificação de sanidade do Knot ClassLoader em tempo de execução

📋 Detalhamento dos Alvos de Injeção de Mixin

1. net.instantgratification.magnet.mixin.MixinEntity

Tem como alvo net.minecraft.world.entity.Entity e implementa IMagnetEntity.

Método InjetadoPonto Alvo de InjeçãoAção & Comportamento
ig_magnet$decrementNoClipTicks@Inject(method = "tick", at = @At("HEAD"))Decrementa a contagem regressiva de noClipTicks em 1 a cada tick quando ativo.
ig_magnet$preventPushOut@Inject(method = "moveTowardsClosestSpace", at = @At("HEAD"), cancellable = true)Cancela a velocidade de empurrão para fora do vanilla se noClipTicks > 0 no servidor.
ig_magnet$forceNoClipOnMove@Inject(method = "move", at = @At("HEAD"))Armazena em cache originalNoPhysics e força entity.noPhysics = true se noClipTicks > 0.
ig_magnet$restoreNoPhysicsAfterMove@Inject(method = "move", at = @At("RETURN"))Restaura entity.noPhysics = originalNoPhysics após a conclusão do movimento.
ig_magnet$conditionalCancelGravity@Inject(method = "applyGravity", at = @At("HEAD"), cancellable = true)Cancela a aceleração da gravidade para baixo apenas quando o item está dentro de um bloco sólido.

2. net.instantgratification.magnet.mixin.PlayerMixin

Tem como alvo net.minecraft.world.entity.player.Player e implementa IMagnetPlayer.

Método InjetadoPonto Alvo de InjeçãoAção & Comportamento
ig_magnet$addAdditionalSaveData@Inject(method = "addAdditionalSaveData", at = @At("TAIL"))Serializa o booleano ig_magnet_enabled para o NBT do jogador através de ValueOutput.
ig_magnet$readAdditionalSaveData@Inject(method = "readAdditionalSaveData", at = @At("TAIL"))Desserializa ig_magnet_enabled do NBT do jogador através de ValueInput.getBooleanOr().
ig_magnet$tick@Inject(method = "tick", at = @At("HEAD"))Invoca MagnetManager.tick(player) no servidor a cada tick de jogo.
ig_magnet$expandPickupArea@ModifyVariable(method = "aiStep", at = @At("STORE"), ordinal = 0)Expande a caixa de colisão de coleta (pickupArea.inflate(range)) quando ig:magnet_instant é verdadeiro.

🛡️ Verificação de Sanidade do Knot ClassLoader (ModVersionGuard)

Para proteger mundos e saves de servidores contra carregamentos em versões quebradas, incompatíveis ou não suportadas do Minecraft:

java
public final class ModVersionGuard {
    public static void checkClass(String modName, String requiredClassName) {
        ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();
        // Verifica a existência da classe alvo antes que a inicialização do mod continue...
    }
}

Chamado em MagnetMod.onInitialize():

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

🔗 Documentação da Wiki Relacionada

Official documentation & web portal for Dasik Igaijinn mods.