Projekt
Mody silnika
Poziom zaawansowany i wyjątkowy: mod, który zastępuje część samej gry. Prawie żaden mod go nie potrzebuje.
Czy tego potrzebujesz?
Prawie na pewno nie. Mody pisane w CraftScript lub Kotlinie na API Crafting obejmują bloki, przedmioty, stworzenia, światy, interfejs i zdarzenia, a po aktualizacji Minecrafta nadal działają. Mod silnika służy tylko do zastąpienia części samej gry, na przykład szybszego renderera chunków albo nowego silnika oświetlenia. Jeśli twój pomysł mieści się w zwykłym API, użyj go.
Co daje i ile kosztuje
Kod moda może używać własnych klas gry i modyfikować je za pomocą mixinów. Cena: mod powstaje dla jednej dokładnej wersji Minecrafta, działa tylko na niej, a jego autor musi go aktualizować przy każdej wersji gry. Nic, z czego korzysta, nie ma obietnicy kompatybilności.
Deklaracja
Dodaj do crafting.mod.json sekcję engine z konfiguracjami mixinów:
{
"id": "brandengine",
"name": "Brand Engine",
"version": "1.0.0",
"game": "26.3",
"entrypoints": ["com.example.engine.BrandEngine"],
"engine": { "mixins": ["brandengine.mixins.json"] }
}game musi być dokładną wersją, na przykład 26.3, a nie zakresem. Na każdej innej wersji mod się nie wczytuje, a gra podaje powód.
Części na wyłączność
Niektóre części gry mogą mieć tylko jeden zamiennik. Mod zajmuje je przez slots:
{ "engine": { "slots": ["chunk_renderer"] } }| Slot | Zastępowana część |
|---|---|
chunk_renderer |
renderer chunków |
lighting |
silnik oświetlenia |
shaders |
potok shaderów |
Każdą część może zastąpić tylko jeden mod. Gdy próbują dwa, drugi się nie wczytuje, a ekran modów pokazuje, który mod ją ma. Mod zajmujący shaders wyłącza paczki shaderów.
W kodzie
Funkcje silnika wymagają jawnej zgody, aby nikt nie użył ich przypadkiem:
@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) zwraca właściwy obiekt gry stojący za graczem, światem, bytem lub serwerem Crafting.
Mixin
Mixin pisze się w Javie i modyfikuje klasę gry:
@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");
}
}Jego konfiguracja, brandengine.mixins.json, wymienia mixiny:
{ "required": true, "package": "com.example.engine.mixin", "compatibilityLevel": "JAVA_25",
"mixins": ["ServerBrandMixin"], "injectors": { "defaultRequire": 1 } }Budowanie
Kompiluj względem pliku jar gry i biblioteki Mixin, obu jako compile-only. Java i Kotlin celują w wersję 25.
Co widzą gracze
Ekran modów oznacza mody silnika: „używa gry bezpośrednio, stworzony tylko dla Minecrafta 26.3: aktualizacja gry może go zepsuć” i pokazuje, którą część każdy zastępuje.