Файл: system/user.php
Строк: 290
<?php
/* Обновление игры под PHP 8.4 / PDO и усиление безопасности: by Метриум (Стэлп) */
$user = null;
$id = security_auth_user_id();
if($id > 0) {
$user = db_fetch_one('SELECT * FROM `users` WHERE `id` = :id LIMIT 1', ['id'=>$id]);
if(!$user) {
security_auth_logout();
$id = 0;
return;
}
// Presence пишем не на каждый запрос: это резко снижает количество UPDATE при навигации.
$now=time(); $remoteIp=(string)($_SERVER['REMOTE_ADDR'] ?? ''); $ua=(string)($_SERVER['HTTP_USER_AGENT'] ?? ''); $self=(string)($_SERVER['PHP_SELF'] ?? '');
if ((int)($user['online'] ?? 0) < $now-15 || (string)($user['ip'] ?? '') !== $remoteIp || (string)($user['self'] ?? '') !== $self) {
db_execute('UPDATE `users` SET `online`=:online,`ip`=:ip,`ua`=:ua,`self`=:self WHERE `id`=:id',[
'online'=>$now,'ip'=>$remoteIp,'ua'=>substr($ua,0,255),'self'=>substr($self,0,255),'id'=>(int)$user['id']
]);
$user['online']=$now; $user['ip']=$remoteIp; $user['self']=$self;
}
$_time = 2;
if ((time() - $user['last_update']) > $_time) {
$hp = $user['vit'] * 2;
if ($user['hp'] < $hp) {
$_hp = round((((time() - $user['last_update']) / $_time) - 1));
if ($_hp > $hp) {
$_hp = $hp - $user['hp'];
}
$user['hp'] = $user['hp'] + $_hp;
}
if ($user['mp'] < $user['mana']) {
$_mp = round((((time() - $user['last_update']) / $_time) - 1));
if ($_mp > $user['mana']) {
$_mp = $user['mana'] - $user['mp'];
}
$user['mp'] = $user['mp'] + $_mp;
}
$user['last_update'] = time();
}
elseif ($user['last_update'] < (time() - $_time)) {
$user['last_update'] = time();
}
if ($user['hp'] > $user['vit'] * 2) {
$user['hp'] = $user['vit'] * 2;
}
if ($user['hp'] < 0) {
$user['hp'] = 0;
}
if ($user['mp'] > $user['mana']) {
$user['mp'] = $user['mana'];
}
if ($user['mp'] < 0) {
$user['mp'] = 0;
}
db_query('UPDATE `users` SET `last_update` = "'.$user['last_update'].'", `hp` = "'.$user['hp'].'", `mp` = "'.$user['mp'].'" WHERE `id` = "'.$user['id'].'"');
if($user['essence'] > 0) {
$user['str'] += $user['essence'];
$user['vit'] += $user['essence'];
$user['agi'] += $user['essence'];
$user['def'] += $user['essence'];
}
//
//
if($user['last_update'] - $user['duel_last_update'] > (60 * 30)) {
db_query('UPDATE `users` SET `duel_last_update` = "'.($user['duel_last_update'] + (60 * 30)).'",
`duel_fights` = "'.($user['duel_fights'] + (($user['duel_fights'] < 11) ? 1:0)).'",
`duel_changes` = "'.($user['duel_changes'] + (($user['duel_changes'] < 11) ? 1:0)).'" WHERE `id` = "'.$user['id'].'"');
}
/*
if($user['hp'] > $user['vit'] * 2) {
db_query('UPDATE `users` SET `hp` = "'.($user['vit'] * 2).'" WHERE `id` = "'.$user['id'].'"');
}
if($user['hp'] < 0) {
db_query('UPDATE `users` SET `hp` = "0" WHERE `id` = "'.$user['id'].'"');
}
if($user['mp'] > $user['mana']) {
db_query('UPDATE `users` SET `mp` = "'.$user['mana'].'" WHERE `id` = "'.$user['id'].'"');
}
if($user['mp'] < 0) {
db_query('UPDATE `users` SET `mp` = "0" WHERE `id` = "'.$user['id'].'"');
}
*/
$exchange = db_fetch_assoc(db_query('SELECT * FROM `exchange` WHERE `user_id` = '.(int)$user['id'].' LIMIT 1'));
if (!$exchange) {
$exchange = [
'user_id' => (int)$user['id'],
'count' => max(1, (int)$user['level']),
'time' => time(),
];
db_query('INSERT INTO `exchange` (`user_id`,`count`,`time`) VALUES ('.(int)$exchange['user_id'].','.(int)$exchange['count'].','.(int)$exchange['time'].')');
}
$exchangeLevel = max(1, (int)$user['level']);
$exchangeStep = max(1, (int)round(86400 / $exchangeLevel));
$k_point = max(0, intdiv(max(0, time() - (int)$exchange['time']), $exchangeStep));
if ($k_point >= 1) {
$exchange['count'] = (int)$exchange['count'] + $k_point;
$exchange['time'] = time();
db_query('UPDATE `exchange` SET `count` = '.(int)$exchange['count'].', `time` = '.(int)$exchange['time'].' WHERE `user_id` = '.(int)$user['id'].' LIMIT 1');
}
if ((int)$exchange['count'] > $exchangeLevel) {
$exchange['count'] = $exchangeLevel;
$exchange['time'] = time();
db_query('UPDATE `exchange` SET `count` = '.$exchangeLevel.', `time` = '.(int)$exchange['time'].' WHERE `user_id` = '.(int)$user['id'].' LIMIT 1');
}
$clan_memb = db_query('SELECT * FROM `clan_memb` WHERE `user` = "'.$user['id'].'"');
$clan_memb = db_fetch_array($clan_memb);
function clan_buff($i) {
$level=max(0,min(51,(int)$i));
if(function_exists('game_v51_clan_buff_value')) return game_v51_clan_buff_value($level);
return min(400,$level<=3?$level*4:(int)round($level*7.84));
}
if($clan_memb) {
$clan = db_fetch_array(db_query('SELECT * FROM `clans` WHERE `id` = "'.$clan_memb['clan'].'"'));
if($clan_memb['last_update'] <= time()) {
db_query('UPDATE `clan_memb` SET `last_update` = "'.($clan_memb['last_update'] + ((60 * 60) * 24 )).'",
`v` = `v` + 3 WHERE `id` = "'.$clan_memb['id'].'"');
}
$clan_buff = clan_buff($clan['built_1']);
if($clan['built_1'] > 0 && $clan_buff && (int)($clan['built_2_time'] ?? 0) > time()) {
// Статуя указывает бонус К СУММЕ параметров, поэтому не умножаем его в 4 раза.
if(function_exists('game_v51_clan_buff_parts')) {
[$__cbStr,$__cbVit,$__cbAgi,$__cbDef]=game_v51_clan_buff_parts((int)$clan_buff);
} else {
$__q=intdiv((int)$clan_buff,4); $__r=(int)$clan_buff%4;
$__cbStr=$__q+($__r>0?1:0); $__cbVit=$__q+($__r>1?1:0); $__cbAgi=$__q+($__r>2?1:0); $__cbDef=$__q+($__r>3?1:0);
}
$user['str'] += $__cbStr;
$user['vit'] += $__cbVit;
$user['agi'] += $__cbAgi;
$user['def'] += $__cbDef;
}
}
//
//
$ban = db_fetch_array(db_query('SELECT * FROM `ban` WHERE `user` = "'.$user['id'].'"'));
if($ban) {
if($ban['time'] <=time()) {
db_query('DELETE FROM `ban` WHERE `user` = "'.$user['id'].'"');
}
if($ban['time'] > time() && $_SERVER['PHP_SELF'] != '/ban.php') {
header('location: /ban');
exit;
}
}
$premium = db_fetch_array(db_query('SELECT * FROM `premium` WHERE `user` = "'.$user['id'].'"'));
if($premium) {
if($premium['time'] <= time()) {
db_query('UPDATE `users` SET `str` = `str` - 500,
`vit` = `vit` - 500,
`agi` = `agi` - 500,
`def` = `def` - 500 WHERE `id` = ''.$user['id'].''');
db_query('DELETE FROM `premium` WHERE `user` = ''.$user['id'].''');
}
}
//Если расса инрока не совподает с рассой клана, то удоляем игрока из клана
if($clan_memb){
if(!isset($clan) || !$clan) $clan = db_fetch_array(db_query('SELECT * FROM `clans` WHERE `id` = "'.$clan_memb['clan'].'"'));
if($user['r'] != $clan['r'] && (int)($user['access']??0) < 2){
db_query('DELETE FROM `clan_memb` WHERE `clan` = "'.$clan['id'].'" AND `user` = "'.$user['id'].'"');
}
}
}
if (is_array($user) && !empty($user['id'])) {
$clan = $clan ?? null; // safe default only when membership did not load a clan — by Метриум (Стэлп)
if (function_exists('game_apply_trophy_bonus')) { game_apply_trophy_bonus($user); }
// Учёт потраченной боевой энергии для сундуков заданий — by Метриум (Стэлп).
if (function_exists('game_energy_spend') && isset($_GET['attack']) && !isset($GLOBALS['__energy_counted'])) {
$route=(string)parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH);
$energyCosts=['/arena'=>220,'/duel'=>180,'/campaign'=>260,'/coliseum'=>250,'/hunting'=>160,'/undying'=>240,'/league'=>200];
foreach($energyCosts as $prefix=>$cost){ if(str_starts_with($route,$prefix)){ $GLOBALS['__energy_counted']=1; game_energy_spend((int)$user['id'],$cost); break; } }
}
// Коллекции дают бонус К СУММЕ четырёх основных параметров. Старые версии ошибочно
// прибавляли полную сумму к каждому параметру (x4); mode=0 конвертируется один раз.
$oldCollector=(int)($user['bonus_col'] ?? 0);
$newCollector=(int)($user['collector_bonus'] ?? 0);
$collectorMode=(int)($user['collector_bonus_mode'] ?? 0);
if($collectorMode===0 || $oldCollector!==$newCollector){
$newParts=function_exists('game_stat_sum_parts') ? game_stat_sum_parts($newCollector) : [0,0,0,0];
if($collectorMode===0){
// Legacy stored bonus was applied in full to every stat. Remove that exact legacy amount.
$oldParts=[$oldCollector,$oldCollector,$oldCollector,$oldCollector];
}else{
$oldParts=function_exists('game_stat_sum_parts') ? game_stat_sum_parts($oldCollector) : [0,0,0,0];
}
$delta=[]; for($i=0;$i<4;$i++) $delta[$i]=$newParts[$i]-$oldParts[$i];
db_execute('UPDATE `users` SET `bonus_col`=:new,`collector_bonus_mode`=1,`str`=GREATEST(1,`str`+:ds),`vit`=GREATEST(1,`vit`+:dv),`agi`=GREATEST(1,`agi`+:da),`def`=GREATEST(1,`def`+:dd) WHERE `id`=:id',[
'new'=>$newCollector,'ds'=>$delta[0],'dv'=>$delta[1],'da'=>$delta[2],'dd'=>$delta[3],'id'=>(int)$user['id']
]);
foreach(['str','vit','agi','def'] as $i=>$k) $user[$k]=max(1,(int)($user[$k]??0)+$delta[$i]);
$user['bonus_col']=$newCollector; $user['collector_bonus_mode']=1;
}
if (function_exists('game_achievement_v50_sync')) { game_achievement_v50_sync($user); }
/**
* Трофеи
*/
$names = array (0,'Трофей бойца<br/> Сила +50 | Жизнь +50 | Защита +50','Трофей воина<br/> Сила +75 | Защита +75','Трофей избранного<br/> Сила +75 | Жизнь +75 | Защита +75 | Удача +75',
'Трофей идущего к славе<br/> Сила +85 | Жизнь +85 | Защита +85 | Удача +85','Трофей несокрушимогo<br/> Защита +250',
'Трофей силы<br/> Сила +250','Трофей могущества<br/> Мана +500','Трофей титана<br/> Защита +350','Трофей полубога<br/> Сила +300 | Жизнь +300 | Защита +300 | Удача +300');
$quests = array (0,10,20,35,50,220,500,1500,2300,3500);
$undying_kills = array (0,50,200,350,500,2200,5000,7500,8300,10000);
$skill = array (0,10,24,35,50,100,150,200,250,300);
if (isset($user))
{
for ($i =1;$i<10;$i++)
{
if ($user['troph'.$i] == 0)
{
if ((function_exists('game_trophy_requirements_met_v36') ? game_trophy_requirements_met_v36($user,$i) : ($user['undying']>= $undying_kills[$i] && $user['quests']>=$quests[$i] && $user['skill']>=$skill[$i])) && $user['troph'.$i] == 0)
{
if ($i == '1')
{
db_query("UPDATE `users` SET `str`=`str`+'50',`vit`=`vit`+'50',`def`=`def`+'50' WHERE `id`='".$user['id']."'");
}
elseif ($i =='2')
{
db_query("UPDATE `users` SET `str`=`str`+'75',`def`=`def`+'75' WHERE `id`='".$user['id']."'");
}
elseif ($i == '3')
{
db_query("UPDATE `users` SET `str`=`str`+'75',`vit`=`vit`+'75',`def`=`def`+'75',`agi`=`agi`+'75' WHERE `id`='".$user['id']."'");
}
elseif ($i =='4')
{
db_query("UPDATE `users` SET `str`=`str`+'85',`vit`=`vit`+'85',`def`=`def`+'85',`agi`=`agi`+'85' WHERE `id`='".$user['id']."'");
}elseif ($i == '5')
{
db_query("UPDATE `users` SET `def`=`def`+'250' WHERE `id`='".$user['id']."'");
}elseif ($i =='6')
{
db_query("UPDATE `users` SET `str`=`str`+'250' WHERE `id`='".$user['id']."'");
}elseif ($i == '7')
{
db_query("UPDATE `users` SET `mana`=`mana`+'500' WHERE `id`='".$user['id']."'");
}elseif ($i =='8')
{
db_query("UPDATE `users` SET `def`=`def`+'350' WHERE `id`='".$user['id']."'");
}elseif ($i == '9')
{
db_query("UPDATE `users` SET `str`=`str`+'300',`vit`=`vit`+'300',`def`=`def`+'300',`agi`=`agi`+'300' WHERE `id`='".$user['id']."'");
}
db_query("UPDATE `users` SET `troph$i` = '1' WHERE `id`='".$user['id']."' ")or die (db_error());
?>
<div class ='block'/>
<center>
<img src='/images/medals/50x50/<?=$i;?>.png'/><br/>
<?=$names[$i];?>
<br/>
Трофей получен!
</center>
</div>
<?php
}
}
}
}
$stone = db_fetch_array(db_query('SELECT * FROM `stone` WHERE `user` = "'.$user['id'].'"'));
if($stone) {
if($stone['time'] < time()) {
db_query('UPDATE `users` SET `str` = `str` - 0,
`vit` = `vit` - 0,
`agi` = `agi` - 0,
`def` = `def` - 0 WHERE `id` = ''.$user['id'].''');
db_query('DELETE FROM `stone` WHERE `user` = ''.$user['id'].''');
}
}
/*
*
by Метриум (Стэлп)
*
*/
$_belt = db_fetch_array(db_query("SELECT * FROM `belt` WHERE `user` = ".(int)$user['id']));
if (!is_array($_belt)) { $_belt = ['1'=>0,'2'=>0,'3'=>0,'4'=>0,'belt_1'=>0,'belt_2'=>0,'belt_3'=>0,'belt_4'=>0]; }
$__belt_param = array(1 => 'str', 2 => 'vit', 3 => 'agi', 4 => 'def');
for($i = 1; $i <= 4; $i++) {
if((int)($_belt['belt_'.$i] ?? 0) > time()) $user[$__belt_param[$i]] += $user['skill'];
if((int)($_belt['belt_'.$i] ?? 0) > 0 && (int)($_belt['belt_'.$i] ?? 0) < time()) {
db_query("UPDATE `belt` SET `belt_".$i."` = '0' WHERE `user` = ".$user['id']."");
}
}
$_effshop = db_fetch_array(db_query('SELECT * FROM `effshop` WHERE `user` = "'.$user['id'].'"'));
if (!is_array($_effshop)) {
$_effshop = [];
}
if((int)($_effshop['effshop_2'] ?? 0) > time()) $user['str'] += 100;
if((int)($_effshop['effshop_2'] ?? 0) > time()) $user['vit'] += 100;
if((int)($_effshop['effshop_2'] ?? 0) > time()) $user['agi'] += 100;
if((int)($_effshop['effshop_2'] ?? 0) > time()) $user['def'] += 100;
for($i = 1; $i <= 3; $i++) {
if((int)($_effshop['effshop_'.$i] ?? 0) > 0 && (int)($_effshop['effshop_'.$i] ?? 0) < time()) {
db_query("UPDATE `effshop` SET `effshop_".$i."` = '0' WHERE `user` = ".$user['id']."");
}
}
# Parse
# @ void
# Code
$ExpParse = array (0,10,45,90,140,200,325,425,575,750,1000,1500,1700,2100,2600,2955,3566,4254,5450,8900);
if ($user['parse_exp'] >= $ExpParse[$user['parse']])
{
db_query('UPDATE `users` SET
`str` = `str` + 10,
`vit` = `vit` + 10,
`agi` = `agi` + 10,
`def` = `def` + 10,
`parse` = `parse` + 1,
`parse_exp` = "0" WHERE `id` = "'.$user['id'].'"');
?>
</div>
<?php
}
function isMobile() {
return preg_match("/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up.browser|up.link|webos|wos)/i", $_SERVER["HTTP_USER_AGENT"]);
}
$desiredOns = isMobile() ? 0 : 1;
if ((int)($user['ons'] ?? -1) !== $desiredOns) {
db_execute('UPDATE `users` SET `ons`=:ons WHERE `id`=:id',['ons'=>$desiredOns,'id'=>(int)$user['id']]);
$user['ons']=$desiredOns;
}
$prem = db_fetch_assoc(db_query("SELECT * FROM `alex_premium` WHERE `user_id` = ".$user['id'].""));
if(!$prem){
db_query('INSERT INTO `alex_premium` (`user_id`)VALUES('.$user['id'].')');
}
if($user['med'] == 1) {
$user['str'] += 50;
$user['vit'] += 50;
$user['def'] += 50;
}
if($user['med'] == 2) {
$user['str'] += 100;
$user['vit'] += 100;
$user['def'] += 100;
}
if($user['med'] == 3) {
$user['str'] += 200;
$user['vit'] += 200;
$user['def'] += 200;
}
if($user['med'] == 4) {
$user['str'] += 300;
$user['vit'] += 300;
$user['def'] += 300;
}
if($user['med'] == 5) {
$user['str'] += 400;
$user['vit'] += 400;
$user['def'] += 400;
}
if($user['ar_time']<time()){db_query("UPDATE `users` SET `ar_boi`='25',`ar_time`='".(time()+60*60)."' WHERE `id` = ".$user['id']." ");}
if(function_exists('game_v37_repair_saved_state')) game_v37_repair_saved_state($user);
/*Включаем показ ошибок только для админа и меня*/
/*
if($user['id']==18773 || $user['id']==1){
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
}
*/
}
?>