function IsUnitCanAttack takes unit u returns boolean
local integer abil_cargo = 'Abun'
local integer abil_cargo_level = GetUnitAbilityLevel(u, abil_cargo)
local integer buff_banish = 'BHbn'
local integer buff_banish_level = GetUnitAbilityLevel(u, buff_banish)
if abil_cargo_level == 0 and buff_banish_level == 0 and (IsUnitType(u, UNIT_TYPE_ATTACKS_GROUND) == true or IsUnitType(u, UNIT_TYPE_ATTACKS_FLYING) == true) then
return true
endif
return false
endfunction
function Trig_Smart_Attack_Conditions takes nothing returns boolean
return GetIssuedOrderId() == 851983 and IsUnitCanAttack(GetTriggerUnit()) == true
endfunction
//===========================================================================
function Trig_Smart_Attack_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local player owner = GetOwningPlayer(caster)
local real targetX = GetOrderPointX()
local real targetY = GetOrderPointY()
local group g = CreateGroup()
local unit u
local unit array targets
local real array dists
local integer count = 0
local integer i = 0
local integer j = 0
local real dx
local real dy
local real dist
call GroupEnumUnitsInRange(g, targetX, targetY, 650.0, null)
loop
set u = FirstOfGroup(g)
exitwhen u == null
call GroupRemoveUnit(g, u)
if IsUnitEnemy(u, owner) and GetWidgetLife(u) > 0 and IsUnitVisible(u, owner) then
set dx = GetUnitX(u) - targetX
set dy = GetUnitY(u) - targetY
set dist = dx * dx + dy * dy
set i = 0
loop
exitwhen i >= count or dist < dists[i]
set i = i + 1
endloop
if i < 8 then
set j = 7
loop
exitwhen j <= i
set targets[j] = targets[j - 1]
set dists[j] = dists[j - 1]
set j = j - 1
endloop
set targets[i] = u
set dists[i] = dist
if count < 8 then
set count = count + 1
endif
endif
endif
endloop
if count > 0 then
call IssueTargetOrderById(caster, 851971, targets[count - 1])
set i = count - 2
loop
exitwhen i < 0
call BlzQueueTargetOrderById(caster, 851971, targets[i])
set i = i - 1
endloop
endif
call DestroyGroup(g)
set g = null
set u = null
set caster = null
set owner = null
set i = 0
loop
exitwhen i >= 8
set targets[i] = null
set i = i + 1
endloop
endfunction
//===========================================================================
function InitTrig_Smart_Attack takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterPlayerUnitEvent(t, Player(0), EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER, null)
call TriggerAddCondition(t, Condition(function Trig_Smart_Attack_Conditions))
call TriggerAddAction(t, function Trig_Smart_Attack_Actions)
set t = null
endfunction