Старый код пролежал 2 года в моем блоге но ни кто не узнал о нем. Поэтому решил выложить в ресурс как наработка позволяет не плодить одинаковых событии игроков и юнитов.
Как применить данный код?
  1. Создаем новый страницу триггер и конвентируем в строку кода. (Очишаем код)
  2. Копируем код библиотку xeEvent
  3. Вставляем созданную страницу триггер.
События юнита для всех игроков
call OnEventTrigger(EVENT_PLAYER_UNIT_<Имя события>, [Действия])
События юнита для определеных игроков
call OnEventTriggerPlayer(Player(<Номер индекса игрока>), EVENT_PLAYER_UNIT_<Имя события>, [Действия])
library xeEvent
    globals
        private integer array handleTriggers
        private integer array handleConditions
        private trigger array triggers
        private boolean array players
        private integer countTriggers = 0
        private integer countCondition = 0
    endglobals
    /* -------------------------------------------------- */
    private function GetEventTriggerId takes integer i returns integer
        local integer n = 0
        
        loop
            exitwhen n == countTriggers
            if handleTriggers[n] == i then
                return n
            endif
            set n = n + 1
        endloop
        
        return -1
    endfunction
    /* -------------------------------------------------- */
    private function GetEventConditionId takes integer i returns integer
        local integer n = 0
        
        loop
            exitwhen n == countCondition
            if handleConditions[n] == i then
                return n
            endif
            set n = n + 1
        endloop
        
        return -1
    endfunction
    /* -------------------------------------------------- */
    function OnEventTriggerPlayer takes player p, playerunitevent e, boolexpr f returns nothing
        local integer t = GetHandleId(e)
        local integer c = GetHandleId(f)
        local integer tid = GetEventTriggerId(t)
        local integer cid = GetEventConditionId(c)
        
        if tid < 0 then
            set tid = countTriggers
            set countTriggers = countTriggers + 1
            set handleTriggers[tid] = t
            set triggers[tid] = CreateTrigger()
        endif
        
        if not players[tid * bj_MAX_PLAYER_SLOTS + GetHandleId(p)] then
            set players[tid * bj_MAX_PLAYER_SLOTS + GetHandleId(p)] = true
            call TriggerRegisterPlayerUnitEvent(triggers[tid], p, e, null)
        endif
        
        if cid < 0 then
            set cid = countCondition
            set countCondition = countCondition + 1
            set handleConditions[cid] = c
            call TriggerAddCondition(triggers[tid], f)
        endif
    endfunction
    /* -------------------------------------------------- */
    function OnEventTrigger takes playerunitevent e, boolexpr f returns nothing
        local integer t = GetHandleId(e)
        local integer c = GetHandleId(e)
        local integer tid = GetEventTriggerId(t)
        local integer cid = GetEventConditionId(c)
        local integer i = 0
        local player p
        
        if tid < 0 then
            set tid = countTriggers
            set countTriggers = countTriggers + 1
            set handleTriggers[tid] = t
            set triggers[tid] = CreateTrigger()
            
            loop
                exitwhen i == bj_MAX_PLAYER_SLOTS
                set p = Player(i)
                if not players[tid * bj_MAX_PLAYER_SLOTS + GetHandleId(p)] then
                    set players[tid * bj_MAX_PLAYER_SLOTS + GetHandleId(p)] = true
                    call TriggerRegisterPlayerUnitEvent(triggers[tid], p, e, null)
                endif
                set i = i + 1
            endloop
        endif
        
        if cid < 0 then
            set cid = countCondition
            set countCondition = countCondition + 1
            set handleConditions[cid] = c
            call TriggerAddCondition(triggers[tid], f)
        endif
    endfunction
endlibrary
Пример кода как зарегистрировали события 3 раза.
  • 1 триггер
  • 3 условия
  • 1 действия
function Trig_deadUnit_Actions takes nothing returns nothing
    local unit u = GetDyingUnit()
    call BJDebugMsg("Умер юнит-игрок: " + GetPlayerName(GetOwningPlayer(u)))
    set u = null
endfunction

function InitTrig_deadUnit takes nothing returns nothing
    local boolexpr actionDead = Condition(function Trig_deadUnit_Actions)
    
    call OnEventTriggerPlayer(Player(0), EVENT_PLAYER_UNIT_DEATH, actionDead) // Для 1 игрока
    call OnEventTriggerPlayer(Player(1), EVENT_PLAYER_UNIT_DEATH, actionDead) // Для 2 игрока
    call OnEventTriggerPlayer(Player(5), EVENT_PLAYER_UNIT_DEATH, actionDead) // Для 6 игрока
    // Остальные игрока не имеют события смерти
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...