From ae8d53372debc857cd02f5483526471972afb2d7 Mon Sep 17 00:00:00 2001 From: DeveloperNyx Date: Mon, 16 Mar 2026 17:40:09 +0000 Subject: [PATCH] Fixed crash issues by adding null checks --- src/Mono/PlayerInfoDisplay.cs | 27 +++++++++---- .../Gameplay/Player/PlayerControlPatch.cs | 4 +- src/Patches/Gameplay/UI/GameSummaryPatch.cs | 4 ++ src/Patches/Gameplay/UI/MeetingHudPatch.cs | 38 ++++++++++++++----- 4 files changed, 55 insertions(+), 18 deletions(-) diff --git a/src/Mono/PlayerInfoDisplay.cs b/src/Mono/PlayerInfoDisplay.cs index 8f28427..4fa73e6 100644 --- a/src/Mono/PlayerInfoDisplay.cs +++ b/src/Mono/PlayerInfoDisplay.cs @@ -146,7 +146,14 @@ internal class PlayerInfoDisplay : MonoBehaviour /// private void UpdatePlayerInfo() { - if (_player?.Data == null) return; + if (_player == null) return; + if (_player.Data == null) return; + + if (_nameText == null) return; + if (_cachedTranslations == null) return; + + if (_sbTag == null || _sbTagTop == null || _sbTagBottom == null) return; + if (_topText == null || _bottomText == null || _infoText == null) return; var betterData = _player.BetterData(); @@ -169,19 +176,19 @@ internal class PlayerInfoDisplay : MonoBehaviour string friendCode = ValidateFriendCode(out string friendCodeColor); + if (DataManager.Settings == null || DataManager.Settings.Gameplay == null) + return; + if (DataManager.Settings.Gameplay.StreamerMode) - { platform = _cachedTranslations.PlatformHidden; - } if (!_player.IsInShapeshift()) - { SetPlayerOutline(_sbTag); - } if (GameState.IsInGame && GameState.IsLobby && !GameState.IsFreePlay) { SetLobbyInfo(ref newName, betterData, _sbTag); + _sbTagTop.Append($"{platform}+++") .Append($"Lv: {_player.Data.PlayerLevel + 1}+++"); @@ -196,15 +203,21 @@ internal class PlayerInfoDisplay : MonoBehaviour { if (_player.IsImpostorTeammate()) newName = newName.ToColor(Colors.ImpostorRed); + _player.RawSetName(newName); } else { var targetData = Utils.PlayerDataFromPlayerId(_player.shapeshiftTargetPlayerId); - var name = targetData.BetterData()?.RealName ?? targetData.PlayerName; + if (targetData == null) return; + + var betterTargetData = targetData.BetterData(); + string name = betterTargetData != null ? betterTargetData.RealName : targetData.PlayerName; + if (_player.IsImpostorTeammate()) name = name.ToColor(Colors.ImpostorRed); - if (targetData != null) _player.RawSetName(name); + + _player.RawSetName(name); } UpdateTextIfChanged(_topText, _sbTagTop, ref _lastTopText); diff --git a/src/Patches/Gameplay/Player/PlayerControlPatch.cs b/src/Patches/Gameplay/Player/PlayerControlPatch.cs index d0d53ab..9171e31 100644 --- a/src/Patches/Gameplay/Player/PlayerControlPatch.cs +++ b/src/Patches/Gameplay/Player/PlayerControlPatch.cs @@ -54,7 +54,9 @@ internal static class PlayerControlPatch [HarmonyPostfix] private static void PlayerControl_MurderPlayer_Postfix(PlayerControl __instance, PlayerControl target) { - if (target == null) return; + // Check for null references + if (__instance == null || target == null || target.Data == null || __instance.Data == null) + return; // Log kill event with player names and roles Logger_.LogPrivate($"{__instance.Data.PlayerName} Has killed {target.Data.PlayerName} as {__instance.Data.RoleType.GetRoleName()}", "EventLog"); diff --git a/src/Patches/Gameplay/UI/GameSummaryPatch.cs b/src/Patches/Gameplay/UI/GameSummaryPatch.cs index 2eb808d..a60c8c4 100644 --- a/src/Patches/Gameplay/UI/GameSummaryPatch.cs +++ b/src/Patches/Gameplay/UI/GameSummaryPatch.cs @@ -16,6 +16,10 @@ internal static class GameSummaryPatch [HarmonyPostfix] private static void EndGameManager_SetEverythingUp_Postfix(EndGameManager __instance) { + // Check for null references + if (__instance == null) + return; + LogGameEnd(); if (!BAUModdedSupportFlags.HasFlag(BAUModdedSupportFlags.Disable_EndGameSummary)) diff --git a/src/Patches/Gameplay/UI/MeetingHudPatch.cs b/src/Patches/Gameplay/UI/MeetingHudPatch.cs index 86a3230..08ea552 100644 --- a/src/Patches/Gameplay/UI/MeetingHudPatch.cs +++ b/src/Patches/Gameplay/UI/MeetingHudPatch.cs @@ -15,23 +15,32 @@ internal static class MeetingHudPatch [HarmonyPostfix] private static void MeetingHud_Start_Postfix(MeetingHud __instance) { + if (__instance == null || __instance.playerStates == null) return; + foreach (var pva in __instance.playerStates) { + if (pva == null) continue; + var target = Utils.PlayerFromPlayerId(pva.TargetPlayerId); + if (target == null) continue; + pva.gameObject.AddComponent().Init(target, pva); } if (!GameState.IsOnlineGame) return; // Add host icon to meeting hud - __instance.ProceedButton.gameObject.transform.localPosition = new(-2.5f, 2.2f, 0); - __instance.ProceedButton.gameObject.GetComponent().enabled = false; - __instance.ProceedButton.GetComponent().enabled = false; - __instance.HostIcon.enabled = true; - __instance.HostIcon.gameObject.SetActive(true); - __instance.ProceedButton.gameObject.SetActive(true); - MeetingHud.Instance.ProceedButton.DestroyTextTranslators(); - UpdateHostIcon(); + if (__instance.ProceedButton != null && __instance.HostIcon != null) + { + __instance.ProceedButton.gameObject.transform.localPosition = new(-2.5f, 2.2f, 0); + __instance.ProceedButton.gameObject.GetComponent().enabled = false; + __instance.ProceedButton.GetComponent().enabled = false; + __instance.HostIcon.enabled = true; + __instance.HostIcon.gameObject.SetActive(true); + __instance.ProceedButton.gameObject.SetActive(true); + UpdateHostIcon(); + MeetingHud.Instance.ProceedButton.DestroyTextTranslators(); + } Logger_.LogHeader("Meeting Has Started"); } @@ -39,9 +48,18 @@ internal static class MeetingHudPatch internal static void UpdateHostIcon() { if (MeetingHud.Instance == null) return; + if (GameData.Instance == null) return; - PlayerMaterial.SetColors(GameData.Instance.GetHost().Color, MeetingHud.Instance.HostIcon); - MeetingHud.Instance.ProceedButton.gameObject.GetComponentInChildren().text = string.Format(Translator.GetString("HostInMeeting"), GameData.Instance.GetHost().BetterData().RealName); + var host = GameData.Instance.GetHost(); + if (host == null || host.BetterData() == null) return; + + var hostColor = host.Color; + var hostRealName = host.BetterData().RealName; + + if (MeetingHud.Instance.HostIcon == null || MeetingHud.Instance.ProceedButton == null) return; + + PlayerMaterial.SetColors(hostColor, MeetingHud.Instance.HostIcon); + MeetingHud.Instance.ProceedButton.gameObject.GetComponentInChildren().text = string.Format(Translator.GetString("HostInMeeting"), hostRealName); } internal static float timeOpen = 0f;