/* * Author: Needles * https://steamcommunity.com/profiles/76561198026257137/ */ printl("*** HANDLER/DAMAGE_END"); /* * INTENDED TO BE USED IN CONJUNCTION WITH DAMAGE_START * ASSIGN BOTH HANDLERS AT THE SAME TIME */ local DamageEndHandler = 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; constructor() { base.constructor(); autoCrit = false; } 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 OnEvent_DamagePre(params) { if (params.const_entity != self) return; local effectName = null; // Manually calculate crit damage if required switch (params.crit) { case CRIT_TYPE.MINI: if (autoCrit == false) params.damage *= ::Const.MINICRIT_FACTOR; params.crit_type = CRIT_TYPE.MINI; effectName = PARTICLE_MINICRIT; break; case CRIT_TYPE.FULL: if (autoCrit == false) params.damage *= ::Const.CRIT_FACTOR; params.damage_type = params.damage_type | ::Const.FDMG_CRIT; params.crit_type = CRIT_TYPE.FULL; effectName = PARTICLE_CRIT; break; } // Crit particle effect if (effectName != null) { local attachment = ::Attachment.Validate(self); if (attachment != null) { local point = attachment.GetPoint("particle_crit"); DispatchParticleEffect(effectName, self.GetOrigin() + point.origin, ::Utils.QAngleToVector(self.GetAbsAngles() + point.angles)); } } } } DamageEndHandler.PARTICLE_CRIT <- "crit_text"; DamageEndHandler.PARTICLE_MINICRIT <- "minicrit_text"; ::Particle.PrecacheEffect(DamageEndHandler.PARTICLE_CRIT); ::Particle.PrecacheEffect(DamageEndHandler.PARTICLE_MINICRIT); ::Handler.RegisterHandler("damage_end", @() DamageEndHandler());