cyzhao hace 1 año
padre
commit
91b08c6e17

+ 6 - 0
Gameserver/App/model/User/Info_Task.php

@@ -74,6 +74,12 @@ class Info_Task extends Object_ext{
      */
     public $day7Point = 0; 
     
+    /**
+     * 7日活动开始时间
+     * @var type
+     */
+    public $day7_startTs = 0;
+    
     /**
      * 日常
      * @var type

+ 5 - 0
Gameserver/App/model/User/Ins_TaskStep_Active.php

@@ -29,6 +29,11 @@ class Ins_TaskStep_Active extends Object_ext {
      */
     public $state = 0;
 
+    /**
+     * 领取奖励的时间
+     * @var type
+     */
+    public $drawTs = 0;
     /**
      * @return \sm_task_step mo 获取对应的模板数据
      */

+ 83 - 44
Gameserver/App/process/TaskProc.php

@@ -31,19 +31,19 @@ class TaskProc {
             case CmdCode::cmd_task_receiveActiveTaskReward:                     # 6204 领取活动任务奖励
                 return TaskProc::receiveActiveTaskReward();
             case CmdCode::cmd_task_receiveActivePointBoxReward:                 # 6205 领取活跃点宝箱奖励
-                return TaskProc::receiveActivePointBoxReward();                   
+                return TaskProc::receiveActivePointBoxReward();
             default:
                 Err(ErrCode::cmd_err);
         }
     }
-    
+
     /**
      *  6205 领取活跃点宝箱奖励
      */
-    public static function receiveActivePointBoxReward(){
-        list($type,$typeId) = req()->paras;
-        
-        $point= 0;
+    public static function receiveActivePointBoxReward() {
+        list($type, $typeId) = req()->paras;
+
+        $point = 0;
         switch ($type) {
             case Enum_ActiveTaskType::Day7:
                 $point = ctx()->task->day7Point;
@@ -57,38 +57,39 @@ class TaskProc {
             default:
                 break;
         }
-        
+
         my_Assert($typeId >= $point, ErrCode::task_CanotPriceReviced);
-        
-        $mo = GameConfig::activepointreward_getItem($type,$typeId);
+
+        $mo = GameConfig::activepointreward_getItem($type, $typeId);
         my_Assert($mo != null, ErrCode::err_const_no);
-        
+
         StoreProc::AddMultiItemInStore($mo->reward);
-        $strId = $type."-".$typeId;
+        $strId = $type . "-" . $typeId;
         ctx()->task->activePointReceived[] = $strId;
-        
+
         UserProc::updateUserInfo();
         return Resp::ok(array("task" => ctx()->task,
                     "store" => ctx()->store,
-        ));       
+        ));
     }
-    
+
     /**
      * 6204 领取活动任务奖励
      * @return type
      */
     public static function receiveActiveTaskReward() {
         list($uid) = req()->paras;
-        
+
         my_Assert(StlUtil::dictHasProperty(ctx()->task->activeTaskInfo, $uid), ErrCode::task_NoExist);
-        
+
         $ins_activeTaskInfo = new Ins_TaskStep_Active(ctx()->task->activeTaskInfo->$uid);
         my_Assert($ins_activeTaskInfo->cur >= $ins_activeTaskInfo->max(), ErrCode::task_CanotPriceReviced);
         my_Assert($ins_activeTaskInfo->state == Enum_TaskCardStateType::finish, ErrCode::task_CanotPriceReviced);
-        
-        StoreProc::AddMultiItemInStore($ins_activeTaskInfo->mo()->prizes);      
+
+        StoreProc::AddMultiItemInStore($ins_activeTaskInfo->mo()->prizes);
         ctx()->task->activeTaskInfo->$uid->state = Enum_TaskCardStateType::drawed;
-        
+        ctx()->task->activeTaskInfo->$uid->drawTs = now();
+
         switch ($ins_activeTaskInfo->mo()->type) {
             case Enum_ActiveTaskType::Day7:
                 ctx()->task->day7Point += $ins_activeTaskInfo->mo()->activePoint;
@@ -102,8 +103,8 @@ class TaskProc {
             default:
                 break;
         }
-        
-        
+
+
         UserProc::updateUserInfo();
         return Resp::ok(array("task" => ctx()->task,
                     "store" => ctx()->store,
@@ -273,41 +274,47 @@ class TaskProc {
     static function ResetTask() {
         //self::ResetTask_Daily();
         self::DailyTaskReset();
-        self::Day7TaskReset();
+        self::ClearDay7Task();
         $week = date("w");
         if ($week == 1) {//每周一 第一次登录的时候刷新
             //self::ResetTask_Week();
-            self::WeekTaskReset();            
+            self::WeekTaskReset();
+        }
+    }
+
+    static function ClearDay7Task() {
+        if (ctx()->task->day7_startTs > 0) {
+            $startDay = TimeUtil::totalDays(ctx()->task->day7_startTs);
+            $endDay = $startDay + 6;
+            if (TimeUtil::totalDays() > $endDay) {
+                self::ClearActiveTask(Enum_ActiveTaskType::Day7);
+            }
         }
     }
 
     /**
      * 7日狂欢数据重置
      */
-    static function Day7TaskReset() {
-        $mo = GameConfig::activity_getItem(10);
-        my_Assert($mo != null, ErrCode::err_const_no);
+    public static function Day7TaskReset($gateNum) {
+        if ($gateNum < glc()->GateUnlock_7DayActive) {
+            return;
+        }
 
-        $startDay = TimeUtil::totalDays($mo->startts);
-        $endDay = TimeUtil::totalDays($mo->endts);
-        $curDay = TimeUtil::totalDays();
-        if ($curDay > $endDay) {
-            self::ClearActiveTask(Enum_ActiveTaskType::Day7);
-        } else {
-            if ($curDay >= $startDay) {
-                $tag = true;
-                foreach (ctx()->task->activeTaskInfo as $uid => $val) {
-                    $taskMo = GameConfig::activeTask_getItem($val->typeId);
-                    if ($taskMo->type == 1) {
-                        $tag = false;
-                        break;
-                    }
+        if (ctx()->task->day7_startTs == 0) {
+            $tag = true;
+            foreach (ctx()->task->activeTaskInfo as $uid => $val) {
+                $taskMo = GameConfig::activeTask_getItem($val->typeId);
+                if ($taskMo->type == 1) {
+                    $tag = false;
+                    break;
                 }
+            }
 
-                if ($tag) {//7日的数据初始化
-                    self::initActiveTask(Enum_ActiveTaskType::Day7);
-                    ctx()->task->day7Point = 0;
-                }
+            if ($tag) {//7日的数据初始化
+                self::initActiveTask(Enum_ActiveTaskType::Day7);               
+                self::autoRecoverState_activeTask();
+                ctx()->task->day7Point = 0;
+                ctx()->task->day7_startTs = now();
             }
         }
     }
@@ -346,6 +353,7 @@ class TaskProc {
     static function DailyTaskReset() {
         self::ClearActiveTask(Enum_ActiveTaskType::DailyTask);
         self::initActiveTask(Enum_ActiveTaskType::DailyTask);
+        self::autoRecoverState_activeTask();
         ctx()->task->dailyTaskPoint = 0;
     }
 
@@ -355,6 +363,8 @@ class TaskProc {
     static function WeekTaskReset() {
         self::ClearActiveTask(Enum_ActiveTaskType::WeekTask);
         self::initActiveTask(Enum_ActiveTaskType::WeekTask);
+        
+        self::autoRecoverState_activeTask();
         ctx()->task->weekTaskPoint = 0;
     }
 
@@ -839,6 +849,35 @@ class TaskProc {
         UserProc::updateUserInfo();                                             # 更新玩家数据
     }
 
+    /**
+     * 自动修复状态型任务
+     */
+    static function autoRecoverState_activeTask() {
+        $activeTaskDic = ctx()->task->activeTaskInfo;
+        foreach ($activeTaskDic as $uid => &$task) {
+            $ins_TaskStep_Active = new Ins_TaskStep_Active($task);
+            if ($ins_TaskStep_Active->state > Enum_TaskCardStateType::ing) {
+                continue;
+            }
+            if ($ins_TaskStep_Active->isStatusType()) {
+                $cur = $ins_TaskStep_Active->calcStatusCur();
+                if ($cur != $ins_TaskStep_Active->cur) {
+                    $ins_TaskStep_Active->cur = $cur;
+                    if ($ins_TaskStep_Active->cur >= $ins_TaskStep_Active->max()) {
+                        $ins_TaskStep_Active->cur = $ins_TaskStep_Active->max();
+                    }
+                }
+            }
+
+            if ($ins_TaskStep_Active->isFinish()) {
+                $ins_TaskStep_Active->state = Enum_TaskCardStateType::finish;
+            }
+        }
+        
+        ctx()->task->activeTaskInfo = $activeTaskDic;
+        UserProc::updateUserInfo();                                             # 更新玩家数据
+    }
+
 // </editor-fold>
 //    
 }