320 lines
12 KiB
PHP
320 lines
12 KiB
PHP
<?php
|
|
|
|
|
|
namespace services;
|
|
require_once('models/Hero.php');
|
|
require_once('models/HashRate.php');
|
|
require_once('models/HashRateBattleData.php');
|
|
require_once('models/GlobalData.php');
|
|
|
|
use models\GlobalData;
|
|
use models\HashRateBattleData;
|
|
use models\HashRate;
|
|
use models\Hero;
|
|
use mt\AchievementsPower;
|
|
use mt\ServerTask;
|
|
use mt\ServerTaskTime;
|
|
|
|
class HashRateService extends BaseService
|
|
{
|
|
const FINISHED_STATE = 1;
|
|
const NOT_FINISHED_STATE = 0;
|
|
|
|
private $hisBattleData = array();
|
|
private $hashRateData = array();
|
|
private $mobaBattleData = array();
|
|
private $pvpBattleData = array();
|
|
private $serverTaskData = array();
|
|
private $mobaBattleDataServerTask = array();
|
|
private $pvpBattleDataServerTask = array();
|
|
|
|
public function init()
|
|
{
|
|
|
|
$this->hisBattleData = HashRateBattleData::getMyBattleData();
|
|
$this->hashRateData = getXVal($this->hisBattleData, 'hash_rate_data', array());
|
|
if (!$this->hashRateData){
|
|
$this->hashRateData = array(
|
|
'pvpData' => array(),
|
|
'mobaData' => array(),
|
|
'createtime' => myself()->_getNowTime(),
|
|
'modifytime' => myself()->_getNowTime(),
|
|
);
|
|
}
|
|
$currentPeriod= \mt\AchievementsCycle::getPeriod();
|
|
if (myself()->_getDaySeconds(getXVal($this->hashRateData, 'modifytime', 0)) <
|
|
myself()->_getDaySeconds(strtotime($currentPeriod['obtain_start_time']))) {
|
|
$this->hashRateData = array(
|
|
'pvpData' => array(),
|
|
'mobaData' => array(),
|
|
'modifytime' => myself()->_getNowTime(),
|
|
);
|
|
}
|
|
$this->pvpBattleData = $this->hashRateData['pvpData'];
|
|
$this->mobaBattleData = $this->hashRateData['mobaData'];
|
|
|
|
$serverDataDb = GlobalData::getServerTaskData();
|
|
$this->serverTaskData = getXVal($serverDataDb, 'data', array());
|
|
if (!$this->serverTaskData){
|
|
$this->serverTaskData = array(
|
|
'pvpData' => array(),
|
|
'mobaData' => array(),
|
|
'createtime' => myself()->_getNowTime(),
|
|
'modifytime' => myself()->_getNowTime(),
|
|
);
|
|
}
|
|
$currentServerTask = \mt\ServerTaskTime::getCurrentTime();
|
|
if ($currentServerTask && myself()->_getDaySeconds(getXVal($this->serverTaskData, 'modifytime', 0)) <
|
|
myself()->_getDaySeconds(strtotime($currentServerTask['obtain_start_time']))) {
|
|
$this->serverTaskData = array(
|
|
'pvpData' => array(),
|
|
'mobaData' => array(),
|
|
'modifytime' => myself()->_getNowTime(),
|
|
);
|
|
}
|
|
$this->pvpBattleDataServerTask = $this->serverTaskData['pvpData'];
|
|
$this->mobaBattleDataServerTask = $this->serverTaskData['mobaData'];
|
|
}
|
|
|
|
|
|
|
|
public function hashRateTaskDto($taskMate ,$currentPeriod){
|
|
$taskDto = array(
|
|
'task_id' => $taskMate['id'],
|
|
'current' => 0,
|
|
'target' => getXVal($taskMate, 'Completed_quantity', 1),
|
|
'state' => self::NOT_FINISHED_STATE,
|
|
);
|
|
|
|
switch ($taskMate['Completion_type']){
|
|
//吃鸡或4v4获得胜利
|
|
case AchievementsPower::TOTAL_WINS_TIMES : {
|
|
$taskDto['current'] = $this->getBattleData($taskMate,
|
|
'total_win_times');
|
|
}
|
|
break;
|
|
//击杀人数
|
|
case AchievementsPower::TOTAL_KILL_TIMES : {
|
|
$taskDto['current'] = $this->getBattleData($taskMate,
|
|
'total_kills_times');
|
|
}
|
|
break;
|
|
//使用X道具
|
|
case AchievementsPower::USE_ITEM_TIMES : {
|
|
$taskDto['current'] = $this->getWeaponsSlotData($taskMate);
|
|
}
|
|
break;
|
|
//X分钟内结束比赛
|
|
case AchievementsPower::NOMINAL_TIME_BATTLE_END : {
|
|
$taskDto['current'] = $this->getBattleData($taskMate,
|
|
'total_fiveMin_times');
|
|
}
|
|
break;
|
|
//在局内升级最快次数
|
|
case AchievementsPower::IN_BATTLE_UP_LV : {
|
|
$taskDto['current'] = $this->getBattleData($taskMate,
|
|
'total_first_Lv_up');
|
|
}
|
|
break;
|
|
//游戏场次
|
|
case AchievementsPower::TOTAL_BATTLE_TIMES : {
|
|
$taskDto['current'] = $this->getBattleData($taskMate,
|
|
'total_battle_times');
|
|
}
|
|
break;
|
|
//最后一名次数
|
|
case AchievementsPower::TOTAL_LAST_RUNNER : {
|
|
$taskDto['current'] = $this->getBattleData($taskMate,
|
|
'total_last_runner_times');
|
|
}
|
|
break;
|
|
//救援队友数
|
|
case AchievementsPower::RESCUE_TEAMMATE_TIMES : {
|
|
$taskDto['current'] = $this->getBattleData($taskMate,
|
|
'total_rescue_times');
|
|
}
|
|
break;
|
|
//累计行走距离(米)
|
|
case AchievementsPower::WALKING_DISTANCE : {
|
|
$taskDto['current'] = $this->getBattleData($taskMate,
|
|
'total_walking_distance');
|
|
}
|
|
break;
|
|
//指定英雄升阶数
|
|
case AchievementsPower::HERO_UP_QUALITY : {
|
|
$state = false;
|
|
Hero::getHeroList(function ($row) use ($taskMate,&$state) {
|
|
if ($row['hero_id'] == $taskMate['condition'] && $row['quality'] >= $taskMate['Completed_quantity']){
|
|
$state = true;
|
|
}
|
|
});
|
|
if ($state){
|
|
$taskDto['current'] = $taskMate['Completed_quantity'];
|
|
}
|
|
}
|
|
break;
|
|
//拥有英雄nft数
|
|
case AchievementsPower::OWN_HERO_NFT_NUM : {
|
|
//...../
|
|
}
|
|
break;
|
|
//拥有芯片nft数
|
|
case AchievementsPower::OWN_CHIP_NFT_NUM : {
|
|
//....../
|
|
}
|
|
break;
|
|
//拥有金币数
|
|
case AchievementsPower::OWN_GOLD_NUM : {
|
|
$taskDto['current'] = myself()->_getPeriodV(TN_TOTAL_GATHER_GOLD,0);
|
|
}
|
|
break;
|
|
}
|
|
if ($taskDto['current'] >= $taskDto['target']) {
|
|
$taskDto['current'] = $taskDto['target'];
|
|
$taskDto['state'] = self::FINISHED_STATE;
|
|
$hashRateDb = HashRate::find($taskMate['id'],$currentPeriod['id']);
|
|
if (!$hashRateDb){
|
|
$fieldKv = array(
|
|
'account_id' => myself()->_getAccountId(),
|
|
'task_id' => $taskMate['id'],
|
|
'period' => $currentPeriod['id'],
|
|
'reward' => $taskMate['Reward_quantity'],
|
|
'createtime' => myself()->_getNowTime(),
|
|
'modifytime' => myself()->_getNowTime()
|
|
);
|
|
HashRate::add($fieldKv);
|
|
}
|
|
}
|
|
return $taskDto;
|
|
}
|
|
|
|
private function getBattleData($taskMate, $key)
|
|
{
|
|
$val = 0;
|
|
$battleData = $this->internalGetBattleData($taskMate);
|
|
$val = getXVal($battleData, $key, 0);
|
|
return $val;
|
|
}
|
|
|
|
private function internalGetBattleData($taskMate)
|
|
{
|
|
$battleData = null;
|
|
if ($taskMate['scene'] == AchievementsPower::PVP_SCENE) {
|
|
$battleData = $this->pvpBattleData;
|
|
} else if ($taskMate['scene'] == AchievementsPower::MOBA_SCENE){
|
|
$battleData = $this->mobaBattleData;
|
|
}
|
|
return $battleData ? $battleData : array();
|
|
}
|
|
|
|
private function getWeaponsSlotData($taskMate){
|
|
$val = 0;
|
|
$battleData = $this->internalGetBattleData($taskMate);
|
|
$slotData = isset($battleData['weapons_slot_data']) ? $battleData['weapons_slot_data'] : array();
|
|
if (array_key_exists($taskMate['condition'],$slotData)){
|
|
$val = $slotData[$taskMate['condition']];
|
|
}
|
|
return $val;
|
|
}
|
|
|
|
public function serverTaskDto($taskMate){
|
|
$taskDto = array(
|
|
'task_id' => $taskMate['id'],
|
|
'current' => 0,
|
|
'target' => getXVal($taskMate, 'target', 1),
|
|
'state' => self::NOT_FINISHED_STATE,
|
|
);
|
|
switch ($taskMate['condition']){
|
|
case ServerTask::TOTAL_BATTLE_TIMES_COND : {
|
|
$taskDto['current'] = $this->getServerTaskBattleData($taskMate,"total_battle_times");
|
|
}
|
|
break;
|
|
case ServerTask::TOTAL_KILL_NUM_COND :{
|
|
$taskDto['current'] = $this->getServerTaskBattleData($taskMate,"total_kills_times");
|
|
}
|
|
break;
|
|
case ServerTask::TOTAL_DAMGE_OUT_COND :{
|
|
$taskDto['current'] = $this->getServerTaskBattleData($taskMate,"total_damage_out");
|
|
}
|
|
break;
|
|
case ServerTask::TOTAL_USE_SKILL_TIMES_COND :{
|
|
$taskDto['current'] = $this->getServerTaskBattleData($taskMate,"use_skill_times");
|
|
}
|
|
}
|
|
if ($taskDto['current'] >= $taskDto['target']) {
|
|
$taskDto['current'] = $taskDto['target'];
|
|
$taskDto['state'] = self::FINISHED_STATE;
|
|
}
|
|
return $taskDto;
|
|
}
|
|
|
|
private function getServerTaskBattleData($taskMate, $key)
|
|
{
|
|
$val = 0;
|
|
$battleData = $this->internalGetServerTaskBattleData($taskMate);
|
|
$val = getXVal($battleData, $key, 0);
|
|
return $val;
|
|
}
|
|
|
|
private function internalGetServerTaskBattleData($taskMate)
|
|
{
|
|
$battleData = null;
|
|
if ($taskMate['type'] == ServerTask::MOBA_TYPE) {
|
|
$battleData = $this->mobaBattleDataServerTask;
|
|
} else if ($taskMate['type'] == ServerTask::PVP_TYPE){
|
|
$battleData = $this->pvpBattleDataServerTask;
|
|
}
|
|
return $battleData ? $battleData : array();
|
|
}
|
|
|
|
public function getServerASKBoxMode(){
|
|
$currentServerTask = \mt\ServerTaskTime::getCurrentTime();
|
|
if (myself()->_getNowTime() < strtotime($currentServerTask['income_start_time'])){
|
|
return \mt\ServerTask::NOT_DROP_STATE;
|
|
}
|
|
$taskList1 = array();
|
|
$taskList2 = array();
|
|
$taskListMeta = \mt\ServerTask::getMetaList();
|
|
foreach ($taskListMeta as $taskMeta){
|
|
if ($taskMeta['type'] == \mt\ServerTask::MOBA_TYPE){
|
|
$taskDto = $this->serverTaskDto($taskMeta);
|
|
array_push($taskList1,$taskDto);
|
|
}
|
|
if ($taskMeta['type'] == \mt\ServerTask::PVP_TYPE){
|
|
$taskDto = $this->serverTaskDto($taskMeta);
|
|
array_push($taskList2,$taskDto);
|
|
}
|
|
}
|
|
$mobaCount = 0;
|
|
$pvpCount = 0;
|
|
foreach ($taskList1 as $taskDto){
|
|
if ($taskDto['state'] == \services\HashRateService::FINISHED_STATE){
|
|
$mobaCount += 1;
|
|
}
|
|
}
|
|
foreach ($taskList2 as $taskDto){
|
|
if ($taskDto['state'] == \services\HashRateService::FINISHED_STATE){
|
|
$pvpCount += 1;
|
|
}
|
|
}
|
|
if ($mobaCount == count($taskList1)){
|
|
return \mt\ServerTask::MOBA_DROP_STATE;
|
|
}elseif ($pvpCount == count($taskList2)){
|
|
return \mt\ServerTask::PVP_DROP_STATE;
|
|
}else{
|
|
if ($mobaCount > $pvpCount){
|
|
return \mt\ServerTask::MOBA_DROP_STATE;
|
|
}elseif ($mobaCount < $pvpCount){
|
|
return \mt\ServerTask::PVP_DROP_STATE;
|
|
}else{
|
|
if (getXVal($this->mobaBattleDataServerTask,"modifytime", 0) < getXVal($this->pvpBattleDataServerTask,"modifytime", 0)){
|
|
return \mt\ServerTask::MOBA_DROP_STATE;
|
|
}else{
|
|
return \mt\ServerTask::PVP_DROP_STATE;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
} |