Criar um addon de DMZ

From DragonMineZ Wiki
This page is a translated version of the page Creating a DMZ Addon and the translation is 100% complete.

Criar um addon de DMZ guia você passo a passo por um addon de Forge completo que se integra ao DragonMineZ: o jar do seu próprio mod, que depende do DMZ e pode reagir aos seus eventos e dados. Leia primeiro Primeiros passos com addons para conhecer as ferramentas e versões necessárias.

Passo 1: Crie um projeto Forge 1.20.1

Comece pelo MDK do Forge para Minecraft 1.20.1 com Forge 47.4.10, ForgeGradle 6.0.30 e Java 17, iguais aos do DMZ.

Estes arquivos do repositório do DMZ são boas referências para a estrutura e a configuração do seu projeto:

  • gradle.properties
  • build.gradle.kts
  • src/main/resources/META-INF/mods.toml

Passo 2: Configure o Gradle

O DMZ usa a DSL do Gradle em Kotlin (build.gradle.kts), mas no seu addon você pode usar Gradle com Groovy ou qualquer outra configuração que preferir. Só garanta que as versões do Forge e do Java sejam as mesmas. Um exemplo de build.gradle.kts:

plugins {
    java
    idea
    id("net.minecraftforge.gradle") version "6.0.30"
    id("org.parchmentmc.librarian.forgegradle") version "1.+"
    id("org.spongepowered.mixin") version "0.7.38"
}

repositories {
    maven("https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/") // GeckoLib
    maven("https://maven.blamejared.com/")                             // TerraBlender
    maven("https://maven.theillusivec4.top/")                          // Curios
    flatDir { dirs("libs") }                                            // local DMZ jar
    mavenCentral()
}

minecraft {
    mappings("parchment", "2023.09.03-1.20.1")
    runs {
        configureEach {
            workingDirectory(project.file("run"))
            // DMZ ships mixins: let the dev runtime remap their refmap
            property("mixin.env.remapRefMap", "true")
            property("mixin.env.refMapRemappingFile", "${projectDir}/build/createSrgToMcp/output.srg")
        }
        create("client")
        create("server")
    }
}

dependencies {
    minecraft("net.minecraftforge:forge:1.20.1-47.4.10")
    annotationProcessor("org.spongepowered:mixin:0.8.7:processor")

    // DMZ's mandatory dependencies: GeckoLib, TerraBlender & Curios
    implementation(fg.deobf("software.bernie.geckolib:geckolib-forge-1.20.1:4.8.3"))
    implementation("com.eliotlash.mclib:mclib:20")
    implementation(fg.deobf("com.github.glitchfiend:TerraBlender-forge:1.20.1-3.0.1.10"))
    compileOnly(fg.deobf("top.theillusivec4.curios:curios-forge:5.14.1+1.20.1:api"))
    runtimeOnly(fg.deobf("top.theillusivec4.curios:curios-forge:5.14.1+1.20.1"))

    // DragonMineZ itself (libs/dragonminez-2.2-alpha.jar)
    implementation(fg.deobf("local:dragonminez:2.2-alpha"))
}

Passo 3: Declare a dependência do DMZ

No mods.toml do seu addon, adicione uma entrada de dependência para dragonminez:

[[dependencies.your_addon_modid]]
    modId="dragonminez"
    mandatory=true # false if your addon also works without DMZ
    versionRange="[2.2-alpha]" # Only allow the DMZ version you built against to avoid compatibility issues.
    ordering="AFTER"
    side="BOTH" # Choose between "CLIENT", "SERVER", or "BOTH" based on your addon needs.

Defina mandatory como false se o seu addon também funcionar sem o DMZ (veja Padrão de dependência opcional). O mods.toml do DMZ usa displayTest = "MATCH_VERSION", então de qualquer forma o cliente e o servidor precisam rodar a mesma versão do DMZ.

Passo 4: Adicione o DMZ ao classpath de compilação

O build do DMZ não publica um artefato Maven, então use um jar local durante o desenvolvimento:

  1. Baixe a versão do DMZ que você quer usar ou compile você mesmo com ./gradlew build no repositório do DMZ.
  2. Use o jar sem classificador (dragonminez-<version>.jar): ele inclui as bibliotecas de banco de dados do DMZ. O jar -slim não é feito para ser usado.
  3. Coloque-o na pasta libs/ do seu projeto e referencie-o com fg.deobf(...) como mostrado acima, para que o ForgeGradle o remapeie para os seus mappings de desenvolvimento.

Use compileOnly em vez de implementation se você só quer compilar contra o DMZ e rodá-lo em uma instância separada.

Passo 5: Escute os eventos do DMZ

O DMZ publica seus eventos de Forge de servidor e comuns como classes aninhadas de com.dragonminez.common.events.DMZEvent, e seus eventos de cliente como classes aninhadas de com.dragonminez.client.events.DMZClientEvent. Por exemplo:

@Mod.EventBusSubscriber(modid = "your_addon_modid", bus = Mod.EventBusSubscriber.Bus.FORGE)
public class DmzHooks {
    @SubscribeEvent
    public static void onTpGain(com.dragonminez.common.events.DMZEvent.TPGainEvent event) {
        // Example: increase TP gain by 10%
        int boosted = Math.round(event.getTpGain() * 1.10f);
        event.setTpGain(boosted);
    }
}

Os arquivos-fonte dos eventos são src/main/java/com/dragonminez/common/events/DMZEvent.java e src/main/java/com/dragonminez/client/events/DMZClientEvent.java. A lista completa, junto com os registros de objetivos e recompensas de missões, os placeholders de texto e os slots do Menu de Utilidades, está em Implementação e eventos.

Estrutura sugerida do addon

  • your/addon/MainModClass.java
  • your/addon/event/DmzHooks.java
  • src/main/resources/META-INF/mods.toml
  • src/main/resources/pack.mcmeta

Checklist do primeiro marco

  1. O addon carrega sem crashar no cliente de desenvolvimento.
  2. O DMZ é detectado quando está presente.
  3. Um evento do DMZ é recebido nos logs.
  4. Uma mudança de comportamento fica visível no jogo.

Recomendações de compatibilidade

  • Proteja os trechos de código que só funcionam com o DMZ com verificações de presença do mod.
  • Registre avisos claros no log quando o DMZ estiver ausente ou sua versão for incompatível.
  • Não inclua nem dependa de Legendary Tooltips, Epic Fight ou Better Combat: o DMZ se recusa a iniciar junto com eles.
  • Use seu próprio canal de rede e nunca confie no que o cliente envia para o progresso (veja Rede).