Fix Lang + Fix train troops in greatbarraks and great stable + fix ally message + refactor battle system

Fix Lang + Fix train troops in greatbarraks and great stable + fix ally message + refactor battle system #219
This commit is contained in:
novgorodschi catalin
2026-07-23 08:25:32 +03:00
parent 8db3032293
commit da4f203aa1
12 changed files with 9822 additions and 9118 deletions
+65 -1
View File
@@ -11,4 +11,68 @@
<Files "*.log">
Order Allow,Deny
Deny from all
</Files>
</Files>
########################################################################
## PERFORMANTA (P1) - compresie + cache pe statice. Adaugat de refactor.
## Toate blocurile sunt gardate cu <IfModule>: daca un modul nu e activ
## pe server, Apache ignora blocul (nu da Error 500).
########################################################################
## 1. Compresie GZIP - reduce dimensiunea textelor transferate (HTML/CSS/JS)
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml
AddOutputFilterByType DEFLATE application/javascript application/x-javascript text/javascript
AddOutputFilterByType DEFLATE application/json application/xml
AddOutputFilterByType DEFLATE image/svg+xml
# Browsere vechi (proxy-uri care strica compresia)
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# Nu comprima imaginile deja comprimate (gif/jpg/png sunt deja compresate)
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico|webp)$ no-gzip dont-vary
</IfModule>
## 2. Cache in browser - staticele nu se re-descarca la fiecare vizita
<IfModule mod_expires.c>
ExpiresActive On
# Imagini: 30 zile (se schimba rar)
ExpiresByType image/gif "access plus 30 days"
ExpiresByType image/jpeg "access plus 30 days"
ExpiresByType image/png "access plus 30 days"
ExpiresByType image/webp "access plus 30 days"
ExpiresByType image/x-icon "access plus 30 days"
ExpiresByType image/svg+xml "access plus 30 days"
# CSS / JS: 7 zile (se pot schimba la update-uri de joc)
ExpiresByType text/css "access plus 7 days"
ExpiresByType application/javascript "access plus 7 days"
ExpiresByType text/javascript "access plus 7 days"
# HTML si JSON: fara cache (continut dinamic de joc)
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType application/json "access plus 0 seconds"
</IfModule>
## 3. Cache-Control headers (completeaza Expires; unele CDN-uri le prefera)
<IfModule mod_headers.c>
# Statice: cache public 30 zile
<FilesMatch "\.(gif|jpe?g|png|webp|ico|svg|css|js|woff2?|ttf|eot)$">
Header set Cache-Control "public, max-age=2592000"
</FilesMatch>
# Paginile dinamice de joc: niciodata cache-uite
<FilesMatch "\.php$">
Header set Cache-Control "no-cache, no-store, must-revalidate"
</FilesMatch>
</IfModule>
## 4. Dezactiveaza ETag global (Expires/Cache-Control sunt suficiente)
<IfModule mod_headers.c>
Header unset ETag
</IfModule>
FileETag None
+657 -400
View File
File diff suppressed because it is too large Load Diff
@@ -317,6 +317,27 @@ References: User ID/Message ID, Mode
return $ids;
}
/**
* UM-W1: permisiunea de mesaj-catre-alianta (opt7) a unui membru. Muta
* query-ul inline din Message::sendAMessage(). Returneaza direct valoarea
* opt7 (0 sau 1), deci in Message.php comparatia devine "$permission == 1"
* in loc de vechiul "$permission['opt7'] == 1" - aceeasi verificare.
* Filtreaza pe uid SI alliance (+ LIMIT 1) ca sa nu ia un rand ramas dintr-o
* alianta anterioara.
*/
function getAllyMessagePermission($uid, $alliance = 0) {
list($uid, $alliance) = $this->escape_input((int) $uid, (int) $alliance);
$q = "SELECT opt7 FROM " . TB_PREFIX . "ali_permission WHERE uid = $uid";
if ($alliance > 0) {
$q .= " AND alliance = $alliance";
}
$q .= " LIMIT 1";
$row = mysqli_fetch_assoc(mysqli_query($this->dblink, $q));
return (int) ($row['opt7'] ?? 0);
}
/**
* UM-W1: target + owner ale unui mesaj (pentru a decide modul de stergere).
* Muta SELECT-ul inline din Message::removeMessage().
+2498 -2481
View File
File diff suppressed because it is too large Load Diff
+1913 -1904
View File
File diff suppressed because it is too large Load Diff
+2518 -2315
View File
File diff suppressed because it is too large Load Diff
+2022 -2013
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -596,7 +596,7 @@ class Message
$allmembers = $database->getAllianceMemberIds($session->alliance);
$userally = $database->getUserField($session->uid, "alliance", 0);
$permission = $database->getAllyMessagePermission($session->uid);
$permission = $database->getAllyMessagePermission($session->uid, $session->alliance);
if (defined('WORD_CENSOR')) {
$topic = $this->wordCensor($topic);
+5 -1
View File
@@ -27,7 +27,11 @@ $end = $session->tribe * 10;
$level = (int)$village->resarray['f'.$id];
for ($i = $start; $i <= $end; $i++):
if ($i == 4 || $i == 23 || $i == 24) continue;
// FIX (triburi noi): Great Barracks antreneaza DOAR infanteria tribului, la
// fel ca Barracks-ul normal. Filtrul generic $unitsbytype['infantry'] acopera
// si triburile 6-9; vechea excludere 4/23/24 era hardcodata pentru triburile
// 1-5 si lasa cavaleria sa treaca la triburile noi.
if (!in_array($i, $unitsbytype['infantry'])) continue;
if (!($technology->getTech($i) || $i % 10 == 1)) continue;
$unit = ${'u'.$i};
+5 -1
View File
@@ -29,7 +29,11 @@ $horseDrinking = $building->getTypeLevel(41);
$success = 0;
for ($i = $start; $i <= $end; $i++):
if ($i == 3 || $i == 13 || $i == 14) continue;
// FIX (triburi noi): Great Stable antreneaza DOAR cavaleria tribului, la fel
// ca Stable-ul normal (20_train.tpl). Filtrul generic $unitsbytype['cavalry']
// acopera si triburile 6-9; vechea excludere 3/13/14 lasa sa treaca toate
// unitatile (infanterie, berbeci, catapulte).
if (!in_array($i, $unitsbytype['cavalry'])) continue;
if (!$technology->getTech($i)) continue;
$success++;
+114
View File
@@ -0,0 +1,114 @@
<?php
#################################################################################
## -= YOU MAY NOT REMOVE OR CHANGE THIS NOTICE =- ##
## --------------------------------------------------------------------------- ##
## Filename : cron.php ##
## Type : Standalone automation runner (P2 - performance) ##
## --------------------------------------------------------------------------- ##
## Scop : Ruleaza Automation.php separat de request-urile ##
## jucatorilor. Se apeleaza dintr-un cron job cPanel la ##
## fiecare minut, astfel incat procesarea (batalii, miscari, ##
## antrenamente) nu mai e carata de pagina unui jucator. ##
## --------------------------------------------------------------------------- ##
## Instalare cron cPanel (la fiecare minut): ##
## * * * * * /usr/bin/php /home/USER/public_html/cron.php >/dev/null 2>&1 ##
## sau prin wget/curl daca php-cli nu e disponibil: ##
## * * * * * wget -q -O /dev/null "https://DOMENIU/cron.php?key=SECRET" ##
## --------------------------------------------------------------------------- ##
## Contact : cata7007@gmail.com ##
## Project : TravianZ ##
## GitHub : https://github.com/Shadowss/TravianZ ##
#################################################################################
// -----------------------------------------------------------------------------
// 1. Detectare mod de rulare
// - CLI (php cron.php): mereu permis, e apelat doar de cron-ul serverului.
// - HTTP (wget/curl): permis DOAR daca cheia din config se potriveste, ca sa
// nu poata declansa oricine automation-ul de pe internet.
// -----------------------------------------------------------------------------
$isCli = (PHP_SAPI === 'cli');
// -----------------------------------------------------------------------------
// 2. Bootstrap minimal - NU includem Session.php (porneste sesiune, se leaga de
// request si de un user logat). Automation are nevoie doar de config (constante
// SQL_*, TB_PREFIX, AUTOMATION_LOCK_FILE_NAME) si de $database; restul (buidata,
// unitdata, Units, Battle, etc.) si le include Automation.php singur.
// -----------------------------------------------------------------------------
$autoprefix = '';
for ($i = 0; $i < 5; $i++) {
$autoprefix = str_repeat('../', $i);
if (file_exists($autoprefix . 'autoloader.php')) {
break;
}
}
require_once($autoprefix . 'autoloader.php');
if (!file_exists($autoprefix . 'GameEngine/config.php')) {
// instalarea nu e finalizata - nu avem ce rula
if ($isCli) { fwrite(STDERR, "cron: config.php lipseste, jocul nu e instalat\n"); }
exit(1);
}
include_once($autoprefix . 'GameEngine/config.php');
// -----------------------------------------------------------------------------
// 3. Verificare cheie pentru accesul HTTP (nu se aplica in CLI)
// Defineste in GameEngine/config.php: define('CRON_KEY', 'un-secret-lung');
// Apoi apeleaza: https://domeniu/cron.php?key=un-secret-lung
// Daca CRON_KEY nu e definit, accesul HTTP este refuzat (doar CLI merge).
// -----------------------------------------------------------------------------
if (!$isCli) {
$providedKey = isset($_GET['key']) ? (string)$_GET['key'] : '';
if (!defined('CRON_KEY') || CRON_KEY === '' || !hash_equals(CRON_KEY, $providedKey)) {
header('HTTP/1.1 403 Forbidden');
exit('Forbidden');
}
// nu tinem conexiunea deschisa pentru client - raspundem si continuam in fundal
ignore_user_abort(true);
@set_time_limit(0);
header('Content-Type: text/plain');
echo "OK\n";
if (function_exists('fastcgi_finish_request')) {
fastcgi_finish_request();
}
}
// -----------------------------------------------------------------------------
// 4. Conexiune la baza de date (acelasi mod ca in Database.php - variabila globala
// $database folosita de Automation prin "global $database").
// -----------------------------------------------------------------------------
include_once($autoprefix . 'GameEngine/Database.php');
if (!isset($database) || !$database) {
if ($isCli) { fwrite(STDERR, "cron: conexiunea la baza de date a esuat\n"); }
exit(1);
}
// -----------------------------------------------------------------------------
// 5. Marcam ca suntem sursa oficiala de automation. AUTOMATION_MANUAL_RUN spune
// Automation.php sa NU mai treaca prin gardul de lock file (acela era pentru
// coordonarea request-urilor concurente ale jucatorilor; cron-ul e sursa unica,
// o data pe minut, deci nu are nevoie de el).
//
// In plus scriem un marker cu timestamp, ca Village.php sa stie ca exista un
// cron activ si sa NU mai declanseze automation din paginile jucatorilor
// (fallback: daca cron-ul se opreste > 90s, paginile preiau automat).
// -----------------------------------------------------------------------------
if (!defined('AUTOMATION_MANUAL_RUN')) {
define('AUTOMATION_MANUAL_RUN', true);
}
$cronMarker = $autoprefix . 'GameEngine/Prevention/cron_active.txt';
@file_put_contents($cronMarker, (string)time(), LOCK_EX);
// -----------------------------------------------------------------------------
// 6. Rulam automation-ul propriu-zis. Constructorul din Automation.php face toata
// treaba (procNewClimbers, buildComplete, trainingComplete, batalii, miscari...).
// -----------------------------------------------------------------------------
include_once($autoprefix . 'GameEngine/Automation.php');
if ($isCli) {
echo "cron: automation rulat la " . date('Y-m-d H:i:s') . "\n";
}
+3 -1
View File
@@ -486,7 +486,9 @@ CREATE TABLE IF NOT EXISTS `%PREFIX%chat` (
`alli` varchar(255) NULL,
`date` varchar(255) NULL,
`msg` varchar(255) NULL,
PRIMARY KEY (`id`)
PRIMARY KEY (`id`),
KEY `alli` (`alli`(32)),
KEY `id_user` (`id_user`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--