await obj.DeserializeAsync(sender, target, readerSub, true);
}
- await OnSpawnAsync(obj);
+ await OnSpawnAsync(sender, obj);
}
continue;
return true;
}
- private async ValueTask OnSpawnAsync(InnerNetObject netObj)
+ private async ValueTask OnSpawnAsync(ClientPlayer sender, InnerNetObject netObj)
{
switch (netObj)
{
case InnerPlayerControl control:
{
// Hook up InnerPlayerControl <-> IClientPlayer.
- if (!TryGetPlayer(control.OwnerId, out var player))
+ if (TryGetPlayer(control.OwnerId, out var player))
{
- throw new ImpostorException("Failed to find player that spawned the InnerPlayerControl");
+ player.Character = control;
+ player.DisableSpawnTimeout();
+ }
+ else
+ {
+ await sender.Client.ReportCheatAsync(new CheatContext(nameof(GameDataTag.SpawnFlag)), "Failed to find player that spawned the InnerPlayerControl");
}
-
- player.Character = control;
- player.DisableSpawnTimeout();
// Hook up InnerPlayerControl <-> InnerPlayerControl.PlayerInfo.
var playerInfo = GameNet.GameData!.GetPlayerById(control.PlayerId) ?? GameNet.GameData.AddPlayer(control);
control.PlayerInfo = playerInfo;
}
- await _eventManager.CallAsync(new PlayerSpawnedEvent(this, player, control));
+ if (player != null)
+ {
+ await _eventManager.CallAsync(new PlayerSpawnedEvent(this, player, control));
+ }
break;
}