mirror of
https://github.com/Nereziel/cs2-WeaponPaints.git
synced 2026-02-18 10:43:22 +00:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d9adaa4cd5 | ||
|
|
c91141516e | ||
|
|
399a56be12 | ||
|
|
692fcc905a | ||
|
|
3c4f06c4e2 | ||
|
|
a5723a4462 | ||
|
|
e9f47e9237 | ||
|
|
e209b12829 | ||
|
|
c55a40ecb1 | ||
|
|
b6cac17197 | ||
|
|
683f9f2a1c | ||
|
|
a70e2f771e | ||
|
|
f4e6a4338d |
10
.github/workflows/build.yml
vendored
10
.github/workflows/build.yml
vendored
@@ -58,14 +58,8 @@ jobs:
|
|||||||
${{ env.OUTPUT_PATH }}/McMaster.NETCore.Plugins.dll \
|
${{ env.OUTPUT_PATH }}/McMaster.NETCore.Plugins.dll \
|
||||||
${{ env.OUTPUT_PATH }}/Microsoft.DotNet.PlatformAbstractions.dll \
|
${{ env.OUTPUT_PATH }}/Microsoft.DotNet.PlatformAbstractions.dll \
|
||||||
${{ env.OUTPUT_PATH }}/Microsoft.Extensions.DependencyModel.dll \
|
${{ env.OUTPUT_PATH }}/Microsoft.Extensions.DependencyModel.dll \
|
||||||
- name: Copy skins.json
|
- name: Copy skins
|
||||||
run: cp website/data/skins.json ${{ env.OUTPUT_PATH }}/skins.json
|
run: cp -R website/data ${{ env.OUTPUT_PATH }}
|
||||||
- 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: Copy music.json
|
|
||||||
run: cp website/data/music.json ${{ env.OUTPUT_PATH }}/music.json
|
|
||||||
- name: Zip
|
- name: Zip
|
||||||
run: zip -r "${{ env.PROJECT_NAME }}.zip" "${{ env.OUTPUT_PATH }}" gamedata/
|
run: zip -r "${{ env.PROJECT_NAME }}.zip" "${{ env.OUTPUT_PATH }}" gamedata/
|
||||||
- name: Clean files Website
|
- name: Clean files Website
|
||||||
|
|||||||
BIN
3rd_party/MenuManagerApi.dll
vendored
Normal file
BIN
3rd_party/MenuManagerApi.dll
vendored
Normal file
Binary file not shown.
418
Commands.cs
418
Commands.cs
@@ -1,5 +1,4 @@
|
|||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Core;
|
|
||||||
using CounterStrikeSharp.API.Modules.Commands;
|
using CounterStrikeSharp.API.Modules.Commands;
|
||||||
using CounterStrikeSharp.API.Modules.Menu;
|
using CounterStrikeSharp.API.Modules.Menu;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
@@ -10,7 +9,7 @@ namespace WeaponPaints
|
|||||||
{
|
{
|
||||||
private void OnCommandRefresh(CCSPlayerController? player, CommandInfo command)
|
private void OnCommandRefresh(CCSPlayerController? player, CommandInfo command)
|
||||||
{
|
{
|
||||||
if (!Config.Additional.CommandWpEnabled || !Config.Additional.SkinEnabled || !g_bCommandsAllowed) return;
|
if (!Config.Additional.CommandWpEnabled || !Config.Additional.SkinEnabled || !_gBCommandsAllowed) return;
|
||||||
if (!Utility.IsPlayerValid(player)) return;
|
if (!Utility.IsPlayerValid(player)) return;
|
||||||
|
|
||||||
if (player == null || !player.IsValid || player.UserId == null || player.IsBot) return;
|
if (player == null || !player.IsValid || player.UserId == null || player.IsBot) return;
|
||||||
@@ -27,14 +26,14 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (player != null && !commandsCooldown.TryGetValue(player.Slot, out var cooldownEndTime) ||
|
if (player != null && !CommandsCooldown.TryGetValue(player.Slot, out var cooldownEndTime) ||
|
||||||
player != null && DateTime.UtcNow >= (commandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow))
|
player != null && DateTime.UtcNow >= (CommandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow))
|
||||||
{
|
{
|
||||||
commandsCooldown[player.Slot] = DateTime.UtcNow.AddSeconds(Config.CmdRefreshCooldownSeconds);
|
CommandsCooldown[player.Slot] = DateTime.UtcNow.AddSeconds(Config.CmdRefreshCooldownSeconds);
|
||||||
|
|
||||||
if (weaponSync != null)
|
if (WeaponSync != null)
|
||||||
{
|
{
|
||||||
_ = Task.Run(async () => await weaponSync.GetPlayerData(playerInfo));
|
_ = Task.Run(async () => await WeaponSync.GetPlayerData(playerInfo));
|
||||||
|
|
||||||
GivePlayerGloves(player);
|
GivePlayerGloves(player);
|
||||||
RefreshWeapons(player);
|
RefreshWeapons(player);
|
||||||
@@ -42,7 +41,7 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
if (!string.IsNullOrEmpty(Localizer["wp_command_refresh_done"]))
|
if (!string.IsNullOrEmpty(Localizer["wp_command_refresh_done"]))
|
||||||
{
|
{
|
||||||
player!.Print(Localizer["wp_command_refresh_done"]);
|
player.Print(Localizer["wp_command_refresh_done"]);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -95,36 +94,48 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
private void RegisterCommands()
|
private void RegisterCommands()
|
||||||
{
|
{
|
||||||
AddCommand($"css_{Config.Additional.CommandSkin}", "Skins info", (player, info) =>
|
_config.Additional.CommandSkin.ForEach(c =>
|
||||||
{
|
{
|
||||||
if (!Utility.IsPlayerValid(player)) return;
|
AddCommand($"css_{c}", "Skins info", (player, info) =>
|
||||||
OnCommandWS(player, info);
|
{
|
||||||
|
if (!Utility.IsPlayerValid(player)) return;
|
||||||
|
OnCommandWS(player, info);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
AddCommand($"css_{Config.Additional.CommandRefresh}", "Skins refresh", (player, info) =>
|
|
||||||
|
_config.Additional.CommandRefresh.ForEach(c =>
|
||||||
{
|
{
|
||||||
if (!Utility.IsPlayerValid(player)) return;
|
AddCommand($"css_{c}", "Skins refresh", (player, info) =>
|
||||||
OnCommandRefresh(player, info);
|
{
|
||||||
|
if (!Utility.IsPlayerValid(player)) return;
|
||||||
|
OnCommandRefresh(player, info);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
if (Config.Additional.CommandKillEnabled)
|
if (Config.Additional.CommandKillEnabled)
|
||||||
{
|
{
|
||||||
AddCommand($"css_{Config.Additional.CommandKill}", "kill yourself", (player, info) =>
|
_config.Additional.CommandKill.ForEach(c =>
|
||||||
{
|
{
|
||||||
if (player == null || !Utility.IsPlayerValid(player) || player.PlayerPawn.Value == null || !player!.PlayerPawn.IsValid) return;
|
AddCommand($"css_{c}", "kill yourself", (player, _) =>
|
||||||
|
{
|
||||||
|
if (player == null || !Utility.IsPlayerValid(player) || player.PlayerPawn.Value == null || !player.PlayerPawn.IsValid) return;
|
||||||
|
|
||||||
player.PlayerPawn.Value.CommitSuicide(true, false);
|
player.PlayerPawn.Value.CommitSuicide(true, false);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetupKnifeMenu()
|
private void SetupKnifeMenu()
|
||||||
{
|
{
|
||||||
if (!Config.Additional.KnifeEnabled || !g_bCommandsAllowed) return;
|
if (!Config.Additional.KnifeEnabled || !_gBCommandsAllowed) return;
|
||||||
|
|
||||||
var knivesOnly = WeaponList
|
var knivesOnly = WeaponList
|
||||||
.Where(pair => pair.Key.StartsWith("weapon_knife") || pair.Key.StartsWith("weapon_bayonet"))
|
.Where(pair => pair.Key.StartsWith("weapon_knife") || pair.Key.StartsWith("weapon_bayonet"))
|
||||||
.ToDictionary(pair => pair.Key, pair => pair.Value);
|
.ToDictionary(pair => pair.Key, pair => pair.Value);
|
||||||
|
|
||||||
var giveItemMenu = new ChatMenu(Localizer["wp_knife_menu_title"]);
|
var giveItemMenu = MenuApi?.NewMenu(Localizer["wp_knife_menu_title"]);
|
||||||
|
|
||||||
var handleGive = (CCSPlayerController player, ChatMenuOption option) =>
|
var handleGive = (CCSPlayerController player, ChatMenuOption option) =>
|
||||||
{
|
{
|
||||||
if (!Utility.IsPlayerValid(player)) return;
|
if (!Utility.IsPlayerValid(player)) return;
|
||||||
@@ -134,12 +145,12 @@ namespace WeaponPaints
|
|||||||
if (string.IsNullOrEmpty(knifeKey)) return;
|
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]);
|
player.Print(Localizer["wp_knife_menu_select", knifeName]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(Localizer["wp_knife_menu_kill"]) && Config.Additional.CommandKillEnabled)
|
if (!string.IsNullOrEmpty(Localizer["wp_knife_menu_kill"]) && Config.Additional.CommandKillEnabled)
|
||||||
{
|
{
|
||||||
player!.Print(Localizer["wp_knife_menu_kill"]);
|
player.Print(Localizer["wp_knife_menu_kill"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayerInfo playerInfo = new PlayerInfo
|
PlayerInfo playerInfo = new PlayerInfo
|
||||||
@@ -152,43 +163,53 @@ namespace WeaponPaints
|
|||||||
IpAddress = player.IpAddress?.Split(":")[0]
|
IpAddress = player.IpAddress?.Split(":")[0]
|
||||||
};
|
};
|
||||||
|
|
||||||
g_playersKnife[player.Slot] = knifeKey;
|
GPlayersKnife[player.Slot] = knifeKey;
|
||||||
|
|
||||||
if (g_bCommandsAllowed && (LifeState_t)player.LifeState == LifeState_t.LIFE_ALIVE)
|
if (_gBCommandsAllowed && (LifeState_t)player.LifeState == LifeState_t.LIFE_ALIVE)
|
||||||
RefreshWeapons(player);
|
RefreshWeapons(player);
|
||||||
|
|
||||||
if (weaponSync != null)
|
if (WeaponSync != null)
|
||||||
_ = Task.Run(async () => await weaponSync.SyncKnifeToDatabase(playerInfo, knifeKey));
|
_ = Task.Run(async () => await WeaponSync.SyncKnifeToDatabase(playerInfo, knifeKey));
|
||||||
};
|
};
|
||||||
foreach (var knifePair in knivesOnly)
|
foreach (var knifePair in knivesOnly)
|
||||||
{
|
{
|
||||||
giveItemMenu.AddMenuOption(knifePair.Value, handleGive);
|
giveItemMenu?.AddMenuOption(knifePair.Value, handleGive);
|
||||||
}
|
}
|
||||||
AddCommand($"css_{Config.Additional.CommandKnife}", "Knife Menu", (player, info) =>
|
_config.Additional.CommandKnife.ForEach(c =>
|
||||||
{
|
{
|
||||||
if (!Utility.IsPlayerValid(player) || !g_bCommandsAllowed) return;
|
AddCommand($"css_{c}", "Knife Menu", (player, _) =>
|
||||||
|
|
||||||
if (player == null || player.UserId == null) return;
|
|
||||||
|
|
||||||
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);
|
if (giveItemMenu == null) return;
|
||||||
giveItemMenu.PostSelectAction = PostSelectAction.Close;
|
if (!Utility.IsPlayerValid(player) || !_gBCommandsAllowed) return;
|
||||||
MenuManager.OpenChatMenu(player, giveItemMenu);
|
|
||||||
return;
|
if (player == null || player.UserId == null) return;
|
||||||
}
|
|
||||||
if (!string.IsNullOrEmpty(Localizer["wp_command_cooldown"]))
|
if (!CommandsCooldown.TryGetValue(player.Slot, out var cooldownEndTime) ||
|
||||||
{
|
DateTime.UtcNow >= (CommandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow))
|
||||||
player!.Print(Localizer["wp_command_cooldown"]);
|
{
|
||||||
}
|
CommandsCooldown[player.Slot] = DateTime.UtcNow.AddSeconds(Config.CmdRefreshCooldownSeconds);
|
||||||
|
giveItemMenu.PostSelectAction = PostSelectAction.Close;
|
||||||
|
|
||||||
|
giveItemMenu.Open(player);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!string.IsNullOrEmpty(Localizer["wp_command_cooldown"]))
|
||||||
|
{
|
||||||
|
player.Print(Localizer["wp_command_cooldown"]);
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetupSkinsMenu()
|
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"]);
|
var classNamesByWeapon = WeaponList
|
||||||
|
.Except([new KeyValuePair<string, string>("weapon_knife", "Default Knife")])
|
||||||
|
.ToDictionary(kvp => kvp.Value, kvp => kvp.Key);
|
||||||
|
|
||||||
|
var weaponSelectionMenu = MenuApi?.NewMenu(Localizer["wp_skin_menu_weapon_title"]);
|
||||||
|
|
||||||
// Function to handle skin selection for a specific weapon
|
// Function to handle skin selection for a specific weapon
|
||||||
var handleWeaponSelection = (CCSPlayerController? player, ChatMenuOption option) =>
|
var handleWeaponSelection = (CCSPlayerController? player, ChatMenuOption option) =>
|
||||||
@@ -196,13 +217,14 @@ namespace WeaponPaints
|
|||||||
if (!Utility.IsPlayerValid(player)) return;
|
if (!Utility.IsPlayerValid(player)) return;
|
||||||
|
|
||||||
var selectedWeapon = option.Text;
|
var selectedWeapon = option.Text;
|
||||||
|
|
||||||
if (!classNamesByWeapon.TryGetValue(selectedWeapon, out var selectedWeaponClassname)) return;
|
if (!classNamesByWeapon.TryGetValue(selectedWeapon, out var selectedWeaponClassname)) return;
|
||||||
var skinsForSelectedWeapon = skinsList?.Where(skin =>
|
var skinsForSelectedWeapon = SkinsList?.Where(skin =>
|
||||||
skin.TryGetValue("weapon_name", out var weaponName) &&
|
skin.TryGetValue("weapon_name", out var weaponName) &&
|
||||||
weaponName?.ToString() == selectedWeaponClassname
|
weaponName?.ToString() == selectedWeaponClassname
|
||||||
)?.ToList();
|
)?.ToList();
|
||||||
|
|
||||||
var skinSubMenu = new ChatMenu(Localizer["wp_skin_menu_skin_title", selectedWeapon]);
|
var skinSubMenu = MenuApi?.NewMenu(Localizer["wp_skin_menu_skin_title", selectedWeapon]);
|
||||||
|
|
||||||
// Function to handle skin selection for the chosen weapon
|
// Function to handle skin selection for the chosen weapon
|
||||||
var handleSkinSelection = (CCSPlayerController p, ChatMenuOption opt) =>
|
var handleSkinSelection = (CCSPlayerController p, ChatMenuOption opt) =>
|
||||||
@@ -210,7 +232,7 @@ namespace WeaponPaints
|
|||||||
if (!Utility.IsPlayerValid(p)) return;
|
if (!Utility.IsPlayerValid(p)) return;
|
||||||
|
|
||||||
var steamId = p.SteamID.ToString();
|
var steamId = p.SteamID.ToString();
|
||||||
var firstSkin = skinsList?.FirstOrDefault(skin =>
|
var firstSkin = SkinsList?.FirstOrDefault(skin =>
|
||||||
{
|
{
|
||||||
if (skin.TryGetValue("weapon_name", out var weaponName))
|
if (skin.TryGetValue("weapon_name", out var weaponName))
|
||||||
{
|
{
|
||||||
@@ -227,24 +249,24 @@ namespace WeaponPaints
|
|||||||
!int.TryParse(weaponDefIndexObj.ToString(), out var weaponDefIndex) ||
|
!int.TryParse(weaponDefIndexObj.ToString(), out var weaponDefIndex) ||
|
||||||
!int.TryParse(selectedPaintId, out var paintId)) return;
|
!int.TryParse(selectedPaintId, out var paintId)) return;
|
||||||
{
|
{
|
||||||
if (Config.Additional.ShowSkinImage && skinsList != null)
|
if (Config.Additional.ShowSkinImage && SkinsList != null)
|
||||||
{
|
{
|
||||||
var foundSkin = skinsList.FirstOrDefault(skin =>
|
var foundSkin = SkinsList.FirstOrDefault(skin =>
|
||||||
((int?)skin?["weapon_defindex"] ?? 0) == weaponDefIndex &&
|
((int?)skin?["weapon_defindex"] ?? 0) == weaponDefIndex &&
|
||||||
((int?)skin?["paint"] ?? 0) == paintId &&
|
((int?)skin?["paint"] ?? 0) == paintId &&
|
||||||
skin?["image"] != null
|
skin?["image"] != null
|
||||||
);
|
);
|
||||||
var image = foundSkin?["image"]?.ToString() ?? "";
|
var image = foundSkin?["image"]?.ToString() ?? "";
|
||||||
PlayerWeaponImage[p.Slot] = image;
|
_playerWeaponImage[p.Slot] = image;
|
||||||
AddTimer(2.0f, () => PlayerWeaponImage.Remove(p.Slot), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
|
AddTimer(2.0f, () => _playerWeaponImage.Remove(p.Slot), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
p.Print(Localizer["wp_skin_menu_select", selectedSkin]);
|
p.Print(Localizer["wp_skin_menu_select", selectedSkin]);
|
||||||
|
|
||||||
if (!gPlayerWeaponsInfo[p.Slot].TryGetValue(weaponDefIndex, out var value))
|
if (!GPlayerWeaponsInfo[p.Slot].TryGetValue(weaponDefIndex, out var value))
|
||||||
{
|
{
|
||||||
value = new WeaponInfo();
|
value = new WeaponInfo();
|
||||||
gPlayerWeaponsInfo[p.Slot][weaponDefIndex] = value;
|
GPlayerWeaponsInfo[p.Slot][weaponDefIndex] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
value.Paint = paintId;
|
value.Paint = paintId;
|
||||||
@@ -261,13 +283,13 @@ namespace WeaponPaints
|
|||||||
IpAddress = p.IpAddress?.Split(":")[0]
|
IpAddress = p.IpAddress?.Split(":")[0]
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!g_bCommandsAllowed || (LifeState_t)p.LifeState != LifeState_t.LIFE_ALIVE ||
|
if (!_gBCommandsAllowed || (LifeState_t)p.LifeState != LifeState_t.LIFE_ALIVE ||
|
||||||
weaponSync == null) return;
|
WeaponSync == null) return;
|
||||||
RefreshWeapons(player);
|
RefreshWeapons(player);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_ = Task.Run(async () => await weaponSync.SyncWeaponPaintsToDatabase(playerInfo));
|
_ = Task.Run(async () => await WeaponSync.SyncWeaponPaintsToDatabase(playerInfo));
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -288,54 +310,59 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
if (!string.IsNullOrEmpty(paintName) && !string.IsNullOrEmpty(paint))
|
if (!string.IsNullOrEmpty(paintName) && !string.IsNullOrEmpty(paint))
|
||||||
{
|
{
|
||||||
skinSubMenu.AddMenuOption($"{paintName} ({paint})", handleSkinSelection);
|
skinSubMenu?.AddMenuOption($"{paintName} ({paint})", handleSkinSelection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (player != null && Utility.IsPlayerValid(player))
|
if (player != null && Utility.IsPlayerValid(player))
|
||||||
MenuManager.OpenChatMenu(player, skinSubMenu);
|
skinSubMenu?.Open(player);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Add weapon options to the weapon selection menu
|
// Add weapon options to the weapon selection menu
|
||||||
foreach (var weaponName in WeaponList.Keys.Select(weaponClass => WeaponList[weaponClass]))
|
foreach (var weaponName in WeaponList
|
||||||
{
|
.Where(kvp => kvp.Key != "weapon_knife")
|
||||||
weaponSelectionMenu.AddMenuOption(weaponName, handleWeaponSelection);
|
.Select(kvp => kvp.Value))
|
||||||
|
{
|
||||||
|
weaponSelectionMenu?.AddMenuOption(weaponName, handleWeaponSelection);
|
||||||
}
|
}
|
||||||
// Command to open the weapon selection menu for players
|
// Command to open the weapon selection menu for players
|
||||||
AddCommand($"css_{Config.Additional.CommandSkinSelection}", "Skins selection menu", (player, info) =>
|
|
||||||
|
_config.Additional.CommandSkinSelection.ForEach(c =>
|
||||||
|
{
|
||||||
|
AddCommand($"css_{c}", "Skins selection menu", (player, _) =>
|
||||||
|
{
|
||||||
|
if (!Utility.IsPlayerValid(player)) return;
|
||||||
|
|
||||||
|
if (player == null || player.UserId == null) return;
|
||||||
|
|
||||||
|
if (!CommandsCooldown.TryGetValue(player.Slot, out var cooldownEndTime) ||
|
||||||
|
DateTime.UtcNow >= (CommandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow))
|
||||||
{
|
{
|
||||||
if (!Utility.IsPlayerValid(player)) return;
|
CommandsCooldown[player.Slot] = DateTime.UtcNow.AddSeconds(Config.CmdRefreshCooldownSeconds);
|
||||||
|
weaponSelectionMenu?.Open(player);
|
||||||
if (player == null || player.UserId == null) return;
|
return;
|
||||||
|
}
|
||||||
if (!commandsCooldown.TryGetValue(player.Slot, out var cooldownEndTime) ||
|
if (!string.IsNullOrEmpty(Localizer["wp_command_cooldown"]))
|
||||||
DateTime.UtcNow >= (commandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow))
|
{
|
||||||
{
|
player.Print(Localizer["wp_command_cooldown"]);
|
||||||
commandsCooldown[player.Slot] = DateTime.UtcNow.AddSeconds(Config.CmdRefreshCooldownSeconds);
|
}
|
||||||
MenuManager.OpenChatMenu(player, weaponSelectionMenu);
|
});
|
||||||
return;
|
});
|
||||||
}
|
|
||||||
if (!string.IsNullOrEmpty(Localizer["wp_command_cooldown"]))
|
|
||||||
{
|
|
||||||
player!.Print(Localizer["wp_command_cooldown"]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetupGlovesMenu()
|
private void SetupGlovesMenu()
|
||||||
{
|
{
|
||||||
var glovesSelectionMenu = new ChatMenu(Localizer["wp_glove_menu_title"])
|
var glovesSelectionMenu = MenuApi?.NewMenu(Localizer["wp_glove_menu_title"]);
|
||||||
{
|
if (glovesSelectionMenu == null) return;
|
||||||
PostSelectAction = PostSelectAction.Close
|
glovesSelectionMenu.PostSelectAction = PostSelectAction.Close;
|
||||||
};
|
|
||||||
|
|
||||||
var handleGloveSelection = (CCSPlayerController? player, ChatMenuOption option) =>
|
var handleGloveSelection = (CCSPlayerController? player, ChatMenuOption option) =>
|
||||||
{
|
{
|
||||||
if (!Utility.IsPlayerValid(player) || player is null) return;
|
if (!Utility.IsPlayerValid(player) || player is null) return;
|
||||||
|
|
||||||
var selectedPaintName = option.Text;
|
var selectedPaintName = option.Text;
|
||||||
|
|
||||||
var selectedGlove = glovesList.FirstOrDefault(g => g.ContainsKey("paint_name") && g["paint_name"]?.ToString() == selectedPaintName);
|
var selectedGlove = GlovesList.FirstOrDefault(g => g.ContainsKey("paint_name") && g["paint_name"]?.ToString() == selectedPaintName);
|
||||||
var image = selectedGlove?["image"]?.ToString() ?? "";
|
var image = selectedGlove?["image"]?.ToString() ?? "";
|
||||||
if (selectedGlove == null ||
|
if (selectedGlove == null ||
|
||||||
!selectedGlove.ContainsKey("weapon_defindex") ||
|
!selectedGlove.ContainsKey("weapon_defindex") ||
|
||||||
@@ -344,8 +371,8 @@ namespace WeaponPaints
|
|||||||
!int.TryParse(selectedGlove["paint"]?.ToString(), out var paint)) return;
|
!int.TryParse(selectedGlove["paint"]?.ToString(), out var paint)) return;
|
||||||
if (Config.Additional.ShowSkinImage)
|
if (Config.Additional.ShowSkinImage)
|
||||||
{
|
{
|
||||||
PlayerWeaponImage[player.Slot] = image;
|
_playerWeaponImage[player.Slot] = image;
|
||||||
AddTimer(2.0f, () => PlayerWeaponImage.Remove(player.Slot), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
|
AddTimer(2.0f, () => _playerWeaponImage.Remove(player.Slot), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayerInfo playerInfo = new PlayerInfo
|
PlayerInfo playerInfo = new PlayerInfo
|
||||||
@@ -360,75 +387,78 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
if (paint != 0)
|
if (paint != 0)
|
||||||
{
|
{
|
||||||
g_playersGlove[player.Slot] = (ushort)weaponDefindex;
|
GPlayersGlove[player.Slot] = (ushort)weaponDefindex;
|
||||||
|
|
||||||
if (!gPlayerWeaponsInfo[player.Slot].ContainsKey(weaponDefindex))
|
if (!GPlayerWeaponsInfo[player.Slot].ContainsKey(weaponDefindex))
|
||||||
{
|
{
|
||||||
WeaponInfo weaponInfo = new()
|
WeaponInfo weaponInfo = new()
|
||||||
{
|
{
|
||||||
Paint = paint
|
Paint = paint
|
||||||
};
|
};
|
||||||
gPlayerWeaponsInfo[player.Slot][weaponDefindex] = weaponInfo;
|
GPlayerWeaponsInfo[player.Slot][weaponDefindex] = weaponInfo;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_playersGlove.TryRemove(player.Slot, out _);
|
GPlayersGlove.TryRemove(player.Slot, out _);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(Localizer["wp_glove_menu_select"]))
|
if (!string.IsNullOrEmpty(Localizer["wp_glove_menu_select"]))
|
||||||
{
|
{
|
||||||
player!.Print(Localizer["wp_glove_menu_select", selectedPaintName]);
|
player.Print(Localizer["wp_glove_menu_select", selectedPaintName]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (weaponSync == null) return;
|
if (WeaponSync == null) return;
|
||||||
|
|
||||||
_ = Task.Run(async () =>
|
_ = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
await weaponSync.SyncGloveToDatabase(playerInfo, weaponDefindex);
|
await WeaponSync.SyncGloveToDatabase(playerInfo, weaponDefindex);
|
||||||
|
|
||||||
if (!gPlayerWeaponsInfo[playerInfo.Slot].TryGetValue(weaponDefindex, out var value))
|
if (!GPlayerWeaponsInfo[playerInfo.Slot].TryGetValue(weaponDefindex, out var value))
|
||||||
{
|
{
|
||||||
value = new WeaponInfo();
|
value = new WeaponInfo();
|
||||||
gPlayerWeaponsInfo[playerInfo.Slot][weaponDefindex] = value;
|
GPlayerWeaponsInfo[playerInfo.Slot][weaponDefindex] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
value.Paint = paint;
|
value.Paint = paint;
|
||||||
value.Wear = 0.00f;
|
value.Wear = 0.00f;
|
||||||
value.Seed = 0;
|
value.Seed = 0;
|
||||||
|
|
||||||
await weaponSync.SyncWeaponPaintsToDatabase(playerInfo);
|
await WeaponSync.SyncWeaponPaintsToDatabase(playerInfo);
|
||||||
});
|
});
|
||||||
|
|
||||||
AddTimer(0.1f, () => GivePlayerGloves(player));
|
AddTimer(0.1f, () => GivePlayerGloves(player));
|
||||||
AddTimer(0.15f, () => GivePlayerGloves(player));
|
AddTimer(0.25f, () => GivePlayerGloves(player));
|
||||||
};
|
};
|
||||||
|
|
||||||
// Add weapon options to the weapon selection menu
|
// Add weapon options to the weapon selection menu
|
||||||
foreach (var paintName in glovesList.Select(gloveObject => gloveObject["paint_name"]?.ToString() ?? "").Where(paintName => paintName.Length > 0))
|
foreach (var paintName in GlovesList.Select(gloveObject => gloveObject["paint_name"]?.ToString() ?? "").Where(paintName => paintName.Length > 0))
|
||||||
{
|
{
|
||||||
glovesSelectionMenu.AddMenuOption(paintName, handleGloveSelection);
|
glovesSelectionMenu.AddMenuOption(paintName, handleGloveSelection);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Command to open the weapon selection menu for players
|
// Command to open the weapon selection menu for players
|
||||||
AddCommand($"css_{Config.Additional.CommandGlove}", "Gloves selection menu", (player, info) =>
|
_config.Additional.CommandGlove.ForEach(c =>
|
||||||
{
|
{
|
||||||
if (!Utility.IsPlayerValid(player) || !g_bCommandsAllowed) return;
|
AddCommand($"css_{c}", "Gloves selection menu", (player, info) =>
|
||||||
|
{
|
||||||
|
if (!Utility.IsPlayerValid(player) || !_gBCommandsAllowed) return;
|
||||||
|
|
||||||
if (player == null || player.UserId == null) return;
|
if (player == null || player.UserId == null) return;
|
||||||
|
|
||||||
if (!commandsCooldown.TryGetValue(player.Slot, out var cooldownEndTime) ||
|
if (!CommandsCooldown.TryGetValue(player.Slot, out var cooldownEndTime) ||
|
||||||
DateTime.UtcNow >= (commandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow))
|
DateTime.UtcNow >= (CommandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow))
|
||||||
{
|
{
|
||||||
commandsCooldown[player.Slot] = DateTime.UtcNow.AddSeconds(Config.CmdRefreshCooldownSeconds);
|
CommandsCooldown[player.Slot] = DateTime.UtcNow.AddSeconds(Config.CmdRefreshCooldownSeconds);
|
||||||
MenuManager.OpenChatMenu(player, glovesSelectionMenu);
|
glovesSelectionMenu?.Open(player);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!string.IsNullOrEmpty(Localizer["wp_command_cooldown"]))
|
if (!string.IsNullOrEmpty(Localizer["wp_command_cooldown"]))
|
||||||
{
|
{
|
||||||
player!.Print(Localizer["wp_command_cooldown"]);
|
player.Print(Localizer["wp_command_cooldown"]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetupAgentsMenu()
|
private void SetupAgentsMenu()
|
||||||
@@ -438,7 +468,7 @@ namespace WeaponPaints
|
|||||||
if (!Utility.IsPlayerValid(player) || player is null) return;
|
if (!Utility.IsPlayerValid(player) || player is null) return;
|
||||||
|
|
||||||
var selectedPaintName = option.Text;
|
var selectedPaintName = option.Text;
|
||||||
var selectedAgent = agentsList.FirstOrDefault(g =>
|
var selectedAgent = AgentsList.FirstOrDefault(g =>
|
||||||
g.ContainsKey("agent_name") &&
|
g.ContainsKey("agent_name") &&
|
||||||
g["agent_name"] != null && g["agent_name"]!.ToString() == selectedPaintName &&
|
g["agent_name"] != null && g["agent_name"]!.ToString() == selectedPaintName &&
|
||||||
g["team"] != null && (int)(g["team"]!) == player.TeamNum);
|
g["team"] != null && (int)(g["team"]!) == player.TeamNum);
|
||||||
@@ -462,93 +492,94 @@ namespace WeaponPaints
|
|||||||
if (Config.Additional.ShowSkinImage)
|
if (Config.Additional.ShowSkinImage)
|
||||||
{
|
{
|
||||||
var image = selectedAgent["image"]?.ToString() ?? "";
|
var image = selectedAgent["image"]?.ToString() ?? "";
|
||||||
PlayerWeaponImage[player.Slot] = image;
|
_playerWeaponImage[player.Slot] = image;
|
||||||
AddTimer(2.0f, () => PlayerWeaponImage.Remove(player.Slot), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
|
AddTimer(2.0f, () => _playerWeaponImage.Remove(player.Slot), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(Localizer["wp_agent_menu_select"]))
|
if (!string.IsNullOrEmpty(Localizer["wp_agent_menu_select"]))
|
||||||
{
|
{
|
||||||
player!.Print(Localizer["wp_agent_menu_select", selectedPaintName]);
|
player.Print(Localizer["wp_agent_menu_select", selectedPaintName]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player.TeamNum == 3)
|
if (player.TeamNum == 3)
|
||||||
{
|
{
|
||||||
g_playersAgent.AddOrUpdate(player.Slot,
|
GPlayersAgent.AddOrUpdate(player.Slot,
|
||||||
key => (selectedAgent["model"]!.ToString().Equals("null") ? null : selectedAgent["model"]!.ToString(), null),
|
key => (selectedAgent["model"]!.ToString().Equals("null") ? null : selectedAgent["model"]!.ToString(), null),
|
||||||
(key, oldValue) => (selectedAgent["model"]!.ToString().Equals("null") ? null : selectedAgent["model"]!.ToString(), oldValue.T));
|
(key, oldValue) => (selectedAgent["model"]!.ToString().Equals("null") ? null : selectedAgent["model"]!.ToString(), oldValue.T));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_playersAgent.AddOrUpdate(player.Slot,
|
GPlayersAgent.AddOrUpdate(player.Slot,
|
||||||
key => (null, selectedAgent["model"]!.ToString().Equals("null") ? null : selectedAgent["model"]!.ToString()),
|
key => (null, selectedAgent["model"]!.ToString().Equals("null") ? null : selectedAgent["model"]!.ToString()),
|
||||||
(key, oldValue) => (oldValue.CT, 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)
|
if (WeaponSync != null)
|
||||||
{
|
{
|
||||||
_ = Task.Run(async () =>
|
_ = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
await weaponSync.SyncAgentToDatabase(playerInfo);
|
await WeaponSync.SyncAgentToDatabase(playerInfo);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
// Command to open the weapon selection menu for players
|
// Command to open the weapon selection menu for players
|
||||||
AddCommand($"css_{Config.Additional.CommandAgent}", "Agents selection menu", (player, info) =>
|
_config.Additional.CommandAgent.ForEach(c =>
|
||||||
{
|
{
|
||||||
if (!Utility.IsPlayerValid(player) || !g_bCommandsAllowed) return;
|
AddCommand($"css_{c}", "Agents selection menu", (player, info) =>
|
||||||
|
|
||||||
if (player == null || player.UserId == null) return;
|
|
||||||
|
|
||||||
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"])
|
if (!Utility.IsPlayerValid(player) || !_gBCommandsAllowed) return;
|
||||||
{
|
|
||||||
PostSelectAction = PostSelectAction.Close
|
|
||||||
};
|
|
||||||
|
|
||||||
var filteredAgents = agentsList.Where(agentObject =>
|
if (player == null || player.UserId == null) return;
|
||||||
|
|
||||||
|
if (!CommandsCooldown.TryGetValue(player.Slot, out DateTime cooldownEndTime) ||
|
||||||
|
DateTime.UtcNow >= (CommandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow))
|
||||||
{
|
{
|
||||||
if (agentObject["team"]?.Value<int>() is { } teamNum)
|
var agentsSelectionMenu = MenuApi?.NewMenu(Localizer["wp_agent_menu_title"]);
|
||||||
|
if (agentsSelectionMenu == null) return;
|
||||||
|
agentsSelectionMenu.PostSelectAction = PostSelectAction.Close;
|
||||||
|
|
||||||
|
var filteredAgents = AgentsList.Where(agentObject =>
|
||||||
{
|
{
|
||||||
return teamNum == player.TeamNum;
|
if (agentObject["team"]?.Value<int>() is { } teamNum)
|
||||||
}
|
{
|
||||||
else
|
return teamNum == player.TeamNum;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add weapon options to the weapon selection menu
|
||||||
|
|
||||||
|
foreach (var agentObject in filteredAgents)
|
||||||
{
|
{
|
||||||
return false;
|
var paintName = agentObject["agent_name"]?.ToString() ?? "";
|
||||||
|
|
||||||
|
if (paintName.Length > 0)
|
||||||
|
agentsSelectionMenu.AddMenuOption(paintName, handleAgentSelection);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
// Add weapon options to the weapon selection menu
|
CommandsCooldown[player.Slot] = DateTime.UtcNow.AddSeconds(Config.CmdRefreshCooldownSeconds);
|
||||||
|
agentsSelectionMenu.Open(player);
|
||||||
foreach (var agentObject in filteredAgents)
|
return;
|
||||||
{
|
|
||||||
var paintName = agentObject["agent_name"]?.ToString() ?? "";
|
|
||||||
|
|
||||||
if (paintName.Length > 0)
|
|
||||||
agentsSelectionMenu.AddMenuOption(paintName, handleAgentSelection);
|
|
||||||
}
|
}
|
||||||
|
if (!string.IsNullOrEmpty(Localizer["wp_command_cooldown"]))
|
||||||
commandsCooldown[player.Slot] = DateTime.UtcNow.AddSeconds(Config.CmdRefreshCooldownSeconds);
|
{
|
||||||
MenuManager.OpenChatMenu(player, agentsSelectionMenu);
|
player.Print(Localizer["wp_command_cooldown"]);
|
||||||
return;
|
}
|
||||||
}
|
});
|
||||||
if (!string.IsNullOrEmpty(Localizer["wp_command_cooldown"]))
|
});
|
||||||
{
|
|
||||||
player!.Print(Localizer["wp_command_cooldown"]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetupMusicMenu()
|
private void SetupMusicMenu()
|
||||||
{
|
{
|
||||||
var musicSelectionMenu = new ChatMenu(Localizer["wp_music_menu_title"])
|
var musicSelectionMenu = MenuApi?.NewMenu(Localizer["wp_music_menu_title"]);
|
||||||
{
|
if (musicSelectionMenu == null) return;
|
||||||
PostSelectAction = PostSelectAction.Close
|
musicSelectionMenu.PostSelectAction = PostSelectAction.Close;
|
||||||
};
|
|
||||||
|
|
||||||
var handleMusicSelection = (CCSPlayerController? player, ChatMenuOption option) =>
|
var handleMusicSelection = (CCSPlayerController? player, ChatMenuOption option) =>
|
||||||
{
|
{
|
||||||
@@ -556,7 +587,7 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
var selectedPaintName = option.Text;
|
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() == selectedPaintName);
|
||||||
if (selectedMusic != null)
|
if (selectedMusic != null)
|
||||||
{
|
{
|
||||||
if (!selectedMusic.ContainsKey("id") ||
|
if (!selectedMusic.ContainsKey("id") ||
|
||||||
@@ -565,8 +596,8 @@ namespace WeaponPaints
|
|||||||
var image = selectedMusic["image"]?.ToString() ?? "";
|
var image = selectedMusic["image"]?.ToString() ?? "";
|
||||||
if (Config.Additional.ShowSkinImage)
|
if (Config.Additional.ShowSkinImage)
|
||||||
{
|
{
|
||||||
PlayerWeaponImage[player.Slot] = image;
|
_playerWeaponImage[player.Slot] = image;
|
||||||
AddTimer(2.0f, () => PlayerWeaponImage.Remove(player.Slot), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
|
AddTimer(2.0f, () => _playerWeaponImage.Remove(player.Slot), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
PlayerInfo playerInfo = new PlayerInfo
|
PlayerInfo playerInfo = new PlayerInfo
|
||||||
@@ -581,23 +612,23 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
if (paint != 0)
|
if (paint != 0)
|
||||||
{
|
{
|
||||||
g_playersMusic[player.Slot] = (ushort)paint;
|
GPlayersMusic[player.Slot] = (ushort)paint;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_playersMusic[player.Slot] = 0;
|
GPlayersMusic[player.Slot] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(Localizer["wp_music_menu_select"]))
|
if (!string.IsNullOrEmpty(Localizer["wp_music_menu_select"]))
|
||||||
{
|
{
|
||||||
player!.Print(Localizer["wp_music_menu_select", selectedPaintName]);
|
player.Print(Localizer["wp_music_menu_select", selectedPaintName]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (weaponSync != null)
|
if (WeaponSync != null)
|
||||||
{
|
{
|
||||||
_ = Task.Run(async () =>
|
_ = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
await weaponSync.SyncMusicToDatabase(playerInfo, (ushort)paint);
|
await WeaponSync.SyncMusicToDatabase(playerInfo, (ushort)paint);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -615,18 +646,18 @@ namespace WeaponPaints
|
|||||||
IpAddress = player.IpAddress?.Split(":")[0]
|
IpAddress = player.IpAddress?.Split(":")[0]
|
||||||
};
|
};
|
||||||
|
|
||||||
g_playersMusic[player.Slot] = 0;
|
GPlayersMusic[player.Slot] = 0;
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(Localizer["wp_music_menu_select"]))
|
if (!string.IsNullOrEmpty(Localizer["wp_music_menu_select"]))
|
||||||
{
|
{
|
||||||
player!.Print(Localizer["wp_music_menu_select", Localizer["None"]]);
|
player.Print(Localizer["wp_music_menu_select", Localizer["None"]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (weaponSync != null)
|
if (WeaponSync != null)
|
||||||
{
|
{
|
||||||
_ = Task.Run(async () =>
|
_ = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
await weaponSync.SyncMusicToDatabase(playerInfo, 0);
|
await WeaponSync.SyncMusicToDatabase(playerInfo, 0);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -634,29 +665,32 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
musicSelectionMenu.AddMenuOption(Localizer["None"], handleMusicSelection);
|
musicSelectionMenu.AddMenuOption(Localizer["None"], handleMusicSelection);
|
||||||
// Add weapon options to the weapon selection menu
|
// Add weapon options to the weapon selection menu
|
||||||
foreach (var paintName in musicList.Select(musicObject => musicObject["name"]?.ToString() ?? "").Where(paintName => paintName.Length > 0))
|
foreach (var paintName in MusicList.Select(musicObject => musicObject["name"]?.ToString() ?? "").Where(paintName => paintName.Length > 0))
|
||||||
{
|
{
|
||||||
musicSelectionMenu.AddMenuOption(paintName, handleMusicSelection);
|
musicSelectionMenu.AddMenuOption(paintName, handleMusicSelection);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Command to open the weapon selection menu for players
|
// Command to open the weapon selection menu for players
|
||||||
AddCommand($"css_{Config.Additional.CommandMusic}", "Music selection menu", (player, info) =>
|
_config.Additional.CommandMusic.ForEach(c =>
|
||||||
{
|
{
|
||||||
if (!Utility.IsPlayerValid(player) || !g_bCommandsAllowed) return;
|
AddCommand($"css_{c}", "Music selection menu", (player, info) =>
|
||||||
|
|
||||||
if (player == null || player.UserId == null) return;
|
|
||||||
|
|
||||||
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);
|
if (!Utility.IsPlayerValid(player) || !_gBCommandsAllowed) return;
|
||||||
MenuManager.OpenChatMenu(player, musicSelectionMenu);
|
|
||||||
return;
|
if (player == null || player.UserId == null) return;
|
||||||
}
|
|
||||||
if (!string.IsNullOrEmpty(Localizer["wp_command_cooldown"]))
|
if (!CommandsCooldown.TryGetValue(player.Slot, out var cooldownEndTime) ||
|
||||||
{
|
DateTime.UtcNow >= (CommandsCooldown.TryGetValue(player.Slot, out cooldownEndTime) ? cooldownEndTime : DateTime.UtcNow))
|
||||||
player!.Print(Localizer["wp_command_cooldown"]);
|
{
|
||||||
}
|
CommandsCooldown[player.Slot] = DateTime.UtcNow.AddSeconds(Config.CmdRefreshCooldownSeconds);
|
||||||
|
musicSelectionMenu.Open(player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!string.IsNullOrEmpty(Localizer["wp_command_cooldown"]))
|
||||||
|
{
|
||||||
|
player.Print(Localizer["wp_command_cooldown"]);
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
28
Config.cs
28
Config.cs
@@ -27,28 +27,28 @@ namespace WeaponPaints
|
|||||||
public bool CommandKillEnabled { get; set; } = true;
|
public bool CommandKillEnabled { get; set; } = true;
|
||||||
|
|
||||||
[JsonPropertyName("CommandKnife")]
|
[JsonPropertyName("CommandKnife")]
|
||||||
public string CommandKnife { get; set; } = "knife";
|
public List<string> CommandKnife { get; set; } = ["knife"];
|
||||||
|
|
||||||
[JsonPropertyName("CommandMusic")]
|
[JsonPropertyName("CommandMusic")]
|
||||||
public string CommandMusic { get; set; } = "music";
|
public List<string> CommandMusic { get; set; } = ["music"];
|
||||||
|
|
||||||
[JsonPropertyName("CommandGlove")]
|
[JsonPropertyName("CommandGlove")]
|
||||||
public string CommandGlove { get; set; } = "gloves";
|
public List<string> CommandGlove { get; set; } = ["gloves"];
|
||||||
|
|
||||||
[JsonPropertyName("CommandAgent")]
|
[JsonPropertyName("CommandAgent")]
|
||||||
public string CommandAgent { get; set; } = "agents";
|
public List<string> CommandAgent { get; set; } = ["agents"];
|
||||||
|
|
||||||
[JsonPropertyName("CommandSkin")]
|
[JsonPropertyName("CommandSkin")]
|
||||||
public string CommandSkin { get; set; } = "ws";
|
public List<string> CommandSkin { get; set; } = ["ws"];
|
||||||
|
|
||||||
[JsonPropertyName("CommandSkinSelection")]
|
[JsonPropertyName("CommandSkinSelection")]
|
||||||
public string CommandSkinSelection { get; set; } = "skins";
|
public List<string> CommandSkinSelection { get; set; } = ["skins"];
|
||||||
|
|
||||||
[JsonPropertyName("CommandRefresh")]
|
[JsonPropertyName("CommandRefresh")]
|
||||||
public string CommandRefresh { get; set; } = "wp";
|
public List<string> CommandRefresh { get; set; } = ["wp"];
|
||||||
|
|
||||||
[JsonPropertyName("CommandKill")]
|
[JsonPropertyName("CommandKill")]
|
||||||
public string CommandKill { get; set; } = "kill";
|
public List<string> CommandKill { get; set; } = ["kill"];
|
||||||
|
|
||||||
[JsonPropertyName("GiveRandomKnife")]
|
[JsonPropertyName("GiveRandomKnife")]
|
||||||
public bool GiveRandomKnife { get; set; } = false;
|
public bool GiveRandomKnife { get; set; } = false;
|
||||||
@@ -62,7 +62,10 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
public class WeaponPaintsConfig : BasePluginConfig
|
public class WeaponPaintsConfig : BasePluginConfig
|
||||||
{
|
{
|
||||||
public override int Version { get; set; } = 6;
|
[JsonPropertyName("ConfigVersion")] public override int Version { get; set; } = 7;
|
||||||
|
|
||||||
|
[JsonPropertyName("SkinsLanguage")]
|
||||||
|
public string SkinsLanguage { get; set; } = "en";
|
||||||
|
|
||||||
[JsonPropertyName("DatabaseHost")]
|
[JsonPropertyName("DatabaseHost")]
|
||||||
public string DatabaseHost { get; set; } = "";
|
public string DatabaseHost { get; set; } = "";
|
||||||
@@ -80,15 +83,12 @@ namespace WeaponPaints
|
|||||||
public string DatabaseName { get; set; } = "";
|
public string DatabaseName { get; set; } = "";
|
||||||
|
|
||||||
[JsonPropertyName("CmdRefreshCooldownSeconds")]
|
[JsonPropertyName("CmdRefreshCooldownSeconds")]
|
||||||
public int CmdRefreshCooldownSeconds { get; set; } = 60;
|
public int CmdRefreshCooldownSeconds { get; set; } = 10;
|
||||||
|
|
||||||
[JsonPropertyName("Prefix")]
|
|
||||||
public string Prefix { get; set; } = "[WeaponPaints]";
|
|
||||||
|
|
||||||
[JsonPropertyName("Website")]
|
[JsonPropertyName("Website")]
|
||||||
public string Website { get; set; } = "example.com/skins";
|
public string Website { get; set; } = "example.com/skins";
|
||||||
|
|
||||||
[JsonPropertyName("Additional")]
|
[JsonPropertyName("Additionalss")]
|
||||||
public Additional Additional { get; set; } = new();
|
public Additional Additional { get; set; } = new();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,13 +5,11 @@ namespace WeaponPaints
|
|||||||
{
|
{
|
||||||
public class Database(string dbConnectionString)
|
public class Database(string dbConnectionString)
|
||||||
{
|
{
|
||||||
private readonly string _dbConnectionString = dbConnectionString;
|
|
||||||
|
|
||||||
public async Task<MySqlConnection> GetConnectionAsync()
|
public async Task<MySqlConnection> GetConnectionAsync()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var connection = new MySqlConnection(_dbConnectionString);
|
var connection = new MySqlConnection(dbConnectionString);
|
||||||
await connection.OpenAsync();
|
await connection.OpenAsync();
|
||||||
return connection;
|
return connection;
|
||||||
}
|
}
|
||||||
|
|||||||
43
Events.cs
43
Events.cs
@@ -16,9 +16,9 @@ namespace WeaponPaints
|
|||||||
CCSPlayerController? player = @event.Userid;
|
CCSPlayerController? player = @event.Userid;
|
||||||
|
|
||||||
if (player is null || !player.IsValid || player.IsBot ||
|
if (player is null || !player.IsValid || player.IsBot ||
|
||||||
weaponSync == null || _database == null) return HookResult.Continue;
|
WeaponSync == null || Database == null) return HookResult.Continue;
|
||||||
|
|
||||||
PlayerInfo playerInfo = new PlayerInfo
|
var playerInfo = new PlayerInfo
|
||||||
{
|
{
|
||||||
UserId = player.UserId,
|
UserId = player.UserId,
|
||||||
Slot = player.Slot,
|
Slot = player.Slot,
|
||||||
@@ -30,7 +30,7 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_ = Task.Run(async () => await weaponSync.GetPlayerData(playerInfo));
|
_ = Task.Run(async () => await WeaponSync.GetPlayerData(playerInfo));
|
||||||
/*
|
/*
|
||||||
if (Config.Additional.SkinEnabled)
|
if (Config.Additional.SkinEnabled)
|
||||||
{
|
{
|
||||||
@@ -70,26 +70,28 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
if (Config.Additional.SkinEnabled)
|
if (Config.Additional.SkinEnabled)
|
||||||
{
|
{
|
||||||
gPlayerWeaponsInfo.TryRemove(player.Slot, out _);
|
GPlayerWeaponsInfo.TryRemove(player.Slot, out _);
|
||||||
}
|
}
|
||||||
if (Config.Additional.KnifeEnabled)
|
if (Config.Additional.KnifeEnabled)
|
||||||
{
|
{
|
||||||
g_playersKnife.TryRemove(player.Slot, out _);
|
GPlayersKnife.TryRemove(player.Slot, out _);
|
||||||
}
|
}
|
||||||
if (Config.Additional.GloveEnabled)
|
if (Config.Additional.GloveEnabled)
|
||||||
{
|
{
|
||||||
g_playersGlove.TryRemove(player.Slot, out _);
|
GPlayersGlove.TryRemove(player.Slot, out _);
|
||||||
}
|
}
|
||||||
if (Config.Additional.AgentEnabled)
|
if (Config.Additional.AgentEnabled)
|
||||||
{
|
{
|
||||||
g_playersAgent.TryRemove(player.Slot, out _);
|
GPlayersAgent.TryRemove(player.Slot, out _);
|
||||||
}
|
}
|
||||||
if (Config.Additional.MusicEnabled)
|
if (Config.Additional.MusicEnabled)
|
||||||
{
|
{
|
||||||
g_playersMusic.TryRemove(player.Slot, out _);
|
GPlayersMusic.TryRemove(player.Slot, out _);
|
||||||
}
|
}
|
||||||
|
|
||||||
commandsCooldown.Remove(player.Slot);
|
_temporaryPlayerWeaponWear.TryRemove(player.Slot, out _);
|
||||||
|
|
||||||
|
CommandsCooldown.Remove(player.Slot);
|
||||||
|
|
||||||
return HookResult.Continue;
|
return HookResult.Continue;
|
||||||
}
|
}
|
||||||
@@ -98,8 +100,8 @@ namespace WeaponPaints
|
|||||||
{
|
{
|
||||||
if (Config.Additional is { KnifeEnabled: false, SkinEnabled: false, GloveEnabled: false }) return;
|
if (Config.Additional is { KnifeEnabled: false, SkinEnabled: false, GloveEnabled: false }) return;
|
||||||
|
|
||||||
if (_database != null)
|
if (Database != null)
|
||||||
weaponSync = new WeaponSynchronization(_database, Config);
|
WeaponSync = new WeaponSynchronization(Database, Config);
|
||||||
}
|
}
|
||||||
|
|
||||||
private HookResult OnPlayerSpawn(EventPlayerSpawn @event, GameEventInfo info)
|
private HookResult OnPlayerSpawn(EventPlayerSpawn @event, GameEventInfo info)
|
||||||
@@ -114,8 +116,6 @@ namespace WeaponPaints
|
|||||||
if (pawn == null || !pawn.IsValid)
|
if (pawn == null || !pawn.IsValid)
|
||||||
return HookResult.Continue;
|
return HookResult.Continue;
|
||||||
|
|
||||||
g_knifePickupCount[player.Slot] = 0;
|
|
||||||
|
|
||||||
GivePlayerMusicKit(player);
|
GivePlayerMusicKit(player);
|
||||||
GivePlayerAgent(player);
|
GivePlayerAgent(player);
|
||||||
GivePlayerGloves(player);
|
GivePlayerGloves(player);
|
||||||
@@ -125,14 +125,14 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
private HookResult OnRoundEnd(EventRoundEnd @event, GameEventInfo info)
|
private HookResult OnRoundEnd(EventRoundEnd @event, GameEventInfo info)
|
||||||
{
|
{
|
||||||
g_bCommandsAllowed = false;
|
_gBCommandsAllowed = false;
|
||||||
|
|
||||||
return HookResult.Continue;
|
return HookResult.Continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo info)
|
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo info)
|
||||||
{
|
{
|
||||||
g_bCommandsAllowed = true;
|
_gBCommandsAllowed = true;
|
||||||
return HookResult.Continue;
|
return HookResult.Continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,16 +167,16 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
SteamID? _steamid = null;
|
SteamID? steamid = null;
|
||||||
|
|
||||||
if (weapon.OriginalOwnerXuidLow > 0)
|
if (weapon.OriginalOwnerXuidLow > 0)
|
||||||
_steamid = new(weapon.OriginalOwnerXuidLow);
|
steamid = new SteamID(weapon.OriginalOwnerXuidLow);
|
||||||
|
|
||||||
CCSPlayerController? player = null;
|
CCSPlayerController? player;
|
||||||
|
|
||||||
if (_steamid != null && _steamid.IsValid())
|
if (steamid != null && steamid.IsValid())
|
||||||
{
|
{
|
||||||
player = Utilities.GetPlayers().FirstOrDefault(p => p.IsValid && p.SteamID == _steamid.SteamId64);
|
player = Utilities.GetPlayers().FirstOrDefault(p => p.IsValid && p.SteamID == steamid.SteamId64);
|
||||||
|
|
||||||
if (player == null)
|
if (player == null)
|
||||||
player = Utilities.GetPlayerFromSteamId(weapon.OriginalOwnerXuidLow);
|
player = Utilities.GetPlayerFromSteamId(weapon.OriginalOwnerXuidLow);
|
||||||
@@ -194,7 +194,6 @@ namespace WeaponPaints
|
|||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
{
|
{
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -211,7 +210,7 @@ namespace WeaponPaints
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (PlayerWeaponImage.TryGetValue(player.Slot, out var value) && !string.IsNullOrEmpty(value))
|
if (_playerWeaponImage.TryGetValue(player.Slot, out var value) && !string.IsNullOrEmpty(value))
|
||||||
{
|
{
|
||||||
player.PrintToCenterHtml("<img src='{PATH}'</img>".Replace("{PATH}", value));
|
player.PrintToCenterHtml("<img src='{PATH}'</img>".Replace("{PATH}", value));
|
||||||
}
|
}
|
||||||
|
|||||||
13
README.md
13
README.md
@@ -19,12 +19,21 @@ Unfinished, unoptimized and not fully functional ugly demo weapon paints plugin
|
|||||||
- Added command **`!agents`** to show menu with agents
|
- Added command **`!agents`** to show menu with agents
|
||||||
- Translations support, submit a PR if you want to share your translation
|
- Translations support, submit a PR if you want to share your translation
|
||||||
|
|
||||||
|
## ⚙️ Requirements
|
||||||
|
**Ensure all the following dependencies are installed before proceeding**
|
||||||
|
- [CounterStrikeSharp](https://github.com/roflmuffin/CounterStrikeSharp)
|
||||||
|
- [PlayerSettings](https://github.com/NickFox007/PlayerSettingsCS2) - Required by MenuManagerCS2
|
||||||
|
- [AnyBaseLibCS2](https://github.com/NickFox007/AnyBaseLibCS2) - Required by PlayerSettings
|
||||||
|
- [MenuManagerCS2](https://github.com/NickFox007/MenuManagerCS2)
|
||||||
|
- MySQL database
|
||||||
|
|
||||||
## CS2 Server
|
## CS2 Server
|
||||||
- Have working CounterStrikeSharp (**with RUNTIME!**)
|
- Have working CounterStrikeSharp (**with RUNTIME!**)
|
||||||
- Download from Release and copy plugin to plugins
|
- Download from Release and copy plugin to plugins
|
||||||
- Run server with plugin, **it will generate config if installed correctly!**
|
- Run server with plugin, **it will generate config if installed correctly!**
|
||||||
- Edit `addons/counterstrikesharp/configs/`**`plugins/WeaponPaints/WeaponPaints.json`** include database credentials
|
- Edit `addons/counterstrikesharp/configs/`**`plugins/WeaponPaints/WeaponPaints.json`** include database credentials
|
||||||
- In `addons/counterstrikesharp/configs/`**`core.json`** set **FollowCS2ServerGuidelines** to **`false`**
|
- In `addons/counterstrikesharp/configs/`**`core.json`** set **FollowCS2ServerGuidelines** to **`false`**
|
||||||
|
- Copy from plugins folder gamedata file **`weaponpaints.json`** to folder **`addons/counterstrikesharp/gamedata/`**
|
||||||
|
|
||||||
## Plugin Configuration
|
## Plugin Configuration
|
||||||
<details>
|
<details>
|
||||||
@@ -65,9 +74,7 @@ Unfinished, unoptimized and not fully functional ugly demo weapon paints plugin
|
|||||||
"GiveRandomKnife": false, // Give random knife to players if they didn't choose
|
"GiveRandomKnife": false, // Give random knife to players if they didn't choose
|
||||||
"GiveRandomSkins": false // Give random skins to players if they didn't choose
|
"GiveRandomSkins": false // Give random skins to players if they didn't choose
|
||||||
},
|
},
|
||||||
|
</pre></code>
|
||||||
"ConfigVersion": 4 // Don't touch
|
|
||||||
}</pre></code>
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## Web install
|
## Web install
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
using CounterStrikeSharp.API;
|
|
||||||
using CounterStrikeSharp.API.Modules.Memory;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace WeaponPaints;
|
|
||||||
|
|
||||||
public class SchemaString<TSchemaClass> : NativeObject where TSchemaClass : NativeObject
|
|
||||||
{
|
|
||||||
internal SchemaString(TSchemaClass instance, string member) : base(Schema.GetSchemaValue<nint>(instance.Handle, typeof(TSchemaClass).Name!, member))
|
|
||||||
{ }
|
|
||||||
|
|
||||||
internal unsafe void Set(string str)
|
|
||||||
{
|
|
||||||
var bytes = Encoding.UTF8.GetBytes(str);
|
|
||||||
|
|
||||||
for (var i = 0; i < bytes.Length; i++)
|
|
||||||
{
|
|
||||||
Unsafe.Write((void*)(Handle.ToInt64() + i), bytes[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
Unsafe.Write((void*)(Handle.ToInt64() + bytes.Length), 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
23
Utility.cs
23
Utility.cs
@@ -13,11 +13,11 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
internal static async Task CheckDatabaseTables()
|
internal static async Task CheckDatabaseTables()
|
||||||
{
|
{
|
||||||
if (WeaponPaints._database is null) return;
|
if (WeaponPaints.Database is null) return;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await using var connection = await WeaponPaints._database.GetConnectionAsync();
|
await using var connection = await WeaponPaints.Database.GetConnectionAsync();
|
||||||
|
|
||||||
await using var transaction = await connection.BeginTransactionAsync();
|
await using var transaction = await connection.BeginTransactionAsync();
|
||||||
|
|
||||||
@@ -31,7 +31,14 @@ namespace WeaponPaints
|
|||||||
`weapon_defindex` int(6) NOT NULL,
|
`weapon_defindex` int(6) NOT NULL,
|
||||||
`weapon_paint_id` int(6) NOT NULL,
|
`weapon_paint_id` int(6) NOT NULL,
|
||||||
`weapon_wear` float NOT NULL DEFAULT 0.000001,
|
`weapon_wear` float NOT NULL DEFAULT 0.000001,
|
||||||
`weapon_seed` int(16) NOT NULL DEFAULT 0
|
`weapon_seed` int(16) NOT NULL DEFAULT 0,
|
||||||
|
`weapon_nametag` VARCHAR(128) DEFAULT NULL,
|
||||||
|
`weapon_sticker_0` VARCHAR(128) NOT NULL DEFAULT '0;0;0;0;0;0;0' COMMENT 'id;schema;x;y;wear;scale;rotation',
|
||||||
|
`weapon_sticker_1` VARCHAR(128) NOT NULL DEFAULT '0;0;0;0;0;0;0' COMMENT 'id;schema;x;y;wear;scale;rotation',
|
||||||
|
`weapon_sticker_2` VARCHAR(128) NOT NULL DEFAULT '0;0;0;0;0;0;0' COMMENT 'id;schema;x;y;wear;scale;rotation',
|
||||||
|
`weapon_sticker_3` VARCHAR(128) NOT NULL DEFAULT '0;0;0;0;0;0;0' COMMENT 'id;schema;x;y;wear;scale;rotation',
|
||||||
|
`weapon_sticker_4` VARCHAR(128) NOT NULL DEFAULT '0;0;0;0;0;0;0' COMMENT 'id;schema;x;y;wear;scale;rotation',
|
||||||
|
`weapon_keychain`VARCHAR(128) NOT NULL DEFAULT '0;0;0;0;0' COMMENT 'id;x;y;z;seed'
|
||||||
) ENGINE=InnoDB
|
) ENGINE=InnoDB
|
||||||
""",
|
""",
|
||||||
@"CREATE TABLE IF NOT EXISTS `wp_player_knife` (
|
@"CREATE TABLE IF NOT EXISTS `wp_player_knife` (
|
||||||
@@ -84,7 +91,7 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
internal static bool IsPlayerValid(CCSPlayerController? player)
|
internal static bool IsPlayerValid(CCSPlayerController? player)
|
||||||
{
|
{
|
||||||
if (player is null || WeaponPaints.weaponSync is null) return false;
|
if (player is null || WeaponPaints.WeaponSync is null) return false;
|
||||||
|
|
||||||
return player is { IsValid: true, IsBot: false, IsHLTV: false, UserId: not null };
|
return player is { IsValid: true, IsBot: false, IsHLTV: false, UserId: not null };
|
||||||
}
|
}
|
||||||
@@ -95,7 +102,7 @@ namespace WeaponPaints
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var deserializedSkins = JsonConvert.DeserializeObject<List<JObject>>(json);
|
var deserializedSkins = JsonConvert.DeserializeObject<List<JObject>>(json);
|
||||||
WeaponPaints.skinsList = deserializedSkins ?? [];
|
WeaponPaints.SkinsList = deserializedSkins ?? [];
|
||||||
}
|
}
|
||||||
catch (FileNotFoundException)
|
catch (FileNotFoundException)
|
||||||
{
|
{
|
||||||
@@ -109,7 +116,7 @@ namespace WeaponPaints
|
|||||||
{
|
{
|
||||||
var json = File.ReadAllText(filePath);
|
var json = File.ReadAllText(filePath);
|
||||||
var deserializedSkins = JsonConvert.DeserializeObject<List<JObject>>(json);
|
var deserializedSkins = JsonConvert.DeserializeObject<List<JObject>>(json);
|
||||||
WeaponPaints.glovesList = deserializedSkins ?? [];
|
WeaponPaints.GlovesList = deserializedSkins ?? [];
|
||||||
}
|
}
|
||||||
catch (FileNotFoundException)
|
catch (FileNotFoundException)
|
||||||
{
|
{
|
||||||
@@ -123,7 +130,7 @@ namespace WeaponPaints
|
|||||||
{
|
{
|
||||||
var json = File.ReadAllText(filePath);
|
var json = File.ReadAllText(filePath);
|
||||||
var deserializedSkins = JsonConvert.DeserializeObject<List<JObject>>(json);
|
var deserializedSkins = JsonConvert.DeserializeObject<List<JObject>>(json);
|
||||||
WeaponPaints.agentsList = deserializedSkins ?? [];
|
WeaponPaints.AgentsList = deserializedSkins ?? [];
|
||||||
}
|
}
|
||||||
catch (FileNotFoundException)
|
catch (FileNotFoundException)
|
||||||
{
|
{
|
||||||
@@ -137,7 +144,7 @@ namespace WeaponPaints
|
|||||||
{
|
{
|
||||||
var json = File.ReadAllText(filePath);
|
var json = File.ReadAllText(filePath);
|
||||||
var deserializedSkins = JsonConvert.DeserializeObject<List<JObject>>(json);
|
var deserializedSkins = JsonConvert.DeserializeObject<List<JObject>>(json);
|
||||||
WeaponPaints.musicList = deserializedSkins ?? [];
|
WeaponPaints.MusicList = deserializedSkins ?? [];
|
||||||
}
|
}
|
||||||
catch (FileNotFoundException)
|
catch (FileNotFoundException)
|
||||||
{
|
{
|
||||||
|
|||||||
165
Variables.cs
Normal file
165
Variables.cs
Normal file
@@ -0,0 +1,165 @@
|
|||||||
|
using System.Collections.Concurrent;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using CounterStrikeSharp.API.Core;
|
||||||
|
using CounterStrikeSharp.API.Core.Capabilities;
|
||||||
|
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
||||||
|
using MenuManager;
|
||||||
|
using Microsoft.Extensions.Localization;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
|
namespace WeaponPaints;
|
||||||
|
|
||||||
|
public partial class WeaponPaints
|
||||||
|
{
|
||||||
|
private static readonly Dictionary<string, string> WeaponList = new()
|
||||||
|
{
|
||||||
|
{"weapon_deagle", "Desert Eagle"},
|
||||||
|
{"weapon_elite", "Dual Berettas"},
|
||||||
|
{"weapon_fiveseven", "Five-SeveN"},
|
||||||
|
{"weapon_glock", "Glock-18"},
|
||||||
|
{"weapon_ak47", "AK-47"},
|
||||||
|
{"weapon_aug", "AUG"},
|
||||||
|
{"weapon_awp", "AWP"},
|
||||||
|
{"weapon_famas", "FAMAS"},
|
||||||
|
{"weapon_g3sg1", "G3SG1"},
|
||||||
|
{"weapon_galilar", "Galil AR"},
|
||||||
|
{"weapon_m249", "M249"},
|
||||||
|
{"weapon_m4a1", "M4A1"},
|
||||||
|
{"weapon_mac10", "MAC-10"},
|
||||||
|
{"weapon_p90", "P90"},
|
||||||
|
{"weapon_mp5sd", "MP5-SD"},
|
||||||
|
{"weapon_ump45", "UMP-45"},
|
||||||
|
{"weapon_xm1014", "XM1014"},
|
||||||
|
{"weapon_bizon", "PP-Bizon"},
|
||||||
|
{"weapon_mag7", "MAG-7"},
|
||||||
|
{"weapon_negev", "Negev"},
|
||||||
|
{"weapon_sawedoff", "Sawed-Off"},
|
||||||
|
{"weapon_tec9", "Tec-9"},
|
||||||
|
{"weapon_taser", "Zeus x27"},
|
||||||
|
{"weapon_hkp2000", "P2000"},
|
||||||
|
{"weapon_mp7", "MP7"},
|
||||||
|
{"weapon_mp9", "MP9"},
|
||||||
|
{"weapon_nova", "Nova"},
|
||||||
|
{"weapon_p250", "P250"},
|
||||||
|
{"weapon_scar20", "SCAR-20"},
|
||||||
|
{"weapon_sg556", "SG 553"},
|
||||||
|
{"weapon_ssg08", "SSG 08"},
|
||||||
|
{"weapon_m4a1_silencer", "M4A1-S"},
|
||||||
|
{"weapon_usp_silencer", "USP-S"},
|
||||||
|
{"weapon_cz75a", "CZ75-Auto"},
|
||||||
|
{"weapon_revolver", "R8 Revolver"},
|
||||||
|
{ "weapon_knife", "Default Knife" },
|
||||||
|
{ "weapon_knife_m9_bayonet", "M9 Bayonet" },
|
||||||
|
{ "weapon_knife_karambit", "Karambit" },
|
||||||
|
{ "weapon_bayonet", "Bayonet" },
|
||||||
|
{ "weapon_knife_survival_bowie", "Bowie Knife" },
|
||||||
|
{ "weapon_knife_butterfly", "Butterfly Knife" },
|
||||||
|
{ "weapon_knife_falchion", "Falchion Knife" },
|
||||||
|
{ "weapon_knife_flip", "Flip Knife" },
|
||||||
|
{ "weapon_knife_gut", "Gut Knife" },
|
||||||
|
{ "weapon_knife_tactical", "Huntsman Knife" },
|
||||||
|
{ "weapon_knife_push", "Shadow Daggers" },
|
||||||
|
{ "weapon_knife_gypsy_jackknife", "Navaja Knife" },
|
||||||
|
{ "weapon_knife_stiletto", "Stiletto Knife" },
|
||||||
|
{ "weapon_knife_widowmaker", "Talon Knife" },
|
||||||
|
{ "weapon_knife_ursus", "Ursus Knife" },
|
||||||
|
{ "weapon_knife_css", "Classic Knife" },
|
||||||
|
{ "weapon_knife_cord", "Paracord Knife" },
|
||||||
|
{ "weapon_knife_canis", "Survival Knife" },
|
||||||
|
{ "weapon_knife_outdoor", "Nomad Knife" },
|
||||||
|
{ "weapon_knife_skeleton", "Skeleton Knife" },
|
||||||
|
{ "weapon_knife_kukri", "Kukri Knife" }
|
||||||
|
};
|
||||||
|
|
||||||
|
public static IStringLocalizer? _localizer;
|
||||||
|
internal static readonly ConcurrentDictionary<int, string> GPlayersKnife = new();
|
||||||
|
internal static readonly ConcurrentDictionary<int, ushort> GPlayersGlove = new();
|
||||||
|
internal static readonly ConcurrentDictionary<int, ushort> GPlayersMusic = new();
|
||||||
|
public static readonly ConcurrentDictionary<int, (string? CT, string? T)> GPlayersAgent = new();
|
||||||
|
internal static readonly ConcurrentDictionary<int, ConcurrentDictionary<int, WeaponInfo>> GPlayerWeaponsInfo = new();
|
||||||
|
internal static List<JObject> SkinsList = [];
|
||||||
|
internal static List<JObject> GlovesList = [];
|
||||||
|
internal static List<JObject> AgentsList = [];
|
||||||
|
internal static List<JObject> MusicList = [];
|
||||||
|
internal static WeaponSynchronization? WeaponSync;
|
||||||
|
private static bool _gBCommandsAllowed = true;
|
||||||
|
private readonly Dictionary<int, string> _playerWeaponImage = new();
|
||||||
|
|
||||||
|
private static readonly Dictionary<int, DateTime> CommandsCooldown = new();
|
||||||
|
internal static Database? Database;
|
||||||
|
|
||||||
|
private static readonly MemoryFunctionVoid<nint, string, float> CAttributeListSetOrAddAttributeValueByName = new(GameData.GetSignature("CAttributeList_SetOrAddAttributeValueByName"));
|
||||||
|
|
||||||
|
private static readonly MemoryFunctionWithReturn<nint, string, int, int> SetBodygroupFunc = new(
|
||||||
|
GameData.GetSignature("CBaseModelEntity_SetBodygroup"));
|
||||||
|
|
||||||
|
private static readonly Func<nint, string, int, int> SetBodygroup = SetBodygroupFunc.Invoke;
|
||||||
|
|
||||||
|
private static Dictionary<int, string> WeaponDefindex { get; } = new()
|
||||||
|
{
|
||||||
|
{ 1, "weapon_deagle" },
|
||||||
|
{ 2, "weapon_elite" },
|
||||||
|
{ 3, "weapon_fiveseven" },
|
||||||
|
{ 4, "weapon_glock" },
|
||||||
|
{ 7, "weapon_ak47" },
|
||||||
|
{ 8, "weapon_aug" },
|
||||||
|
{ 9, "weapon_awp" },
|
||||||
|
{ 10, "weapon_famas" },
|
||||||
|
{ 11, "weapon_g3sg1" },
|
||||||
|
{ 13, "weapon_galilar" },
|
||||||
|
{ 14, "weapon_m249" },
|
||||||
|
{ 16, "weapon_m4a1" },
|
||||||
|
{ 17, "weapon_mac10" },
|
||||||
|
{ 19, "weapon_p90" },
|
||||||
|
{ 23, "weapon_mp5sd" },
|
||||||
|
{ 24, "weapon_ump45" },
|
||||||
|
{ 25, "weapon_xm1014" },
|
||||||
|
{ 26, "weapon_bizon" },
|
||||||
|
{ 27, "weapon_mag7" },
|
||||||
|
{ 28, "weapon_negev" },
|
||||||
|
{ 29, "weapon_sawedoff" },
|
||||||
|
{ 30, "weapon_tec9" },
|
||||||
|
{ 31, "weapon_taser" },
|
||||||
|
{ 32, "weapon_hkp2000" },
|
||||||
|
{ 33, "weapon_mp7" },
|
||||||
|
{ 34, "weapon_mp9" },
|
||||||
|
{ 35, "weapon_nova" },
|
||||||
|
{ 36, "weapon_p250" },
|
||||||
|
{ 38, "weapon_scar20" },
|
||||||
|
{ 39, "weapon_sg556" },
|
||||||
|
{ 40, "weapon_ssg08" },
|
||||||
|
{ 60, "weapon_m4a1_silencer" },
|
||||||
|
{ 61, "weapon_usp_silencer" },
|
||||||
|
{ 63, "weapon_cz75a" },
|
||||||
|
{ 64, "weapon_revolver" },
|
||||||
|
{ 500, "weapon_bayonet" },
|
||||||
|
{ 503, "weapon_knife_css" },
|
||||||
|
{ 505, "weapon_knife_flip" },
|
||||||
|
{ 506, "weapon_knife_gut" },
|
||||||
|
{ 507, "weapon_knife_karambit" },
|
||||||
|
{ 508, "weapon_knife_m9_bayonet" },
|
||||||
|
{ 509, "weapon_knife_tactical" },
|
||||||
|
{ 512, "weapon_knife_falchion" },
|
||||||
|
{ 514, "weapon_knife_survival_bowie" },
|
||||||
|
{ 515, "weapon_knife_butterfly" },
|
||||||
|
{ 516, "weapon_knife_push" },
|
||||||
|
{ 517, "weapon_knife_cord" },
|
||||||
|
{ 518, "weapon_knife_canis" },
|
||||||
|
{ 519, "weapon_knife_ursus" },
|
||||||
|
{ 520, "weapon_knife_gypsy_jackknife" },
|
||||||
|
{ 521, "weapon_knife_outdoor" },
|
||||||
|
{ 522, "weapon_knife_stiletto" },
|
||||||
|
{ 523, "weapon_knife_widowmaker" },
|
||||||
|
{ 525, "weapon_knife_skeleton" },
|
||||||
|
{ 526, "weapon_knife_kukri" }
|
||||||
|
};
|
||||||
|
|
||||||
|
private const ulong MinimumCustomItemId = 65578;
|
||||||
|
private ulong _nextItemId = MinimumCustomItemId;
|
||||||
|
private static readonly bool IsWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
|
||||||
|
|
||||||
|
private readonly ConcurrentDictionary<int, ConcurrentDictionary<int, float>> _temporaryPlayerWeaponWear = new();
|
||||||
|
|
||||||
|
internal static IMenuApi? MenuApi;
|
||||||
|
private static readonly PluginCapability<IMenuApi> MenuCapability = new("menu:nfcore");
|
||||||
|
}
|
||||||
191
WeaponAction.cs
191
WeaponAction.cs
@@ -5,26 +5,28 @@ using CounterStrikeSharp.API.Modules.Memory;
|
|||||||
using CounterStrikeSharp.API.Modules.Timers;
|
using CounterStrikeSharp.API.Modules.Timers;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
using System.Linq.Expressions;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace WeaponPaints
|
namespace WeaponPaints
|
||||||
{
|
{
|
||||||
public partial class WeaponPaints
|
public partial class WeaponPaints
|
||||||
{
|
{
|
||||||
private void GivePlayerWeaponSkin(CCSPlayerController player, CBasePlayerWeapon weapon)
|
private void GivePlayerWeaponSkin(CCSPlayerController player, CBasePlayerWeapon weapon)
|
||||||
{
|
{
|
||||||
if (!Config.Additional.SkinEnabled) return;
|
if (!Config.Additional.SkinEnabled) return;
|
||||||
if (!gPlayerWeaponsInfo.TryGetValue(player.Slot, out _)) return;
|
if (!GPlayerWeaponsInfo.TryGetValue(player.Slot, out _)) return;
|
||||||
|
|
||||||
bool isKnife = weapon.DesignerName.Contains("knife") || weapon.DesignerName.Contains("bayonet");
|
bool isKnife = weapon.DesignerName.Contains("knife") || weapon.DesignerName.Contains("bayonet");
|
||||||
|
|
||||||
if (isKnife && !g_playersKnife.ContainsKey(player.Slot) || isKnife && g_playersKnife[player.Slot] == "weapon_knife") return;
|
if (isKnife && !GPlayersKnife.ContainsKey(player.Slot) || isKnife && GPlayersKnife[player.Slot] == "weapon_knife") return;
|
||||||
|
|
||||||
int[] newPaints = { 106, 112, 113, 114, 115, 117, 118, 120, 121, 123, 126, 127, 128, 129, 130, 131, 133, 134, 137, 138, 139, 140, 142, 144, 145, 146, 152, 160, 161, 163, 173, 239, 292, 324, 331, 412, 461, 513, 766, 768, 770, 773, 774, 830, 831, 832, 834, 874, 875, 877, 878, 882, 883, 901, 912, 936, 937, 938, 939, 940, 1054, 1062, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1177, 1178, 1179, 1180 };
|
int[] newPaints = { 106, 112, 113, 114, 115, 117, 118, 120, 121, 123, 126, 127, 128, 129, 130, 131, 133, 134, 137, 138, 139, 140, 142, 144, 145, 146, 152, 160, 161, 163, 173, 239, 292, 324, 331, 412, 461, 513, 766, 768, 770, 773, 774, 830, 831, 832, 834, 874, 875, 877, 878, 882, 883, 901, 912, 936, 937, 938, 939, 940, 1054, 1062, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1175, 1177, 1178, 1179, 1180 };
|
||||||
|
|
||||||
if (isKnife)
|
if (isKnife)
|
||||||
{
|
{
|
||||||
var newDefIndex = WeaponDefindex.FirstOrDefault(x => x.Value == g_playersKnife[player.Slot]);
|
var newDefIndex = WeaponDefindex.FirstOrDefault(x => x.Value == GPlayersKnife[player.Slot]);
|
||||||
if (newDefIndex.Key == 0) return;
|
if (newDefIndex.Key == 0) return;
|
||||||
|
|
||||||
if (weapon.AttributeManager.Item.ItemDefinitionIndex != newDefIndex.Key)
|
if (weapon.AttributeManager.Item.ItemDefinitionIndex != newDefIndex.Key)
|
||||||
@@ -44,7 +46,7 @@ namespace WeaponPaints
|
|||||||
weapon.AttributeManager.Item.AccountID = (uint)player.SteamID;
|
weapon.AttributeManager.Item.AccountID = (uint)player.SteamID;
|
||||||
|
|
||||||
if (_config.Additional.GiveRandomSkin &&
|
if (_config.Additional.GiveRandomSkin &&
|
||||||
!gPlayerWeaponsInfo[player.Slot].ContainsKey(weaponDefIndex))
|
!GPlayerWeaponsInfo[player.Slot].ContainsKey(weaponDefIndex))
|
||||||
{
|
{
|
||||||
// Random skins
|
// Random skins
|
||||||
weapon.FallbackPaintKit = GetRandomPaint(weaponDefIndex);
|
weapon.FallbackPaintKit = GetRandomPaint(weaponDefIndex);
|
||||||
@@ -52,12 +54,12 @@ namespace WeaponPaints
|
|||||||
weapon.FallbackWear = 0.01f;
|
weapon.FallbackWear = 0.01f;
|
||||||
|
|
||||||
weapon.AttributeManager.Item.NetworkedDynamicAttributes.Attributes.RemoveAll();
|
weapon.AttributeManager.Item.NetworkedDynamicAttributes.Attributes.RemoveAll();
|
||||||
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle, "set item texture prefab", GetRandomPaint(weaponDefIndex));
|
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle, "set item texture prefab", GetRandomPaint(weaponDefIndex));
|
||||||
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle, "set item texture seed", 0);
|
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle, "set item texture seed", 0);
|
||||||
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle, "set item texture wear", 0.01f);
|
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle, "set item texture wear", 0.01f);
|
||||||
|
|
||||||
weapon.AttributeManager.Item.AttributeList.Attributes.RemoveAll();
|
weapon.AttributeManager.Item.AttributeList.Attributes.RemoveAll();
|
||||||
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.AttributeList.Handle, "set item texture prefab", GetRandomPaint(weaponDefIndex));
|
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.AttributeList.Handle, "set item texture prefab", GetRandomPaint(weaponDefIndex));
|
||||||
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.AttributeList.Handle, "set item texture seed", 0);
|
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.AttributeList.Handle, "set item texture seed", 0);
|
||||||
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.AttributeList.Handle, "set item texture wear", 0.01f);
|
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.AttributeList.Handle, "set item texture wear", 0.01f);
|
||||||
|
|
||||||
@@ -71,13 +73,15 @@ namespace WeaponPaints
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gPlayerWeaponsInfo[player.Slot].TryGetValue(weaponDefIndex, out var value) || value.Paint == 0) return;
|
if (!GPlayerWeaponsInfo[player.Slot].TryGetValue(weaponDefIndex, out var value) || value.Paint == 0) return;
|
||||||
|
|
||||||
var 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]}");
|
//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.ItemID = 16384;
|
||||||
weapon.AttributeManager.Item.ItemIDLow = 16384 & 0xFFFFFFFF;
|
weapon.AttributeManager.Item.ItemIDLow = 16384 & 0xFFFFFFFF;
|
||||||
weapon.AttributeManager.Item.ItemIDHigh = weapon.AttributeManager.Item.ItemIDLow >> 32;
|
weapon.AttributeManager.Item.ItemIDHigh = weapon.AttributeManager.Item.ItemIDLow >> 32;
|
||||||
|
weapon.AttributeManager.Item.CustomName = weaponInfo.Nametag;
|
||||||
weapon.FallbackPaintKit = weaponInfo.Paint;
|
weapon.FallbackPaintKit = weaponInfo.Paint;
|
||||||
weapon.FallbackSeed = weaponInfo.Seed;
|
weapon.FallbackSeed = weaponInfo.Seed;
|
||||||
weapon.FallbackWear = weaponInfo.Wear;
|
weapon.FallbackWear = weaponInfo.Wear;
|
||||||
@@ -89,9 +93,97 @@ namespace WeaponPaints
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (isKnife) return;
|
if (isKnife) return;
|
||||||
|
|
||||||
|
if (weaponInfo.Stickers.Count > 0) SetStickers(player, weapon);
|
||||||
|
if (weaponInfo.KeyChain != null) SetKeychain(player, weapon);
|
||||||
|
|
||||||
UpdatePlayerWeaponMeshGroupMask(player, weapon, !newPaints.Contains(fallbackPaintKit));
|
UpdatePlayerWeaponMeshGroupMask(player, weapon, !newPaints.Contains(fallbackPaintKit));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// silly method to update sticker when call RefreshWeapons()
|
||||||
|
private void IncrementWearForWeaponWithStickers(CCSPlayerController player, CBasePlayerWeapon weapon)
|
||||||
|
{
|
||||||
|
int weaponDefIndex = weapon.AttributeManager.Item.ItemDefinitionIndex;
|
||||||
|
if (!GPlayerWeaponsInfo.TryGetValue(player.Slot, out var playerWeapons) ||
|
||||||
|
!playerWeapons.TryGetValue(weaponDefIndex, out var weaponInfo) ||
|
||||||
|
weaponInfo.Stickers.Count <= 0) return;
|
||||||
|
|
||||||
|
float wearIncrement = 0.001f;
|
||||||
|
float currentWear = weaponInfo.Wear;
|
||||||
|
|
||||||
|
var playerWear = _temporaryPlayerWeaponWear.GetOrAdd(player.Slot, _ => new ConcurrentDictionary<int, float>());
|
||||||
|
|
||||||
|
float incrementedWear = playerWear.AddOrUpdate(
|
||||||
|
weaponDefIndex,
|
||||||
|
currentWear + wearIncrement,
|
||||||
|
(_, oldWear) => Math.Min(oldWear + wearIncrement, 1.0f)
|
||||||
|
);
|
||||||
|
|
||||||
|
weapon.FallbackWear = incrementedWear;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetStickers(CCSPlayerController? player, CBasePlayerWeapon weapon)
|
||||||
|
{
|
||||||
|
if (player == null || !player.IsValid) return;
|
||||||
|
|
||||||
|
int weaponDefIndex = weapon.AttributeManager.Item.ItemDefinitionIndex;
|
||||||
|
|
||||||
|
if (!GPlayerWeaponsInfo.TryGetValue(player.Slot, out var playerWeapons) ||
|
||||||
|
!playerWeapons.TryGetValue(weaponDefIndex, out var weaponInfo))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var sticker in weaponInfo.Stickers)
|
||||||
|
{
|
||||||
|
int stickerSlot = weaponInfo.Stickers.IndexOf(sticker);
|
||||||
|
|
||||||
|
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle,
|
||||||
|
$"sticker slot {stickerSlot} id", ViewAsFloat(sticker.Id));
|
||||||
|
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle,
|
||||||
|
$"sticker slot {stickerSlot} schema", sticker.Schema);
|
||||||
|
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle,
|
||||||
|
$"sticker slot {stickerSlot} offset x", sticker.OffsetX);
|
||||||
|
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle,
|
||||||
|
$"sticker slot {stickerSlot} offset y", sticker.OffsetY);
|
||||||
|
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle,
|
||||||
|
$"sticker slot {stickerSlot} wear", sticker.Wear);
|
||||||
|
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle,
|
||||||
|
$"sticker slot {stickerSlot} scale", sticker.Scale);
|
||||||
|
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle,
|
||||||
|
$"sticker slot {stickerSlot} rotation", sticker.Rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_temporaryPlayerWeaponWear.TryGetValue(player.Slot, out var playerWear) &&
|
||||||
|
playerWear.TryGetValue(weaponDefIndex, out float storedWear))
|
||||||
|
{
|
||||||
|
weapon.FallbackWear = storedWear;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetKeychain(CCSPlayerController? player, CBasePlayerWeapon weapon)
|
||||||
|
{
|
||||||
|
if (player == null || !player.IsValid) return;
|
||||||
|
|
||||||
|
int weaponDefIndex = weapon.AttributeManager.Item.ItemDefinitionIndex;
|
||||||
|
|
||||||
|
if (!GPlayerWeaponsInfo.TryGetValue(player.Slot, out var playerWeaponsInfo) ||
|
||||||
|
!playerWeaponsInfo.TryGetValue(weaponDefIndex, out var value) ||
|
||||||
|
value.KeyChain == null) return;
|
||||||
|
var keyChain = value.KeyChain;
|
||||||
|
|
||||||
|
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle,
|
||||||
|
"keychain slot 0 id", ViewAsFloat(keyChain.Id));
|
||||||
|
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle,
|
||||||
|
"keychain slot 0 offset x", keyChain.OffsetX);
|
||||||
|
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle,
|
||||||
|
"keychain slot 0 offset y", keyChain.OffsetY);
|
||||||
|
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle,
|
||||||
|
"keychain slot 0 offset z", keyChain.OffsetZ);
|
||||||
|
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle,
|
||||||
|
"keychain slot 0 seed", keyChain.Seed);
|
||||||
|
}
|
||||||
|
|
||||||
private static void GiveKnifeToPlayer(CCSPlayerController? player)
|
private static void GiveKnifeToPlayer(CCSPlayerController? player)
|
||||||
{
|
{
|
||||||
if (!_config.Additional.KnifeEnabled || player == null || !player.IsValid) return;
|
if (!_config.Additional.KnifeEnabled || player == null || !player.IsValid) return;
|
||||||
@@ -129,8 +221,8 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
private void RefreshWeapons(CCSPlayerController? player)
|
private void RefreshWeapons(CCSPlayerController? player)
|
||||||
{
|
{
|
||||||
if (!g_bCommandsAllowed) return;
|
if (!_gBCommandsAllowed) return;
|
||||||
if (player == null || !player.IsValid || player.PlayerPawn?.Value == null || (LifeState_t)player.LifeState != LifeState_t.LIFE_ALIVE)
|
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || (LifeState_t)player.LifeState != LifeState_t.LIFE_ALIVE)
|
||||||
return;
|
return;
|
||||||
if (player.PlayerPawn.Value.WeaponServices == null || player.PlayerPawn.Value.ItemServices == null)
|
if (player.PlayerPawn.Value.WeaponServices == null || player.PlayerPawn.Value.ItemServices == null)
|
||||||
return;
|
return;
|
||||||
@@ -166,7 +258,7 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
if (weaponData == null) continue;
|
if (weaponData == null) continue;
|
||||||
|
|
||||||
if (weaponData.GearSlot == gear_slot_t.GEAR_SLOT_RIFLE || weaponData.GearSlot == gear_slot_t.GEAR_SLOT_PISTOL)
|
if (weaponData.GearSlot is gear_slot_t.GEAR_SLOT_RIFLE or gear_slot_t.GEAR_SLOT_PISTOL)
|
||||||
{
|
{
|
||||||
if (!WeaponDefindex.TryGetValue(weapon.Value.AttributeManager.Item.ItemDefinitionIndex, out var weaponByDefindex))
|
if (!WeaponDefindex.TryGetValue(weapon.Value.AttributeManager.Item.ItemDefinitionIndex, out var weaponByDefindex))
|
||||||
continue;
|
continue;
|
||||||
@@ -183,59 +275,27 @@ namespace WeaponPaints
|
|||||||
value.Add((clip1, reservedAmmo));
|
value.Add((clip1, reservedAmmo));
|
||||||
|
|
||||||
if (gun.VData == null) return;
|
if (gun.VData == null) return;
|
||||||
|
|
||||||
|
weapon.Value?.AddEntityIOEvent("Kill", weapon.Value, null, "", 0.1f);
|
||||||
|
}
|
||||||
|
|
||||||
weapon.Value.Remove();
|
if (weaponData.GearSlot == gear_slot_t.GEAR_SLOT_KNIFE)
|
||||||
|
{
|
||||||
|
weapon.Value?.AddEntityIOEvent("Kill", weapon.Value, null, "", 0.1f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogWarning(ex.Message);
|
Logger.LogWarning(ex.Message);
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
AddTimer(0.23f, () =>
|
||||||
{
|
|
||||||
player.ExecuteClientCommand("slot 3");
|
|
||||||
player.ExecuteClientCommand("slot 3");
|
|
||||||
|
|
||||||
var weapon = player.PlayerPawn.Value.WeaponServices.ActiveWeapon;
|
|
||||||
if (!weapon.IsValid || weapon.Value == null) return;
|
|
||||||
CCSWeaponBaseVData? weaponData = weapon.Value.As<CCSWeaponBase>().VData;
|
|
||||||
|
|
||||||
if (weapon.Value.DesignerName.Contains("knife") || weaponData?.GearSlot == gear_slot_t.GEAR_SLOT_KNIFE)
|
|
||||||
{
|
|
||||||
CCSWeaponBaseGun gun;
|
|
||||||
|
|
||||||
AddTimer(0.3f, () =>
|
|
||||||
{
|
{
|
||||||
if (player.TeamNum != playerTeam) return;
|
if (!_gBCommandsAllowed) return;
|
||||||
|
|
||||||
player.ExecuteClientCommand("slot 3");
|
if (!PlayerHasKnife(player))
|
||||||
gun = weapon.Value.As<CCSWeaponBaseGun>();
|
GiveKnifeToPlayer(player);
|
||||||
player.DropActiveWeapon();
|
|
||||||
|
|
||||||
AddTimer(0.7f, () =>
|
|
||||||
{
|
|
||||||
if (player.TeamNum != playerTeam) return;
|
|
||||||
|
|
||||||
if (!gun.IsValid || gun.State != CSWeaponState_t.WEAPON_NOT_CARRIED) return;
|
|
||||||
|
|
||||||
gun.Remove();
|
|
||||||
});
|
|
||||||
|
|
||||||
GiveKnifeToPlayer(player);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Logger.LogWarning($"Cannot remove knife: {ex.Message}");
|
|
||||||
}
|
|
||||||
|
|
||||||
AddTimer(0.6f, () =>
|
|
||||||
{
|
|
||||||
if (!g_bCommandsAllowed) return;
|
|
||||||
|
|
||||||
foreach (var entry in weaponsWithAmmo)
|
foreach (var entry in weaponsWithAmmo)
|
||||||
{
|
{
|
||||||
@@ -248,6 +308,8 @@ namespace WeaponPaints
|
|||||||
{
|
{
|
||||||
newWeapon.Clip1 = ammo.Item1;
|
newWeapon.Clip1 = ammo.Item1;
|
||||||
newWeapon.ReserveAmmo[0] = ammo.Item2;
|
newWeapon.ReserveAmmo[0] = ammo.Item2;
|
||||||
|
|
||||||
|
IncrementWearForWeaponWithStickers(player, newWeapon);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -274,7 +336,7 @@ namespace WeaponPaints
|
|||||||
pawn.SetModel(model);
|
pawn.SetModel(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
Instance.AddTimer(0.06f, () =>
|
Instance.AddTimer(0.08f, () =>
|
||||||
{
|
{
|
||||||
CEconItemView item = pawn.EconGloves;
|
CEconItemView item = pawn.EconGloves;
|
||||||
try
|
try
|
||||||
@@ -285,9 +347,9 @@ namespace WeaponPaints
|
|||||||
if (!player.PawnIsAlive)
|
if (!player.PawnIsAlive)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!g_playersGlove.TryGetValue(player.Slot, out var gloveInfo) || gloveInfo == 0) return;
|
if (!GPlayersGlove.TryGetValue(player.Slot, out var gloveInfo) || gloveInfo == 0) return;
|
||||||
|
|
||||||
WeaponInfo weaponInfo = gPlayerWeaponsInfo[player.Slot][gloveInfo];
|
WeaponInfo weaponInfo = GPlayerWeaponsInfo[player.Slot][gloveInfo];
|
||||||
|
|
||||||
item.ItemDefinitionIndex = gloveInfo;
|
item.ItemDefinitionIndex = gloveInfo;
|
||||||
item.ItemIDLow = 16384 & 0xFFFFFFFF;
|
item.ItemIDLow = 16384 & 0xFFFFFFFF;
|
||||||
@@ -307,13 +369,13 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
private static int GetRandomPaint(int defindex)
|
private static int GetRandomPaint(int defindex)
|
||||||
{
|
{
|
||||||
if (skinsList.Count == 0)
|
if (SkinsList.Count == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
Random rnd = new Random();
|
Random rnd = new Random();
|
||||||
|
|
||||||
// Filter weapons by the provided defindex
|
// Filter weapons by the provided defindex
|
||||||
var filteredWeapons = skinsList.Where(w => w["weapon_defindex"]?.ToString() == defindex.ToString()).ToList();
|
var filteredWeapons = SkinsList.Where(w => w["weapon_defindex"]?.ToString() == defindex.ToString()).ToList();
|
||||||
|
|
||||||
if (filteredWeapons.Count == 0)
|
if (filteredWeapons.Count == 0)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -357,7 +419,7 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
private static void GivePlayerAgent(CCSPlayerController player)
|
private static void GivePlayerAgent(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
if (!g_playersAgent.TryGetValue(player.Slot, out var value)) return;
|
if (!GPlayersAgent.TryGetValue(player.Slot, out var value)) return;
|
||||||
|
|
||||||
var model = player.TeamNum == 3 ? value.CT : value.T;
|
var model = player.TeamNum == 3 ? value.CT : value.T;
|
||||||
if (string.IsNullOrEmpty(model)) return;
|
if (string.IsNullOrEmpty(model)) return;
|
||||||
@@ -381,7 +443,7 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
private static void GivePlayerMusicKit(CCSPlayerController player)
|
private static void GivePlayerMusicKit(CCSPlayerController player)
|
||||||
{
|
{
|
||||||
if (!g_playersMusic.TryGetValue(player.Slot, out var value)) return;
|
if (!GPlayersMusic.TryGetValue(player.Slot, out var value)) return;
|
||||||
if (player.InventoryServices == null) return;
|
if (player.InventoryServices == null) return;
|
||||||
|
|
||||||
player.InventoryServices.MusicID = value;
|
player.InventoryServices.MusicID = value;
|
||||||
@@ -447,5 +509,10 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private float ViewAsFloat(uint value)
|
||||||
|
{
|
||||||
|
return BitConverter.Int32BitsToSingle((int)value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,5 +5,28 @@
|
|||||||
public int Paint { get; set; }
|
public int Paint { get; set; }
|
||||||
public int Seed { get; set; } = 0;
|
public int Seed { get; set; } = 0;
|
||||||
public float Wear { get; set; } = 0f;
|
public float Wear { get; set; } = 0f;
|
||||||
|
public string Nametag { get; set; } = "";
|
||||||
|
public KeyChainInfo? KeyChain { get; set; }
|
||||||
|
public List<StickerInfo> Stickers { get; set; } = new List<StickerInfo>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class StickerInfo
|
||||||
|
{
|
||||||
|
public uint Id { get; set; }
|
||||||
|
public uint Schema { get; set; }
|
||||||
|
public float OffsetX { get; set; }
|
||||||
|
public float OffsetY { get; set; }
|
||||||
|
public float Wear { get; set; }
|
||||||
|
public float Scale { get; set; }
|
||||||
|
public float Rotation { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class KeyChainInfo
|
||||||
|
{
|
||||||
|
public uint Id { get; set; }
|
||||||
|
public float OffsetX { get; set; }
|
||||||
|
public float OffsetY { get; set; }
|
||||||
|
public float OffsetZ { get; set; }
|
||||||
|
public uint Seed { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
205
WeaponPaints.cs
205
WeaponPaints.cs
@@ -1,175 +1,22 @@
|
|||||||
using CounterStrikeSharp.API;
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Core.Attributes;
|
using CounterStrikeSharp.API.Core.Attributes;
|
||||||
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
|
|
||||||
using Microsoft.Extensions.Localization;
|
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using MySqlConnector;
|
using MySqlConnector;
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
using System.Collections.Concurrent;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
namespace WeaponPaints;
|
namespace WeaponPaints;
|
||||||
|
|
||||||
[MinimumApiVersion(230)]
|
[MinimumApiVersion(276)]
|
||||||
public partial class WeaponPaints : BasePlugin, IPluginConfig<WeaponPaintsConfig>
|
public partial class WeaponPaints : BasePlugin, IPluginConfig<WeaponPaintsConfig>
|
||||||
{
|
{
|
||||||
internal static WeaponPaints Instance { get; private set; } = new();
|
internal static WeaponPaints Instance { get; private set; } = new();
|
||||||
|
|
||||||
private static readonly Dictionary<string, string> WeaponList = new()
|
|
||||||
{
|
|
||||||
{"weapon_deagle", "Desert Eagle"},
|
|
||||||
{"weapon_elite", "Dual Berettas"},
|
|
||||||
{"weapon_fiveseven", "Five-SeveN"},
|
|
||||||
{"weapon_glock", "Glock-18"},
|
|
||||||
{"weapon_ak47", "AK-47"},
|
|
||||||
{"weapon_aug", "AUG"},
|
|
||||||
{"weapon_awp", "AWP"},
|
|
||||||
{"weapon_famas", "FAMAS"},
|
|
||||||
{"weapon_g3sg1", "G3SG1"},
|
|
||||||
{"weapon_galilar", "Galil AR"},
|
|
||||||
{"weapon_m249", "M249"},
|
|
||||||
{"weapon_m4a1", "M4A1"},
|
|
||||||
{"weapon_mac10", "MAC-10"},
|
|
||||||
{"weapon_p90", "P90"},
|
|
||||||
{"weapon_mp5sd", "MP5-SD"},
|
|
||||||
{"weapon_ump45", "UMP-45"},
|
|
||||||
{"weapon_xm1014", "XM1014"},
|
|
||||||
{"weapon_bizon", "PP-Bizon"},
|
|
||||||
{"weapon_mag7", "MAG-7"},
|
|
||||||
{"weapon_negev", "Negev"},
|
|
||||||
{"weapon_sawedoff", "Sawed-Off"},
|
|
||||||
{"weapon_tec9", "Tec-9"},
|
|
||||||
{"weapon_taser", "Zeus x27"},
|
|
||||||
{"weapon_hkp2000", "P2000"},
|
|
||||||
{"weapon_mp7", "MP7"},
|
|
||||||
{"weapon_mp9", "MP9"},
|
|
||||||
{"weapon_nova", "Nova"},
|
|
||||||
{"weapon_p250", "P250"},
|
|
||||||
{"weapon_scar20", "SCAR-20"},
|
|
||||||
{"weapon_sg556", "SG 553"},
|
|
||||||
{"weapon_ssg08", "SSG 08"},
|
|
||||||
{"weapon_m4a1_silencer", "M4A1-S"},
|
|
||||||
{"weapon_usp_silencer", "USP-S"},
|
|
||||||
{"weapon_cz75a", "CZ75-Auto"},
|
|
||||||
{"weapon_revolver", "R8 Revolver"},
|
|
||||||
{ "weapon_knife", "Default Knife" },
|
|
||||||
{ "weapon_knife_m9_bayonet", "M9 Bayonet" },
|
|
||||||
{ "weapon_knife_karambit", "Karambit" },
|
|
||||||
{ "weapon_bayonet", "Bayonet" },
|
|
||||||
{ "weapon_knife_survival_bowie", "Bowie Knife" },
|
|
||||||
{ "weapon_knife_butterfly", "Butterfly Knife" },
|
|
||||||
{ "weapon_knife_falchion", "Falchion Knife" },
|
|
||||||
{ "weapon_knife_flip", "Flip Knife" },
|
|
||||||
{ "weapon_knife_gut", "Gut Knife" },
|
|
||||||
{ "weapon_knife_tactical", "Huntsman Knife" },
|
|
||||||
{ "weapon_knife_push", "Shadow Daggers" },
|
|
||||||
{ "weapon_knife_gypsy_jackknife", "Navaja Knife" },
|
|
||||||
{ "weapon_knife_stiletto", "Stiletto Knife" },
|
|
||||||
{ "weapon_knife_widowmaker", "Talon Knife" },
|
|
||||||
{ "weapon_knife_ursus", "Ursus Knife" },
|
|
||||||
{ "weapon_knife_css", "Classic Knife" },
|
|
||||||
{ "weapon_knife_cord", "Paracord Knife" },
|
|
||||||
{ "weapon_knife_canis", "Survival Knife" },
|
|
||||||
{ "weapon_knife_outdoor", "Nomad Knife" },
|
|
||||||
{ "weapon_knife_skeleton", "Skeleton Knife" },
|
|
||||||
{ "weapon_knife_kukri", "Kukri Knife" }
|
|
||||||
};
|
|
||||||
|
|
||||||
private static WeaponPaintsConfig _config = new();
|
|
||||||
internal static IStringLocalizer? _localizer;
|
|
||||||
private static Dictionary<int, int> g_knifePickupCount = new();
|
|
||||||
internal static ConcurrentDictionary<int, string> g_playersKnife = new();
|
|
||||||
internal static ConcurrentDictionary<int, ushort> g_playersGlove = new();
|
|
||||||
internal static ConcurrentDictionary<int, ushort> g_playersMusic = new();
|
|
||||||
internal static ConcurrentDictionary<int, (string? CT, string? T)> g_playersAgent = new();
|
|
||||||
internal static ConcurrentDictionary<int, ConcurrentDictionary<int, WeaponInfo>> gPlayerWeaponsInfo = new();
|
|
||||||
internal static List<JObject> skinsList = new();
|
|
||||||
internal static List<JObject> glovesList = new();
|
|
||||||
internal static List<JObject> agentsList = new();
|
|
||||||
internal static List<JObject> musicList = new();
|
|
||||||
internal static WeaponSynchronization? weaponSync;
|
|
||||||
private static bool g_bCommandsAllowed = true;
|
|
||||||
private Dictionary<int, string> PlayerWeaponImage = new();
|
|
||||||
|
|
||||||
private static Dictionary<int, DateTime> commandsCooldown = new();
|
|
||||||
internal static Database? _database;
|
|
||||||
|
|
||||||
private static readonly MemoryFunctionVoid<nint, string, float> CAttributeListSetOrAddAttributeValueByName = new(GameData.GetSignature("CAttributeList_SetOrAddAttributeValueByName"));
|
|
||||||
|
|
||||||
private static readonly MemoryFunctionWithReturn<nint, string, int, int> SetBodygroupFunc = new(
|
|
||||||
GameData.GetSignature("CBaseModelEntity_SetBodygroup"));
|
|
||||||
|
|
||||||
private static readonly Func<nint, string, int, int> SetBodygroup = SetBodygroupFunc.Invoke;
|
|
||||||
|
|
||||||
private static Dictionary<int, string> WeaponDefindex { get; } = new Dictionary<int, string>
|
|
||||||
{
|
|
||||||
{ 1, "weapon_deagle" },
|
|
||||||
{ 2, "weapon_elite" },
|
|
||||||
{ 3, "weapon_fiveseven" },
|
|
||||||
{ 4, "weapon_glock" },
|
|
||||||
{ 7, "weapon_ak47" },
|
|
||||||
{ 8, "weapon_aug" },
|
|
||||||
{ 9, "weapon_awp" },
|
|
||||||
{ 10, "weapon_famas" },
|
|
||||||
{ 11, "weapon_g3sg1" },
|
|
||||||
{ 13, "weapon_galilar" },
|
|
||||||
{ 14, "weapon_m249" },
|
|
||||||
{ 16, "weapon_m4a1" },
|
|
||||||
{ 17, "weapon_mac10" },
|
|
||||||
{ 19, "weapon_p90" },
|
|
||||||
{ 23, "weapon_mp5sd" },
|
|
||||||
{ 24, "weapon_ump45" },
|
|
||||||
{ 25, "weapon_xm1014" },
|
|
||||||
{ 26, "weapon_bizon" },
|
|
||||||
{ 27, "weapon_mag7" },
|
|
||||||
{ 28, "weapon_negev" },
|
|
||||||
{ 29, "weapon_sawedoff" },
|
|
||||||
{ 30, "weapon_tec9" },
|
|
||||||
{ 31, "weapon_taser" },
|
|
||||||
{ 32, "weapon_hkp2000" },
|
|
||||||
{ 33, "weapon_mp7" },
|
|
||||||
{ 34, "weapon_mp9" },
|
|
||||||
{ 35, "weapon_nova" },
|
|
||||||
{ 36, "weapon_p250" },
|
|
||||||
{ 38, "weapon_scar20" },
|
|
||||||
{ 39, "weapon_sg556" },
|
|
||||||
{ 40, "weapon_ssg08" },
|
|
||||||
{ 60, "weapon_m4a1_silencer" },
|
|
||||||
{ 61, "weapon_usp_silencer" },
|
|
||||||
{ 63, "weapon_cz75a" },
|
|
||||||
{ 64, "weapon_revolver" },
|
|
||||||
{ 500, "weapon_bayonet" },
|
|
||||||
{ 503, "weapon_knife_css" },
|
|
||||||
{ 505, "weapon_knife_flip" },
|
|
||||||
{ 506, "weapon_knife_gut" },
|
|
||||||
{ 507, "weapon_knife_karambit" },
|
|
||||||
{ 508, "weapon_knife_m9_bayonet" },
|
|
||||||
{ 509, "weapon_knife_tactical" },
|
|
||||||
{ 512, "weapon_knife_falchion" },
|
|
||||||
{ 514, "weapon_knife_survival_bowie" },
|
|
||||||
{ 515, "weapon_knife_butterfly" },
|
|
||||||
{ 516, "weapon_knife_push" },
|
|
||||||
{ 517, "weapon_knife_cord" },
|
|
||||||
{ 518, "weapon_knife_canis" },
|
|
||||||
{ 519, "weapon_knife_ursus" },
|
|
||||||
{ 520, "weapon_knife_gypsy_jackknife" },
|
|
||||||
{ 521, "weapon_knife_outdoor" },
|
|
||||||
{ 522, "weapon_knife_stiletto" },
|
|
||||||
{ 523, "weapon_knife_widowmaker" },
|
|
||||||
{ 525, "weapon_knife_skeleton" },
|
|
||||||
{ 526, "weapon_knife_kukri" }
|
|
||||||
};
|
|
||||||
|
|
||||||
private const ulong MinimumCustomItemId = 65578;
|
|
||||||
private ulong _nextItemId = MinimumCustomItemId;
|
|
||||||
public static readonly bool IsWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
|
|
||||||
|
|
||||||
public WeaponPaintsConfig Config { get; set; } = new();
|
public WeaponPaintsConfig Config { get; set; } = new();
|
||||||
public override string ModuleAuthor => "Nereziel & daffyy";
|
private static WeaponPaintsConfig _config { get; set; } = new();
|
||||||
|
public override string ModuleAuthor => "Nereziel & daffyy";
|
||||||
public override string ModuleDescription => "Skin, gloves, agents 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 ModuleName => "WeaponPaints";
|
||||||
public override string ModuleVersion => "2.5a";
|
public override string ModuleVersion => "2.6a";
|
||||||
|
|
||||||
public override void Load(bool hotReload)
|
public override void Load(bool hotReload)
|
||||||
{
|
{
|
||||||
@@ -180,18 +27,17 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig<WeaponPaintsConfig
|
|||||||
OnMapStart(string.Empty);
|
OnMapStart(string.Empty);
|
||||||
|
|
||||||
foreach (var player in Enumerable
|
foreach (var player in Enumerable
|
||||||
.OfType<CCSPlayerController>(Utilities.GetPlayers().TakeWhile(player => weaponSync != null))
|
.OfType<CCSPlayerController>(Utilities.GetPlayers().TakeWhile(player => WeaponSync != null))
|
||||||
.Where(player => player.IsValid &&
|
.Where(player => player.IsValid &&
|
||||||
!string.IsNullOrEmpty(player.IpAddress) && player is
|
!string.IsNullOrEmpty(player.IpAddress) && player is
|
||||||
{ IsBot: false, Connected: PlayerConnectedState.PlayerConnected }))
|
{ IsBot: false, Connected: PlayerConnectedState.PlayerConnected }))
|
||||||
{
|
{
|
||||||
g_knifePickupCount[player.Slot] = 0;
|
GPlayerWeaponsInfo.TryRemove(player.Slot, out _);
|
||||||
gPlayerWeaponsInfo.TryRemove(player.Slot, out _);
|
GPlayersKnife.TryRemove(player.Slot, out _);
|
||||||
g_playersKnife.TryRemove(player.Slot, out _);
|
GPlayersGlove.TryRemove(player.Slot, out _);
|
||||||
g_playersGlove.TryRemove(player.Slot, out _);
|
GPlayersAgent.TryRemove(player.Slot, out _);
|
||||||
g_playersAgent.TryRemove(player.Slot, out _);
|
|
||||||
|
|
||||||
PlayerInfo? playerInfo = new PlayerInfo
|
var playerInfo = new PlayerInfo
|
||||||
{
|
{
|
||||||
UserId = player.UserId,
|
UserId = player.UserId,
|
||||||
Slot = player.Slot,
|
Slot = player.Slot,
|
||||||
@@ -203,15 +49,15 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig<WeaponPaintsConfig
|
|||||||
|
|
||||||
_ = Task.Run(async () =>
|
_ = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
if (weaponSync != null) await weaponSync.GetPlayerData(playerInfo);
|
if (WeaponSync != null) await WeaponSync.GetPlayerData(playerInfo);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Utility.LoadSkinsFromFile(ModuleDirectory + "/skins.json", Logger);
|
Utility.LoadSkinsFromFile(ModuleDirectory + $"/data/skins_{_config.SkinsLanguage}.json", Logger);
|
||||||
Utility.LoadGlovesFromFile(ModuleDirectory + "/gloves.json", Logger);
|
Utility.LoadGlovesFromFile(ModuleDirectory + $"/data/gloves_{_config.SkinsLanguage}.json", Logger);
|
||||||
Utility.LoadAgentsFromFile(ModuleDirectory + "/agents.json", Logger);
|
Utility.LoadAgentsFromFile(ModuleDirectory + $"/data/agents_{_config.SkinsLanguage}.json", Logger);
|
||||||
Utility.LoadMusicFromFile(ModuleDirectory + "/music.json", Logger);
|
Utility.LoadMusicFromFile(ModuleDirectory + $"/data/music_{_config.SkinsLanguage}.json", Logger);
|
||||||
|
|
||||||
if (Config.Additional.KnifeEnabled)
|
if (Config.Additional.KnifeEnabled)
|
||||||
SetupKnifeMenu();
|
SetupKnifeMenu();
|
||||||
@@ -230,6 +76,9 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig<WeaponPaintsConfig
|
|||||||
|
|
||||||
public void OnConfigParsed(WeaponPaintsConfig config)
|
public void OnConfigParsed(WeaponPaintsConfig config)
|
||||||
{
|
{
|
||||||
|
Config = config;
|
||||||
|
_config = config;
|
||||||
|
|
||||||
if (config.DatabaseHost.Length < 1 || config.DatabaseName.Length < 1 || config.DatabaseUser.Length < 1)
|
if (config.DatabaseHost.Length < 1 || config.DatabaseName.Length < 1 || config.DatabaseUser.Length < 1)
|
||||||
{
|
{
|
||||||
Logger.LogError("You need to setup Database credentials in \"configs/plugins/WeaponPaints/WeaponPaints.json\"!");
|
Logger.LogError("You need to setup Database credentials in \"configs/plugins/WeaponPaints/WeaponPaints.json\"!");
|
||||||
@@ -255,12 +104,9 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig<WeaponPaintsConfig
|
|||||||
MaximumPoolSize = 640,
|
MaximumPoolSize = 640,
|
||||||
};
|
};
|
||||||
|
|
||||||
_database = new Database(builder.ConnectionString);
|
Database = new Database(builder.ConnectionString);
|
||||||
|
|
||||||
_ = Utility.CheckDatabaseTables();
|
_ = Utility.CheckDatabaseTables();
|
||||||
|
|
||||||
Config = config;
|
|
||||||
_config = config;
|
|
||||||
_localizer = Localizer;
|
_localizer = Localizer;
|
||||||
|
|
||||||
Utility.Config = config;
|
Utility.Config = config;
|
||||||
@@ -268,8 +114,17 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig<WeaponPaintsConfig
|
|||||||
Task.Run(async () => await Utility.CheckVersion(ModuleVersion, Logger));
|
Task.Run(async () => await Utility.CheckVersion(ModuleVersion, Logger));
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Unload(bool hotReload)
|
public override void OnAllPluginsLoaded(bool hotReload)
|
||||||
{
|
{
|
||||||
base.Unload(hotReload);
|
try
|
||||||
|
{
|
||||||
|
MenuApi = MenuCapability.Get();
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
MenuApi = null;
|
||||||
|
Logger.LogError("Error while loading required plugins");
|
||||||
|
throw;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,9 +9,9 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.233" />
|
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.281" />
|
||||||
<PackageReference Include="Dapper" Version="2.1.35" />
|
<PackageReference Include="Dapper" Version="2.1.35" />
|
||||||
<PackageReference Include="MySqlConnector" Version="2.3.7" />
|
<PackageReference Include="MySqlConnector" Version="2.4.0-beta.1" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
@@ -22,4 +22,10 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Update="gamedata\*.*" CopyToOutputDirectory="PreserveNewest" />
|
<None Update="gamedata\*.*" CopyToOutputDirectory="PreserveNewest" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="MenuManagerApi">
|
||||||
|
<HintPath>3rd_party\MenuManagerApi.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
2
WeaponPaints.sln.DotSettings.user
Normal file
2
WeaponPaints.sln.DotSettings.user
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||||
|
<s:Boolean x:Key="/Default/AddReferences/RecentPaths/=C_003A_005CUsers_005Cxdaff_005CDocuments_005CGitHub_005Ccs2_002DWeaponPaints_005C3rd_005Fparty_005CMenuManagerApi_002Edll/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
using MySqlConnector;
|
using MySqlConnector;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
|
|
||||||
|
|
||||||
namespace WeaponPaints
|
namespace WeaponPaints
|
||||||
{
|
{
|
||||||
internal class WeaponSynchronization
|
internal class WeaponSynchronization
|
||||||
@@ -20,7 +21,7 @@ namespace WeaponPaints
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
await using var connection = await _database.GetConnectionAsync();
|
await using var connection = await _database.GetConnectionAsync();
|
||||||
|
|
||||||
if (_config.Additional.KnifeEnabled)
|
if (_config.Additional.KnifeEnabled)
|
||||||
GetKnifeFromDatabase(player, connection);
|
GetKnifeFromDatabase(player, connection);
|
||||||
if (_config.Additional.GloveEnabled)
|
if (_config.Additional.GloveEnabled)
|
||||||
@@ -51,7 +52,7 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
if (!string.IsNullOrEmpty(playerKnife))
|
if (!string.IsNullOrEmpty(playerKnife))
|
||||||
{
|
{
|
||||||
WeaponPaints.g_playersKnife[player.Slot] = playerKnife;
|
WeaponPaints.GPlayersKnife[player.Slot] = playerKnife;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -72,7 +73,7 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
if (gloveData != null)
|
if (gloveData != null)
|
||||||
{
|
{
|
||||||
WeaponPaints.g_playersGlove[player.Slot] = gloveData.Value;
|
WeaponPaints.GPlayersGlove[player.Slot] = gloveData.Value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -97,7 +98,7 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
if (!string.IsNullOrEmpty(agentCT) || !string.IsNullOrEmpty(agentT))
|
if (!string.IsNullOrEmpty(agentCT) || !string.IsNullOrEmpty(agentT))
|
||||||
{
|
{
|
||||||
WeaponPaints.g_playersAgent[player.Slot] = (
|
WeaponPaints.GPlayersAgent[player.Slot] = (
|
||||||
agentCT,
|
agentCT,
|
||||||
agentT
|
agentT
|
||||||
);
|
);
|
||||||
@@ -127,18 +128,85 @@ namespace WeaponPaints
|
|||||||
int weaponPaintId = row?.weapon_paint_id ?? 0;
|
int weaponPaintId = row?.weapon_paint_id ?? 0;
|
||||||
float weaponWear = row?.weapon_wear ?? 0f;
|
float weaponWear = row?.weapon_wear ?? 0f;
|
||||||
int weaponSeed = row?.weapon_seed ?? 0;
|
int weaponSeed = row?.weapon_seed ?? 0;
|
||||||
|
string weaponNameTag = row?.weapon_nametag ?? "";
|
||||||
|
|
||||||
|
string[]? keyChainParts = row?.weapon_keychain?.ToString().Split(';');
|
||||||
|
|
||||||
|
KeyChainInfo keyChainInfo = new KeyChainInfo();
|
||||||
|
|
||||||
|
if (keyChainParts!.Length == 5 &&
|
||||||
|
uint.TryParse(keyChainParts[0], out uint keyChainId) &&
|
||||||
|
float.TryParse(keyChainParts[1], out float keyChainOffsetX) &&
|
||||||
|
float.TryParse(keyChainParts[2], out float keyChainOffsetY) &&
|
||||||
|
float.TryParse(keyChainParts[3], out float keyChainOffsetZ) &&
|
||||||
|
uint.TryParse(keyChainParts[4], out uint keyChainSeed))
|
||||||
|
{
|
||||||
|
// Successfully parsed the values
|
||||||
|
keyChainInfo.Id = keyChainId;
|
||||||
|
keyChainInfo.OffsetX = keyChainOffsetX;
|
||||||
|
keyChainInfo.OffsetY = keyChainOffsetY;
|
||||||
|
keyChainInfo.OffsetZ = keyChainOffsetZ;
|
||||||
|
keyChainInfo.Seed = keyChainSeed;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Failed to parse the values, default to 0
|
||||||
|
keyChainInfo.Id = 0;
|
||||||
|
keyChainInfo.OffsetX = 0f;
|
||||||
|
keyChainInfo.OffsetY = 0f;
|
||||||
|
keyChainInfo.OffsetZ = 0f;
|
||||||
|
keyChainInfo.Seed = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the WeaponInfo object
|
||||||
WeaponInfo weaponInfo = new WeaponInfo
|
WeaponInfo weaponInfo = new WeaponInfo
|
||||||
{
|
{
|
||||||
Paint = weaponPaintId,
|
Paint = weaponPaintId,
|
||||||
Seed = weaponSeed,
|
Seed = weaponSeed,
|
||||||
Wear = weaponWear
|
Wear = weaponWear,
|
||||||
|
Nametag = weaponNameTag,
|
||||||
|
KeyChain = keyChainInfo
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Retrieve and parse sticker data (up to 5 slots)
|
||||||
|
for (int i = 0; i <= 4; i++)
|
||||||
|
{
|
||||||
|
// Access the sticker data dynamically using reflection
|
||||||
|
string stickerColumn = $"weapon_sticker_{i}";
|
||||||
|
var stickerData = ((IDictionary<string, object>)row!)[stickerColumn]; // Safely cast row to a dictionary
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(stickerData.ToString())) continue;
|
||||||
|
|
||||||
|
var parts = stickerData.ToString()!.Split(';');
|
||||||
|
|
||||||
|
//"id;schema;x;y;wear;scale;rotation"
|
||||||
|
if (parts.Length != 7 ||
|
||||||
|
!uint.TryParse(parts[0], out uint stickerId) ||
|
||||||
|
!uint.TryParse(parts[1], out uint stickerSchema) ||
|
||||||
|
!float.TryParse(parts[2], out float stickerOffsetX) ||
|
||||||
|
!float.TryParse(parts[3], out float stickerOffsetY) ||
|
||||||
|
!float.TryParse(parts[4], out float stickerWear) ||
|
||||||
|
!float.TryParse(parts[5], out float stickerScale) ||
|
||||||
|
!float.TryParse(parts[6], out float stickerRotation)) continue;
|
||||||
|
|
||||||
|
StickerInfo stickerInfo = new StickerInfo
|
||||||
|
{
|
||||||
|
Id = stickerId,
|
||||||
|
Schema = stickerSchema,
|
||||||
|
OffsetX = stickerOffsetX,
|
||||||
|
OffsetY = stickerOffsetY,
|
||||||
|
Wear = stickerWear,
|
||||||
|
Scale = stickerScale,
|
||||||
|
Rotation = stickerRotation
|
||||||
|
};
|
||||||
|
|
||||||
|
weaponInfo.Stickers.Add(stickerInfo);
|
||||||
|
}
|
||||||
|
|
||||||
weaponInfos[weaponDefIndex] = weaponInfo;
|
weaponInfos[weaponDefIndex] = weaponInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
WeaponPaints.gPlayerWeaponsInfo[player.Slot] = weaponInfos;
|
WeaponPaints.GPlayerWeaponsInfo[player.Slot] = weaponInfos;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -158,7 +226,7 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
if (musicData != null)
|
if (musicData != null)
|
||||||
{
|
{
|
||||||
WeaponPaints.g_playersMusic[player.Slot] = musicData.Value;
|
WeaponPaints.GPlayersMusic[player.Slot] = musicData.Value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -167,14 +235,12 @@ namespace WeaponPaints
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
internal async Task SyncKnifeToDatabase(PlayerInfo player, string knife)
|
internal async Task SyncKnifeToDatabase(PlayerInfo player, string knife)
|
||||||
{
|
{
|
||||||
if (!_config.Additional.KnifeEnabled || 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";
|
const string query = "INSERT INTO `wp_player_knife` (`steamid`, `knife`) VALUES(@steamid, @newKnife) ON DUPLICATE KEY UPDATE `knife` = @newKnife";
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
await using var connection = await _database.GetConnectionAsync();
|
await using var connection = await _database.GetConnectionAsync();
|
||||||
@@ -217,7 +283,7 @@ namespace WeaponPaints
|
|||||||
{
|
{
|
||||||
await using var connection = await _database.GetConnectionAsync();
|
await using var connection = await _database.GetConnectionAsync();
|
||||||
|
|
||||||
await connection.ExecuteAsync(query, new { steamid = player.SteamId, agent_ct = WeaponPaints.g_playersAgent[player.Slot].CT, agent_t = WeaponPaints.g_playersAgent[player.Slot].T });
|
await connection.ExecuteAsync(query, new { steamid = player.SteamId, agent_ct = WeaponPaints.GPlayersAgent[player.Slot].CT, agent_t = WeaponPaints.GPlayersAgent[player.Slot].T });
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -227,7 +293,7 @@ namespace WeaponPaints
|
|||||||
|
|
||||||
internal async Task SyncWeaponPaintsToDatabase(PlayerInfo player)
|
internal async Task SyncWeaponPaintsToDatabase(PlayerInfo player)
|
||||||
{
|
{
|
||||||
if (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;
|
return;
|
||||||
|
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"ChangeSubclass": {
|
"ChangeSubclass": {
|
||||||
"signatures": {
|
"signatures": {
|
||||||
"library": "server",
|
"library": "server",
|
||||||
"windows": "40 57 48 83 EC 20 48 8B F9 41 B0 01",
|
"windows": "48 89 6C 24 ? 56 48 83 EC ? 48 8B EA 48 8B F1 E8 ? ? ? ? 84 C0 0F 84",
|
||||||
"linux": "55 48 89 E5 41 57 41 56 41 55 49 89 F5 41 54 49 89 FC 53 48 81 EC A8 00 00 00"
|
"linux": "55 48 89 E5 41 57 41 56 41 55 49 89 F5 41 54 49 89 FC 53 48 81 EC A8 00 00 00"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,392 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"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": 2,
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/agent-4613.png",
|
|
||||||
"model": "tm_professional/tm_professional_varf5",
|
|
||||||
"agent_name": "Bloody Darryl The Strapped | 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"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
1
website/data/agents_bg.json
Normal file
1
website/data/agents_bg.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_cs.json
Normal file
1
website/data/agents_cs.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_da.json
Normal file
1
website/data/agents_da.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_de.json
Normal file
1
website/data/agents_de.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_el.json
Normal file
1
website/data/agents_el.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_en.json
Normal file
1
website/data/agents_en.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_es-ES.json
Normal file
1
website/data/agents_es-ES.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_es-MX.json
Normal file
1
website/data/agents_es-MX.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_fi.json
Normal file
1
website/data/agents_fi.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_fr.json
Normal file
1
website/data/agents_fr.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_hu.json
Normal file
1
website/data/agents_hu.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_it.json
Normal file
1
website/data/agents_it.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_ja.json
Normal file
1
website/data/agents_ja.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_ko.json
Normal file
1
website/data/agents_ko.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_nl.json
Normal file
1
website/data/agents_nl.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_no.json
Normal file
1
website/data/agents_no.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_pl.json
Normal file
1
website/data/agents_pl.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_pt-BR.json
Normal file
1
website/data/agents_pt-BR.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_pt-PT.json
Normal file
1
website/data/agents_pt-PT.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_ro.json
Normal file
1
website/data/agents_ro.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_ru.json
Normal file
1
website/data/agents_ru.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_sv.json
Normal file
1
website/data/agents_sv.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_th.json
Normal file
1
website/data/agents_th.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_tr.json
Normal file
1
website/data/agents_tr.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_uk.json
Normal file
1
website/data/agents_uk.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_vi.json
Normal file
1
website/data/agents_vi.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_zh-CN.json
Normal file
1
website/data/agents_zh-CN.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/agents_zh-TW.json
Normal file
1
website/data/agents_zh-TW.json
Normal file
File diff suppressed because one or more lines are too long
@@ -1,440 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"weapon_defindex": 0,
|
|
||||||
"paint": "0",
|
|
||||||
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/default_gloves.png",
|
|
||||||
"paint_name": "Gloves | Default"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 4725,
|
|
||||||
"paint": "10085",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10085.png",
|
|
||||||
"paint_name": "★ Broken Fang Gloves | Jade"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 4725,
|
|
||||||
"paint": "10086",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10086.png",
|
|
||||||
"paint_name": "★ Broken Fang Gloves | Yellow-banded"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 4725,
|
|
||||||
"paint": "10087",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10087.png",
|
|
||||||
"paint_name": "★ Broken Fang Gloves | Needle Point"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 4725,
|
|
||||||
"paint": "10088",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10088.png",
|
|
||||||
"paint_name": "★ Broken Fang Gloves | Unhinged"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5027,
|
|
||||||
"paint": "10006",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10006.png",
|
|
||||||
"paint_name": "★ Bloodhound Gloves | Charred"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5027,
|
|
||||||
"paint": "10007",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10007.png",
|
|
||||||
"paint_name": "★ Bloodhound Gloves | Snakebite"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5027,
|
|
||||||
"paint": "10008",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10008.png",
|
|
||||||
"paint_name": "★ Bloodhound Gloves | Bronzed"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5027,
|
|
||||||
"paint": "10039",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10039.png",
|
|
||||||
"paint_name": "★ Bloodhound Gloves | Guerrilla"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5030,
|
|
||||||
"paint": "10018",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10018.png",
|
|
||||||
"paint_name": "★ Sport Gloves | Superconductor"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5030,
|
|
||||||
"paint": "10019",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10019.png",
|
|
||||||
"paint_name": "★ Sport Gloves | Arid"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5030,
|
|
||||||
"paint": "10037",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10037.png",
|
|
||||||
"paint_name": "★ Sport Gloves | Pandora's Box"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5030,
|
|
||||||
"paint": "10038",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10038.png",
|
|
||||||
"paint_name": "★ Sport Gloves | Hedge Maze"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5030,
|
|
||||||
"paint": "10045",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10045.png",
|
|
||||||
"paint_name": "★ Sport Gloves | Amphibious"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5030,
|
|
||||||
"paint": "10046",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10046.png",
|
|
||||||
"paint_name": "★ Sport Gloves | Bronze Morph"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5030,
|
|
||||||
"paint": "10047",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10047.png",
|
|
||||||
"paint_name": "★ Sport Gloves | Omega"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5030,
|
|
||||||
"paint": "10048",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10048.png",
|
|
||||||
"paint_name": "★ Sport Gloves | Vice"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5030,
|
|
||||||
"paint": "10073",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10073.png",
|
|
||||||
"paint_name": "★ Sport Gloves | Slingshot"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5030,
|
|
||||||
"paint": "10074",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10074.png",
|
|
||||||
"paint_name": "★ Sport Gloves | Big Game"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5030,
|
|
||||||
"paint": "10075",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10075.png",
|
|
||||||
"paint_name": "★ Sport Gloves | Scarlet Shamagh"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5030,
|
|
||||||
"paint": "10076",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10076.png",
|
|
||||||
"paint_name": "★ Sport Gloves | Nocts"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5031,
|
|
||||||
"paint": "10013",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10013.png",
|
|
||||||
"paint_name": "★ Driver Gloves | Lunar Weave"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5031,
|
|
||||||
"paint": "10015",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10015.png",
|
|
||||||
"paint_name": "★ Driver Gloves | Convoy"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5031,
|
|
||||||
"paint": "10016",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10016.png",
|
|
||||||
"paint_name": "★ Driver Gloves | Crimson Weave"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5031,
|
|
||||||
"paint": "10040",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10040.png",
|
|
||||||
"paint_name": "★ Driver Gloves | Diamondback"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5031,
|
|
||||||
"paint": "10041",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10041.png",
|
|
||||||
"paint_name": "★ Driver Gloves | King Snake"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5031,
|
|
||||||
"paint": "10042",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10042.png",
|
|
||||||
"paint_name": "★ Driver Gloves | Imperial Plaid"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5031,
|
|
||||||
"paint": "10043",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10043.png",
|
|
||||||
"paint_name": "★ Driver Gloves | Overtake"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5031,
|
|
||||||
"paint": "10044",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10044.png",
|
|
||||||
"paint_name": "★ Driver Gloves | Racing Green"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5031,
|
|
||||||
"paint": "10069",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10069.png",
|
|
||||||
"paint_name": "★ Driver Gloves | Rezan the Red"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5031,
|
|
||||||
"paint": "10070",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10070.png",
|
|
||||||
"paint_name": "★ Driver Gloves | Snow Leopard"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5031,
|
|
||||||
"paint": "10071",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10071.png",
|
|
||||||
"paint_name": "★ Driver Gloves | Queen Jaguar"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5031,
|
|
||||||
"paint": "10072",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10072.png",
|
|
||||||
"paint_name": "★ Driver Gloves | Black Tie"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5032,
|
|
||||||
"paint": "10009",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10009.png",
|
|
||||||
"paint_name": "★ Hand Wraps | Leather"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5032,
|
|
||||||
"paint": "10010",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10010.png",
|
|
||||||
"paint_name": "★ Hand Wraps | Spruce DDPAT"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5032,
|
|
||||||
"paint": "10021",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10021.png",
|
|
||||||
"paint_name": "★ Hand Wraps | Slaughter"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5032,
|
|
||||||
"paint": "10036",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10036.png",
|
|
||||||
"paint_name": "★ Hand Wraps | Badlands"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5032,
|
|
||||||
"paint": "10053",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10053.png",
|
|
||||||
"paint_name": "★ Hand Wraps | Cobalt Skulls"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5032,
|
|
||||||
"paint": "10054",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10054.png",
|
|
||||||
"paint_name": "★ Hand Wraps | Overprint"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5032,
|
|
||||||
"paint": "10055",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10055.png",
|
|
||||||
"paint_name": "★ Hand Wraps | Duct Tape"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5032,
|
|
||||||
"paint": "10056",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10056.png",
|
|
||||||
"paint_name": "★ Hand Wraps | Arboreal"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5032,
|
|
||||||
"paint": "10081",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10081.png",
|
|
||||||
"paint_name": "★ Hand Wraps | Desert Shamagh"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5032,
|
|
||||||
"paint": "10082",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10082.png",
|
|
||||||
"paint_name": "★ Hand Wraps | Giraffe"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5032,
|
|
||||||
"paint": "10083",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10083.png",
|
|
||||||
"paint_name": "★ Hand Wraps | Constrictor"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5032,
|
|
||||||
"paint": "10084",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10084.png",
|
|
||||||
"paint_name": "★ Hand Wraps | CAUTION!"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5033,
|
|
||||||
"paint": "10024",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10024.png",
|
|
||||||
"paint_name": "★ Moto Gloves | Eclipse"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5033,
|
|
||||||
"paint": "10026",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10026.png",
|
|
||||||
"paint_name": "★ Moto Gloves | Spearmint"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5033,
|
|
||||||
"paint": "10027",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10027.png",
|
|
||||||
"paint_name": "★ Moto Gloves | Boom!"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5033,
|
|
||||||
"paint": "10028",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10028.png",
|
|
||||||
"paint_name": "★ Moto Gloves | Cool Mint"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5033,
|
|
||||||
"paint": "10049",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10049.png",
|
|
||||||
"paint_name": "★ Moto Gloves | POW!"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5033,
|
|
||||||
"paint": "10050",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10050.png",
|
|
||||||
"paint_name": "★ Moto Gloves | Turtle"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5033,
|
|
||||||
"paint": "10051",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10051.png",
|
|
||||||
"paint_name": "★ Moto Gloves | Transport"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5033,
|
|
||||||
"paint": "10052",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10052.png",
|
|
||||||
"paint_name": "★ Moto Gloves | Polygon"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5033,
|
|
||||||
"paint": "10077",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10077.png",
|
|
||||||
"paint_name": "★ Moto Gloves | Finish Line"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5033,
|
|
||||||
"paint": "10078",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10078.png",
|
|
||||||
"paint_name": "★ Moto Gloves | Smoke Out"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5033,
|
|
||||||
"paint": "10079",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10079.png",
|
|
||||||
"paint_name": "★ Moto Gloves | Blood Pressure"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5033,
|
|
||||||
"paint": "10080",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10080.png",
|
|
||||||
"paint_name": "★ Moto Gloves | 3rd Commando Company"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5034,
|
|
||||||
"paint": "10030",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10030.png",
|
|
||||||
"paint_name": "★ Specialist Gloves | Forest DDPAT"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5034,
|
|
||||||
"paint": "10033",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10033.png",
|
|
||||||
"paint_name": "★ Specialist Gloves | Crimson Kimono"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5034,
|
|
||||||
"paint": "10034",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10034.png",
|
|
||||||
"paint_name": "★ Specialist Gloves | Emerald Web"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5034,
|
|
||||||
"paint": "10035",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10035.png",
|
|
||||||
"paint_name": "★ Specialist Gloves | Foundation"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5034,
|
|
||||||
"paint": "10061",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10061.png",
|
|
||||||
"paint_name": "★ Specialist Gloves | Crimson Web"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5034,
|
|
||||||
"paint": "10062",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10062.png",
|
|
||||||
"paint_name": "★ Specialist Gloves | Buckshot"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5034,
|
|
||||||
"paint": "10063",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10063.png",
|
|
||||||
"paint_name": "★ Specialist Gloves | Fade"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5034,
|
|
||||||
"paint": "10064",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10064.png",
|
|
||||||
"paint_name": "★ Specialist Gloves | Mogul"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5034,
|
|
||||||
"paint": "10065",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10065.png",
|
|
||||||
"paint_name": "★ Specialist Gloves | Marble Fade"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5034,
|
|
||||||
"paint": "10066",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10066.png",
|
|
||||||
"paint_name": "★ Specialist Gloves | Lt. Commander"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5034,
|
|
||||||
"paint": "10067",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10067.png",
|
|
||||||
"paint_name": "★ Specialist Gloves | Tiger Strike"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5034,
|
|
||||||
"paint": "10068",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10068.png",
|
|
||||||
"paint_name": "★ Specialist Gloves | Field Agent"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5035,
|
|
||||||
"paint": "10057",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10057.png",
|
|
||||||
"paint_name": "★ Hydra Gloves | Emerald"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5035,
|
|
||||||
"paint": "10058",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10058.png",
|
|
||||||
"paint_name": "★ Hydra Gloves | Mangrove"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5035,
|
|
||||||
"paint": "10059",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10059.png",
|
|
||||||
"paint_name": "★ Hydra Gloves | Rattler"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"weapon_defindex": 5035,
|
|
||||||
"paint": "10060",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10060.png",
|
|
||||||
"paint_name": "★ Hydra Gloves | Case Hardened"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
1
website/data/gloves_bg.json
Normal file
1
website/data/gloves_bg.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_cs.json
Normal file
1
website/data/gloves_cs.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_da.json
Normal file
1
website/data/gloves_da.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_de.json
Normal file
1
website/data/gloves_de.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_el.json
Normal file
1
website/data/gloves_el.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_en.json
Normal file
1
website/data/gloves_en.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/gloves_es-ES.json
Normal file
1
website/data/gloves_es-ES.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_es-MX.json
Normal file
1
website/data/gloves_es-MX.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_fi.json
Normal file
1
website/data/gloves_fi.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_fr.json
Normal file
1
website/data/gloves_fr.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_hu.json
Normal file
1
website/data/gloves_hu.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_it.json
Normal file
1
website/data/gloves_it.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_ja.json
Normal file
1
website/data/gloves_ja.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_ko.json
Normal file
1
website/data/gloves_ko.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_nl.json
Normal file
1
website/data/gloves_nl.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_no.json
Normal file
1
website/data/gloves_no.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_pl.json
Normal file
1
website/data/gloves_pl.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_pt-BR.json
Normal file
1
website/data/gloves_pt-BR.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_pt-PT.json
Normal file
1
website/data/gloves_pt-PT.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_ro.json
Normal file
1
website/data/gloves_ro.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_ru.json
Normal file
1
website/data/gloves_ru.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_sv.json
Normal file
1
website/data/gloves_sv.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_th.json
Normal file
1
website/data/gloves_th.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_tr.json
Normal file
1
website/data/gloves_tr.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_uk.json
Normal file
1
website/data/gloves_uk.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_vi.json
Normal file
1
website/data/gloves_vi.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_zh-CN.json
Normal file
1
website/data/gloves_zh-CN.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
1
website/data/gloves_zh-TW.json
Normal file
1
website/data/gloves_zh-TW.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[{"weapon_defindex":0,"paint":0,"image":"","paint_name":"Gloves | Default"}]
|
||||||
@@ -1,367 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"id": "3",
|
|
||||||
"name": "Music Kit | Daniel Sadowski, Crimson Assault",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-3.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "4",
|
|
||||||
"name": "Music Kit | Noisia, Sharpened",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-4.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "5",
|
|
||||||
"name": "Music Kit | Robert Allaire, Insurgency",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-5.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "6",
|
|
||||||
"name": "Music Kit | Sean Murray, A*D*8",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-6.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "7",
|
|
||||||
"name": "Music Kit | Feed Me, High Noon",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-7.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "8",
|
|
||||||
"name": "Music Kit | Dren, Death's Head Demolition",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-8.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "9",
|
|
||||||
"name": "Music Kit | Austin Wintory, Desert Fire",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-9.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "10",
|
|
||||||
"name": "Music Kit | Sasha, LNOE",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-10.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "11",
|
|
||||||
"name": "Music Kit | Skog, Metal",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-11.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "12",
|
|
||||||
"name": "Music Kit | Midnight Riders, All I Want for Christmas",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-12.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "13",
|
|
||||||
"name": "Music Kit | Matt Lange, IsoRhythm",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-13.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "14",
|
|
||||||
"name": "Music Kit | Mateo Messina, For No Mankind",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-14.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "15",
|
|
||||||
"name": "Music Kit | Various Artists, Hotline Miami",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-15.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "16",
|
|
||||||
"name": "Music Kit | Daniel Sadowski, Total Domination",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-16.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "17",
|
|
||||||
"name": "Music Kit | Damjan Mravunac, The Talos Principle",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-17.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "18",
|
|
||||||
"name": "Music Kit | Proxy, Battlepack",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-18.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "19",
|
|
||||||
"name": "Music Kit | Ki:Theory, MOLOTOV",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-19.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "20",
|
|
||||||
"name": "Music Kit | Troels Folmann, Uber Blasto Phone",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-20.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "21",
|
|
||||||
"name": "Music Kit | Kelly Bailey, Hazardous Environments",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-21.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "22",
|
|
||||||
"name": "Music Kit | Skog, II-Headshot",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-22.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "23",
|
|
||||||
"name": "Music Kit | Daniel Sadowski, The 8-Bit Kit",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-23.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "24",
|
|
||||||
"name": "Music Kit | AWOLNATION, I Am",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-24.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "25",
|
|
||||||
"name": "Music Kit | Mord Fustang, Diamonds",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-25.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "26",
|
|
||||||
"name": "Music Kit | Michael Bross, Invasion!",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-26.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "27",
|
|
||||||
"name": "Music Kit | Ian Hultquist, Lion's Mouth",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-27.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "28",
|
|
||||||
"name": "Music Kit | New Beat Fund, Sponge Fingerz",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-28.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "29",
|
|
||||||
"name": "Music Kit | Beartooth, Disgusting",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-29.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "30",
|
|
||||||
"name": "Music Kit | Lennie Moore, Java Havana Funkaloo",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-30.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "31",
|
|
||||||
"name": "Music Kit | Darude, Moments CS:GO",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-31.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "32",
|
|
||||||
"name": "Music Kit | Beartooth, Aggressive",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-32.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "33",
|
|
||||||
"name": "Music Kit | Blitz Kids, The Good Youth",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-33.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "34",
|
|
||||||
"name": "Music Kit | Hundredth, FREE",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-34.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "35",
|
|
||||||
"name": "Music Kit | Neck Deep, Life's Not Out To Get You",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-35.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "36",
|
|
||||||
"name": "Music Kit | Roam, Backbone",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-36.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "37",
|
|
||||||
"name": "Music Kit | Twin Atlantic, GLA",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-37.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "38",
|
|
||||||
"name": "Music Kit | Skog, III-Arena",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-38.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "39",
|
|
||||||
"name": "Music Kit | The Verkkars, EZ4ENCE",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-39.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "40",
|
|
||||||
"name": "Halo, The Master Chief Collection",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-40.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "41",
|
|
||||||
"name": "Music Kit | Scarlxrd: King, Scar",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-41.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "42",
|
|
||||||
"name": "Half-Life: Alyx, Anti-Citizen",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-42.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "43",
|
|
||||||
"name": "Music Kit | Austin Wintory, Bachram",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-43.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "44",
|
|
||||||
"name": "Music Kit | Dren, Gunman Taco Truck",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-44.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "45",
|
|
||||||
"name": "Music Kit | Daniel Sadowski, Eye of the Dragon",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-45.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "46",
|
|
||||||
"name": "Music Kit | Tree Adams and Ben Bromfield, M.U.D.D. FORCE",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-46.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "47",
|
|
||||||
"name": "Music Kit | Tim Huling, Neo Noir",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-47.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "48",
|
|
||||||
"name": "Music Kit | Sam Marshall, Bodacious",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-48.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "49",
|
|
||||||
"name": "Music Kit | Matt Levine, Drifter",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-49.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "50",
|
|
||||||
"name": "Music Kit | Amon Tobin, All for Dust",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-50.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "51",
|
|
||||||
"name": "Darren Korb, Hades Music Kit",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-51.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "52",
|
|
||||||
"name": "Music Kit | Neck Deep, The Lowlife Pack",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-52.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "53",
|
|
||||||
"name": "Music Kit | Scarlxrd, CHAIN$AW.LXADXUT.",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-53.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "54",
|
|
||||||
"name": "Music Kit | Austin Wintory, Mocha Petal",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-54.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "55",
|
|
||||||
"name": "Music Kit | Chipzel, ~Yellow Magic~",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-55.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "56",
|
|
||||||
"name": "Music Kit | Freaky DNA, Vici",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-56.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "57",
|
|
||||||
"name": "Music Kit | Jesse Harlin, Astro Bellum",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-57.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "58",
|
|
||||||
"name": "Music Kit | Laura Shigihara: Work Hard, Play Hard",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-58.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "59",
|
|
||||||
"name": "Music Kit | Sarah Schachner, KOLIBRI",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-59.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "60",
|
|
||||||
"name": "Music Kit | bbno$, u mad!",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-60.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "61",
|
|
||||||
"name": "Music Kit | The Verkkars & n0thing, Flashbang Dance",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-61.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "62",
|
|
||||||
"name": "Music Kit | 3kliksphilip, Heading for the Source",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-62.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "63",
|
|
||||||
"name": "Music Kit | Humanity's Last Breath, Void",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-63.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "64",
|
|
||||||
"name": "Music Kit | Juelz, Shooters",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-64.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "65",
|
|
||||||
"name": "Music Kit | Knock2, dashstar*",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-65.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "66",
|
|
||||||
"name": "Music Kit | Meechy Darko, Gothic Luxury",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-66.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "67",
|
|
||||||
"name": "Music Kit | Sullivan King, Lock Me Up",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-67.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "68",
|
|
||||||
"name": "Music Kit | Perfect World, 花脸 Hua Lian (Painted Face)",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-68.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "69",
|
|
||||||
"name": "Music Kit | Denzel Curry, ULTIMATE",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-69.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "71",
|
|
||||||
"name": "Music Kit | DRYDEN, Feel The Power",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-71.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "72",
|
|
||||||
"name": "Music Kit | ISOxo, inhuman",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-72.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "73",
|
|
||||||
"name": "Music Kit | KILL SCRIPT, All Night",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-73.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "74",
|
|
||||||
"name": "Music Kit | Knock2, Make U SWEAT!",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-74.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "75",
|
|
||||||
"name": "Music Kit | Rad Cat, Reason",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-75.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "76",
|
|
||||||
"name": "Music Kit | TWERL, Ekko & Sidetrack, Under Bright Lights",
|
|
||||||
"image": "https://raw.githubusercontent.com/daffyyyy/cs2-WeaponPaints/main/website/img/skins/music_kit-76.png"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
1
website/data/music_bg.json
Normal file
1
website/data/music_bg.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_cs.json
Normal file
1
website/data/music_cs.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_da.json
Normal file
1
website/data/music_da.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_de.json
Normal file
1
website/data/music_de.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_el.json
Normal file
1
website/data/music_el.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_en.json
Normal file
1
website/data/music_en.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_es-ES.json
Normal file
1
website/data/music_es-ES.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_es-MX.json
Normal file
1
website/data/music_es-MX.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_fi.json
Normal file
1
website/data/music_fi.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_fr.json
Normal file
1
website/data/music_fr.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_hu.json
Normal file
1
website/data/music_hu.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_it.json
Normal file
1
website/data/music_it.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_ja.json
Normal file
1
website/data/music_ja.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_ko.json
Normal file
1
website/data/music_ko.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_nl.json
Normal file
1
website/data/music_nl.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_no.json
Normal file
1
website/data/music_no.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_pl.json
Normal file
1
website/data/music_pl.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_pt-BR.json
Normal file
1
website/data/music_pt-BR.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_pt-PT.json
Normal file
1
website/data/music_pt-PT.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_ro.json
Normal file
1
website/data/music_ro.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_ru.json
Normal file
1
website/data/music_ru.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_sv.json
Normal file
1
website/data/music_sv.json
Normal file
File diff suppressed because one or more lines are too long
1
website/data/music_th.json
Normal file
1
website/data/music_th.json
Normal file
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user