Criar um addon de DMZ
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.propertiesbuild.gradle.ktssrc/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:
- Baixe a versão do DMZ que você quer usar ou compile você mesmo com
./gradlew buildno repositório do DMZ. - Use o jar sem classificador (
dragonminez-<version>.jar): ele inclui as bibliotecas de banco de dados do DMZ. O jar-slimnão é feito para ser usado. - Coloque-o na pasta
libs/do seu projeto e referencie-o comfg.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.javayour/addon/event/DmzHooks.javasrc/main/resources/META-INF/mods.tomlsrc/main/resources/pack.mcmeta
Checklist do primeiro marco
- O addon carrega sem crashar no cliente de desenvolvimento.
- O DMZ é detectado quando está presente.
- Um evento do DMZ é recebido nos logs.
- 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).