c1_lua/lua/app/common/event_manager.lua
2023-04-03 10:59:13 +08:00

277 lines
9.8 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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",
}
-- 此方法不能直接在外部调用请使用例如BaseUIBaseModule等封装好的接口
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