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.
This commit is contained in:
Vesper 2026-02-28 22:21:00 +00:00
parent 806a3a9156
commit 57e502fbf6

View file

@ -14,7 +14,7 @@ public class Flashlight : BasePlugin
public override string ModuleAuthor => "creazy.eth"; public override string ModuleAuthor => "creazy.eth";
public override string ModuleName => "Flashlight"; public override string ModuleName => "Flashlight";
public override string ModuleDescription => "Flashlight for Counter-Strike 2"; 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"; private static string ModuleDisplayName => "Flashlight";
@ -22,6 +22,7 @@ public class Flashlight : BasePlugin
// TODO: Add config and make light entity values configurable // TODO: Add config and make light entity values configurable
// TODO: Maybe replace light_omni2 with light_rect or something else // TODO: Maybe replace light_omni2 with light_rect or something else
// FIXED: EyeAngles -> V_angle for CSS API v1.0.363+ compatibility // 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; } public static Flashlight? Instance { get; private set; }
@ -114,7 +115,11 @@ public class Flashlight : BasePlugin
_playerCanToggle.Remove(player); _playerCanToggle.Remove(player);
_playerFlashlight.TryGetValue(player, out var flashlight); _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); _playerFlashlight.Remove(player);
LogHelper.LogToConsole(ConsoleColor.Green, $"{player.PlayerName} disconnected"); LogHelper.LogToConsole(ConsoleColor.Green, $"{player.PlayerName} disconnected");
@ -154,13 +159,40 @@ public class Flashlight : BasePlugin
return HookResult.Continue; 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) public void ToggleFlashlight(CCSPlayerController player)
{ {
if (_playerUsingFlashlight[player] == false) if (_playerUsingFlashlight[player] == false)
{ {
if (_playerFlashlight.TryGetValue(player, out var value)) if (_playerFlashlight.TryGetValue(player, out var value))
{
// Fix #2: Check entity validity before removing
if (value.IsValid)
{ {
value.Remove(); value.Remove();
}
_playerFlashlight.Remove(player); _playerFlashlight.Remove(player);
} }