|
@@ -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
|