Kzeroko KTM2

Spell data

Current spell stages, projectiles, visuals, binding pools, item assignments and astral-energy maps.

Updated Sep 24, 2026 17 min read

Spell Engine owns spell definitions, binding pools and item assignments; IsekaiExpansion adds a separate astral-energy map. This page is checked against Spell Engine 1.10.7+1.20.1 and covers the active-spell, projectile, visual and item formats used by this integration.

Where the files live

ResourcePathIdentity
Spelldata/<namespace>/spell/<path>.jsonSpell ID is namespace:path.
Binding pooldata/<namespace>/tags/spell/<path>.jsonSpell registry tag; use its ID without # in a container’s pool.
Item assignmentdata/<namespace>/spell_assignments/<item-path>.jsonNamespace and path select the item ID.
Astral energydata/<namespace>/spell_energy/<path>.jsonEach file maps spell-ID strings to costs.

Same-path spell/assignment resources are selected by data-pack priority, not merged field by field. Energy files merge by iteration order without an explicit sort; avoid defining a spell’s energy in multiple files. The bundled spell reference directories are examples outside the live spell/ path and do not register their nested examples as playable spells.

Minimal example

This reduced form of the bundled arcane-blast reference uses direct damage and aimed targeting, with no required external item or sound. Save it at a live spell path in your pack; the existing reference folder itself is not loaded as a spell.

{
  "school": "spell_power:arcane",
  "active": {
    "cast": {}
  },
  "target": {
    "type": "AIM",
    "aim": {}
  },
  "deliver": {
    "type": "DIRECT"
  },
  "impacts": [
    {
      "action": {
        "type": "DAMAGE",
        "damage": {}
      }
    }
  ]
}

Fields

Defaults below apply when a field is omitted, not when an explicit null is supplied. The dependency’s JSON model is permissive; a default of null can still be unusable for the selected execution branch.

Casting, targeting, impacts and costs

FieldTypeDefaultWhat it does
schoolidentifiernullRequired for a usable magic spell; selects its registered power school.
typeenumACTIVEACTIVE, PASSIVE or MODIFIER; this example is an active spell.
tierinteger1Primary catalogue/binding tier; no range check in the JSON model.
sub_tierinteger1Secondary ordering within a tier.
groupstring""Groups related spells for catalogue ordering.
rangenumber50Targeting range in blocks before runtime modifiers.
learnobjectnullProvide an object to make the spell available for binding.
learn.level_cost_per_tierinteger3Binding level cost multiplier per tier.
learn.level_requirement_per_tierinteger10Binding level requirement multiplier per tier.
activeobjectnullActive-spell configuration; provide for a timed active cast.
active.castobject{}Casting stage; omitted children take the defaults below.
active.cast.durationnumber0Seconds; 0 is instant. Use a positive finite value for timed casting.
active.cast.typeenumSTANDARDSTANDARD, CHANNEL or CHARGE. Duration 0 makes the cast instant.
active.cast.haste_affectedbooleantrueAllows dependency haste handling.
active.cast.movement_speednumber0.2Movement-speed multiplier during casting.
active.cast.channelobjectnullProvide for CHANNEL; no effect on other cast types.
active.cast.channel.ticksinteger0Total deliveries over the duration, not an interval in game ticks. Use a positive count.
active.cast.channel.release_fxbooleanfalseWhether channel deliveries replay release effects.
active.cast.animationobjectnullPlayer-animation object described below.
active.cast.start_soundobjectnullSound at casting start.
active.cast.soundobjectnullCasting sound object.
active.cast.particlesarray<object>[]Continuous particle groups, using the particle table below.
targetobject{}Target search configuration.
target.typeenumCASTERNONE, CASTER, AIM, BEAM, AREA or FROM_TRIGGER; provide the matching sub-object when required.
target.capinteger0Positive values cap target count; 0 means no cap.
target.aimobjectnullAIM targeting options.
target.aim.requiredbooleanfalseRequires an aimed entity to cast.
target.aim.stickybooleanfalseKeeps an already selected entity during casting.
target.aim.use_caster_as_fallbackbooleanfalseFalls back to the caster when aim finds no entity.
target.aim.reposition_verticallynumber0Vertical adjustment of an aimed position, ignored for entity targets.
deliverobject{}Delivery stage.
deliver.typeenumDIRECTDIRECT, PROJECTILE, METEOR, CLOUD, SHOOT_ARROW, AFFECT_ARROW, MELEE, STASH_EFFECT or CUSTOM.
deliver.delayinteger0Delivery delay in ticks.
deliver.customobjectnullRequired for a useful CUSTOM delivery.
deliver.custom.handleridentifiernullID of an installed handler; a missing handler gives no successful custom delivery.
impactsarray<object>[]Effects applied by the chosen delivery. An empty list supplies no impacts.
impacts[].chancenumber1Probability of this impact; author in 0–1.
impacts[].schoolidentifiernullOverrides the root school for this impact; null inherits.
impacts[].actionobjectnullRequired action block for each useful impact.
impacts[].action.typeenumnullAction kind; DAMAGE and HEAL below use their corresponding objects.
impacts[].action.apply_to_casterbooleanfalseRedirects this action to the caster.
impacts[].action.allow_on_center_targetbooleantrueAllows an area impact to affect its centre target.
impacts[].action.min_powernumber1Lower bound used for action power.
impacts[].action.max_powernumber999999Upper bound used for action power.
impacts[].action.damageobjectnullDAMAGE settings.
impacts[].action.damage.spell_power_coefficientnumber1Damage multiplier on resolved spell power.
impacts[].action.damage.knockbacknumber1Knockback multiplier.
impacts[].action.damage.bypass_iframesbooleantrueAllows damage through ordinary immunity frames.
impacts[].action.healobjectnullHEAL settings.
impacts[].action.heal.spell_power_coefficientnumber1Healing multiplier on resolved spell power.
impacts[].visualsobject{}Impact particles and models; not a root particles field.
impacts[].soundobjectnullImpact sound.
releaseobject{}Presentation when the spell releases.
release.animationobjectnullPlayer-animation object.
release.visualsobject{}Release particle/model bundle.
release.soundobjectnullRelease sound.
release.pitch_shiftnumber0Charge-dependent addition to release sound pitch.
costobject{}Dependency costs, separate from astral energy.
cost.batchingbooleanfalseDefers cost handling to end of tick for batched triggers.
cost.exhaustnumber0.1Exhaustion added on payment.
cost.durabilityinteger1Host-item durability cost.
cost.effect_ididentifiernullStatus effect removed when cost is paid.
cost.cooldownobject{}Cooldown settings.
cost.cooldown.groupstringnullOptional shared cooldown group.
cost.cooldown.attempt_durationnumber0Attempt cooldown in seconds.
cost.cooldown.durationnumber0Successful-cast cooldown in seconds.
cost.cooldown.proportionalbooleanfalseScales cooldown with casting/channel progress.
cost.cooldown.haste_affectedbooleantrueAllows haste to alter cooldown.
cost.cooldown.hosting_itembooleantrueAlso imposes cooldown on the host item.
cost.itemobjectnullItem payment/check; absent means no item cost.
cost.item.idstringnullItem ID or #tag. Supply a valid installed item/tag.
cost.item.amountinteger1Required item amount.
cost.item.consumebooleantrueFalse checks availability without consuming.

Other action kinds are STATUS_EFFECT, FIRE, SPAWN, SUMMON, TELEPORT, COOLDOWN, AGGRO, DISRUPT, IMMUNITY, VELOCITY and CUSTOM. Each requires its own branch-specific payload. Passive triggers, modifiers, charge bonuses and those payloads are owned by the versioned Spell Engine schema; they are not extra IsekaiExpansion fields.

Projectile and meteor layout

Projectile and meteor launch settings are separate from the projectile’s flight data. The model rows beginning models[] are relative to client_data.composite_model.models[].

FieldTypeDefaultWhat it does
deliver.projectileobjectnullPROJECTILE launch configuration.
deliver.projectile.launch_propertiesobject{}Launch speed and repeated launches.
deliver.projectile.launch_properties.velocitynumber1Initial projectile velocity.
deliver.projectile.launch_properties.extra_launch_modinteger-1For channels, extra launches occur when delivery index modulo this value is 0. Use −1 to disable filtering or a positive divisor; 0 can divide by zero.
deliver.projectile.launch_properties.extra_launch_countinteger0Extra projectiles after the initial launch.
deliver.projectile.launch_properties.extra_launch_delayinteger2Spacing of extra launches in ticks: 2 ticks (0.1 seconds).
deliver.projectile.launch_properties.soundobjectnullLaunch sound; uses the shared sound fields.
deliver.projectile.projectileobjectnullProjectile flight, collision and visual data; provide for PROJECTILE.
deliver.projectile.projectile.divergencenumber0Projectile directional spread.
deliver.projectile.projectile.homing_anglenumber1Homing turn parameter.
deliver.projectile.projectile.client_dataobjectnullClient presentation.
deliver.projectile.projectile.client_data.composite_modelobjectnullComposite visual model.
deliver.projectile.projectile.client_data.composite_model.modelsarray<object>[]Model components.
models[].orientationenumTOWARDS_MOTIONTOWARDS_CAMERA, TOWARDS_MOTION or ALONG_MOTION; projectile model orientation.
models[].rotate_degrees_per_ticknumber2Continuous rotation in degrees per tick.
models[].rotate_degrees_offsetnumber0Static rotation offset in degrees.
models[].use_held_itembooleanfalseUse held-item model source instead of fx.model_id.
models[].fxobject{}Model effect; fields below.
models[].fx.model_ididentifiernullModel resource ID.
models[].fx.scalenumber1Model scale.
models[].fx.light_emissionenumGLOWNONE, GLOW, GLOW_TRANSLUCENT or RADIATE.
deliver.meteorobjectnullMETEOR launch configuration.
deliver.meteor.launch_heightnumber10Height above the target in blocks.
deliver.meteor.launch_radiusnumber0Horizontal launch spread around the target.
deliver.meteor.launch_propertiesobject{}Same fields as projectile launch_properties.
deliver.meteor.projectileobjectnullSame projectile data shape as PROJECTILE.
area_impactobjectnullSecondary area application after an impact; not inside deliver.
area_impact.radiusnumber1Base radius in blocks.
area_impact.extra_radiusobject{}Power-scaled radius addition.
area_impact.extra_radius.power_coefficientnumber0Extra radius = coefficient × min(cap, power).
area_impact.extra_radius.power_capnumber0Maximum power used by the extra-radius term.
area_impact.visualsobject{}Particle/model bundle at area centre.
area_impact.soundobjectnullArea-impact sound.

Flight motion, collision perks, entity placement, cloud/melee delivery and model animation transforms extend this shape in the same versioned schema. Do not transplant fields from the older flat projectile format.

Shared animation, sound and particle objects

Paths here are relative shapes: animation and sound can occur at cast/release/impact sites; particles[] names one particle-group list entry. Continuous cast particles are a list, while impact/release effects use a visuals bundle.

FieldTypeDefaultWhat it does
animation.ididentifier""Animation resource ID; use an object, not a bare string.
animation.speednumber1Playback-speed multiplier.
animation.overridesarray<object>[]Ordered conditional alternatives; first matching alternative selects its ID.
animation.overrides[].ididentifier""Alternative animation ID.
animation.overrides[].equipmentobjectnullEquipment predicate; provide both slot and item when used.
animation.overrides[].equipment.slotenumnullMAINHAND, OFFHAND, FEET, LEGS, CHEST or HEAD.
animation.overrides[].equipment.itemstringnullItem selector evaluated in the selected slot.
animation.overrides[].two_handed_weaponbooleannullAlternative check for the held weapon’s two-handed status.
sound.ididentifiernullRegistered sound ID.
sound.volumenumber1Sound volume.
sound.pitchnumber1Base pitch.
sound.randomnessnumber0.1Positive values randomise pitch within base ± randomness; nonpositive uses base pitch.
visuals.particlesarray<object>[]Particle-group list.
visuals.modelsarray<object>[]Model-effect list; same model-effect fields as projectile fx below.
particles[].ididentifiernullRegistered particle ID.
particles[].appearanceobject{}Per-particle appearance settings; supported by Spell Engine’s own particle factory.
particles[].appearance.colorinteger-1Packed RGBA tint; −1 leaves the texture untinted.
particles[].appearance.motionenumnullInherit entry motion, or STATIC, FLOAT, ASCEND, DECELERATE, BURST, DRIFT.
particles[].batchobject{}Spawn geometry and velocity settings.
particles[].batch.shapeenumCIRCLEBatch shape; examples use CIRCLE, PIPE or SPHERE. Full enum is linked below.
particles[].batch.countnumber1Emission count/rate. Below 1 gives periodic emission in continuous tick-driven effects.
particles[].batch.vertical_originnumber0.5Origin height as a fraction of entity height.
particles[].batch.min_speednumber0Lower initial-speed bound.
particles[].batch.max_speednumber0Upper initial-speed bound.

The particle format also defines lifetime, opacity, scaling, attachment and batch geometry controls. Model effects define transforms and timed animations. These are dependency formats; use the linked release when extending beyond the fields above.

Item assignments and pools

This assignment uses a subset of the bundled staff’s spells:

{
  "spell_container": {
    "access": "CONTAINED",
    "pool": "isekaiexpansion:tier1",
    "spell_ids": [
      "isekaiexpansion:healing"
    ]
  }
}
FieldTypeDefaultWhat it does
spell_containerobjectabsentContainer override; intentionally disables casting from the item default.
spell_container.accessenumNONEANY, NONE, MAGIC, ARCHERY, CONTAINED or TAG; uppercase and case-sensitive.
spell_container.access_paramstring""Spell tag ID for TAG access, without #.
spell_container.poolstring""Binding pool tag ID, without #.
spell_container.slotstring""Equipment-source slot restriction; empty gives no restriction.
spell_container.max_spell_countinteger0Binding capacity; codec has no range clamp.
spell_container.spell_idsarray<string>[]Held spell IDs. Lowercased and stripped of characters outside a–z, 0–9, / . _ : -; duplicates are not removed by the constructor.
spell_container.extra_tier_bindinginteger0Additional per-tier binding count; effective mutex count is max(0, value + 1).
spell_choiceobjectabsentOptional choice override, separate from the container.
spell_choice.poolstring""Choice pool tag ID; empty means no choices.

Resolution is per-stack saved data, then assignment, then item default, then fallback. An assignment containing a container also suppresses the item’s default choice unless the assignment supplies a choice. Explicit per-stack choice data still wins. A container with NONE access can store spells for equipment-source provision without acting as a casting resolver itself.

A pool uses the registry-tag format:

{
  "values": [
    "isekaiexpansion:healing",
    "isekaiexpansion:clarity"
  ]
}
FieldTypeDefaultWhat it does
valuesarray<string>requiredSpell IDs or #tag references, using the string-entry form shown here.
replacebooleanfalseTrue replaces lower-priority contributions to the same tag; false combines them.

Astral energy

The bundled healing entry is:

{
  "isekaiexpansion:healing": 12
}
FieldTypeDefaultWhat it does
isekaiexpansion:healinginteger0 when absent from the resolved mapExample dynamic spell-ID key. Here it sets base cost to 12; every nonempty key is accepted without checking spell existence, and values must be positive to be inserted.

There is no wrapper or metadata field. Other keys are other spell-ID strings. Final costs also use scroll, talent, origin and airborne modifiers; channels pay per successful delivery.

Full example

This adds binding, a timed cast, casting particles, release animation and cooldown. The cast duration is 1 second and cooldown is 3 seconds.

{
  "school": "spell_power:arcane",
  "tier": 1,
  "range": 24,
  "learn": {},
  "active": {
    "cast": {
      "duration": 1,
      "animation": {
        "id": "spell_engine:one_handed_projectile_charge"
      },
      "particles": [
        {
          "id": "spell_engine:magic_spell",
          "appearance": {
            "color": 4278190335,
            "motion": "FLOAT"
          },
          "batch": {
            "shape": "CIRCLE",
            "count": 4,
            "min_speed": 0.05,
            "max_speed": 0.1
          }
        }
      ]
    }
  },
  "target": {
    "type": "AIM",
    "aim": {}
  },
  "deliver": {
    "type": "DIRECT"
  },
  "impacts": [
    {
      "action": {
        "type": "DAMAGE",
        "damage": {
          "spell_power_coefficient": 1
        }
      }
    }
  ],
  "release": {
    "animation": {
      "id": "spell_engine:one_handed_projectile_release"
    }
  },
  "cost": {
    "cooldown": {
      "duration": 3
    }
  }
}

To channel, set cast type to CHANNEL and provide its channel object with a positive total delivery count. For custom delivery, set delivery type to CUSTOM and its custom handler to an installed handler ID. Data alone cannot create a new custom handler.

Validation

Spell definitions use the dependency’s generic JSON decoder. Unknown fields are ignored; missing fields retain model defaults. There is no uniform schema-wide range clamp or validation that every referenced asset, school, handler and nested object exists. Wrong structural types can fail decoding; unknown enum strings or explicit nulls can survive as null and fail later when the selected branch executes. An empty object is therefore not a useful spell even if decoding succeeds. Use finite numbers, valid installed identifiers and the exact uppercase enum values.

Assignment files require an object containing spell_container or spell_choice. Empty text, a non-object root, a bare container or a wrapper whose members both fail decoding is warned about and skipped. Members decode independently: a valid choice can survive a bad container. An explicit empty container is accepted to override and disable an item’s default. Unknown fields are ignored; invalid access enum spelling fails that member. On startup the assignment map is replaced by successfully parsed entries.

Energy application clears the old map first. An empty object contributes nothing. Empty keys and nonpositive values log errors and skip that entry. Values use integer conversion rather than strict integer validation; author integer JSON numbers. A conversion exception logs and stops the rest of that file, preserving entries already inserted; other files continue. Spell IDs are not parsed or checked by this loader, so misspellings can silently remain unused.

Reloading

Treat spell definitions as world-registry data and item assignments as server-start data in this pinned dependency version: restart/reopen the world after changing them. The dependency synchronises the spell registry and assignment data when clients join. Resource images, models and animations still need the matching client resource pack.

IsekaiExpansion energy files reload with server data, but the resolved energy map is currently sent to clients only on join. Reconnect after /reload to refresh client energy checks and tooltips. This differs from formats such as emoji data that explicitly broadcast after successful reload.

Spell integration covers custom handlers, payment and saved item data. Elements explains the player-facing schools.