2019-01-11 21:57:15 +00:00
< ? php
2020-10-28 20:21:08 +00:00
namespace Battles ;
2021-03-14 17:54:13 +00:00
use Battles\Database\DBPDO ;
2019-01-11 21:57:15 +00:00
class InventoryItem extends Item
{
2019-01-12 09:47:23 +00:00
private $present ;
2021-03-14 17:54:13 +00:00
private $owner_id ;
2021-05-12 19:02:05 +00:00
private $db ;
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 );
2021-03-14 17:54:13 +00:00
$this -> owner_id = $row -> owner_id ;
2021-05-12 19:02:05 +00:00
$this -> db = DBPDO :: INIT ();
2019-01-12 09:47:23 +00:00
}
2019-01-11 21:57:15 +00:00
public function printInfo ()
{
2020-07-21 15:03:46 +00:00
parent :: printAllInfo ();
if ( $this -> present ) {
echo " <p style='color: maroon; font-style: italic'>Это подарок от { $this -> present } . Вы не можете передать е г о кому-либо ещё.</p> " ;
}
2019-01-11 21:57:15 +00:00
}
2019-01-11 22:18:18 +00:00
public function printImage ()
{
2021-03-10 21:43:48 +00:00
if ( in_array ( $this -> item_type , range ( 1 , 12 ))) {
echo <<< HTML
< a href =/ main . php ? edit = 1 & dress = { $this -> item_id } title = 'Надеть' >
< img src = " /i/sh/ { $this -> image } " class = " item-wrap-normal " alt = " " >
</ a >
HTML ;
2020-07-21 15:03:46 +00:00
} else {
2021-03-10 21:43:48 +00:00
echo <<< IMG
< img src = " /i/sh/ { $this -> image } " class = " item-wrap-normal " alt = " " >
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
2021-03-14 17:54:13 +00:00
public function printControls ()
{
/* Тут будут кнопки под картинкой. */
}
private function dressStatsChecks () : ? string
{
$checkStats = new UserStats ( $this -> owner_id );
return
$this -> need_strength > $checkStats -> getFullStats () -> strength
|| $this -> need_dexterity > $checkStats -> getFullStats () -> dexterity
|| $this -> need_intuition > $checkStats -> getFullStats () -> intuition
|| $this -> need_endurance > $checkStats -> getFullStats () -> endurance
|| $this -> need_intelligence > $checkStats -> getFullStats () -> intelligence
|| $this -> need_wisdom > $checkStats -> getFullStats () -> wisdom
? true : null ;
}
/**
* Одевание предмета из инвентаря в слот .
* @ return bool | string
*/
public function dressItem ()
{
$db = new DBPDO ();
$itemInSlot = [];
if ( $this -> dressStatsChecks ()) {
return self :: REQUIREMENTS_NOT_MET ;
}
// считаем сколько ОДЕТЫХ предметов в слоте в который мы хотим одеть предмет. 1=просто вещь 1-3=шашни с кольцами
// Count добавленный в первый запрос возвращает одну строку в любом случае.
// fetch возвращает одну строку в любом случае.
$weared = $db -> ofetchAll ( 'SELECT dressed_slot FROM inventory WHERE dressed_slot != 0 AND item_type = ? AND owner_id = ?' , [ $this -> item_type , $this -> owner_id ]);
$wearedCount = $db -> ofetch ( 'select count(dressed_slot) as c from inventory where dressed_slot !=0 and item_type = ? and owner_id = ?' , [ $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 ) {
//если слот занят, снимаем старый предмет и одеваем новый предмет
DBPDO :: INIT () -> execute ( 'UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot = ? AND owner_id = ?' , [ $itemInSlot [ 0 ], $this -> owner_id ]);
DBPDO :: INIT () -> execute ( 'UPDATE inventory SET dressed_slot = item_type WHERE item_id = ? AND owner_id = ?' , [ $this -> item_id , $this -> owner_id ]);
} elseif ( ! $wearedCount -> c ) {
//если слот пуст, одеваем новый предмет
DBPDO :: INIT () -> execute ( 'UPDATE inventory SET dressed_slot = item_type WHERE item_id = ? AND owner_id = ?' , [ $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 );
// Одеваем предмет в первый свободный слот.
DBPDO :: INIT () -> execute ( 'update inventory set dressed_slot = ? where item_id = ?' , [ $emptyRingSlots [ 0 ], $this -> item_id ]);
} elseif ( $wearedCount -> c == 3 ) {
// Cнима е м предмет из последнего слота 11 и одеваем новый предмет
DBPDO :: INIT () -> execute ( 'UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot = 11' );
DBPDO :: INIT () -> execute ( 'UPDATE inventory SET dressed_slot = 11 WHERE item_id = ?' , $this -> item_id );
} else {
/* проверка на переполнение слотов */
$error = self :: TOO_MANY_ITEMS_IN_SLOTS ;
DressedItems :: undressAllItems ( $this -> owner_id );
}
} else {
$error = self :: UNKNOWN_ITEM_TYPE ;
}
return isset ( $error ) ? $error : true ;
}
2021-05-12 19:02:05 +00:00
/**
* @ param $itemId
*
* @ return bool
*/
public static function destroyItem ( $itemId ) : bool
{
$db = new DBPDO ();
return $db -> execute ( 'delete from inventory where dressed_slot = 0 and owner_id = ? and item_id = ?' , [ $_SESSION [ 'uid' ], $itemId ]);
}
2019-01-11 21:57:15 +00:00
}