using Content.Shared.Clothing.Components; 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 class SharedSpaceNinjaSystem : EntitySystem { [Dependency] protected readonly SharedNinjaSuitSystem Suit = default!; [Dependency] protected readonly SharedPopupSystem Popup = default!; public EntityQuery NinjaQuery; public override void Initialize() { base.Initialize(); NinjaQuery = GetEntityQuery(); SubscribeLocalEvent(OnNinjaAttacked); SubscribeLocalEvent(OnNinjaAttack); SubscribeLocalEvent(OnShotAttempted); } 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); } /// /// Bind a katana entity to a ninja, letting it be recalled and dash. /// Does nothing if the player is not a ninja or already has a katana bound. /// public void BindKatana(Entity ent, EntityUid katana) { if (!NinjaQuery.Resolve(ent, ref ent.Comp, false) || ent.Comp.Katana != null) return; ent.Comp.Katana = katana; Dirty(ent, ent.Comp); } /// /// 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. /// 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. /// 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! /// private void OnShotAttempted(Entity ent, ref ShotAttemptedEvent args) { Popup.PopupClient(Loc.GetString("gun-disabled"), ent, ent); args.Cancel(); } }