SystemProc.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <?php
  2. /*
  3. * To change this license header, choose License Headers in Project Properties.
  4. * To change this template file, choose Tools | Templates
  5. * and open the template in the editor.
  6. */
  7. namespace loyalsoft;
  8. /**
  9. * 约定好的消息类型
  10. */
  11. class SysMessageType extends Enum {
  12. /**
  13. * 获取橙色品阶即以上的宝石信息
  14. */
  15. const GetGem_GreaterOrangeQual = 1;
  16. /**
  17. * 获取S级角色
  18. */
  19. const GetHero_S = 2;
  20. }
  21. /**
  22. * 系统消息对象
  23. */
  24. class SysMessageModel extends Object_ext {
  25. /** @var SysMessageType */
  26. public $type;
  27. /** @var array 消息数据 */
  28. public $datas;
  29. /** @var int */
  30. public $ts;
  31. }
  32. /**
  33. * Description of SystemProc
  34. *
  35. * @author c'y'zhao
  36. */
  37. class SystemProc {
  38. /**
  39. * 系统消息的过期时间(秒)
  40. * @var int
  41. */
  42. const SYS_MSG_OUTTS = 3600;
  43. /**
  44. * 主逻辑分发
  45. * @param type $req
  46. * @return type
  47. */
  48. static function procMain($req) {
  49. switch (req()->cmd) {
  50. case CmdCode::cmd_system_clienttick: # 6901 客户端心跳包
  51. return self::clientTick();
  52. case CmdCode::cmd_system_getsysmessage: # 6902 拉取系统消息
  53. return self::getSysMessage();
  54. default :
  55. return Resp::err(ErrCode::cmd_err);
  56. }
  57. }
  58. /**
  59. * [6901] 客户端心跳包
  60. */
  61. static function clientTick() {
  62. $timespan = now() - ctx()->base()->lastSaveTs;
  63. if ($timespan < 300) { # 间隔超过5分钟的不算
  64. if ($timespan < 30) { # 心跳包固定30秒1次
  65. $timespan = 30;
  66. }
  67. UserProc::updateUserInfo();
  68. }
  69. return Resp::ok();
  70. }
  71. /**
  72. * [6902]获取系统广播消息列表
  73. */
  74. static function getSysMessage() {
  75. //客户端参数解析
  76. $ts = req()->paras[0]; # 消息列表有效时间戳
  77. $defaultwaitcont = 60; # 暂时使用60秒作为频率,若是有压力就调大些. 若是没有问题,可以调小些.
  78. $itemDisplayTime = 7; # 7秒显示完一条消息
  79. $sysMessage = self::mem_getSysMsg_zset(req()->zoneid, $ts);
  80. $count = count($sysMessage) * $itemDisplayTime; # 计算下次取消息的时间
  81. if ($count < $defaultwaitcont) { # 最低刷新时间
  82. $count = $defaultwaitcont;
  83. }
  84. $ret = array(
  85. 'sysMessage' => $sysMessage,
  86. 'nextFetchTime' => $count
  87. );
  88. return Resp::ok($ret); # 返回信息
  89. }
  90. /**
  91. * 取数据
  92. * @param int $zoneid
  93. * @return array
  94. */
  95. private static function mem_getSysMsg_zset($zoneid, $ts) {
  96. $ret = gMem()->zrangebyscore(MemKey_GameRun::Game_SysMsgByZone_zset($zoneid), $ts, now(+1));
  97. //todo:目前是在这里手动解码的, 应该移动到CRedisUtil里面去.
  98. $arr = ArrayInit();
  99. if ($ret) {
  100. foreach ($ret as $msg) {
  101. $arr[] = JsonUtil::decode($msg);
  102. }
  103. }
  104. return $arr;
  105. }
  106. /**
  107. * 回写数据
  108. * @param int $zoneid
  109. * @param SysMessageModel $value
  110. */
  111. private static function mem_addSysMsg_zset($zoneid, $value) {
  112. $ts = $value->ts;
  113. $key = MemKey_GameRun::Game_SysMsgByZone_zset($zoneid);
  114. gMem()->zadd($key, array(json_encode($value) => $ts)); # 插入消息
  115. gMem()->zremrangebyscore($key, 0, $ts - self::SYS_MSG_OUTTS); # 清理过期数据
  116. }
  117. /**
  118. * 推送系统消息
  119. * @param int $zoneid 分区
  120. * @param SysMessageType $type enum
  121. * @param array $datas
  122. */
  123. static function pushSysMessage($zoneid, $type, $datas) {
  124. $newMsg = new SysMessageModel(array(# # 添加新系统消息
  125. 'type' => $type,
  126. 'datas' => $datas,
  127. 'ts' => now()
  128. ));
  129. self::mem_addSysMsg_zset($zoneid, $newMsg); # 写入mem
  130. }
  131. //----下面是广播信息
  132. /**
  133. * 得到特定品阶的宝石
  134. * @param type $zoneid
  135. * @param type $name
  136. * @param type $gemId
  137. */
  138. static function GetGem_GreaterOrangeQual($zoneid, $name, $gemId) {
  139. $mo = GameConfig::gem_getItem($gemId);
  140. if ($mo->qual >= 5) {
  141. $color = "紫色";
  142. self::pushSysMessage($zoneid, SysMessageType::GetGem_GreaterOrangeQual, array(
  143. $gemId
  144. ));
  145. }
  146. }
  147. /**
  148. * 得到S级角色
  149. * @param type $zoneid
  150. * @param type $name
  151. * @param type $weaponTypeId
  152. */
  153. static function GetHero_S($zoneid, $name, $heroId) {
  154. self::pushSysMessage($zoneid, SysMessageType::GetSpecialQualityWeapon, array(
  155. $name, $color, $mo->name
  156. ));
  157. }
  158. }