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