cmd) { case CmdCode::cmd_system_clienttick: # 6901 客户端心跳包 return self::clientTick(); case CmdCode::cmd_system_getsysmessage: # 6902 拉取系统消息 return self::getSysMessage(); default : return Resp::err(ErrCode::cmd_err); } } /** * [6901] 客户端心跳包 */ static function clientTick() { $timespan = now() - ctx()->base()->lastSaveTs; if ($timespan < 300) { # 间隔超过5分钟的不算 if ($timespan < 30) { # 心跳包固定30秒1次 $timespan = 30; } UserProc::updateUserInfo(); } return Resp::ok(); } /** * [6902]获取系统广播消息列表 */ static function getSysMessage() { //客户端参数解析 $ts = req()->paras[0]; # 消息列表有效时间戳 $defaultwaitcont = 60; # 暂时使用60秒作为频率,若是有压力就调大些. 若是没有问题,可以调小些. $itemDisplayTime = 7; # 7秒显示完一条消息 $sysMessage = self::mem_getSysMsg_zset(req()->zoneid, $ts); $count = count($sysMessage) * $itemDisplayTime; # 计算下次取消息的时间 if ($count < $defaultwaitcont) { # 最低刷新时间 $count = $defaultwaitcont; } $ret = array( 'sysMessage' => $sysMessage, 'nextFetchTime' => $count ); return Resp::ok($ret); # 返回信息 } /** * 取数据 * @param int $zoneid * @return array */ private static function mem_getSysMsg_zset($zoneid, $ts) { $ret = gMem()->zrangebyscore(MemKey_GameRun::Game_SysMsgByZone_zset($zoneid), $ts, now(+1)); //todo:目前是在这里手动解码的, 应该移动到CRedisUtil里面去. $arr = ArrayInit(); if ($ret) { foreach ($ret as $msg) { $arr[] = JsonUtil::decode($msg); } } return $arr; } /** * 回写数据 * @param int $zoneid * @param SysMessageModel $value */ private static function mem_addSysMsg_zset($zoneid, $value) { $ts = $value->ts; $key = MemKey_GameRun::Game_SysMsgByZone_zset($zoneid); gMem()->zadd($key, array(json_encode($value) => $ts)); # 插入消息 gMem()->zremrangebyscore($key, 0, $ts - self::SYS_MSG_OUTTS); # 清理过期数据 } /** * 推送系统消息 * @param int $zoneid 分区 * @param SysMessageType $type enum * @param array $datas */ static function pushSysMessage($zoneid, $type, $datas) { $newMsg = new SysMessageModel(array(# # 添加新系统消息 'type' => $type, 'datas' => $datas, 'ts' => now() )); self::mem_addSysMsg_zset($zoneid, $newMsg); # 写入mem } //----下面是广播信息 /** * 得到特定品阶的宝石 * @param type $zoneid * @param type $name * @param type $gemId */ static function GetGem_GreaterOrangeQual($zoneid, $name, $gemId) { $mo = GameConfig::gem_getItem($gemId); if ($mo->qual >= 5) { $color = "紫色"; self::pushSysMessage($zoneid, SysMessageType::GetGem_GreaterOrangeQual, array( $gemId )); } } /** * 得到S级角色 * @param type $zoneid * @param type $name * @param type $weaponTypeId */ static function GetHero_S($zoneid, $name, $heroId) { self::pushSysMessage($zoneid, SysMessageType::GetSpecialQualityWeapon, array( $name, $color, $mo->name )); } }