Mixins

Bemerkung

Diese Seite bezieht sich auf SpongeCommon, SpongeForge und SpongeVanilla, da sich diese drei Repositories Mixins zu Nutze machen, um sich in die zugrundeliegende Implementierung (Vanilla Minecraft Server und Forge) einzuklinken.

Mixins sind eine Möglichkeit Java-Code während der Laufzeit zu modifizieren, indem Zusatzfunktionen zu Klassen hinzugefügt werden. Sie erlauben es neues, beabsichtigtes Verhalten in existierenden Minecraft-Klassen zu ergänzen. Mixins werden für die Funktion aller offiziellen Sponge Implementierungen unbedingt benötigt.

Eine grundlegende Einführung zu einigen Kernkonzepten der Mixin-Funktionalität, die benutzt wird, um Sponge zu implementieren, ist im Mixin Wiki verfügbar

Das Wiki beginnt mit der Erklärung von Grundlagen. Fortgeschrittene Java-Entwickler können direkt zu Kapitel 4 wechseln. Dort werden die Mixins an sich behandelt.

Wenn du mit dem Programmieren von Mixins starten willst, empfehlen wir dir außerdem das sorgfältige Lesen aller Beispiele im SpongeForge-Repository, welche ausführlich dokimentiert sind und viele der komplitierteren Szenarien abdecken. Außerdem empfiehlt es sich, das Javadoc des Mixin-Repositorys zu lesen, da dort fast alles Wissenswerte dokumentiert ist.

Vorsicht: Wenn du Mixins beisteuerst, musst du beachten, dass du weder anonyme Klassen noch Lambda-Ausdrücke verwenden kannst.

Dies bedeutet, dass Ausdrücke wie der Folgende Mixins fürchterlich fehlschlagen lassen und Tod und Zerstörung über all jene bringen, die versuchen, Sponge zu verwenden.

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;

Dies betrifft alle Klassen, die mit @Mixin versehen sind. Klassen die nicht von Mixin Prozessor berührt werden können diese Features dennoch verwenden. Du kannst allerdings eine statische Hilfsklasse erstellen, die deine anonymen Kassen erstellt, da diese im Gegensatz zu Mixin Klassen, auch zur Laufzeit existieren, während Mixin Klassen mit der angegebene Zielklasse verschmelzen. Deshalb wird der nachfolgende Code funktionieren.

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

Bemerkung

Das Mixin-Projekt wird, außerhalb von Sponge, auch in weiteren Projekten zum Einsatz kommen. Deshalb existiert eine separate Dokumentation für das Mixin-Repository.