diff --git a/main.py b/main.py index 4412b5d..75fa787 100644 --- a/main.py +++ b/main.py @@ -344,7 +344,27 @@ def main_loop(screen): # Format with timestamp before displaying formatted_msg, attributes = format_message(parsed) ui.print_message(formatted_msg) + ui.update_server_info(game_state) + + # Check if we need to revive players + if game_state.server_info.gametype == 'Clan Arena': + # CA: revive all players 3s after round end + if game_state.server_info.round_end_time: + if time.time() - game_state.server_info.round_end_time >= 3.0: + game_state.server_info.dead_players.clear() + game_state.server_info.round_end_time = None ui.update_server_info(game_state) + else: + # Other modes: revive individual players 3s after death + current_time = time.time() + players_to_revive = [ + name for name, death_time in game_state.server_info.dead_players.items() + if current_time - death_time >= 3.0 + ] + if players_to_revive: + for name in players_to_revive: + del game_state.server_info.dead_players[name] + ui.update_server_info(game_state) # Process RCON messages if event > 0: diff --git a/parser.py b/parser.py index eac99f4..0957f1c 100644 --- a/parser.py +++ b/parser.py @@ -145,6 +145,11 @@ class EventParser: if 'TEAM' in victim: self.game_state.player_tracker.update_team(victim_name, victim['TEAM']) self.game_state.player_tracker.add_player(victim_name) + + # Mark as dead + if not data.get('WARMUP', False): + import time + self.game_state.server_info.dead_players[victim_name] = time.time() victim_prefix = get_team_prefix(victim_name, self.game_state.player_tracker) warmup = " ^8^3(Warmup)^0" if data.get('WARMUP', False) else "" @@ -221,7 +226,10 @@ class EventParser: elif team_won == 'BLUE': self.game_state.server_info.blue_rounds += 1 logger.info(f"Round {round_num}: BLUE wins (RED: {self.game_state.server_info.red_rounds}, BLUE: {self.game_state.server_info.blue_rounds})") - + + import time + self.game_state.server_info.round_end_time = time.time() + return None # Don't display in chat def _handle_medal(self, data): @@ -304,4 +312,4 @@ class EventParser: weapon_name = WEAPON_NAMES.get(best_weapon, best_weapon) - return f"{team_prefix}^8^7{name}^0^7 K/D: {kills}/{deaths} | Best Weapon: {weapon_name} - Acc: {best_accuracy:.2f}% - Kills: {best_weapon_kills}\n" + return f"^8^5[PLAYER STATS]^7^0 {team_prefix}^8^7{name}^0^7 K/D: {kills}/{deaths} | Best Weapon: {weapon_name} - Acc: {best_accuracy:.2f}% - Kills: {best_weapon_kills}\n" diff --git a/state.py b/state.py index f39d4a8..7995f49 100644 --- a/state.py +++ b/state.py @@ -31,6 +31,8 @@ class ServerInfo: self.players = [] self.last_update = 0 self.warmup = False + self.dead_players = {} + self.round_end_time = None def is_team_mode(self): """Check if current gametype is a team mode""" @@ -40,6 +42,7 @@ class ServerInfo: """Reset round scores (for new matches)""" self.red_rounds = 0 self.blue_rounds = 0 + self.dead_players.clear() def update_from_cvar(self, cvar_name, value): """Update server info from a cvar response""" diff --git a/ui.py b/ui.py index 1692825..ce53f80 100644 --- a/ui.py +++ b/ui.py @@ -347,7 +347,7 @@ class UIManager: teams = game_state.player_tracker.get_players_by_team() if server_info.gametype in TEAM_MODES: - if server_info.gametype == 'CA': + if server_info.gametype == 'Clan Arena': red_score = f"{server_info.red_rounds:>3} " blue_score = f"{server_info.blue_rounds:>3} " @@ -416,9 +416,13 @@ class UIManager: blue_score = player.get('score', '0') break - # Format: " 9 PlayerName" with right-aligned score - red = f"{red_score:>3} {red_name}" if red_name else '' - blue = f"{blue_score:>3} {blue_name}" if blue_name else '' + # Check if players are dead + red_dead = red_name in server_info.dead_players + blue_dead = blue_name in server_info.dead_players + + # Format with strikethrough for dead players (using dim text) + red = f"{red_score:>3} {'^8^1X^7^0 ' if red_dead else ''}{red_name}" if red_name else '' + blue = f"{blue_score:>3} {'^8^1X^7^0 ' if blue_dead else ''}{blue_name}" if blue_name else '' from formatter import strip_color_codes red_clean = strip_color_codes(red) @@ -467,10 +471,14 @@ class UIManager: col2_score = player.get('score', '0') break - # Format: " 9 PlayerName" with right-aligned score - col1 = f"{col1_score:>3} {col1_name}" if col1_name else '' - col2 = f"{col2_score:>3} {col2_name}" if col2_name else '' - + # Check if players are dead + col1_dead = col1_name in server_info.dead_players + col2_dead = col2_name in server_info.dead_players + + # Format: " 9 PlayerName" with right-aligned score and dead marker + col1 = f"{col1_score:>3} {'^8^1X^7^0 ' if col1_dead else ''}{col1_name}" if col1_name else '' + col2 = f"{col2_score:>3} {'^8^1X^7^0 ' if col2_dead else ''}{col2_name}" if col2_name else '' + from formatter import strip_color_codes col1_clean = strip_color_codes(col1) col2_clean = strip_color_codes(col2) @@ -485,7 +493,7 @@ class UIManager: # List spectators on one line spec_list = " ".join(spec_players) - line = f" ^8^3SPEC^0:^7^8 {spec_list}\n" + line = f"^8^3Spectators:^7 {spec_list}\n" print_colored(self.info_window, line, 0) # Blank lines to fill