diff options
| author | Schark <jordan@schark.online> | 2026-01-31 01:01:35 -0500 |
|---|---|---|
| committer | Schark <jordan@schark.online> | 2026-01-31 01:01:35 -0500 |
| commit | 456230fbd46907744a8aff7dc36787247d98c8d1 (patch) | |
| tree | 324bcf7e1ce697a3ff02d5620560abdf8de5cfb6 | |
| parent | 853f167b64c9a9e4f7ea98483496cd044458e12d (diff) | |
| download | cs2pov-456230fbd46907744a8aff7dc36787247d98c8d1.tar.gz cs2pov-456230fbd46907744a8aff7dc36787247d98c8d1.zip | |
Update info output to include kills and assists
Diffstat (limited to '')
| -rw-r--r-- | cs2pov/cli.py | 11 | ||||
| -rw-r--r-- | cs2pov/parser.py | 49 |
2 files changed, 54 insertions, 6 deletions
diff --git a/cs2pov/cli.py b/cs2pov/cli.py index f21e368..0d2ec26 100644 --- a/cs2pov/cli.py +++ b/cs2pov/cli.py @@ -597,17 +597,15 @@ def print_demo_info_extended( print(f"\nPlayers ({len(demo_info.players)}):") for player in demo_info.players: - team_str = f"[{player.team}]" if player.team else "[--]" timeline = timelines.get(player.steamid) print(f" {player.name}") - print(f" SteamID: {player.steamid} Team: {team_str}") + print(f" SteamID: {player.steamid}") + print(f" Kills: {player.kills} Deaths: {len(timeline.deaths) if timeline else 0} Assists: {player.assists}") if timeline: - death_count = len(timeline.deaths) alive_time = sum(seg.duration_seconds for seg in timeline.alive_segments) - print(f" Deaths: {death_count}, Alive segments: {len(timeline.alive_segments)}, " - f"Alive time: {alive_time:.1f}s") + print(f" Alive segments: {len(timeline.alive_segments)}, Alive time: {alive_time:.1f}s") if verbose and timeline.alive_segments: print(f" Alive segments:") @@ -650,7 +648,8 @@ def format_info_json( player_data = { "name": player.name, "steamid": player.steamid, - "team": player.team, + "kills": player.kills, + "assists": player.assists, } if timeline: diff --git a/cs2pov/parser.py b/cs2pov/parser.py index d9a89ca..133d62c 100644 --- a/cs2pov/parser.py +++ b/cs2pov/parser.py @@ -18,6 +18,8 @@ class PlayerInfo: name: str team: Optional[str] = None user_id: Optional[int] = None # Player slot from demo (use user_id + 1 for spec_player) + kills: int = 0 + assists: int = 0 @dataclass @@ -71,6 +73,12 @@ def parse_demo(demo_path: Path) -> DemoInfo: tick_df = parser.parse_ticks(["team_num", "user_id"]) players = _extract_players(tick_df) + # Get kill/assist counts + kills, assists = _extract_kills_assists(parser) + for player in players: + player.kills = kills.get(player.steamid, 0) + player.assists = assists.get(player.steamid, 0) + # Get round events rounds = _extract_rounds(parser) @@ -118,6 +126,47 @@ def _extract_players(tick_df) -> list[PlayerInfo]: return players +def _extract_kills_assists(parser: DemoParser) -> tuple[dict[int, int], dict[int, int]]: + """Extract kill and assist counts per player from player_death events. + + Returns: + Tuple of (kills_dict, assists_dict) mapping steamid to count + """ + kills: dict[int, int] = {} + assists: dict[int, int] = {} + + try: + events_df = parser.parse_event("player_death") + if events_df is None or len(events_df) == 0: + return kills, assists + + for _, row in events_df.iterrows(): + # Count kills (attacker_steamid) + attacker = row.get("attacker_steamid") + if attacker is not None: + try: + attacker_id = int(attacker) + if attacker_id > 0: + kills[attacker_id] = kills.get(attacker_id, 0) + 1 + except (ValueError, TypeError): + pass + + # Count assists (assister_steamid) + assister = row.get("assister_steamid") + if assister is not None: + try: + assister_id = int(assister) + if assister_id > 0: + assists[assister_id] = assists.get(assister_id, 0) + 1 + except (ValueError, TypeError): + pass + + except Exception: + pass + + return kills, assists + + def _extract_rounds(parser: DemoParser) -> list[RoundInfo]: """Extract round boundaries from demo events.""" rounds = [] |
