<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.dragonminez.com/index.php?action=history&amp;feed=atom&amp;title=Add-on_Getting_Started%2Fen</id>
	<title>Add-on Getting Started/en - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.dragonminez.com/index.php?action=history&amp;feed=atom&amp;title=Add-on_Getting_Started%2Fen"/>
	<link rel="alternate" type="text/html" href="https://wiki.dragonminez.com/index.php?title=Add-on_Getting_Started/en&amp;action=history"/>
	<updated>2026-10-25T22:24:21Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://wiki.dragonminez.com/index.php?title=Add-on_Getting_Started/en&amp;diff=7686&amp;oldid=prev</id>
		<title>FuzzyBot: Updating to match new version of source page</title>
		<link rel="alternate" type="text/html" href="https://wiki.dragonminez.com/index.php?title=Add-on_Getting_Started/en&amp;diff=7686&amp;oldid=prev"/>
		<updated>2026-10-13T05:47:31Z</updated>

		<summary type="html">&lt;p&gt;Updating to match new version of source page&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Add-on Getting Started&amp;#039;&amp;#039;&amp;#039; covers what you need in place &amp;#039;&amp;#039;before&amp;#039;&amp;#039; you wire up your own Forge mod against DragonMineZ: the toolchain versions, the mods to avoid, and the parts of DMZ an add-on can safely rely on. Read it before [[Special:MyLanguage/Creating a DMZ Addon|Creating a DMZ Addon]].&lt;br /&gt;
&lt;br /&gt;
== Who this is for ==&lt;br /&gt;
These pages are for Forge add-on developers who want their own mod jar to react to DMZ: granting bonus TP, listening for form changes, adding new quest objective and reward types, adding buttons to the utility menu and so on. If you just want to tune numbers or add races, forms, quests or wishes, you don&amp;#039;t need any of this; see [[Special:MyLanguage/Developer Scope and Prerequisites|Developer Scope and Prerequisites]] instead.&lt;br /&gt;
&lt;br /&gt;
DMZ has no Java API to register new races, forms, skills or techniques: new races and forms are added through JSON config files (see [[Special:MyLanguage/Custom Races|Custom Races]] and [[Special:MyLanguage/Custom Forms|Custom Forms]]).&lt;br /&gt;
&lt;br /&gt;
== Required toolchain ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Requirement !! Version !! Where it is declared&lt;br /&gt;
|-&lt;br /&gt;
| Minecraft || &amp;lt;code&amp;gt;1.20.1&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;gradle.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Forge || &amp;lt;code&amp;gt;47.4.10&amp;lt;/code&amp;gt; (accepts &amp;lt;code&amp;gt;[47,)&amp;lt;/code&amp;gt;) || &amp;lt;code&amp;gt;gradle.properties&amp;lt;/code&amp;gt;, add-on &amp;lt;code&amp;gt;mods.toml&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ForgeGradle || &amp;lt;code&amp;gt;6.0.30&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt; plugins&lt;br /&gt;
|-&lt;br /&gt;
| Java || &amp;lt;code&amp;gt;17&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt; toolchain&lt;br /&gt;
|-&lt;br /&gt;
| Mappings || Parchment &amp;lt;code&amp;gt;2023.09.03-1.20.1&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;gradle.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| GeckoLib || &amp;lt;code&amp;gt;4.8.3+&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;gradle.properties&amp;lt;/code&amp;gt;, add-on &amp;lt;code&amp;gt;mods.toml&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| TerraBlender || &amp;lt;code&amp;gt;3.0.1.10+&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;gradle.properties&amp;lt;/code&amp;gt;, add-on &amp;lt;code&amp;gt;mods.toml&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Curios API || &amp;lt;code&amp;gt;5.14.1+1.20.1&amp;lt;/code&amp;gt; or newer || &amp;lt;code&amp;gt;gradle.properties&amp;lt;/code&amp;gt;, add-on &amp;lt;code&amp;gt;mods.toml&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Match these exactly (or with compatible version ranges) in your own add-on&amp;#039;s &amp;lt;code&amp;gt;build.gradle&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;build.gradle.kts&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gradle.properties&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mods.toml&amp;lt;/code&amp;gt;, or you will hit classloading and mixin mismatches at runtime. DMZ itself is currently on mod version &amp;lt;code&amp;gt;2.2-alpha&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;gradle.properties&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
GeckoLib, TerraBlender and Curios are &amp;#039;&amp;#039;&amp;#039;mandatory&amp;#039;&amp;#039;&amp;#039; dependencies of DMZ, so they must be on your development runtime classpath too.&lt;br /&gt;
&lt;br /&gt;
== Incompatible mods ==&lt;br /&gt;
DMZ refuses to start (it throws an &amp;lt;code&amp;gt;IllegalStateException&amp;lt;/code&amp;gt; while loading) when any of these mods is installed, and declares them &amp;lt;code&amp;gt;incompatible&amp;lt;/code&amp;gt; in its &amp;lt;code&amp;gt;mods.toml&amp;lt;/code&amp;gt;:&lt;br /&gt;
* Legendary Tooltips (&amp;lt;code&amp;gt;legendarytooltips&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Epic Fight (&amp;lt;code&amp;gt;epicfight&amp;lt;/code&amp;gt;)&lt;br /&gt;
* Better Combat (&amp;lt;code&amp;gt;bettercombat&amp;lt;/code&amp;gt;)&lt;br /&gt;
Don&amp;#039;t depend on them, bundle them or add them to your development run configurations.&lt;br /&gt;
&lt;br /&gt;
== Pre-release builds ==&lt;br /&gt;
&amp;lt;code&amp;gt;2.2-alpha&amp;lt;/code&amp;gt; is a pre-release build. Alpha and beta builds of DMZ only let whitelisted usernames join a world or server. The default ForgeGradle development username &amp;lt;code&amp;gt;Dev&amp;lt;/code&amp;gt; is on the whitelist, so &amp;lt;code&amp;gt;runClient&amp;lt;/code&amp;gt; works out of the box: keep that username for local testing.&lt;br /&gt;
&lt;br /&gt;
== Package layout ==&lt;br /&gt;
Before writing any hook code, skim the source layout (&amp;lt;code&amp;gt;AI/Context.md&amp;lt;/code&amp;gt; in the DMZ repository documents it in detail):&lt;br /&gt;
* &amp;lt;code&amp;gt;com.dragonminez.client&amp;lt;/code&amp;gt;: rendering, GUI and animation; client only.&lt;br /&gt;
* &amp;lt;code&amp;gt;com.dragonminez.common&amp;lt;/code&amp;gt;: config, stats, networking, quests and wishes; the surface most add-ons touch.&lt;br /&gt;
* &amp;lt;code&amp;gt;com.dragonminez.server&amp;lt;/code&amp;gt;: commands, storage, world generation and server events.&lt;br /&gt;
* &amp;lt;code&amp;gt;com.dragonminez.mixin&amp;lt;/code&amp;gt;: mixins; avoid depending on these from an add-on.&lt;br /&gt;
Add-ons should hook &amp;lt;code&amp;gt;com.dragonminez.common&amp;lt;/code&amp;gt; almost exclusively: it is the shared, most stable layer. The only client-side hooks meant for add-ons are &amp;lt;code&amp;gt;DMZClientEvent&amp;lt;/code&amp;gt; and the utility menu slots (see [[Special:MyLanguage/Implementation and Events|Implementation and Events]]).&lt;br /&gt;
&lt;br /&gt;
== Two integration styles ==&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Hard dependency:&amp;#039;&amp;#039;&amp;#039; your add-on requires DMZ to be present (&amp;lt;code&amp;gt;mandatory=true&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;mods.toml&amp;lt;/code&amp;gt;). This is the simplest option, but your add-on won&amp;#039;t load without DMZ.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Soft (optional) dependency:&amp;#039;&amp;#039;&amp;#039; your add-on works on its own and only turns on DMZ-specific behavior when DMZ is detected. DMZ uses this pattern itself for its optional integrations (&amp;lt;code&amp;gt;common/compat/WeaponLevelingCompat.java&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;common/compat/ApotheosisCompat.java&amp;lt;/code&amp;gt;): check &amp;lt;code&amp;gt;ModList.get().isLoaded(&amp;quot;dragonminez&amp;quot;)&amp;lt;/code&amp;gt; once, and keep every class that imports DMZ code behind that check. This is recommended if your add-on has value without DMZ installed. See [[Special:MyLanguage/Implementation and Events#Optional dependency pattern|Optional dependency pattern]].&lt;br /&gt;
&lt;br /&gt;
== What you can safely rely on ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Events:&amp;#039;&amp;#039;&amp;#039; the nested classes of &amp;lt;code&amp;gt;com.dragonminez.common.events.DMZEvent&amp;lt;/code&amp;gt; (server and common) and &amp;lt;code&amp;gt;com.dragonminez.client.events.DMZClientEvent&amp;lt;/code&amp;gt; (client) are the intended public hook surface. See [[Special:MyLanguage/Implementation and Events|Implementation and Events]] for the full list.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Read-only player state:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;StatsCapability&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;StatsProvider&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;StatsData&amp;lt;/code&amp;gt;, for reading race, form, stats and resources.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Extension registries:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;QuestObjectiveRegistry&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;QuestRewardRegistry&amp;lt;/code&amp;gt; (custom quest content types), &amp;lt;code&amp;gt;DMZTextPlaceholders&amp;lt;/code&amp;gt; (custom &amp;lt;code&amp;gt;%placeholders%&amp;lt;/code&amp;gt; in quest and dialogue text) and &amp;lt;code&amp;gt;UtilityMenuScreen.addMenuSlot&amp;lt;/code&amp;gt; (buttons in the client utility menu).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Registries:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;MainItems&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MainBlocks&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MainEntities&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MainAttributes&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MainEffects&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;MainEnchants&amp;lt;/code&amp;gt; (and the other &amp;lt;code&amp;gt;Main*&amp;lt;/code&amp;gt; classes) under &amp;lt;code&amp;gt;common/init/&amp;lt;/code&amp;gt; expose &amp;lt;code&amp;gt;RegistryObject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;DeferredRegister&amp;lt;/code&amp;gt; references you can import directly.&lt;br /&gt;
&lt;br /&gt;
== What to avoid relying on ==&lt;br /&gt;
* Values reported by the client for anything related to progression. DMZ never trusts them either; read from the server-side capability instead.&lt;br /&gt;
* Changing &amp;lt;code&amp;gt;StatsData&amp;lt;/code&amp;gt; fields directly outside of events or commands. Prefer reacting to or cancelling events over poking values, and prefer DMZ&amp;#039;s existing commands when you need to change something DMZ owns.&lt;br /&gt;
* Registering packets on DMZ&amp;#039;s network channel. DMZ&amp;#039;s packet ids depend on registration order; use your own channel.&lt;br /&gt;
* Depending on &amp;lt;code&amp;gt;com.dragonminez.mixin&amp;lt;/code&amp;gt; classes or DMZ internals not mentioned above. These can change without notice between versions.&lt;br /&gt;
&lt;br /&gt;
== Next step ==&lt;br /&gt;
Once your development environment builds against DMZ and you can see it detected at runtime, move on to [[Special:MyLanguage/Implementation and Events|Implementation and Events]] to wire up actual hooks, then to [[Special:MyLanguage/Creating a DMZ Addon|Creating a DMZ Addon]] for the full Gradle and &amp;lt;code&amp;gt;mods.toml&amp;lt;/code&amp;gt; setup.&lt;br /&gt;
&lt;br /&gt;
{{Navbox Add-ons}}&lt;/div&gt;</summary>
		<author><name>FuzzyBot</name></author>
	</entry>
</feed>