refactor: more caching where possible

This also fixes "Multihunter" being stated as the one attacking
reinforcements in villages during battle (now stores real attacker ID).
This commit is contained in:
Martin Ambrus
2017-11-12 10:36:53 +01:00
parent 994cef151c
commit 3d44226c92
3 changed files with 22 additions and 18 deletions
+13 -10
View File
@@ -1236,7 +1236,7 @@ class Automation {
$defpop = $toF['pop']; $defpop = $toF['pop'];
$def_ab=array(); $def_ab=array();
//get level of palace or residence //get level of palace or residence
$residence = $database->getFieldLevelIfInVillage($data['to'], '25, 26'); $residence = $database->getFieldLevelInVillage($data['to'], '25, 26');
//type of attack //type of attack
if($dataarray[$data_num]['attack_type'] == 1){ if($dataarray[$data_num]['attack_type'] == 1){
@@ -1467,7 +1467,7 @@ class Automation {
$walllevel = 0; $walllevel = 0;
} }
$battlepart = $battle->calculateBattle($Attacker,$Defender,$def_wall,$att_tribe,$def_tribe,$residence,$attpop,$defpop,$type,$def_ab,$att_ab1,$att_ab2,$att_ab3,$att_ab4,$att_ab5,$att_ab6,$att_ab7,$att_ab8,$tblevel,$stonemason,$walllevel,0,0,0,$AttackerID,$DefenderID,$AttackerWref,$DefenderWref,$conqureby); $battlepart = $battle->calculateBattle($Attacker,$Defender,$def_wall,$att_tribe,$def_tribe,$residence,$attpop,$defpop,$type,$def_ab,$att_ab1,$att_ab2,$att_ab3,$att_ab4,$att_ab5,$att_ab6,$att_ab7,$att_ab8,$tblevel,$stonemason,$walllevel,0,0,0,$AttackerID,$DefenderID,$AttackerWref,$DefenderWref,$conqureby, $enforcementarray, $villageOwners, $cachedUserData);
//units attack string for battleraport //units attack string for battleraport
$unitssend_att = ''.$data['t1'].','.$data['t2'].','.$data['t3'].','.$data['t4'].','.$data['t5'].','.$data['t6'].','.$data['t7'].','.$data['t8'].','.$data['t9'].','.$data['t10'].''; $unitssend_att = ''.$data['t1'].','.$data['t2'].','.$data['t3'].','.$data['t4'].','.$data['t5'].','.$data['t6'].','.$data['t7'].','.$data['t8'].','.$data['t9'].','.$data['t10'].'';
@@ -1487,6 +1487,7 @@ class Automation {
} }
} }
// our reinforcements count could have changed at this point, thus the re-select
$enforcementarray2 = $database->getEnforceVillage($data['to'],0); $enforcementarray2 = $database->getEnforceVillage($data['to'],0);
if(count($enforcementarray2) > 0) { if(count($enforcementarray2) > 0) {
foreach($enforcementarray2 as $enforce2) { foreach($enforcementarray2 as $enforce2) {
@@ -1595,7 +1596,9 @@ class Automation {
$database->modifyUnit($data['to'],array("hero"),array($owndead['hero']),array(0)); $database->modifyUnit($data['to'],array("hero"),array($owndead['hero']),array(0));
} }
//kill other defence in village //kill other defence in village
foreach($database->getEnforceVillage($data['to'],0) as $enforce) { // ... once again, units could have changed, so we need to reselect
$enforcementarray3 = $database->getEnforceVillage($data['to'],0);
foreach ($enforcementarray3 as $enforce) {
$life=''; $notlife=''; $wrong='0'; $life=''; $notlife=''; $wrong='0';
if($enforce['from'] != 0){ if($enforce['from'] != 0){
if (!isset($villageOwners[$enforce['from']])) { if (!isset($villageOwners[$enforce['from']])) {
@@ -1669,17 +1672,17 @@ class Automation {
$totalsend_att = $data['t1']+$data['t2']+$data['t3']+$data['t4']+$data['t5']+$data['t6']+$data['t7']+$data['t8']+$data['t9']+$data['t10']+$data['t11']; $totalsend_att = $data['t1']+$data['t2']+$data['t3']+$data['t4']+$data['t5']+$data['t6']+$data['t7']+$data['t8']+$data['t9']+$data['t10']+$data['t11'];
$totaldead_att = $dead1+$dead2+$dead3+$dead4+$dead5+$dead6+$dead7+$dead8+$dead9+$dead10+$dead11; $totaldead_att = $dead1+$dead2+$dead3+$dead4+$dead5+$dead6+$dead7+$dead8+$dead9+$dead10+$dead11;
//NEED TO SEND A RAPPORTAGE!!! //NEED TO SEND A RAPPORTAGE!!!
$enforceOwner = [ if (!isset($villageOwners[$enforce['from']])) {
'from' => $database->getVillageField($enforce['from'],"owner") $villageOwners[$enforce['from']] = $database->getVillageField( $enforce['from'], "owner" );
]; }
$data2 = ''.$enforceOwner['from'].','.$to['wref'].','.addslashes($to['name']).','.$tribe.','.$life.','.$notlife.','.$lifehero.','.$notlifehero.','.$enforce['from'].''; $data2 = ''.$villageOwners[$enforce['from']].','.$to['wref'].','.addslashes($to['name']).','.$tribe.','.$life.','.$notlife.','.$lifehero.','.$notlifehero.','.$enforce['from'].'';
if(empty($scout)) { if(empty($scout)) {
if($totalnotlife == 0){ if($totalnotlife == 0){
$database->addNotice($enforceOwner['from'],$from['wref'],$ownally,15,'Reinforcement in '.addslashes($to['name']).' was attacked',$data2,$AttackArrivalTime); $database->addNotice($villageOwners[$enforce['from']],$from['wref'],$ownally,15,'Reinforcement in '.addslashes($to['name']).' was attacked',$data2,$AttackArrivalTime);
}else if($totallife > $totalnotlife){ }else if($totallife > $totalnotlife){
$database->addNotice($enforceOwner['from'],$from['wref'],$ownally,16,'Reinforcement in '.addslashes($to['name']).' was attacked',$data2,$AttackArrivalTime); $database->addNotice($villageOwners[$enforce['from']],$from['wref'],$ownally,16,'Reinforcement in '.addslashes($to['name']).' was attacked',$data2,$AttackArrivalTime);
}else{ }else{
$database->addNotice($enforceOwner['from'],$from['wref'],$ownally,17,'Reinforcement in '.addslashes($to['name']).' was attacked',$data2,$AttackArrivalTime); $database->addNotice($villageOwners[$enforce['from']],$from['wref'],$ownally,17,'Reinforcement in '.addslashes($to['name']).' was attacked',$data2,$AttackArrivalTime);
} }
//delete reinf sting when its killed all. //delete reinf sting when its killed all.
if($wrong=='0'){ $database->deleteReinf($enforce['id']); } if($wrong=='0'){ $database->deleteReinf($enforce['id']); }
+6 -5
View File
@@ -238,7 +238,7 @@ class Battle {
} }
//1 raid 0 normal //1 raid 0 normal
function calculateBattle($Attacker,$Defender,$def_wall,$att_tribe,$def_tribe,$residence,$attpop,$defpop,$type,$def_ab,$att_ab1,$att_ab2,$att_ab3,$att_ab4,$att_ab5,$att_ab6,$att_ab7,$att_ab8,$tblevel,$stonemason,$walllevel,$offhero,$hero_strenght,$deffhero,$AttackerID,$DefenderID,$AttackerWref,$DefenderWref,$conqureby) { function calculateBattle($Attacker,$Defender,$def_wall,$att_tribe,$def_tribe,$residence,$attpop,$defpop,$type,$def_ab,$att_ab1,$att_ab2,$att_ab3,$att_ab4,$att_ab5,$att_ab6,$att_ab7,$att_ab8,$tblevel,$stonemason,$walllevel,$offhero,$hero_strenght,$deffhero,$AttackerID,$DefenderID,$AttackerWref,$DefenderWref,$conqureby, $defReinforcements = null, $villageOwners = array(), $userdataCache = array()) {
global $bid34,$bid35,$database; global $bid34,$bid35,$database;
// Define the array, with the units // Define the array, with the units
@@ -303,10 +303,11 @@ class Battle {
$cdp *= $defenderhero['db']; $cdp *= $defenderhero['db'];
} }
} }
$DefendersAll = $database->getEnforceVillage($DefenderWref,0); $DefendersAll = (!is_null($defReinforcements) ? $database->getEnforceVillage($DefenderWref,0) : $defReinforcements);
$villageOwners = [];
$userdataCache = []; if (!isset($villageOwners[$DefenderWref])) {
$villageOwners[$DefenderWref] = $database->getVillageField($DefenderWref,"owner"); $villageOwners[ $DefenderWref ] = $database->getVillageField( $DefenderWref, "owner" );
}
if(!empty($DefendersAll) && $DefenderWref>0){ if(!empty($DefendersAll) && $DefenderWref>0){
foreach($DefendersAll as $defenders) { foreach($DefendersAll as $defenders) {
+2 -2
View File
@@ -2307,7 +2307,7 @@ class MYSQLi_DB implements IDbConnection {
return mysqli_query($this->dblink,$q); }else{return false;} return mysqli_query($this->dblink,$q); }else{return false;}
} }
function getFieldLevelIfInVillage($vid, $fieldType) { function getFieldLevelInVillage($vid, $fieldType) {
$vid = (int) $vid; $vid = (int) $vid;
// $fieldType can be both, integer and string, to be used in the IN statement, // $fieldType can be both, integer and string, to be used in the IN statement,
@@ -2318,7 +2318,7 @@ class MYSQLi_DB implements IDbConnection {
// please don't scream... // please don't scream...
// with the current table structure, there really IS NOT another way // with the current table structure, there really IS NOT another way
// (except for stored procedures, which we can't rely will be allowed on the server) // (except for stored procedures, which we can't rely on to be allowed on the server)
$result = mysqli_query($this->dblink," $result = mysqli_query($this->dblink,"
SELECT SELECT
IF( IF(