Старый код пролежал 2 года в моем блоге но ни кто не узнал о нем. Поэтому решил выложить в ресурс как наработка позволяет не плодить одинаковых событии игроков и юнитов.
Как применить данный код?
- Создаем новый страницу триггер и конвентируем в строку кода. (Очишаем код)
- Копируем код библиотку xeEvent
- Вставляем созданную страницу триггер.
События юнита для всех игроков
call OnEventTrigger(EVENT_PLAYER_UNIT_<Имя события>, [Действия])
call OnEventTrigger(EVENT_PLAYER_UNIT_<Имя события>, [Действия])
События юнита для определеных игроков
call OnEventTriggerPlayer(Player(<Номер индекса игрока>), 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