Перейти к основному содержимому
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.