Merge pull request #474 from SubmergedAmongUs/master

Add handling for null ShipStatus
This commit is contained in:
miniduikboot authored and GitHub committed 2022-04-20 18:49:37 +02:00
commit aeefc40ef1
7 files changed
+39 -14

No files matched your search

@@ -7,7 +7,7 @@ namespace Impostor.Api.Net.Inner.Objects
{
uint Id { get; }
ITask Task { get; }
ITask? Task { get; }
bool Complete { get; }
@@ -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);
@@ -66,7 +66,17 @@ namespace Impostor.Server.Net.Inner.Objects.Components
throw new ArgumentOutOfRangeException(nameof(call), call, null);
}
if (!Game.GameNet.ShipStatus!.Data.Vents.TryGetValue(ventId, out var vent))
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"))
{
@@ -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; }
@@ -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]
));
}
}
+1 -1
View 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;
}
+5 -1
View 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;