Browse Source

fixed: 竞技场战斗记录.

gwang 5 years ago
parent
commit
c2672a727c
1 changed files with 45 additions and 25 deletions
  1. 45 25
      Gameserver/Amfphp/process/FightProc/PVPProc.php

+ 45 - 25
Gameserver/Amfphp/process/FightProc/PVPProc.php

@@ -60,7 +60,7 @@ class PVPProc {
         $heros = new \stdClass();
         $curTeamId = $team->curUseTeamID;
         $arr_nil = array();
-        var_dump($team->teamDic->$curTeamId);
+//        var_dump($team->teamDic->$curTeamId);
         foreach ($team->teamDic->$curTeamId->heros as $i => $hid) {
             if ($hid > 0) {
                 $n_hid = $hid - 10000;
@@ -193,7 +193,7 @@ class PVPProc {
         StoreProc::AddMultiItemInStore($req, $citem->goods);                    // 发放道具
         $req->userInfo->game->pvp = $pvp;                                       // 回写数据
         UserProc::updateUserInfo();
-        return Resp::ok();                                                      // 返回
+        return Resp::ok($pvp);                                                  // 返回
     }
 
     /**
@@ -322,7 +322,7 @@ class PVPProc {
         $score = self::_getScore_by_uid($uid, $key);                            # 玩家积分
         $rank = self::_getRank_by_uid($uid, $key);                              # 玩家排名
         $fPower = HeroProc::CalcUserFightPower($zoneid, $uid, $req->userInfo->game); # 玩家总战力?还是当前防守队伍的战斗力?
-        $bHasNewLog = true; // todo: 真正查询是否有新战报
+        $numNewLog = 0; // todo: 真正查询是否有新战报
         $matches = self::getNewMatches($pvp, gMem(), $uid, $zoneid);            # 获得新的匹配对手
 
         if ($pvp->haventReward_season > 0 && $pvp->haventReward_season < $seasonId) { # 尚未发放上赛季奖励
@@ -366,7 +366,7 @@ class PVPProc {
             'fPower' => $fPower, #                                              # 自己的总战力
             'fightTicket' => $pvp->fightTicket, #                               # 自己的挑战票
             'defTeam' => $pvp->defTeam, #                                       # 自己的防守队伍
-            'bHasNewFightLog' => $bHasNewLog, #                                 # 是否有战报刷新
+            'bHasNewFightLog' => $numNewLog, #                                  # 是否有战报刷新
             'matches' => $matches, #                                            # 对手列表
         );
         return Resp::ok($ret);                                                  # 返回
@@ -397,8 +397,10 @@ class PVPProc {
      */
     static function pvp_PK($req) {
         $uid = $req->uid;
-        $target_uid = $req->paras[0];                                           # 对手id
-        $result = $req->paras[1];                                               # 胜负结果 0负,1胜
+        $zoneid = $req->zoneid;
+        $user = $req->userInfo->game;
+        list( $target_uid, $result, $target_name, $target_HeadImg) = $req->paras; # 对手id,胜负结果 0负,1胜
+
         $pvp = $req->userInfo->game->pvp;
 
         if ($pvp->freeFightTickets > 0) {                                       # 有免费挑战票,先扣除免费的
@@ -423,6 +425,12 @@ class PVPProc {
         self::_addScore_by_uid($zoneid, $uid, $R_B - $RB);                      # 更新B的积分 
         $req->userInfo->game->pvp = $pvp;
         UserProc::updateUserInfo();                                             # 回写数据
+        // 写挑战记录
+        $key_mine = MemKey_User::OffensiveLog_zset($zoneid, $uid);              # 我的主动挑战记录
+        self::_Log_PVP_PK_Info($key_mine, $target_uid, $target_name, $target_HeadImg, $result, $R_A - $RA); # 自己的挑战记录
+        $key_target = MemKey_User::DefensiveLog_zset($zoneid, $target_uid);     # 对手的被挑战记录
+        self::_Log_PVP_PK_Info($key_target, $uid, $user->name, $user->img, !$result, $R_B - $RB); # 对手的被挑战记录
+
         $ret = array(#                                                          # 组装返回值
             'freeFightTickets' => $pvp->freeFightTickets, #                     # 自己剩余免费票
             'fightTicket' => $pvp->fightTicket, #                               # 自己剩余挑战票
@@ -472,7 +480,7 @@ class PVPProc {
         $req->userInfo->game->pvp = $pvp;
         UserProc::updateUserInfo();                                             # 回写玩家数据
         $ret = array(
-            'tickets' => $pvp->fightTicket,
+            'fightTicket' => $pvp->fightTicket,
             'costCash' => $costCash,
             'userCash' => $req->userInfo->game->cash
         );
@@ -537,12 +545,29 @@ class PVPProc {
                     'offLog' => $offLog,
                     'defLog' => $defLog
         ));
-        return Resp::ok($ret);
     }
 
 // ---------------- 辅助函数 -----------------------
 // <editor-fold defaultstate="collapsed" desc="    辅助 函数   ">
 
+    /**
+     * 竞技场 - 记录挑战结果 
+     */
+    private static function _Log_PVP_PK_Info($key, $oppUID, $name, $headImg, $win, $score) {
+        $ts = now();                                                            # 记录时间戳
+        gMem()->zadd($key, array(#                                              # 组装被挑战对手信息
+            JsonUtil::encode(array(
+                'uid' => my_null_default($oppUID, "-"), #                       # 对手uid
+                'name' => my_null_default($name, ""), #                         # 对手昵称
+                'headImg' => my_null_default($headImg, ""), #                   # 对手头像    
+                'win' => my_null_default($win, false), #                        # 胜负结果
+                'msg' => "竞技场中没有留言羞辱对手的设定.", #                     # 胜利者留言
+                'scoreInfo' => my_null_default($score, 0), #                    # 积分变动
+                'ts' => $ts, #                                                  # 时间戳 
+            )) => $ts));
+        gMem()->zremrangebyrank($key, self::maxLogCount, -1);                   # 保留50条数据
+    }
+
     /**
      * 修改积分
      * @param int $zoneid
@@ -611,7 +636,7 @@ class PVPProc {
     private static function getNewMatches($pvp, $uid, $zoneid) {
         $seasonID = self::GetCurSeasonID();
         $key = MemKey_GameRun::Game_PVPScoreByZoneSeason_zset($zoneid, $seasonID); # redis key
-        $arr = self::findmatcher($zoneid, $key, $uid, $pvp);                     # 积分榜查找 
+        $arr = self::findmatcher($key, $uid);                                   # 积分榜查找 
         if (count($arr) < self::matchCount) {                                   # 再不行, 准备机器人吧
             CLog::err('PVP刷对手数量不足, 赶快考虑加入机器人.', 'PVP');    // todo: 这里引入gm对手数据,
         }
@@ -621,31 +646,23 @@ class PVPProc {
 
     /**
      * 查找匹配的对手
-     * @param type $zoneid
      * @param type $key
      * @param type $uid
-     * @param UserPVPModel $pvp
-     * @param type $arr
      */
-    private static function findmatcher($zoneid, $key, $uid, &$pvp, &$arr) {
+    private static function findmatcher($key, $uid) {
         // 根据匹配规格获得5个对手即可(1. 排除自己, 2. 最好不要出现已经刷到过的对手)
-        // 低于玩家当前积分 -- 2个 -5%~-20%之间
-        // 与玩家当前积分基本持平 1个, ±5%之间
-        // 高于玩家当前积分 -- 2个 +5%~+40%之间
-        $mem = gMem();
-        $rank = self::_getRank_by_uid($uid, $key);                              # 直接查排名
-        $score = self::_getScore_by_uid($uid, $key);                            # 查积分
-        $zlen = $mem->zlen($key);                                               # 数据长度
-        $i = 0;                                                                 # 计数器
-        $b = false;                                                             # 上下标志位
+        // 低于玩家当前积分 -- 1个 -5%~-20%之间
+        // 与玩家当前积分基本持平 2个, ±5%之间
+        // 高于玩家当前积分 -- 1个 +5%~+40%之间 
+        $score = self::_getScore_by_uid($uid, $key);                            # 查积分 
         // 计算 比自己弱的 上线下线
         $bH = ceil($score * (1 - 0.05));                                        # 低于当前玩家积分5%
         $bL = ceil($score * (1 - 0.2));                                         # 低于当前玩家积分20%
         $aL = ceil($score * (1 + 0.05));                                        # 高于当前玩家积分5%
         $aH = ceil($score * (1 + 0.2));                                         # 高于当前玩家积分20%
-        $bPlayerUIDs = gMem()->zrevrangebyscore($key, $bH, $bL, true, true, 0, 2); # 取低于玩家积分的uids2
-        $mPlayerUIDs = gMem()->zrevrangebyscore($key, $aL, $bH, true, true, 0, 2); # 取玩家相当的uid2个(以防包含玩家自己)
-        $aPlayerUIDs = gMem()->zrevrangebyscore($key, $aH, $aL, true, true, 0, 2); # 取高于玩家的uids2
+        $bPlayerUIDs = gMem()->zrevrangebyscore($key, $bH, $bL, true, true, 0, 1); # 取低于玩家积分的uids1
+        $mPlayerUIDs = gMem()->zrevrangebyscore($key, $aL, $bH, true, true, 0, 3); # 取玩家相当的uid2个(以防包含玩家自己)
+        $aPlayerUIDs = gMem()->zrevrangebyscore($key, $aH, $aL, true, true, 0, 1); # 取高于玩家的uids1
         if (array_key_exists($uid, $mPlayerUIDs)) {                             # 如果积分相近的那一组包含自己
             unset($mPlayerUIDs[$uid]);                                          # 剔除掉
         } else {                                                                # 或者不包含自己
@@ -666,9 +683,12 @@ class PVPProc {
     private static function getRankPlayers($mem, $zoneid, $start, $stop) {
         $key = MemKey_GameRun::Game_PVPScoreByZoneSeason_zset($zoneid, self::GetCurSeasonID());
         $retUidsWithScore = $mem->zrevrange($key, $start, $stop, true);
+
         return self::GetPlayerInfosForPVP($mem, $zoneid, $retUidsWithScore);
     }
 
+//    private  static function get
+
     /**
      * 拉取玩家信息-pvp模块专用信息
      * @param CredisUtil $mem