private void OnDisarmed(EntityUid uid, StatusEffectsComponent status, DisarmedActEvent args) { if (args.Handled || !_random.Prob(args.PushProbability)) { return; } if (!TryParalyze(uid, TimeSpan.FromSeconds(4f), true, status)) { return; } var source = args.Source; var target = args.Target; if (source != null) { var knock = EntityManager.GetComponent <KnockedDownComponent>(uid); SoundSystem.Play(Filter.Pvs(source), knock.StunAttemptSound.GetSound(), source, AudioHelpers.WithVariation(0.025f)); if (target != null) { // TODO: Use PopupSystem source.PopupMessageOtherClients(Loc.GetString("stunned-component-disarm-success-others", ("source", Name: EntityManager.GetComponent <MetaDataComponent>(source).EntityName), ("target", Name: EntityManager.GetComponent <MetaDataComponent>(target).EntityName))); source.PopupMessageCursor(Loc.GetString("stunned-component-disarm-success", ("target", Name: EntityManager.GetComponent <MetaDataComponent>(target).EntityName))); } } _adminLogSystem.Add(LogType.DisarmedKnockdown, LogImpact.Medium, $"{args.Source:performer} knocked down {args.Target:target}"); args.Handled = true; }
public void DoTargetEntityAction(TargetEntityActionEventArgs args) { var disarmedActs = args.Target.GetAllComponents <IDisarmedAct>().ToArray(); if (!args.Performer.InRangeUnobstructed(args.Target)) { return; } if (disarmedActs.Length == 0) { if (args.Performer.TryGetComponent(out ActorComponent? actor)) { // Fall back to a normal interaction with the entity var player = actor.PlayerSession; var coordinates = args.Target.Transform.Coordinates; var target = args.Target.Uid; EntitySystem.Get <InteractionSystem>().HandleUseInteraction(player, coordinates, target); return; } return; } if (!args.Performer.TryGetComponent <SharedActionsComponent>(out var actions)) { return; } if (args.Target == args.Performer || !EntitySystem.Get <ActionBlockerSystem>().CanAttack(args.Performer)) { return; } var random = IoCManager.Resolve <IRobustRandom>(); var system = EntitySystem.Get <MeleeWeaponSystem>(); var diff = args.Target.Transform.MapPosition.Position - args.Performer.Transform.MapPosition.Position; var angle = Angle.FromWorldVec(diff); actions.Cooldown(ActionType.Disarm, Cooldowns.SecondsFromNow(_cooldown)); if (random.Prob(_failProb)) { SoundSystem.Play(Filter.Pvs(args.Performer), PunchMissSound.GetSound(), args.Performer, AudioHelpers.WithVariation(0.025f)); args.Performer.PopupMessageOtherClients(Loc.GetString("disarm-action-popup-message-other-clients", ("performerName", args.Performer.Name), ("targetName", args.Target.Name))); args.Performer.PopupMessageCursor(Loc.GetString("disarm-action-popup-message-cursor", ("targetName", args.Target.Name))); system.SendLunge(angle, args.Performer); return; } system.SendAnimation("disarm", angle, args.Performer, args.Performer, new[] { args.Target }); var eventArgs = new DisarmedActEvent() { Target = args.Target, Source = args.Performer, PushProbability = _pushProb }; IoCManager.Resolve <IEntityManager>().EventBus.RaiseLocalEvent(args.Target.Uid, eventArgs); // Check if the event has been handled, and if so, do nothing else! if (eventArgs.Handled) { return; } // Sort by priority. Array.Sort(disarmedActs, (a, b) => a.Priority.CompareTo(b.Priority)); // TODO: Remove this shit. foreach (var disarmedAct in disarmedActs) { if (disarmedAct.Disarmed(eventArgs)) { return; } } SoundSystem.Play(Filter.Pvs(args.Performer), DisarmSuccessSound.GetSound(), args.Performer.Transform.Coordinates, AudioHelpers.WithVariation(0.025f)); }