private void TryDoCollideStun(Entity<StunOnCollideComponent> ent, EntityUid target)
{
- _stunSystem.TryKnockdown(target, ent.Comp.KnockdownAmount, ent.Comp.Refresh, ent.Comp.AutoStand, ent.Comp.Drop);
+ _stunSystem.TryKnockdown(target, ent.Comp.KnockdownAmount, ent.Comp.Refresh, ent.Comp.AutoStand, ent.Comp.Drop, true);
if (ent.Comp.Refresh)
{
using Content.Shared.Damage.Components;
using Content.Shared.Database;
using Content.Shared.DoAfter;
+using Content.Shared.Gravity;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Input;
using Content.Shared.Movement.Events;
// Crawling
SubscribeLocalEvent<CrawlerComponent, KnockedDownRefreshEvent>(OnKnockdownRefresh);
SubscribeLocalEvent<CrawlerComponent, DamageChangedEvent>(OnDamaged);
+ SubscribeLocalEvent<KnockedDownComponent, WeightlessnessChangedEvent>(OnWeightlessnessChanged);
+ SubscribeLocalEvent<GravityAffectedComponent, KnockDownAttemptEvent>(OnKnockdownAttempt);
+ SubscribeLocalEvent<GravityAffectedComponent, GetStandUpTimeEvent>(OnGetStandUpTime);
// Handling Alternative Inputs
SubscribeAllEvent<ForceStandUpEvent>(OnForceStandup);
args.SpeedModifier *= entity.Comp.SpeedModifier;
}
+ private void OnWeightlessnessChanged(Entity<KnockedDownComponent> entity, ref WeightlessnessChangedEvent args)
+ {
+ // I probably don't need this check since weightless -> non-weightless you shouldn't be knocked down
+ // But you never know.
+ if (!args.Weightless)
+ return;
+
+ // Targeted moth attack
+ CancelKnockdownDoAfter((entity, entity.Comp));
+ RemComp<KnockedDownComponent>(entity);
+ }
+
+ private void OnKnockdownAttempt(Entity<GravityAffectedComponent> entity, ref KnockDownAttemptEvent args)
+ {
+ // Directed, targeted moth attack.
+ if (entity.Comp.Weightless)
+ args.Cancelled = true;
+ }
+
+ private void OnGetStandUpTime(Entity<GravityAffectedComponent> entity, ref GetStandUpTimeEvent args)
+ {
+ // Get up instantly if weightless
+ if (entity.Comp.Weightless)
+ args.DoAfterTime = TimeSpan.Zero;
+ }
+
#endregion
#region Action Blockers