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-08-20 17:40:06 +00:00
$this -> present = $row -> present ;
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 ()
{
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 ()
{
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-08-29 22:34:50 +00:00
public function printControls (){
// Для кнопок управления под картинкой.
2021-03-14 17:54:13 +00:00
}
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 ()
{
$itemInSlot = [];
if ( $this -> dressStatsChecks ()) {
return self :: REQUIREMENTS_NOT_MET ;
}
// считаем сколько ОДЕТЫХ предметов в слоте в который мы хотим одеть предмет. 1=просто вещь 1-3=шашни с кольцами
// Count добавленный в первый запрос возвращает одну строку в любом случае.
// fetch возвращает одну строку в любом случае.
2021-08-20 17:40:06 +00:00
$weared = $this -> db -> ofetchAll ( 'SELECT dressed_slot FROM inventory WHERE dressed_slot != 0 AND item_type = ? AND owner_id = ?' , [ $this -> item_type , $this -> owner_id ]);
$wearedCount = $this -> 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 ]);
2021-03-14 17:54:13 +00:00
// Если в слоте есть предмет(ы), забиваем их массив одетых в слот предметов.
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 ) {
//если слот занят, снимаем старый предмет и одеваем новый предмет
2021-08-20 17:40:06 +00:00
$this -> db -> execute ( 'UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot = ? AND owner_id = ?' , [ $itemInSlot [ 0 ], $this -> owner_id ]);
$this -> db -> execute ( 'UPDATE inventory SET dressed_slot = item_type WHERE item_id = ? AND owner_id = ?' , [ $this -> item_id , $this -> owner_id ]);
2021-03-14 17:54:13 +00:00
} elseif ( ! $wearedCount -> c ) {
//если слот пуст, одеваем новый предмет
2021-08-20 17:40:06 +00:00
$this -> db -> execute ( 'UPDATE inventory SET dressed_slot = item_type WHERE item_id = ? AND owner_id = ?' , [ $this -> item_id , $this -> owner_id ]);
2021-03-14 17:54:13 +00:00
} 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 );
// Одеваем предмет в первый свободный слот.
2021-08-20 17:40:06 +00:00
$this -> db -> execute ( 'update inventory set dressed_slot = ? where item_id = ?' , [ $emptyRingSlots [ 0 ], $this -> item_id ]);
2021-03-14 17:54:13 +00:00
} elseif ( $wearedCount -> c == 3 ) {
// Cнима е м предмет из последнего слота 11 и одеваем новый предмет
2021-08-20 17:40:06 +00:00
$this -> db -> execute ( 'UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot = 11' );
$this -> db -> execute ( 'UPDATE inventory SET dressed_slot = 11 WHERE item_id = ?' , $this -> item_id );
2021-03-14 17:54:13 +00:00
} else {
/* проверка на переполнение слотов */
$error = self :: TOO_MANY_ITEMS_IN_SLOTS ;
DressedItems :: undressAllItems ( $this -> owner_id );
}
} 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
2021-08-29 22:34:50 +00:00
public static function destroyItem ( $itemId )
2021-05-12 19:02:05 +00:00
{
2021-08-29 22:34:50 +00:00
DBPDO :: INIT () -> execute ( 'delete from inventory where dressed_slot = 0 and owner_id = ? and item_id = ?' , [ $_SESSION [ 'uid' ], $itemId ]);
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
{
$query = 'select sum(weight) as `all`, strength * 4 as max from inventory left join users u on owner_id = id where owner_id = ?' ;
$weight = DBPDO :: $db -> ofetch ( $query , User :: $current -> getId ());
$css = $weight -> all > $weight -> max ? ' style="color:maroon;"' : '' ;
return " <span $css > $weight->all / $weight->max </span> " ;
}
2019-01-11 21:57:15 +00:00
}