miduo_client/Assets/ManagedResources/~Lua/Modules/Battle/Logic/Base/BattleEvent.lua

91 lines
2.3 KiB
Lua

BattleEvent={}
BattleEvent.__index = BattleEvent
local listPool = BattleObjectPool.New(function ()
return BattleList.New()
end)
local itemPool = BattleObjectPool.New(function ()
return { func = 0, obj = 0, once = false }
end)
function BattleEvent.New()
local instance = {isTrigger=true}
setmetatable(instance, BattleEvent)
instance.m_listeners = {}
return instance
end
function BattleEvent:AddEvent(sEventName, fListener, pObj, bOnce,_role)
if not self.m_listeners[sEventName] then
self.m_listeners[sEventName] = listPool:Get()
end
local item = itemPool:Get()
item.func = fListener
item.obj = pObj
item.once = bOnce
item.role = _role
self.m_listeners[sEventName]:Add(item)
end
function BattleEvent:SetIsTrigger(_trigger)
self.isTrigger=_trigger
end
function BattleEvent:RemoveEvent(sEventName, fListener, pObj)
if not self.m_listeners[sEventName] then
return
end
local v
for i=1, self.m_listeners[sEventName].size do
v = self.m_listeners[sEventName].buffer[i]
if v.func == fListener and pObj == v.obj then
itemPool:Put(v)
self.m_listeners[sEventName]:Remove(i)
break
end
end
end
function BattleEvent:DispatchEvent(sEventName, ...)
if not self.isTrigger then
return
end
if not self.m_listeners[sEventName] then
return
end
local v
for i=1, self.m_listeners[sEventName].size do
v = self.m_listeners[sEventName].buffer[i]
if v.role==nil or not v.role.isExile then
if not v.obj then
v.func(...)
else
v.func(v.obj, ...)
end
if v.once then
self:RemoveEvent(sEventName, v)
end
if v.role~=nil then
BattleLogManager.Log(
"send event",
"event id==", tostring(sEventName),
"camp", tostring(v.role.camp),
"pos", tostring(v.role.position)
)
end
end
end
end
function BattleEvent:ClearEvent()
for k, v in pairs(self.m_listeners) do
for i=1, v.size do
itemPool:Put(v.buffer[i])
end
v:Clear()
listPool:Put(v)
self.m_listeners[k]=nil
end
end