currRankSeasonMeta = mt\RankSeason::getCurrentSeason(); // if (!$this->currRankSeasonMeta) { // $this->_rspErr(10, 'server internal error'); // die(); // } $this->propertyChgService = new services\PropertyChgService(); $this->userInfo = $this->_safeGetOrmUserInfo(); // $this->seasonDb = Season::find($this->currRankSeasonMeta['id']); // if (!$this->seasonDb) { // Season::add($this->currRankSeasonMeta['id']); // $this->seasonDb = Season::find($this->currRankSeasonMeta['id']); // } // if (!$this->seasonDb) { // $this->_rspErr(10, 'server internal error'); // die(); // } $this->awardService = new services\AwardService(); $this->missionService = new services\MissionService(); $this->missionService->init($this->userInfo, $this->seasonDb); } public function missionList() { $type = getReqVal('type', 0); $missionMetaList = mt\Task::getCustomTypeMetaList($type, $this->missionService); $missionHash = Mission::allToHash(); $missionDtoList1 = array(); $missionDtoList2 = array(); $specMissionDto = null; $notFinishedCount = 0; foreach ($missionMetaList as $missionMeta) { $missionDb = getXVal($missionHash, $missionMeta['id'], null); $missionDto = $this->missionService->getMissionDto( $this->userInfo, $this->seasonDb, $missionDb, $missionMeta); if ($missionMeta['type'] == mt\Task::DAILY_MISSON_TYPE) { if (in_array($missionMeta['subtype'], array( mt\Task::DAILY_ACTIVE_VALUE_MISSON_SUBTYPE, mt\Task::WEAKLY_ACTIVE_VALUE_MISSON_SUBTYPE ))) { array_push($missionDtoList1, $missionDto); } else { array_push($missionDtoList2, $missionDto); // if ($missionDto['state'] == Mission::NOT_FINISHED_STATE) { // $notFinishedCount++; // } // if ($missionMeta['condition'] == mt\Task::FINISHED_ALL_DAILY_MISSION_COND) { // $specMissionDto &= $missionDto; // } } } else { array_push($missionDtoList1, $missionDto); } } // if ($specMissionDto && // $specMissionDto['state'] == Mission::NOT_FINISHED_STATE && // $notFinishedCount <= 1) { //// $specMissionDto['state'] = Mission::RECEIVEABLE_STATE; // $specMissionDto['state'] = 9636; // } $this->_rspData(array( 'current_day_active_value' => min($this->_getDailyV(TN_DAILY_ACTIVE, 0), mt\Parameter::getVal('activeness_limit', 0)), 'current_week_active_value' => min($this->_getWeeklyV(TN_WEEKLY_ACTIVE, 0), mt\Parameter::getVal('max_weekly', 0)), 'day_active_limit' => mt\Parameter::getVal('activeness_limit', 0), 'week_active_limit' => mt\Parameter::getVal('max_weekly', 0), 'day_time_end' => $this->_getDaySeconds(time())+3600*24, 'week_time_end' => $this->_getMondaySeconds() + 7*24*3600, 'mission_list1' => $missionDtoList1, 'mission_list2' => $missionDtoList2 )); } public function commitMission() { $missionId = getReqVal('mission_id', 0); $missionMeta = mt\Task::get($missionId); if (!$missionMeta) { $this->_rspErr(1, 'mission_id parameter error'); return; } // // if ($missionMeta['type'] == mt\Task::DAILY_MISSON_TYPE && // $missionMeta['subtype'] == mt\Task::WEAKLY_ACTIVE_VALUE_MISSON_SUBTYPE) { // error_log(2); // return; // } // $missionDb = Mission::find($missionId); $missionDto = $this->missionService->getMissionDto( $this->userInfo, $this->seasonDb, $missionDb, $missionMeta); if (!$missionDto) { $this->_rspErr(10, 'server internal error'); return; } if ($missionDto['state'] == Mission::RECEIVED_STATE) { $this->_rspErr(2, "Can't get it again"); return; } if ($missionDto['state'] == Mission::NOT_FINISHED_STATE) { $this->_rspErr(3, 'Mission objectives not achieved'); return; } // if ($missionMeta['condition'] == mt\Task::FINISHED_ALL_DAILY_MISSION_COND) { // if (!$this->specMissionIsFinished($missionDto, $missionMeta)) { // $this->_rspErr(3, 'Mission objectives not achieved'); // return; // } // }print_r($missionMeta);die; if ($missionDto['state'] != Mission::RECEIVEABLE_STATE) { $this->_rspErr(3, 'Unknown mission status'); return; } $dropMeta = mt\Drop::get($missionMeta['reward']); if (!$dropMeta) { $this->_rspErr(10, 'server internal error:' . $missionMeta['reward']); return; } $this->_scatterDrop('mission:' . $missionId, $dropMeta, $this->awardService, $this->propertyChgService); // $this->procSpecMissionCommit($missionDto, $missionMeta); Mission::add($missionId); $missionDb = Mission::find($missionId); $missionDto = $this->missionService->getMissionDto( $this->userInfo, $this->seasonDb, $missionDb, $missionMeta); if ( $missionMeta['type'] == \mt\Task::DAILY_MISSON_TYPE && ! $missionMeta['subtype'] ){ $this->_incDailyV(TN_DAILY_COMPLETE_TASK_NUM, 0, 1); } $this->propertyChgService->addHeroChg(); $this->propertyChgService->addGunChg(); $this->_rspData(array( 'award' => $this->awardService->toDto(), 'property_chg' => $this->propertyChgService->toDto(), 'mission_chg' => $missionDto )); } public function commitAll() { $type = getReqVal('type', 0); $missionMetaList = mt\Task::getCustomTypeMetaList($type, $this->missionService); $missionHash = Mission::allToHash(); $missionDtoList = array(); $specMissionDto = null; $notFinishedCount = 0; foreach ($missionMetaList as $missionMeta) { $missionDb = getXVal($missionHash, $missionMeta['id'], null); $missionDto = $this->missionService->getMissionDto( $this->userInfo, $this->seasonDb, $missionDb, $missionMeta); if ($missionDto['state'] == Mission::RECEIVEABLE_STATE) { array_push($missionDtoList, $missionDto); } if ($missionMeta['type'] == mt\Task::DAILY_MISSON_TYPE) { if ($missionMeta['subtype'] == mt\Task::DAILY_ACTIVE_VALUE_MISSON_SUBTYPE) { } else { if ($missionDto['state'] == Mission::NOT_FINISHED_STATE) { $notFinishedCount++; } if ($missionMeta['condition'] == mt\Task::FINISHED_ALL_DAILY_MISSION_COND && $missionDto['state'] == Mission::NOT_FINISHED_STATE) { $specMissionDto = &$missionDto; } } } } if ($specMissionDto && $specMissionDto['state'] == Mission::NOT_FINISHED_STATE && $notFinishedCount <= 1) { $specMissionDto['state'] = Mission::RECEIVEABLE_STATE; array_push($missionDtoList, $missionDto); } foreach ($missionDtoList as $missionDto) { $missionMeta = mt\Mission::get($missionDto['mission_id']); $dropMeta = mt\Drop::get($missionMeta['reward']); if ($dropMeta) { $dropSource = 'mission:' . $missionDto['mission_id']; $this->_scatterDrop($dropSource, $dropMeta, $this->awardService, $this->propertyChgService); } $this->procSpecMissionCommit($missionDto, $missionMeta); } $this->_rspData(array( 'award' => $this->awardService->toDto(), 'property_chg' => $this->propertyChgService->toDto(), )); } private function specMissionIsFinished($missionDto, $missionMeta) { $type = mt\Task::DAILY_MISSION_CUSTOM_TYPE; $missionMetaList = mt\Task::getCustomTypeMetaList($type); $missionHash = Mission::allToHash(); $notFinishedCount = 0; foreach ($missionMetaList as $missionMeta) { $missionDb = getXVal($missionHash, $missionMeta['id'], null); $missionDto = $this->missionService->getMissionDto( $this->userInfo, $this->seasonDb, $missionDb, $missionMeta); if ($missionMeta['type'] == mt\Task::DAILY_MISSON_TYPE) { if ($missionMeta['subtype'] == mt\Task::DAILY_ACTIVE_VALUE_MISSON_SUBTYPE) { } else { if ($missionDto['state'] == Mission::NOT_FINISHED_STATE) { $notFinishedCount++; } } } } return $notFinishedCount == 1; } public function sendOfferRewardMission() { $missionId = getReqVal('mission_id', 0); $this->missionService->sendOfferRewardMission( $missionId, $this->propertyChgService); } public function offerRewardMissionPreview() { $missionId = getReqVal('mission_id', 0); $this->missionService->offerRewardMissionPreview( $missionId ); } public function cancelOfferRewardMission() { $missionId = getReqVal('mission_id', 0); $this->missionService->cancelOfferRewardMission( $missionId, $this->propertyChgService); } public function boostOfferRewardMissionPreview(){ $missionId = getReqVal('mission_id', 0); $missionMeta = mt\Task::get($missionId); if (!$missionMeta) { $this->_rspErr(1, 'mission_id parameter error'); return; } // if ($missionMeta['type'] == mt\Task::DAILY_MISSON_TYPE && $missionMeta['subtype'] == mt\Task::WEAKLY_ACTIVE_VALUE_MISSON_SUBTYPE) { error_log(2); return; } // $missionDb = Mission::find($missionId); $missionDto = $this->missionService->getMissionDto( $this->userInfo, $this->seasonDb, $missionDb, $missionMeta); if (!$missionDto) { $this->_rspErr(10, 'server internal error'); return; } if ($missionDto['lefttime']<=0){ $this->_rspErr(1, "Don't need to accelerate"); return; } $boost_ceg = \services\FormulaService::calcBoostMissionCeg($missionDto['ceg_num'],$missionDto['lefttime'],$missionMeta['time']); $this->_rspData(array( 'boost_chg' => $boost_ceg )); } public function boostOfferRewardMission() { $missionId = getReqVal('mission_id', 0); $this->missionService->boostOfferRewardMission( $missionId, $this->awardService, $this->propertyChgService); } private function procSpecMissionCommit($missionDto, $missionMeta) { switch ($missionMeta['type']) { case mt\Task::DAILY_MISSON_TYPE: { //(账号内所有PVE角色NFT每日获得极限总和(CEG)+账号内所有PVE武器NFT每日获得极限总和(CEG))*10%/每日任务数量 $this->propertyChgService->addUserChg(); $cegUpLimit = Hero::getRawPveCegUpLimit() + Gun::getRawPveCegUpLimit(); $count = mt\Task::getDaildyMissionCount(); if (!$count || !$cegUpLimit) { $this->_rspErr(10, 'server internal error:'); return; } $gold = ($cegUpLimit * 0.1) / $count; error_log(json_encode(array( 'cegUpLimit' => $cegUpLimit, 'count' => $count, 'ceg' => $gold ))); myself()->_addVirtualItem(V_ITEM_GOLD, round($gold,2)); $this->awardService->addItem(V_ITEM_GOLD, round($gold,2)); } break; case mt\Task::OFFER_REWARD_MISSON_TYPE: { $this->missionService->receiveOfferRewardMission ($missionDto['mission_id'], $this->awardService, $this->propertyChgService); } break; default: { } break; } } }