Вход Регистрация
Файл: pages/economy/shop.php
Строк: 315
<?php
// Physical module map v50.6: public URL stays clean while code lives in /pages.
if (!defined('GAME_ROOT')) define('GAME_ROOT'dirname(__DIR__2));
chdir(GAME_ROOT);
if (
PHP_SAPI !== 'cli') { $_SERVER['PHP_SELF']='/shop.php'$_SERVER['SCRIPT_NAME']='/shop.php'; }

/* Обновление игры под PHP 8.4 / PDO и усиление безопасности: by Метриум (Стэлп) */
include './system/common.php';
include 
'./system/functions.php';
include 
'./system/user.php';
include 
'./system/menu.php';
if(!
$user){ header('location: /'); exit; }

function 
shop_add_inventory_item_v40(int $uid,array $shop): int {
    
/*
     * Покупка снаряжения: by Метриум (Стэлп)
     * Используем только исторические обязательные поля таблицы inv. Значения place/equip/new/rune/smith
     * берутся из DEFAULT production-схемы. Не полагаемся на lastInsertId(): на старых БД/миграциях он
     * мог быть ненадёжным, поэтому после INSERT находим реально созданную строку по владельцу и вещи.
     */
    
db_prepare('INSERT INTO `inv` (`user`,`item`,`quality`,`bonus`,`_str`,`_vit`,`_agi`,`_def`,`place`) VALUES (:u,:i,:q,:b,:s,:v,:a,:d,:place)',[
        
'u'=>$uid,'i'=>(int)$shop['id'],'q'=>(int)$shop['quality'],'b'=>(int)$shop['bonus'],
        
's'=>(int)$shop['_str'],'v'=>(int)$shop['_vit'],'a'=>(int)$shop['_agi'],'d'=>(int)$shop['_def'],'place'=>'0'
    
]);

    
$created=db_fetch_one('SELECT `id` FROM `inv` WHERE `user`=:u AND `item`=:i AND `quality`=:q AND `equip`=0 AND `place`=:place ORDER BY `id` DESC LIMIT 1',[
        
'u'=>$uid,'i'=>(int)$shop['id'],'q'=>(int)$shop['quality'],'place'=>'0'
    
]);
    
$id=(int)($created['id'] ?? 0);
    if(
$id<=0) throw new RuntimeException('Не удалось добавить предмет в сумку.');
    return 
$id;
}

function 
shop_bag_free_v38(array $user): int {
    
$cap=max(1,(int)($user['inv'] ?? 20));
    
$used=(int)(db_result(db_query('SELECT COUNT(*) FROM `inv` WHERE `place`="0" AND `equip`="0" AND `user`="'.(int)$user['id'].'"'),0) ?: 0);
    return 
max(0,$cap-$used);
}

$title='Магазин снаряжения';
$errors=[];
include 
'./system/h.php';
$skidka=db_fetch_array(db_query('SELECT * FROM `skilka` WHERE `id`="4"')) ?: ['zena'=>0];
if(!
is_array($skidka) || (int)($skidka['time']??0)<=time()) $skidka=['zena'=>0,'time'=>0];
$sk=(float)($skidka['zena'] ?? 0);

$buy_complect=(int)_num($_GET['buy_complect'] ?? 0);
if(
$buy_complect){
    try{
        
$complect=db_fetch_one('SELECT * FROM `complects` WHERE `id`=:id',['id'=>$buy_complect]);
        if(!
$complect) throw new RuntimeException('Комплект не найден.');
        
$needSkill=[1=>1,2=>10,3=>24,4=>48,5=>200,6=>250,7=>10][(int)$complect['quality']] ?? PHP_INT_MAX;
        if((int)
$user['skill']<$needSkill) throw new RuntimeException('Недостаточно мастерства для этого комплекта.');
        if(
shop_bag_free_v38($user)<8) throw new RuntimeException('В сумке недостаточно места для 8 вещей комплекта.');

        
$parts=[]; $cost=0.0;
        for(
$w=1;$w<=8;$w++){
            
$part=db_fetch_one('SELECT * FROM `shop` WHERE `id`=:id',['id'=>(int)$complect['w_'.$w]]);
            if(!
$part) throw new RuntimeException('Одна из вещей комплекта отсутствует в магазине.');
            
$parts[]=$part;
            
$cost += game_shop_item_price($part,$sk,0);
        }
        if(
$clan_memb && $clan && (int)$clan['build_act']>time()) $cost -= (int)$clan['build_4']*2;
        
$cost=max(10,min(4000,(int)ceil($cost)));

        
$pdo=db_pdo(); $pdo->beginTransaction();
        
$debit=db_prepare('UPDATE `users` SET `g`=`g`-:cost_spend WHERE `id`=:uid AND `g`>=:cost_check',['cost_spend'=>$cost,'uid'=>(int)$user['id'],'cost_check'=>$cost]);
        if(
$debit->rowCount()!==1) throw new RuntimeException('Недостаточно золота для покупки комплекта.');
        
$ids=[];
        foreach(
$parts as $part$ids[]=shop_add_inventory_item_v40((int)$user['id'],$part);
        if(
count($ids)!==8) throw new RuntimeException('Комплект добавлен не полностью.');
        
$pdo->commit();
        
$_SESSION['ok']='Комплект куплен: 8 вещей добавлены в сумку.';
    }catch(
Throwable $e){
        if(
db_pdo()->inTransaction()) db_pdo()->rollBack();
        if(
function_exists('app_log_write')) app_log_write('SHOP','Set purchase failed',['type'=>get_class($e),'error'=>$e->getMessage()]);
        
$_SESSION['err']=$e instanceof PDOException 'Не удалось купить комплект. Ошибка базы записана в журнал.' : ($e->getMessage() ?: 'Не удалось купить комплект.');
    }
    
header('location: /inv/bag/'); exit;
}

$buy_item=(int)_num($_GET['buy_item'] ?? 0);
if(
$buy_item){
    try{
        
$itemshop=db_fetch_one('SELECT * FROM `shop` WHERE `id`=:id',['id'=>$buy_item]);
        if(!
$itemshop) throw new RuntimeException('Вещь не найдена в магазине.');
        if(
shop_bag_free_v38($user)<1) throw new RuntimeException('Сумка заполнена.');
        
$flat=($clan_memb && $clan && (int)$clan['build_act']>time()) ? (int)$clan['build_4']*0;
        
$cost=game_shop_item_price($itemshop,$sk,$flat);

        
$pdo=db_pdo(); $pdo->beginTransaction();
        
$debit=db_prepare('UPDATE `users` SET `g`=`g`-:cost_spend WHERE `id`=:uid AND `g`>=:cost_check',['cost_spend'=>$cost,'uid'=>(int)$user['id'],'cost_check'=>$cost]);
        if(
$debit->rowCount()!==1) throw new RuntimeException('Недостаточно золота для покупки.');
        
$newId=shop_add_inventory_item_v40((int)$user['id'],$itemshop);
        
$check=db_fetch_one('SELECT `id` FROM `inv` WHERE `id`=:id AND `user`=:uid',['id'=>$newId,'uid'=>(int)$user['id']]);
        if(!
$check) throw new RuntimeException('Купленная вещь не появилась в сумке.');
        
$pdo->commit();
        
$visible=db_fetch_one('SELECT `id` FROM `inv` WHERE `id`=:id AND `user`=:uid AND `equip`=0 AND `place`=:place',['id'=>$newId,'uid'=>(int)$user['id'],'place'=>'0']);
        if(!
$visible) throw new RuntimeException('Вещь создана, но не находится в сумке.');
        
$_SESSION['ok']='Вещь куплена и добавлена в сумку.';
        
$_SESSION['shop_new_item_id']=$newId;
    }catch(
Throwable $e){
        if(
db_pdo()->inTransaction()) db_pdo()->rollBack();
        if(
function_exists('app_log_write')) app_log_write('SHOP','Item purchase failed',['type'=>get_class($e),'error'=>$e->getMessage()]);
        
$_SESSION['err']=$e instanceof PDOException 'Не удалось купить вещь. Ошибка базы записана в журнал.' : ($e->getMessage() ?: 'Не удалось купить вещь.');
    }
    
header('location: /inv/bag/'); exit;
}

$quality _string(_num($_GET['quality'] ?? 0));
if(
$quality) {

  if(
$quality == && $user['skill'] < OR $quality == && $user['skill'] < 10 OR $quality == && $user['skill'] < 24 OR $quality == && $user['skill'] < 48 OR $quality == && $user['skill'] < 200 OR $quality == && $user['skill'] < 250) {
    
      
header('location: /shop/');
      exit;
    
  }

  
$q db_query('SELECT * FROM `complects` WHERE `quality` = ''.$quality.''');    
  while(
$row db_fetch_array($q)) {
echo
'<div class='main'>';
    echo 
'<div class='menuList'><li> <a href='/complect/'.$row['id'].'/'><img src='/images/icon/quality/'.$row['quality'].'.png' alt='*'/>'.$row['name'].'</a></li></small>
 
 <div class='
main' align='center'>
 <div class="complects_bg">
    <a href='
/complect/'.$row['id'].'/'><img src='/manekenImage/'.$user['sex'].'/'.$row['w_1'].'/'.$row['w_2'].'/'.$row['w_3'].'/'.$row['w_4'].'/'.$row['w_5'].'/'.$row['w_6'].'/'.$row['w_7'].'/'.$row['w_8'].'/'/></a>
  
<div class='
dot-line'></div></div></div></div></div></div>';


      
  }

 echo
'<div class='main'><div class='menuList'><li><a href='/shop/'><img src='/images/icon/equip.png' alt=''/>Магазин снаряжения</a></li></div></div>'

}else{
?>

<div class="block_zero center blue">Лучшее снаряжение только тут!</div>
<div class="mini-line"></div>
<div class="center"><div class="block_zero"><img src="/images/town/hd/shop.jpg" alt="" width="100%"></div></div>

 <?php
if($user['skill'] > 249) {
echo 
'
<div class="mini-line"></div>
<div class="menuList">
<li class="original">
<a class="white" href="/shop/6/"><img src="/images/icon/grade/big/6.png" alt="" style="float:left;margin-right:3px;margin-top:3px;" height="30" width="30"><img src="/images/icon/quality/6.png" alt=""><span class="quality-6">Титанические вещи</span>
<br>
<span class="medium"><img src="/images/icon/skill.png" alt="">Мастерство: 250</span><div style="clear:both;"></div></a>
</li>
</div>
'
;
}

if(
$user['skill'] > 199) {
echo 
'
<div class="mini-line"></div>
<div class="menuList">
<li class="original">
<a class="white" href="/shop/5/"><img src="/images/icon/grade/big/5.png" alt="" style="float:left;margin-right:3px;margin-top:3px;" height="30" width="30"><img src="/images/icon/quality/5.png" alt=""><span class="quality-5">Божественные вещи</span>
<br>
<span class="medium"><img src="/images/icon/skill.png" alt="">Мастерство: 200</span><div style="clear:both;"></div></a>
</li>
</div>
'
;
}

if(
$user['skill'] > 47) {
echo 
'
<div class="mini-line"></div>
<div class="menuList">
<li class="original">
<a class="white" href="/shop/4/"><img src="/images/icon/grade/big/4.png" alt="" style="float:left;margin-right:3px;margin-top:3px;" height="30" width="30"><img src="/images/icon/quality/4.png" alt=""><span class="quality-4">Легендарные вещи</span>
<br>
<span class="medium"><img src="/images/icon/skill.png" alt="">Мастерство: 48</span><div style="clear:both;"></div></a></li>
</div>
'
;
}

if(
$user['skill'] > 23) {
echo 
'
<div class="mini-line"></div>
<div class="menuList">
<li class="original">
<a class="white" href="/shop/3/"><img src="/images/icon/grade/big/3.png" alt="" style="float:left;margin-right:3px;margin-top:3px;" height="30" width="30"><img src="/images/icon/quality/3.png" alt=""><span class="quality-3">Эпические вещи</span>
<br>
<span class="medium"><img src="/images/icon/skill.png" alt="">Мастерство: 24</span><div style="clear:both;"></div></a></li>
</div>
'
;
}

if(
$user['skill'] > 9) {
echo 
'
<div class="mini-line"></div>
<div class="menuList">
<li class="original">
<a class="white" href="/shop/2/"><img src="/images/icon/grade/big/2.png" alt="" style="float:left;margin-right:3px;margin-top:3px;" height="30" width="30"><img src="/images/icon/quality/2.png" alt=""><span class="quality-2">Редкие вещи</span>
<br>
<span class="medium"><img src="/images/icon/skill.png" alt="">Мастерство: 10</span><div style="clear:both;"></div></a></li>
</div>
'
;
}

if(
$user['skill'] > 0) {
echo 
'
<div class="mini-line"></div>
<div class="menuList">
<li class="original">
<a class="white" href="/shop/1/"><img src="/images/icon/grade/big/1.png" alt="" style="float:left;margin-right:3px;margin-top:3px;" height="30" width="30"><img src="/images/icon/quality/1.png" alt=""><span class="quality-1">Обычные вещи</span>
<br>
<span class="medium"><img src="/images/icon/skill.png" alt="">Мастерство: 1</span><div style="clear:both;"></div></a></li>
</div>
'
;
}

echo 
'
<div class="mini-line"></div>
<div class="block_zero center">

</div>

'
;
if(
$user['login'] == "DarksLight2"){
?>
<div class="block_zero center"><span class="dgreen">Собери свой уникальный комплект!</span><div class="mb10"></div><a class="btn" href="/maneken"><span class="end"><span class="label">Примерочная</span></span></a></div>
<div class="mini-line"></div>
<?php
}
echo 
'
<div class="block_zero">
<img src="/images/icon/skill.png" alt=""> Мастерство: <b>'
.$user['skill'].'</b>
<ul class="hint">
<li>Мастерство можно повысить, прокачивая параметры в <img src="/images/icon/train.png" alt=""> <a href="/train/">Тренировке</a></li>
</ul>
</div>
'
;
}
include 
'./system/f.php';
?>
Онлайн: 3
Реклама