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

Создаём кастомный предмет

Класс CustomItem

Чтобы сделать кастомный предмет, создайте класс наследующий от CustomItem:

MyCustomItem.cs
public class MyCustomItem : CustomItem
{
/* ... */
}

Вам надо реализовать только один метод - SetupDetails:

MyCustomItem.cs
public class MyCustomItem : CustomItem
{
public override void SetupDetails()
{
Item.itemType = ItemTypes.Tool;
Item.itemValue = 200;
Item.initCount = 1;
Item.rewardCount = 1;
Item.stackable = true;
Item.hasCharges = true;
}
}

Этот метод вызывается только один раз, когда предмет создаётся или спавнится. Смотрите подробнее далее на этой странице.

Добавляйте категории через атрибут ItemCategories вместо добавления их в SetupDetails:

MyCustomItem.cs
[ItemCategories(RogueCategories.Usable, RogueCategories.Weird, "MyCustomCategory")]
public class MyCustomItem : CustomItem
{
/* ... */
}
Совет от профи: Строковые константы

Используйте статические классы со строковыми константами, такие как RogueCategories и ItemTypes. Таким образом вы не допустите опечаток. Опечатки иногда могут быть критичными, ведь ни игра, ни RogueLibs не следят за всеми существующими в игре категориями (однако, это довольно интересная идея, может я сделаю что-то подобное).

Инициализация

Просто вызовите метод CreateCustomItem с типом своего предмета в качестве параметра:

MyCustomItem.cs
public class MyCustomItem : CustomItem
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomItem<MyCustomItem>();
}
}
примечание

Смотрите подробнее об атрибуте RLSetup здесь.

Вы можете выставить название и описание своего предмета с помощью методов WithName и WithDescription:

MyCustomItem.cs
public class MyCustomItem : CustomItem
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomItem<MyCustomItem>();
.WithName(new CustomNameInfo("My Custom Item"))
.WithDescription(new CustomNameInfo("My Custom Item is very cool and does a lot of great stuff"));
}
}

То же самое можно сделать и со спрайтами и разблокировками:

MyCustomItem.cs
public class MyCustomItem : CustomItem
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomItem<MyCustomItem>();
.WithName(new CustomNameInfo("My Custom Item"))
.WithDescription(new CustomNameInfo("My Custom Item is very cool and does a lot of great stuff"));
.WithSprite(Properties.Resources.MyCustomItem)
.WithUnlock(new ItemUnlock { UnlockCost = 10, CharacterCreationCost = 5, LoadoutCost = 4, });
}
}

Свойства разблокировок

Вы можете использовать следующие свойства при инициализации ItemUnlock:

СвойствоПо умолчаниюОписание
UnlockCost0Стоимость разблокировки предмета, в наггетсах. Если выставлено на 0, разблокируется автоматически, как только все требования открыты.
CharacterCreationCost1Стоимость предмета в Редакторе персонажей, в очках.
LoadoutCost1Стоимость предмета в Обвесе, в наггетсах.
IsAvailabletrueОпределяет, доступен ли предмет в Меню наград.
IsAvailableInCCtrueОпределяет, доступен ли предмет в Редакторе персонажей.
IsAvailableInItemTeleportertrueОпределяет, доступен ли предмет в меню Вещевого телепорта.
PrerequisitesОпределяет какие разблокировки должны быть разблокированы, чтобы открыть этот предмет.
RecommendationsПросто показывает эти разблокировки в отдельном разделе Рекомендации в меню.

Другие свойства не должны использоваться во время инициализации.

Реализация SetupDetails

Итак, пока генератор кода ещё в процессе написания, используйте следующие таблицы:

Название поляОписание
itemTypeОпределяет как предмет будет вести себя в игре и всякое такое.
initCountОпределяет начальное количество предмета.
rewardCount(необязательно) Определяет количество предмета, получаемое с квестов. По умолчанию, равен initCount
itemValueОпределяет стоимость одной единицы предмета. Стоимость оружия высчитывается немного по-другому - стоимость оружия с 100 прочности, или стоимость оружия с полным боезапасом (maxAmmo).
stackableОпределяет, стакается ли предмет или есть ли у него заряды или что-то типа этого. Если не выставлено, количество предмета не отображается.
noCountText(необязательно) Определяет, не отображать ли количество предмета, даже поле выше выставлено на true.
Название поляОписание
healthChangeОпределяет сколько здоровья предмет восстанавливает.
statusEffectОпределяет статусный эффект предмета. Также означает, что предмет может быть использован на Вентиляции.
contentsКак statusEffect, но в виде списка.
stackableContents???
goesInToolbarОпределяет может ли предмет быть назначен на слот быстрого доступа и использован на 1-5 кнопки.

Название поляОписание
canRepeatInShopОпределяет может ли этот предмет повторяться в магазине.
nonStackableInShopОпределяет должно ли, в магазинах быть по 1 этого предмета в каждом слоту.
cantBeClonedОпределяет неклонируем ли предмет в Репликаторе.
cantStoreInATMMachineОпределяет не могут ли игроки сохранять этот предмет в Банкомате.
notInLoadoutMachineОпределяет не должен ли этот предмет появляться в Раздатчике, если он был выбран в качестве стартового предмета.
destroyAtLevelEndОпределяет должен ли предмет быть уничтожен при переходе на следующий уровень.
cantDropОпределяет не должен ли предмет падать с персонажей.
doSpillОпределяет может ли предмет падать с персонажей. По умолчанию, true.
cantDropNPCПротивоположность doSpill. Наверное их надо выставлять одновременно. По умолчанию, false.
cantDropSpecificCharacterВыставьте это на название персонажа, если предмет не должен падать с него и кастомных персонажей, у которых этот предмет выбран как стартовый.
characterExclusiveВыставьте это на true, если этот предмет эксклюзивен для какого-то персонажа и кастомных персонажей.
characterExclusiveSpecificCharacterВыставьте это на название персонажа, если этот предмет эксклюзивен для него и кастомных персонажей.

The project's repository is archived as part of the GitHub Archive Program. RogueLibs' code and the documentation will no longer be updated.