/* * Author: Needles * https://steamcommunity.com/profiles/76561198026257137/ */ printl("*** HANDLER/DAMAGE_START"); /* * INTENDED TO BE USED IN CONJUNCTION WITH DAMAGE_END * ASSIGN BOTH HANDLERS AT THE SAME TIME */ local DamageStartHandler = class extends ::Handler.BaseHandler { /* BASE CLASS self = The entity that the handler is assigned to activator = The entity that assigned the handler time = When this handler was assigned */ autoCrit = null; forceCritAttacker = null; forceCritCrit = null; constructor() { base.constructor(); autoCrit = false; forceCritAttacker = null; forceCritCrit = CRIT_TYPE.NONE; } function OnAdd() { local classname = self.GetClassname(); // These entities will automatically calculate additional crit damage if the crit flag is assigned. if (classname == "player" || classname == "base_boss" || classname == "tankboss") autoCrit = true; } function ForceCrit(attacker, crit) { forceCritAttacker = attacker; forceCritCrit = crit; } function OnEvent_DamagePre(params) { if (params.const_entity != self) return; if (forceCritAttacker != null && params.attacker == forceCritAttacker) { params.crit = forceCritCrit; forceCritAttacker = null; forceCritCrit = CRIT_TYPE.NONE; } else { if (::Damage.IsMinicrit(params)) params.crit = CRIT_TYPE.MINI; if ((params.damage_type & ::Const.FDMG_CRIT) == ::Const.FDMG_CRIT) { params.crit = CRIT_TYPE.FULL; params.damage_type -= ::Const.FDMG_CRIT; } } // Reverse crit damage if (autoCrit == true && params.crit == CRIT_TYPE.MINI) { ::Debug.Print("removing minicrit damage") params.damage /= ::Const.MINICRIT_FACTOR; } params.crit_type = 0; } } ::Handler.RegisterHandler("damage_start", @() DamageStartHandler());