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.

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.

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 есть собственная документация в репозитории проекта.