From 67b35d9117038931d2692cb3b567869a1bedce96 Mon Sep 17 00:00:00 2001 From: rogeraabbccdd Date: Mon, 1 Jul 2024 13:58:27 +0800 Subject: [PATCH 1/7] !wp should also refresh music and agents --- Commands.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Commands.cs b/Commands.cs index ddc2c6e9..d528a554 100644 --- a/Commands.cs +++ b/Commands.cs @@ -38,6 +38,8 @@ namespace WeaponPaints _ = Task.Run(async () => await weaponSync.GetPlayerData(playerInfo)); GivePlayerGloves(player); + GivePlayerAgent(player); + GivePlayerMusicKit(player); RefreshWeapons(player); } From c3d2209a1364b5f208e5979b2131cfc495b7417b Mon Sep 17 00:00:00 2001 From: rogeraabbccdd Date: Tue, 2 Jul 2024 17:24:41 +0800 Subject: [PATCH 2/7] Fix database queries --- WeaponSynchronization.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/WeaponSynchronization.cs b/WeaponSynchronization.cs index d2e8e4b4..3571058d 100644 --- a/WeaponSynchronization.cs +++ b/WeaponSynchronization.cs @@ -1,4 +1,4 @@ -using System.Collections.Concurrent; +using System.Collections.Concurrent; using Dapper; using MySqlConnector; @@ -17,7 +17,7 @@ internal class WeaponSynchronization internal async Task GetPlayerDatabaseIndex(PlayerInfo playerInfo) { - if (playerInfo.SteamId == null || playerInfo.Slot == 0) return; + if (playerInfo.SteamId == null || playerInfo.Slot < 0) return; Console.WriteLine("test"); try { @@ -29,7 +29,7 @@ internal class WeaponSynchronization if (databaseIndex != null) { WeaponPaints.g_playersDatabaseIndex[playerInfo.Slot] = (int)databaseIndex; - query = "UPDATE `wp_users` SET `last_update` = @lastUpdate WHERE `id` = @databaseIndex"; + query = "UPDATE `wp_users` SET `last_online` = @lastUpdate WHERE `id` = @databaseIndex"; await connection.ExecuteAsync(query, new { lastUpdate = DateTime.Now, @@ -208,7 +208,7 @@ internal class WeaponSynchronization await using var transaction = await connection.BeginTransactionAsync(); var userIds = await connection.QueryAsync( - $"SELECT id FROM wp_users WHERE last_update < NOW() - INTERVAL {_config.Additional.ExpireOlderThan} DAY", + $"SELECT id FROM wp_users WHERE last_online < NOW() - INTERVAL {_config.Additional.ExpireOlderThan} DAY", transaction: transaction ); @@ -367,7 +367,7 @@ internal class WeaponSynchronization { await using var connection = await _database.GetConnectionAsync(); const string query = - "INSERT INTO `wp_users_musics` (`user_id`, `music_id`) VALUES(@userId, @newMusic) ON DUPLICATE KEY UPDATE `music_id` = @newMusic"; + "INSERT INTO `wp_users_musics` (`user_id`, `music`) VALUES(@userId, @newMusic) ON DUPLICATE KEY UPDATE `music` = @newMusic"; await connection.ExecuteAsync(query, new { userId = WeaponPaints.g_playersDatabaseIndex[player.Slot], newMusic = music }); } catch (Exception e) From e6d935e16b125c976dee4066daeed187f36bf783 Mon Sep 17 00:00:00 2001 From: rogeraabbccdd Date: Tue, 2 Jul 2024 17:27:08 +0800 Subject: [PATCH 3/7] Basic pin feature --- Commands.cs | 3 ++- Config.cs | 3 +++ Events.cs | 7 ++++++- Utility.cs | 5 +++-- WeaponAction.cs | 12 ++++++++++++ WeaponPaints.cs | 1 + WeaponSynchronization.cs | 25 ++++++++++++++++++++++++- 7 files changed, 51 insertions(+), 5 deletions(-) diff --git a/Commands.cs b/Commands.cs index d528a554..bb6d0ab4 100644 --- a/Commands.cs +++ b/Commands.cs @@ -1,4 +1,4 @@ -using System.Collections.Concurrent; +using System.Collections.Concurrent; using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Commands; @@ -40,6 +40,7 @@ namespace WeaponPaints GivePlayerGloves(player); GivePlayerAgent(player); GivePlayerMusicKit(player); + GivePlayerPin(player); RefreshWeapons(player); } diff --git a/Config.cs b/Config.cs index 60801e50..56120f17 100644 --- a/Config.cs +++ b/Config.cs @@ -41,6 +41,9 @@ namespace WeaponPaints [JsonPropertyName("NameTagEnabled")] public bool NameTagEnabled { get; set; } = true; + [JsonPropertyName("PinEnabled")] + public bool PinEnabled { get; set; } = true; + [JsonPropertyName("CommandsKnife")] public List CommandsKnife { get; set; } = ["knife", "knives"]; diff --git a/Events.cs b/Events.cs index 0fc1ee36..afb0be0b 100644 --- a/Events.cs +++ b/Events.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes.Registration; using CounterStrikeSharp.API.Modules.Entities; @@ -91,6 +91,10 @@ namespace WeaponPaints { g_playersMusic.TryRemove(player.Slot, out _); } + if (Config.Additional.PinEnabled) + { + g_playersPin.TryRemove(player.Slot, out _); + } commandsCooldown.Remove(player.Slot); @@ -125,6 +129,7 @@ namespace WeaponPaints GivePlayerMusicKit(player); GivePlayerAgent(player); GivePlayerGloves(player); + GivePlayerPin(player); return HookResult.Continue; } diff --git a/Utility.cs b/Utility.cs index 9d28d341..1ad1c836 100644 --- a/Utility.cs +++ b/Utility.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Translations; using Dapper; using Microsoft.Extensions.Logging; @@ -30,7 +30,8 @@ namespace WeaponPaints "CREATE TABLE IF NOT EXISTS `wp_users_knives` (`user_id` INT UNSIGNED NOT NULL, `knife` SMALLINT UNSIGNED NOT NULL, PRIMARY KEY (`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;", "CREATE TABLE IF NOT EXISTS `wp_users_gloves` (`user_id` INT UNSIGNED NOT NULL, `weapon_defindex` SMALLINT UNSIGNED DEFAULT NULL, PRIMARY KEY (`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;", "CREATE TABLE IF NOT EXISTS `wp_users_musics` (`user_id` INT UNSIGNED NOT NULL, `music` SMALLINT UNSIGNED DEFAULT NULL, PRIMARY KEY (`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;", - "CREATE TABLE IF NOT EXISTS `wp_users_agents` (`user_id` INT UNSIGNED NOT NULL,`agent_ct` varchar(64) DEFAULT NULL,`agent_t` varchar(64) DEFAULT NULL, PRIMARY KEY (`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;" + "CREATE TABLE IF NOT EXISTS `wp_users_agents` (`user_id` INT UNSIGNED NOT NULL,`agent_ct` varchar(64) DEFAULT NULL,`agent_t` varchar(64) DEFAULT NULL, PRIMARY KEY (`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;", + "CREATE TABLE IF NOT EXISTS `wp_users_pins` (`user_id` INT UNSIGNED NOT NULL, `pin` SMALLINT UNSIGNED DEFAULT NULL, PRIMARY KEY (`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;", }; foreach (var query in createTableQueries) diff --git a/WeaponAction.cs b/WeaponAction.cs index d77637c2..a5fdef62 100644 --- a/WeaponAction.cs +++ b/WeaponAction.cs @@ -401,6 +401,18 @@ public partial class WeaponPaints Utilities.SetStateChanged(player, "CCSPlayerController", "m_iMusicKitID"); } + private static void GivePlayerPin(CCSPlayerController player) + { + if (!g_playersPin.TryGetValue(player.Slot, out var value)) return; + if (player.InventoryServices == null) return; + + for (var index = 0; index < player.InventoryServices.Rank.Length; index++) + { + player.InventoryServices.Rank[index] = index == 5 ? (MedalRank_t)value : MedalRank_t.MEDAL_RANK_NONE; + Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInventoryServices"); + } + } + private void GiveOnItemPickup(CCSPlayerController player) { var pawn = player.PlayerPawn.Value; diff --git a/WeaponPaints.cs b/WeaponPaints.cs index 6021328e..8de890a8 100644 --- a/WeaponPaints.cs +++ b/WeaponPaints.cs @@ -83,6 +83,7 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig g_playersKnife = new(); internal static ConcurrentDictionary g_playersGlove = new(); internal static ConcurrentDictionary g_playersMusic = new(); + internal static ConcurrentDictionary g_playersPin = new(); internal static ConcurrentDictionary g_playersAgent = new(); internal static ConcurrentDictionary> gPlayerWeaponsInfo = new(); internal static ConcurrentDictionary g_playersDatabaseIndex = new(); diff --git a/WeaponSynchronization.cs b/WeaponSynchronization.cs index 3571058d..3de4b633 100644 --- a/WeaponSynchronization.cs +++ b/WeaponSynchronization.cs @@ -1,4 +1,4 @@ -using System.Collections.Concurrent; +using System.Collections.Concurrent; using Dapper; using MySqlConnector; @@ -71,6 +71,8 @@ internal class WeaponSynchronization GetMusicFromDatabase(player, connection); if (_config.Additional.SkinEnabled) GetWeaponPaintsFromDatabase(player, connection); + if (_config.Additional.PinEnabled) + GetPinFromDatabase(player, connection); } catch (Exception ex) { @@ -200,6 +202,24 @@ internal class WeaponSynchronization } } + private void GetPinFromDatabase(PlayerInfo? player, MySqlConnection connection) + { + try + { + if (!_config.Additional.PinEnabled || string.IsNullOrEmpty(player?.SteamId.ToString())) + return; + + const string query = "SELECT `pin` FROM `wp_users_pins` WHERE `user_id` = @userId"; + var pinData = connection.QueryFirstOrDefault(query, new { userId = WeaponPaints.g_playersDatabaseIndex[player.Slot] }); + + if (pinData != null) WeaponPaints.g_playersPin[player.Slot] = pinData.Value; + } + catch (Exception ex) + { + Utility.Log($"An error occurred in GetPinFromDatabase: {ex.Message}"); + } + } + internal async Task PurgeExpiredUsers() { try @@ -234,6 +254,9 @@ internal class WeaponSynchronization query = $"DELETE FROM wp_users_musics WHERE user_id IN ({ids})"; await connection.ExecuteAsync(query, transaction: transaction); + query = $"DELETE FROM wp_users_pins WHERE user_id IN ({ids})"; + await connection.ExecuteAsync(query, transaction: transaction); + // Step 3: Delete users from wp_users query = $"DELETE FROM wp_users WHERE id IN ({ids})"; await connection.ExecuteAsync(query, transaction: transaction); From 2a1ef7b48903198baf4d04ce20231609cea7504b Mon Sep 17 00:00:00 2001 From: rogeraabbccdd Date: Wed, 3 Jul 2024 00:47:10 +0800 Subject: [PATCH 4/7] Fixed OnCommandRefresh conditions --- Commands.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Commands.cs b/Commands.cs index bb6d0ab4..fd42b134 100644 --- a/Commands.cs +++ b/Commands.cs @@ -11,7 +11,7 @@ namespace WeaponPaints { private void OnCommandRefresh(CCSPlayerController? player, CommandInfo command) { - if (Config.Additional.CommandsRefresh.Count > 0 || !Config.Additional.SkinEnabled || !g_bCommandsAllowed) return; + if (Config.Additional.CommandsRefresh.Count == 0 || !Config.Additional.SkinEnabled || !g_bCommandsAllowed) return; if (!Utility.IsPlayerValid(player)) return; if (player == null || !player.IsValid || player.UserId == null || player.IsBot) return; From 74aa5fa40c2a2c1f03a8e03efb473af1c22c25fe Mon Sep 17 00:00:00 2001 From: rogeraabbccdd Date: Wed, 3 Jul 2024 00:48:41 +0800 Subject: [PATCH 5/7] Fixed music kit menu. --- Commands.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Commands.cs b/Commands.cs index fd42b134..5935462d 100644 --- a/Commands.cs +++ b/Commands.cs @@ -587,7 +587,7 @@ namespace WeaponPaints var selectedPaintName = option.Text; - var selectedMusic = musicList.FirstOrDefault(g => g.ContainsKey("name") && g["name"]?.ToString() == selectedPaintName); + var selectedMusic = musicList.FirstOrDefault(g => g.ContainsKey("name") && g["name"]?.ToString().Contains(selectedPaintName) == true); if (selectedMusic != null) { if (!selectedMusic.ContainsKey("id") || @@ -621,7 +621,7 @@ namespace WeaponPaints if (!string.IsNullOrEmpty(Localizer["wp_music_menu_select"])) { - player!.Print(Localizer["wp_music_menu_select", selectedPaintName]); + player!.Print(Localizer["wp_music_menu_select", selectedMusic["name"] ?? selectedPaintName]); } if (weaponSync != null) @@ -661,6 +661,8 @@ namespace WeaponPaints }); } } + + GivePlayerMusicKit(player); }; musicSelectionMenu.AddMenuOption(Localizer["None"], handleMusicSelection); From d7631c51b686bb0545476222905b3b1271f09879 Mon Sep 17 00:00:00 2001 From: rogeraabbccdd Date: Wed, 3 Jul 2024 00:51:35 +0800 Subject: [PATCH 6/7] Fixed agent menu. --- Commands.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Commands.cs b/Commands.cs index 5935462d..1f3c4c78 100644 --- a/Commands.cs +++ b/Commands.cs @@ -474,7 +474,7 @@ namespace WeaponPaints var selectedPaintName = option.Text; var selectedAgent = agentsList.FirstOrDefault(g => g.ContainsKey("agent_name") && - g["agent_name"] != null && g["agent_name"]!.ToString() == selectedPaintName && + g["agent_name"] != null && g["agent_name"]!.ToString().Contains(selectedPaintName) == true && g["team"] != null && (int)(g["team"]!) == player.TeamNum); if (selectedAgent == null) return; @@ -502,7 +502,7 @@ namespace WeaponPaints if (!string.IsNullOrEmpty(Localizer["wp_agent_menu_select"])) { - player!.Print(Localizer["wp_agent_menu_select", selectedPaintName]); + player!.Print(Localizer["wp_agent_menu_select", selectedAgent?["agent_name"] ?? selectedPaintName]); } if (player.TeamNum == 3) @@ -524,6 +524,7 @@ namespace WeaponPaints _ = Task.Run(async () => { await weaponSync.SyncAgentToDatabase(playerInfo); + GivePlayerAgent(player); }); } }; From 52e4fd71951069feeb7675f642aae72f3b363ddc Mon Sep 17 00:00:00 2001 From: rogeraabbccdd Date: Wed, 3 Jul 2024 00:59:04 +0800 Subject: [PATCH 7/7] Fixed pin not refreshed bug. --- Commands.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Commands.cs b/Commands.cs index 1f3c4c78..739601cf 100644 --- a/Commands.cs +++ b/Commands.cs @@ -1,4 +1,4 @@ -using System.Collections.Concurrent; +using System.Collections.Concurrent; using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Commands; @@ -40,8 +40,9 @@ namespace WeaponPaints GivePlayerGloves(player); GivePlayerAgent(player); GivePlayerMusicKit(player); - GivePlayerPin(player); RefreshWeapons(player); + AddTimer(0.1f, () => GivePlayerPin(player)); + AddTimer(0.15f, () => GivePlayerPin(player)); } if (!string.IsNullOrEmpty(Localizer["wp_command_refresh_done"]))