From 67d9a42506e14b3ef38b7eda06b5e57f9ad1b6e9 Mon Sep 17 00:00:00 2001 From: Martin Ambrus Date: Sun, 19 Nov 2017 14:01:30 +0100 Subject: [PATCH] refactor: a lot of Automation foreach loops updated #313 --- GameEngine/Admin/Mods/addUsers.php | 15 +- GameEngine/Admin/Mods/natarbuildingplan.php | 66 +-- GameEngine/Admin/Mods/natarend.php | 15 +- GameEngine/Automation.php | 437 ++++++++++++++------ GameEngine/Database.php | 170 ++++++-- GameEngine/Technology.php | 6 + install/include/accounts.php | 14 +- 7 files changed, 521 insertions(+), 202 deletions(-) diff --git a/GameEngine/Admin/Mods/addUsers.php b/GameEngine/Admin/Mods/addUsers.php index 55b6e247..e6872900 100755 --- a/GameEngine/Admin/Mods/addUsers.php +++ b/GameEngine/Admin/Mods/addUsers.php @@ -62,6 +62,10 @@ else // Looks OK, let's go for it $created = 0; $skipped = 0; + $addUnitsWrefs = []; + $addTechWrefs = []; + $addABTechWrefs = []; + for ($i= 1; $i <= $amount; $i++) { $userName = $baseName . $i; @@ -150,9 +154,9 @@ WHERE id = ".(int) $uid) or die(mysqli_error($database->dblink)); mysqli_query($GLOBALS["link"], $q); $pop = $automation->recountPop($wid); $cp = $automation->recountPop($wid); - $database->addUnits($wid); - $database->addTech($wid); - $database->addABTech($wid); + $addUnitsWrefs[] = $wid; + $addTechWrefs[] = $wid; + $addABTechWrefs[] = $wid; $database->updateUserField($uid,"access",USER,1); //insert units randomly generate the number of troops @@ -168,6 +172,11 @@ WHERE id = ".(int) $uid) or die(mysqli_error($database->dblink)); } } } + + $database->addUnits($addUnitsWrefs); + $database->addTech($addTechWrefs); + $database->addABTech($addABTechWrefs); + header("Location: ../../../Admin/admin.php?p=addUsers&g=OK&bn=$baseName&am=$created&sk=$skipped&bp=$beginnersProtection&tr=$postTribe"); } ?> \ No newline at end of file diff --git a/GameEngine/Admin/Mods/natarbuildingplan.php b/GameEngine/Admin/Mods/natarbuildingplan.php index 774346f3..c78042e9 100755 --- a/GameEngine/Admin/Mods/natarbuildingplan.php +++ b/GameEngine/Admin/Mods/natarbuildingplan.php @@ -17,40 +17,44 @@ mysqli_select_db($GLOBALS["link"], SQL_DB); $id = (int) $_POST['id']; $amt = (int) $_POST['vill_amount']; +$addUnitsWrefs = []; -for($i=1;$i<=$amt;$i++) { + for($i=1;$i<=$amt;$i++) { - $kid = $_POST['kid']; - $wid = $database->generateBase($kid); - $database->setFieldTaken($wid); - $time = time(); - $q = "insert into ".TB_PREFIX."vdata (`wref`,`owner`,`name`,`capital`,`pop`,`cp`,`celebration`,`type`,`wood`,`clay`,`iron`,`maxstore`,`crop`,`maxcrop`,`lastupdate`,`loyalty`,`exp1`,`exp2`,`exp3`,`created`) values ('$wid','3','".PLANVILLAGE."',0,0,0,0,0,80000.00,80000.00,80000.00,80000,80000.00,80000,1314974534,100,0,0,0,1314968914)"; - mysqli_query($GLOBALS["link"], $q) or die(mysqli_error($database->dblink)); - $q = "insert into ".TB_PREFIX."fdata (`vref`,`f1`,`f1t`,`f2`,`f2t`,`f3`,`f3t`,`f4`,`f4t`,`f5`,`f5t`,`f6`,`f6t`,`f7`,`f7t`,`f8`,`f8t`,`f9`,`f9t`,`f10`,`f10t`,`f11`,`f11t`,`f12`,`f12t`,`f13`,`f13t`,`f14`,`f14t`,`f15`,`f15t`,`f16`,`f16t`,`f17`,`f17t`,`f18`,`f18t`,`f19`,`f19t`,`f20`,`f20t`,`f21`,`f21t`,`f22`,`f22t`,`f23`,`f23t`,`f24`,`f24t`,`f25`,`f25t`,`f26`,`f26t`,`f27`,`f27t`,`f28`,`f28t`,`f29`,`f29t`,`f30`,`f30t`,`f31`,`f31t`,`f32`,`f32t`,`f33`,`f33t`,`f34`,`f34t`,`f35`,`f35t`,`f36`,`f36t`,`f37`,`f37t`,`f38`,`f38t`,`f39`,`f39t`,`f40`,`f40t`,`f99`,`f99t`,`wwname`) values ($wid,0,1,0,4,0,1,0,3,0,2,0,2,0,3,0,4,0,4,0,3,0,3,0,4,0,4,0,1,0,4,0,2,0,1,0,2,20,17,20,11,10,27,20,10,10,22,10,25,0,0,20,15,10,19,0,0,0,0,0,0,10,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,16,0,0,0,0,'World Wonder')"; - mysqli_query($GLOBALS["link"], $q); - $pop = $automation->recountPop($wid); - $cp = $automation->recountPop($wid); - $database->addUnits($wid); - $database->addTech($wid); - $database->addABTech($wid); - $speed = NATARS_UNITS; - $q = "UPDATE ".TB_PREFIX."units SET u41 = u41 + " . (1500 * $speed) . ", u42 = u42 + " . (1500 * $speed) . ", u43 = u43 + " . (1500 * $speed) . ", u44 = u44 + " . (1500 * $speed) . ", u45 = u45 + " . (1500 * $speed) . ", u46 = u46 + " . (1500 * $speed) . ", u47 = u47 + " . (1500 * $speed) . ", u48 = u48 + " . (1500 * $speed) . " , u49 = u49 + " . (1500 * $speed) . ", u50 = u50 + " . (1500 * $speed) . " WHERE vref = '".$wid."'"; - mysqli_query($GLOBALS["link"], $q); - $desc = PLAN_DESC; - $database->addArtefact($wid, 3, 11, 1, PLAN, $desc, '', 'type1.gif'); -} - $myFile = "../../../Templates/text.tpl"; - $fh = fopen($myFile, 'w') or die("


Can't open file: templates/text.tpl"); - $text = file_get_contents("../../../Templates/text_format.tpl"); - $text = preg_replace("'%TEKST%'",PLAN_INFO ,$text); - fwrite($fh, $text); + $kid = $_POST['kid']; + $wid = $database->generateBase($kid); + $database->setFieldTaken($wid); + $time = time(); + $q = "insert into ".TB_PREFIX."vdata (`wref`,`owner`,`name`,`capital`,`pop`,`cp`,`celebration`,`type`,`wood`,`clay`,`iron`,`maxstore`,`crop`,`maxcrop`,`lastupdate`,`loyalty`,`exp1`,`exp2`,`exp3`,`created`) values ('$wid','3','".PLANVILLAGE."',0,0,0,0,0,80000.00,80000.00,80000.00,80000,80000.00,80000,1314974534,100,0,0,0,1314968914)"; + mysqli_query($GLOBALS["link"], $q) or die(mysqli_error($database->dblink)); + $q = "insert into ".TB_PREFIX."fdata (`vref`,`f1`,`f1t`,`f2`,`f2t`,`f3`,`f3t`,`f4`,`f4t`,`f5`,`f5t`,`f6`,`f6t`,`f7`,`f7t`,`f8`,`f8t`,`f9`,`f9t`,`f10`,`f10t`,`f11`,`f11t`,`f12`,`f12t`,`f13`,`f13t`,`f14`,`f14t`,`f15`,`f15t`,`f16`,`f16t`,`f17`,`f17t`,`f18`,`f18t`,`f19`,`f19t`,`f20`,`f20t`,`f21`,`f21t`,`f22`,`f22t`,`f23`,`f23t`,`f24`,`f24t`,`f25`,`f25t`,`f26`,`f26t`,`f27`,`f27t`,`f28`,`f28t`,`f29`,`f29t`,`f30`,`f30t`,`f31`,`f31t`,`f32`,`f32t`,`f33`,`f33t`,`f34`,`f34t`,`f35`,`f35t`,`f36`,`f36t`,`f37`,`f37t`,`f38`,`f38t`,`f39`,`f39t`,`f40`,`f40t`,`f99`,`f99t`,`wwname`) values ($wid,0,1,0,4,0,1,0,3,0,2,0,2,0,3,0,4,0,4,0,3,0,3,0,4,0,4,0,1,0,4,0,2,0,1,0,2,20,17,20,11,10,27,20,10,10,22,10,25,0,0,20,15,10,19,0,0,0,0,0,0,10,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,16,0,0,0,0,'World Wonder')"; + mysqli_query($GLOBALS["link"], $q); + $pop = $automation->recountPop($wid); + $cp = $automation->recountPop($wid); + $addUnitsWrefs[] = $wid; + $database->addTech($wid); + $database->addABTech($wid); + $speed = NATARS_UNITS; + $q = "UPDATE ".TB_PREFIX."units SET u41 = u41 + " . (1500 * $speed) . ", u42 = u42 + " . (1500 * $speed) . ", u43 = u43 + " . (1500 * $speed) . ", u44 = u44 + " . (1500 * $speed) . ", u45 = u45 + " . (1500 * $speed) . ", u46 = u46 + " . (1500 * $speed) . ", u47 = u47 + " . (1500 * $speed) . ", u48 = u48 + " . (1500 * $speed) . " , u49 = u49 + " . (1500 * $speed) . ", u50 = u50 + " . (1500 * $speed) . " WHERE vref = '".$wid."'"; + mysqli_query($GLOBALS["link"], $q); + $desc = PLAN_DESC; + $database->addArtefact($wid, 3, 11, 1, PLAN, $desc, '', 'type1.gif'); + } - $query="SELECT * FROM ".TB_PREFIX."users ORDER BY id DESC"; - $result=mysqli_query($GLOBALS["link"], $query) or die (mysqli_error($database->dblink)); - for ($i=0; $row=mysqli_fetch_row($result); $i++) { - $updateattquery = mysqli_query($GLOBALS["link"], "UPDATE ".TB_PREFIX."users SET ok = '1' WHERE id = '".$row[0]."'") - or die(mysqli_error($database->dblink)); - } + $database->addUnits($addUnitsWrefs); + + $myFile = "../../../Templates/text.tpl"; + $fh = fopen($myFile, 'w') or die("


Can't open file: templates/text.tpl"); + $text = file_get_contents("../../../Templates/text_format.tpl"); + $text = preg_replace("'%TEKST%'",PLAN_INFO ,$text); + fwrite($fh, $text); + + $query="SELECT * FROM ".TB_PREFIX."users ORDER BY id DESC"; + $result=mysqli_query($GLOBALS["link"], $query) or die (mysqli_error($database->dblink)); + for ($i=0; $row=mysqli_fetch_row($result); $i++) { + $updateattquery = mysqli_query($GLOBALS["link"], "UPDATE ".TB_PREFIX."users SET ok = '1' WHERE id = '".$row[0]."'") + or die(mysqli_error($database->dblink)); + } mysqli_query($GLOBALS["link"], "Insert into ".TB_PREFIX."admin_log values (0,$id,'Added $amt WW Buildingplan Villages',".time().")"); diff --git a/GameEngine/Admin/Mods/natarend.php b/GameEngine/Admin/Mods/natarend.php index 0f421a88..ebd392de 100755 --- a/GameEngine/Admin/Mods/natarend.php +++ b/GameEngine/Admin/Mods/natarend.php @@ -17,6 +17,9 @@ mysqli_select_db($GLOBALS["link"], SQL_DB); $id = (int) $_POST['id']; $amt = (int) $_POST['vill_amount']; +$addUnitsWrefs = []; +$addTechWrefs = []; +$addABTechWrefs = []; for($i=1;$i<=$amt;$i++) { @@ -31,9 +34,9 @@ for($i=1;$i<=$amt;$i++) { mysqli_query($GLOBALS["link"], $q); $pop = $automation->recountPop($wid); $cp = $automation->recountPop($wid); - $database->addUnits($wid); - $database->addTech($wid); - $database->addABTech($wid); + $addUnitsWrefs[] = $wid; + $addTechWrefs[] = $wid; + $addABTechWrefs[] = $wid; $speed = NATARS_UNITS; //new with random amount of troops @@ -41,9 +44,11 @@ for($i=1;$i<=$amt;$i++) { mysqli_query($GLOBALS["link"], $q); } +$database->addUnits($addUnitsWrefs); +$database->addTech($addTechWrefs); +$database->addABTech($addABTechWrefs); - mysqli_query($GLOBALS["link"], "Insert into ".TB_PREFIX."admin_log values (0,$id,'Added $amt WW Villages',".time().")"); - +mysqli_query($GLOBALS["link"], "Insert into ".TB_PREFIX."admin_log values (0,$id,'Added $amt WW Villages',".time().")"); header("Location: ../../../Admin/admin.php?p=natarend&g"); ?> diff --git a/GameEngine/Automation.php b/GameEngine/Automation.php index a75e726f..ba350b3b 100755 --- a/GameEngine/Automation.php +++ b/GameEngine/Automation.php @@ -2363,7 +2363,7 @@ class Automation { } // clear resource levels cache, since we might have destroyed buildings/fields by now - $database->clearResourseLevelsCache(); + call_user_func(get_class($database).'::clearResourseLevelsCache'); } } } elseif (($data['t7']-$traped7)>0) { @@ -3147,12 +3147,30 @@ class Automation { $database->query($q); $getmovement = $database->getMovement(3,$wref,1); + + $moveIDs = []; + $time = microtime(true); + $types = []; + $froms = []; + $tos = []; + $refs = []; + $times = []; + $endtimes = []; + foreach($getmovement as $movedata) { - $time = microtime(true); $time2 = $time - $movedata['starttime']; - $database->setMovementProc($movedata['moveid']); - $database->addMovement(4,$movedata['to'],$movedata['from'],$movedata['ref'],$time,$time+$time2); + $moveIDs[] = $movedata['moveid']; + $types[] = 4; + $froms[] = $movedata['to']; + $tos[] = $movedata['from']; + $refs[] = $movedata['ref']; + $times[] = $time; + $endtimes[] = $time+$time2; } + + $database->setMovementProc(implode(', ', $moveIDs)); + $database->addMovement($types, $froms, $tos, $refs, $times, $endtimes); + $q = "DELETE FROM ".TB_PREFIX."enforcement WHERE `from` = $wref"; $database->query($q); @@ -3346,6 +3364,9 @@ class Automation { $dataarray = $database->query_return($q); if ($dataarray && count($dataarray)) { + + $movementProcIDs = []; + foreach($dataarray as $data) { $isoasis = $database->isVillageOases($data['to']); if($isoasis == 0){ @@ -3370,7 +3391,7 @@ class Automation { $database->modifyEnforce($reinf['id'],31,1,1); $data_fail = '0,0,4,1,0,0,0,0,0,0,0,0,0,0'; $database->addNotice($to['owner'],$to['wref'],(isset($targetally) ? $targetally : 0),8,'village of the elders reinforcement '.addslashes($to['name']).'',$data_fail,$AttackArrivalTime); - $database->setMovementProc($data['moveid']); + $movementProcIDs[] = $data['moveid']; if ($session->uid==$DefenderID) $reload=true; }else{ //set base things @@ -3453,8 +3474,9 @@ class Automation { $database->addNotice($to['owner'],$to['wref'],(isset($targetally) ? $targetally : 0),8,''.addslashes($from['name']).' reinforcement '.addslashes($to_name).'',$data_fail,(isset($AttackArrivalTime) ? $AttackArrivalTime : time())); } //update status - $database->setMovementProc($data['moveid']); + $movementProcIDs[] = $data['moveid']; } + $crop = $database->getCropProdstarv($data['to']); $unitarrays = $this->getAllUnits($data['to']); $village = $database->getVillage($data['to']); @@ -3477,6 +3499,8 @@ class Automation { $q="DELETE FROM ".TB_PREFIX."enforcement WHERE ".$e_units." AND (vref=".(int) $data['to']." OR `from`=".(int) $data['to'].")"; $database->query($q); } + + $database->setMovementProc(implode(', ', $movementProcIDs)); } if(file_exists("GameEngine/Prevention/sendreinfunits.txt")) { @@ -3517,6 +3541,8 @@ class Automation { $wavesData = []; if ($dataarray && count($dataarray)) { + + $movementProcIDs = []; foreach($dataarray as $data) { if (!isset($wavesData[$data['from'].$data['to'].$data['starttime'].$data['endtime']])) { $tribe = $database->getUserField($database->getVillageField($data['to'],"owner"),"tribe",0); @@ -3528,7 +3554,7 @@ class Automation { array($data['t1'],$data['t2'],$data['t3'],$data['t4'],$data['t5'],$data['t6'],$data['t7'],$data['t8'],$data['t9'],$data['t10'],$data['t11']), array(1,1,1,1,1,1,1,1,1,1,1) ); - $database->setMovementProc($data['moveid']); + $movementProcIDs[] = $data['moveid']; $crop = $database->getCropProdstarv($data['to']); $unitarrays = $this->getAllUnits($data['to']); $village = $database->getVillage($data['to']); @@ -3546,15 +3572,20 @@ class Automation { $wavesData[$data['from'].$data['to'].$data['starttime'].$data['endtime']] = true; } else { // duplicate record, just mark it as processed - $database->setMovementProc($data['moveid']); + $movementProcIDs[] = $data['moveid']; } } + + $database->setMovementProc(implode(', ', $movementProcIDs)); } // Recieve the bounty on type 6. $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 = 6 AND endtime < $time"; + $dataarray = $database->query_return($q); + $movementProcIDs = []; + foreach($dataarray as $data) { if($data['wood'] >= $data['clay'] && $data['wood'] >= $data['iron'] && $data['wood'] >= $data['crop']){ $sort_type = "10"; } @@ -3566,7 +3597,7 @@ class Automation { $from = $database->getMInfo($data['from']); $database->modifyResource($data['to'],$data['wood'],$data['clay'],$data['iron'],$data['crop'],1); //$database->updateVillage($data['to']); - $database->setMovementProc($data['moveid']); + $movementProcIDs[] = $data['moveid']; $crop = $database->getCropProdstarv($data['to']); $unitarrays = $this->getAllUnits($data['to']); $village = $database->getVillage($data['to']); @@ -3581,21 +3612,24 @@ class Automation { } } + $database->setMovementProc(implode(', ', $movementProcIDs)); $this->pruneResource(); // Settlers $q = "SELECT `to`, moveid FROM ".TB_PREFIX."movement where ref = 0 and proc = '0' and sort_type = '4' and endtime < $time"; + $dataarray = $database->query_return($q); + $movementProcIDs = []; + if ($dataarray && count($dataarray)) { foreach($dataarray as $data) { - $tribe = $database->getUserField($database->getVillageField($data['to'],"owner"),"tribe",0); - $database->modifyUnit($data['to'],array($tribe."0"),array(3),array(1)); - $database->setMovementProc($data['moveid']); - + $movementProcIDs[] = $data['moveid']; } + + $database->setMovementProc(implode(', ', $movementProcIDs)); } if(file_exists("GameEngine/Prevention/returnunits.txt")) { @@ -3613,7 +3647,21 @@ class Automation { fclose($ourFileHandle); $time = microtime(true); $q = "SELECT `to`, `from`, moveid, starttime, ref FROM ".TB_PREFIX."movement where proc = 0 and sort_type = 5 and endtime < $time"; + $dataarray = $database->query_return($q); + $movementProcIDs = []; + $fieldIDs = []; + $addUnitsWrefs = []; + $addTechWrefs = []; + $addABTechWrefs = []; + $time = microtime(true); + $types = []; + $froms = []; + $tos = []; + $refs = []; + $times = []; + $endtimes = []; + foreach($dataarray as $data) { $ownerID = $database->getUserField($database->getVillageField($data['from'],"owner"),"id",0); if ($session->uid==$ownerID) $reload=true; @@ -3621,13 +3669,13 @@ class Automation { $user = addslashes($database->getUserField($to['owner'],'username',0)); $taken = $database->getVillageState($data['to']); if($taken != 1){ - $database->setFieldTaken($data['to']); + $fieldIDs[] = $data['to']; $database->addVillage($data['to'],$to['owner'],$user,'0'); $database->addResourceFields($data['to'],$database->getVillageType($data['to'])); - $database->addUnits($data['to']); - $database->addTech($data['to']); - $database->addABTech($data['to']); - $database->setMovementProc($data['moveid']); + $addUnitsWrefs[] = $data['to']; + $addTechWrefs[] = $data['to']; + $addABTechWrefs[] = $data['to']; + $movementProcIDs[] = $data['moveid']; $exp1 = $database->getVillageField($data['from'],'exp1'); $exp2 = $database->getVillageField($data['from'],'exp2'); @@ -3649,10 +3697,23 @@ class Automation { } else{ // here must come movement from returning settlers - $database->addMovement(4,$data['to'],$data['from'],$data['ref'],$time,$time+($time-$data['starttime'])); - $database->setMovementProc($data['moveid']); + $types[] = 4; + $froms[] = $data['to']; + $tos[] = $data['from']; + $refs[] = $data['ref']; + $times[] = $time; + $endtimes[] = $time+($time-$data['starttime']); + $movementProcIDs[] = $data['moveid']; } } + + $database->addMovement($types, $froms, $tos, $refs, $times, $endtimes); + $database->setMovementProc(implode(', ', $movementProcIDs)); + $database->setFieldTaken($fieldIDs); + $database->addUnits($addUnitsWrefs); + $database->addTech($addTechWrefs); + $database->addABTech($addABTechWrefs); + if(file_exists("GameEngine/Prevention/settlers.txt")) { unlink("GameEngine/Prevention/settlers.txt"); } @@ -3668,24 +3729,55 @@ class Automation { $ourFileHandle = fopen($autoprefix."GameEngine/Prevention/research.txt", 'w'); fclose($ourFileHandle); + $time = time(); + $deleteIDs = []; + $tdata = []; + $abdata = []; + $q = "SELECT tech, vref, id FROM ".TB_PREFIX."research where timestamp < $time"; $dataarray = $database->query_return($q); + foreach($dataarray as $data) { $sort_type = substr($data['tech'],0,1); switch($sort_type) { case "t": - $q = "UPDATE ".TB_PREFIX."tdata set ".$data['tech']." = 1 where vref = ".(int) $data['vref']; + if (!isset($tdata[$data['vref']])) { + $tdata[$data['vref']] = []; + } + + $tdata[$data['vref']][] = $data['tech'].' = 1'; break; case "a": case "b": - $q = "UPDATE ".TB_PREFIX."abdata set ".$data['tech']." = ".$data['tech']." + 1 where vref = ".(int) $data['vref']; + if (!isset($abdata[$data['vref']])) { + $abdata[$data['vref']] = []; + } + + $abdata[$data['vref']][] = $data['tech']." = ".$data['tech']." + 1"; break; } - $database->query($q); - $q = "DELETE FROM ".TB_PREFIX."research where id = ".(int) $data['id']; - $database->query($q); + $deleteIDs[] = (int) $data['id']; } + + // execute queries with consolidated research data + if (count($tdata)) { + foreach ( $tdata as $vid => $preparedData ) { + $q = "UPDATE ".TB_PREFIX."tdata SET ".implode(', ', $preparedData)." WHERE vref = ".$vid; + $database->query($q); + } + } + + if (count($abdata)) { + foreach ( $abdata as $vid => $preparedData ) { + $q = "UPDATE ".TB_PREFIX."abdata SET ".implode(', ', $preparedData)." WHERE vref = ".$vid; + $database->query($q); + } + } + + $q = "DELETE FROM ".TB_PREFIX."research where id IN(".implode(', ', $deleteIDs).")"; + $database->query($q); + if(file_exists("GameEngine/Prevention/research.txt")) { unlink("GameEngine/Prevention/research.txt"); } @@ -3763,10 +3855,12 @@ class Automation { return array($wood,$clay,$iron,$crop); } - function getAllUnits($base) { + function getAllUnits($base, $use_cache = true) { global $database; - $ownunit = $database->getUnit($base); - $enforcementarray = $database->getEnforceVillage($base,0); + + $ownunit = $database->getUnit($base, $use_cache); + $enforcementarray = $database->getEnforceVillage($base, 0, $use_cache); + if(count($enforcementarray) > 0) { foreach($enforcementarray as $enforce) { for($i=1;$i<=50;$i++) { @@ -3774,7 +3868,8 @@ class Automation { } } } - $enforceoasis=$database->getOasisEnforce($base,0); + + $enforceoasis=$database->getOasisEnforce($base, 0, $use_cache); if(count($enforceoasis) > 0) { foreach($enforceoasis as $enforce) { for($i=1;$i<=50;$i++) { @@ -3782,7 +3877,8 @@ class Automation { } } } - $enforceoasis1=$database->getOasisEnforce($base,1); + + $enforceoasis1=$database->getOasisEnforce($base, 1, $use_cache); if(count($enforceoasis1) > 0) { foreach($enforceoasis1 as $enforce) { for($i=1;$i<=50;$i++) { @@ -3790,6 +3886,7 @@ class Automation { } } } + $movement = $database->getVillageMovement($base); if(!empty($movement)) { for($i=1;$i<=50;$i++) { @@ -3800,7 +3897,8 @@ class Automation { $ownunit['u'.$i] += (isset($movement['u'.$i]) ? $movement['u'.$i] : 0); } } - $prisoners = $database->getPrisoners($base,1); + + $prisoners = $database->getPrisoners($base, 1, $use_cache); if(!empty($prisoners)) { foreach($prisoners as $prisoner){ $owner = $database->getVillageField($base,"owner"); @@ -4140,9 +4238,9 @@ class Automation { if($train['amt'] == 0){ $database->trainUnit($train['id'],0,0,0,0,1,1); } - $crop = $database->getCropProdstarv($train['vref']); - $unitarrays = $this->getAllUnits($train['vref']); - $village = $database->getVillage($train['vref']); + $crop = $database->getCropProdstarv($train['vref'], false); + $unitarrays = $this->getAllUnits($train['vref'], false); + $village = $database->getVillage($train['vref'], false); $upkeep = $village['pop'] + $this->getUpkeep($unitarrays, 0); $starv = $database->getVillageField($train['vref'],"starv"); if ($crop < $upkeep){ @@ -4205,23 +4303,28 @@ class Automation { } private function getsort_typeLevel($tid,$resarray) { - - global $village; + $keyholder = array(); + foreach(array_keys($resarray,$tid) as $key) { if(strpos($key,'t')) { $key = preg_replace("/[^0-9]/", '', $key); array_push($keyholder, $key); } } + $element = count($keyholder); + if($element >= 2) { + if($tid <= 4) { $temparray = array(); + for($i=0;$i<=$element-1;$i++) { array_push($temparray,$resarray['f'.$keyholder[$i]]); } + foreach ($temparray as $key => $val) { if ($val == max($temparray)) $target = $key; @@ -4242,6 +4345,7 @@ class Automation { else { return 0; } + if($keyholder[$target] != "") { return $resarray['f'.$keyholder[$target]]; } @@ -4269,6 +4373,7 @@ class Automation { $database->clearCel($id); $database->setCelCp($user,$cp); } + if(file_exists("GameEngine/Prevention/celebration.txt")) { unlink("GameEngine/Prevention/celebration.txt"); } @@ -4290,26 +4395,37 @@ class Automation { $type = $database->getFieldType($vil['vref'],$vil['buildnumber']); $level = $database->getFieldLevel($vil['vref'],$vil['buildnumber']); $buildarray = $GLOBALS["bid".$type]; + if ($type==10 || $type==38) { - $q = "UPDATE ".TB_PREFIX."vdata SET `maxstore`=`maxstore`-".$buildarray[$level]['attri']." WHERE wref=".(int) $vil['vref']; - $database->query($q); - $q = "UPDATE ".TB_PREFIX."vdata SET `maxstore`= ".STORAGE_BASE." WHERE `maxstore`<= ".STORAGE_BASE." AND wref=".(int) $vil['vref']; - $database->query($q); + $database->query(" + UPDATE ".TB_PREFIX."vdata + SET + `maxstore` = IF(`maxstore` - ".$buildarray[$level]['attri']." <= ".STORAGE_BASE.", ".STORAGE_BASE.", `maxstore` - ".$buildarray[$level]['attri']."), + WHERE + wref=".(int) $vil['vref']); } + if ($type==11 || $type==39) { - $q = "UPDATE ".TB_PREFIX."vdata SET `maxcrop`=`maxcrop`-".$buildarray[$level]['attri']." WHERE wref=".(int) $vil['vref']; - $database->query($q); - $q = "UPDATE ".TB_PREFIX."vdata SET `maxcrop`= ".STORAGE_BASE." WHERE `maxcrop`<=800 AND wref=".(int) $vil['vref']; - $database->query($q); + $database->query(" + UPDATE ".TB_PREFIX."vdata + SET + `maxcrop` = IF(`maxcrop` - ".$buildarray[$level]['attri']." <= ".STORAGE_BASE.", ".STORAGE_BASE.", `maxcrop` - ".$buildarray[$level]['attri']."), + WHERE + wref=".(int) $vil['vref']); } + if ($level==1) { $clear=",f".$vil['buildnumber']."t=0"; } else { $clear=""; } + if ($village->natar==1 && $type==40) $clear=""; //fix by ronix + $q = "UPDATE ".TB_PREFIX."fdata SET f".$vil['buildnumber']."=".($level-1).$clear." WHERE vref=".(int) $vil['vref']; $database->query($q); - $pop=$this->getPop($type,$level-1); + + $pop = $this->getPop($type,$level-1); $database->modifyPop($vil['vref'],$pop[0],1); $this->procClimbers($database->getVillageField($vil['vref'],'owner')); $database->delDemolition($vil['vref'], true); + if ($type==18){ Automation::updateMax($database->getVillageField($vil['vref'],'owner')); } @@ -4337,6 +4453,12 @@ class Automation { $unitData = $database->getUnit($heroVillageIDs); // now do the math + $columns = []; + $columnValues = []; + $modes = []; + $lastUpdateTime = time(); + $newHealth = -1; + foreach($harray as $hdata){ if((time()-$hdata['lastupdate'])>=1){ if($hdata['health']<100 and $hdata['health']>0){ @@ -4347,33 +4469,86 @@ class Automation { }else{ $speed = ceil(SPEED/100); } + $reg = $hdata['health']+$hdata['regeneration']*5*$speed/86400*(time()-$hdata['lastupdate']); + if($reg <= 100){ - $database->modifyHero("health",$reg,$hdata['heroid']); + $newHealth = $reg; }else{ - $database->modifyHero("health",100,$hdata['heroid']); + $newHealth = 100; } - $database->modifyHero("lastupdate",time(),$hdata['heroid']); } } + $herolevel = $hdata['level']; - for($i = $herolevel+1; $i < 100; $i++){ + $newLevel = -1; + $scorePoints = false; + for ($i = $herolevel+1; $i < 100; $i++){ if($hdata['experience'] >= $hero_levels[$i]){ - mysqli_query($GLOBALS['link'],"UPDATE " . TB_PREFIX ."hero SET level = $i WHERE heroid = '".(int) $hdata['heroid']."'"); - if($i < 99){ - mysqli_query($GLOBALS['link'],"UPDATE " . TB_PREFIX ."hero SET points = points + 5 WHERE heroid = '".(int) $hdata['heroid']."'"); + $newLevel = $i; + if ($i < 99) { + $scorePoints = true; } } } + + // upgrade hero to a new level, if needed + if ($newLevel > -1) { + $columns[] = 'level'; + $columnValues[] = $newLevel; + $modes[] = null; + } + + // add 5 points, if we're below level 100 + if ($scorePoints) { + $columns[] = 'points'; + $columnValues[] = 5; + $modes[] = 1; + } + $villunits = $unitData[$hdata['wref']]; if($villunits['hero'] == 0 && $hdata['trainingtime'] < time() && $hdata['inrevive'] == 1){ mysqli_query($GLOBALS['link'],"UPDATE " . TB_PREFIX . "units SET hero = 1 WHERE vref = ".(int) $hdata['wref'].""); - mysqli_query($GLOBALS['link'],"UPDATE ".TB_PREFIX."hero SET `dead` = '0', `inrevive` = '0', `health` = '100', `lastupdate` = ".(int) $hdata['trainingtime']." WHERE `heroid` = ".(int) $hdata['heroid']); + + $columns[] = 'dead'; + $columnValues[] = 0; + $modes[] = null; + + $columns[] = 'inrevive'; + $columnValues[] = 0; + $modes[] = null; + + $columns[] = 'inrevive'; + $columnValues[] = 0; + $modes[] = null; + + $newHealth = 100; + $lastUpdateTime = (int) $hdata['trainingtime']; } + if($villunits['hero'] == 0 && $hdata['trainingtime'] < time() && $hdata['intraining'] == 1){ mysqli_query($GLOBALS['link'],"UPDATE " . TB_PREFIX . "units SET hero = 1 WHERE vref = ".(int) $hdata['wref']); - mysqli_query($GLOBALS['link'],"UPDATE ".TB_PREFIX."hero SET `intraining` = '0', `lastupdate` = ".(int) $hdata['trainingtime']." WHERE `heroid` = ".(int) $hdata['heroid']); + + $columns[] = 'intraining'; + $columnValues[] = 0; + $modes[] = null; + + $lastUpdateTime = (int) $hdata['trainingtime']; } + + // update health, if needed + if ($newHealth > -1) { + $columns[] = 'health'; + $columnValues[] = $newHealth; + $modes[] = null; + } + + // last update timestamp + $columns[] = 'lastupdate'; + $columnValues[] = $lastUpdateTime; + $modes[] = null; + + $database->modifyHero($columns, $columnValues, $hdata['heroid']); } } if(file_exists("GameEngine/Prevention/updatehero.txt")) { @@ -4440,30 +4615,21 @@ class Automation { private function oasisResourcesProduce() { global $database; - $time = time(); - $q = "SELECT wood, clay, iron, crop, lastupdated, maxstore, maxcrop, wref FROM ".TB_PREFIX."odata WHERE wood < 800 OR clay < 800 OR iron < 800 OR crop < 800"; - $array = $database->query_return($q); - foreach($array as $getoasis) { - $oasiswood = $getoasis['wood'] + (8*SPEED/3600)*(time()-$getoasis['lastupdated']); - $oasisclay = $getoasis['clay'] + (8*SPEED/3600)*(time()-$getoasis['lastupdated']); - $oasisiron = $getoasis['iron'] + (8*SPEED/3600)*(time()-$getoasis['lastupdated']); - $oasiscrop = $getoasis['crop'] + (8*SPEED/3600)*(time()-$getoasis['lastupdated']); - if($oasiswood > $getoasis['maxstore']){ - $oasiswood = $getoasis['maxstore']; - } - if($oasisclay > $getoasis['maxstore']){ - $oasisclay = $getoasis['maxstore']; - } - if($oasisiron > $getoasis['maxstore']){ - $oasisiron = $getoasis['maxstore']; - } - if($oasiscrop > $getoasis['maxcrop']){ - $oasiscrop = $getoasis['maxcrop']; - } - $q = "UPDATE " . TB_PREFIX . "odata set wood = $oasiswood, clay = $oasisclay, iron = $oasisiron, crop = $oasiscrop where wref = ".(int) $getoasis['wref'].""; - $database->query($q); - $database->updateOasis($getoasis['wref']); - } + + $speedMultiplier = (8 * (SPEED/3600)); + $database->query(" + UPDATE " . TB_PREFIX . "odata + SET + lastupdated = UNIX_TIMESTAMP(), + wood = IF(wood + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated)) > maxstore, maxstore, wood + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated))), + clay = IF(clay + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated)) > maxstore, maxstore, clay + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated))), + iron = IF(iron + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated)) > maxstore, maxstore, iron + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated))), + crop = IF(crop + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated)) > maxcrop, maxcrop, crop + ($speedMultiplier * (UNIX_TIMESTAMP() - lastupdated))) + WHERE + wood < 800 OR + clay < 800 OR + iron < 800 OR + crop < 800"); } private function checkInvitedPlayes() { @@ -4486,20 +4652,21 @@ class Automation { private function updateGeneralAttack() { global $database; - $time = time(); - $q = "SELECT id, time FROM ".TB_PREFIX."general WHERE shown = 1"; - $array = $database->query_return($q); - foreach($array as $general) { - if(time() - (86400*8) > $general['time']){ - mysqli_query($GLOBALS['link'],"UPDATE ".TB_PREFIX."general SET shown = 0 WHERE id = ".(int) $general['id'].""); - } - } + + mysqli_query($database->dblink, " + UPDATE ".TB_PREFIX."general + SET + shown = 0 + WHERE + shown = 1 AND + `time` < (UNIX_TIMESTAMP() - (86400 * 8))"); } private function MasterBuilder() { global $database; $q = "SELECT id, wid, type, level, field, timestamp FROM ".TB_PREFIX."bdata WHERE master = 1"; $array = $database->query_return($q); + foreach($array as $master) { $owner = $database->getVillageField($master['wid'],'owner'); $tribe = $database->getUserField($owner,'tribe',0); @@ -4515,42 +4682,56 @@ class Automation { $buildiron = $buildarray[$level]['iron']; $buildcrop = $buildarray[$level]['crop']; $ww = count($database->getBuildingByType($master['wid'],40)); + if($tribe == 1){ + if($master['field'] < 19){ - $bdata = count($database->getDorf1Building($master['wid'])); + $dorf1Buildings = $database->getDorf1Building($master['wid']); + $bdata = count($dorf1Buildings); $bbdata = count($database->getDorf2Building($master['wid'])); - $bdata1 = $database->getDorf1Building($master['wid']); + $bdata1 = $dorf1Buildings; }else{ + $dorf2Buildings = $database->getDorf2Building($master['wid']); $bdata = count($database->getDorf2Building($master['wid'])); $bbdata = count($database->getDorf1Building($master['wid'])); $bdata1 = $database->getDorf2Building($master['wid']); } + }else{ - $bdata = $bbdata = count($database->getDorf1Building($master['wid'])) + count($database->getDorf2Building($master['wid'])); - $bdata1 = $database->getDorf1Building($master['wid']); + $dorf1Buildings = $database->getDorf1Building($master['wid']); + $bdata = $bbdata = count($dorf1Buildings) + count($database->getDorf2Building($master['wid'])); + $bdata1 = $dorf1Buildings; } + if($database->getUserField($owner,'plus',0) > time() or $ww > 0){ + if($bbdata < 2){ $inbuild = 2; }else{ $inbuild = 1; } + }else{ $inbuild = 1; } + $usergold = $database->getUserField($owner,'gold',0); + if($bdata < $inbuild && $buildwood < $villwood && $buildclay < $villclay && $buildiron < $villiron && $buildcrop < $villcrop && $usergold > 0){ $time = $master['timestamp']+time(); + if(!empty($bdata1)){ foreach($bdata1 as $master1) { $time += ($master1['timestamp']-time()); } } + if($bdata == 0){ $database->updateBuildingWithMaster($master['id'],$time,0); }else{ $database->updateBuildingWithMaster($master['id'],$time,1); } + $gold = $usergold-1; $database->updateUserField($owner,'gold',$gold,1); $database->modifyResource($master['wid'],$buildwood,$buildclay,$buildiron,$buildcrop,0); @@ -4602,8 +4783,7 @@ class Automation { // get enforce other player from oasis - $q = "SELECT e.*,o.conqured,o.wref,o.high, o.owner as ownero, v.owner as ownerv FROM ".TB_PREFIX."enforcement as e LEFT JOIN ".TB_PREFIX."odata as o ON e.vref=o.wref LEFT JOIN ".TB_PREFIX."vdata as v ON e.from=v.wref where o.conqured=".(int) $starv['wref']." AND o.owner<>v.owner"; - $enforceoasis = $database->query_return($q); + $enforceoasis = $database->getOasisEnforce($starv['wref'], 2); $maxcount=0; $totalunits=0; if(count($enforceoasis)>0){ @@ -4625,8 +4805,7 @@ class Automation { } }else{ //own troops from oasis - $q = "SELECT e.*,o.conqured,o.wref,o.high, o.owner as ownero, v.owner as ownerv FROM ".TB_PREFIX."enforcement as e LEFT JOIN ".TB_PREFIX."odata as o ON e.vref=o.wref LEFT JOIN ".TB_PREFIX."vdata as v ON e.from=v.wref where o.conqured=".(int) $starv['wref']." AND o.owner=v.owner"; - $enforceoasis = $database->query_return($q); + $enforceoasis = $database->getOasisEnforce($starv['wref'], 3); if(count($enforceoasis)>0){ foreach ($enforceoasis as $enforce){ for($i=1;$i<=50;$i++){ @@ -4645,8 +4824,7 @@ class Automation { } }else{ //get enforce other player from village - $q = "SELECT e.*, v.owner as ownerv, v1.owner as owner1 FROM ".TB_PREFIX."enforcement as e LEFT JOIN ".TB_PREFIX."vdata as v ON e.from=v.wref LEFT JOIN ".TB_PREFIX."vdata as v1 ON e.vref=v1.wref where e.vref=".(int) $starv['wref']." AND v.owner<>v1.owner"; - $enforcearray = $database->query_return($q); + $enforcearray = $database->getEnforceVillage($starv['wref'], 2); if(count($enforcearray)>0){ foreach ($enforcearray as $enforce){ for($i = 0 ; $i <= 50 ; $i++){ @@ -4665,8 +4843,7 @@ class Automation { } }else{ //get own reinforcement from other village - $q = "SELECT e.*, v.owner as ownerv, v1.owner as owner1 FROM ".TB_PREFIX."enforcement as e LEFT JOIN ".TB_PREFIX."vdata as v ON e.from=v.wref LEFT JOIN ".TB_PREFIX."vdata as v1 ON e.vref=v1.wref where e.vref=".(int) $starv['wref']." AND v.owner=v1.owner"; - $enforcearray = $database->query_return($q); + $enforcearray = $database->getEnforceVillage($starv['wref'], 3); if(count($enforcearray)>0){ foreach ($enforcearray as $enforce){ for($i = 0 ; $i <= 50 ; $i++){ @@ -4725,8 +4902,10 @@ class Automation { if($difcrop > 0){ global ${'u'.$maxtype}; + $hungry=array(); $hungry=${'u'.$maxtype}; + if ($hungry['crop']>0 && $oldcrop <=0) { $killunits = intval($difcrop/$hungry['crop']); }else $killunits=0; @@ -4739,24 +4918,33 @@ class Automation { if (isset($enf)){ if($killunits < $maxcount){ $database->modifyEnforce($enf, $maxtype, $killunits, 0); - $database->setVillageField($starv['wref'], 'starv', $upkeep); - $database->setVillageField($starv['wref'], 'starvupdate', $time); + $database->setVillageField( + $starv['wref'], + ['starv', 'starvupdate'], + [$upkeep, $time] + ); $database->modifyResource($starv['wref'],0,0,0,$hungry['crop'],1); + if($maxtype == "hero"){ $heroid = $database->getHeroField($database->getVillageField($enf,"owner"),"heroid"); $database->modifyHero("dead", 1, $heroid); } }else{ $database->deleteReinf($enf); - $database->setVillageField($starv['wref'], 'starv', $upkeep); - $database->setVillageField($starv['wref'], 'starvupdate', $time); + $database->setVillageField( + $starv['wref'], + ['starv', 'starvupdate'], + [$upkeep, $time] + ); } }else{ if($killunits < $maxcount){ - die('vvvv'); $database->modifyUnit($starv['wref'], array($maxtype), array($killunits), array(0)); - $database->setVillageField($starv['wref'], 'starv', $upkeep); - $database->setVillageField($starv['wref'], 'starvupdate', $time); + $database->setVillageField( + $starv['wref'], + ['starv', 'starvupdate'], + [$upkeep, $time] + ); $database->modifyResource($starv['wref'],0,0,0,$hungry['crop'],1); if($maxtype == "hero"){ $heroid = $database->getHeroField($starv['owner'],"heroid"); @@ -4765,8 +4953,12 @@ class Automation { }elseif($killunits > $maxcount){ $killunits = $maxcount; $database->modifyUnit($starv['wref'], array($maxtype), array($killunits), array(0)); - $database->setVillageField($starv['wref'], 'starv', $upkeep); - $database->setVillageField($starv['wref'], 'starvupdate', $time); + $database->setVillageField( + $starv['wref'], + ['starv', 'starvupdate'], + [$upkeep, $time] + ); + if($maxtype == "hero"){ $heroid = $database->getHeroField($starv['owner'],"heroid"); $database->modifyHero("dead", 1, $heroid); @@ -4776,12 +4968,15 @@ class Automation { } } } - $crop = $database->getCropProdstarv($starv['wref']); - if ($crop > $upkeep){ - $database->setVillageField($starv['wref'], 'starv', 0); - $database->setVillageField($starv['wref'], 'starvupdate', 0); - } + $crop = $database->getCropProdstarv($starv['wref'], false); + if ($crop > $upkeep){ + $database->setVillageField( + $starv['wref'], + ['starv', 'starvupdate'], + [0, 0] + ); + } unset ($starv,$unitarrays,$enforcearray,$enforce,$starvarray); } @@ -4935,13 +5130,17 @@ class Automation { private function checkBan() { global $database; - $time = time(); - $q = "SELECT id, uid FROM ".TB_PREFIX."banlist WHERE active = 1 AND end < $time AND end > 0"; - $array = $database->query_return($q); - foreach($array as $banlist) { - mysqli_query($GLOBALS['link'],"UPDATE ".TB_PREFIX."banlist SET active = 0 WHERE id = ".(int) $banlist['id'].""); - mysqli_query($GLOBALS['link'],"UPDATE ".TB_PREFIX."users SET access = 2 WHERE id = ".(int) $banlist['uid'].""); - } + + mysqli_query($database->dblink, " + UPDATE ".TB_PREFIX."banlist as b + JOIN ".TB_PREFIX."users as u ON b.uid = u.id + SET + b.active = 0, + u.access = 2 + WHERE + b.active = 1 AND + b.`end` < UNIX_TIMESTAMP() AND + b.`end` > 0"); } private function regenerateOasisTroops() { diff --git a/GameEngine/Database.php b/GameEngine/Database.php index 47490acd..b4326c63 100755 --- a/GameEngine/Database.php +++ b/GameEngine/Database.php @@ -672,6 +672,7 @@ class MYSQLi_DB implements IDbConnection { */ public static function clearVillageCache() { self::$villageFieldsCache = []; + self::$villageFieldsCacheByWorldID = []; } /** @@ -994,8 +995,8 @@ class MYSQLi_DB implements IDbConnection { return $this->mysqli_fetch_all($result); } - function getVrefField($ref, $field) { - return $this->getVillage($ref)[$field]; + function getVrefField($ref, $field, $use_cache = true) { + return $this->getVillage($ref, $use_cache)[$field]; } // no need to cache this method @@ -1303,9 +1304,15 @@ class MYSQLi_DB implements IDbConnection { } function setFieldTaken($id) { - list($id) = $this->escape_input((int) $id); + if (!is_array($id)) { + $id = [$id]; + } - $q = "UPDATE " . TB_PREFIX . "wdata set occupied = 1 where id = ". $id; + foreach ($id as $index => $idValue) { + $id[$index] = (int) $idValue; + } + + $q = "UPDATE " . TB_PREFIX . "wdata SET occupied = 1 WHERE id IN(". implode(', ', $id).")"; return mysqli_query($this->dblink,$q); } @@ -1879,9 +1886,10 @@ class MYSQLi_DB implements IDbConnection { return self::$resourceLevelsCache[$vid]; } - public function clearResourseLevelsCache() { + public static function clearResourseLevelsCache() { self::$resourceLevelsCache = []; self::$fieldLevelsInVillageSearchCache = []; + self::$fieldLevelsCache = []; } function getAdminLog() { @@ -4948,13 +4956,27 @@ class MYSQLi_DB implements IDbConnection { $ref2 = [$ref2]; } + $counter = 0; $pairs = []; + foreach ($type as $index => $typeValue) { $pairs[] = '(0, '.(int) $typeValue.', '.(int) $from[$index].', '.(int) $to[$index].', '.(int) $ref[$index].', '.(int) $ref2[$index].', '.(int) $time[$index].', '.(int) $endtime[$index].', 0, '.(int) $send[$index].', '.(int) $wood[$index].', '.(int) $clay[$index].', '.(int) $iron[$index].', '.(int) $crop[$index].')'; + + if ($counter++ > 25) { + $q = "INSERT INTO " . TB_PREFIX . "movement VALUES ".implode(', ', $pairs); + mysqli_query($this->dblink,$q); + + $pairs = []; + $counter = 0; + } } - $q = "INSERT INTO " . TB_PREFIX . "movement VALUES ".implode(', ', $pairs); - return mysqli_query($this->dblink,$q); + if ($counter > 0) { + $q = "INSERT INTO " . TB_PREFIX . "movement VALUES " . implode( ', ', $pairs ); + return mysqli_query( $this->dblink, $q ); + } else { + return true; + } } function addAttack($vid, $t1, $t2, $t3, $t4, $t5, $t6, $t7, $t8, $t9, $t10, $t11, $type, $ctar1, $ctar2, $spy,$b1=0,$b2=0,$b3=0,$b4=0,$b5=0,$b6=0,$b7=0,$b8=0) { @@ -5100,9 +5122,15 @@ class MYSQLi_DB implements IDbConnection { } function addUnits($vid) { - list($vid) = $this->escape_input((int) $vid); + if (!is_array($vid)) { + $vid = [$vid]; + } - $q = "INSERT into " . TB_PREFIX . "units (vref) values ($vid)"; + foreach ($vid as $index => $vidValue) { + $vid[$index] = (int) $vidValue; + } + + $q = "INSERT into " . TB_PREFIX . "units (vref) values (".implode(', ', $vid).")"; return mysqli_query($this->dblink,$q); } @@ -5222,16 +5250,25 @@ class MYSQLi_DB implements IDbConnection { return self::$heroFieldCache[$uid.$field][$field]; } - function modifyHero($column,$value,$heroid,$mode=0) { - list($column,$value,$heroid,$mode) = $this->escape_input($column,$value,(int) $heroid,$mode); + function modifyHero($column,$value,$heroid,$mode=null) { + if (!is_array($column)) { + $column = [$column]; + $value = [$value]; + $mode = [$mode]; + } - if(!$mode) { - $q = "UPDATE `".TB_PREFIX."hero` SET $column = '$value' WHERE heroid = $heroid"; - } elseif($mode=1) { - $q = "UPDATE `".TB_PREFIX."hero` SET $column = $column + ". (int) $value . " WHERE heroid = $heroid"; - } else { - $q = "UPDATE `".TB_PREFIX."hero` SET $column = $column - ". (int) $value ." WHERE heroid = $heroid"; - } + $pairs = []; + foreach ($column as $index => $columnValue) { + if($mode[$index] === null) { + $pairs[] = "$columnValue = ".(Math::isInt($value[$index]) ? $value[$index] : '"'.$this->escape($value[$index]).'"'); + } elseif($mode[$index]=1) { + $pairs[] = "$columnValue = $columnValue + ".(int) $value[$index]; + } else { + $pairs[] = "$columnValue = $columnValue - ".(int) $value[$index]; + } + } + + $q = "UPDATE `".TB_PREFIX."hero` SET ".implode(', ', $pairs)." WHERE heroid = $heroid"; return mysqli_query($this->dblink,$q); } @@ -5256,16 +5293,28 @@ class MYSQLi_DB implements IDbConnection { } function addTech($vid) { - list($vid) = $this->escape_input((int) $vid); + if (!is_array($vid)) { + $vid = [$vid]; + } - $q = "INSERT into " . TB_PREFIX . "tdata (vref) values ($vid)"; + foreach ($vid as $index => $vidValue) { + $vid[$index] = (int) $vidValue; + } + + $q = "INSERT INTO " . TB_PREFIX . "tdata (vref) VALUES (".implode(', ', $vid).")"; return mysqli_query($this->dblink,$q); } function addABTech($vid) { - list($vid) = $this->escape_input((int) $vid); + if (!is_array($vid)) { + $vid = [$vid]; + } - $q = "INSERT into " . TB_PREFIX . "abdata (vref) values ($vid)"; + foreach ($vid as $index => $vidValue) { + $vid[$index] = (int) $vidValue; + } + + $q = "INSERT INTO " . TB_PREFIX . "abdata (vref) VALUES (".implode(', ', $vid).")"; return mysqli_query($this->dblink,$q); } @@ -5433,11 +5482,12 @@ class MYSQLi_DB implements IDbConnection { if($unit == 121){$unit = 21;} if($unit =="hero"){$unit = 'hero';} else{$unit = 'u' . $unit;} - ++$i; - //Fixed part of negativ troops (double troops) - by InCube - $array_amt[$i] = (int) $array_amt[$i] < 0 ? 0 : $array_amt[$i]; - //Fixed part of negativ troops (double troops) - by InCube - $units .= $unit.' = '.$unit.' '.(($array_mode[$i] == 1)? '+':'-').' '.($array_amt[$i] ? $array_amt[$i] : 0).(($number > $i+1) ? ', ' : ''); + + ++$i; + //Fixed part of negativ troops (double troops) - by InCube + $array_amt[$i] = (int) $array_amt[$i] < 0 ? 0 : $array_amt[$i]; + //Fixed part of negativ troops (double troops) - by InCube + $units .= $unit.' = '.$unit.' '.(($array_mode[$i] == 1)? '+':'-').' '.($array_amt[$i] ? $array_amt[$i] : 0).(($number > $i+1) ? ', ' : ''); } $q = "UPDATE ".TB_PREFIX."units set $units WHERE vref = $vref"; return mysqli_query($this->dblink,$q); @@ -5470,8 +5520,12 @@ class MYSQLi_DB implements IDbConnection { if (!$mode) { $q = "SELECT e.*,o.conqured FROM ".TB_PREFIX."enforcement as e LEFT JOIN ".TB_PREFIX."odata as o ON e.vref=o.wref where o.conqured = $ref AND e.from !=$ref"; - }else{ + }else if ($mode == 1) { $q = "SELECT e.*,o.conqured FROM ".TB_PREFIX."enforcement as e LEFT JOIN ".TB_PREFIX."odata as o ON e.vref=o.wref where o.conqured = $ref"; + } else if ($mode == 2) { + $q = "SELECT e.*,o.conqured,o.wref,o.high, o.owner as ownero, v.owner as ownerv FROM ".TB_PREFIX."enforcement as e LEFT JOIN ".TB_PREFIX."odata as o ON e.vref=o.wref LEFT JOIN ".TB_PREFIX."vdata as v ON e.from=v.wref where o.conqured=$ref AND o.owner<>v.owner"; + } else if ($mode == 3) { + $q = "SELECT e.*,o.conqured,o.wref,o.high, o.owner as ownero, v.owner as ownerv FROM ".TB_PREFIX."enforcement as e LEFT JOIN ".TB_PREFIX."odata as o ON e.vref=o.wref LEFT JOIN ".TB_PREFIX."vdata as v ON e.from=v.wref where o.conqured=$ref AND o.owner=v.owner"; } $result = mysqli_query($this->dblink,$q); @@ -5509,13 +5563,24 @@ class MYSQLi_DB implements IDbConnection { $start = ($owntribe - 1) * 10 + 1; $end = ($owntribe * 10); //add unit - $j = '1'; + $j = 1; + $units = []; + $amounts = []; + $modes = []; + for($i = $start; $i <= $end; $i++) { - $this->modifyEnforce($id, $i, $data['t' . $j . ''], 1); + $units[] = $i; + $amounts[] = $data['t' . $j . '']; + $modes[] = 1; $j++; } - $this->modifyEnforce($id,'hero',$data['t11'],1); - return mysqli_insert_id($this->dblink); + + // add hero + $units[] = 'hero'; + $amounts[] = $data['t11']; + $modes[] = 1; + + $this->modifyEnforce($id,$units, $amounts, $modes); } function addEnforce2($data,$tribe,$dead1,$dead2,$dead3,$dead4,$dead5,$dead6,$dead7,$dead8,$dead9,$dead10,$dead11) { @@ -5534,15 +5599,34 @@ class MYSQLi_DB implements IDbConnection { } $end2 = ($tribe * 10); //add unit - $j = '1'; + $j = 1; + + $units = []; + $amounts = []; + $modes = []; + for($i = $start; $i <= $end; $i++) { - $this->modifyEnforce($id, $i, $data['t' . $j . ''], 1); - $this->modifyEnforce($id, $i, ${'dead'.$j}, 0); + $units[] = $i; + $amounts[] = $data['t' . $j . '']; + $modes[] = 1; + + $units[] = $i; + $amounts[] = ${'dead'.$j}; + $modes[] = 0; + $j++; } - $this->modifyEnforce($id,'hero',$data['t11'],1); - $this->modifyEnforce($id,'hero',$dead11,0); - return mysqli_insert_id($this->dblink); + + // process heroes + $units[] = 'hero'; + $amounts[] = $data['t11']; + $modes[] = 1; + + $units[] = 'hero'; + $amounts[] = $dead11; + $modes[] = 0; + + $this->modifyEnforce($id,$units, $amounts, $modes); } function modifyEnforce($id, $unit, $amt, $mode) { @@ -5596,9 +5680,13 @@ class MYSQLi_DB implements IDbConnection { if(!$mode) { $q = "SELECT * from " . TB_PREFIX . "enforcement where vref = $id"; - } else { + } else if ($mode == 1) { $q = "SELECT * from " . TB_PREFIX . "enforcement where `from` = $id"; - } + } else if ($mode == 2) { + $q = "SELECT e.*, v.owner as ownerv, v1.owner as owner1 FROM ".TB_PREFIX."enforcement as e LEFT JOIN ".TB_PREFIX."vdata as v ON e.from=v.wref LEFT JOIN ".TB_PREFIX."vdata as v1 ON e.vref=v1.wref where e.vref=$id AND v.owner<>v1.owner"; + } else if ($mode == 3) { + $q = "SELECT e.*, v.owner as ownerv, v1.owner as owner1 FROM ".TB_PREFIX."enforcement as e LEFT JOIN ".TB_PREFIX."vdata as v ON e.from=v.wref LEFT JOIN ".TB_PREFIX."vdata as v1 ON e.vref=v1.wref where e.vref=$id AND v.owner=v1.owner"; + } $result = mysqli_query($this->dblink,$q); self::$villageReinforcementsCache[$id.$mode] = $this->mysqli_fetch_all($result); @@ -6342,7 +6430,7 @@ class MYSQLi_DB implements IDbConnection { $clay = 0; $iron = 0; $basecrop = $grainmill = $bakery = 0; - $owner = $this->getVrefField($wref, 'owner'); + $owner = $this->getVrefField($wref, 'owner', $use_cache); $bonus = $this->getUserField($owner, 'b4', 0); $buildarray = $this->getResourceLevel($wref); diff --git a/GameEngine/Technology.php b/GameEngine/Technology.php index ea7bd30e..11051081 100755 --- a/GameEngine/Technology.php +++ b/GameEngine/Technology.php @@ -542,8 +542,14 @@ class Technology { // global $$unit; // $dataarray = $$unit; if($prisoners == 0){ + if (!isset($array['hero'])) { + $array['hero'] = 0; + } $upkeep += $array['hero'] * 6; }else{ + if (!isset($array['t11'])) { + $array['t11'] = 0; + } $upkeep += $array['t11'] * 6; } $artefact = count($database->getOwnUniqueArtefactInfo2($session->uid,4,3,0)); diff --git a/install/include/accounts.php b/install/include/accounts.php index d9ffbb43..4cc36e58 100644 --- a/install/include/accounts.php +++ b/install/include/accounts.php @@ -47,6 +47,10 @@ $uid = mysqli_insert_id($database->dblink); $admin_village_created = false; $xcoor = 50; + $addUnitsWrefs = []; + $addTechWrefs = []; + $addABTechWrefs = []; + while (!$admin_village_created) { $wid = $admin->getWref($xcoor++, 50); $status = $database->getVillageState($wid); @@ -54,12 +58,16 @@ $database->setFieldTaken($wid); $database->addVillage($wid, $uid, $_POST['aname'], 1); $database->addResourceFields($wid, $database->getVillageType($wid)); - $database->addUnits($wid); - $database->addTech($wid); - $database->addABTech($wid); + $addUnitsWrefs[] = $wid; + $addTechWrefs[] = $wid; + $addABTechWrefs[] = $wid; $admin_village_created = true; } } + + $database->addUnits($addUnitsWrefs); + $database->addTech($addTechWrefs); + $database->addABTech($addABTechWrefs); } // set up MultiHunter