Эх сурвалжийг харах

扩展目前所有任务类型的处理逻辑

gwang 4 жил өмнө
parent
commit
694524d1a2

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

@@ -249,6 +249,11 @@ class CmdCode {
      * [6202] 任务 - 领取任务奖励
      */
     const cmd_task_getReward = 6202;
+
+    /**
+     * [6203]普通任务 - 设置关注任务
+     */
+    const cmd_Task_setAttentionTask = 6203;
     // </editor-fold>
     //
     // <editor-fold defaultstate="collapsed" desc="英雄操作码 - 63xx">

+ 5 - 0
Gameserver/Amfphp/base/ErrCode.php

@@ -506,6 +506,11 @@ class ErrCode {
      * 任务进度尚未完成
      */
     const task_progress_not_complete = 3502;
+
+    /**
+     * 任务奖励已经领取
+     */
+    const task_reward_geted = 3503;
 // </editor-fold>
 // 
     // <editor-fold defaultstate="collapsed" desc="    交互操作 36xx    ">

+ 3 - 2
Gameserver/Amfphp/model/User/UserGameModel.php

@@ -346,7 +346,7 @@ class UserGameModel extends HashSaver {
         my_Assert($amt >= 0, "amt值为负");
         $cfgLVs = GameConfig::playerlevel();
         $user->xp += $amt;
-        $curLevel = $user->level;
+        $initLevel = $curLevel = $user->level;
         $nextLevel = $curLevel + 1;
         while ($user->xp >= $cfgLVs->$nextLevel->xp_need) {                     # 超过升级所需经验
             if ($user->level < glc()->Game_MaxPlayerLevel) {                    # 如果未到达最大等级
@@ -363,8 +363,9 @@ class UserGameModel extends HashSaver {
                 break;
             }
         }
-        if ($user->level != $curLevel) {                                        # 插入玩家升级的系统消息
+        if ($user->level != $initLevel) {                                       # 插入玩家升级的系统消息
             SystemProc::UserLevelUp(req()->zoneid, $user, $user->level);
+            TaskProc::OnUserLevelUp($user->level);                              # 通知任务模块,这里应该有事件模块
         }
     }
 

+ 5 - 0
Gameserver/Amfphp/model/User/UserPVPModel.php

@@ -67,6 +67,11 @@ class UserPVPModel extends Object_ext {
      */
     public $haventReward_season = 0;
 
+    /**
+     * @var int 总胜利场次
+     */
+    public $totalWin = 0;
+
     public function refreshDailyData() {
         // 刷新免费挑战次数
         if (tsDay($this->fightTicketRefreshTs) <= tsDay()) {                    # 刷新时间<=今天,该刷新了

+ 14 - 2
Gameserver/Amfphp/model/User/UserTaskInfo.php

@@ -44,6 +44,11 @@ class UserTaskInfo {
         $nodeCfg = GameConfig::task_node_getItem($this->curTaskNode);
         $taskArr = explode(',', $nodeCfg->taskList);
         $this->curTaskId = $taskArr[0];
+        foreach ($taskArr as $tid) {
+            $tmo = GameConfig::task_getItem($tid);
+            my_Assert(null != $tmo, ErrCode::err_const_no);
+            $this->taskListPlot->$tid = new TaskInfo();
+        }
     }
 
 }
@@ -56,11 +61,18 @@ class TaskInfo {
     /**
      * @var float 任务进度(浮点值好了>=1代表完成)
      */
-    public $progress;
+    public $progress = 0;
+
+    /**
+     * 用于将进度更新的数据待会给客户端,比如当前PVP积分之类的,在客户端是无法即时拿到数据的
+     * @var object
+     */
+    public $tag1;
+    public $tag2;
 
     /**
      * @var int 奖励是否已领取 0/1
      */
-    public $rewardGeted;
+    public $rewardGeted = 0;
 
 }

+ 9 - 1
Gameserver/Amfphp/process/FightProc/PVPProc.php

@@ -117,6 +117,7 @@ class PVPProc {
         $req->mem->zremrangebyrank($key_target, self::maxLogCount, -1);         # 保留50条数据
         // 暂无发放奖励流程
         // 更新每日任务
+        TaskProc::OnPvPWinN($num);
         // 返回
         return Resp::ok();                                                      # 返回成功
     }
@@ -332,7 +333,7 @@ class PVPProc {
         $uid = $req->uid;
         $zoneid = $req->zoneid;
         $user = $req->userInfo->game;
-        list( $target_uid, $result, $target_name, $target_HeadImg) = $req->paras; # 对手id,胜负结果 0负,1胜
+        list($target_uid, $result, $target_name, $target_HeadImg) = $req->paras; # 对手id,胜负结果 0负,1胜
 
         $pvp = $req->userInfo->game->pvp;
 
@@ -342,6 +343,7 @@ class PVPProc {
             my_Assert($pvp->fightTicket > 0, ErrCode::pvp_no_tickets);          # 防御: 挑战票不足
             $pvp->fightTicket -= 1;                                             # 扣除挑战票
         }
+
         $season = self::GetCurSeasonID();                                       # 当前赛季
         $key = MemKey_GameRun::Game_PVPScoreByZoneSeason_zset($zoneid, $season); # redis key
         $RA = self::_getScore_by_uid($uid, $key);                               # A的积分
@@ -361,7 +363,13 @@ class PVPProc {
             self::_addScore_by_uid($zoneid, $target_uid, $B_Change);            # 更新B的积分 
         }
         $myNewRank = self::_getRank_by_uid($uid, $key);                         # 查询战后排名
+        if ($result) {
+            $pvp->totalWin += 1;
+            TaskProc::OnPvPWinN($pvp->totalWin);
+            TaskProc::OnPvPScoreN($R_A);
+        }
         $req->userInfo->game->pvp = $pvp;
+
         UserProc::updateUserInfo();                                             # 回写数据
         // 写挑战记录
         $key_mine = MemKey_User::PVP_OffensiveLog_zset($zoneid, $uid);          # 我的主动挑战记录

+ 3 - 4
Gameserver/Amfphp/process/FightProc/SweepGatesProc.php

@@ -115,14 +115,13 @@ class SweepGatesProc {
             }
         }
 //        echoLine("wwTT");
-        var_dump($rewardStr);
+//        var_dump($rewardStr);
         $rewardArr = self::SetRewards($req, $rewardStr);                           # 发通关奖励 
         UserGameModel::Add_Gold($req->userInfo->game, $gold);                   # 发金币
         UserGameModel::Add_Exp($req->userInfo->game, $exp);                     # 给玩家(指挥官)增加经验
-
-        UserProc::updateUserInfo();                                             # 回写玩家数据.
-        #
+//        UserProc::updateUserInfo();                                             # 回写玩家数据.
         #
+        TaskProc::OnPassGateN($gateId, $difficulty);
 //        var_dump($rewardArr);
         $result = array(
             'store' => $req->userInfo->game->store,

+ 7 - 0
Gameserver/Amfphp/process/HeroProc.php

@@ -95,6 +95,7 @@ class HeroProc {
         $targetHero->subSkills = $targteHeroSkills;
         $cHeros->$huid = $targetHero;                                           # 回存Hero对象
         UserProc::updateUserInfo();                                             # 回写数据
+        TaskProc::OnHeroUnlocSkill($targetHero->typeId, $subSkillId);
         return Resp::ok($targetHero);
     }
 
@@ -189,6 +190,7 @@ class HeroProc {
         SystemProc::insertHero_StageUp($req->zoneid, $req->uid, $user->name, #  # 插入系统广播
                 GameConfig::hero_getItem($upHero->typeId)->name, $upHero->grade);
         self::CalcUserFightPower($req->zoneid, $req->uid, $req->userInfo->game); # 跟新战力统计
+        TaskProc::OnHeroGradeUp($upHero->typeId, $upHero->grade);
         return $resp;
     }
 
@@ -1070,6 +1072,7 @@ class HeroProc {
                 "[" . $req->uid . "] : HeroLevelUpgrade Exp is negative!");
 //        var_dump($targetHero->xp);
 //        var_dump($lvs);
+        $initLevel = $targetHero->level;
         while ($targetHero->xp >= $lvs->needExp) {
             if ($targetHero->level < $maxLevel) {                               # 如果未到达最大等级
                 $targetHero->level += 1;
@@ -1090,6 +1093,9 @@ class HeroProc {
         CLog:: Assert("HeroProc", $targetHero->xp >= 0, #
                 "[" . $req->uid . "] : HeroLevelUpgrade Exp is negative!");
         $collectHeros->$heroUID = $targetHero;                                  # 更新英雄的数据 
+        if ($targetHero->level != $initLevel) {
+            TaskProc::OnHeroLevelUp($targetHero->typeId, $targetHero->level);
+        }
         return $targetHero;                                                     # 将英雄对象返回
     }
 
@@ -1171,6 +1177,7 @@ class HeroProc {
                 gMem()->hset($key_log, $condition, $uid);                       # 添加突破记录
             }
         }
+        TaskProc::OnUserFightPowerN($fp);
         return $fp;
     }
 

+ 6 - 58
Gameserver/Amfphp/process/StoreProc.php

@@ -279,6 +279,9 @@ class StoreProc {
         } else {
             $store->segement->$segmentId = $num;
         }
+        $segMo = GameConfig::item_segment_getItem($segmentId);
+        my_Assert($segMo != null, ErrCode::err_const_no);
+        TaskProc::OnHeroSegmengNum($segMo->protoHeroID, $num);
     }
 
     /**
@@ -377,6 +380,9 @@ class StoreProc {
                     StoreProc::PutYanLingInStore($itemId, $req);
                     break;
                 case 201:                                                       # 碎片
+                    $segMo = GameConfig::item_segment_getItem($itemId);
+                    my_Assert($segMo != null, ErrCode::err_const_no);
+                    TaskProc::OnHeroSegmengNum($segMo->protoHeroID, $num);
                 case 311:                                                       # 基因(经验丹)
                     StoreProc::PutOverlyingItemInStore($itemId, $num);          # 直接进包裹items
                     break;
@@ -400,16 +406,6 @@ class StoreProc {
      */
     public static function AddItemInStore($req) {
         Err(ErrCode::err_innerfault, "功能待开发 -王刚 2020年1月17日14:36:01");
-//        list($itemType, $itemId, $num) = $req->paras;                           # 提取参数: 道具类型, 道具ID, 数量
-//        if ($itemType < 4) {
-//            StoreProc::PutEquipInStore($itemId, $req);
-//        } else if ($itemType == 4) {
-//            StoreProc:: PutOverlyingItemInStore($itemId, $num);
-//        } else if ($itemType == 10) {
-//            StoreProc:: PutOverlyingItemInStore($itemId, $num);                 ///准备添加其他
-//        }
-//        UserProc::updateUserInfo();                                             //  更新数据库数据 
-//        return Resp::ok(array('resp' => "succeed!"));                           //返回必须是object
     }
 
     /**
@@ -470,54 +466,6 @@ class StoreProc {
      */
     static function addSeprateItem($itemModel, $req) {
         Err(ErrCode::err_method_obsoleted, "未更新包裹操作");
-//        $user = $req->userInfo->game;
-//        $store = $req->userInfo->game->store;
-//        $itemContent = JsonUtil::decode($itemModel->content);
-//        foreach ($itemContent as $itemId => $itemNum) {
-//            if ($itemId == META_GOLDITEMID) {                        # 如果是金币 1
-//                UserModel::Add_Gold($user, $itemNum);
-//            } else if ($itemId == META_CASHITEMID) {                 # 如果是宝石 2
-//                UserModel::present_cash($req, $itemNum, "<" . $req->cmd . ">道具解包-" . $itemModel->name);
-//            } else if ($itemId == META_SPAEITEMID) {                 # 如果是能量块 3
-//                $user->spar += $itemNum;
-//            } else if ($itemId == META_YUANBAOITEMID) { # 元宝,后加的只能采用字段补偿机制 7
-//                PayProc::m_AddUserYuanbao($req, $itemNum, "<" . $req->cmd . ">道具解包-" . $itemModel->name);
-//            } else {                                                // 否则就是道具
-//                $typid = substr("$itemId", 0, 3);
-//                switch ($typid) {
-//                    case "101": # 英雄
-//                        if (property_exists($user->heros, $itemId)) {
-//                            DebugHelper::var_dump(" 已经有了xxx英雄了.");
-//                        } else {  # 给玩家创建一个英雄
-//                            HeroProc::AddHeroTFromStore($req, $itemId);
-//                        }
-//                        break;
-//                    case '102': # 碎片
-//                        if (CommUtil::isPropertyExists($store->segement, $itemId)) {
-//                            $store->segement->$itemId += $itemNum;
-//                        } else {
-//                            $store->segement->$itemId = $itemNum;
-//                        }
-//                        break;
-//                    case '203': # 宝箱
-//                        if (CommUtil::isPropertyExists($store->boxes, $itemId)) {
-//                            $store->boxes->$itemId += $itemNum;
-//                        } else {
-//                            $store->boxes->$itemId = $itemNum;
-//                        }
-//                        break;
-//                    default :
-//                        break;
-//                }
-////                for ($i = 0; $i < $itemNum; $i++) {
-////                    $store->items[] = $itemId;
-////                }
-//            }
-////            break;  # 不会循环的,一个物品中只有第一个道具配置生效,否则
-//        }
-//        UserProc::updateUserInfo();
-//        # 添加活动记录
-////        self::checkActiveItem($req, $itemModel);
     }
 
     /**

+ 100 - 13
Gameserver/Amfphp/process/TaskProc.php

@@ -61,14 +61,32 @@ class TaskProc {
     function procMain($req) {
         switch ($req->cmd) {
             case CmdCode::cmd_task_getInfo:                                     # 6201 刷新任务状态
-                return EmailProc::RefreshEmailList($req);
+                return TaskProc::GetTaskInfo($req);
             case CmdCode::cmd_task_getReward:                                   # 6202 领取任务奖励
-                return EmailProc::ReadEmail($req);
+                return TaskProc::GetTaskReward($req);
+            case CmdCode::cmd_Task_setAttentionTask:                            # 6203 设置关注任务
+                return TaskProc::GetTaskInfo($req);
             default:
                 return Err(ErrCode::cmd_err);
         }
     }
 
+    /**
+     * [6203] 设置关注任务
+     * @param req $req
+     */
+    static function setAttentionTask($req) {
+        list($taskId) = $req->paras;
+        $userTask = $req->userInfo->game->task;
+
+        my_Assert(StlUtil::dictHasProperty($userTask->taskListPlot, $taskId), ErrCode::task_no); # 任务存在
+        isEditor() and $taskItem = new TaskInfo();
+        $taskItem = $userTask->taskListPlot->$taskId;
+        my_Assert($taskItem->rewardGeted < 1, ErrCode::task_reward_geted);      # 任务奖励尚未领取
+        $userTask->curTaskId = $taskId;
+        return Resp::ok();
+    }
+
     /**
      * [6201]更新任务状态
      * @param req $req
@@ -91,7 +109,7 @@ class TaskProc {
         isEditor() and $task = new TaskInfo();
         $task = $userTask->taskListPlot->$taskId;
         my_Assert($task->progress >= 1, ErrCode::task_progress_not_complete);   # 判断任务进度是否已完成>=1f
-        #
+        my_Assert($task->rewardGeted < 1, ErrCode::task_reward_geted);          # 奖励不可重复领取
         $taskCfg = GameConfig::task_getItem($taskId);                           # 任务配置数据
         my_Assert($taskCfg != null, ErrCode::err_const_no);
         $ok = StoreProc::AddMultiItemInStore($req, $taskCfg->reward);           # 发放任务奖励
@@ -131,22 +149,29 @@ class TaskProc {
                 $bUpdate = true;
                 continue;
             }
+            $task->tag1 = max($task->tag1, $taskParam->canshu1);
             if ($taskCfg->canshu1 <= $taskParam->canshu1) {
-                if (is_null($taskCfg->canshu2)) {
+                if (null == $taskCfg->canshu2 || 0 == $taskCfg->canshu2) {
                     $bUpdate = true;
                     $task->progress = 1;
                 } else {
-                    if ($taskCfg->canshu2 <= $taskParam->canshu2) {
-                        $bUpdate = true;
-                        $task->progress = 1;
+                    if (is_numeric($taskCfg->canshu2)) {
+                        $task->tag2 = max($task->tag2, $taskParam->canshu2);
+                        if ($taskCfg->canshu2 <= $taskParam->canshu2) {
+                            $bUpdate = true;
+                            $task->progress = 1;
+                        }
                     } else {
-                        // 更新下进度, 具体细节待修订
+                        $task->tag2 = $taskParam->canshu2;
+                        if ($taskCfg->canshu2 == $taskParam->canshu2) {
+                            $bUpdate = true;
+                            $task->progress = 1;
+                        }
                     }
                 }
-            } else {
-                // 进度更新,具体细节待修订
             }
         }
+
         // meiri
         if ($bUpdate) {
             Resp::addTag("isTaskUpdated", true);                                # 附加tag信息, 任务有更新
@@ -161,9 +186,71 @@ class TaskProc {
     /**
      * 例如当指挥官等级提升的时候需要检查是否有任务达成
      */
-    static function OnUserLevelUp() {
-        $param = new TaskParams(EnumTaskType::CommanderLevelUpTo, req()->userInfo->game->level);
-        self::CheckTaskConditions($param);
+    static function OnUserLevelUp($newLvl) {
+        $taskParam = new TaskParams(EnumTaskType::CommanderLevelUpTo, $newLvl);
+        self::CheckTaskConditions($taskParam);
+    }
+
+    static function OnHeroLevelUp($heroMoId, $newLvl) {
+        $taskParam = new TaskParams(EnumTaskType::HeroLevelUpTo, $heroMoId, $newLvl);
+        self::CheckTaskConditions($taskParam);
+    }
+
+    static function OnHeroGradeUp($heroMoId, $newGrade) {
+        $taskParam = new TaskParams(EnumTaskType::HeroGradeUpTo, $heroMoId, $newGrade);
+        self::CheckTaskConditions($taskParam);
+    }
+
+    static function OnHeroSegmengNum($heroMoId, $num) {
+        $taskParam = new TaskParams(EnumTaskType::HeroSegmentNumberTo, $heroMoId, $num);
+        self::CheckTaskConditions($taskParam);
+    }
+
+    static function OnHeroUnlocSkill($heroMoId, $skillId) {
+        $taskParam = new TaskParams(EnumTaskType::HeroSkillUnlock, $heroMoId, $skillId);
+        self::CheckTaskConditions($taskParam);
+    }
+
+    static function OnPassGateN($gateId, $difficulty) {
+        $taskParam = new TaskParams(EnumTaskType::PassGateN, $gateId, $difficulty);
+        self::CheckTaskConditions($taskParam);
+    }
+
+    static function OnPassCarboN($gateId, $difficulty) {
+        $taskParam = new TaskParams(EnumTaskType::passCarbonN, $gateId, $difficulty);
+        self::CheckTaskConditions($taskParam);
+    }
+
+    static function OnPvPWinN($num) {
+        $taskParam = new TaskParams(EnumTaskType::PvPWinNumberTo, $num);
+        self::CheckTaskConditions($taskParam);
+    }
+
+    /**
+     * 
+     * @param type $score
+     */
+    static function OnPvPScoreN($score) {
+        $taskParam = new TaskParams(EnumTaskType::PvPScoreTo, $score);
+        self::CheckTaskConditions($taskParam);
+    }
+
+    /**
+     * 玩家总战力值
+     * @param type $num
+     */
+    static function OnUserFightPowerN($num) {
+        $taskParam = new TaskParams(EnumTaskType::UserPowerTo, $num);
+        self::CheckTaskConditions($taskParam);
+    }
+
+    /**
+     * 玩家收集积分
+     * @param type $num
+     */
+    static function OnUserCollectScoreN($num) {
+        $taskParam = new TaskParams(EnumTaskType::UserCollectScoreTo, $num);
+        self::CheckTaskConditions($taskParam);
     }
 
     // 

+ 2 - 3
Gameserver/Amfphp/test.php

@@ -9,6 +9,5 @@ include __DIR__ . '/main.php';
 echoLine("phpver:" . PHP_VERSION);
 
 
-$arr = GameConfig::item_weapon();
-krsort($arr);
-var_dump($arr);
+
+var_dump(0 == "0");