Forráskód Böngészése

系统广播接口

cyzhao 11 hónapja
szülő
commit
d18c37a4fe
2 módosított fájl, 203 hozzáadás és 0 törlés
  1. 18 0
      Gameserver/App/base/CmdCode.php
  2. 185 0
      Gameserver/App/process/SystemProc.php

+ 18 - 0
Gameserver/App/base/CmdCode.php

@@ -359,6 +359,24 @@ class CmdCode {
     const fight_rank_IsExistRankReward = 6817;
 
     // </editor-fold>
+    
+    // <editor-fold defaultstate="collapsed" desc="系统操作码 - 69xx">
+    
+    /**
+     * 6901 心跳
+     */
+    const cmd_system_clienttick = 6901;
+
+
+    /**
+     * 拉取系统广播消息
+     */
+    const cmd_system_getsysmessage = 6902;
+    
+    
+    
+    // </editor-fold>
+    
     // <editor-fold defaultstate="collapsed" desc="    反射方法    ">
 
     /**

+ 185 - 0
Gameserver/App/process/SystemProc.php

@@ -0,0 +1,185 @@
+<?php
+
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+namespace loyalsoft;
+
+/**
+ *   约定好的消息类型
+ */
+class SysMessageType extends Enum {
+    
+    /**
+     * 获取橙色品阶即以上的宝石信息
+     */
+    const GetGem_GreaterOrangeQual = 1;
+
+    /**
+     * 获取S级角色
+     */
+    const GetHero_S = 2;
+}
+
+/**
+ * 系统消息对象
+ */
+class SysMessageModel extends Object_ext {
+
+    /** @var SysMessageType */
+    public $type;
+
+    /** @var array 消息数据 */
+    public $datas;
+
+    /** @var int */
+    public $ts;
+
+}
+
+/**
+ * Description of SystemProc
+ *
+ * @author c'y'zhao
+ */
+class SystemProc {
+
+    /**
+     * 系统消息的过期时间(秒)
+     * @var int
+     */
+    const SYS_MSG_OUTTS = 3600;
+
+    /**
+     * 主逻辑分发
+     * @param type $req
+     * @return type
+     */
+    static function procMain($req) {
+        switch (req()->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
+            ));
+    }
+
+}