277 lines
9.8 KiB
Lua
277 lines
9.8 KiB
Lua
local EventManager = {
|
||
listeners = {},
|
||
listenerIndex = 0,
|
||
dispatchCount = 0,
|
||
waitRemoveMap = {},
|
||
waitAddMap = {},
|
||
}
|
||
|
||
EventManager.CUSTOM_EVENT = {
|
||
-- MAIN_SOCKET_MESSAGE = "MAIN_SOCKET_MESSAGE", -- 游戏主链接所有消息
|
||
-- UI_LOADING_PERCENT = "UI_LOADING_PERCENT", -- loading进度
|
||
ON_BATTLE_START = "ON_BATTLE_START", -- 战斗开始
|
||
BATTLE_OPERATION_FINISH = "BATTLE_OPERATION_FINISH", -- 战斗中操作完毕
|
||
BATTLE_OPERATION_START = "BATTLE_OPERATION_START", -- 战斗中当玩家开始操作时
|
||
BATTLE_END = "BATTLE_END", -- 战斗结束
|
||
UI_SHOW_COMPLETE = "UI_SHOW_COMPLETE", -- UI打开完毕
|
||
UI_CUSTOM_ANIMATION_COMPLETE = "UI_CUSTOM_ANIMATION_COMPLETE", -- UI自定义动画完毕
|
||
UI_CLOSE = "UI_CLOSE", -- UI关闭
|
||
-- I18N_CHANGE_LANGUAGE = "I18N_CHANGE_LANGUAGE", -- 切换语言
|
||
UPGRADE_EQUIP = "UPGRADE_EQUIP", -- 升级装备
|
||
STAGE_TEAM_UP_FORMATION = "STAGE_TEAM_UP_FORMATION", -- 关卡上阵英雄
|
||
-- SELL_EQUIP = "SELL_EQUIP", -- 战斗结算界面出售装备
|
||
LOGIN_REQ_SUCCESS = "LOGIN_REQ_SUCCESS", -- 登录请求成功,准备进入游戏
|
||
HERO_WEAR_EQUIP = "HERO_WEAR_EQUIP", -- 英雄穿上一件装备
|
||
GET_MAIN_TASK_REWARD = "GET_MAIN_TASK_REWARD", -- 主线任务奖励领取成功
|
||
-- MARKET_HAD_REFRESH = "MARKET_HAD_REFRESH", -- 市集已刷新
|
||
-- SHOW_MAIN_TASK_WEAK_FINGER = "SHOW_MAIN_TASK_WEAK_FINGER", -- 显示主线任务的弱引导手指
|
||
-- CLOSE_LV_UP_UI_WITHOUT_GOTO = "CLOSE_LV_UP_UI_WITHOUT_GOTO", -- 正常关闭升级界面,没有触发前往
|
||
-- BIND_SDK_SUCCESS = "BIND_SDK_SUCCESS", -- 绑定SDK成功
|
||
ON_TUTORIAL_BATTLE_TEAM_ENTER = "ON_TUTORIAL_BATTLE_TEAM_ENTER", -- 假战斗引导专用,当队伍入场完后
|
||
ON_BATTLE_INIT_OVER = "ON_BATTLE_INIT_OVER", -- 战斗初始化完成
|
||
-- EXPEDITION_SHOW_DOUBLE_CHECK_UI = "EXPEDITION_SHOW_DOUBLE_CHECK_UI", -- 远征展示二次确认框
|
||
-- EXPEDITION_RESET_HEAD_POS = "EXPEDITION_RESET_HEAD_POS", -- 远征重置头像位置
|
||
-- EXPEDITION_SHOW_BUFF_VFX = "EXPEDITION_SHOW_BUFF_VFX", -- 远征显示buff特效动画
|
||
MAIN_UI_CHECK_POP = "MAIN_UI_CHECK_POP", -- 主界面检查弹出界面
|
||
-- CHANGE_WELCOME_COMP = "CHANGE_WELCOME_COMP", -- 切换新手活动comp
|
||
|
||
-- 公会成员已达上限
|
||
-- GUILD_MEMBER_MAX = "GUILD_MEMBER_MAX", -- 公会成员已达上限
|
||
-- 装备上锁
|
||
-- EQUIP_LOCK = "EQUIP_LOCK", -- 装备上锁
|
||
|
||
-- 割草
|
||
CHANGE_MAIN_CITY_PAGE = "CHANGE_MAIN_CITY_PAGE", -- 切换主城页签
|
||
-- CHANGE_MAIN_CITY_PAGE_VIT = "CHANGE_MAIN_CITY_PAGE_VIT", -- 切换主城页签
|
||
-- 英雄降临
|
||
-- CHANGE_NEW_HERO_COMP = "CHANGE_NEW_HERO_COMP", -- 切换英雄活动COMP
|
||
-- 转盘
|
||
-- CHANGE_TURNTABLE_COMP = "CHANGE_TURNTABLE_COMP", -- 切换转盘活动COMP
|
||
-- 守护活动
|
||
-- CHANGE_GUARD_COMP = "CHANGE_GUARD_COMP", -- 切换守护活动COMP
|
||
-- EQUIP_LV_UP = "EQUIP_LV_UP", -- 装备升级成功
|
||
-- EQUIP_RESOLVE = "EQUIP_RESOLVE", -- 装备重置成功
|
||
-- EQUIP_MERGE = "EQUIP_MERGE", -- 装备合成成功
|
||
-- EQUIP_QUICK_MERGE = "EQUIP_QUICK_MERGE", -- 装备快速合成成功
|
||
-- EQUIP_REBACK = "EQUIP_REBACK", -- 装备回退成功
|
||
-- EQUIP_REFINE = "EQUIP_REFINE", -- 装备精炼成功
|
||
-- HERO_UNLOCK = "HERO_UNLOCK", -- 英雄解锁
|
||
-- HERO_STAR_UP = "HERO_STAR_UP", -- 英雄升星成功
|
||
-- HERO_LV_UP = "HERO_LV_UP", -- 英雄升级成功
|
||
-- TALENT_UP = "TALENT_UP", -- 天赋升级
|
||
-- BATTLE_FINISH = "BATTLE_FINISH", -- 战斗结束
|
||
-- CHAPTER_BOX_REWARD = "CHAPTER_BOX_REWARD", -- 领取宝箱奖励
|
||
-- UPDATE_DATA = "UPDATE_DATA", -- 更新数据
|
||
SUMMON_FINISH = "SUMMON_FINISH", -- 抽卡结束
|
||
-- REVIVE_SUCC = "REVIVE_SUCC", -- 战斗复活成功
|
||
-- CHANGE_ACTIVITY_NORMAL_COMP = "CHANGE_ACTIVITY_NORMAL_COMP", -- 切换活动COMP
|
||
|
||
-- NAME_REPEAT = "NAME_REPEAT", -- 重名
|
||
-- BUY_MONTH_CARD = "BUY_MONTH_CARD", -- 购买月卡
|
||
-- PLAY_FLY_ANI = "PLAY_FLY_ANI",
|
||
-- NEWSUMMON_OVER = "NEWSUMMON_OVER",
|
||
-- WISHSUMMON_OVER = "WISHSUMMON_OVER",
|
||
-- JEWELRY_MERGE_OVER = "JEWELRY_MERGE_OVER",
|
||
-- JEWELRY_AUTO_MERGE_OVER = "JEWELRY_AUTO_MERGE_OVER",
|
||
-- CDKEY_FINISH = "CDKEY_FINISH",
|
||
-- BLACK_SUMMON_OVER = "BLACK_SUMMON_OVER",
|
||
-- ON_CLAIMED_ASK_REWARD = "ON_CLAIMED_ASK_REWARD",
|
||
-- ON_CLAIMED_GUESS_REWARD = "ON_CLAIMED_GUESS_REWARD",
|
||
-- ON_ASKING_CONFIRM = "ON_ASKING_CONFIRM",
|
||
|
||
-- PLAY_DRAGON_BUILD_ANIMATION = "PLAY_DRAGON_BUILD_ANIMATION", -- 邪龙动画
|
||
|
||
-- SPRING_DUEL_CROSS_DAY = "SPRING_DUEL_CROSS_DAY",
|
||
-- SPRING_DUEL_REQUEST_RANK_LIST = "SPRING_DUEL_REQUEST_RANK_LIST",
|
||
|
||
-- ON_VIT_CHANGED = "ON_VIT_CHANGED", -- 体力变更时
|
||
|
||
-- B5新增
|
||
BATTLE_HERO_USE_ACTIVE_SKILL = "BATTLE_HERO_USE_ACTIVE_SKILL",
|
||
BATTLE_HERO_REFRESH_SKILL = "BATTLE_HERO_REFRESH_SKILL",
|
||
BATTLE_CHAPTER_CHANGE = "BATTLE_CHAPTER_CHANGE",
|
||
BATTLE_SHOW_CHAPTER_BLACK_UI = "BATTLE_SHOW_CHAPTER_BLACK_UI",
|
||
BATTLE_CLOSE_CHAPTER_BLACK_UI = "BATTLE_CLOSE_CHAPTER_BLACK_UI",
|
||
BATTLE_SHOW_TOAST = "BATTLE_SHOW_TOAST",
|
||
BATTLE_BLACK_UI_CLOSE = "BATTLE_BLACK_UI_CLOSE",
|
||
BATTLE_READY_ENTER_DUNGEON = "BATTLE_READY_ENTER_DUNGEON",
|
||
BATTLE_REVIVE = "BATTLE_REVIVE",
|
||
BATTLE_REVIVE_RSP = "BATTLE_REVIVE_RSP",
|
||
BATTLE_ADD_PASSIVE_SKILL = "BATTLE_ADD_PASSIVE_SKILL",
|
||
BATTLE_CHANGE_PAS_SKILL = "BATTLE_CHANGE_PAS_SKILL",
|
||
PLAYER_RENAME = "PLAYER_RENAME",
|
||
GET_ANY_KEY_DOWN = "GET_ANY_KEY_DOWN",
|
||
NAME_REPEAT = "NAME_REPEAT",
|
||
TRAIN_REBORN = "TRAIN_REBORN", -- 重生
|
||
TRAIN_PASS_UP = "TRAIN_PASS_UP", -- 速通
|
||
|
||
CLOSE_BATTLE_FAIL = "CLOSE_BATTLE_FAIL",
|
||
SIGN_IN_SUCCESS = "SIGN_IN_SUCCESS", -- 签到成功
|
||
CURRENCY_BAR_FLY = "CURRENCY_BAR_FLY",
|
||
CURRENCY_BAR_FLY_OVER = "CURRENCY_BAR_FLY_OVER",
|
||
-- 挂机广告
|
||
IDLE_DROP_AD_GET = "IDLE_DROP_AD_GET",
|
||
ATK_TRAIN_LEVEL_UP = "ATK_TRAIN_LEVEL_UP",
|
||
-- 装备变化
|
||
WEAR_WEAPON_CHANGE = "WEAR_WEAPON_CHANGE",
|
||
-- 速通结束
|
||
QUICK_PASS_FINISH = "QUICK_PASS_FINISH",
|
||
TUTORIAL_TASK_REWARD = "TUTORIAL_TASK_REWARD",
|
||
ATK_TRAIN_TUTORIAL_OVER = "ATK_TRAIN_TUTORIAL_OVER",
|
||
TUTORIAL_TASK_STOP = "TUTORIAL_TASK_STOP",
|
||
}
|
||
|
||
-- 此方法不能直接在外部调用,请使用例如BaseUI,BaseModule等封装好的接口
|
||
function EventManager:addEventListener(name, func, priority)
|
||
if self.listeners[name] == nil then
|
||
self.listeners[name] = {}
|
||
end
|
||
local tag = self.listenerIndex + 1
|
||
self.listenerIndex = tag
|
||
priority = priority or 0
|
||
if self.dispatchCount > 0 then
|
||
if not self.waitAddMap[name] then
|
||
self.waitAddMap[name] = {}
|
||
end
|
||
table.insert(self.waitAddMap[name], {func, tag, priority})
|
||
else
|
||
local insert = false
|
||
if priority > 0 then
|
||
for k, v in ipairs(self.listeners[name]) do
|
||
if priority <= v[3] then
|
||
insert = true
|
||
table.insert(self.listeners[name], k, {func, tag, priority})
|
||
break
|
||
end
|
||
end
|
||
end
|
||
if not insert then
|
||
table.insert(self.listeners[name], {func, tag, priority})
|
||
end
|
||
end
|
||
return tag
|
||
end
|
||
|
||
function EventManager:removeEventListener(name, tag)
|
||
if self.listeners[name] then
|
||
for k, v in ipairs(self.listeners[name]) do
|
||
if v[2] == tag then
|
||
if self.dispatchCount > 0 then
|
||
v[4] = 1
|
||
self.waitRemoveMap[name] = 1
|
||
else
|
||
table.remove(self.listeners[name], k)
|
||
end
|
||
break
|
||
end
|
||
end
|
||
end
|
||
|
||
if self.waitAddMap[name] then
|
||
local listenerList = self.waitAddMap[name]
|
||
for index, listener in ipairs(listenerList) do
|
||
if listener[2] == tag then
|
||
table.remove(listenerList, index)
|
||
break
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
function EventManager:removeEventListenersByEvent(name)
|
||
self.listeners[name] = nil
|
||
self.waitAddMap[name] = nil
|
||
self.waitRemoveMap[name] = nil
|
||
end
|
||
|
||
function EventManager:dispatchEvent(name, ...)
|
||
self.dispatchCount = self.dispatchCount + 1
|
||
local listenerList = self.listeners[name]
|
||
if listenerList then
|
||
local continue = nil
|
||
for k, v in ipairs(listenerList) do
|
||
if v[4] == nil then
|
||
continue = v[1](...)
|
||
if continue == false then
|
||
break
|
||
end
|
||
end
|
||
end
|
||
end
|
||
self.dispatchCount = self.dispatchCount - 1
|
||
|
||
if self.dispatchCount > 0 then
|
||
return
|
||
end
|
||
|
||
-- 处理等待移除
|
||
for removeName, v in pairs(self.waitRemoveMap) do
|
||
local listenerList = self.listeners[removeName]
|
||
if listenerList then
|
||
local count = #listenerList
|
||
for i = count, 1, -1 do
|
||
if listenerList[i] and listenerList[i][4] then
|
||
table.remove(listenerList, i)
|
||
end
|
||
end
|
||
end
|
||
self.waitRemoveMap[removeName] = nil
|
||
end
|
||
|
||
-- 处理等待添加
|
||
for addName, v in pairs(self.waitAddMap) do
|
||
for i = 1, #v do
|
||
local insert = false
|
||
local listener = table.remove(v)
|
||
local listenerPriority = listener[3]
|
||
if listenerPriority > 0 then
|
||
for k, existListener in ipairs(self.listeners[addName]) do
|
||
if listenerPriority <= existListener[3] then
|
||
insert = true
|
||
table.insert(self.listeners[addName], k, listener)
|
||
break
|
||
end
|
||
end
|
||
end
|
||
if not insert then
|
||
table.insert(self.listeners[addName], listener)
|
||
end
|
||
end
|
||
self.waitAddMap[addName] = nil
|
||
end
|
||
end
|
||
|
||
function EventManager:removeAllEventListeners()
|
||
self.listeners = {}
|
||
self.waitRemoveMap = {}
|
||
self.waitAddMap = {}
|
||
self.listenerIndex = 0
|
||
end
|
||
|
||
function EventManager:clear()
|
||
self:removeAllEventListeners()
|
||
end
|
||
|
||
if NOT_PUBLISH then
|
||
function EventManager:_checkDebugAddEventListenerFuncMap()
|
||
if self._debugAddEventListenerFuncMap == nil then
|
||
self._debugAddEventListenerFuncMap = {
|
||
[BaseUI.addEventListener] = true,
|
||
[BaseScene.addEventListener] = true,
|
||
[BaseModule.addEventListener] = true,
|
||
}
|
||
end
|
||
end
|
||
|
||
EventManager._releaseAddEventListener = EventManager.addEventListener
|
||
function EventManager:addEventListener(...)
|
||
self:_checkDebugAddEventListenerFuncMap()
|
||
local currFunc = debug.getinfo(2, "f").func
|
||
if self._debugAddEventListenerFuncMap[currFunc] == nil then
|
||
Logger.logFatal("you can not call EventManager:addEventListener directly")
|
||
end
|
||
return self:_releaseAddEventListener(...)
|
||
end
|
||
end
|
||
|
||
return EventManager |