2019-01-11 21:57:15 +00:00
|
|
|
|
<?php
|
2022-08-09 19:57:43 +00:00
|
|
|
|
|
2020-10-28 20:21:08 +00:00
|
|
|
|
namespace Battles;
|
2021-03-14 17:54:13 +00:00
|
|
|
|
|
2022-08-09 19:57:43 +00:00
|
|
|
|
use Battles\Models\Inventory;
|
2021-03-14 17:54:13 +00:00
|
|
|
|
|
2019-01-11 21:57:15 +00:00
|
|
|
|
class InventoryItem extends Item
|
|
|
|
|
{
|
2022-08-09 19:57:43 +00:00
|
|
|
|
private ?string $present;
|
2022-12-16 23:20:43 +00:00
|
|
|
|
private int $ownerId;
|
2021-03-14 17:54:13 +00:00
|
|
|
|
private const TOO_MANY_ITEMS_IN_SLOTS = 'Критическая ошибка: Переполнение слота!';
|
|
|
|
|
private const UNKNOWN_ITEM_TYPE = 'Неизвестный тип предмета!';
|
|
|
|
|
private const REQUIREMENTS_NOT_MET = 'Персонаж не соответствует требованиям!';
|
2019-01-12 09:47:23 +00:00
|
|
|
|
|
2021-03-14 17:54:13 +00:00
|
|
|
|
/**
|
|
|
|
|
* InventoryItem constructor.
|
|
|
|
|
*
|
|
|
|
|
* @param $row
|
|
|
|
|
*/
|
2019-01-12 09:47:23 +00:00
|
|
|
|
public function __construct($row)
|
|
|
|
|
{
|
|
|
|
|
parent::__construct($row);
|
2022-12-16 23:20:43 +00:00
|
|
|
|
$this->ownerId = $row->owner_id;
|
2021-08-20 17:40:06 +00:00
|
|
|
|
$this->present = $row->present;
|
2019-01-12 09:47:23 +00:00
|
|
|
|
}
|
|
|
|
|
|
2019-01-11 21:57:15 +00:00
|
|
|
|
public function printInfo()
|
|
|
|
|
{
|
2021-08-29 22:34:50 +00:00
|
|
|
|
echo $this->getAllInfo();
|
2020-07-21 15:03:46 +00:00
|
|
|
|
if ($this->present) {
|
2021-08-20 17:40:06 +00:00
|
|
|
|
echo "<p style='color: maroon; font-style: italic'>Это подарок от $this->present. Вы не можете передать его кому-либо ещё.</p>";
|
2020-07-21 15:03:46 +00:00
|
|
|
|
}
|
2019-01-11 21:57:15 +00:00
|
|
|
|
}
|
|
|
|
|
|
2019-01-11 22:18:18 +00:00
|
|
|
|
public function printImage()
|
|
|
|
|
{
|
2022-12-16 23:20:43 +00:00
|
|
|
|
if (in_array($this->type, range(1, 12))) {
|
2021-03-10 21:43:48 +00:00
|
|
|
|
echo <<<HTML
|
2022-12-16 23:20:43 +00:00
|
|
|
|
<a href=/main.php?edit=1&dress=$this->id title='Надеть'>
|
2022-01-26 23:15:33 +00:00
|
|
|
|
<img src="/i/sh/$this->image" class="item-wrap-normal" alt="">
|
2021-03-10 21:43:48 +00:00
|
|
|
|
</a>
|
|
|
|
|
HTML;
|
2020-07-21 15:03:46 +00:00
|
|
|
|
} else {
|
2021-03-10 21:43:48 +00:00
|
|
|
|
echo <<<IMG
|
2022-01-26 23:15:33 +00:00
|
|
|
|
<img src="/i/sh/$this->image" class="item-wrap-normal" alt="">
|
2021-03-10 21:43:48 +00:00
|
|
|
|
IMG;
|
2019-01-11 22:30:12 +00:00
|
|
|
|
}
|
2019-01-11 22:18:18 +00:00
|
|
|
|
}
|
2021-01-28 23:58:07 +00:00
|
|
|
|
|
2022-08-09 19:57:43 +00:00
|
|
|
|
private function dressStatsChecks(): bool
|
2021-03-14 17:54:13 +00:00
|
|
|
|
{
|
2022-12-16 23:20:43 +00:00
|
|
|
|
$checkStats = new UserStats($this->ownerId);
|
2022-01-25 16:16:09 +00:00
|
|
|
|
$stat = $checkStats->getFullStats();
|
2022-12-16 23:20:43 +00:00
|
|
|
|
return $this->needStrength > $stat->strength
|
|
|
|
|
|| $this->needDexterity > $stat->dexterity
|
|
|
|
|
|| $this->needIntuition > $stat->intuition
|
|
|
|
|
|| $this->needEndurance > $stat->endurance
|
|
|
|
|
|| $this->needIntelligence > $stat->intelligence
|
|
|
|
|
|| $this->needWisdom > $stat->wisdom;
|
2021-03-14 17:54:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Одевание предмета из инвентаря в слот.
|
|
|
|
|
* @return bool|string
|
|
|
|
|
*/
|
|
|
|
|
public function dressItem()
|
|
|
|
|
{
|
|
|
|
|
$itemInSlot = [];
|
|
|
|
|
if ($this->dressStatsChecks()) {
|
|
|
|
|
return self::REQUIREMENTS_NOT_MET;
|
|
|
|
|
}
|
|
|
|
|
// считаем сколько ОДЕТЫХ предметов в слоте в который мы хотим одеть предмет. 1=просто вещь 1-3=шашни с кольцами
|
|
|
|
|
// Count добавленный в первый запрос возвращает одну строку в любом случае.
|
|
|
|
|
// fetch возвращает одну строку в любом случае.
|
2022-12-16 23:20:43 +00:00
|
|
|
|
$weared = Inventory::getDressed($this->type, $this->ownerId);
|
|
|
|
|
$wearedCount = Inventory::countDressed($this->type, $this->ownerId);
|
2021-03-14 17:54:13 +00:00
|
|
|
|
// Если в слоте есть предмет(ы), забиваем их массив одетых в слот предметов.
|
|
|
|
|
if ($wearedCount) {
|
|
|
|
|
foreach ($weared as $item) {
|
|
|
|
|
$itemInSlot[] = $item->dressed_slot;
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-12-16 23:20:43 +00:00
|
|
|
|
if (in_array($this->type, [
|
|
|
|
|
self::TYPE_HELMET, self::TYPE_ARMOR, self::TYPE_LEGS, self::TYPE_BOOTS,
|
|
|
|
|
self::TYPE_GLOVES, self::TYPE_WEAPON, self::TYPE_SHIELD, self::TYPE_BELT,
|
|
|
|
|
self::TYPE_AMULET,
|
2021-03-14 17:54:13 +00:00
|
|
|
|
])) {
|
|
|
|
|
//работаем с нормальными слотами
|
|
|
|
|
if ($wearedCount->c == 1) {
|
|
|
|
|
//если слот занят, снимаем старый предмет и одеваем новый предмет
|
2022-12-16 23:20:43 +00:00
|
|
|
|
Inventory::undressOne($itemInSlot[0], $this->ownerId);
|
|
|
|
|
Inventory::dressOne($this->id, $this->ownerId);
|
2021-03-14 17:54:13 +00:00
|
|
|
|
} elseif (!$wearedCount->c) {
|
|
|
|
|
//если слот пуст, одеваем новый предмет
|
2022-12-16 23:20:43 +00:00
|
|
|
|
Inventory::dressOne($this->id, $this->ownerId);
|
2021-03-14 17:54:13 +00:00
|
|
|
|
} else {
|
|
|
|
|
/* проверка на переполнение слотов */
|
|
|
|
|
$error = self::TOO_MANY_ITEMS_IN_SLOTS;
|
2022-12-16 23:20:43 +00:00
|
|
|
|
DressedItems::undressAllItems($this->ownerId);
|
2021-03-14 17:54:13 +00:00
|
|
|
|
}
|
2022-12-16 23:20:43 +00:00
|
|
|
|
} elseif ($this->type == self::TYPE_RING) {
|
2021-03-14 17:54:13 +00:00
|
|
|
|
// работаем с кольцами
|
|
|
|
|
if ($wearedCount->c < 3) {
|
|
|
|
|
// Сравниваем массив колец и массив слотов для колец.
|
|
|
|
|
$emptyRingSlots = array_diff([9, 10, 11], $itemInSlot);
|
|
|
|
|
// Сортируем массив свободных слотов по возрастанию.
|
|
|
|
|
sort($emptyRingSlots);
|
|
|
|
|
// Одеваем предмет в первый свободный слот.
|
2022-12-16 23:20:43 +00:00
|
|
|
|
Inventory::dressOneToSlot($this->id, $emptyRingSlots[0]);
|
2021-03-14 17:54:13 +00:00
|
|
|
|
} elseif ($wearedCount->c == 3) {
|
|
|
|
|
// Cнимаем предмет из последнего слота 11 и одеваем новый предмет
|
2022-12-16 23:20:43 +00:00
|
|
|
|
Inventory::changeRings($this->id);
|
2021-03-14 17:54:13 +00:00
|
|
|
|
} else {
|
|
|
|
|
/* проверка на переполнение слотов */
|
|
|
|
|
$error = self::TOO_MANY_ITEMS_IN_SLOTS;
|
2022-12-16 23:20:43 +00:00
|
|
|
|
DressedItems::undressAllItems($this->ownerId);
|
2021-03-14 17:54:13 +00:00
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
$error = self::UNKNOWN_ITEM_TYPE;
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-20 17:40:06 +00:00
|
|
|
|
return $error ?? true;
|
2021-03-14 17:54:13 +00:00
|
|
|
|
}
|
2021-05-12 19:02:05 +00:00
|
|
|
|
|
2022-08-09 19:57:43 +00:00
|
|
|
|
// Выбрасываем вещь.
|
|
|
|
|
public function drop(): string
|
2021-05-12 19:02:05 +00:00
|
|
|
|
{
|
2022-12-16 23:20:43 +00:00
|
|
|
|
if (empty($this->id)) {
|
2022-08-09 19:57:43 +00:00
|
|
|
|
return 'Ошибка: предмет не найден!';
|
|
|
|
|
}
|
2022-12-16 23:20:43 +00:00
|
|
|
|
if (Inventory::isWeared($this->id)) {
|
2022-08-09 19:57:43 +00:00
|
|
|
|
return 'Ошибка: нельзя выбросить одетый предмет!';
|
|
|
|
|
}
|
2022-12-16 23:20:43 +00:00
|
|
|
|
Inventory::destroyItem($this->id, $this->ownerId);
|
|
|
|
|
GameLogs::addUserLog(User::getInstance()->getId(), User::getInstance()->getLogin() . ' выбросил предмет ' . $this->name . ' id:(cap' . $this->id . ')');
|
2022-08-09 19:57:43 +00:00
|
|
|
|
return 'Предмет ' . $this->name . ' выброшен.';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Снятие всех предметов, которые не подходят по статам. */
|
|
|
|
|
public static function autoDrop()
|
|
|
|
|
{
|
2022-12-16 23:20:43 +00:00
|
|
|
|
$di = new DressedItems(User::getInstance()->getId());
|
|
|
|
|
foreach ($di->getItemsInSlots() as $dressedItem) {
|
|
|
|
|
$itm = new self($dressedItem);
|
|
|
|
|
if (!$itm->dressStatsChecks()) {
|
|
|
|
|
$di->undressItem($dressedItem->dressed_slot);
|
2022-08-09 19:57:43 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2021-05-12 19:02:05 +00:00
|
|
|
|
}
|
2021-08-27 15:55:18 +00:00
|
|
|
|
|
|
|
|
|
/** Надеюсь, временная заглушка, которая объединяет get_meshok() и другую выдачу одной строкой.
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
public static function getWeightData(): string
|
|
|
|
|
{
|
2022-08-09 19:57:43 +00:00
|
|
|
|
$all = Inventory::getWeight(User::getInstance()->getId());
|
|
|
|
|
$max = User::getInstance()->stats()->getMaxWeight();
|
|
|
|
|
$css = $all > $max ? ' style="color:maroon;"' : '';
|
|
|
|
|
return "<span$css>$all / $max</span>";
|
2021-08-27 15:55:18 +00:00
|
|
|
|
}
|
2022-12-16 23:20:43 +00:00
|
|
|
|
}
|