Make projectiles not hit crit mobs unless clicked on (#27905)

This commit is contained in:
DrSmugleaf
2024-05-11 08:42:11 -07:00
committed by GitHub
parent 1698e1cfab
commit 8b88fe4bb7
7 changed files with 56 additions and 2 deletions

View File

@@ -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),
}); });

View File

@@ -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))
{ {

View File

@@ -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
} }

View File

@@ -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>

View File

@@ -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;
}

View File

@@ -11,4 +11,5 @@ public sealed class RequestShootEvent : EntityEventArgs
{ {
public NetEntity Gun; public NetEntity Gun;
public NetCoordinates Coordinates; public NetCoordinates Coordinates;
public NetEntity? Target;
} }

View File

@@ -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);
} }