diff --git a/GameEngine/Admin/Mods/config_template.php b/GameEngine/Admin/Mods/config_template.php
index 47972890..b904100a 100644
--- a/GameEngine/Admin/Mods/config_template.php
+++ b/GameEngine/Admin/Mods/config_template.php
@@ -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;
diff --git a/GameEngine/Admin/Mods/editAdminInfo.php b/GameEngine/Admin/Mods/editAdminInfo.php
index aaf47f26..b50bd521 100755
--- a/GameEngine/Admin/Mods/editAdminInfo.php
+++ b/GameEngine/Admin/Mods/editAdminInfo.php
@@ -195,6 +195,11 @@ $fh = fopen($myFile, 'w') or die("
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);
diff --git a/GameEngine/Admin/Mods/editExtraSet.php b/GameEngine/Admin/Mods/editExtraSet.php
index 290e079d..16c61c72 100755
--- a/GameEngine/Admin/Mods/editExtraSet.php
+++ b/GameEngine/Admin/Mods/editExtraSet.php
@@ -190,6 +190,11 @@ $fh = fopen($myFile, 'w') or die("
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);
diff --git a/GameEngine/Admin/Mods/editLogSet.php b/GameEngine/Admin/Mods/editLogSet.php
index 03040f27..96a1c88e 100755
--- a/GameEngine/Admin/Mods/editLogSet.php
+++ b/GameEngine/Admin/Mods/editLogSet.php
@@ -191,6 +191,11 @@ $fh = fopen($myFile, 'w') or die("
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);
diff --git a/GameEngine/Admin/Mods/editNewFunctions.php b/GameEngine/Admin/Mods/editNewFunctions.php
index ee2b236b..28202b49 100644
--- a/GameEngine/Admin/Mods/editNewFunctions.php
+++ b/GameEngine/Admin/Mods/editNewFunctions.php
@@ -178,6 +178,11 @@ $fh = fopen($myFile, 'w') or die("
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);
diff --git a/GameEngine/Admin/Mods/editNewsboxSet.php b/GameEngine/Admin/Mods/editNewsboxSet.php
index b7bf3b96..ab3ab847 100755
--- a/GameEngine/Admin/Mods/editNewsboxSet.php
+++ b/GameEngine/Admin/Mods/editNewsboxSet.php
@@ -197,6 +197,11 @@ $fh = fopen($myFile, 'w') or die("
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);
diff --git a/GameEngine/Admin/Mods/editPlusSet.php b/GameEngine/Admin/Mods/editPlusSet.php
index 07a57a19..8433dd1e 100644
--- a/GameEngine/Admin/Mods/editPlusSet.php
+++ b/GameEngine/Admin/Mods/editPlusSet.php
@@ -175,6 +175,11 @@ $fh = fopen($myFile, 'w') or die("
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);
diff --git a/GameEngine/Admin/Mods/editServerSet.php b/GameEngine/Admin/Mods/editServerSet.php
index 471dade3..3a3b8054 100755
--- a/GameEngine/Admin/Mods/editServerSet.php
+++ b/GameEngine/Admin/Mods/editServerSet.php
@@ -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);
diff --git a/install/templates/config.tpl b/install/templates/config.tpl
index e1a2363f..d2c3b353 100644
--- a/install/templates/config.tpl
+++ b/install/templates/config.tpl
@@ -141,7 +141,7 @@ $dbPrefix = $_SESSION['install_random_prefix'];