Файл: 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']*2 : 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 == 1 && $user['skill'] < 1 OR $quality == 2 && $user['skill'] < 10 OR $quality == 3 && $user['skill'] < 24 OR $quality == 4 && $user['skill'] < 48 OR $quality == 5 && $user['skill'] < 200 OR $quality == 6 && $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';
?>