--触发事件处理模块 --需要保证订阅在前, 触发在后 local TriggerDefine = require("trigger.TriggerDefine") --订阅列表 local moniterTbl = {} --检测触发事件是否正确 local function checkTrigger(arg) local errTag = nil if type(arg) == "table" then for _, tag in ipairs(arg) do if not TriggerDefine.TRIGGERADDTB[tag] and not TriggerDefine.TRIGGERUPDATETB[tag] then errTag = tag break end end else if not TriggerDefine.TRIGGERADDTB[arg] and not TriggerDefine.TRIGGERUPDATETB[arg] then errTag = arg end end if errTag then assert(false, string.format("注册事件不存在, tag = %s", errTag)) end return true end --注册订阅 function RegisterMoniter(triggerArr, cbFunc) checkTrigger(triggerArr) local handler = #moniterTbl+1 moniterTbl[handler] = { triggerArr = triggerArr, cbFunc = cbFunc, } return handler end --移除订阅 function RemoveMoniter(handler) if not handler then return end table.remove(moniterTbl, handler) end --广播 function Broadcast(human, triggerTag, val, isAdd) for tag, v in ipairs(moniterTbl) do if table.find(v.triggerArr, triggerTag) then local f = v.cbFunc local res = pcall(f, human, triggerTag, val, isAdd) if not res then print(string.format("广播失败, handler = %s", tag)) end end end end --触发事件 function Trigger(human, triggerTag, val) local isAdd = false if TriggerDefine.TRIGGERADDTB[triggerTag] then isAdd = true end if not isAdd then if not TriggerDefine.TRIGGERUPDATETB[triggerTag] then assert(false, string.format("触发事件不存在, tag = %s", triggerTag)) end end Broadcast(human, triggerTag, val, isAdd) end