worldbox-observer-mod/IdleSpectator/RelationshipInterestFeed.cs

80 lines
2.2 KiB
C#

using UnityEngine;
namespace IdleSpectator;
/// <summary>Registers relationship lifecycle interest candidates.</summary>
public static class RelationshipInterestFeed
{
public static void Emit(string eventId, Actor subject, Actor related, string labelOverride = null)
{
if (AgentHarness.Busy || subject == null || !subject.isAlive())
{
return;
}
DiscreteEventEntry entry = RelationshipEventCatalog.GetOrFallback(eventId);
if (!entry.CreatesInterest)
{
return;
}
string a = EventFeedUtil.SafeName(subject);
string b = EventFeedUtil.SafeName(related);
string label = string.IsNullOrEmpty(labelOverride) ? entry.MakeLabel(a, b) : labelOverride;
string key = "rel:" + entry.Id + ":" + EventFeedUtil.SafeId(subject) + ":" + EventFeedUtil.SafeId(related);
EventFeedUtil.Register(
key,
"relationship",
entry.Category,
label,
entry.Id,
entry.EventStrength,
entry.OwnsCamera,
subject.current_position,
subject);
}
public static void EmitFamily(string eventId, object family, Actor anchor)
{
if (AgentHarness.Busy)
{
return;
}
DiscreteEventEntry entry = RelationshipEventCatalog.GetOrFallback(eventId);
Actor follow = anchor;
if (follow == null || !follow.isAlive())
{
follow = EventFeedUtil.AnyAliveUnit();
}
if (follow == null)
{
return;
}
string name = "";
try
{
name = family?.GetType().GetMethod("getName")?.Invoke(family, null) as string
?? family?.GetType().GetProperty("name")?.GetValue(family, null) as string
?? "";
}
catch
{
// ignore
}
string key = "rel:" + entry.Id + ":" + (name ?? "family");
EventFeedUtil.Register(
key,
"relationship",
entry.Category,
entry.MakeLabel(name, ""),
entry.Id,
entry.EventStrength,
entry.OwnsCamera,
follow.current_position,
follow);
}
}