Compare commits

...

2 Commits

Author SHA1 Message Date
MSWS
a80c36e3c5 Suppress damage stats 2025-10-28 15:29:10 -07:00
MSWS
ba6b6c448f Change currency name to point 2025-10-28 14:06:29 -07:00
3 changed files with 57 additions and 14 deletions

View File

@@ -52,6 +52,17 @@ public class CombatHandler(IServiceProvider provider) : IPluginModule {
return HookResult.Continue;
}
[UsedImplicitly]
[GameEventHandler(HookMode.Pre)]
public HookResult OnPlayerDamage(EventPlayerHurt ev, GameEventInfo info) {
var player = ev.Userid;
if (player == null) return HookResult.Continue;
hideAndTrackStats(ev);
return HookResult.Continue;
}
private void hideAndTrackStats(EventPlayerDeath ev,
CCSPlayerController player) {
var victimStats = player.ActionTrackingServices?.MatchStats;
@@ -89,6 +100,16 @@ public class CombatHandler(IServiceProvider provider) : IPluginModule {
"m_pActionTrackingServices");
}
private void hideAndTrackStats(EventPlayerHurt ev) {
var attackerStats = ev.Attacker?.ActionTrackingServices?.MatchStats;
if (attackerStats == null) return;
if (ev.Attacker == null) return;
attackerStats.Damage -= ev.DmgHealth;
Utilities.SetStateChanged(ev.Attacker, "CCSPlayerController",
"m_pActionTrackingServices");
}
[UsedImplicitly]
[GameEventHandler]
public HookResult OnPlayerHurt(EventPlayerHurt ev, GameEventInfo _) {

View File

@@ -20,8 +20,14 @@ public class PlayerStatsTracker(IServiceProvider provider) : IListener {
private readonly ISet<int> revealedDeaths = new HashSet<int>();
private readonly IDictionary<int, (int, int)> roundKillsAndAssists =
new Dictionary<int, (int, int)>();
private readonly IDictionary<int, RoundData> roundStats =
new Dictionary<int, RoundData>();
record RoundData {
public int Kills;
public int Assists;
public int Damage;
}
public void Dispose() { }
@@ -50,24 +56,39 @@ public class PlayerStatsTracker(IServiceProvider provider) : IListener {
ev.Assister == null ? null : converter.GetPlayer(ev.Assister);
if (killer != null) {
roundKillsAndAssists.TryGetValue(killer.Slot, out var def);
def.Item1++;
roundKillsAndAssists[killer.Slot] = def;
roundStats.TryGetValue(killer.Slot, out var def);
def ??= new RoundData();
def.Kills++;
roundStats[killer.Slot] = def;
}
if (assister != null && assister != killer) {
roundKillsAndAssists.TryGetValue(assister.Slot, out var def);
def.Item2++;
roundKillsAndAssists[assister.Slot] = def;
roundStats.TryGetValue(assister.Slot, out var def);
def ??= new RoundData();
def.Assists++;
roundStats[assister.Slot] = def;
}
}
[UsedImplicitly]
[EventHandler(Priority = Priority.HIGH)]
public void OnDamage(PlayerDamagedEvent ev) {
var attacker =
ev.Attacker == null ? null : converter.GetPlayer(ev.Attacker);
if (attacker == null) return;
roundStats.TryGetValue(attacker.Slot, out var def);
def ??= new RoundData();
def.Damage += ev.DmgDealt;
roundStats[attacker.Slot] = def;
}
[UsedImplicitly]
[EventHandler]
public void OnRoundEnd(GameStateUpdateEvent ev) {
if (ev.NewState == State.IN_PROGRESS) {
revealedDeaths.Clear();
roundKillsAndAssists.Clear();
roundStats.Clear();
return;
}
@@ -100,15 +121,16 @@ public class PlayerStatsTracker(IServiceProvider provider) : IListener {
var online = finder.GetOnline()
.Select(p => converter.GetPlayer(p))
.OfType<CCSPlayerController>()
.Where(p => p.IsValid && roundKillsAndAssists.ContainsKey(p.Slot));
.Where(p => p.IsValid && roundStats.ContainsKey(p.Slot));
foreach (var player in online) {
var stats = player.ActionTrackingServices?.MatchStats;
if (stats == null) continue;
var (kills, assists) = roundKillsAndAssists[player.Slot];
stats.Kills += kills;
stats.Assists += assists;
if (!roundStats.TryGetValue(player.Slot, out var data)) continue;
stats.Kills += data.Kills;
stats.Assists += data.Assists;
Utilities.SetStateChanged(player, "CCSPlayerController",
"m_pActionTrackingServices");
}

View File

@@ -34,7 +34,7 @@ SHOP_CANNOT_PURCHASE_WITH_REASON: "%SHOP_PREFIX%You cannot purchase this item: {
SHOP_PURCHASED: "%SHOP_PREFIX%You purchased {white}{0}{grey}."
SHOP_LIST_FOOTER: "%SHOP_PREFIX%You are %an% {0}{grey}, you have {yellow}{1}{grey} %CREDITS_NAME%%s%."
CREDITS_NAME: "credit"
CREDITS_NAME: "point"
CREDITS_GIVEN: "%SHOP_PREFIX%{0}{1} %CREDITS_NAME%%s%"
CREDITS_GIVEN_REASON: "%SHOP_PREFIX%{0}{1} %CREDITS_NAME%%s% {grey}({white}{2}{grey})"