Skip to content

Commit

Permalink
0.5.0 | feat: json config and much more
Browse files Browse the repository at this point in the history
  • Loading branch information
shobhit-pathak committed Dec 5, 2023
1 parent 486ecad commit 01086a9
Show file tree
Hide file tree
Showing 16 changed files with 1,618 additions and 519 deletions.
24 changes: 18 additions & 6 deletions BackupManagement.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public partial class MatchZy
};

public void SetupRoundBackupFile() {
string backupFilePrefix = $"matchzy_{liveMatchId}";
string backupFilePrefix = $"matchzy_{liveMatchId}_{matchConfig.CurrentMapNumber}";
Server.ExecuteCommand($"mp_backup_round_file {backupFilePrefix}");
}
[ConsoleCommand("css_stop", "Marks the player ready")]
Expand All @@ -32,6 +32,11 @@ public void OnStopCommand(CCSPlayerController? player, CommandInfo? command) {

Log($"[!stop command] Sent by: {player.UserId}, TeamNum: {player.TeamNum}, connectedPlayers: {connectedPlayers}");
if (isStopCommandAvailable && isMatchLive) {
if (IsHalfTimePhase())
{
ReplyToUserCommand(player, "You cannot use this command during halftime.");
return;
}
string stopTeamName = "";
string remainingStopTeam = "";
if (player.TeamNum == 2) {
Expand Down Expand Up @@ -89,7 +94,7 @@ private void HandleRestoreCommand(CCSPlayerController? player, string commandArg
if (!string.IsNullOrWhiteSpace(commandArg)) {
if (int.TryParse(commandArg, out int roundNumber) && roundNumber >= 0) {
string round = roundNumber.ToString("D2");
string requiredBackupFileName = $"matchzy_{liveMatchId}_round{round}.txt";
string requiredBackupFileName = $"matchzy_{liveMatchId}_{matchConfig.CurrentMapNumber}_round{round}.txt";
RestoreRoundBackup(player, requiredBackupFileName, round);
}
else {
Expand All @@ -102,6 +107,11 @@ private void HandleRestoreCommand(CCSPlayerController? player, string commandArg
}

private void RestoreRoundBackup(CCSPlayerController? player, string fileName, string round="") {
if (IsHalfTimePhase())
{
ReplyToUserCommand(player, "You cannot load a backup during halftime.");
return;
}
if (!File.Exists(Path.Join(Server.GameDirectory + "/csgo/", fileName))) {
ReplyToUserCommand(player, $"Backup file {fileName} does not exist, please make sure you are restoring a valid backup.");
return;
Expand All @@ -114,7 +124,7 @@ private void RestoreRoundBackup(CCSPlayerController? player, string fileName, st
round = (t1score + t2score).ToString("D2");
}

string matchZyBackupFileName = $"matchzy_data_backup_{liveMatchId}_round_{round}.json";
string matchZyBackupFileName = $"matchzy_data_backup_{liveMatchId}_{matchConfig.CurrentMapNumber}_round_{round}.json";
string filePath = Server.GameDirectory + "/csgo/MatchZyDataBackup/" + matchZyBackupFileName;

if (File.Exists(filePath)) {
Expand Down Expand Up @@ -146,8 +156,8 @@ private void RestoreRoundBackup(CCSPlayerController? player, string fileName, st
} else if (kvp.Value == "TERRORIST" && teamSides[matchzyTeam1] != "TERRORIST") {
SwapSidesInTeamData(false);
}
Server.ExecuteCommand($"mp_teamname_1 {matchzyTeam1.teamName}");
Server.ExecuteCommand($"mp_teamname_2 {matchzyTeam2.teamName}");
// Server.ExecuteCommand($"mp_teamname_1 {matchzyTeam1.teamName}");
// Server.ExecuteCommand($"mp_teamname_2 {matchzyTeam2.teamName}");
}
}
}
Expand Down Expand Up @@ -179,7 +189,7 @@ public void CreateMatchZyRoundDataBackup()
{
(int t1score, int t2score) = GetTeamsScore();
string round = (t1score + t2score).ToString("D2");
string matchZyBackupFileName = $"matchzy_data_backup_{liveMatchId}_round_{round}.json";
string matchZyBackupFileName = $"matchzy_data_backup_{liveMatchId}_{matchConfig.CurrentMapNumber}_round_{round}.json";
string filePath = Server.GameDirectory + "/csgo/MatchZyDataBackup/" + matchZyBackupFileName;
string? directoryPath = Path.GetDirectoryName(filePath);
if (directoryPath != null)
Expand All @@ -192,6 +202,8 @@ public void CreateMatchZyRoundDataBackup()

Dictionary<string, string> roundData = new()
{
{ "matchid", liveMatchId.ToString() },
{ "mapnumber", matchConfig.CurrentMapNumber.ToString() },
{ "team1_name", matchzyTeam1.teamName },
{ "team1_flag", matchzyTeam1.teamFlag },
{ "team1_tag", matchzyTeam1.teamTag },
Expand Down
31 changes: 31 additions & 0 deletions ConfigConvars.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,24 @@ public void MatchZyPlayoutConvar(CCSPlayerController? player, CommandInfo comman
isPlayOutEnabled = bool.TryParse(args, out bool isPlayOutEnabledValue) ? isPlayOutEnabledValue : args != "0" && isPlayOutEnabled;
}

[ConsoleCommand("matchzy_match_mode_only", "Whether to keep server in match mode only. Default value: false")]
public void MatchZyMatchModeOnlyConvar(CCSPlayerController? player, CommandInfo command)
{
if (player != null) return;
string args = command.ArgString;

matchModeOnly = bool.TryParse(args, out bool matchModeOnlyValue) ? matchModeOnlyValue : args != "0" && matchModeOnly;
}

[ConsoleCommand("matchzy_reset_cvars_on_series_end", "Whether parameters from the cvars section of a match configuration are restored to their original values when a series ends. Default value: true")]
public void MatchZyResetCvarsOnSeriesEndConvar(CCSPlayerController? player, CommandInfo command)
{
if (player != null) return;
string args = command.ArgString;

resetCvarsOnSeriesEnd = bool.TryParse(args, out bool resetCvarsOnSeriesEndValue) ? resetCvarsOnSeriesEndValue : args != "0" && resetCvarsOnSeriesEnd;
}

[ConsoleCommand("matchzy_minimum_ready_required", "Minimum ready players required to start the match. Default: 1")]
public void MatchZyMinimumReadyRequired(CCSPlayerController? player, CommandInfo command)
{
Expand All @@ -63,6 +81,19 @@ public void MatchZyDemoPath(CCSPlayerController? player, CommandInfo command)
}
}

[ConsoleCommand("matchzy_demo_upload_url", "If defined, recorded demos will be uploaded to this URL once the map ends.")]
public void MatchZyDemoUploadURL(CCSPlayerController? player, CommandInfo command)
{
if (player != null) return;
string url = command.ArgByIndex(1);
if (!IsValidUrl(url))
{
Log($"[MatchZyDemoUploadURL] Invalid URL: {url}. Please provide a valid URL for uploading the demo!");
return;
}
demoUploadURL = url;
}

[ConsoleCommand("matchzy_stop_command_available", "Whether .stop command is enabled or not (to restore the current round). Default value: false")]
public void MatchZyStopCommandEnabled(CCSPlayerController? player, CommandInfo command)
{
Expand Down
6 changes: 4 additions & 2 deletions ConsoleCommands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -260,10 +260,12 @@ private void OnMapReloadCommand(CCSPlayerController? player, CommandInfo? comman
return;
}
string currentMapName = Server.MapName;
if (Server.IsMapValid(currentMapName)) {
if (long.TryParse(currentMapName, out _)) { // Check if mapName is a long for workshop map ids
Server.ExecuteCommand($"host_workshop_map \"{currentMapName}\"");
} else if (Server.IsMapValid(currentMapName)) {
Server.ExecuteCommand($"changelevel \"{currentMapName}\"");
} else {
player.PrintToChat($"{chatPrefix} Cant reload a workshop map!");
player.PrintToChat($"{chatPrefix} Invalid map name!");
}
}

Expand Down
106 changes: 61 additions & 45 deletions DamageInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,12 @@ public partial class MatchZy
private void InitPlayerDamageInfo()
{
foreach (var key in playerData.Keys) {
if (!playerData[key].IsValid) continue;
if (playerData[key].IsBot) continue;
int attackerId = key;
foreach (var key2 in playerData.Keys) {
if (key == key2) continue;
if (playerData[key2].IsBot) continue;
if (!playerData[key2].IsValid || playerData[key2].IsBot) continue;
if (playerData[key].TeamNum == playerData[key2].TeamNum) continue;
if (playerData[key].TeamNum == 2) {
if (playerData[key2].TeamNum != 3) continue;
Expand Down Expand Up @@ -54,50 +55,65 @@ private void UpdatePlayerDamageInfo(EventPlayerHurt @event, int targetId)
}

private void ShowDamageInfo()
{
HashSet<(int, int)> processedPairs = new HashSet<(int, int)>();

foreach (var entry in playerDamageInfo)
{
int attackerId = entry.Key;
foreach (var (targetId, targetEntry) in entry.Value)
{
if (processedPairs.Contains((attackerId, targetId)) || processedPairs.Contains((targetId, attackerId)))
continue;

// Access and use the damage information as needed.
int damageGiven = targetEntry.DamageHP;
int hitsGiven = targetEntry.Hits;
int damageTaken = 0;
int hitsTaken = 0;

if (playerDamageInfo.TryGetValue(targetId, out var targetInfo) && targetInfo.TryGetValue(attackerId, out var takenInfo))
{
damageTaken = takenInfo.DamageHP;
hitsTaken = takenInfo.Hits;
}

var attackerController = Utilities.GetPlayerFromUserid(attackerId);
var targetController = Utilities.GetPlayerFromUserid(targetId);

if (attackerController != null && targetController != null)
{
int attackerHP = attackerController.PlayerPawn.Value.Health < 0 ? 0 : attackerController.PlayerPawn.Value.Health;
string attackerName = attackerController.PlayerName;

int targetHP = targetController.PlayerPawn.Value.Health < 0 ? 0 : targetController.PlayerPawn.Value.Health;
string targetName = targetController.PlayerName;

attackerController.PrintToChat($"{chatPrefix} {ChatColors.Green}To: [{damageGiven} / {hitsGiven} hits] From: [{damageTaken} / {hitsTaken} hits] - {targetName} - ({targetHP} hp){ChatColors.Default}");
targetController.PrintToChat($"{chatPrefix} {ChatColors.Green}To: [{damageTaken} / {hitsTaken} hits] From: [{damageGiven} / {hitsGiven} hits] - {attackerName} - ({attackerHP} hp){ChatColors.Default}");
}

// Mark this pair as processed to avoid duplicates.
processedPairs.Add((attackerId, targetId));
}
}
playerDamageInfo.Clear();
}
{
try
{
HashSet<(int, int)> processedPairs = new HashSet<(int, int)>();

foreach (var entry in playerDamageInfo)
{
int attackerId = entry.Key;
foreach (var (targetId, targetEntry) in entry.Value)
{
if (processedPairs.Contains((attackerId, targetId)) || processedPairs.Contains((targetId, attackerId)))
continue;

// Access and use the damage information as needed.
int damageGiven = targetEntry.DamageHP;
int hitsGiven = targetEntry.Hits;
int damageTaken = 0;
int hitsTaken = 0;

if (playerDamageInfo.TryGetValue(targetId, out var targetInfo) && targetInfo.TryGetValue(attackerId, out var takenInfo))
{
damageTaken = takenInfo.DamageHP;
hitsTaken = takenInfo.Hits;
}

if (!playerData.ContainsKey(attackerId) || !playerData.ContainsKey(targetId)) continue;

var attackerController = playerData[attackerId];
var targetController = playerData[targetId];

if (attackerController != null && targetController != null)
{
if (!attackerController.IsValid || !targetController.IsValid) continue;
if (attackerController.Connected != PlayerConnectedState.PlayerConnected) continue;
if (targetController.Connected != PlayerConnectedState.PlayerConnected) continue;
if (!attackerController.PlayerPawn.IsValid || !targetController.PlayerPawn.IsValid) continue;

int attackerHP = attackerController.PlayerPawn.Value.Health < 0 ? 0 : attackerController.PlayerPawn.Value.Health;
string attackerName = attackerController.PlayerName;

int targetHP = targetController.PlayerPawn.Value.Health < 0 ? 0 : targetController.PlayerPawn.Value.Health;
string targetName = targetController.PlayerName;

attackerController.PrintToChat($"{chatPrefix} {ChatColors.Green}To: [{damageGiven} / {hitsGiven} hits] From: [{damageTaken} / {hitsTaken} hits] - {targetName} - ({targetHP} hp){ChatColors.Default}");
targetController.PrintToChat($"{chatPrefix} {ChatColors.Green}To: [{damageTaken} / {hitsTaken} hits] From: [{damageGiven} / {hitsGiven} hits] - {attackerName} - ({attackerHP} hp){ChatColors.Default}");
}

// Mark this pair as processed to avoid duplicates.
processedPairs.Add((attackerId, targetId));
}
}
playerDamageInfo.Clear();
}
catch (Exception e)
{
Log($"[ShowDamageInfo FATAL] An error occurred: {e.Message}");
}

}
}

public class DamagePlayerInfo
Expand Down
Loading

0 comments on commit 01086a9

Please sign in to comment.