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->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(); // } } 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, // '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) { 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; 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 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(); } 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']; } 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)); } 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); } }