Проєкт

Моди рушія

Просунутий і винятковий рівень: мод, що замінює частину самої гри. Майже жоден мод його не потребує.

Чи потрібно це вам?

Майже напевно ні. Моди на 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: оновлення гри може його зламати», і показує, яку частину кожен замінює.