Проект

Моды движка

Продвинутый и исключительный уровень: мод, который заменяет часть самой игры. Почти ни одному моду он не нужен.

Нужно ли это вам?

Почти наверняка нет. Моды на CraftScript или Kotlin с API Crafting охватывают блоки, предметы, существ, миры, интерфейс и события и продолжают работать после обновления Minecraft. Мод движка нужен только для замены части самой игры, например более быстрого рендерера чанков или нового движка освещения. Если ваша идея укладывается в обычный API, используйте его.

Что он даёт и чего стоит

Код мода может использовать собственные классы игры и изменять их с помощью миксинов. Цена: мод делается для одной точной версии Minecraft, работает только на ней, а его автор должен обновлять его для каждой версии игры. Ничто из используемого не имеет обещания совместимости.

Объявление

Добавьте в crafting.mod.json раздел engine с конфигурациями миксинов:

crafting.mod.jsonJSON
{
  "id": "brandengine",
  "name": "Brand Engine",
  "version": "1.0.0",
  "game": "26.3",
  "entrypoints": ["com.example.engine.BrandEngine"],
  "engine": { "mixins": ["brandengine.mixins.json"] }
}

game должен быть точной версией, например 26.3, а не диапазоном. На любой другой версии мод не загружается, и игра объясняет почему.

Исключительные части

Некоторые части игры допускают только одну замену. Мод занимает их через slots:

crafting.mod.jsonJSON
{ "engine": { "slots": ["chunk_renderer"] } }
Слот Какую часть заменяет
chunk_renderer рендерер чанков
lighting движок освещения
shaders конвейер шейдеров

Каждую часть может заменить только один мод. Если пытаются два, второй не загружается, а экран модов показывает, какой мод её занял. Мод, занявший shaders, отключает наборы шейдеров.

В коде

Функции движка требуют явного согласия, чтобы никто не использовал их случайно:

BrandEngine.ktKotlin
@OptIn(CraftingInternal::class)
class BrandEngine : CraftingMod {
    override fun onLoad(ctx: ModContext) {
        Crafting.events.on<ServerStartedEvent> { e ->
            val server = Engine.handle(e.server) as MinecraftServer
            ctx.logger.info("Server brand: ${server.serverModName}")
        }
    }
}

Engine.handle(view) возвращает собственный объект игры, стоящий за игроком, миром, сущностью или сервером Crafting.

Миксин

Миксин пишется на Java и изменяет класс игры:

ServerBrandMixin.javaJava
@Mixin(MinecraftServer.class)
public abstract class ServerBrandMixin {
    @Inject(method = "getServerModName", at = @At("RETURN"), cancellable = true)
    private void brand(CallbackInfoReturnable<String> cir) {
        cir.setReturnValue(cir.getReturnValue() + "+brandengine");
    }
}

Его конфигурация, brandengine.mixins.json, перечисляет миксины:

brandengine.mixins.jsonJSON
{ "required": true, "package": "com.example.engine.mixin", "compatibilityLevel": "JAVA_25",
  "mixins": ["ServerBrandMixin"], "injectors": { "defaultRequire": 1 } }

Сборка

Компилируйте с jar игры и библиотекой Mixin, обе как compile-only. Java и Kotlin целятся в версию 25.

Что видят игроки

Экран модов отмечает моды движка: «напрямую использует игру, сделан только для Minecraft 26.3: обновление игры может его сломать», и показывает, какую часть заменяет каждый.