using Content.Shared.Damage; using Content.Shared.DragDrop; using Content.Shared.Interaction.Events; using Content.Shared.Inventory.Events; using Content.Shared.Item; using Content.Shared.MobState.Components; using Content.Shared.MobState.State; using Content.Shared.Movement; using Content.Shared.Pulling.Events; using Content.Shared.Speech; using Content.Shared.Standing; using Content.Shared.Throwing; using Robust.Shared.GameObjects; namespace Content.Shared.MobState.EntitySystems { public class MobStateSystem : EntitySystem { public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnChangeDirectionAttempt); SubscribeLocalEvent(OnUseAttempt); SubscribeLocalEvent(OnInteractAttempt); SubscribeLocalEvent(OnThrowAttempt); SubscribeLocalEvent(OnSpeakAttempt); SubscribeLocalEvent(OnEquipAttempt); SubscribeLocalEvent(OnUnequipAttempt); SubscribeLocalEvent(OnAttackAttempt); SubscribeLocalEvent(OnDropAttempt); SubscribeLocalEvent(OnPickupAttempt); SubscribeLocalEvent(OnStartPullAttempt); SubscribeLocalEvent(UpdateState); SubscribeLocalEvent(OnMoveAttempt); SubscribeLocalEvent(OnStandAttempt); // Note that there's no check for Down attempts because if a mob's in crit or dead, they can be downed... } #region ActionBlocker private void CheckAct(EntityUid uid, MobStateComponent component, CancellableEntityEventArgs args) { switch (component.CurrentState) { case SharedDeadMobState: case SharedCriticalMobState: args.Cancel(); break; } } private void OnChangeDirectionAttempt(EntityUid uid, MobStateComponent component, ChangeDirectionAttemptEvent args) { CheckAct(uid, component, args); } private void OnUseAttempt(EntityUid uid, MobStateComponent component, UseAttemptEvent args) { CheckAct(uid, component, args); } private void OnInteractAttempt(EntityUid uid, MobStateComponent component, InteractionAttemptEvent args) { CheckAct(uid, component, args); } private void OnThrowAttempt(EntityUid uid, MobStateComponent component, ThrowAttemptEvent args) { CheckAct(uid, component, args); } private void OnSpeakAttempt(EntityUid uid, MobStateComponent component, SpeakAttemptEvent args) { CheckAct(uid, component, args); } private void OnEquipAttempt(EntityUid uid, MobStateComponent component, EquipAttemptEvent args) { CheckAct(uid, component, args); } private void OnUnequipAttempt(EntityUid uid, MobStateComponent component, UnequipAttemptEvent args) { CheckAct(uid, component, args); } private void OnAttackAttempt(EntityUid uid, MobStateComponent component, AttackAttemptEvent args) { CheckAct(uid, component, args); } private void OnDropAttempt(EntityUid uid, MobStateComponent component, DropAttemptEvent args) { CheckAct(uid, component, args); } private void OnPickupAttempt(EntityUid uid, MobStateComponent component, PickupAttemptEvent args) { CheckAct(uid, component, args); } #endregion private void OnStartPullAttempt(EntityUid uid, MobStateComponent component, StartPullAttemptEvent args) { if(component.IsIncapacitated()) args.Cancel(); } public void UpdateState(EntityUid _, MobStateComponent component, DamageChangedEvent args) { component.UpdateState(args.Damageable.TotalDamage); } private void OnMoveAttempt(EntityUid uid, MobStateComponent component, MovementAttemptEvent args) { switch (component.CurrentState) { case SharedCriticalMobState: case SharedDeadMobState: args.Cancel(); return; default: return; } } private void OnStandAttempt(EntityUid uid, MobStateComponent component, StandAttemptEvent args) { if(component.IsIncapacitated()) args.Cancel(); } } }