Mixins

Примечание

This page applies to SpongeCommon, SpongeForge, and SpongeVanilla as these three repositories utilize Mixins to hook into the underlying implementations (Vanilla Minecraft server and Forge).

Mixins - это способ модификации кода Java во время выполнения, путем добавления дополнительного поведения к классам. Они позволяют трансплантировать предполагаемое поведение в существующие объекты Minecraft. Mixins необходимы для функционирования всех официальных реализаций Sponge.

Введение в некоторые основные понятия Mixin, которые мы используем для разработки Sponge, можно узнать на странице Mixin Wiki

Его описание начинается с абсолютных основ. Если Вы - опытный Java разработчик, то не стесняйтесь и переходите к разделу 4, где и обсуждается Mixins.

Если вы хотите начать писать миксины, то мы настоятельно рекомендуем внимательно изучить все примеры в репозитории SpongeForge, которые подробно документированы и охватывают большинство сложных сценариев. Также вам необходимо ознакомиться с Javadoc из самого репозитория Mixin, поскольку в нем уже почти всё документировано.

Caveat: When contributing mixins, note that you can use neither anonymous classes nor lambda expressions.

This means expressions like the following will cause mixins to fail horribly and bring death and destruction upon all that attempt to use 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;

Это относится ко всем классам, которые аннотируются как @Mixin. Классы, которые не затрагиваются процессором mixin, могут использовать эти функции. Тем не менее, вы можете использовать статический класс утилиты для создания ваших анонимных классов, так как, в отличие от вашего класса mixin, класс утилиты будет существовать во время выполнения, тогда как ваш класс mixin будет объединен в указанный целевой класс. Поэтому следующий код будет работать.`.

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

Примечание

Проект Mixins будет использоваться во многих других проектах, кроме как на Sponge. Поэтому у Mixins есть собственная документация в репозитории проекта.