Some full fixes before final v11 release

Some full fixes before final v11 release
This commit is contained in:
novgorodschi catalin
2026-07-23 11:20:01 +03:00
parent 62b39f4d34
commit 9a3f26bc93
7 changed files with 116 additions and 43 deletions
@@ -341,7 +341,14 @@ trait DatabaseBuildingQueries {
*/
function modifyBData($wid, $field, $levels, $tribe){
list($wid, $field, $levels, $tribe) = $this->escape_input((int) $wid, (int) $field, (int) $levels, (int) $tribe);
// HOTFIX "array offset on int": $levels e un ARRAY [nivelNou, nivelVechi] (singurul
// apel: AutomationBattleResolution, dupa lovitura de catapulte). Cast-ul (int) de aici
// il transforma in 1, deci $levels[0] era null, "null == 0" era mereu TRUE si ramura
// else (ajustarea nivelului comenzilor din coada) era COD MORT - comenzile de
// constructie erau sterse mereu, chiar daca cladirea nu ajungea la nivelul 0.
// Pastram cast-ul pe celelalte argumente; elementele lui $levels devin int (SQL-safe).
list($wid, $field, $tribe) = $this->escape_input((int) $wid, (int) $field, (int) $tribe);
$levels = array_map('intval', is_array($levels) ? $levels : [$levels, 0]);
if($levels[0] == 0){
$q = "SELECT id FROM " .TB_PREFIX. "bdata WHERE wid = $wid AND field = $field";
+18 -1
View File
@@ -271,7 +271,24 @@ trait DatabaseConnectionCore {
function query($query) {
// REFACTORIZAT: contorizare centralizată
$this->countQueryType($query);
return mysqli_query($this->dblink,$query);
// HOTFIX deadlock (log 20-23 iul): pe PHP 8.1+ mysqli arunca mysqli_sql_exception,
// deci un deadlock InnoDB (1213) / lock wait timeout (1205) omora tot tick-ul de
// automation. Reincercam de maximum 3 ori cu pauza crescatoare; orice alta eroare
// se arunca mai departe neschimbata. Sigur fata de tranzactii: singurele tranzactii
// explicite din cod (updateStore, populateWorldData) folosesc mysqli_query direct,
// nu metoda aceasta - verificat pe tot repo-ul.
$attempt = 0;
while (true) {
try {
return mysqli_query($this->dblink, $query);
} catch (mysqli_sql_exception $e) {
if (!in_array((int) $e->getCode(), [1213, 1205], true) || ++$attempt >= 3) {
throw $e;
}
usleep(150000 * $attempt); // 150ms, apoi 300ms
}
}
}
function RemoveXSS($val) {
+10 -2
View File
@@ -1846,18 +1846,26 @@ trait DatabaseVillageQueries {
// clear expansion slots, if this village is an expansion of any other village
$this->clearExpansionSlot($wref, 1);
// HOTFIX warning-uri t1..t11/wref/id: pe calea cu array + cache plin,
// getPrisoners() intoarce INTREGUL cache (inclusiv intrari goale [] pentru
// sate fara prizonieri), nu doar satele cerute - de aici cheile lipsa.
// Gardam randurile incomplete; pentru randurile valide comportamentul e identic.
// ANOMALIE de urmarit separat: "return self::$prisonersCache" din getPrisoners()
// poate livra si prizonierii ALTOR sate decat cele cerute.
$getprisoners = $this->getPrisoners($wref);
foreach($getprisoners as $pris) {
if (!is_array($pris) || !isset($pris['wref'], $pris['id'])) continue;
$troops = 0;
for($i = 1; $i < 12; $i++) $troops += $pris['t'.$i];
for($i = 1; $i < 12; $i++) $troops += (int) ($pris['t'.$i] ?? 0);
$this->modifyUnit($pris['wref'], ["99o"], [$troops], [0]);
$this->deletePrisoners($pris['id']);
}
$getprisoners = $this->getPrisoners($wref, 1);
foreach($getprisoners as $pris) {
if (!is_array($pris) || !isset($pris['wref'], $pris['id'])) continue;
$troops = 0;
for($i = 1; $i < 12; $i++) $troops += $pris['t'.$i];
for($i = 1; $i < 12; $i++) $troops += (int) ($pris['t'.$i] ?? 0);
$this->modifyUnit($pris['wref'], ["99o"], [$troops], [0]);
$this->deletePrisoners($pris['id']);
}