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();
}
}