diff --git a/Templates/Plus/1.tpl b/Templates/Plus/1.tpl
index 892d98a9..a8a44565 100644
--- a/Templates/Plus/1.tpl
+++ b/Templates/Plus/1.tpl
@@ -1,4 +1,23 @@
sit == 0) {
diff --git a/Templates/Plus/11.tpl b/Templates/Plus/11.tpl
index 58b18523..f27bf4e0 100644
--- a/Templates/Plus/11.tpl
+++ b/Templates/Plus/11.tpl
@@ -1,15 +1,21 @@
sit == 0) {
diff --git a/Templates/Plus/110.tpl b/Templates/Plus/110.tpl
index ab7eb91c..090ac96f 100644
--- a/Templates/Plus/110.tpl
+++ b/Templates/Plus/110.tpl
@@ -1,4 +1,23 @@
uid;
diff --git a/Templates/Plus/112.tpl b/Templates/Plus/112.tpl
index a0b41e4a..6254f494 100644
--- a/Templates/Plus/112.tpl
+++ b/Templates/Plus/112.tpl
@@ -1,4 +1,23 @@
uid;
diff --git a/Templates/Plus/113.tpl b/Templates/Plus/113.tpl
index 57840742..f92169bd 100644
--- a/Templates/Plus/113.tpl
+++ b/Templates/Plus/113.tpl
@@ -1,4 +1,23 @@
uid;
diff --git a/Templates/Plus/12.tpl b/Templates/Plus/12.tpl
index 8f0feceb..47fa9e4d 100644
--- a/Templates/Plus/12.tpl
+++ b/Templates/Plus/12.tpl
@@ -1,15 +1,21 @@
sit == 0) {
diff --git a/Templates/Plus/15.tpl b/Templates/Plus/15.tpl
index 8f8ab494..8dee18eb 100644
--- a/Templates/Plus/15.tpl
+++ b/Templates/Plus/15.tpl
@@ -1,4 +1,23 @@
uid;
$wid = (int)$village->wid;
diff --git a/Templates/Plus/2.tpl b/Templates/Plus/2.tpl
index d77fcab4..570145e9 100644
--- a/Templates/Plus/2.tpl
+++ b/Templates/Plus/2.tpl
@@ -1,4 +1,23 @@
dblink, "SELECT * FROM " . TB_PREFIX . "users WHERE id='".$session->uid."'") or die(mysqli_error($database->dblink));
-$golds = mysqli_fetch_assoc($MyGold);
-include ("Templates/Plus/pmenu.tpl");
+#################################################################################
+## -= YOU MAY NOT REMOVE OR CHANGE THIS NOTICE =- ##
+## --------------------------------------------------------------------------- ##
+## Filename : 3.tpl ##
+## Type : Plus Functions - Purchase and Status Overview ##
+## --------------------------------------------------------------------------- ##
+## Developed by : Shadow ##
+## --------------------------------------------------------------------------- ##
+## Contact : cata7007@gmail.com ##
+## Project : TravianZ ##
+## URLs: : https://travianz.org ##
+## GitHub : https://github.com/Shadowss/TravianZ ##
+## --------------------------------------------------------------------------- ##
+## License : TravianZ Project ##
+## Copyright : TravianZ (c) 2010-2026. All rights reserved. ##
+## --------------------------------------------------------------------------- ##
+#################################################################################
+
+/**
+ * TODO REZOLVAT: "Reduce this file by a lot, by using arrays".
+ *
+ * Cele patru bonusuri de productie erau scrise de mana, unul cate unul, aproape
+ * identice - se schimbau doar coloana din baza, id-ul din link si eticheta.
+ * Acum sunt un array parcurs intr-o bucla.
+ *
+ * Reparat pe parcurs:
+ * - uid-ul intra in SQL fara conversie ("WHERE id='$uid'");
+ * - "or die(mysqli_error())" arata jucatorului erori de baza de date;
+ * - blocul de lemn compara cu $datetime1 in loc de $tl_b1 (aceeasi valoare,
+ * dar inconsecvent - la o modificare viitoare devine bug);
+ * - expirarea abonamentului Plus se scria in baza IN TIMPUL randarii, adica
+ * un sablon facea modificari; a fost mutata inainte de afisare, ca sa fie
+ * clar ce se intampla.
+ */
+
+$plusUid = (int) $session->uid;
+
+$plusRes = mysqli_query(
+ $database->dblink,
+ "SELECT gold, plus, b1, b2, b3, b4, goldclub FROM " . TB_PREFIX . "users WHERE id = " . $plusUid . " LIMIT 1"
+);
+
+$golds = $plusRes ? mysqli_fetch_assoc($plusRes) : null;
+
+if (!$golds) {
+ // Fara randul utilizatorului nu avem ce afisa. Nu aratam eroarea bazei de
+ // date jucatorului; o lasam in log, unde ii e locul.
+ error_log('[TravianZ] plus/3.tpl: nu am putut citi datele utilizatorului ' . $plusUid
+ . ': ' . mysqli_error($database->dblink));
+
+ $golds = array('gold' => 0, 'plus' => 0, 'b1' => 0, 'b2' => 0, 'b3' => 0, 'b4' => 0, 'goldclub' => 0);
+}
+
+include("Templates/Plus/pmenu.tpl");
$date2 = time();
-if ($golds) {
- if ($golds['gold'] == 0)
- echo "
You currently don't own gold.
";
- else
- echo "".CURRENT_HAVE." ".$golds['gold']." ".GOLD."
";
+/**
+ * Abonamentul Plus expirat se marcheaza ACUM, inainte de afisare.
+ * Inainte, actualizarea se facea la mijlocul randarii tabelului.
+ */
+if ((int) $golds['plus'] > 0 && (int) $golds['plus'] <= $date2) {
+ mysqli_query($database->dblink,
+ "UPDATE " . TB_PREFIX . "users SET plus = 0 WHERE id = " . $plusUid . " LIMIT 1");
+
+ $golds['plus'] = 0;
+ $plusJustExpired = true;
+} else {
+ $plusJustExpired = false;
}
-$datetimep = $golds['plus'];
-$datetime1 = $golds['b1'];
-$datetime2 = $golds['b2'];
-$datetime3 = $golds['b3'];
-$datetime4 = $golds['b4'];
+if (!function_exists('formatRemainingTime')) {
+ function formatRemainingTime($endTimestamp, $nowTimestamp)
+ {
+ $remaining = (int) $endTimestamp - (int) $nowTimestamp;
-function formatRemainingTime($endTimestamp, $nowTimestamp) {
- $remaining = (int)$endTimestamp - (int)$nowTimestamp;
- if ($remaining <= 0) return '';
- $days = intdiv($remaining, 86400); $remaining %= 86400;
- $hours = intdiv($remaining, 3600); $remaining %= 3600;
- $mins = intdiv($remaining, 60); $secs = $remaining % 60;
- return 'Remaining: '.$days.' '.DAYS.' '.$hours.' '.HOURS.' '.$mins.' '.MINS.' '.$secs.' secs (until '.date('H:i:s', (int)$endTimestamp).')';
+ if ($remaining <= 0) {
+ return '';
+ }
+
+ $days = intdiv($remaining, 86400); $remaining %= 86400;
+ $hours = intdiv($remaining, 3600); $remaining %= 3600;
+ $mins = intdiv($remaining, 60);
+ $secs = $remaining % 60;
+
+ return 'Remaining: ' . $days . ' ' . DAYS
+ . ' ' . $hours . ' ' . HOURS
+ . ' ' . $mins . ' ' . MINS
+ . ' ' . $secs . ' secs (until ' . date('H:i:s', (int) $endTimestamp) . ')';
+ }
+}
+
+/**
+ * Butonul de actiune, identic pentru toate randurile.
+ *
+ * @param int $gold aurul jucatorului
+ * @param int $cost cat costa
+ * @param int $until pana cand e activ bonusul (0 = inactiv)
+ * @param int $linkId id-ul din plus.php?id=...
+ * @param bool $banned contul e blocat
+ */
+if (!function_exists('plusActionCell')) {
+ function plusActionCell($gold, $cost, $until, $linkId, $banned = false)
+ {
+ $guard = 'onclick="if(this.dataset.c) return false; this.dataset.c=1;'
+ . ' this.style.pointerEvents=\'none\'; this.style.opacity=\'0.5\';"';
+
+ if ($banned) {
+ return '' . TOO_LITTLE_GOLD . '';
+ }
+
+ if ((int) $gold < (int) $cost) {
+ return '' . TOO_LITTLE_GOLD . '';
+ }
+
+ // activ inca -> prelungeste; altfel -> activeaza
+ $label = ((int) $until > time()) ? EXTEND : ACTIVATE;
+
+ return '' . $label . '';
+ }
+}
+
+/**
+ * Cele patru bonusuri de productie. Asta e tot ce se schimba intre ele.
+ */
+$plusBonuses = array(
+ array('css' => 'r1', 'label' => TZ_PRODUCTION_LUMBER, 'field' => 'b1', 'id' => 9, 'popup' => 1),
+ array('css' => 'r2', 'label' => TZ_PRODUCTION_CLAY, 'field' => 'b2', 'id' => 10, 'popup' => 2),
+ array('css' => 'r3', 'label' => TZ_PRODUCTION_IRON, 'field' => 'b3', 'id' => 11, 'popup' => 3),
+ array('css' => 'r4', 'label' => TZ_PRODUCTION_CROP, 'field' => 'b4', 'id' => 12, 'popup' => 4),
+);
+
+$plusIsBanned = (defined('BANNED') && $session->access == BANNED);
+$plusDuration = (PLUS_PRODUCTION >= 86400)
+ ? (PLUS_PRODUCTION / 86400) . ' Days'
+ : (PLUS_PRODUCTION / 3600) . ' Hours';
+
+if ((int) $golds['gold'] === 0) {
+ echo "You currently don't own gold.
";
+} else {
+ echo '' . CURRENT_HAVE . ' ' . (int) $golds['gold'] . ' ' . GOLD . '
';
}
?>
-
- | Plus function |
- | | | | |
-
-
-
-  |
- Plus
- ";
- else {
- if ($datetimep <= $date2) {
- echo "Your PLUS advantage has ended. ";
- mysqli_query($database->dblink, "UPDATE ".TB_PREFIX."users SET plus='0' WHERE id='".$session->uid."'");
- } else {
- echo "".formatRemainingTime($datetimep, $date2)."";
- }
- }
- ?> |
- = 86400) ? (PLUS_TIME/86400).' Days' : (PLUS_TIME/3600).' Hours'; ?> |
- 10 |
- 9 && $datetimep < $date2) {
- echo ''.ACTIVATE.'';
- } elseif ($golds['gold'] > 9 && $datetimep > $date2) {
- echo ''.EXTEND.'';
- } else {
- echo ''.TOO_LITTLE_GOLD.'';
- }
+
+ | Plus function |
+
+ |
+ |
+ |
+ |
+ |
+
+
+ |
+
+
+
+  |
+
+ Plus
+
+ ';
+ } elseif ((int) $golds['plus'] === 0) {
+ echo 'get PLUS ';
+ } else {
+ echo ""
+ . formatRemainingTime($golds['plus'], $date2) . '';
+ }
+ ?>
+ |
+ = 86400) ? (PLUS_TIME / 86400) . ' Days' : (PLUS_TIME / 3600) . ' Hours';
?> |
-
+ 10 |
+ |
+
- |
+ |
-
-
-  |
- +25%
- =$date2) echo "".formatRemainingTime($tl_b1,$date2).""; ?> |
- =86400)?(PLUS_PRODUCTION/86400).' Days':(PLUS_PRODUCTION/3600).' Hours'; ?> |
- 5 |
- access!=BANNED){
- if($golds['gold']>4 && $tl_b1<$date2){
- echo ''.ACTIVATE.'';
- } elseif($golds['gold']>4 && $datetime1>$date2){
- echo ''.EXTEND.'';
- } else echo ''.TOO_LITTLE_GOLD.'';
+
+
+  |
+
+ +25%
+
+ = $date2) {
+ echo ""
+ . formatRemainingTime($until, $date2) . '';
+ }
+ ?>
+ |
+ |
+ 5 |
+ |
+
+
+
+
+
+  |
+ |
+ |
+ 2 |
+ 1) {
+ echo ''
+ . GOLD_ON . '';
} else {
- echo ''.TOO_LITTLE_GOLD.'';
+ echo '' . TOO_LITTLE_GOLD . '';
}
?> |
-
+ |
-
-
-  |
- +25%
- =$date2) echo "".formatRemainingTime($tl_b2,$date2).""; ?> |
- =86400)?(PLUS_PRODUCTION/86400).' Days':(PLUS_PRODUCTION/3600).' Hours'; ?> |
- 5 |
- access!=BANNED){
- if($golds['gold']>4 && $tl_b2<$date2){
- echo ''.ACTIVATE.'';
- } elseif($golds['gold']>4 && $tl_b2>$date2){
- echo ''.EXTEND.'';
- } else echo ''.TOO_LITTLE_GOLD.'';
- } else echo ''.TOO_LITTLE_GOLD.'';
+
+
+  |
+ |
+ |
+ 3 |
+ 2) {
+ echo '' . NPC . '';
+ } else {
+ echo '' . TOO_LITTLE_GOLD . '';
+ }
?> |
-
+ |
-
-
-  |
- +25%
- =$date2) echo "".formatRemainingTime($tl_b3,$date2).""; ?> |
- =86400)?(PLUS_PRODUCTION/86400).' Days':(PLUS_PRODUCTION/3600).' Hours'; ?> |
- 5 |
- access!=BANNED){
- if($golds['gold']>4 && $tl_b3<$date2){
- echo ''.ACTIVATE.'';
- } elseif($golds['gold']>4 && $tl_b3>$date2){
- echo ''.EXTEND.'';
- } else echo ''.TOO_LITTLE_GOLD.'';
- } else echo ''.TOO_LITTLE_GOLD.'';
- ?> |
-
-
-
-
-  |
- +25%
- =$date2) echo "".formatRemainingTime($tl_b4,$date2).""; ?> |
- =86400)?(PLUS_PRODUCTION/86400).' Days':(PLUS_PRODUCTION/3600).' Hours'; ?> |
- 5 |
- access!=BANNED){
- if($golds['gold']>4 && $tl_b4<$date2){
- echo ''.ACTIVATE.'';
- } elseif($golds['gold']>4 && $tl_b4>$date2){
- echo ''.EXTEND.'';
- } else echo ''.TOO_LITTLE_GOLD.'';
- } else echo ''.TOO_LITTLE_GOLD.'';
- ?> |
-
-
- |
-
-
-  |
- |
- |
- 2 |
- 1) ? ''.GOLD_ON.'' : ''.TOO_LITTLE_GOLD.'';
- ?> |
-
-
-
-  |
- |
- |
- 3 |
- 2) ? ''.NPC.'' : ''.TOO_LITTLE_GOLD.'';
- ?> |
-
-
+
- | Redeem a gold code |
-
-
- |
-
-
-
-
- |
-
-
+ | Redeem a gold code |
+
+
+ |
+
+
+
+
+ |
+
+
diff --git a/Templates/Plus/3110.tpl b/Templates/Plus/3110.tpl
index ee892d05..78849787 100644
--- a/Templates/Plus/3110.tpl
+++ b/Templates/Plus/3110.tpl
@@ -1,4 +1,23 @@
uid;
diff --git a/Templates/Plus/4.tpl b/Templates/Plus/4.tpl
index aef451b7..25cb6376 100644
--- a/Templates/Plus/4.tpl
+++ b/Templates/Plus/4.tpl
@@ -1,4 +1,23 @@
diff --git a/Templates/Plus/5.tpl b/Templates/Plus/5.tpl
index 352aab6b..d63f5344 100644
--- a/Templates/Plus/5.tpl
+++ b/Templates/Plus/5.tpl
@@ -1,4 +1,23 @@
uid;
diff --git a/Templates/Plus/7.tpl b/Templates/Plus/7.tpl
index c5e602ee..f48386a9 100644
--- a/Templates/Plus/7.tpl
+++ b/Templates/Plus/7.tpl
@@ -1,15 +1,21 @@
sit == 0) {
diff --git a/Templates/Plus/9.tpl b/Templates/Plus/9.tpl
index e5a30ccb..a6a3bf70 100644
--- a/Templates/Plus/9.tpl
+++ b/Templates/Plus/9.tpl
@@ -1,15 +1,21 @@
sit == 0) {
diff --git a/Templates/Plus/getplus.tpl b/Templates/Plus/getplus.tpl
index da0c82f6..549e1852 100644
--- a/Templates/Plus/getplus.tpl
+++ b/Templates/Plus/getplus.tpl
@@ -1,4 +1,23 @@
uid;
diff --git a/Templates/Plus/index.php b/Templates/Plus/index.php
index 9fcb4aed..0f7023ec 100644
--- a/Templates/Plus/index.php
+++ b/Templates/Plus/index.php
@@ -1,11 +1,20 @@
uid;
diff --git a/Templates/Plus/pmenu.tpl b/Templates/Plus/pmenu.tpl
index f345c1c2..72ee085f 100644
--- a/Templates/Plus/pmenu.tpl
+++ b/Templates/Plus/pmenu.tpl
@@ -1,3 +1,24 @@
+
Plus