> For the complete documentation index, see [llms.txt](https://axiomemu.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://axiomemu.gitbook.io/docs/data/plugins/customcombo.md).

# CustomCombo

Cross-class combo skill definitions and per-class combo damage scaling

Defines which skills count as valid combo starters (primary) and follow-ups (secondary) for the cross-class combo system. When `EnableComboToAllSwitch = 1` in Common.dat, every class can combo with these skill IDs regardless of the class's default combo support.

Also sets how much damage the combo finisher does for each class (`<ClassScaling>`).

## File Location

```
Data/Plugins/Characters/CustomCombo.xml
```

Loaded once at GameServer startup. Supports hot reload via plugin admin command.

## Schema

```xml
<CustomCombo Debug="0">
    <PrimarySkills>
        <Skill Id="..."/>
    </PrimarySkills>
    <SecondarySkills>
        <Skill Id="..."/>
    </SecondarySkills>
    <ClassScaling>
        <Class Id="..." Str="..." Agi="..." Vit="..." Ene="..." Cmd="..." Divisor="..." DamageMul="..."/>
    </ClassScaling>
</CustomCombo>
```

## Attributes

| Attribute                    | Type | Effect                                                                                                     |
| ---------------------------- | ---- | ---------------------------------------------------------------------------------------------------------- |
| `Debug` (on `<CustomCombo>`) | int  | `1` = write `[ComboDebug]` lines to the GameServer log for every combo step, hit and finisher. Default `0` |
| `Id`                         | int  | Skill index from [Skill.txt](/docs/data/skill.md). Must reference an existing skill                        |

{% hint style="warning" %}
The shipped file has `Debug="1"`. Set it to `0` on a live server - it writes a log line for every skill cast that touches the combo chain.
{% endhint %}

## Lists

* **`<PrimarySkills>`** - the first hit in a combo chain must use a skill from this list
* **`<SecondarySkills>`** - the second and third hits must come from this list

A successful combo is Primary, then Secondary, then a different Secondary. Each follow-up hit must land within 3 seconds of the previous one or the chain resets. The third hit skill must differ from the second hit skill.

## Class Rules

Sets how each class builds a combo. A class with no `<Class>` row uses Mode 0.

```xml
<ClassRules>
    <Class Id="2" Mode="1"/>
</ClassRules>
```

| Mode | Combo chain                                                                               |
| ---- | ----------------------------------------------------------------------------------------- |
| `0`  | Primary, then Secondary, then a different Secondary (the skill lists above)               |
| `1`  | Weapon skill, then any different attack skill. The skill lists are ignored for this class |

* **Weapon skill** = a skill granted by an equipped item's Skill option (bow/crossbow → Triple Shot, sword → its sword skill). A learned copy of the skill does not count without the weapon
* **Attack skill** = Skill.txt damage above 0. Buffs and heals break the chain
* The 2nd hit must land within 3 seconds
* `EnableComboToAllSwitch` in Common.dat still has to be on (or the class quest done)
* The client skill tooltip still shows the list-based combo type

## Class Scaling

Controls the damage of the combo finisher hit, per class. Works with `EnableComboToAllSwitch` on or off.

```
Final = damage * DamageMul / 100 + (Str*STR + Agi*AGI + Vit*VIT + Ene*ENE + Cmd*CMD) / 100 / Divisor
```

`damage` is the finisher hit after the class's normal skill damage, crit/excellent, double and triple damage. Stats include item and buff bonuses. The master skill "Add Combo Damage" % is added after this.

| Attribute                             | Type | Default | Effect                                                                                 |
| ------------------------------------- | ---- | ------- | -------------------------------------------------------------------------------------- |
| `Id`                                  | int  | -       | Class: 0=DW 1=DK 2=ELF 3=MG 4=DL 5=SUM 6=RF. Out of range = skipped with a log warning |
| `Str` / `Agi` / `Vit` / `Ene` / `Cmd` | int  | `0`     | % weight of each stat in the flat bonus. `100` = full stat                             |
| `Divisor`                             | int  | `1`     | Flat bonus is divided by this. `0` or less = `1`                                       |
| `DamageMul`                           | int  | `200`   | % of the hit damage kept. `200` = x2 (vanilla), `150` = x1.5. Below `0` = `0`          |

A class with no `<Class>` row uses the old formula: `damage x2 + (STR+AGI+ENE) / ComboDamageConstA * ComboDamageConstB` from [Character.dat](/docs/gameserver/character-dat.md).

Shipped defaults use each class's main stat:

| Class        | Weights        |
| ------------ | -------------- |
| DW, Summoner | ENE 100        |
| DK           | STR 100        |
| Elf          | AGI 100        |
| MG           | STR 50, ENE 50 |
| DL           | STR 50, CMD 50 |
| RF           | STR 50, VIT 50 |

## Relationship to Common.dat

Common.dat `EnableComboToAllSwitch` decides who can combo and which skill lists are used:

* `EnableComboToAllSwitch = 1` - every character can combo, and the `<PrimarySkills>` / `<SecondarySkills>` lists in this file are used
* `EnableComboToAllSwitch = 0` - only characters who finished class quest 3 can combo, and the two lists in this file are ignored. The hardcoded Dark Knight skill set is used instead (Falling Slash / Lunge / Uppercut / Cyclone / Slash as primary; Twisting Slash / Rageful Blow / Death Stab / Strike of Destruction / Blood Storm as secondary)

`<ClassRules>` and `<ClassScaling>` work in both cases. A class set to Mode `1` still uses the weapon-skill chain, and the finisher damage still uses this file's scaling.

`ComboEnablePushEffect` in Common.dat controls whether combos push back monsters on hit.

## Cross-File Dependencies

| Attribute     | Related in                                                                                                                                         |
| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Id`          | [Skill.txt](/docs/data/skill.md)                                                                                                                   |
| Master toggle | [Common.dat](/docs/gameserver/common-dat.md#combo-system) `EnableComboToAllSwitch`                                                                 |
| Anti-cheat    | Combo cast timing is enforced by the always-on skill timing validator (`[SkillTiming]` log lines); the legacy `CheckAutoComboHack` key was removed |

## Common Issues

* **Combos not working despite entries here** - `EnableComboToAllSwitch = 0` in Common.dat, so the skill lists are bypassed in favour of the hardcoded DK set (and only characters past class quest 3 can combo)
* **GameServer log flooded with `[ComboDebug]` lines** - `Debug="1"` on the root node. Set it to `0`
* **Third hit does not register** - the third skill is the same as the second, or the gap between hits exceeded 3 seconds
* **Combo fires without push** - `ComboEnablePushEffect = 0` in Common.dat
* **Some classes don't get combos even with the master switch on** - the skill IDs listed here aren't available to that class at the character's current level; check [Skill.txt](/docs/data/skill.md) for per-class availability
* **Negative or non-integer `Id`** - entries with `Id` below zero are skipped silently on load
