]> git.deb.at Git - rhonda/impostor.git/commitdiff
Add handling for null ShipStatus
authorAlexejheroYTB <alexejhero@gmail.com>
Sat, 16 Apr 2022 14:11:58 +0000 (17:11 +0300)
committerAlexejheroYTB <alexejhero@gmail.com>
Sat, 16 Apr 2022 14:11:58 +0000 (17:11 +0300)
src/Impostor.Api/Net/Inner/Objects/ITaskInfo.cs
src/Impostor.Server/Net/Inner/Objects/Components/InnerCustomNetworkTransform.cs
src/Impostor.Server/Net/Inner/Objects/Components/InnerPlayerPhysics.cs
src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.cs
src/Impostor.Server/Net/Inner/Objects/InnerGameData.cs
src/Impostor.Server/Net/State/Game.Data.cs
src/Impostor.Server/Net/State/Game.cs

index c7a99289c0f44ef63adcce30279f97c5c36c1f6b..95a56d2c07b5ef59c1d7b4839cf9f1583610f3fe 100644 (file)
@@ -7,7 +7,7 @@ namespace Impostor.Api.Net.Inner.Objects
     {
         uint Id { get; }
 
-        ITask Task { get; }
+        ITask? Task { get; }
 
         bool Complete { get; }
 
index 47cd82b188673076ce15d9dc6ced53351891c64c..4f2c3aa25a96d1fabd4e8bca338fbcefda49e378 100644 (file)
@@ -125,20 +125,31 @@ namespace Impostor.Server.Net.Inner.Objects.Components
                     return false;
                 }
 
-                var vents = Game.GameNet.ShipStatus!.Data.Vents.Values;
-
-                var vent = vents.SingleOrDefault(x => Approximately(x.Position, position + ColliderOffset));
-
-                if (vent == null)
+                if (Game.GameNet.ShipStatus == null)
                 {
-                    if (await sender.Client.ReportCheatAsync(call, "Failed vent position check"))
+                    // Cannot perform vent position check on unknown ship statuses
+                    if (await sender.Client.ReportCheatAsync(call, "Failed vent position check on unknown map"))
                     {
                         return false;
                     }
                 }
                 else
                 {
-                    await _eventManager.CallAsync(new PlayerVentEvent(Game, sender, _playerControl, vent));
+                    var vents = Game.GameNet.ShipStatus!.Data.Vents.Values;
+
+                    var vent = vents.SingleOrDefault(x => Approximately(x.Position, position + ColliderOffset));
+
+                    if (vent == null)
+                    {
+                        if (await sender.Client.ReportCheatAsync(call, "Failed vent position check"))
+                        {
+                            return false;
+                        }
+                    }
+                    else
+                    {
+                        await _eventManager.CallAsync(new PlayerVentEvent(Game, sender, _playerControl, vent));
+                    }
                 }
 
                 await SnapToAsync(sender, position, minSid);
index e914d7eb3ff225e6125bc694b551068deb8a8d6d..7cc936d2745c990095f24d4705790eb34da67b6c 100644 (file)
@@ -66,6 +66,16 @@ namespace Impostor.Server.Net.Inner.Objects.Components
                             throw new ArgumentOutOfRangeException(nameof(call), call, null);
                     }
 
+                    if (Game.GameNet.ShipStatus == null)
+                    {
+                        if (await sender.Client.ReportCheatAsync(call, "Client interacted with vent on unknown map"))
+                        {
+                            return false;
+                        }
+
+                        break;
+                    }
+
                     if (!Game.GameNet.ShipStatus!.Data.Vents.TryGetValue(ventId, out var vent))
                     {
                         if (await sender.Client.ReportCheatAsync(call, "Client interacted with nonexistent vent"))
index f4c5af4d8cf616a1c2bbc8e410c8a4843d910989..4502513dc14ac31df3dabf7ada123ff40a8de4cf 100644 (file)
@@ -12,7 +12,7 @@ namespace Impostor.Server.Net.Inner.Objects
             private readonly InnerPlayerInfo _playerInfo;
             private readonly IEventManager _eventManager;
 
-            public TaskInfo(InnerPlayerInfo playerInfo, IEventManager eventManager, uint id, ITask task)
+            public TaskInfo(InnerPlayerInfo playerInfo, IEventManager eventManager, uint id, ITask? task)
             {
                 _playerInfo = playerInfo;
                 _eventManager = eventManager;
@@ -22,7 +22,7 @@ namespace Impostor.Server.Net.Inner.Objects
 
             public uint Id { get; internal set; }
 
-            public ITask Task { get; internal set; }
+            public ITask? Task { get; internal set; }
 
             public bool Complete { get; internal set; }
 
index d939fed29ac0739d001af17ce771e2d290e40bd6..45107297a382460a65982e5d0b5b6132a1749be2 100644 (file)
@@ -144,7 +144,7 @@ namespace Impostor.Server.Net.Inner.Objects
                     player,
                     _eventManager,
                     taskId++,
-                    Game.GameNet!.ShipStatus!.Data.Tasks[taskTypeId]
+                    Game.GameNet!.ShipStatus?.Data.Tasks[taskTypeId]
                 ));
             }
         }
index 26f2e5b94c4e444d4a10ad453762fe8f4d57a5c5..1052973e3e68e3c432197457958bb885ffe77124 100644 (file)
@@ -187,7 +187,7 @@ namespace Impostor.Server.Net.State
                             continue;
                         }
 
-                        _logger.LogError("Couldn't find spawnable object {0}.", objectId);
+                        _logger.LogWarning("Couldn't find spawnable object {0}.", objectId);
                         break;
                     }
 
index 6d7e4084a3e27a2d4145a3772de8b720f1f9e8b8..ab6d1e99189af46bf430838077100e1089fb02f8 100644 (file)
@@ -103,7 +103,11 @@ namespace Impostor.Server.Net.State
                 foreach (var player in _players.Values)
                 {
                     player.Character?.NetworkTransform.OnPlayerSpawn();
-                    await player.Character!.NetworkTransform.SetPositionAsync(player, GameNet.ShipStatus!.GetSpawnLocation(player.Character, PlayerCount, true), Vector2.Zero);
+
+                    if (GameNet.ShipStatus != null)
+                    {
+                        await player.Character!.NetworkTransform.SetPositionAsync(player, GameNet.ShipStatus.GetSpawnLocation(player.Character, PlayerCount, true), Vector2.Zero);
+                    }
                 }
 
                 GameState = GameStates.Started;