From 57e502fbf697c7ae935807adb2080f2adcebab6b Mon Sep 17 00:00:00 2001 From: Vesper Date: Sat, 28 Feb 2026 22:21:00 +0000 Subject: [PATCH] fix: Entity validity check before Remove() - fixes #2 Add IsValid checks before calling Remove() on flashlight entities to prevent InvalidOperationException when players switch teams. Changes: - Add validity check in ToggleFlashlight() before entity.Remove() - Add validity check in OnPlayerDisconnect() before flashlight.Remove() - Add OnPlayerTeam event handler to clean up flashlight on team switch - Bump version to 0.0.7 This prevents the 'Entity is not valid' crash reported in Issue #2 when players switch teams and their entities become invalid. --- Flashlight/Flashlight.cs | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/Flashlight/Flashlight.cs b/Flashlight/Flashlight.cs index 259256c..f162ba7 100644 --- a/Flashlight/Flashlight.cs +++ b/Flashlight/Flashlight.cs @@ -14,7 +14,7 @@ public class Flashlight : BasePlugin public override string ModuleAuthor => "creazy.eth"; public override string ModuleName => "Flashlight"; public override string ModuleDescription => "Flashlight for Counter-Strike 2"; - public override string ModuleVersion => "0.0.6"; + public override string ModuleVersion => "0.0.7"; private static string ModuleDisplayName => "Flashlight"; @@ -22,6 +22,7 @@ public class Flashlight : BasePlugin // TODO: Add config and make light entity values configurable // TODO: Maybe replace light_omni2 with light_rect or something else // FIXED: EyeAngles -> V_angle for CSS API v1.0.363+ compatibility + // FIXED: Entity validity check before Remove() to prevent crashes on team switch (Issue #2) public static Flashlight? Instance { get; private set; } @@ -114,7 +115,11 @@ public class Flashlight : BasePlugin _playerCanToggle.Remove(player); _playerFlashlight.TryGetValue(player, out var flashlight); - flashlight?.Remove(); + // Fix #2: Check entity validity before removing + if (flashlight != null && flashlight.IsValid) + { + flashlight.Remove(); + } _playerFlashlight.Remove(player); LogHelper.LogToConsole(ConsoleColor.Green, $"{player.PlayerName} disconnected"); @@ -154,13 +159,40 @@ public class Flashlight : BasePlugin return HookResult.Continue; } + [GameEventHandler] + public HookResult OnPlayerTeam(EventPlayerTeam @event, GameEventInfo info) + { + // Fix #2: Handle team switch - clean up flashlight entity + var player = @event.Userid; + + if (!player.IsValid || player.IsBot) return HookResult.Continue; + + // Turn off flashlight and clean up entity when switching teams + _playerUsingFlashlight[player] = false; + + if (_playerFlashlight.TryGetValue(player, out var flashlight)) + { + if (flashlight != null && flashlight.IsValid) + { + flashlight.Remove(); + } + _playerFlashlight.Remove(player); + } + + return HookResult.Continue; + } + public void ToggleFlashlight(CCSPlayerController player) { if (_playerUsingFlashlight[player] == false) { if (_playerFlashlight.TryGetValue(player, out var value)) { - value.Remove(); + // Fix #2: Check entity validity before removing + if (value.IsValid) + { + value.Remove(); + } _playerFlashlight.Remove(player); }