diff --git a/Commands.cs b/Commands.cs index 2760fd1a..9a8d55d0 100644 --- a/Commands.cs +++ b/Commands.cs @@ -1,7 +1,5 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Commands; -using CounterStrikeSharp.API.Modules.Entities.Constants; -using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Menu; namespace WeaponPaints @@ -12,7 +10,6 @@ private void OnCommandRefresh(CCSPlayerController? player, CommandInfo command) { if (!Config.Additional.CommandWpEnabled || !Config.Additional.SkinEnabled || !g_bCommandsAllowed) return; if (!Utility.IsPlayerValid(player)) return; - string temp = ""; if (player == null || player.Index <= 0) return; int playerIndex = (int)player!.Index; @@ -37,17 +34,15 @@ private void OnCommandRefresh(CCSPlayerController? player, CommandInfo command) RefreshWeapons(player); } - if (!string.IsNullOrEmpty(Config.Messages.SuccessRefreshCommand)) + if (!string.IsNullOrEmpty(Localizer["wp_command_refresh_done"])) { - temp = $" {Config.Prefix} {Config.Messages.SuccessRefreshCommand}"; - player!.PrintToChat(Utility.ReplaceTags(temp)); + player!.Print(Localizer["wp_command_refresh_done"]); } return; } - if (!string.IsNullOrEmpty(Config.Messages.CooldownRefreshCommand)) + if (!string.IsNullOrEmpty(Localizer["wp_command_cooldown"])) { - temp = $" {Config.Prefix} {Config.Messages.CooldownRefreshCommand}"; - player!.PrintToChat(Utility.ReplaceTags(temp)); + player!.Print(Localizer["wp_command_cooldown"]); } } @@ -56,22 +51,18 @@ private void OnCommandWS(CCSPlayerController? player, CommandInfo command) if (!Config.Additional.SkinEnabled) return; if (!Utility.IsPlayerValid(player)) return; - string temp; - if (!string.IsNullOrEmpty(Config.Messages.WebsiteMessageCommand)) + if (!string.IsNullOrEmpty(Localizer["wp_info_website"])) { - temp = $" {Config.Prefix} {Config.Messages.WebsiteMessageCommand}"; - player!.PrintToChat(Utility.ReplaceTags(temp)); + player!.Print(Localizer["wp_info_website", Config.Website]); } - if (!string.IsNullOrEmpty(Config.Messages.SynchronizeMessageCommand)) + if (!string.IsNullOrEmpty(Localizer["wp_info_refresh"])) { - temp = $" {Config.Prefix} {Config.Messages.SynchronizeMessageCommand}"; - player!.PrintToChat(Utility.ReplaceTags(temp)); + player!.Print(Localizer["wp_info_refresh"]); } if (!Config.Additional.KnifeEnabled) return; - if (!string.IsNullOrEmpty(Config.Messages.KnifeMessageCommand)) + if (!string.IsNullOrEmpty(Localizer["wp_info_knife"])) { - temp = $" {Config.Prefix} {Config.Messages.KnifeMessageCommand}"; - player!.PrintToChat(Utility.ReplaceTags(temp)); + player!.Print(Localizer["wp_info_knife"]); } } @@ -106,7 +97,7 @@ private void SetupKnifeMenu() .Where(pair => pair.Key.StartsWith("weapon_knife") || pair.Key.StartsWith("weapon_bayonet")) .ToDictionary(pair => pair.Key, pair => pair.Value); - var giveItemMenu = new ChatMenu(Utility.ReplaceTags($" {Config.Messages.KnifeMenuTitle}")); + var giveItemMenu = new ChatMenu(Localizer["wp_knife_menu_title"]); var handleGive = (CCSPlayerController? player, ChatMenuOption option) => { if (Utility.IsPlayerValid(player)) @@ -116,18 +107,14 @@ private void SetupKnifeMenu() var knifeKey = knivesOnly.FirstOrDefault(x => x.Value == knifeName).Key; if (!string.IsNullOrEmpty(knifeKey)) { - string temp = ""; - - if (!string.IsNullOrEmpty(Config.Messages.ChosenKnifeMenu)) + if (!string.IsNullOrEmpty(Localizer["wp_knife_menu_select"])) { - temp = $" {Config.Prefix} {Config.Messages.ChosenKnifeMenu}".Replace("{KNIFE}", knifeName); - player!.PrintToChat(Utility.ReplaceTags(temp)); + player!.Print(Localizer["wp_knife_menu_select", knifeName]); } - if (!string.IsNullOrEmpty(Config.Messages.ChosenKnifeMenuKill) && Config.Additional.CommandKillEnabled) + if (!string.IsNullOrEmpty(Localizer["wp_knife_menu_kill"]) && Config.Additional.CommandKillEnabled) { - temp = $" {Config.Prefix} {Config.Messages.ChosenKnifeMenuKill}"; - player!.PrintToChat(Utility.ReplaceTags(temp)); + player!.Print(Localizer["wp_knife_menu_kill"]); } PlayerInfo playerInfo = new PlayerInfo @@ -166,10 +153,9 @@ private void SetupKnifeMenu() ChatMenus.OpenMenu(player, giveItemMenu); return; } - if (!string.IsNullOrEmpty(Config.Messages.CooldownRefreshCommand)) + if (!string.IsNullOrEmpty(Localizer["wp_command_cooldown"])) { - string temp = $" {Config.Prefix} {Config.Messages.CooldownRefreshCommand}"; - player.PrintToChat(Utility.ReplaceTags(temp)); + player!.Print(Localizer["wp_command_cooldown"]); } }); } @@ -177,7 +163,7 @@ private void SetupKnifeMenu() private void SetupSkinsMenu() { var classNamesByWeapon = weaponList.ToDictionary(kvp => kvp.Value, kvp => kvp.Key); - var weaponSelectionMenu = new ChatMenu(Utility.ReplaceTags($" {Config.Messages.WeaponMenuTitle}")); + var weaponSelectionMenu = new ChatMenu(Localizer["wp_skin_menu_weapon_title"]); // Function to handle skin selection for a specific weapon var handleWeaponSelection = (CCSPlayerController? player, ChatMenuOption option) => @@ -195,7 +181,7 @@ private void SetupSkinsMenu() weaponName?.ToString() == selectedWeaponClassname )?.ToList(); - var skinSubMenu = new ChatMenu(Utility.ReplaceTags($" {Config.Messages.SkinMenuTitle}").Replace("{WEAPON}", 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) => @@ -224,8 +210,7 @@ private void SetupSkinsMenu() int.TryParse(weaponDefIndexObj.ToString(), out var weaponDefIndex) && int.TryParse(selectedPaintID, out var paintID)) { - string temp = $" {Config.Prefix} {Config.Messages.ChosenSkinMenu}".Replace("{SKIN}", selectedSkin); - p.PrintToChat(Utility.ReplaceTags(temp)); + p!.Print(Localizer["f", selectedSkin]); if (!gPlayerWeaponsInfo[playerIndex].ContainsKey(weaponDefIndex)) { @@ -294,10 +279,9 @@ private void SetupSkinsMenu() ChatMenus.OpenMenu(player, weaponSelectionMenu); return; } - if (!string.IsNullOrEmpty(Config.Messages.CooldownRefreshCommand)) + if (!string.IsNullOrEmpty(Localizer["wp_command_cooldown"])) { - string temp = $"{Config.Prefix} {Config.Messages.CooldownRefreshCommand}"; - player.PrintToChat(Utility.ReplaceTags(temp)); + player!.Print(Localizer["wp_command_cooldown"]); } }); } diff --git a/Config.cs b/Config.cs index 042f51e9..2795400c 100644 --- a/Config.cs +++ b/Config.cs @@ -3,32 +3,6 @@ namespace WeaponPaints { - public class Messages - { - [JsonPropertyName("WebsiteMessageCommand")] - public string WebsiteMessageCommand { get; set; } = "Visit {WEBSITE} where you can change skins."; - [JsonPropertyName("SynchronizeMessageCommand")] - public string SynchronizeMessageCommand { get; set; } = "Type !wp to synchronize chosen skins."; - [JsonPropertyName("KnifeMessageCommand")] - public string KnifeMessageCommand { get; set; } = "Type !knife to open knife menu."; - [JsonPropertyName("CooldownRefreshCommand")] - public string CooldownRefreshCommand { get; set; } = "You can't refresh weapon paints right now."; - [JsonPropertyName("SuccessRefreshCommand")] - public string SuccessRefreshCommand { get; set; } = "Refreshing weapon paints."; - [JsonPropertyName("ChosenKnifeMenu")] - public string ChosenKnifeMenu { get; set; } = "You have chosen {KNIFE} as your knife."; - [JsonPropertyName("ChosenSkinMenu")] - public string ChosenSkinMenu { get; set; } = "You have chosen {SKIN} as your skin."; - [JsonPropertyName("ChosenKnifeMenuKill")] - public string ChosenKnifeMenuKill { get; set; } = "To correctly apply skin for knife, you need to type !kill."; - [JsonPropertyName("KnifeMenuTitle")] - public string KnifeMenuTitle { get; set; } = "Knife Menu."; - [JsonPropertyName("WeaponMenuTitle")] - public string WeaponMenuTitle { get; set; } = "Weapon Menu."; - [JsonPropertyName("SkinMenuTitle")] - public string SkinMenuTitle { get; set; } = "Select skin for {WEAPON}"; - } - public class Additional { [JsonPropertyName("SkinVisibilityFix")] @@ -66,6 +40,8 @@ public class Additional [JsonPropertyName("GiveRandomSkin")] public bool GiveRandomSkin { get; set; } = false; + [JsonPropertyName("GiveKnifeAfterRemove")] + public bool GiveKnifeAfterRemove { get; set; } = false; } public class WeaponPaintsConfig : BasePluginConfig @@ -99,9 +75,6 @@ public class WeaponPaintsConfig : BasePluginConfig [JsonPropertyName("Website")] public string Website { get; set; } = "example.com/skins"; - [JsonPropertyName("Messages")] - public Messages Messages { get; set; } = new Messages(); - [JsonPropertyName("Additional")] public Additional Additional { get; set; } = new Additional(); } diff --git a/Events.cs b/Events.cs index c863f0b8..c6707ec9 100644 --- a/Events.cs +++ b/Events.cs @@ -45,7 +45,7 @@ private void OnClientDisconnect(int playerSlot) gPlayerWeaponsInfo.Remove((int)player.Index); } - private void OnEntitySpawned(CEntityInstance entity) + private void OnEntityCreated(CEntityInstance entity) { if (!Config.Additional.SkinEnabled) return; var designerName = entity.DesignerName; @@ -57,6 +57,7 @@ private void OnEntitySpawned(CEntityInstance entity) { isKnife = true; } + Server.NextFrame(() => { try @@ -94,22 +95,65 @@ private HookResult OnItemPickup(EventItemPickup @event, GameEventInfo info) { if (@event.Defindex == 42 || @event.Defindex == 59) { + Server.PrintToChatAll("test1"); + CCSPlayerController? player = @event.Userid; - if (!Utility.IsPlayerValid(player) || !player.PawnIsAlive || g_knifePickupCount[(int)player.Index] >= 1) return HookResult.Continue; + if (player == null || !player.IsValid || !g_knifePickupCount.ContainsKey((int)player.Index) || player.IsBot || !g_playersKnife.ContainsKey((int)player.Index)) + return HookResult.Continue; + + Server.PrintToChatAll("test2"); + + + if (g_knifePickupCount[(int)player.Index] >= 2) return HookResult.Continue; + Server.PrintToChatAll("test3"); + if (g_playersKnife.ContainsKey((int)player.Index) && g_playersKnife[(int)player.Index] != "weapon_knife") { + Server.PrintToChatAll("usuwam noz"); g_knifePickupCount[(int)player.Index]++; RemovePlayerKnife(player, true); - AddTimer(0.3f, () => GiveKnifeToPlayer(player)); + + if (!PlayerHasKnife(player) && Config.Additional.GiveKnifeAfterRemove) + AddTimer(0.3f, () => GiveKnifeToPlayer(player)); } } return HookResult.Continue; } + public HookResult OnPickup(CEntityIOOutput output, string name, CEntityInstance activator, CEntityInstance caller, CVariant value, float delay) + { + CCSPlayerController? player = Utilities.GetEntityFromIndex((int)activator.Index).OriginalController.Value; + + if (player == null || player.IsBot || player.IsHLTV) + return HookResult.Continue; + + if (player == null || !player.IsValid || player.AuthorizedSteamID == null || + !g_knifePickupCount.ContainsKey((int)player.Index) || !g_playersKnife.ContainsKey((int)player.Index)) + return HookResult.Continue; + + CBasePlayerWeapon weapon = new(caller.Handle); + + if (weapon.AttributeManager.Item.ItemDefinitionIndex != 42 && weapon.AttributeManager.Item.ItemDefinitionIndex != 59) + return HookResult.Continue; + + if (g_knifePickupCount[(int)player.Index] >= 2) return HookResult.Continue; + + if (g_playersKnife[(int)player.Index] != "weapon_knife") + { + g_knifePickupCount[(int)player.Index]++; + weapon.Remove(); + if (!PlayerHasKnife(player) && Config.Additional.GiveKnifeAfterRemove) + AddTimer(0.2f, () => GiveKnifeToPlayer(player)); + } + + return HookResult.Continue; + } + + private void OnMapStart(string mapName) { if (!Config.Additional.KnifeEnabled) return; @@ -117,6 +161,7 @@ private void OnMapStart(string mapName) // 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"); @@ -133,7 +178,7 @@ private void OnMapStart(string mapName) foreach (CCSPlayerController player in players) { - if (player == null || !player.IsValid || player.IsBot || player.IsHLTV || player.AuthorizedSteamID == null) continue; + if (player.IsBot || player.IsHLTV || player.AuthorizedSteamID == null) continue; if (gPlayerWeaponsInfo.ContainsKey((int)player.Index)) continue; PlayerInfo playerInfo = new PlayerInfo @@ -151,7 +196,6 @@ private void OnMapStart(string mapName) _ = weaponSync.GetKnifeFromDatabase(playerInfo); } }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE | CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT); - } private HookResult OnPlayerConnectFull(EventPlayerConnectFull @event, GameEventInfo info) @@ -187,7 +231,7 @@ private HookResult OnPlayerConnectFull(EventPlayerConnectFull @event, GameEventI private HookResult OnPlayerSpawn(EventPlayerSpawn @event, GameEventInfo info) { CCSPlayerController? player = @event.Userid; - if (player == null || !player.IsValid) + if (player == null || !player.IsValid || player.IsBot) { return HookResult.Continue; } @@ -195,8 +239,7 @@ private HookResult OnPlayerSpawn(EventPlayerSpawn @event, GameEventInfo info) if (Config.Additional.KnifeEnabled) { g_knifePickupCount[(int)player.Index] = 0; - if (!PlayerHasKnife(player)) - GiveKnifeToPlayer(player); + AddTimer(0.1f, () => GiveKnifeToPlayer(player)); } if (Config.Additional.SkinVisibilityFix) @@ -207,7 +250,6 @@ private HookResult OnPlayerSpawn(EventPlayerSpawn @event, GameEventInfo info) return HookResult.Continue; } - private HookResult OnRoundEnd(EventRoundEnd @event, GameEventInfo info) { g_bCommandsAllowed = false; @@ -227,7 +269,7 @@ private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo info) private void RegisterListeners() { - RegisterListener(OnEntitySpawned); + RegisterListener(OnEntityCreated); RegisterListener(OnClientAuthorized); RegisterListener(OnClientDisconnect); RegisterListener(OnMapStart); @@ -237,7 +279,8 @@ private void RegisterListeners() RegisterEventHandler(OnRoundStart, HookMode.Pre); RegisterEventHandler(OnRoundEnd); RegisterEventHandler(OnEventItemPurchasePost); - RegisterEventHandler(OnItemPickup); + //RegisterEventHandler(OnItemPickup); + HookEntityOutput("weapon_knife", "OnPlayerPickup", OnPickup, HookMode.Pre); } /* WORKAROUND FOR CLIENTS WITHOUT STEAMID ON AUTHORIZATION */ diff --git a/PlayerExtensions.cs b/PlayerExtensions.cs new file mode 100644 index 00000000..9fa41d0c --- /dev/null +++ b/PlayerExtensions.cs @@ -0,0 +1,14 @@ +using CounterStrikeSharp.API.Core; +using System.Text; + +namespace WeaponPaints; + +public static class PlayerExtensions +{ + public static void Print(this CCSPlayerController controller, string message) + { + StringBuilder _message = new(WeaponPaints._localizer["wp_prefix"]); + _message.Append(message); + controller.PrintToChat(_message.ToString()); + } +} \ No newline at end of file diff --git a/PluginServices.cs b/PluginServices.cs new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/PluginServices.cs @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Utility.cs b/Utility.cs index 7bf4318b..f342fb0a 100644 --- a/Utility.cs +++ b/Utility.cs @@ -108,13 +108,13 @@ internal static string ReplaceTags(string message) return message; } - internal static async Task CheckVersion(string version) + internal static async Task CheckVersion(string version, ILogger logger) { using (HttpClient client = new HttpClient()) { try { - HttpResponseMessage response = await client.GetAsync("https://github.com/Nereziel/cs2-WeaponPaints/blob/main/VERSION"); + HttpResponseMessage response = await client.GetAsync("https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/VERSION"); if (response.IsSuccessStatusCode) { @@ -125,24 +125,25 @@ internal static async Task CheckVersion(string version) if (comparisonResult < 0) { - WeaponPaints.logger!.LogWarning("Plugin is outdated! Check https://github.com/Nereziel/cs2-WeaponPaints"); + logger.LogWarning("Plugin is outdated! Check https://github.com/Nereziel/cs2-WeaponPaints"); } else if (comparisonResult > 0) { - WeaponPaints.logger!.LogInformation("Probably dev version detected"); + logger.LogInformation("Probably dev version detected"); } else { - WeaponPaints.logger!.LogInformation("Plugin is up to date"); + logger.LogInformation("Plugin is up to date"); } } else { - WeaponPaints.logger!.LogWarning("Failed to check version"); + logger.LogWarning("Failed to check version"); } } - catch (Exception) + catch (Exception ex) { + Console.WriteLine(ex); } } } diff --git a/WeaponAction.cs b/WeaponAction.cs index ccecddf4..932140e4 100644 --- a/WeaponAction.cs +++ b/WeaponAction.cs @@ -20,6 +20,11 @@ internal static void ChangeWeaponAttributes(CBasePlayerWeapon? weapon, CCSPlayer int weaponDefIndex = weapon.AttributeManager.Item.ItemDefinitionIndex; + if (isKnife) + { + weapon.AttributeManager.Item.EntityQuality = 3; + } + if (_config.Additional.GiveRandomSkin && !gPlayerWeaponsInfo[playerIndex].ContainsKey(weaponDefIndex)) { @@ -280,10 +285,10 @@ internal void RemovePlayerKnife(CCSPlayerController? player, bool force = false) } private static int GetRandomPaint(int defindex) { - Random rnd = new Random(); - if (WeaponPaints.skinsList != null) + if (skinsList != null) { + Random rnd = new Random(); // Filter weapons by the provided defindex var filteredWeapons = skinsList.FindAll(w => w["weapon_defindex"]?.ToString() == defindex.ToString()); diff --git a/WeaponPaints.cs b/WeaponPaints.cs index ef4158ad..9eebcf74 100644 --- a/WeaponPaints.cs +++ b/WeaponPaints.cs @@ -4,13 +4,13 @@ using CounterStrikeSharp.API.Modules.Cvars; using Newtonsoft.Json.Linq; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Localization; namespace WeaponPaints; -[MinimumApiVersion(101)] +[MinimumApiVersion(121)] public partial class WeaponPaints : BasePlugin, IPluginConfig { - internal static ILogger? logger; internal static readonly Dictionary weaponList = new() { {"weapon_deagle", "Desert Eagle"}, @@ -70,6 +70,7 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig g_knifePickupCount = new Dictionary(); internal static Dictionary g_playersKnife = new(); internal static Dictionary> gPlayerWeaponsInfo = new Dictionary>(); @@ -144,7 +145,8 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig "Nereziel & daffyy"; public override string ModuleDescription => "Skin and knife selector, standalone and web-based"; public override string ModuleName => "WeaponPaints"; - public override string ModuleVersion => "1.3f"; + public override string ModuleVersion => "1.3g"; + public static WeaponPaintsConfig GetWeaponPaintsConfig() { return _config; @@ -182,10 +184,13 @@ public override void Load(bool hotReload) _ = weaponSync.GetWeaponPaintsFromDatabase(playerInfo); if (Config.Additional.KnifeEnabled && weaponSync != null) _ = weaponSync.GetKnifeFromDatabase(playerInfo); - } + g_knifePickupCount[(int)player!.Index] = 0; + } + /* RegisterListeners(); RegisterCommands(); + */ } if (Config.Additional.KnifeEnabled) @@ -212,9 +217,11 @@ public void OnConfigParsed(WeaponPaintsConfig config) Config = config; _config = config; + _localizer = Localizer; + Utility.Config = config; Utility.ShowAd(ModuleVersion); - Task.Run(async () => await Utility.CheckVersion(ModuleVersion)); + Task.Run(async () => await Utility.CheckVersion(ModuleVersion, Logger)); } public override void Unload(bool hotReload) diff --git a/WeaponPaints.csproj b/WeaponPaints.csproj index 76a279cf..b7fd0686 100644 --- a/WeaponPaints.csproj +++ b/WeaponPaints.csproj @@ -5,12 +5,17 @@ enable enable true + true - + + + + + diff --git a/WeaponSynchronization.cs b/WeaponSynchronization.cs index c7b59022..5742a654 100644 --- a/WeaponSynchronization.cs +++ b/WeaponSynchronization.cs @@ -1,6 +1,4 @@ -using CounterStrikeSharp.API; -using CounterStrikeSharp.API.Core; -using Dapper; +using Dapper; using MySqlConnector; using Newtonsoft.Json.Linq; diff --git a/lang/en.json b/lang/en.json new file mode 100644 index 00000000..9537d5a7 --- /dev/null +++ b/lang/en.json @@ -0,0 +1,14 @@ +{ + "wp_prefix": "{lightblue}[WeaponPaints] {default}", + "wp_info_website": "Visit {lime}{0}{default} where you can change skins", + "wp_info_refresh": "Type {lime}!wp{default} to synchronize chosen skins", + "wp_info_knife": "Type {lime}!knife{default} to open knife menu", + "wp_command_cooldown": "{lightred}You can't refresh weapon paints right now", + "wp_command_refresh_done": "{lime}Refreshing weapon paints", + "wp_knife_menu_select": "You have chosen {lime}{0}{default} as your knife", + "wp_knife_menu_kill": "To correctly apply skin for knife, you need to type {lime}!kill{default}", + "wp_knife_menu_title": "Knife 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" +} \ No newline at end of file diff --git a/lang/pl.json b/lang/pl.json new file mode 100644 index 00000000..b1ee5b00 --- /dev/null +++ b/lang/pl.json @@ -0,0 +1,14 @@ +{ + "wp_prefix": "{lightblue}[WeaponPaints] {default}", + "wp_info_website": "Odwiedź {lime}{0}{default} gdzie będziesz mógł ustawić skiny", + "wp_info_refresh": "Wpisz {lime}!wp{default} aby zsynchronizować swoje skiny", + "wp_info_knife": "Wpisz {lime}!knife{default} aby wy�wietlić menu no�y", + "wp_command_cooldown": "{lightred}Odczekaj chwilę przed wykonaniem tej komendy...", + "wp_command_refresh_done": "{lime}Pomyslnie zsynchronizowano twoje skiny", + "wp_knife_menu_select": "Wybrałeś {lime}{0}{default} jako swój nóż", + "wp_knife_menu_kill": "Do prawidłowego zastosowania noża użyj {lime}!kill{default}", + "wp_knife_menu_title": "Menu noży", + "wp_skin_menu_weapon_title": "Menu broni", + "wp_skin_menu_skin_title": "Wybierz skin dla {lime}{0}{default}", + "wp_skin_menu_select": "Wybrałeś {lime}{0}{default} jako swój skin" +} \ No newline at end of file diff --git a/lang/ru.json b/lang/ru.json new file mode 100644 index 00000000..f337dcea --- /dev/null +++ b/lang/ru.json @@ -0,0 +1,14 @@ +{ + "wp_prefix": "{lightblue}[WeaponPaints] {default}", + "wp_info_website": "Посетите сайт {lime}{0},{default} чтобы выбрать скин", + "wp_info_refresh": "Наберите в чат {lime}!wp{default} для синхронизации выбранных скинов", + "wp_info_knife": "Наберите в чат {lime}!knife,{default} чтобы выбрать нож", + "wp_command_cooldown": "{lightred}Вы не можете выбрать оружие прямо сейчас", + "wp_command_refresh_done": "{lime}Обновление скинов для оружия", + "wp_knife_menu_select": "Вы выбрали {lime}{0}{default} скин для ножа", + "wp_knife_menu_kill": "Чтобы правильно применить скин для ножа, набери в чат {lime}!kill{default}", + "wp_knife_menu_title": "Меню ножей", + "wp_skin_menu_weapon_title": "Меню оружия", + "wp_skin_menu_skin_title": "Выберите скин для {lime}{0}{default}", + "wp_skin_menu_select": "Вы выбрали {lime}{0}{default} скина для оружия" +} \ No newline at end of file