Этот код должен при изучении абилки героем, выбирать 2-х ближайших к нему героев и создавать над нами спец эффект
Но работает совсем некорректно, прошу помочь найти ошибки
function IsUnitDeadBX takes unit u returns boolean
return GetUnitTypeId(u) == 0 or IsUnitType(u, UNIT_TYPE_DEAD)
endfunction
function FDFD takes unit pFb,unit pFB returns real
local real lFC=GetUnitX(pFb)
local real lFd=GetUnitY(pFb)
local real lEv=GetUnitX(pFB)
local real lEV=GetUnitY(pFB)
if pFb==null or pFB==null then
return 0x540BE3FF
else
return SquareRoot((lFC-lEv)*(lFC-lEv)+(lFd-lEV)*(lFd-lEV))
endif
endfunction
function IsTarget takes unit u,unit d returns boolean
return u!= null and IsUnitDeadBX(u) == false and not IsUnitType(u, UNIT_TYPE_STRUCTURE) and not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) and IsUnitEnemy(u, GetOwningPlayer(d))
endfunction
function MagicArrowsCon takes nothing returns boolean
return GetLearnedSkill()== 'A00X'
endfunction
function MagicArrowsEffect takes nothing returns nothing
local timer t= GetExpiredTimer()
local integer id = GetHandleId(t)
local unit c = LoadUnitHandle(udg_AssassinHash,id,0)
local group g = LoadGroupHandle(udg_AssassinHash,id,1)
local group tg = LoadGroupHandle(udg_AssassinHash,id,2)
local group ng = LoadGroupHandle(udg_AssassinHash,id,3)
local real x = GetUnitX(c)
local real y = GetUnitY(c)
local unit u
local unit w
local real dist = 0.
local real min = 1950.
local string s = ""
local integer i = 0
if IsUnitDeadBX(c) == false then
loop
exitwhen i >= 12
if IsPlayerAlly(GetOwningPlayer(c),Player(i)) then
if (GetLocalPlayer()==Player(i)) then
set s = "Target2.mdx"
endif
endif
set i=i+1
endloop
call GroupClear(g)
call GroupClear(tg)
call GroupClear(ng)
call GroupEnumUnitsInRange(g,x,y,2000.,null)
loop
set u = FirstOfGroup(g)
if IsUnitInGroup(u,tg) == false and IsTarget(u,c) and IsUnitType(u,UNIT_TYPE_HERO) and IsUnitVisible(u,GetOwningPlayer(c)) then
set dist = FDFD(u,c)
call DisplayTextToForce( GetPlayersAll(),"pick = " + GetHeroProperName(u) )
call DisplayTextToForce( GetPlayersAll(),"dist = "+R2S(dist))
call GroupAddUnit(ng,u)
if dist < min then
set min = dist
set w = u
endif
endif
call GroupAddUnit(tg,u)
call GroupRemoveUnit(g,u)
exitwhen u == null
endloop
call DisplayTextToForce( GetPlayersAll(),"w1 = " + GetHeroProperName(w) )
if w!= null then
call SaveUnitHandle(udg_AssassinHash,id,StringHash("TMA1"),w)
call SaveEffectHandle(udg_AssassinHash,id,StringHash("ED"),AddSpecialEffectTarget(s,w,"overhead"))
call DisplayTextToForce(GetPlayersAll(),"addef1" )
endif
call GroupRemoveUnit(ng,LoadUnitHandle(udg_AssassinHash,id,StringHash("TMA1")))
//call GroupRemoveUnit(ng,c)
if FirstOfGroup(ng)!= null then
set min = 1950.
loop
set u = FirstOfGroup(ng)
call DisplayTextToForce( GetPlayersAll(),"pick2 = " + GetHeroProperName(u) )
set dist = FDFD(u,c)
if dist < min then
set min = dist
set w = u
endif
call GroupRemoveUnit(ng,u)
exitwhen u == null
endloop
call DisplayTextToForce( GetPlayersAll(),"w2 = " + GetHeroProperName(w))
if w!= null and w != LoadUnitHandle(udg_AssassinHash,id,StringHash("TMA1")) then
call SaveUnitHandle(udg_AssassinHash,id,StringHash("TMA2"),w)
call SaveEffectHandle(udg_AssassinHash,id,StringHash("ED2"),AddSpecialEffectTarget(s,w,"overhead"))
call DisplayTextToForce(GetPlayersAll(),"addef2")
endif
endif
call SaveUnitHandle(udg_AssassinHash,id,StringHash("TMA1"),null)
call DestroyEffect(LoadEffectHandle(udg_AssassinHash,id,StringHash("ED")))
call SaveUnitHandle(udg_AssassinHash,id,StringHash("TMA2"),null)
call DestroyEffect(LoadEffectHandle(udg_AssassinHash,id,StringHash("ED2")))
endif
set t = null
set c = null
set u = null
set g = null
set tg = null
set ng = null
set w = null
endfunction
function MagicArrowsLearn takes nothing returns nothing
local unit u = GetTriggerUnit()
local timer t
local integer id
if GetUnitAbilityLevel(u,'A00X') == 1 then
set t = CreateTimer()
set id = GetHandleId(t)
call SaveUnitHandle(udg_AssassinHash,id,0,u)
call SaveGroupHandle(udg_AssassinHash,id,1,CreateGroup())
call SaveGroupHandle(udg_AssassinHash,id,2,CreateGroup())
call SaveGroupHandle(udg_AssassinHash,id,3,CreateGroup())
call TimerStart(t,.2,true,function MagicArrowsEffect)
endif
set u = null
set t = null
endfunction
//===========================================================================
function InitTrig_Magic_Arrows_new takes nothing returns nothing
set gg_trg_Magic_Arrows_new = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Magic_Arrows_new, EVENT_PLAYER_HERO_SKILL )
call TriggerAddCondition( gg_trg_Magic_Arrows_new, Condition( function MagicArrowsCon))
call TriggerAddAction( gg_trg_Magic_Arrows_new, function MagicArrowsLearn)
endfunction