Add reflection for crystals (#16426)

This commit is contained in:
metalgearsloth
2023-05-15 15:21:05 +10:00
committed by GitHub
parent fd35b61160
commit 347dcfbeb5
11 changed files with 177 additions and 81 deletions

View File

@@ -16,6 +16,7 @@ using Content.Shared.Weapons.Melee;
using Content.Shared.Weapons.Ranged;
using Content.Shared.Weapons.Ranged.Components;
using Content.Shared.Weapons.Ranged.Events;
using Content.Shared.Weapons.Reflect;
using Robust.Server.GameObjects;
using Robust.Shared.Audio;
using Robust.Shared.Map;
@@ -40,7 +41,6 @@ public sealed partial class GunSystem : SharedGunSystem
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly BatterySystem _battery = default!;
public const float DamagePitchVariation = SharedMeleeWeaponSystem.DamagePitchVariation;
public const float GunClumsyChance = 0.5f;
@@ -185,30 +185,34 @@ public sealed partial class GunSystem : SharedGunSystem
var fromEffect = fromCoordinates; // can't use map coords above because funny FireEffects
var dir = mapDirection.Normalized;
var lastUser = user;
for (var reflectAttempt = 0; reflectAttempt < 3; reflectAttempt++)
if (hitscan.Reflective != ReflectType.None)
{
var ray = new CollisionRay(from.Position, dir, hitscan.CollisionMask);
var rayCastResults =
Physics.IntersectRay(from.MapId, ray, hitscan.MaxLength, lastUser, false).ToList();
if (!rayCastResults.Any())
break;
for (var reflectAttempt = 0; reflectAttempt < 3; reflectAttempt++)
{
var ray = new CollisionRay(from.Position, dir, hitscan.CollisionMask);
var rayCastResults =
Physics.IntersectRay(from.MapId, ray, hitscan.MaxLength, lastUser, false).ToList();
if (!rayCastResults.Any())
break;
var result = rayCastResults[0];
var hit = result.HitEntity;
lastHit = hit;
var result = rayCastResults[0];
var hit = result.HitEntity;
lastHit = hit;
FireEffects(fromEffect, result.Distance, dir.Normalized.ToAngle(), hitscan, hit);
FireEffects(fromEffect, result.Distance, dir.Normalized.ToAngle(), hitscan, hit);
var ev = new HitScanReflectAttemptEvent(dir, false);
RaiseLocalEvent(hit, ref ev);
var ev = new HitScanReflectAttemptEvent(hitscan.Reflective, dir, false);
RaiseLocalEvent(hit, ref ev);
if (!ev.Reflected)
break;
if (!ev.Reflected)
break;
fromEffect = Transform(hit).Coordinates;
from = fromEffect.ToMap(EntityManager, _transform);
dir = ev.Direction;
lastUser = hit;
fromEffect = Transform(hit).Coordinates;
from = fromEffect.ToMap(EntityManager, _transform);
dir = ev.Direction;
lastUser = hit;
}
}
if (lastHit != null)
@@ -395,7 +399,7 @@ public sealed partial class GunSystem : SharedGunSystem
if (xformQuery.TryGetComponent(gridUid, out var gridXform))
{
var (_, gridRot, gridInvMatrix) = TransformSystem.GetWorldPositionRotationInvMatrix(gridUid.Value, xformQuery);
var (_, gridRot, gridInvMatrix) = TransformSystem.GetWorldPositionRotationInvMatrix(gridXform, xformQuery);
fromCoordinates = new EntityCoordinates(gridUid.Value,
gridInvMatrix.Transform(fromCoordinates.ToMapPos(EntityManager, TransformSystem)));