using Content.Shared.Item; using Content.Shared.Ninja.Components; using Content.Shared.Weapons.Melee.Events; using Content.Shared.Weapons.Ranged.Events; using Content.Shared.Popups; using System.Diagnostics.CodeAnalysis; namespace Content.Shared.Ninja.Systems; /// /// Provides shared ninja API, handles being attacked revealing ninja and stops guns from shooting. /// public abstract partial class SharedSpaceNinjaSystem : EntitySystem { [Dependency] protected SharedNinjaSuitSystem Suit = default!; [Dependency] protected SharedPopupSystem Popup = default!; [Dependency] public EntityQuery NinjaQuery = default!; public bool IsNinja([NotNullWhen(true)] EntityUid? uid) { return NinjaQuery.HasComp(uid); } /// /// Set the ninja's worn suit entity /// public void AssignSuit(Entity ent, EntityUid? suit) { if (ent.Comp.Suit == suit) return; ent.Comp.Suit = suit; Dirty(ent, ent.Comp); } /// /// Set the ninja's worn gloves entity /// public void AssignGloves(Entity ent, EntityUid? gloves) { if (ent.Comp.Gloves == gloves) return; ent.Comp.Gloves = gloves; Dirty(ent, ent.Comp); } [SubscribeLocalEvent] private void OnBindItem(Entity ent, ref BindItemEvent args) { if (ent.Comp.Katana != null) return; ent.Comp.Katana = args.Item; Dirty(ent); } /// /// Gets the user's battery and tries to use some charge from it, returning true if successful. /// Serverside only. /// public virtual bool TryUseCharge(EntityUid user, float charge) { return false; } /// /// Handle revealing ninja if cloaked when attacked. /// [SubscribeLocalEvent] private void OnNinjaAttacked(Entity ent, ref AttackedEvent args) { TryRevealNinja(ent, disable: true); } /// /// Handle revealing ninja if cloaked when attacking. /// Only reveals, there is no cooldown. /// [SubscribeLocalEvent] private void OnNinjaAttack(Entity ent, ref MeleeAttackEvent args) { TryRevealNinja(ent, disable: false); } private void TryRevealNinja(Entity ent, bool disable) { if (ent.Comp.Suit is {} uid && TryComp(ent.Comp.Suit, out var suit)) Suit.RevealNinja((uid, suit), ent, disable: disable); } /// /// Require ninja to fight with HONOR, no guns! /// [SubscribeLocalEvent] private void OnShotAttempted(Entity ent, ref ShotAttemptedEvent args) { Popup.PopupEntity(Loc.GetString("gun-disabled"), ent, ent); args.Cancel(); } }