/** * 公共数据管理 * 主要内容: * 1、影响多个模块的服务端推送数据的分发。如:“金豆变化”影响:背包、个人信息、牌局等 * 2、影响多个模块的事件处理。如:“跨天”影响:很多模块 */ let PublicMgr = { /** * 初始化 * * @author Pyden * @date 2019-05-09 */ init () { if (CC_EDITOR) { return; } // 标记 h5user_self_info on_h5user_system_info 状态 // 必须要收到这两个消息后才发送 LOGIN_SUCCESS this.isDoneUserSelfInfo = false; this.isDoneSystemInfo = false; this.initEventListeners(); // 玩家系统信息 20100 cc.game.on('on_user_system_info', this._onPublishUserSystemInfo, this); // 更新玩家信息 20101 // cc.game.on('on_h5user_info', this._onPublishUserInfo, this); }, /** * 初始化事件监听列表 * * @author libo * @date 2019-05-25 */ initEventListeners () { // 事件监听列表 this.eventListeners = {}; for (const eventType of Object.values(JMC.PUBLIC_MSG)) { this.eventListeners[eventType] = []; } }, /** * 监听消息 * * @author libo * @date 2019-05-24 * @param {JMC.PUBLIC_MSG} eventType 事件类型 * @param {JMC.PUBLIC_MSG_ORDER} eventOrder 事件优先级 * @param {Function} listener 监听函数 * @param {Object} target 监听者 * @returns */ on (eventType, eventOrder, listener, target) { if (JMC.PUBLIC_MSG[eventType] === undefined) { // eventType 检查 G.LogUtils.error('[PublicMgr]:未知消息类型 ' + eventType + ',请检查JMC.PUBLIC_MSG'); return; } // 将消息加入列表中 this.eventListeners[eventType].push({ eventOrder: eventOrder, listener: listener, target: target }); // 将消息重新排序 this.eventListeners[eventType].sort((a, b) => { // 升序排序 return a.eventOrder - b.eventOrder; }); }, /** * 发送消息 * * @author libo * @date 2019-05-24 * @param {JMC.PUBLIC_MSG} eventType 事件类型 * @returns */ emit (eventType) { if (JMC.PUBLIC_MSG[eventType] === undefined) { // eventType 检查 G.LogUtils.error('[PublicMgr]:未知消息类型 ' + eventType + ',请检查JMC.PUBLIC_MSG'); return; } for (const event of this.eventListeners[eventType]) { // 触发监听 event.listener.call(event.target); } }, /** * 取消监听 * * @author libo * @date 2019-05-24 * @param {JMC.PUBLIC_MSG} eventType 事件类型 * @param {JMC.PUBLIC_MSG_ORDER} eventOrder 事件优先级 * @param {Object} target 监听者 * @returns */ off (eventType, eventOrder, target) { if (JMC.PUBLIC_MSG[eventType] === undefined) { // eventType 检查 G.LogUtils.error('[PublicMgr]:未知消息类型 ' + eventType + ',请检查JMC.PUBLIC_MSG'); return; } for (let index = 0; index < this.eventListeners[eventType].length; index++) { const event = this.eventListeners[eventType]; if (event.eventOrder == eventOrder && event.target == target) { // order相同 并且 target相同 就移除 this.eventListeners[eventType].splice(index, 1); // splice后避免跳过下一个元素 // index - 1 index -= 1; } } }, /** * 移除目标上的所有注册事件 * * @author libo * @date 2019-05-25 * @param {obejct} target 需要移除事件的对象 */ targetOff (target) { for (const eventListener of this.eventListeners) { // 循环所有的消息类型 for (let index = 0; index < eventListener.length; index++) { // 循环所有的监听者 const event = eventListener[index]; if (event.target == target) { // target相同 就移除 eventListener.splice(index, 1); // splice后避免跳过下一个元素 // index - 1 index -= 1; } } } }, /** * 清理事件 * eventType不指定就清除全部事件 * * @author libo * @date 2019-05-25 * @param {JMC.PUBLIC_MSG || undefined} eventType 事件类型 */ clear (eventType) { if (eventType) { if (JMC.PUBLIC_MSG[eventType] === undefined) { // eventType 检查 G.LogUtils.error('[PublicMgr]:未知消息类型 ' + eventType + ',请检查JMC.PUBLIC_MSG'); return; } // 清理指定类型监听 this.eventListeners[eventType] = []; } else { // 清理全部监听者 // this.eventListeners = {}; for (const eventType of Object.keys(this.eventListeners)) { this.eventListeners[eventType] = []; } } }, // # 玩家系统信息 // on_user_system_info 2000 { // request { // sheildList 0: *integer # 功能ID列表 // } // } _onPublishUserSystemInfo (data) { // 数据_onUserInfo统一处理 this._onUserInfo(data); // 登录完成判断 this.isDoneSystemInfo = true; if (this.isDoneUserSelfInfo) { this.isDoneUserSelfInfo = false; this.isDoneSystemInfo = false; this.emit(JMC.PUBLIC_MSG.LOGIN_SUCCESS); } }, // # 更新玩家信息 // on_h5user_info 20101 { // request { // payInfo 0: DataPayInfo # 支付信息 // currDayStatement 1: DataDayStatement # 当天统计信息 // clusteringInfo 2: DataClustering # 分群信息 // } // } _onPublishUserInfo (data) { // 数据_onUserInfo统一处理 this._onUserInfo(data); }, // 玩家推送信息处理 _onUserInfo (data) { // G.UserMgr.setUserSystemInfo(data); // 发送用户信息更新 // 通知UI刷新 cc.game.emit('e_mgr_update_user_info'); } }; module.exports = PublicMgr;