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

Фабрики хуков

Интерфейс IHookFactory

Вы можете создать фабрики хуков наследуя от IHookFactory<T> или от HookFactoryBase<T>:

MyCustomHookFactory.cs
public class MyCustomHookFactory : HookFactoryBase<InvItem>
{
public override bool TryCreate(InvItem instance, out IHook<InvItem> hook)
{
if (instance.Categories.Contains("Food"))
{
hook = new MyCustomHook();
return true;
}
hook = null;
return false;
}
}
предупреждение

Вам нужно только создать объект хука. Не прицепляйте его к объекту пока что.

Ответственность за прицепление созданных хуков лежит на внешнем коде:

if (factory.TryCreate(item, out IHook<InvItem> hook))
{
item.AddHook(hook);
}

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

Вы можете либо реализовать свой способ использования фабрик, или можете добавить её в класс RogueFramework:

RogueFramework.ItemFactories.Add(new MyCustomHookFactory());

Примеры

RogueLibs использует CustomItemFactory и другие подобные классы для инициализации кастомных предметов и других хуков:

public sealed class CustomItemFactory : HookFactoryBase<InvItem>
{
private readonly Dictionary<string, ItemEntry> itemsDict = new Dictionary<string, ItemEntry>();

public override bool TryCreate(InvItem instance, out IHook<InvItem> hook)
{
if (instance != null && itemsDict.TryGetValue(instance.invItemName, out ItemEntry entry))
{
hook = entry.Initializer();
if (hook is CustomItem custom)
custom.ItemInfo = entry.ItemInfo;
return true;
}
hook = null;
return false;
}
public ItemInfo AddItem<TItem>() where TItem : CustomItem, new()
{
ItemInfo info = ItemInfo.Get<TItem>();
itemsDict.Add(info.Name, new ItemEntry { Initializer = () => new TItem(), ItemInfo = info });
return info;
}

private struct ItemEntry
{
public Func<IHook<InvItem>> Initializer;
public ItemInfo ItemInfo;
}
}
public static void InvItem_SetupDetails(InvItem __instance)
{
foreach (IHookFactory<InvItem> factory in RogueFramework.ItemFactories)
if (factory.TryCreate(__instance, out IHook<InvItem> hook))
{
__instance.AddHook(hook);
}
}
The project's repository is archived as part of the GitHub Archive Program. RogueLibs' code and the documentation will no longer be updated.