PublicMgr.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. /**
  2. * 公共数据管理
  3. * 主要内容:
  4. * 1、影响多个模块的服务端推送数据的分发。如:“金豆变化”影响:背包、个人信息、牌局等
  5. * 2、影响多个模块的事件处理。如:“跨天”影响:很多模块
  6. */
  7. let PublicMgr = {
  8. /**
  9. * 初始化
  10. *
  11. * @author Pyden
  12. * @date 2019-05-09
  13. */
  14. init () {
  15. if (CC_EDITOR) {
  16. return;
  17. }
  18. // 标记 h5user_self_info on_h5user_system_info 状态
  19. // 必须要收到这两个消息后才发送 LOGIN_SUCCESS
  20. this.isDoneUserSelfInfo = false;
  21. this.isDoneSystemInfo = false;
  22. this.initEventListeners();
  23. // 玩家系统信息 20100
  24. cc.game.on('on_h5user_system_info', this._onPublishUserSystemInfo, this);
  25. // 更新玩家信息 20101
  26. cc.game.on('on_h5user_info', this._onPublishUserInfo, this);
  27. },
  28. /**
  29. * 初始化事件监听列表
  30. *
  31. * @author libo
  32. * @date 2019-05-25
  33. */
  34. initEventListeners () {
  35. // 事件监听列表
  36. this.eventListeners = {};
  37. for (const eventType of Object.values(JMC.PUBLIC_MSG)) {
  38. this.eventListeners[eventType] = [];
  39. }
  40. },
  41. /**
  42. * 监听消息
  43. *
  44. * @author libo
  45. * @date 2019-05-24
  46. * @param {JMC.PUBLIC_MSG} eventType 事件类型
  47. * @param {JMC.PUBLIC_MSG_ORDER} eventOrder 事件优先级
  48. * @param {Function} listener 监听函数
  49. * @param {Object} target 监听者
  50. * @returns
  51. */
  52. on (eventType, eventOrder, listener, target) {
  53. if (JMC.PUBLIC_MSG[eventType] === undefined) {
  54. // eventType 检查
  55. G.LogUtils.error('[PublicMgr]:未知消息类型 ' + eventType + ',请检查JMC.PUBLIC_MSG');
  56. return;
  57. }
  58. // 将消息加入列表中
  59. this.eventListeners[eventType].push({
  60. eventOrder: eventOrder,
  61. listener: listener,
  62. target: target
  63. });
  64. // 将消息重新排序
  65. this.eventListeners[eventType].sort((a, b) => {
  66. // 升序排序
  67. return a.eventOrder - b.eventOrder;
  68. });
  69. },
  70. /**
  71. * 发送消息
  72. *
  73. * @author libo
  74. * @date 2019-05-24
  75. * @param {JMC.PUBLIC_MSG} eventType 事件类型
  76. * @returns
  77. */
  78. emit (eventType) {
  79. if (JMC.PUBLIC_MSG[eventType] === undefined) {
  80. // eventType 检查
  81. G.LogUtils.error('[PublicMgr]:未知消息类型 ' + eventType + ',请检查JMC.PUBLIC_MSG');
  82. return;
  83. }
  84. for (const event of this.eventListeners[eventType]) {
  85. // 触发监听
  86. event.listener.call(event.target);
  87. }
  88. },
  89. /**
  90. * 取消监听
  91. *
  92. * @author libo
  93. * @date 2019-05-24
  94. * @param {JMC.PUBLIC_MSG} eventType 事件类型
  95. * @param {JMC.PUBLIC_MSG_ORDER} eventOrder 事件优先级
  96. * @param {Object} target 监听者
  97. * @returns
  98. */
  99. off (eventType, eventOrder, target) {
  100. if (JMC.PUBLIC_MSG[eventType] === undefined) {
  101. // eventType 检查
  102. G.LogUtils.error('[PublicMgr]:未知消息类型 ' + eventType + ',请检查JMC.PUBLIC_MSG');
  103. return;
  104. }
  105. for (let index = 0; index < this.eventListeners[eventType].length; index++) {
  106. const event = this.eventListeners[eventType];
  107. if (event.eventOrder == eventOrder && event.target == target) {
  108. // order相同 并且 target相同 就移除
  109. this.eventListeners[eventType].splice(index, 1);
  110. // splice后避免跳过下一个元素
  111. // index - 1
  112. index -= 1;
  113. }
  114. }
  115. },
  116. /**
  117. * 移除目标上的所有注册事件
  118. *
  119. * @author libo
  120. * @date 2019-05-25
  121. * @param {obejct} target 需要移除事件的对象
  122. */
  123. targetOff (target) {
  124. for (const eventListener of this.eventListeners) {
  125. // 循环所有的消息类型
  126. for (let index = 0; index < eventListener.length; index++) {
  127. // 循环所有的监听者
  128. const event = eventListener[index];
  129. if (event.target == target) {
  130. // target相同 就移除
  131. eventListener.splice(index, 1);
  132. // splice后避免跳过下一个元素
  133. // index - 1
  134. index -= 1;
  135. }
  136. }
  137. }
  138. },
  139. /**
  140. * 清理事件
  141. * eventType不指定就清除全部事件
  142. *
  143. * @author libo
  144. * @date 2019-05-25
  145. * @param {JMC.PUBLIC_MSG || undefined} eventType 事件类型
  146. */
  147. clear (eventType) {
  148. if (eventType) {
  149. if (JMC.PUBLIC_MSG[eventType] === undefined) {
  150. // eventType 检查
  151. G.LogUtils.error('[PublicMgr]:未知消息类型 ' + eventType + ',请检查JMC.PUBLIC_MSG');
  152. return;
  153. }
  154. // 清理指定类型监听
  155. this.eventListeners[eventType] = [];
  156. } else {
  157. // 清理全部监听者
  158. // this.eventListeners = {};
  159. for (const eventType of Object.keys(this.eventListeners)) {
  160. this.eventListeners[eventType] = [];
  161. }
  162. }
  163. },
  164. // # 玩家系统信息
  165. // on_user_system_info 2000 {
  166. // request {
  167. // sheildList 0: *integer # 功能ID列表
  168. // }
  169. // }
  170. _onPublishUserSystemInfo (data) {
  171. // 数据_onUserInfo统一处理
  172. this._onUserInfo(data);
  173. // 登录完成判断
  174. this.isDoneSystemInfo = true;
  175. if (this.isDoneUserSelfInfo) {
  176. this.isDoneUserSelfInfo = false;
  177. this.isDoneSystemInfo = false;
  178. this.emit(JMC.PUBLIC_MSG.LOGIN_SUCCESS);
  179. }
  180. },
  181. // # 更新玩家信息
  182. // on_h5user_info 20101 {
  183. // request {
  184. // payInfo 0: DataPayInfo # 支付信息
  185. // currDayStatement 1: DataDayStatement # 当天统计信息
  186. // clusteringInfo 2: DataClustering # 分群信息
  187. // }
  188. // }
  189. _onPublishUserInfo (data) {
  190. // 数据_onUserInfo统一处理
  191. this._onUserInfo(data);
  192. },
  193. // 玩家推送信息处理
  194. _onUserInfo (data) {
  195. G.UserMgr.setUserSystemInfo(data);
  196. // 发送用户信息更新
  197. // 通知UI刷新
  198. cc.game.emit('e_mgr_update_user_info');
  199. }
  200. };
  201. module.exports = PublicMgr;