Proyekto

Mga engine mod

Isang advanced at pambihirang antas: mod na pumapalit sa isang bahagi ng mismong laro. Halos walang mod na nangangailangan nito.

Kailangan mo ba ito?

Halos tiyak na hindi. Saklaw na ng mga mod na isinulat sa CraftScript o Kotlin sa API ng Crafting ang mga block, item, nilalang, mundo, interface at event, at patuloy silang gumagana kapag nag-update ang Minecraft. Ang engine mod ay para lang sa pagpapalit ng bahagi ng mismong laro, gaya ng mas mabilis na chunk renderer o bagong lighting engine. Kung kasya ang ideya mo sa karaniwang API, iyon ang gamitin.

Ano ang ibinibigay at ano ang kapalit

Magagamit ng code ng mod ang mga sariling class ng laro at mapapalitan ang mga ito gamit ang mga mixin. Ang kapalit: ginawa ito para sa isang eksaktong bersyon ng Minecraft, doon lang tumatakbo, at kailangang i-update ng author nito sa bawat bersyon ng laro. Walang pangakong compatibility ang anumang ginagamit nito.

Pagdedeklara

Magdagdag ng seksyong engine sa crafting.mod.json, na naglilista ng mga mixin config:

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"] }
}

Dapat eksakto ang game, halimbawa 26.3, hindi saklaw ng mga bersyon. Sa ibang bersyon, hindi mag-lo-load ang mod at sasabihin ng laro kung bakit.

Mga eksklusibong bahagi

May mga bahagi ng laro na iisa lang ang maaaring pamalit. Kinukuha ito ng mod gamit ang slots:

crafting.mod.jsonJSON
{ "engine": { "slots": ["chunk_renderer"] } }
Slot Bahaging pinapalitan
chunk_renderer ang chunk renderer
lighting ang lighting engine
shaders ang shader pipeline

Isang mod lang ang puwedeng pumalit sa bawat bahagi. Kapag dalawa ang sumubok, hindi mag-lo-load ang pangalawa at sasabihin ng Mods screen kung aling mod ang may hawak. Ang mod na kumukuha ng shaders ay nag-o-off ng mga shader pack.

Sa code

Kailangan ng tahasang opt-in ang mga feature ng engine, para walang gumamit nito nang hindi sinasadya:

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

Ibinibigay ng Engine.handle(view) ang sariling object ng laro sa likod ng player, world, entity o server ng Crafting.

Isang mixin

Isinusulat ang mixin sa Java at binabago nito ang isang class ng laro:

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

Ang config nito, brandengine.mixins.json, ay naglilista ng mga mixin:

brandengine.mixins.jsonJSON
{ "required": true, "package": "com.example.engine.mixin", "compatibilityLevel": "JAVA_25",
  "mixins": ["ServerBrandMixin"], "injectors": { "defaultRequire": 1 } }

Pagbuo

Mag-compile laban sa jar ng laro at sa Mixin library, parehong compile-only. Bersyon 25 ang target ng Java at Kotlin.

Ang nakikita ng mga player

Minamarkahan ng Mods screen ang mga engine mod: "direktang gumagamit sa laro, ginawa para lang sa Minecraft 26.3: puwede itong masira ng update ng laro", at ipinapakita kung aling bahagi ang pinapalitan ng bawat isa.