From 29461e9de2c19bda88d8be7787f81a9b3126fd0a Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Sun, 28 Apr 2024 02:17:24 +0200 Subject: [PATCH] 2.4e - Minor changes --- Commands.cs | 537 +++++++++++++++++++-------------------- Config.cs | 2 +- Events.cs | 67 ++--- PlayerInfo.cs | 4 +- Utility.cs | 98 +++---- VERSION | 2 +- WeaponAction.cs | 159 +++++------- WeaponPaints.cs | 61 ++--- WeaponPaints.csproj | 2 +- WeaponSynchronization.cs | 109 ++++---- 10 files changed, 475 insertions(+), 566 deletions(-) diff --git a/Commands.cs b/Commands.cs index d431aea5..c683ac48 100644 --- a/Commands.cs +++ b/Commands.cs @@ -14,7 +14,7 @@ namespace WeaponPaints if (player == null || !player.IsValid || player.UserId == null || player.IsBot) return; - PlayerInfo playerInfo = new PlayerInfo + PlayerInfo? playerInfo = new PlayerInfo { UserId = player.UserId, Slot = player.Slot, @@ -26,7 +26,7 @@ namespace WeaponPaints try { - if (player != null && !commandsCooldown.TryGetValue(player.Slot, out DateTime cooldownEndTime) || + if (player != null && !commandsCooldown.TryGetValue(player.Slot, out var cooldownEndTime) || player != null && DateTime.UtcNow >= (commandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow)) { commandsCooldown[player.Slot] = DateTime.UtcNow.AddSeconds(Config.CmdRefreshCooldownSeconds); @@ -107,11 +107,11 @@ namespace WeaponPaints player!.Print(Localizer["wp_info_music"]); } - if (Config.Additional.KnifeEnabled) - if (!string.IsNullOrEmpty(Localizer["wp_info_knife"])) - { - player!.Print(Localizer["wp_info_knife"]); - } + if (!Config.Additional.KnifeEnabled) return; + if (!string.IsNullOrEmpty(Localizer["wp_info_knife"])) + { + player!.Print(Localizer["wp_info_knife"]); + } } private void RegisterCommands() @@ -141,7 +141,7 @@ namespace WeaponPaints { if (!Config.Additional.KnifeEnabled || !g_bCommandsAllowed) return; - var knivesOnly = weaponList + var knivesOnly = WeaponList .Where(pair => pair.Key.StartsWith("weapon_knife") || pair.Key.StartsWith("weapon_bayonet")) .ToDictionary(pair => pair.Key, pair => pair.Value); @@ -152,36 +152,34 @@ namespace WeaponPaints var knifeName = option.Text; var knifeKey = knivesOnly.FirstOrDefault(x => x.Value == knifeName).Key; - if (!string.IsNullOrEmpty(knifeKey)) + if (string.IsNullOrEmpty(knifeKey)) return; + if (!string.IsNullOrEmpty(Localizer["wp_knife_menu_select"])) { - if (!string.IsNullOrEmpty(Localizer["wp_knife_menu_select"])) - { - player!.Print(Localizer["wp_knife_menu_select", knifeName]); - } - - if (!string.IsNullOrEmpty(Localizer["wp_knife_menu_kill"]) && Config.Additional.CommandKillEnabled) - { - player!.Print(Localizer["wp_knife_menu_kill"]); - } - - PlayerInfo playerInfo = new PlayerInfo - { - UserId = player.UserId, - Slot = player.Slot, - Index = (int)player.Index, - SteamId = player.SteamID.ToString(), - Name = player.PlayerName, - IpAddress = player.IpAddress?.Split(":")[0] - }; - - g_playersKnife[player.Slot] = knifeKey; - - if (g_bCommandsAllowed && (LifeState_t)player.LifeState == LifeState_t.LIFE_ALIVE) - RefreshWeapons(player); - - if (weaponSync != null) - _ = Task.Run(async () => await weaponSync.SyncKnifeToDatabase(playerInfo, knifeKey)); + player!.Print(Localizer["wp_knife_menu_select", knifeName]); } + + if (!string.IsNullOrEmpty(Localizer["wp_knife_menu_kill"]) && Config.Additional.CommandKillEnabled) + { + player!.Print(Localizer["wp_knife_menu_kill"]); + } + + PlayerInfo playerInfo = new PlayerInfo + { + UserId = player.UserId, + Slot = player.Slot, + Index = (int)player.Index, + SteamId = player.SteamID.ToString(), + Name = player.PlayerName, + IpAddress = player.IpAddress?.Split(":")[0] + }; + + g_playersKnife[player.Slot] = knifeKey; + + if (g_bCommandsAllowed && (LifeState_t)player.LifeState == LifeState_t.LIFE_ALIVE) + RefreshWeapons(player); + + if (weaponSync != null) + _ = Task.Run(async () => await weaponSync.SyncKnifeToDatabase(playerInfo, knifeKey)); }; foreach (var knifePair in knivesOnly) { @@ -193,8 +191,8 @@ namespace WeaponPaints if (player == null || player.UserId == null) return; - if (player != null && !commandsCooldown.TryGetValue(player.Slot, out DateTime cooldownEndTime) || - player != null && DateTime.UtcNow >= (commandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow)) + if (!commandsCooldown.TryGetValue(player.Slot, out var cooldownEndTime) || + DateTime.UtcNow >= (commandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow)) { commandsCooldown[player.Slot] = DateTime.UtcNow.AddSeconds(Config.CmdRefreshCooldownSeconds); giveItemMenu.PostSelectAction = PostSelectAction.Close; @@ -210,7 +208,7 @@ namespace WeaponPaints private void SetupSkinsMenu() { - var classNamesByWeapon = weaponList.ToDictionary(kvp => kvp.Value, kvp => kvp.Key); + var classNamesByWeapon = WeaponList.ToDictionary(kvp => kvp.Value, kvp => kvp.Key); var weaponSelectionMenu = new ChatMenu(Localizer["wp_skin_menu_weapon_title"]); // Function to handle skin selection for a specific weapon @@ -218,117 +216,110 @@ namespace WeaponPaints { if (!Utility.IsPlayerValid(player)) return; - string selectedWeapon = option.Text; - if (classNamesByWeapon.TryGetValue(selectedWeapon, out string? selectedWeaponClassname)) - { - if (selectedWeaponClassname == null) return; - var skinsForSelectedWeapon = skinsList?.Where(skin => - skin != null && + var selectedWeapon = option.Text; + if (!classNamesByWeapon.TryGetValue(selectedWeapon, out var selectedWeaponClassname)) return; + var skinsForSelectedWeapon = skinsList?.Where(skin => skin.TryGetValue("weapon_name", out var weaponName) && weaponName?.ToString() == selectedWeaponClassname )?.ToList(); - var skinSubMenu = new ChatMenu(Localizer["wp_skin_menu_skin_title", selectedWeapon]); + var skinSubMenu = new ChatMenu(Localizer["wp_skin_menu_skin_title", selectedWeapon]); - // Function to handle skin selection for the chosen weapon - var handleSkinSelection = (CCSPlayerController p, ChatMenuOption opt) => + // Function to handle skin selection for the chosen weapon + var handleSkinSelection = (CCSPlayerController p, ChatMenuOption opt) => + { + if (!Utility.IsPlayerValid(p)) return; + + var steamId = p.SteamID.ToString(); + var firstSkin = skinsList?.FirstOrDefault(skin => { - if (!Utility.IsPlayerValid(p)) return; - - string steamId = p.SteamID.ToString(); - var firstSkin = skinsList?.FirstOrDefault(skin => + if (skin.TryGetValue("weapon_name", out var weaponName)) { - if (skin != null && skin.TryGetValue("weapon_name", out var weaponName)) - { - return weaponName?.ToString() == selectedWeaponClassname; - } - return false; - }); - - string selectedSkin = opt.Text; - string selectedPaintID = selectedSkin.Substring(selectedSkin.LastIndexOf('(') + 1).Trim(')'); - - if (firstSkin != null && - firstSkin.TryGetValue("weapon_defindex", out var weaponDefIndexObj) && - weaponDefIndexObj != null && - int.TryParse(weaponDefIndexObj.ToString(), out var weaponDefIndex) && - int.TryParse(selectedPaintID, out var paintID)) - { - if (Config.Additional.ShowSkinImage && skinsList != null) - { - var foundSkin = skinsList.FirstOrDefault(skin => - ((int?)skin?["weapon_defindex"] ?? 0) == weaponDefIndex && - ((int?)skin?["paint"] ?? 0) == paintID && - skin?["image"] != null - ); - string image = foundSkin?["image"]?.ToString() ?? ""; - PlayerWeaponImage[p.Slot] = image; - AddTimer(2.0f, () => PlayerWeaponImage.Remove(p.Slot), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - } - - p.Print(Localizer["wp_skin_menu_select", selectedSkin]); - - if (!gPlayerWeaponsInfo[p.Slot].ContainsKey(weaponDefIndex)) - { - gPlayerWeaponsInfo[p.Slot][weaponDefIndex] = new WeaponInfo(); - } - - gPlayerWeaponsInfo[p.Slot][weaponDefIndex].Paint = paintID; - gPlayerWeaponsInfo[p.Slot][weaponDefIndex].Wear = 0.01f; - gPlayerWeaponsInfo[p.Slot][weaponDefIndex].Seed = 0; - - PlayerInfo playerInfo = new PlayerInfo - { - UserId = p.UserId, - Slot = p.Slot, - Index = (int)p.Index, - SteamId = p.SteamID.ToString(), - Name = p.PlayerName, - IpAddress = p.IpAddress?.Split(":")[0] - }; - - if (g_bCommandsAllowed && (LifeState_t)p.LifeState == LifeState_t.LIFE_ALIVE && weaponSync != null) - { - RefreshWeapons(player); - - try - { - _ = Task.Run(async () => await weaponSync.SyncWeaponPaintsToDatabase(playerInfo)); - } - catch (Exception ex) - { - Utility.Log($"Error syncing weapon paints: {ex.Message}"); - } - } + return weaponName?.ToString() == selectedWeaponClassname; } - }; + return false; + }); - // Add skin options to the submenu for the selected weapon - if (skinsForSelectedWeapon != null) + var selectedSkin = opt.Text; + var selectedPaintId = selectedSkin[(selectedSkin.LastIndexOf('(') + 1)..].Trim(')'); + + if (firstSkin == null || + !firstSkin.TryGetValue("weapon_defindex", out var weaponDefIndexObj) || + !int.TryParse(weaponDefIndexObj.ToString(), out var weaponDefIndex) || + !int.TryParse(selectedPaintId, out var paintId)) return; { - foreach (var skin in skinsForSelectedWeapon.Where(s => s != null)) + if (Config.Additional.ShowSkinImage && skinsList != null) { - if (skin.TryGetValue("paint_name", out var paintNameObj) && skin.TryGetValue("paint", out var paintObj)) - { - var paintName = paintNameObj?.ToString(); - var paint = paintObj?.ToString(); + var foundSkin = skinsList.FirstOrDefault(skin => + ((int?)skin?["weapon_defindex"] ?? 0) == weaponDefIndex && + ((int?)skin?["paint"] ?? 0) == paintId && + skin?["image"] != null + ); + var image = foundSkin?["image"]?.ToString() ?? ""; + PlayerWeaponImage[p.Slot] = image; + AddTimer(2.0f, () => PlayerWeaponImage.Remove(p.Slot), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } - if (!string.IsNullOrEmpty(paintName) && !string.IsNullOrEmpty(paint)) - { - skinSubMenu.AddMenuOption($"{paintName} ({paint})", handleSkinSelection); - } - } + p.Print(Localizer["wp_skin_menu_select", selectedSkin]); + + if (!gPlayerWeaponsInfo[p.Slot].TryGetValue(weaponDefIndex, out var value)) + { + value = new WeaponInfo(); + gPlayerWeaponsInfo[p.Slot][weaponDefIndex] = value; + } + + value.Paint = paintId; + value.Wear = 0.01f; + value.Seed = 0; + + PlayerInfo playerInfo = new PlayerInfo + { + UserId = p.UserId, + Slot = p.Slot, + Index = (int)p.Index, + SteamId = p.SteamID.ToString(), + Name = p.PlayerName, + IpAddress = p.IpAddress?.Split(":")[0] + }; + + if (!g_bCommandsAllowed || (LifeState_t)p.LifeState != LifeState_t.LIFE_ALIVE || + weaponSync == null) return; + RefreshWeapons(player); + + try + { + _ = Task.Run(async () => await weaponSync.SyncWeaponPaintsToDatabase(playerInfo)); + } + catch (Exception ex) + { + Utility.Log($"Error syncing weapon paints: {ex.Message}"); + } + } + }; + + // Add skin options to the submenu for the selected weapon + if (skinsForSelectedWeapon != null) + { + foreach (var skin in skinsForSelectedWeapon) + { + if (!skin.TryGetValue("paint_name", out var paintNameObj) || + !skin.TryGetValue("paint", out var paintObj)) continue; + var paintName = paintNameObj?.ToString(); + var paint = paintObj?.ToString(); + + if (!string.IsNullOrEmpty(paintName) && !string.IsNullOrEmpty(paint)) + { + skinSubMenu.AddMenuOption($"{paintName} ({paint})", handleSkinSelection); } } - if (player != null && Utility.IsPlayerValid(player)) - MenuManager.OpenChatMenu(player, skinSubMenu); } + if (player != null && Utility.IsPlayerValid(player)) + MenuManager.OpenChatMenu(player, skinSubMenu); }; // Add weapon options to the weapon selection menu - foreach (var weaponClass in weaponList.Keys) + foreach (var weaponName in WeaponList.Keys.Select(weaponClass => WeaponList[weaponClass])) { - string weaponName = weaponList[weaponClass]; weaponSelectionMenu.AddMenuOption(weaponName, handleWeaponSelection); } // Command to open the weapon selection menu for players @@ -338,8 +329,8 @@ namespace WeaponPaints if (player == null || player.UserId == null) return; - if (player != null && !commandsCooldown.TryGetValue(player.Slot, out DateTime cooldownEndTime) || - player != null && DateTime.UtcNow >= (commandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow)) + if (!commandsCooldown.TryGetValue(player.Slot, out var cooldownEndTime) || + DateTime.UtcNow >= (commandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow)) { commandsCooldown[player.Slot] = DateTime.UtcNow.AddSeconds(Config.CmdRefreshCooldownSeconds); MenuManager.OpenChatMenu(player, weaponSelectionMenu); @@ -354,96 +345,95 @@ namespace WeaponPaints private void SetupGlovesMenu() { - var glovesSelectionMenu = new ChatMenu(Localizer["wp_glove_menu_title"]); - glovesSelectionMenu.PostSelectAction = PostSelectAction.Close; + var glovesSelectionMenu = new ChatMenu(Localizer["wp_glove_menu_title"]) + { + PostSelectAction = PostSelectAction.Close + }; var handleGloveSelection = (CCSPlayerController? player, ChatMenuOption option) => { if (!Utility.IsPlayerValid(player) || player is null) return; - string selectedPaintName = option.Text; + var selectedPaintName = option.Text; var selectedGlove = glovesList.FirstOrDefault(g => g.ContainsKey("paint_name") && g["paint_name"]?.ToString() == selectedPaintName); - if (selectedGlove != null) + var image = selectedGlove?["image"]?.ToString() ?? ""; + if ( + selectedGlove != null && + selectedGlove.ContainsKey("weapon_defindex") && + selectedGlove.ContainsKey("paint") && + int.TryParse(selectedGlove["weapon_defindex"]?.ToString(), out var weaponDefindex) && + int.TryParse(selectedGlove["paint"]?.ToString(), out var paint) + ) { - if ( - selectedGlove != null && - selectedGlove.ContainsKey("weapon_defindex") && - selectedGlove.ContainsKey("paint") && - int.TryParse(selectedGlove["weapon_defindex"]?.ToString(), out int weaponDefindex) && - int.TryParse(selectedGlove["paint"]?.ToString(), out int paint) - ) + if (Config.Additional.ShowSkinImage) { - if (Config.Additional.ShowSkinImage) - { - string image = selectedGlove["image"]?.ToString() ?? ""; - PlayerWeaponImage[player.Slot] = image; - AddTimer(2.0f, () => PlayerWeaponImage.Remove(player.Slot), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - } - - PlayerInfo playerInfo = new PlayerInfo - { - UserId = player.UserId, - Slot = player.Slot, - Index = (int)player.Index, - SteamId = player.SteamID.ToString(), - Name = player.PlayerName, - IpAddress = player.IpAddress?.Split(":")[0] - }; - - if (paint != 0) - { - g_playersGlove[player.Slot] = (ushort)weaponDefindex; - - if (!gPlayerWeaponsInfo[player.Slot].ContainsKey(weaponDefindex)) - { - WeaponInfo weaponInfo = new(); - weaponInfo.Paint = paint; - gPlayerWeaponsInfo[player.Slot][weaponDefindex] = weaponInfo; - } - } - else - { - g_playersGlove.TryRemove(player.Slot, out _); - } - - if (!string.IsNullOrEmpty(Localizer["wp_glove_menu_select"])) - { - player!.Print(Localizer["wp_glove_menu_select", selectedPaintName]); - } - - if (weaponSync != null) - { - _ = Task.Run(async () => - { - await weaponSync.SyncGloveToDatabase(playerInfo, weaponDefindex); - - if (!gPlayerWeaponsInfo[playerInfo.Slot].TryGetValue(weaponDefindex, out WeaponInfo? value)) - { - value = new WeaponInfo(); - gPlayerWeaponsInfo[playerInfo.Slot][weaponDefindex] = value; - } - - value.Paint = paint; - value.Wear = 0.00f; - value.Seed = 0; - - await weaponSync.SyncWeaponPaintsToDatabase(playerInfo); - }); - } - - RefreshGloves(player); + PlayerWeaponImage[player.Slot] = image; + AddTimer(2.0f, () => PlayerWeaponImage.Remove(player.Slot), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } - }; + + PlayerInfo playerInfo = new PlayerInfo + { + UserId = player.UserId, + Slot = player.Slot, + Index = (int)player.Index, + SteamId = player.SteamID.ToString(), + Name = player.PlayerName, + IpAddress = player.IpAddress?.Split(":")[0] + }; + + if (paint != 0) + { + g_playersGlove[player.Slot] = (ushort)weaponDefindex; + + if (!gPlayerWeaponsInfo[player.Slot].ContainsKey(weaponDefindex)) + { + WeaponInfo weaponInfo = new() + { + Paint = paint + }; + gPlayerWeaponsInfo[player.Slot][weaponDefindex] = weaponInfo; + } + } + else + { + g_playersGlove.TryRemove(player.Slot, out _); + } + + if (!string.IsNullOrEmpty(Localizer["wp_glove_menu_select"])) + { + player!.Print(Localizer["wp_glove_menu_select", selectedPaintName]); + } + + if (weaponSync != null) + { + _ = Task.Run(async () => + { + await weaponSync.SyncGloveToDatabase(playerInfo, weaponDefindex); + + if (!gPlayerWeaponsInfo[playerInfo.Slot].TryGetValue(weaponDefindex, out var value)) + { + value = new WeaponInfo(); + gPlayerWeaponsInfo[playerInfo.Slot][weaponDefindex] = value; + } + + value.Paint = paint; + value.Wear = 0.00f; + value.Seed = 0; + + await weaponSync.SyncWeaponPaintsToDatabase(playerInfo); + }); + } + + RefreshGloves(player); + } + ; }; // Add weapon options to the weapon selection menu - foreach (var gloveObject in glovesList) + foreach (var paintName in glovesList.Select(gloveObject => gloveObject["paint_name"]?.ToString() ?? "").Where(paintName => paintName.Length > 0)) { - string paintName = gloveObject["paint_name"]?.ToString() ?? ""; - - if (paintName.Length > 0) - glovesSelectionMenu.AddMenuOption(paintName, handleGloveSelection); + glovesSelectionMenu.AddMenuOption(paintName, handleGloveSelection); } // Command to open the weapon selection menu for players @@ -453,8 +443,8 @@ namespace WeaponPaints if (player == null || player.UserId == null) return; - if (player != null && !commandsCooldown.TryGetValue(player.Slot, out DateTime cooldownEndTime) || - player != null && DateTime.UtcNow >= (commandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow)) + if (!commandsCooldown.TryGetValue(player.Slot, out var cooldownEndTime) || + DateTime.UtcNow >= (commandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow)) { commandsCooldown[player.Slot] = DateTime.UtcNow.AddSeconds(Config.CmdRefreshCooldownSeconds); MenuManager.OpenChatMenu(player, glovesSelectionMenu); @@ -473,7 +463,7 @@ namespace WeaponPaints { if (!Utility.IsPlayerValid(player) || player is null) return; - string selectedPaintName = option.Text; + var selectedPaintName = option.Text; var selectedAgent = agentsList.FirstOrDefault(g => g.ContainsKey("agent_name") && g["agent_name"] != null && g["agent_name"]!.ToString() == selectedPaintName && @@ -482,7 +472,6 @@ namespace WeaponPaints if (selectedAgent == null) return; if ( - selectedAgent != null && selectedAgent.ContainsKey("model") ) { @@ -498,7 +487,7 @@ namespace WeaponPaints if (Config.Additional.ShowSkinImage) { - string image = selectedAgent["image"]?.ToString() ?? ""; + var image = selectedAgent["image"]?.ToString() ?? ""; PlayerWeaponImage[player.Slot] = image; AddTimer(2.0f, () => PlayerWeaponImage.Remove(player.Slot), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } @@ -539,15 +528,17 @@ namespace WeaponPaints if (player == null || player.UserId == null) return; - if (player != null && !commandsCooldown.TryGetValue(player.Slot, out DateTime cooldownEndTime) || - player != null && DateTime.UtcNow >= (commandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow)) + if (!commandsCooldown.TryGetValue(player.Slot, out DateTime cooldownEndTime) || + DateTime.UtcNow >= (commandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow)) { - var agentsSelectionMenu = new ChatMenu(Localizer["wp_agent_menu_title"]); - agentsSelectionMenu.PostSelectAction = PostSelectAction.Close; + var agentsSelectionMenu = new ChatMenu(Localizer["wp_agent_menu_title"]) + { + PostSelectAction = PostSelectAction.Close + }; var filteredAgents = agentsList.Where(agentObject => { - if (agentObject["team"]?.Value() is int teamNum) + if (agentObject["team"]?.Value() is { } teamNum) { return teamNum == player.TeamNum; } @@ -561,7 +552,7 @@ namespace WeaponPaints foreach (var agentObject in filteredAgents) { - string paintName = agentObject["agent_name"]?.ToString() ?? ""; + var paintName = agentObject["agent_name"]?.ToString() ?? ""; if (paintName.Length > 0) agentsSelectionMenu.AddMenuOption(paintName, handleAgentSelection); @@ -580,66 +571,63 @@ namespace WeaponPaints private void SetupMusicMenu() { - var musicSelectionMenu = new ChatMenu(Localizer["wp_music_menu_title"]); - musicSelectionMenu.PostSelectAction = PostSelectAction.Close; + var musicSelectionMenu = new ChatMenu(Localizer["wp_music_menu_title"]) + { + PostSelectAction = PostSelectAction.Close + }; var handleMusicSelection = (CCSPlayerController? player, ChatMenuOption option) => { if (!Utility.IsPlayerValid(player) || player is null) return; - string selectedPaintName = option.Text; + var selectedPaintName = option.Text; var selectedMusic = musicList.FirstOrDefault(g => g.ContainsKey("name") && g["name"]?.ToString() == selectedPaintName); if (selectedMusic != null) { - if ( - selectedMusic != null && - selectedMusic.ContainsKey("id") && - selectedMusic.ContainsKey("name") && - int.TryParse(selectedMusic["id"]?.ToString(), out int paint) - ) + if (!selectedMusic.ContainsKey("id") || + !selectedMusic.ContainsKey("name") || + !int.TryParse(selectedMusic["id"]?.ToString(), out var paint)) return; + var image = selectedMusic["image"]?.ToString() ?? ""; + if (Config.Additional.ShowSkinImage) { - if (Config.Additional.ShowSkinImage) - { - string image = selectedMusic["image"]?.ToString() ?? ""; - PlayerWeaponImage[player.Slot] = image; - AddTimer(2.0f, () => PlayerWeaponImage.Remove(player.Slot), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - } - - PlayerInfo playerInfo = new PlayerInfo - { - UserId = player.UserId, - Slot = player.Slot, - Index = (int)player.Index, - SteamId = player.SteamID.ToString(), - Name = player.PlayerName, - IpAddress = player.IpAddress?.Split(":")[0] - }; - - if (paint != 0) - { - g_playersMusic[player.Slot] = (ushort)paint; - } - else - { - g_playersMusic[player.Slot] = 0; - } - - if (!string.IsNullOrEmpty(Localizer["wp_music_menu_select"])) - { - player!.Print(Localizer["wp_music_menu_select", selectedPaintName]); - } - - if (weaponSync != null) - { - _ = Task.Run(async () => - { - await weaponSync.SyncMusicToDatabase(playerInfo, (ushort)paint); - }); - } - - //RefreshGloves(player); + PlayerWeaponImage[player.Slot] = image; + AddTimer(2.0f, () => PlayerWeaponImage.Remove(player.Slot), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } + + PlayerInfo playerInfo = new PlayerInfo + { + UserId = player.UserId, + Slot = player.Slot, + Index = (int)player.Index, + SteamId = player.SteamID.ToString(), + Name = player.PlayerName, + IpAddress = player.IpAddress?.Split(":")[0] + }; + + if (paint != 0) + { + g_playersMusic[player.Slot] = (ushort)paint; + } + else + { + g_playersMusic[player.Slot] = 0; + } + + if (!string.IsNullOrEmpty(Localizer["wp_music_menu_select"])) + { + player!.Print(Localizer["wp_music_menu_select", selectedPaintName]); + } + + if (weaponSync != null) + { + _ = Task.Run(async () => + { + await weaponSync.SyncMusicToDatabase(playerInfo, (ushort)paint); + }); + } + + //RefreshGloves(player); } else { @@ -672,12 +660,9 @@ namespace WeaponPaints musicSelectionMenu.AddMenuOption(Localizer["None"], handleMusicSelection); // Add weapon options to the weapon selection menu - foreach (var musicObject in musicList) + foreach (var paintName in musicList.Select(musicObject => musicObject["name"]?.ToString() ?? "").Where(paintName => paintName.Length > 0)) { - string paintName = musicObject["name"]?.ToString() ?? ""; - - if (paintName.Length > 0) - musicSelectionMenu.AddMenuOption(paintName, handleMusicSelection); + musicSelectionMenu.AddMenuOption(paintName, handleMusicSelection); } // Command to open the weapon selection menu for players @@ -687,8 +672,8 @@ namespace WeaponPaints if (player == null || player.UserId == null) return; - if (player != null && !commandsCooldown.TryGetValue(player.Slot, out DateTime cooldownEndTime) || - player != null && DateTime.UtcNow >= (commandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow)) + if (!commandsCooldown.TryGetValue(player.Slot, out var cooldownEndTime) || + DateTime.UtcNow >= (commandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow)) { commandsCooldown[player.Slot] = DateTime.UtcNow.AddSeconds(Config.CmdRefreshCooldownSeconds); MenuManager.OpenChatMenu(player, musicSelectionMenu); diff --git a/Config.cs b/Config.cs index bbb988a4..a9d7ae48 100644 --- a/Config.cs +++ b/Config.cs @@ -89,6 +89,6 @@ namespace WeaponPaints public string Website { get; set; } = "example.com/skins"; [JsonPropertyName("Additional")] - public Additional Additional { get; set; } = new Additional(); + public Additional Additional { get; set; } = new(); } } \ No newline at end of file diff --git a/Events.cs b/Events.cs index 701b45a0..51c68b36 100644 --- a/Events.cs +++ b/Events.cs @@ -18,7 +18,7 @@ namespace WeaponPaints if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || player.SteamID.ToString().Length != 17 || weaponSync == null || _database == null) return HookResult.Continue; - PlayerInfo playerInfo = new PlayerInfo + PlayerInfo? playerInfo = new PlayerInfo { UserId = player.UserId, Slot = player.Slot, @@ -54,7 +54,7 @@ namespace WeaponPaints } */ } - catch (Exception) + catch { } @@ -108,7 +108,7 @@ namespace WeaponPaints private void GivePlayerWeaponSkin(CCSPlayerController player, CBasePlayerWeapon weapon) { if (!Config.Additional.SkinEnabled) return; - if (!gPlayerWeaponsInfo.TryGetValue(player.Slot, out System.Collections.Concurrent.ConcurrentDictionary? _value)) return; + if (!gPlayerWeaponsInfo.TryGetValue(player.Slot, out _)) return; bool isKnife = weapon.DesignerName.Contains("knife") || weapon.DesignerName.Contains("bayonet"); @@ -143,31 +143,23 @@ namespace WeaponPaints weapon.FallbackPaintKit = GetRandomPaint(weaponDefIndex); weapon.FallbackSeed = 0; weapon.FallbackWear = 0.000001f; - CAttributeList_SetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle, "set item texture prefab", weapon.FallbackPaintKit); + CAttributeListSetOrAddAttributeValueByName.Invoke( + weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle, "set item texture prefab", + weapon.FallbackPaintKit); fallbackPaintKit = weapon.FallbackPaintKit; if (fallbackPaintKit == 0) return; - if (!isKnife) - { - if (newPaints.Contains(fallbackPaintKit)) - { - UpdatePlayerWeaponMeshGroupMask(player, weapon, false); - } - else - { - UpdatePlayerWeaponMeshGroupMask(player, weapon, true); - } - } - + if (isKnife) return; + UpdatePlayerWeaponMeshGroupMask(player, weapon, !newPaints.Contains(fallbackPaintKit)); return; } - if (!gPlayerWeaponsInfo[player.Slot].TryGetValue(weaponDefIndex, out WeaponInfo? value) || value.Paint == 0) return; + if (!gPlayerWeaponsInfo[player.Slot].TryGetValue(weaponDefIndex, out var value) || value.Paint == 0) return; - WeaponInfo weaponInfo = value; + var weaponInfo = value; //Log($"Apply on {weapon.DesignerName}({weapon.AttributeManager.Item.ItemDefinitionIndex}) paint {gPlayerWeaponPaints[steamId.SteamId64][weapon.AttributeManager.Item.ItemDefinitionIndex]} seed {gPlayerWeaponSeed[steamId.SteamId64][weapon.AttributeManager.Item.ItemDefinitionIndex]} wear {gPlayerWeaponWear[steamId.SteamId64][weapon.AttributeManager.Item.ItemDefinitionIndex]}"); weapon.AttributeManager.Item.ItemID = 16384; weapon.AttributeManager.Item.ItemIDLow = 16384 & 0xFFFFFFFF; @@ -175,29 +167,20 @@ namespace WeaponPaints weapon.FallbackPaintKit = weaponInfo.Paint; weapon.FallbackSeed = weaponInfo.Seed; weapon.FallbackWear = weaponInfo.Wear; - CAttributeList_SetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle, "set item texture prefab", weapon.FallbackPaintKit); + CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle, "set item texture prefab", weapon.FallbackPaintKit); fallbackPaintKit = weapon.FallbackPaintKit; if (fallbackPaintKit == 0) return; - if (!isKnife) - { - if (newPaints.Contains(fallbackPaintKit)) - { - UpdatePlayerWeaponMeshGroupMask(player, weapon, false); - } - else - { - UpdatePlayerWeaponMeshGroupMask(player, weapon, true); - } - } + if (isKnife) return; + UpdatePlayerWeaponMeshGroupMask(player, weapon, !newPaints.Contains(fallbackPaintKit)); } private void OnMapStart(string mapName) { - if (!Config.Additional.KnifeEnabled && !Config.Additional.SkinEnabled && !Config.Additional.GloveEnabled) return; + if (Config.Additional is { KnifeEnabled: false, SkinEnabled: false, GloveEnabled: false }) return; if (_database != null) weaponSync = new WeaponSynchronization(_database, Config); @@ -207,7 +190,7 @@ namespace WeaponPaints { CCSPlayerController? player = @event.Userid; - if (player is null || !player.IsValid || !Config.Additional.KnifeEnabled && !Config.Additional.GloveEnabled) + if (player is null || !player.IsValid || Config.Additional is { KnifeEnabled: false, GloveEnabled: false }) return HookResult.Continue; CCSPlayerPawn? pawn = player.PlayerPawn.Value; @@ -237,17 +220,10 @@ namespace WeaponPaints private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo info) { - /* - NativeAPI.IssueServerCommand("mp_t_default_melee \"\""); - NativeAPI.IssueServerCommand("mp_ct_default_melee \"\""); - NativeAPI.IssueServerCommand("mp_equipment_reset_rounds 0"); - */ g_bCommandsAllowed = true; - return HookResult.Continue; } - public HookResult OnGiveNamedItemPost(DynamicHook hook) { try @@ -266,7 +242,6 @@ namespace WeaponPaints return HookResult.Continue; } - public void OnEntityCreated(CEntityInstance entity) { var designerName = entity.DesignerName; @@ -276,7 +251,7 @@ namespace WeaponPaints Server.NextFrame(() => { var weapon = new CBasePlayerWeapon(entity.Handle); - if (weapon == null || !weapon.IsValid) return; + if (!weapon.IsValid) return; try { @@ -289,7 +264,7 @@ namespace WeaponPaints if (_steamid != null && _steamid.IsValid()) { - player = Utilities.GetPlayers().Where(p => p is not null && p.IsValid && p.SteamID == _steamid.SteamId64).FirstOrDefault(); + player = Utilities.GetPlayers().FirstOrDefault(p => p.IsValid && p.SteamID == _steamid.SteamId64); if (player == null) player = Utilities.GetPlayerFromSteamId(weapon.OriginalOwnerXuidLow); @@ -301,7 +276,7 @@ namespace WeaponPaints } if (string.IsNullOrEmpty(player?.PlayerName)) return; - if (player is null || !Utility.IsPlayerValid(player)) return; + if (!Utility.IsPlayerValid(player)) return; GivePlayerWeaponSkin(player, weapon); } @@ -318,13 +293,13 @@ namespace WeaponPaints if (!Config.Additional.ShowSkinImage) return; foreach (var player in Utilities.GetPlayers().Where(p => - p is not null && p.IsValid && p.PlayerPawn != null && p.PlayerPawn.IsValid && + p is { IsValid: true, PlayerPawn.IsValid: true } && (LifeState_t)p.LifeState == LifeState_t.LIFE_ALIVE && p.SteamID.ToString().Length == 17 - && !p.IsBot && !p.IsHLTV && p.Connected == PlayerConnectedState.PlayerConnected + && !p.IsBot && p is { IsHLTV: false, Connected: PlayerConnectedState.PlayerConnected } ) ) { - if (PlayerWeaponImage.TryGetValue(player.Slot, out string? value) && !string.IsNullOrEmpty(value)) + if (PlayerWeaponImage.TryGetValue(player.Slot, out var value) && !string.IsNullOrEmpty(value)) { player.PrintToCenterHtml("".Replace("{PATH}", value)); } diff --git a/PlayerInfo.cs b/PlayerInfo.cs index 5079621d..8190c0d0 100644 --- a/PlayerInfo.cs +++ b/PlayerInfo.cs @@ -3,9 +3,9 @@ public class PlayerInfo { public int Index { get; set; } - public int Slot { get; set; } + public int Slot { get; init; } public int? UserId { get; set; } - public string? SteamId { get; set; } + public string? SteamId { get; init; } public string? Name { get; set; } public string? IpAddress { get; set; } } diff --git a/Utility.cs b/Utility.cs index 7e426018..54758988 100644 --- a/Utility.cs +++ b/Utility.cs @@ -25,34 +25,42 @@ namespace WeaponPaints { string[] createTableQueries = [ - @"CREATE TABLE IF NOT EXISTS `wp_player_skins` ( - `steamid` varchar(18) NOT NULL, - `weapon_defindex` int(6) NOT NULL, - `weapon_paint_id` int(6) NOT NULL, - `weapon_wear` float NOT NULL DEFAULT 0.000001, - `weapon_seed` int(16) NOT NULL DEFAULT 0 - ) ENGINE=InnoDB", + """ + CREATE TABLE IF NOT EXISTS `wp_player_skins` ( + `steamid` varchar(18) NOT NULL, + `weapon_defindex` int(6) NOT NULL, + `weapon_paint_id` int(6) NOT NULL, + `weapon_wear` float NOT NULL DEFAULT 0.000001, + `weapon_seed` int(16) NOT NULL DEFAULT 0 + ) ENGINE=InnoDB + """, @"CREATE TABLE IF NOT EXISTS `wp_player_knife` ( `steamid` varchar(18) NOT NULL, `knife` varchar(64) NOT NULL, UNIQUE (`steamid`) ) ENGINE = InnoDB", - @"CREATE TABLE IF NOT EXISTS `wp_player_gloves` ( - `steamid` varchar(18) NOT NULL, - `weapon_defindex` int(11) NOT NULL, - UNIQUE (`steamid`) - ) ENGINE=InnoDB", - @"CREATE TABLE IF NOT EXISTS `wp_player_agents` ( - `steamid` varchar(18) NOT NULL, - `agent_ct` varchar(64) DEFAULT NULL, - `agent_t` varchar(64) DEFAULT NULL, - UNIQUE (`steamid`) - ) ENGINE=InnoDB", - @"CREATE TABLE IF NOT EXISTS `wp_player_music` ( - `steamid` varchar(64) NOT NULL, - `music_id` int(11) NOT NULL, - UNIQUE (`steamid`) - ) ENGINE=InnoDB", + """ + CREATE TABLE IF NOT EXISTS `wp_player_gloves` ( + `steamid` varchar(18) NOT NULL, + `weapon_defindex` int(11) NOT NULL, + UNIQUE (`steamid`) + ) ENGINE=InnoDB + """, + """ + CREATE TABLE IF NOT EXISTS `wp_player_agents` ( + `steamid` varchar(18) NOT NULL, + `agent_ct` varchar(64) DEFAULT NULL, + `agent_t` varchar(64) DEFAULT NULL, + UNIQUE (`steamid`) + ) ENGINE=InnoDB + """, + """ + CREATE TABLE IF NOT EXISTS `wp_player_music` ( + `steamid` varchar(64) NOT NULL, + `music_id` int(11) NOT NULL, + UNIQUE (`steamid`) + ) ENGINE=InnoDB + """, ]; foreach (var query in createTableQueries) @@ -78,16 +86,16 @@ namespace WeaponPaints { if (player is null || WeaponPaints.weaponSync is null) return false; - return (player.IsValid && !player.IsBot && !player.IsHLTV && player.UserId.HasValue); + return player is { IsValid: true, IsBot: false, IsHLTV: false, UserId: not null }; } internal static void LoadSkinsFromFile(string filePath, ILogger logger) { + string json = File.ReadAllText(filePath); try { - string json = File.ReadAllText(filePath); var deserializedSkins = JsonConvert.DeserializeObject>(json); - WeaponPaints.skinsList = deserializedSkins ?? new List(); + WeaponPaints.skinsList = deserializedSkins ?? []; } catch (FileNotFoundException) { @@ -99,9 +107,9 @@ namespace WeaponPaints { try { - string json = File.ReadAllText(filePath); + var json = File.ReadAllText(filePath); var deserializedSkins = JsonConvert.DeserializeObject>(json); - WeaponPaints.glovesList = deserializedSkins ?? new List(); + WeaponPaints.glovesList = deserializedSkins ?? []; } catch (FileNotFoundException) { @@ -113,9 +121,9 @@ namespace WeaponPaints { try { - string json = File.ReadAllText(filePath); + var json = File.ReadAllText(filePath); var deserializedSkins = JsonConvert.DeserializeObject>(json); - WeaponPaints.agentsList = deserializedSkins ?? new List(); + WeaponPaints.agentsList = deserializedSkins ?? []; } catch (FileNotFoundException) { @@ -127,9 +135,9 @@ namespace WeaponPaints { try { - string json = File.ReadAllText(filePath); + var json = File.ReadAllText(filePath); var deserializedSkins = JsonConvert.DeserializeObject>(json); - WeaponPaints.musicList = deserializedSkins ?? new List(); + WeaponPaints.musicList = deserializedSkins ?? []; } catch (FileNotFoundException) { @@ -156,26 +164,26 @@ namespace WeaponPaints try { - HttpResponseMessage response = await client.GetAsync("https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/VERSION").ConfigureAwait(false); + var response = await client.GetAsync("https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/VERSION").ConfigureAwait(false); if (response.IsSuccessStatusCode) { - string remoteVersion = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + var remoteVersion = await response.Content.ReadAsStringAsync().ConfigureAwait(false); remoteVersion = remoteVersion.Trim(); - int comparisonResult = string.Compare(version, remoteVersion); + var comparisonResult = string.CompareOrdinal(version, remoteVersion); - if (comparisonResult < 0) + switch (comparisonResult) { - logger.LogWarning("Plugin is outdated! Check https://github.com/Nereziel/cs2-WeaponPaints"); - } - else if (comparisonResult > 0) - { - logger.LogInformation("Probably dev version detected"); - } - else - { - logger.LogInformation("Plugin is up to date"); + case < 0: + logger.LogWarning("Plugin is outdated! Check https://github.com/Nereziel/cs2-WeaponPaints"); + break; + case > 0: + logger.LogInformation("Probably dev version detected"); + break; + default: + logger.LogInformation("Plugin is up to date"); + break; } } else diff --git a/VERSION b/VERSION index 4461c655..832b7c58 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.4d \ No newline at end of file +2.4e \ No newline at end of file diff --git a/WeaponAction.cs b/WeaponAction.cs index d73d5f8b..26b29545 100644 --- a/WeaponAction.cs +++ b/WeaponAction.cs @@ -11,7 +11,7 @@ namespace WeaponPaints { public partial class WeaponPaints { - internal static void GiveKnifeToPlayer(CCSPlayerController? player) + private static void GiveKnifeToPlayer(CCSPlayerController? player) { if (!_config.Additional.KnifeEnabled || player == null || !player.IsValid) return; @@ -21,11 +21,11 @@ namespace WeaponPaints player.GiveNamedItem(CsItem.Knife); } - internal static bool PlayerHasKnife(CCSPlayerController? player) + private static bool PlayerHasKnife(CCSPlayerController? player) { if (!_config.Additional.KnifeEnabled) return false; - if (player == null || !player.IsValid || player.PlayerPawn == null || !player.PlayerPawn.IsValid) + if (player == null || !player.IsValid || !player.PlayerPawn.IsValid) { return false; } @@ -37,18 +37,16 @@ namespace WeaponPaints if (weapons == null) return false; foreach (var weapon in weapons) { - if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid) + if (!weapon.IsValid || weapon.Value == null || !weapon.Value.IsValid) continue; + if (weapon.Value.DesignerName.Contains("knife") || weapon.Value.DesignerName.Contains("bayonet")) { - if (weapon.Value.DesignerName.Contains("knife") || weapon.Value.DesignerName.Contains("bayonet")) - { - return true; - } + return true; } } return false; } - internal void RefreshWeapons(CCSPlayerController? player) + private void RefreshWeapons(CCSPlayerController? player) { if (!g_bCommandsAllowed) return; if (player == null || !player.IsValid || player.PlayerPawn?.Value == null || (LifeState_t)player.LifeState != LifeState_t.LIFE_ALIVE) @@ -58,9 +56,9 @@ namespace WeaponPaints var weapons = player.PlayerPawn.Value.WeaponServices.MyWeapons; - if (weapons == null || weapons.Count == 0) + if (weapons.Count == 0) return; - if (player.Team == CsTeam.None || player.Team == CsTeam.Spectator) + if (player.Team is CsTeam.None or CsTeam.Spectator) return; int playerTeam = player.TeamNum; @@ -69,37 +67,33 @@ namespace WeaponPaints foreach (var weapon in weapons) { - if (weapon == null || !weapon.IsValid || weapon.Value == null || + if (!weapon.IsValid || weapon.Value == null || !weapon.Value.IsValid || !weapon.Value.DesignerName.Contains("weapon_")) continue; CCSWeaponBaseGun gun = weapon.Value.As(); if (weapon.Value.Entity == null) continue; - if (weapon.Value.OwnerEntity == null) continue; if (!weapon.Value.OwnerEntity.IsValid) continue; - if (gun == null) continue; if (gun.Entity == null) continue; if (!gun.IsValid) continue; if (!gun.VisibleinPVS) continue; try { - string? weaponByDefindex = null; - CCSWeaponBaseVData? weaponData = weapon.Value.As().VData; if (weaponData == null) continue; if (weaponData.GearSlot == gear_slot_t.GEAR_SLOT_RIFLE || weaponData.GearSlot == gear_slot_t.GEAR_SLOT_PISTOL) { - if (!WeaponDefindex.TryGetValue(weapon.Value.AttributeManager.Item.ItemDefinitionIndex, out weaponByDefindex)) + if (!WeaponDefindex.TryGetValue(weapon.Value.AttributeManager.Item.ItemDefinitionIndex, out var weaponByDefindex)) continue; int clip1 = weapon.Value.Clip1; int reservedAmmo = weapon.Value.ReserveAmmo[0]; - if (!weaponsWithAmmo.TryGetValue(weaponByDefindex, out List<(int, int)>? value)) + if (!weaponsWithAmmo.TryGetValue(weaponByDefindex, out var value)) { value = []; weaponsWithAmmo.Add(weaponByDefindex, value); @@ -107,7 +101,7 @@ namespace WeaponPaints value.Add((clip1, reservedAmmo)); - if (gun == null || gun.VData == null) return; + if (gun.VData == null) return; weapon.Value.Remove(); } @@ -121,16 +115,16 @@ namespace WeaponPaints try { - player.ExecuteClientCommandFromServer("slot 3"); - player.ExecuteClientCommandFromServer("slot 3"); + player.ExecuteClientCommand("slot 3"); + player.ExecuteClientCommand("slot 3"); var weapon = player.PlayerPawn.Value.WeaponServices.ActiveWeapon; - if (weapon is null || !weapon.IsValid || weapon.Value == null) return; + if (!weapon.IsValid || weapon.Value == null) return; CCSWeaponBaseVData? weaponData = weapon.Value.As().VData; if (weapon.Value.DesignerName.Contains("knife") || weaponData?.GearSlot == gear_slot_t.GEAR_SLOT_KNIFE) { - CCSWeaponBaseGun gun = weapon.Value.As(); + CCSWeaponBaseGun gun; AddTimer(0.3f, () => { @@ -144,7 +138,7 @@ namespace WeaponPaints { if (player.TeamNum != playerTeam) return; - if (gun == null || !gun.IsValid || gun.State != CSWeaponState_t.WEAPON_NOT_CARRIED) return; + if (!gun.IsValid || gun.State != CSWeaponState_t.WEAPON_NOT_CARRIED) return; gun.Remove(); }); @@ -171,11 +165,8 @@ namespace WeaponPaints { try { - if (newWeapon != null) - { - newWeapon.Clip1 = ammo.Item1; - newWeapon.ReserveAmmo[0] = ammo.Item2; - } + newWeapon.Clip1 = ammo.Item1; + newWeapon.ReserveAmmo[0] = ammo.Item2; } catch (Exception ex) { @@ -195,7 +186,7 @@ namespace WeaponPaints if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; - string model = pawn.CBodyComponent?.SceneNode?.GetSkeletonInstance()?.ModelState.ModelName ?? string.Empty; + var model = pawn.CBodyComponent?.SceneNode?.GetSkeletonInstance()?.ModelState.ModelName ?? string.Empty; if (!string.IsNullOrEmpty(model)) { pawn.SetModel("characters/models/tm_jumpsuit/tm_jumpsuit_varianta.vmdl"); @@ -204,35 +195,30 @@ namespace WeaponPaints Instance.AddTimer(0.06f, () => { + CEconItemView item = pawn.EconGloves; try { - if (player == null || !player.IsValid) + if (!player.IsValid) return; - if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) + if (!player.PawnIsAlive) return; - if (g_playersGlove.TryGetValue(player.Slot, out var gloveInfo) && gloveInfo != 0) - { - CCSPlayerPawn? pawn = player.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) - return; + if (!g_playersGlove.TryGetValue(player.Slot, out var gloveInfo) || gloveInfo == 0) return; - WeaponInfo weaponInfo = gPlayerWeaponsInfo[player.Slot][gloveInfo]; + WeaponInfo weaponInfo = gPlayerWeaponsInfo[player.Slot][gloveInfo]; - CEconItemView item = pawn.EconGloves; - item.ItemDefinitionIndex = gloveInfo; - item.ItemIDLow = 16384 & 0xFFFFFFFF; - item.ItemIDHigh = 16384; + item.ItemDefinitionIndex = gloveInfo; + item.ItemIDLow = 16384 & 0xFFFFFFFF; + item.ItemIDHigh = 16384; - CAttributeList_SetOrAddAttributeValueByName.Invoke(item.NetworkedDynamicAttributes.Handle, "set item texture prefab", weaponInfo.Paint); - CAttributeList_SetOrAddAttributeValueByName.Invoke(item.NetworkedDynamicAttributes.Handle, "set item texture seed", weaponInfo.Seed); - CAttributeList_SetOrAddAttributeValueByName.Invoke(item.NetworkedDynamicAttributes.Handle, "set item texture wear", weaponInfo.Wear); + CAttributeListSetOrAddAttributeValueByName.Invoke(item.NetworkedDynamicAttributes.Handle, "set item texture prefab", weaponInfo.Paint); + CAttributeListSetOrAddAttributeValueByName.Invoke(item.NetworkedDynamicAttributes.Handle, "set item texture seed", weaponInfo.Seed); + CAttributeListSetOrAddAttributeValueByName.Invoke(item.NetworkedDynamicAttributes.Handle, "set item texture wear", weaponInfo.Wear); - item.Initialized = true; + item.Initialized = true; - CBaseModelEntity_SetBodygroup.Invoke(pawn, "default_gloves", 1); - } + CBaseModelEntitySetBodygroup.Invoke(pawn, "default_gloves", 1); } catch (Exception) { } }, TimerFlags.STOP_ON_MAPCHANGE); @@ -240,7 +226,7 @@ namespace WeaponPaints private static int GetRandomPaint(int defindex) { - if (skinsList == null || skinsList.Count == 0) + if (skinsList.Count == 0) return 0; Random rnd = new Random(); @@ -253,55 +239,46 @@ namespace WeaponPaints var randomWeapon = filteredWeapons[rnd.Next(filteredWeapons.Count)]; - if (int.TryParse(randomWeapon["paint"]?.ToString(), out int paintValue)) - return paintValue; - - return 0; + return int.TryParse(randomWeapon["paint"]?.ToString(), out var paintValue) ? paintValue : 0; } - public static void SubclassChange(CBasePlayerWeapon weapon, ushort itemD) + private static void SubclassChange(CBasePlayerWeapon weapon, ushort itemD) { - var SubclassChangeFunc = VirtualFunction.Create( + var subclassChangeFunc = VirtualFunction.Create( GameData.GetSignature("ChangeSubclass") ); - SubclassChangeFunc(weapon.Handle, itemD.ToString()); + subclassChangeFunc(weapon.Handle, itemD.ToString()); } - public static void UpdateWeaponMeshGroupMask(CBaseEntity weapon, bool isLegacy = false) + private static void UpdateWeaponMeshGroupMask(CBaseEntity weapon, bool isLegacy = false) { - if (weapon.CBodyComponent != null && weapon.CBodyComponent.SceneNode != null) - { - var skeleton = weapon.CBodyComponent.SceneNode.GetSkeletonInstance(); - if (skeleton != null) - { - var value = (ulong)(isLegacy ? 2 : 1); + if (weapon.CBodyComponent?.SceneNode == null) return; + var skeleton = weapon.CBodyComponent.SceneNode.GetSkeletonInstance(); + var value = (ulong)(isLegacy ? 2 : 1); - if (skeleton.ModelState.MeshGroupMask != value) - { - skeleton.ModelState.MeshGroupMask = value; - } - } + if (skeleton.ModelState.MeshGroupMask != value) + { + skeleton.ModelState.MeshGroupMask = value; } } - public static void UpdatePlayerWeaponMeshGroupMask(CCSPlayerController player, CBasePlayerWeapon weapon, bool isLegacy) + private static void UpdatePlayerWeaponMeshGroupMask(CCSPlayerController player, CBasePlayerWeapon weapon, bool isLegacy) { UpdateWeaponMeshGroupMask(weapon, isLegacy); var viewModel = GetPlayerViewModel(player); - if (viewModel != null && viewModel.Weapon.Value != null && viewModel.Weapon.Value.Index == weapon.Index) - { - UpdateWeaponMeshGroupMask(viewModel, isLegacy); - Utilities.SetStateChanged(viewModel, "CBaseEntity", "m_CBodyComponent"); - } + if (viewModel == null || viewModel.Weapon.Value == null || + viewModel.Weapon.Value.Index != weapon.Index) return; + UpdateWeaponMeshGroupMask(viewModel, isLegacy); + Utilities.SetStateChanged(viewModel, "CBaseEntity", "m_CBodyComponent"); } - public static void GivePlayerAgent(CCSPlayerController player) + private static void GivePlayerAgent(CCSPlayerController player) { - if (!g_playersAgent.ContainsKey(player.Slot)) return; + if (!g_playersAgent.TryGetValue(player.Slot, out var value)) return; - string? model = player.TeamNum == 3 ? g_playersAgent[player.Slot].CT : g_playersAgent[player.Slot].T; + var model = player.TeamNum == 3 ? value.CT : value.T; if (string.IsNullOrEmpty(model)) return; if (player.PlayerPawn.Value == null) @@ -321,43 +298,41 @@ namespace WeaponPaints } } - public static void GivePlayerMusicKit(CCSPlayerController player) + private static void GivePlayerMusicKit(CCSPlayerController player) { - if (!g_playersMusic.ContainsKey(player.Slot)) return; + if (!g_playersMusic.TryGetValue(player.Slot, out var value)) return; if (player.InventoryServices == null) return; - Console.WriteLine(g_playersMusic[player.Slot]); + Console.WriteLine(value); - player.InventoryServices.MusicID = g_playersMusic[player.Slot]; + player.InventoryServices.MusicID = value; } - public static CCSPlayerController? GetPlayerFromItemServices(CCSPlayer_ItemServices itemServices) + private static CCSPlayerController? GetPlayerFromItemServices(CCSPlayer_ItemServices itemServices) { var pawn = itemServices.Pawn.Value; - if (pawn == null || !pawn.IsValid || !pawn.Controller.IsValid || pawn.Controller.Value == null) return null; + if (!pawn.IsValid || !pawn.Controller.IsValid || pawn.Controller.Value == null) return null; var player = new CCSPlayerController(pawn.Controller.Value.Handle); - if (!Utility.IsPlayerValid(player)) return null; - return player; + return !Utility.IsPlayerValid(player) ? null : player; } private static unsafe CBaseViewModel? GetPlayerViewModel(CCSPlayerController player) { if (player.PlayerPawn.Value == null || player.PlayerPawn.Value.ViewModelServices == null) return null; CCSPlayer_ViewModelServices viewModelServices = new(player.PlayerPawn.Value.ViewModelServices!.Handle); - nint ptr = viewModelServices.Handle + Schema.GetSchemaOffset("CCSPlayer_ViewModelServices", "m_hViewModel"); + var ptr = viewModelServices.Handle + Schema.GetSchemaOffset("CCSPlayer_ViewModelServices", "m_hViewModel"); var references = MemoryMarshal.CreateSpan(ref ptr, 3); var viewModel = (CHandle)Activator.CreateInstance(typeof(CHandle), references[0])!; - if (viewModel == null || viewModel.Value == null) return null; - return viewModel.Value; + return viewModel.Value == null ? null : viewModel.Value; } public static unsafe T[] GetFixedArray(nint pointer, string @class, string member, int length) where T : CHandle { - nint ptr = pointer + Schema.GetSchemaOffset(@class, member); - Span references = MemoryMarshal.CreateSpan(ref ptr, length); - T[] values = new T[length]; + var ptr = pointer + Schema.GetSchemaOffset(@class, member); + var references = MemoryMarshal.CreateSpan(ref ptr, length); + var values = new T[length]; - for (int i = 0; i < length; i++) + for (var i = 0; i < length; i++) { values[i] = (T)Activator.CreateInstance(typeof(T), references[i])!; } diff --git a/WeaponPaints.cs b/WeaponPaints.cs index 94a4909f..3b60fac1 100644 --- a/WeaponPaints.cs +++ b/WeaponPaints.cs @@ -15,7 +15,7 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig weaponList = new() + private static readonly Dictionary WeaponList = new() { {"weapon_deagle", "Desert Eagle"}, {"weapon_elite", "Dual Berettas"}, @@ -75,9 +75,9 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig g_knifePickupCount = new(); + private static Dictionary g_knifePickupCount = new(); internal static ConcurrentDictionary g_playersKnife = new(); internal static ConcurrentDictionary g_playersGlove = new(); internal static ConcurrentDictionary g_playersMusic = new(); @@ -88,16 +88,18 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig agentsList = new(); internal static List musicList = new(); internal static WeaponSynchronization? weaponSync; - public static bool g_bCommandsAllowed = true; - internal Dictionary PlayerWeaponImage = new(); + private static bool g_bCommandsAllowed = true; + private Dictionary PlayerWeaponImage = new(); - internal static Dictionary commandsCooldown = new(); + private static Dictionary commandsCooldown = new(); internal static Database? _database; - internal static MemoryFunctionVoid CAttributeList_SetOrAddAttributeValueByName = new(GameData.GetSignature("CAttributeList_SetOrAddAttributeValueByName")); - internal static MemoryFunctionVoid CBaseModelEntity_SetBodygroup = new(GameData.GetSignature("CBaseModelEntity_SetBodygroup")); + private static readonly MemoryFunctionVoid CAttributeListSetOrAddAttributeValueByName = new(GameData.GetSignature("CAttributeList_SetOrAddAttributeValueByName")); - public static Dictionary WeaponDefindex { get; } = new Dictionary + private static readonly MemoryFunctionVoid CBaseModelEntitySetBodygroup = + new(GameData.GetSignature("CBaseModelEntity_SetBodygroup")); + + private static Dictionary WeaponDefindex { get; } = new Dictionary { { 1, "weapon_deagle" }, { 2, "weapon_elite" }, @@ -160,7 +162,7 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig "Nereziel & daffyy"; public override string ModuleDescription => "Skin, gloves, agents and knife selector, standalone and web-based"; public override string ModuleName => "WeaponPaints"; - public override string ModuleVersion => "2.4d"; + public override string ModuleVersion => "2.4e"; public static WeaponPaintsConfig GetWeaponPaintsConfig() { @@ -175,22 +177,15 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig(Utilities.GetPlayers().TakeWhile(player => weaponSync != null)).Where(player => player.IsValid && player.SteamID.ToString().Length == 17 && !string.IsNullOrEmpty(player.IpAddress) && player is { IsBot: false, IsHLTV: false, Connected: PlayerConnectedState.PlayerConnected })) { - if (weaponSync == null) - break; - - if (player is null || !player.IsValid || player.SteamID.ToString().Length != 17 || string.IsNullOrEmpty(player.IpAddress) || player.IsBot || - player.IsHLTV || player.Connected != PlayerConnectedState.PlayerConnected) - continue; - g_knifePickupCount[player.Slot] = 0; gPlayerWeaponsInfo.TryRemove(player.Slot, out _); g_playersKnife.TryRemove(player.Slot, out _); g_playersGlove.TryRemove(player.Slot, out _); g_playersAgent.TryRemove(player.Slot, out _); - PlayerInfo playerInfo = new PlayerInfo + PlayerInfo? playerInfo = new PlayerInfo { UserId = player.UserId, Slot = player.Slot, @@ -200,30 +195,10 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig await weaponSync.GetPlayerData(playerInfo)); - - /* - if (Config.Additional.SkinEnabled) + _ = Task.Run(async () => { - _ = Task.Run(async () => await weaponSync.GetWeaponPaintsFromDatabase(playerInfo)); - } - if (Config.Additional.KnifeEnabled) - { - _ = Task.Run(async () => await weaponSync.GetKnifeFromDatabase(playerInfo)); - } - if (Config.Additional.GloveEnabled) - { - _ = Task.Run(async () => await weaponSync.GetGloveFromDatabase(playerInfo)); - } - if (Config.Additional.AgentEnabled) - { - _ = Task.Run(async () => await weaponSync.GetAgentFromDatabase(playerInfo)); - } - if (Config.Additional.MusicEnabled) - { - _ = Task.Run(async () => await weaponSync.GetMusicFromDatabase(playerInfo)); - } - */ + if (weaponSync != null) await weaponSync.GetPlayerData(playerInfo); + }); } } @@ -268,7 +243,7 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig - + diff --git a/WeaponSynchronization.cs b/WeaponSynchronization.cs index c83b7ec8..c8c04aec 100644 --- a/WeaponSynchronization.cs +++ b/WeaponSynchronization.cs @@ -15,12 +15,12 @@ namespace WeaponPaints _config = config; } - internal async Task GetPlayerData(PlayerInfo player) + internal async Task GetPlayerData(PlayerInfo? player) { try { - await using MySqlConnection connection = await _database.GetConnectionAsync(); - + await using var connection = await _database.GetConnectionAsync(); + if (_config.Additional.KnifeEnabled) GetKnifeFromDatabase(player, connection); if (_config.Additional.GloveEnabled) @@ -39,15 +39,15 @@ namespace WeaponPaints } } - internal void GetKnifeFromDatabase(PlayerInfo player, MySqlConnection connection) + private void GetKnifeFromDatabase(PlayerInfo? player, MySqlConnection connection) { try { if (!_config.Additional.KnifeEnabled || string.IsNullOrEmpty(player?.SteamId)) return; - string query = "SELECT `knife` FROM `wp_player_knife` WHERE `steamid` = @steamid"; - string? playerKnife = connection.QueryFirstOrDefault(query, new { steamid = player.SteamId }); + const string query = "SELECT `knife` FROM `wp_player_knife` WHERE `steamid` = @steamid"; + var playerKnife = connection.QueryFirstOrDefault(query, new { steamid = player.SteamId }); if (!string.IsNullOrEmpty(playerKnife)) { @@ -60,15 +60,15 @@ namespace WeaponPaints } } - internal void GetGloveFromDatabase(PlayerInfo player, MySqlConnection connection) + private void GetGloveFromDatabase(PlayerInfo? player, MySqlConnection connection) { try { if (!_config.Additional.GloveEnabled || string.IsNullOrEmpty(player?.SteamId)) return; - string query = "SELECT `weapon_defindex` FROM `wp_player_gloves` WHERE `steamid` = @steamid"; - ushort? gloveData = connection.QueryFirstOrDefault(query, new { steamid = player.SteamId }); + const string query = "SELECT `weapon_defindex` FROM `wp_player_gloves` WHERE `steamid` = @steamid"; + var gloveData = connection.QueryFirstOrDefault(query, new { steamid = player.SteamId }); if (gloveData != null) { @@ -81,28 +81,26 @@ namespace WeaponPaints } } - internal void GetAgentFromDatabase(PlayerInfo player, MySqlConnection connection) + private void GetAgentFromDatabase(PlayerInfo? player, MySqlConnection connection) { try { if (!_config.Additional.AgentEnabled || string.IsNullOrEmpty(player?.SteamId)) return; - string query = "SELECT `agent_ct`, `agent_t` FROM `wp_player_agents` WHERE `steamid` = @steamid"; + const string query = "SELECT `agent_ct`, `agent_t` FROM `wp_player_agents` WHERE `steamid` = @steamid"; var agentData = connection.QueryFirstOrDefault<(string, string)>(query, new { steamid = player.SteamId }); - if (agentData != default) - { - string agentCT = agentData.Item1; - string agentT = agentData.Item2; + if (agentData == default) return; + var agentCT = agentData.Item1; + var agentT = agentData.Item2; - if (!string.IsNullOrEmpty(agentCT) || !string.IsNullOrEmpty(agentT)) - { - WeaponPaints.g_playersAgent[player.Slot] = ( - agentCT, - agentT - ); - } + if (!string.IsNullOrEmpty(agentCT) || !string.IsNullOrEmpty(agentT)) + { + WeaponPaints.g_playersAgent[player.Slot] = ( + agentCT, + agentT + ); } } catch (Exception ex) @@ -111,7 +109,7 @@ namespace WeaponPaints } } - internal void GetWeaponPaintsFromDatabase(PlayerInfo player, MySqlConnection connection) + private void GetWeaponPaintsFromDatabase(PlayerInfo? player, MySqlConnection connection) { try { @@ -120,15 +118,9 @@ namespace WeaponPaints var weaponInfos = new ConcurrentDictionary(); - string query = "SELECT * FROM `wp_player_skins` WHERE `steamid` = @steamid"; + const string query = "SELECT * FROM `wp_player_skins` WHERE `steamid` = @steamid"; var playerSkins = connection.Query(query, new { steamid = player.SteamId }); - if (playerSkins == null) - { - WeaponPaints.gPlayerWeaponsInfo[player.Slot] = weaponInfos; - return; - } - foreach (var row in playerSkins) { int weaponDefIndex = row?.weapon_defindex ?? 0; @@ -154,15 +146,15 @@ namespace WeaponPaints } } - internal void GetMusicFromDatabase(PlayerInfo player, MySqlConnection connection) + private void GetMusicFromDatabase(PlayerInfo? player, MySqlConnection connection) { try { - if (!_config.Additional.MusicEnabled || string.IsNullOrEmpty(player.SteamId)) + if (!_config.Additional.MusicEnabled || string.IsNullOrEmpty(player?.SteamId)) return; - string query = "SELECT `music_id` FROM `wp_player_music` WHERE `steamid` = @steamid"; - ushort? musicData = connection.QueryFirstOrDefault(query, new { steamid = player.SteamId }); + const string query = "SELECT `music_id` FROM `wp_player_music` WHERE `steamid` = @steamid"; + var musicData = connection.QueryFirstOrDefault(query, new { steamid = player.SteamId }); if (musicData != null) { @@ -179,12 +171,13 @@ namespace WeaponPaints internal async Task SyncKnifeToDatabase(PlayerInfo player, string knife) { - if (!_config.Additional.KnifeEnabled || player == null || string.IsNullOrEmpty(player.SteamId) || string.IsNullOrEmpty(knife)) return; + if (!_config.Additional.KnifeEnabled || string.IsNullOrEmpty(player.SteamId) || string.IsNullOrEmpty(knife)) return; + const string query = "INSERT INTO `wp_player_knife` (`steamid`, `knife`) VALUES(@steamid, @newKnife) ON DUPLICATE KEY UPDATE `knife` = @newKnife"; + try { await using var connection = await _database.GetConnectionAsync(); - string query = "INSERT INTO `wp_player_knife` (`steamid`, `knife`) VALUES(@steamid, @newKnife) ON DUPLICATE KEY UPDATE `knife` = @newKnife"; await connection.ExecuteAsync(query, new { steamid = player.SteamId, newKnife = knife }); } catch (Exception e) @@ -195,12 +188,12 @@ namespace WeaponPaints internal async Task SyncGloveToDatabase(PlayerInfo player, int defindex) { - if (!_config.Additional.GloveEnabled || player == null || string.IsNullOrEmpty(player.SteamId)) return; + if (!_config.Additional.GloveEnabled || string.IsNullOrEmpty(player.SteamId)) return; try { await using var connection = await _database.GetConnectionAsync(); - string query = "INSERT INTO `wp_player_gloves` (`steamid`, `weapon_defindex`) VALUES(@steamid, @weapon_defindex) ON DUPLICATE KEY UPDATE `weapon_defindex` = @weapon_defindex"; + const string query = "INSERT INTO `wp_player_gloves` (`steamid`, `weapon_defindex`) VALUES(@steamid, @weapon_defindex) ON DUPLICATE KEY UPDATE `weapon_defindex` = @weapon_defindex"; await connection.ExecuteAsync(query, new { steamid = player.SteamId, weapon_defindex = defindex }); } catch (Exception e) @@ -211,17 +204,18 @@ namespace WeaponPaints internal async Task SyncAgentToDatabase(PlayerInfo player) { - if (!_config.Additional.AgentEnabled || player == null || string.IsNullOrEmpty(player.SteamId)) return; + if (!_config.Additional.AgentEnabled || string.IsNullOrEmpty(player.SteamId)) return; + const string query = """ + INSERT INTO `wp_player_agents` (`steamid`, `agent_ct`, `agent_t`) + VALUES(@steamid, @agent_ct, @agent_t) + ON DUPLICATE KEY UPDATE + `agent_ct` = @agent_ct, + `agent_t` = @agent_t + """; try { await using var connection = await _database.GetConnectionAsync(); - string query = @" - INSERT INTO `wp_player_agents` (`steamid`, `agent_ct`, `agent_t`) - VALUES(@steamid, @agent_ct, @agent_t) - ON DUPLICATE KEY UPDATE - `agent_ct` = @agent_ct, - `agent_t` = @agent_t"; await connection.ExecuteAsync(query, new { steamid = player.SteamId, agent_ct = WeaponPaints.g_playersAgent[player.Slot].CT, agent_t = WeaponPaints.g_playersAgent[player.Slot].T }); } @@ -233,25 +227,22 @@ namespace WeaponPaints internal async Task SyncWeaponPaintsToDatabase(PlayerInfo player) { - if (player == null || string.IsNullOrEmpty(player.SteamId) || !WeaponPaints.gPlayerWeaponsInfo.TryGetValue(player.Slot, out var weaponsInfo)) + if (string.IsNullOrEmpty(player.SteamId) || !WeaponPaints.gPlayerWeaponsInfo.TryGetValue(player.Slot, out var weaponsInfo)) return; try { await using var connection = await _database.GetConnectionAsync(); - foreach (var weaponInfoPair in weaponsInfo) + foreach (var (weaponDefIndex, weaponInfo) in weaponsInfo) { - int weaponDefIndex = weaponInfoPair.Key; - WeaponInfo weaponInfo = weaponInfoPair.Value; + var paintId = weaponInfo.Paint; + var wear = weaponInfo.Wear; + var seed = weaponInfo.Seed; - int paintId = weaponInfo.Paint; - float wear = weaponInfo.Wear; - int seed = weaponInfo.Seed; + const string queryCheckExistence = "SELECT COUNT(*) FROM `wp_player_skins` WHERE `steamid` = @steamid AND `weapon_defindex` = @weaponDefIndex"; - string queryCheckExistence = "SELECT COUNT(*) FROM `wp_player_skins` WHERE `steamid` = @steamid AND `weapon_defindex` = @weaponDefIndex"; - - int existingRecordCount = await connection.ExecuteScalarAsync(queryCheckExistence, new { steamid = player.SteamId, weaponDefIndex }); + var existingRecordCount = await connection.ExecuteScalarAsync(queryCheckExistence, new { steamid = player.SteamId, weaponDefIndex = weaponDefIndex }); string query; object parameters; @@ -259,13 +250,13 @@ namespace WeaponPaints if (existingRecordCount > 0) { query = "UPDATE `wp_player_skins` SET `weapon_paint_id` = @paintId, `weapon_wear` = @wear, `weapon_seed` = @seed WHERE `steamid` = @steamid AND `weapon_defindex` = @weaponDefIndex"; - parameters = new { steamid = player.SteamId, weaponDefIndex, paintId, wear, seed }; + parameters = new { steamid = player.SteamId, weaponDefIndex = weaponDefIndex, paintId, wear, seed }; } else { query = "INSERT INTO `wp_player_skins` (`steamid`, `weapon_defindex`, `weapon_paint_id`, `weapon_wear`, `weapon_seed`) " + "VALUES (@steamid, @weaponDefIndex, @paintId, @wear, @seed)"; - parameters = new { steamid = player.SteamId, weaponDefIndex, paintId, wear, seed }; + parameters = new { steamid = player.SteamId, weaponDefIndex = weaponDefIndex, paintId, wear, seed }; } await connection.ExecuteAsync(query, parameters); @@ -279,12 +270,12 @@ namespace WeaponPaints internal async Task SyncMusicToDatabase(PlayerInfo player, ushort music) { - if (!_config.Additional.MusicEnabled || player == null || string.IsNullOrEmpty(player.SteamId)) return; + if (!_config.Additional.MusicEnabled || string.IsNullOrEmpty(player.SteamId)) return; try { await using var connection = await _database.GetConnectionAsync(); - string query = "INSERT INTO `wp_player_music` (`steamid`, `music_id`) VALUES(@steamid, @newMusic) ON DUPLICATE KEY UPDATE `music_id` = @newMusic"; + const string query = "INSERT INTO `wp_player_music` (`steamid`, `music_id`) VALUES(@steamid, @newMusic) ON DUPLICATE KEY UPDATE `music_id` = @newMusic"; await connection.ExecuteAsync(query, new { steamid = player.SteamId, newMusic = music }); } catch (Exception e)