userInfo = $userInfo; $this->seasonDb = $seasonDb; $this->hisBattleData = Battle::getMyBattleData(); $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()); $this->todayBattleData = getXVal($seasonBattleData, 'today_data', array()); if (myself()->_getDaySeconds(getXVal($this->todayBattleData, 'modifytime', 0)) < myself()->_getNowDaySeconds()) { $this->todayBattleData = array( 'createtime' => myself()->_getNowTime(), 'modifytime' => myself()->_getNowTime(), ); } if (myself()->_getDaySeconds(getXVal($this->thisWeekBattleData, 'modifytime', 0)) < myself()->_getMondaySeconds()) { $this->thisWeekBattleData = array( 'createtime' => myself()->_getNowTime(), 'modifytime' => myself()->_getNowTime(), ); } $this->offerRewartdMission = BigData::getData(BigData::OFFER_REWARD_MISSION_TYPE); if (!$this->offerRewartdMission) { $this->offerRewartdMission = array(); } { $refreshTime = getXVal($this->offerRewartdMission, 'refreshtime'); if (myself()->_getNowDaySeconds() > $refreshTime) { $this->refreshOfferRewardMission(); } } } public function getMissionDto($userInfo, $seasonDb, $missionDb, $missionMeta) { $missionDto = array( 'mission_id' => $missionMeta['id'], 'current' => 0, 'target' => getXVal($missionMeta, 'target', 1), 'state' => Mission::NOT_FINISHED_STATE, 'objects' => array(), 'lefttime' => 0, ); if ($missionDb) { if ($missionMeta['type'] == mt\Task::DAILY_MISSON_TYPE) { if (myself()->_getDaySeconds($missionDb['modifytime']) == myself()->_getNowDaySeconds()) { $missionDto['current'] = $missionDto['target']; $missionDto['state'] = Mission::RECEIVED_STATE; return $missionDto; } } else { $missionDto['current'] = $missionDto['target']; $missionDto['state'] = Mission::RECEIVED_STATE; return $missionDto; } } $handled = true; 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, 'team_battle_rank'); } 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'] = $this->userInfo['consume_gold']; } break; case mt\Task::BATTLE_RANK_COND: { //获得X级评价Y次 $handled = false; } break; case mt\Task::FINISHED_ALL_DAILY_MISSION_COND: { //完成所有每日任务 } 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)); } return $missionDto; } private function getBattleData($missionDb, $missionMeta, $key) { //今天 //本周 //本季度 //永久 $val = 0; $battleData = $this->internalGetBattleData($missionMeta); $val = getXVal($battleData, $key, 0); 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 refreshOfferRewardMission() { $this->offerRewartdMission['refreshtime'] = myself()->_getNowTime(); $sentMissions = array(); foreach ($this->offerRewartdMission['missions'] as $mission) { if ($mission['sendtime'] > 0) { array_push($sentMissions, $mission); } } if (empty($this->offerRewartdMission['missions'])) { $this->offerRewartdMission['missions'] = array(); } $metas = mt\Task::getOfferRewardMissions($this->offerRewartdMission['missions']); $num = min(count($metas), mt\Parameter::getVal('wanted_refresh_mission_num', 0)); if ($num > 0) { $selectKeys = array_rand($metas, $num); if (!is_array($selectKeys)) { $selectKeys = array($selectKeys); } foreach ($selectKeys as $key) { $meta = $metas[$key]; array_push($this->offerRewartdMission['missions'], array( 'mission_id' => $meta['id'], 'createtime' => myself()->_getNowTime(), 'modifytime' => myself()->_getNowTime(), 'sendtime' => 0, 'objects' => array() )); } } $this->saveOfferRewardMission(); } public function getOfferRewardMissions() { return $this->offerRewartdMission['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, myself()->_getNowTime() - $mission['sendtime']); $missionDto['lefttime'] = $leftTime; if ($leftTime > 0) { $missionDto['state'] = 0; } else { $missionDto['state'] = 2; } } else { $missionDto['state'] = 2; } $missionDto['objects'] = $mission['objects']; } } } public function sendOfferRewardMission($missionId) { $missionMeta = mt\Task::get($missionId); if (!$missionMeta) { myself()->_rspErr(1, 'mission_id parameter error'); return; } $mission = &$this->getOfferRewardMissionById($missionId); if (!$mission) { myself()->_rspErr(1, 'mission_id parameter error'); return; } if ($mission['sendtime'] > 0) { myself()->_rspErr(1, 'mission_id parameter error2'); return; } $objects = explode('|', getReqVal('mission_id', 0)); foreach ($objects as $val) { $strings = explode(':', $val); $type = $strings[0]; $id = $strings[1]; switch ($type) { case 0: { array_push( $mission['objects'], array( 'type' => $type, 'id' => $id ) ); } break; case 1: { array_push( $mission['objects'], array( 'type' => $type, 'id' => $id ) ); } break; } } $mission['sendtime'] = myself()->_getNowTime(); myself()->_rspOk(); } public function boostOfferRewardMission($missionId) { $mission = &$this->getOfferRewardMissionById($missionId); if (!$mission) { myself()->_rspErr(1, 'mission_id parameter error'); return; } if ($mission['sendtime'] > 0) { myself()->_rspErr(1, 'mission_id parameter error2'); return; } $missionMeta = mt\Task::get($missionId); if (!$missionMeta) { myself()->_rspErr(1, 'mission_id parameter error2'); return; } if (myself()->_getItemCount(V_ITEM_DIAMOND, $this->userInfo) < $missionMeta['boost']){ myself()->_rspErr(2, 'diamond not enough'); return; } myself()->_decItems(array( array( 'item_id' => V_ITEM_DIAMOND, 'item_num' => $missionMeta['boost'] ) )); $this->removeOfferRewardMission($missionId); $this->saveOfferRewardMission(); myself()->_rspOk(); } private function getOfferRewardMissionById($missionId) { $missions = $this->getOfferRewardMissions(); foreach ($missions as $mission) { if ($mission['mission_id'] == $missionId) { return $mission; } } return null; } private function saveOfferRewardMission() { BigData::setData(BigData::OFFER_REWARD_MISSION_TYPE, json_encode($this->offerRewartdMission)); } private function removeOfferRewardMission($missionId) { $missions = array(); foreach ($this->offerRewartdMission['missions'] as $mission) { if ($mission['mission_id'] != $missionId) { array_push($missions, $mission); } } $this->offerRewartdMission['missions'] = $missions; } public function commitOfferRewardMission($missionMeta) { $missionId = $missionMeta['mission_id']; $mission = &$this->getOfferRewardMissionById($missionId); if (!$mission) { myself()->_rspErr(1, 'mission_id parameter error'); return; } if ($mission['sendtime'] > 0) { myself()->_rspErr(1, 'mission_id parameter error2'); return; } $this->removeOfferRewardMission($missionId); $this->saveOfferRewardMission(); myself()->_rspOk(); } }