mirror of
https://github.com/Shadowss/TravianZ.git
synced 2026-07-21 20:16:11 +00:00
d89ffe4482
### Core Architecture Refactor - Split the `Database.php` class into domain-specific traits under `GameEngine/Database/`. - Split the `Automation` class into domain-specific traits under `GameEngine/Automation/`. - Grouped methods by functional domain for improved maintainability and navigation. - Preserved 100% backward compatibility. - No logic or behavioral changes. - Pure structural refactor.
929 lines
36 KiB
PHP
929 lines
36 KiB
PHP
<?php
|
|
|
|
#################################################################################
|
|
## -= YOU MAY NOT REMOVE OR CHANGE THIS NOTICE =- ##
|
|
## --------------------------------------------------------------------------- ##
|
|
## Project: TravianZ ##
|
|
## Filename: DatabaseTroopQueries.php ##
|
|
## Split&Refactor Shadow ##
|
|
## Purpose: Units, training, research, hospital, reinforcements ##
|
|
## ##
|
|
## Phase S1: Trait extracted from GameEngine/Database.php ##
|
|
## (MYSQLi_DB class). ##
|
|
## Methods were moved IDENTICALLY, with no logic changes. ##
|
|
## ##
|
|
## License: TravianZ Project ##
|
|
## Copyright: TravianZ (c) 2010-2026. All rights reserved. ##
|
|
## URLs: https://travianz.org ##
|
|
## https://github.com/Shadowss/TravianZ ##
|
|
#################################################################################
|
|
|
|
trait DatabaseTroopQueries {
|
|
|
|
function deleteReinf($id) {
|
|
list($id) = $this->escape_input((int) $id);
|
|
|
|
$q = "DELETE from " . TB_PREFIX . "enforcement where id = '$id'";
|
|
mysqli_query($this->dblink,$q);
|
|
self::clearReinforcementsCache();
|
|
}
|
|
|
|
public function countOasisTroops($vref, $use_cache = true) {
|
|
list($vref) = $this->escape_input((int) $vref);
|
|
|
|
// 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::$oasisTroopsCountCache, $vref)) && !is_null($cachedValue)) {
|
|
return $cachedValue;
|
|
}
|
|
|
|
//count oasis troops: $troops_o
|
|
$troops_o = 0;
|
|
$o_unit = $this->getUnit($vref, $use_cache);
|
|
|
|
for ( $i = 1; $i < 51; $i ++ ) {
|
|
$troops_o += $o_unit[ 'u'.$i ];
|
|
}
|
|
|
|
$troops_o += $o_unit['hero'];
|
|
$o_unit2 = $this->getEnforceVillage($vref, 0, $use_cache);
|
|
|
|
foreach ($o_unit2 as $o_unit) {
|
|
for ( $i = 1; $i < 51; $i ++ ) {
|
|
$troops_o += $o_unit[ 'u'.$i ];
|
|
}
|
|
|
|
$troops_o += $o_unit['hero'];
|
|
}
|
|
|
|
self::$oasisTroopsCountCache[$vref] = $troops_o;
|
|
return self::$oasisTroopsCountCache[$vref];
|
|
}
|
|
|
|
function getResearchLock($wid) {
|
|
$wid = (int) $wid;
|
|
$result = mysqli_query($this->dblink, "SELECT GET_LOCK('research_village_$wid', 10) AS locked");
|
|
$row = mysqli_fetch_assoc($result);
|
|
return $row['locked'] == 1;
|
|
}
|
|
|
|
function releaseResearchLock($wid) {
|
|
$wid = (int) $wid;
|
|
mysqli_query($this->dblink, "SELECT RELEASE_LOCK('research_village_$wid')");
|
|
}
|
|
|
|
function getTrainingLock($wid) {
|
|
$wid = (int) $wid;
|
|
$result = mysqli_query($this->dblink, "SELECT GET_LOCK('train_village_$wid', 10) AS locked");
|
|
$row = mysqli_fetch_assoc($result);
|
|
return $row['locked'] == 1;
|
|
}
|
|
|
|
function releaseTrainingLock($wid) {
|
|
$wid = (int) $wid;
|
|
mysqli_query($this->dblink, "SELECT RELEASE_LOCK('train_village_$wid')");
|
|
}
|
|
|
|
function getEnforceLock($id) {
|
|
$id = (int) $id;
|
|
$result = mysqli_query($this->dblink, "SELECT GET_LOCK('enforce_$id', 10) AS locked");
|
|
$row = mysqli_fetch_assoc($result);
|
|
return $row['locked'] == 1;
|
|
}
|
|
|
|
function releaseEnforceLock($id) {
|
|
$id = (int) $id;
|
|
mysqli_query($this->dblink, "SELECT RELEASE_LOCK('enforce_$id')");
|
|
}
|
|
|
|
/**
|
|
* Add the unit table(s) and troops if presents
|
|
*
|
|
* @param mixed $vid The villaged ID(s)
|
|
* @param array $troopsArray divided in two portion, which contains the types (unidimensional array) and the values of the
|
|
* troops that need to be added (bidimensional array)
|
|
* @return bool Returns true if the query was successful, false otherwise
|
|
*/
|
|
|
|
function addUnits($vid, $troopsArray = null) {
|
|
list($vid) = $this->escape_input($vid);
|
|
|
|
if(empty($vid)) return;
|
|
if (!is_array($vid)) $vid = [$vid];
|
|
$types = "";
|
|
$typeKeys = [];
|
|
$values = [];
|
|
|
|
if($troopsArray != null){
|
|
$typeKeys = $troopsArray[0];
|
|
$values = $troopsArray[1];
|
|
|
|
$types = ",u".implode(",u", $typeKeys);
|
|
}
|
|
|
|
foreach ($vid as $index => $vidValue) $vid[$index] = (int) $vidValue.($troopsArray != null ? ",".implode(",", $values[$index]) : "");
|
|
|
|
$duplicateUpdate = "";
|
|
if(!empty($typeKeys)){
|
|
$duplicateColumns = [];
|
|
foreach($typeKeys as $typeKey){
|
|
$typeKey = (int) $typeKey;
|
|
$duplicateColumns[] = "u".$typeKey."=VALUES(u".$typeKey.")";
|
|
}
|
|
$duplicateUpdate = " ON DUPLICATE KEY UPDATE ".implode(', ', $duplicateColumns);
|
|
}else{
|
|
$duplicateUpdate = " ON DUPLICATE KEY UPDATE vref=vref";
|
|
}
|
|
|
|
$q = "INSERT into " . TB_PREFIX . "units (vref$types) values (".implode('),(', $vid).")".$duplicateUpdate;
|
|
return mysqli_query($this->dblink,$q);
|
|
}
|
|
|
|
function getUnit($vid, $use_cache = true) {
|
|
$array_passed = is_array($vid);
|
|
|
|
if (!$array_passed) {
|
|
$singleVillage = true;
|
|
$vid = [$vid];
|
|
} else {
|
|
foreach ($vid as $index => $vidValue) {
|
|
$vid[$index] = (int) $vidValue;
|
|
}
|
|
}
|
|
|
|
$returnArray = [];
|
|
|
|
// first of all, check if we should be using cache and whether the field
|
|
// required is already cached
|
|
if ($use_cache && !$array_passed && ($cachedValue = self::returnCachedContent(self::$unitsCache, (int) $vid[0])) && !is_null($cachedValue)) {
|
|
return $cachedValue;
|
|
} else if ($use_cache && $array_passed) {
|
|
$newIDs = [];
|
|
foreach ($vid as $villageID) {
|
|
// don't cache what we don't need to cache
|
|
if (isset(self::$unitsCache[$villageID])) {
|
|
$returnArray[$villageID] = self::$unitsCache[$villageID];
|
|
} else {
|
|
// add the uncached ID, so we can select and cache it
|
|
$newIDs[] = $villageID;
|
|
}
|
|
}
|
|
$vid = $newIDs;
|
|
|
|
// nothing to cache? return what we have
|
|
if (!count($vid)) {
|
|
return $returnArray;
|
|
}
|
|
}
|
|
|
|
$q = "SELECT * from " . TB_PREFIX . "units where vref IN(".implode(', ', $vid).")";
|
|
$result = mysqli_query($this->dblink,$q);
|
|
$resCount = 0;
|
|
$vidCount = count($vid);
|
|
|
|
if (!empty($result) && ($resCount = mysqli_num_rows($result)) && $resCount) {
|
|
while ($row = mysqli_fetch_assoc($result)) {
|
|
self::$unitsCache[$row['vref']] = $row;
|
|
$returnArray[$row['vref']] = $row;
|
|
}
|
|
} else {
|
|
// fill everything with nulls
|
|
foreach ($vid as $id) {
|
|
self::$unitsCache[$id] = null;
|
|
$returnArray[$id] = null;
|
|
}
|
|
}
|
|
|
|
// check if we're not missing any return values
|
|
if ($vidCount != $resCount) {
|
|
// fill-in the gaps, as it would mean some of the IDs we got were not found
|
|
// (which is super-strange, but it's still a mathematical possibility)
|
|
foreach ($vid as $id) {
|
|
if (!isset($returnArray[$id])) {
|
|
$returnArray[$id] = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
return (!isset($singleVillage) ? $returnArray : reset($returnArray));
|
|
}
|
|
|
|
// no need to cache this method
|
|
function getUnitsNumber($vid, $mode = 1, $use_cache = false) {
|
|
list( $vid ) = $this->escape_input( (int) $vid );
|
|
|
|
$dbarray = $this->getUnit( $vid );
|
|
$totalunits = 0;
|
|
for ( $i = 1; $i <= 90; $i ++ ) {
|
|
$totalunits += $dbarray[ 'u' . $i ];
|
|
}
|
|
|
|
$totalunits += $dbarray['hero'];
|
|
if(!$mode) return $totalunits;
|
|
|
|
$movingunits = $this->getVillageMovement( $vid );
|
|
$reinforcingunits = $this->getEnforceArray( $vid, 1 );
|
|
$owner = $this->getVillageField( $vid, "owner" );
|
|
$ownertribe = $this->getUserField( $owner, "tribe", 0 );
|
|
$start = ( $ownertribe - 1 ) * 10 + 1;
|
|
$end = ( $ownertribe * 10 );
|
|
|
|
for ( $i = $start; $i <= $end; $i ++ ) {
|
|
$totalunits += $movingunits[ 'u' . $i ] ?? 0;
|
|
$totalunits += $reinforcingunits[ 'u' . $i ] ?? 0;
|
|
}
|
|
|
|
$totalunits += $movingunits['hero'] ?? 0;
|
|
$totalunits += $reinforcingunits['hero'] ?? 0;
|
|
|
|
return $totalunits;
|
|
}
|
|
|
|
function addTech($vid) {
|
|
if(empty($vid)) return;
|
|
if (!is_array($vid)) {
|
|
$vid = [$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) {
|
|
if(empty($vid)) return;
|
|
if (!is_array($vid)) {
|
|
$vid = [$vid];
|
|
}
|
|
|
|
foreach ($vid as $index => $vidValue) {
|
|
$vid[$index] = (int) $vidValue;
|
|
}
|
|
|
|
self::$abTechCache = [];
|
|
$q = "INSERT INTO " . TB_PREFIX . "abdata (vref) VALUES (".implode('),(', $vid).")";
|
|
return mysqli_query($this->dblink,$q);
|
|
}
|
|
|
|
function getABTech($vid, $use_cache = true) {
|
|
$array_passed = is_array($vid);
|
|
|
|
if (!$array_passed) {
|
|
$vid = [(int) $vid];
|
|
} else {
|
|
foreach ($vid as $index => $ivdValue) {
|
|
$vid[$index] = (int) $ivdValue;
|
|
}
|
|
}
|
|
|
|
if (!count($vid)) {
|
|
return [];
|
|
}
|
|
|
|
// first of all, check if we should be using cache and whether the field
|
|
// required is already cached
|
|
if ($use_cache && !$array_passed && isset(self::$abTechCache[$vid[0]]) && is_array(self::$abTechCache[$vid[0]]) && !count(self::$abTechCache[$vid[0]])) {
|
|
return self::$abTechCache[$vid[0]];
|
|
} else if ($use_cache && $array_passed) {
|
|
// check what we can return from cache
|
|
$newVIDs = [];
|
|
foreach ($vid as $key) {
|
|
if (!isset(self::$abTechCache[$key])) {
|
|
$newVIDs [] = $key;
|
|
}
|
|
}
|
|
|
|
// everything's cached, just return the cache
|
|
if (!count($newVIDs)) {
|
|
return self::$abTechCache;
|
|
} else {
|
|
// update remaining IDs to select and cache
|
|
$vid = $newVIDs;
|
|
}
|
|
} else if ($use_cache && !$array_passed && ($cachedValue = self::returnCachedContent(self::$abTechCache, $vid[0])) && !is_null($cachedValue)) {
|
|
// special case when we have empty arrays cached for this cache only
|
|
return $cachedValue;
|
|
}
|
|
|
|
$q = "SELECT * FROM " . TB_PREFIX . "abdata where vref IN(".implode(', ', $vid).")";
|
|
$result = $this->mysqli_fetch_all(mysqli_query($this->dblink,$q));
|
|
|
|
// return a single value
|
|
if (!$array_passed) {
|
|
self::$abTechCache[$vid[0]] = $result[0];
|
|
} else {
|
|
if ($result && count($result)) {
|
|
foreach ( $result as $record ) {
|
|
self::$abTechCache[ $record['vref']] = $record;
|
|
}
|
|
}
|
|
|
|
// check for any missing IDs and fill them in with blanks,
|
|
// since no reinforcements were found for these villages
|
|
foreach ($vid as $key) {
|
|
if (!isset(self::$abTechCache[$key])) {
|
|
self::$abTechCache[$key] = [];
|
|
}
|
|
}
|
|
}
|
|
|
|
return ($array_passed ? self::$abTechCache : self::$abTechCache[$vid[0]]);
|
|
}
|
|
|
|
function addResearch($vid, $tech, $time) {
|
|
list($vid, $tech, $time) = $this->escape_input((int) $vid, $tech, (int) $time);
|
|
|
|
self::$researchingCache = [];
|
|
$q = "INSERT into " . TB_PREFIX . "research values (0,$vid,'$tech',$time)";
|
|
return mysqli_query($this->dblink,$q);
|
|
}
|
|
|
|
function getResearching($vid, $use_cache = true) {
|
|
$vid = (int) $vid;
|
|
|
|
// first of all, check if we should be using cache and whether the field
|
|
// required is already cached
|
|
if ($use_cache && isset(self::$researchingCache[$vid]) && is_array(self::$researchingCache[$vid]) && !count(self::$researchingCache[$vid])) {
|
|
return self::$researchingCache[$vid];
|
|
} else if ($use_cache && ($cachedValue = self::returnCachedContent(self::$researchingCache, $vid)) && !is_null($cachedValue)) {
|
|
return $cachedValue;
|
|
}
|
|
|
|
$q = "SELECT * FROM " . TB_PREFIX . "research where vref = $vid ORDER BY timestamp ASC";
|
|
$result = mysqli_query($this->dblink,$q);
|
|
$researchingCache[$vid] = $this->mysqli_fetch_all($result);
|
|
return $researchingCache[$vid];
|
|
}
|
|
|
|
function checkIfResearched($vref, $unit, $use_cache = true) {
|
|
list($vref, $unit) = $this->escape_input((int) $vref, $unit);
|
|
|
|
// 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::$isResearchedCache, $vref)) && !is_null($cachedValue)) {
|
|
return $cachedValue[$unit];
|
|
}
|
|
|
|
$q = "SELECT * FROM " . TB_PREFIX . "tdata WHERE vref = $vref LIMIT 1";
|
|
$result = mysqli_query($this->dblink,$q);
|
|
$dbarray = mysqli_fetch_array($result, MYSQLI_ASSOC);
|
|
|
|
self::$isResearchedCache[$vref] = $dbarray;
|
|
return self::$isResearchedCache[$vref][$unit];
|
|
}
|
|
|
|
function getTech($vid) {
|
|
// this is a somewhat non-ideal, externally non-changeable way of caching
|
|
// but since we're only ever going to be calling this from Village constructor
|
|
// for our current village, this will more than suffice
|
|
static $cachedData = [];
|
|
$vid = (int) $vid;
|
|
|
|
if (isset($cachedData[$vid])) {
|
|
return $cachedData[$vid];
|
|
}
|
|
|
|
$q = "SELECT * from " . TB_PREFIX . "tdata where vref = $vid";
|
|
$result = mysqli_query($this->dblink,$q);
|
|
$cachedData[$vid] = mysqli_fetch_assoc($result);
|
|
|
|
return $cachedData[$vid];
|
|
}
|
|
|
|
// no need to cache this method
|
|
|
|
// ==================== HOSPITAL (raniti + vindecare) ====================
|
|
|
|
function getWounded($vid) {
|
|
list($vid) = $this->escape_input((int)$vid);
|
|
$result = mysqli_query($this->dblink, "SELECT * FROM " . TB_PREFIX . "hospital WHERE vref = $vid");
|
|
return $result ? mysqli_fetch_array($result, MYSQLI_ASSOC) : null;
|
|
}
|
|
|
|
function addWounded($vid, array $units, array $amounts) {
|
|
list($vid) = $this->escape_input((int)$vid);
|
|
$cols = []; $vals = []; $upd = [];
|
|
foreach($units as $k => $u) {
|
|
$u = (int)$u; $a = (int)$amounts[$k];
|
|
if($a <= 0 || $u < 1 || $u > 90) continue;
|
|
$cols[] = "u$u"; $vals[] = $a; $upd[] = "u$u = u$u + $a";
|
|
}
|
|
if(empty($cols)) return true;
|
|
$q = "INSERT INTO " . TB_PREFIX . "hospital (vref, " . implode(',', $cols) . ") VALUES ($vid, " . implode(',', $vals) . ") ON DUPLICATE KEY UPDATE " . implode(',', $upd);
|
|
return mysqli_query($this->dblink, $q);
|
|
}
|
|
|
|
function deductWounded($vid, $unit, $amt) {
|
|
list($vid, $unit, $amt) = $this->escape_input((int)$vid, (int)$unit, (int)$amt);
|
|
return mysqli_query($this->dblink, "UPDATE " . TB_PREFIX . "hospital SET u$unit = GREATEST(u$unit - $amt, 0) WHERE vref = $vid");
|
|
}
|
|
|
|
function clearHospital($vid) {
|
|
list($vid) = $this->escape_input((int)$vid);
|
|
mysqli_query($this->dblink, "DELETE FROM " . TB_PREFIX . "hospital WHERE vref = $vid");
|
|
mysqli_query($this->dblink, "DELETE FROM " . TB_PREFIX . "healing WHERE vref = $vid");
|
|
}
|
|
|
|
function getHealing($vid) {
|
|
list($vid) = $this->escape_input((int)$vid);
|
|
$result = mysqli_query($this->dblink, "SELECT * FROM " . TB_PREFIX . "healing WHERE vref = $vid ORDER BY id");
|
|
$rows = [];
|
|
if($result) while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) $rows[] = $row;
|
|
return $rows;
|
|
}
|
|
|
|
function getHealingDue($time) {
|
|
list($time) = $this->escape_input((int)$time);
|
|
$result = mysqli_query($this->dblink, "SELECT * FROM " . TB_PREFIX . "healing WHERE timestamp2 <= $time AND amt > 0");
|
|
$rows = [];
|
|
if($result) while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) $rows[] = $row;
|
|
return $rows;
|
|
}
|
|
|
|
function healUnit($vid, $unit, $amt, $each) {
|
|
list($vid, $unit, $amt, $each) = $this->escape_input((int)$vid, (int)$unit, (int)$amt, (int)$each);
|
|
$now = time();
|
|
$q = "INSERT INTO " . TB_PREFIX . "healing (vref, unit, amt, timestamp, eachtime, timestamp2) VALUES ($vid, $unit, $amt, $now, $each, " . ($now + $each) . ")";
|
|
return mysqli_query($this->dblink, $q);
|
|
}
|
|
|
|
function updateHealing($id, $amt, $timestamp2) {
|
|
list($id, $amt, $timestamp2) = $this->escape_input((int)$id, (int)$amt, (int)$timestamp2);
|
|
return mysqli_query($this->dblink, "UPDATE " . TB_PREFIX . "healing SET amt = $amt, timestamp2 = $timestamp2 WHERE id = $id");
|
|
}
|
|
|
|
function deleteHealing($id) {
|
|
list($id) = $this->escape_input((int)$id);
|
|
return mysqli_query($this->dblink, "DELETE FROM " . TB_PREFIX . "healing WHERE id = $id");
|
|
}
|
|
|
|
function getTraining($vid) {
|
|
list($vid) = $this->escape_input((int) $vid);
|
|
|
|
$q = "SELECT * FROM " . TB_PREFIX . "training where vref = $vid ORDER BY id";
|
|
$result = mysqli_query($this->dblink,$q);
|
|
return $this->mysqli_fetch_all($result);
|
|
}
|
|
|
|
function trainUnit($vid, $unit, $amt, $pop, $each, $mode) {
|
|
list($vid, $unit, $amt, $pop, $each, $mode) = $this->escape_input((int) $vid, (int) $unit, (int) $amt, (int) $pop, (int) $each, $mode);
|
|
|
|
global $technology;
|
|
|
|
if(!$mode) {
|
|
// Rutare generica pe tipul unitatii (u1-u90 + offsetul +1000 pentru cladirile mari)
|
|
global $unitsbytype;
|
|
$isGreat = $unit > 1000;
|
|
$baseUnit = $isGreat ? $unit - 1000 : $unit;
|
|
|
|
if($baseUnit == 99) $queued = $technology->getTrainingList(8);
|
|
elseif(in_array($baseUnit, $unitsbytype['expansion'])) $queued = $technology->getTrainingList(4);
|
|
elseif(in_array($baseUnit, $unitsbytype['siege'])) $queued = $technology->getTrainingList($isGreat ? 7 : 3);
|
|
elseif(in_array($baseUnit, $unitsbytype['cavalry'])) $queued = $technology->getTrainingList($isGreat ? 6 : 2);
|
|
else $queued = $technology->getTrainingList($isGreat ? 5 : 1);
|
|
|
|
$now = time();
|
|
$uid = $this->getVillageField($vid, "owner");
|
|
$each = $this->getArtifactsValueInfluence($uid, $vid, 5, $each);
|
|
|
|
$time2 = $now + $each;
|
|
$time = $now + ($each * $amt);
|
|
if(count($queued) > 0){
|
|
$time += $queued[count($queued) - 1]['timestamp'] - $now;
|
|
$time2 += $queued[count($queued) - 1]['timestamp'] - $now;
|
|
}
|
|
|
|
$q = "INSERT INTO " . TB_PREFIX . "training values (0, $vid, $unit, $amt, $pop, $time, $each, $time2)";
|
|
}
|
|
else $q = "DELETE FROM " . TB_PREFIX . "training where id = $vid";
|
|
|
|
return mysqli_query($this->dblink,$q);
|
|
}
|
|
|
|
function updateTraining($id, $trained, $each) {
|
|
list($id, $trained, $each) = $this->escape_input((int) $id, (int) $trained, (int) $each);
|
|
|
|
$q = "UPDATE " . TB_PREFIX . "training set amt = amt - $trained, timestamp2 = timestamp2 + $each where id = $id";
|
|
return mysqli_query($this->dblink,$q);
|
|
}
|
|
|
|
function modifyUnit($vref, $array_unit, $array_amt, $array_mode) {
|
|
list($vref, $array_unit, $array_amt, $array_mode) = $this->escape_input((int) $vref, $array_unit, $array_amt, $array_mode);
|
|
$i = -1;
|
|
$units='';
|
|
$number = count($array_unit);
|
|
foreach($array_unit as $unit){
|
|
if($unit == 230) $unit = 30;
|
|
if($unit == 231) $unit = 31;
|
|
if($unit == 120) $unit = 20;
|
|
if($unit == 121) $unit = 21;
|
|
if($unit =="hero") $unit = 'hero';
|
|
else $unit = 'u' . $unit;
|
|
|
|
++$i;
|
|
//Fixed part of negative troops (double troops) - by InCube
|
|
$array_amt[$i] = (int) $array_amt[$i] < 0 ? 0 : $array_amt[$i];
|
|
//Fixed part of negative 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);
|
|
}
|
|
|
|
function getEnforce($vid, $from, $use_cache = true) {
|
|
$array_passed = is_array($vid);
|
|
if (!$array_passed) {
|
|
$vid = [$vid];
|
|
$from = [$from];
|
|
} else {
|
|
foreach ($vid as $index => $vidValue) {
|
|
$vid[$index] = (int) $vidValue;
|
|
$from[$index] = (int) $from[$index];
|
|
}
|
|
}
|
|
|
|
if (!count($vid)) {
|
|
return [];
|
|
}
|
|
|
|
// first of all, check if we should be using cache and whether the field
|
|
// required is already cached
|
|
if ($use_cache && !$array_passed && isset(self::$villageFromReinforcementsCache[$vid[0].$from[0]]) && is_array(self::$villageFromReinforcementsCache[$vid[0].$from[0]]) && !count(self::$villageFromReinforcementsCache[$vid[0].$from[0]])) {
|
|
return self::$villageFromReinforcementsCache[$vid[0].$from[0]];
|
|
} else if ($use_cache && $array_passed) {
|
|
// check what we can return from cache
|
|
$newVIDs = [];
|
|
$newFROMs = [];
|
|
foreach ($vid as $index => $vidValue) {
|
|
if (!isset(self::$villageFromReinforcementsCache[$vidValue.$from[$index]])) {
|
|
$newVIDs[] = $vidValue;
|
|
$newFROMs[] = $from[$index];
|
|
}
|
|
}
|
|
|
|
// everything's cached, just return the cache
|
|
if (!count($newVIDs)) {
|
|
return self::$villageFromReinforcementsCache;
|
|
} else {
|
|
// update remaining IDs to select and cache
|
|
$vid = $newVIDs;
|
|
$from = $newFROMs;
|
|
}
|
|
} else if ($use_cache && !$array_passed && ($cachedValue = self::returnCachedContent(self::$villageFromReinforcementsCache, $vid[0].$from[0])) && !is_null($cachedValue)) {
|
|
return $cachedValue;
|
|
}
|
|
|
|
// build SELECT pairs
|
|
$pairs = [];
|
|
foreach ($vid as $index => $vidValue) {
|
|
$pairs[] = '(`from` = '.(int) $from[$index].' AND vref = '.(int) $vidValue.')';
|
|
}
|
|
|
|
$q = "SELECT * FROM " . TB_PREFIX . "enforcement WHERE ".implode(' OR ', $pairs);
|
|
$result = $this->mysqli_fetch_all(mysqli_query($this->dblink,$q));
|
|
|
|
// return a single value
|
|
if (!$array_passed) {
|
|
self::$villageFromReinforcementsCache[$vid[0].$from[0]] = $result[0];
|
|
} else {
|
|
if ($result && count($result)) {
|
|
foreach ( $result as $record ) {
|
|
self::$villageFromReinforcementsCache[$record['vref'].$record['from']] = $record;
|
|
}
|
|
}
|
|
|
|
// check for any missing IDs and fill them in with blanks,
|
|
// since no reinforcements were found for these villages
|
|
foreach ($vid as $index => $vidValue) {
|
|
if (!isset(self::$villageFromReinforcementsCache[$vidValue.$from[$index]])) {
|
|
self::$villageFromReinforcementsCache[$vidValue.$from[$index]] = [];
|
|
}
|
|
}
|
|
}
|
|
|
|
return ($array_passed ? self::$villageFromReinforcementsCache : self::$villageFromReinforcementsCache[$vid[0].$from[0]]);
|
|
}
|
|
|
|
function getOasisEnforce($ref, $mode=0, $use_cache = true) {
|
|
$array_passed = is_array($ref);
|
|
$mode = (int) $mode;
|
|
|
|
if (!$array_passed) {
|
|
$ref = [(int) $ref];
|
|
} else {
|
|
foreach ($ref as $index => $refValue) {
|
|
$ref[$index] = (int) $refValue;
|
|
}
|
|
}
|
|
|
|
if (!count($ref)) {
|
|
return [];
|
|
}
|
|
|
|
// first of all, check if we should be using cache and whether the field
|
|
// required is already cached
|
|
if ($use_cache && !$array_passed && isset(self::$oasisReinforcementsCache[$ref[0].$mode]) && is_array(self::$oasisReinforcementsCache[$ref[0].$mode]) && !count(self::$oasisReinforcementsCache[$ref[0].$mode])) {
|
|
return self::$oasisReinforcementsCache[$ref[0].$mode];
|
|
} else if ($use_cache && $array_passed) {
|
|
// check what we can return from cache
|
|
$newREFs = [];
|
|
foreach ($ref as $key) {
|
|
if (!isset(self::$oasisReinforcementsCache[$key.$mode])) {
|
|
$newREFs [] = $key;
|
|
}
|
|
}
|
|
|
|
// everything's cached, just return the cache
|
|
if (!count($newREFs)) {
|
|
return self::$oasisReinforcementsCache;
|
|
} else {
|
|
// update remaining IDs to select and cache
|
|
$ref = $newREFs;
|
|
}
|
|
} else if ($use_cache && !$array_passed && ($cachedValue = self::returnCachedContent(self::$oasisReinforcementsCache, $ref[0].$mode)) && !is_null($cachedValue)) {
|
|
// special case when we have empty arrays cached for this cache only
|
|
return $cachedValue;
|
|
}
|
|
|
|
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 IN(".implode(', ', $ref).") AND e.from NOT IN(".implode(', ', $ref).")";
|
|
}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 IN(".implode(', ', $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 IN(".implode(', ', $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 IN(".implode(', ', $ref).") AND o.owner=v.owner";
|
|
}
|
|
$result = $this->mysqli_fetch_all(mysqli_query($this->dblink,$q));
|
|
|
|
// return a single value
|
|
if (!$array_passed) {
|
|
self::$oasisReinforcementsCache[$ref[0].$mode] = $result;
|
|
} else {
|
|
if ($result && count($result)) {
|
|
foreach ( $result as $record ) {
|
|
if ( ! isset( self::$oasisReinforcementsCache[ $record['conqured'] . $mode ] ) ) {
|
|
self::$oasisReinforcementsCache[ $record['conqured'] . $mode ] = [];
|
|
}
|
|
|
|
self::$oasisReinforcementsCache[ $record['conqured'] . $mode ][] = $record;
|
|
}
|
|
}
|
|
|
|
// check for any missing IDs and fill them in with blanks,
|
|
// since no reinforcements were found for these villages
|
|
foreach ($ref as $key) {
|
|
if (!isset(self::$oasisReinforcementsCache[$key.$mode])) {
|
|
self::$oasisReinforcementsCache[$key.$mode] = [];
|
|
}
|
|
}
|
|
}
|
|
|
|
return ($array_passed ? self::$oasisReinforcementsCache : self::$oasisReinforcementsCache[$ref[0].$mode]);
|
|
}
|
|
|
|
function getOasisEnforceArray($id, $mode=0, $use_cache = true) {
|
|
list($id, $mode) = $this->escape_input((int) $id, $mode);
|
|
|
|
// 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::$oasisArrayReinforcementsCache, $id.$mode)) && !is_null($cachedValue)) {
|
|
return $cachedValue;
|
|
}
|
|
|
|
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 e.id = $id";
|
|
}else{
|
|
$q = "SELECT e.*,o.conqured FROM ".TB_PREFIX."enforcement as e LEFT JOIN ".TB_PREFIX."odata as o ON e.from=o.wref where e.id =$id";
|
|
}
|
|
$result = mysqli_query($this->dblink,$q);
|
|
|
|
self::$oasisArrayReinforcementsCache[$id.$mode] = mysqli_fetch_assoc($result);
|
|
return self::$oasisArrayReinforcementsCache[$id.$mode];
|
|
}
|
|
|
|
function addEnforce($data) {
|
|
list($data) = $this->escape_input($data);
|
|
|
|
$q = "INSERT into " . TB_PREFIX . "enforcement (vref,`from`) values (" . (int) $data['to'] . "," . (int) $data['from'] . ")";
|
|
mysqli_query($this->dblink,$q);
|
|
$id = mysqli_insert_id($this->dblink);
|
|
$owntribe = $this->getUserField($this->getVillageField($data['from'], "owner"), "tribe", 0);
|
|
$start = ($owntribe - 1) * 10 + 1;
|
|
$end = ($owntribe * 10);
|
|
//add unit
|
|
$j = 1;
|
|
$units = [];
|
|
$amounts = [];
|
|
$modes = [];
|
|
|
|
for($i = $start; $i <= $end; $i++) {
|
|
$units[] = ($i < 0 ? 0 : $i);
|
|
$amounts[] = $data['t' . $j . ''];
|
|
$modes[] = 1;
|
|
$j++;
|
|
}
|
|
|
|
// 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) {
|
|
list($data,$tribe,$dead1,$dead2,$dead3,$dead4,$dead5,$dead6,$dead7,$dead8,$dead9,$dead10,$dead11) = $this->escape_input($data,$tribe,$dead1,$dead2,$dead3,$dead4,$dead5,$dead6,$dead7,$dead8,$dead9,$dead10,$dead11);
|
|
|
|
$q = "INSERT into " . TB_PREFIX . "enforcement (vref,`from`) values (" . (int) $data['to'] . "," . (int) $data['from'] . ")";
|
|
mysqli_query($this->dblink,$q);
|
|
$id = mysqli_insert_id($this->dblink);
|
|
$owntribe = $this->getUserField($this->getVillageField($data['from'], "owner"), "tribe", 0);
|
|
$start = ($owntribe - 1) * 10 + 1;
|
|
$end = ($owntribe * 10);
|
|
$start2 = ($tribe - 1) * 10 + 1;
|
|
$start3 = ($tribe - 1) * 10;
|
|
if($start3 == 0){
|
|
$start3 = "";
|
|
}
|
|
$end2 = ($tribe * 10);
|
|
//add unit
|
|
$j = 1;
|
|
|
|
$units = [];
|
|
$amounts = [];
|
|
$modes = [];
|
|
|
|
for($i = $start; $i <= $end; $i++) {
|
|
$units[] = ($i < 0 ? 0 : $i);
|
|
$amounts[] = $data['t' . $j . ''];
|
|
$modes[] = 1;
|
|
|
|
$units[] = ($i < 0 ? 0 : $i);
|
|
$amounts[] = ${'dead'.$j};
|
|
$modes[] = 0;
|
|
|
|
$j++;
|
|
}
|
|
|
|
// 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) {
|
|
$id = (int) $id;
|
|
|
|
// prepare pairing array, even if we're not passing arrays, so we can use the same logic
|
|
$pairs = [];
|
|
if (!is_array($unit)) {
|
|
$unit = [$unit];
|
|
$amt = [(int) $amt];
|
|
$mode = [(int) $mode];
|
|
}
|
|
|
|
foreach ($unit as $index => $unitType) {
|
|
$unitType = ($unitType != 'hero' ? 'u' . $this->escape($unitType) : $unitType);
|
|
$pairs[] = $unitType . ' = ' . $unitType . (!(int) $mode[$index] ? ' - ' : ' + ') . (int) $amt[$index];
|
|
}
|
|
|
|
$q = "UPDATE " . TB_PREFIX . "enforcement SET ".implode(', ', $pairs)." WHERE id = $id";
|
|
mysqli_query($this->dblink,$q);
|
|
|
|
// clear enforce cache
|
|
self::$villageReinforcementsCache = [];
|
|
self::$villageFromReinforcementsCache = [];
|
|
self::$reinforcementsCache = [];
|
|
}
|
|
|
|
function getEnforceArray($id, $mode, $use_cache = true) {
|
|
list($id, $mode) = $this->escape_input((int) $id, $mode);
|
|
|
|
// 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::$reinforcementsCache, $id.$mode)) && !is_null($cachedValue)) {
|
|
return $cachedValue;
|
|
}
|
|
|
|
if(!$mode) {
|
|
$q = "SELECT * from " . TB_PREFIX . "enforcement where id = $id";
|
|
} else {
|
|
$q = "SELECT * from " . TB_PREFIX . "enforcement where `from` = $id";
|
|
}
|
|
$result = mysqli_query($this->dblink,$q);
|
|
|
|
self::$reinforcementsCache[$id.$mode] = mysqli_fetch_assoc($result);
|
|
return self::$reinforcementsCache[$id.$mode];
|
|
}
|
|
|
|
function getEnforceVillage($id, $mode, $use_cache = true) {
|
|
$array_passed = is_array($id);
|
|
$mode = (int) $mode;
|
|
|
|
if (!$array_passed) {
|
|
$id = [(int) $id];
|
|
} else {
|
|
foreach ($id as $index => $idValue) {
|
|
$id[$index] = (int) $idValue;
|
|
}
|
|
}
|
|
|
|
if (!count($id)) {
|
|
return [];
|
|
}
|
|
|
|
// first of all, check if we should be using cache and whether the field
|
|
// required is already cached
|
|
if ($use_cache && !$array_passed && isset(self::$villageReinforcementsCache[$id[0].$mode]) && is_array(self::$villageReinforcementsCache[$id[0].$mode]) && !count(self::$villageReinforcementsCache[$id[0].$mode])) {
|
|
return self::$villageReinforcementsCache[$id[0].$mode];
|
|
} else if ($use_cache && $array_passed) {
|
|
// check what we can return from cache
|
|
$newIDs = [];
|
|
foreach ($id as $key) {
|
|
if (!isset(self::$villageReinforcementsCache[$key.$mode])) {
|
|
$newIDs [] = $key;
|
|
}
|
|
}
|
|
|
|
// everything's cached, just return the cache
|
|
if (!count($newIDs)) {
|
|
return self::$villageReinforcementsCache;
|
|
} else {
|
|
// update remaining IDs to select and cache
|
|
$id = $newIDs;
|
|
}
|
|
} else if ($use_cache && !$array_passed && ($cachedValue = self::returnCachedContent(self::$villageReinforcementsCache, $id[0].$mode)) && !is_null($cachedValue)) {
|
|
// special case when we have empty arrays cached for this cache only
|
|
return $cachedValue;
|
|
}
|
|
|
|
if(!$mode) {
|
|
$q = "SELECT * from " . TB_PREFIX . "enforcement where vref IN(".implode(', ', $id).")";
|
|
} else if ($mode == 1) {
|
|
$q = "SELECT * from " . TB_PREFIX . "enforcement where `from` IN(".implode(', ', $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 IN(".implode(', ', $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 IN(".implode(', ', $id).") AND v.owner=v1.owner";
|
|
} else if ($mode == 4) {
|
|
$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 IN(".implode(', ', $id).") AND v.owner=v1.owner";
|
|
}
|
|
$result = $this->mysqli_fetch_all(mysqli_query($this->dblink,$q));
|
|
|
|
// return a single value
|
|
if (!$array_passed) {
|
|
self::$villageReinforcementsCache[$id[0].$mode] = $result;
|
|
} else {
|
|
if ($result && count($result)) {
|
|
foreach ( $result as $record ) {
|
|
if ( ! isset( self::$villageReinforcementsCache[ $record['vref'] . $mode ] ) ) {
|
|
self::$villageReinforcementsCache[ $record['vref'] . $mode ] = [];
|
|
}
|
|
|
|
self::$villageReinforcementsCache[ $record['vref'] . $mode ][] = $record;
|
|
}
|
|
}
|
|
|
|
// check for any missing IDs and fill them in with blanks,
|
|
// since no reinforcements were found for these villages
|
|
foreach ($id as $key) {
|
|
if (!isset(self::$villageReinforcementsCache[$key.$mode])) {
|
|
self::$villageReinforcementsCache[$key.$mode] = [];
|
|
}
|
|
}
|
|
}
|
|
|
|
return ($array_passed ? self::$villageReinforcementsCache : self::$villageReinforcementsCache[$id[0].$mode]);
|
|
}
|
|
|
|
public static function clearReinforcementsCache() {
|
|
self::$reinforcementsCache = [];
|
|
self::$villageReinforcementsCache = [];
|
|
self::$villageFromReinforcementsCache = [];
|
|
self::$oasisArrayReinforcementsCache = [];
|
|
self::$oasisReinforcementsCache = [];
|
|
self::clearUnitsCache();
|
|
}
|
|
|
|
public static function clearUnitsCache() {
|
|
self::$unitsCache = [];
|
|
}
|
|
|
|
// no need to cache this method
|
|
function getTrainingList() {
|
|
$q = "SELECT * FROM " . TB_PREFIX . "training where vref IS NOT NULL";
|
|
$result = mysqli_query($this->dblink,$q);
|
|
return $this->mysqli_fetch_all($result);
|
|
}
|
|
}
|