Custom races and their abilities, transformation chains, sagas and quests, Shenron wishes, and the NPC cast with the editors that build all of it.
The SDU tree is the content half of the suite: custom races, forms, sagas, wishes, custom GeckoLib NPCs, and the in-game editors for all of them, plus a batch of gameplay features (waypoints, training dummies, buff tokens, blocks, the hakai ability). It is the only tree the other four addons are allowed to read from, which is why the whole module switchboard (ModuleCatalog / SuiteModules) lives here.
/rg root (Brigadier merges /rg across
all five addons). The legacy /sdu root still exists as a hidden alias that redirects onto /rg npc.
/rg npc ... tree and /rg edit only register when the Sdu module is on. If
Sdu = false in modules.cfg, none of these commands exist. (/rg modules is the one exception; see the Sdu section.)
npc node and edit node both call
.requires(source -> source.hasPermission(2)), so every subcommand under them inherits OP. The suite's permission layer (Shurui's Utilities) exposes these as command.rg.* nodes (for example command.rg.edit, command.rg.npc.hakai) so they can be granted to non-ops through the permission system; the raw Minecraft default is OP.
SduPerms.canEdit, which is also hasPermissions(2).
(sdu/src/main/java/net/shurui/dev/sdu/util/SduPerms.java.)
modules.cfg takes effect only after a server restart. The
switchboard decides at mod construction and at command-registration time, neither of which can be undone mid-run. /rg modules set says so when you use it.
startup (ModuleTeardown, sdu/.../modules/ModuleTeardown.java), and by re-checking the switch inside the server-side packet handler for editors and NPC spawns. Hiding a hub row is never the gate; the server always re-asks.
(PublicContent), so any server running the mods gets all of this, with or without the Ragnarok Key. The KeyGate class in this tree only answers key presence and gates travel to the private imported worlds (kaiow, namekow), which need the Ragnarok Key.
Source: sdu/src/main/java/net/shurui/dev/sdu/command/DmzNpcCommand.java, .../event/ForgeEvents.java, .../modules/ModuleTeardown.java, .../network/OpenEditorRequestPacket.java, .../network/SpawnFighterPacket.java.
Note: DmzNpcCommand's file header comment mentions a /rg npc summon and a sdu:dmz_fighter id, but no summon subcommand is registered in the current code. Custom saga fighters are placed with vanilla /summon dmz_ragnarok:dmz_fighter ... {Definition:"id"} or via the CustomNPCs "Make saga fighter" button.
The master switch for the entire SDU half of the suite. On, you get custom races and their abilities, custom transformation forms, sagas/quests and the quest tracker, Shenron wish sets, the custom GeckoLib NPCs, the editor hub, and every gameplay feature below. Off, all of that goes away: no editors open, the custom races/forms/sagas are not served, and the whole /rg npc command tree declines to register.
/rg edit (OP) - opens the shared editor hub (races, forms, sagas, wishes, NPCs, plus the raid,
tournament, dungeon and admin sections other addons register into it).
/rg npc edit (OP) - same as /rg edit, opens the hub.
/rg npc reload (OP) - reloads saga spawn bindings, deferred spawns, talk-NPC bindings and the
saga-NPC map from disk (after an edit made outside the game).
/rg npc givetechnique <targets> <technique> (OP) - grants a DragonMineZ technique (kamehameha,
galick_gun, ...) to the targets. Silent (not broadcast to other ops), so it works as a quest reward.
/rg npc forms verify (OP) - reads every race's form config back the way the game reads it and
reports what is broken. Also runs at server start.
/rg modules and /rg modules list (OP) - lists every switchboard key, whether each is on, and
whether a parent being off is suppressing it.
/rg modules set <key> <true|false> (OP) - writes a switch to modules.cfg; takes effect next
restart. /rg modules registers unconditionally (even when Sdu is off) so you can always switch things back on in-game.
/sdu - hidden legacy alias, redirects to /rg npc.
command.rg.edit, command.rg.npc.*, command.rg.modules.* - all default OP (level 2). Exact node derivation is handled by Shurui's Utilities' command layer.
config/dmz_ragnarok/modules.cfg (hand-parsed) - the operator switchboard. Contains a line per
key in ModuleCatalog. Unknown/absent keys default to ON. Dotted keys are a hierarchy: Sdu = false disables every Sdu.* child. Read at mod construction; changes need a restart.
config/sdu-common.toml (Forge COMMON config, Config.java). Server-side. Keys and defaults:
requireOpToEdit = true - if true, only operators (or the NPC's owner) may open the NPC editor.
maxNpcHealth = 1000000000 - upper bound the Options screen offers for an NPC's max health
(effectively no ceiling; no editor actually clamps to it).
enableDmzIntegration = true - scale NPC combat stats/damage through DMZ's ki-stat system.
enableAuraStacking = true - render a form's extra aura layers on top of DMZ's aura (safety
switch to false if stacked auras misbehave).
barrierDefaultLevel = 100 - default DMZ level a freshly-placed Level Barrier gates to.
chamberRadius = 12 - Gravity Chamber effect radius in blocks when no WorldEdit region is captured.
chamberMultiplier = 1.5 - TP-gain multiplier inside a Gravity Chamber.
chamberShareFraction = 0.25 - fraction of post-multiplier TP shared to every other player in
the same chamber (0 disables sharing).
chamberGravity = 1.0 - extra gravity applied inside a fresh chamber (1.0 = none); needs DMZ's
gravity.machineGravityEnabled = true.
shadowDummyCooldownSeconds = 90 - per-player cooldown between shadow dummy summons (0 disables).
shadowDummyMaxAlivePerParty = 1 - max live shadow dummies per party.
partyTpFalloffThreshold = 3 - party sizes at/below this keep full shared TP.
partyTpFalloffStepPercent = 20 - percent of shared TP removed per member beyond the threshold.
partyTpFalloffFloorPercent = 20 - minimum shared-TP fraction, as a percent, at any party size.
allowPrivateWorldsWithoutKey = false - no longer has any effect: travel to the private imported worlds
(kaiow, namekow) always needs the Ragnarok Key. Kept only so existing config files stay valid. Most of these are also editable live from the in-game Options screen via an op-gated save packet (Config.applyAndSave), which persists back to the toml without a restart.
config/sdu-client.toml (Forge CLIENT config, ClientConfig.java). Per-player, never syncs. See
the Waypoints/Transformations sections for the specific keys; all five are: overShoulderCrosshair = true, firstPersonCrosshair = true, reskinContainers = false, guiSounds = true, alwaysShowExtraFormsTab = false.
config/sdu/ are documented in their own module sections below.
The whole SDU content set (see each module below). Nothing extra registered by Sdu itself.
/rg npc tree and /rg edit do not register at all, but the added items/blocks/entities
stay registered (a disabled module must never orphan world data).
/rg modules reports only the operator's switches; a server key can withhold more, and the startup
log names anything it withheld. The two axes are independent.
dmz_ragnarok (the merged mod id) even though the code tree is sdu.
Custom playable races and their racial abilities, plus the in-game race editor. A race can carry a "racial skill" with configurable behaviour: percentage stat buffs, health/ki/stamina regen, potion effects and incoming-damage resistance, triggered one of several ways (always-on, while below an HP threshold like a Zenkai, for a window after taking a hit or a kill, or on the racial keybind with a cooldown). The editor can also suppress DragonMineZ's own default races/classes so only your custom ones show.
None of its own. The race editor is reached through /rg edit -> race, gated on Sdu.Races server-side.
Editor access: hasPermissions(2) (SduPerms.canEdit). No dedicated node beyond the hub.
config/sdu/racial_skills.json - per-race racial-skill behaviour, keyed by DMZ race id. Written by
the editor. Per-entry fields include trigger (default ALWAYS_ON) and cooldownSeconds (default 30.0) plus stat/regen/effect/resistance bags. Starts empty on a fresh server.
config/sdu/suppressed_defaults.json - the list of DMZ default race/class ids to hide. Written by
the editor.
config/sdu/generated_lang.json - generated display-name lang keys for custom races/classes/forms
(server-authoritative names streamed to clients). Managed automatically.
config/dragonminez/races/<race>/
(DMZ's own format; the editor writes them).
None directly (races are data).
RacialSkillHandler) is pulled off the bus when Sdu.Races is
off, so racial abilities stop applying, but the races themselves remain selectable.
auraWidth/auraHeight keys, so per-race aura sizes are
kept in a separate lookup (RaceAuraConfig, rebuilt from disk at boot) and synced to clients on login.
Custom transformation forms, form groups and transformation chains, plus the form editors. Adds a per-form combat layer (auto-dodge chance and incoming-damage reduction while transformed), optional extra aura layers rendered on top of DMZ's aura, and the ability to quest-gate which forms a player can buy. Includes server-side helpers for buying "stack" skills (kaioken, ultimate) and for granting every form at once.
/rg npc, OP)/rg npc buyskill <skill> - self-buys the next level of a DMZ stack skill (kaioken, ultimate).
This is the purchase path the DMZ client menu never sends for a stack skill's first level. Self-only (acts on the sender), still requires OP to reach /rg npc.
/rg npc forms grantall [targets] - unlocks all DMZ forms and maxes mastery for the targets
(default the sender), then resyncs. A bare @a fans out across the shard network.
/rg npc forms verify - audits every race's form config (also listed under Sdu).
command.rg.npc.buyskill, command.rg.npc.forms.* - default OP.
config/sdu/form_combat.json - per-form combat tuning (dodge %, damage reduction), keyed by form
skill name. Written by the form editor. Version 1.
config/sdu/form_auras.json - per-form extra aura layers. Written by the editor. Gated at render
time by enableAuraStacking in sdu-common.toml.
config/sdu/form_quest_gates.json - which forms are locked behind which quests (advisory UX in the
skills menu), keyed by lower-cased form-skill name.
config/sdu/form_tombstones.json - deleted custom form-type ids, so their leftover skill entries
and usage history are scrubbed rather than resurrected.
config/dragonminez/forms/... - the custom form definitions themselves live in DMZ's form config
tree, written by the editor.
None directly (forms are data).
enableAuraStacking = false in sdu-common.toml is a global kill-switch for the extra aura layers.
prices: [] or [-1] is silently unreachable (a known DMZ config trap).
(restores kaioken/ultimate stack entries an older build removed) so DMZ's form purchase menu lists them.
Sagas, quests, objectives and side-quests, plus the quest tracker and the saga/side-quest editors. Lets you author story content (talk-to, kill, reach-a-place objectives, timed and repeatable quests) and bind saga steps to NPC spawns. Talking to any living entity whose name matches a configured talk-target completes a TALK_TO objective.
No dedicated commands. Editors are reached through /rg edit -> saga / sidequest, gated on Sdu.Sagas server-side. /rg npc reload (under Sdu) reloads saga bindings from disk.
Editor access: hasPermissions(2).
<world>/dragonminez/{sagas, quests, sidequests}/ (DMZ's own data dirs; the editor writes there).
config/sdu/saga_quest_gates.json - quest-gated saga-unlock map (which quest unlocks which saga),
synced to clients for the quest-tree saga lock.
config/sdu/quest_timers.json - per-quest time limits.
config/sdu/quest_repeats.json - repeatable-quest configuration.
config/sdu/quest_item_consume.json - which quest items are consumed on turn-in.
config/dmz_ragnarok/saga_npc_map.json - the saga -> NPC binding map.
All of these are editor/tooling-managed; they start empty on a fresh server.
None directly. Saga fighters use the Sdu.Npcs entity.
those behaviours stop, but the saga data files remain.
config/, so it is per-world and travels with the save.
Shenron wish sets, the shrine wishes and the wish editors. Adds SDU's own Shenron-shrine blocks and a custom wish flow that is independent of DMZ's built-in dragon-ball wish system, plus a non-interactable Shenron display entity summoned by the shrine.
No dedicated commands. Wish and shrine editors reached through /rg edit -> wish / shrine, gated on Sdu.Wishes server-side.
Editor access: hasPermissions(2).
config/sdu/shenron_shrines.json - the custom Shenron-shrine wish configuration (its own wish sets,
independent of DMZ). Written by the shrine editor. Version 1. Starts empty.
<world>/dragonminez/wishes/.
Blue Shenron Shrine, Gold Shenron Shrine, Green Shenron Shrine, Red Shenron Shrine
(registry ids shenron_shrine_blue/gold/green/red). Four colour variants of the shrine block.
Shenron (dmz_ragnarok:shenron) - the fully custom, non-interactable Shenron display
entity summoned by the shrine feature.
wishScreenId
is a known way to make a custom dragon serve the wrong wish list.
Content.Shrine) is a
different thing from these four SDU Shenron shrines.
SDU's custom GeckoLib NPCs and their editor, including the ragnarok cast. The core entity is the "DMZ Saga Fighter": a real DMZ-style fighter (true saga AI, DMZ animations, ki-move loadouts) that renders as a configurable custom NPC model. Used as living saga bosses and enemies.
/rg npc, OP)/rg npc reload (listed under Sdu) reloads NPC definitions and saga bindings.
button (which sends SpawnFighterPacket, OP + CNPC-present + Sdu.Npcs-on gated) or by summoning the dmz_ragnarok:dmz_fighter entity with a definition.
Spawn/edit: hasPermissions(2).
config/sdu/npcs/*.json - the custom NPC definitions (model, skin, hair, stats, ki loadout). One
file per NPC. Managed by the editor; example files ship for reference.
DMZ Saga Fighter (dmz_ragnarok:dmz_fighter) - the custom GeckoLib fighter, sized
0.7 x 2.0, MONSTER category.
(see the workspace asset-delivery system); the model tables list ~386 entries regardless of what a client holds.
SduKiMovesCsv for per-spawn ki-move loadouts (the dungeon advanced spawner writes
this; a DMZ or CustomNPC entity ignores it). CustomNPC clones keep their loadout as sdu_dmz_ki_moves on the display data instead.
the entity itself renders without CustomNPCs.
SpawnFighterPacket re-checks Sdu.Npcs server-side, so a stale open screen cannot spawn one after
the operator switched custom NPCs off.
The transformation engine that drives custom form changes on NPCs/entities (as opposed to player forms). It swaps an entity's model, stats and attributes when a trigger fires, and applies a combat layer (auto-dodge and damage mitigation) to the transformed entity based on its active form.
None.
None.
None of its own (transform definitions ride the form/NPC data). The client toggle alwaysShowExtraFormsTab = false in sdu-client.toml keeps the transformation wheel's Extra Forms slot visible even when empty.
None.
TransformEngine and TransformCombatHandler come off the bus, so NPC transformations stop.
sdu_tf_active NBT, a different data source from the player form-combat
system's sdu_form_rage, so the two never cross-contaminate.
Waypoints, the compass strip and the on-screen markers. Automatically derives temporary waypoints from your active DMZ quest objectives (biome, coordinate, dimension, interact, kill and structure objectives) so the target shows on screen, and lets admins pin manual named waypoints on players.
/rg npc waypoint, OP)/rg npc waypoint set <targets> <name> [pos] [dimension] - add/replace a named manual waypoint per
target. pos defaults to the target's block position, dimension to its current one. Names are unique per player (case-insensitive), so re-setting a name moves it. Fans out across shards for a bare @a.
/rg npc waypoint clear <targets> <name> - remove one named waypoint.
/rg npc waypoint clearall <targets> - remove all of a player's manual waypoints.
/rg npc waypoint list <targets> - list a player's waypoints.
command.rg.npc.waypoint.* - default OP.
config/sdu-client.toml client toggles that affect the HUD reticle/markers:
overShoulderCrosshair = true, firstPersonCrosshair = true. Per-player, client-side only.
WaypointStore), not a config file.
None.
COLOR_MANUAL) are persisted; quest-derived waypoints (gold, COLOR_QUEST)
are transient and rebuilt from live quest state each tick.
WaypointTracker handler comes off the bus, so both the auto quest markers and the
compass strip stop updating.
SDU's own combat handling: NPC defence and form combat modifiers. Applies DMZ's resistance-mitigation curve to mob victims (DMZ's own curve is player-only, so custom fighters would otherwise take raw damage), and runs the per-player form combat layer (auto-dodge and form damage mitigation on transformed players).
None.
None.
config/sdu/form_combat.json (see Sdu.Forms).
NpcDefense.KEY persistent-data value (written by the NPC
editor/spawner), not a config file.
None.
NpcDefenseHandler and FormCombatHandler come off the bus. Custom fighters would then
take unmitigated damage and player forms lose their dodge/mitigation.
FormCombatHandler is registered at LOWEST priority on LivingDamageEvent (not via annotation) so
it lands after DMZ's own LOWEST armour-reduction rebuild, which would otherwise discard it. This is why it is added by hand in DmzNpc.commonSetup.
The hakai (erase) ability: a hidden admin technique (shuruis_hakai) that plays a ~10.4 second erase sequence on a target, freezing it, then disintegrating it. Against a player it permanently bans and kicks them at the erase moment; against any other living entity it kills it.
/rg npc hakai, OP)/rg npc hakai - self-grant the hidden shuruis_hakai technique to yourself.
/rg npc hakai <targets> - grant it to other players (re-gated per target on hasPermissions(2),
so a non-op target is refused and not counted).
/rg npc hakai revoke <targets> - remove it from players.
command.rg.npc.hakai.* - default OP. The technique itself is also re-gated on hasPermissions(2) when granted, so a non-op cannot receive or keep it.
None.
None (it is a DMZ technique, kept out of givetechnique's suggestions).
HakaiManager comes off the bus, so any in-progress erase sequences stop driving.
Training dummies and their spawn limits. Applies server-side rules to DMZ's shadow/training dummies: a per-player summon cooldown, a cap on live dummies per party, and an anti-farm rule that gives a player in a party no TP for killing a dummy.
None.
None.
In config/sdu-common.toml (see Sdu for the full list):
shadowDummyCooldownSeconds = 90 - per-player cooldown between summons (0 disables the rule).
shadowDummyMaxAlivePerParty = 1 - max live dummies a party may have out at once.
partyTpFalloffThreshold = 3, partyTpFalloffStepPercent = 20, partyTpFalloffFloorPercent
= 20 - the party shared-TP fall-off (these govern DMZ shared-TP generally, applied around dummy and party kills). Editable live from the Options screen.
None (uses DMZ's own shadow dummy entity).
ShadowDummySpawnLimitEvents and ShadowDummyTpEvents come off the bus, so dummies spawn
without limits and party members earn normal TP from them again.
SDU's two data-carrying blocks: the Level Barrier and the Gravity Chamber. The Level Barrier is an invisible break-gate that a player cannot mine through until they reach a required DMZ level. The Gravity Chamber is a training block that multiplies TP gain for players inside its area and shares a fraction of that gain with everyone else training in the same chamber.
None. (The barrier's required level is set by an op right-clicking the placed block.)
None dedicated; setting a barrier's level is op/creative-gated at the block interaction.
In config/sdu-common.toml:
barrierDefaultLevel = 100 - default required DMZ level a freshly-placed Level Barrier gates to.
chamberRadius = 12 - Gravity Chamber effect radius (blocks) when no WorldEdit region is captured.
chamberMultiplier = 1.5 - TP-gain multiplier inside a chamber.
chamberShareFraction = 0.25 - fraction of post-multiplier TP shared to others in the same
chamber (0 disables sharing).
chamberGravity = 1.0 - extra gravity inside a fresh chamber (1.0 = none); needs DMZ's
gravity.machineGravityEnabled = true to take effect.
Gravity Chamber (dmz_ragnarok:gravity_chamber) - solid gray block; area TP multiplier + shared pool.
Level Barrier (dmz_ragnarok:level_barrier) - invisible red-map block; per-block DMZ-level break
gate. Does not suffocate or block view (pinned like glass) despite its full collision box.
BlockFeatureEvents comes off the bus, so barriers no longer block mining and chambers no
longer boost TP, but the placed blocks stay.
gravity.machineGravityEnabled is true.
Consumable buff tokens. TP Buff Tokens grant a temporary extra-TP-gain buff; Stat Discount Tokens grant a temporary discount on stat purchases. Each token is right-clicked to apply its effect for 30 minutes; multiple tokens of a family stack additively, each keeping its own expiry.
None.
None.
None (the durations and tiers are hard-coded).
Two families of nine tiers each (10%, 15%, 20%, 25%, 30%, 35%, 40%, 45%, 50%):
TP Buff Token (10%..50%) (dmz_ragnarok:tp_buff_token_10 .. _50) - extra TP gain, aqua tint.
Stat Discount Token (10%..50%) (dmz_ragnarok:stat_buff_token_10 .. _50) - cheaper stat
purchases, green-to-gold tint. Both apply for 30 minutes each. Tokens are always foil (glint).
TokenBuffEvents comes off the bus so the TP-gain buff stops applying. (The stat discount is
applied by a separate stat-cost mixin reading the same store; verify both if disabling.)
so displayed prices match what the server will charge.
SDU's dragon-ball handling. The sdu-side behaviour is the rescatter: at server-started (after Shurui's Utilities' MultiWorld dimensions are registered), it scatters every configured dragon-ball set into the dimensions DMZ skipped during its own earlier first-scatter (DMZ tends to fill only the first valid dimension of each set and races SU's dimension registration). Idempotent, so it only fills the dimensions DMZ missed.
None.
None.
None in the sdu tree. (Which dimensions a set scatters into is DMZ's own dragon-ball set config.)
None registered in the sdu tree.
implemented in the shuruisutilities tree, not sdu. In the sdu tree, Sdu.DragonBalls only controls the rescatter handler (DragonBallRescatterHandler).
DragonBallRescatterHandler comes off the bus, so sets that DMZ failed to place in
MultiWorld/late dimensions (e.g. shuruisutilities:smp) will not be scattered there.
CustomNPCs integration: adds a DragonMineZ sub-GUI tab to the CustomNPCs editor and a model bridge. Lets a Custom NPC be given DMZ GeckoLib models and animations, DMZ move sets, an AI level, player/URL skins and a model preset, and lets saga steps spawn CustomNPC clones. Optional: needs the CustomNPCs port (customnpcs) and, for models, the CNPC-Gecko-Addon (cnpcgeckoaddon).
/rg npc dmznpc, OP)/rg npc dmznpc model <geo> <anim> [idle] [walk] [attack] [hurt] - feeds DMZ GeckoLib geo/animation
reslocs onto the nearest Custom NPC within 8 blocks. Requires the CNPC-Gecko-Addon; refuses with a message otherwise. A test hook until the editor tab covers it.
command.rg.npc.dmznpc.* - default OP.
config/sdu/npcs/*.json shares the NPC definition store with Sdu.Npcs.
(sdu_dmz_ki_moves, model persist fields), not a standalone file.
customnpcs isModLoaded probe and the model-bridge bus registration
happen. When Sdu.Cnpc is off, DmzCnpcCompat.init() is never called, so cnpcAvailable() stays false and every downstream CNPC path is quiet, and no optional CustomNPCs class is classloaded.
Sdu.Cnpc is off
(GuiCreationEntitiesTabMixin).
warning. The model command needs the Gecko addon specifically, not just the CNPC port.