Skip to main content

Curse Types (curse_type)

curse_type​

A curse definition picks one ID from this family in its top-level type: type only decides how that definition lives out its life, while how long the life lasts is decided by the definition's own duration_ticks. The four types are registered by the mod, so a data pack picks one but cannot add one.

The definition is decoded once when the world loads: both type and the fields it carries (triggers on mxt:triggered) are read there, and a constant duration is checked at load time too. A formula duration is only evaluated at the moment the curse is applied, so that form can only be rejected by that one application.

duration_ticks and tick_interval are fields of the curse definition itself, documented on the curse definition page; the sections below only cover how each type reads them.

typeExpiryPeriodic behaviour
mxt:timedAfter duration_ticksOn tick_interval
mxt:permanentNever expires, duration_ticks takes no partOn tick_interval
mxt:triggeredExpires on time with a positive duration_ticks, never with none or a non-positive oneDriven by the signals in triggers, tick_interval takes no part
mxt:emptyNever expires, duration_ticks takes no partRuns no behaviour at all

mxt:timed​

Expires after duration_ticks. This is the only type whose duration must be positive: a non-positive constant is rejected at load time, a formula is judged at the moment it is evaluated, and a duration that cannot be honoured rejects that one application instead of throwing. The periodic behaviour runs on tick_interval. It has no fields of its own.

{"type": "mxt:timed", "duration_ticks": 600}

mxt:permanent​

Never expires, and duration_ticks takes no part. The periodic behaviour runs on tick_interval. It has no fields of its own.

{"type": "mxt:permanent"}

mxt:triggered​

With a positive duration_ticks it expires on time; with none, or a non-positive one, it never expires. The periodic behaviour is not driven by tick_interval but by signals: when a signal matched by any Trigger in triggers arrives, on_tick runs once on the holder.

FieldTypeDefaultDescription
triggersArray[]The signals that make this curse act; written exactly like an ability trigger
{
"type": "mxt:triggered",
"triggers": [{"type": "mxt:hurt"}],
"on_tick": {"type": "mxt:damage", "amount": 1}
}

That is "act once per hit". Loading rejects an mxt:triggered curse with an empty triggers list.

mxt:empty​

It never expires — duration_ticks takes no part — and runs no behaviour at all: on_apply / on_tick / on_expire / on_cleanse never run. It exists only as a placeholder or a marker. It has no fields of its own.

{"type": "mxt:empty"}