1121 lines
39 KiB
PHP
1121 lines
39 KiB
PHP
<?php
|
||
|
||
namespace services;
|
||
|
||
require_once('mt/Task.php');
|
||
require_once('mt/Parameter.php');
|
||
require_once('mt/Drop.php');
|
||
|
||
require_once('models/Mission.php');
|
||
require_once('models/Battle.php');
|
||
require_once('models/BigData.php');
|
||
require_once('models/Hero.php');
|
||
require_once('models/Gun.php');
|
||
|
||
require_once('services/FormulaService.php');
|
||
require_once('services/RankActivityService.php');
|
||
|
||
use phpcommon\SqlHelper;
|
||
use mt;
|
||
use models\User;
|
||
use models\Mission;
|
||
use models\Battle;
|
||
use models\BigData;
|
||
use models\Hero;
|
||
use models\Gun;
|
||
|
||
/*
|
||
offer.reward.missions
|
||
{
|
||
"refreshtime": 0,
|
||
"missions": [
|
||
{
|
||
"mission_id": 100,
|
||
"createtime": 0,
|
||
"modifytime": 0,
|
||
"sendtime": 0,
|
||
"objects": [
|
||
{
|
||
"type": 1,
|
||
"id": 23142
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
*/
|
||
class MissionService extends BaseService {
|
||
|
||
private $userInfo = null;
|
||
private $seasonDb = null;
|
||
private $hisBattleData = array();
|
||
private $seasonBattleData = array();
|
||
private $thisWeekBattleData = array();
|
||
private $todayBattleData = array();
|
||
private $offerRewartdMission = array();
|
||
|
||
public function init($userInfo, $seasonDb)
|
||
{
|
||
$this->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);
|
||
}
|
||
|
||
}
|