Files
tbd-station-14/Content.Shared/Mobs/Systems/MobStateActionsSystem.cs
IProduceWidgets c8e59ebdd5 Add Snails (#30765)
* add snails

* scuffix

* migrate

* mo-grate

* oopsied the ftls

* Revert "oopsied the ftls"

This reverts commit 0d3c6c17f31ec904679d6a48799cea71e77c1f99.

* the curse of staging the wrong file, resolved.

* Snoth

* fix my dumbs

* reviews 1

* anti space technology

* salt hurty

* spelling

* Its a slotherhouse out here

* sequencing

* cooked snail

* volfix

* speed reversal
2024-09-03 12:33:44 +02:00

58 lines
1.8 KiB
C#

using Content.Shared.Actions;
using Content.Shared.Mobs.Components;
namespace Content.Shared.Mobs.Systems;
/// <summary>
/// Adds and removes defined actions when a mob's <see cref="MobState"/> changes.
/// </summary>
public sealed class MobStateActionsSystem : EntitySystem
{
[Dependency] private readonly SharedActionsSystem _actions = default!;
/// <inheritdoc/>
public override void Initialize()
{
SubscribeLocalEvent<MobStateActionsComponent, MobStateChangedEvent>(OnMobStateChanged);
SubscribeLocalEvent<MobStateComponent, ComponentInit>(OnMobStateComponentInit);
}
private void OnMobStateChanged(EntityUid uid, MobStateActionsComponent component, MobStateChangedEvent args)
{
ComposeActions(uid, component, args.NewMobState);
}
private void OnMobStateComponentInit(EntityUid uid, MobStateComponent component, ComponentInit args)
{
if (!TryComp<MobStateActionsComponent>(uid, out var mobStateActionsComp))
return;
ComposeActions(uid, mobStateActionsComp, component.CurrentState);
}
/// <summary>
/// Adds or removes actions from a mob based on mobstate.
/// </summary>
private void ComposeActions(EntityUid uid, MobStateActionsComponent component, MobState newMobState)
{
if (!TryComp<ActionsComponent>(uid, out var action))
return;
foreach (var act in component.GrantedActions)
{
Del(act);
}
component.GrantedActions.Clear();
if (!component.Actions.TryGetValue(newMobState, out var toGrant))
return;
foreach (var id in toGrant)
{
EntityUid? act = null;
if (_actions.AddAction(uid, ref act, id, uid, action))
component.GrantedActions.Add(act.Value);
}
}
}