ᚠ How Packs Work
Runeforged is the engine. Everything it forges, plays and awakens comes from packs. The Runeforged Default Pack installs with the mod and holds the full set. Your pack loads after it, so your files win.
- New pack: give it a name, a namespace (lower case, such as
my_pack) and a Minecraft version. - Start from:
- Blank: empty folders. You can add a music folder and the Abracadabra file.
- Elemental lineup: a copy of the Default Pack's awakening configs for the 8 Iron's Spells schools, plus its forging tags, ready to change. A second window picks the forgemap difficulty (Novice to God of Runesmithing) and either From my songs (drop
.oggfiles; each school gets one map per tier for all three minigames, built on the song's beats) or Empty.
- Add files from the tree on the left. Each file opens as a form.
- Fix the red problems on the right. They lock Export.
- Export ▾ → Mod jar, then drop the jar in
mods.
Your work is saved in the browser as you go and comes back when you reopen the page.
ᚢ The Window
Tree (left)
Two packs. The data pack holds pack.mcmeta and data/. The resource pack holds assets/ (songs, sounds, textures, lang). A label beside each folder names its type.
Add a resource pack sits below the tree, or right-click the data pack.
Files and folders
Right-click for New file, New folder, Import files here, Rename, Cut, Copy, Paste, Duplicate and Delete. Drag to move.
A file's type follows its folder, so moving a file changes which editor opens it.
Editors (middle)
Awakening configs, item tuning, Abracadabra and item tags open as forms with a Raw JSON toggle. Forgemaps open the chart editor. Other text files open as plain text; images and sounds are kept as they are.
Problems (right)
Live checks that match the game's loader. Click a problem to jump to its field or note. Red problems lock Export. The game also checks ids against what is installed, which the page can't see, so ids are only checked for shape.
Drag a panel's edge to resize it; double-click the edge to fold it. Hover any field or button for a tooltip. Import (or drop a file on the page) opens a pack zip or mod jar, or merges it into the open pack (same-path files are replaced). Any other file goes into the selected folder.
ᚦ Ids From Your Game
In game, with cheats or op, run /runeforged dump. It writes runeforged/editor_dump.zip in the game folder (click the path in chat to open it). Import that zip in the editor.
The zip lists every item, item tag, spell, school, attribute, effect, sound, simple particle, enchantment and function in your modpack. A summary shows how many items of each kind are forgeable and how many can be made forgeable. Item fields then offer only gear, forgeable items first. Typed ids that aren't listed still work.
ᚨ Export
| Mod jar | One plug-and-play jar holding both packs. It asks for a mod id, name, version, author, description and license. Drop it in mods; it loads in every world with no /reload, after the Default Pack. Import reads the jar back. |
| Data pack + resource pack | <ns>_data.zip for a world's datapacks folder, and <ns>_resources.zip for resourcepacks (only when the pack has one). A global datapack mod such as Global Packs can load them in every world. |
Empty folders are not exported. Every exported file needs pack.mcmeta: pack_format (48 for data, 34 for resources on 1.21.1) and a description.
ᚱ Replacing The Default Pack
- Awakening configs: one per school and behaviour. Yours replaces the Default Pack's for the same school and behaviour, whatever its file name. Two of your own files for the same pair is an error.
- Forgemaps: maps add to the pool. To replace one, use the same path:
data/iss_runeforged/forgemaps/<name>.json. - Tags: entries merge with the Default Pack's.
"replace": truethrows the lower ones away. - Abracadabra: rules merge.
"replace": truedrops every rule from lower packs. - Item tuning: one item may be in only one tuning file.
ᚲ Awakening Configs
What a school does when Runic Awakening wakes a forged item. Path: data/<ns>/awakening_configs/<school>/<behavior>.json.
Top level
| Field | Type | Meaning |
|---|---|---|
| school * | id | Full school id, such as irons_spellbooks:fire or iss_runeforged:runesmith. |
| behavior * | enum | Which forged items this covers: melee, projectile, spell_casting, shield, armor, curio. |
| matching_rune * | id | Rune item that pays for activation, such as irons_spellbooks:fire_rune. |
| activation * | object | Cost, duration and cooldown. See below. |
| triggers * | list | At least one trigger: an event and the actions it runs. |
| conditions | object | required_item_tags: the forged item must be in every tag listed. |
| display * | object | Text and icon on the awakening screen. See below. |
activation
| Field | Type | Meaning |
|---|---|---|
| mana_cost * | int ≥ 0 | Mana paid when awakening starts. |
| mana_cost_per_tick | int ≥ 0 | Mana drained every tick while awake. Default 0. |
| health_cost | number ≥ 0 | Health paid when awakening starts. Default 0. |
| consume_offhand_rune * | bool | true uses up the matching rune held in the off hand. |
| duration_ticks * | int > 0 | How long it stays awake. 20 ticks = 1 second. |
| cooldown_ticks * | int ≥ 0 | Wait before it can wake again. |
Events and who can be hit
| event | When | Allowed targets |
|---|---|---|
| on_activate | Awakening starts | self |
| on_deactivate | Awakening ends | self |
| on_hit | You hit an enemy | self, target, attacker |
| on_kill | You kill an enemy | self, target, attacker |
| on_cast | You cast a spell | self, attacker |
| on_damage_taken | You are hurt | self, attacker |
| on_block | Your shield blocks | self, attacker |
target is the enemy you hit or killed, attacker is whoever hurt you, self is you. An action's target defaults to target, so on on_cast, on_damage_taken and on_block set it yourself. Applies to actions that hit a living thing: apply_effect, apply_knockback, bonus_school_damage, cast_spell, ignite, spell_bleed.
Actions
Each action has a type and its own fields. Fields not marked * are optional; the default is in brackets.
| type | Fields | Does |
|---|---|---|
| apply_effect | effect* id, duration_ticks > 0 [100], amplifier 0–255 [0], target | Gives a potion effect. Amplifier 0 = level I. |
| bonus_school_damage | amount > 0, additional_hits 1–20 [1], target | Extra damage of the item's school. Without amount it deals 15% of the hit (at least 0.5). |
| apply_knockback | strength ≥ 0 [0.4], target | Pushes the target away. |
| ignite | seconds* 0–600, target | Sets the target on fire. |
| spell_bleed | percent_max_hp* 0–1, seconds* 0–600, max_stacks 1–100 [1], max_damage_per_tick > 0, target | Bleeds a fraction of max health each second, per stack. max_damage_per_tick caps it. |
| cast_spell | spell* id, spell_level ≥ 1 [1], target | Casts a spell, such as irons_spellbooks:firebolt. |
| apply_attribute | attribute* id, amount* not 0 | Adds to an attribute while awake. Only on on_activate; removed when awakening ends. |
| mana_vampirism | percent* 0–1 | Gives back this fraction of damage as mana. |
| spell_vamp | percent* 0–1 | Heals this fraction of the damage dealt. |
| particle_effect | particle* id, count 1–1000 [10], speed ≥ 0 [0.02], target | Shows particles. Only simple particles (no extra options). |
| play_sound | sound* id, volume > 0 [1], pitch 0–2 [1], sound_source, target | Plays a sound. sound_source: master, music, record, weather, block, hostile, neutral, player, ambient, voice. |
| run_command | command* text | Runs a command as the player, with op level 2. |
| run_function | function* id | Runs a datapack function, such as my_pack:awaken. |
The if block
Any action can carry "if": { ... }. It runs only when every check passes.
| target_has_effect / target_lacks_effect | effect id |
| target_burning | true or false |
| target_in_tag / target_not_in_tag | entity type tag, such as minecraft:undead |
| self_has_effect | effect id |
| chance | more than 0, at most 1. 0.25 = 25%. |
display
| title * | Name on the awakening screen. |
| description_active * | Shown while awake. |
| description_inactive * | Shown while asleep. |
| icon | Texture path, such as iss_runeforged:textures/gui/fire/fire_awakening.png. Put the image in your resource pack. |
Example: the Default Pack's fire melee
{
"school": "irons_spellbooks:fire",
"behavior": "melee",
"matching_rune": "irons_spellbooks:fire_rune",
"activation": { "mana_cost": 55, "consume_offhand_rune": true,
"duration_ticks": 300, "cooldown_ticks": 400 },
"triggers": [
{ "event": "on_activate", "actions": [
{ "type": "play_sound", "sound": "minecraft:item.firecharge.use", "sound_source": "player" },
{ "type": "particle_effect", "particle": "minecraft:flame", "count": 20 } ] },
{ "event": "on_hit", "actions": [
{ "type": "ignite", "seconds": 4 },
{ "type": "bonus_school_damage", "amount": 4 },
{ "type": "bonus_school_damage", "amount": 6, "if": { "target_burning": true } } ] }
],
"display": {
"title": "Fire Awakening",
"description_active": "Hits ignite. Burning foes take extra fire damage.",
"description_inactive": "Press the awakening key to awaken the fire runes.",
"icon": "iss_runeforged:textures/gui/fire/fire_awakening.png"
}
}
ᚷ Forgemaps
The anvil minigame charts. Path: data/<ns>/forgemaps/<name>.json. The anvil picks a map for the hammer's tier and the item's school; maps for that exact school come first, then maps with school none. Several matches are picked at random by weight.
The chart editor
- Click to place a note, drag to move it or to set a slider's or hold's length. Right-click or Delete removes it.
- Mouse wheel scrubs; Ctrl+wheel zooms the vertical charts. Space plays. Ctrl+Z / Ctrl+Y undo and redo.
- Song loads an
.oggintoassets/, adds itssounds.jsonentry, sets the map'smusic_track, draws its waveform and sets the BPM from its beats. BPM and snap stay in the editor; they are not exported. - In Catch the Rune, drops are blue when reachable, amber when they need a dash and red when they can't be reached.
Top level
| Field | Type | Meaning |
|---|---|---|
| tier * | int 0–4 | Hammer mastery tier: Novice, Adept, Expert, Master, Grandmaster. |
| school * | text | none or a full school id such as irons_spellbooks:fire. |
| name * | text | Shown in game. Not blank. |
| mode | enum | standard (Rune Forging, default), catch (Catch the Rune), lanes (Runic Lanes). |
| total_hits * | int | Must equal the judged notes: standard = primary + 2 × slider; catch = drops; lanes = tap + 2 × hold. Support notes don't count. |
| approach_ms * | int > 0 | How long a note takes to arrive, in milliseconds. |
| notes * | list | At least one judged note, sorted by time. |
| music_track | id | Sound event of the song, such as my_pack:minigame/my_song. Blank plays silently. |
| music_offset_ms | int ≥ 0 | Shifts the music. Doesn't change scoring. |
| weight | int 1–1000 | Chance against other maps for the same tier and school. Default 1. |
| catch | object | Catch the Rune only: bar_width 0.05–0.9, bar_speed 0.1–4, dash_multiplier 1–4. |
| scoring_config * | object | Points and grade thresholds. See below. |
Notes
| Field | Type | Meaning |
|---|---|---|
| id * | text | Unique in the map. |
| type * | enum | standard: primary, support, slider. catch: drop, support. lanes: tap, hold. |
| spawn_time_ms * | int ≥ 0 | When the note is hit. Never earlier than the note before it. |
| hit_window_ms * | int > 0 | How long the note can be hit. |
| position | {x, y} | 0.0–1.0 across the board. Needed outside lanes mode; y defaults to 0.5. |
| slider_end | {x, y} | Sliders only, required. Where the slider ends. |
| slider_duration_ms | int > 0 | Sliders only, required. Travel time start to end. |
| slider_path_points | list of {x, y} | Sliders only. Curve points, at most 256. |
| lane | int 0–3 | Lanes mode only, required there. Notes in one lane must not overlap. |
| hold_ms | int > 0 | Hold notes only, required there. |
scoring_config
| perfect, good, miss, support_hit * | Whole-number points for each result. |
| support_miss * | Points for a missed support note (a number). |
| speed * | approach_multiplier 0.1–4 (scales approach_ms), response_window_ms 1–5000, weight 0–1. |
| scale * | action_radius_multiplier and support_radius_multiplier 0.25–2 (note sizes), weight 0–1. |
| accuracy * | perfect_window_ms and good_window_ms 1–5000 (perfect ≤ good), weight 0–1. |
| quality_thresholds * | uncommon, rare, epic, legendary, myth: score 0–100 needed for each grade, ascending. |
The speed, scale and accuracy weights must add up to 1.0. Times are always milliseconds; the old _ticks keys are rejected.
ᚺ Item Tuning
Limits which attributes Runic Manuscripts can add to an item. Path: data/<ns>/runeforge_item_tuning/<name>.json. The form asks whether it tunes one item or a group; the file is the same either way.
| Field | Type | Meaning |
|---|---|---|
| items * | list | Item ids or #item_tags, no repeats. An item may be in only one tuning file. |
| supported_attributes * | list | The only manuscript attributes these items accept. Any registered attribute works, from any mod; the form suggests Iron's Spells and vanilla ones. |
ᚾ Abracadabra Spells
The spells the Abracadabra enchantment may cast when an enemy hits you. Path: data/iss_runeforged/abracadabra_spells.json.
| Field | Type | Meaning |
|---|---|---|
| spells | list | Each entry: spell* (id, once per file) and target* (self or attacker). |
| replace | bool | true drops every rule from lower packs. |
ᛁ Resource Pack
| Songs | assets/<ns>/sounds/minigame/<song>.ogg with an entry in assets/<ns>/sounds.json. Minecraft plays only Ogg Vorbis. The forgemap editor's Song button does all of this. |
| Awakening icons | Any texture path, named in the config's display.icon. The Default Pack uses assets/iss_runeforged/textures/gui/<school>/<school>_awakening.png. |
| Lang | assets/<ns>/lang/en_us.json for translated text. |
On a server, every player needs the resource pack to hear the songs. In a mod jar it comes along by itself.
ᛃ Value Types
| id | namespace:path, lower case: letters, digits, _ . -, and / in the path. Where tags are allowed, #namespace:tag. |
| int | A whole number. |
| number | Any number, such as 0.25. |
| bool | true or false. |
| text | Plain text or a Minecraft text component. Not blank. |
| enum | One of the listed words. |
| * | Required. |
Any data file can carry "neoforge:conditions", a list of NeoForge load conditions, such as loading only when a mod is installed.