Custom Forms
Custom forms are transformations you add or change with JSON files. Forms can live in two places; both use exactly the same JSON schema and Java class (FormConfig.java), and only the folder they sit in changes what they mean:
| Location | What it is |
|---|---|
config/dragonminez/races/<race>/forms/*.json |
Race forms belong to one race only (for example, Super Saiyan only exists for Saiyans). See Custom Races. |
config/dragonminez/forms/*.json |
Stack forms are shared by all races and designed to layer on top of whatever race form is already active. |
This page is about the second kind, stack forms, but the field reference below applies to race forms too.
Loader: ConfigManager.createOrLoadStackForms() reads every file in config/dragonminez/forms/ (ConfigLoader.loadStackForms). Files whose name starts with old_ are ignored.
What a stack form is
A stack form doesn't replace your current transformation: it stacks its multipliers on top of it. The clearest example is Kaioken: a Saiyan can be in base form or Super Saiyan and also be in Kaioken x2 at the same time, multiplying whatever form they are already in. The built-in stack form groups are kaioken (x2, x3, x4, x10, x20) and ultimate (StackForms.java).
A stack group is unlocked by the stack skill named in its formType: kaioken or ultimate. A form of the group becomes available when that skill reaches the form's unlockOnSkillLevel.
File structure
There is one file per group, for example config/dragonminez/forms/kaioken.json (shortened):
{
"configVersion": "2.2.0",
"groupName": "kaioken",
"formType": "kaioken",
"forms": {
"x2": {
"name": "x2",
"unlockOnSkillLevel": 1,
"keepBaseFormHeadBones": true,
"strMultiplier": 1.1,
"skpMultiplier": 1.1,
"defMultiplier": 1.125,
"pwrMultiplier": 1.1,
"speedMultiplier": 1.1,
"healthDrain": 0.03,
"attackSpeed": 1.1,
"tintColor": "#FF0000",
"tintIntensity": 0.1,
"auraColor": "#DB182C",
"auraLayer": 1,
"formStackable": true,
"stackDrainMultiplier": 1.0,
"incompatibleWith": ["ultimate.ultimate"],
"shareMasteryWith": ["kaioken.x3"],
"shareMasteryMultiplier": 0.25
}
}
}
groupName is the group key (lowercase); groups are identified by it, not by the filename. Everything nested under forms is one form entry, keyed by its own name. Any field you leave out takes the default shown below.
"configVersion": "2.2.0". A custom form file with an older or missing version is backed up to config/dragonminez/oldBackup/ and saved again with the current version; your values are kept. A file with broken JSON syntax is skipped and reported until you fix it.Field reference
Schema source: src/main/java/com/dragonminez/common/config/FormConfig.java.
Unlock and requirements
gameplay| Field | Type | Default | What it does |
|---|---|---|---|
name |
String | "" |
Form key within the group (for example x2, x3 or ultimate).
|
unlockOnSkillLevel |
Integer | 0 |
Level of the group's form skill that unlocks this form. |
formRequisite |
String | "" |
Other forms that must be mastered first, as "group.form". Separate several with commas.
|
formRequisiteType |
String | all |
all: every listed form needs the mastery. any: one is enough.
|
unlockOnMastery |
Double | 0.0 |
Mastery the formRequisite forms need. 0 turns the requirement off.
|
levelRequisite |
Integer | 0 |
Player level needed. Until it is reached, the form skill cannot be leveled up to this form. Toggle: levelFormRequisiteEnabled in general-server.json → gameplay.
|
sagaRequisite |
String | "" |
Saga quest that must be completed first, as "sagaId:questId" (for example "frieza_saga:10"). Until it is completed, the form skill cannot be leveled up to this form. Ignored when story mode is off or the quest does not exist. Toggle: sagaFormRequisiteEnabled in general-server.json → gameplay.
|
Visuals
| Field | Type | Default | What it does |
|---|---|---|---|
customModel |
String | "" |
Model key for the form. Looked up like a race model: built-in keys or your own geo/entity/races/<key>.geo.json (see Custom Models and Assets). A stack form's model wins over the race form's.
|
keepBaseFormHeadBones |
Boolean | false |
Keeps the player's chosen head bone (ears, horns and so on) visible in this form. |
hideTail |
Boolean | false |
Hides the Saiyan tail while in this form. |
transformationAnimation |
String | transf.generic |
Animation played while charging into this form. Built-in values: transf.generic, transf.ssj, transf.ssj3, transf.ssg2, transf.ozaru, transf.absorb, transf.berserker, transf.freezer, transf.freezer2, transf.janemba, transf.daima. Any animation name from the player animation files (assets/dragonminez/animations/entity/races/*.animation.json) works, so a resource pack can add its own. Empty means the generic animation.
|
bodyColor1, bodyColor2, bodyColor3, hairColor, eye1Color, eye2Color |
Hex string | "" |
Color overrides. Empty keeps the player's color. Colors blend in while charging. |
furUsesHairColor |
Boolean | false |
On SSJ4 models (a customModel containing ssj4gt or ssj4d), colors the fur with the hair color.
|
hairType |
String | "" |
Which of the player's hair styles to show: base, ssj, ssj2, ssj3 or ssj4.
|
forcedHairCode |
String | "" |
A hair code (from the hair editor) forced while in this form. |
extraFormLayer, extraFormColor |
String / Hex | "" |
Extra texture drawn over the body, tinted with extraFormColor (white if empty). Use a full namespace:path or a path inside the dragonminez namespace, for example textures/entity/races/my_overlay.png.
|
auraType |
String | kakarot |
2D aura sprite set: kakarot or god.
|
auraType3D |
String | userPreference |
3D aura style: smooth, sparking, god or userPreference (each player's own setting). A form that names god shows it for any race; as a player preference it is Glind-only.
|
auraColor |
Hex string | "" |
Aura color. Empty keeps the player's aura color. |
auraLayer |
Integer | 0 |
Aura layer slot. Forms on different layers show separate auras at the same time (the Kaioken forms use layer 1).
|
aura3DStyle |
Object | See below | Shape of the 3D aura (see 3D aura shape). |
extraAuraType, extraAuraType3D, extraAuraColor, extraAuraLayer, extraAura3DStyle |
— | kakarot, userPreference, #FFFFFF, -1, defaults |
A second aura. extraAuraLayer must be 1–6 to show; -1 means none.
|
hasLightnings, lightningColor |
Boolean / Hex | false, "" |
Lightning bolts around the player. |
modelScaling |
[x, y, z] floats |
[0.9375, 0.9375, 0.9375] |
Model scale factors. |
tintColor, tintIntensity |
Hex / Double | #FF0000, 0.0 |
Color tint over the player while transformed. 0 means no tint.
|
outlineShader |
Object | — | enabled (false), primaryColor (#7FFFFF), secondaryColor, outlineThickness (1.5), fireIntensity (0–3, default 0: animated flame tongues), colorMode ("pulse", the default, shifts between the two colors; "gradient" goes from primaryColor next to the body to secondaryColor at the outer edge) and bodyGlow (0–1, default 0: a glow of the outline color along the edges of the body). The same outlineThickness draws a wider outline than before 2.2.
|
3D aura shape
These keys go inside aura3DStyle and extraAura3DStyle (and inside a race's aura3DStyle in character.json). Every key is optional; a missing key uses the default.
| Key | Default | What it does |
|---|---|---|
size |
[1.10, 1.17, 1.02] |
Width, height and depth of the aura shell. |
flamePeaks |
12 |
Number of flame tongues around the shell (1–64). Smooth style only. |
waveFrequency, waveSpeed, waveAmplitude |
2.0, 5.0, 0.75 |
Flame waves. In the sparking style, waveAmplitude is the spike reach and waveSpeed is the surge speed.
|
noiseDetail, upwardBias |
0.10, 0.54 |
Flame turbulence, and how strongly it flows upwards. |
coreAlpha, rimAlpha, rimPower, rimThreshold |
0.05, 1.0, 4.0, 0.05 |
Opacity of the center and of the edge. |
coreColor, rimColor, noiseColor |
"" |
Hex colors. Empty means derived from the aura color. |
secondBorderColor |
"" |
Hex color of an outer fringe around the edge. Sparking style only; empty means no fringe. |
bloomIntensity |
1.0 |
Glow strength. |
spikeDensity, spikeBurstRate, spikeRarity, bandStart |
32, 3.0, 3.0, 0.50 |
Sparking style only: spike columns (4–32), burst rate, how rare spikes are, and where the outline band starts. |
Stats and drains
| Field | Type | Default | What it does |
|---|---|---|---|
strMultiplier, skpMultiplier, stmMultiplier, defMultiplier, vitMultiplier, pwrMultiplier, eneMultiplier, speedMultiplier |
Double | 1.0 |
Stat multipliers. RES uses the average of defMultiplier and stmMultiplier. A race form and a stack form add their bonuses together, or multiply them if multiplicationInsteadOfAdditionForMultipliers is on in general-server.json.
|
attackSpeed |
Double | 1.0 |
Attack speed multiplier. |
energyDrain, staminaDrain, healthDrain |
Double | 0.0 |
Drain while transformed (also used for the cost of transforming). Values below 0 are treated as 0.
|
staminaDrainMultiplier |
Double | 1.0 |
Multiplier on the stamina each attack costs while transformed. |
otherworldTimeDrain, otherworldTimeDrainMastered |
Double | 1.0, 1.0 |
How fast this form drains Baba's temporary-revive timer, at 0 mastery and at full mastery (blended in between). See Otherworld. |
Mastery
| Field | Type | Default | What it does |
|---|---|---|---|
maxMastery |
Double | 100.0 |
Maximum mastery (0 means no mastery progression).
|
masteryPerHitDealt, masteryPerHitReceived |
Double | 0.01 |
Mastery gained per hit. |
passiveMasteryEveryFiveSeconds |
Double | 0.001 |
Passive mastery gained every 5 seconds in the form. |
maxStatsMultiplier |
Double | 1.25 |
At full mastery, stat multipliers above 1 are multiplied by this (scales up linearly with mastery).
|
maxCostMultiplier |
Double | 0.5 |
At full mastery, the form's drains are multiplied by this (scales linearly with mastery). |
stackOnMastery |
Double | 0.0 |
Mastery this form needs before it can be combined with a stack form (or, for a stack form, with a race form). |
instantTransformOnMastery |
Double | 40.0 |
Mastery this form needs for instant transformation (no charge, costs ki). |
allowFreeTransformOnMastery |
Double | 50.0 |
Mastery this form needs before you can transform straight into it instead of going through the group in order. The group's first unlocked form never needs it. |
shareMasteryWith, shareMasteryMultiplier |
List / Double | [], 1.0 |
Whenever this form gains mastery, each listed form ("group.form") gains that amount × shareMasteryMultiplier. The default Kaioken forms share 25% with the next one up.
|
Stacking behavior
| Field | Type | Default | What it does |
|---|---|---|---|
formStackable |
Boolean | true |
Both the race form and the stack form must allow stacking. |
stackDrainMultiplier |
Double | 2.0 |
While a race form and a stack form are combined, the drains of both forms are multiplied by the stackDrainMultiplier of both forms.
|
incompatibleWith |
List of "group.form" |
["ultimate.ultimate"] |
Forms that cannot be active at the same time as this one (checked both ways). On a race form, listing ultimate.ultimate also keeps the Ultimate form from copying it as your best form; DragonMineZ's own forms only list it on each race's top tier.
|
formCombo |
String | "" |
Weapon attributes id used for melee combos while in this form, for example dragonminez:giant for giant forms. A bare name is looked up under dragonminez:, then minecraft:. See Weapon Attributes.
|
Costs and effects
| Field | Type | What it does |
|---|---|---|
triggerItemCosts |
List of { itemId or itemTag, nbt, count, consume } |
Items needed to transform. Entries are alternatives: the first one the player can pay is used. count defaults to 1 and consume to true. itemTag is a tag id without #. Creative players skip it.
|
durationItemCosts |
List of { itemId or itemTag, nbt, durationSeconds } |
Items that keep the form going: one item buys durationSeconds (default 1) of form time. When none is left, the form ends.
|
mobEffects |
List of { effectId, amplifier, durationTicks, ambient, visible, showIcon } |
Potion effects applied while transformed. durationTicks -1 (the default) means as long as the form lasts.
|
Translation keys
Stack form groups and forms are named with these keys:
race.dragonminez.stack.group.<groupName> # e.g. "race.dragonminez.stack.group.kaioken" -> "Kaioken"
race.dragonminez.stack.form.<groupName>.<name> # e.g. "race.dragonminez.stack.form.kaioken.x2" -> "x2"
Add these to your en_us.json or to your own language file. Custom translations merge with the Crowdin ones in the same way as for custom races.
Reload and validate
- Save your file under
config/dragonminez/forms/. - Validate the JSON syntax (see How to JSON).
- Run
/dmzreload config(see Reloading and Updating Changes). - Transform in game and check that stats, drains, visuals and stacking behave as expected.