Mixins

Nota

Esta página aplica-se a SpongeCommon, SpongeForge e SpongeVanilla, como esses três repositórios utilizam Mixins para ligar para as implementações subjacentes (servidor de Minecraft Vanilla e Forge).

Mixins são uma forma de modificar o código Java no tempo de execução adicionando comportamentos a classes. Estes permitem transplantar comportamentos específicos para objetos do Minecraft que já existentes. Os Mixins são necessários para o funcionamento do Sponge coremod.

Uma introdução básica a alguns dos principais conceitos subjacentes a funcionalidade do mixin que estamos usando para implementar a esponja está disponível no Mixin Wiki

Começa com princípios absolutos. Se você é um desenvolvedor java experiente, sinta-se livre para pular para a seção 4, onde os componentes são discutidos.

If you’re looking to get started writing mixins, we also strongly recommend carefully examining all of the examples in the SpongeCommon repository which are extensively documented and cover many of the more complex scenarios. You should also consult the Javadoc of the Mixin repository itself, since almost everything is already documented.

Atenção: Quando contribuindo com mixins, observe que você não pode usar classes anônimas nem expressões lambda.

Isto significa que expressões como a seguir causará mixin a falhar e trazer morte e destruição sobre todos os que tentam usam a Sponge.

return new Predicate<ItemStack>() {
    @Override
    public boolean test(ItemStack input) {
        return input.getItem().equals(Items.golden_apple);
    }
}
return input -> input.getItem().equals(Items.golden_apple);
return this::checkItem;

Isso se aplica a todas as classes que são anotadas com @Mixin. Classes que não são tocadas pelo processador mixin podem fazer uso desses recursos. No entanto, você pode usar uma classe de utilitário estático para criar suas classes anônimas, como ao contrário de sua classe mixin que classe de utilitário ainda existirá em tempo de execução, enquanto sua classe mixin será mesclada na classe de destino especifico. O código a seguir, portanto, vai funcionar.

public class ItemUtil {
    public static Predicate<ItemStack> typeChecker(final Item item) {
        return new Predicate<ItemStack>() {
            @Override
            public boolean test(ItemStack input) {
                return input.getItem().equals(item);
            }
        }
    }
}

@Mixin(TargetClass.class)
public abstract class SomeMixin {
    public Predicate<ItemStack> someFunction() {
        return ItemUtil.typeChecker(Items.golden_apple);
    }
}

Nota

O projeto Mixin irá servir um número de outros projetos além da Sponge em si. Portanto Mixin tem sua própria documentação juntamente com o repositório.