91 lines
2.3 KiB
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 |