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:

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 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:

crafting.mod.jsonJSON
{ "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:

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) 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:

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");
    }
}

Jego konfiguracja, brandengine.mixins.json, wymienia mixiny:

brandengine.mixins.jsonJSON
{ "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.