Проверки при одевании предметов. fix #8
This commit is contained in:
parent
cbccdd754f
commit
f5b2b23582
@ -217,5 +217,18 @@ class UserStats extends User
|
|||||||
return $this->legArmor;
|
return $this->legArmor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getFullStats()
|
||||||
|
{
|
||||||
|
$query = "
|
||||||
|
select
|
||||||
|
sum(greatest(strength + (ifnull((select sum(add_strength) from inventory where dressed_slot != 0 and owner_id = $this->id), 0)), 0)) as allStrength,
|
||||||
|
sum(greatest(dexterity + (ifnull((select sum(add_dexterity) from inventory where dressed_slot != 0 and owner_id = $this->id), 0)), 0)) as allDexterity,
|
||||||
|
sum(greatest(intuition + (ifnull((select sum(add_intuition) from inventory where dressed_slot != 0 and owner_id = $this->id), 0)), 0)) as allIntuition,
|
||||||
|
sum(greatest(endurance + (ifnull((select sum(add_endurance) from inventory where dressed_slot != 0 and owner_id = $this->id), 0)), 0)) as allEndurance,
|
||||||
|
sum(greatest(intelligence + (ifnull((select sum(add_intelligence) from inventory where dressed_slot != 0 and owner_id = $this->id), 0)), 0)) as allIntelligence,
|
||||||
|
sum(greatest(wisdom + (ifnull((select sum(add_wisdom) from inventory where dressed_slot != 0 and owner_id = $this->id), 0)), 0)) as allWisdom
|
||||||
|
from users where id = $this->id";
|
||||||
|
return self::$db->ofetch($query);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
108
main.php
108
main.php
@ -138,7 +138,6 @@ function del_efs($id, $type)
|
|||||||
// одеть предмет
|
// одеть предмет
|
||||||
function dressitem($id)
|
function dressitem($id)
|
||||||
{
|
{
|
||||||
//bug #7
|
|
||||||
define('HELMET', 1);
|
define('HELMET', 1);
|
||||||
define('ARMOR', 2);
|
define('ARMOR', 2);
|
||||||
define('LEGS', 3);
|
define('LEGS', 3);
|
||||||
@ -153,57 +152,70 @@ function dressitem($id)
|
|||||||
'TOO_MANY_ITEMS_IN_SLOTS' => 'Критическая ошибка: Переполнение слота!',
|
'TOO_MANY_ITEMS_IN_SLOTS' => 'Критическая ошибка: Переполнение слота!',
|
||||||
'UNKNOWN_ITEM_TYPE' => 'Неизвестный тип предмета!',
|
'UNKNOWN_ITEM_TYPE' => 'Неизвестный тип предмета!',
|
||||||
'ITEM_NOT_FOUND' => 'Предмет не найден!',
|
'ITEM_NOT_FOUND' => 'Предмет не найден!',
|
||||||
|
'REQUIREMENTS_NOT_MET' => 'Персонаж не соответствует требованиям!',
|
||||||
]);
|
]);
|
||||||
|
$userStats = new UserStats($_SESSION['uid']);
|
||||||
$itemInSlot = [];
|
$itemInSlot = [];
|
||||||
$selectedItemRow = db::c()->query('SELECT item_type FROM `inventory` WHERE item_id = ?i AND owner_id = ?i AND `dressed_slot` = 0', $id, $_SESSION['uid']);
|
$selectedItemRow = db::c()->query('SELECT item_type,need_strength,need_dexterity,need_intuition,need_endurance,need_intelligence,need_wisdom FROM `inventory` WHERE item_id = ?i AND owner_id = ?i AND `dressed_slot` = 0 AND `durability` != 0', $id, $_SESSION['uid']);
|
||||||
if ($selectedItemRow->getNumRows()) {
|
|
||||||
$selectedItem = $selectedItemRow->fetch_object();
|
//$userStats->getStrength()
|
||||||
$itemInSlotRow = db::c()->query('SELECT dressed_slot FROM inventory WHERE owner_id = ?i AND dressed_slot > 0 AND item_type = ?i', $_SESSION['uid'], $selectedItem->item_type);
|
if (!$selectedItemRow->getNumRows()) {
|
||||||
$itemInSlotQuantity = $itemInSlotRow->getNumRows();
|
|
||||||
if ($itemInSlotQuantity) {
|
|
||||||
while ($row = $itemInSlotRow->fetch_object()) {
|
|
||||||
$itemInSlot[] = $row->dressed_slot;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (in_array($selectedItem->item_type, [HELMET, ARMOR, LEGS, BOOTS, GLOVES, WEAPON, SHIELD, BELT, AMULET])) {
|
|
||||||
//работаем с нормальными слотами
|
|
||||||
if (!$itemInSlotQuantity) {
|
|
||||||
// просто одеваем предмет
|
|
||||||
db::c()->query('UPDATE inventory SET dressed_slot = item_type WHERE item_id = ?i', $id);
|
|
||||||
} elseif ($itemInSlotQuantity == 1) {
|
|
||||||
// снимаем предмет и одеваем вместо
|
|
||||||
db::c()->query('UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot = ?i', $itemInSlot[0]);
|
|
||||||
db::c()->query('UPDATE inventory SET dressed_slot = item_type WHERE item_id = ?i', $id);
|
|
||||||
} else {
|
|
||||||
// невозможная ситуация - два предмета в одиночном слоте. критическая ошибка, запись в лог, раздевание.
|
|
||||||
$error = DRESSITEM_ERROR['TOO_MANY_ITEMS_IN_SLOTS'];
|
|
||||||
db::c()->query('UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot BETWEEN 1 AND 12 AND owner_id = ?i', $_SESSION['uid']);
|
|
||||||
}
|
|
||||||
} elseif ($selectedItem->item_type == RING) {
|
|
||||||
// работаем с кольцами
|
|
||||||
if ($itemInSlotQuantity < 3) {
|
|
||||||
// Сравниваем массив колец и массив слотов для колец.
|
|
||||||
$emptyRingSlots = array_diff([9, 10, 11], $itemInSlot);
|
|
||||||
// Сортируем массив свободных слотов по возрастанию.
|
|
||||||
sort($emptyRingSlots);
|
|
||||||
// Одеваем предмет в первый свободный слот.
|
|
||||||
db::c()->query('UPDATE inventory SET dressed_slot = ?i WHERE item_id = ?i', $emptyRingSlots[0], $id);
|
|
||||||
} elseif ($itemInSlotQuantity == 3) {
|
|
||||||
db::c()->query('UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot = 11');
|
|
||||||
db::c()->query('UPDATE inventory SET dressed_slot = 11 WHERE item_id = ?i', $id);
|
|
||||||
// снимаем предмет из слота 11 и одеваем вместо
|
|
||||||
} else {
|
|
||||||
// невозможная ситуация - больше трёх предметов на три слота. критическая ошибка, запись в лог, раздевание.
|
|
||||||
$error = DRESSITEM_ERROR['TOO_MANY_ITEMS_IN_SLOTS'];
|
|
||||||
db::c()->query('UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot BETWEEN 1 AND 12 AND owner_id = ?i', $_SESSION['uid']);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//предмет вообще не должен одеваться, ошибка
|
|
||||||
$error = DRESSITEM_ERROR['UNKNOWN_ITEM_TYPE'];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//с предметом что-то сильно не ок, ошибка.
|
//с предметом что-то сильно не ок, ошибка.
|
||||||
$error = DRESSITEM_ERROR['ITEM_NOT_FOUND'];
|
$error = DRESSITEM_ERROR['ITEM_NOT_FOUND'];
|
||||||
|
} else {
|
||||||
|
$selectedItem = $selectedItemRow->fetch_object();
|
||||||
|
if ($selectedItem->need_strength > $userStats->getFullStats()->allStrength
|
||||||
|
|| $selectedItem->need_dexterity > $userStats->getFullStats()->allDexterity
|
||||||
|
|| $selectedItem->need_intuition > $userStats->getFullStats()->allIntuition
|
||||||
|
|| $selectedItem->need_endurance > $userStats->getFullStats()->allEndurance
|
||||||
|
|| $selectedItem->need_intelligence > $userStats->getFullStats()->allIntelligence
|
||||||
|
|| $selectedItem->need_wisdom > $userStats->getFullStats()->allWisdom) {
|
||||||
|
$error = DRESSITEM_ERROR['REQUIREMENTS_NOT_MET'];
|
||||||
|
} else {
|
||||||
|
$itemInSlotRow = db::c()->query('SELECT dressed_slot FROM inventory WHERE owner_id = ?i AND dressed_slot > 0 AND item_type = ?i', $_SESSION['uid'], $selectedItem->item_type);
|
||||||
|
$itemInSlotQuantity = $itemInSlotRow->getNumRows();
|
||||||
|
if ($itemInSlotQuantity) {
|
||||||
|
while ($row = $itemInSlotRow->fetch_object()) {
|
||||||
|
$itemInSlot[] = $row->dressed_slot;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (in_array($selectedItem->item_type, [HELMET, ARMOR, LEGS, BOOTS, GLOVES, WEAPON, SHIELD, BELT, AMULET])) {
|
||||||
|
//работаем с нормальными слотами
|
||||||
|
if (!$itemInSlotQuantity) {
|
||||||
|
// просто одеваем предмет
|
||||||
|
db::c()->query('UPDATE inventory SET dressed_slot = item_type WHERE item_id = ?i', $id);
|
||||||
|
} elseif ($itemInSlotQuantity == 1) {
|
||||||
|
// снимаем предмет и одеваем вместо
|
||||||
|
db::c()->query('UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot = ?i', $itemInSlot[0]);
|
||||||
|
db::c()->query('UPDATE inventory SET dressed_slot = item_type WHERE item_id = ?i', $id);
|
||||||
|
} else {
|
||||||
|
// невозможная ситуация - два предмета в одиночном слоте. критическая ошибка, запись в лог, раздевание.
|
||||||
|
$error = DRESSITEM_ERROR['TOO_MANY_ITEMS_IN_SLOTS'];
|
||||||
|
db::c()->query('UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot BETWEEN 1 AND 12 AND owner_id = ?i', $_SESSION['uid']);
|
||||||
|
}
|
||||||
|
} elseif ($selectedItem->item_type == RING) {
|
||||||
|
// работаем с кольцами
|
||||||
|
if ($itemInSlotQuantity < 3) {
|
||||||
|
// Сравниваем массив колец и массив слотов для колец.
|
||||||
|
$emptyRingSlots = array_diff([9, 10, 11], $itemInSlot);
|
||||||
|
// Сортируем массив свободных слотов по возрастанию.
|
||||||
|
sort($emptyRingSlots);
|
||||||
|
// Одеваем предмет в первый свободный слот.
|
||||||
|
db::c()->query('UPDATE inventory SET dressed_slot = ?i WHERE item_id = ?i', $emptyRingSlots[0], $id);
|
||||||
|
} elseif ($itemInSlotQuantity == 3) {
|
||||||
|
db::c()->query('UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot = 11');
|
||||||
|
db::c()->query('UPDATE inventory SET dressed_slot = 11 WHERE item_id = ?i', $id);
|
||||||
|
// снимаем предмет из слота 11 и одеваем вместо
|
||||||
|
} else {
|
||||||
|
// невозможная ситуация - больше трёх предметов на три слота. критическая ошибка, запись в лог, раздевание.
|
||||||
|
$error = DRESSITEM_ERROR['TOO_MANY_ITEMS_IN_SLOTS'];
|
||||||
|
db::c()->query('UPDATE inventory SET dressed_slot = 0 WHERE dressed_slot BETWEEN 1 AND 12 AND owner_id = ?i', $_SESSION['uid']);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//предмет вообще не должен одеваться, ошибка
|
||||||
|
$error = DRESSITEM_ERROR['UNKNOWN_ITEM_TYPE'];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($error)) {
|
if (isset($error)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user