Перейти к основному содержимому
The project's repository is archived as part of the GitHub Archive Program. RogueLibs' code and the documentation will no longer be updated.

Инвентарные проверки

InventoryChecks

Итак, с инвентарными проверками, вы можете опустить такой код:

if (Owner.statusEffects.hasTrait("BloodRestoresHealth"))
{
Owner.SayDialogue("WontEatThis");
return;
}
if (Owner.statusEffects.hasTrait("OilRestoresHealth"))
{
Owner.SayDialogue("WontEatThat");
return;
}
if (Owner.health == Owner.maxHealth)
{
Owner.SayDialogue("NoImFull");
return;
}
...

RogueLibs позволяет вам создавать инвентарные проверки, которые будут работать на всех предметах в игре, соответствующих определённым критериям (например, имеют тип "Food" и категорию "Alcohol"). Такие инвентарные проверки также реализуют некоторые обычные штуки, которые моддеры иногда забывают реализовать. Например, удаление предмета из инвентаря или остановка взаимодействия, когда количество предмета становится равным 0.

Игнорирование инвентарных проверок

Инвентарные проверки могут быть проигнорированы с помощью атрибута IgnoreChecks.

Вы можете ставить атрибуты IgnoreChecks на класс вашего предмета или на любой из его интерфейсных методов.

[ItemCategories(RogueCategories.Food, RogueCategories.Weird, "Meat")]
public class MysteryFood : CustomItem, IItemUsable
{
[IgnoreChecks("VegetarianCheck")]
public bool UseItem()
{
e.User.ChangeHealth(Item.healthChange);
Count--;
e.User.Say("Huh, tasty. I wonder what that was..."); // O_o
return true;
}
}

Смотрите таблицу инвентарных проверок реализованных в RogueLibs позже на этой странице.

Создание инвентарных проверок

У класса RogueEventArgs есть два свойства: Cancel и Handled. Если выставить Handled на true, то все другие проверки будут пропущены. Если выставить Cancel на true, то действие, которое должно было произойти, не произойдёт. Обычно, они ставятся на true одновременно.

Например, есть особенность под названием "Vegetarian" которая не должна давать игроку употреблять еду с категорией "Meat":

InventoryChecks.AddItemUsingCheck("VegetarianCheck", VegetarianCheck);
...
public static void VegetarianCheck(OnItemUsingArgs e)
{
if (e.Item.itemType == ItemTypes.Food && e.User.HasTrait("Vegetarian") && e.Item.Categories.Contains("Meat"))
{
// сделать что-нибудь чтобы показать почему предмет не может быть использован
e.User.gc.audioHandler.Play(e.User, "CantDo");
e.User.SayDialogue("WontEatMeat");
// выставить Cancel и Handled на true
e.Cancel = e.Handled = true;
}
};

Если вы хотите перегрузить инвентарную проверку из другого мода, то вам придётся патчить её с Harmony.

Таблица инвентарных проверок по умолчанию

Проверки IItemUsable

НазваниеКритерииФраза
GhostИгрок - призрак.-
PeaBrainedОсобенность "Безмозглый", тип НЕ Food."Р-р-р-р-р!!!!!"
OnlyOilОсобенность "Бензинозависимость", тип Food и (категория Food или Alcohol)."Мне нужен бензин..."
OnlyOilMedicineОсобенность "Бензинозависимость", тип Consumable и категория Health."Мне нужен бензин..."
OnlyBloodОсобенность "Кровопийца", тип Food и (категория Food или Alcohol)."Фу, гадость, я не буду это есть!"
OnlyBloodMedicineОсобенность "Кровопийца", тип Consumable и категория Health."Современная медицина для людей, мне нужна КРОВЬ!"
OnlyChargeОсобенность "Электронный", тип Food и категория Food."У меня нет желудка."
OnlyHumanFleshОсобенность "Ярый каннибализм", тип Food и категория Food."Фу, гадость, я не буду это есть!"
FullHealthУ игрока полное здоровье и healthChange у предмета больше 0."Не надо, у меня и так все в порядке!"

Эти проверки доступны через DefaultInventoryChecks. Остальные реализованы внутри патчей RogueLibs.

Проверки IItemCombinable

НазваниеКритерииЧто произойдёт
AutoStackingУ предметов одинаковое названиеОни будут подсвечены, и будучи объединёнными, они будут объединены в один предмет
StopOnZeroКоличество текущего предмета равно 0, или он больше не находится в инвентареВзаимодействие/объединение будет остановлено

Проверки IItemTargetable

НазваниеКритерииЧто произойдёт
DistanceРасстояние между игроком и целью больше 15 единицfalse
ButlerBotЦель - Робот-дворецкийfalse
EmptyMechЦель - пустой Мехfalse
StopOnZeroКоличество текущего предмета равно 0, или он больше не находится в инвентареВзаимодействие/направление будет остановлено
The project's repository is archived as part of the GitHub Archive Program. RogueLibs' code and the documentation will no longer be updated.