Fallback fix server

Fallback fix server
This commit is contained in:
novgorodschi catalin
2026-08-03 14:34:09 +03:00
parent 7c75cde78e
commit efc9eb8b25
9 changed files with 107 additions and 79 deletions
+71 -78
View File
@@ -340,89 +340,82 @@ if (!function_exists('admin_config_template_path')) {
$text = str_replace($placeholder, (string) $value, $text);
}
/**
* PLASA DE SIGURANTA: orice placeholder ramas se rezolva din constanta
* pe care o defineste chiar linia lui.
*
* De ce e nevoie: fiecare pagina din panou regenereaza INTREG config.php
* din acelasi sablon, dar rezolva doar setarile ei. O setare noua,
* tratata de un singur modul, ramanea literala cand salvai din alta
* pagina:
* define("NEW_FUNCTIONS_ALLIANCE_BONUSES", %ALLIANCEBONUSES%);
* adica eroare de parsare si 500 pe tot serverul, pana la reparare
* manuala a fisierului. Ni s-a intamplat de trei ori: %GP%,
* %ALLIANCEBONUSES% si %NATARS_WW_START_DELAY%.
*
* Listele de mai sus raman - sunt explicite si mai lizibile. Blocul asta
* prinde ce scapa, ca urmatoarea setare adaugata sa nu mai poata sparge
* serverul. Ruleaza ULTIMUL, deci nu suprascrie nimic rezolvat inainte.
*/
if (preg_match_all('/^\s*define\(\s*["\']([A-Z0-9_]+)["\']\s*,\s*(.*?%[A-Z0-9_]+%.*?)\s*\)\s*;/m',
return $text;
}
}
if (!function_exists('tz_config_finalize')) {
/**
* Ultima verificare inainte de a scrie config.php.
*
* TREBUIE apelata DUPA toate apelurile de tz_config_set() si INAINTE de
* fwrite(). Rezolva orice placeholder ramas, din constanta pe care o
* defineste chiar linia lui.
*
* DE CE AICI si nu in admin_config_template_contents():
* acea functie ruleaza la INCEPUT, inainte ca modulul sa-si scrie valorile.
* Daca plasa ar rula acolo, ar consuma placeholderele din valorile CURENTE,
* iar tz_config_set() n-ar mai avea ce inlocui - adica orice modificare
* facuta de admin ar fi ignorata in tacere. Exact asta s-a intamplat.
*
* De ce e nevoie de ea: fiecare pagina din panou regenereaza INTREG
* config.php din acelasi sablon, dar rezolva doar setarile ei. O setare
* tratata de un singur modul ramanea literala cand salvai din alta pagina:
* define("NEW_FUNCTIONS_ALLIANCE_BONUSES", %ALLIANCEBONUSES%);
* adica eroare de parsare si 500 pe tot serverul.
*/
function tz_config_finalize($text)
{
if (!preg_match_all('/^\s*define\(\s*["\']([A-Z0-9_]+)["\']\s*,\s*(.*?%[A-Z0-9_]+%.*?)\s*\)\s*;/m',
$text, $leftovers, PREG_SET_ORDER)) {
return $text;
}
foreach ($leftovers as $row) {
$constant = $row[1];
$defaults = array(
'NATARS_WW_START_DELAY' => 10,
'USRNM_MIN_LENGTH' => 3,
'USRNM_MAX_LENGTH' => 15,
'PW_MIN_LENGTH' => 4,
'USRNM_SPECIAL' => true,
'PLUS_STATS_INTERVAL_HOURS' => 6,
'PLUS_STATS_KEEP_DAYS' => 0,
);
if (!preg_match('/%[A-Z0-9_]+%/', $row[2], $ph)) {
continue;
}
foreach ($leftovers as $row) {
$constant = $row[1];
if (!defined($constant)) {
/**
* Constanta nu exista inca: config.php a fost generat
* inaintea acestei setari.
*
* ATENTIE: aici NU se poate pune "false" la nimereala.
* Fisierul ar ramane PHP valid, dar setarea ar deveni
* inutilizabila fara niciun semn - Natarii n-ar mai
* construi, lungimea minima a numelui ar deveni 0 si asa
* mai departe. Folosim valoarea implicita reala a fiecarei
* setari, aceeasi ca la instalare.
*/
$defaults = array(
'NATARS_WW_START_DELAY' => 10,
'USRNM_MIN_LENGTH' => 3,
'USRNM_MAX_LENGTH' => 15,
'PW_MIN_LENGTH' => 4,
'USRNM_SPECIAL' => true,
'PLUS_STATS_INTERVAL_HOURS' => 6,
'PLUS_STATS_KEEP_DAYS' => 0,
);
if (isset($defaults[$constant])) {
$d = $defaults[$constant];
$value = is_bool($d) ? ($d ? 'true' : 'false') : (string) $d;
} else {
// Setare necunoscuta: alegem dupa context, ca fisierul
// sa ramana valid. Ghilimele in sablon => sir gol,
// altfel 0 (acceptabil si ca numar, si ca boolean).
$quoted = (strpos($row[2], '"' . $ph[0] . '"') !== false)
|| (strpos($row[2], "'" . $ph[0] . "'") !== false);
$value = $quoted ? '' : '0';
}
} else {
$current = constant($constant);
if (is_bool($current)) {
$value = $current ? 'true' : 'false';
} elseif (is_int($current) || is_float($current)) {
$value = (string) $current;
} else {
// Sir: pastram ghilimelele din sablon daca exista deja,
// altfel le adaugam noi.
$quoted = (strpos($row[2], '"' . $ph[0] . '"') !== false)
|| (strpos($row[2], "'" . $ph[0] . "'") !== false);
$safe = addcslashes((string) $current, "\"\\\$");
$value = $quoted ? $safe : '"' . $safe . '"';
}
}
$text = str_replace($ph[0], $value, $text);
error_log('[TravianZ] config: placeholder ' . $ph[0]
. ' nerezolvat de niciun modul, completat din ' . $constant);
if (!preg_match('/%[A-Z0-9_]+%/', $row[2], $ph)) {
continue;
}
$quoted = (strpos($row[2], '"' . $ph[0] . '"') !== false)
|| (strpos($row[2], "'" . $ph[0] . "'") !== false);
if (defined($constant)) {
$current = constant($constant);
if (is_bool($current)) {
$value = $current ? 'true' : 'false';
} elseif (is_int($current) || is_float($current)) {
$value = (string) $current;
} else {
$safe = addcslashes((string) $current, "\"\\\$");
$value = $quoted ? $safe : '"' . $safe . '"';
}
} elseif (isset($defaults[$constant])) {
$d = $defaults[$constant];
$value = is_bool($d) ? ($d ? 'true' : 'false') : (string) $d;
} else {
// setare necunoscuta: alegem dupa context, ca fisierul sa ramana valid
$value = $quoted ? '' : '0';
}
$text = str_replace($ph[0], $value, $text);
error_log('[TravianZ] config: placeholder ' . $ph[0]
. ' nerezolvat de niciun modul, completat din ' . $constant);
}
return $text;
+5
View File
@@ -195,6 +195,11 @@ $fh = fopen($myFile, 'w') or die("<br/><br/><br/>Can't open file: GameEngine\con
tz_config_set($text, '%PLUS_PACKAGE_E_PRICE%', (defined('PLUS_PACKAGE_E_PRICE') ? PLUS_PACKAGE_E_PRICE : '49,99'));
tz_config_set($text, '%PLUS_PACKAGE_E_GOLD%', (defined('PLUS_PACKAGE_E_GOLD') ? PLUS_PACKAGE_E_GOLD : '2000'));
// Ultima verificare: rezolva orice placeholder pe care acest modul
// nu il trateaza. TREBUIE apelata dupa toate tz_config_set() si
// inainte de scriere - altfel setarile modulului ar fi ignorate.
$text = tz_config_finalize($text);
fwrite($fh, $text);
fclose($fh);
+5
View File
@@ -190,6 +190,11 @@ $fh = fopen($myFile, 'w') or die("<br/><br/><br/>Can't open file: GameEngine\con
tz_config_set($text, '%PLUS_PACKAGE_E_PRICE%', (defined('PLUS_PACKAGE_E_PRICE') ? PLUS_PACKAGE_E_PRICE : '49,99'));
tz_config_set($text, '%PLUS_PACKAGE_E_GOLD%', (defined('PLUS_PACKAGE_E_GOLD') ? PLUS_PACKAGE_E_GOLD : '2000'));
// Ultima verificare: rezolva orice placeholder pe care acest modul
// nu il trateaza. TREBUIE apelata dupa toate tz_config_set() si
// inainte de scriere - altfel setarile modulului ar fi ignorate.
$text = tz_config_finalize($text);
fwrite($fh, $text);
fclose($fh);
+5
View File
@@ -191,6 +191,11 @@ $fh = fopen($myFile, 'w') or die("<br/><br/><br/>Can't open file: GameEngine\con
tz_config_set($text, '%PLUS_PACKAGE_E_PRICE%', (defined('PLUS_PACKAGE_E_PRICE') ? PLUS_PACKAGE_E_PRICE : '49,99'));
tz_config_set($text, '%PLUS_PACKAGE_E_GOLD%', (defined('PLUS_PACKAGE_E_GOLD') ? PLUS_PACKAGE_E_GOLD : '2000'));
// Ultima verificare: rezolva orice placeholder pe care acest modul
// nu il trateaza. TREBUIE apelata dupa toate tz_config_set() si
// inainte de scriere - altfel setarile modulului ar fi ignorate.
$text = tz_config_finalize($text);
fwrite($fh, $text);
fclose($fh);
@@ -178,6 +178,11 @@ $fh = fopen($myFile, 'w') or die("<br/><br/><br/>Can't open file: GameEngine\con
tz_config_set($text, '%PLUS_PACKAGE_E_PRICE%', (defined('PLUS_PACKAGE_E_PRICE') ? PLUS_PACKAGE_E_PRICE : '49,99'));
tz_config_set($text, '%PLUS_PACKAGE_E_GOLD%', (defined('PLUS_PACKAGE_E_GOLD') ? PLUS_PACKAGE_E_GOLD : '2000'));
// Ultima verificare: rezolva orice placeholder pe care acest modul
// nu il trateaza. TREBUIE apelata dupa toate tz_config_set() si
// inainte de scriere - altfel setarile modulului ar fi ignorate.
$text = tz_config_finalize($text);
fwrite($fh, $text);
fclose($fh);
+5
View File
@@ -197,6 +197,11 @@ $fh = fopen($myFile, 'w') or die("<br/><br/><br/>Can't open file: GameEngine\con
tz_config_set($text, '%PLUS_PACKAGE_E_PRICE%', (defined('PLUS_PACKAGE_E_PRICE') ? PLUS_PACKAGE_E_PRICE : '49,99'));
tz_config_set($text, '%PLUS_PACKAGE_E_GOLD%', (defined('PLUS_PACKAGE_E_GOLD') ? PLUS_PACKAGE_E_GOLD : '2000'));
// Ultima verificare: rezolva orice placeholder pe care acest modul
// nu il trateaza. TREBUIE apelata dupa toate tz_config_set() si
// inainte de scriere - altfel setarile modulului ar fi ignorate.
$text = tz_config_finalize($text);
fwrite($fh, $text);
fclose($fh);
+5
View File
@@ -175,6 +175,11 @@ $fh = fopen($myFile, 'w') or die("<br/><br/><br/>Can't open file: GameEngine\con
tz_config_set($text, '%PLUS_PACKAGE_E_GOLD%', $_POST['plus-e-gold'] ?? '');
tz_config_set($text, '%PLUS_PACKAGE_E_PRICE%', $_POST['plus-e-price'] ?? '');
// Ultima verificare: rezolva orice placeholder pe care acest modul
// nu il trateaza. TREBUIE apelata dupa toate tz_config_set() si
// inainte de scriere - altfel setarile modulului ar fi ignorate.
$text = tz_config_finalize($text);
fwrite($fh, $text);
fclose($fh);
+5
View File
@@ -287,6 +287,11 @@ $text = admin_config_template_contents(array(
tz_config_set($text, '%PLUS_PACKAGE_E_PRICE%', (defined('PLUS_PACKAGE_E_PRICE') ? PLUS_PACKAGE_E_PRICE : '49,99'));
tz_config_set($text, '%PLUS_PACKAGE_E_GOLD%', (defined('PLUS_PACKAGE_E_GOLD') ? PLUS_PACKAGE_E_GOLD : '2000'));
// Ultima verificare: rezolva orice placeholder pe care acest modul
// nu il trateaza. TREBUIE apelata dupa toate tz_config_set() si
// inainte de scriere - altfel setarile modulului ar fi ignorate.
$text = tz_config_finalize($text);
fwrite($fh, $text);
fclose($fh);
+1 -1
View File
@@ -141,7 +141,7 @@ $dbPrefix = $_SESSION['install_random_prefix'];
<div><label>Natars Spawn (days)</label><input class="input" name="natars_spawn_time" id="natars_spawn_time" value="260"></div>
<div><label>WW Spawn (days)</label><input class="input" name="natars_ww_spawn_time" id="natars_ww_spawn_time" value="260"></div>
<div><label>WW BP Spawn (days)</label><input class="input" name="natars_ww_building_plan_spawn_time" id="natars_ww_building_plan_spawn_time" value="260"></div>
<div><label>WW BP Spawn (days)</label><input class="input" name="natars_ww_start_delay" id="natars_ww_start_delay" value="10"></div>
<div><label>Natars start build WW (days)</label><input class="input" name="natars_ww_start_delay" id="natars_ww_start_delay" value="10"></div>
<div><label>Nature regen</label><select class="input" name="nature_regtime"><option value="28800">8 hours</option><option value="36000">10 hours</option><option value="43200" selected>12 hours</option><option value="57600">16 hours</option><option value="72000">20 hours</option><option value="86400">24 hours</option></select></div>
</div>
</div>