869 lines
32 KiB
PHP
869 lines
32 KiB
PHP
<?php
|
||
|
||
require_once('models/User.php');
|
||
require_once('models/Hero.php');
|
||
require_once('models/Season.php');
|
||
require_once('models/Nft.php');
|
||
require_once('models/Gun.php');
|
||
require_once('models/UserSeasonRing.php');
|
||
require_once('models/Chip.php');
|
||
require_once('models/Battle.php');
|
||
|
||
require_once('mt/Parameter.php');
|
||
require_once('mt/Drop.php');
|
||
require_once('mt/Season.php');
|
||
require_once('mt/RankSeason.php');
|
||
require_once('mt/Hero.php');
|
||
require_once('mt/Rank.php');
|
||
require_once('mt/Item.php');
|
||
require_once('mt/PveGeminiMode.php');
|
||
require_once('mt/PveGemini.php');
|
||
|
||
require_once('services/AwardService.php');
|
||
require_once('services/PropertyChgService.php');
|
||
require_once('services/SeasonService.php');
|
||
require_once('services/NameService.php');
|
||
require_once('services/ChipPageService.php');
|
||
|
||
use phpcommon\SqlHelper;
|
||
use models\User;
|
||
use models\Hero;
|
||
use models\Gun;
|
||
use models\Season;
|
||
use models\Nft;
|
||
use models\Chip;
|
||
use models\UserSeasonRing;
|
||
use models\Battle;
|
||
|
||
class UserController extends BaseAuthedController {
|
||
private $init_rank = 'rank_init_rank';
|
||
private $init_elo = 'rank_init_elo';
|
||
|
||
public function login()
|
||
{
|
||
$this->updateSession(myself()->_getAccountId(),
|
||
myself()->_getSessionId());
|
||
//$user_name = $_REQUEST['name'];
|
||
//$avatar_url = $_REQUEST['avatar_url'];
|
||
$userName = 'guest';
|
||
$avatarUrl = '18003';
|
||
$userInfo = $this->_safeGetOrmUserInfo();
|
||
if (!$userInfo) {
|
||
$this->createNewUserV2($userName);
|
||
$this->_addFreeItem(); //送 50 Test_CEG
|
||
$userInfo = $this->_getOrmUserInfo();
|
||
$this->_setV(TN_RANK_STATUS, 0, 1);
|
||
//初始化芯片页
|
||
$chipPageObj = new services\ChipPageService();
|
||
$chipPageObj->init();
|
||
}
|
||
//elo score 衰减
|
||
$this->dampingElo($userInfo);
|
||
$userInfo = $this->_getOrmUserInfo();
|
||
//跟新登录时间
|
||
$this->_updateUserInfo(array(
|
||
'last_login_time'=>myself()->_getNowTime(),
|
||
));
|
||
$this->updateLastSeason($userInfo);
|
||
$this->_rspData(array(
|
||
'info' => User::show($userInfo),
|
||
));
|
||
$this->_incDailyV(TN_DAILY_LOGINS, 0, 1);
|
||
}
|
||
|
||
private function _addFreeItem2(){
|
||
//添加芯片
|
||
$chipMeta = \mt\Item::getMetaListByType(\mt\Item::CHIP_TYPE);
|
||
$chip1 = array();
|
||
$chip2 = array();
|
||
$chip3 = array();
|
||
foreach ($chipMeta as $row){
|
||
if ($row['sub_type'] == 1){
|
||
array_push($chip1,$row);
|
||
}else if($row['sub_type'] == 2){
|
||
array_push($chip2,$row);
|
||
}else if($row['sub_type'] == 3){
|
||
array_push($chip3,$row);
|
||
}
|
||
}
|
||
for ($i=1;$i<=20;$i++){
|
||
$row1 = $chip1[array_rand($chip1)];
|
||
Chip::addChip($row1);
|
||
$row2 = $chip2[array_rand($chip2)];
|
||
Chip::addChip($row2);
|
||
$row3 = $chip3[array_rand($chip3)];
|
||
Chip::addChip($row3);
|
||
}
|
||
//添加枪械和Gold
|
||
$addItems =array();
|
||
foreach (mt\Parameter::getListValue('creator_present_items') as $itemsStr) {
|
||
list($itemId, $itemNum) = explode(':', $itemsStr);
|
||
if ($itemNum > 0) {
|
||
array_push($addItems,
|
||
array(
|
||
'item_id' => $itemId,
|
||
'item_num' => $itemNum
|
||
));
|
||
}
|
||
}
|
||
array_push($addItems,
|
||
array(
|
||
'item_id' => V_ITEM_GOLD,
|
||
'item_num' => 100000
|
||
));
|
||
array_push($addItems,
|
||
array(
|
||
'item_id' => V_ITEM_DIAMOND,
|
||
'item_num' => 100000
|
||
));
|
||
$awardService = new services\AwardService();
|
||
$propertyChgService = new services\PropertyChgService();
|
||
$this->_addItems($addItems, $awardService, $propertyChgService);
|
||
|
||
//添加英雄和皮肤
|
||
$itemIds = array(30100,30200, 30300, 30400,30500,30600,30700,30900,31000,40701,40702,40901,40902,41001,40102);
|
||
$addItems2 =array();
|
||
foreach ($itemIds as $row){
|
||
array_push($addItems2,
|
||
array(
|
||
'item_id' => $row,
|
||
'item_num' => 1
|
||
));
|
||
}
|
||
$this->_addItems($addItems2, $awardService, $propertyChgService);
|
||
}
|
||
|
||
private function _addFreeItem(){
|
||
$addItems =array();
|
||
foreach (mt\Parameter::getListValue('creator_present_items') as $itemsStr) {
|
||
list($itemId, $itemNum) = explode(':', $itemsStr);
|
||
if ($itemNum > 0) {
|
||
array_push($addItems,
|
||
array(
|
||
'item_id' => $itemId,
|
||
'item_num' => $itemNum
|
||
));
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
if (SERVER_ENV == _TEST) {
|
||
|
||
array_push($addItems,
|
||
array(
|
||
'item_id' => V_ITEM_GOLD,
|
||
'item_num' => 500000
|
||
));
|
||
$itemIds = array(30100,30700,30900,40702,40902,40102);
|
||
foreach ($itemIds as $row){
|
||
array_push($addItems,
|
||
array(
|
||
'item_id' => $row,
|
||
'item_num' => 1
|
||
));
|
||
}
|
||
|
||
}
|
||
|
||
$awardService = new services\AwardService();
|
||
$propertyChgService = new services\PropertyChgService();
|
||
$this->_addItems($addItems, $awardService, $propertyChgService);
|
||
}
|
||
|
||
|
||
private function loginCheck($userInfo)
|
||
{
|
||
$seasonService = new services\SeasonService();
|
||
return $seasonService->checkSeason($userInfo);
|
||
}
|
||
|
||
private function createNewUser($userName, $avatarUrl)
|
||
{
|
||
$initRankParameterMeta = mt\Parameter::getByName($this->init_rank);
|
||
$initRankMeta = mt\Rank::getRankById($initRankParameterMeta['param_value']);
|
||
$currSeasonMeta = mt\Season::getCurrentSeason();
|
||
$gold = 0;
|
||
$diamond = 0;
|
||
$heroList = array();
|
||
$haveHeadHeroList = array();
|
||
$headList = array();
|
||
$headFrameList = array();
|
||
$addItems = array();
|
||
{
|
||
foreach (mt\Parameter::getListValue('creator_hero_id') as $heroId) {
|
||
$heroMeta = mt\Item::get($heroId);
|
||
if ($heroMeta) {
|
||
Hero::addHero($heroMeta);
|
||
array_push($heroList, $heroMeta);
|
||
if ($heroMeta['hero_head']) {
|
||
array_push($haveHeadHeroList, $heroMeta);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
{
|
||
foreach (mt\Parameter::getListValue('creator_present_items') as $itemsStr) {
|
||
list($itemId, $itemNum) = explode(':', $itemsStr);
|
||
if ($itemNum > 0) {
|
||
switch ($itemId) {
|
||
case V_ITEM_GOLD:
|
||
{
|
||
$gold += $itemNum;
|
||
}
|
||
break;
|
||
case V_ITEM_DIAMOND:
|
||
{
|
||
$diamond += $itemNum;
|
||
}
|
||
break;
|
||
default:
|
||
{
|
||
$itemMeta = mt\Item::get($itemId);
|
||
switch ($itemMeta['type']) {
|
||
case mt\Item::HEAD_TYPE:
|
||
{
|
||
array_push($headList, $itemId);
|
||
}
|
||
break;
|
||
case mt\Item::HEAD_FRAME_TYPE:
|
||
{
|
||
array_push($headFrameList, $itemId);
|
||
}
|
||
break;
|
||
default:
|
||
{
|
||
array_push($addItems,
|
||
array(
|
||
'item_id' => $itemId,
|
||
'item_num' => $itemNum
|
||
));
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
$headId = !empty($headList) ? $headList[rand() % count($headList)] : 0;
|
||
$headFrame = !empty($headFrameList) ? $headFrameList[rand() % count($headFrameList)] : 0;
|
||
$heroUniId = 0;
|
||
$heroId = !empty($heroList) ? $heroList[rand() % count($heroList)]['id'] : 0;
|
||
if ($headId == 0 || count($headList) <= 1) {
|
||
$headId = !empty($haveHeadHeroList) ?
|
||
$haveHeadHeroList[rand() % count($haveHeadHeroList)]['hero_head'] : 0;
|
||
}
|
||
//Hero::randHero($heroUniId, $heroId);
|
||
SqlHelper::upsert
|
||
($this->_getSelfMysql(),
|
||
't_user',
|
||
array(
|
||
'account_id' => $this->_getAccountId()
|
||
),
|
||
array(
|
||
),
|
||
array(
|
||
'account_id' => $this->_getAccountId(),
|
||
'channel' => $this->_getChannel(),
|
||
'name' => $userName,
|
||
'sex' => rand() % 2,
|
||
#'avatar_url' => $avatar_url,
|
||
'gold' => $gold,
|
||
'diamond' => $diamond,
|
||
'head_frame' => $headFrame,
|
||
'level' => 1,
|
||
'exp' => 0,
|
||
'rank' => $initRankMeta ? $initRankMeta['id'] : 1,
|
||
'history_best_rank' => $initRankMeta ? $initRankMeta['id'] : 1,
|
||
'score' => $initRankMeta ? $initRankMeta['rank_score'] : 0,
|
||
'history_best_score' => $initRankMeta ? $initRankMeta['rank_score'] : 0,
|
||
'head_id' => $headId,
|
||
'hero_id' => $heroId,
|
||
'last_season_id' => $currSeasonMeta ? $currSeasonMeta['id'] : 0,
|
||
'head_list' => json_encode($headList),
|
||
'head_frame_list' => json_encode($headFrameList),
|
||
'score_modifytime' => $this->_getNowTime(),
|
||
'best_rank_modifytime' => $this->_getNowTime(),
|
||
'createtime' => $this->_getNowTime(),
|
||
'modifytime' => $this->_getNowTime(),
|
||
'last_login_time' => $this->_getNowTime(),
|
||
)
|
||
);
|
||
$awardService = new services\AwardService();
|
||
$propertyChgService = new services\PropertyChgService();
|
||
$this->_addItems($addItems, $awardService, $propertyChgService);
|
||
}
|
||
|
||
public function beforeActive(){
|
||
$userInfo = $this->_getOrmUserInfo();
|
||
$hero = Hero::getFreeHero();
|
||
if (!$hero){
|
||
$this->_rspErr(1, "No free heroes");
|
||
return;
|
||
}
|
||
$gun = Gun::getFreeGun();
|
||
if (!$gun){
|
||
$this->_rspErr(1, "No free weapons");
|
||
return;
|
||
}
|
||
|
||
$paramMeta = mt\Parameter::getByName('bceg_max');
|
||
$bceg_max = $paramMeta?$paramMeta['param_value']:3720;
|
||
$before = array(
|
||
'hero' =>$hero,
|
||
'gun' =>$gun,
|
||
'bceg_max' => $userInfo['bceg'],
|
||
'bceg' => min($userInfo['bceg'],$bceg_max)
|
||
);
|
||
$after = array(
|
||
'hero' =>$hero,
|
||
'gun' =>$gun,
|
||
'ceg' => min($userInfo['bceg'],$bceg_max)
|
||
);
|
||
$cost = 0;
|
||
$cost += \services\FormulaService::Calc_Hero_Convert_Cost($hero);
|
||
$cost += \services\FormulaService::Calc_Weapon_Convert_Cost($hero);
|
||
$cost += \services\FormulaService::Calc_BCEG_Convert_Cost($userInfo['bceg']);
|
||
$this->_rspData(array(
|
||
'before' => $before,
|
||
'after' => $after,
|
||
'cost' => $cost,
|
||
));
|
||
}
|
||
|
||
public function active()
|
||
{
|
||
$this->_rspOk();return;
|
||
$hero_uniid = getReqVal('hero_uniid', 0);
|
||
$gun_uniid = getReqVal('gun_uniid', 0);
|
||
|
||
$userInfo = $this->_getOrmUserInfo();
|
||
if ($userInfo['activated']) {
|
||
$this->_rspErr(10, 'User Activated');
|
||
return;
|
||
}
|
||
$heroDb = Hero::find($hero_uniid);
|
||
if (!$heroDb || !empty($heroDb['token_id'])) {
|
||
$this->_rspErr(1, 'Parameter error, illegal hero_uniid');
|
||
return;
|
||
}
|
||
$gunDb = Gun::find($gun_uniid);
|
||
if (!$gunDb || !empty($gunDb['token_id'])) {
|
||
$this->_rspErr(1, 'Parameter error, illegal gun_uniid');
|
||
return;
|
||
}
|
||
{
|
||
//转换NFT的手续费(U)
|
||
$cost = 0;
|
||
$cost += \services\FormulaService::Calc_Hero_Convert_Cost($heroDb);
|
||
$cost += \services\FormulaService::Calc_Weapon_Convert_Cost($gunDb);
|
||
$cost += \services\FormulaService::Calc_BCEG_Convert_Cost($userInfo['bceg']);
|
||
}
|
||
$paramMeta = mt\Parameter::getByName('bceg_max');
|
||
$bceg = $paramMeta?$paramMeta['param_value']:3720;
|
||
$ceg = min($bceg,$userInfo['bceg']);
|
||
$this->_updateUserInfo(array(
|
||
'activated' => 1,
|
||
'bceg' => 0,
|
||
'gold' => function () use($ceg) {
|
||
return "gold + {$ceg}";
|
||
}
|
||
));
|
||
$hero_token_id = Nft::addNft(\mt\Item::get($heroDb['hero_id']));
|
||
Hero::update($heroDb['idx'],array(
|
||
'token_id'=>$hero_token_id,
|
||
'account_id' => null
|
||
));
|
||
|
||
$gun_token_id = Nft::addNft(\mt\Item::get($gunDb['gun_id']));
|
||
Gun::update($gunDb['idx'],array(
|
||
'token_id'=>$gun_token_id,
|
||
'account_id' => null
|
||
));
|
||
$propertyChgService = new services\PropertyChgService();
|
||
$propertyChgService->addUserChg();
|
||
$propertyChgService->addHeroChg();
|
||
$propertyChgService->addGunChg();
|
||
$this->_rspData(array(
|
||
'data'=>array(
|
||
'hero_id' => $heroDb['hero_id'],
|
||
'gun_id' => $gunDb['gun_id'],
|
||
'ceg' => $ceg,
|
||
),
|
||
'property_chg' => $propertyChgService->toDto()
|
||
));
|
||
}
|
||
|
||
public function update()
|
||
{
|
||
$userInfo = $this->_getOrmUserInfo();
|
||
$validFields = array(
|
||
'sex' => array(
|
||
'field_name' => 'sex',
|
||
'val_func' => function ($val) {
|
||
return $val;
|
||
},
|
||
'valid_func' => function ($val, &$errCode, &$errMsg) use($userInfo) {
|
||
if (isValidSex($val)) {
|
||
return true;
|
||
} else {
|
||
$errCode = 1;
|
||
$errMsg = 'sex parameter error';
|
||
return false;
|
||
}
|
||
}
|
||
),
|
||
'head_id' => array(
|
||
'field_name' => 'head_id',
|
||
'val_func' => function ($val) {
|
||
return $val;
|
||
},
|
||
'valid_func' => function ($val, &$errCode, &$errMsg) use($userInfo) {
|
||
if (User::isValidHeadId($userInfo, $val)) {
|
||
return true;
|
||
} else {
|
||
$errCode = 1;
|
||
$errMsg = 'head_id parameter error';
|
||
return false;
|
||
}
|
||
}
|
||
),
|
||
'head_frame' => array(
|
||
'field_name' => 'head_frame',
|
||
'val_func' => function ($val) {
|
||
return $val;
|
||
},
|
||
'valid_func' => function ($val, &$errCode, &$errMsg) use($userInfo) {
|
||
if (User::isValidHeadFrame($userInfo, $val)) {
|
||
return true;
|
||
} else {
|
||
$errCode = 1;
|
||
$errMsg = 'head_id parameter error';
|
||
return false;
|
||
}
|
||
}
|
||
),
|
||
'hero_id' => array(
|
||
'field_name' => 'hero_id',
|
||
'val_func' => function ($val) {
|
||
return $val;
|
||
},
|
||
'valid_func' => function ($val, &$errCode, &$errMsg) use ($userInfo) {
|
||
if (User::isValidHeroId($userInfo, $val)) {
|
||
return true;
|
||
} else {
|
||
$errCode = 1;
|
||
$errMsg = 'hero_id parameter error';
|
||
return false;
|
||
}
|
||
}
|
||
),
|
||
'first_fight' => array(
|
||
'field_name' => 'first_fight',
|
||
'val_func' => function ($val) {
|
||
return empty($val) ? 0 : 1;
|
||
},
|
||
'valid_func' => function ($val, &$errCode, &$errMsg) {
|
||
return true;
|
||
}
|
||
),
|
||
'already_guide' => array(
|
||
'field_name' => 'already_guide',
|
||
'val_func' => function ($val) {
|
||
return empty($val) ? 0 : 1;
|
||
},
|
||
'valid_func' => function ($val, &$errCode, &$errMsg) {
|
||
return true;
|
||
}
|
||
),
|
||
'guild_id' => array(
|
||
'field_name' => 'guild_id',
|
||
'val_func' => function ($val) {
|
||
return empty($val) ? '' : $val;
|
||
},
|
||
'valid_func' => function ($val, &$errCode, &$errMsg) {
|
||
return true;
|
||
}
|
||
),
|
||
'guild_job' => array(
|
||
'field_name' => 'guild_job',
|
||
'val_func' => function ($val) {
|
||
return empty($val) ? 0 : $val;
|
||
},
|
||
'valid_func' => function ($val, &$errCode, &$errMsg) {
|
||
return true;
|
||
}
|
||
),
|
||
'guild_name' => array(
|
||
'field_name' => 'guild_name',
|
||
'val_func' => function ($val) {
|
||
return empty($val) ? '' : $val;
|
||
},
|
||
'valid_func' => function ($val, &$errCode, &$errMsg) {
|
||
return true;
|
||
}
|
||
),
|
||
'parachute' => array(
|
||
'field_name' => 'parachute',
|
||
'val_func' => function ($val) {
|
||
return $val;
|
||
},
|
||
'valid_func' => function ($val, &$errCode, &$errMsg) {
|
||
if (User::isValidParachute($val)) {
|
||
return true;
|
||
} else {
|
||
$errCode = 1;
|
||
$errMsg = 'parachute parameter error';
|
||
return false;
|
||
}
|
||
}
|
||
),
|
||
'ring_id' => array(
|
||
'field_name' => 'ring_id',
|
||
'val_func' => function ($val) {
|
||
return $val;
|
||
},
|
||
'valid_func' => function ($val, &$errCode, &$errMsg) {
|
||
if (User::isValidRing($val)) {
|
||
return true;
|
||
} else {
|
||
$errCode = 1;
|
||
$errMsg = 'ring_id parameter error';
|
||
return false;
|
||
}
|
||
}
|
||
)
|
||
);
|
||
$fieldsKv = array();
|
||
$errCod = 0;
|
||
$errMsg = '';
|
||
foreach ($validFields as $key => $field) {
|
||
$reqVal = getReqVal($key, null);
|
||
if (!is_null($reqVal)) {
|
||
if (isset($field['valid_func'])) {
|
||
if (!$field['valid_func']($reqVal, $errCod, $errMsg)) {
|
||
$this->_rspErr($errCod, $errMsg);
|
||
return;
|
||
}
|
||
$fieldsKv[$field['field_name']] = $field['val_func']($reqVal);
|
||
}
|
||
}
|
||
}
|
||
|
||
if (count($fieldsKv) > 0) {
|
||
$this->_updateUserInfo($fieldsKv);
|
||
}
|
||
$propertyChgService = new services\PropertyChgService();
|
||
$propertyChgService->addUserChg();
|
||
$propertyChgService->addHeroChg();
|
||
$this->_rspData(array(
|
||
'property_chg' => $propertyChgService->toDto()
|
||
));
|
||
}
|
||
|
||
public function info()
|
||
{
|
||
$targetId = getReqVal('target_id', '');
|
||
$userDb = SqlHelper::ormSelectOne
|
||
($this->_getMysql($targetId),
|
||
't_user',
|
||
array(
|
||
'account_id' => $targetId
|
||
)
|
||
);
|
||
if (!$userDb) {
|
||
$this->_rspErr(1, 'Account does not exist');
|
||
return;
|
||
}
|
||
$this->_rspData(array(
|
||
'info' => User::info($userDb)
|
||
));
|
||
}
|
||
|
||
public function query()
|
||
{
|
||
$name = getReqVal('name', '');
|
||
$filter = array(
|
||
'name' => $name,
|
||
);
|
||
if (SERVER_ENV == _ONLINE) {
|
||
$filter['channel'] = BC_CHANNEL;
|
||
}
|
||
$userDb = SqlHelper::ormSelectOne
|
||
($this->_getMysql($name),
|
||
't_user',
|
||
$filter
|
||
);
|
||
if (!$userDb) {
|
||
$this->_rspErr(1, 'not found');
|
||
return;
|
||
}
|
||
$channel = phpcommon\extractChannel($userDb['account_id']);
|
||
if ($channel != BC_CHANNEL) {
|
||
if (SERVER_ENV == _ONLINE) {
|
||
$this->_rspErr(1, 'not found');
|
||
return;
|
||
}
|
||
}
|
||
$this->_rspData(array(
|
||
'info' => User::info($userDb)
|
||
));
|
||
}
|
||
|
||
public function detailInfo()
|
||
{
|
||
$targetId = getReqVal('target_id', '');
|
||
$userDb = User::find($targetId);
|
||
if (!$userDb) {
|
||
$this->_rspErr(1, 'Account does not exist');
|
||
return;
|
||
}
|
||
$userDto = User::info($userDb);
|
||
$userDto['current_rank'] = $userDb['rank'];
|
||
$userDto['current_rank_score'] = $userDb['score'];
|
||
$userDto['history_best_rank_score'] = $userDb['history_best_score'];
|
||
$userDto['history_seasons'] = array();
|
||
$seasonDbs = Season::getHistorySeasons($targetId);
|
||
$battleDb = Battle::find($targetId);
|
||
// foreach ($seasonDbs as $seasonDb) {
|
||
// $battleData = json_decode($seasonDb['battle_data'], true);
|
||
if ($battleDb){
|
||
$battleData = json_decode($battleDb['battle_data'], true);
|
||
$seasonBattleData = isset($battleData) ? getXVal($battleData, 'data', array()) : array();
|
||
$gameTimes = getXVal($seasonBattleData, 'total_battle_times', 0);
|
||
$winTimes = getXVal($seasonBattleData, 'total_win_times', 0);
|
||
$winRate = $gameTimes > 0 ? intval($winTimes / $gameTimes * 100) : 0;
|
||
$totalKills = getXVal($seasonBattleData, 'total_kills_times', 0);
|
||
$totalDamage = getXVal($seasonBattleData, 'total_damage_out', 0);
|
||
$totalAlive = getXVal($seasonBattleData, 'total_alive_time', 0);
|
||
$totalRecoverHp = getXVal($seasonBattleData, 'total_recover_hp', 0);
|
||
$avgDamage = $gameTimes > 0 ? intval($totalDamage / $gameTimes) : 0;
|
||
$avgKills = $gameTimes > 0 ? intval($totalKills / $gameTimes) : 0;
|
||
$starKills = $gameTimes > 0 ? intval($totalKills / $gameTimes / 10 *100) : 0;
|
||
$starDamage = $gameTimes > 0 ? intval($totalDamage / $gameTimes / 1500 * 100) : 0;
|
||
$starAlive = $gameTimes > 0 ? intval($totalAlive / $gameTimes / 300 * 0.1) : 0;
|
||
$starRecover = $gameTimes > 0 ? intval($totalRecoverHp / $gameTimes / 300 * 100) : 0;
|
||
$starWin = $gameTimes > 0 ? intval($winTimes / $gameTimes / 0.5 * 100) : 0;
|
||
array_push($userDto['history_seasons'],
|
||
array(
|
||
// 'season_id' => $seasonDb['season_id'],
|
||
'total_kills' => $totalKills,
|
||
'game_times' => $gameTimes,
|
||
'win_times' => $winTimes,
|
||
'win_rate' => $winRate,
|
||
'max_kills' => getXVal($seasonBattleData, 'max_kills_times', 0),
|
||
'avg_kills' => $avgKills,
|
||
'max_damage_out' => getXVal($seasonBattleData, 'max_damage_out', 0),
|
||
'avg_damage_out' => $avgDamage,
|
||
'star_kills' => min(100, $starKills),
|
||
'star_damage' => min(100, $starDamage),
|
||
'star_alive' => min(100, $starAlive),
|
||
'star_recover' => min(100, $starRecover),
|
||
'star_win' => min(100, $starWin),
|
||
));
|
||
}
|
||
if (count($userDto['history_seasons']) <= 0) {
|
||
// $currSeasonMeta = mt\Season::getCurrentSeason();
|
||
array_push($userDto['history_seasons'],
|
||
array(
|
||
// 'season_id' => $currSeasonMeta['id'],
|
||
'total_kills' => 0,
|
||
'game_times' => 0,
|
||
'win_times' => 0,
|
||
'win_rate' => 0,
|
||
'max_kills' => 0,
|
||
'avg_kills' => 0,
|
||
'max_damage_out' => 0,
|
||
'avg_damage_out' => 0,
|
||
'star_kills' => min(100, 0),
|
||
'star_damage' => min(100, 0),
|
||
'star_alive' => min(100, 0),
|
||
'star_recover' => min(100, 0),
|
||
'star_win' => min(100, 0),
|
||
));
|
||
}
|
||
$this->_rspData(array(
|
||
'info' => $userDto
|
||
));
|
||
}
|
||
|
||
public function like(){
|
||
$account_id = getReqVal('target_id', '');
|
||
if (! $account_id){
|
||
$this->_rspErr(1, 'target_id param error');
|
||
return;
|
||
}
|
||
if ($account_id == $this->_getAccountId()){
|
||
$this->_rspErr(1, 'target_id param error');
|
||
return;
|
||
}
|
||
$userDb = User::find($account_id);
|
||
if (!$userDb){
|
||
$this->_rspErr(1, 'target_id param error');
|
||
return;
|
||
}
|
||
User::updateLikeCount($account_id);
|
||
$this->_rspOk();
|
||
}
|
||
|
||
public function initRank(){
|
||
$initRankParameterMeta = mt\Parameter::getByName($this->init_rank);
|
||
$initRankMeta = mt\Rank::getRankById($initRankParameterMeta['param_value']);
|
||
$initEloParameterMeta = mt\Parameter::getByName($this->init_elo);
|
||
$fields = array(
|
||
'rank' => $initRankMeta ? $initRankMeta['id'] : 1,
|
||
'history_best_rank' => $initRankMeta ? $initRankMeta['id'] : 1,
|
||
'score' => $initRankMeta ? $initRankMeta['rank_score'] : 0,
|
||
'history_best_score' => $initRankMeta ? $initRankMeta['rank_score'] : 0,
|
||
'elo' => $initEloParameterMeta ? $initEloParameterMeta['param_value'] : 0,
|
||
);
|
||
User::update($fields);
|
||
$this->_setV(TN_RANK_STATUS, 0, 0);
|
||
$propertyChgService = new services\PropertyChgService();
|
||
$propertyChgService->addUserChg();
|
||
$this->_rspData([
|
||
'property_chg' => $propertyChgService->toDto(),
|
||
]);
|
||
}
|
||
|
||
public function getFreeItemList(){
|
||
$data = array();
|
||
$heroParam = mt\Parameter::getListValue('free_hero_list');
|
||
$gunParam = mt\Parameter::getListValue('free_weapon_list');
|
||
if ($heroParam){
|
||
$data['hero'] = $heroParam;
|
||
}
|
||
if ($gunParam){
|
||
$data['gun'] = $gunParam;
|
||
}
|
||
$this->_rspData([
|
||
'data'=>$data
|
||
]);
|
||
}
|
||
|
||
public function selectFreeItem(){
|
||
$hero_id = getReqVal('hero_id', '');
|
||
$gun_id = getReqVal('gun_id', '');
|
||
if (!$hero_id || !$gun_id){
|
||
$this->_rspErr(1, 'param is error');
|
||
return;
|
||
}
|
||
$heroMeta = mt\Item::get($hero_id);
|
||
if (! $heroMeta){
|
||
$this->_rspErr(1, 'hero_id is error');
|
||
return;
|
||
}
|
||
$gunMeta = mt\Item::get($gun_id);
|
||
if (! $gunMeta){
|
||
$this->_rspErr(1, 'gun_id is error');
|
||
return;
|
||
}
|
||
$userInfo = $this->_getOrmUserInfo();
|
||
$headList = emptyReplace(json_decode($userInfo['head_list'], true), array());
|
||
if ($heroMeta['hero_head'] && !in_array($heroMeta['hero_head'],$headList)){
|
||
array_push($headList,$heroMeta['hero_head']);
|
||
}
|
||
Hero::addFreeHero($heroMeta);
|
||
$heroUid = SqlHelper::getLastInsertId($this->_getSelfMysql());
|
||
Gun::addFreeGun($gunMeta);
|
||
$fields = array(
|
||
'hero_id' => $heroUid,
|
||
'head_id' => $heroMeta['hero_head'],
|
||
'head_frame' => 60000,
|
||
'head_list' => json_encode($headList),
|
||
'head_frame_list' => json_encode(array(60000)),
|
||
'is_gain_item' => 1,
|
||
);
|
||
User::update($fields);
|
||
$propertyChgService = new services\PropertyChgService();
|
||
$propertyChgService->addUserChg();
|
||
$propertyChgService->addHeroChg();
|
||
$propertyChgService->addGunChg();
|
||
$this->_rspData([
|
||
'data'=>array(
|
||
'hero_id' => $hero_id,
|
||
'gun_id' => $gun_id,
|
||
),
|
||
'property_chg' => $propertyChgService->toDto(),
|
||
]);
|
||
}
|
||
|
||
private function dampingElo($userInfo){
|
||
//每天elo衰减
|
||
$time_diff = myself()->_getNowTime()-$userInfo['last_login_time'];
|
||
if ($userInfo['elo'] > 1500 && floor($time_diff/86400) > 0){
|
||
$newElo = min(round(pow(log10(floor($time_diff/86400)),1.5)*350),450);
|
||
$this->_updateUserInfo(array(
|
||
'elo' => $userInfo['elo'] - $newElo
|
||
));
|
||
}
|
||
//7天未打排位扣排位分
|
||
$last_ranking_time = $this->_getV(TN_LAST_RANKING_TIME,0);
|
||
if ($last_ranking_time && floor((myself()->_getNowTime()-$last_ranking_time)/86400) >= 7){
|
||
$userDb = $this->_getOrmUserInfo();
|
||
$rank_key = mt\Rank::getRankById($userDb['rank'])?mt\Rank::getRankById($userDb['rank'])['rank_order2']:0;
|
||
$paramMeta = mt\Parameter::getByName('rank_point_reduce');
|
||
if ($paramMeta){
|
||
$param_value = explode('|',$paramMeta['param_value']);
|
||
$deductScore = $param_value[$rank_key-1];
|
||
if ($deductScore>0){
|
||
$newRank = $userDb['rank'];
|
||
$newScore = $userDb['score'] - $deductScore;
|
||
mt\Rank::calcNewRankAndScore( $newRank, $newScore);
|
||
$this->_updateUserInfo(array(
|
||
'rank' => $newRank,
|
||
'score' => $newScore,
|
||
));
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
private function createNewUserV2($userName){
|
||
$currSeasonMeta = mt\RankSeason::getCurrentSeason();
|
||
SqlHelper::upsert
|
||
($this->_getSelfMysql(),
|
||
't_user',
|
||
array(
|
||
'account_id' => $this->_getAccountId()
|
||
),
|
||
array(
|
||
),
|
||
array(
|
||
'account_id' => $this->_getAccountId(),
|
||
'channel' => $this->_getChannel(),
|
||
'name' => $userName,
|
||
'sex' => rand() % 2,
|
||
'gold' => 0,
|
||
'diamond' => 0,
|
||
'level' => 1,
|
||
'rank' => 0,
|
||
'score' => 0,
|
||
'exp' => 0,
|
||
'last_season_id' => $currSeasonMeta ? $currSeasonMeta['id'] : 0,
|
||
'score_modifytime' => $this->_getNowTime(),
|
||
'best_rank_modifytime' => $this->_getNowTime(),
|
||
'createtime' => $this->_getNowTime(),
|
||
'modifytime' => $this->_getNowTime(),
|
||
'last_login_time' => $this->_getNowTime(),
|
||
)
|
||
);
|
||
}
|
||
|
||
private function updateLastSeason($userInfo){
|
||
if (! $userInfo['last_season_id']){
|
||
$currSeasonMeta = mt\RankSeason::getCurrentSeason();
|
||
if ($currSeasonMeta){
|
||
$this->_updateUserInfo(array(
|
||
'last_season_id'=>$currSeasonMeta['id'],
|
||
));
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|