using Content.Shared.Item.ItemToggle.Components; using Content.Shared.Stunnable.Events; using Content.Shared.TelescopicBaton; using Robust.Server.GameObjects; namespace Content.Server.TelescopicBaton; public sealed class TelescopicBatonSystem : EntitySystem { [Dependency] private readonly AppearanceSystem _appearance = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnToggled); SubscribeLocalEvent(OnKnockdownAttempt); } public override void Update(float frameTime) { base.Update(frameTime); var query = EntityQueryEnumerator(); while (query.MoveNext(out var baton)) { if (!baton.CanKnockDown) continue; baton.TimeframeAccumulator += TimeSpan.FromSeconds(frameTime); if (baton.TimeframeAccumulator <= baton.AttackTimeframe) continue; baton.CanKnockDown = false; // Only disable knockdown baton.TimeframeAccumulator = TimeSpan.Zero; } } private void OnMapInit(Entity baton, ref MapInitEvent args) { ToggleBaton(baton, false); } private void OnToggled(Entity baton, ref ItemToggledEvent args) { ToggleBaton(baton, args.Activated); } private void OnKnockdownAttempt(Entity baton, ref KnockdownOnHitAttemptEvent args) { if (!baton.Comp.CanKnockDown) { args.Cancelled = true; return; } baton.Comp.CanKnockDown = false; } public void ToggleBaton(Entity baton, bool state) { baton.Comp.TimeframeAccumulator = TimeSpan.Zero; baton.Comp.CanKnockDown = state; _appearance.SetData(baton, TelescopicBatonVisuals.State, state); } }