Проект
Моды движка
Продвинутый и исключительный уровень: мод, который заменяет часть самой игры. Почти ни одному моду он не нужен.
Нужно ли это вам?
Почти наверняка нет. Моды на CraftScript или Kotlin с API Crafting охватывают блоки, предметы, существ, миры, интерфейс и события и продолжают работать после обновления Minecraft. Мод движка нужен только для замены части самой игры, например более быстрого рендерера чанков или нового движка освещения. Если ваша идея укладывается в обычный API, используйте его.
Что он даёт и чего стоит
Код мода может использовать собственные классы игры и изменять их с помощью миксинов. Цена: мод делается для одной точной версии Minecraft, работает только на ней, а его автор должен обновлять его для каждой версии игры. Ничто из используемого не имеет обещания совместимости.
Объявление
Добавьте в crafting.mod.json раздел engine с конфигурациями миксинов:
{
"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:
{ "engine": { "slots": ["chunk_renderer"] } }| Слот | Какую часть заменяет |
|---|---|
chunk_renderer |
рендерер чанков |
lighting |
движок освещения |
shaders |
конвейер шейдеров |
Каждую часть может заменить только один мод. Если пытаются два, второй не загружается, а экран модов показывает, какой мод её занял. Мод, занявший shaders, отключает наборы шейдеров.
В коде
Функции движка требуют явного согласия, чтобы никто не использовал их случайно:
@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 и изменяет класс игры:
@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, перечисляет миксины:
{ "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: обновление игры может его сломать», и показывает, какую часть заменяет каждый.