Crear un 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.

Crear un addon de DMZ te guía paso a paso por un addon de Forge completo que se integra con DragonMineZ: el jar de tu propio mod, que depende de DMZ y puede reaccionar a sus eventos y datos. Lee primero Primeros pasos con addons para conocer las herramientas y versiones necesarias.

Paso 1: Crea un proyecto de Forge 1.20.1

Parte del MDK de Forge para Minecraft 1.20.1 con Forge 47.4.10, ForgeGradle 6.0.30 y Java 17, igual que DMZ.

Estos archivos del repositorio de DMZ son buenas referencias para la estructura y la configuración de tu proyecto:

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

Paso 2: Configura Gradle

DMZ usa el DSL de Gradle en Kotlin (build.gradle.kts), pero para tu addon puedes usar Gradle con Groovy o cualquier otra configuración que prefieras. Solo asegúrate de que las versiones de Forge y Java coincidan. Un ejemplo 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"))
}

Paso 3: Declara la dependencia de DMZ

En el mods.toml de tu addon, añade una entrada de dependencia 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.

Pon mandatory en false si tu addon también funciona sin DMZ (consulta Patrón de dependencia opcional). El mods.toml de DMZ usa displayTest = "MATCH_VERSION", así que de todos modos el cliente y el servidor deben usar la misma versión de DMZ.

Paso 4: Añade DMZ al classpath de compilación

La compilación de DMZ no publica un artefacto de Maven, así que usa un jar local durante el desarrollo:

  1. Descarga la versión de DMZ a la que apuntas o compílala tú mismo con ./gradlew build en el repositorio de DMZ.
  2. Usa el jar sin clasificador (dragonminez-<version>.jar): incluye las librerías de base de datos de DMZ. El jar -slim no está pensado para usarse.
  3. Ponlo en la carpeta libs/ de tu proyecto y referéncialo con fg.deobf(...) como se muestra arriba, para que ForgeGradle lo remapee a tus mappings de desarrollo.

Usa compileOnly en lugar de implementation si solo quieres compilar contra DMZ y ejecutarlo desde una instancia aparte.

Paso 5: Escucha los eventos de DMZ

DMZ publica sus eventos de Forge de servidor y comunes como clases anidadas de com.dragonminez.common.events.DMZEvent, y sus eventos de cliente como clases anidadas de com.dragonminez.client.events.DMZClientEvent. Por ejemplo:

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

Los archivos fuente de los eventos son src/main/java/com/dragonminez/common/events/DMZEvent.java y src/main/java/com/dragonminez/client/events/DMZClientEvent.java. La lista completa, junto con los registros de objetivos y recompensas de misiones, los placeholders de texto y las ranuras del menú de utilidades, está en Implementación y eventos.

Estructura sugerida del addon

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

Lista de comprobación del primer hito

  1. El addon carga sin crashear en el cliente de desarrollo.
  2. DMZ se detecta cuando está presente.
  3. Se recibe un evento de DMZ en los logs.
  4. Se ve un cambio de comportamiento en el juego.

Recomendaciones de compatibilidad

  • Protege las partes del código que solo funcionan con DMZ con comprobaciones de presencia del mod.
  • Registra advertencias claras en el log cuando falte DMZ o su versión sea incompatible.
  • No incluyas ni dependas de Legendary Tooltips, Epic Fight o Better Combat: DMZ se niega a iniciar junto a ellos.
  • Usa tu propio canal de red y nunca confíes en lo que envía el cliente para el progreso (consulta Red).