mirror of
https://github.com/Shadowss/TravianZ.git
synced 2026-06-28 00:24:23 +00:00
894 lines
36 KiB
PHP
Executable File
894 lines
36 KiB
PHP
Executable File
<?php
|
|
|
|
#################################################################################
|
|
## -= YOU MAY NOT REMOVE OR CHANGE THIS NOTICE =- ##
|
|
## --------------------------------------------------------------------------- ##
|
|
## Project: TravianZ ##
|
|
## Version: 18.05.2026 ##
|
|
## Filename: GameEngine\Admin\database.php ##
|
|
## Developed by: Dzoki ##
|
|
## Refactored by: Shadow ##
|
|
## License: TravianZ Project ##
|
|
## Copyright: TravianZ (c) 2010-2026. All rights reserved. ##
|
|
## URLs: https://travianz.org ##
|
|
## https://github.com/Shadowss/TravianZ ##
|
|
## ##
|
|
#################################################################################
|
|
|
|
/* ---------------------------------------------------------------------------
|
|
* Compatibilitate mysqli_result pentru cod legacy
|
|
* --------------------------------------------------------------------------- */
|
|
if (!function_exists('mysqli_result')) {
|
|
function mysqli_result($res, $row, $field = 0) {
|
|
$res->data_seek($row);
|
|
$datarow = $res->fetch_array();
|
|
return $datarow[$field];
|
|
}
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------
|
|
* Autoloader path - caută maxim 5 nivele în sus
|
|
* --------------------------------------------------------------------------- */
|
|
$autoprefix = '';
|
|
for ($i = 0; $i < 5; $i++) {
|
|
$autoprefix = str_repeat('../', $i);
|
|
if (file_exists($autoprefix. 'autoloader.php')) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------
|
|
* Include-uri condiționate
|
|
* --------------------------------------------------------------------------- */
|
|
if (isset($gameinstall) && $gameinstall == 1) {
|
|
include_once($autoprefix. "GameEngine/config.php");
|
|
include_once($autoprefix. "GameEngine/Data/buidata.php");
|
|
} else {
|
|
include_once($autoprefix. "GameEngine/Data/unitdata.php");
|
|
include_once($autoprefix. "GameEngine/Technology.php");
|
|
include_once($autoprefix. "GameEngine/Data/buidata.php");
|
|
}
|
|
include_once($autoprefix. "GameEngine/Database.php");
|
|
|
|
/* ---------------------------------------------------------------------------
|
|
* Clasa principală admin DB
|
|
* --------------------------------------------------------------------------- */
|
|
class adm_DB {
|
|
|
|
var $connection;
|
|
|
|
function __construct() {
|
|
global $database;
|
|
$database = new MYSQLi_DB(SQL_SERVER, SQL_USER, SQL_PASS, SQL_DB, (defined('SQL_PORT')? SQL_PORT : 3306));
|
|
$this->connection = $database->return_link();
|
|
}
|
|
|
|
/* ---------------- Login admin ---------------- */
|
|
function Login($username, $password) {
|
|
global $database;
|
|
list($username, $password) = $database->escape_input($username, $password);
|
|
|
|
$q = "SELECT id, password, is_bcrypt FROM ". TB_PREFIX. "users WHERE username = '$username' AND access >= ". MULTIHUNTER;
|
|
$result = mysqli_query($this->connection, $q);
|
|
|
|
// compatibilitate cu DB fără coloana is_bcrypt
|
|
if (mysqli_error($database->dblink)!= '') {
|
|
$q = "SELECT id, password, 0 as is_bcrypt FROM ". TB_PREFIX. "users WHERE username = '$username' AND access >= ". MULTIHUNTER;
|
|
$result = mysqli_query($this->connection, $q);
|
|
$bcrypt_update_done = false;
|
|
} else {
|
|
$bcrypt_update_done = true;
|
|
}
|
|
|
|
$dbarray = mysqli_fetch_array($result);
|
|
|
|
// verificare parolă - bcrypt sau md5 legacy
|
|
$bcrypted = true;
|
|
$pwOk = password_verify($password, $dbarray['password']);
|
|
|
|
if (!$pwOk &&!$dbarray['is_bcrypt']) {
|
|
$pwOk = ($dbarray['password'] == md5($password));
|
|
$bcrypted = false;
|
|
}
|
|
|
|
$username = htmlspecialchars($username);
|
|
// proxy-aware (issue #185): log the real client IP behind a trusted reverse proxy
|
|
$realIp = \App\Utils\IpResolver::getClientIp() ?? ($_SERVER['REMOTE_ADDR'] ?? '0.0.0.0');
|
|
if ($pwOk) {
|
|
// upgrade la bcrypt dacă e necesar
|
|
if (!$dbarray['is_bcrypt'] &&!$bcrypted) {
|
|
mysqli_query($this->connection, "UPDATE ". TB_PREFIX. "users SET password = '". password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]). "'". ($bcrypt_update_done? ", is_bcrypt = 1" : ""). " WHERE id = ". (int)$dbarray['id']);
|
|
}
|
|
mysqli_query($this->connection, "INSERT INTO ". TB_PREFIX. "admin_log VALUES (0,'X','$username logged in (IP: <b>". $realIp. "</b>)',". time(). ")");
|
|
return true;
|
|
} else {
|
|
mysqli_query($this->connection, "INSERT INTO ". TB_PREFIX. "admin_log VALUES (0,'X','<font color=\'red\'><b>IP: ". $realIp. " tried to log in with username <u> $username</u> but access was denied!</font></b>',". time(). ")");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/* ---------------- Recalculare populație ---------------- */
|
|
function recountPopUser($uid) {
|
|
global $database;
|
|
$villages = $database->getProfileVillages($uid);
|
|
for ($i = 0; $i <= count($villages) - 1; $i++) {
|
|
$vid = $villages[$i]['wref'];
|
|
$this->recountPop($vid);
|
|
$this->recountCP($vid);
|
|
}
|
|
}
|
|
|
|
function recountPop($vid) {
|
|
global $database;
|
|
$fdata = $database->getResourceLevel($vid);
|
|
$popTot = 0;
|
|
for ($i = 1; $i <= 40; $i++) {
|
|
$lvl = $fdata["f". $i];
|
|
$building = $fdata["f". $i. "t"];
|
|
if ($building > 0 && $lvl > 0) {
|
|
$popTot += $this->buildingPOP($building, $lvl);
|
|
}
|
|
}
|
|
$q = "UPDATE ". TB_PREFIX. "vdata SET pop = $popTot WHERE wref = ". (int)$vid;
|
|
mysqli_query($this->connection, $q);
|
|
}
|
|
|
|
function recountCP($vid) {
|
|
global $database;
|
|
$fdata = $database->getResourceLevel($vid);
|
|
$popTot = 0;
|
|
for ($i = 1; $i <= 40; $i++) {
|
|
$lvl = $fdata["f". $i];
|
|
$building = $fdata["f". $i. "t"];
|
|
if ($building > 0 && $lvl > 0) {
|
|
$popTot += $this->buildingCP($building, $lvl);
|
|
}
|
|
}
|
|
$q = "UPDATE ". TB_PREFIX. "vdata SET cp = $popTot WHERE wref = ". (int)$vid;
|
|
mysqli_query($this->connection, $q);
|
|
}
|
|
|
|
function buildingPOP($f, $lvl) {
|
|
$name = "bid". $f;
|
|
global $$name;
|
|
$popT = 0;
|
|
$dataarray = $$name;
|
|
for ($i = 1; $i <= $lvl; $i++) {
|
|
$popT += $dataarray[$i]['pop']?? 0;
|
|
}
|
|
return $popT;
|
|
}
|
|
|
|
function buildingCP($f, $lvl) {
|
|
$name = "bid". $f;
|
|
global $$name;
|
|
$popT = 0;
|
|
$dataarray = $$name;
|
|
for ($i = 1; $i <= $lvl; $i++) {
|
|
$popT += $dataarray[$i]['cp']?? 0;
|
|
}
|
|
return $popT;
|
|
}
|
|
|
|
/* ---------------- Utilitare sate ---------------- */
|
|
function getWref($x, $y) {
|
|
$q = "SELECT id FROM ". TB_PREFIX. "wdata WHERE x = ". (int)$x. " AND y = ". (int)$y;
|
|
$result = mysqli_query($this->connection, $q);
|
|
$r = mysqli_fetch_array($result);
|
|
return $r['id'];
|
|
}
|
|
|
|
function AddVillage($post) {
|
|
global $database;
|
|
$wid = $this->getWref($post['x'], $post['y']);
|
|
$uid = (int)$post['uid'];
|
|
$status = $database->getVillageState($wid);
|
|
$status = 0;
|
|
if ($status == 0) {
|
|
mysqli_query($this->connection, "INSERT INTO ". TB_PREFIX. "admin_log VALUES (0,". (int)$_SESSION['id']. ",'Added new village <b><a href=\'admin.php?p=village&did=$wid\'>$wid</a></b> to user <b><a href=\'admin.php?p=player&uid=$uid\'>$uid</a></b>',". time(). ")");
|
|
$database->setFieldTaken($wid);
|
|
$username = $database->getUserArray($uid, 1);
|
|
$username = $username['username'];
|
|
$database->addVillage($wid, $uid, $username, '0');
|
|
$database->addResourceFields($wid, $database->getVillageType($wid, false));
|
|
$database->addUnits($wid);
|
|
$database->addTech($wid);
|
|
$database->addABTech($wid);
|
|
}
|
|
}
|
|
|
|
/* ---------------- Pedepsire jucător ---------------- */
|
|
|
|
function Punish($post) {
|
|
global $database;
|
|
$villages = $database->getProfileVillages($post['uid']);
|
|
$user = $database->getUserArray($post['uid'], 1);
|
|
$logPunishment = '';
|
|
|
|
for ($i = 0; $i < count($villages); $i++) {
|
|
$vid = (int)$villages[$i]['wref'];
|
|
|
|
// 1. pedeapsă procent populație
|
|
if (!empty($post['punish'])) {
|
|
$punish = (int)$post['punish'];
|
|
$logPunishment = "<b>-". $punish ."%</b> population";
|
|
$popOld = (int)$villages[$i]['pop'];
|
|
$proc = 100 - $punish;
|
|
$pop = floor(($popOld / 100) * $proc);
|
|
if ($pop < 2) { $pop = 2; }
|
|
$this->PunishBuilding($vid, $proc, $pop);
|
|
}
|
|
|
|
// 2. ștergere trupe - CORECTAT
|
|
if (!empty($post['del_troop'])) {
|
|
$logPunishment = "<b>troops removal</b>";
|
|
$tribe = (int)$user['tribe'];
|
|
// 1=Romani (1-10), 2=Teutoni (11-20), 3=Gali (21-30), 4=Natura (31-40), 5=Natari (41-50)
|
|
$unitStart = ($tribe >= 1 && $tribe <= 5) ? (($tribe - 1) * 10 + 1) : 1;
|
|
$this->DelUnits($vid, $unitStart);
|
|
}
|
|
|
|
// 3. golire depozite
|
|
if (!empty($post['clean_ware'])) {
|
|
$logPunishment = "<b>emptying warehouses</b>";
|
|
$time = time();
|
|
$q = "UPDATE ". TB_PREFIX ."vdata SET `wood`='0', `clay`='0', `iron`='0', `crop`='0', `lastupdate`='$time' WHERE wref=$vid";
|
|
mysqli_query($this->connection, $q);
|
|
}
|
|
}
|
|
|
|
mysqli_query($this->connection, "INSERT INTO ". TB_PREFIX ."admin_log VALUES (0,". (int)$_SESSION['id'] .",'Punished user: <a href=\'admin.php?p=player&uid=". (int)$post['uid'] ."\'>". (int)$post['uid'] ."</a> with ". $logPunishment ."',". time() .")");
|
|
}
|
|
|
|
function PunishBuilding($vid, $proc, $pop) {
|
|
global $database;
|
|
$vid = (int)$vid;
|
|
mysqli_query($this->connection, "UPDATE ". TB_PREFIX ."vdata SET pop=". (int)$pop ." WHERE wref=$vid");
|
|
|
|
$fdata = $database->getResourceLevel($vid);
|
|
for ($i = 1; $i <= 40; $i++) {
|
|
if ($fdata['f'.$i] > 1) {
|
|
$zm = ($fdata['f'.$i] / 100) * $proc;
|
|
$zm = ($zm < 1) ? 1 : floor($zm);
|
|
mysqli_query($this->connection, "UPDATE ". TB_PREFIX ."fdata SET `f$i`='$zm' WHERE `vref`=$vid");
|
|
}
|
|
}
|
|
}
|
|
|
|
// CORECTAT: șterge doar cele 10 unități ale tribului, FĂRĂ erou
|
|
function DelUnits($vid, $unitStart) {
|
|
$vid = (int)$vid;
|
|
$unitStart = (int)$unitStart;
|
|
$sets = [];
|
|
for ($i = $unitStart; $i <= $unitStart + 9; $i++) {
|
|
$sets[] = "`u$i`='0'";
|
|
}
|
|
// intenționat NU includem `hero` - eroul trebuie să rămână în sat
|
|
$q = "UPDATE ". TB_PREFIX ."units SET ". implode(', ', $sets) ." WHERE `vref`=$vid";
|
|
mysqli_query($this->connection, $q);
|
|
}
|
|
|
|
// păstrată pentru compatibilitate (nu mai e folosită în buclă)
|
|
function DelUnits2($vid, $unit) {
|
|
$q = "UPDATE ". TB_PREFIX ."units SET `u". (int)$unit ."`='0' WHERE `vref`=". (int)$vid;
|
|
mysqli_query($this->connection, $q);
|
|
}
|
|
|
|
/* ---------------- Ștergere jucător ---------------- */
|
|
function DelPlayer($uid, $pass) {
|
|
global $database;
|
|
$ID = (int)$_SESSION['id'];
|
|
if ($this->CheckPass($pass, $ID)) {
|
|
$villages = $database->getProfileVillages($uid);
|
|
for ($i = 0; $i <= count($villages) - 1; $i++) {
|
|
$this->DelVillage($villages[$i]['wref'], 1);
|
|
}
|
|
$q = "DELETE FROM ". TB_PREFIX. "hero WHERE uid = ". (int)$uid;
|
|
mysqli_query($this->connection, $q);
|
|
|
|
$name = $database->getUserField($uid, "username", 0);
|
|
mysqli_query($this->connection, "INSERT INTO ". TB_PREFIX. "admin_log VALUES (0,$ID,'Deleted user <a>$name</a>',". time(). ")");
|
|
|
|
$q = "DELETE FROM ". TB_PREFIX. "users WHERE `id` = ". (int)$uid;
|
|
mysqli_query($this->connection, $q);
|
|
} else {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function getUserActive() {
|
|
$time = time() - (60 * 5);
|
|
$q = "SELECT * FROM ". TB_PREFIX. "users WHERE timestamp > $time AND username!= 'support' ORDER BY access DESC, username ASC";
|
|
$result = mysqli_query($this->connection, $q);
|
|
return $this->mysqli_fetch_all($result);
|
|
}
|
|
|
|
function CheckPass($password, $uid) {
|
|
$q = "SELECT id,password, is_bcrypt FROM ". TB_PREFIX. "users WHERE id = ". (int)$uid. " AND access = ". ADMIN;
|
|
$result = mysqli_query($this->connection, $q);
|
|
|
|
if (mysqli_error($this->connection)!= '') {
|
|
$q = "SELECT password, 0 as is_bcrypt FROM ". TB_PREFIX. "users WHERE id = ". (int)$uid. " AND access = ". ADMIN;
|
|
$result = mysqli_query($this->connection, $q);
|
|
$bcrypt_update_done = false;
|
|
} else {
|
|
$bcrypt_update_done = true;
|
|
}
|
|
|
|
$dbarray = mysqli_fetch_array($result);
|
|
|
|
if (!$dbarray) {
|
|
// proxy-aware (issue #185)
|
|
$realIp = \App\Utils\IpResolver::getClientIp() ?? ($_SERVER['REMOTE_ADDR'] ?? '0.0.0.0');
|
|
mysqli_query($this->connection, "INSERT INTO ". TB_PREFIX. "admin_log VALUES (0,'X','<font color=\'red\'><b>IP: ". $realIp. " tried to log in with uid $uid but access was denied!</font></b>',". time(). ")");
|
|
return false;
|
|
}
|
|
|
|
$bcrypted = true;
|
|
$pwOk = password_verify($password, $dbarray['password']);
|
|
|
|
if (!$pwOk &&!$dbarray['is_bcrypt']) {
|
|
$pwOk = ($dbarray['password'] == md5($password));
|
|
$bcrypted = false;
|
|
}
|
|
|
|
if ($pwOk) {
|
|
if ($bcrypt_update_done &&!$dbarray['is_bcrypt']) {
|
|
mysqli_query($this->connection, "UPDATE ". TB_PREFIX. "users SET password = '". password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]). "', is_bcrypt = 1 WHERE id = ". (int)$dbarray['id']);
|
|
}
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/* ---------------- Ștergere sat ---------------- */
|
|
function DelVillage($wref, $mode = 0) {
|
|
global $database;
|
|
$wref = (int)$wref;
|
|
if ($mode == 0) {
|
|
$q = "SELECT Count(*) as Total FROM ". TB_PREFIX. "vdata WHERE `wref` = $wref AND capital = 0";
|
|
} else {
|
|
$q = "SELECT Count(*) as Total FROM ". TB_PREFIX. "vdata WHERE `wref` = $wref";
|
|
}
|
|
|
|
$result = mysqli_fetch_array(mysqli_query($this->connection, $q), MYSQLI_ASSOC);
|
|
if ($result['Total'] > 0) {
|
|
mysqli_query($this->connection, "INSERT INTO ". TB_PREFIX. "admin_log VALUES (0,". (int)$_SESSION['id']. ",'Deleted village <b>$wref</b>',". time(). ")");
|
|
|
|
$database->clearExpansionSlot($wref);
|
|
|
|
$tables = ['abdata', 'bdata', 'market', 'odata', 'research', 'tdata', 'fdata', 'training', 'units', 'farmlist'];
|
|
foreach ($tables as $t) {
|
|
$field = ($t == 'bdata')? 'wid' : (($t == 'farmlist' || $t == 'market' || $t == 'research' || $t == 'tdata' || $t == 'fdata' || $t == 'training' || $t == 'abdata')? 'vref' : 'wref');
|
|
if ($t == 'odata') $field = 'wref';
|
|
mysqli_query($this->connection, "DELETE FROM ". TB_PREFIX. "$t WHERE $field = $wref");
|
|
}
|
|
mysqli_query($this->connection, "DELETE FROM ". TB_PREFIX. "raidlist WHERE towref = $wref");
|
|
mysqli_query($this->connection, "DELETE FROM ". TB_PREFIX. "movement WHERE `from` = $wref AND proc=0");
|
|
mysqli_query($this->connection, "UPDATE ". TB_PREFIX. "wdata SET occupied = 0 WHERE id = $wref");
|
|
|
|
// curăță sloturi expansiune
|
|
$q = "UPDATE ". TB_PREFIX. "vdata SET exp1 = IF(exp1 = $wref, 0, exp1), exp2 = IF(exp2 = $wref, 0, exp2), exp3 = IF(exp3 = $wref, 0, exp3) WHERE exp1 = $wref OR exp2 = $wref OR exp3 = $wref";
|
|
mysqli_query($this->connection, $q);
|
|
|
|
$getmovement = $database->getMovement(3, $wref, 1);
|
|
foreach ($getmovement as $movedata) {
|
|
$time = microtime(true);
|
|
$time2 = $time - $movedata['starttime'];
|
|
$database->setMovementProc($movedata['moveid']);
|
|
$database->addMovement(4, $movedata['to'], $movedata['from'], $movedata['ref'], $time, $time + $time2);
|
|
}
|
|
|
|
$this->returnTroops($wref);
|
|
|
|
mysqli_query($this->connection, "DELETE FROM ". TB_PREFIX. "vdata WHERE `wref` = $wref");
|
|
|
|
if (mysqli_affected_rows($this->connection) > 0) {
|
|
mysqli_query($this->connection, "UPDATE ". TB_PREFIX. "wdata SET occupied = 0 WHERE id = $wref");
|
|
|
|
$getprisoners = $database->getPrisoners($wref);
|
|
foreach ($getprisoners as $pris) {
|
|
$troops = 0;
|
|
for ($i = 1; $i < 12; $i++) {
|
|
$troops += $pris['t'. $i];
|
|
}
|
|
$database->modifyUnit($pris['wref'], array("99o"), array($troops), array(0));
|
|
$database->deletePrisoners($pris['id']);
|
|
}
|
|
$getprisoners = $database->getPrisoners3($wref);
|
|
foreach ($getprisoners as $pris) {
|
|
$troops = 0;
|
|
for ($i = 1; $i < 12; $i++) {
|
|
$troops += $pris['t'. $i];
|
|
}
|
|
$database->modifyUnit($pris['wref'], array("99o"), array($troops), array(0));
|
|
$database->deletePrisoners($pris['id']);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* ---------------- Ban / Unban ---------------- */
|
|
function DelBan($uid, $id) {
|
|
global $database;
|
|
$name = addslashes($database->getUserField($uid, "username", 0));
|
|
$uid = (int)$uid;
|
|
mysqli_query($this->connection, "INSERT INTO ". TB_PREFIX. "admin_log VALUES (0,". (int)$_SESSION['id']. ",'Unbanned user <a href=\'admin.php?p=player&uid=$uid\'>$name</a>',". time(). ")");
|
|
mysqli_query($this->connection, "UPDATE ". TB_PREFIX. "users SET `access` = '". USER. "' WHERE `id` = $uid;");
|
|
mysqli_query($this->connection, "UPDATE ". TB_PREFIX. "banlist SET `active` = '0' WHERE `id` = ". (int)$id. ";");
|
|
}
|
|
|
|
function AddBan($uid, $end, $reason) {
|
|
global $database;
|
|
$name = addslashes($database->getUserField($uid, "username", 0));
|
|
list($end, $reason) = $database->escape_input($end, $reason);
|
|
$uid = (int)$uid;
|
|
mysqli_query($this->connection, "INSERT INTO ". TB_PREFIX. "admin_log VALUES (0,". (int)$_SESSION['id']. ",'Banned user <a href=\'admin.php?p=player&uid=$uid\'>$name</a>',". time(). ")");
|
|
mysqli_query($this->connection, "UPDATE ". TB_PREFIX. "users SET `access` = '0' WHERE `id` = $uid");
|
|
$time = time();
|
|
$admin = (int)$_SESSION['id'];
|
|
$name = addslashes($database->getUserField($uid, 'username', 0));
|
|
$q = "INSERT INTO ". TB_PREFIX. "banlist (`uid`, `name`, `reason`, `time`, `end`, `admin`, `active`) VALUES ($uid, '$name', '$reason', '$time', '$end', '$admin', '1');";
|
|
mysqli_query($this->connection, $q);
|
|
}
|
|
|
|
/* ---------------- IP Ban / Unban (issue #185) ---------------- */
|
|
|
|
// Lazily creates the IP ban table so existing servers do not need a manual migration.
|
|
function ensureIpBanTable() {
|
|
mysqli_query($this->connection,
|
|
"CREATE TABLE IF NOT EXISTS `". TB_PREFIX. "banlist_ip` (
|
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
|
`ip` varbinary(16) NOT NULL,
|
|
`ip_text` varchar(45) DEFAULT NULL,
|
|
`reason` varchar(100) DEFAULT NULL,
|
|
`time` int(11) UNSIGNED DEFAULT NULL,
|
|
`end` int(11) UNSIGNED DEFAULT NULL,
|
|
`admin` int(11) DEFAULT NULL,
|
|
`active` tinyint(1) UNSIGNED DEFAULT 1,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `ip` (`ip`),
|
|
KEY `active-end` (`active`,`end`)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8");
|
|
}
|
|
|
|
// $end is an absolute UNIX timestamp (0 = permanent).
|
|
function AddIpBan($ip, $end, $reason) {
|
|
$this->ensureIpBanTable();
|
|
|
|
$ip = trim((string)$ip);
|
|
$bin = @inet_pton($ip);
|
|
if ($bin === false) {
|
|
return false; // invalid IP, ignore
|
|
}
|
|
|
|
$reason = substr((string)$reason, 0, 100);
|
|
$time = time();
|
|
$end = (int)$end;
|
|
$admin = (int)$_SESSION['id'];
|
|
$ipText = $ip;
|
|
|
|
$stmt = $this->connection->prepare(
|
|
"INSERT INTO `". TB_PREFIX. "banlist_ip` (ip, ip_text, reason, time, end, admin, active)
|
|
VALUES (?,?,?,?,?,?,1)
|
|
ON DUPLICATE KEY UPDATE
|
|
ip_text = VALUES(ip_text), reason = VALUES(reason),
|
|
time = VALUES(time), end = VALUES(end), admin = VALUES(admin), active = 1"
|
|
);
|
|
if (!$stmt) {
|
|
return false;
|
|
}
|
|
$stmt->bind_param("sssiii", $bin, $ipText, $reason, $time, $end, $admin);
|
|
$ok = $stmt->execute();
|
|
$stmt->close();
|
|
|
|
$logIp = addslashes($ipText);
|
|
mysqli_query($this->connection,
|
|
"INSERT INTO ". TB_PREFIX. "admin_log VALUES (0, $admin, 'Banned IP <b>$logIp</b>', $time)");
|
|
|
|
return $ok;
|
|
}
|
|
|
|
function DelIpBan($id) {
|
|
$id = (int)$id;
|
|
$admin = (int)$_SESSION['id'];
|
|
|
|
$stmt = $this->connection->prepare(
|
|
"UPDATE `". TB_PREFIX. "banlist_ip` SET active = 0 WHERE id = ?");
|
|
if ($stmt) {
|
|
$stmt->bind_param("i", $id);
|
|
$stmt->execute();
|
|
$stmt->close();
|
|
}
|
|
|
|
mysqli_query($this->connection,
|
|
"INSERT INTO ". TB_PREFIX. "admin_log VALUES (0, $admin, 'Removed IP ban #$id', ". time(). ")");
|
|
}
|
|
|
|
function search_banned_ip() {
|
|
$this->ensureIpBanTable();
|
|
$now = time();
|
|
$q = "SELECT * FROM ". TB_PREFIX. "banlist_ip
|
|
WHERE active = 1 AND (end IS NULL OR end = 0 OR end > $now) ORDER BY id DESC";
|
|
$result = mysqli_query($this->connection, $q);
|
|
return $this->mysqli_fetch_all($result);
|
|
}
|
|
|
|
/* ---------------- Căutări ---------------- */
|
|
function search_player($player) {
|
|
global $database;
|
|
$player = $database->escape($player);
|
|
$q = "SELECT id,username FROM ". TB_PREFIX. "users WHERE `username` LIKE '%$player%' AND username!= 'support'";
|
|
$result = mysqli_query($this->connection, $q);
|
|
return $this->mysqli_fetch_all($result);
|
|
}
|
|
|
|
function search_email($email) {
|
|
global $database;
|
|
$email = $database->escape($email);
|
|
$q = "SELECT id,email FROM ". TB_PREFIX. "users WHERE `email` LIKE '%$email%' AND username!= 'support'";
|
|
$result = mysqli_query($this->connection, $q);
|
|
return $this->mysqli_fetch_all($result);
|
|
}
|
|
|
|
function search_village($village) {
|
|
global $database;
|
|
$village = $database->escape($village);
|
|
$q = "SELECT * FROM ". TB_PREFIX. "vdata WHERE `name` LIKE '%$village%' OR `wref` LIKE '%$village%'";
|
|
$result = mysqli_query($this->connection, $q);
|
|
return $this->mysqli_fetch_all($result);
|
|
}
|
|
|
|
function search_alliance($alliance) {
|
|
global $database;
|
|
$alliance = $database->escape($alliance);
|
|
$q = "SELECT * FROM ". TB_PREFIX. "alidata WHERE `name` LIKE '%$alliance%' OR `tag` LIKE '%$alliance%' OR `id` LIKE '%$alliance%'";
|
|
$result = mysqli_query($this->connection, $q);
|
|
return $this->mysqli_fetch_all($result);
|
|
}
|
|
|
|
function search_ip($ip) {
|
|
global $database;
|
|
$ip = $database->escape($ip);
|
|
$q = "SELECT * FROM ". TB_PREFIX. "login_log WHERE `ip` LIKE '%$ip%'";
|
|
$result = mysqli_query($this->connection, $q);
|
|
return $this->mysqli_fetch_all($result);
|
|
}
|
|
|
|
function search_banned() {
|
|
$q = "SELECT * FROM ". TB_PREFIX. "banlist WHERE active = '1'";
|
|
$result = mysqli_query($this->connection, $q);
|
|
return $this->mysqli_fetch_all($result);
|
|
}
|
|
|
|
function Del_banned() {
|
|
$q = "SELECT * FROM ". TB_PREFIX. "banlist";
|
|
$result = mysqli_query($this->connection, $q);
|
|
return $this->mysqli_fetch_all($result);
|
|
}
|
|
|
|
/* ---------------- Helpers MySQLi ---------------- */
|
|
function mysqli_fetch_all($result) {
|
|
$all = array();
|
|
if ($result) {
|
|
while ($row = mysqli_fetch_assoc($result)) {
|
|
$all[] = $row;
|
|
}
|
|
return $all;
|
|
}
|
|
}
|
|
|
|
function query_return($q) {
|
|
$result = mysqli_query($this->connection, $q);
|
|
return $this->mysqli_fetch_all($result);
|
|
}
|
|
|
|
function query($query) {
|
|
// corectat ordinea parametrilor
|
|
return mysqli_query($this->connection, $query);
|
|
}
|
|
|
|
/* ---------------- Funcții joc ---------------- */
|
|
public function getTypeLevel($tid, $vid) {
|
|
global $village, $database;
|
|
$keyholder = array();
|
|
|
|
if ($vid == 0) {
|
|
$resourcearray = $village->resarray;
|
|
} else {
|
|
$resourcearray = $database->getResourceLevel($vid);
|
|
}
|
|
foreach (array_keys($resourcearray, $tid) as $key) {
|
|
if (strpos($key, 't')) {
|
|
$key = preg_replace("/[^0-9]/", '', $key);
|
|
array_push($keyholder, $key);
|
|
}
|
|
}
|
|
$element = count($keyholder);
|
|
if ($element >= 2) {
|
|
if ($tid <= 4) {
|
|
$temparray = array();
|
|
for ($i = 0; $i <= $element - 1; $i++) {
|
|
array_push($temparray, $resourcearray['f'. $keyholder[$i]]);
|
|
}
|
|
foreach ($temparray as $key => $val) {
|
|
if ($val == max($temparray))
|
|
$target = $key;
|
|
}
|
|
} else {
|
|
$target = 0;
|
|
for ($i = 1; $i <= $element - 1; $i++) {
|
|
if ($resourcearray['f'. $keyholder[$i]] > $resourcearray['f'. $keyholder[$target]]) {
|
|
$target = $i;
|
|
}
|
|
}
|
|
}
|
|
} else if ($element == 1) {
|
|
$target = 0;
|
|
} else {
|
|
return 0;
|
|
}
|
|
if ($keyholder[$target]!= "") {
|
|
return $resourcearray['f'. $keyholder[$target]];
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
public function procDistanceTime($coor, $thiscoor, $ref, $vid) {
|
|
global $bid28, $bid14;
|
|
|
|
$xdistance = ABS($thiscoor['x'] - $coor['x']);
|
|
if ($xdistance > WORLD_MAX) {
|
|
$xdistance = (2 * WORLD_MAX + 1) - $xdistance;
|
|
}
|
|
$ydistance = ABS($thiscoor['y'] - $coor['y']);
|
|
if ($ydistance > WORLD_MAX) {
|
|
$ydistance = (2 * WORLD_MAX + 1) - $ydistance;
|
|
}
|
|
$distance = SQRT(POW($xdistance, 2) + POW($ydistance, 2));
|
|
$speed = $ref;
|
|
if ($this->getTypeLevel(14, $vid)!= 0 && $distance >= TS_THRESHOLD) {
|
|
$speed = $speed * ($bid14[$this->getTypeLevel(14, $vid)]['attri'] / 100);
|
|
}
|
|
|
|
if ($speed!= 0) {
|
|
return round(($distance / $speed) * 3600 / INCREASE_SPEED);
|
|
} else {
|
|
return round($distance * 3600 / INCREASE_SPEED);
|
|
}
|
|
}
|
|
|
|
public function returnTroops($wref) {
|
|
global $database;
|
|
$getenforce = $database->getEnforceVillage($wref, 0);
|
|
foreach ($getenforce as $enforce) {
|
|
$to = $database->getVillage($enforce['from']);
|
|
$start = ($database->getUserField($to['owner'], 'tribe', 0) - 1) * 10 + 1;
|
|
$end = ($database->getUserField($to['owner'], 'tribe', 0) * 10);
|
|
|
|
$from = $database->getVillage($enforce['from']);
|
|
$fromcoor = $database->getCoor($enforce['from']);
|
|
$tocoor = $database->getCoor($enforce['vref']);
|
|
$fromCor = array('x' => $tocoor['x'], 'y' => $tocoor['y']);
|
|
$toCor = array('x' => $fromcoor['x'], 'y' => $fromcoor['y']);
|
|
|
|
$speeds = array();
|
|
for ($i = $start; $i <= $end; $i++) {
|
|
if (intval($enforce['u'. $i]) > 0) {
|
|
$unitarray = $GLOBALS["u". $i];
|
|
$speeds[] = $unitarray['speed'];
|
|
} else {
|
|
$enforce['u'. $i] = '0';
|
|
}
|
|
}
|
|
|
|
if (intval($enforce['hero']) > 0) {
|
|
$q = "SELECT * FROM ". TB_PREFIX. "hero WHERE uid = ". (int)$from['owner']. " AND dead = 0";
|
|
$result = mysqli_query($database->dblink, $q);
|
|
$hero_f = mysqli_fetch_array($result);
|
|
$hero_unit = $hero_f['unit'];
|
|
$speeds[] = $GLOBALS['u'. $hero_unit]['speed'];
|
|
} else {
|
|
$enforce['hero'] = '0';
|
|
}
|
|
|
|
$troopsTime = $this->procDistanceTime($fromCor, $toCor, min($speeds), $enforce['from']);
|
|
$time = $database->getArtifactsValueInfluence($from['owner'], $enforce['from'], 2, $troopsTime);
|
|
|
|
$reference = $database->addAttack($enforce['from'], $enforce['u'. $start], $enforce['u'. ($start + 1)], $enforce['u'. ($start + 2)], $enforce['u'. ($start + 3)], $enforce['u'. ($start + 4)], $enforce['u'. ($start + 5)], $enforce['u'. ($start + 6)], $enforce['u'. ($start + 7)], $enforce['u'. ($start + 8)], $enforce['u'. ($start + 9)], $enforce['hero'], 2, 0, 0, 0, 0);
|
|
$database->addMovement(4, $wref, $enforce['from'], $reference, time(), ($time + time()));
|
|
$database->deleteReinf($enforce['id']);
|
|
}
|
|
}
|
|
|
|
public function calculateProduction($wid, $uid, $b1, $b2, $b3, $b4, $fdata, $ocounter, $pop) {
|
|
global $technology, $database;
|
|
$isNatar = $database->getVillageField($wid, "natar");
|
|
$upkeep = $technology->getUpkeep($this->getAllUnits($wid), 0, $wid);
|
|
$production = [];
|
|
$production['wood'] = $this->getWoodProd($fdata, $ocounter, $b1);
|
|
$production['clay'] = $this->getClayProd($fdata, $ocounter, $b2);
|
|
$production['iron'] = $this->getIronProd($fdata, $ocounter, $b3);
|
|
$production['crop'] = $this->getCropProd($fdata, $ocounter, $b4) - (!$isNatar? $pop : round($pop / 2)) - $upkeep;
|
|
return $production;
|
|
}
|
|
|
|
private function getWoodProd($fdata, $ocounter, $b1) {
|
|
global $bid1, $bid5;
|
|
$basewood = $sawmill = 0;
|
|
$woodholder = array();
|
|
for ($i = 1; $i <= 38; $i++) {
|
|
if ($fdata['f'. $i. 't'] == 1) {
|
|
array_push($woodholder, 'f'. $i);
|
|
}
|
|
if ($fdata['f'. $i. 't'] == 5) {
|
|
$sawmill = $fdata['f'. $i];
|
|
}
|
|
}
|
|
for ($i = 0; $i <= count($woodholder) - 1; $i++) {
|
|
$basewood += $bid1[$fdata[$woodholder[$i]]]['prod'];
|
|
}
|
|
$wood = $basewood + $basewood * 0.25 * $ocounter[0];
|
|
if ($sawmill >= 1) {
|
|
$wood += $basewood / 100 * $bid5[$sawmill]['attri'];
|
|
}
|
|
if ($b1 > time()) {
|
|
$wood *= 1.25;
|
|
}
|
|
$wood *= SPEED;
|
|
return round($wood);
|
|
}
|
|
|
|
private function getClayProd($fdata, $ocounter, $b2) {
|
|
global $bid2, $bid6;
|
|
$baseclay = $brick = 0;
|
|
$clayholder = array();
|
|
for ($i = 1; $i <= 38; $i++) {
|
|
if ($fdata['f'. $i. 't'] == 2) {
|
|
array_push($clayholder, 'f'. $i);
|
|
}
|
|
if ($fdata['f'. $i. 't'] == 6) {
|
|
$brick = $fdata['f'. $i];
|
|
}
|
|
}
|
|
for ($i = 0; $i <= count($clayholder) - 1; $i++) {
|
|
$baseclay += $bid2[$fdata[$clayholder[$i]]]['prod'];
|
|
}
|
|
$clay = $baseclay + $baseclay * 0.25 * $ocounter[1];
|
|
if ($brick >= 1) {
|
|
$clay += $baseclay / 100 * $bid6[$brick]['attri'];
|
|
}
|
|
if ($b2 > time()) {
|
|
$clay *= 1.25;
|
|
}
|
|
$clay *= SPEED;
|
|
return round($clay);
|
|
}
|
|
|
|
private function getIronProd($fdata, $ocounter, $b3) {
|
|
global $bid3, $bid7;
|
|
$baseiron = $foundry = 0;
|
|
$ironholder = array();
|
|
for ($i = 1; $i <= 38; $i++) {
|
|
if ($fdata['f'. $i. 't'] == 3) {
|
|
array_push($ironholder, 'f'. $i);
|
|
}
|
|
if ($fdata['f'. $i. 't'] == 7) {
|
|
$foundry = $fdata['f'. $i];
|
|
}
|
|
}
|
|
for ($i = 0; $i <= count($ironholder) - 1; $i++) {
|
|
$baseiron += $bid3[$fdata[$ironholder[$i]]]['prod'];
|
|
}
|
|
$iron = $baseiron + $baseiron * 0.25 * $ocounter[2];
|
|
if ($foundry >= 1) {
|
|
$iron += $baseiron / 100 * $bid7[$foundry]['attri'];
|
|
}
|
|
if ($b3 > time()) {
|
|
$iron *= 1.25;
|
|
}
|
|
$iron *= SPEED;
|
|
return round($iron);
|
|
}
|
|
|
|
private function getCropProd($fdata, $ocounter, $b4) {
|
|
global $bid4, $bid8, $bid9;
|
|
$basecrop = $grainmill = $bakery = 0;
|
|
$cropholder = array();
|
|
for ($i = 1; $i <= 38; $i++) {
|
|
if ($fdata['f'. $i. 't'] == 4) {
|
|
array_push($cropholder, 'f'. $i);
|
|
}
|
|
if ($fdata['f'. $i. 't'] == 8) {
|
|
$grainmill = $fdata['f'. $i];
|
|
}
|
|
if ($fdata['f'. $i. 't'] == 9) {
|
|
$bakery = $fdata['f'. $i];
|
|
}
|
|
}
|
|
for ($i = 0; $i <= count($cropholder) - 1; $i++) {
|
|
$basecrop += $bid4[$fdata[$cropholder[$i]]]['prod'];
|
|
}
|
|
$crop = $basecrop + $basecrop * 0.25 * $ocounter[3];
|
|
$jcrop = 0;
|
|
if ($grainmill >= 1) $jcrop = (isset($bid8[$grainmill]['attri'])? $bid8[$grainmill]['attri'] : 0);
|
|
if ($bakery >= 1) $jcrop += (isset($bid9[$bakery]['attri'])? $bid9[$bakery]['attri'] : 0);
|
|
$crop += $basecrop / 100 * $jcrop;
|
|
if ($b4 > time()) {
|
|
$crop *= 1.25;
|
|
}
|
|
$crop *= SPEED;
|
|
return round($crop);
|
|
}
|
|
|
|
function getAllUnits($base, $InVillageOnly = False, $mode = 0) {
|
|
global $database;
|
|
$ownunit = $database->getUnit($base);
|
|
$ownunit['u99'] -= $ownunit['u99'];
|
|
$ownunit['u99o'] -= $ownunit['u99o'];
|
|
$enforcementarray = $database->getEnforceVillage($base, 0);
|
|
if (count($enforcementarray) > 0) {
|
|
foreach ($enforcementarray as $enforce) {
|
|
for ($i = 1; $i <= 50; $i++) {
|
|
$ownunit['u'. $i] += $enforce['u'. $i];
|
|
}
|
|
$ownunit['hero'] += $enforce['hero'];
|
|
}
|
|
}
|
|
if ($mode == 0) {
|
|
$enforceoasis = $database->getOasisEnforce($base, 0);
|
|
if (count($enforceoasis) > 0) {
|
|
foreach ($enforceoasis as $enforce) {
|
|
for ($i = 1; $i <= 50; $i++) {
|
|
$ownunit['u'. $i] += $enforce['u'. $i];
|
|
}
|
|
$ownunit['hero'] += $enforce['hero'];
|
|
}
|
|
}
|
|
$enforceoasis1 = $database->getOasisEnforce($base, 1);
|
|
if (count($enforceoasis1) > 0) {
|
|
foreach ($enforceoasis1 as $enforce) {
|
|
for ($i = 1; $i <= 50; $i++) {
|
|
$ownunit['u'. $i] += $enforce['u'. $i];
|
|
}
|
|
$ownunit['hero'] += $enforce['hero'];
|
|
}
|
|
}
|
|
|
|
$prisoners = $database->getPrisoners($base, 1);
|
|
if (!empty($prisoners)) {
|
|
foreach ($prisoners as $prisoner) {
|
|
$owner = $database->getVillageField($base, "owner");
|
|
$ownertribe = $database->getUserField($owner, "tribe", 0);
|
|
$start = ($ownertribe - 1) * 10 + 1;
|
|
$end = ($ownertribe * 10);
|
|
for ($i = $start; $i <= $end; $i++) {
|
|
$j = $i - $start + 1;
|
|
$ownunit['u'. $i] += $prisoner['t'. $j];
|
|
}
|
|
$ownunit['hero'] += $prisoner['t11'];
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!$InVillageOnly) {
|
|
$movement = $database->getVillageMovement($base);
|
|
if (!empty($movement)) {
|
|
for ($i = 1; $i <= 50; $i++) {
|
|
if (isset($movement['u'. $i])) {
|
|
$ownunit['u'. $i] += $movement['u'. $i];
|
|
}
|
|
}
|
|
$ownunit['hero'] += $movement['hero'];
|
|
}
|
|
}
|
|
return $ownunit;
|
|
}
|
|
};
|
|
|
|
$admin = new adm_DB;
|
|
include("function.php");
|
|
?>
|