From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Sun, 16 Feb 2025 16:14:04 +0000 (+1100) Subject: Fix hitscan visuals (#34515) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=ca9479fe697a3bd0877111383bb5faca9c5ba4fd;p=space-station-14.git Fix hitscan visuals (#34515) * Fix hitscan visuals * remove unnecessary changes * rename `mapDirection` --- diff --git a/Content.Client/Weapons/Ranged/Systems/GunSystem.cs b/Content.Client/Weapons/Ranged/Systems/GunSystem.cs index 0ad22bf1d8..e9b20bc874 100644 --- a/Content.Client/Weapons/Ranged/Systems/GunSystem.cs +++ b/Content.Client/Weapons/Ranged/Systems/GunSystem.cs @@ -37,6 +37,7 @@ public sealed partial class GunSystem : SharedGunSystem [Dependency] private readonly InputSystem _inputSystem = default!; [Dependency] private readonly SharedCameraRecoilSystem _recoil = default!; [Dependency] private readonly SharedMapSystem _maps = default!; + [Dependency] private readonly SharedTransformSystem _xform = default!; [ValidatePrototypeId] public const string HitscanProto = "HitscanEffect"; @@ -102,6 +103,13 @@ public sealed partial class GunSystem : SharedGunSystem private void OnHitscan(HitscanEvent ev) { // ALL I WANT IS AN ANIMATED EFFECT + + // TODO EFFECTS + // This is very jank + // because the effect consists of three unrelatd entities, the hitscan beam can be split appart. + // E.g., if a grid rotates while part of the beam is parented to the grid, and part of it is parented to the map. + // Ideally, there should only be one entity, with one sprite that has multiple layers + // Or at the very least, have the other entities parented to the same entity to make sure they stick together. foreach (var a in ev.Sprites) { if (a.Sprite is not SpriteSpecifier.Rsi rsi) @@ -109,13 +117,17 @@ public sealed partial class GunSystem : SharedGunSystem var coords = GetCoordinates(a.coordinates); - if (Deleted(coords.EntityId)) + if (!TryComp(coords.EntityId, out TransformComponent? relativeXform)) continue; var ent = Spawn(HitscanProto, coords); var sprite = Comp(ent); + var xform = Transform(ent); - xform.LocalRotation = a.angle; + var targetWorldRot = a.angle + _xform.GetWorldRotation(relativeXform); + var delta = targetWorldRot - _xform.GetWorldRotation(xform); + _xform.SetLocalRotationNoLerp(ent, xform.LocalRotation + delta, xform); + sprite[EffectLayers.Unshaded].AutoAnimated = false; sprite.LayerSetSprite(EffectLayers.Unshaded, rsi); sprite.LayerSetState(EffectLayers.Unshaded, rsi.RsiState); diff --git a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs index d22b5ec2af..fe0447c4c7 100644 --- a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs +++ b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs @@ -390,29 +390,29 @@ public sealed partial class GunSystem : SharedGunSystem // TODO: Pseudo RNG so the client can predict these. #region Hitscan effects - private void FireEffects(EntityCoordinates fromCoordinates, float distance, Angle mapDirection, HitscanPrototype hitscan, EntityUid? hitEntity = null) + private void FireEffects(EntityCoordinates fromCoordinates, float distance, Angle angle, HitscanPrototype hitscan, EntityUid? hitEntity = null) { // Lord // Forgive me for the shitcode I am about to do // Effects tempt me not var sprites = new List<(NetCoordinates coordinates, Angle angle, SpriteSpecifier sprite, float scale)>(); - var gridUid = fromCoordinates.GetGridUid(EntityManager); - var angle = mapDirection; + var fromXform = Transform(fromCoordinates.EntityId); // We'll get the effects relative to the grid / map of the firer // Look you could probably optimise this a bit with redundant transforms at this point. - var xformQuery = GetEntityQuery(); - if (xformQuery.TryGetComponent(gridUid, out var gridXform)) + var gridUid = fromXform.GridUid; + if (gridUid != fromCoordinates.EntityId && TryComp(gridUid, out TransformComponent? gridXform)) { - var (_, gridRot, gridInvMatrix) = TransformSystem.GetWorldPositionRotationInvMatrix(gridXform, xformQuery); - - fromCoordinates = new EntityCoordinates(gridUid.Value, - Vector2.Transform(fromCoordinates.ToMapPos(EntityManager, TransformSystem), gridInvMatrix)); - - // Use the fallback angle I guess? + var (_, gridRot, gridInvMatrix) = TransformSystem.GetWorldPositionRotationInvMatrix(gridXform); + var map = _transform.ToMapCoordinates(fromCoordinates); + fromCoordinates = new EntityCoordinates(gridUid.Value, Vector2.Transform(map.Position, gridInvMatrix)); angle -= gridRot; } + else + { + angle -= _transform.GetWorldRotation(fromXform); + } if (distance >= 1f) {