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.