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
2022-01-26 23:15:33 +00:00
use Battles\Database\Db ;
2021-03-14 17:54:13 +00:00
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 ;
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 ;
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
2022-01-26 23:15:33 +00:00
< a href =/ main . php ? edit = 1 & dress = $this -> item_id title = 'Надеть' >
< 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
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 );
2022-01-25 16:16:09 +00:00
$stat = $checkStats -> getFullStats ();
2021-03-14 17:54:13 +00:00
return
2022-01-25 16:16:09 +00:00
$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
2021-03-14 17:54:13 +00:00
? true : null ;
}
/**
* Одевание предмета из инвентаря в слот .
* @ return bool | string
*/
public function dressItem ()
{
$itemInSlot = [];
if ( $this -> dressStatsChecks ()) {
return self :: REQUIREMENTS_NOT_MET ;
}
// считаем сколько ОДЕТЫХ предметов в слоте в который мы хотим одеть предмет. 1=просто вещь 1-3=шашни с кольцами
// Count добавленный в первый запрос возвращает одну строку в любом случае.
// fetch возвращает одну строку в любом случае.
2022-01-26 23:15:33 +00:00
$weared = Db :: getInstance () -> ofetchAll ( 'SELECT dressed_slot FROM inventory WHERE dressed_slot != 0 AND item_type = ? AND owner_id = ?' , [ $this -> item_type , $this -> owner_id ]);
$wearedCount = Db :: getInstance () -> 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 ) {
//если слот занят, снимаем старый предмет и одеваем новый предмет
2022-01-26 23:15:33 +00:00
Db :: getInstance () -> execute ( 'UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot = ? AND owner_id = ?' , [ $itemInSlot [ 0 ], $this -> owner_id ]);
Db :: getInstance () -> 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 ) {
//если слот пуст, одеваем новый предмет
2022-01-26 23:15:33 +00:00
Db :: getInstance () -> 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 );
// Одеваем предмет в первый свободный слот.
2022-01-26 23:15:33 +00:00
Db :: getInstance () -> 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 и одеваем новый предмет
2022-01-26 23:15:33 +00:00
Db :: getInstance () -> execute ( 'UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot = 11' );
Db :: getInstance () -> 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
{
2022-01-26 23:15:33 +00:00
Db :: getInstance () -> 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 = ?' ;
2022-01-26 23:15:33 +00:00
$weight = Db :: getInstance () -> ofetch ( $query , User :: getInstance () -> getId ());
2021-08-27 15:55:18 +00:00
$css = $weight -> all > $weight -> max ? ' style="color:maroon;"' : '' ;
return " <span $css > $weight->all / $weight->max </span> " ;
}
2019-01-11 21:57:15 +00:00
}