Skip to content

Changing Spell Values

Drehverschluss edited this page Nov 14, 2026 · 2 revisions

Changing spell values

Stormcaller has no config for spell values. Like Wizards, every value of a spell is in its spell file: data/stormcaller/spell/<id>.json. A datapack that contains a file with the same path replaces the spell: damage, cast time, cooldown, range, jumps, radius, duration, shock chance and everything else.

How to

  1. Take the original file from the Stormcaller jar (data/stormcaller/spell/<id>.json, the jar is a zip file) or from the source.
  2. Put the changed copy into a datapack:
<world>/datapacks/stormcaller_tweaks/
  pack.mcmeta
  data/stormcaller/spell/thunderstorm.json

pack.mcmeta for Minecraft 1.21.1:

{
  "pack": {
    "pack_format": 48,
    "description": "My Stormcaller changes"
  }
}
  1. Leave the world and join it again (singleplayer), or restart the server.

For modpacks: put the file into kubejs/data/stormcaller/spell/thunderstorm.json (with KubeJS installed). That works for every world without a datapack per world.

When it applies

  • After joining the world again or restarting the server. /reload does not reload spells.
  • In multiplayer the server sends the spells to every client, so tooltips show the new values. Clients need nothing.

Keep in mind

  • A datapack replaces the whole file. If a later Stormcaller version changes the spell, your copy stays on the old state. After an update, compare your copy with the new file.
  • The ids of the spells: spark, lightning_bolt, chain_lightning, lightning_nova, static_shield, lightning_strike, thunderstorm, storm_elemental. Passives and skill tree nodes have their own files (see the list in the jar).

The important fields

Field Meaning
range Range in blocks (for Lightning Nova: the radius around you)
tier Spell tier; RunelessRPG takes the mana cost from it
active.cast.duration Cast time in seconds (missing = instant)
cost.cooldown.duration Cooldown in seconds
cost.item.id Rune that the spell costs (runes:lightning_stone)
deliver.projectile.projectile.perks.ricochet Jumps to more targets (Spark 1, Lightning Bolt 2, Chain Lightning 4)
deliver.projectile.projectile.perks.ricochet_range Range of a jump in blocks
deliver.clouds[0].volume.radius Radius of the Thunderstorm cloud
deliver.clouds[0].time_to_live_seconds Duration of the Thunderstorm cloud
area_impact.radius Radius of Lightning Strike
impacts[].action.damage.spell_power_coefficient Damage as a factor of Lightning Spell Power
impacts[].action.custom.handler Stormcaller markers, see below

Markers

Some values of Stormcaller cannot be expressed with the normal fields of Spell Engine. They are marker impacts in the impacts list: a CUSTOM impact whose handler carries the number.

Shock chance: stormcaller:shock/<percent>

{ "action": { "type": "CUSTOM", "custom": { "intent": "HARMFUL", "handler": "stormcaller:shock/25" } } }
  • The number is the base shock chance in percent per hit; decimals work (stormcaller:shock/12.5). Put it behind the DAMAGE impact.
  • Each hit rolls once with this chance plus the Shock Chance of the caster (see Shock).
  • stormcaller:nova_shock always shocks and uses the stun of nova_stun_seconds (Lightning Nova).
  • Spells of other mods can get the marker too; their lightning hits then shock with that base chance.
  • Without the marker, a spell's lightning hits only shock with the caster's Shock Chance.

Target limit: stormcaller:max_targets/<n>

{ "action": { "type": "CUSTOM", "custom": { "intent": "HARMFUL", "handler": "stormcaller:max_targets/3" } } }
  • The most enemies one hit of a Thunderstorm cloud (stormcaller:storm_cloud) strikes. With more enemies below the cloud, that many are picked at random, each at most once per hit; with that many or fewer, all are hit.
  • Without the marker (or with 0) there is no limit: the cloud strikes every enemy below it again. If you replace thunderstorm.json, keep the marker. Its tooltip would then also say "up to 0 enemies".
  • The marker does nothing on its own; the cloud reads it from the spell.

Example: a stronger Thunderstorm

Thunderstorm with 0.30 instead of 0.28 damage per hit and up to 4 instead of 3 targets. This is the complete file data/stormcaller/spell/thunderstorm.json; only spell_power_coefficient and stormcaller:max_targets/4 are changed:

{
  "school": "spell_power:lightning",
  "range": 32.0,
  "tier": 4,
  "group": "lightning_storm",
  "learn": {},
  "active": {},
  "release": {
    "animation": {
      "id": "spell_engine:one_handed_area_release"
    },
    "visuals": {
      "particles": [
        {
          "id": "spell_engine:magic_spark",
          "appearance": {
            "color": 4294928127,
            "motion": "BURST",
            "scale": 0.8
          },
          "batch": {
            "count": 12.0,
            "shape": "SPHERE",
            "anchor": "LAUNCH_POINT",
            "min_speed": 0.05,
            "max_speed": 0.25
          }
        }
      ]
    },
    "sound": {
      "id": "spell_engine:generic_lightning_release",
      "volume": 1.0,
      "pitch": 1.0
    }
  },
  "target": {
    "type": "AIM",
    "aim": {
      "sticky": true
    }
  },
  "deliver": {
    "type": "CLOUD",
    "clouds": [
      {
        "entity_type_id": "stormcaller:storm_cloud",
        "spawn_ticks": 10,
        "despawn_ticks": 10,
        "volume": {
          "radius": 4.0,
          "area": {
            "distance_dropoff": "NONE"
          },
          "sound": {
            "id": "minecraft:entity.lightning_bolt.impact",
            "volume": 0.4,
            "pitch": 0.85,
            "randomness": 0.15
          }
        },
        "time_to_live_seconds": 6.0,
        "impact_tick_interval": 20,
        "spawn": {
          "sound": {
            "id": "minecraft:entity.lightning_bolt.thunder",
            "volume": 0.45,
            "pitch": 0.55,
            "randomness": 0.05
          }
        }
      }
    ]
  },
  "impacts": [
    {
      "action": {
        "type": "CUSTOM",
        "custom": {
          "intent": "HARMFUL",
          "handler": "stormcaller:fx_cloud_bolt"
        }
      }
    },
    {
      "action": {
        "type": "DAMAGE",
        "damage": {
          "spell_power_coefficient": 0.3,
          "knockback": 0.0
        }
      },
      "visuals": {
        "particles": [
          {
            "id": "spell_engine:magic_spark",
            "appearance": {
              "color": 4294928127,
              "motion": "BURST",
              "scale": 0.7
            },
            "batch": {
              "count": 6.0,
              "shape": "SPHERE",
              "anchor": "ENTITY",
              "min_speed": 0.15,
              "max_speed": 0.5
            }
          }
        ]
      }
    },
    {
      "action": {
        "type": "CUSTOM",
        "custom": {
          "intent": "HARMFUL",
          "handler": "stormcaller:shock/25"
        }
      }
    },
    {
      "action": {
        "type": "CUSTOM",
        "custom": {
          "intent": "HARMFUL",
          "handler": "stormcaller:max_targets/4"
        }
      }
    }
  ],
  "cost": {
    "exhaust": 0.4,
    "cooldown": {
      "duration": 24.0
    },
    "item": {
      "id": "runes:lightning_stone"
    }
  }
}

Tooltips follow the file

The spell tooltips read their numbers from the spell file, so a changed value shows up there by itself. Besides the tokens of Spell Engine ({damage}, {ricochet}, {cloud_duration}, {cloud_radius}, {impact_range}, {trigger_chance}, {effect_duration}, {stash_duration}, {summon_duration} …) Stormcaller fills these:

Token Value
{cloud_max_targets} Number of the stormcaller:max_targets/<n> marker
{nova_stun} nova_stun_seconds from stormcaller-server.toml
{ricochet_range_add}, {cloud_radius_add} Additions of modifier spells (Long Arc, Stormweave set)
{static_rain_duration} Slow duration of Static Rain (skill tree)
{conductor_cooldown} Cooldown of Chain Lightning, used by Chain Conductor (skill tree)
{field_duration}, {field_radius}, {field_damage}, {field_shock} The ground field of Charged Ground (charged_ground_field.json)
{ball_duration}, {ball_pulse}, {ball_range}, {ball_targets}, {ball_cooldown}, {ball_zap_damage}, {ball_zap_shock}, {ball_discharge_damage}, {ball_discharge_shock} Ball Lightning (trinkets.json and the spells ball_lightning_zap, ball_lightning_discharge)
{ball_staff_max} Most staff balls at once ([ball_lightning] max_staff_balls). In the description of ball_lightning_staff the other {ball_…} tokens read its own helper spells ball_lightning_staff_zap and ball_lightning_staff_discharge
{charge_max}, {charge_ricochet}, {charge_decay}, {charge_shock} Stored Charge ([stored_charge] of stormcaller-server.toml)

The line "Shock chance: …" or "Always shocks." is added to every spell with a shock marker.

Mana costs

The mana cost with RunelessRPG comes from the spell's tier and RunelessRPG's tier table (4 / 5 / 7 / 10 / 14 for tier 0 to 4). To change it, change the tier table in RunelessRPG's server config or give single spells their own cost with RunelessRPG's datapack, see its wiki page Datapacks and tags.

Other values

  • Static Shield damage reduction, Galvanic Rush speed, Storm Elemental base values, jewelry and Ball Lightning movement: JSON configs, see Configuration.
  • Set bonuses: data/stormcaller/equipment_set/fulgurite.json and stormweave.json; they point to the modifier spells fulgurite_chain_lightning and stormweave_thunderstorm.

Clone this wiki locally