From ed9b26bae7cea4344cf13f412a41564a7a9f7632 Mon Sep 17 00:00:00 2001 From: hujiabin <519660157@qq.com> Date: Wed, 8 Nov 2023 17:19:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AF=8F=E6=97=A5=E4=BB=BB=E5=8A=A1=E8=BF=AD?= =?UTF-8?q?=E4=BB=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webapp/controller/MissionController.class.php | 3 +- webapp/mt/Task.php | 443 ++- webapp/services/MissionService.php | 2729 +++++++++-------- webapp/services/TameBattleDataService.php | 69 +- 4 files changed, 1700 insertions(+), 1544 deletions(-) diff --git a/webapp/controller/MissionController.class.php b/webapp/controller/MissionController.class.php index 8566d734..887c6ffc 100644 --- a/webapp/controller/MissionController.class.php +++ b/webapp/controller/MissionController.class.php @@ -62,6 +62,7 @@ class MissionController extends BaseAuthedController { $this->missionService->init($this->userInfo, $this->seasonDb); } + public function missionList() { $type = getReqVal('type', 0); @@ -79,7 +80,7 @@ class MissionController extends BaseAuthedController { if (in_array($missionMeta['subtype'], array( mt\Task::DAILY_ACTIVE_VALUE_MISSON_SUBTYPE, -// mt\Task::WEAKLY_ACTIVE_VALUE_MISSON_SUBTYPE + mt\Task::WEAKLY_ACTIVE_VALUE_MISSON_SUBTYPE ))) { array_push($missionDtoList1, $missionDto); } else { diff --git a/webapp/mt/Task.php b/webapp/mt/Task.php index 81e599cf..fa53e169 100644 --- a/webapp/mt/Task.php +++ b/webapp/mt/Task.php @@ -1,227 +1,216 @@ -getOfferRewardMissions() as $mission) { - $meta = self::get($mission['mission_id']); - if ($meta && $meta['type'] == self::OFFER_REWARD_MISSON_TYPE) { - array_push($metaList, $meta); - } - } - } else if ($type == self::DAILY_MISSON_TYPE) { - foreach ($missionService->getDailyMissions() as $mission) { - $meta = self::get($mission['mission_id']); - if ($meta) { - array_push($metaList, $meta); - } - } - foreach (self::getMetaList() as $meta) { - if ($meta['type'] == self::DAILY_MISSON_TYPE && $meta['subtype'] == self::DAILY_ACTIVE_VALUE_MISSON_SUBTYPE) { - array_push($metaList, $meta); - } - } - }else if ($type == 0) { - foreach ($missionService->getDailyMissions() as $mission) { - $meta = self::get($mission['mission_id']); - if ($meta) { - array_push($metaList, $meta); - } - } - } else { - foreach (self::getMetaList() as $meta) { - switch ($type) { -// case self::DAILY_MISSION_CUSTOM_TYPE: -// { -// if ($meta['type'] == self::DAILY_MISSON_TYPE) { -// array_push($metaList, $meta); -// } -// } -// break; - case self::SEASON_WEEKLY_MISSION_CUSTOM_TYPE: - { - if ($meta['type'] == self::SEASONCARD_MISSON_TYPE && - $meta['subtype'] == self::SEASON_WEAKLY_MISSON_SUBTYPE) { - array_push($metaList, $meta); - } - } - break; - case self::ACHIEVEMENT_MISSION_CUSTOM_TYPE: - { - if ($meta['type'] == self::ACHIEVEMENT_MISSON_TYPE) { - array_push($metaList, $meta); - } - } - break; - default: - { - } - break; - } - } - } - return $metaList; - } - - public static function isOfferRewardMission($meta) - { - return $meta['type'] == self::OFFER_REWARD_MISSION_CUSTOM_TYPE; - } - - public static function getOfferRewardMissions($excludeMetas) - { - $maxHeroQuality = myself()->_getV(TN_HERO_MAX_QUALITY, 0, 1); - $metas = array(); - foreach (self::getMetaList() as $meta) { - if ($meta['type'] == self::OFFER_REWARD_MISSON_TYPE) { - if ( $meta['param1'] <= $maxHeroQuality) { - if (!array_find($excludeMetas, function($val) use($meta) { - return $val['mission_id'] == $meta['id']; - })) { - array_push($metas, $meta); - } - } - } - } - return $metas; - } - public static function getDaildyMission() - { - $metas = array(); - foreach (self::getMetaList() as $meta) { - if ($meta['type'] == self::DAILY_MISSON_TYPE) { - if (!in_array($meta['subtype'], - array( - self::DAILY_ACTIVE_VALUE_MISSON_SUBTYPE, - self::WEAKLY_ACTIVE_VALUE_MISSON_SUBTYPE - ))) { - array_push($metas, $meta); - } - } - } - - - return $metas; - } - - public static function getDaildyMissionCount() - { - if (is_null(self::$dailyMissionCount)) { - self::$dailyMissionCount = 0; - foreach (self::getMetaList() as $meta) { - if ($meta['type'] == self::DAILY_MISSON_TYPE) { - if ($meta['subtype'] != - self::WEAKLY_ACTIVE_VALUE_MISSON_SUBTYPE) { - ++self::$dailyMissionCount; - } - } - } - - } - return self::$dailyMissionCount; - } - - protected static function getMetaList() - { - if (!self::$metaList) { - self::$metaList = getMetaTable('task@task.php'); - } - return self::$metaList; - } - - protected static $metaList; - protected static $dailyMissionCount = null; - -} +getDailyMissions() as $mission) { + $meta = self::get($mission['mission_id']); + if ($meta) { + array_push($metaList, $meta); + } + } + } + case self::DAILY_MISSON_TYPE : { + foreach ($missionService->getDailyMissions() as $mission) { + $meta = self::get($mission['mission_id']); + if ($meta) { + array_push($metaList, $meta); + } + } + foreach (self::getMetaList() as $meta) { + if ($meta['type'] == self::DAILY_MISSON_TYPE && + in_array($meta['subtype'], + array( + self::DAILY_ACTIVE_VALUE_MISSON_SUBTYPE, + self::WEAKLY_ACTIVE_VALUE_MISSON_SUBTYPE + ))) { + array_push($metaList, $meta); + } + } + } + break; + case self::OFFER_REWARD_MISSION_CUSTOM_TYPE:{ + foreach ($missionService->getOfferRewardMissions() as $mission) { + $meta = self::get($mission['mission_id']); + if ($meta && $meta['type'] == self::OFFER_REWARD_MISSON_TYPE) { + array_push($metaList, $meta); + } + } + } + break; + } + return $metaList; + } + + public static function isOfferRewardMission($meta) + { + return $meta['type'] == self::OFFER_REWARD_MISSION_CUSTOM_TYPE; + } + + public static function getOfferRewardMissions($excludeMetas) + { + $maxHeroQuality = myself()->_getV(TN_HERO_MAX_QUALITY, 0, 1); + $metas = array(); + foreach (self::getMetaList() as $meta) { + if ($meta['type'] == self::OFFER_REWARD_MISSON_TYPE) { + if ( $meta['param1'] <= $maxHeroQuality) { + if (!array_find($excludeMetas, function($val) use($meta) { + return $val['mission_id'] == $meta['id']; + })) { + array_push($metas, $meta); + } + } + } + } + return $metas; + } + public static function getDaildyMission() + { + $metas = array(); + foreach (self::getMetaList() as $meta) { + if ($meta['type'] == self::DAILY_MISSON_TYPE) { + if (!in_array($meta['subtype'], + array( + self::DAILY_ACTIVE_VALUE_MISSON_SUBTYPE, + self::WEAKLY_ACTIVE_VALUE_MISSON_SUBTYPE + ))) { + array_push($metas, $meta); + } + } + } + + + return $metas; + } + + public static function getDaildyMissionCount() + { + if (is_null(self::$dailyMissionCount)) { + self::$dailyMissionCount = 0; + foreach (self::getMetaList() as $meta) { + if ($meta['type'] == self::DAILY_MISSON_TYPE) { + if ($meta['subtype'] != + self::WEAKLY_ACTIVE_VALUE_MISSON_SUBTYPE) { + ++self::$dailyMissionCount; + } + } + } + + } + return self::$dailyMissionCount; + } + + protected static function getMetaList() + { + if (!self::$metaList) { + self::$metaList = getMetaTable('task@task.php'); + } + return self::$metaList; + } + + protected static $metaList; + protected static $dailyMissionCount = null; + +} diff --git a/webapp/services/MissionService.php b/webapp/services/MissionService.php index a6ef7185..99f74050 100644 --- a/webapp/services/MissionService.php +++ b/webapp/services/MissionService.php @@ -1,1279 +1,1450 @@ -userInfo = $userInfo; - if ($seasonDb){ - $this->seasonDb = $seasonDb; - $seasonBattleData = json_decode($this->seasonDb['battle_data'], true); - if (!isset($seasonBattleData)) { - $seasonBattleData = array(); - } - $this->seasonBattleData = getXVal($seasonBattleData, 'season_data', array()); - $this->thisWeekBattleData = getXVal($seasonBattleData, 'this_week_data', array()); - if (myself()->_getDaySeconds(getXVal($this->thisWeekBattleData, 'modifytime', 0)) < - myself()->_getMondaySeconds()) { - $this->thisWeekBattleData = array( - 'createtime' => myself()->_getNowTime(), - 'modifytime' => myself()->_getNowTime(), - ); - } - } - $this->hisBattleData = Battle::getMyBattleData(); - $this->lastGameBattleData = getXVal($this->hisBattleData, 'last_game_data', array()); - $this->todayBattleData = getXVal($this->hisBattleData, 'today_data', array()); - if (myself()->_getDaySeconds(getXVal($this->todayBattleData, 'modifytime', 0)) < - myself()->_getNowDaySeconds()) { - $this->todayBattleData = array( - 'createtime' => myself()->_getNowTime(), - 'modifytime' => myself()->_getNowTime(), - ); - } - - -// $this->offerRewartdMission = BigData::getData(BigData::OFFER_REWARD_MISSION_TYPE); -// if (!$this->offerRewartdMission) { -// $this->offerRewartdMission = array( -// 'missions' => array(), -// 'refreshtime' => 0 -// ); -// } -// if (myself()->_getNowTime() - $this->offerRewartdMission['refreshtime'] >= 86400){ -// $this->refreshOfferRewardMission(); -// } - - $this->dailyMission = BigData::getData(BigData::DAILY_REWARD_MISSION_TYPE); - if (!$this->dailyMission) { - $this->dailyMission = array( - 'missions' => array(), - 'refreshtime' => 0 - ); - } - if (myself()->_getNowTime() - $this->dailyMission['refreshtime'] >= 86400){ - $this->refreshDailyRewardMission(); - } - } - - private function celRealityDto($total,$target,$current){ - if ($total > $target){ - $current = $current - ($total - $target); - if ($current < 0){ - $current = -1; - } - } - return $current; - } - - public function getMissionDto($userInfo, $seasonDb, $missionDb, $missionMeta) - { - $missionDto = array( - 'mission_id' => $missionMeta['id'], - 'last_game' => -1, - 'current' => 0, - 'target' => getXVal($missionMeta, 'target', 1), - 'state' => Mission::NOT_FINISHED_STATE, - 'objects' => array(), - 'lefttime' => 0, -// 'ceg_num' => 0, -// "awards" => array( -// V_ITEM_GOLD, -// mt\Drop::get($missionMeta['reward'])?mt\Drop::get($missionMeta['reward'])['item_id']:0 -// ) - ); - if ($missionDb) { - if ($missionMeta['type'] == mt\Task::DAILY_MISSON_TYPE) { - switch ($missionMeta['subtype']){ - case mt\Task::DAILY_ACTIVE_VALUE_MISSON_SUBTYPE : { - if (myself()->_getDaySeconds($missionDb['modifytime']) == myself()->_getNowDaySeconds()) { - $missionDto['current'] = $missionDto['target']; - $missionDto['state'] = Mission::RECEIVED_STATE; - return $missionDto; - } - } - break; - case mt\Task::WEAKLY_ACTIVE_VALUE_MISSON_SUBTYPE : { - if (myself()->_getMondaySecondsByTime($missionDb['modifytime']) == myself()->_getMondaySeconds()) { - $missionDto['current'] = $missionDto['target']; - $missionDto['state'] = Mission::RECEIVED_STATE; - return $missionDto; - } - } - break; - default : { - if (myself()->_getDaySeconds($missionDb['modifytime']) == myself()->_getNowDaySeconds()) { - $missionDto['current'] = $missionDto['target']; - $missionDto['state'] = Mission::RECEIVED_STATE; - return $missionDto; - } - } - } - } else { - if ($missionMeta['condition'] != mt\Task::OFFER_REWARD_COND) { - $missionDto['current'] = $missionDto['target']; - $missionDto['state'] = Mission::RECEIVED_STATE; - return $missionDto; - } - } - } - $handled = true; - - //统计上一场战斗的数据 - if ($missionMeta['display']){ - $missionDto['last_game'] = 0; - switch ($missionMeta['condition']) { - case mt\Task::DAILY_LOGIN_TIMES_COND: - { - //进行X场比赛 - $total = $this->getBattleData($missionDb, $missionMeta, 'total_battle_times'); - $current = $this->getLastGameData('total_battle_times'); - $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; - } - break; - case mt\Task::TEAM_BATTLE_RANK_COND: - { - //组队比赛排名前X次数 - $total = $this->getBattleData($missionDb, $missionMeta, 'total_team_top_X_battle_times'); - $current = $this->getLastGameData('total_team_top_X_battle_times'); - $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; - } - break; - case mt\Task::TOTAL_KILL_NUM_COND: - { - //累计击败X个敌人 - $total = $this->getBattleData($missionDb, $missionMeta, 'total_kills_times'); - $current = $this->getLastGameData('total_kills_times'); - $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; - } - break; - case mt\Task::TOTAL_DAMGE_OUT_COND: - { - //累计造成X点伤害 - $total = $this->getBattleData($missionDb, $missionMeta, 'total_damage_out'); - $current = $this->getLastGameData('total_damage_out'); - $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; - } - break; - case mt\Task::RESCUE_TEAMMATE_TIMES_COND: - { - //救援X个队友 - $total = $this->getBattleData($missionDb, $missionMeta, 'rescue_teammate_times'); - $current = $this->getLastGameData('rescue_teammate_times'); - $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; - } - break; - case mt\Task::TOTAL_SURVIVAL_TIME_COND: - { - //累计生存X分钟 - $total = $this->getBattleData($missionDb, $missionMeta, 'total_alive_time'); - $current = $this->getLastGameData('total_alive_time'); - $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; - } - break; - case mt\Task::TOTAL_USE_SKILL_TIMES_COND: - { - //累计使用X次角色技能 - $total = $this->getBattleData($missionDb, $missionMeta, 'use_skill_times'); - $current = $this->getLastGameData('use_skill_times'); - $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; - } - break; - } - } - - switch ($missionMeta['condition']) { - case mt\Task::DAILY_LOGIN_TIMES_COND: - { - //今日登陆 - $missionDto['current'] = myself()->_getDailyV(TN_DAILY_LOGINS, 0); - } - break; - case mt\Task::PLAYER_LEVEL_COND: - { - //玩家等级达到X - $missionDto['current'] = $this->userInfo['level']; - } - break; - case mt\Task::TOTAL_BATTLE_TIMES_COND: - { - //进行X场比赛 - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'total_battle_times'); - } - break; - case mt\Task::SHARE_GAME_TIMES_COND: - { - //分享1次游戏 - $missionDto['current'] = $this->getMissionV($missionMeta, - TN_DAILY_SHARE_GAMES, - TN_WEEKLY_SHARE_GAMES, - TN_SHARE_GAMES); - } - break; - case mt\Task::SINGLE_BATTLE_TIMES_COND: - { - //进行X场单人比赛 - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'total_single_battle_times'); - } - break; - case mt\Task::TEAM_BATTLE_TIMES_COND: - { - //进行X场组队比赛 - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'total_team_battle_times'); - } - break; - case mt\Task::SINGLE_BATTLE_RANK_COND: - { - //单人比赛排名前X - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'single_battle_rank'); - } - break; - case mt\Task::TEAM_BATTLE_RANK_COND: - { - //组队比赛排名前X次数 - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'total_team_top_X_battle_times'); - } - break; - case mt\Task::TOTAL_KILL_NUM_COND: - { - //累计击败X个敌人 - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'total_kills_times'); - } - break; - case mt\Task::TOTAL_DAMGE_OUT_COND: - { - //累计造成X点伤害 - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'total_damage_out'); - } - break; - case mt\Task::RESCUE_TEAMMATE_TIMES_COND: - { - //救援X个队友 - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'rescue_teammate_times'); - } - break; - case mt\Task::TOTAL_SURVIVAL_TIME_COND: - { - //累计生存X分钟 - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'total_alive_time'); - } - break; - case mt\Task::USE_WEAPON_KILL_NUM_COND: - { - //使用X枪械击杀Y个敌人 cond_param1=equip.type cond_param2=equip.sub_type - $missionDto['current'] = $this->getWeaponKills($missionMeta); - } - break; - case mt\Task::USE_WEAPON_DAMGE_OUT_COND: - { - //使用X种枪械对敌人累计造成Y点伤害 cond_param1=equip.type cond_param2=equip.sub_type - $missionDto['current'] = $this->getWeaponDamageOut($missionMeta); - } - break; - case mt\Task::USE_WEAPON_SLOT_TIMES_COND: - { - //使用某个槽位的次数 cond_param1=槽位 - $missionDto['current'] = $this->getWeaponSlotUseTimes($missionMeta); - } - break; - case mt\Task::GET_EQUIP_TIMES_COND: - { - //获得某种类型的装备 cond_param1=equip.type cond_param2=equip.sub_type - $missionDto['current'] = $this->getEquipObtainCount($missionMeta); - } - break; - case mt\Task::TOTAL_DIVING_TIMES_COND: - { - //累计潜水X次 - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'diving_times'); - } - break; - case mt\Task::TOTAL_DAMAGE_IN_COND: - { - //累计受到X点伤害 - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'total_damage_in'); - } - break; - case mt\Task::TOTAL_RECOVER_HP_COND: - { - //累计恢复X点血量 - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'total_recover_hp'); - } - break; - case mt\Task::TOTAL_OPEN_AIRDROP_COND: - { - //累计打开空投补给X次 - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'open_airdrop_times'); - } - break; - case mt\Task::BATTLE_IN_HERO_LV_COND: - { - //单局内英雄技能升级到X级 - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'max_hero_skill_lv'); - } - break; - case mt\Task::BATTLE_IN_GUN_LV_COND: - { - //单局内英雄专属枪械升到X级 cond_param1=英雄id - $missionDto['current'] = $this->getHeroSkillLv($missionDb, $missionMeta); - } - break; - case mt\Task::TOTAL_MEDICINE_TIMES_COND: - { - //累计使用X药品Y次 cond_param1=槽位 - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'use_medicine_times'); - } - break; - case mt\Task::TOTAL_DESTORY_CAR_TIMES_COND: - { - //累计破坏载具X个 - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'destory_car_times'); - } - break; - case mt\Task::TOTAL_USE_CAMOUFLAGE_TIMES_COND: - { - //累计使用X个伪装物 - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'use_camouflage_times'); - } - break; - case mt\Task::TOTAL_USE_SKILL_TIMES_COND: - { - //累计使用X次角色技能 - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'use_skill_times'); - } - break; - case mt\Task::RIDE_CAR_MOVE_DISTANCE_COND: - { - //驾驶或乘坐载具累计移动X米(所有模式) - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'ride_car_move_distance'); - } - break; - case mt\Task::RIDE_CAR_KILL_NUM_COND: - { - //驾驶或乘坐载具累计击杀X个敌人(所有模式) - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'ride_car_kills'); - } - break; - case mt\Task::LIKE_TEAMMATE_TIMES_COND: - { - //战斗结算中累计给队友点赞X次 - $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, - 'to_teammate_like_times'); - } - break; - case mt\Task::SEASON_LEVEL_COND: - { - //赛季段位达到X - $missionDto['current'] = $this->userInfo['rank']; - } - break; - case mt\Task::CONSUME_GOLD_COND: - { - //消耗X个金币 - $missionDto['current'] = myself()->_getDailyV(TN_DAILY_USED_GOLD_NUM, 0);; - } - break; - case mt\Task::BATTLE_RANK_COND: - { - //获得X级评价Y次 - $handled = false; - } - break; - case mt\Task::FINISHED_ALL_DAILY_MISSION_COND: - { - //完成所有每日任务 - $missionDto['current'] = myself()->_getDailyV(TN_DAILY_COMPLETE_TASK_NUM, 0); - } - break; - case mt\Task::SHOP_BUY_TIMES_COND: - { - //在X商店消费Y次 - $missionDto['current'] = $this->getMissionV($missionMeta, - TN_DAILY_SHOP, - TN_WEEKLY_SHOP, - TN_SHOP); - } - break; - case mt\Task::TOTAL_UPGRADE_TALENT_LV_COND: - { - //科研升级X次 - $missionDto['current'] = $this->getMissionV($missionMeta, - TN_DAILY_RECHARGE_UPGRADE_TIMES, - TN_WEEKLY_RECHARGE_UPGRADE_TIMES, - TN_RECHARGE_UPGRADE_TIMES); - } - break; - case mt\Task::TOTAL_GET_HERO_SKIN_COUNT_COND: - { - //累计获得X个角色时装 - $handled = false; - } - break; - case mt\Task::TOTAL_GET_GUN_SKIN_COUNT_COND: - { - //累计获得X个枪械皮肤 - $handled = false; - } - break; - case mt\Task::TOTAL_INVITE_FRIEND_TIMES_COND: - { - //邀请好友组队X次 - $handled = false; - } - break; - case mt\Task::TOTAL_GIVE_FRIEND_GOLD_COUNT_COND: - { - //赠送X个好友金币 - $handled = false; - } - break; - case mt\Task::TOTAL_INVITE_FRIEND_ONLINE_TIMES_COND: - { - //邀请X个好友上线 - $handled = false; - } - break; - case mt\Task::TOTAL_CREATE_OR_JOIN_GUILD_COUNT_COND: - { - //创建或加入1个战队 - $handled = false; - } - break; - case mt\Task::T1OTAL_CREATE_OR_JOIN_GUILD_COUNT_COND: - { - //段位达到X且进行Y场比赛 - $handled = false; - } - break; - case mt\Task::DAILY_ACTIVE_VALUE_COND: - { - //每日活跃度达到X - $missionDto['current'] = myself()->_getDailyV(TN_DAILY_ACTIVE, 0); - } - break; - case mt\Task::WEEKLY_ACTIVE_VALUE_COND: - { - //每周活跃度达到X - $missionDto['current'] = myself()->_getWeeklyV(TN_WEEKLY_ACTIVE, 0); - } - break; - case mt\Task::OFFER_REWARD_COND: - { - $this->getOfferRewardMissionInfo($missionDto, $missionMeta); - } - break; - default: - { - } - break; - } - //$missionDto['current'] = $missionDto['target']; - if ($missionDto['current'] >= $missionDto['target']) { - $missionDto['current'] = $missionDto['target']; - $missionDto['state'] = Mission::RECEIVEABLE_STATE; - } - if (!$handled) { - error_log(json_encode($missionDto)); - } - //$missionDto['state'] = Mission::RECEIVEABLE_STATE; - return $missionDto; - } - - private function getLastGameData($key){ - $battleData = $this->lastGameBattleData; - $val = getXVal($battleData, $key, 0); - if ($key == 'total_alive_time'){ - $val = floor($val/1000/60); - } - return $val; - } - - private function getBattleData($missionDb, $missionMeta, $key) - { - //今天 - //本周 - //本季度 - //永久 - $val = 0; - $battleData = $this->internalGetBattleData($missionMeta); - $val = getXVal($battleData, $key, 0); - if ($key == 'total_alive_time'){ - $val = floor($val/1000/60); - } - return $val; - } - - private function internalGetBattleData($missionMeta) - { - $battleData = null; - if ($missionMeta['type'] == mt\Task::DAILY_MISSON_TYPE) { - $battleData = $this->todayBattleData; - } else { - if ($missionMeta['season_task'] == mt\Task::SEASON_MISSON_FLAG) { - if ($missionMeta['type'] == mt\Task::SEASONCARD_MISSON_TYPE && - $missionMeta['subtype'] == mt\Task::SEASON_WEAKLY_MISSON_SUBTYPE) { - $battleData = $this->thisWeekBattleData; - } else { - $battleData = $this->seasonBattleData; - } - } else { - $battleData = $this->hisBattleData; - } - } - return $battleData ? $battleData : array(); - } - - private function getWeaponDamageOut($missionMeta) - { - $val = 0; - $battleData = $this->internalGetBattleData($missionMeta); - $weaponData = getXVal($battleData, 'weapon_type_data', null); - if ($weaponData) { - $key = $missionMeta['param1'] . '_' . $missionMeta['param2']; - $data = getXVal($weaponData, $key, null); - if ($data) { - $val = getXVal($data, 'damage_out', 0); - } - } - return $val; - } - - private function getWeaponKills($missionMeta) - { - $val = 0; - $battleData = $this->internalGetBattleData($missionMeta); - $weaponData = getXVal($battleData, 'weapon_type_data', null); - if ($weaponData) { - $key = $missionMeta['param1'] . '_' . $missionMeta['param2']; - $data = getXVal($weaponData, $key, null); - if ($data) { - $val = getXVal($data, 'kills', 0); - } - } - return $val; - } - - private function getWeaponSlotUseTimes($missionMeta) - { - $val = 0; - $battleData = $this->internalGetBattleData($missionMeta); - $weaponData = getXVal($battleData, 'weapon_slot_data', null); - if ($weaponData) { - $key = $missionMeta['param1']; - $data = getXVal($weaponData, $key, null); - if ($data) { - $val = getXVal($data, 'use_times', 0); - } - } - return $val; - } - - private function getEquipObtainCount($missionMeta) - { - $val = 0; - $battleData = $this->internalGetBattleData($missionMeta); - $weaponData = getXVal($battleData, 'weapon_type_data', null); - if ($weaponData) { - $key = $missionMeta['param1'] . '_' . $missionMeta['param2']; - $data = getXVal($weaponData, $key, null); - if ($data) { - $val = getXVal($data, 'obtain_count', 0); - } - } - return $val; - } - - private function getHeroSkillLv($missionDb, $missionMeta) - { - //'max_single_battle_hero_weapon_lv' . $missionMeta['param1'] - $val = 0; - $battleData = $this->internalGetBattleData($missionMeta); - $heroData = getXVal($battleData, 'hero_data', null); - if ($weaponData) { - $key = $missionMeta['param1']; - $data = getXVal($heroData, $key, null); - if ($data) { - $val = getXVal($data, 'skill_lv', 0); - } - } - return $val; - } - - private function getMissionV($missionMeta, $dailyX, $weeklyX, $hisX, $y) - { - if ($missionMeta['type'] == mt\Task::DAILY_MISSON_TYPE) { - return myself()->_getDailyV($dailyX, $y); - } else { - if ($missionMeta['season_task'] == mt\Task::SEASON_MISSON_FLAG) { - if ($missionMeta['type'] == mt\Task::SEASONCARD_MISSON_TYPE && - $missionMeta['subtype'] == mt\Task::SEASON_WEAKLY_MISSON_SUBTYPE) { - return myself()->_getWeeklyV($dailyX, $y); - } - } - } - return myself()->_getV($x, $y); - } - - private function getMissionsCount(){ - $num = 0; - $missionHash = Mission::allToHash(); - if (count($this->offerRewartdMission['missions'])){ - foreach ($this->offerRewartdMission['missions'] as $val){ - $missionDb = getXVal($missionHash, $val['mission_id'], null); - $missionMeta = mt\Task::get($val['mission_id']); - $missionDto = $this->getMissionDto($this->userInfo, $this->seasonDb, $missionDb, $missionMeta); - if ($missionDto['state'] != 0){ - $num+=1; - } - } - } - return $num; - } - - private function refreshOfferRewardMission() - { - $wantedRefreshMissionNum = mt\Parameter::getVal - ('wanted_refresh_mission_num', 0); - if (count($this->offerRewartdMission['missions']) >= 10){ - return; - } - if ($wantedRefreshMissionNum <= -// count($this->offerRewartdMission['missions']) - $this->getMissionsCount() - ) { - return; - } - $metas = mt\Task::getOfferRewardMissions - ($this->offerRewartdMission['missions']); - if (count($metas)<1) { - return; - } - if (count($metas) == 1){ - $missList = array_keys($metas); - }else{ - $count = count($metas)>=5 ? 5 : count($metas); - $missList = array_rand($metas, $count); - } - foreach ($missList as $key) { - $meta = $metas[$key]; - if ($this->getMissionsCount() >= - $wantedRefreshMissionNum) { - break; - } - if (count($this->offerRewartdMission['missions']) >= 10) { - break; - } - if (!$this->inOfferRewardMission($meta['id'])) { - array_push($this->offerRewartdMission['missions'], - array( - 'mission_id' => $meta['id'], - 'createtime' => myself()->_getNowTime(), - 'modifytime' => myself()->_getNowTime(), - 'sendtime' => 0, - 'objects' => array(), - "awards" => array( - V_ITEM_GOLD, - mt\Drop::get($meta['reward'])?mt\Drop::get($meta['reward'])['item_id']:0 - ) - )); - } - } - $this->offerRewartdMission['refreshtime'] = myself()->_getDaySeconds(myself()->_getNowTime()); - $this->saveOfferRewardMission(); - } - - private function refreshDailyRewardMission(){ - $wantedMissionNum = mt\Parameter::getVal('daily_task_pick_num', 5); - $this->dailyMission['missions'] = array(); - $metas = mt\Task::getDaildyMission(); - if (count($metas) < $wantedMissionNum) { - return; - } - - foreach (array_rand($metas, $wantedMissionNum) as $key) { - $meta = $metas[$key]; - if (count($this->dailyMission['missions']) >= - $wantedMissionNum) { - break; - } - - array_push($this->dailyMission['missions'], - array( - 'mission_id' => $meta['id'], - 'createtime' => myself()->_getNowTime(), - 'modifytime' => myself()->_getNowTime(), -// 'sendtime' => 0, - 'objects' => array() - )); - - } - - $this->dailyMission['refreshtime'] = myself()->_getNowDaySeconds(); - $this->saveDailyMission(); - - } - - public function updateOfferRewardMission($missionId) - { - foreach ($this->offerRewartdMission['missions'] as $k=>&$mission) { - if ($mission['mission_id'] == $missionId) { - unset($this->offerRewartdMission['missions'][$k]); - } - } - -// $metas = mt\Task::getOfferRewardMissions -// ($this->offerRewartdMission['missions']); -// $selectMeta = null; -// shuffle($metas); -// foreach ($metas as $meta) { -// if (!$this->inOfferRewardMission($meta['id'])) { -// $selectMeta = $meta; -// break; -// } -// } -// -// if ($selectMeta) { -// foreach ($this->offerRewartdMission['missions'] as $k=>&$mission) { -// if ($mission['mission_id'] == $missionId) { -// $mission['mission_id'] = $selectMeta['id']; -// $mission['createtime'] = myself()->_getNowTime(); -// $mission['modifytime'] = myself()->_getNowTime(); -// $mission['sendtime'] = 0; -// $mission['objects'] = array(); -// break; -// } -// } -// } - - } - - public function &getOfferRewardMissions() - { - return $this->offerRewartdMission['missions']; - } - - public function getDailyMissions(){ - return $this->dailyMission['missions']; - } - - private function getOfferRewardMissionInfo(&$missionDto, $missionMeta) - { - foreach ($this->offerRewartdMission['missions'] as $mission) { - if ($mission['mission_id'] == $missionDto['mission_id']) { - if ($mission['sendtime'] > 0) { - $leftTime = max(0, ($mission['sendtime'] + $missionMeta['time'])-myself()->_getNowTime()); - $missionDto['lefttime'] = $leftTime; - if ($leftTime <= 0) { - $missionDto['state'] = 0; - } else { - $missionDto['state'] = 2; - } - } else { - $missionDto['state'] = 1; - } - $missionDto['objects'] = $mission['objects']; - $missionDto['ceg_num'] = $this->calcCegPreview($mission['objects']); - $missionDto['awards'][0].= ':'.$this->calcCegPreview($mission['objects']); - if (count($mission['objects']) > 0){ - $missionDto['awards'][1].=':'.'1' ; - }else{ - $missionDto['awards'][1].=':'.'0' ; - } - - } - } - } - - public function sendOfferRewardMission($missionId, $propertyChgService) - { - $missionMeta = mt\Task::get($missionId); - if (!$missionMeta) { - myself()->_rspErr(1, 'mission_id parameter error'); - return; - } - $idx = 0; - $mission = null; - if (!$this->getOfferRewardMissionById($missionId, $mission, $idx)) { - myself()->_rspErr(1, 'mission_id parameter error'); - return; - } - if ($mission['sendtime'] > 0) { - myself()->_rspErr(1, 'mission_id parameter error2'); - return; - } - $heroCount = 0; - $gunCount = 0; - $objects = explode('|', getReqVal('objects', 0)); - foreach ($objects as $val) { - $strings = explode(':', $val); - if (count($strings) < 2) { - continue; - } - $type = $strings[0]; - $id = $strings[1]; - switch ($type) { - case 0: - { - //武器 - ++$gunCount; - $gunDb = Gun::find($id); - if ($gunDb) { - array_push( - $mission['objects'], - array( - 'type' => $type, - 'id' => $id - ) - ); - } - } - break; - case 1: - { - //英雄 - ++$heroCount; - $heroDb = Hero::find($id); - if (!$heroDb) { - myself()->_rspErr(1, 'objects parameter error' . $id); - return; - } - if (Hero::heroIsLocking($heroDb)) { - myself()->_rspErr(1, 'hero is locking'); - return; - } - array_push( - $mission['objects'], - array( - 'type' => $type, - 'id' => $id - ) - ); - } - break; - } - } - error_log(json_encode(array( - 'heroCount' => $heroCount, - 'gunCount' => $gunCount, - 'param3' => $missionMeta['param3'], - 'param4' => $missionMeta['param4'], - ))); - if ($heroCount > $missionMeta['param3'] || $heroCount < $missionMeta['param3']) { - myself()->_rspErr(1, 'hero number error'); - return; - } - if ($gunCount > $missionMeta['param4']) { - myself()->_rspErr(1, 'gun number error'); - return; - } - $mission['sendtime'] = myself()->_getNowTime(); - { - foreach ($mission['objects'] as $obj) { - switch ($obj['type']) { - case 0: - { - Gun::Update - ($obj['id'], - array( - 'lock_type' => Gun::SEND_LOCK, - 'unlock_time' => myself()->_getNowTime() + $missionMeta['time'] - )); - } - case 1: - { - Hero::Update - ($obj['id'], - array( - 'lock_type' => Hero::SEND_LOCK, - 'unlock_time' => myself()->_getNowTime() + $missionMeta['time'] - )); - } - break; - default: - { - } - break; - } - } - } - error_log(json_encode($mission)); - $this->offerRewartdMission['missions'][$idx] = $mission; - $this->saveOfferRewardMission(); - $propertyChgService->addHeroChg(); - $propertyChgService->addGunChg(); - error_log(json_encode($this->offerRewartdMission)); - myself()->_rspData([ - 'property_chg' => $propertyChgService->toDto(), - ]); - } - - public function offerRewardMissionPreview($missionId) - { - $missionMeta = mt\Task::get($missionId); - if (!$missionMeta) { - myself()->_rspErr(1, 'mission_id parameter error'); - return; - } - $dropMeta = mt\Drop::get($missionMeta['reward']); - if (!$dropMeta) { - $this->_rspErr(10, 'server internal error:' . $missionMeta['reward']); - return; - } - $strings = explode('|', getReqVal('objects', 0)); - $objects = array(); - foreach ($strings as $str){ - $strings2 = explode(':', $str); - if (count($strings2) < 2) { - error_log(json_encode($_REQUEST)); - continue; - } - array_push($objects, - array( - 'type' => $strings2[0], - 'id' => $strings2[1], - )); - } - $cegNum = $this->calcCegPreview($objects); - $data = array(); - if ($objects && $objects[0]['type'] == 1){ - array_push($data,array( - 'item_id'=> V_ITEM_GOLD, - 'item_num'=> $cegNum, - )); - array_push($data, array( - 'item_id'=> $dropMeta['item_id'], - 'item_num'=> $dropMeta['num'], - )); - } - myself()->_rspData(array( - 'data' => $data - )); - } - - public function cancelOfferRewardMission($missionId, $propertyChgService) - { - foreach ($this->offerRewartdMission['missions'] as &$mission) { - if ($mission['mission_id'] == $missionId) { - foreach ($mission['objects'] as $obj) { - switch ($obj['type']) { - case 0: - { - Gun::Update - ($obj['id'], - array( - 'lock_type' => 0, - 'unlock_time' => 0 - )); - } - case 1: - { - Hero::Update - ($obj['id'], - array( - 'lock_type' => 0, - 'unlock_time' => 0 - )); - } - break; - default: - { - } - break; - } - } - $mission['sendtime'] = 0; - $mission['objects'] = array(); - error_log(json_encode($mission)); - } - } - $this->saveOfferRewardMission(); - $propertyChgService->addHeroChg(); - $propertyChgService->addGunChg(); - myself()->_rspData(array( - 'property_chg' => $propertyChgService->toDto(), - )); - } - - public function boostOfferRewardMission($missionId, $awardService, $propertyChgService) - { - $idx = 0; - $mission = null; - if (!$this->getOfferRewardMissionById($missionId, $mission, $idx)) { - myself()->_rspErr(1, 'mission_id parameter error'); - return; - } - /*$leftTime = max(0, ($mission['sendtime'] + $missionMeta['time'] + 1000)-myself()->_getNowTime()); - if ($leftTime > 0) { - myself()->_rspErr(1, 'mission_id parameter error' . $leftTime); - return; - }*/ - $missionMeta = mt\Task::get($missionId); - $missionDb = Mission::find($missionId); - $missionDto = $this->getMissionDto( - $this->userInfo, $this->seasonDb, $missionDb, $missionMeta); - $boost_ceg = \services\FormulaService::calcBoostMissionCeg($missionDto['ceg_num'],$missionDto['lefttime'],$missionMeta['time']); - if (!$missionMeta) { - myself()->_rspErr(1, 'mission_id parameter error3'); - return; - } - if (myself()->_getItemCount(V_ITEM_GOLD, $this->userInfo) < $boost_ceg){ - myself()->_rspErr(2, 'ceg not enough'); - return; - } - - myself()->_decItems(array( - array( - 'item_id' => V_ITEM_GOLD, - 'item_num' => $boost_ceg - ) - )); - $dropMeta = mt\Drop::get($missionMeta['reward']); - if (!$dropMeta) { - myself()->_rspErr(10, 'server internal error:' . $missionMeta['reward']); - return; - } - myself()->_scatterDrop('mission:' . $missionId, - $dropMeta, - $awardService, - $propertyChgService); - $this->receiveOfferRewardMission($missionId, - $awardService, - $propertyChgService); - $propertyChgService->addHeroChg(); - $propertyChgService->addGunChg(); - $propertyChgService->addUserChg(); - myself()->_rspData(array( - 'award' => $awardService->toDto(), - 'property_chg' => $propertyChgService->toDto(), - )); - } - - private function getOfferRewardMissionById($missionId, &$mission, &$idx) - { - $idx = 0; - $missions = &$this->getOfferRewardMissions(); - foreach ($missions as $k=>&$val) { - if ($val['mission_id'] == $missionId) { - $mission = $val; - $idx = $k; - return true; - } -// ++$idx; - } - return false; - } - - private function saveOfferRewardMission() - { - BigData::setData(BigData::OFFER_REWARD_MISSION_TYPE, - json_encode($this->offerRewartdMission)); - } - - private function saveDailyMission() - { - BigData::setData(BigData::DAILY_REWARD_MISSION_TYPE, - json_encode($this->dailyMission)); - } - - public function receiveOfferRewardMission($missionId, - $awardService, - $propertyChgService) - { - $idx = 0; - $mission = null; - if (!$this->getOfferRewardMissionById($missionId, $mission, $idx)) { - return; - } - //(PVE角色NFT每日获得极限(CEG)+PVE武器NFT每日获得极限(CEG))*90%/悬赏任务数量 - $totalHeroUpLimit = 0; - $totalGunUpLimit = 0; -// $count = $this->getOfferRewardMissionCount(); - $count = mt\Parameter::getVal - ('wanted_refresh_mission_num', 0); - $propertyChgService->addUserChg(); - foreach ($mission['objects'] as $obj) { - switch ($obj['type']) { - case 0: - { - //weapon - $gunDb = Gun::find($obj['id']); - if ($gunDb) { - $gunDto = Gun::toDto($gunDb); - $addGold = Gun::calcMissionGainGold($gunDto,$count); - $totalGunUpLimit += Gun::gainGoldMission($gunDto, $addGold); - Gun::Update - ($obj['id'], - array( - 'lock_type' => 0, - 'unlock_time' => 0 - )); - } - } - break; - case 1: - { - //hero - $heroDb = Hero::find($obj['id']); - if ($heroDb) { - $heroDto = Hero::toDto($heroDb); - $addGold = Hero::calcMissionGainGold($heroDto,$count); - $totalHeroUpLimit += Hero::gainGoldMission($heroDto, $addGold); - Hero::Update - ($obj['id'], - array( - 'lock_type' => 0, - 'unlock_time' => 0 - )); - } - } - break; - default: - { - } - break; - } - }//end foreach - $ceg = $totalHeroUpLimit + $totalGunUpLimit; - $rankActivityService = new RankActivityService(); - if ($count > 0 && $ceg > 0) { - myself()->_addVirtualItem(V_ITEM_GOLD, round($ceg,2)); - $awardService->addItem(V_ITEM_GOLD, round($ceg,2)); - $rankActivityService->updateBattleData($ceg); - } - - if ($totalHeroUpLimit>0){ - NftService::addNftActive($heroDto,1); - } - if ($totalGunUpLimit>0){ - NftService::addNftActive($gunDto,2); - } - $this->updateOfferRewardMission($missionId); - $this->saveOfferRewardMission(); - } - - public function getOfferRewardMissionCount() - { - $missions = getXVal($this->offerRewartdMission, 'missions', array()); - return count($missions); - } - - private function inOfferRewardMission($missionId) - { - foreach ($this->offerRewartdMission['missions'] as $mission) { - if ($mission['mission_id'] == $missionId) { - return true; - } - } - return false; - } - - private function calcCegPreview($objects) - { -// $count = $this->getOfferRewardMissionCount(); - $count = mt\Parameter::getVal - ('wanted_refresh_mission_num', 0); - $cegNum = 0; - foreach ($objects as $obj) { - $type = $obj['type']; - $id = $obj['id']; - switch ($type) { - case 0: - { - //武器 - $gunDb = Gun::find($id); - if ($gunDb) { - $gunDto = Gun::toDto($gunDb); - $cegNum += Gun::calcMissionGainGold($gunDto, $count); - } - } - break; - case 1: - { - //英雄 - $heroDb = Hero::find($id); - if ($heroDb) { - $heroDto = Hero::toDto($heroDb); - $cegNum += Hero::calcMissionGainGold($heroDto, $count); - } - } - break; - } - } - return round($cegNum,2); - } - -} +userInfo = $userInfo; + if ($seasonDb){ + $this->seasonDb = $seasonDb; + $seasonBattleData = json_decode($this->seasonDb['battle_data'], true); + if (!isset($seasonBattleData)) { + $seasonBattleData = array(); + } + $this->seasonBattleData = getXVal($seasonBattleData, 'season_data', array()); + $this->thisWeekBattleData = getXVal($seasonBattleData, 'this_week_data', array()); + if (myself()->_getDaySeconds(getXVal($this->thisWeekBattleData, 'modifytime', 0)) < + myself()->_getMondaySeconds()) { + $this->thisWeekBattleData = array( + 'createtime' => myself()->_getNowTime(), + 'modifytime' => myself()->_getNowTime(), + ); + } + } + $this->hisBattleData = Battle::getMyBattleData(); + $this->lastGameBattleData = getXVal($this->hisBattleData, 'last_game_data', array()); + $this->todayBattleData = getXVal($this->hisBattleData, 'today_data', array()); + if (myself()->_getDaySeconds(getXVal($this->todayBattleData, 'modifytime', 0)) < + myself()->_getNowDaySeconds()) { + $this->todayBattleData = array( + 'createtime' => myself()->_getNowTime(), + 'modifytime' => myself()->_getNowTime(), + ); + } + + +// $this->offerRewartdMission = BigData::getData(BigData::OFFER_REWARD_MISSION_TYPE); +// if (!$this->offerRewartdMission) { +// $this->offerRewartdMission = array( +// 'missions' => array(), +// 'refreshtime' => 0 +// ); +// } +// if (myself()->_getNowTime() - $this->offerRewartdMission['refreshtime'] >= 86400){ +// $this->refreshOfferRewardMission(); +// } + + $this->dailyMission = BigData::getData(BigData::DAILY_REWARD_MISSION_TYPE); + if (!$this->dailyMission) { + $this->dailyMission = array( + 'missions' => array(), + 'refreshtime' => 0 + ); + } + if (myself()->_getNowTime() - $this->dailyMission['refreshtime'] >= 86400){ + $this->refreshDailyRewardMission(); + } + } + + private function celRealityDto($total,$target,$current){ + if ($total > $target){ + $current = $current - ($total - $target); + if ($current < 0){ + $current = -1; + } + } + return $current; + } + + public function getMissionDto($userInfo, $seasonDb, $missionDb, $missionMeta) + { + $missionDto = array( + 'mission_id' => $missionMeta['id'], + 'last_game' => -1, + 'current' => 0, + 'target' => getXVal($missionMeta, 'target', 1), + 'state' => Mission::NOT_FINISHED_STATE, + 'objects' => array(), + 'lefttime' => 0, +// 'ceg_num' => 0, +// "awards" => array( +// V_ITEM_GOLD, +// mt\Drop::get($missionMeta['reward'])?mt\Drop::get($missionMeta['reward'])['item_id']:0 +// ) + ); + if ($missionDb) { + if ($missionMeta['type'] == mt\Task::DAILY_MISSON_TYPE) { + switch ($missionMeta['subtype']){ + case mt\Task::DAILY_ACTIVE_VALUE_MISSON_SUBTYPE : { + if (myself()->_getDaySeconds($missionDb['modifytime']) == myself()->_getNowDaySeconds()) { + $missionDto['current'] = $missionDto['target']; + $missionDto['state'] = Mission::RECEIVED_STATE; + return $missionDto; + } + } + break; + case mt\Task::WEAKLY_ACTIVE_VALUE_MISSON_SUBTYPE : { + if (myself()->_getMondaySecondsByTime($missionDb['modifytime']) == myself()->_getMondaySeconds()) { + $missionDto['current'] = $missionDto['target']; + $missionDto['state'] = Mission::RECEIVED_STATE; + return $missionDto; + } + } + break; + default : { + if (myself()->_getDaySeconds($missionDb['modifytime']) == myself()->_getNowDaySeconds()) { + $missionDto['current'] = $missionDto['target']; + $missionDto['state'] = Mission::RECEIVED_STATE; + return $missionDto; + } + } + } + } else { + if ($missionMeta['condition'] != mt\Task::OFFER_REWARD_COND) { + $missionDto['current'] = $missionDto['target']; + $missionDto['state'] = Mission::RECEIVED_STATE; + return $missionDto; + } + } + } + $handled = true; + + //统计上一场战斗的数据 + + $this->getGameMissionDto($missionDto,$missionMeta,$missionDto); + + $heroBattleInfo = $this->getHeroBattleInfo($missionDb, $missionMeta); + switch ($missionMeta['condition']) { + case mt\Task::DAILY_LOGIN_TIMES_COND: + { + //今日登陆 + $missionDto['current'] = myself()->_getDailyV(TN_DAILY_LOGINS, 0); + } + break; + case mt\Task::PLAYER_LEVEL_COND: + { + //玩家等级达到X + $missionDto['current'] = $this->userInfo['level']; + } + break; + case mt\Task::TOTAL_BATTLE_TIMES_COND: + { + //进行X场比赛 + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'total_battle_times'); + } + break; + case mt\Task::SHARE_GAME_TIMES_COND: + { + //分享1次游戏 + $missionDto['current'] = $this->getMissionV($missionMeta, + TN_DAILY_SHARE_GAMES, + TN_WEEKLY_SHARE_GAMES, + TN_SHARE_GAMES); + } + break; + case mt\Task::SINGLE_BATTLE_TIMES_COND: + { + //进行X场单人比赛 + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'total_single_battle_times'); + } + break; + case mt\Task::TEAM_BATTLE_TIMES_COND: + { + //进行X场组队比赛 + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'total_team_battle_times'); + } + break; + case mt\Task::SINGLE_BATTLE_RANK_COND: + { + //单人比赛排名前X + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'single_battle_rank'); + } + break; + case mt\Task::TEAM_BATTLE_RANK_COND: + { + //组队比赛排名前X次数 + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'total_team_top_X_battle_times'); + } + break; + case mt\Task::TOTAL_KILL_NUM_COND: + { + //累计击败X个敌人 + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'total_kills_times'); + } + break; + case mt\Task::TOTAL_DAMGE_OUT_COND: + { + //累计造成X点伤害 + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'total_damage_out'); + } + break; + case mt\Task::RESCUE_TEAMMATE_TIMES_COND: + { + //救援X个队友 + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'rescue_teammate_times'); + } + break; + case mt\Task::TOTAL_SURVIVAL_TIME_COND: + { + //累计生存X分钟 + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'total_alive_time'); + } + break; + case mt\Task::USE_WEAPON_KILL_NUM_COND: + { + //使用X枪械击杀Y个敌人 cond_param1=equip.type cond_param2=equip.sub_type + $missionDto['current'] = $this->getWeaponKills($missionMeta); + } + break; + case mt\Task::USE_WEAPON_DAMGE_OUT_COND: + { + //使用X种枪械对敌人累计造成Y点伤害 cond_param1=equip.type cond_param2=equip.sub_type + $missionDto['current'] = $this->getWeaponDamageOut($missionMeta); + } + break; + case mt\Task::USE_WEAPON_SLOT_TIMES_COND: + { + //使用某个槽位的次数 cond_param1=槽位 + $missionDto['current'] = $this->getWeaponSlotUseTimes($missionMeta); + } + break; + case mt\Task::GET_EQUIP_TIMES_COND: + { + //获得某种类型的装备 cond_param1=equip.type cond_param2=equip.sub_type + $missionDto['current'] = $this->getEquipObtainCount($missionMeta); + } + break; + case mt\Task::TOTAL_DIVING_TIMES_COND: + { + //累计潜水X次 + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'diving_times'); + } + break; + case mt\Task::TOTAL_DAMAGE_IN_COND: + { + //累计受到X点伤害 + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'total_damage_in'); + } + break; + case mt\Task::TOTAL_RECOVER_HP_COND: + { + //累计恢复X点血量 + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'total_recover_hp'); + } + break; + case mt\Task::TOTAL_OPEN_AIRDROP_COND: + { + //累计打开空投补给X次 + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'open_airdrop_times'); + } + break; + case mt\Task::BATTLE_IN_HERO_LV_COND: + { + //单局内英雄技能升级到X级 + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'max_hero_skill_lv'); + } + break; + case mt\Task::BATTLE_IN_GUN_LV_COND: + { + //单局内英雄专属枪械升到X级 cond_param1=英雄id + $missionDto['current'] = $this->getHeroSkillLv($missionDb, $missionMeta); + } + break; + case mt\Task::TOTAL_MEDICINE_TIMES_COND: + { + //累计使用X药品Y次 cond_param1=槽位 + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'use_medicine_times'); + } + break; + case mt\Task::TOTAL_DESTORY_CAR_TIMES_COND: + { + //累计破坏载具X个 + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'destory_car_times'); + } + break; + case mt\Task::TOTAL_USE_CAMOUFLAGE_TIMES_COND: + { + //累计使用X个伪装物 + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'use_camouflage_times'); + } + break; + case mt\Task::TOTAL_USE_SKILL_TIMES_COND: + { + //累计使用X次角色技能 + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'use_skill_times'); + } + break; + case mt\Task::RIDE_CAR_MOVE_DISTANCE_COND: + { + //驾驶或乘坐载具累计移动X米(所有模式) + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'ride_car_move_distance'); + } + break; + case mt\Task::RIDE_CAR_KILL_NUM_COND: + { + //驾驶或乘坐载具累计击杀X个敌人(所有模式) + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'ride_car_kills'); + } + break; + case mt\Task::LIKE_TEAMMATE_TIMES_COND: + { + //战斗结算中累计给队友点赞X次 + $missionDto['current'] = $this->getBattleData($missionDb, $missionMeta, + 'to_teammate_like_times'); + } + break; + case mt\Task::SEASON_LEVEL_COND: + { + //赛季段位达到X + $missionDto['current'] = $this->userInfo['rank']; + } + break; + case mt\Task::CONSUME_GOLD_COND: + { + //消耗X个金币 + $missionDto['current'] = myself()->_getDailyV(TN_DAILY_USED_GOLD_NUM, 0);; + } + break; + case mt\Task::BATTLE_RANK_COND: + { + //获得X级评价Y次 + $handled = false; + } + break; + case mt\Task::FINISHED_ALL_DAILY_MISSION_COND: + { + //完成所有每日任务 + $missionDto['current'] = myself()->_getDailyV(TN_DAILY_COMPLETE_TASK_NUM, 0); + } + break; + case mt\Task::SHOP_BUY_TIMES_COND: + { + //在X商店消费Y次 + $missionDto['current'] = $this->getMissionV($missionMeta, + TN_DAILY_SHOP, + TN_WEEKLY_SHOP, + TN_SHOP); + } + break; + case mt\Task::TOTAL_UPGRADE_TALENT_LV_COND: + { + //科研升级X次 + $missionDto['current'] = $this->getMissionV($missionMeta, + TN_DAILY_RECHARGE_UPGRADE_TIMES, + TN_WEEKLY_RECHARGE_UPGRADE_TIMES, + TN_RECHARGE_UPGRADE_TIMES); + } + break; + case mt\Task::TOTAL_GET_HERO_SKIN_COUNT_COND: + { + //累计获得X个角色时装 + $handled = false; + } + break; + case mt\Task::TOTAL_GET_GUN_SKIN_COUNT_COND: + { + //累计获得X个枪械皮肤 + $handled = false; + } + break; + case mt\Task::TOTAL_INVITE_FRIEND_TIMES_COND: + { + //邀请好友组队X次 + $handled = false; + } + break; + case mt\Task::TOTAL_GIVE_FRIEND_GOLD_COUNT_COND: + { + //赠送X个好友金币 + $handled = false; + } + break; + case mt\Task::TOTAL_INVITE_FRIEND_ONLINE_TIMES_COND: + { + //邀请X个好友上线 + $handled = false; + } + break; + case mt\Task::TOTAL_CREATE_OR_JOIN_GUILD_COUNT_COND: + { + //创建或加入1个战队 + $handled = false; + } + break; + case mt\Task::T1OTAL_CREATE_OR_JOIN_GUILD_COUNT_COND: + { + //段位达到X且进行Y场比赛 + $handled = false; + } + break; + case mt\Task::DAILY_ACTIVE_VALUE_COND: + { + //每日活跃度达到X + $missionDto['current'] = myself()->_getDailyV(TN_DAILY_ACTIVE, 0); + } + break; + case mt\Task::WEEKLY_ACTIVE_VALUE_COND: + { + //每周活跃度达到X + $missionDto['current'] = myself()->_getWeeklyV(TN_WEEKLY_ACTIVE, 0); + } + break; + case mt\Task::TOTAL_USE_HERO_BATTLE_TIMES_COND: + { + //使用英雄X进行Y次游戏 + $missionDto['current'] = getXVal($heroBattleInfo, "battle_times",0); + } + break; + case mt\Task::TOTAL_USE_HERO_SKILL_TIMES_COND: + { + //使用英雄X的技能Y次 + $missionDto['current'] = getXVal($heroBattleInfo, "use_skill_times",0); + } + break; + case mt\Task::TOTAL_USE_GRENADE_TIMES_COND: + { + //累积使用X次手雷 + $missionDto['current'] = $this->getWeaponSlotUseTimes($missionMeta); + } + break; + case mt\Task::TOTAL_USE_BURNING_SHOT_TIMES_COND: + { + //累积使用X次燃烧弹 + $missionDto['current'] = $this->getWeaponSlotUseTimes($missionMeta); + } + break; + case mt\Task::TOTAL_USE_HERO_DAMGE_OUT_COND: + { + //使用英雄X造成Y点伤害 + $missionDto['current'] = getXVal($heroBattleInfo, "damage_out",0); + } + break; + case mt\Task::TOTAL_USE_HERO_WINS_TIMES_COND: + { + //使用英雄X获得Y次胜利 + $missionDto['current'] = getXVal($heroBattleInfo, "win_times",0); + } + break; + case mt\Task::TOTAL_USE_HERO_KILLS_COND: + { + //使用英雄X击败Y个敌人 + $missionDto['current'] = getXVal($heroBattleInfo, "kills_times",0); + } + break; + case mt\Task::TOTAL_USE_MAP_WINS_TIMES_COND: + { + //在XX地图获得Y场胜利 + $missionDto['current'] = $this->getMapWinsTimes($missionMeta); + } + break; + case mt\Task::OFFER_REWARD_COND: + { + $this->getOfferRewardMissionInfo($missionDto, $missionMeta); + } + break; + default: + { + } + break; + } + //$missionDto['current'] = $missionDto['target']; + if ($missionDto['current'] >= $missionDto['target']) { + $missionDto['current'] = $missionDto['target']; + $missionDto['state'] = Mission::RECEIVEABLE_STATE; + } + if (!$handled) { + error_log(json_encode($missionDto)); + } + //$missionDto['state'] = Mission::RECEIVEABLE_STATE; + return $missionDto; + } + + private function getGameMissionDto($missionDb, $missionMeta,&$missionDto){ +// if ($missionMeta['id'] == 71041){ +// $heroBattleInfo = $this->getHeroBattleInfo($missionDb, $missionMeta); +// $lastGameHeroBattleInfo = $this->getLastGameHeroBattleInfo($missionDb, $missionMeta); +// print_r($lastGameHeroBattleInfo);die; +// } + if ($missionMeta['display']){ + $missionDto['last_game'] = 0; + $heroBattleInfo = $this->getHeroBattleInfo($missionDb, $missionMeta); + $lastGameHeroBattleInfo = $this->getLastGameHeroBattleInfo($missionDb, $missionMeta); + switch ($missionMeta['condition']) { + case mt\Task::DAILY_LOGIN_TIMES_COND: + { + //进行X场比赛 + $total = $this->getBattleData($missionDb, $missionMeta, 'total_battle_times'); + $current = $this->getLastGameData('total_battle_times'); + $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; + } + break; + case mt\Task::TEAM_BATTLE_RANK_COND: + { + //组队比赛排名前X次数 + $total = $this->getBattleData($missionDb, $missionMeta, 'total_team_top_X_battle_times'); + $current = $this->getLastGameData('total_team_top_X_battle_times'); + $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; + } + break; + case mt\Task::TOTAL_KILL_NUM_COND: + { + //累计击败X个敌人 + $total = $this->getBattleData($missionDb, $missionMeta, 'total_kills_times'); + $current = $this->getLastGameData('total_kills_times'); + $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; + } + break; + case mt\Task::TOTAL_DAMGE_OUT_COND: + { + //累计造成X点伤害 + $total = $this->getBattleData($missionDb, $missionMeta, 'total_damage_out'); + $current = $this->getLastGameData('total_damage_out'); + $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; + } + break; + case mt\Task::RESCUE_TEAMMATE_TIMES_COND: + { + //救援X个队友 + $total = $this->getBattleData($missionDb, $missionMeta, 'rescue_teammate_times'); + $current = $this->getLastGameData('rescue_teammate_times'); + $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; + } + break; + case mt\Task::TOTAL_SURVIVAL_TIME_COND: + { + //累计生存X分钟 + $total = $this->getBattleData($missionDb, $missionMeta, 'total_alive_time'); + $current = $this->getLastGameData('total_alive_time'); + $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; + } + break; + case mt\Task::TOTAL_USE_SKILL_TIMES_COND: + { + //累计使用X次角色技能 + $total = $this->getBattleData($missionDb, $missionMeta, 'use_skill_times'); + $current = $this->getLastGameData('use_skill_times'); + $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; + } + break; + case mt\Task::TOTAL_USE_HERO_BATTLE_TIMES_COND: + { + //使用英雄X进行Y次游戏 + $total = getXVal($heroBattleInfo, "battle_times",0); + $current = getXVal($lastGameHeroBattleInfo, "battle_times",0); + $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; + } + break; + case mt\Task::TOTAL_USE_HERO_SKILL_TIMES_COND: + { + //使用英雄X的技能Y次 + $total = getXVal($heroBattleInfo, "use_skill_times",0); + $current = getXVal($lastGameHeroBattleInfo, "use_skill_times",0); + $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; + + } + break; + case mt\Task::TOTAL_USE_GRENADE_TIMES_COND: + { + //累积使用X次手雷 + $total = $this->getWeaponSlotUseTimes($missionMeta); + $current = $this->getLastGameParamTimes($missionMeta,"weapons_slot_data"); + $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; + } + break; + case mt\Task::TOTAL_USE_BURNING_SHOT_TIMES_COND: + { + //累积使用X次燃烧弹 + $total = $this->getWeaponSlotUseTimes($missionMeta); + $current = $this->getLastGameParamTimes($missionMeta,"weapons_slot_data"); + $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; + } + break; + case mt\Task::TOTAL_USE_HERO_DAMGE_OUT_COND: + { + //使用英雄X造成Y点伤害 + $total = getXVal($heroBattleInfo, "damage_out",0); + $current = getXVal($lastGameHeroBattleInfo, "damage_out",0); + $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; + + } + break; + case mt\Task::TOTAL_USE_HERO_WINS_TIMES_COND: + { + //使用英雄X获得Y次胜利 + $total = getXVal($heroBattleInfo, "win_times",0); + $current = getXVal($lastGameHeroBattleInfo, "win_times",0); + $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; + + } + break; + case mt\Task::TOTAL_USE_HERO_KILLS_COND: + { + //使用英雄X击败Y个敌人 + $total = getXVal($heroBattleInfo, "kills_times",0); + $current = getXVal($lastGameHeroBattleInfo, "kills_times",0); + $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; + + } + break; + case mt\Task::TOTAL_USE_MAP_WINS_TIMES_COND: + { + //在XX地图获得Y场胜利 + $total = $this->getMapWinsTimes($missionMeta); + $current = $this->getLastGameParamTimes($missionMeta,"total_map_win_times"); + $missionDto['last_game'] = $this->celRealityDto($total,$missionMeta['target'],$current) ; + + } + } + } + } + + private function getLastGameData($key){ + $battleData = $this->lastGameBattleData; + $val = getXVal($battleData, $key, 0); + if ($key == 'total_alive_time'){ + $val = floor($val/1000/60); + } + return $val; + } + + private function getBattleData($missionDb, $missionMeta, $key) + { + //今天 + //本周 + //本季度 + //永久 + $val = 0; + $battleData = $this->internalGetBattleData($missionMeta); + $val = getXVal($battleData, $key, 0); + if ($key == 'total_alive_time'){ + $val = floor($val/1000/60); + } + return $val; + } + + private function internalGetBattleData($missionMeta) + { + $battleData = null; + if ($missionMeta['type'] == mt\Task::DAILY_MISSON_TYPE) { + $battleData = $this->todayBattleData; + } else { + if ($missionMeta['season_task'] == mt\Task::SEASON_MISSON_FLAG) { + if ($missionMeta['type'] == mt\Task::SEASONCARD_MISSON_TYPE && + $missionMeta['subtype'] == mt\Task::SEASON_WEAKLY_MISSON_SUBTYPE) { + $battleData = $this->thisWeekBattleData; + } else { + $battleData = $this->seasonBattleData; + } + } else { + $battleData = $this->hisBattleData; + } + } + return $battleData ? $battleData : array(); + } + + private function getMapWinsTimes($missionMeta){ + $val = 0; + $battleData = $this->internalGetBattleData($missionMeta); + $mapData = getXVal($battleData, 'total_map_win_times', null); + if ($mapData) { + $key = $missionMeta['param1']; + $val = getXVal($mapData, $key, 0); + } + return $val; + } + + private function getWeaponDamageOut($missionMeta) + { + $val = 0; + $battleData = $this->internalGetBattleData($missionMeta); + $weaponData = getXVal($battleData, 'weapon_type_data', null); + if ($weaponData) { + $key = $missionMeta['param1'] . '_' . $missionMeta['param2']; + $data = getXVal($weaponData, $key, null); + if ($data) { + $val = getXVal($data, 'damage_out', 0); + } + } + return $val; + } + + private function getWeaponKills($missionMeta) + { + $val = 0; + $battleData = $this->internalGetBattleData($missionMeta); + $weaponData = getXVal($battleData, 'weapon_type_data', null); + if ($weaponData) { + $key = $missionMeta['param1'] . '_' . $missionMeta['param2']; + $data = getXVal($weaponData, $key, null); + if ($data) { + $val = getXVal($data, 'kills', 0); + } + } + return $val; + } + + private function getWeaponSlotUseTimes($missionMeta) + { + $val = 0; + $battleData = $this->internalGetBattleData($missionMeta); + $weaponData = getXVal($battleData, 'weapons_slot_data', null); + if ($weaponData) { + $key = $missionMeta['param1']; + $val = getXVal($weaponData, $key, null); + } + return $val; + } + + private function getEquipObtainCount($missionMeta) + { + $val = 0; + $battleData = $this->internalGetBattleData($missionMeta); + $weaponData = getXVal($battleData, 'weapon_type_data', null); + if ($weaponData) { + $key = $missionMeta['param1'] . '_' . $missionMeta['param2']; + $data = getXVal($weaponData, $key, null); + if ($data) { + $val = getXVal($data, 'obtain_count', 0); + } + } + return $val; + } + + private function getHeroSkillLv($missionDb, $missionMeta) + { + //'max_single_battle_hero_weapon_lv' . $missionMeta['param1'] + $val = 0; + $battleData = $this->internalGetBattleData($missionMeta); + $heroData = getXVal($battleData, 'hero_data', null); + if ($weaponData) { + $key = $missionMeta['param1']; + $data = getXVal($heroData, $key, null); + if ($data) { + $val = getXVal($data, 'skill_lv', 0); + } + } + return $val; + } + + private function getHeroBattleInfo($missionDb, $missionMeta){ + $data = array(); + $battleData = $this->internalGetBattleData($missionMeta); + $heroBattleInfo = getXVal($battleData, 'hero_info', null); + if ($heroBattleInfo){ + $key = $missionMeta['param1']; + $data = getXVal($heroBattleInfo, $key, array()); + } + + return $data; + } + + private function getLastGameHeroBattleInfo($missionDb, $missionMeta){ + $data = array(); + $battleData = $this->lastGameBattleData; + $heroBattleInfo = getXVal($battleData, "hero_info", null); + if ($heroBattleInfo){ + $key = $missionMeta['param1']; + $data = getXVal($heroBattleInfo, $key, array()); + } + return $data; + } + + private function getLastGameParamTimes($missionMeta,$key){ + $val = 0; + $battleData = $this->lastGameBattleData; + $mapData = getXVal($battleData, $key, null); + if ($mapData) { + $key = $missionMeta['param1']; + $val = getXVal($mapData, $key, 0); + } + return $val; + } + + private function getMissionV($missionMeta, $dailyX, $weeklyX, $hisX, $y) + { + if ($missionMeta['type'] == mt\Task::DAILY_MISSON_TYPE) { + return myself()->_getDailyV($dailyX, $y); + } else { + if ($missionMeta['season_task'] == mt\Task::SEASON_MISSON_FLAG) { + if ($missionMeta['type'] == mt\Task::SEASONCARD_MISSON_TYPE && + $missionMeta['subtype'] == mt\Task::SEASON_WEAKLY_MISSON_SUBTYPE) { + return myself()->_getWeeklyV($dailyX, $y); + } + } + } + return myself()->_getV($x, $y); + } + + private function getMissionsCount(){ + $num = 0; + $missionHash = Mission::allToHash(); + if (count($this->offerRewartdMission['missions'])){ + foreach ($this->offerRewartdMission['missions'] as $val){ + $missionDb = getXVal($missionHash, $val['mission_id'], null); + $missionMeta = mt\Task::get($val['mission_id']); + $missionDto = $this->getMissionDto($this->userInfo, $this->seasonDb, $missionDb, $missionMeta); + if ($missionDto['state'] != 0){ + $num+=1; + } + } + } + return $num; + } + + private function refreshOfferRewardMission() + { + $wantedRefreshMissionNum = mt\Parameter::getVal + ('wanted_refresh_mission_num', 0); + if (count($this->offerRewartdMission['missions']) >= 10){ + return; + } + if ($wantedRefreshMissionNum <= +// count($this->offerRewartdMission['missions']) + $this->getMissionsCount() + ) { + return; + } + $metas = mt\Task::getOfferRewardMissions + ($this->offerRewartdMission['missions']); + if (count($metas)<1) { + return; + } + if (count($metas) == 1){ + $missList = array_keys($metas); + }else{ + $count = count($metas)>=5 ? 5 : count($metas); + $missList = array_rand($metas, $count); + } + foreach ($missList as $key) { + $meta = $metas[$key]; + if ($this->getMissionsCount() >= + $wantedRefreshMissionNum) { + break; + } + if (count($this->offerRewartdMission['missions']) >= 10) { + break; + } + if (!$this->inOfferRewardMission($meta['id'])) { + array_push($this->offerRewartdMission['missions'], + array( + 'mission_id' => $meta['id'], + 'createtime' => myself()->_getNowTime(), + 'modifytime' => myself()->_getNowTime(), + 'sendtime' => 0, + 'objects' => array(), + "awards" => array( + V_ITEM_GOLD, + mt\Drop::get($meta['reward'])?mt\Drop::get($meta['reward'])['item_id']:0 + ) + )); + } + } + $this->offerRewartdMission['refreshtime'] = myself()->_getDaySeconds(myself()->_getNowTime()); + $this->saveOfferRewardMission(); + } + + private function refreshDailyRewardMission(){ + $wantedMissionNum = mt\Parameter::getVal('daily_task_pick_num', 5); + $this->dailyMission['missions'] = array(); + $metas = mt\Task::getDaildyMission(); + if (count($metas) < $wantedMissionNum) { + return; + } + + foreach (array_rand($metas, $wantedMissionNum) as $key) { + $meta = $metas[$key]; + if (count($this->dailyMission['missions']) >= + $wantedMissionNum) { + break; + } + + array_push($this->dailyMission['missions'], + array( + 'mission_id' => $meta['id'], + 'createtime' => myself()->_getNowTime(), + 'modifytime' => myself()->_getNowTime(), +// 'sendtime' => 0, + 'objects' => array() + )); + + } + + $this->dailyMission['refreshtime'] = myself()->_getNowDaySeconds(); + $this->saveDailyMission(); + + } + + public function updateOfferRewardMission($missionId) + { + foreach ($this->offerRewartdMission['missions'] as $k=>&$mission) { + if ($mission['mission_id'] == $missionId) { + unset($this->offerRewartdMission['missions'][$k]); + } + } + +// $metas = mt\Task::getOfferRewardMissions +// ($this->offerRewartdMission['missions']); +// $selectMeta = null; +// shuffle($metas); +// foreach ($metas as $meta) { +// if (!$this->inOfferRewardMission($meta['id'])) { +// $selectMeta = $meta; +// break; +// } +// } +// +// if ($selectMeta) { +// foreach ($this->offerRewartdMission['missions'] as $k=>&$mission) { +// if ($mission['mission_id'] == $missionId) { +// $mission['mission_id'] = $selectMeta['id']; +// $mission['createtime'] = myself()->_getNowTime(); +// $mission['modifytime'] = myself()->_getNowTime(); +// $mission['sendtime'] = 0; +// $mission['objects'] = array(); +// break; +// } +// } +// } + + } + + public function &getOfferRewardMissions() + { + return $this->offerRewartdMission['missions']; + } + + public function getDailyMissions(){ + return $this->dailyMission['missions']; + } + + private function getOfferRewardMissionInfo(&$missionDto, $missionMeta) + { + foreach ($this->offerRewartdMission['missions'] as $mission) { + if ($mission['mission_id'] == $missionDto['mission_id']) { + if ($mission['sendtime'] > 0) { + $leftTime = max(0, ($mission['sendtime'] + $missionMeta['time'])-myself()->_getNowTime()); + $missionDto['lefttime'] = $leftTime; + if ($leftTime <= 0) { + $missionDto['state'] = 0; + } else { + $missionDto['state'] = 2; + } + } else { + $missionDto['state'] = 1; + } + $missionDto['objects'] = $mission['objects']; + $missionDto['ceg_num'] = $this->calcCegPreview($mission['objects']); + $missionDto['awards'][0].= ':'.$this->calcCegPreview($mission['objects']); + if (count($mission['objects']) > 0){ + $missionDto['awards'][1].=':'.'1' ; + }else{ + $missionDto['awards'][1].=':'.'0' ; + } + + } + } + } + + public function sendOfferRewardMission($missionId, $propertyChgService) + { + $missionMeta = mt\Task::get($missionId); + if (!$missionMeta) { + myself()->_rspErr(1, 'mission_id parameter error'); + return; + } + $idx = 0; + $mission = null; + if (!$this->getOfferRewardMissionById($missionId, $mission, $idx)) { + myself()->_rspErr(1, 'mission_id parameter error'); + return; + } + if ($mission['sendtime'] > 0) { + myself()->_rspErr(1, 'mission_id parameter error2'); + return; + } + $heroCount = 0; + $gunCount = 0; + $objects = explode('|', getReqVal('objects', 0)); + foreach ($objects as $val) { + $strings = explode(':', $val); + if (count($strings) < 2) { + continue; + } + $type = $strings[0]; + $id = $strings[1]; + switch ($type) { + case 0: + { + //武器 + ++$gunCount; + $gunDb = Gun::find($id); + if ($gunDb) { + array_push( + $mission['objects'], + array( + 'type' => $type, + 'id' => $id + ) + ); + } + } + break; + case 1: + { + //英雄 + ++$heroCount; + $heroDb = Hero::find($id); + if (!$heroDb) { + myself()->_rspErr(1, 'objects parameter error' . $id); + return; + } + if (Hero::heroIsLocking($heroDb)) { + myself()->_rspErr(1, 'hero is locking'); + return; + } + array_push( + $mission['objects'], + array( + 'type' => $type, + 'id' => $id + ) + ); + } + break; + } + } + error_log(json_encode(array( + 'heroCount' => $heroCount, + 'gunCount' => $gunCount, + 'param3' => $missionMeta['param3'], + 'param4' => $missionMeta['param4'], + ))); + if ($heroCount > $missionMeta['param3'] || $heroCount < $missionMeta['param3']) { + myself()->_rspErr(1, 'hero number error'); + return; + } + if ($gunCount > $missionMeta['param4']) { + myself()->_rspErr(1, 'gun number error'); + return; + } + $mission['sendtime'] = myself()->_getNowTime(); + { + foreach ($mission['objects'] as $obj) { + switch ($obj['type']) { + case 0: + { + Gun::Update + ($obj['id'], + array( + 'lock_type' => Gun::SEND_LOCK, + 'unlock_time' => myself()->_getNowTime() + $missionMeta['time'] + )); + } + case 1: + { + Hero::Update + ($obj['id'], + array( + 'lock_type' => Hero::SEND_LOCK, + 'unlock_time' => myself()->_getNowTime() + $missionMeta['time'] + )); + } + break; + default: + { + } + break; + } + } + } + error_log(json_encode($mission)); + $this->offerRewartdMission['missions'][$idx] = $mission; + $this->saveOfferRewardMission(); + $propertyChgService->addHeroChg(); + $propertyChgService->addGunChg(); + error_log(json_encode($this->offerRewartdMission)); + myself()->_rspData([ + 'property_chg' => $propertyChgService->toDto(), + ]); + } + + public function offerRewardMissionPreview($missionId) + { + $missionMeta = mt\Task::get($missionId); + if (!$missionMeta) { + myself()->_rspErr(1, 'mission_id parameter error'); + return; + } + $dropMeta = mt\Drop::get($missionMeta['reward']); + if (!$dropMeta) { + $this->_rspErr(10, 'server internal error:' . $missionMeta['reward']); + return; + } + $strings = explode('|', getReqVal('objects', 0)); + $objects = array(); + foreach ($strings as $str){ + $strings2 = explode(':', $str); + if (count($strings2) < 2) { + error_log(json_encode($_REQUEST)); + continue; + } + array_push($objects, + array( + 'type' => $strings2[0], + 'id' => $strings2[1], + )); + } + $cegNum = $this->calcCegPreview($objects); + $data = array(); + if ($objects && $objects[0]['type'] == 1){ + array_push($data,array( + 'item_id'=> V_ITEM_GOLD, + 'item_num'=> $cegNum, + )); + array_push($data, array( + 'item_id'=> $dropMeta['item_id'], + 'item_num'=> $dropMeta['num'], + )); + } + myself()->_rspData(array( + 'data' => $data + )); + } + + public function cancelOfferRewardMission($missionId, $propertyChgService) + { + foreach ($this->offerRewartdMission['missions'] as &$mission) { + if ($mission['mission_id'] == $missionId) { + foreach ($mission['objects'] as $obj) { + switch ($obj['type']) { + case 0: + { + Gun::Update + ($obj['id'], + array( + 'lock_type' => 0, + 'unlock_time' => 0 + )); + } + case 1: + { + Hero::Update + ($obj['id'], + array( + 'lock_type' => 0, + 'unlock_time' => 0 + )); + } + break; + default: + { + } + break; + } + } + $mission['sendtime'] = 0; + $mission['objects'] = array(); + error_log(json_encode($mission)); + } + } + $this->saveOfferRewardMission(); + $propertyChgService->addHeroChg(); + $propertyChgService->addGunChg(); + myself()->_rspData(array( + 'property_chg' => $propertyChgService->toDto(), + )); + } + + public function boostOfferRewardMission($missionId, $awardService, $propertyChgService) + { + $idx = 0; + $mission = null; + if (!$this->getOfferRewardMissionById($missionId, $mission, $idx)) { + myself()->_rspErr(1, 'mission_id parameter error'); + return; + } + /*$leftTime = max(0, ($mission['sendtime'] + $missionMeta['time'] + 1000)-myself()->_getNowTime()); + if ($leftTime > 0) { + myself()->_rspErr(1, 'mission_id parameter error' . $leftTime); + return; + }*/ + $missionMeta = mt\Task::get($missionId); + $missionDb = Mission::find($missionId); + $missionDto = $this->getMissionDto( + $this->userInfo, $this->seasonDb, $missionDb, $missionMeta); + $boost_ceg = \services\FormulaService::calcBoostMissionCeg($missionDto['ceg_num'],$missionDto['lefttime'],$missionMeta['time']); + if (!$missionMeta) { + myself()->_rspErr(1, 'mission_id parameter error3'); + return; + } + if (myself()->_getItemCount(V_ITEM_GOLD, $this->userInfo) < $boost_ceg){ + myself()->_rspErr(2, 'ceg not enough'); + return; + } + + myself()->_decItems(array( + array( + 'item_id' => V_ITEM_GOLD, + 'item_num' => $boost_ceg + ) + )); + $dropMeta = mt\Drop::get($missionMeta['reward']); + if (!$dropMeta) { + myself()->_rspErr(10, 'server internal error:' . $missionMeta['reward']); + return; + } + myself()->_scatterDrop('mission:' . $missionId, + $dropMeta, + $awardService, + $propertyChgService); + $this->receiveOfferRewardMission($missionId, + $awardService, + $propertyChgService); + $propertyChgService->addHeroChg(); + $propertyChgService->addGunChg(); + $propertyChgService->addUserChg(); + myself()->_rspData(array( + 'award' => $awardService->toDto(), + 'property_chg' => $propertyChgService->toDto(), + )); + } + + private function getOfferRewardMissionById($missionId, &$mission, &$idx) + { + $idx = 0; + $missions = &$this->getOfferRewardMissions(); + foreach ($missions as $k=>&$val) { + if ($val['mission_id'] == $missionId) { + $mission = $val; + $idx = $k; + return true; + } +// ++$idx; + } + return false; + } + + private function saveOfferRewardMission() + { + BigData::setData(BigData::OFFER_REWARD_MISSION_TYPE, + json_encode($this->offerRewartdMission)); + } + + private function saveDailyMission() + { + BigData::setData(BigData::DAILY_REWARD_MISSION_TYPE, + json_encode($this->dailyMission)); + } + + public function receiveOfferRewardMission($missionId, + $awardService, + $propertyChgService) + { + $idx = 0; + $mission = null; + if (!$this->getOfferRewardMissionById($missionId, $mission, $idx)) { + return; + } + //(PVE角色NFT每日获得极限(CEG)+PVE武器NFT每日获得极限(CEG))*90%/悬赏任务数量 + $totalHeroUpLimit = 0; + $totalGunUpLimit = 0; +// $count = $this->getOfferRewardMissionCount(); + $count = mt\Parameter::getVal + ('wanted_refresh_mission_num', 0); + $propertyChgService->addUserChg(); + foreach ($mission['objects'] as $obj) { + switch ($obj['type']) { + case 0: + { + //weapon + $gunDb = Gun::find($obj['id']); + if ($gunDb) { + $gunDto = Gun::toDto($gunDb); + $addGold = Gun::calcMissionGainGold($gunDto,$count); + $totalGunUpLimit += Gun::gainGoldMission($gunDto, $addGold); + Gun::Update + ($obj['id'], + array( + 'lock_type' => 0, + 'unlock_time' => 0 + )); + } + } + break; + case 1: + { + //hero + $heroDb = Hero::find($obj['id']); + if ($heroDb) { + $heroDto = Hero::toDto($heroDb); + $addGold = Hero::calcMissionGainGold($heroDto,$count); + $totalHeroUpLimit += Hero::gainGoldMission($heroDto, $addGold); + Hero::Update + ($obj['id'], + array( + 'lock_type' => 0, + 'unlock_time' => 0 + )); + } + } + break; + default: + { + } + break; + } + }//end foreach + $ceg = $totalHeroUpLimit + $totalGunUpLimit; + $rankActivityService = new RankActivityService(); + if ($count > 0 && $ceg > 0) { + myself()->_addVirtualItem(V_ITEM_GOLD, round($ceg,2)); + $awardService->addItem(V_ITEM_GOLD, round($ceg,2)); + $rankActivityService->updateBattleData($ceg); + } + + if ($totalHeroUpLimit>0){ + NftService::addNftActive($heroDto,1); + } + if ($totalGunUpLimit>0){ + NftService::addNftActive($gunDto,2); + } + $this->updateOfferRewardMission($missionId); + $this->saveOfferRewardMission(); + } + + public function getOfferRewardMissionCount() + { + $missions = getXVal($this->offerRewartdMission, 'missions', array()); + return count($missions); + } + + private function inOfferRewardMission($missionId) + { + foreach ($this->offerRewartdMission['missions'] as $mission) { + if ($mission['mission_id'] == $missionId) { + return true; + } + } + return false; + } + + private function calcCegPreview($objects) + { +// $count = $this->getOfferRewardMissionCount(); + $count = mt\Parameter::getVal + ('wanted_refresh_mission_num', 0); + $cegNum = 0; + foreach ($objects as $obj) { + $type = $obj['type']; + $id = $obj['id']; + switch ($type) { + case 0: + { + //武器 + $gunDb = Gun::find($id); + if ($gunDb) { + $gunDto = Gun::toDto($gunDb); + $cegNum += Gun::calcMissionGainGold($gunDto, $count); + } + } + break; + case 1: + { + //英雄 + $heroDb = Hero::find($id); + if ($heroDb) { + $heroDto = Hero::toDto($heroDb); + $cegNum += Hero::calcMissionGainGold($heroDto, $count); + } + } + break; + } + } + return round($cegNum,2); + } + +} diff --git a/webapp/services/TameBattleDataService.php b/webapp/services/TameBattleDataService.php index 265e1e24..ec8d308c 100644 --- a/webapp/services/TameBattleDataService.php +++ b/webapp/services/TameBattleDataService.php @@ -1005,11 +1005,19 @@ class TameBattleDataService extends BaseService { $this->incValue($battleData, 'total_team_top_X_battle_times', 1); } } + + if (!isset($battleData['total_map_win_times'])) { + $battleData['total_map_win_times'] = array(); + } + $mapId = getXVal($this->allInfo,'map_id', 0); + //排名 $ranked = getXVal($this->battleInfo,'pvp_team_rank', 0); if ($ranked == 1) { //吃鸡次数 $this->incValue($battleData, 'total_win_times', 1); + //地图吃鸡数 + $this->incValue($battleData['total_map_win_times'], $mapId, 1); } if ($ranked <= 3 && $ranked>0){ //排名前十 总次数 @@ -1055,6 +1063,7 @@ class TameBattleDataService extends BaseService { //单局最大存活时间 $this->maxValue($battleData, 'max_alive_time', $aliveTime); } + //救援次数 $this->incValue($battleData, 'rescue_teammate_times', getXVal($this->battleInfo,'rescue_teammate_times', 0)); //潜水次数 @@ -1126,16 +1135,12 @@ class TameBattleDataService extends BaseService { $tmpStrs1 = explode('|', getXVal($this->battleInfo,'weapons_slot', '')); foreach ($tmpStrs1 as $str) { $tmpStrs2 = explode(':', $str); - if (count($tmpStrs2) >= 4) { + if (count($tmpStrs2) >= 2) { list($weaponId, $use_times) = $tmpStrs2; $weaponMeta = mt\Equip::get($weaponId); if ($weaponMeta && $weaponMeta['inventory_slot'] > 0) { - $key = $weaponMeta['inventory_slot']; - if (!isset($weaponsSlotDb[$key])) { - $weaponsSlotDb[$key] = array(); - } //使用次数 - $this->incValue($weaponsSlotDb, 'use_times', $use_times); + $this->incValue($weaponsSlotDb, $weaponId, $use_times); } } } @@ -1175,37 +1180,27 @@ class TameBattleDataService extends BaseService { $battleData['hero_info'] = array(); } $heroInfo = &$battleData['hero_info']; - { - $hero_uniid = getXVal($this->battleInfo,'hero_uniid', ''); - $hero = Hero::find($hero_uniid); - if ($hero){ - if (!isset($heroInfo[$hero['hero_id']])){ - $heroInfo[$hero['hero_id']] = array(); - } - $this->incValue($heroInfo[$hero['hero_id']], "use_times", 1); //每个英雄使用次数 - $ranked = getXVal($this->battleInfo,'pvp_team_rank', 0); - if ($ranked == 1) { - //吃鸡次数 - $this->incValue($heroInfo[$hero['hero_id']], 'win_times', 1);//使用该英雄吃鸡获胜次数 - } - if ($ranked <= 10){ - //排名前十 总次数 - $this->incValue($heroInfo[$hero['hero_id']], 'top_ten_times', 1);//使用该英雄进前十次数 - } - if (!isset($heroInfo[$hero['hero_id']]['weapon'])){ - $heroInfo[$hero['hero_id']]['weapon'] = array(); - } - $weapon_uuid1 = getXVal($this->battleInfo,'weapon_uuid1', 0); - $weapon1 = Gun::find($weapon_uuid1); - if ($weapon1){ - $this->incValue($heroInfo[$hero['hero_id']]['weapon'], $weapon1['gun_id'], 1);//该英雄下选用每个武器的次数 - } - $weapon_uuid2 = getXVal($this->battleInfo,'weapon_uuid2', 0); - $weapon2 = Gun::find($weapon_uuid2); - if ($weapon2){ - $this->incValue($heroInfo[$hero['hero_id']]['weapon'], $weapon2['gun_id'], 1);//该英雄下选用每个武器的次数 - } - } + $heroId = $this->heroDto['hero_id']; + if (!isset($heroInfo[$heroId])){ + $heroInfo[$heroId] = array(); + } + $this->incValue($heroInfo[$heroId], "battle_times", 1); //英雄使用次数 + $ranked = getXVal($this->battleInfo,'pvp_team_rank', 0); + if ($ranked == 1) { + //吃鸡次数 + $this->incValue($heroInfo[$heroId], 'win_times', 1);//英雄吃鸡获胜次数 + } + //英雄释放技能数 + $this->incValue($heroInfo[$heroId], 'use_skill_times', getXVal($this->battleInfo,'use_skill_times', 0)); + //英雄击杀次数 + $kills = getXVal($this->battleInfo,'kills', 0); + if ($kills > 0) { + $this->incValue($heroInfo[$heroId], 'kills_times', $kills); + } + //英雄输出 + $damageOut = getXVal($this->battleInfo,'damage_out', 0); + if ($damageOut > 0) { + $this->incValue($heroInfo[$heroId], 'damage_out', $damageOut); } }