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->_addFreeItem2(); //送 50 Test_CEG $userInfo = $this->_getOrmUserInfo(); $this->_setV(TN_RANK_STATUS, 0, 1); } //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(){ // $chipMeta = \mt\Item::getMetaListByType(\mt\Item::CHIP_TYPE); // foreach ($chipMeta as $row){ // Chip::addChip($row); // } // // foreach (mt\Parameter::getListValue('creator_hero_id') as $heroId) { // $heroMeta = mt\Item::get($heroId); // if ($heroMeta) { // Hero::addHero($heroMeta); // } // } $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' => 50 // )); $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 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'], )); } } } }