Skip to main content

Overview

The Moveset system allows you to create flowing attack combos that chain together based on player attacks. Each successive hit in the combo triggers the next skill in the sequence, with automatic reset on timeout.
Movesets integrate seamlessly with the Hit Evaluation mechanic to support different skills for crits, sprints, uppercuts, and aerial attacks.

How It Works

  1. Sequential Activation: Each attack increments the moveset index
  2. Timed Reset: If no attack occurs within the reset time, the combo resets
  3. Hit Type Branching: Different vanilla hit types can trigger different skills at each step
  4. Auto-Completion: When max moveset is reached, the sequence automatically ends

Basic Configuration

moveset_id
string
required
Unique identifier for this moveset. Used to track combo progress per player.
maxmoveset
integer
default:"3"
Maximum number of skills in the combo sequence (1-9).
reset
integer
default:"1"
Time in seconds before the combo resets if no attack occurs.
name
string
Display name for the moveset (optional).
1-9
skill list
The skill(s) to execute at each position in the combo (parameters 1 through 9).

Hit Type Parameters

You can specify different skills for specific vanilla hit types at each combo position:
crit
skill list
Skills to execute on a critical hit (falling attack).
sprint
skill list
Skills to execute on a sprint attack.
uppercut
skill list
Skills to execute on an uppercut (crouching + grounded attack).
aerial
skill list
Skills to execute on an aerial attack.
weak
skill list
Skills to execute on a weak attack (low attack cooldown).

Basic Example

Simple 4-hit combo with messages:
moveset-test_exec:
  Skills:
  - skill:Moveset{maxmoveset=4;reset=2;moveset_id=TEST;
    name="Test Moveset";
    1=[ - message{m="skill 1"} ];
    2=[ - message{m="skill 2"} ];
    3=[ - message{m="skill 3"} ];
    4=[ - message{m="skill 4"} ]} @self

Combat Example

A weapon with different effects per combo step:
sword-combo:
  Skills:
  - skill:Moveset{maxmoveset=3;reset=1.5;moveset_id=SWORD_COMBO;
    name="Sword Combo";
    1=[
      - damage{a=5}
      - effect:particles{p=sweep_attack;a=1} @origin
    ];
    2=[
      - damage{a=7}
      - effect:particles{p=sweep_attack;a=2} @origin
      - sound{s=entity.player.attack.sweep}
    ];
    3=[
      - damage{a=10}
      - throw{v=2;vy=0.5}
      - effect:particles{p=sweep_attack;a=3} @origin
      - sound{s=entity.player.attack.strong}
    ]} @trigger

Hit Type Integration

Combine with hit evaluation for advanced combos:
advanced-sword:
  Skills:
  - skill:Moveset{maxmoveset=3;reset=2;moveset_id=ADV_SWORD;
    1=[
      - damage{a=5}
    ];
    crit=[
      - damage{a=15}
      - sound{s=entity.player.attack.crit}
      - message{m="Critical Strike!"}
    ];
    sprint=[
      - damage{a=8}
      - throw{v=3}
      - sound{s=entity.player.attack.knockback}
    ];
    uppercut=[
      - damage{a=6}
      - throw{v=0;vy=2}
      - sound{s=entity.player.attack.sweep}
    ]} @trigger
The moveset system automatically calls eval-hit to determine the hit type and branch to the appropriate skill.

Usage in Items

Bind to weapon attack trigger:
MyCustomSword:
  Type: DIAMOND_SWORD
  Skills:
  - skill:moveset-exec ~onAttack

Internal Mechanics

Variable Tracking

The system uses caster variables to track combo state:
  • caster.<moveset_id>_maxmoveset - Maximum combo length
  • caster.<moveset_id>_moveset_index - Current position (1 to max)
  • Variables auto-reset when combo completes or times out

Execution Flow

  1. moveset-exec → Entry point, checks conditions
  2. eval-hit → Determines vanilla hit type
  3. moveset-start → Increments index, applies reset timer
  4. Hit type switch → Branches to appropriate skill
  5. moveset-end → Cleans up when max reached
  6. moveset-reset → Cleans up on timeout
Movesets are disabled if the player has the clickcombo-input aura active to prevent conflicts with the click combo system.

Tips

  • Keep reset time short (1-2 seconds) for fluid combos
  • Use visual/audio feedback for each step
  • Consider attack cooldown when designing timing
  • Test with different vanilla hit types for variety
  • Use moveset_id to run multiple independent movesets

Build docs developers (and LLMs) love