Browse Source

1. 添加通关榜记录, 以及查询通关帮的接口

gwang 5 năm trước cách đây
mục cha
commit
2fca5026ff

+ 10 - 0
Gameserver/Amfphp/base/CmdCode.php

@@ -554,6 +554,16 @@ class CmdCode {
      * 排行榜 - 查询战斗力榜最大值
      */
     const rank_fpower_getTop1Power = 6604;
+
+    /**
+     * 排行榜 - 通关榜
+     */
+    const rank_passgate_getrank = 6605;
+
+    /**
+     * 排行榜 - 查询玩家通关榜排名
+     */
+    const rank_passgate_userRanking = 6606;
     // 
     // </editor-fold>
     //

+ 26 - 0
Gameserver/Amfphp/base/MemKey_GameRun.php

@@ -139,6 +139,8 @@ class MemKey_GameRun {
     }
 
 // </editor-fold>
+    // <editor-fold defaultstate="collapsed" desc=" 排行榜相关 ">
+    // 
 
     /**
      * 运行时数据 - 战斗力总榜
@@ -148,6 +150,30 @@ class MemKey_GameRun {
         return "gamerun-fightpower-zone$zoneid";
     }
 
+    /**
+     * 运行时数据 - 通关榜
+     * @param type $zoneid
+     * @return type
+     */
+    public static function Game_Rank_passgate_zset($zoneid) {
+        return "gamerun-rank-passgate-zone$zoneid";
+    }
+
+    /**
+     * 运行时数据 - 通关人数统计(达到100W人以后溢出) 
+     *   {
+     *    33=>99, (每一关从0增加到100W,统计100W个人以后溢出)
+     *    32=>87,
+     *   }
+     * @param type $zoneid
+     * @return type
+     */
+    public static function Game_Rank_passgate_count_hash($zoneid) {
+        return "gamerun-rank-passgate-count-zone$zoneid";
+    }
+
+// </editor-fold>
+
     /**
      * 运行时数据 - 每天的登录用户记录-byUId
      * @param type $zoneid

+ 5 - 0
Gameserver/Amfphp/process/FightProc/SweepGatesProc.php

@@ -195,6 +195,7 @@ class SweepGatesProc {
     public static function Arenas_Fight($req) {
         list($gateId, $difficulty, $star, $TeamObj) = $req->paras;              # 提取参数: 挑战的关卡Id, 关卡难度(0,1,2), 几星, 队伍
         my_Assert($gateId > 0, "关卡id非法");
+        echoLine("TTWW");
         $isFirst = false;                                                       # 是否首次通关
         self::recordFight($req, $gateId, $difficulty, $star, $isFirst);         # 更新挑战记录 
         $smGate = GameConfig::gate_getItem($gateId);                            # 关卡配置数据
@@ -207,6 +208,7 @@ class SweepGatesProc {
         $firstExp = self::getProperty_n($smGate, "first_exp", $i);
         $firstHero = self::getProperty_n($smGate, "first_hero", $i);
         $heroExp = self::getProperty_n($smGate, "heroExp", $i);
+        echoLine("TTWW");
         if ($isFirst) {                                                         # 是否首次通关切换奖励内容
             $exp = $firstExp;
             $rwdstr = $firstPassRewardStr;
@@ -226,6 +228,8 @@ class SweepGatesProc {
         UserGameModel::Add_Exp($req->userInfo->game, $exp);                     # 给玩家(指挥官)增加经验
 
         UserProc::updateUserInfo();                                             # 回写玩家数据.
+        #
+        #
 //        var_dump($rewardArr);
         $result = array(
             'store' => $req->userInfo->game->store,
@@ -295,6 +299,7 @@ class SweepGatesProc {
 
         if ($gateId == $diffCult->highest + 1 && $star > 0) {                   # 星级大于等于0,才可以推关
             $diffCult->highest += 1;                                            # 更新最高记录
+            RankProc::recordNewPassGateInfo($req->uid, $gateId);                # 更新通关记录
         }
         $diffCult->latest = $gateId;                                            # 记录上次挑战关卡id
 

+ 1 - 1
Gameserver/Amfphp/process/HeroProc.php

@@ -203,7 +203,7 @@ class HeroProc {
         my_Assert(is_int($costNumber) && $costNumber >= 1, ErrCode::paras_err); # 参数合法性判断
         my_Assert(CommUtil::isPropertyExists($collectHeros, $huid), ErrCode::hero_no); # 玩家拥有此英雄
         $targetHero = new UserHeroModel($collectHeros->$huid);                  # 智能感知辅助
-        my_Assert($targetHero->HeroCanLevelUp());                               # 2. 检查玩家等级是否可以继续升级, Ps. 全局限制 + 指挥官等级限制
+        my_Assert($targetHero->HeroCanLevelUp(), "英雄不可升级");                # 2. 检查玩家等级是否可以继续升级, Ps. 全局限制 + 指挥官等级限制
         $myPacketItems = $user->store->items;                                   # 检查道具的数量,在背包中是否充足
         my_Assert(CommUtil::isPropertyExists($myPacketItems, $costItemId), ErrCode::store_itemnotenough); # 
         my_Assert($myPacketItems->$costItemId >= $costNumber, ErrCode::store_itemnotenough);

+ 77 - 1
Gameserver/Amfphp/process/RankProc.php

@@ -26,11 +26,17 @@ class RankProc {
                 return self::GetRankingOfUserFightPower($req);
             case CmdCode::rank_fpower_getTop1Power:                             # 6604 查询top1战斗力
                 return self::RankFpowerGetTop1Power($req);
+            case CmdCode::rank_passgate_getrank:                                # 6605 查询通关榜榜单信息
+                return self::GetPassgateRank($req);
+
             default:
                 return Resp::err(ErrCode::cmd_err);
         }
     }
 
+//
+// <editor-fold defaultstate="collapsed" desc="  战斗力榜  ">
+
     /**
      * [6601]拉取战斗力榜单数据
      * @param req $req
@@ -96,7 +102,7 @@ class RankProc {
         $ranking = $req->mem->zrevrank($key, $req->uid);                        # 查询排名
         $power = $req->mem->zscore($key, $req->uid);                            # 查询战斗力
         $ret = array(
-            'ranking' => $ranking,
+            'ranking' => $ranking + 1, #                                        # 修正下排名(zset中是从零开始的)
             'power' => $power
         );
         return Resp::ok($ret);                                                  # 返回  
@@ -119,4 +125,74 @@ class RankProc {
         return Resp::ok(array('uid' => $_uid, "power" => $_power));
     }
 
+// </editor-fold>
+//
+
+    /**
+     * [6605] 查询通关榜榜单信息
+     * @param type $req
+     * @return type
+     */
+    static function GetPassgateRank($req) {
+        $RowsPerPage = 10;                                                      # 常量:每页数据条数10条
+        $MaxRankId = 100;                                                       # 常量:最大上榜人数.
+        $pageId = $req->paras[0];                                               # 参数:页码, 从零开始.
+
+        $key = MemKey_GameRun::Game_Rank_passgate_zset($req->zoneid);          # redis key
+        $startid = 0 + $RowsPerPage * ($pageId - 1);                            # 起始id
+        $endId = $startid + $RowsPerPage - 1;                                   # 结束id
+        if ($endId > $MaxRankId) {                                              # 榜单长度 
+            $endId = $MaxRankId;
+        }
+        $uids = $req->mem->zrevrange($key, $startid, $endId, true);             # 取上榜玩家
+        $userInfos = array();                                                   # 玩家信息
+        foreach ($uids as $uid => $fpower) {
+            $uinfo = UserProc::getUserInfo($req->mem, $req->zoneid, $uid);      # 读取玩家信息
+            $userInfos[] = array(#                                              # 拼装玩家信息
+                'uid' => $uid,
+                'name' => my_null_default($uinfo->game->name, ""),
+                'level' => my_null_default($uinfo->game->level, 1),
+                'power' => my_null_default($fpower, 0),
+                'headImg' => my_null_default($uinfo->game->img, "")
+            );
+        }
+        return Resp::ok(array('rankInfo' => $userInfos));                       # 返回值
+    }
+
+    /**
+     * [6603]查询玩家通关榜排名
+     * @param req $req
+     */
+    static function GetRankingOfUserPassGate($req) {
+        $key = MemKey_GameRun::Game_Rank_passgate_zset($req->zoneid);           # redis key
+        $ranking = $req->mem->zrevrank($key, $req->uid);                        # 查询排名
+        $power = $req->mem->zscore($key, $req->uid);                            # 查询通关记录
+        $ret = array(
+            'ranking' => $ranking + 1, #                                        # 修正下排名(zset中是从零开始的)
+            'power' => $power #                                                 # 通关记录
+        );
+        return Resp::ok($ret);                                                  # 返回  
+    }
+
+    // <editor-fold defaultstate="collapsed" desc="  辅助方法  ">
+
+    /**
+     * 常量: 最大玩家人数100W(假设单服人数不会超过这个数字)
+     */
+    const MaxUserCount = 1000000;
+
+    /**
+     * 辅助方法: 添加玩家通关记录
+     * @param type $uid
+     * @param type $gateId
+     */
+    public static function recordNewPassGateInfo($uid, $gateId) {
+        $key_rank = MemKey_GameRun::Game_Rank_passgate_zset(req()->zoneid);      # redis key 通关榜
+        $key_count = MemKey_GameRun::Game_Rank_passgate_count_hash(req()->zoneid); # redis key 通关玩家计数
+        $ranking = req()->mem->hincrby($key_count, $gateId, 1);                 # 添加通关计数
+        $score = $gateId . (self::MaxUserCount - $ranking);                     # 计算通关记录的积分值
+        req()->mem->zadd($key_rank, array("$uid" => $score));                   # 更新玩家的通关记录
+    }
+
+// </editor-fold>
 }

+ 3 - 13
Gameserver/Amfphp/test.php

@@ -9,16 +9,6 @@ include __DIR__ . '/main.php';
 echoLine("phpver:" . PHP_VERSION);
 
 
-$a;
-$b = "wg";
-
-var_dump(my_null_default($a, $b));
-
-var_dump(my_null_default(0, $b));
-$a = 0;
-var_dump(my_null_default($a, $b));
-$a = "";
-var_dump(my_null_default($a, $b));
-$a = [];
-var_dump(my_null_default($a, $b));
-
+$t = gMem()->hget("gate", "31");
+var_dump($t);
+gMem()->zadd("t", array("wg" => $t));