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