Info_UserTask.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <?php
  2. namespace loyalsoft;
  3. /**
  4. * 玩家任务数据
  5. * @author wanggangzero@qq.com
  6. * @version 1.0.0 2020.7.8 created by gwang
  7. */
  8. class Info_UserTask extends Object_ext {
  9. /**
  10. * 当前任务节点id
  11. * @var int
  12. */
  13. public $curTaskNode;
  14. /**
  15. * 当前关注任务id
  16. * @var int
  17. */
  18. public $curTaskId;
  19. /**
  20. * 剧情任务实例列表 {id:{progress:0.4,rewardgeted:0}...}
  21. * @var dict
  22. */
  23. public $taskListPlot;
  24. /**
  25. * 每日任务实例列表 {id:{progress:0.4,rewardgeted:0}...}
  26. * @var dict
  27. */
  28. public $taskListDaily;
  29. /**
  30. * @var int 每日重置记录
  31. */
  32. public $dailyResetTs = 0;
  33. /**
  34. * @var int 每日活跃点数
  35. */
  36. public $dailyActivePoint = 0;
  37. /**
  38. * @var array 日常任务活跃度阶段奖励领取记录
  39. */
  40. public $dailyActiveGetedRewardArr = array();
  41. public function __construct($args = null) {
  42. parent::__construct($args);
  43. if (null == $args) {
  44. $this->curTaskNode = 4000001;
  45. $this->curTaskId = 0;
  46. $this->taskListDaily = ObjectInit();
  47. $this->taskListPlot = ObjectInit();
  48. }
  49. }
  50. public function initialize() {
  51. $nodeCfg = GameConfig::task_node_getItem($this->curTaskNode);
  52. $taskArr = explode(',', $nodeCfg->taskList);
  53. $this->curTaskId = $taskArr[0];
  54. foreach ($taskArr as $tid) {
  55. $this->AddPlotTask($tid);
  56. }
  57. $this->AfterInit();
  58. }
  59. public function resetDailyTask() {
  60. if (tsDay($this->dailyResetTs - 18000) < tsDay() || $this->dailyResetTs <= 0) { # 每天5点
  61. $dts = GameConfig::task_daily();
  62. $this->taskListDaily = ObjectInit();
  63. foreach ($dts as $tid => $t) {
  64. $task = new Ins_TaskInfo();
  65. $task->taskId = $tid;
  66. $this->taskListDaily->$tid = $task;
  67. }
  68. $this->dailyActivePoint = 0;
  69. $this->dailyActiveGetedRewardArr = array();
  70. $this->dailyResetTs = now(); # 更新刷新时间
  71. }
  72. }
  73. function AddPlotTask($taskId) {
  74. $tmo = GameConfig::task_getItem($taskId);
  75. my_Assert(null != $tmo, ErrCode::err_const_no);
  76. switch ($tmo->ban) { // 每日,剧情...
  77. }
  78. $task = new Ins_TaskInfo();
  79. $task->taskId = $taskId;
  80. $this->taskListPlot->$taskId = $task;
  81. }
  82. function AfterInit() {
  83. foreach ($this->taskListPlot as $taskId => &$task) {
  84. $tmo = GameConfig::task_getItem($taskId);
  85. $task = new Ins_TaskInfo($task);
  86. my_Assert(null != $tmo, ErrCode::err_const_no);
  87. switch ($tmo->tasktype) { # 有可能添加任务的时候, 任务就已经完成了. 所以这里需要直接做一个检查...
  88. case EnumTaskType::CommanderLevelUpTo:
  89. $taskParam = new Ins_TaskParams(EnumTaskType::CommanderLevelUpTo, req()->userInfo->game->baseInfo->level);
  90. $task->bCheckProgress($taskParam);
  91. break;
  92. case EnumTaskType::HeroLevelUpTo:
  93. $heroMoId = $tmo->canshu1;
  94. $userHeros = new Info_UserGameHero(req()->userInfo->game->heros);
  95. $hero = $userHeros->GetHeroByMoID($heroMoId);
  96. $level = 0;
  97. if ($hero != null) {
  98. $level = $hero->level;
  99. }
  100. $taskParam = new Ins_TaskParams(EnumTaskType::HeroLevelUpTo, $hero->typeId, $hero->level);
  101. $task->bCheckProgress($taskParam);
  102. break;
  103. case EnumTaskType::HeroGradeUpTo:
  104. $heroMoId = $tmo->canshu1;
  105. $userHeros = new Info_UserGameHero(req()->userInfo->game->heros);
  106. $hero = $userHeros->GetHeroByMoID($heroMoId);
  107. $level = 0;
  108. if ($hero != null) {
  109. $level = $hero->grade;
  110. }
  111. $taskParam = new Ins_TaskParams(EnumTaskType::HeroLevelUpTo, $heroMoId, $level);
  112. $task->bCheckProgress($taskParam);
  113. break;
  114. case EnumTaskType::HeroSegmentNumberTo:
  115. $segId = $tmo->canshu1;
  116. $store = new Info_Store(req()->userInfo->game->store);
  117. $num = $store->GetItemCount($segId);
  118. $taskParam = new Ins_TaskParams(EnumTaskType::HeroSegmentNumberTo, $segId, $num);
  119. $task->bCheckProgress($taskParam);
  120. break;
  121. case EnumTaskType::HeroSkillUnlock:
  122. $heroMoId = $tmo->canshu1;
  123. $userHeros = new Info_UserGameHero(req()->userInfo->game->heros);
  124. $hero = $userHeros->GetHeroByMoID($heroMoId);
  125. $subSkillMo = GameConfig::subSkill_getItem($tmo->canshu2);
  126. my_Assert(null != $subSkillMo, ErrCode::err_const_no);
  127. $mSkillId = $subSkillMo->mainSkillId;
  128. $subSkillId = 0;
  129. if ($hero != null && in_array($tmo->canshu2, $hero->subSkills->$mSkillId)) {
  130. $subSkillId = $tmo->canshu2;
  131. }
  132. $taskParam = new Ins_TaskParams(EnumTaskType::HeroSkillUnlock, $heroMoId, $subSkillId);
  133. $task->bCheckProgress($taskParam);
  134. break;
  135. case EnumTaskType::PassGateN:
  136. $gateId = $tmo->canshu1;
  137. $diffculty = $tmo->canshu2;
  138. $gates = req()->userInfo->game->gates->normal;
  139. switch ($diffculty) {
  140. case 0:
  141. $gates = req()->userInfo->game->gates->normal;
  142. break;
  143. case 1:
  144. $gates = req()->userInfo->game->gates->hard;
  145. break;
  146. case 2:
  147. $gates = req()->userInfo->game->gates->elite;
  148. break;
  149. default :
  150. $gates = req()->userInfo->game->gates->normal;
  151. break;
  152. }
  153. $taskParam = new Ins_TaskParams(EnumTaskType::PassGateN, $gates->highest, $diffculty);
  154. $task->bCheckProgress($taskParam);
  155. break;
  156. case EnumTaskType::passCarbonN:
  157. break;
  158. case EnumTaskType::PvPWinNumberTo:
  159. $pvp = new Info_UserPVP(req()->userInfo->game->pvp); # 设计玩家pvp数据结构
  160. $taskParam = new Ins_TaskParams(EnumTaskType::PvPWinNumberTo, $pvp->totalWin); # 任务参数
  161. $task->bCheckProgress($taskParam);
  162. break;
  163. case EnumTaskType::PvPScoreTo:
  164. $uid = req()->uid; # 快速访问UID
  165. $zoneid = req()->zoneid; # 快速访问zoneid
  166. $seasonId = PVPProc::GetCurSeasonID(); # 当前赛季ID
  167. $key = MemKey_GameRun::Game_PVPScoreByZoneSeason_zset($zoneid, $seasonId); # 积分总榜
  168. $score = self::_getScore_by_uid($uid, $key); # 玩家积分
  169. $taskParam = new Ins_TaskParams(EnumTaskType::PvPScoreTo, $score); # 任务参数
  170. $task->bCheckProgress($taskParam);
  171. break;
  172. case EnumTaskType::UserPowerTo:
  173. $key = MemKey_GameRun::Game_FightPowerRank_zset(req()->zoneid); # redis key
  174. $power = gMem()->zscore($key, req()->uid); # 查询战斗力
  175. $taskParam = new Ins_TaskParams(EnumTaskType::UserPowerTo, $power);
  176. $task->bCheckProgress($taskParam);
  177. break;
  178. case EnumTaskType::UserCollectScoreTo:
  179. break;
  180. }
  181. }
  182. }
  183. /**
  184. * 判断是否当前所有剧情任务全部完成并且领取奖励了
  185. * @return boolean
  186. */
  187. function IsAllPlotTaskOver() {
  188. $bYes = true;
  189. foreach ($this->taskListPlot as $tid => $task) {
  190. isEditor() and $task = new Ins_TaskInfo($task);
  191. if (!$task->rewardGeted) {
  192. $bYes = false;
  193. break;
  194. }
  195. }
  196. return $bYes;
  197. }
  198. }