fix: troops did not return to the village when evasion was set

This commit is contained in:
Martin Ambrus
2017-11-18 11:10:58 +01:00
parent 2041ad750e
commit dd030859cf
3 changed files with 90 additions and 157 deletions
+63 -124
View File
@@ -587,12 +587,6 @@ class Automation {
// IDs of villages that were affected by this building completion update,
// used to calculate statistical data at the end
$villagesAffected = [];
// IDs of owners for each village we process
$villageOwners = [];
// tribes for owner IDs, in case we have one owner that finished building
// in multiple villages, so we don't have to select their tribe in every
// foreach cycle
$ownersToTribes = [];
// holds additional conditions when updating loopcon records in the bdata table
$loopconUpdates = [];
// this will hold IDs of bdata table records to delete
@@ -613,15 +607,10 @@ class Automation {
// store village ID for later for statistical updates
$villageData = $database->getVillageFields($indi['wid'],'owner, maxcrop, maxstore, starv, pop');
$villageOwner = $villageData['owner'];
$villageOwners[$indi['wid']] = $villageOwner;
$villagesAffected[] = (int) $indi['wid'];
$level = $database->getFieldLevel($indi['wid'],$indi['field']);
$fieldsToSet = [];
if (!isset($ownersToTribes[$villageOwner])) {
$ownersToTribes[$villageOwner] = $database->getUserField($villageOwner, "tribe", 0);
}
if (($level + 1) == $indi['level']){
$q = "UPDATE ".TB_PREFIX."fdata set f".$indi['field']." = ".$indi['level'].", f".$indi['field']."t = ".$indi['type']." where vref = ".(int) $indi['wid'];
} else {
@@ -671,7 +660,7 @@ class Automation {
// TODO: find out what exactly these conditions are for
// no special military conditioning for Teutons and Gauls
if ($ownersToTribes[$villageOwner] != 1) {
if ($database->getUserField($villageOwner, "tribe", 0) != 1) {
$loopconUpdates[$indi['wid']] = '';
} else {
// special condition for Roman military buildings
@@ -933,29 +922,9 @@ class Automation {
$q = "SELECT s.wood, s.clay, s.iron, s.crop, `to`, `from`, endtime, merchant, send, moveid FROM ".TB_PREFIX."movement m, ".TB_PREFIX."send s WHERE m.ref = s.id AND m.proc = 0 AND sort_type = 0 AND endtime < $time";
$dataarray = $database->query_return($q);
// holds village owners of the given village IDs, as we can have
// multiple market routes from the same village going to other villages
$villageOwners = [];
// cache of alliances for the village owners
$alliances = [];
// cache for tribes for the village owners
$tribes = [];
foreach($dataarray as $data) {
// cache village owners
if (!isset($villageOwners[$data['from']])) {
$villageOwners[$data['from']] = $database->getVillageField($data['from'],"owner");
$userData = $database->getUserFields($villageOwners[$data['from']],"alliance, tribe",0);
$alliances[$data['from']] = $userData["alliance"];
$tribes[$data['from']] = $userData["tribe"];
}
if (!isset($villageOwners[$data['to']])) {
$villageOwners[$data['to']] = $database->getVillageField($data['to'],"owner");
$userData = $database->getUserFields($villageOwners[$data['to']],"alliance, tribe",0);
$alliances[$data['to']] = $userData["alliance"];
$tribes[$data['to']] = $userData["tribe"];
}
$userData_from = $database->getUserFields($database->getVillageField($data['from'],"owner"),"alliance, tribe",0);
$userData_to = $database->getUserFields($database->getVillageField($data['to'],"owner"),"alliance, tribe",0);
if($data['wood'] >= $data['clay'] && $data['wood'] >= $data['iron'] && $data['wood'] >= $data['crop']){ $sort_type = "10"; }
elseif($data['clay'] >= $data['wood'] && $data['clay'] >= $data['iron'] && $data['clay'] >= $data['crop']){ $sort_type = "11"; }
@@ -965,8 +934,8 @@ class Automation {
$to = $database->getMInfo($data['to']);
$from = $database->getMInfo($data['from']);
$ownally = $alliances[$data['to']];
$targetally = $alliances[$data['to']];
$ownally = $userData_from['alliance'];
$targetally = $userData_to['alliance'];
$database->addNotice($to['owner'],$to['wref'],$targetally,$sort_type,''.addslashes($from['name']).' send resources to '.addslashes($to['name']).'',''.$from['owner'].','.$from['wref'].','.$data['wood'].','.$data['clay'].','.$data['iron'].','.$data['crop'].'',$data['endtime']);
if($from['owner'] != $to['owner']) {
@@ -975,7 +944,7 @@ class Automation {
$database->modifyResource($data['to'],$data['wood'],$data['clay'],$data['iron'],$data['crop'],1);
$tocoor = $database->getCoor($data['from']);
$fromcoor = $database->getCoor($data['to']);
$targettribe = $tribes[$data['from']];
$targettribe = $userData_to["tribe"];
$endtime = $this->procDistanceTime($tocoor,$fromcoor,$targettribe,0) + $data['endtime'];
$database->addMovement(2,$data['to'],$data['from'],$data['merchant'],time(),$endtime,$data['send'],$data['wood'],$data['clay'],$data['iron'],$data['crop']);
$database->setMovementProc($data['moveid']);
@@ -985,13 +954,7 @@ class Automation {
foreach($dataarray1 as $data1) {
$database->setMovementProc($data1['moveid']);
if($data1['send'] > 1){
if (!isset($villageOwners[$data1['to']])) {
$villageOwners[$data1['to']] = $database->getVillageField($data1['to'],"owner");
$userData1 = $database->getUserFields($villageOwners[$data1['to']],"alliance, tribe",0);
$alliances[$data1['to']] = $userData1["alliance"];
$tribes[$data1['to']] = $userData1["tribe"];
}
$targettribe1 = $tribes[$data1['to']];
$targettribe1 = $database->getUserFields($database->getVillageField($data1['to'],"owner"),"alliance, tribe",0)['tribe'];
$send = $data1['send']-1;
$this->sendResource2($data1['wood'],$data1['clay'],$data1['iron'],$data1['crop'],$data1['to'],$data1['from'],$targettribe1,$send);
}
@@ -1085,7 +1048,7 @@ class Automation {
// embassy level was changed
if ($tbgid==18){
$info_cat .= $database->checkEmbassiesAfterBattle($villageOwners, $cachedUserData, $data['to']);
$info_cat .= $database->checkEmbassiesAfterBattle($data['to']);
}
// oasis cannot be destroyed
@@ -1147,7 +1110,7 @@ class Automation {
// embassy level was changed
if ( $tbgid == 18 ) {
$info_cat .= $database->checkEmbassiesAfterBattle( $villageOwners, $cachedUserData, $data['to'] );
$info_cat .= $database->checkEmbassiesAfterBattle( $data['to'] );
}
// no need to recalculate population of oasis, as there is none
@@ -1199,10 +1162,6 @@ class Automation {
$totalattackdead = 0;
$data_num = 0;
// set up caching variables, so we don't do same lookups more than once below
$villageOwners = [];
$cachedUserData = [];
if ($dataarray && count($dataarray)) {
foreach($dataarray as $data) {
//set base things
@@ -1212,30 +1171,20 @@ class Automation {
$DefenderWref = $data['to'];
$NatarCapital=false;
// cache owners and other cacheable data
if (!isset($villageOwners[$data['from']])) {
$villageOwners[$data['from']] = $database->getVillageField($data['from'],"owner");
$cachedUserData[$data['from']] = $database->getUserArray($villageOwners[$data['from']], 1);
}
if (!isset($villageOwners[$data['to']])) {
$villageOwners[$data['to']] = ($isoasis ? $database->getOasisField($data['to'],"owner") : $database->getVillageField($data['to'],"owner"));
$cachedUserData[$data['to']] = $database->getUserArray($villageOwners[$data['to']], 1);
}
$Attacker['id'] = $cachedUserData[$data['from']]["id"];
$Attacker['id'] = $database->getUserArray($database->getVillageField($data['from'],"owner"), 1)["id"];
$AttackerID = $Attacker['id'];
$owntribe = $cachedUserData[$data['from']]["tribe"];
$ownally = $cachedUserData[$data['from']]["alliance"];
$owntribe = $database->getUserArray($database->getVillageField($data['from'],"owner"), 1)["tribe"];
$ownally = $database->getUserArray($database->getVillageField($data['from'],"owner"), 1)["alliance"];
$from = $database->getMInfo($data['from']);
$fromF = $database->getVillage($data['from']);
if ($isoasis == 0){ //village
$Defender['id'] = $cachedUserData[$data['to']]["id"];
$DefenderUserData = $database->getUserArray($database->getVillageField($data['to'],"owner"), 1);
$Defender['id'] = $DefenderUserData["id"];
$DefenderID = $Defender['id'];
if ($session->uid==$AttackerID || $session->uid==$DefenderID) $reload=true;
$targettribe = $cachedUserData[$data['to']]["tribe"];
$targetally = $cachedUserData[$data['to']]["alliance"];
$targettribe = $DefenderUserData["tribe"];
$targetally = $DefenderUserData["alliance"];
$to = $database->getMInfo($data['to']);
$toF = $database->getVillage($data['to']);
$conqureby=0;
@@ -1245,8 +1194,8 @@ class Automation {
$DefenderUnit = array();
$DefenderUnit = $database->getUnit($data['to']);
$evasion = $toF["evasion"];
$maxevasion = $cachedUserData[$data['to']]["maxevasion"];
$gold = $cachedUserData[$data['to']]["gold"];
$maxevasion = $DefenderUserData["maxevasion"];
$gold = $DefenderUserData["gold"];
$playerunit = (( $targettribe - 1 ) * 10);
$cannotsend = 0;
$movements = $database->getMovement("34",$data['to'],1);
@@ -1258,22 +1207,24 @@ class Automation {
}
}
}
if($evasion == 1 && $maxevasion > 0 && $gold > 1 && $cannotsend == 0 && $dataarray[$data_num]['attack_type'] > 2){
$evaded = true;
$totaltroops = 0;
$unitModifications_units = [];
$unitModifications_amounts = [];
$unitModifications_modes = [];
$evasionUnitModifications_units = [];
$evasionUnitModifications_amounts = [];
$evasionUnitModifications_modes = [];
for($i=1;$i<=10;$i++){
$playerunit += $i;
$data['u'.$i] = $DefenderUnit['u'.$playerunit];
$unitModifications_units[] = $playerunit;
$unitModifications_amounts[] = $DefenderUnit['u'.$playerunit];
$unitModifications_modes[] = 0;
$evasionUnitModifications_units[] = $playerunit;
$evasionUnitModifications_amounts[] = $DefenderUnit['u'.$playerunit];
$evasionUnitModifications_modes[] = 0;
$playerunit -= $i;
$totaltroops += $data['u'.$i];
}
// modify units in DB
$database->modifyUnit($data['to'], $unitModifications_units, $unitModifications_amounts, $unitModifications_modes);
$database->modifyUnit($data['to'], $evasionUnitModifications_units, $evasionUnitModifications_amounts, $evasionUnitModifications_modes);
$data['u11'] = $DefenderUnit['hero'];
$totaltroops += $data['u11'];
@@ -1289,7 +1240,7 @@ class Automation {
//get defence units
$enforDefender = array();
$rom = $ger = $gal = $nat = $natar = 0;
$Defender = $database->getUnit($data['to']);
$Defender = $database->getUnit($data['to'], false);
$enforcementarray = $database->getEnforceVillage($data['to'],0);
if(count($enforcementarray) > 0) {
@@ -1312,8 +1263,8 @@ class Automation {
if(!isset($Defender['u'.$i])){
$Defender['u'.$i] = '0';
} else {
if($Defender['u'.$i]=='' or $Defender['u'.$i]<='0'){
$Defender['u'.$i] = '0';
if($Defender['u'.$i]=='' || $Defender['u'.$i] <= 0){
$Defender['u'.$i] = 0;
} else {
if($i<=10){ $rom='1'; }
else if($i<=20){ $ger='1'; }
@@ -1326,8 +1277,8 @@ class Automation {
if(!isset($Defender['hero'])){
$Defender['hero'] = '0';
} else {
if($Defender['hero']=='' or $Defender['hero']<='0'){
$Defender['hero'] = '0';
if($Defender['hero']=='' or $Defender['hero'] <= 0){
$Defender['hero'] = 0;
}
}
//get attack units
@@ -1423,11 +1374,12 @@ class Automation {
// End village Battle part
--------------------------------*/
}else{
$Defender['id'] = $cachedUserData[$data['to']]["id"];
$DefenderUserData = $database->getUserArray($database->getOasisField($data['to'],"owner"), 1);
$Defender['id'] = $DefenderUserData["id"];
$DefenderID = $Defender['id'];
if ($session->uid==$AttackerID || $session->uid==$DefenderID) $reload=true;
$targettribe = $cachedUserData[$data['to']]["tribe"];
$targetally = $cachedUserData[$data['to']]["alliance"];
$targettribe = $DefenderUserData["tribe"];
$targetally = $DefenderUserData["alliance"];
$to = $database->getOMInfo($data['to']);
$toF = $database->getOasisV($data['to']);
$conqureby=$toF['conqured'];
@@ -1598,7 +1550,7 @@ class Automation {
$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, $enforcementarray, $villageOwners, $cachedUserData);
$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);
//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'].'';
@@ -1619,16 +1571,13 @@ 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, false);
if(count($enforcementarray2) > 0) {
foreach($enforcementarray2 as $enforce2) {
$Defender['hero'] += $enforce2['hero'];
if ($enforce2['hero']>0) {
$d++;
if (!isset($villageOwners[$enforce2['from']])) {
$villageOwners[$enforce2['from']] = $database->getVillageField($enforce2['from'],"owner");
}
$DefenderHero[$d] = $villageOwners[$enforce2['from']];
$DefenderHero[$d] = $database->getVillageField($enforce2['from'],"owner");
}
for ($i=1;$i<=50;$i++) {
$Defender['u'.$i]+= $enforce2['u'.$i];
@@ -1697,7 +1646,7 @@ class Automation {
$alldead=array();
$heroAttackDead=$dead11;
//kill own defence
$unitlist = $database->getUnit($data['to']);
$unitlist = $database->getUnit($data['to'], false);
$start = ($targettribe-1)*10+1;
$end = ($targettribe*10);
@@ -1727,18 +1676,11 @@ class Automation {
}
//kill other defence in village
// ... once again, units could have changed, so we need to reselect
$enforcementarray3 = $database->getEnforceVillage($data['to'],0);
$enforcementarray3 = $database->getEnforceVillage($data['to'],0, false);
foreach ($enforcementarray3 as $enforce) {
$life=''; $notlife=''; $wrong='0';
if($enforce['from'] != 0){
if (!isset($villageOwners[$enforce['from']])) {
$villageOwners[$enforce['from']] = $database->getVillageField($enforce['from'],"owner");
}
if (!isset($cachedUserData[$enforce['from']])) {
$cachedUserData[$enforce['from']] = $database->getUserArray($villageOwners[$enforce['from']], 1);
}
$tribe = $cachedUserData[$enforce['from']]["tribe"];
$tribe = $database->getUserArray($database->getVillageField($enforce['from'],"owner"), 1)["tribe"];
}else{
$tribe = 4;
}
@@ -1802,17 +1744,14 @@ 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'];
$totaldead_att = $dead1+$dead2+$dead3+$dead4+$dead5+$dead6+$dead7+$dead8+$dead9+$dead10+$dead11;
//NEED TO SEND A RAPPORTAGE!!!
if (!isset($villageOwners[$enforce['from']])) {
$villageOwners[$enforce['from']] = $database->getVillageField( $enforce['from'], "owner" );
}
$data2 = ''.$villageOwners[$enforce['from']].','.$to['wref'].','.addslashes($to['name']).','.$tribe.','.$life.','.$notlife.','.$lifehero.','.$notlifehero.','.$enforce['from'].'';
$data2 = ''.$database->getVillageField( $enforce['from'], "owner" ).','.$to['wref'].','.addslashes($to['name']).','.$tribe.','.$life.','.$notlife.','.$lifehero.','.$notlifehero.','.$enforce['from'].'';
if(empty($scout)) {
if($totalnotlife == 0){
$database->addNotice($villageOwners[$enforce['from']],$from['wref'],$ownally,15,'Reinforcement in '.addslashes($to['name']).' was attacked',$data2,$AttackArrivalTime);
$database->addNotice($database->getVillageField( $enforce['from'], "owner" ),$from['wref'],$ownally,15,'Reinforcement in '.addslashes($to['name']).' was attacked',$data2,$AttackArrivalTime);
}else if($totallife > $totalnotlife){
$database->addNotice($villageOwners[$enforce['from']],$from['wref'],$ownally,16,'Reinforcement in '.addslashes($to['name']).' was attacked',$data2,$AttackArrivalTime);
$database->addNotice($database->getVillageField( $enforce['from'], "owner" ),$from['wref'],$ownally,16,'Reinforcement in '.addslashes($to['name']).' was attacked',$data2,$AttackArrivalTime);
}else{
$database->addNotice($villageOwners[$enforce['from']],$from['wref'],$ownally,17,'Reinforcement in '.addslashes($to['name']).' was attacked',$data2,$AttackArrivalTime);
$database->addNotice($database->getVillageField( $enforce['from'], "owner" ),$from['wref'],$ownally,17,'Reinforcement in '.addslashes($to['name']).' was attacked',$data2,$AttackArrivalTime);
}
//delete reinf sting when its killed all.
if($wrong=='0'){ $database->deleteReinf($enforce['id']); }
@@ -1979,10 +1918,7 @@ class Automation {
//cranny efficiency
$atk_bonus = ($owntribe == 2)? (4/5) : 1;
$def_bonus = ($targettribe == 3)? 2 : 1;
if (!isset($villageOwners[$data['to']])) {
$villageOwners[$data['to']] = $database->getVillageField($data['to'],"owner");
}
$to_owner = $villageOwners[$data['to']];
$to_owner = $database->getVillageField($data['to'],"owner");
$artefact_2 = count($database->getOwnUniqueArtefactInfo2($to_owner,7,3,0));
$artefact1_2 = count($database->getOwnUniqueArtefactInfo2($data['to'],7,1,1));
$artefact2_2 = count($database->getOwnUniqueArtefactInfo2($to_owner,7,2,0));
@@ -2380,11 +2316,7 @@ class Automation {
$cp_mode = $GLOBALS['cp'.$mode];
$need_cps = $cp_mode[count($varray1)+1];
if (!isset($cachedUserData[$from['owner']])) {
$cachedUserData[$from['owner']] = $database->getUserArray($from['owner'], 1);
}
$user_cps = $cachedUserData[$from['owner']]['cp'];
$user_cps = $database->getUserArray($from['owner'], 1)['cp'];
//check for last village or capital
if($user_cps >= $need_cps){
@@ -2425,17 +2357,14 @@ class Automation {
$info_chief = "".$chief_pic.",Inhabitants of ".$villname." village decided to join your empire.";
if ($artifact['vref'] == $data['to']){
if (!isset($villageOwners[$data['from']])) {
$villageOwners[$data['from']] = $database->getVillageField($data['from'],"owner");
}
$database->claimArtefact($data['to'], $data['to'], $villageOwners[$data['from']]);
$database->claimArtefact($data['to'], $data['to'], $database->getVillageField($data['from'],"owner"));
}
$database->setVillageFields(
$data['to'],
['loyalty', 'owner'],
[0, $villageOwners[$data['from']]]
[0, $database->getVillageField($data['from'],"owner")]
);
//delete upgrades in armory and blacksmith
@@ -2700,7 +2629,7 @@ class Automation {
}
else {
if($type == 3 && $totalsend_att - ($totaldead_att+$totaltraped_att) > 0){
$prisoners = $database->getPrisoners($to['wref']);
$prisoners = $database->getPrisoners($to['wref'], 0, false);
if(count($prisoners) > 0){
$anothertroops = 0;
$mytroops=0;
@@ -2975,8 +2904,8 @@ class Automation {
//check if not natar tribe
$getvillage = $database->getVillage($to['wref']);
if ($getvillage['owner']!=3) {
$crop = $database->getCropProdstarv($to['wref']);
$unitarrays = $this->getAllUnits($to['wref']);
$crop = $database->getCropProdstarv($to['wref'], false);
$unitarrays = $this->getAllUnits($to['wref'], false);
$village_upkeep = $getvillage['pop'] + $this->getUpkeep($unitarrays, 0);
$starv = $getvillage['starv'];
if ($crop < $village_upkeep){
@@ -2988,6 +2917,15 @@ class Automation {
unset($crop,$unitarrays,$getvillage,$village_upkeep);
}
// if evasion was active, return units back to base
if (isset($evaded)) {
foreach ($evasionUnitModifications_modes as $index => $mode) {
$evasionUnitModifications_modes[$index] = 1;
}
$database->modifyUnit($data['to'], $evasionUnitModifications_units, $evasionUnitModifications_amounts, $evasionUnitModifications_modes);
}
#################################################
################FIXED BY SONGER################
#################################################
@@ -3054,6 +2992,7 @@ class Automation {
}
}
if(file_exists("GameEngine/Prevention/sendunits.txt")) {
unlink("GameEngine/Prevention/sendunits.txt");
}
+6 -19
View File
@@ -240,7 +240,7 @@ class Battle {
}
//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, $defReinforcements = null, $villageOwners = array(), $userdataCache = array()) {
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) {
global $bid34,$bid35,$database;
// Define the array, with the units
@@ -307,21 +307,11 @@ class Battle {
}
$DefendersAll = (!is_null($defReinforcements) ? $database->getEnforceVillage($DefenderWref,0) : $defReinforcements);
if (!isset($villageOwners[$DefenderWref])) {
$villageOwners[ $DefenderWref ] = $database->getVillageField( $DefenderWref, "owner" );
}
if(!empty($DefendersAll) && $DefenderWref>0){
foreach($DefendersAll as $defenders) {
for ($i=1;$i<=50;$i++) {$def_ab[$i]=0;}
$fromvillage = $defenders['from'];
if (!isset($villageOwners[$fromvillage])) {
$villageOwners[$fromvillage] = $database->getVillageField($fromvillage,"owner");
$userdataCache[$fromvillage] = $database->getUserArray($villageOwners[$fromvillage], 1);
}
$enforcetribe = $userdataCache[$fromvillage]["tribe"];
$enforcetribe = $database->getUserArray($database->getVillageField($fromvillage,"owner"), 1)["tribe"];
$ud=($enforcetribe-1)*10;
if($defenders['from']>0) { //don't check nature tribe
$armory = $database->getABTech($defenders['from']); // Armory level every village enforcement
@@ -346,7 +336,7 @@ class Battle {
$cdp+=$datadef['cdp'];
$involve=$datadef['involve'];
}
$reinfowner = $villageOwners[$fromvillage];
$reinfowner = $database->getVillageField($fromvillage,"owner");
$defhero = $this->getBattleHero($reinfowner);
//calculate def hero from enforcement
if($defenders['hero'] != 0){
@@ -582,7 +572,7 @@ class Battle {
$wctp = pow(($rap/$rdp),1.5);
$wctp = ($wctp >= 1)? 1-0.5/$wctp : 0.5*$wctp;
$wctp *= $catp+($att_ab8/1.5);
$artowner = $villageOwners[$DefenderWref];
$artowner = $database->getVillageField( $DefenderWref, "owner" );
$bartefact = count($database->getOwnUniqueArtefactInfo2($artowner,1,3,0));
$bartefact1 = count($database->getOwnUniqueArtefactInfo2($DefenderWref,1,1,1));
$bartefact2 = count($database->getOwnUniqueArtefactInfo2($artowner,1,2,0));
@@ -625,7 +615,7 @@ class Battle {
$wctp = pow(($rap/$rdp),1.5);
$wctp = ($wctp >= 1)? 1-0.5/$wctp : 0.5*$wctp;
$wctp *= ($ram/2) + ($att_ab7/1.5);
$artowner = $villageOwners[$DefenderWref];
$artowner = $database->getVillageField( $DefenderWref, "owner" );
$bartefact = count($database->getOwnUniqueArtefactInfo2($artowner,1,3,0));
$bartefact1 = count($database->getOwnUniqueArtefactInfo2($DefenderWref,1,1,1));
$bartefact2 = count($database->getOwnUniqueArtefactInfo2($artowner,1,2,0));
@@ -716,10 +706,7 @@ class Battle {
foreach($DefendersAll as $defenders) {
if($defenders['hero']>0) {
if(!empty($heroarray)) { reset($heroarray); }
if (!isset($villageOwners[$defenders['from']])) {
$villageOwners[$defenders['from']] = $database->getVillageField($defenders['from'],"owner");
$battleHeroesCache[$defenders['from']] = $this->getBattleHero($villageOwners[$defenders['from']]);
}
$battleHeroesCache[$defenders['from']] = $this->getBattleHero($database->getVillageField($defenders['from'],"owner"));
$heroarraydefender = $battleHeroesCache[$defenders['from']];
$_result=mysqli_query($GLOBALS['link'],"select heroid, health from " . TB_PREFIX . "hero where `dead`='0' and `heroid`=".(int) $heroarraydefender['heroid']);
$fdb = mysqli_fetch_array($_result);
+21 -14
View File
@@ -379,6 +379,11 @@ class MYSQLi_DB implements IDbConnection {
*/
$cropProductionStarvationValueCache = [],
/**
* @var array Cache of profile villages.
*/
$profileVillagesCache = [],
/**
* @var array Cache of messages to be sent out to players,
* so we can collect them and send them out together
@@ -1547,12 +1552,20 @@ class MYSQLi_DB implements IDbConnection {
}
}
function getProfileVillages($uid) {
function getProfileVillages($uid, $use_cache = true) {
list($uid) = $this->escape_input((int) $uid);
// first of all, check if we should be using cache and whether the field
// required is already cached
if ($use_cache && ($cachedValue = self::returnCachedContent(self::$profileVillagesCache, $uid)) && !is_null($cachedValue)) {
return $cachedValue;
}
$q = "SELECT capital,wref,name,pop,created from " . TB_PREFIX . "vdata where owner = $uid order by pop desc";
$result = mysqli_query($this->dblink,$q);
return $this->mysqli_fetch_all($result);
self::$profileVillagesCache[$uid] = $this->mysqli_fetch_all($result);
return self::$profileVillagesCache[$uid];
}
// no need to refactor this method
@@ -4470,20 +4483,14 @@ class MYSQLi_DB implements IDbConnection {
return true;
}
function checkEmbassiesAfterBattle(&$villageOwners, &$cachedUserData, $vid) {
if (!isset($villageOwners[$vid])) {
$villageOwners[$vid] = $this->getVillageField($vid,"owner");
}
function checkEmbassiesAfterBattle($vid) {
$userData = $this->getUserArray($this->getVillageField($vid,"owner"), 1);
if (!isset($cachedUserData[$vid])) {
$cachedUserData[$vid] = $this->getUserArray($villageOwners[$vid], 1);
}
Automation::updateMax($villageOwners[$vid]);
Automation::updateMax($this->getVillageField($vid,"owner"));
$allianceStatus = $this->checkAllianceEmbassiesStatus([
'id' => $cachedUserData[$vid],
'alliance' => $cachedUserData[$vid]["alliance"],
'username' => $cachedUserData[$vid]["username"],
'id' => $userData['id'],
'alliance' => $userData["alliance"],
'username' => $userData["username"],
'lvl' => $totallvl
]);