diff --git a/Content.Client/DragDrop/DragDropSystem.cs b/Content.Client/DragDrop/DragDropSystem.cs index fa8e51577e..0d3ef4c143 100644 --- a/Content.Client/DragDrop/DragDropSystem.cs +++ b/Content.Client/DragDrop/DragDropSystem.cs @@ -1,7 +1,9 @@ +using Content.Client.CombatMode; using Content.Client.Outline; using Content.Client.Viewport; using Content.Shared.ActionBlocker; using Content.Shared.CCVar; +using Content.Shared.CombatMode; using Content.Shared.DragDrop; using Content.Shared.Interaction; using Content.Shared.Interaction.Events; @@ -35,6 +37,7 @@ namespace Content.Client.DragDrop [Dependency] private readonly IConfigurationManager _cfgMan = default!; [Dependency] private readonly InteractionOutlineSystem _outline = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; + [Dependency] private readonly CombatModeSystem _combatMode = default!; [Dependency] private readonly InputSystem _inputSystem = default!; [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; @@ -124,7 +127,8 @@ namespace Content.Client.DragDrop private bool OnUseMouseDown(in PointerInputCmdHandler.PointerInputCmdArgs args) { - if (args.Session?.AttachedEntity is not {Valid: true} dragger) + if (args.Session?.AttachedEntity is not {Valid: true} dragger || + _combatMode.IsInCombatMode()) { return false; } @@ -218,7 +222,8 @@ namespace Content.Client.DragDrop private bool OnContinueDrag(float frameTime) { - if (_dragDropHelper.Dragged == default || Deleted(_dragDropHelper.Dragged)) + if (_dragDropHelper.Dragged == default || Deleted(_dragDropHelper.Dragged) || + _combatMode.IsInCombatMode()) { return false; } @@ -231,8 +236,6 @@ namespace Content.Client.DragDrop return false; } - // keep dragged entity under mouse - var mousePos = _eyeManager.ScreenToMap(_dragDropHelper.MouseScreenPosition); // TODO: would use MapPosition instead if it had a setter, but it has no setter. // is that intentional, or should we add a setter for Transform.MapPosition? if (_dragShadow == default) diff --git a/Content.Server/Interaction/InteractionSystem.cs b/Content.Server/Interaction/InteractionSystem.cs index 3757e1bf1f..1fbbea5402 100644 --- a/Content.Server/Interaction/InteractionSystem.cs +++ b/Content.Server/Interaction/InteractionSystem.cs @@ -3,14 +3,17 @@ using Content.Server.CombatMode; using Content.Server.Hands.Components; using Content.Server.Pulling; using Content.Server.Storage.Components; +using Content.Server.Weapon.Ranged.Barrels.Components; using Content.Shared.ActionBlocker; using Content.Shared.Database; using Content.Shared.DragDrop; using Content.Shared.Input; using Content.Shared.Interaction; +using Content.Shared.Interaction.Events; using Content.Shared.Item; using Content.Shared.Pulling.Components; using Content.Shared.Weapons.Melee; +using Content.Shared.Weapons.Ranged.Components; using JetBrains.Annotations; using Robust.Server.GameObjects; using Robust.Shared.Containers; @@ -202,8 +205,13 @@ namespace Content.Server.Interaction { var item = hands.ActiveHandEntity; - if (item != null && !Deleted(item.Value)) + if (!Deleted(item)) { + var meleeVee = new MeleeAttackAttemptEvent(); + RaiseLocalEvent(item.Value, ref meleeVee); + + if (meleeVee.Cancelled) return; + if (wideAttack) { var ev = new WideAttackEvent(item.Value, user, coordinates); diff --git a/Content.Server/Weapon/Ranged/GunSystem.Guns.cs b/Content.Server/Weapon/Ranged/GunSystem.Guns.cs index ebcd7c0a90..63195d9da5 100644 --- a/Content.Server/Weapon/Ranged/GunSystem.Guns.cs +++ b/Content.Server/Weapon/Ranged/GunSystem.Guns.cs @@ -7,6 +7,7 @@ using Content.Server.Weapon.Ranged.Ammunition.Components; using Content.Server.Weapon.Ranged.Barrels.Components; using Content.Shared.Camera; using Content.Shared.Database; +using Content.Shared.Interaction.Events; using Content.Shared.Popups; using Robust.Shared.Audio; using Robust.Shared.Map; @@ -18,6 +19,11 @@ namespace Content.Server.Weapon.Ranged; public sealed partial class GunSystem { + private void OnMeleeAttempt(EntityUid uid, ServerRangedWeaponComponent component, ref MeleeAttackAttemptEvent args) + { + args.Cancelled = true; + } + /// /// Tries to fire a round of ammo out of the weapon. /// @@ -138,6 +144,7 @@ public sealed partial class GunSystem } #region Firing + /// /// Handles firing one or many projectiles /// @@ -242,5 +249,6 @@ public sealed partial class GunSystem hitscan.FireEffects(shooter, hitscan.MaxLength, angle); } } + #endregion } diff --git a/Content.Server/Weapon/Ranged/GunSystem.cs b/Content.Server/Weapon/Ranged/GunSystem.cs index 879e6ff39e..b4633ec6ea 100644 --- a/Content.Server/Weapon/Ranged/GunSystem.cs +++ b/Content.Server/Weapon/Ranged/GunSystem.cs @@ -123,6 +123,7 @@ public sealed partial class GunSystem : EntitySystem // SubscribeLocalEvent(OnGunExamine); SubscribeNetworkEvent(OnFirePos); + SubscribeLocalEvent(OnMeleeAttempt); } private void OnFirePos(FirePosEvent msg, EntitySessionEventArgs args) diff --git a/Content.Shared/CombatMode/SharedCombatModeSystem.cs b/Content.Shared/CombatMode/SharedCombatModeSystem.cs index 731c7c9a10..3495f807ca 100644 --- a/Content.Shared/CombatMode/SharedCombatModeSystem.cs +++ b/Content.Shared/CombatMode/SharedCombatModeSystem.cs @@ -65,10 +65,8 @@ namespace Content.Shared.CombatMode { var entity = eventArgs.SenderSession.AttachedEntity; - if (entity == default || !EntityManager.TryGetComponent(entity, out SharedCombatModeComponent? combatModeComponent)) - { + if (entity == null || !EntityManager.TryGetComponent(entity, out SharedCombatModeComponent? combatModeComponent)) return; - } combatModeComponent.IsInCombatMode = ev.Active; } diff --git a/Content.Shared/Interaction/Events/MeleeAttackAttemptEvent.cs b/Content.Shared/Interaction/Events/MeleeAttackAttemptEvent.cs new file mode 100644 index 0000000000..01083e8987 --- /dev/null +++ b/Content.Shared/Interaction/Events/MeleeAttackAttemptEvent.cs @@ -0,0 +1,16 @@ +namespace Content.Shared.Interaction.Events; + +/// +/// Raised on directed a weapon when being used in a melee attack. +/// +[ByRefEvent] +public struct MeleeAttackAttemptEvent +{ + public bool Cancelled = false; + public readonly EntityUid User; + + public MeleeAttackAttemptEvent(EntityUid user) + { + User = user; + } +}