Name | Type | is_array | initial_value |
PermBerserkAbility | abilcode | No | A000 |
PermBerserkBuff | buffcode | No | BHad |
PermBerserkHashtable | hashtable | No | |
PermBerserkTimeout | real | No | 2.00 |
// UNIT IS ALIVE FILTER
function AliveFilter takes nothing returns boolean
return GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0
endfunction
// ATTACKING UNIT IS ISSUED ORDER
function PermBerserk__OrderIssued_Conditions takes nothing returns boolean
local integer orderedUnitId = GetHandleId(GetOrderedUnit())
local trigger triggeringTrg = GetTriggeringTrigger()
local trigger trg = null
// Destroy the trigger
if HaveSavedHandle(udg_PermBerserkHashtable, orderedUnitId, 0) then
set trg = LoadTriggerHandle(udg_PermBerserkHashtable, orderedUnitId, 0)
call FlushChildHashtable(udg_PermBerserkHashtable, orderedUnitId)
if trg != triggeringTrg then
call DestroyTrigger(trg)
endif
set trg = null
endif
call DestroyTrigger(triggeringTrg)
set triggeringTrg = null
return false
endfunction
// ORDER ATTAKCS ETC
function Trig_Perm_Berserk_Filter takes nothing returns boolean
local unit filterUnit = GetFilterUnit()
local unit target = null
local group grp = null
local trigger trg = null
local integer filterUnitId
// Unit has ability
if GetUnitAbilityLevel(filterUnit, udg_PermBerserkAbility) > 0 then
set filterUnitId = GetHandleId(filterUnit)
// Unit doesn't have buff
if GetUnitAbilityLevel(filterUnit, udg_PermBerserkBuff) < 1 then
// Pick a target
set grp = CreateGroup()
call GroupEnumUnitsInRangeCounted(grp, GetUnitX(filterUnit), GetUnitY(filterUnit), GetUnitAcquireRange(filterUnit), Filter(function AliveFilter), 2)
call GroupRemoveUnit(grp, filterUnit)
set target = FirstOfGroup(grp)
call DestroyGroup(grp)
set grp = null
// Attack the target
if target != null then
call IssueTargetOrder(filterUnit, "attack", target)
// Target is ally
if IsUnitAlly(filterUnit, GetOwningPlayer(target)) and not HaveSavedHandle(udg_PermBerserkHashtable, filterUnitId, 0) then
// Save trigger handle
set trg = CreateTrigger()
call SaveTriggerHandle(udg_PermBerserkHashtable, filterUnitId, 0, trg)
// Remove trigger handle and destroy trigger when order issued
call TriggerRegisterUnitEvent(trg, filterUnit, EVENT_UNIT_ISSUED_ORDER)
call TriggerRegisterUnitEvent(trg, filterUnit, EVENT_UNIT_ISSUED_POINT_ORDER)
call TriggerRegisterUnitEvent(trg, filterUnit, EVENT_UNIT_ISSUED_TARGET_ORDER)
call TriggerAddCondition(trg, Condition(function PermBerserk__OrderIssued_Conditions))
set trg = null
endif
set target = null
endif
// Unit has buff and has ally target
elseif HaveSavedHandle(udg_PermBerserkHashtable, filterUnitId, 0) then
// Destroy trigger
call DestroyTrigger(LoadTriggerHandle(udg_PermBerserkHashtable, filterUnitId, 0))
call FlushChildHashtable(udg_PermBerserkHashtable, filterUnitId)
// Stop attack
if GetUnitCurrentOrder(filterUnit) == 851983 then
call IssueImmediateOrder(filterUnit, "stop")
endif
endif
endif
set filterUnit = null
return false
endfunction
// TIMER EXPIRES
function Trig_Perm_Berserk_Conditions takes nothing returns boolean
local group grp = CreateGroup()
// Enumerate all units and use filter to do stuff
call GroupEnumUnitsInRect(grp, bj_mapInitialPlayableArea, Filter(function Trig_Perm_Berserk_Filter))
call DestroyGroup(grp)
set grp = null
call TimerStart(GetExpiredTimer(), udg_PermBerserkTimeout, false, null)
return false
endfunction
//===========================================================================
function InitTrig_Perm_Berserk takes nothing returns nothing
local timer tmr = CreateTimer()
set gg_trg_Perm_Berserk = CreateTrigger()
set udg_PermBerserkHashtable = InitHashtable()
call TriggerRegisterTimerExpireEvent(gg_trg_Perm_Berserk, tmr)
call TriggerAddCondition(gg_trg_Perm_Berserk, Condition(function Trig_Perm_Berserk_Conditions))
call TimerStart(tmr, udg_PermBerserkTimeout, false, null)
set tmr = null
endfunction