diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5914be33..1bb1fe36 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -62,6 +62,8 @@ jobs: run: cp website/data/skins.json ${{ env.OUTPUT_PATH }}/skins.json - name: Copy gloves.json run: cp website/data/gloves.json ${{ env.OUTPUT_PATH }}/gloves.json + - name: Copy agents.json + run: cp website/data/agents.json ${{ env.OUTPUT_PATH }}/agents.json - name: Zip run: zip -r "${{ env.PROJECT_NAME }}.zip" "${{ env.OUTPUT_PATH }}" gamedata/ - name: Clean files Website diff --git a/Commands.cs b/Commands.cs index 216d44a9..f424a143 100644 --- a/Commands.cs +++ b/Commands.cs @@ -1,6 +1,7 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Menu; +using Newtonsoft.Json.Linq; namespace WeaponPaints { @@ -407,16 +408,20 @@ namespace WeaponPaints { await weaponSync.SyncGloveToDatabase(playerInfo, weaponDefindex); - if (!gPlayerWeaponsInfo[playerInfo.Slot].ContainsKey(weaponDefindex)) + if (!gPlayerWeaponsInfo[playerInfo.Slot].TryGetValue(weaponDefindex, out WeaponInfo? value)) { - gPlayerWeaponsInfo[playerInfo.Slot][weaponDefindex] = new WeaponInfo(); + value = new WeaponInfo(); + gPlayerWeaponsInfo[playerInfo.Slot][weaponDefindex] = value; } - gPlayerWeaponsInfo[playerInfo.Slot][weaponDefindex].Paint = paint; - gPlayerWeaponsInfo[playerInfo.Slot][weaponDefindex].Wear = 0.00f; - gPlayerWeaponsInfo[playerInfo.Slot][weaponDefindex].Seed = 0; + value.Paint = paint; + value.Wear = 0.00f; + value.Seed = 0; }); + + Task.Run(async () => await weaponSync.SyncWeaponPaintsToDatabase(playerInfo)); } + RefreshGloves(player); } }; @@ -451,5 +456,114 @@ namespace WeaponPaints } }); } + + private void SetupAgentsMenu() + { + var handleAgentSelection = (CCSPlayerController? player, ChatMenuOption option) => + { + if (!Utility.IsPlayerValid(player) || player is null) return; + + string selectedPaintName = option.Text; + + var selectedAgent = agentsList.FirstOrDefault(g => g.ContainsKey("agent_name") && g["agent_name"]?.ToString() == selectedPaintName); + if (selectedAgent != null) + { + if ( + selectedAgent != null && + selectedAgent.ContainsKey("model") + ) + { + 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 (Config.Additional.ShowSkinImage) + { + string image = selectedAgent["image"]?.ToString() ?? ""; + PlayerWeaponImage[player.Slot] = image; + AddTimer(2.0f, () => PlayerWeaponImage.Remove(player.Slot), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } + + if (!string.IsNullOrEmpty(Localizer["wp_agent_menu_select"])) + { + player!.Print(Localizer["wp_agent_menu_select", selectedPaintName]); + } + + if (player.TeamNum == 3) + { + g_playersAgent.AddOrUpdate(player.Slot, + key => (selectedAgent["model"]!.ToString().Equals("null") ? null : selectedAgent["model"]!.ToString(), null), + (key, oldValue) => (selectedAgent["model"]!.ToString().Equals("null") ? null : selectedAgent["model"]!.ToString(), oldValue.T)); + } + else + { + g_playersAgent.AddOrUpdate(player.Slot, + key => (null, selectedAgent["model"]!.ToString().Equals("null") ? null : selectedAgent["model"]!.ToString()), + (key, oldValue) => (oldValue.CT, selectedAgent["model"]!.ToString().Equals("null") ? null : selectedAgent["model"]!.ToString()) + ); + } + + if (weaponSync != null) + { + Task.Run(async () => + { + await weaponSync.SyncAgentToDatabase(playerInfo); + }); + } + }; + } + }; + + // Command to open the weapon selection menu for players + AddCommand($"css_{Config.Additional.CommandAgent}", "Agents selection menu", (player, info) => + { + if (!Utility.IsPlayerValid(player) || !g_bCommandsAllowed) return; + + 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)) + { + var agentsSelectionMenu = new ChatMenu(Localizer["wp_agent_menu_title"]); + agentsSelectionMenu.PostSelectAction = PostSelectAction.Close; + + var filteredAgents = agentsList.Where(agentObject => + { + if (agentObject["team"]?.Value() is int teamNum) + { + return teamNum == player.TeamNum; + } + else + { + return false; + } + }); + + // Add weapon options to the weapon selection menu + + foreach (var agentObject in filteredAgents) + { + string paintName = agentObject["agent_name"]?.ToString() ?? ""; + + if (paintName.Length > 0) + agentsSelectionMenu.AddMenuOption(paintName, handleAgentSelection); + } + + commandsCooldown[player.Slot] = DateTime.UtcNow.AddSeconds(Config.CmdRefreshCooldownSeconds); + MenuManager.OpenChatMenu(player, agentsSelectionMenu); + return; + } + if (!string.IsNullOrEmpty(Localizer["wp_command_cooldown"])) + { + player!.Print(Localizer["wp_command_cooldown"]); + } + }); + } } } \ No newline at end of file diff --git a/Config.cs b/Config.cs index cc127c43..a109d825 100644 --- a/Config.cs +++ b/Config.cs @@ -10,6 +10,8 @@ namespace WeaponPaints [JsonPropertyName("GloveEnabled")] public bool GloveEnabled { get; set; } = true; + [JsonPropertyName("AgentEnabled")] + public bool AgentEnabled { get; set; } = true; [JsonPropertyName("SkinEnabled")] public bool SkinEnabled { get; set; } = true; @@ -25,6 +27,8 @@ namespace WeaponPaints [JsonPropertyName("CommandGlove")] public string CommandGlove { get; set; } = "gloves"; + [JsonPropertyName("CommandAgent")] + public string CommandAgent { get; set; } = "agents"; [JsonPropertyName("CommandSkin")] public string CommandSkin { get; set; } = "ws"; @@ -44,16 +48,13 @@ namespace WeaponPaints [JsonPropertyName("GiveRandomSkin")] public bool GiveRandomSkin { get; set; } = false; - [JsonPropertyName("GiveKnifeAfterRemove")] - public bool GiveKnifeAfterRemove { get; set; } = false; - [JsonPropertyName("ShowSkinImage")] public bool ShowSkinImage { get; set; } = true; } public class WeaponPaintsConfig : BasePluginConfig { - public override int Version { get; set; } = 5; + public override int Version { get; set; } = 6; [JsonPropertyName("DatabaseHost")] public string DatabaseHost { get; set; } = ""; diff --git a/Events.cs b/Events.cs index 02b18835..f75030b2 100644 --- a/Events.cs +++ b/Events.cs @@ -41,6 +41,10 @@ namespace WeaponPaints { tasks.Add(Task.Run(() => weaponSync.GetGloveFromDatabase(playerInfo))); } + if (Config.Additional.AgentEnabled) + { + tasks.Add(Task.Run(() => weaponSync.GetAgentFromDatabase(playerInfo))); + } Task.WaitAll(tasks.ToArray()); } @@ -86,6 +90,10 @@ namespace WeaponPaints { g_playersGlove.TryRemove(player.Slot, out _); } + if (Config.Additional.AgentEnabled) + { + g_playersAgent.TryRemove(player.Slot, out _); + } commandsCooldown.Remove(player.Slot); @@ -190,19 +198,6 @@ namespace WeaponPaints if (_database != null) weaponSync = new WeaponSynchronization(_database, Config); - - - // needed for now - /* - AddTimer(2.0f, () => - { - - NativeAPI.IssueServerCommand("mp_t_default_melee \"\""); - NativeAPI.IssueServerCommand("mp_ct_default_melee \"\""); - - //NativeAPI.IssueServerCommand("mp_equipment_reset_rounds 0"); - }); - */ } private HookResult OnPlayerSpawn(EventPlayerSpawn @event, GameEventInfo info) @@ -219,9 +214,7 @@ namespace WeaponPaints g_knifePickupCount[player.Slot] = 0; - //if (!PlayerHasKnife(player)) - //GiveKnifeToPlayer(player); - + GivePlayerAgent(player); Server.NextFrame(() => { RefreshGloves(player); @@ -282,6 +275,23 @@ namespace WeaponPaints } } + private void OnTick() + { + foreach (var player in Utilities.GetPlayers().Where(p => + p is not null && p.IsValid && p.PlayerPawn != null && p.PlayerPawn.IsValid && + (LifeState_t)p.LifeState == LifeState_t.LIFE_ALIVE && p.SteamID.ToString().Length == 17 + && !p.IsBot && !p.IsHLTV && p.Connected == PlayerConnectedState.PlayerConnected + ) + ) + { + if (Config.Additional.ShowSkinImage && PlayerWeaponImage.TryGetValue(player.Slot, out string? value) && !string.IsNullOrEmpty(value)) + { + player.PrintToCenterHtml("".Replace("{PATH}", value)); + } + } + } + + private void RegisterListeners() { RegisterListener(OnMapStart); @@ -290,9 +300,8 @@ namespace WeaponPaints RegisterEventHandler(OnRoundStart, HookMode.Pre); RegisterEventHandler(OnRoundEnd); RegisterListener(OnEntitySpawned); + RegisterListener(OnTick); //VirtualFunctions.GiveNamedItemFunc.Hook(OnGiveNamedItemPost, HookMode.Post); - - //HookEntityOutput("weapon_knife", "OnPlayerPickup", OnPickup); } } } \ No newline at end of file diff --git a/README.md b/README.md index 5d1b16de..f420aeca 100644 --- a/README.md +++ b/README.md @@ -9,12 +9,14 @@ Unfinished, unoptimized and not fully functional ugly demo weapon paints plugin [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/E1E2G0P2O) or [![Donate on Steam](https://github.com/Nereziel/cs2-WeaponPaints/assets/32937653/a0d53822-4ca7-4caf-83b4-e1a9b5f8c94e)](https://steamcommunity.com/tradeoffer/new/?partner=41515647&token=gW2W-nXE) ## Features -- Changes only paint, seed and wear on weapons and knives +- Changes only paint, seed and wear on weapons, knives, gloves and agents - MySQL based - Data syncs on player connect - Added command **`!wp`** to refresh skins ***(with cooldown in seconds can be configured)*** - Added command **`!ws`** to show website - Added command **`!knife`** to show menu with knives +- Added command **`!gloves`** to show menu with gloves +- Added command **`!agents`** to show menu with agents - Translations support, submit a PR if you want to share your translation ## CS2 Server @@ -89,11 +91,6 @@ Set FollowCSGOGuidelines to false in cssharp’s core.jcon config **Database error table does not exists:** Plugin is not loaded or configured with mysql credentials. Tables are auto-created by plugin. -**Knives are disappearing:** -Set in config GiveKnifeAfterRemove to true - -**Knives are not changing for players:** -You can't change knife if you have your own equipped ### Use this plugin at your own risk! Using this may lead to GSLT ban or something else Valve come with. [Valve Server guidelines](https://blog.counter-strike.net/index.php/server_guidelines/) diff --git a/Utility.cs b/Utility.cs index ef2785b9..1a9c4685 100644 --- a/Utility.cs +++ b/Utility.cs @@ -117,6 +117,20 @@ namespace WeaponPaints } } + internal static void LoadAgentsFromFile(string filePath) + { + try + { + string json = File.ReadAllText(filePath); + var deserializedSkins = JsonConvert.DeserializeObject>(json); + WeaponPaints.agentsList = deserializedSkins ?? new List(); + } + catch (FileNotFoundException) + { + throw; + } + } + internal static void Log(string message) { Console.BackgroundColor = ConsoleColor.DarkGray; @@ -206,26 +220,5 @@ namespace WeaponPaints Console.WriteLine(" >> GitHub: https://github.com/Nereziel/cs2-WeaponPaints"); Console.WriteLine(" "); } - - /*( - internal static void TestDatabaseConnection() - { - try - { - using var connection = new MySqlConnection(BuildDatabaseConnectionString()); - connection.Open(); - - if (connection.State != System.Data.ConnectionState.Open) - { - throw new Exception("[WeaponPaints] Unable connect to database!"); - } - } - catch (Exception ex) - { - throw new Exception("[WeaponPaints] Unknown mysql exception! " + ex.Message); - } - CheckDatabaseTables(); - } - */ } } \ No newline at end of file diff --git a/VERSION b/VERSION index 1de7bcd1..b6242554 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.1a \ No newline at end of file +2.2a \ No newline at end of file diff --git a/WeaponAction.cs b/WeaponAction.cs index 609eed7a..d003b2ea 100644 --- a/WeaponAction.cs +++ b/WeaponAction.cs @@ -17,29 +17,6 @@ namespace WeaponPaints if (PlayerHasKnife(player)) return; - //string knifeToGive; - //if (g_playersKnife.TryGetValue(player.Slot, out var knife)) - //{ - // knifeToGive = knife; - //} - //else if (_config.Additional.GiveRandomKnife) - //{ - // var knifeTypes = weaponList.Where(pair => pair.Key.StartsWith("weapon_knife") || pair.Key.StartsWith("weapon_bayonet")).ToList(); - - // if (knifeTypes.Count == 0) - // { - // Utility.Log("No valid knife types found."); - // return; - // } - - // Random random = new(); - // int index = random.Next(knifeTypes.Count); - // knifeToGive = knifeTypes[index].Key; - //} - //else - //{ - //} - string knifeToGive = (CsTeam)player.TeamNum == CsTeam.Terrorist ? "weapon_knife_t" : "weapon_knife"; player.GiveNamedItem(CsItem.Knife); } @@ -88,10 +65,8 @@ namespace WeaponPaints int playerTeam = player.TeamNum; - //Dictionary weaponsWithAmmo = new Dictionary(); Dictionary> weaponsWithAmmo = new Dictionary>(); - // Iterate through each weapon foreach (var weapon in weapons) { if (weapon == null || !weapon.IsValid || weapon.Value == null || @@ -212,59 +187,6 @@ namespace WeaponPaints }, TimerFlags.STOP_ON_MAPCHANGE); } - /* - internal void RefreshKnife(CCSPlayerController? player) - { - return; - if (player == null || !player.IsValid || player.PlayerPawn?.Value == null) - return; - - if (player.PlayerPawn.Value.WeaponServices == null) - return; - - var weapons = player.PlayerPawn.Value.WeaponServices.MyWeapons; - if (weapons != null && weapons.Count > 0) - { - try - { - 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; - CCSWeaponBaseVData? weaponData = weapon.Value.As().VData; - - if (weapon.Value.DesignerName.Contains("knife") || weaponData?.GearSlot == gear_slot_t.GEAR_SLOT_KNIFE) - { - AddTimer(0.2f, () => - { - player.ExecuteClientCommand("slot 3"); - player.DropActiveWeapon(); - - AddTimer(0.6f, () => - { - if (weapon.IsValid) - weapon.Value.Remove(); - GiveKnifeToPlayer(player); - }); - }); - } - } - catch (Exception ex) - { - Logger.LogWarning($"Cannot remove knife: {ex.Message}"); - } - return; - foreach (var weapon in weapons) - { - if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid && weapon.Index > 0) - { - } - } - } - } - */ - private static void RefreshGloves(CCSPlayerController player) { if (!Utility.IsPlayerValid(player) || (LifeState_t)player.LifeState != LifeState_t.LIFE_ALIVE) return; @@ -375,6 +297,25 @@ namespace WeaponPaints } } + public void GivePlayerAgent(CCSPlayerController player) + { + try + { + Server.NextFrame(() => + { + string? model = player.TeamNum == 3 ? g_playersAgent[player.Slot].CT : g_playersAgent[player.Slot].T; + if (model == null) return; + + player.PlayerPawn.Value!.SetModel( + $"characters/models/{model}.vmdl" + ); + }); + } + catch (Exception) + { + } + } + public static CCSPlayerController? GetPlayerFromItemServices(CCSPlayer_ItemServices itemServices) { var pawn = itemServices.Pawn.Value; @@ -384,11 +325,6 @@ namespace WeaponPaints return player; } - private static CSkeletonInstance GetSkeletonInstance(CGameSceneNode node) - { - Func GetSkeletonInstance = VirtualFunction.Create(node.Handle, 8); - return new CSkeletonInstance(GetSkeletonInstance(node.Handle)); - } private static unsafe CBaseViewModel? GetPlayerViewModel(CCSPlayerController player) { if (player.PlayerPawn.Value == null || player.PlayerPawn.Value.ViewModelServices == null) return null; diff --git a/WeaponPaints.cs b/WeaponPaints.cs index dcc102ae..74729365 100644 --- a/WeaponPaints.cs +++ b/WeaponPaints.cs @@ -80,9 +80,11 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig g_knifePickupCount = new Dictionary(); internal static ConcurrentDictionary g_playersKnife = new ConcurrentDictionary(); internal static ConcurrentDictionary g_playersGlove = new ConcurrentDictionary(); + internal static ConcurrentDictionary g_playersAgent = new ConcurrentDictionary(); internal static ConcurrentDictionary> gPlayerWeaponsInfo = new ConcurrentDictionary>(); internal static List skinsList = new List(); internal static List glovesList = new List(); + internal static List agentsList = new List(); internal static WeaponSynchronization? weaponSync; public static bool g_bCommandsAllowed = true; internal Dictionary PlayerWeaponImage = new(); @@ -154,9 +156,9 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig "Nereziel & daffyy"; - public override string ModuleDescription => "Skin, gloves and knife selector, standalone and web-based"; + public override string ModuleDescription => "Skin, gloves, agents and knife selector, standalone and web-based"; public override string ModuleName => "WeaponPaints"; - public override string ModuleVersion => "2.1a"; + public override string ModuleVersion => "2.2a"; public static WeaponPaintsConfig GetWeaponPaintsConfig() { @@ -177,15 +179,15 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig weaponSync.GetGloveFromDatabase(playerInfo)); } + if (Config.Additional.AgentEnabled) + { + Task.Run(() => weaponSync.GetAgentFromDatabase(playerInfo)); + } } } Utility.LoadSkinsFromFile(ModuleDirectory + "/skins.json"); Utility.LoadGlovesFromFile(ModuleDirectory + "/gloves.json"); + Utility.LoadAgentsFromFile(ModuleDirectory + "/agents.json"); if (Config.Additional.KnifeEnabled) SetupKnifeMenu(); @@ -215,6 +222,8 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig(query, new { steamid = player.SteamId }); + + if (agentData != default) + { + string agentCT = agentData.Item1; + string agentT = agentData.Item2; + + if (!string.IsNullOrEmpty(agentCT) || !string.IsNullOrEmpty(agentT)) + { + WeaponPaints.g_playersAgent[player.Slot] = ( + agentCT, + agentT + ); + } + } + } + catch (Exception ex) + { + Utility.Log($"An error occurred in GetGloveFromDatabase: {ex.Message}"); + } + } + public async Task GetWeaponPaintsFromDatabase(PlayerInfo player) { try @@ -131,6 +162,28 @@ namespace WeaponPaints } } + internal async Task SyncAgentToDatabase(PlayerInfo player) + { + if (!_config.Additional.AgentEnabled || player == null || string.IsNullOrEmpty(player.SteamId)) return; + + 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 }); + } + catch (Exception e) + { + Utility.Log($"Error syncing agents to database: {e.Message}"); + } + } + internal async Task SyncWeaponPaintsToDatabase(PlayerInfo player) { if (player == null || string.IsNullOrEmpty(player.SteamId) || !WeaponPaints.gPlayerWeaponsInfo.TryGetValue(player.Slot, out var weaponsInfo)) diff --git a/lang/en.json b/lang/en.json index 5dc79c9c..4612605b 100644 --- a/lang/en.json +++ b/lang/en.json @@ -11,7 +11,11 @@ "wp_knife_menu_title": "Knife Menu", "wp_glove_menu_select": "You have chosen {lime}{0}{default} as your glove", "wp_glove_menu_title": "Gloves Menu", + "wp_agent_menu_select": "You have chosen {lime}{0}{default} as your agent", + "wp_agent_menu_title": "Agents Menu", "wp_skin_menu_weapon_title": "Weapon Menu", "wp_skin_menu_skin_title": "Select skin for {lime}{0}{default}", - "wp_skin_menu_select": "You have chosen {lime}{0}{default} as your skin" + "wp_skin_menu_select": "You have chosen {lime}{0}{default} as your skin", + + "None": "None" } \ No newline at end of file diff --git a/lang/lv.json b/lang/lv.json index f5d4b26e..b4c0b30f 100644 --- a/lang/lv.json +++ b/lang/lv.json @@ -11,7 +11,11 @@ "wp_knife_menu_title": "Nazis Izvēlne", "wp_glove_menu_select": "Jūs esat izvēlējies {lime}{0}{default} kā savus cimdus", "wp_glove_menu_title": "Cimdu Izvēlne", + "wp_agent_menu_select": "Jūs esat izvēlējušies {lime}{0}{default} kā savu aģentu", + "wp_agent_menu_title": "Aģentu izvēlnes", "wp_skin_menu_weapon_title": "Ieroču Izvēlne", "wp_skin_menu_skin_title": "Izvēlieties ādu {lime}{0}{default}", - "wp_skin_menu_select": "Jūs esat izvēlējies {lime}{0}{default} kā savu ādu" + "wp_skin_menu_select": "Jūs esat izvēlējies {lime}{0}{default} kā savu ādu", + + "None": "Nav" } \ No newline at end of file diff --git a/lang/pl.json b/lang/pl.json index aefa1d42..608753d0 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -11,7 +11,11 @@ "wp_knife_menu_title": "Menu Noży", "wp_glove_menu_select": "Wybrałeś {lime}{0}{default} jako swoje rękawiczki", "wp_glove_menu_title": "Menu Rękawiczek", + "wp_agent_menu_select": "Wybrałeś {lime}{0}{default} jako swojego agenta", + "wp_agent_menu_title": "Menu agentów", "wp_skin_menu_weapon_title": "Menu Broni", "wp_skin_menu_skin_title": "Wybierz skórkę dla {lime}{0}{default}", - "wp_skin_menu_select": "Wybrałeś {lime}{0}{default} jako swoją skórkę" + "wp_skin_menu_select": "Wybrałeś {lime}{0}{default} jako swoją skórkę", + + "None": "Brak" } \ No newline at end of file diff --git a/lang/pt-BR.json b/lang/pt-BR.json index 9665b79d..c3590acb 100644 --- a/lang/pt-BR.json +++ b/lang/pt-BR.json @@ -11,7 +11,11 @@ "wp_knife_menu_title": "Menu de Facas", "wp_glove_menu_select": "Você escolheu {lime}{0}{default} como suas luvas", "wp_glove_menu_title": "Menu de Luvas", + "wp_agent_menu_select": "Você escolheu {lime}{0}{default} como seu agente", + "wp_agent_menu_title": "Menu de Agentes", "wp_skin_menu_weapon_title": "Menu de Armas", "wp_skin_menu_skin_title": "Selecione uma skin para {lime}{0}{default}", - "wp_skin_menu_select": "Você escolheu {lime}{0}{default} como sua skin" + "wp_skin_menu_select": "Você escolheu {lime}{0}{default} como sua skin", + + "None": "Nenhum" } \ No newline at end of file diff --git a/lang/pt-PT.json b/lang/pt-PT.json index ce676d69..a00250f8 100644 --- a/lang/pt-PT.json +++ b/lang/pt-PT.json @@ -11,7 +11,11 @@ "wp_knife_menu_title": "Menu de Facas", "wp_glove_menu_select": "Você escolheu {lime}{0}{default} como suas luvas", "wp_glove_menu_title": "Menu de Luvas", + "wp_agent_menu_select": "Escolheste {lime}{0}{default} como teu agente", + "wp_agent_menu_title": "Menu de Agentes", "wp_skin_menu_weapon_title": "Menu de Armas", "wp_skin_menu_skin_title": "Selecione uma skin para {lime}{0}{default}", - "wp_skin_menu_select": "Você escolheu {lime}{0}{default} como sua skin" + "wp_skin_menu_select": "Você escolheu {lime}{0}{default} como sua skin", + + "None": "Nenhum" } \ No newline at end of file diff --git a/lang/ru.json b/lang/ru.json index 96bfc5bc..bbd7e87b 100644 --- a/lang/ru.json +++ b/lang/ru.json @@ -11,7 +11,11 @@ "wp_knife_menu_title": "Меню Ножей", "wp_glove_menu_select": "Вы выбрали {lime}{0}{default} в качестве ваших перчаток", "wp_glove_menu_title": "Меню Перчаток", + "wp_agent_menu_select": "Вы выбрали {lime}{0}{default} в качестве своего агента", + "wp_agent_menu_title": "Меню агентов", "wp_skin_menu_weapon_title": "Меню Оружия", "wp_skin_menu_skin_title": "Выберите скин для {lime}{0}{default}", - "wp_skin_menu_select": "Вы выбрали {lime}{0}{default} в качестве вашего скина" + "wp_skin_menu_select": "Вы выбрали {lime}{0}{default} в качестве вашего скина", + + "None": "Нет" } \ No newline at end of file diff --git a/lang/tr.json b/lang/tr.json index f16de6b3..583ff378 100644 --- a/lang/tr.json +++ b/lang/tr.json @@ -11,7 +11,11 @@ "wp_knife_menu_title": "Bıçak Menüsü", "wp_glove_menu_select": "{lime}{0}{default} olarak eldiveninizi seçtiniz", "wp_glove_menu_title": "Eldiven Menüsü", + "wp_agent_menu_select": "Ajanınız olarak {lime}{0}{default} seçtiniz", + "wp_agent_menu_title": "Ajan Menüsü", "wp_skin_menu_weapon_title": "Silah Menüsü", "wp_skin_menu_skin_title": "{lime}{0}{default} için bir skin seçin", - "wp_skin_menu_select": "{lime}{0}{default} olarak bir skin seçtiniz" + "wp_skin_menu_select": "{lime}{0}{default} olarak bir skin seçtiniz", + + "None": "Hiçbiri" } \ No newline at end of file diff --git a/lang/ua.json b/lang/ua.json index afacc3df..a7a3546f 100644 --- a/lang/ua.json +++ b/lang/ua.json @@ -11,7 +11,11 @@ "wp_knife_menu_title": "Меню Ножів", "wp_glove_menu_select": "Ви вибрали {lime}{0}{default} як ваші рукавички", "wp_glove_menu_title": "Меню Рукавичок", + "wp_agent_menu_select": "Ви обрали {lime}{0}{default} як вашого агента", + "wp_agent_menu_title": "Меню агентів", "wp_skin_menu_weapon_title": "Меню Зброї", "wp_skin_menu_skin_title": "Виберіть шкіру для {lime}{0}{default}", - "wp_skin_menu_select": "Ви вибрали {lime}{0}{default} як вашу шкіру" + "wp_skin_menu_select": "Ви вибрали {lime}{0}{default} як вашу шкіру", + + "None": "Немає" } \ No newline at end of file diff --git a/lang/zh-cn.json b/lang/zh-cn.json index 1cca33ab..633eb71e 100644 --- a/lang/zh-cn.json +++ b/lang/zh-cn.json @@ -11,7 +11,11 @@ "wp_knife_menu_title": "刀具菜单", "wp_glove_menu_select": "您已选择 {lime}{0}{default} 作为您的手套", "wp_glove_menu_title": "手套菜单", + "wp_agent_menu_select": "您选择了{lime}{0}{default}作为您的代理", + "wp_agent_menu_title": "代理菜单", "wp_skin_menu_weapon_title": "武器菜单", "wp_skin_menu_skin_title": "为 {lime}{0}{default} 选择皮肤", - "wp_skin_menu_select": "您已选择 {lime}{0}{default} 作为您的皮肤" + "wp_skin_menu_select": "您已选择 {lime}{0}{default} 作为您的皮肤", + + "None": "无" } \ No newline at end of file diff --git a/website/data/agents.json b/website/data/agents.json new file mode 100644 index 00000000..0a69f519 --- /dev/null +++ b/website/data/agents.json @@ -0,0 +1,386 @@ +[ + { + "team": 2, + "image": "", + "model": "null", + "agent_name": "Agent | Default" + }, + { + "team": 3, + "image": "", + "model": "null", + "agent_name": "Agent | Default" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4619.png", + "model": "ctm_st6/ctm_st6_variantj", + "agent_name": "'Blueberries' Buckshot | NSWC SEAL" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4680.png", + "model": "ctm_st6/ctm_st6_variantl", + "agent_name": "'Two Times' McCoy | TACP Cavalry" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4711.png", + "model": "ctm_swat/ctm_swat_variante", + "agent_name": "Cmdr. Mae 'Dead Cold' Jamison | SWAT" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4712.png", + "model": "ctm_swat/ctm_swat_variantf", + "agent_name": "1st Lieutenant Farlow | SWAT" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4713.png", + "model": "ctm_swat/ctm_swat_variantg", + "agent_name": "John 'Van Healen' Kask | SWAT" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4714.png", + "model": "ctm_swat/ctm_swat_varianth", + "agent_name": "Bio-Haz Specialist | SWAT" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4715.png", + "model": "ctm_swat/ctm_swat_varianti", + "agent_name": "Sergeant Bombson | SWAT" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4716.png", + "model": "ctm_swat/ctm_swat_variantj", + "agent_name": "Chem-Haz Specialist | SWAT" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4718.png", + "model": "tm_balkan/tm_balkan_variantk", + "agent_name": "Rezan the Redshirt | Sabre" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4726.png", + "model": "tm_professional/tm_professional_varf", + "agent_name": "Sir Bloody Miami Darryl | The Professionals" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4727.png", + "model": "tm_professional/tm_professional_varg", + "agent_name": "Safecracker Voltzmann | The Professionals" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4728.png", + "model": "tm_professional/tm_professional_varh", + "agent_name": "Little Kev | The Professionals" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4730.png", + "model": "tm_professional/tm_professional_varj", + "agent_name": "Getaway Sally | The Professionals" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4732.png", + "model": "tm_professional/tm_professional_vari", + "agent_name": "Number K | The Professionals" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4733.png", + "model": "tm_professional/tm_professional_varf1", + "agent_name": "Sir Bloody Silent Darryl | The Professionals" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4734.png", + "model": "tm_professional/tm_professional_varf2", + "agent_name": "Sir Bloody Skullhead Darryl | The Professionals" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4735.png", + "model": "tm_professional/tm_professional_varf3", + "agent_name": "Sir Bloody Darryl Royale | The Professionals" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4736.png", + "model": "tm_professional/tm_professional_varf4", + "agent_name": "Sir Bloody Loudmouth Darryl | The Professionals" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4749.png", + "model": "ctm_gendarmerie/ctm_gendarmerie_varianta", + "agent_name": "Sous-Lieutenant Medic | Gendarmerie Nationale" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4750.png", + "model": "ctm_gendarmerie/ctm_gendarmerie_variantb", + "agent_name": "Chem-Haz Capitaine | Gendarmerie Nationale" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4751.png", + "model": "ctm_gendarmerie/ctm_gendarmerie_variantc", + "agent_name": "Chef d'Escadron Rouchard | Gendarmerie Nationale" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4752.png", + "model": "ctm_gendarmerie/ctm_gendarmerie_variantd", + "agent_name": "Aspirant | Gendarmerie Nationale" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4753.png", + "model": "ctm_gendarmerie/ctm_gendarmerie_variante", + "agent_name": "Officer Jacques Beltram | Gendarmerie Nationale" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4756.png", + "model": "ctm_swat/ctm_swat_variantk", + "agent_name": "Lieutenant 'Tree Hugger' Farlow | SWAT" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4757.png", + "model": "ctm_diver/ctm_diver_varianta", + "agent_name": "Cmdr. Davida 'Goggles' Fernandez | SEAL Frogman" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4771.png", + "model": "ctm_diver/ctm_diver_variantb", + "agent_name": "Cmdr. Frank 'Wet Sox' Baroud | SEAL Frogman" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4772.png", + "model": "ctm_diver/ctm_diver_variantc", + "agent_name": "Lieutenant Rex Krikey | SEAL Frogman" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4773.png", + "model": "tm_jungle_raider/tm_jungle_raider_varianta", + "agent_name": "Elite Trapper Solman | Guerrilla Warfare" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4774.png", + "model": "tm_jungle_raider/tm_jungle_raider_variantb", + "agent_name": "Crasswater The Forgotten | Guerrilla Warfare" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4775.png", + "model": "tm_jungle_raider/tm_jungle_raider_variantc", + "agent_name": "Arno The Overgrown | Guerrilla Warfare" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4776.png", + "model": "tm_jungle_raider/tm_jungle_raider_variantd", + "agent_name": "Col. Mangos Dabisi | Guerrilla Warfare" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4777.png", + "model": "tm_jungle_raider/tm_jungle_raider_variante", + "agent_name": "Vypa Sista of the Revolution | Guerrilla Warfare" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4778.png", + "model": "tm_jungle_raider/tm_jungle_raider_variantf", + "agent_name": "Trapper Aggressor | Guerrilla Warfare" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4780.png", + "model": "tm_jungle_raider/tm_jungle_raider_variantb2", + "agent_name": "'Medium Rare' Crasswater | Guerrilla Warfare" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4781.png", + "model": "tm_jungle_raider/tm_jungle_raider_variantf2", + "agent_name": "Trapper | Guerrilla Warfare" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5105.png", + "model": "tm_leet/tm_leet_variantg", + "agent_name": "Ground Rebel | Elite Crew" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5106.png", + "model": "tm_leet/tm_leet_varianth", + "agent_name": "Osiris | Elite Crew" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5107.png", + "model": "tm_leet/tm_leet_varianti", + "agent_name": "Prof. Shahmat | Elite Crew" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5108.png", + "model": "tm_leet/tm_leet_variantf", + "agent_name": "The Elite Mr. Muhlik | Elite Crew" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5109.png", + "model": "tm_leet/tm_leet_variantj", + "agent_name": "Jungle Rebel | Elite Crew" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5205.png", + "model": "tm_phoenix/tm_phoenix_varianth", + "agent_name": "Soldier | Phoenix" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5206.png", + "model": "tm_phoenix/tm_phoenix_variantf", + "agent_name": "Enforcer | Phoenix" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5207.png", + "model": "tm_phoenix/tm_phoenix_variantg", + "agent_name": "Slingshot | Phoenix" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5208.png", + "model": "tm_phoenix/tm_phoenix_varianti", + "agent_name": "Street Soldier | Phoenix" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5305.png", + "model": "ctm_fbi/ctm_fbi_variantf", + "agent_name": "Operator | FBI SWAT" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5306.png", + "model": "ctm_fbi/ctm_fbi_variantg", + "agent_name": "Markus Delrow | FBI HRT" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5307.png", + "model": "ctm_fbi/ctm_fbi_varianth", + "agent_name": "Michael Syfers | FBI Sniper" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5308.png", + "model": "ctm_fbi/ctm_fbi_variantb", + "agent_name": "Special Agent Ava | FBI" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5400.png", + "model": "ctm_st6/ctm_st6_variantk", + "agent_name": "3rd Commando Company | KSK" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5401.png", + "model": "ctm_st6/ctm_st6_variante", + "agent_name": "Seal Team 6 Soldier | NSWC SEAL" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5402.png", + "model": "ctm_st6/ctm_st6_variantg", + "agent_name": "Buckshot | NSWC SEAL" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5403.png", + "model": "ctm_st6/ctm_st6_variantm", + "agent_name": "'Two Times' McCoy | USAF TACP" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5404.png", + "model": "ctm_st6/ctm_st6_varianti", + "agent_name": "Lt. Commander Ricksaw | NSWC SEAL" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5405.png", + "model": "ctm_st6/ctm_st6_variantn", + "agent_name": "Primeiro Tenente | Brazilian 1st Battalion" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5500.png", + "model": "tm_balkan/tm_balkan_variantf", + "agent_name": "Dragomir | Sabre" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5501.png", + "model": "tm_balkan/tm_balkan_varianti", + "agent_name": "Maximus | Sabre" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5502.png", + "model": "tm_balkan/tm_balkan_variantg", + "agent_name": "Rezan The Ready | Sabre" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5503.png", + "model": "tm_balkan/tm_balkan_variantj", + "agent_name": "Blackwolf | Sabre" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5504.png", + "model": "tm_balkan/tm_balkan_varianth", + "agent_name": "'The Doctor' Romanov | Sabre" + }, + { + "team": 2, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5505.png", + "model": "tm_balkan/tm_balkan_variantl", + "agent_name": "Dragomir | Sabre Footsoldier" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5601.png", + "model": "ctm_sas/ctm_sas_variantf", + "agent_name": "B Squadron Officer | SAS" + }, + { + "team": 3, + "image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-5602.png", + "model": "ctm_sas/ctm_sas_variantg", + "agent_name": "D Squadron Officer | NZSAS" + } +] \ No newline at end of file diff --git a/website/data/gloves.json b/website/data/gloves.json index f60be1a4..544a8ea3 100644 --- a/website/data/gloves.json +++ b/website/data/gloves.json @@ -1,4 +1,10 @@ [ + { + "weapon_defindex": 0, + "paint": "0", + "image": "", + "paint_name": "Gloves | Default" + }, { "weapon_defindex": 4725, "paint": "10085",