Mixins

Note

Cette page s’applique à SpongeCommon, SpongeForge et SpongeVanilla puisque ces trois dépôts utilisent les Mixins pour accrocher aux implémentations sous-jacentes (Serveur Minecraft Vanilla et Forge).

Les Mixins sont une façon de modifier du code java au lancement en ajoutant des comportements additionnels aux classes. Ils permettent d’intégrer des comportements dans des objets Minecraft existants. Les Mixins sont indispensables pour que toutes les implémentations officielles de Sponge fonctionnent.

Une introduction aux principes de base des mixins que nous utilisons pour implémenter Sponge est disponible sur le Wiki Mixin

Ça commence avec les bases. Si vous êtes un développeur Java expérimenté, n’hésitez pas à passer à la section 4, où l’on parle des mixins.

Si vous souhaitez travailler avec les mixins, nous vous recommandons fortement d’examiner avec attention tous les exemples de `cette page <https://github.com/SpongePowered/SpongeCommon/tree/stable-6/src/example/java/org/spongepowered> qui est très riche en informations et qui met en scène beaucoup de cas différents et complexes. Vous devriez également consulter la Javadoc du répertoire Mixins lui-même, puisque quasiment tout est déjà documenté.

Avertissement: En contribuant aux mixins, sachez que vous ne pouvez utiliser ni classes anonymes, ni expressions lambda.

Ce qui signifie que les expressions comme la suivante ne conduiront qu’à d’horribles erreurs et apporteront mort et destruction sur tout ce qui tente d’utiliser 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;

Ceci s’applique à toutes les classes annotées avec un @Mixin. Les classes qui n’utilisent pas le processeur des mixins peuvent utiliser ces fonctionnalités. Toutefois, vous pouvez utiliser une classe statique utilitaire pour créer une classe anonyme, contrairement à votre classe mixin pour qui la classe utilitaire existera pendant l’exécution, tandis que votre classe mixin va être déplacée dans la classe cible. Le code suivant fonctionnera donc.

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);
    }
}

Note

Le projet Mixin servira à un grand nombre de projets en plus de Sponge en lui-même. Par contre, Mixin possède sa propre documentation et le dépôt qui va avec.