From a2a3e5e2e4f80d71c8b4c599b1ca0e8ab3161db1 Mon Sep 17 00:00:00 2001
From: moneyl <8206401+Moneyl@users.noreply.github.com>
Date: Sat, 8 Feb 2020 14:46:12 -0500
Subject: [PATCH] Fix issues with exploding items from own hand (#645)
* Fix crash in CameraRecoilComponent from NaN values
Doesn't proceed with camera shake if either component of recoil is NaN.
* Log NaN recoil value in CameraRecoilComponent
* Fix ExplosionHelper passing NaN recoil values when exploding from hand
With other commits CameraRecoilComponent now won't crash from NaN recoil values. Still want to fix this so explosions shake the camera. Just sets a value slightly greater than 0.0 for distance if it is (0.0, 0.0)
---
.../Components/Mobs/CameraRecoilComponent.cs | 9 ++++++++-
Content.Server/Explosions/ExplosionHelper.cs | 11 ++++++++++-
2 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/Content.Client/GameObjects/Components/Mobs/CameraRecoilComponent.cs b/Content.Client/GameObjects/Components/Mobs/CameraRecoilComponent.cs
index 6bd54f02bb..d150eb7108 100644
--- a/Content.Client/GameObjects/Components/Mobs/CameraRecoilComponent.cs
+++ b/Content.Client/GameObjects/Components/Mobs/CameraRecoilComponent.cs
@@ -1,9 +1,10 @@
-using System;
+using System;
using Content.Shared.GameObjects.Components.Mobs;
using Robust.Client.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.Interfaces.GameObjects;
using Robust.Shared.Interfaces.Network;
+using Robust.Shared.Log;
using Robust.Shared.Maths;
namespace Content.Client.GameObjects.Components.Mobs
@@ -42,6 +43,12 @@ namespace Content.Client.GameObjects.Components.Mobs
public override void Kick(Vector2 recoil)
{
+ if (float.IsNaN(recoil.X) || float.IsNaN(recoil.Y))
+ {
+ Logger.Error($"CameraRecoilComponent on entity {Owner.Uid} passed a NaN recoil value. Ignoring.");
+ return;
+ }
+
// Use really bad math to "dampen" kicks when we're already kicked.
var existing = _currentKick.Length;
var dampen = existing/KickMagnitudeMax;
diff --git a/Content.Server/Explosions/ExplosionHelper.cs b/Content.Server/Explosions/ExplosionHelper.cs
index 89213971ee..39812a412e 100644
--- a/Content.Server/Explosions/ExplosionHelper.cs
+++ b/Content.Server/Explosions/ExplosionHelper.cs
@@ -20,6 +20,12 @@ namespace Content.Server.Explosions
{
public static class ExplosionHelper
{
+ ///
+ /// Distance used for camera shake when distance from explosion is (0.0, 0.0).
+ /// Avoids getting NaN values down the line from doing math on (0.0, 0.0).
+ ///
+ private static Vector2 _epicenterDistance = (0.1f, 0.1f);
+
public static void SpawnExplosion(GridCoordinates coords, int devastationRange, int heavyImpactRange, int lightImpactRange, int flashRange)
{
var tileDefinitionManager = IoCManager.Resolve();
@@ -130,8 +136,11 @@ namespace Content.Server.Explosions
var playerPos = player.AttachedEntity.Transform.WorldPosition;
var delta = coords.ToMapPos(mapManager) - playerPos;
- var distance = delta.LengthSquared;
+ //Change if zero. Will result in a NaN later breaking camera shake if not changed
+ if (delta.EqualsApprox((0.0f, 0.0f)))
+ delta = _epicenterDistance;
+ var distance = delta.LengthSquared;
var effect = 1 / (1 + 0.2f * distance);
if (effect > 0.01f)
{