Custom Backstab Problem

spectre37

New Member
I try to create a "wind walk" spell that stun the target when a caster attack it from behind.
My problem is that I want to hide a floating text that come up with backstab damage (I want to use only my own custom text).

So I try to change a target allowed to "none", but the result is trigger don't even run : ((

JASS:
library BackstabCheck
 
function IsUnitBehindUnit takes unit u2, unit u1 returns boolean
local real face = GetUnitFacing(u1)
local real rangle = bj_RADTODEG*Atan2(GetUnitY(u2)-GetUnitY(u1),GetUnitX(u2)-GetUnitX(u1))
 
return not (RAbsBJ(face-rangle) < 45 or RAbsBJ(face-rangle-360) < 90)
endfunction
 
endlibrary


JASS:
function Shadow_Walk_Cond takes nothing returns boolean
return UnitHasBuffBJ(GetAttacker(), 'B00K') and IsUnitEnemy(GetAttacker(), GetOwningPlayer(GetTriggerUnit())) and IsUnitType(GetTriggerUnit(), UNIT_TYPE_MECHANICAL) == false
endfunction
 
function Shadow_Walk_Act takes nothing returns nothing
local unit a = GetAttacker()
local unit v = GetTriggerUnit()
local unit n
local real damage = GetUnitAbilityLevel(a, 'A015')*50
 
call DisableTrigger(GetTriggeringTrigger())
call TriggerSleepAction(.05)
 
if IsUnitBehindUnit(a,v) and IsUnitAliveBJ(v) then
set n = CreateUnitAtLoc( GetOwningPlayer(a), 'n00A', GetUnitLoc(v), bj_UNIT_FACING )
call UnitAddAbility( n, 'ACtb' )
call SetUnitAbilityLevel( n, 'ACtb', 2 )
call IssueTargetOrder( n, "creepthunderbolt", v )
call UnitApplyTimedLife( n, 'BTLF', 1 )
 
call UnitDamageTargetBJ( a, v, damage, ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL )
call CreateTextTagLocBJ( I2S(R2I(damage)) + "!", GetUnitLoc(v), 60, 10, 100, 10, 10, 0 )
call FloatingText( GetLastCreatedTextTag(), 2, 1.5, 96, 90 )
 
call UnitRemoveBuffBJ('B00K', a)
endif
 
call EnableTrigger(GetTriggeringTrigger())
set n = null
endfunction
 
//===========================================================================
function InitTrig_Shadow_Walk takes nothing returns nothing
set gg_trg_Shadow_Walk = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Shadow_Walk, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddCondition( gg_trg_Shadow_Walk, Condition( function Shadow_Walk_Cond ) )
call TriggerAddAction( gg_trg_Shadow_Walk, function Shadow_Walk_Act )
endfunction


**Note : 'B00K' is a wind walk buff.
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Problems :
1) TriggerSleepAction does not allow such short period. You need a timer to achieve that.
2) You can't override the default order string. It should be "thunderbolt".

Try this :
JASS:
library ShadowWalk initializer OnInit
 
private function IsAttackerBehindTarget takes unit atkr, unit targ returns boolean
local real targAngle=GetUnitFacing(targ)*bj_DEGTORAD
local real atkrToTargAngle=Atan2(GetUnitY(targ)-GetUnitY(atkr),GetUnitX(targ)-GetUnitX(atkr))
local real r=atkrToTargAngle-targAngle
return r<0.8 and r>-0.8 //360 degree = 6.284 rad, 45 degree = 0.7955 rad
endfunction
 
private function Cond takes nothing returns boolean
local unit atkr=GetAttacker()
local unit targ=GetTriggerUnit()
local real damage
local unit dum
if GetUnitAbilityLevel(atkr,'B00K')>0 and /*
*/ IsUnitEnemy(atkr,GetOwningPlayer(targ)) and /*
*/ IsUnitType(targ,UNIT_TYPE_MECHANICAL)==false and /*
*/ IsAttackerBehindTarget(atkr,targ) then
set damage=GetUnitAbilityLevel(atkr,'A015')*50.0
set dum=CreateUnit(GetOwningPlayer(atkr),'n00A',GetUnitX(targ),GetUnitY(targ),0.0)
//dummy, does not matter 270.0 degree facing or not.
call UnitAddAbility(dum,'ACtb')
call SetUnitAbilityLevel(dum,'ACtb',2) // Should be equal to GetUnitAbilityLevel? Idk.
call IssueTargetOrder(dum,"thunderbolt",targ)
call UnitDamageTarget(atkr,targ,damage,true,false,ATTACK_TYPE_HERO,DAMAGE_TYPE_NORMAL,null)
call FloatingText(CreateTextTagLocBJ(I2S(R2I(damage)) + "!", GetUnitLoc(targ), 60, 10, 100, 10, 10,0), 2, 1.5, 96, 90 )
call UnitRemoveAbility(atkr,'B00K')
call UnitApplyTimedLife(dum,'BTLF',1.0)
set dum=null
endif
set atkr=null
set targ=null
return false
endfunction
 
private function OnInit takes nothing returns nothing
local trigger trig=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(trig,EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(trig, Condition(function Cond))
endfunction
 
endlibrary
 
General chit-chat
Help Users
  • No one is chatting at the moment.

    Staff online

    Members online

    Affiliates

    Hive Workshop NUON Dome World Editor Tutorials

    Network Sponsors

    Apex Steel Pipe - Buys and sells Steel Pipe.
    Top