Some important fix and view

Some important fix and view
This commit is contained in:
novgorodschi catalin
2026-08-11 08:31:17 +03:00
parent ba9bb0f6f6
commit ac262db66f
10 changed files with 575 additions and 87 deletions
+54 -10
View File
@@ -461,6 +461,18 @@ class HeroItems
$p = TB_PREFIX;
/**
* FIX: eroul care se INTORCEA dintr-o aventura aparea ca fiind acasa.
*
* Ciclul unei aventuri e: status 0 (oferta) -> status 1 (dus, miscare
* sort_type 20) -> la sosire status devine 2 si se creeaza miscarea de
* intoarcere (sort_type 21). Numaram doar status = 1, deci pe tot
* drumul de intoarcere eroul "disparea": bara de sus scria "Hero at
* home", iar pagina de echipare lasa schimbarea itemelor desi eroul
* era inca pe drum. Adaugam si miscarea de intoarcere.
*/
$advBack = defined('MOVEMENT_ADVENTURE_BACK') ? (int) MOVEMENT_ADVENTURE_BACK : 21;
// ATENTIE: aliasul pentru miscarea de intoarcere NU poate fi "returning" -
// e cuvant rezervat in MariaDB (clauza RETURNING) si strica query-ul.
// Un singur query, cu motive separate, ca interfata sa poata afisa
@@ -471,6 +483,10 @@ class HeroItems
WHERE uid = ? AND COALESCE(intraining, 0) = 0) AS hero_exists,
(SELECT COUNT(*) FROM {$p}hero_adventure
WHERE uid = ? AND status = 1) AS adventure,
(SELECT COUNT(*) FROM {$p}movement m
INNER JOIN {$p}vdata v ON v.wref = m.`to`
WHERE v.owner = ? AND m.proc = 0
AND m.sort_type = {$advBack}) AS adv_return,
(SELECT IFNULL(SUM(e.hero), 0) FROM {$p}enforcement e
INNER JOIN {$p}vdata v ON v.wref = e.`from`
WHERE v.owner = ?) AS reinforcement,
@@ -490,9 +506,9 @@ class HeroItems
return self::$awayCache[$uid] = '';
}
$stmt->bind_param('iiiii', $uid, $uid, $uid, $uid, $uid);
$stmt->bind_param('iiiiii', $uid, $uid, $uid, $uid, $uid, $uid);
$stmt->execute();
$stmt->bind_result($heroExists, $adventure, $reinforcement, $outgoing, $atkReturn);
$stmt->bind_result($heroExists, $adventure, $advReturn, $reinforcement, $outgoing, $atkReturn);
$stmt->fetch();
$stmt->close();
@@ -504,7 +520,10 @@ class HeroItems
// conteaza - inca nu exista cu adevarat.
if ((int) $heroExists === 0) {
$reason = 'nohero';
} elseif ((int) $adventure > 0) {
} elseif (((int) $adventure + (int) $advReturn) > 0) {
// "adventure" acopera ambele picioare ale drumului: dus si intors.
// Contractul metodei ramane neschimbat, deci 37_items.tpl continua
// sa afiseze acelasi mesaj - doar ca acum si pe drumul de intoarcere.
$reason = 'adventure';
} elseif (((int) $outgoing + (int) $atkReturn) > 0) {
$reason = 'attack';
@@ -539,7 +558,13 @@ class HeroItems
return self::$locationCache[$uid];
}
$info = array('reason' => $this->heroAwayReason($uid), 'target' => 0, 'endtime' => 0, 'sort' => 0);
$info = array(
'reason' => $this->heroAwayReason($uid),
'target' => 0,
'endtime' => 0,
'sort' => 0,
'returning' => false, // true = se intoarce acasa
);
if ($info['reason'] === '' || $info['reason'] === 'nohero') {
return self::$locationCache[$uid] = $info;
@@ -548,14 +573,24 @@ class HeroItems
$p = TB_PREFIX;
$q = '';
$advOut = defined('MOVEMENT_ADVENTURE_OUT') ? (int) MOVEMENT_ADVENTURE_OUT : 20;
$advBack = defined('MOVEMENT_ADVENTURE_BACK') ? (int) MOVEMENT_ADVENTURE_BACK : 21;
if ($info['reason'] === 'adventure') {
// LEFT JOIN, nu INNER: daca randul de miscare a fost deja procesat,
// vrem macar destinatia, nu sa pierdem tot randul.
$q = "SELECT a.wref AS target, IFNULL(m.endtime, 0) AS endtime, IFNULL(m.sort_type, 0) AS sort_type
FROM {$p}hero_adventure a
LEFT JOIN {$p}movement m ON m.moveid = a.moveid
WHERE a.uid = ? AND a.status = 1
/**
* Citim direct miscarea, nu randul din hero_adventure: la
* intoarcere randul e deja status = 2, deci ar fi invizibil.
* Satul jucatorului e `from` la dus si `to` la intors, de aceea
* IF() alege coloana potrivita pentru verificarea proprietarului.
* Destinatia afisata e mereu `to` - locul aventurii la dus,
* satul de acasa la intoarcere.
*/
$q = "SELECT m.`to` AS target, m.endtime, m.sort_type
FROM {$p}movement m
INNER JOIN {$p}vdata v ON v.wref = IF(m.sort_type = {$advBack}, m.`to`, m.`from`)
WHERE v.owner = ? AND m.proc = 0 AND m.sort_type IN ({$advOut}, {$advBack})
ORDER BY m.endtime ASC
LIMIT 1";
} elseif ($info['reason'] === 'attack') {
@@ -597,6 +632,15 @@ class HeroItems
$info['target'] = (int) $target;
$info['endtime'] = (int) $endtime;
$info['sort'] = (int) $sortType;
/**
* Drumul de intoarcere, indiferent de unde:
* sort_type 21 = intoarcere din aventura
* sort_type 4 = intoarcere din atac SAU erou rechemat dintr-o
* intarire (ambele produc aceeasi miscare, deci
* nu pot fi deosebite - textul e generic)
*/
$info['returning'] = ($info['sort'] === $advBack || $info['sort'] === 4);
}
$stmt->close();
+13 -5
View File
@@ -4370,8 +4370,16 @@ tz_def('ADM_PROTECTED_PLAYERS_TIP', 'Comma-separated player names that cannot be
//////////////////////////////////////////////////////////////////////////////////////////////////////
// COMPONENTA HERO DIN BARA DE SUS
//////////////////////////////////////////////////////////////////////////////////////////////////////
tz_def('HERO_HEADER_AT_HOME', 'Hero at home');
tz_def('HERO_HEADER_DEAD', 'Hero is dead');
tz_def('HERO_HEADER_TRAINING', 'Hero in training');
tz_def('HERO_HEADER_NOHERO', 'No hero yet');
tz_def('TZ_HEALTH', 'Health');
tz_def('HERO_HEADER_AT_HOME', 'Hero at home');
tz_def('HERO_HEADER_DEAD', 'Hero is dead');
tz_def('HERO_HEADER_TRAINING', 'Hero in training');
tz_def('HERO_HEADER_NOHERO', 'No hero yet');
tz_def('HERO_HEADER_ADVENTURE', 'Hero on adventure');
tz_def('HERO_HEADER_ATTACK', 'Hero is with the army');
tz_def('HERO_HEADER_REINFORCE', 'Hero is reinforcing');
tz_def('HERO_HEADER_IN', 'in');
tz_def('HERO_HEADER_RETURN_ADV', 'Hero returning from adventure');
tz_def('HERO_HEADER_RETURN_HOME', 'Hero returning home');
tz_def('HERO_HEADER_PER_HOUR', 'per hour');
tz_def('TZ_HEALTH', 'Health');
+12 -5
View File
@@ -4313,8 +4313,15 @@ tz_def('ADM_PROTECTED_PLAYERS_TIP', 'Noms de joueurs separes par des virgules qu
//////////////////////////////////////////////////////////////////////////////////////////////////////
// COMPONENTA HERO DIN BARA DE SUS
//////////////////////////////////////////////////////////////////////////////////////////////////////
tz_def('HERO_HEADER_AT_HOME', 'Le heros est chez lui');
tz_def('HERO_HEADER_DEAD', 'Le heros est mort');
tz_def('HERO_HEADER_TRAINING', 'Heros en formation');
tz_def('HERO_HEADER_NOHERO', 'Pas encore de heros');
tz_def('TZ_HEALTH', 'Sante');
tz_def('HERO_HEADER_AT_HOME', 'Le heros est chez lui');
tz_def('HERO_HEADER_DEAD', 'Le heros est mort');
tz_def('HERO_HEADER_TRAINING', 'Heros en formation');
tz_def('HERO_HEADER_NOHERO', 'Pas encore de heros');
tz_def('HERO_HEADER_ADVENTURE', 'Le heros est en aventure');
tz_def('HERO_HEADER_ATTACK', 'Le heros est parti avec l\'armee');
tz_def('HERO_HEADER_REINFORCE', 'Le heros est en renfort');
tz_def('HERO_HEADER_IN', 'dans');
tz_def('HERO_HEADER_RETURN_ADV', 'Le heros revient de l\'aventure');
tz_def('HERO_HEADER_RETURN_HOME', 'Le heros rentre chez lui');
tz_def('HERO_HEADER_PER_HOUR', 'par heure');
tz_def('TZ_HEALTH', 'Sante');
+10 -6
View File
@@ -2790,7 +2790,7 @@ tz_def('HERO_AUC_SELL_FAIL', 'Acest obiect nu poate fi listat (obiectele ech
tz_def('HERO_AUC_SELL_OK', 'Obiectul tau a fost listat.');
tz_def('HERO_AUC_SOLD', 'Licitatia ta s-a vandut:');
tz_def('HERO_AUC_START_PRICE', 'Pret de pornire');
tz_def('HERO_AUC_TIME_LEFT', 'Se incheie in');
tz_def('HERO_AUC_TIME_LEFT', 'Se incheie');
tz_def('HERO_AUC_WON', 'Ai castigat licitatia pentru');
tz_def('HERO_AUC_YOUR_MAX', 'Maximul tau');
@@ -4110,8 +4110,12 @@ tz_def('ADM_PROTECTED_PLAYERS_TIP', 'Nume de jucatori separate prin virgula, car
//////////////////////////////////////////////////////////////////////////////////////////////////////
// COMPONENTA HERO DIN BARA DE SUS
//////////////////////////////////////////////////////////////////////////////////////////////////////
tz_def('HERO_HEADER_AT_HOME', 'Eroul este acasa');
tz_def('HERO_HEADER_DEAD', 'Eroul este mort');
tz_def('HERO_HEADER_TRAINING', 'Eroul este in antrenament');
tz_def('HERO_HEADER_NOHERO', 'Inca nu ai erou');
tz_def('TZ_HEALTH', 'Sanatate');
tz_def('HERO_HEADER_AT_HOME', 'Eroul este acasa');
tz_def('HERO_HEADER_DEAD', 'Eroul este mort');
tz_def('HERO_HEADER_TRAINING', 'Eroul este in antrenament');
tz_def('HERO_HEADER_NOHERO', 'Inca nu ai erou');
tz_def('HERO_HEADER_ADVENTURE', 'Eroul este in aventura');
tz_def('HERO_HEADER_ATTACK', 'Eroul este plecat cu armata');
tz_def('HERO_HEADER_REINFORCE', 'Eroul este intr-o intarire');
tz_def('HERO_HEADER_IN', 'in');
tz_def('TZ_HEALTH', 'Sanatate');