teamData['members'] as $member){ $battleScore = $this->_calBattleScore($member); $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()); $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; $member['settlement_status'] = 1; // //验证非机器人 $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); } } } 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){ $gold = 0; $accountLucky = Hero::getAccountLucky($userDb['address']); $rewardMeta = mt\BattleReward::find($mapModeMeta['rewardMode'],$accountLucky); if (!$rewardMeta){ return ; } //验证英雄是否有效期内 if (Hero::verifyValid($heroDb)){ if (!empty($rewardMeta['goldLoot'])){ $items = LootService::dropOutItem($rewardMeta['goldLoot']); foreach ($items as $item){ if ($item['item_id'] = V_ITEM_GOLD){ $gold = $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(); $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 = intval( $gold * ($totalCompute / ($totalCompute + $computeParam) * $computeMaxEffect + 1)); if ($gold > 0){ array_push($reward,array( "item_id" => V_ITEM_GOLD, "item_num" => $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; } }