info['id']; $cols = count($itemIds); $check = Db::getValue( 'select count(*) from items_users where item_id in (?) and uid = ? and (`delete` = 0 or `delete` = 1000)', [implode(',', $itemIds), $uid] ); if ($cols === $check) { return []; } $arr = $itemIds; $query = 'select item_id from (select ' . $arr[0] . ' item_id'; $arr[0] = ''; $query .= implode(' union select ', $arr); $query .= ') params left join items_users using (item_id) where items_users.item_id is null '; $query .= 'and uid = ? and (`delete` = 0 or `delete` = 1000)'; //select item_id from (select 1 item_id union select 2 union select 3) params left join items_users using (item_id) where items_users.item_id is null return Db::getColumn($query, [$uid]); } public static function getNamesByIds(array $ids, string $separator = ', '): string { $namesArray = Db::getColumn('select name from items_main where id in (?)', [$ids]); return implode($separator, $namesArray); } //Удаление определенного типа предметов /** Удаление предметов из инвентаря активного игрока. * @param int $id id предмета. * @param int $coldel количество предметов. * @return void */ public static function deleteItemsById(int $id, int $coldel = 1): void { Db::sql( 'delete from items_users where id in (select id from items_users where item_id = ? and uid = ? and (`delete` = 0 or `delete` = 1000) order by inGroup desc limit ?)', [$id, User::start()->info['id'], $coldel] ); } //вес предметов у юзера public static function inventoryWeightAndItemQuantity(): array { $uid = User::start()->info['id']; $stats = User::start()->stats; return [ 'now' => Db::getValue('select sum(massa) from items_users left join items_main on item_id = items_main.id where uid = ? and (`delete` = 0 or (`delete` = 1000 and inGroup > 0)) and inShop = 0 and inOdet = 0', [$uid]), 'max' => 40 + (($stats['os7'] ?? 0) * 10) + $stats['s4'] + $stats['maxves'] + $stats['s1'] * 4, 'items' => Db::getValue('select count(*) from items_users where uid = ? and `delete` = 0 and inShop = 0 and inOdet = 0', [$uid]), ]; } /** Выбор предмета в инвентаре. * @param int $itemId * @param int $ownerId * @param bool $includeWeared * @return array */ public static function getOwnedItemById(int $itemId, int $ownerId, bool $includeWeared = false): array { $iw = $includeWeared ? 1 : 0; return Db::getRow("select * from items_users left join items_main on item_id = items_main.id where uid = ? and items_users.id = ? and `delete` = 0 and inOdet = $iw and inShop = 0 and is_arrested = 0", [$ownerId, $itemId]); } public static function delete(int $id): void { Db::sql('delete from items_users where id = ?', [$id]); } public static function getDressedEkrTotalPrice($uid) { return Db::getValue('select sum(2price) from items_users where inOdet > 0 and uid = ?', [$uid]); } public static function getWearedItems(int $userId): array { return Db::getRows('select * from items_users where inOdet > 0 and uid = ?', [$userId]); } /** Порча предмета * @param $it * @param $tp * @param $uid * @param $id2 * @param $type * @param $name * @return void */ public static function itemDecay($it, $tp, $uid, $id2, $type, $name): void { if ($it == 0) { return; } if ($id2 == 4708) { $tp = 1; } $sql = 'delete from items_users where id = ?'; $sql2 = 'update items_users set inGroup = 0, timeOver = unix_timestamp() where inGroup = ?'; $args = [$it]; if ($uid != 0) { $sql .= 'and uid = ?'; $sql2 .= 'and uid = ?'; $args[] = $uid; } Db::sql($sql, $args); Db::sql($sql2, $args); Delo::add(2, 'system.inventory', $uid, "Предмет $name [id:$it] был испорчен."); if ($tp == 0) { return; } //Добавляем испорченый предмет в инвентарь, в зависимости от типа if ($id2 > 0) { $moddata = '|noodet=1'; if ($id2 == 4708) { $moddata = '|notransfer=1|nosale=1'; } ItemsModel::addItem($id2, $uid, $moddata); } elseif ($type == 30) { //испорченный эликсир $id2 = 4036; $moddata = "|renameadd=$name|noodet=1"; ItemsModel::addItem($id2, $uid, $moddata); } } public static function addItem($id, $uid, $md = null, $dn = null, $mxiznos = null, $nosudba = null, $plavka = null) { $user = User::start(); $rt = -1; $i = Db::getRow('select * from items_main where id = ?', [$id]); if (isset($i['id'])) { $d = Db::getRow('select id, items_id, data from items_main_data where items_id = ?', [$i['id']]); //новая дата $data = $d['data']; if ($i['ts'] > 0 && $nosudba == null) { $ui = Db::getValue('select login from users where id = ?', [$uid]); $data .= '|sudba=' . $ui; } if ($md != null) { $data .= $md; $data = Conversion::dataStringToArray($data); // Если в функции имеются две одинаковых константы SROK? $data = Conversion::arrayToDataString($data); } //предмет с настройками из подземелья if ($dn != null && $dn['dn_delete'] > 0) { $i['dn_delete'] = 1; } if ($mxiznos > 0) { $i['iznosMAXi'] = $mxiznos; } $args = [ $i['overTypei'] ?? 0, $i['id'], $uid, $data, $i['iznosMAXi'], $i['magic_inci'], $i['dn_delete'] ?? 0, ]; Db::sql( 'insert into items_users (overType, item_id, uid, data, iznosMAX, magic_inc, lastUPD, time_create, dn_delete) values (?,?,?,?,?,?,unix_timestamp(),unix_timestamp(),?)', $args ); $rt = Db::lastInsertId() ?? 0; if ($rt !== 0) { Db::sql('update items_users set dn_delete = 1 where id = ? and data like ?', [$rt, '%dn_delete=%']); if ($uid == $user->info['id']) { $user->stack($rt); } $ads = ''; if ($plavka != null) { $ads = 'Расплавлен предмет : [' . $plavka . ']'; } //Записываем в личное дело что предмет получен Delo::add(1, 'additems', $uid, 'Получен предмет «' . $i['name'] . '» [id:' . $i['iid'] . ']' . $ads); } } return $rt; } public static function addIznos(int $itemId): void { Db::sql('update items_users set iznosNOW = iznosNOW + 1 where id = ?', [$itemId]); } public static function itemsX(int $id, $uid = null, $item_id = null): bool|int { //fixme какая-то дичь тут. $item = Db::getRow('select uid, item_id, ingroup, inshop from items_users where id = ?', [$id]); if ($uid) { $item['uid'] = $uid; } if ($item_id) { $item['item_id'] = $item_id; } return Db::getValue( 'select count(id) from items_users where inshop = ? and item_id = ? and uid = ? and ingroup = ?', [$item['inShop'], $item['item_id'], $item['uid'], $item['ingroup']] ); } }