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.