Skip to content

Commit d7a62af

Browse files
Added firstDamageStats + added test + many other small changes
1 parent 53cbd91 commit d7a62af

File tree

12 files changed

+280
-43
lines changed

12 files changed

+280
-43
lines changed

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<Company>Source Engine Discord</Company>
1616
<Copyright>© 2014 EHVAG, 2020 Source Engine Discord and contributors</Copyright>
1717
<Product>SourceEngine.Demo</Product>
18-
<Version>2.0.9</Version>
18+
<Version>2.1.0</Version>
1919
</PropertyGroup>
2020

2121
<PropertyGroup Label="Package Metadata">

src/SourceEngine.Demo.Parser/DP/Handler/GameEventHandler.cs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -227,15 +227,21 @@ public static void Apply(GameEvent rawEvent, DemoParser parser, bool parseChicke
227227
data = MapData (eventDescriptor, rawEvent);
228228

229229
WeaponFiredEventArgs fire = new WeaponFiredEventArgs ();
230-
fire.Shooter = parser.Players.ContainsKey ((int)data ["userid"]) ? parser.Players [(int)data ["userid"]] : null;
230+
fire.Shooter = parser.Players.ContainsKey ((int)data["userid"]) ? new Player(parser.Players[(int)data["userid"]]) : null;
231231
fire.Weapon = new Equipment ((string)data ["weapon"]);
232232

233233
if (fire.Shooter != null && fire.Shooter.ActiveWeapon != null && fire.Weapon.Class != EquipmentClass.Grenade) {
234-
fire.Weapon = fire.Shooter.ActiveWeapon;
235-
}
234+
var originalString = fire.Weapon.OriginalString; // original string is lost when setting hurt.Weapon to hurt.Attacker.ActiveWeapon
235+
fire.Weapon = new Player(fire.Shooter).ActiveWeapon;
236+
fire.Weapon.Owner = new Player(fire.Weapon.Owner);
237+
fire.Weapon.OriginalString = originalString;
238+
}
236239

237-
parser.RaiseWeaponFired(fire);
240+
fire.TimeInRound = parser.CurrentTime - timestampFreezetimeEnded;
241+
242+
parser.RaiseWeaponFired(fire);
238243
break;
244+
239245
/* doesn't seem to trigger this event currently */
240246
/*
241247
case "other_death":
@@ -324,8 +330,8 @@ public static void Apply(GameEvent rawEvent, DemoParser parser, bool parseChicke
324330
data = MapData (eventDescriptor, rawEvent);
325331

326332
PlayerHurtEventArgs hurt = new PlayerHurtEventArgs ();
327-
hurt.Player = parser.Players.ContainsKey ((int)data ["userid"]) ? parser.Players [(int)data ["userid"]] : null;
328-
hurt.Attacker = parser.Players.ContainsKey ((int)data ["attacker"]) ? parser.Players [(int)data ["attacker"]] : null;
333+
hurt.Player = parser.Players.ContainsKey((int)data["userid"]) ? new Player(parser.Players[(int)data["userid"]]) : null;
334+
hurt.Attacker = parser.Players.ContainsKey((int)data["attacker"]) ? new Player(parser.Players[(int)data ["attacker"]]) : null;
329335
hurt.Health = (int)data ["health"];
330336
hurt.Armor = (int)data ["armor"];
331337
hurt.HealthDamage = (int)data ["dmg_health"];
@@ -335,7 +341,11 @@ public static void Apply(GameEvent rawEvent, DemoParser parser, bool parseChicke
335341
hurt.Weapon = new Equipment ((string)data ["weapon"], "");
336342

337343
if (hurt.Attacker != null && hurt.Weapon.Class != EquipmentClass.Grenade && hurt.Attacker.Weapons.Any ()) {
338-
hurt.Weapon = hurt.Attacker.ActiveWeapon;
344+
var originalString = hurt.Weapon.OriginalString; // original string is lost when setting hurt.Weapon to hurt.Attacker.ActiveWeapon
345+
hurt.Weapon = new Player(hurt.Attacker).ActiveWeapon;
346+
hurt.Weapon.Owner = new Player(hurt.Weapon.Owner);
347+
hurt.Weapon.OriginalString = originalString;
348+
hurt.WeaponString = originalString;
339349
}
340350

341351
hurt.TimeInRound = parser.CurrentTime - timestampFreezetimeEnded;

src/SourceEngine.Demo.Parser/Events.cs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ public class WeaponFiredEventArgs : EventArgs
175175
public Equipment Weapon { get; internal set; }
176176

177177
public Player Shooter { get; internal set; }
178+
179+
public double TimeInRound { get; set; }
178180
}
179181

180182
public class NadeEventArgs : EventArgs
@@ -282,6 +284,11 @@ public class HostagePickedUpEventArgs : EventArgs
282284

283285
public class PlayerHurtEventArgs : EventArgs
284286
{
287+
/// <summary>
288+
/// The round the event has occurred
289+
/// </summary>
290+
public int Round { get; set; }
291+
285292
/// <summary>
286293
/// The time in the round the event has occurred
287294
/// </summary>
@@ -502,14 +509,14 @@ public Equipment()
502509
this.Weapon = EquipmentElement.Unknown;
503510
}
504511

505-
internal Equipment(string originalString)
512+
public Equipment(string originalString)
506513
{
507514
OriginalString = originalString;
508515

509516
this.Weapon = MapEquipment(originalString);
510517
}
511518

512-
internal Equipment(string originalString, string skin)
519+
public Equipment(string originalString, string skin)
513520
{
514521
OriginalString = originalString;
515522

@@ -518,6 +525,20 @@ internal Equipment(string originalString, string skin)
518525
SkinID = skin;
519526
}
520527

528+
public Equipment(Equipment equipment)
529+
{
530+
if (equipment != null)
531+
{
532+
this.EntityID = equipment.EntityID;
533+
this.Weapon = equipment.Weapon;
534+
this.OriginalString = equipment.OriginalString;
535+
this.SkinID = equipment.SkinID;
536+
this.AmmoInMagazine = equipment.AmmoInMagazine;
537+
this.AmmoType = equipment.AmmoType;
538+
this.Owner = new Player(equipment.Owner);
539+
}
540+
}
541+
521542
const string WEAPON_PREFIX = "weapon_";
522543

523544
private EquipmentType GetEquipmentType(EquipmentElement weapon, EquipmentClass weaponClass)

src/SourceEngine.Demo.Stats.App/Program.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,8 @@ static void Main(string[] args)
339339
IEnumerable<SwitchSidesEventArgs> sse = new List<SwitchSidesEventArgs>();
340340
IEnumerable<FeedbackMessage> fme = new List<FeedbackMessage>();
341341
IEnumerable<TeamPlayers> tpe = new List<TeamPlayers>();
342-
IEnumerable<PlayerKilledEventArgs> pke = new List<PlayerKilledEventArgs>();
342+
IEnumerable<PlayerHurt> ph = new List<PlayerHurt>();
343+
IEnumerable<PlayerKilledEventArgs> pke = new List<PlayerKilledEventArgs>();
343344
Dictionary<string, IEnumerable<Player>> pe = new Dictionary<string, IEnumerable<Player>>();
344345
IEnumerable<Equipment> pwe = new List<Equipment>();
345346
IEnumerable<int> poe = new List<int>();
@@ -373,6 +374,9 @@ static void Main(string[] args)
373374
fme = (from message in mdTest.GetEvents<FeedbackMessage>()
374375
select (message as FeedbackMessage));
375376

377+
ph = (from player in mdTest.GetEvents<PlayerHurt>()
378+
select (player as PlayerHurt));
379+
376380
pke = (from player in mdTest.GetEvents<PlayerKilledEventArgs>()
377381
select (player as PlayerKilledEventArgs));
378382

@@ -483,7 +487,8 @@ static void Main(string[] args)
483487
SwitchSidesValues = sse,
484488
MessagesValues = fme,
485489
TeamPlayersValues = tpe,
486-
PlayerKilledEventsValues = pke,
490+
PlayerHurtValues = ph,
491+
PlayerKilledEventsValues = pke,
487492
PlayerValues = pe,
488493
WeaponValues = pwe,
489494
PenetrationValues = poe,

src/SourceEngine.Demo.Stats/DemoProcessor.cs

Lines changed: 71 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -587,11 +587,11 @@ public static MatchData FromDemoFile(string file, bool parseChickens, bool parse
587587
md.addEvent(typeof(PlayerKilledEventArgs), e);
588588
};
589589

590-
dp.PlayerHurt += (object sender, PlayerHurtEventArgs e) => { // only interested in player_hurt events when it is possible that a player_death event is not triggered due to death by bomb explosion
591-
if (e.PossiblyKilledByBombExplosion)
592-
{
593-
var round = GetCurrentRoundNum(md);
590+
dp.PlayerHurt += (object sender, PlayerHurtEventArgs e) => {
591+
var round = GetCurrentRoundNum(md);
594592

593+
if (e.PossiblyKilledByBombExplosion) // a player_death event is not triggered due to death by bomb explosion
594+
{
595595
var playerKilledEventArgs = new PlayerKilledEventArgs()
596596
{
597597
Round = round,
@@ -611,7 +611,11 @@ public static MatchData FromDemoFile(string file, bool parseChickens, bool parse
611611

612612
md.addEvent(typeof(PlayerKilledEventArgs), playerKilledEventArgs);
613613
}
614-
};
614+
615+
var playerHurt = new PlayerHurt(e, round);
616+
617+
md.addEvent(typeof(PlayerHurt), playerHurt);
618+
};
615619

616620
dp.RoundMVP += (object sender, RoundMVPEventArgs e) => {
617621
md.addEvent(typeof(RoundMVPEventArgs), e);
@@ -677,7 +681,7 @@ public static MatchData FromDemoFile(string file, bool parseChickens, bool parse
677681

678682
var round = GetCurrentRoundNum(md);
679683

680-
ShotFired shotFired = new ShotFired() { Round = round, Shooter = e.Shooter, Weapon = e.Weapon };
684+
ShotFired shotFired = new ShotFired() { Round = round, TimeInRound = e.TimeInRound, Shooter = e.Shooter, TeamSide = e.Shooter.Team.ToString(), Weapon = new Equipment(e.Weapon) };
681685

682686
md.addEvent(typeof(ShotFired), shotFired);
683687
};
@@ -815,6 +819,8 @@ public AllStats CreateFiles(ProcessedData processedData, bool createJsonFile = t
815819

816820
allStats.teamStats = GetTeamStats(processedData, allStats, dataAndPlayerNames.PlayerNames, generalroundsStats.SwitchSides);
817821

822+
allStats.firstDamageStats = GetFirstDamageStats(processedData);
823+
818824
if (processedData.ParsePlayerPositions)
819825
{
820826
allStats.playerPositionsStats = GetPlayerPositionsStats(processedData);
@@ -1772,6 +1778,64 @@ public List<teamStats> GetTeamStats(ProcessedData processedData, AllStats allSta
17721778
return teamStats;
17731779
}
17741780

1781+
public List<firstDamageStats> GetFirstDamageStats(ProcessedData processedData)
1782+
{
1783+
List<firstDamageStats> firstDamageStats = new List<firstDamageStats>();
1784+
1785+
foreach (var round in processedData.PlayerHurtValues.Select(x => x.Round).Distinct())
1786+
{
1787+
firstDamageStats.Add(new firstDamageStats()
1788+
{
1789+
Round = round,
1790+
FirstDamageToEnemyByPlayers = new List<DamageGivenByPlayerInRound>(),
1791+
});
1792+
}
1793+
1794+
1795+
foreach (var roundsGroup in processedData.PlayerHurtValues.GroupBy(x => x.Round))
1796+
{
1797+
int lastRound = processedData.RoundEndReasonValues.Count();
1798+
1799+
foreach (var round in roundsGroup.Where(x => x.Round > 0 && x.Round <= lastRound).Select(x => x.Round).Distinct())
1800+
{
1801+
foreach (var steamIdsGroup in roundsGroup
1802+
.Where(x => x.Round == round &&
1803+
x.Player?.SteamID != 0 && x.Player?.SteamID != x.Attacker?.SteamID &&
1804+
x.Weapon.Class != EquipmentClass.Grenade && x.Weapon.Class != EquipmentClass.Equipment &&
1805+
x.Weapon.Class != EquipmentClass.Unknown && x.Weapon.Weapon != EquipmentElement.Unknown &&
1806+
x.Weapon.Weapon != EquipmentElement.Bomb && x.Weapon.Weapon != EquipmentElement.World
1807+
)
1808+
.OrderBy(x => x.TimeInRound)
1809+
.GroupBy(x => x.Attacker.SteamID))
1810+
{
1811+
var firstDamage = steamIdsGroup.FirstOrDefault();
1812+
1813+
var firstDamageByPlayer = new DamageGivenByPlayerInRound()
1814+
{
1815+
TimeInRound = firstDamage.TimeInRound,
1816+
TeamSideShooter = firstDamage.Attacker.Team.ToString(),
1817+
SteamIDShooter = firstDamage.Attacker.SteamID,
1818+
XPositionShooter = firstDamage.Attacker.Position.X,
1819+
YPositionShooter = firstDamage.Attacker.Position.Y,
1820+
ZPositionShooter = firstDamage.Attacker.Position.Z,
1821+
TeamSideVictim = firstDamage.Player.Team.ToString(),
1822+
SteamIDVictim = firstDamage.Player.SteamID,
1823+
XPositionVictim = firstDamage.Player.Position.X,
1824+
YPositionVictim = firstDamage.Player.Position.Y,
1825+
ZPositionVictim = firstDamage.Player.Position.Z,
1826+
Weapon = firstDamage.Weapon.Weapon.ToString(),
1827+
WeaponClass = firstDamage.Weapon.Class.ToString(),
1828+
WeaponType = firstDamage.Weapon.Type.ToString(),
1829+
};
1830+
1831+
firstDamageStats[round - 1].FirstDamageToEnemyByPlayers.Add(firstDamageByPlayer);
1832+
}
1833+
}
1834+
}
1835+
1836+
return firstDamageStats;
1837+
}
1838+
17751839
public List<playerPositionsStats> GetPlayerPositionsStats(ProcessedData processedData)
17761840
{
17771841
List<playerPositionsStats> playerPositionsStats = new List<playerPositionsStats>();
@@ -1871,28 +1935,7 @@ public void CreateJson(ProcessedData processedData, AllStats allStats, string ma
18711935

18721936
StreamWriter sw = new StreamWriter(path, false);
18731937

1874-
string json = JsonConvert.SerializeObject(
1875-
new
1876-
{
1877-
allStats.versionNumber,
1878-
allStats.supportedGamemodes,
1879-
allStats.mapInfo,
1880-
allStats.tanookiStats,
1881-
allStats.playerStats,
1882-
allStats.winnersStats,
1883-
allStats.roundsStats,
1884-
allStats.bombsiteStats,
1885-
allStats.hostageStats,
1886-
allStats.grenadesTotalStats,
1887-
allStats.grenadesSpecificStats,
1888-
allStats.killsStats,
1889-
allStats.feedbackMessages,
1890-
allStats.chickenStats,
1891-
allStats.teamStats,
1892-
allStats.playerPositionsStats,
1893-
},
1894-
Formatting.Indented
1895-
);
1938+
string json = JsonConvert.SerializeObject(allStats, Formatting.Indented);
18961939

18971940
sw.WriteLine(json);
18981941
/* JSON creation end*/

src/SourceEngine.Demo.Stats/Models/AllStats.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public class AllStats
1919
public List<FeedbackMessage> feedbackMessages { get; set; }
2020
public chickenStats chickenStats { get; set; }
2121
public List<teamStats> teamStats { get; set; }
22+
public List<firstDamageStats> firstDamageStats { get; set; }
2223
public List<playerPositionsStats> playerPositionsStats { get; set; }
2324

2425
public AllStats() { }
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace SourceEngine.Demo.Stats.Models
6+
{
7+
public class DamageGivenByPlayerInRound
8+
{
9+
public double TimeInRound { get; set; }
10+
public string TeamSideShooter { get; set; }
11+
public long SteamIDShooter { get; set; }
12+
public double XPositionShooter { get; set; }
13+
public double YPositionShooter { get; set; }
14+
public double ZPositionShooter { get; set; }
15+
public string TeamSideVictim { get; set; }
16+
public long SteamIDVictim { get; set; }
17+
public double XPositionVictim { get; set; }
18+
public double YPositionVictim { get; set; }
19+
public double ZPositionVictim { get; set; }
20+
public string Weapon { get; set; }
21+
public string WeaponClass { get; set; }
22+
public string WeaponType { get; set; }
23+
24+
public DamageGivenByPlayerInRound() { }
25+
}
26+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using SourceEngine.Demo.Parser;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Text;
5+
6+
namespace SourceEngine.Demo.Stats.Models
7+
{
8+
public class PlayerHurt
9+
{
10+
public int Round { get; set; }
11+
public double TimeInRound { get; set; }
12+
public Player Player { get; set; }
13+
public Player Attacker { get; set; }
14+
public int Health { get; set; }
15+
public int Armor { get; set; }
16+
public Equipment Weapon { get; set; }
17+
public int HealthDamage { get; set; }
18+
public int ArmorDamage { get; set; }
19+
public Hitgroup Hitgroup { get; set; }
20+
public bool PossiblyKilledByBombExplosion { get; set; }
21+
22+
public PlayerHurt() { }
23+
24+
public PlayerHurt(PlayerHurtEventArgs playerHurtEventArgs, int round)
25+
{
26+
Round = round;
27+
TimeInRound = playerHurtEventArgs.TimeInRound;
28+
Player = new Player(playerHurtEventArgs.Player);
29+
Attacker = new Player(playerHurtEventArgs.Attacker);
30+
Health = playerHurtEventArgs.Health;
31+
Armor = playerHurtEventArgs.Armor;
32+
Weapon = new Equipment(playerHurtEventArgs.Weapon);
33+
HealthDamage = playerHurtEventArgs.HealthDamage;
34+
ArmorDamage = playerHurtEventArgs.ArmorDamage;
35+
Hitgroup = playerHurtEventArgs.Hitgroup;
36+
PossiblyKilledByBombExplosion = playerHurtEventArgs.PossiblyKilledByBombExplosion;
37+
}
38+
}
39+
}

src/SourceEngine.Demo.Stats/Models/ProcessedData.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public class ProcessedData
1818
public IEnumerable<SwitchSidesEventArgs> SwitchSidesValues { get; set; }
1919
public IEnumerable<FeedbackMessage> MessagesValues { get; set; }
2020
public IEnumerable<TeamPlayers> TeamPlayersValues { get; set; }
21+
public IEnumerable<PlayerHurt> PlayerHurtValues { get; set; }
2122
public IEnumerable<PlayerKilledEventArgs> PlayerKilledEventsValues { get; set; }
2223
public Dictionary<string, IEnumerable<Player>> PlayerValues { get; set; }
2324
public IEnumerable<Equipment> WeaponValues { get; set; }

src/SourceEngine.Demo.Stats/Models/ShotFired.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ namespace SourceEngine.Demo.Stats.Models
55
public class ShotFired
66
{
77
public int Round { get; set; }
8-
9-
public Equipment Weapon { get; set; }
10-
8+
public double TimeInRound { get; set; }
119
public Player Shooter { get; set; }
10+
public string TeamSide { get; set; }
11+
public Equipment Weapon { get; set; }
1212

1313
public ShotFired() { }
1414
}

0 commit comments

Comments
 (0)