scope CriticalStrike initializer Init
globals
[B]private constant integer MAX_HANDLE_NO = 8190
private constant integer MIN_HANDLE_ID = 0x100000
private boolean array Flag[MAX_HANDLE_NO][/B]
endglobals
[B]private function H2I takes handle h returns integer
return GetHandleId(h)
endfunction[/B]
//
private function Conditions takes nothing returns boolean
return GetTriggerDamageType() == DAMAGE_TYPE_ATTACK and [B]Flag[H2I(GetTriggerDamageSource())-MIN_HANDLE_ID] [/B]and GetUnitAbilityLevel(GetTriggerDamageSource(), 'AOcr') > 0 and not IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE)
endfunction
private function Actions takes nothing returns nothing
local unit u = GetTriggerDamageSource()
local unit t = GetTriggerDamageTarget()
local integer lvl = GetUnitAbilityLevel(u, 'AOcr')
local integer pr = GetTriggerPriority(GetTriggeringTrigger())
local texttag te = CreateTextTag()
local real d = GetTriggerDamage()
call DestroyEffect( AddSpecialEffectTarget("Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.mdl",t,"origin") )
//Deals +100%/200%/300%/etc damage
call BJDebugMsg("Critical Strike has a |cff00ffff"+I2S(pr)+"|r priority which should fire a |cff00ffff5|r-PR trigger!")
call UnitDamageTargetEx(u, t, d*(lvl+1), ATTACK_TYPE_HERO, DAMAGE_TYPE_EXTRA, true)
call SetTextTagText(te, I2S(R2I(d*(lvl)))+"!", 0.024)
call SetTextTagPos(te, GetUnitX(u), GetUnitY(u), 0.00)
call SetTextTagColor(te, 255, 0, 0, 255)
call SetTextTagVelocity(te, 0, 0.04)
call SetTextTagVisibility(te, true)
call SetTextTagFadepoint(te, 2)
call SetTextTagLifespan(te, 5)
call SetTextTagPermanent(te, false)
set Flag[H2I(u)-MIN_HANDLE_ID] = false
set te = null
set u = null
set t = null
endfunction
private function Atk_Conditions takes nothing returns boolean
return GetUnitAbilityLevel(GetAttacker(), 'AOcr') > 0 and not IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE)
endfunction
globals
integer crit = 0
endglobals
private function Atk_Actions takes nothing returns nothing
local unit u = GetAttacker()
//if GetRandomInt(1, 100) <= 30 then
if crit == 2 then
call SetUnitAnimation(u, "attack slam")
call QueueUnitAnimation(u, "stand ready")
set Flag[H2I(u)-MIN_HANDLE_ID] = true
set crit = 0
else
set Flag[H2I(u)-MIN_HANDLE_ID] = false
set crit = crit + 1
endif
set u = null
endfunction
//Life Steal
private function LifeSteal takes nothing returns nothing
local unit atk = GetTriggerDamageSource()
local unit vic = GetTriggerDamageTarget()
local integer level = GetUnitAbilityLevel( atk, 'AOcr' )
local real life
local real steal
local real dam = GetTriggerDamage()
if dam > 0 and ( GetTriggerDamageType() == DAMAGE_TYPE_ATTACK or GetTriggerDamageType() == DAMAGE_TYPE_EXTRA ) and level > 0 then
set life = GetUnitState( atk, UNIT_STATE_LIFE )
set steal = ( dam / 100 ) * ( 10 + level * 10 )
call SetUnitState( atk, UNIT_STATE_LIFE, life + steal )
call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Spells\\Undead\\VampiricAura\\VampiricAuraTarget.mdl", atk, "origin" ) )
call BJDebugMsg("Steal |cff00ffff"+R2S(steal)+"|r hit points")
endif
set atk = null
set vic = null
endfunction
private function Init takes nothing returns nothing
local trigger trg = CreateTrigger()
call TriggerAddAction(trg, function Actions)
call TriggerAddCondition(trg, Condition(function Conditions))
call TriggerRegisterDamageEvent(trg, 1)
set trg = CreateTrigger()
call TriggerAddAction(trg, function LifeSteal)
call TriggerRegisterDamageEvent(trg, 1)
set trg = CreateTrigger()
call TriggerAddAction(trg, function Atk_Actions)
call TriggerAddCondition(trg, Condition(function Atk_Conditions))
call TriggerRegisterAnyUnitEventBJ(trg, EVENT_PLAYER_UNIT_ATTACKED)
set trg = null
endfunction
endscope