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.
Se você estiver procurando começar a escrever mixins, nós também recomendamos examinar cuidadosamente todos os nossos exemplos no repositório do SpongeForge<https://github.com/SpongePowered/SpongeCommon/tree/stable-5/src/example/java/org/spongepowered> que são extensivamente documentados e cobertos com os mais complexos cenários. Você poderá consultar também o Javadoc do repositório do Mixin, já que quase tudo está documentado.
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.