To modify the client, this table must be converted into a Squirrel script.
Note: A separate file, AbilityTableAdmin.txt, holds extra abilities for administrative use. They are not exposed to the client, but can be activated on the server side. This is merely an organizational thing, it doesn't matter if they're included into the official table or client.
For the purposes of conversion, the table must be limited to exactly 28 columns wide. Extra columns are used by the server but should not be included in the client.
The Squirrel table should look something like the following example, taken from the first two lines. This essentially creates an array of arrays. The main array holds each ability entry. The individual array for each ability entries contain 28 strings holding the first 28 columns of the table.
Each string must be enclosed in double quotation marks (ASCII character code 34), even if the string is empty. All text must be ASCII-style characters only, below character code 127. Higher codes such as accented characters or fancier Unicode-style opening/closing double quotes (often auto generated by modern word-processors and spreadsheet programs) may crash the client or prevent the script from being compiled or loaded correctly.
AbilityIndex <- [ ["1","Two Hand Weapons","0","0","","0","0","","0","","onActivate:Self:Status(CAN_USE_WEAPON_2H,-1)","","1","1,,0,(),K","Icon-32-Ability-W_2H_Weapons.png|Icon-32-BG-Black.png","Allows the use of Two Hand Weapons.","Weapon","0","1","1","Passive","4","0","0","2","0","",""], ["2","One Hand Weapons","0","0","","0","0","","0","","onActivate:Self:Status(CAN_USE_WEAPON_1H,-1)","","1","1,,0,(),KRD","Icon-32-Ability-W_1H_Weapons.png|Icon-32-BG-Black.png","Allows the use of One Hand Weapons.","Weapon","0","3","2","Passive","4","0","0","2","0","",""], ];
Included in the utility programs is EEUtilAbilityTable.exe (Windows only, but if necessary you can make your own converter). Copy the utility to the same folder with AbilityTable.txt, or copy the ability table to the folder you're running the utility from. It will load AbilityTable.txt from the same folder the utility is launched from, generating a new file AbilityTable.nut. Then run the following command line operation to compile the Squirrel table: sq.exe -o Abilities.cnut -c AbilityTable.nut
Ensure the Squirrel compiler did not encounter any errors. In the case of an error, find out what's wrong, maybe a formatting error or unidentified character, and try again.
Use CARDecode.exe (Windows only) and drag Catalogs.car onto the executable file to decrypt it into Catalogs.zip
Add the new version of Abilities.cnut to Catalogs.zip, replacing the existing file. Then use CARDecode.exe to encrypt it back into Catalogs.car.
Recalculate the MD5 checksum of the new Catalogs.car. A crude command line program MD5.exe is provided (Windows only) but other programs may be found online. If using this program, run the following command line: md5 Catalogs.car \Release\Current\Media > NewChecksum.txt
Take the generated hash (from NewChecksum.txt if using the above method) and copy and paste the updated line into Data\HTTPChecksum.txt.
Restart the server (required for any change to AbilityTable.txt itself). If only updating the CAR checksums, then alternatively use the Reload Checksum tool in the server's administrative panel.
Restart the client. If all steps were correct, it should now download the updated Catalogs.car and will be synchronized with the server.
Every time you modify AbilityTable.txt, the update procedure must be run again. It may be helpful to write some command line scripts to help automate this process.
When instead they should look like this:
"Correct"
Follow established form whenever possible. Some cells require explicit values like "0" instead of being left blank with "".
The easiest way to figure out how things work is to look at existing abilities that use whatever behavior you're looking for. For example, to see how channels work, look at Healing Tendril. More complex skills like Healing Breeze are useful to examine because it has a casting warmup, channel iterations, active effect, and a secondary channel effect.
Pay close attention to syntax, punctuation, opening and closing quotes and parenthesis. They are very important and a small typo or invalid character could easily break the table, or the game client.
Index | Property | Description |
0 | Ability ID | This forms the key of the table entry. Must be a unique number. |
1 | Name | Ability name displayed in the tooltip. |
2 | Hostility | Not used by the server. Not sure if used by the client either. Common values are -1, 0, or 1. |
3 | Warmup Time | Casting warmup time, in milliseconds. If set, this distinguishes this ability as a warmup, instead of an instant cast. Example: Healing Hand |
4 | Warmup Cue | The client effect script to play during a timed ability cast. Scripts are packaged in EarthEternal.car in the Effects folder. |
5 | Duration | For channels, this is the duration in milliseconds. If set, this ability is considered a channel. If you want this channel to have special effects, like running in the background or be uninterruptable, refer to the last column: Server Flags. |
6 | Interval | For channels, this is the time between iterative effects, in milliseconds. |
7 | Cooldown Category | Can be anything. Any abilities sharing this cooldown category name cannot be used until the cooldown expires. The actual amount of time depends on the next column. Note that different abilities may have different cooldown times, even if they share the same cooldown category. |
8 | Cooldown Time | Time for the cooldown to expire, in milliseconds. |
9 | Activation Criteria | A list of conditions that must be passed before an ability can be casted. Function(arg1,arg2)[, ...]
Multiple function arguments are separated by commas. |
10 | Activation Actions | A list of actions that are performed when the ability is casted. onEvent:TargetType(range):Function1(),Function2();onEvent:[...]
onEvent: Refer to the possible Event Types. |
11 | Visual Cue | The client effect script to play when casted. This is the name of a scripted event, often specifically programmed for particular abilities, such as animations, projectile and particle effects, glows, auras, etc. Scripts are packaged in EarthEternal.car in the Effects folder. |
12 | Tier | The ability tier. Typically one of the following values:
1 = Level 1 2 = Level 6 3 = Level 20 4 = Level 30 5 = Level 40 6 = Level 50 |
13 | Prereq | A list of purchase requirements. Tier, Ability Cost, Prereq Abilities, etc). Contains up to 5 requirements, separated by commas, in the following format:
Level,CostOtherClass,CostInClass,(Abilities),Classes Level: Character level required. CostOtherClass: Ability point cost for cross-class skills of a different class. This value is not used by the server. CostInClass: Ability point cost for same-class skills. This is the actual cost used by the server, for all classes. Abilities: A list of Ability IDs that must already be purchased. Separate multiple abilities with a pipe [ | ]. This entire block is enclosed in parenthesis. Classes: A string of characters, where each character denotes a class (Knight, Rogue, Mage, Druid). Often KRMD for all classes, but any combination is possible. For example, here is the Prereq entry for the Blazing (mage) cross-class ability. It is level 20, costs 4 points, requires abilities 379 (Hand of Heraclitus - Tier 3) and 411 (Incinerate - Tier 3), and is open to all classes. 20,4,4,(379|411),KRMD |
14 | Icon | Icon to display in the ability window, and buff icons. Either a single image, or two can be combined in the format of: Foreground|Background |
15 | Description | Description displayed in the ability tooltip. Important! You must update any skill formulas or numbers here or else the client descriptions will not match the actual values used by the server. Remember that damage mitigation and randomized damage ranges will produce different numbers in combat, too. These formulas do not include weapon or element specialization, or other effects. To determine if damage ranges are accurate, it is recommended to test abilities with custom weapons with a min/max damage of the same value (ex: 10-10), without specializations, and against custom enemies with zero physical and elemental armor ratings. This will most easily allow a damage number in the description to match actual combat damages in game. |
16 | Category | Which class/classification tab page this ability is found under. |
17 | Coordinate X | Location in the ability window grid. |
18 | Coordinate Y | Location in the ability window grid. |
19 | Group ID | Very important. This is what groups different tiers of abilities together, and also serves to prevent multiple buff types from overlapping. Every distinct ability (for example, all tiers of Bash) should have the same group ID. |
20 | Ability Class | Unknown/unused/obsolete in the client. If set to "Passive", the server will automatically activate this skill for the player when they log in. |
21 | Use Type | Unknown/unused/obsolete in the client. If set to 4, the server will consider this as a passive and will automatically activate this skill for the player when they log in (redundant to Ability Class). |
22 | Add Melee Charge | Unknown/unused/obsolete. |
23 | Add Magic Charge | Unknown/unused/obsolete. |
24 | Ownage | Unknown/unused/obsolete. |
25 | Gold Cost | Cost to purchase, in copper. Presently ignored by the server. |
26 | Buff Category | This is required for buff icons to appear in the client. If this field begins with {+,-,w} then it means Buff, Debuff, or World Buff, respectively. Not sure if the rest are important, you may need to experiment. Refer to abilities providing similar effects for reference on how this field is used. Abilities which require separate buff icons (for example Bounder Dash and a speed potion) may need to have a unique buff name, so keep that in mind too. |
27 | Target Status | A restriction of target types to cast on. Independent from action targets. Refer to Target Filters. |
28 | Server Flags | Optional. Custom server-side parameters. Do not include this column in the client table (Abilities.nut). Multiple options can be combined by separating them with a pipe [ | ]. Does not allow spaces. Possible flags: secondarychannel : Runs an onIterate ability as a secondary passive channel, and will continue to function while the player uses other abilities (for example, bleeding or burning damage). Only one secondary channel can be active per character. If a secondary channel is already running, it will be replaced by the new effect. unbreakablechannel : This channel cannot be interrupted by attacks. allowdeadstate : Normally players cannot use abilities while dead. This will bypass that check. |
onRequest | Called when an ability is first requested for activation. This is responsible for checking the activation criteria and confirming targets. If there is a warmup time, this will begin the warmup countdown. |
onActivate | Called when an ability actually fires. Assumes all casting conditions have been met. If there is a warmup time, it has finished. |
onIterate | Called during each iteration of a channelled effect. |
onParry | Called when a successful parry has been triggered against the target. This is a special event used for some abilities. Abilities containing this action will be automatically registered as a potential implicit action to take against an attacker when a parry is successful. This should only be used for passive abilities. |
Note! Even for target types that support multiple targets, the server is hardcoded with a maximum of 8 targets that can be affected at once. Ordering is not based on any criteria. The first targets found when iterating over the zone creature lists will be returning, which will be in a non-specific, undefined order.
None | Nothing. |
Self | Always affects the caster, even if another target is selected. |
ST | Single target, whoever the actor has selected (could be friend or foe, other conditions must determine which are allowed). Will default to self if no target is selected (if the skill allows). |
Implicit | Used with the onParry event type. This is the action to perform against the actor that has parried an attack. |
Party(distance) | Party members within a certain distance of the caster. |
Cone180(distance) | Any applicable targets within a 180 degree cone directly in front of the caster. |
Cone90(distance) | Any applicable targets within a 90 degree cone directly in front of the caster. |
GTAE(distance) | Ground target area-of-effect. This is for abilities where the caster manually selects a target location (like mage's Frost Storm or druid's Swarm). |
PBAE(distance) | Area-of-effect surrounding the caster (like knight's Blender, druid's Nefritari's Aura) |
STAE(distance) | Area-of-effect surrounding the target (like mage's Cataclysm) |
STXAE(distance) | Area-of-effect surrounding the target, but excludes the target (like mage's Wildfire). |
STP | Similar to ST, but is guaranteed to default to self if no target is selected. Typically only used by the henge abilities. |
Dead | Target must be dead, no destinction between friend or foe. Should only be used in very specific cases. |
Enemy | Target must be a valid combat enemy, no distinction between dead or alive. Should only be used in very specific cases. |
Enemy Alive | Target must be a valid combat enemy, and alive (example: pretty much any combat ability). |
Friend | Target must be friendly (self, party member, other players). No distinction between dead or alive. Should only be used in very specific cases. |
Friend Alive | Friendly target, must be alive (heals and buffs). |
Friend Dead | Friendly target, must be dead (resurrect). |
Integer: A whole integer, positive or negative (1, -5, etc).
Float: Numbers which may have a decimal point (0.2, -5.0, etc).
String: Text, usually enclosed in double quotation marks.
Evaluation: Evaluates a basic mathematical expression (including some variables) into either an integer or float, depending on the function. Refer to Evaluations for which variables and operations are available.
Function | Description, Parameters, Example Use |
Facing() | This condition is successful if the caster is facing its target (180 degrees), whether a creature or the center of a GTAE (ground target) location. Takes no parameters.Facing() |
InRange(range) | This condition is successful if the caster is within range of the target creature or GTAE location. Range: float. Units. 10 units = 1 meter InRange(30.0) |
NotSilenced() | This condition is successful if the target is not silenced (does not have the SILENCE status effect. Takes no parameters.NotSilenced() |
HasStatus(effect) | This condition is successful if the target has the required status effect. Refer to Status Effects. The status name should be ALL CAPS.HasStatus(IN_COMBAT) |
NotStatus(effect) | This condition is successful if the target does NOT have the required status effect. Refer to Status Effects. The status name should be ALL CAPS.NotStatus(IN_COMBAT) |
Interrupt() | Action. Interrupts the target's casting warmup or channel. Takes no parameters.Interrupt() |
Might(amount) | This condition is successful if the caster has enough Might. If the ability cast is successful, this amount of Might will be subtracted. Amount: Integer Might(3) |
Will(amount) | This condition is successful if the caster has enough Will. If the ability cast is successful, this amount of Will will be subtracted. Amount: Integer Will(3) |
MightCharge(min,max) | This condition is successful if the caster has enough Might charges (at least as much as min). If the ability cast is successful, as many charges will be subtracted (but no more than max). Min: Integer Max: Integer MightCharge(1,5) |
WillCharge(min,max) | This condition is successful if the caster has enough Will charges (at least as much as min). If the ability cast is successful, as many charges will be subtracted (but no more than max). Min: Integer Max: Integer WillCharge(1,5) |
A_AddMightCharge(amount) | Adds a Might charge to the caster (or subtracts if negative). Amount: Integer A_AddMightCharge(1) |
A_AddWillCharge(amount) | Adds a Will charge to the caster (or subtracts if negative). Amount: Integer A_AddWillCharge(1) |
T_AddMightCharge(amount) | Adds a Might charge to the target (or subtracts if negative). Amount: Evaluates to integer T_AddMightCharge(-2) |
T_AddWillCharge(amount) | Adds a Will charge to the target (or subtracts if negative). Amount: Evaluates to integer T_AddWillCharge(-2) |
StealWillCharge(amount) | Action. Not present in the original game. Removes Will charges from the target and grants them to the caster. The number of charges removed is based on the target's current charge count, but will not exceed 'amount'. Must be positive. Amount: Evaluates to integer StealWillCharge(2) |
StealMightCharge(amount) | Action. Not present in the original game. Removes Might charges from the target and grants them to the caster. The number of charges removed is based on the target's current charge count, but will not exceed 'amount'. Must be positive. Amount: Evaluates to integer StealMightCharge(2) |
FullMight() | Fully replenishes the target's Might bar to maximum (10 units). Takes no parameters.FullMight() |
FullWill() | Fully replenishes the target's Will bar to maximum (10 units). Takes no parameters.FullWill() |
hasMainHandWeapon | This condition returns true if the caster has a weapon equipped in its main hand. Always true for NPCs. Takes no parameters. hasMainHandWeapon |
hasOffHandWeapon | This condition returns true if the caster has an offhand weapon equipped. Always true for NPCs. Takes no parameters. hasOffHandWeapon |
hasMeleeWeapon | This condition returns true if the caster has a melee weapon equipped. Functionally equivalent to hasMainHandWeapon. Always true for NPCs. Takes no parameters. hasMeleeWeapon |
hasRangedWeapon | This condition returns true if the caster has a ranged weapon equipped. Always true for NPCs. Takes no parameters. hasRangedWeapon |
hasShield | This condition is a placeholder and is not implemented. Takes no parameters. Always returns true.hasShield |
hasBow | This condition returns true if the caster has a bow equipped in its ranged weapon slot. Always true for NPCs. Takes no parameters. hasBow |
has2HorPoleWeapon | This condition returns true if the caster has a Two-Handed or Pole weapon equipped in its main hand slot. Always true for NPCs. Takes no parameters. has2HorPoleWeapon |
hasWand | This condition returns true if the caster has a Wand equipped in its ranged weapon slot. Always true for NPCs. Takes no parameters. hasWand |
Status(effect,duration) | Adds a status effect for the given duration (in seconds). If the duration is -1, it will not expire. Refer to Status Effects. The status name should be ALL CAPS. Effect: Status effect name. Duration: Evaluation to float. Seconds. Status(STUN,6) |
Amp(stat,percent,duration) | Amplifies a stat by a percentage of its current amount. Percent is a floating point number, and may be negative. Duration may be evaluated, but is converted to whole seconds. Refer to Character Stats. Only numerical stats can be modified. The stat name should be ALL CAPS. Uses the buff category listed in column index[26] (column #27) of the ability entry. Stat: Character stat name Percent: Float Duration: Evaluation to integer. Seconds Amp(STRENGTH,0.05,3600) |
Add(stat,amount,duration) | Modifies a stat by specific amount, which may be either a buff or debuff. The amount may be evaluated. Duration may be evaluated, but is converted to whole seconds. If the duration is -1, it will not expire. Refer to Character Stats. Only numerical stats can be modified. The stat name should be ALL CAPS. Uses the buff category listed in column index[26] (column #27) of the ability entry. Stat: Character stat name Amount: Evaluation to float. Duration: Evaluation to integer. Seconds Add(SPIRIT,3,3600) |
AmpCore(percent,duration) | Amplifies each of the core stats (strength, dexterity, constitution, psyche, spirit) by a percentage of their current amounts. Percent is a floating point number, and may be negative. Duration may be evaluated, but is converted to whole seconds. Uses the buff category listed in column index[26] (column #27) of the ability entry. Percent: Float Duration: Evaluates to integer. Seconds. AmpCore(-0.06,60) |
Nullify(stat,duration) | Negates a stat by adding a debuff for the inverse of its current value. (N + (-N) = 0). Operates on the current value only, does not take into account any other buffs that may be active. For example, if the stat changes while Nullify() is still active, the sum total of all active buff amounts would no longer equal zero. Duration may be evaluated, but is converted to whole seconds. Refer to Character Stats. Only numerical stats can be modified. The stat name should be ALL CAPS. Uses the buff category listed in column index[26] (column #27) of the ability entry. Stat: Stat name. Duration: Evaluates to integer. Seconds. Nullify(WILL_REGEN,(3*willCharges)) |
CheckBuffLimits(level,buffcategory) | Unused. The condition is not emulated and always returns true. In the original game this served to prevent abilities from functioning if a stronger buff was active. In some cases this introduced bugs where certain buffs or even attacks could not be used in some situations. The server automatically handles buff effects by denying weaker tier buffs if a stronger tier version of that ability has been casted. However, this may produce a potentially unwanted side effect where buffs or debuffs from different abilities may stack. Level: Integer buffcategory: Buff category name. CheckBuffLimits(20,+/BuffMove/Buff:Run Speed) |
MeleeDamage(amount) | Applies physical damage. This function will not work if the caster has the DISARM status effect. The amount is evaluated. The calculated result will automatically include bonuses from the dmg_mod_melee stat, hit chance and damage reduction, and critical hit amplification if applicable. Also calculates damage reduction from the target's armor, and can be fully negated by the target's dodge/block/parry chances, if successful. Note: each call to MeleeDamage() rolls dodge/block/parry chances, so using the function multiple times might increase the chances that the final result will be negated. Amount: Evaluates to integer MeleeDamage((A_STRENGTH*0.112+6)*1) |
FireDamage(amount) | Applies fire damage. The final result will automatically include bonuses from the caster's appropriate elemental specialization, and also the target's damage reduction for that element. Amount: Evaluates to integer FireDamage(((A_PSYCHE*1.35+32)*1)*0.65) |
FrostDamage(amount) | ... |
MysticDamage(amount) | ... |
DeathDamage(amount) | ... |
Heal(amount) | Heals the target. Automatically includes bonuses from the caster's healing specialization. Amount: Evaluation to integer. Hitpoints to heal. Heal((A_SPIRIT*2.1448+20)/8) |
A_Heal(amount) | Heals the caster. Automatically includes healing specialization. Amount: Evaluation to integer. Hitpoints to heal. A_Heal(((A_SPIRIT*1.792+131)*1.2)/5) |
Harm(amount) | Deals direct hitpoint damage to the target. This amount is not affected by specialization or armor. Cannot achieve critical hit. Not subject to block/parry/dodge. Amount: Evaluation to integer. Hitpoint damage to deal. Harm(MAX_HEALTH*0.25) |
PercentMaxHealth(ratio) | This condition is passed if the caster has enough health, based on the ratio of current health to maximum. The ratio should be between 0.0 and 1.0 Ratio: floating point PercentMaxHealth(0.251) |
Regenerate(amount) | Heals the target for a flat amount. Not affected by healing specialization. This only seems to be used for some potions in the official ability table. Typically Heal() is used instead. Amount: Evaluation to integer. Regenerate(8) |
AttackMelee(amount) | Performs a melee autoattack. Autoattacks are hardcoded and should not be used directly through the ability table.AttackMelee(0) |
AttackRanged(amount) | Performs a ranged autoattack. Autoattacks are hardcoded and should not be used directly through the ability table.AttackRanged(0) |
Taunt(duration) | Taunts the target to attack the caster, by forcing the target to select the caster. If the target is an NPC, it will hold its target for the specified duration even if another player has generated more hate. Duration: Integer, time in seconds. Taunt(4) |
AddHate(amount) | The target will gain a specific amount of hate toward the caster. Hate is normally generated by attacks, based on damage ((Adjusted Damage / MaxHealth) * 100). NPCs will target the most hated player for attack. Only works against NPCs. Amount: Integer AddHate(200) |
TopHated(amount) | Unknown. Not implemented. Only officially used in the Frost Mire skill, but there is no mention in the skill description of altering creature hate. Amount: Integer TopHated(10) |
UnHate() | Any hate generated by the caster is removed from all creatures in the instance, effectively returning to neutral status. This will not prevent re-aggro if the player is still within range of the creature.UnHate() |
LeaveCombat() | Shuts off the caster's autoattack and disables its combat flags (IN_COMBAT, IN_COMBAT_STAND). This does not remove hate or affect other creatures in any way.LeaveCombat() |
Behind | This condition is successful if the caster is behind its target. For the purposes of this calculation, behind means outside the target's 180 degree forward view cone.Behind |
Spin() | Rotates the target's current directional facing by 180 degrees. This may be somewhat erratic in the client, especially on players since the client does not seem to accept forced player rotations. Creature AI immediately turns to face their target on the next frame, so this may not be very effective against the target unless it can be stunned or dazed too.Spin() |
Duration(time) | Increases the duration of channel effects to match the specified time. The resulting time will be automatically constrained to fit within a limit of 1 to 32 seconds. Time: Evaluation to integer. Seconds. Duration(mightCharges*5) |
Resurrect(healthRatio,luckRatio) | Resurrect the target with the given health and luck ratios. (1.0 = 100%). If luckRatio is not provided, it defaults to maximum. healthRatio: float luckRatio (optional): float Resurrect(0.4, 1) |
NearbySanctuary | This condition is successful if the caster is within range (25 meters) of a sanctuary.NearbySanctuary |
BindTranslocate() | Binds the caster to the nearest sanctuary.BindTranslocate() |
Translocate() | Warp the caster to their bound sanctuary.Translocate() |
PortalRequest(internalName,destinationName) | Sends a portal request to the target. Typically used by the stonehenge abilities. Ensure that an InteractDef entry is supplied for the destination. The InteractDef's Message field must match destinationName exactly. internalName: string. Unused. destinationName: string. Destination. PortalRequest("Transport_Stonehenge", "Stonehenge") |
Go(destination) | Unused. Not implemented. Teleports the caster to a named location. destination: string Go("LOC5") |
GoSanctuary() | Teleports the target to the nearest sanctuary. Usually called for the caster, but can be used for party members too like the Exodus skill.GoSanctuary() |
RemoveAltDebuff() | Removes one of the following debuffs from the target: Negative amount stat modifiers for {MELEE_ATTACK_SPEED, MAGIC_ATTACK_SPEED, MOD_MOVEMENT}, and status effects {FEAR, CHARM, ROOT} in that order. Refer to the Free ability.RemoveAltDebuff() |
RemoveStatDebuff() | Removes one of the following debuffs from the target: Negative amount stat modifiers for {STRENGTH, DEXTERITY, CONSTITUTION, PSYCHE, SPIRIT, MOD_LUCK} in that order. Refer to the Cleanse ability.RemoveStatDebuff() |
RemoveEtcDebuff() | Removes one of the following debuffs from the target: Negative amount stat modifiers for {BASE_DAMAGE_FIRE, BASE_DAMAGE_FROST, BASE_DAMAGE_MYSTIC, BASE_DAMAGE_DEATH, DAMAGE_RESIST_MELEE, DAMAGE_RESIST_FIRE, DAMAGE_RESIST_FROST, DAMAGE_RESIST_MYSTIC, DAMAGE_RESIST_DEATH, BASE_HEALTH} in that order. Refer to the Purge ability.RemoveEtcDebuff() |
RemoveAltBuff() | Removes one of the following buffs from the target: Positive amount stat modifiers for {MELEE_ATTACK_SPEED, MAGIC_ATTACK_SPEED, MOD_MOVEMENT}. Refer to the Suppress ability.RemoveAltBuff() |
RemoveStatBuff() | Removes one of the following buffs from the target: Positive amount stat modifiers for {STRENGTH, DEXTERITY, CONSTITUTION, PSYCHE, SPIRIT, MOD_LUCK}. Refer to the Corrupt ability.RemoveStatBuff() |
RemoveEtcBuff() | Removes one of the following buffs from the target: Positive amount stat modifiers for {BASE_DAMAGE_FIRE, BASE_DAMAGE_FROST, BASE_DAMAGE_MYSTIC, BASE_DAMAGE_DEATH, DAMAGE_RESIST_MELEE, DAMAGE_RESIST_FIRE, DAMAGE_RESIST_FROST, DAMAGE_RESIST_MYSTIC, DAMAGE_RESIST_DEATH, BASE_HEALTH}. Refer to the Abolish ability.RemoveEtcBuff() |
Invisible(duration,distance,unknown | Activate Mage invisibility. Travel distance regeneration (when idle) is based on Psyche. Duration: Evaluates to integer. Seconds. Distance: Evaluates to integer. Distance units (10 = 1 meter) Unknown: Evaluates to integer. Not used. Invisible(120,A_PSYCHE*1,0) |
WalkInShadows(duration,distance) | Activate Rogue invisibility. Travel distance regeneration (when idle) is based on Dexterity. Duration: Evaluates to integer. Seconds. Distance: Evaluates to integer. Distance units (10 = 1 meter) WalkInShadows(120,A_DEXTERITY*1.0) |
AddWDesc(stat,iteration,time,desc) | Not implemented. Probably had some effect in the client when describing iterative damage from channel ability. The description in the client's ingoing/outgoing damage filter seems be fine without this. Stat: Stat name. Refer to Character Stats Iteration: Evaluates to integer. Seconds between interations? Time: Evalutes to integer. Maximum duration of channel (seconds)? Desc: String. Alternate text to display? AddWDesc(BLEEDING,1,8,"Shadow Strike") |
HealthSacrifice(amount) | Transfers hitpoints from the caster to the target. Health will not transfer if the target is at maximum HP. Only transfers as much health as the target needs, up to the specified amount. The caster will be damaged and lose HP equivalent to the transfer amount. The caster will die if they do not have enough HP to withstand the damage. Amount: Evalutes to integer. Hitpoints. HealthSacrifice(150) |
DoNothing() | Placeholder function. As the name implies, it doesn't do anythingDoNothing() |
Reagent(itemID,count) | Not implemented. This condition is passed if the player has enough items in their inventory, and consumes them if the ability successfully activates. This function was never implemented server-side because reagents were usually an unnecessary, stupid requirement. Always returns successful. itemID: Integer, ItemDef mID. count: Integer, number of items. Reagent(20522,2) |
SetAutoAttack(effect) | Custom, unofficial function. Don't use this in the ability table. The function exists for internal server use only. Effect corresponds to AUTO_ATTACK or AUTO_ATTACK_RANGED. |
DisplayEffect(name) | Custom, unofficial function. Performs a visual effect. This can be used to simulate visual effects in cases when particular abilities are not scripted. For example, a custom ability that launches a fireball against multiple targets. The effect name must exist in the client's ability effect scripting. Not to be confused with status effects. Name: String. Effect name. DisplayEffect("Firebolt") |
InterruptChance(amount) | Custom, unofficial function. Modifies the interrupt chance of a channel performed by this ability. Internally the amount is considered as an additive bonus to CHANNELING_BREAK_CHANCE but does not alter the stat itself, and therefore does not affect the interrupt chance of other abilities. Amount: Evaluates to integer. 10 units = 1% chance. InterruptChance(-150) |
Skills that use MeleeDamage() are flagged as dealing physical damage. Skills that use FireDamage(), FrostDamage(), MysticDamage(), or DeathDamage() are flagged as dealing magic damage. Skills that are only flagged for physical (and not magic) are subject to the DISARM status effect and may prevent the caster from using the ability (if CustomAbilityMechanics is enabled, see ServerConfig.txt).
Skills default to instant cast. If the "Warmup Time" column value is greater than zero, the ability is a timed cast instead.
If the "Duration" column value is set to nonzero, the ability is considered a channel.
If the "Ability Class" column value is set to "Passive" OR the "Use Type" column value is set to 4, then the ability is considered a passive. Passive abilities are activated when a player logs in.
Skills that contain the onParry event are registered to the creature for implicit response actions when a parry is successful. Logically these should be activated as passives, since implicit events are effectively permanent and are not removed except for a relog or respec.
Concerning the client-side ability Description: A_STRENGTH and similar prefixed names seem to have a special case when used in the client. Anything following the A_ is interpreted as a Character Stat name and can be used to display information from the caster. If you're reading an ability tooltip, it's from the player's avatar stats. T_ stats have not been tested in the description field.
Order of operations has not been fully tested, so if it's producing incorrect results, you may need to explicitly define them with parenthesis.
Expression may also allow the following variables which will be substituted during the evaluation process. Note: Case Sensitive!
A_STRENGTH Caster's STRENGTH property. A_DEXTERITY Caster's DEXTERITY property. A_SPIRIT Caster's SPIRIT property. A_PSYCHE Caster's PSYCHE property. A_CONSTITUTION Caster's CONSTITUTION property. A_LEVEL Caster's LEVEL property (character level). mightCharges The number of might charges spent casting this ability. Some abilities don't use all charges. willCharges The number of will charges spent casting this ability. Some abilities don't use all charges. MWD Calculates melee weapon damage[*]. Mainhand + Offhand (if applicable). RWD Calculates ranged weapon damage[*]. WMD Calculates melee weapon damage[*]. Does not include offhand. MAX_HEALTH The caster's max health. damage Intended for implicit actions only (parries), returns the parried damage.Notes:
The following properties are new custom features in the server:
T_mightCharges The target's current might charges. T_willCharges The target's current will charges. mightChargesCurrent The caster's current might charges. willChargesCurrent The caster's current will charges.