using Content.Shared.Actions; using Content.Shared.Mobs.Components; namespace Content.Shared.Mobs.Systems; /// /// Adds and removes defined actions when a mob's changes. /// public sealed class MobStateActionsSystem : EntitySystem { [Dependency] private readonly SharedActionsSystem _actions = default!; /// public override void Initialize() { SubscribeLocalEvent(OnMobStateChanged); SubscribeLocalEvent(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(uid, out var mobStateActionsComp)) return; ComposeActions(uid, mobStateActionsComp, component.CurrentState); } /// /// Adds or removes actions from a mob based on mobstate. /// private void ComposeActions(EntityUid uid, MobStateActionsComponent component, MobState newMobState) { if (!TryComp(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); } } }