diff --git a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs index e8e7e16690..f14524c607 100644 --- a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs +++ b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs @@ -206,7 +206,7 @@ public sealed partial class GunSystem : SharedGunSystem FireEffects(fromEffect, result.Distance, dir.Normalized.ToAngle(), hitscan, hit); - var ev = new HitScanReflectAttemptEvent(hitscan.Reflective, dir, false); + var ev = new HitScanReflectAttemptEvent(user, gunUid, hitscan.Reflective, dir, false); RaiseLocalEvent(hit, ref ev); if (!ev.Reflected) diff --git a/Content.Shared/Weapons/Ranged/Events/HitScanReflectAttempt.cs b/Content.Shared/Weapons/Ranged/Events/HitScanReflectAttempt.cs index 9857da87bc..f9e46f3aeb 100644 --- a/Content.Shared/Weapons/Ranged/Events/HitScanReflectAttempt.cs +++ b/Content.Shared/Weapons/Ranged/Events/HitScanReflectAttempt.cs @@ -7,4 +7,4 @@ namespace Content.Shared.Weapons.Ranged.Events; /// and changing where shot will go next /// [ByRefEvent] -public record struct HitScanReflectAttemptEvent(ReflectType Reflective, Vector2 Direction, bool Reflected); +public record struct HitScanReflectAttemptEvent(EntityUid? Shooter, EntityUid SourceItem, ReflectType Reflective, Vector2 Direction, bool Reflected); diff --git a/Content.Shared/Weapons/Reflect/SharedReflectSystem.cs b/Content.Shared/Weapons/Reflect/SharedReflectSystem.cs index 0940f9dfad..1ee05f8f99 100644 --- a/Content.Shared/Weapons/Reflect/SharedReflectSystem.cs +++ b/Content.Shared/Weapons/Reflect/SharedReflectSystem.cs @@ -1,5 +1,7 @@ using System.Diagnostics.CodeAnalysis; +using Content.Shared.Administration.Logs; using Content.Shared.Audio; +using Content.Shared.Database; using Content.Shared.Hands.Components; using Content.Shared.Weapons.Ranged.Events; using Robust.Shared.Physics.Components; @@ -19,6 +21,7 @@ public abstract class SharedReflectSystem : EntitySystem { [Dependency] private readonly INetManager _netManager = default!; [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; @@ -88,10 +91,16 @@ public abstract class SharedReflectSystem : EntitySystem if (Resolve(projectile, ref projectileComp, false)) { + _adminLogger.Add(LogType.BulletHit, LogImpact.Medium, $"{ToPrettyString(reflector)} reflected {ToPrettyString(projectile)} from {ToPrettyString(projectileComp.Weapon)} shot by {projectileComp.Shooter}"); + projectileComp.Shooter = reflector; projectileComp.Weapon = reflector; Dirty(projectileComp); } + else + { + _adminLogger.Add(LogType.BulletHit, LogImpact.Medium, $"{ToPrettyString(reflector)} reflected {ToPrettyString(projectile)}"); + } return true; } @@ -101,7 +110,7 @@ public abstract class SharedReflectSystem : EntitySystem if (args.Reflected || hands.ActiveHandEntity == null) return; - if (TryReflectHitscan(hands.ActiveHandEntity.Value, args.Direction, out var dir)) + if (TryReflectHitscan(hands.ActiveHandEntity.Value, args.Shooter, args.SourceItem, args.Direction, out var dir)) { args.Direction = dir.Value; args.Reflected = true; @@ -116,14 +125,14 @@ public abstract class SharedReflectSystem : EntitySystem return; } - if (TryReflectHitscan(uid, args.Direction, out var dir)) + if (TryReflectHitscan(uid, args.Shooter, args.SourceItem, args.Direction, out var dir)) { args.Direction = dir.Value; args.Reflected = true; } } - private bool TryReflectHitscan(EntityUid reflector, Vector2 direction, + private bool TryReflectHitscan(EntityUid reflector, EntityUid? shooter, EntityUid shotSource, Vector2 direction, [NotNullWhen(true)] out Vector2? newDirection) { if (!TryComp(reflector, out var reflect) || @@ -142,6 +151,12 @@ public abstract class SharedReflectSystem : EntitySystem var spread = _random.NextAngle(-reflect.Spread / 2, reflect.Spread / 2); newDirection = -spread.RotateVec(direction); + + if (shooter != null) + _adminLogger.Add(LogType.HitScanHit, LogImpact.Medium, $"{ToPrettyString(reflector)} reflected hitscan from {ToPrettyString(shotSource)} shot by {ToPrettyString(shooter.Value)}"); + else + _adminLogger.Add(LogType.HitScanHit, LogImpact.Medium, $"{ToPrettyString(reflector)} reflected hitscan from {ToPrettyString(shotSource)}"); + return true; } }