using Content.Server.Explosion.EntitySystems; using Content.Server.Mind; using Content.Server.Objectives.Components; using Content.Server.Popups; using Content.Server.Roles; using Content.Server.Sticky.Events; using Content.Shared.Interaction; using Content.Shared.Ninja.Components; using Robust.Shared.GameObjects; namespace Content.Server.Ninja.Systems; /// /// Prevents planting a spider charge outside of its location and handles greentext. /// public sealed class SpiderChargeSystem : EntitySystem { [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(BeforePlant); SubscribeLocalEvent(OnStuck); SubscribeLocalEvent(OnExplode); } /// /// Require that the planter is a ninja and the charge is near the target warp point. /// private void BeforePlant(EntityUid uid, SpiderChargeComponent comp, BeforeRangedInteractEvent args) { var user = args.User; if (!_mind.TryGetRole(user, out var role)) { _popup.PopupEntity(Loc.GetString("spider-charge-not-ninja"), user, user); args.Handled = true; return; } // allow planting anywhere if there is no target, which should never happen if (role.SpiderChargeTarget == null) return; // assumes warp point still exists var target = Transform(role.SpiderChargeTarget.Value).MapPosition; var coords = args.ClickLocation.ToMap(EntityManager, _transform); if (!coords.InRange(target, comp.Range)) { _popup.PopupEntity(Loc.GetString("spider-charge-too-far"), user, user); args.Handled = true; } } /// /// Allows greentext to occur after exploding. /// private void OnStuck(EntityUid uid, SpiderChargeComponent comp, EntityStuckEvent args) { comp.Planter = args.User; } /// /// Handles greentext after exploding. /// Assumes it didn't move and the target was destroyed so be nice. /// private void OnExplode(EntityUid uid, SpiderChargeComponent comp, TriggerEvent args) { if (comp.Planter == null || !_mind.TryGetObjectiveComp(comp.Planter.Value, out var obj)) return; // assumes the target was destroyed, that the charge wasn't moved somehow obj.SpiderChargeDetonated = true; } }