Merge PR #7: Fix entity validity check - fixes #2

Add IsValid checks before Remove() to prevent crashes when players switch teams

- Check entity validity in ToggleFlashlight()
- Check entity validity in OnPlayerDisconnect()
- Add OnPlayerTeam handler for team switch cleanup
- Bump version to 0.0.7
This commit is contained in:
Vesper 2026-02-28 22:21:24 +00:00 • committed by GitHub
commit 1b54187c0f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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))
{
// Fix #2: Check entity validity before removing
if (value.IsValid)
{
value.Remove();
}
_playerFlashlight.Remove(player);
}