owner_id = $row->owner_id; $this->present = $row->present; } public function printInfo() { echo $this->getAllInfo(); if ($this->present) { echo "
Это подарок от $this->present. Вы не можете передать его кому-либо ещё.
"; } } public function printImage() { if (in_array($this->item_type, range(1, 12))) { echo <<item_id title='Надеть'> HTML; } else { echo << IMG; } } public function printControls() { // Для кнопок управления под картинкой. } private function dressStatsChecks(): bool { $checkStats = new UserStats($this->owner_id); $stat = $checkStats->getFullStats(); return $this->need_strength > $stat->strength || $this->need_dexterity > $stat->dexterity || $this->need_intuition > $stat->intuition || $this->need_endurance > $stat->endurance || $this->need_intelligence > $stat->intelligence || $this->need_wisdom > $stat->wisdom; } /** * Одевание предмета из инвентаря в слот. * @return bool|string */ public function dressItem() { $itemInSlot = []; if ($this->dressStatsChecks()) { return self::REQUIREMENTS_NOT_MET; } // считаем сколько ОДЕТЫХ предметов в слоте в который мы хотим одеть предмет. 1=просто вещь 1-3=шашни с кольцами // Count добавленный в первый запрос возвращает одну строку в любом случае. // fetch возвращает одну строку в любом случае. $weared = Inventory::getDressed($this->item_type, $this->owner_id); $wearedCount = Inventory::countDressed($this->item_type, $this->owner_id); // Если в слоте есть предмет(ы), забиваем их массив одетых в слот предметов. if ($wearedCount) { foreach ($weared as $item) { $itemInSlot[] = $item->dressed_slot; } } if (in_array($this->item_type, [ self::ITEM_TYPE_HELMET, self::ITEM_TYPE_ARMOR, self::ITEM_TYPE_LEGS, self::ITEM_TYPE_BOOTS, self::ITEM_TYPE_GLOVES, self::ITEM_TYPE_WEAPON, self::ITEM_TYPE_SHIELD, self::ITEM_TYPE_BELT, self::ITEM_TYPE_AMULET, ])) { //работаем с нормальными слотами if ($wearedCount->c == 1) { //если слот занят, снимаем старый предмет и одеваем новый предмет Inventory::undressOne($itemInSlot[0], $this->owner_id); Inventory::dressOne($this->item_id, $this->owner_id); } elseif (!$wearedCount->c) { //если слот пуст, одеваем новый предмет Inventory::dressOne($this->item_id, $this->owner_id); } else { /* проверка на переполнение слотов */ $error = self::TOO_MANY_ITEMS_IN_SLOTS; DressedItems::undressAllItems($this->owner_id); } } elseif ($this->item_type == self::ITEM_TYPE_RING) { // работаем с кольцами if ($wearedCount->c < 3) { // Сравниваем массив колец и массив слотов для колец. $emptyRingSlots = array_diff([9, 10, 11], $itemInSlot); // Сортируем массив свободных слотов по возрастанию. sort($emptyRingSlots); // Одеваем предмет в первый свободный слот. Inventory::dressOneToSlot($this->item_id, $emptyRingSlots[0]); } elseif ($wearedCount->c == 3) { // Cнимаем предмет из последнего слота 11 и одеваем новый предмет Inventory::changeRings($this->item_id); } else { /* проверка на переполнение слотов */ $error = self::TOO_MANY_ITEMS_IN_SLOTS; DressedItems::undressAllItems($this->owner_id); } } else { $error = self::UNKNOWN_ITEM_TYPE; } return $error ?? true; } // Выбрасываем вещь. public function drop(): string { if (empty($this->item_id)) { return 'Ошибка: предмет не найден!'; } if (Inventory::isWeared($this->item_id)) { return 'Ошибка: нельзя выбросить одетый предмет!'; } Inventory::destroyItem($this->item_id, $this->owner_id); GameLogs::addUserLog(User::getInstance()->getId(), User::getInstance()->getLogin() . ' выбросил предмет ' . $this->name . ' id:(cap' . $this->item_id . ')'); return 'Предмет ' . $this->name . ' выброшен.'; } /** Снятие всех предметов, которые не подходят по статам. */ public static function autoDrop() { $DI = new DressedItems(User::getInstance()->getId()); foreach ($DI->getItemsInSlots() as $dressedItem) { $ITM = new self($dressedItem); if (!$ITM->dressStatsChecks()) { $DI->undressItem($dressedItem->dressed_slot); } } } /** Надеюсь, временная заглушка, которая объединяет get_meshok() и другую выдачу одной строкой. * @return string */ public static function getWeightData(): string { $all = Inventory::getWeight(User::getInstance()->getId()); $max = User::getInstance()->stats()->getMaxWeight(); $css = $all > $max ? ' style="color:maroon;"' : ''; return "$all / $max"; } }