Make projectiles not hit crit mobs unless clicked on (#27905)
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
using Content.Client.Animations;
|
using Content.Client.Animations;
|
||||||
|
using Content.Client.Gameplay;
|
||||||
using Content.Client.Items;
|
using Content.Client.Items;
|
||||||
using Content.Client.Weapons.Ranged.Components;
|
using Content.Client.Weapons.Ranged.Components;
|
||||||
using Content.Shared.Camera;
|
using Content.Shared.Camera;
|
||||||
@@ -13,6 +14,7 @@ using Robust.Client.GameObjects;
|
|||||||
using Robust.Client.Graphics;
|
using Robust.Client.Graphics;
|
||||||
using Robust.Client.Input;
|
using Robust.Client.Input;
|
||||||
using Robust.Client.Player;
|
using Robust.Client.Player;
|
||||||
|
using Robust.Client.State;
|
||||||
using Robust.Shared.Animations;
|
using Robust.Shared.Animations;
|
||||||
using Robust.Shared.Input;
|
using Robust.Shared.Input;
|
||||||
using Robust.Shared.Map;
|
using Robust.Shared.Map;
|
||||||
@@ -30,6 +32,7 @@ public sealed partial class GunSystem : SharedGunSystem
|
|||||||
[Dependency] private readonly IEyeManager _eyeManager = default!;
|
[Dependency] private readonly IEyeManager _eyeManager = default!;
|
||||||
[Dependency] private readonly IInputManager _inputManager = default!;
|
[Dependency] private readonly IInputManager _inputManager = default!;
|
||||||
[Dependency] private readonly IPlayerManager _player = default!;
|
[Dependency] private readonly IPlayerManager _player = default!;
|
||||||
|
[Dependency] private readonly IStateManager _state = default!;
|
||||||
[Dependency] private readonly AnimationPlayerSystem _animPlayer = default!;
|
[Dependency] private readonly AnimationPlayerSystem _animPlayer = default!;
|
||||||
[Dependency] private readonly InputSystem _inputSystem = default!;
|
[Dependency] private readonly InputSystem _inputSystem = default!;
|
||||||
[Dependency] private readonly SharedCameraRecoilSystem _recoil = default!;
|
[Dependency] private readonly SharedCameraRecoilSystem _recoil = default!;
|
||||||
@@ -174,10 +177,15 @@ public sealed partial class GunSystem : SharedGunSystem
|
|||||||
// Define target coordinates relative to gun entity, so that network latency on moving grids doesn't fuck up the target location.
|
// Define target coordinates relative to gun entity, so that network latency on moving grids doesn't fuck up the target location.
|
||||||
var coordinates = EntityCoordinates.FromMap(entity, mousePos, TransformSystem, EntityManager);
|
var coordinates = EntityCoordinates.FromMap(entity, mousePos, TransformSystem, EntityManager);
|
||||||
|
|
||||||
|
NetEntity? target = null;
|
||||||
|
if (_state.CurrentState is GameplayStateBase screen)
|
||||||
|
target = GetNetEntity(screen.GetClickedEntity(mousePos));
|
||||||
|
|
||||||
Log.Debug($"Sending shoot request tick {Timing.CurTick} / {Timing.CurTime}");
|
Log.Debug($"Sending shoot request tick {Timing.CurTick} / {Timing.CurTime}");
|
||||||
|
|
||||||
EntityManager.RaisePredictiveEvent(new RequestShootEvent
|
EntityManager.RaisePredictiveEvent(new RequestShootEvent
|
||||||
{
|
{
|
||||||
|
Target = target,
|
||||||
Coordinates = GetNetCoordinates(coordinates),
|
Coordinates = GetNetCoordinates(coordinates),
|
||||||
Gun = GetNetEntity(gunUid),
|
Gun = GetNetEntity(gunUid),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -278,6 +278,13 @@ public sealed partial class GunSystem : SharedGunSystem
|
|||||||
|
|
||||||
private void ShootOrThrow(EntityUid uid, Vector2 mapDirection, Vector2 gunVelocity, GunComponent gun, EntityUid gunUid, EntityUid? user)
|
private void ShootOrThrow(EntityUid uid, Vector2 mapDirection, Vector2 gunVelocity, GunComponent gun, EntityUid gunUid, EntityUid? user)
|
||||||
{
|
{
|
||||||
|
if (gun.Target is { } target && !TerminatingOrDeleted(target))
|
||||||
|
{
|
||||||
|
var targeted = EnsureComp<TargetedProjectileComponent>(uid);
|
||||||
|
targeted.Target = target;
|
||||||
|
Dirty(uid, targeted);
|
||||||
|
}
|
||||||
|
|
||||||
// Do a throw
|
// Do a throw
|
||||||
if (!HasComp<ProjectileComponent>(uid))
|
if (!HasComp<ProjectileComponent>(uid))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -10,12 +10,15 @@ using Content.Shared.Item;
|
|||||||
using Content.Shared.Mobs.Components;
|
using Content.Shared.Mobs.Components;
|
||||||
using Content.Shared.Movement.Events;
|
using Content.Shared.Movement.Events;
|
||||||
using Content.Shared.Pointing;
|
using Content.Shared.Pointing;
|
||||||
|
using Content.Shared.Projectiles;
|
||||||
using Content.Shared.Pulling.Events;
|
using Content.Shared.Pulling.Events;
|
||||||
using Content.Shared.Speech;
|
using Content.Shared.Speech;
|
||||||
using Content.Shared.Standing;
|
using Content.Shared.Standing;
|
||||||
using Content.Shared.Strip.Components;
|
using Content.Shared.Strip.Components;
|
||||||
using Content.Shared.Throwing;
|
using Content.Shared.Throwing;
|
||||||
|
using Content.Shared.Weapons.Ranged.Components;
|
||||||
using Robust.Shared.Physics.Components;
|
using Robust.Shared.Physics.Components;
|
||||||
|
using Robust.Shared.Physics.Events;
|
||||||
|
|
||||||
namespace Content.Shared.Mobs.Systems;
|
namespace Content.Shared.Mobs.Systems;
|
||||||
|
|
||||||
@@ -43,6 +46,7 @@ public partial class MobStateSystem
|
|||||||
SubscribeLocalEvent<MobStateComponent, TryingToSleepEvent>(OnSleepAttempt);
|
SubscribeLocalEvent<MobStateComponent, TryingToSleepEvent>(OnSleepAttempt);
|
||||||
SubscribeLocalEvent<MobStateComponent, CombatModeShouldHandInteractEvent>(OnCombatModeShouldHandInteract);
|
SubscribeLocalEvent<MobStateComponent, CombatModeShouldHandInteractEvent>(OnCombatModeShouldHandInteract);
|
||||||
SubscribeLocalEvent<MobStateComponent, AttemptPacifiedAttackEvent>(OnAttemptPacifiedAttack);
|
SubscribeLocalEvent<MobStateComponent, AttemptPacifiedAttackEvent>(OnAttemptPacifiedAttack);
|
||||||
|
SubscribeLocalEvent<MobStateComponent, PreventCollideEvent>(OnPreventCollide);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnStateExitSubscribers(EntityUid target, MobStateComponent component, MobState state)
|
private void OnStateExitSubscribers(EntityUid target, MobStateComponent component, MobState state)
|
||||||
@@ -175,5 +179,21 @@ public partial class MobStateSystem
|
|||||||
args.Cancelled = true;
|
args.Cancelled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnPreventCollide(Entity<MobStateComponent> ent, ref PreventCollideEvent args)
|
||||||
|
{
|
||||||
|
if (args.Cancelled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (IsAlive(ent, ent))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var other = args.OtherEntity;
|
||||||
|
if (HasComp<ProjectileComponent>(other) &&
|
||||||
|
CompOrNull<TargetedProjectileComponent>(other)?.Target != ent.Owner)
|
||||||
|
{
|
||||||
|
args.Cancelled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
using Content.Shared.Damage;
|
|
||||||
using Content.Shared.Tag;
|
|
||||||
using Content.Shared.Weapons.Ranged.Events;
|
using Content.Shared.Weapons.Ranged.Events;
|
||||||
using Content.Shared.Weapons.Ranged.Systems;
|
using Content.Shared.Weapons.Ranged.Systems;
|
||||||
using Robust.Shared.Audio;
|
using Robust.Shared.Audio;
|
||||||
@@ -139,6 +137,12 @@ public sealed partial class GunComponent : Component
|
|||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
public EntityCoordinates? ShootCoordinates = null;
|
public EntityCoordinates? ShootCoordinates = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Who the gun is being requested to shoot at directly.
|
||||||
|
/// </summary>
|
||||||
|
[ViewVariables]
|
||||||
|
public EntityUid? Target = null;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The base value for how many shots to fire per burst.
|
/// The base value for how many shots to fire per burst.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
using Content.Shared.Weapons.Ranged.Systems;
|
||||||
|
using Robust.Shared.GameStates;
|
||||||
|
|
||||||
|
namespace Content.Shared.Weapons.Ranged.Components;
|
||||||
|
|
||||||
|
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||||
|
[Access(typeof(SharedGunSystem))]
|
||||||
|
public sealed partial class TargetedProjectileComponent : Component
|
||||||
|
{
|
||||||
|
[DataField, AutoNetworkedField]
|
||||||
|
public EntityUid Target;
|
||||||
|
}
|
||||||
@@ -11,4 +11,5 @@ public sealed class RequestShootEvent : EntityEventArgs
|
|||||||
{
|
{
|
||||||
public NetEntity Gun;
|
public NetEntity Gun;
|
||||||
public NetCoordinates Coordinates;
|
public NetCoordinates Coordinates;
|
||||||
|
public NetEntity? Target;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ public abstract partial class SharedGunSystem : EntitySystem
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
gun.ShootCoordinates = GetCoordinates(msg.Coordinates);
|
gun.ShootCoordinates = GetCoordinates(msg.Coordinates);
|
||||||
|
gun.Target = GetEntity(msg.Target);
|
||||||
AttemptShoot(user.Value, ent, gun);
|
AttemptShoot(user.Value, ent, gun);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,6 +197,7 @@ public abstract partial class SharedGunSystem : EntitySystem
|
|||||||
|
|
||||||
gun.ShotCounter = 0;
|
gun.ShotCounter = 0;
|
||||||
gun.ShootCoordinates = null;
|
gun.ShootCoordinates = null;
|
||||||
|
gun.Target = null;
|
||||||
Dirty(uid, gun);
|
Dirty(uid, gun);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user