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