diff --git a/GameEngine/Automation/AutomationMarket.php b/GameEngine/Automation/AutomationMarket.php index 084f9eb9..6037e4d0 100644 --- a/GameEngine/Automation/AutomationMarket.php +++ b/GameEngine/Automation/AutomationMarket.php @@ -159,6 +159,27 @@ trait AutomationMarket { if($this->getTypeLevel(28, $from) != 0) { $maxcarry2 *= $bid28[$this->getTypeLevel(28, $from)]['attri'] / 100; } + + // Bonusul de alianta "Commerce". + // + // BUG REPARAT: trimiterea repetata (2x / 3x) e executata de aici, + // nu de Market.php, iar aici bonusul lipsea. Prima livrare pleca cu + // capacitatea marita (calculata in Market.php), dar repetarea o + // recalcula fara bonus, cerea mai multi negustori decat exista si + // se oprea in tacere. + // + // Se ia dupa PROPRIETARUL satului, nu dupa sesiune: aici rulam din + // automatizare, unde nu exista un jucator conectat. + if (class_exists('AllianceBonus') && AllianceBonus::enabled()) { + $ownerFrom = (int) $database->getVillageField($from, 'owner'); + + if ($ownerFrom > 0) { + $maxcarry2 *= AllianceBonus::multiplier($ownerFrom, AllianceBonus::COMMERCE); + } + } + + $maxcarry2 = floor($maxcarry2); + $resource = [$wtrans, $ctrans, $itrans, $crtrans]; $reqMerc = ceil((array_sum($resource) - 0.1) / $maxcarry2); diff --git a/GameEngine/Automation/AutomationPlayerStatistics.php b/GameEngine/Automation/AutomationPlayerStatistics.php index 5f65048e..cbae47cd 100644 --- a/GameEngine/Automation/AutomationPlayerStatistics.php +++ b/GameEngine/Automation/AutomationPlayerStatistics.php @@ -48,7 +48,7 @@ trait AutomationPlayerStatistics $now = time(); $res = mysqli_query($database->dblink, - "SELECT MAX(recorded_at) AS last FROM " . $table); + "SELECT MAX(recorded_at) AS `last` FROM " . $table); $row = $res ? mysqli_fetch_assoc($res) : null; $last = $row ? (int) $row['last'] : 0; @@ -78,7 +78,7 @@ trait AutomationPlayerStatistics // rang, populatie, sate si puncte de lupta, per jucator $q = "SELECT u.id AS uid, - u.oldrank AS rank, + u.oldrank AS `rank`, COALESCE(SUM(v.pop), 0) AS population, COUNT(CASE WHEN v.type != 99 THEN v.wref END) AS villages, u.apall AS attack_points, @@ -91,6 +91,12 @@ trait AutomationPlayerStatistics $res = mysqli_query($database->dblink, $q); if (!$res) { + // Fara asta, o interogare esuata lasa tabela goala la nesfarsit + // fara niciun semn. Exact ce s-a intamplat cu aliasul `rank`, care + // e cuvant rezervat din MySQL 8.0 si trebuie protejat. + error_log('[TravianZ] player statistics snapshot failed: ' + . mysqli_error($database->dblink)); + return; } @@ -125,11 +131,18 @@ trait AutomationPlayerStatistics } foreach (array_chunk($values, 200) as $chunk) { - mysqli_query($database->dblink, + $ok = mysqli_query($database->dblink, "INSERT IGNORE INTO " . $table . " (uid, recorded_at, `rank`, population, villages, troop_count, troop_upkeep, attack_points, defence_points) VALUES " . implode(',', $chunk)); + + if (!$ok) { + error_log('[TravianZ] player statistics insert failed: ' + . mysqli_error($database->dblink)); + + return; + } } } diff --git a/GameEngine/Market.php b/GameEngine/Market.php index 0e7795ef..76029ec0 100755 --- a/GameEngine/Market.php +++ b/GameEngine/Market.php @@ -184,8 +184,17 @@ class Market // Bonusul de alianta "Commerce". Se inmulteste cu biroul comercial, ca // in T4: 750 de baza x 2.2 (Commerce 4) x 5 (birou 20) = 8250. + // Se ia dupa PROPRIETARUL satului, nu dupa sesiune, ca sa dea acelasi + // rezultat si cand codul ruleaza in alt context (sitter, automatizare). + // Calea de repetare din AutomationMarket foloseste aceeasi regula. if (class_exists('AllianceBonus') && AllianceBonus::enabled()) { - $this->maxcarry *= AllianceBonus::multiplier((int) $session->uid, AllianceBonus::COMMERCE); + $carryOwner = isset($village->wid) + ? (int) $database->getVillageField($village->wid, 'owner') + : (int) $session->uid; + + if ($carryOwner > 0) { + $this->maxcarry *= AllianceBonus::multiplier($carryOwner, AllianceBonus::COMMERCE); + } } $this->maxcarry = floor($this->maxcarry);