109 lines
2.4 KiB
Lua
109 lines
2.4 KiB
Lua
|
|
EventManager = {
|
|||
|
|
Language = 1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
-- 兼容 Lua 5.1 和 5.2+
|
|||
|
|
local unpack = unpack or table.unpack
|
|||
|
|
|
|||
|
|
function EventManager:Init()
|
|||
|
|
EventManager._events = {}
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 注册事件监听器
|
|||
|
|
function EventManager:EventAdd(eventName, callback)
|
|||
|
|
if not self._events[eventName] then
|
|||
|
|
self._events[eventName] = {}
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 防止重复添加
|
|||
|
|
for _, listener in ipairs(self._events[eventName]) do
|
|||
|
|
if listener == callback then
|
|||
|
|
return false
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
table.insert(self._events[eventName], callback)
|
|||
|
|
return true
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 取消注册
|
|||
|
|
function EventManager:EventRemove(eventName, callback)
|
|||
|
|
if not self._events[eventName] then
|
|||
|
|
return false
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
for i, listener in ipairs(self._events[eventName]) do
|
|||
|
|
if listener == callback then
|
|||
|
|
table.remove(self._events[eventName], i)
|
|||
|
|
return true
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
return false
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 触发事件(使用兼容的 unpack)
|
|||
|
|
function EventManager:Call(eventName, ...)
|
|||
|
|
if not self._events[eventName] then
|
|||
|
|
return 0
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local count = 0
|
|||
|
|
-- 使用兼容的 unpack 函数
|
|||
|
|
local listeners = { unpack(self._events[eventName]) }
|
|||
|
|
|
|||
|
|
for _, callback in ipairs(listeners) do
|
|||
|
|
if type(callback) == "function" then
|
|||
|
|
local success, result = pcall(callback, ...)
|
|||
|
|
if not success then
|
|||
|
|
print("事件回调错误:", result)
|
|||
|
|
end
|
|||
|
|
count = count + 1
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
return count
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 替代方案:使用更安全的方式(推荐)
|
|||
|
|
function EventManager:CallSafe(eventName, ...)
|
|||
|
|
if not self._events[eventName] then
|
|||
|
|
return 0
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local count = 0
|
|||
|
|
-- 安全复制数组
|
|||
|
|
local listeners = {}
|
|||
|
|
for i, v in ipairs(self._events[eventName]) do
|
|||
|
|
listeners[i] = v
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
for _, callback in ipairs(listeners) do
|
|||
|
|
if type(callback) == "function" then
|
|||
|
|
local success, result = pcall(callback, ...)
|
|||
|
|
if not success then
|
|||
|
|
print("事件回调错误:", result)
|
|||
|
|
end
|
|||
|
|
count = count + 1
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
return count
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 清空事件
|
|||
|
|
function EventManager:clear(eventName)
|
|||
|
|
if eventName then
|
|||
|
|
self._events[eventName] = nil
|
|||
|
|
else
|
|||
|
|
self._events = {}
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
-- 获取监听器数量
|
|||
|
|
function EventManager:getListenerCount(eventName)
|
|||
|
|
if not self._events[eventName] then
|
|||
|
|
return 0
|
|||
|
|
end
|
|||
|
|
return #self._events[eventName]
|
|||
|
|
end
|