teamData['members'] as $member){ $battleScore = $this->_calBattleScore($member); array_push($this->logData,array( 'account_id' => getXVal($member, 'account_id', 0), 'kills' => getXVal($member, 'kills', 0), 'damage' => getXVal($member, 'damage_out', 0), 'assist' => getXVal($member, 'pvp_assist', 0), 'score' => $battleScore, )); $totalScore += $battleScore; if ($battleScore>0){ $totalNum += 1; } } } public function settlementReward(){ // $paramMeta = mt\Parameter::getVal('performance_score_range',0); // $scoreParam = explode("|",$paramMeta); // if (count($paramMeta) < 2){ // error_log('Parameter table error'); // return; // } // $room_mode = getXVal($this->inputData,'room_mode', 0); $battleData = emptyReplace(json_decode($this->battleSettlementDb['data'], true), array()); if ($battleData['settlement_status'] == 1){ error_log('Cannot be resettled'); return; } $propertyChgService = new services\PropertyChgService(); $awardService = new services\AwardService(); foreach ($battleData['members'] as &$member){ // if ($this->maxKill == 0){ // $killSco = $scoreParam[0]; // }else{ // $kill = getXVal($member,'pvp_kill', 0); // $killSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxKill - 0) * ($kill - 0) + $scoreParam[0]; // } // if ($this->maxAssist == 0){ // $assistSco = $scoreParam[0]; // }else{ // $assist = getXVal($member,'pvp_assist', 0); // $assistSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxAssist - 0) * ($assist - 0) + $scoreParam[0]; // } // if ($this->maxDamage == 0){ // $damageSco = $scoreParam[0]; // }else{ // $damage = getXVal($member,'pvp_damage', 0); // $damageSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxDamage - 0) * ($damage - 0) + $scoreParam[0]; // } // if ($this->maxRecover == 0){ // $recoverSco = $scoreParam[0]; // }else{ // $recover = getXVal($member,'pvp_recover', 0); // $recoverSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxRecover - 0) * ($recover - 0) + $scoreParam[0]; // } // if ($this->maxLevel == 1){ // $levelSco = $scoreParam[0]; // }else{ // $level = getXVal($member,'hero_lv', 0); // $levelSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxLevel - 0) * ($level - 0) + $scoreParam[0]; // } // if ($this->maxAlive == 0){ // $aliveSco = $scoreParam[0]; // }else{ // $alive = getXVal($member,'pvp_survia_time', 0) / 1000; // $aliveSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxAlive - 0) * ($alive - 0) + $scoreParam[0]; // } // switch ($room_mode){ // case self::ROOM_MODE_PVP: { // $battleScore = round($killSco + $assistSco + $damageSco + $recoverSco + $aliveSco , 2); // } // break; // case self::ROOM_MODE_MOBA :{ // $battleScore = round($killSco + $assistSco + $damageSco + $recoverSco + $levelSco , 2); // } // break; // default : { // $battleScore = 0; // } // } $battleScore = $this->_calBattleScore($member); $member['battle_score'] = $battleScore; // //验证非机器人 $account = getXVal($member,'account_id', 0); if(!myself()->_isAndroidAccountId($account)){ error_log('Real Account:'.$account); myself()->switchAccount($account); $userDb = myself()->_getOrmUserInfo(); $heroDb = Hero::find(getXVal($member,'hero_uniid', 0)); if ($userDb && $heroDb){ $this->_getBattleRewards($userDb,$heroDb,$battleScore,$member['reward']); myself()->_addItems($member['reward'], $awardService,$propertyChgService); } } } $battleData['settlement_status'] = 1; BattleSettlement::addTeam( $this->battleSettlementDb['battle_uuid'], $this->battleSettlementDb['room_uuid'], $battleData ); } public function _getBattleRewards($userDb,$heroDb,$battleScore,&$reward){ $mapModeMeta = mt\MapMode::findByMapMode($this->mapMode); $teamRank = getXVal($this->teamData,'pvp_team_rank', 0); if ($mapModeMeta){ $baseGold = 0; $gold = 0; $accountLucky = Hero::getAccountLucky($userDb['address']); $rewardMeta = mt\BattleReward::find($mapModeMeta['rewardMode'],$accountLucky); if (!$rewardMeta){ return ; } $goldModeTimes = myself()->_getDailyV(TN_DAILY_GOLD_MODE_BATTLE_TIMES,0); if ($this->mapMode == mt\MapMode::GOLD_MODE){ myself()->_incDailyV(TN_DAILY_GOLD_MODE_BATTLE_TIMES,0,1); } //金币模式检验 if ($this->mapMode == mt\MapMode::GOLD_MODE && (!Hero::verifyValid($heroDb) || $goldModeTimes >= $mapModeMeta['rewards_max_time'] )){ error_log("金币模式:出战英雄没有打金时间或每日打金场次上限"); }else{ if (!empty($rewardMeta['goldLoot'])){ $items = LootService::dropOutItem($rewardMeta['goldLoot']); foreach ($items as $item){ if ($item['item_id'] = V_ITEM_GOLD){ $gold = $item['item_num']; $baseGold = $item['item_num']; }else{ array_push($reward,$item); } } } if ($gold > 0){ // $strArr = explode("|",$rewardMeta['goldParam']); $coefficientArr = explode(";",$rewardMeta['goldParam']); $coefficient = isset($coefficientArr[$teamRank-1]) ? $coefficientArr[$teamRank-1] : 0; $avg = $this->scoreAvg > 0 ? $battleScore / $this->scoreAvg : 0; $gold = $gold * $coefficient * $avg; } //财富值加成 $wealthK = mt\Parameter::getVal('economy_hero_wealth_K',0); $wealthE = mt\Parameter::getVal('economy_hero_wealth_E',0); $gold = $gold * (1 + $wealthE * (Hero::getHeroWealth($heroDb) / (Hero::getHeroWealth($heroDb) + $wealthK))); //算力加成 $currentPeriod= \mt\AchievementsCycle::getCurrentPeriod(); if ($currentPeriod && myself()->_getNowTime() >= strtotime($currentPeriod['income_start_time'])){ $lastCompute = HashRate::getTotalByAccount($userDb['account_id'], $currentPeriod['id'] - 1); $currentCompute = HashRate::getTotalByAccount($userDb['account_id'], $currentPeriod['id']); $s = mt\Parameter::getVal('economy_account_compute_s',0); $totalCompute = $currentCompute + $s * $lastCompute; $computeParam = mt\Parameter::getVal('economy_account_compute_K',0); $computeMaxEffect = mt\Parameter::getVal('economy_account_compute_E',0); $gold = $gold * ($totalCompute / ($totalCompute + $computeParam) * $computeMaxEffect + 1); } if ($userDb['account_id'] == "6513_2006_wzXEMuD5cXc68z0K20yTUIPY1U6GcLJo"){ error_log("BattleRewardsInfo:".json_encode(array( 'goldLootIndex' => $rewardMeta['goldLoot'], '*baseGold*' => $baseGold, 'teamRank' => $teamRank, '*ranking*' => isset($coefficient) ? $coefficient : '空', 'battleScore' => $battleScore, 'roomScoreAvg' => $this->scoreAvg, '*score*' => isset($avg) ? $avg : '空', 'wealthK' => $wealthK, 'wealthE' => $wealthE, 'wealthValue' => Hero::getHeroWealth($heroDb), '*wealth*' => (1 + $wealthE * (Hero::getHeroWealth($heroDb) / (Hero::getHeroWealth($heroDb) + $wealthK))), 'lastCompute' => isset($lastCompute) ? $lastCompute : '空', 'currentCompute' => isset($currentCompute) ? $currentCompute : '空', '*compute*' =>$currentPeriod ? $totalCompute / ($totalCompute + $computeParam) * $computeMaxEffect + 1 : '算力系统关闭', 'finalGold' => floor($gold) ))); } if ($gold > 0){ array_push($reward,array( "item_id" => V_ITEM_GOLD, "item_num" => floor($gold), )); } } //宝箱掉落 $rand = $rewardMeta['chestLootProb'] * 100; $rnd = rand(1,100); if ($rnd <= $rand){ $chestItems = LootService::dropOutItem($rewardMeta['chestLoot']); foreach ($chestItems as $item){ array_push($reward,$item); } } } } private function _calBattleScore($battleInfo){ $paramMeta = mt\Parameter::getVal('performance_score_range',0); $scoreParam = explode("|",$paramMeta); if (count($scoreParam) < 2){ error_log('Parameter table error'); return 0; } $room_mode = getXVal($this->inputData,'room_mode', 0); if ($this->maxKill == 0) { $killSco = $scoreParam[0]; } else { $kill = getXVal($battleInfo, 'pvp_kill', 0); $killSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxKill - 0) * ($kill - 0) + $scoreParam[0]; } if ($this->maxAssist == 0) { $assistSco = $scoreParam[0]; } else { $assist = getXVal($battleInfo, 'pvp_assist', 0); $assistSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxAssist - 0) * ($assist - 0) + $scoreParam[0]; } if ($this->maxDamage == 0) { $damageSco = $scoreParam[0]; } else { $damage = getXVal($battleInfo, 'pvp_damage', 0); $damageSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxDamage - 0) * ($damage - 0) + $scoreParam[0]; } if ($this->maxRecover == 0) { $recoverSco = $scoreParam[0]; } else { $recover = getXVal($battleInfo, 'pvp_recover', 0); $recoverSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxRecover - 0) * ($recover - 0) + $scoreParam[0]; } if ($this->maxLevel == 1) { $levelSco = $scoreParam[0]; } else { $level = getXVal($battleInfo, 'hero_lv', 0); $levelSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxLevel - 0) * ($level - 0) + $scoreParam[0]; } if ($this->maxAlive == 0) { $aliveSco = $scoreParam[0]; } else { $alive = getXVal($battleInfo, 'pvp_survia_time', 0) / 1000; $aliveSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxAlive - 0) * ($alive - 0) + $scoreParam[0]; } switch ($room_mode){ case self::ROOM_MODE_PVP: { $battleScore = round($killSco + $assistSco + $damageSco + $recoverSco + $aliveSco , 2); } break; case self::ROOM_MODE_MOBA :{ $battleScore = round($killSco + $assistSco + $damageSco + $recoverSco + $levelSco , 2); } break; default : { $battleScore = 0; } } return $battleScore; } }