Files
cs2-sendproxy/examples/CounterStrikeSharp/SendProxyHealth23/SendProxyHealth23Plugin.cs

92 lines
2.5 KiB
C#

using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Timers;
using SendProxyInterop;
using Timer = CounterStrikeSharp.API.Modules.Timers.Timer;
namespace SendProxyHealth23;
public sealed class SendProxyHealth23Plugin : BasePlugin
{
private const int RecipientAll = -1;
private const int SpoofedHealth = 23;
private readonly Dictionary<int, int> _rulesByPawnIndex = new();
private SendProxyNative? _sendProxy;
private Timer? _syncTimer;
public override string ModuleName => "SendProxy Health 23";
public override string ModuleVersion => "0.1.0";
public override string ModuleAuthor => "OpenAI Codex";
public override void Load(bool hotReload)
{
_sendProxy = SendProxyNative.FromGameDirectory(Server.GameDirectory);
_syncTimer = AddTimer(0.25f, SyncRules, TimerFlags.REPEAT);
Server.NextFrame(SyncRules);
}
public override void Unload(bool hotReload)
{
_syncTimer?.Kill();
ClearRules();
_sendProxy?.Dispose();
_sendProxy = null;
}
private void SyncRules()
{
if (_sendProxy == null)
return;
int[] desiredPawnIndexes;
try
{
desiredPawnIndexes = Utilities.GetPlayers()
.Select(player => player.PlayerPawn.Value)
.Where(pawn => pawn != null && pawn.IsValid)
.Select(pawn => (int)pawn!.Index)
.Distinct()
.ToArray();
}
catch (NativeException)
{
return;
}
var desired = desiredPawnIndexes.ToHashSet();
foreach (int pawnIndex in _rulesByPawnIndex.Keys.Except(desired).ToArray())
{
_sendProxy.RemoveOverride(_rulesByPawnIndex[pawnIndex]);
_rulesByPawnIndex.Remove(pawnIndex);
}
foreach (int pawnIndex in desiredPawnIndexes)
{
if (_rulesByPawnIndex.ContainsKey(pawnIndex))
continue;
int ruleId = _sendProxy.SetInt32(
RecipientAll,
pawnIndex,
"CBaseEntity",
"m_iHealth",
SpoofedHealth);
if (ruleId != 0)
_rulesByPawnIndex[pawnIndex] = ruleId;
}
}
private void ClearRules()
{
if (_sendProxy == null)
return;
foreach (int ruleId in _rulesByPawnIndex.Values)
_sendProxy.RemoveOverride(ruleId);
_rulesByPawnIndex.Clear();
}
}