2020-08-29 20:46:42 +10:00
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using Robust.Shared.GameObjects;
|
|
|
|
|
|
2021-06-09 22:19:39 +02:00
|
|
|
namespace Content.Shared.Verbs
|
2020-08-29 20:46:42 +10:00
|
|
|
{
|
|
|
|
|
public class SharedVerbSystem : EntitySystem
|
|
|
|
|
{
|
2021-10-05 14:29:03 +11:00
|
|
|
/// <summary>
|
2021-10-28 18:21:19 +13:00
|
|
|
/// Raises a number of events in order to get all verbs of the given type(s) defined in local systems. This
|
|
|
|
|
/// does not request verbs from the server.
|
2021-10-05 14:29:03 +11:00
|
|
|
/// </summary>
|
2021-10-28 18:21:19 +13:00
|
|
|
public virtual Dictionary<VerbType, SortedSet<Verb>> GetLocalVerbs(IEntity target, IEntity user, VerbType verbTypes)
|
2021-10-05 14:29:03 +11:00
|
|
|
{
|
|
|
|
|
Dictionary<VerbType, SortedSet<Verb>> verbs = new();
|
|
|
|
|
|
|
|
|
|
if ((verbTypes & VerbType.Interaction) == VerbType.Interaction)
|
2020-08-30 11:37:06 +02:00
|
|
|
{
|
2021-10-05 14:29:03 +11:00
|
|
|
GetInteractionVerbsEvent getVerbEvent = new(user, target);
|
|
|
|
|
RaiseLocalEvent(target.Uid, getVerbEvent);
|
|
|
|
|
verbs.Add(VerbType.Interaction, getVerbEvent.Verbs);
|
2020-08-30 11:37:06 +02:00
|
|
|
}
|
2020-08-29 20:46:42 +10:00
|
|
|
|
2021-10-05 14:29:03 +11:00
|
|
|
if ((verbTypes & VerbType.Activation) == VerbType.Activation)
|
|
|
|
|
{
|
|
|
|
|
GetActivationVerbsEvent getVerbEvent = new(user, target);
|
|
|
|
|
RaiseLocalEvent(target.Uid, getVerbEvent);
|
|
|
|
|
verbs.Add(VerbType.Activation, getVerbEvent.Verbs);
|
|
|
|
|
}
|
2020-10-30 04:52:37 +01:00
|
|
|
|
2021-10-05 14:29:03 +11:00
|
|
|
if ((verbTypes & VerbType.Alternative) == VerbType.Alternative)
|
|
|
|
|
{
|
|
|
|
|
GetAlternativeVerbsEvent getVerbEvent = new(user, target);
|
|
|
|
|
RaiseLocalEvent(target.Uid, getVerbEvent);
|
|
|
|
|
verbs.Add(VerbType.Alternative, getVerbEvent.Verbs);
|
|
|
|
|
}
|
2020-08-29 20:46:42 +10:00
|
|
|
|
2021-10-05 14:29:03 +11:00
|
|
|
if ((verbTypes & VerbType.Other) == VerbType.Other)
|
2020-08-29 20:46:42 +10:00
|
|
|
{
|
2021-10-05 14:29:03 +11:00
|
|
|
GetOtherVerbsEvent getVerbEvent = new(user, target);
|
|
|
|
|
RaiseLocalEvent(target.Uid, getVerbEvent);
|
|
|
|
|
verbs.Add(VerbType.Other, getVerbEvent.Verbs);
|
2020-08-29 20:46:42 +10:00
|
|
|
}
|
|
|
|
|
|
2021-10-05 14:29:03 +11:00
|
|
|
return verbs;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2021-10-28 18:21:19 +13:00
|
|
|
/// Execute the provided verb.
|
2021-10-05 14:29:03 +11:00
|
|
|
/// </summary>
|
|
|
|
|
/// <remarks>
|
2021-10-28 18:21:19 +13:00
|
|
|
/// This will try to call the action delegates and raise the local events for the given verb.
|
2021-10-05 14:29:03 +11:00
|
|
|
/// </remarks>
|
2021-10-28 18:21:19 +13:00
|
|
|
public void ExecuteVerb(Verb verb)
|
2021-10-05 14:29:03 +11:00
|
|
|
{
|
|
|
|
|
|
2021-10-28 18:21:19 +13:00
|
|
|
verb.Act?.Invoke();
|
|
|
|
|
|
2021-10-05 14:29:03 +11:00
|
|
|
// Maybe raise a local event
|
2021-10-28 18:21:19 +13:00
|
|
|
if (verb.ExecutionEventArgs != null)
|
2021-10-05 14:29:03 +11:00
|
|
|
{
|
2021-10-28 18:21:19 +13:00
|
|
|
if (verb.EventTarget.IsValid())
|
|
|
|
|
RaiseLocalEvent(verb.EventTarget, verb.ExecutionEventArgs);
|
2021-10-05 14:29:03 +11:00
|
|
|
else
|
2021-10-28 18:21:19 +13:00
|
|
|
RaiseLocalEvent(verb.ExecutionEventArgs);
|
2021-10-05 14:29:03 +11:00
|
|
|
}
|
2020-08-29 20:46:42 +10:00
|
|
|
}
|
|
|
|
|
}
|
2020-08-30 11:37:06 +02:00
|
|
|
}
|