Compare commits

..

6 Commits

Author SHA1 Message Date
Nereziel
d83783b7af Update Commands.cs 2024-02-03 17:46:01 +01:00
Nereziel
8e7b4a2d40 add fixes from 1.4c 2024-02-03 17:44:40 +01:00
Nereziel
e0fce7a4b4 Update README.md 2024-02-03 16:50:33 +01:00
Nereziel
8f0e8a0a63 forgot file and maybe min compatible php 5.5 2024-02-03 16:43:50 +01:00
Nereziel
eb6cdfc98d updated website for new db 2024-02-03 16:16:56 +01:00
Nereziel
56537971ad test update
min CSShrap 155
globalshare not working
db remake
add option to not use ontick fix to cs2 weapon models
!skins will save only changed weapon
2024-02-03 05:34:10 +01:00
14590 changed files with 1992 additions and 1930697 deletions

14
.github/FUNDING.yml vendored
View File

@@ -1,14 +0,0 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: nereziel # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
polar: # Replace with a single Polar username
custom: ['https://steamcommunity.com/tradeoffer/new/?partner=41515647&token=gW2W-nXE'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

View File

@@ -30,7 +30,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: 8.0.x
dotnet-version: 7.0.x
- name: Restore
run: dotnet restore
- name: Build
@@ -46,7 +46,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: 8.0.x
dotnet-version: 7.0.x
- name: Restore
run: dotnet restore
- name: Build
@@ -58,10 +58,14 @@ jobs:
${{ env.OUTPUT_PATH }}/McMaster.NETCore.Plugins.dll \
${{ env.OUTPUT_PATH }}/Microsoft.DotNet.PlatformAbstractions.dll \
${{ env.OUTPUT_PATH }}/Microsoft.Extensions.DependencyModel.dll \
- name: Copy skins
run: cp -R website/data ${{ env.OUTPUT_PATH }}
- name: Copy skins.json
run: cp website/data/skins.json ${{ env.OUTPUT_PATH }}/skins.json
- name: Zip
run: zip -r "${{ env.PROJECT_NAME }}.zip" "${{ env.OUTPUT_PATH }}" gamedata/
uses: thedoctor0/zip-release@0.7.5
with:
type: 'zip'
filename: '${{ env.PROJECT_NAME }}.zip'
path: ${{ env.OUTPUT_PATH }}
- name: Clean files Website
run: |
rm -rf website/img/

5
.gitignore vendored
View File

@@ -1,6 +1,5 @@
.vs/
bin/
obj/
website/getskins.php
.idea/
WeaponPaints.sln.DotSettings.user
.test/

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -3,78 +3,60 @@ using System.Text.Json.Serialization;
namespace WeaponPaints
{
public class Additional
public class AdditionalSetting
{
[JsonPropertyName("UseMetamodAlwaysLegacyModel")]
public bool UseMetamodAlwaysLegacyModel { get; set; } = false;
[JsonPropertyName("SkinVisibilityFix")]
public bool SkinVisibilityFix { get; set; } = true;
[JsonPropertyName("KnifeEnabled")]
public bool KnifeEnabled { get; set; } = true;
[JsonPropertyName("GloveEnabled")]
public bool GloveEnabled { get; set; } = true;
[JsonPropertyName("MusicEnabled")]
public bool MusicEnabled { get; set; } = true;
[JsonPropertyName("AgentEnabled")]
public bool AgentEnabled { get; set; } = true;
[JsonPropertyName("SkinEnabled")]
public bool SkinEnabled { get; set; } = true;
[JsonPropertyName("PinsEnabled")]
public bool PinsEnabled { get; set; } = true;
[JsonPropertyName("MusicKitEnabled")]
public bool MusicKitEnabled { get; set; } = true;
[JsonPropertyName("CommandWpEnabled")]
[JsonPropertyName("NameTagEnabled")]
public bool NameTagEnabled { get; set; } = true;
[JsonPropertyName("CommandWpEnabled")]
public bool CommandWpEnabled { get; set; } = true;
[JsonPropertyName("CommandKillEnabled")]
public bool CommandKillEnabled { get; set; } = true;
[JsonPropertyName("CommandKnife")]
public List<string> CommandKnife { get; set; } = ["knife"];
[JsonPropertyName("CommandMusic")]
public List<string> CommandMusic { get; set; } = ["music"];
[JsonPropertyName("CommandPin")]
public List<string> CommandPin { get; set; } = ["pin", "pins", "coin", "coins"];
[JsonPropertyName("CommandGlove")]
public List<string> CommandGlove { get; set; } = ["gloves"];
[JsonPropertyName("CommandAgent")]
public List<string> CommandAgent { get; set; } = ["agents"];
[JsonPropertyName("CommandStattrak")]
public List<string> CommandStattrak { get; set; } = ["stattrak", "st"];
public string CommandKnife { get; set; } = "knife";
[JsonPropertyName("CommandSkin")]
public List<string> CommandSkin { get; set; } = ["ws"];
public string CommandSkin { get; set; } = "ws";
[JsonPropertyName("CommandSkinSelection")]
public List<string> CommandSkinSelection { get; set; } = ["skins"];
public string CommandSkinSelection { get; set; } = "skins";
[JsonPropertyName("CommandRefresh")]
public List<string> CommandRefresh { get; set; } = ["wp"];
public string CommandRefresh { get; set; } = "wp";
[JsonPropertyName("CommandKill")]
public List<string> CommandKill { get; set; } = ["kill"];
public string CommandKill { get; set; } = "kill";
[JsonPropertyName("GiveRandomKnife")]
public bool GiveRandomKnife { get; set; } = false;
[JsonPropertyName("GiveRandomSkin")]
public bool GiveRandomSkin { get; set; } = false;
[JsonPropertyName("ShowSkinImage")]
public bool ShowSkinImage { get; set; } = true;
[JsonPropertyName("GiveKnifeAfterRemove")]
public bool GiveKnifeAfterRemove { get; set; } = false;
}
public class WeaponPaintsConfig : BasePluginConfig
{
[JsonPropertyName("ConfigVersion")] public override int Version { get; set; } = 10;
[JsonPropertyName("SkinsLanguage")]
public string SkinsLanguage { get; set; } = "en";
public override int Version { get; set; } = 5;
[JsonPropertyName("DatabaseHost")]
public string DatabaseHost { get; set; } = "";
@@ -91,16 +73,20 @@ namespace WeaponPaints
[JsonPropertyName("DatabaseName")]
public string DatabaseName { get; set; } = "";
[JsonPropertyName("GlobalShare")]
public bool GlobalShare { get; set; } = false;
[JsonPropertyName("CmdRefreshCooldownSeconds")]
public int CmdRefreshCooldownSeconds { get; set; } = 3;
public int CmdRefreshCooldownSeconds { get; set; } = 60;
[JsonPropertyName("Prefix")]
public string Prefix { get; set; } = "[WeaponPaints]";
[JsonPropertyName("Website")]
public string Website { get; set; } = "example.com/skins";
[JsonPropertyName("Additional")]
public Additional Additional { get; set; } = new();
[JsonPropertyName("MenuType")]
public string MenuType { get; set; } = "selectable";
[JsonPropertyName("AdditionalSetting")]
public AdditionalSetting AdditionalSetting { get; set; } = new AdditionalSetting();
}
}
}

View File

@@ -1,23 +0,0 @@
using Microsoft.Extensions.Logging;
using MySqlConnector;
namespace WeaponPaints
{
public class Database(string dbConnectionString)
{
public async Task<MySqlConnection> GetConnectionAsync()
{
try
{
var connection = new MySqlConnection(dbConnectionString);
await connection.OpenAsync();
return connection;
}
catch (Exception ex)
{
WeaponPaints.Instance.Logger.LogError($"Unable to connect to database: {ex.Message}");
throw;
}
}
}
}

561
Events.cs
View File

@@ -1,352 +1,353 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes.Registration;
using CounterStrikeSharp.API.Modules.Entities;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using Microsoft.Extensions.Logging;
using System.Numerics;
namespace WeaponPaints
{
public partial class WeaponPaints
{
private bool _mvpPlayed;
[GameEventHandler]
public HookResult OnClientFullConnect(EventPlayerConnectFull @event, GameEventInfo info)
{
CCSPlayerController? player = @event.Userid;
if (player is null || !player.IsValid || player.IsBot ||
WeaponSync == null || Database == null) return HookResult.Continue;
var playerInfo = new PlayerInfo
{
UserId = player.UserId,
Slot = player.Slot,
Index = (int)player.Index,
SteamId = player.SteamID.ToString(),
Name = player.PlayerName,
IpAddress = player.IpAddress?.Split(":")[0]
};
try
{
_ = Task.Run(async () => await WeaponSync.GetPlayerData(playerInfo));
/*
if (Config.Additional.SkinEnabled)
{
_ = Task.Run(async () => await weaponSync.GetWeaponPaintsFromDatabase(playerInfo));
}
if (Config.Additional.KnifeEnabled)
{
_ = Task.Run(async () => await weaponSync.GetKnifeFromDatabase(playerInfo));
}
if (Config.Additional.GloveEnabled)
{
_ = Task.Run(async () => await weaponSync.GetGloveFromDatabase(playerInfo));
}
if (Config.Additional.AgentEnabled)
{
_ = Task.Run(async () => await weaponSync.GetAgentFromDatabase(playerInfo));
}
if (Config.Additional.MusicEnabled)
{
_ = Task.Run(async () => await weaponSync.GetMusicFromDatabase(playerInfo));
}
*/
}
catch
{
}
Players.Add(player);
return HookResult.Continue;
}
[GameEventHandler]
public HookResult OnPlayerDisconnect(EventPlayerDisconnect @event, GameEventInfo info)
private void OnClientPutInServer(int playerSlot)
{
CCSPlayerController? player = @event.Userid;
CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot);
if (player is null || !player.IsValid || player.IsBot) return HookResult.Continue;
var playerInfo = new PlayerInfo
PlayerInfo playerInfo = new PlayerInfo
{
UserId = player.UserId,
Slot = player.Slot,
Index = (int)player.Index,
SteamId = player.SteamID.ToString(),
SteamId = player.SteamID,
Name = player.PlayerName,
IpAddress = player.IpAddress?.Split(":")[0]
};
Task.Run(async () =>
{
if (WeaponSync != null)
await WeaponSync.SyncStatTrakToDatabase(playerInfo);
if (player == null || !player.IsValid || player.IsBot || player.IsHLTV || weaponSync == null) return;
if (Config.Additional.SkinEnabled)
{
GPlayerWeaponsInfo.TryRemove(player.Slot, out _);
}
Task.Run(async () =>
{
await weaponSync.GetPlayerDatabaseIndex(playerInfo);
});
}
if (Config.Additional.KnifeEnabled)
private void OnClientDisconnect(int playerSlot)
{
CCSPlayerController player = Utilities.GetPlayerFromSlot(playerSlot);
if (player == null || !player.IsValid || player.IsBot || player.IsHLTV || player.UserId == null) return;
g_playersDatabaseIndex.TryRemove((int)player.Index, out _);
if (Config.AdditionalSetting.KnifeEnabled)
g_playersKnife.TryRemove((int)player.Index, out _);
if (Config.AdditionalSetting.SkinEnabled)
{
GPlayersKnife.TryRemove(player.Slot, out _);
if (gPlayerWeaponsInfo.TryRemove((int)player.Index, out var innerDictionary))
{
innerDictionary.Clear();
}
}
if (Config.Additional.GloveEnabled)
if (Config.AdditionalSetting.MusicKitEnabled)
g_playersMusicKit.TryRemove((int)player.Index, out _);
if (commandsCooldown.ContainsKey((int)player.UserId))
{
GPlayersGlove.TryRemove(player.Slot, out _);
commandsCooldown.Remove((int)player.UserId);
}
if (Config.Additional.AgentEnabled)
}
private void OnEntityCreated(CEntityInstance entity)
{
if (!Config.AdditionalSetting.SkinEnabled) return;
if (entity == null || !entity.IsValid || string.IsNullOrEmpty(entity.DesignerName)) return;
string designerName = entity.DesignerName;
if (!weaponList.ContainsKey(designerName)) return;
bool isKnife = false;
var weapon = new CBasePlayerWeapon(entity.Handle);
if (designerName.Contains("knife") || designerName.Contains("bayonet"))
{
GPlayersAgent.TryRemove(player.Slot, out _);
isKnife = true;
}
if (Config.Additional.MusicEnabled)
Server.NextFrame(() =>
{
GPlayersMusic.TryRemove(player.Slot, out _);
}
if (Config.Additional.PinsEnabled)
{
GPlayersPin.TryRemove(player.Slot, out _);
}
_temporaryPlayerWeaponWear.TryRemove(player.Slot, out _);
CommandsCooldown.Remove(player.Slot);
Players.Remove(player);
try
{
if (!weapon.IsValid) return;
if (weapon.OwnerEntity.Value == null) return;
if (weapon.OwnerEntity.Index <= 0) return;
int weaponOwner = (int)weapon.OwnerEntity.Index;
var pawn = new CBasePlayerPawn(NativeAPI.GetEntityFromIndex(weaponOwner));
if (!pawn.IsValid) return;
var playerIndex = (int)pawn.Controller.Index;
var player = Utilities.GetPlayerFromIndex(playerIndex);
if (!Utility.IsPlayerValid(player)) return;
ChangeWeaponAttributes(weapon, player, isKnife);
}
catch (Exception) { }
});
}
private HookResult OnEventItemPurchasePost(EventItemPurchase @event, GameEventInfo info)
{
CCSPlayerController? player = @event.Userid;
if (player == null || !player.IsValid) return HookResult.Continue;
/*
if (Config.AdditionalSetting.SkinVisibilityFix)
AddTimer(0.2f, () => RefreshSkins(player));
*/
return HookResult.Continue;
}
/*
private HookResult OnItemPickup(EventItemPickup @event, GameEventInfo info)
{
if (@event.Defindex == 42 || @event.Defindex == 59)
{
CCSPlayerController? player = @event.Userid;
if (player == null || !player.IsValid || !g_knifePickupCount.ContainsKey((int)player.Index) || player.IsBot || !g_playersKnife.ContainsKey((int)player.Index))
return HookResult.Continue;
private void OnMapStart(string mapName)
if (g_knifePickupCount[(int)player.Index] >= 2) return HookResult.Continue;
if (g_playersKnife.ContainsKey((int)player.Index)
&&
g_playersKnife[(int)player.Index] != "weapon_knife")
{
g_knifePickupCount[(int)player.Index]++;
RemovePlayerKnife(player, true);
if (!PlayerHasKnife(player) && Config.AdditionalSetting.GiveKnifeAfterRemove)
AddTimer(0.3f, () => GiveKnifeToPlayer(player));
}
}
return HookResult.Continue;
}
*/
public HookResult OnPickup(CEntityIOOutput output, string name, CEntityInstance activator, CEntityInstance caller, CVariant value, float delay)
{
if (Config.Additional is { KnifeEnabled: false, SkinEnabled: false, GloveEnabled: false }) return;
if (Database != null)
WeaponSync = new WeaponSynchronization(Database, Config);
CCSPlayerController? player = Utilities.GetEntityFromIndex<CCSPlayerPawn>((int)activator.Index).OriginalController.Value;
_fadeSeed = 0;
_nextItemId = MinimumCustomItemId;
if (player == null || player.IsBot || player.IsHLTV)
return HookResult.Continue;
if (player == null || !player.IsValid || player.SteamID.ToString() == "" ||
!g_knifePickupCount.ContainsKey((int)player.Index) || !g_playersKnife.ContainsKey((int)player.Index))
return HookResult.Continue;
CBasePlayerWeapon weapon = new(caller.Handle);
if (weapon.AttributeManager.Item.ItemDefinitionIndex != 42 && weapon.AttributeManager.Item.ItemDefinitionIndex != 59)
return HookResult.Continue;
if (g_knifePickupCount[(int)player.Index] >= 2) return HookResult.Continue;
if (g_playersKnife[(int)player.Index] != "weapon_knife")
{
g_knifePickupCount[(int)player.Index]++;
player.RemoveItemByDesignerName(weapon.DesignerName);
if (Config.AdditionalSetting.GiveKnifeAfterRemove)
AddTimer(0.2f, () => GiveKnifeToPlayer(player));
}
return HookResult.Continue;
}
private void OnMapStart(string mapName)
{
if (!Config.AdditionalSetting.KnifeEnabled) return;
// TODO
// needed for now
AddTimer(2.0f, () =>
{
NativeAPI.IssueServerCommand("mp_t_default_melee \"\"");
NativeAPI.IssueServerCommand("mp_ct_default_melee \"\"");
NativeAPI.IssueServerCommand("mp_equipment_reset_rounds 0");
if (Config.GlobalShare)
GlobalShareConnect();
weaponSync = new WeaponSynchronization(DatabaseConnectionString, Config, GlobalShareApi, GlobalShareServerId);
});
/*
g_hTimerCheckSkinsData = AddTimer(10.0f, () =>
{
List<CCSPlayerController> players = Utilities.GetPlayers();
HashSet<int> playerIndexes = new HashSet<int>(gPlayerWeaponsInfo.Keys);
foreach (CCSPlayerController player in players)
{
if (player.IsBot || player.IsHLTV || player.SteamID.ToString() == "") continue;
//if (gPlayerWeaponsInfo.ContainsKey((int)player.Index)) continue;
if (playerIndexes.Contains((int)player.Index)) continue;
PlayerInfo playerInfo = new PlayerInfo
{
UserId = player.UserId,
Index = (int)player.Index,
SteamId = player?.SteamID,
Name = player?.PlayerName,
IpAddress = player?.IpAddress?.Split(":")[0]
};
if (weaponSync != null)
_ = weaponSync.GetKnifeFromDatabase(playerInfo);
}
}, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE | CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT);
*/
}
private HookResult OnPlayerConnectFull(EventPlayerConnectFull @event, GameEventInfo info)
{
CCSPlayerController? player = @event.Userid;
if (player == null || !player.IsValid || player.IsBot || player.IsHLTV || weaponSync == null) return HookResult.Continue;
PlayerInfo playerInfo = new PlayerInfo
{
UserId = player.UserId,
Index = (int)player.Index,
SteamId = player?.SteamID,
Name = player?.PlayerName,
IpAddress = player?.IpAddress?.Split(":")[0]
};
if (!g_playersDatabaseIndex.ContainsKey((int)player!.Index))
{
Console.WriteLine($"[WeaponPaints] Retrying to retrieve player {player.PlayerName} skins");
Task.Run(async () =>
{
await weaponSync.GetPlayerDatabaseIndex(playerInfo);
});
}
return HookResult.Continue;
}
private HookResult OnPlayerSpawn(EventPlayerSpawn @event, GameEventInfo info)
{
CCSPlayerController? player = @event.Userid;
if (player is null || !player.IsValid || Config.Additional is { KnifeEnabled: false, GloveEnabled: false })
return HookResult.Continue;
CCSPlayerPawn? pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid)
return HookResult.Continue;
GivePlayerMusicKit(player);
GivePlayerAgent(player);
Server.NextFrame(() =>
if (player == null || !player.IsValid)
{
GivePlayerGloves(player);
});
GivePlayerPin(player);
return HookResult.Continue;
}
if (Config.AdditionalSetting.KnifeEnabled && !PlayerHasKnife(player))
{
g_knifePickupCount[(int)player.Index] = 0;
GiveKnifeToPlayer(player);
//AddTimer(0.1f, () => GiveKnifeToPlayer(player));
}
/*
if (Config.AdditionalSetting.SkinVisibilityFix)
{
AddTimer(0.3f, () => RefreshSkins(player));
}
*/
return HookResult.Continue;
}
private HookResult OnRoundEnd(EventRoundEnd @event, GameEventInfo info)
{
_gBCommandsAllowed = false;
g_bCommandsAllowed = false;
return HookResult.Continue;
}
private HookResult OnRoundStart(EventRoundStart @event, GameEventInfo info)
{
_gBCommandsAllowed = true;
_mvpPlayed = false;
return HookResult.Continue;
}
private HookResult OnRoundMvp(EventRoundMvp @event, GameEventInfo info)
{
if (_mvpPlayed)
return HookResult.Continue;
var player = @event.Userid;
if (player == null || !player.IsValid || player.IsBot)
return HookResult.Continue;
NativeAPI.IssueServerCommand("mp_t_default_melee \"\"");
NativeAPI.IssueServerCommand("mp_ct_default_melee \"\"");
NativeAPI.IssueServerCommand("mp_equipment_reset_rounds 0");
if (!(GPlayersMusic.TryGetValue(player.Slot, out var musicInfo)
&& musicInfo.TryGetValue(player.Team, out var musicId)
&& musicId != 0))
return HookResult.Continue;
@event.Musickitid = musicId;
@event.Nomusic = 0;
info.DontBroadcast = true;
var newEvent = new EventRoundMvp(true)
{
Userid = player,
Musickitid = musicId,
Nomusic = 0,
};
_mvpPlayed = true;
newEvent.FireEvent(false);
return HookResult.Continue;
}
private HookResult OnGiveNamedItemPost(DynamicHook hook)
{
try
{
var itemServices = hook.GetParam<CCSPlayer_ItemServices>(0);
var weapon = hook.GetReturn<CBasePlayerWeapon>();
if (!weapon.DesignerName.Contains("weapon"))
return HookResult.Continue;
var player = GetPlayerFromItemServices(itemServices);
if (player != null)
{
GivePlayerWeaponSkin(player, weapon);
}
}
catch { }
g_bCommandsAllowed = true;
return HookResult.Continue;
}
private void OnEntityCreated(CEntityInstance entity)
{
var designerName = entity.DesignerName;
if (designerName.Contains("weapon"))
{
Server.NextWorldUpdate(() =>
{
var weapon = new CBasePlayerWeapon(entity.Handle);
if (!weapon.IsValid) return;
try
{
SteamID? steamid = null;
if (weapon.OriginalOwnerXuidLow > 0)
steamid = new SteamID(weapon.OriginalOwnerXuidLow);
CCSPlayerController? player;
if (steamid != null && steamid.IsValid())
{
player = Players.FirstOrDefault(p => p.IsValid && p.SteamID == steamid.SteamId64);
if (player == null)
player = Utilities.GetPlayerFromSteamId(weapon.OriginalOwnerXuidLow);
}
else
{
CCSWeaponBaseGun gun = weapon.As<CCSWeaponBaseGun>();
player = Utilities.GetPlayerFromIndex((int)weapon.OwnerEntity.Index) ?? Utilities.GetPlayerFromIndex((int)gun.OwnerEntity.Value!.Index);
}
if (string.IsNullOrEmpty(player?.PlayerName)) return;
if (!Utility.IsPlayerValid(player)) return;
GivePlayerWeaponSkin(player, weapon);
}
catch (Exception)
{
}
});
}
}
private void OnTick()
{
if (!Config.Additional.ShowSkinImage) return;
foreach (var player in Players)
foreach (var player in Utilities.GetPlayers())
{
if (_playerWeaponImage.TryGetValue(player.Slot, out var value) && !string.IsNullOrEmpty(value))
try
{
player.PrintToCenterHtml("<img src='{PATH}'</img>".Replace("{PATH}", value));
if (player == null || !player.IsValid || !player.PawnIsAlive || player.IsBot || player.IsHLTV || player.Connected == PlayerConnectedState.PlayerDisconnecting) continue;
var viewModels = GetPlayerViewModels(player);
if (viewModels == null) continue;
var viewModel = viewModels[0];
if (viewModel == null || viewModel.Value == null || viewModel.Value.Weapon == null || viewModel.Value.Weapon.Value == null) continue;
CBasePlayerWeapon weapon = viewModel.Value.Weapon.Value;
if (weapon == null || !weapon.IsValid) continue;
var isKnife = viewModel.Value.VMName.Contains("knife");
if (!isKnife)
{
if (
viewModel.Value.CBodyComponent != null
&& viewModel.Value.CBodyComponent.SceneNode != null
&& weapon.CBodyComponent!.SceneNode!.GetSkeletonInstance().ModelState.MeshGroupMask != 2
)
{
weapon.CBodyComponent!.SceneNode!.GetSkeletonInstance().ModelState.MeshGroupMask = 2;
}
Utilities.SetStateChanged(viewModel.Value, "CBaseEntity", "m_CBodyComponent");
}
}
catch (Exception)
{ }
}
}
[GameEventHandler]
public HookResult OnItemPickup(EventItemPickup @event, GameEventInfo _)
{
// if (!IsWindows) return HookResult.Continue;
var player = @event.Userid;
if (player == null || !player.IsValid || player.IsBot) return HookResult.Continue;
if (!@event.Item.Contains("knife")) return HookResult.Continue;
var weaponDefIndex = (int)@event.Defindex;
if (!HasChangedKnife(player, out var _) || !HasChangedPaint(player, weaponDefIndex, out var _))
return HookResult.Continue;
if (player is { Connected: PlayerConnectedState.PlayerConnected, PawnIsAlive: true, PlayerPawn.IsValid: true })
{
GiveOnItemPickup(player);
}
return HookResult.Continue;
}
private HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info)
{
CCSPlayerController? player = @event.Attacker;
CCSPlayerController? victim = @event.Userid;
if (player is null || !player.IsValid)
return HookResult.Continue;
if (victim == null || !victim.IsValid || victim == player)
return HookResult.Continue;
CBasePlayerWeapon? weapon = player.PlayerPawn.Value?.WeaponServices?.ActiveWeapon.Value;
if (weapon == null) return HookResult.Continue;
int weaponDefIndex = weapon.AttributeManager.Item.ItemDefinitionIndex;
if (!HasChangedPaint(player, weaponDefIndex, out var weaponInfo) || weaponInfo == null)
return HookResult.Continue;
if (!weaponInfo.StatTrak) return HookResult.Continue;
weaponInfo.StatTrakCount += 1;
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle, "kill eater", ViewAsFloat((uint)weaponInfo.StatTrakCount));
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle, "kill eater score type", 0);
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.AttributeList.Handle, "kill eater", ViewAsFloat((uint)weaponInfo.StatTrakCount));
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.AttributeList.Handle, "kill eater score type", 0);
return HookResult.Continue;
}
private void RegisterListeners()
{
RegisterListener<Listeners.OnEntityCreated>(OnEntityCreated);
RegisterListener<Listeners.OnClientPutInServer>(OnClientPutInServer);
RegisterListener<Listeners.OnClientDisconnect>(OnClientDisconnect);
RegisterListener<Listeners.OnMapStart>(OnMapStart);
RegisterEventHandler<EventPlayerSpawn>(OnPlayerSpawn);
RegisterEventHandler<EventRoundStart>(OnRoundStart);
RegisterEventHandler<EventRoundEnd>(OnRoundEnd);
RegisterEventHandler<EventRoundMvp>(OnRoundMvp);
RegisterListener<Listeners.OnEntitySpawned>(OnEntityCreated);
RegisterEventHandler<EventPlayerDeath>(OnPlayerDeath);
if (Config.Additional.ShowSkinImage)
if (!Config.AdditionalSetting.UseMetamodAlwaysLegacyModel)
RegisterListener<Listeners.OnTick>(OnTick);
VirtualFunctions.GiveNamedItemFunc.Hook(OnGiveNamedItemPost, HookMode.Post);
RegisterEventHandler<EventPlayerConnectFull>(OnPlayerConnectFull);
RegisterEventHandler<EventPlayerSpawn>(OnPlayerSpawn);
RegisterEventHandler<EventRoundStart>(OnRoundStart, HookMode.Pre);
RegisterEventHandler<EventRoundEnd>(OnRoundEnd);
RegisterEventHandler<EventItemPurchase>(OnEventItemPurchasePost);
//RegisterEventHandler<EventItemPickup>(OnItemPickup);
HookEntityOutput("weapon_knife", "OnPlayerPickup", OnPickup, HookMode.Pre);
}
/* WORKAROUND FOR CLIENTS WITHOUT STEAMID ON AUTHORIZATION */
/*private HookResult OnPlayerConnectFull(EventPlayerConnectFull @event, GameEventInfo info)
{
CCSPlayerController? player = @event.Userid;
if (player == null || !player.IsValid || !player.EntityIndex.HasValue || player.IsHLTV) return HookResult.Continue;
int playerIndex = (int)player.EntityIndex.Value.Value;
if (Config.AdditionalSetting.SkinEnabled && weaponSync != null)
_ = weaponSync.GetWeaponPaintsFromDatabase(playerIndex);
if (Config.AdditionalSetting.KnifeEnabled && weaponSync != null)
_ = weaponSync.GetKnifeFromDatabase(playerIndex);
Task.Run(async () =>
{
if (Config.AdditionalSetting.SkinEnabled && weaponSync != null)
if (Config.AdditionalSetting.KnifeEnabled && weaponSync != null)
});
return HookResult.Continue;
}
*/
}
}

View File

@@ -1,221 +0,0 @@
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace WeaponPaints;
public static class MemoryLinux
{
// Based on https://github.com/Source2ZE/CS2Fixes/blob/main/src/utils/plat_unix.cpp
static int ParseProt(string s)
{
int prot = 0;
foreach (var c in s)
{
switch (c)
{
case '-':
break;
case 'r':
prot |= NativeMethods.PROT_READ;
break;
case 'w':
prot |= NativeMethods.PROT_WRITE;
break;
case 'x':
prot |= NativeMethods.PROT_EXEC;
break;
case 's':
break;
case 'p':
break;
default:
break;
}
}
return prot;
}
static int GetProt(IntPtr pAddr, uint nSize)
{
using (var f = File.OpenRead("/proc/self/maps"))
using (var reader = new StreamReader(f))
{
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
if (line == null)
continue;
var parts = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length < 5)
continue;
var range = parts[0];
var prot = parts[1];
var startEnd = range.Split('-');
if (startEnd.Length != 2)
continue;
var start = Convert.ToUInt64(startEnd[0], 16);
var end = Convert.ToUInt64(startEnd[1], 16);
if (start < (ulong)pAddr && end > (ulong)pAddr + nSize)
{
return ParseProt(prot);
}
}
}
return 0;
}
public static void PatchBytesAtAddress(IntPtr pPatchAddress, byte[] pPatch, int iPatchSize)
{
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) return;
var oldProt = GetProt(pPatchAddress, (uint)iPatchSize);
var pageSize = (ulong)NativeMethods.sysconf(NativeMethods._SC_PAGESIZE);
var alignAddr = (IntPtr)((long)pPatchAddress & ~(long)(pageSize - 1));
var end = (IntPtr)((long)pPatchAddress + iPatchSize);
var alignSize = (ulong)((long)end - (long)alignAddr);
var result = NativeMethods.mprotect(alignAddr, alignSize, NativeMethods.PROT_READ | NativeMethods.PROT_WRITE);
Marshal.Copy(pPatch, 0, pPatchAddress, iPatchSize);
result = NativeMethods.mprotect(alignAddr, alignSize, oldProt);
}
private static byte[]? ReadProcessMemory(int pid, long address, int size)
{
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) return null;
byte[] buffer = new byte[size];
NativeMethods.Iovec local = new NativeMethods.Iovec
{
iov_base = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0),
iov_len = new IntPtr(size)
};
NativeMethods.Iovec remote = new NativeMethods.Iovec
{
iov_base = new IntPtr(address),
iov_len = new IntPtr(size)
};
long bytesRead = NativeMethods.process_vm_readv(pid, new NativeMethods.Iovec[] { local }, 1, new NativeMethods.Iovec[] { remote }, 1, 0);
if (bytesRead == -1)
{
throw new Exception($"process_vm_readv failed with error {Marshal.GetLastPInvokeError()}");
}
return buffer;
}
public static byte[]? ReadMemory(IntPtr address, int size)
{
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) return null;
return ReadProcessMemory(Process.GetCurrentProcess().Id, (long)address, size);
}
#pragma warning disable CS0649 // Field is never assigned to, and will always have its default value
#pragma warning disable CS8981 // The type name only contains lower-cased ascii characters. Such names may become reserved for the language.
static class NativeMethods
{
public const int O_RDONLY = 0;
public const int PROT_READ = 0x1;
public const int PROT_WRITE = 0x2;
public const int PROT_EXEC = 0x4;
public const int MAP_PRIVATE = 0x2;
public const int PT_LOAD = 1;
public const int PF_X = 0x1;
public const int _SC_PAGESIZE = 30;
public const int RTLD_DI_LINKMAP = 2;
[DllImport("libc")]
public static extern int dlinfo(IntPtr handle, int request, out link_map lmap);
[DllImport("libc")]
public static extern int dlclose(IntPtr handle);
[DllImport("libc")]
public static extern int open(string pathname, int flags);
[DllImport("libc")]
public static extern int fstat(int fd, out stat buf);
[DllImport("libc")]
public static extern IntPtr mmap(IntPtr addr, ulong length, int prot, int flags, int fd, ulong offset);
[DllImport("libc")]
public static extern int munmap(IntPtr addr, ulong length);
[DllImport("libc")]
public static extern int mprotect(IntPtr addr, ulong len, int prot);
[DllImport("libc")]
public static extern long sysconf(int name);
[DllImport("libc")]
public static extern long process_vm_readv(int pid, Iovec[] local_iov, ulong liovcnt, Iovec[] remote_iov, ulong riovcnt, ulong flags);
[StructLayout(LayoutKind.Sequential)]
public struct Iovec
{
public IntPtr iov_base;
public IntPtr iov_len;
}
[StructLayout(LayoutKind.Sequential)]
public struct link_map
{
public IntPtr l_addr;
public IntPtr l_name;
}
[StructLayout(LayoutKind.Sequential)]
public struct ElfW
{
public struct Ehdr
{
public byte e_shnum;
public uint e_shoff;
public ushort e_phnum;
public uint e_phoff;
}
public struct Phdr
{
public int p_type;
public int p_flags;
public ulong p_vaddr;
public ulong p_filesz;
}
public struct Shdr
{
public uint sh_name;
public uint sh_offset;
public uint sh_size;
public ulong sh_addr;
}
}
[StructLayout(LayoutKind.Sequential)]
public struct stat
{
public ulong st_size;
}
}
#pragma warning restore CS8981 // The type name only contains lower-cased ascii characters. Such names may become reserved for the language.
#pragma warning restore CS0649 // Field is never assigned to, and will always have its default value
}

View File

@@ -1,34 +0,0 @@
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace WeaponPaints;
public static class MemoryWindows
{
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out IntPtr lpNumberOfBytesWritten);
public static void PatchBytesAtAddress(IntPtr pPatchAddress, byte[] pPatch, int iPatchSize)
{
if(!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) return;
IntPtr bytesWritten;
WriteProcessMemory(Process.GetCurrentProcess().Handle, pPatchAddress, pPatch, (uint)iPatchSize, out bytesWritten);
}
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr OpenProcess(int processAccess, bool bInheritHandle, int processId);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, int dwSize, out int lpNumberOfBytesRead);
public static byte[]? ReadMemory(IntPtr address, int size)
{
if(!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) return null;
byte[] buffer = new byte[size];
int bytesRead;
ReadProcessMemory(Process.GetCurrentProcess().Handle, address, buffer, size, out bytesRead);
return buffer;
}
}

View File

@@ -1,104 +0,0 @@
using System.Runtime.InteropServices;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory;
namespace WeaponPaints;
// Thanks cssharp-fixes
public static class Patch
{
private static IntPtr GetAddress(string modulePath, string signature)
{
// Returns address if found, otherwise a C++ nullptr which is a IntPtr.Zero in C#
var address = NativeAPI.FindSignature(modulePath, signature);
return address;
}
public static void PerformPatch(string signature, string patch)
{
IntPtr address = GetAddress(Addresses.ServerPath, signature);
if(address == IntPtr.Zero)
{
return;
}
WriteBytesToAddress(address, HexToByte(patch));
}
private static void WriteBytesToAddress(IntPtr address, List<byte> bytes)
{
int patchSize = bytes.Count;
if(patchSize == 0) throw new ArgumentException("Patch bytes list cannot be empty.");
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
MemoryLinux.PatchBytesAtAddress(address, bytes.ToArray(), patchSize);
}
else
{
MemoryWindows.PatchBytesAtAddress(address, bytes.ToArray(), patchSize);
}
}
private static List<byte> HexToByte(string src)
{
if (string.IsNullOrEmpty(src))
{
return new List<byte>();
}
byte HexCharToByte(char c)
{
if (c is >= '0' and <= '9') return (byte)(c - '0');
if (c is >= 'A' and <= 'F') return (byte)(c - 'A' + 10);
if (c is >= 'a' and <= 'f') return (byte)(c - 'a' + 10);
return 0xFF; // Invalid hex character
}
List<byte> result = new List<byte>();
bool isCodeStyle = src[0] == '\\';
string pattern = isCodeStyle ? "\\x" : " ";
string wildcard = isCodeStyle ? "2A" : "?";
int pos = 0;
while (pos < src.Length)
{
int found = src.IndexOf(pattern, pos);
if (found == -1)
{
found = src.Length;
}
string str = src.Substring(pos, found - pos);
pos = found + pattern.Length;
if (string.IsNullOrEmpty(str)) continue;
string byteStr = str;
if (byteStr.Substring(0, wildcard.Length) == wildcard)
{
result.Add(0xFF); // Representing wildcard as 0xFF
continue;
}
if (byteStr.Length < 2)
{
return new List<byte>(); // Invalid byte length
}
byte high = HexCharToByte(byteStr[0]);
byte low = HexCharToByte(byteStr[1]);
if (high == 0xFF || low == 0xFF)
{
return new List<byte>(); // Invalid hex character
}
result.Add((byte)((high << 4) | low));
}
return result;
}
}

View File

@@ -8,7 +8,6 @@ public static class PlayerExtensions
public static void Print(this CCSPlayerController controller, string message)
{
if (WeaponPaints._localizer == null) return;
StringBuilder _message = new(WeaponPaints._localizer["wp_prefix"]);
_message.Append(message);
controller.PrintToChat(_message.ToString());

View File

@@ -3,10 +3,9 @@
public class PlayerInfo
{
public int Index { get; set; }
public int Slot { get; init; }
public int? UserId { get; set; }
public string? SteamId { get; init; }
public ulong? SteamId { get; set; }
public string? Name { get; set; }
public string? IpAddress { get; set; }
}
}
}
}

View File

@@ -9,44 +9,35 @@ Unfinished, unoptimized and not fully functional ugly demo weapon paints plugin
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/E1E2G0P2O) or [![Donate on Steam](https://github.com/Nereziel/cs2-WeaponPaints/assets/32937653/a0d53822-4ca7-4caf-83b4-e1a9b5f8c94e)](https://steamcommunity.com/tradeoffer/new/?partner=41515647&token=gW2W-nXE)
## Features
- Changes only paint, seed and wear on weapons, knives, gloves and agents
- MySQL based
- Changes only paint, seed and wear on weapons and knives
- MySQL(min. ver 5.6.5) based or global website, so you dont need MySQL/Website
- Data syncs on player connect
- Added command **`!wp`** to refresh skins ***(with cooldown in seconds can be configured)***
- Added command **`!ws`** to show website
- Added command **`!knife`** to show menu with knives
- Added command **`!gloves`** to show menu with gloves
- Added command **`!agents`** to show menu with agents
- Added command **`!pins`** to show menu with pins
- Added command **`!music`** to show menu with music
- Knife change is now limited to have these cvars empty **`mp_t_default_melee ""`** and **`mp_ct_default_melee ""`**
- 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
**GlobalShare** - global website accessible at [weaponpaints.fun](https://weaponpaints.fun/)
## CS2 Server
- Have working CounterStrikeSharp (**with RUNTIME!**)
- Download from Release and copy plugin to plugins
- Run server with plugin, **it will generate config if installed correctly!**
- Edit `addons/counterstrikesharp/configs/`**`plugins/WeaponPaints/WeaponPaints.json`** include database credentials
- Run server with plugin, it will generate config if installed correctly
- Edit `addons/counterstrikesharp/configs/`**`plugins/WeaponPaints/WeaponPaints.json`** set **`GlobalShare`** to **`true`** for global, or include database credentials
- 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
<details>
<summary>Click to expand</summary>
<code><pre>{
"Version": 4, // Don't touch
"DatabaseHost": "", // MySQL host
"DatabasePort": 3306, // MySQL port
"DatabaseUser": "", // MySQL username
"DatabasePassword": "", // MySQL user password
"DatabaseName": "", // MySQL database name
"DatabaseHost": "", // MySQL host (required if GlobalShare = false)
"DatabasePort": 3306, // MySQL port (required if GlobalShare = false)
"DatabaseUser": "", // MySQL username (required if GlobalShare = false)
"DatabasePassword": "", // MySQL user password (required if GlobalShare = false)
"DatabaseName": "", // MySQL database name (required if GlobalShare = false)
"GlobalShare": false, // Enable or disable GlobalShare, plugin can work without mysql credentials but with shared website at weaponpaints.fun
"CmdRefreshCooldownSeconds": 60, // Cooldown time in refreshing skins (!wp command)
"Prefix": "[WeaponPaints]", // Prefix every chat message
"Website": "example.com/skins", // Website used in WebsiteMessageCommand (!ws command)
@@ -64,6 +55,7 @@ Unfinished, unoptimized and not fully functional ugly demo weapon paints plugin
"SkinMenuTitle": "Select skin for {WEAPON}" // Menu title (!skins menu, after weapon select)
},
"Additional": {
"SkinVisibilityFix": true, // Enable or disable fix for skin visibility
"KnifeEnabled": true, // Enable or disable knife feature
"SkinEnabled": true, // Enable or disable skin feature
"CommandWpEnabled": true, // Enable or disable refreshing command
@@ -76,11 +68,15 @@ Unfinished, unoptimized and not fully functional ugly demo weapon paints plugin
"GiveRandomKnife": false, // Give random knife 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>
## Web install
- Requires PHP >= 7.4 with curl and pdo_mysql ***(Tested on php ver **`8.2.3`** and nginx webserver)***
Ignore this section if you have in config **`GlobalShare = true`**
- Minimum PHP version 5.5 (needs testing)
- Minimum MySQL version 5.6.5
- **Before using website, make sure the plugin is correctly loaded in cs2 server!** Mysql tables are created by plugin not by website.
- Copy website to web server ***(Folder `img` not needed)***
- Get [Steam API Key](https://steamcommunity.com/dev/apikey)
@@ -92,6 +88,10 @@ Unfinished, unoptimized and not fully functional ugly demo weapon paints plugin
- Steam login/logout
- Change knife, paint, seed and wear
## Known issues
- Issue on Windows servers, no knives are given.
- Can cause incompatibility with plugins/maps which manipulates weapons and knives
## Troubleshooting
<details>
**Skins are not changing:**
@@ -100,6 +100,8 @@ Set FollowCSGOGuidelines to false in cssharps core.jcon config
**Database error table does not exists:**
Plugin is not loaded or configured with mysql credentials. Tables are auto-created by plugin.
**Knives are disappearing:**
Set in config GiveKnifeAfterRemove to true
</details>
### Use this plugin at your own risk! Using this may lead to GSLT ban or something else Valve come with. [Valve Server guidelines](https://blog.counter-strike.net/index.php/server_guidelines/)

View File

@@ -1,11 +1,11 @@
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Translations;
using CounterStrikeSharp.API.Modules.Menu;
using CounterStrikeSharp.API.Modules.Utils;
using Dapper;
using MenuManager;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using MySqlConnector;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System.Reflection;
using Microsoft.Extensions.Logging;
namespace WeaponPaints
{
@@ -13,86 +13,45 @@ namespace WeaponPaints
{
internal static WeaponPaintsConfig? Config { get; set; }
internal static async Task CheckDatabaseTables()
internal static string BuildDatabaseConnectionString()
{
if (WeaponPaints.Database is null) return;
if (Config == null) return string.Empty;
var builder = new MySqlConnectionStringBuilder
{
Server = Config.DatabaseHost,
UserID = Config.DatabaseUser,
Password = Config.DatabasePassword,
Database = Config.DatabaseName,
Port = (uint)Config.DatabasePort,
};
return builder.ConnectionString;
}
internal static async void CheckDatabaseTables()
{
try
{
await using var connection = await WeaponPaints.Database.GetConnectionAsync();
await using var transaction = await connection.BeginTransactionAsync();
using var connection = new MySqlConnection(BuildDatabaseConnectionString());
await connection.OpenAsync();
try
using var transaction = await connection.BeginTransactionAsync();
// Minimal version for MySQL 5.6.5
string[] sqlCommands = new string[]
{
"CREATE TABLE IF NOT EXISTS `wp_users` (`id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `steamid` BIGINT UNSIGNED NOT NULL, `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `unique_steamid` (`steamid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;",
"CREATE TABLE IF NOT EXISTS `wp_users_items` (`user_id` INT UNSIGNED NOT NULL, `weapon` SMALLINT UNSIGNED NOT NULL, `paint` SMALLINT UNSIGNED NOT NULL, `wear` FLOAT NOT NULL DEFAULT 0.00001, `seed` SMALLINT UNSIGNED NOT NULL DEFAULT 0, `nametag` VARCHAR(20) DEFAULT NULL, `stattrack` INT UNSIGNED NOT NULL DEFAULT 0, `stattrack_enabled` SMALLINT NOT NULL DEFAULT 0, `quality` SMALLINT UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (`user_id`,`weapon`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;",
"CREATE TABLE IF NOT EXISTS `wp_users_knife` (`user_id` INT UNSIGNED NOT NULL, `knife` VARCHAR(32) DEFAULT NULL, PRIMARY KEY (`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;",
"CREATE TABLE IF NOT EXISTS `wp_users_music` (`user_id` INT UNSIGNED NOT NULL, `music` SMALLINT UNSIGNED DEFAULT NULL, PRIMARY KEY (`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;"
};
try
{
string[] createTableQueries =
[
@"
CREATE TABLE IF NOT EXISTS `wp_player_skins` (
`steamid` varchar(18) NOT NULL,
`weapon_team` int(1) NOT NULL,
`weapon_defindex` int(6) NOT NULL,
`weapon_paint_id` int(6) NOT NULL,
`weapon_wear` float NOT NULL DEFAULT 0.000001,
`weapon_seed` int(16) NOT NULL DEFAULT 0,
`weapon_nametag` VARCHAR(128) DEFAULT NULL,
`weapon_stattrak` tinyint(1) NOT NULL DEFAULT 0,
`weapon_stattrak_count` int(10) NOT NULL DEFAULT 0,
`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',
UNIQUE (`steamid`, `weapon_team`, `weapon_defindex`) -- Add unique constraint here
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;",
foreach (string command in sqlCommands)
{
await connection.ExecuteAsync(command, transaction: transaction);
}
@"
CREATE TABLE IF NOT EXISTS `wp_player_knife` (
`steamid` varchar(18) NOT NULL,
`weapon_team` int(1) NOT NULL,
`knife` varchar(64) NOT NULL,
UNIQUE (`steamid`, `weapon_team`) -- Unique constraint
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;",
@"
CREATE TABLE IF NOT EXISTS `wp_player_gloves` (
`steamid` varchar(18) NOT NULL,
`weapon_team` int(1) NOT NULL,
`weapon_defindex` int(11) NOT NULL,
UNIQUE (`steamid`, `weapon_team`) -- Unique constraint
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;",
@"
CREATE TABLE IF NOT EXISTS `wp_player_agents` (
`steamid` varchar(18) NOT NULL,
`agent_ct` varchar(64) DEFAULT NULL,
`agent_t` varchar(64) DEFAULT NULL,
UNIQUE (`steamid`) -- Unique constraint
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;",
@"
CREATE TABLE IF NOT EXISTS `wp_player_music` (
`steamid` varchar(64) NOT NULL,
`weapon_team` int(1) NOT NULL,
`music_id` int(11) NOT NULL,
UNIQUE (`steamid`, `weapon_team`) -- Unique constraint
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;",
@"
CREATE TABLE IF NOT EXISTS `wp_player_pins` (
`steamid` varchar(64) NOT NULL,
`weapon_team` int(1) NOT NULL,
`id` int(11) NOT NULL,
UNIQUE (`steamid`, `weapon_team`) -- Unique constraint
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;"
];
foreach (var query in createTableQueries)
{
await connection.ExecuteAsync(query, transaction: transaction);
}
await transaction.CommitAsync();
await transaction.CommitAsync();
}
catch (Exception)
{
@@ -102,84 +61,25 @@ namespace WeaponPaints
}
catch (Exception ex)
{
throw new Exception("[WeaponPaints] Unknown MySQL exception! " + ex.Message);
throw new Exception("[WeaponPaints] Unknown mysql exception! " + ex.Message);
}
}
internal static bool IsPlayerValid(CCSPlayerController? player)
{
if (player is null || WeaponPaints.WeaponSync is null) return false;
return player is { IsValid: true, IsBot: false, IsHLTV: false, UserId: not null };
return (player != null && player.IsValid && !player.IsBot && !player.IsHLTV && player.AuthorizedSteamID != null);
}
internal static void LoadSkinsFromFile(string filePath, ILogger logger)
internal static void LoadSkinsFromFile(string filePath)
{
var json = File.ReadAllText(filePath);
try
if (File.Exists(filePath))
{
string json = File.ReadAllText(filePath);
var deserializedSkins = JsonConvert.DeserializeObject<List<JObject>>(json);
WeaponPaints.SkinsList = deserializedSkins ?? [];
WeaponPaints.skinsList = deserializedSkins ?? new List<JObject>();
}
catch (FileNotFoundException)
else
{
logger?.LogError("Not found \"skins.json\" file");
}
}
internal static void LoadPinsFromFile(string filePath, ILogger logger)
{
var json = File.ReadAllText(filePath);
try
{
var deserializedPins = JsonConvert.DeserializeObject<List<JObject>>(json);
WeaponPaints.PinsList = deserializedPins ?? [];
}
catch (FileNotFoundException)
{
logger?.LogError("Not found \"pins.json\" file");
}
}
internal static void LoadGlovesFromFile(string filePath, ILogger logger)
{
try
{
var json = File.ReadAllText(filePath);
var deserializedSkins = JsonConvert.DeserializeObject<List<JObject>>(json);
WeaponPaints.GlovesList = deserializedSkins ?? [];
}
catch (FileNotFoundException)
{
logger?.LogError("Not found \"gloves.json\" file");
}
}
internal static void LoadAgentsFromFile(string filePath, ILogger logger)
{
try
{
var json = File.ReadAllText(filePath);
var deserializedSkins = JsonConvert.DeserializeObject<List<JObject>>(json);
WeaponPaints.AgentsList = deserializedSkins ?? [];
}
catch (FileNotFoundException)
{
logger?.LogError("Not found \"agents.json\" file");
}
}
internal static void LoadMusicFromFile(string filePath, ILogger logger)
{
try
{
var json = File.ReadAllText(filePath);
var deserializedSkins = JsonConvert.DeserializeObject<List<JObject>>(json);
WeaponPaints.MusicList = deserializedSkins ?? [];
}
catch (FileNotFoundException)
{
logger?.LogError("Not found \"music.json\" file");
throw new FileNotFoundException("File not found.", filePath);
}
}
@@ -190,75 +90,68 @@ namespace WeaponPaints
Console.WriteLine("[WeaponPaints] " + message);
Console.ResetColor();
}
internal static IMenu? CreateMenu(string title)
internal static string ReplaceTags(string message)
{
var menuType = WeaponPaints.Instance.Config.MenuType.ToLower();
var menu = menuType switch
if (message.Contains('{'))
{
_ when menuType.Equals("selectable", StringComparison.CurrentCultureIgnoreCase) =>
WeaponPaints.MenuApi?.NewMenu(title),
string modifiedValue = message;
if (Config != null)
{
modifiedValue = modifiedValue.Replace("{WEBSITE}", Config.Website);
}
foreach (FieldInfo field in typeof(ChatColors).GetFields())
{
string pattern = $"{{{field.Name}}}";
if (message.Contains(pattern, StringComparison.OrdinalIgnoreCase))
{
modifiedValue = modifiedValue.Replace(pattern, field.GetValue(null)!.ToString(), StringComparison.OrdinalIgnoreCase);
}
}
return modifiedValue;
}
_ when menuType.Equals("dynamic", StringComparison.CurrentCultureIgnoreCase) =>
WeaponPaints.MenuApi?.NewMenuForcetype(title, MenuType.ButtonMenu),
_ when menuType.Equals("center", StringComparison.CurrentCultureIgnoreCase) =>
WeaponPaints.MenuApi?.NewMenuForcetype(title, MenuType.CenterMenu),
_ when menuType.Equals("chat", StringComparison.CurrentCultureIgnoreCase) =>
WeaponPaints.MenuApi?.NewMenuForcetype(title, MenuType.ChatMenu),
_ when menuType.Equals("console", StringComparison.CurrentCultureIgnoreCase) =>
WeaponPaints.MenuApi?.NewMenuForcetype(title, MenuType.ConsoleMenu),
_ => WeaponPaints.MenuApi?.NewMenu(title)
};
return menu;
return message;
}
internal static async Task CheckVersion(string version, ILogger logger)
{
using HttpClient client = new();
try
using (HttpClient client = new HttpClient())
{
var response = await client.GetAsync("https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/VERSION").ConfigureAwait(false);
if (response.IsSuccessStatusCode)
try
{
var remoteVersion = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
remoteVersion = remoteVersion.Trim();
HttpResponseMessage response = await client.GetAsync("https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/VERSION");
var comparisonResult = string.CompareOrdinal(version, remoteVersion);
switch (comparisonResult)
if (response.IsSuccessStatusCode)
{
case < 0:
string remoteVersion = await response.Content.ReadAsStringAsync();
remoteVersion = remoteVersion.Trim();
int comparisonResult = string.Compare(version, remoteVersion);
if (comparisonResult < 0)
{
logger.LogWarning("Plugin is outdated! Check https://github.com/Nereziel/cs2-WeaponPaints");
break;
case > 0:
}
else if (comparisonResult > 0)
{
logger.LogInformation("Probably dev version detected");
break;
default:
}
else
{
logger.LogInformation("Plugin is up to date");
break;
}
}
else
{
logger.LogWarning("Failed to check version");
}
}
else
catch (Exception ex)
{
logger.LogWarning("Failed to check version");
Console.WriteLine(ex);
}
}
catch (HttpRequestException ex)
{
logger.LogError(ex, "Failed to connect to the version server.");
}
catch (Exception ex)
{
logger.LogError(ex, "An error occurred while checking version.");
}
}
internal static void ShowAd(string moduleVersion)
@@ -275,5 +168,24 @@ namespace WeaponPaints
Console.WriteLine(" >> GitHub: https://github.com/Nereziel/cs2-WeaponPaints");
Console.WriteLine(" ");
}
internal static void TestDatabaseConnection()
{
try
{
using var connection = new MySqlConnection(BuildDatabaseConnectionString());
connection.Open();
if (connection.State != System.Data.ConnectionState.Open)
{
throw new Exception("[WeaponPaints] Unable connect to database!");
}
}
catch (Exception ex)
{
throw new Exception("[WeaponPaints] Unknown mysql exception! " + ex.Message);
}
CheckDatabaseTables();
}
}
}

View File

@@ -1 +1 @@
3.2a
1.4b

View File

@@ -1,173 +0,0 @@
using System.Collections.Concurrent;
using System.Runtime.InteropServices;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Capabilities;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils;
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", "M4A4"},
{"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, ConcurrentDictionary<CsTeam, string>> GPlayersKnife = new();
internal static readonly ConcurrentDictionary<int, ConcurrentDictionary<CsTeam, ushort>> GPlayersGlove = new();
internal static readonly ConcurrentDictionary<int, ConcurrentDictionary<CsTeam, ushort>> GPlayersMusic = new();
internal static readonly ConcurrentDictionary<int, ConcurrentDictionary<CsTeam, ushort>> GPlayersPin = new();
internal static readonly ConcurrentDictionary<int, (string? CT, string? T)> GPlayersAgent = new();
internal static readonly ConcurrentDictionary<int, ConcurrentDictionary<CsTeam, ConcurrentDictionary<int, WeaponInfo>>> GPlayerWeaponsInfo = new();
internal static List<JObject> SkinsList = [];
internal static List<JObject> PinsList = [];
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"));
//we dont need anymore because we use AcceptInput
//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");
private int _fadeSeed;
internal List<CCSPlayerController> Players = [];
}

View File

@@ -1,611 +1,343 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Timers;
using CounterStrikeSharp.API.Modules.Utils;
using Microsoft.Extensions.Logging;
using System.Collections.Concurrent;
using Newtonsoft.Json.Linq;
using System.Runtime.InteropServices;
namespace WeaponPaints
{
public partial class WeaponPaints
{
private void GivePlayerWeaponSkin(CCSPlayerController player, CBasePlayerWeapon weapon)
internal static void ChangeWeaponAttributes(CBasePlayerWeapon? weapon, CCSPlayerController? player, bool isKnife = false)
{
if (!Config.Additional.SkinEnabled) return;
if (!GPlayerWeaponsInfo.TryGetValue(player.Slot, out _)) return;
bool isKnife = weapon.DesignerName.Contains("knife") || weapon.DesignerName.Contains("bayonet");
switch (isKnife)
if (player == null || weapon == null || !weapon.IsValid || !Utility.IsPlayerValid(player)) return;
int playerIndex = (int)player.Index;
if (!gPlayerWeaponsInfo.ContainsKey(playerIndex)) return;
if (isKnife && !g_playersKnife.ContainsKey(playerIndex) || isKnife && g_playersKnife[playerIndex] == "weapon_knife") return;
ushort weaponDefIndex = weapon.AttributeManager.Item.ItemDefinitionIndex;
if (isKnife)
{
case true when !HasChangedKnife(player, out var _):
return;
case true:
{
var newDefIndex = WeaponDefindex.FirstOrDefault(x => x.Value == GPlayersKnife[player.Slot][player.Team]);
if (newDefIndex.Key == 0) return;
if (weapon.AttributeManager.Item.ItemDefinitionIndex != newDefIndex.Key)
{
SubclassChange(weapon, (ushort)newDefIndex.Key);
}
weapon.AttributeManager.Item.ItemDefinitionIndex = (ushort)newDefIndex.Key;
weapon.AttributeManager.Item.EntityQuality = 3;
weapon.AttributeManager.Item.AttributeList.Attributes.RemoveAll();
weapon.AttributeManager.Item.NetworkedDynamicAttributes.Attributes.RemoveAll();
break;
}
default:
weapon.AttributeManager.Item.EntityQuality = 0;
break;
weapon.AttributeManager.Item.EntityQuality = 3;
}
UpdatePlayerEconItemId(weapon.AttributeManager.Item);
int weaponDefIndex = weapon.AttributeManager.Item.ItemDefinitionIndex;
int fallbackPaintKit;
weapon.AttributeManager.Item.AccountID = (uint)player.SteamID;
List<JObject> skinInfo;
bool isLegacyModel;
if (_config.Additional.GiveRandomSkin &&
!HasChangedPaint(player, weaponDefIndex, out _))
if (_config.AdditionalSetting.GiveRandomSkin &&
!gPlayerWeaponsInfo[playerIndex].ContainsKey(weaponDefIndex))
{
// Random skins
weapon.AttributeManager.Item.ItemID = 16384;
weapon.AttributeManager.Item.ItemIDLow = 16384 & 0xFFFFFFFF;
weapon.AttributeManager.Item.ItemIDHigh = weapon.AttributeManager.Item.ItemIDLow >> 32;
weapon.FallbackPaintKit = GetRandomPaint(weaponDefIndex);
weapon.FallbackSeed = 0;
weapon.FallbackWear = 0.01f;
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 seed", 0);
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle, "set item texture wear", 0.01f);
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 seed", 0);
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.AttributeList.Handle, "set item texture wear", 0.01f);
fallbackPaintKit = weapon.FallbackPaintKit;
if (fallbackPaintKit == 0)
return;
skinInfo = SkinsList
.Where(w =>
w["weapon_defindex"]?.ToObject<int>() == weaponDefIndex &&
w["paint"]?.ToObject<int>() == fallbackPaintKit)
.ToList();
isLegacyModel = skinInfo.Count <= 0 || skinInfo[0].Value<bool>("legacy_model");
UpdatePlayerWeaponMeshGroupMask(player, weapon, isLegacyModel);
weapon.FallbackWear = 0.00001f;
if (!isKnife && weapon.CBodyComponent != null && weapon.CBodyComponent.SceneNode != null)
{
if (weapon.CBodyComponent!.SceneNode!.GetSkeletonInstance().ModelState.MeshGroupMask != 2)
{
weapon.CBodyComponent!.SceneNode!.GetSkeletonInstance().ModelState.MeshGroupMask = 2;
}
}
return;
}
if (!HasChangedPaint(player, weaponDefIndex, out var weaponInfo) || weaponInfo == null)
return;
if (!gPlayerWeaponsInfo[playerIndex].ContainsKey(weaponDefIndex)) return;
WeaponInfo weaponInfo = gPlayerWeaponsInfo[playerIndex][weaponDefIndex];
//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.AttributeList.Attributes.RemoveAll();
weapon.AttributeManager.Item.NetworkedDynamicAttributes.Attributes.RemoveAll();
UpdatePlayerEconItemId(weapon.AttributeManager.Item);
weapon.AttributeManager.Item.CustomName = weaponInfo.Nametag;
weapon.AttributeManager.Item.ItemID = 16384;
weapon.AttributeManager.Item.ItemIDLow = 16384 & 0xFFFFFFFF;
weapon.AttributeManager.Item.ItemIDHigh = weapon.AttributeManager.Item.ItemIDLow >> 32;
weapon.FallbackPaintKit = weaponInfo.Paint;
weapon.FallbackSeed = weaponInfo is { Paint: 38, Seed: 0 } ? _fadeSeed++ : weaponInfo.Seed;
weapon.FallbackSeed = weaponInfo.Seed;
weapon.FallbackWear = weaponInfo.Wear;
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle, "set item texture prefab", weapon.FallbackPaintKit);
if (weaponInfo.StatTrak)
{
weapon.AttributeManager.Item.EntityQuality = 9;
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle, "kill eater", ViewAsFloat((uint)weaponInfo.StatTrakCount));
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle, "kill eater score type", 0);
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.AttributeList.Handle, "kill eater", ViewAsFloat((uint)weaponInfo.StatTrakCount));
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.AttributeList.Handle, "kill eater score type", 0);
}
fallbackPaintKit = weapon.FallbackPaintKit;
if (fallbackPaintKit == 0)
return;
if (weaponInfo.KeyChain != null) SetKeychain(player, weapon);
if (weaponInfo.Stickers.Count > 0) SetStickers(player, weapon);
skinInfo = SkinsList
.Where(w =>
w["weapon_defindex"]?.ToObject<int>() == weaponDefIndex &&
w["paint"]?.ToObject<int>() == fallbackPaintKit)
.ToList();
isLegacyModel = skinInfo.Count <= 0 || skinInfo[0].Value<bool>("legacy_model");
UpdatePlayerWeaponMeshGroupMask(player, weapon, isLegacyModel);
}
// silly method to update sticker when call RefreshWeapons()
private void IncrementWearForWeaponWithStickers(CCSPlayerController player, CBasePlayerWeapon weapon)
{
int weaponDefIndex = weapon.AttributeManager.Item.ItemDefinitionIndex;
if (!HasChangedPaint(player, weaponDefIndex, out var weaponInfo) || weaponInfo == null ||
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 (!HasChangedPaint(player ,weaponDefIndex, out var weaponInfo) || weaponInfo == null)
return;
foreach (var sticker in weaponInfo.Stickers)
if (!isKnife && weapon.CBodyComponent != null && weapon.CBodyComponent.SceneNode != null)
{
int stickerSlot = weaponInfo.Stickers.IndexOf(sticker);
if (weapon.CBodyComponent!.SceneNode!.GetSkeletonInstance().ModelState.MeshGroupMask != 2)
{
weapon.CBodyComponent!.SceneNode!.GetSkeletonInstance().ModelState.MeshGroupMask = 2;
}
}
}
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle,
$"sticker slot {stickerSlot} id", ViewAsFloat(sticker.Id));
if (sticker.OffsetX != 0 || sticker.OffsetY != 0)
CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle,
$"sticker slot {stickerSlot} schema", 0);
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);
}
internal static void GiveKnifeToPlayer(CCSPlayerController? player)
{
if (!_config.AdditionalSetting.KnifeEnabled || player == null || !player.IsValid) return;
if (_temporaryPlayerWeaponWear.TryGetValue(player.Slot, out var playerWear) &&
playerWear.TryGetValue(weaponDefIndex, out float storedWear))
if (g_playersKnife.TryGetValue((int)player.Index, out var knife))
{
weapon.FallbackWear = storedWear;
player.GiveNamedItem(knife);
}
else if (_config.AdditionalSetting.GiveRandomKnife)
{
var knifeTypes = weaponList.Where(pair => pair.Key.StartsWith("weapon_knife") || pair.Key.StartsWith("weapon_bayonet")).ToDictionary(pair => pair.Key, pair => pair.Value);
Random random = new();
int index = random.Next(knifeTypes.Count);
var randomKnifeClass = knifeTypes.Keys.ElementAt(index);
player.GiveNamedItem(randomKnifeClass);
}
else
{
var defaultKnife = (CsTeam)player.TeamNum == CsTeam.Terrorist ? "weapon_knife_t" : "weapon_knife";
player.GiveNamedItem(defaultKnife);
}
}
private void SetKeychain(CCSPlayerController? player, CBasePlayerWeapon weapon)
internal static bool PlayerHasKnife(CCSPlayerController? player)
{
if (player == null || !player.IsValid) return;
if (!_config.AdditionalSetting.KnifeEnabled) return false;
int weaponDefIndex = weapon.AttributeManager.Item.ItemDefinitionIndex;
if (!HasChangedPaint(player, 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", ViewAsFloat(keyChain.Seed));
}
private static void GiveKnifeToPlayer(CCSPlayerController? player)
{
if (!_config.Additional.KnifeEnabled || player == null || !player.IsValid) return;
if (PlayerHasKnife(player)) return;
//string knifeToGive = (CsTeam)player.TeamNum == CsTeam.Terrorist ? "weapon_knife_t" : "weapon_knife";
player.GiveNamedItem(CsItem.Knife);
Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInventoryServices");
}
private static bool PlayerHasKnife(CCSPlayerController? player)
{
if (!_config.Additional.KnifeEnabled) return false;
if (player == null || !player.IsValid || !player.PlayerPawn.IsValid)
if (player == null || !player.IsValid || player.PlayerPawn == null || !player.PlayerPawn.IsValid || !player.PawnIsAlive)
{
return false;
}
if (player.PlayerPawn.Value == null || player.PlayerPawn.Value.WeaponServices == null || player.PlayerPawn.Value.ItemServices == null)
if (player.PlayerPawn?.Value == null || player.PlayerPawn?.Value.WeaponServices == null || player.PlayerPawn?.Value.ItemServices == null)
return false;
var weapons = player.PlayerPawn.Value.WeaponServices?.MyWeapons;
if (weapons == null) return false;
foreach (var weapon in weapons)
{
if (!weapon.IsValid || weapon.Value == null || !weapon.Value.IsValid) continue;
if (weapon.Value.DesignerName.Contains("knife") || weapon.Value.DesignerName.Contains("bayonet"))
if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid)
{
return true;
if (weapon.Value.DesignerName.Contains("knife") || weapon.Value.DesignerName.Contains("bayonet"))
{
return true;
}
}
}
return false;
}
private void RefreshWeapons(CCSPlayerController? player)
internal void RefreshPlayerKnife(CCSPlayerController? player)
{
if (!_gBCommandsAllowed) return;
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || (LifeState_t)player.LifeState != LifeState_t.LIFE_ALIVE)
return;
if (player.PlayerPawn.Value.WeaponServices == null || player.PlayerPawn.Value.ItemServices == null)
return;
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PawnIsAlive) return;
if (player.PlayerPawn.Value.WeaponServices == null || player.PlayerPawn.Value.ItemServices == null) return;
var weapons = player.PlayerPawn.Value.WeaponServices.MyWeapons;
if (weapons.Count == 0)
return;
if (player.Team is CsTeam.None or CsTeam.Spectator)
return;
var hasKnife = false;
Dictionary<string, List<(int, int)>> weaponsWithAmmo = [];
foreach (var weapon in weapons)
if (weapons != null && weapons.Count > 0)
{
if (!weapon.IsValid || weapon.Value == null ||
!weapon.Value.IsValid || !weapon.Value.DesignerName.Contains("weapon_"))
continue;
CCSWeaponBaseGun gun = weapon.Value.As<CCSWeaponBaseGun>();
CCSPlayer_ItemServices service = new(player.PlayerPawn.Value.ItemServices.Handle);
//var dropWeapon = VirtualFunction.CreateVoid<nint, nint>(service.Handle, GameData.GetOffset("CCSPlayer_ItemServices_DropActivePlayerWeapon"));
if (weapon.Value.Entity == null) continue;
if (!weapon.Value.OwnerEntity.IsValid) continue;
if (gun.Entity == null) continue;
if (!gun.IsValid) continue;
try
foreach (var weapon in weapons)
{
CCSWeaponBaseVData? weaponData = weapon.Value.As<CCSWeaponBase>().VData;
if (weaponData == null) continue;
if (weaponData.GearSlot is gear_slot_t.GEAR_SLOT_RIFLE or gear_slot_t.GEAR_SLOT_PISTOL)
if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid)
{
if (!WeaponDefindex.TryGetValue(weapon.Value.AttributeManager.Item.ItemDefinitionIndex, out var weaponByDefindex))
continue;
int clip1 = weapon.Value.Clip1;
int reservedAmmo = weapon.Value.ReserveAmmo[0];
if (!weaponsWithAmmo.TryGetValue(weaponByDefindex, out var value))
//if (weapon.Value.AttributeManager.Item.ItemDefinitionIndex == 42 || weapon.Value.AttributeManager.Item.ItemDefinitionIndex == 59)
if (weapon.Value.DesignerName.Contains("knife") || weapon.Value.DesignerName.Contains("bayonet"))
{
value = [];
weaponsWithAmmo.Add(weaponByDefindex, value);
}
if (weapon.Index <= 0) return;
int weaponEntityIndex = (int)weapon.Index;
NativeAPI.IssueClientCommand((int)player.Index - 1, "slot3");
AddTimer(0.22f, () =>
{
if (player.PlayerPawn.Value.WeaponServices.ActiveWeapon.Value!.DesignerName.Contains("knife")
||
player.PlayerPawn.Value.WeaponServices.ActiveWeapon.Value!.DesignerName.Contains("bayonet")
)
{
if (player.PawnIsAlive)
{
NativeAPI.IssueClientCommand((int)player.Index - 1, "slot3");
service.DropActivePlayerWeapon(weapon.Value);
GiveKnifeToPlayer(player);
}
}
});
value.Add((clip1, reservedAmmo));
if (gun.VData == null) return;
weapon.Value?.AddEntityIOEvent("Kill", weapon.Value, null, "", 0.1f);
}
if (weaponData.GearSlot == gear_slot_t.GEAR_SLOT_KNIFE)
{
weapon.Value?.AddEntityIOEvent("Kill", weapon.Value, null, "", 0.1f);
hasKnife = true;
}
}
catch (Exception ex)
{
Logger.LogWarning(ex.Message);
}
}
AddTimer(0.23f, () =>
{
if (!_gBCommandsAllowed) return;
if (!PlayerHasKnife(player) && hasKnife)
{
var newKnife = new CBasePlayerWeapon(player.GiveNamedItem(CsItem.Knife));
var newWeapon = new CBasePlayerWeapon(player.GiveNamedItem(CsItem.USP));
player.GiveNamedItem(CsItem.Knife);
player.ExecuteClientCommand("slot3");
Server.NextFrame(() =>
Task.Delay(TimeSpan.FromSeconds(3.5)).ContinueWith(_ =>
{
try
{
if (newKnife != null && newKnife.IsValid)
newKnife.AddEntityIOEvent("Kill", newKnife, null, "", 0.01f);
if (newWeapon != null && newWeapon.IsValid)
newWeapon.AddEntityIOEvent("Kill", newWeapon, null, "", 0.01f);
}
catch (Exception ex)
{
Logger.LogWarning("Error AddEntityIOEvent " + ex.Message);
CEntityInstance? knife = Utilities.GetEntityFromIndex<CEntityInstance>(weaponEntityIndex);
if (knife != null && knife.IsValid && knife.Handle != -1 && knife.Index > 0)
{
knife.Remove();
}
}
catch (Exception) { }
});
break;
}
foreach (var entry in weaponsWithAmmo)
{
foreach (var ammo in entry.Value)
{
var newWeapon = new CBasePlayerWeapon(player.GiveNamedItem(entry.Key));
Server.NextFrame(() =>
{
try
{
newWeapon.Clip1 = ammo.Item1;
newWeapon.ReserveAmmo[0] = ammo.Item2;
IncrementWearForWeaponWithStickers(player, newWeapon);
}
catch (Exception ex)
{
Logger.LogWarning("Error setting weapon properties: " + ex.Message);
}
});
}
}
}, TimerFlags.STOP_ON_MAPCHANGE);
}
private void GivePlayerGloves(CCSPlayerController player)
{
if (!Utility.IsPlayerValid(player) || (LifeState_t)player.LifeState != LifeState_t.LIFE_ALIVE) return;
CCSPlayerPawn? pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid)
return;
var model = pawn.CBodyComponent?.SceneNode?.GetSkeletonInstance()?.ModelState.ModelName ?? string.Empty;
if (!string.IsNullOrEmpty(model))
{
pawn.SetModel("characters/models/tm_jumpsuit/tm_jumpsuit_varianta.vmdl");
pawn.SetModel(model);
}
CEconItemView item = pawn.EconGloves;
item.NetworkedDynamicAttributes.Attributes.RemoveAll();
item.AttributeList.Attributes.RemoveAll();
Instance.AddTimer(0.08f, () =>
{
try
{
if (!player.IsValid)
return;
if (!player.PawnIsAlive)
return;
if (!GPlayersGlove.TryGetValue(player.Slot, out var gloveInfo) ||
!gloveInfo.TryGetValue(player.Team, out var gloveId) ||
gloveId == 0 ||
!HasChangedPaint(player, gloveId, out var weaponInfo) || weaponInfo == null)
return;
item.ItemDefinitionIndex = gloveId;
UpdatePlayerEconItemId(item);
item.NetworkedDynamicAttributes.Attributes.RemoveAll();
CAttributeListSetOrAddAttributeValueByName.Invoke(item.NetworkedDynamicAttributes.Handle, "set item texture prefab", weaponInfo.Paint);
CAttributeListSetOrAddAttributeValueByName.Invoke(item.NetworkedDynamicAttributes.Handle, "set item texture seed", weaponInfo.Seed);
CAttributeListSetOrAddAttributeValueByName.Invoke(item.NetworkedDynamicAttributes.Handle, "set item texture wear", weaponInfo.Wear);
item.AttributeList.Attributes.RemoveAll();
CAttributeListSetOrAddAttributeValueByName.Invoke(item.AttributeList.Handle, "set item texture prefab", weaponInfo.Paint);
CAttributeListSetOrAddAttributeValueByName.Invoke(item.AttributeList.Handle, "set item texture seed", weaponInfo.Seed);
CAttributeListSetOrAddAttributeValueByName.Invoke(item.AttributeList.Handle, "set item texture wear", weaponInfo.Wear);
item.Initialized = true;
SetBodygroup(pawn, "default_gloves", 1);
}
}
catch (Exception) { }
}, TimerFlags.STOP_ON_MAPCHANGE);
}
}
/*
internal void RefreshSkins(CCSPlayerController? player)
{
return;
if (!Utility.IsPlayerValid(player) || !player!.PawnIsAlive) return;
AddTimer(0.18f, () => NativeAPI.IssueClientCommand((int)player.Index - 1, "slot3"));
AddTimer(0.25f, () => NativeAPI.IssueClientCommand((int)player.Index - 1, "slot2"));
AddTimer(0.38f, () => NativeAPI.IssueClientCommand((int)player.Index - 1, "slot1"));
}
*/
internal void RefreshWeapons(CCSPlayerController? player)
{
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PawnIsAlive) return;
if (player.PlayerPawn.Value.WeaponServices == null || player.PlayerPawn.Value.ItemServices == null) return;
var weapons = player.PlayerPawn.Value.WeaponServices.MyWeapons;
if (weapons != null && weapons.Count > 0)
{
CCSPlayer_ItemServices service = new(player.PlayerPawn.Value.ItemServices.Handle);
foreach (var weapon in weapons)
{
if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid)
{
if (weapon.Index <= 0 || !weapon.Value.DesignerName.Contains("weapon_")) continue;
//if (weapon.Value.AttributeManager.Item.ItemDefinitionIndex == 42 || weapon.Value.AttributeManager.Item.ItemDefinitionIndex == 59)
try
{
if (weapon.Value.DesignerName.Contains("knife") || weapon.Value.DesignerName.Contains("bayonet"))
{
player.RemoveItemByDesignerName(weapon.Value.DesignerName, true);
GiveKnifeToPlayer(player);
}
else
{
if (!WeaponDefindex.ContainsKey(weapon.Value.AttributeManager.Item.ItemDefinitionIndex)) continue;
int clip1, reservedAmmo;
clip1 = weapon.Value.Clip1;
reservedAmmo = weapon.Value.ReserveAmmo[0];
string weaponByDefindex = WeaponDefindex[weapon.Value.AttributeManager.Item.ItemDefinitionIndex];
player.RemoveItemByDesignerName(weapon.Value.DesignerName, true);
CBasePlayerWeapon newWeapon = new(player.GiveNamedItem(weaponByDefindex));
Server.NextFrame(() =>
{
if (newWeapon == null) return;
try
{
newWeapon.Clip1 = clip1;
newWeapon.ReserveAmmo[0] = reservedAmmo;
}
catch (Exception)
{ }
});
}
}
catch (Exception ex)
{
Logger.LogWarning("Refreshing weapons exception");
Console.WriteLine("[WeaponPaints] Refreshing weapons exception");
Console.WriteLine(ex.Message);
}
}
}
/*
if (Config.AdditionalSetting.SkinVisibilityFix)
RefreshSkins(player);
*/
}
}
internal void RemovePlayerKnife(CCSPlayerController? player, bool force = false)
{
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PawnIsAlive) return;
if (player.PlayerPawn.Value.WeaponServices == null || player.PlayerPawn.Value.ItemServices == null) return;
var weapons = player.PlayerPawn.Value.WeaponServices.MyWeapons;
if (weapons != null && weapons.Count > 0)
{
CCSPlayer_ItemServices service = new CCSPlayer_ItemServices(player.PlayerPawn.Value.ItemServices.Handle);
//var dropWeapon = VirtualFunction.CreateVoid<nint, nint>(service.Handle, GameData.GetOffset("CCSPlayer_ItemServices_DropActivePlayerWeapon"));
foreach (var weapon in weapons)
{
if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid)
{
//if (weapon.Value.AttributeManager.Item.ItemDefinitionIndex == 42 || weapon.Value.AttributeManager.Item.ItemDefinitionIndex == 59)
if (weapon.Value.DesignerName.Contains("knife") || weapon.Value.DesignerName.Contains("bayonet"))
{
if (!force)
{
if ((int)weapon.Index <= 0) return;
int weaponEntityIndex = (int)weapon.Index;
NativeAPI.IssueClientCommand((int)player.Index - 1, "slot3");
AddTimer(0.35f, () => service.DropActivePlayerWeapon(weapon.Value));
AddTimer(1.0f, () =>
{
CEntityInstance? knife = Utilities.GetEntityFromIndex<CEntityInstance>(weaponEntityIndex);
if (knife != null && knife.IsValid)
{
knife.Remove();
}
});
}
else
{
weapon.Value.Remove();
}
break;
}
}
}
}
}
private static int GetRandomPaint(int defindex)
{
if (SkinsList.Count == 0)
return 0;
Random rnd = new Random();
// Filter weapons by the provided defindex
var filteredWeapons = SkinsList.Where(w => w["weapon_defindex"]?.ToString() == defindex.ToString()).ToList();
if (filteredWeapons.Count == 0)
return 0;
var randomWeapon = filteredWeapons[rnd.Next(filteredWeapons.Count)];
return int.TryParse(randomWeapon["paint"]?.ToString(), out var paintValue) ? paintValue : 0;
}
//xstage idea on css discord
public static void SubclassChange(CBasePlayerWeapon weapon, ushort itemD)
{
weapon.AcceptInput("ChangeSubclass", value: itemD.ToString());
}
public static void SetBodygroup(CCSPlayerPawn pawn, string group, int value)
{
pawn.AcceptInput("SetBodygroup", value:$"{group},{value}");
}
private void UpdateWeaponMeshGroupMask(CBaseEntity weapon, bool isLegacy = false)
{
if (weapon.CBodyComponent?.SceneNode == null) return;
//var skeleton = weapon.CBodyComponent.SceneNode.GetSkeletonInstance();
// skeleton.ModelState.MeshGroupMask = isLegacy ? 2UL : 1UL;
weapon.AcceptInput("SetBodygroup", value: $"body,{(isLegacy ? 1 : 0)}");
}
private void UpdatePlayerWeaponMeshGroupMask(CCSPlayerController player, CBasePlayerWeapon weapon, bool isLegacy)
{
UpdateWeaponMeshGroupMask(weapon, isLegacy);
}
private static void GivePlayerAgent(CCSPlayerController player)
{
if (!GPlayersAgent.TryGetValue(player.Slot, out var value)) return;
var model = player.TeamNum == 3 ? value.CT : value.T;
if (string.IsNullOrEmpty(model)) return;
if (player.PlayerPawn.Value == null)
return;
try
if (skinsList != null)
{
Server.NextFrame(() =>
Random rnd = new Random();
// Filter weapons by the provided defindex
var filteredWeapons = skinsList.FindAll(w => w["weapon_defindex"]?.ToString() == defindex.ToString());
if (filteredWeapons.Count > 0)
{
player.PlayerPawn.Value.SetModel(
$"characters/models/{model}.vmdl"
);
});
}
catch (Exception)
{
}
}
private static void GivePlayerMusicKit(CCSPlayerController player)
{
if (player.IsBot) return;
if (!GPlayersMusic.TryGetValue(player.Slot, out var musicInfo) ||
!musicInfo.TryGetValue(player.Team, out var musicId) || musicId == 0) return;
if (player.InventoryServices == null) return;
player.MusicKitID = musicId;
// player.MvpNoMusic = false;
player.InventoryServices.MusicID = musicId;
Utilities.SetStateChanged(player, "CCSPlayerController", "m_iMusicKitID");
// Utilities.SetStateChanged(player, "CCSPlayerController", "m_bMvpNoMusic");
Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInventoryServices");
// player.MusicKitMVPs = musicId;
// Utilities.SetStateChanged(player, "CCSPlayerController", "m_iMusicKitMVPs");
}
private static void GivePlayerPin(CCSPlayerController player)
{
if (!GPlayersPin.TryGetValue(player.Slot, out var pinInfo) ||
!pinInfo.TryGetValue(player.Team, out var pinId)) return;
if (player.InventoryServices == null) return;
player.InventoryServices.Rank[5] = pinId > 0 ? (MedalRank_t)pinId : MedalRank_t.MEDAL_RANK_NONE;
Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInventoryServices");
}
private void GiveOnItemPickup(CCSPlayerController player)
{
var pawn = player.PlayerPawn.Value;
if (pawn == null) return;
var myWeapons = pawn.WeaponServices?.MyWeapons;
if (myWeapons == null) return;
foreach (var handle in myWeapons)
{
var weapon = handle.Value;
if (weapon == null || !weapon.IsValid) continue;
if (myWeapons.Count == 1)
{
var newWeapon = new CBasePlayerWeapon(player.GiveNamedItem(CsItem.USP));
weapon.AddEntityIOEvent("Kill", weapon, null, "", 0.01f);
player.GiveNamedItem(CsItem.Knife);
player.ExecuteClientCommand("slot3");
newWeapon.AddEntityIOEvent("Kill", newWeapon, null, "", 0.01f);
var randomWeapon = filteredWeapons[rnd.Next(filteredWeapons.Count)];
if (int.TryParse(randomWeapon["paint"]?.ToString(), out int paintValue))
{
return paintValue;
}
else
{
return 0;
}
}
GivePlayerWeaponSkin(player, weapon);
}
return 0;
}
private void UpdatePlayerEconItemId(CEconItemView econItemView)
private static unsafe CHandle<CBaseViewModel>[]? GetPlayerViewModels(CCSPlayerController player)
{
var itemId = _nextItemId++;
econItemView.ItemID = itemId;
econItemView.ItemIDLow = (uint)itemId & 0xFFFFFFFF;
econItemView.ItemIDHigh = (uint)itemId >> 32;
if (player.PlayerPawn.Value == null || player.PlayerPawn.Value.ViewModelServices == null) return null;
CCSPlayer_ViewModelServices viewModelServices = new CCSPlayer_ViewModelServices(player.PlayerPawn.Value.ViewModelServices!.Handle);
return GetFixedArray<CHandle<CBaseViewModel>>(viewModelServices.Handle, "CCSPlayer_ViewModelServices", "m_hViewModel", 3);
}
private static CCSPlayerController? GetPlayerFromItemServices(CCSPlayer_ItemServices itemServices)
public static unsafe T[] GetFixedArray<T>(nint pointer, string @class, string member, int length) where T : CHandle<CBaseViewModel>
{
var pawn = itemServices.Pawn.Value;
if (!pawn.IsValid || !pawn.Controller.IsValid || pawn.Controller.Value == null) return null;
var player = new CCSPlayerController(pawn.Controller.Value.Handle);
return !Utility.IsPlayerValid(player) ? null : player;
}
nint ptr = pointer + Schema.GetSchemaOffset(@class, member);
Span<nint> references = MemoryMarshal.CreateSpan<nint>(ref ptr, length);
T[] values = new T[length];
private static bool HasChangedKnife(CCSPlayerController player, out string? knifeValue)
{
knifeValue = null;
// Check if player has knife info for their slot and team
if (!GPlayersKnife.TryGetValue(player.Slot, out var knife) ||
!knife.TryGetValue(player.Team, out var value) ||
value == "weapon_knife") return false;
knifeValue = value; // Assign the knife value to the out parameter
return true;
}
private static bool HasChangedPaint(CCSPlayerController player, int weaponDefIndex, out WeaponInfo? weaponInfo)
{
weaponInfo = null;
// Check if player has weapons info for their slot and team
if (!GPlayerWeaponsInfo.TryGetValue(player.Slot, out var teamInfo) ||
!teamInfo.TryGetValue(player.Team, out var teamWeapons))
for (int i = 0; i < length; i++)
{
return false;
values[i] = (T)Activator.CreateInstance(typeof(T), references[i])!;
}
// Check if the specified weapon has a paint/skin change
if (!teamWeapons.TryGetValue(weaponDefIndex, out var value) || value.Paint <= 0) return false;
weaponInfo = value; // Assign the out variable when it exists
return true;
}
private static float ViewAsFloat(uint value)
{
return BitConverter.Int32BitsToSingle((int)value);
return values;
}
}
}
}

View File

@@ -2,33 +2,12 @@
{
public class WeaponInfo
{
public int Paint { get; set; }
public int Seed { get; set; }
public ushort Paint { get; set; }
public ushort Seed { get; set; }
public float Wear { get; set; }
public string Nametag { get; set; } = "";
public bool StatTrak { get; set; }
public int StatTrakCount { get; set; }
public KeyChainInfo? KeyChain { get; set; }
public List<StickerInfo> Stickers { get; set; } = new();
}
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; }
}
public string? NameTag { get; set; }
public ushort Quality { get; set; }
public uint StatTrack { get; set; }
public bool StatTrackEnabled { get; set; }
}
}

View File

@@ -1,146 +1,288 @@
using System.Runtime.InteropServices;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes;
using CounterStrikeSharp.API.Core.Attributes.Registration;
using CounterStrikeSharp.API.Modules.Commands;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Cvars;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using MySqlConnector;
using Newtonsoft.Json.Linq;
using System.Collections.Concurrent;
namespace WeaponPaints;
[MinimumApiVersion(338)]
[MinimumApiVersion(155)]
public partial class WeaponPaints : BasePlugin, IPluginConfig<WeaponPaintsConfig>
{
internal static WeaponPaints Instance { get; private set; } = new();
internal 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_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" }
};
public 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" },
{ 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" }
};
public WeaponPaintsConfig Config { get; set; } = new();
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";
internal static WeaponPaintsConfig _config = new WeaponPaintsConfig();
internal static IStringLocalizer? _localizer;
internal static Dictionary<int, int> g_knifePickupCount = new Dictionary<int, int>();
internal static ConcurrentDictionary<int, int> g_playersDatabaseIndex = new ConcurrentDictionary<int, int>();
internal static ConcurrentDictionary<int, string> g_playersKnife = new ConcurrentDictionary<int, string>();
internal static ConcurrentDictionary<int, int?> g_playersMusicKit = new ConcurrentDictionary<int, int?>();
internal static ConcurrentDictionary<int, ConcurrentDictionary<ushort, WeaponInfo>> gPlayerWeaponsInfo = new ConcurrentDictionary<int, ConcurrentDictionary<ushort, WeaponInfo>>();
internal static List<JObject> skinsList = new List<JObject>();
internal static WeaponSynchronization? weaponSync;
internal bool g_bCommandsAllowed = true;
internal Uri GlobalShareApi = new("https://weaponpaints.fun/api.php");
internal int GlobalShareServerId = 0;
internal static Dictionary<int, DateTime> commandsCooldown = new Dictionary<int, DateTime>();
private string DatabaseConnectionString = string.Empty;
//private CounterStrikeSharp.API.Modules.Timers.Timer? g_hTimerCheckSkinsData = null;
public WeaponPaintsConfig Config { get; set; } = new();
public override string ModuleAuthor => "Nereziel & daffyy";
public override string ModuleDescription => "Skin and knife selector, standalone and web-based";
public override string ModuleName => "WeaponPaints";
public override string ModuleVersion => "3.2b";
public override string ModuleVersion => "1.5.0";
public static WeaponPaintsConfig GetWeaponPaintsConfig()
{
return _config;
}
public override void Load(bool hotReload)
{
// Hardcoded hotfix needs to be changed later (Not needed 17.09.2025)
//if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
// Patch.PerformPatch("0F 85 ? ? ? ? 31 C0 B9 ? ? ? ? BA ? ? ? ? 66 0F EF C0 31 F6 31 FF 48 C7 45 ? ? ? ? ? 48 C7 45 ? ? ? ? ? 48 C7 45 ? ? ? ? ? 48 C7 45 ? ? ? ? ? 0F 29 45 ? 48 C7 45 ? ? ? ? ? C7 45 ? ? ? ? ? 66 89 45 ? E8 ? ? ? ? 41 89 C5 85 C0 0F 8E", "90 90 90 90 90 90");
//else
// Patch.PerformPatch("74 ? 48 8D 0D ? ? ? ? FF 15 ? ? ? ? EB ? BA", "EB");
Instance = this;
if (!Config.GlobalShare)
{
DatabaseConnectionString = Utility.BuildDatabaseConnectionString();
Utility.TestDatabaseConnection();
}
if (hotReload)
{
OnMapStart(string.Empty);
GPlayerWeaponsInfo.Clear();
GPlayersKnife.Clear();
GPlayersGlove.Clear();
GPlayersAgent.Clear();
GPlayersPin.Clear();
GPlayersMusic.Clear();
foreach (var player in Enumerable
.OfType<CCSPlayerController>(Utilities.GetPlayers().TakeWhile(_ => WeaponSync != null))
.Where(player => player.IsValid &&
!string.IsNullOrEmpty(player.IpAddress) && player is
{ IsBot: false, Connected: PlayerConnectedState.PlayerConnected }))
List<CCSPlayerController> players = Utilities.GetPlayers();
foreach (CCSPlayerController player in players)
{
var playerInfo = new PlayerInfo
if (player == null || !player.IsValid || player.IsBot || player.IsHLTV || player.SteamID.ToString() == "") continue;
if (g_playersDatabaseIndex.ContainsKey((int)player.Index)) continue;
PlayerInfo playerInfo = new PlayerInfo
{
UserId = player.UserId,
Slot = player.Slot,
Index = (int)player.Index,
SteamId = player?.SteamID.ToString(),
SteamId = player?.SteamID,
Name = player?.PlayerName,
IpAddress = player?.IpAddress?.Split(":")[0]
};
_ = Task.Run(async () =>
if (weaponSync != null)
{
if (WeaponSync != null) await WeaponSync.GetPlayerData(playerInfo);
});
_ = weaponSync!.GetPlayerDatabaseIndex(playerInfo);
}
g_knifePickupCount[(int)player!.Index] = 0;
}
/*
RegisterListeners();
RegisterCommands();
*/
}
Utility.LoadSkinsFromFile(ModuleDirectory + $"/data/skins_{_config.SkinsLanguage}.json", Logger);
Utility.LoadGlovesFromFile(ModuleDirectory + $"/data/gloves_{_config.SkinsLanguage}.json", Logger);
Utility.LoadAgentsFromFile(ModuleDirectory + $"/data/agents_{_config.SkinsLanguage}.json", Logger);
Utility.LoadMusicFromFile(ModuleDirectory + $"/data/music_{_config.SkinsLanguage}.json", Logger);
Utility.LoadPinsFromFile(ModuleDirectory + $"/data/collectibles_{_config.SkinsLanguage}.json", Logger);
if (Config.AdditionalSetting.KnifeEnabled)
SetupKnifeMenu();
if (Config.AdditionalSetting.SkinEnabled)
SetupSkinsMenu();
RegisterListeners();
RegisterCommands();
Utility.LoadSkinsFromFile(ModuleDirectory + "/skins.json");
}
public void OnConfigParsed(WeaponPaintsConfig config)
{
if (!config.GlobalShare)
{
if (config.DatabaseHost.Length < 1 || config.DatabaseName.Length < 1 || config.DatabaseUser.Length < 1)
{
// maybe more spam to get attention?
for (int i = 1; i <= 30; i++)
{
Console.WriteLine("[WeaponPaints] You need to setup Database credentials in config!");
}
Logger.LogError("You need to setup Database credentials in config!");
throw new Exception("[WeaponPaints] You need to setup Database credentials in config!");
}
}
else
{
// maybe more spam to get attention?
for (int i = 1; i <= 30; i++)
{
Console.WriteLine("[WeaponPaints] GLOBAL SHARE IS NOT SUPPORTED NOW !!");
}
Logger.LogError("GLOBAL SHARE IS NOT SUPPORTED NOW !!");
throw new Exception("[WeaponPaints] GLOBAL SHARE IS NOT SUPPORTED NOW !!");
}
Config = config;
_config = config;
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\"!");
Unload(false);
return;
}
if (!File.Exists(Path.GetDirectoryName(Path.GetDirectoryName(ModuleDirectory)) + "/gamedata/weaponpaints.json"))
{
Logger.LogError("You need to upload \"weaponpaints.json\" to \"gamedata directory\"!");
Unload(false);
return;
}
var builder = new MySqlConnectionStringBuilder
{
Server = config.DatabaseHost,
UserID = config.DatabaseUser,
Password = config.DatabasePassword,
Database = config.DatabaseName,
Port = (uint)config.DatabasePort,
Pooling = true,
MaximumPoolSize = 640,
};
Database = new Database(builder.ConnectionString);
_ = Utility.CheckDatabaseTables();
_localizer = Localizer;
Utility.Config = config;
/*
* GLOBAL SHARE IS NOT SUPPORTED NOW!
*/
if (Config.GlobalShare)
Config.GlobalShare = false;
Utility.Config = config;
Utility.ShowAd(ModuleVersion);
Task.Run(async () => await Utility.CheckVersion(ModuleVersion, Logger));
}
public override void OnAllPluginsLoaded(bool hotReload)
public override void Unload(bool hotReload)
{
try
{
MenuApi = MenuCapability.Get();
if (Config.Additional.KnifeEnabled)
SetupKnifeMenu();
if (Config.Additional.SkinEnabled)
SetupSkinsMenu();
if (Config.Additional.GloveEnabled)
SetupGlovesMenu();
if (Config.Additional.AgentEnabled)
SetupAgentsMenu();
if (Config.Additional.MusicEnabled)
SetupMusicMenu();
if (Config.Additional.PinsEnabled)
SetupPinsMenu();
RegisterCommands();
}
catch (Exception)
{
MenuApi = null;
Logger.LogError("Error while loading required plugins");
throw;
}
base.Unload(hotReload);
}
}
private void GlobalShareConnect()
{
if (!Config.GlobalShare) return;
var values = new Dictionary<string, string>
{
{ "server_address", $"{ConVar.Find("ip")!.StringValue}:{ConVar.Find("hostport")!.GetPrimitiveValue<int>().ToString()}" },
{ "server_hostname", ConVar.Find("hostname")!.StringValue }
};
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = GlobalShareApi;
var formContent = new FormUrlEncodedContent(values);
Task<HttpResponseMessage> responseTask = httpClient.PostAsync("", formContent);
responseTask.Wait();
HttpResponseMessage response = responseTask.Result;
if (response.IsSuccessStatusCode)
{
Task<string> responseBodyTask = response.Content.ReadAsStringAsync();
responseBodyTask.Wait();
string responseBody = responseBodyTask.Result;
GlobalShareServerId = int.Parse(responseBody);
}
else
{
Logger.LogError("Unable to retrieve serverid from GlobalShare!");
throw new Exception("[WeaponPaints] Unable to retrieve serverid from GlobalShare!");
}
}
Logger.LogInformation("GlobalShare ONLINE!");
Console.WriteLine("[WeaponPaints] GlobalShare ONLINE");
}
}

View File

@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
@@ -9,23 +9,13 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.361" />
<PackageReference Include="Dapper" Version="2.1.66" />
<PackageReference Include="MySqlConnector" Version="2.5.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.5-beta1" />
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.148" />
<PackageReference Include="Dapper" Version="2.1.28" />
<PackageReference Include="MySqlConnector" Version="2.3.4" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
<ItemGroup>
<None Update="lang\**\*.*" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup>
<None Update="gamedata\*.*" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup>
<Reference Include="MenuManagerApi">
<HintPath>3rd_party\MenuManagerApi.dll</HintPath>
</Reference>
</ItemGroup>
</Project>

View File

@@ -1,11 +0,0 @@
<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>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACBaseAnimGraph_002Eg_002Ecs_002Fl_003AC_0021_003FUsers_003Fxdaff_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fedce4cda20b83aa28fbed15b81eb0eda1753e497144879a4bd754947d37639_003FCBaseAnimGraph_002Eg_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACBaseEntity_002Eg_002Ecs_002Fl_003AC_0021_003FUsers_003Fxdaff_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fdd25ac51dad807865e0d135626a4fd984d63a388bf0c3285f9d7d7db9c1071_003FCBaseEntity_002Eg_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACBodyComponent_002Eg_002Ecs_002Fl_003AC_0021_003FUsers_003Fxdaff_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fdb7e149cad83cf211ee55349a3442256ec62acce5ba41474ad124572f767e271_003FCBodyComponent_002Eg_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACCSPlayerController_002Ecs_002Fl_003AC_0021_003FUsers_003Fxdaff_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fab13f7aee75d35b3ec314a3fd92a24c4c0126cef65a8dda49bd83da5a2a77443_003FCCSPlayerController_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACCSPlayerController_005FInventoryServices_002Eg_002Ecs_002Fl_003AC_0021_003FUsers_003Fxdaff_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fff255772feb17b2ef53224c45249eee339ad7148e2b42bb1afad71bd57d02b69_003FCCSPlayerController_005FInventoryServices_002Eg_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACGameSceneNode_002Ecs_002Fl_003AC_0021_003FUsers_003Fxdaff_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F343a4f176a269193769d7fd81231808c83529cab0f6c98fd96eb77f558974_003FCGameSceneNode_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACModelState_002Eg_002Ecs_002Fl_003AC_0021_003FUsers_003Fxdaff_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fb03ffa24c03867c84b5d095397bd1578b8ea563ab2c72b30242ffad815d49e_003FCModelState_002Eg_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AListeners_002Eg_002Ecs_002Fl_003AC_0021_003FUsers_003Fxdaff_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fdbb2ccedd8f0b227a69f9ef0b434aa5a70b83e93bf1eac4cd91a31b7985efd4_003FListeners_002Eg_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ANetworkedVector_002Ecs_002Fl_003AC_0021_003FUsers_003Fxdaff_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fd68dbf9c04bc6046e155f1866c3615a47e34017f330c9e351d68979b9281c_003FNetworkedVector_002Ecs/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>

View File

@@ -1,630 +1,331 @@
using Dapper;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities;
using Dapper;
using MySqlConnector;
using Newtonsoft.Json.Linq;
using System.Collections.Concurrent;
using CounterStrikeSharp.API.Modules.Utils;
using System.Globalization;
namespace WeaponPaints;
internal class WeaponSynchronization
namespace WeaponPaints
{
private readonly WeaponPaintsConfig _config;
private readonly Database _database;
internal WeaponSynchronization(Database database, WeaponPaintsConfig config)
internal class WeaponSynchronization
{
_database = database;
_config = config;
}
private readonly WeaponPaintsConfig _config;
private readonly string _databaseConnectionString;
private readonly Uri _globalShareApi;
private readonly int _globalShareServerId;
internal async Task GetPlayerData(PlayerInfo? player)
{
try
internal WeaponSynchronization(string databaseConnectionString, WeaponPaintsConfig config, Uri globalShareApi, int globalShareServerId)
{
await using var connection = await _database.GetConnectionAsync();
if (_config.Additional.KnifeEnabled)
GetKnifeFromDatabase(player, connection);
if (_config.Additional.GloveEnabled)
GetGloveFromDatabase(player, connection);
if (_config.Additional.AgentEnabled)
GetAgentFromDatabase(player, connection);
if (_config.Additional.MusicEnabled)
GetMusicFromDatabase(player, connection);
if (_config.Additional.SkinEnabled)
GetWeaponPaintsFromDatabase(player, connection);
if (_config.Additional.PinsEnabled)
GetPinsFromDatabase(player, connection);
_databaseConnectionString = databaseConnectionString;
_config = config;
_globalShareApi = globalShareApi;
_globalShareServerId = globalShareServerId;
}
catch (Exception ex)
internal async Task GetPlayerDatabaseIndex(PlayerInfo player)
{
// Log the exception or handle it appropriately
Console.WriteLine($"An error occurred: {ex.Message}");
}
}
if (player.SteamId == null || player.Index == 0) return;
private void GetKnifeFromDatabase(PlayerInfo? player, MySqlConnection connection)
{
try
{
if (!_config.Additional.KnifeEnabled || string.IsNullOrEmpty(player?.SteamId))
return;
const string query = "SELECT `knife`, `weapon_team` FROM `wp_player_knife` WHERE `steamid` = @steamid ORDER BY `weapon_team` ASC";
var rows = connection.Query<dynamic>(query, new { steamid = player.SteamId }); // Retrieve all records for the player
foreach (var row in rows)
try
{
// Check if knife is null or empty
if (string.IsNullOrEmpty(row.knife)) continue;
// Determine the weapon team based on the query result
CsTeam weaponTeam = (int)row.weapon_team switch
using (var connection = new MySqlConnection(_databaseConnectionString))
{
2 => CsTeam.Terrorist,
3 => CsTeam.CounterTerrorist,
_ => CsTeam.None,
};
await connection.OpenAsync();
// Get or create entries for the players slot
var playerKnives = WeaponPaints.GPlayersKnife.GetOrAdd(player.Slot, _ => new ConcurrentDictionary<CsTeam, string>());
string query = "SELECT `id` FROM `wp_users` WHERE `steamid` = @steamid";
int? databaseIndex = await connection.QueryFirstOrDefaultAsync<int?>(query, new { steamid = player.SteamId });
if (databaseIndex != null)
{
WeaponPaints.g_playersDatabaseIndex[player.Index] = (int)databaseIndex;
}
else
{
string insertQuery = "INSERT INTO `wp_users` (`steamid`) VALUES (@steamid)";
await connection.ExecuteAsync(insertQuery, new { steamid = player.SteamId });
Console.WriteLine("SQL Insert Query: " + insertQuery);
databaseIndex = await connection.QueryFirstOrDefaultAsync<int?>(query, new { steamid = player.SteamId });
WeaponPaints.g_playersDatabaseIndex[(int)player.Index] = (int)databaseIndex;
}
await connection.CloseAsync();
if (weaponTeam == CsTeam.None)
{
// Assign knife to both teams if weaponTeam is None
playerKnives[CsTeam.Terrorist] = row.knife;
playerKnives[CsTeam.CounterTerrorist] = row.knife;
}
else
{
// Assign knife to the specific team
playerKnives[weaponTeam] = row.knife;
}
}
}
catch (Exception ex)
{
Utility.Log($"An error occurred in GetKnifeFromDatabase: {ex.Message}");
}
}
if (databaseIndex != null)
{
if (_config.AdditionalSetting.SkinEnabled)
await GetWeaponPaintsFromDatabase(player);
if (_config.AdditionalSetting.KnifeEnabled)
await GetKnifeFromDatabase(player);
if (_config.AdditionalSetting.MusicKitEnabled)
await GetMusicKitFromDatabase(player);
}
}
private void GetGloveFromDatabase(PlayerInfo? player, MySqlConnection connection)
{
try
{
if (!_config.Additional.GloveEnabled || string.IsNullOrEmpty(player?.SteamId))
return;
const string query = "SELECT `weapon_defindex`, `weapon_team` FROM `wp_player_gloves` WHERE `steamid` = @steamid ORDER BY `weapon_team` ASC";
var rows = connection.Query<dynamic>(query, new { steamid = player.SteamId }); // Retrieve all records for the player
foreach (var row in rows)
}
catch (Exception e)
{
// Check if weapon_defindex is null
if (row.weapon_defindex == null) continue;
// Determine the weapon team based on the query result
var playerGloves = WeaponPaints.GPlayersGlove.GetOrAdd(player.Slot, _ => new ConcurrentDictionary<CsTeam, ushort>());
CsTeam weaponTeam = (int)row.weapon_team switch
{
2 => CsTeam.Terrorist,
3 => CsTeam.CounterTerrorist,
_ => CsTeam.None,
};
// Get or create entries for the players slot
if (weaponTeam == CsTeam.None)
{
// Assign glove ID to both teams if weaponTeam is None
playerGloves[CsTeam.Terrorist] = (ushort)row.weapon_defindex;
playerGloves[CsTeam.CounterTerrorist] = (ushort)row.weapon_defindex;
}
else
{
// Assign glove ID to the specific team
playerGloves[weaponTeam] = (ushort)row.weapon_defindex;
}
}
}
catch (Exception ex)
Utility.Log("GetPlayerDatabaseIndex: " + e.Message);
return;
}
}
internal async Task GetKnifeFromDatabase(PlayerInfo player)
{
Utility.Log($"An error occurred in GetGlovesFromDatabase: {ex.Message}");
}
}
private void GetAgentFromDatabase(PlayerInfo? player, MySqlConnection connection)
{
try
{
if (!_config.Additional.AgentEnabled || string.IsNullOrEmpty(player?.SteamId))
return;
const string query = "SELECT `agent_ct`, `agent_t` FROM `wp_player_agents` WHERE `steamid` = @steamid";
var agentData = connection.QueryFirstOrDefault<(string, string)>(query, new { steamid = player.SteamId });
if (agentData == default) return;
var agentCT = agentData.Item1;
var agentT = agentData.Item2;
if (!string.IsNullOrEmpty(agentCT) || !string.IsNullOrEmpty(agentT))
if (!_config.AdditionalSetting.KnifeEnabled) return;
if (player.SteamId == null || player.Index == 0) return;
try
{
WeaponPaints.GPlayersAgent[player.Slot] = (
agentCT,
agentT
);
}
}
catch (Exception ex)
{
Utility.Log($"An error occurred in GetAgentFromDatabase: {ex.Message}");
}
}
private void GetWeaponPaintsFromDatabase(PlayerInfo? player, MySqlConnection connection)
{
try
{
if (!_config.Additional.SkinEnabled || player == null || string.IsNullOrEmpty(player.SteamId))
return;
var playerWeapons = WeaponPaints.GPlayerWeaponsInfo.GetOrAdd(player.Slot,
_ => new ConcurrentDictionary<CsTeam, ConcurrentDictionary<int, WeaponInfo>>());
// var weaponInfos = new ConcurrentDictionary<int, WeaponInfo>();
const string query = "SELECT * FROM `wp_player_skins` WHERE `steamid` = @steamid ORDER BY `weapon_team` ASC";
var playerSkins = connection.Query<dynamic>(query, new { steamid = player.SteamId });
foreach (var row in playerSkins)
{
int weaponDefIndex = row.weapon_defindex ?? 0;
int weaponPaintId = row.weapon_paint_id ?? 0;
float weaponWear = row.weapon_wear ?? 0f;
int weaponSeed = row.weapon_seed ?? 0;
string weaponNameTag = row.weapon_nametag ?? "";
bool weaponStatTrak = row.weapon_stattrak ?? false;
int weaponStatTrakCount = row.weapon_stattrak_count ?? 0;
CsTeam weaponTeam = row.weapon_team switch
if (_config.GlobalShare)
{
2 => CsTeam.Terrorist,
3 => CsTeam.CounterTerrorist,
_ => CsTeam.None,
};
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], NumberStyles.Float, CultureInfo.InvariantCulture, out float keyChainOffsetX) &&
float.TryParse(keyChainParts[2], NumberStyles.Float, CultureInfo.InvariantCulture, out float keyChainOffsetY) &&
float.TryParse(keyChainParts[3], NumberStyles.Float, CultureInfo.InvariantCulture, 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
{
Paint = weaponPaintId,
Seed = weaponSeed,
Wear = weaponWear,
Nametag = weaponNameTag,
KeyChain = keyChainInfo,
StatTrak = weaponStatTrak,
StatTrakCount = weaponStatTrakCount,
};
// 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], NumberStyles.Float, CultureInfo.InvariantCulture, out float stickerOffsetX) ||
!float.TryParse(parts[3], NumberStyles.Float, CultureInfo.InvariantCulture, out float stickerOffsetY) ||
!float.TryParse(parts[4], NumberStyles.Float, CultureInfo.InvariantCulture, out float stickerWear) ||
!float.TryParse(parts[5], NumberStyles.Float, CultureInfo.InvariantCulture, out float stickerScale) ||
!float.TryParse(parts[6], NumberStyles.Float, CultureInfo.InvariantCulture, out float stickerRotation)) continue;
StickerInfo stickerInfo = new StickerInfo
var values = new Dictionary<string, string>
{
Id = stickerId,
Schema = stickerSchema,
OffsetX = stickerOffsetX,
OffsetY = stickerOffsetY,
Wear = stickerWear,
Scale = stickerScale,
Rotation = stickerRotation
{ "server_id", _globalShareServerId.ToString() },
{ "steamid", player.SteamId.ToString()! },
{ "knife", "1" }
};
weaponInfo.Stickers.Add(stickerInfo);
}
if (weaponTeam == CsTeam.None)
{
// Get or create entries for both teams
var terroristWeapons = playerWeapons.GetOrAdd(CsTeam.Terrorist, _ => new ConcurrentDictionary<int, WeaponInfo>());
var counterTerroristWeapons = playerWeapons.GetOrAdd(CsTeam.CounterTerrorist, _ => new ConcurrentDictionary<int, WeaponInfo>());
UriBuilder builder = new UriBuilder(_globalShareApi);
builder.Query = string.Join("&", values.Select(p => $"{Uri.EscapeDataString(p.Key)}={Uri.EscapeDataString(p.Value)}"));
// Add weaponInfo to both team weapon dictionaries
terroristWeapons[weaponDefIndex] = weaponInfo;
counterTerroristWeapons[weaponDefIndex] = weaponInfo;
}
else
{
// Add to the specific team
var teamWeapons = playerWeapons.GetOrAdd(weaponTeam, _ => new ConcurrentDictionary<int, WeaponInfo>());
teamWeapons[weaponDefIndex] = weaponInfo;
}
// weaponInfos[weaponDefIndex] = weaponInfo;
}
// WeaponPaints.GPlayerWeaponsInfo[player.Slot][weaponTeam] = weaponInfos;
}
catch (Exception ex)
{
Utility.Log($"An error occurred in GetWeaponPaintsFromDatabase: {ex.Message}");
}
}
private void GetMusicFromDatabase(PlayerInfo? player, MySqlConnection connection)
{
try
{
if (!_config.Additional.MusicEnabled || string.IsNullOrEmpty(player?.SteamId))
return;
const string query = "SELECT `music_id`, `weapon_team` FROM `wp_player_music` WHERE `steamid` = @steamid ORDER BY `weapon_team` ASC";
var rows = connection.Query<dynamic>(query, new { steamid = player.SteamId }); // Retrieve all records for the player
foreach (var row in rows)
{
// Check if music_id is null
if (row.music_id == null) continue;
// Determine the weapon team based on the query result
CsTeam weaponTeam = (int)row.weapon_team switch
{
2 => CsTeam.Terrorist,
3 => CsTeam.CounterTerrorist,
_ => CsTeam.None,
};
// Get or create entries for the players slot
var playerMusic = WeaponPaints.GPlayersMusic.GetOrAdd(player.Slot, _ => new ConcurrentDictionary<CsTeam, ushort>());
if (weaponTeam == CsTeam.None)
{
// Assign music ID to both teams if weaponTeam is None
playerMusic[CsTeam.Terrorist] = (ushort)row.music_id;
playerMusic[CsTeam.CounterTerrorist] = (ushort)row.music_id;
}
else
{
// Assign music ID to the specific team
playerMusic[weaponTeam] = (ushort)row.music_id;
}
}
}
catch (Exception ex)
{
Utility.Log($"An error occurred in GetMusicFromDatabase: {ex.Message}");
}
}
private void GetPinsFromDatabase(PlayerInfo? player, MySqlConnection connection)
{
try
{
if (string.IsNullOrEmpty(player?.SteamId))
return;
const string query = "SELECT `id`, `weapon_team` FROM `wp_player_pins` WHERE `steamid` = @steamid ORDER BY `weapon_team` ASC";
var rows = connection.Query<dynamic>(query, new { steamid = player.SteamId }); // Retrieve all records for the player
foreach (var row in rows)
{
// Check if id is null
if (row.id == null) continue;
// Determine the weapon team based on the query result
CsTeam weaponTeam = (int)row.weapon_team switch
{
2 => CsTeam.Terrorist,
3 => CsTeam.CounterTerrorist,
_ => CsTeam.None,
};
// Get or create entries for the players slot
var playerPins = WeaponPaints.GPlayersPin.GetOrAdd(player.Slot, _ => new ConcurrentDictionary<CsTeam, ushort>());
if (weaponTeam == CsTeam.None)
{
// Assign pin ID to both teams if weaponTeam is None
playerPins[CsTeam.Terrorist] = (ushort)row.id;
playerPins[CsTeam.CounterTerrorist] = (ushort)row.id;
}
else
{
// Assign pin ID to the specific team
playerPins[weaponTeam] = (ushort)row.id;
}
}
}
catch (Exception ex)
{
Utility.Log($"An error occurred in GetPinsFromDatabase: {ex.Message}");
}
}
internal async Task SyncKnifeToDatabase(PlayerInfo player, string knife, CsTeam[] teams)
{
if (!_config.Additional.KnifeEnabled || string.IsNullOrEmpty(player.SteamId) || string.IsNullOrEmpty(knife) || teams.Length == 0) return;
const string query = "INSERT INTO `wp_player_knife` (`steamid`, `weapon_team`, `knife`) VALUES(@steamid, @team, @newKnife) ON DUPLICATE KEY UPDATE `knife` = @newKnife";
try
{
await using var connection = await _database.GetConnectionAsync();
// Loop through each team and insert/update accordingly
foreach (var team in teams)
{
await connection.ExecuteAsync(query, new { steamid = player.SteamId, team, newKnife = knife });
}
}
catch (Exception e)
{
Utility.Log($"Error syncing knife to database: {e.Message}");
}
}
internal async Task SyncGloveToDatabase(PlayerInfo player, ushort gloveDefIndex, CsTeam[] teams)
{
// Check if the necessary conditions are met
if (!_config.Additional.GloveEnabled || string.IsNullOrEmpty(player.SteamId) || teams.Length == 0)
return;
const string query = @"
INSERT INTO `wp_player_gloves` (`steamid`, `weapon_team`, `weapon_defindex`)
VALUES(@steamid, @team, @gloveDefIndex)
ON DUPLICATE KEY UPDATE `weapon_defindex` = @gloveDefIndex";
try
{
// Get a database connection
await using var connection = await _database.GetConnectionAsync();
// Loop through each team and insert/update accordingly
foreach (var team in teams)
{
// Execute the SQL command for each team
await connection.ExecuteAsync(query, new {
steamid = player.SteamId,
team = (int)team, // Cast the CsTeam enum to int for insertion
gloveDefIndex
});
}
}
catch (Exception e)
{
// Log any exceptions that occur
Utility.Log($"Error syncing glove to database: {e.Message}");
}
}
internal async Task SyncAgentToDatabase(PlayerInfo player)
{
if (!_config.Additional.AgentEnabled || string.IsNullOrEmpty(player.SteamId)) return;
const string query = """
INSERT INTO `wp_player_agents` (`steamid`, `agent_ct`, `agent_t`)
VALUES(@steamid, @agent_ct, @agent_t)
ON DUPLICATE KEY UPDATE
`agent_ct` = @agent_ct,
`agent_t` = @agent_t
""";
try
{
await using var connection = await _database.GetConnectionAsync();
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)
{
Utility.Log($"Error syncing agents to database: {e.Message}");
}
}
internal async Task SyncWeaponPaintsToDatabase(PlayerInfo player)
{
if (string.IsNullOrEmpty(player.SteamId) || !WeaponPaints.GPlayerWeaponsInfo.TryGetValue(player.Slot, out var teamWeaponInfos))
return;
try
{
await using var connection = await _database.GetConnectionAsync();
// Loop through each team (Terrorist and CounterTerrorist)
foreach (var (teamId, weaponsInfo) in teamWeaponInfos)
{
foreach (var (weaponDefIndex, weaponInfo) in weaponsInfo)
{
var paintId = weaponInfo.Paint;
var wear = weaponInfo.Wear;
var seed = weaponInfo.Seed;
// Prepare the queries to check and update/insert weapon skin data
const string queryCheckExistence = "SELECT COUNT(*) FROM `wp_player_skins` WHERE `steamid` = @steamid AND `weapon_defindex` = @weaponDefIndex AND `weapon_team` = @weaponTeam";
var existingRecordCount = await connection.ExecuteScalarAsync<int>(
queryCheckExistence,
new { steamid = player.SteamId, weaponDefIndex, weaponTeam = teamId }
);
string query;
object parameters;
if (existingRecordCount > 0)
using (var httpClient = new HttpClient())
{
// Update existing record
query = "UPDATE `wp_player_skins` SET `weapon_paint_id` = @paintId, `weapon_wear` = @wear, `weapon_seed` = @seed " +
"WHERE `steamid` = @steamid AND `weapon_defindex` = @weaponDefIndex AND `weapon_team` = @weaponTeam";
parameters = new { steamid = player.SteamId, weaponDefIndex, weaponTeam = (int)teamId, paintId, wear, seed };
httpClient.BaseAddress = _globalShareApi;
var formContent = new FormUrlEncodedContent(values);
HttpResponseMessage response = await httpClient.GetAsync(builder.Uri);
if (response.IsSuccessStatusCode)
{
string result = await response.Content.ReadAsStringAsync();
if (!string.IsNullOrEmpty(result))
{
WeaponPaints.g_playersKnife[player.Index] = result;
}
else
{
return;
}
}
else
{
return;
}
}
return;
}
if (!WeaponPaints.g_playersDatabaseIndex.TryGetValue(player.Index, out _))
{
return;
}
using (var connection = new MySqlConnection(_databaseConnectionString))
{
await connection.OpenAsync();
string query = "SELECT `knife` FROM `wp_users_knife` WHERE `user_id` = @userId";
string? PlayerKnife = await connection.QueryFirstOrDefaultAsync<string>(query, new { userId = WeaponPaints.g_playersDatabaseIndex[player.Index] });
if (PlayerKnife != null)
{
WeaponPaints.g_playersKnife[player.Index] = PlayerKnife;
}
else
{
// Insert new record
query = "INSERT INTO `wp_player_skins` (`steamid`, `weapon_defindex`, `weapon_team`, `weapon_paint_id`, `weapon_wear`, `weapon_seed`) " +
"VALUES (@steamid, @weaponDefIndex, @weaponTeam, @paintId, @wear, @seed)";
parameters = new { steamid = player.SteamId, weaponDefIndex, weaponTeam = (int)teamId, paintId, wear, seed };
return;
}
await connection.ExecuteAsync(query, parameters);
await connection.CloseAsync();
}
}
}
catch (Exception e)
{
Utility.Log($"Error syncing weapon paints to database: {e.Message}");
}
}
internal async Task SyncMusicToDatabase(PlayerInfo player, ushort music, CsTeam[] teams)
{
if (!_config.Additional.MusicEnabled || string.IsNullOrEmpty(player.SteamId)) return;
const string query = "INSERT INTO `wp_player_music` (`steamid`, `weapon_team`, `music_id`) VALUES(@steamid, @team, @newMusic) ON DUPLICATE KEY UPDATE `music_id` = @newMusic";
try
{
await using var connection = await _database.GetConnectionAsync();
// Loop through each team and insert/update accordingly
foreach (var team in teams)
catch (Exception e)
{
await connection.ExecuteAsync(query, new { steamid = player.SteamId, team, newMusic = music });
Utility.Log("GetKnifeFromDatabase: " + e.Message);
return;
}
}
catch (Exception e)
{
Utility.Log($"Error syncing music kit to database: {e.Message}");
}
}
internal async Task SyncPinToDatabase(PlayerInfo player, ushort pin, CsTeam[] teams)
{
if (!_config.Additional.PinsEnabled || string.IsNullOrEmpty(player.SteamId)) return;
internal async Task GetMusicKitFromDatabase(PlayerInfo player)
{
if (!_config.AdditionalSetting.MusicKitEnabled) return;
if (player.SteamId == null || player.Index == 0) return;
if (!WeaponPaints.g_playersDatabaseIndex.TryGetValue(player.Index, out _))
{
return;
}
try
{
using (var connection = new MySqlConnection(_databaseConnectionString))
{
await connection.OpenAsync();
string query = "SELECT `music` FROM `wp_users_music` WHERE `user_id` = @userId";
int? PlayerMusitKit = await connection.QueryFirstOrDefaultAsync<int?>(query, new { userId = WeaponPaints.g_playersDatabaseIndex[player.Index] });
if (PlayerMusitKit != null)
{
WeaponPaints.g_playersMusicKit[player.Index] = PlayerMusitKit;
}
else
{
return;
}
await connection.CloseAsync();
}
}
catch (Exception e)
{
Utility.Log("GetMusicKitFromDatabase: " + e.Message);
return;
}
}
const string query = "INSERT INTO `wp_player_pins` (`steamid`, `weapon_team`, `id`) VALUES(@steamid, @team, @newPin) ON DUPLICATE KEY UPDATE `id` = @newPin";
try
internal async Task GetWeaponPaintsFromDatabase(PlayerInfo player)
{
await using var connection = await _database.GetConnectionAsync();
// Loop through each team and insert/update accordingly
foreach (var team in teams)
if (!_config.AdditionalSetting.SkinEnabled) return;
if (player.SteamId == null || player.Index == 0) return;
if (!WeaponPaints.gPlayerWeaponsInfo.TryGetValue(player.Index, out _))
{
WeaponPaints.gPlayerWeaponsInfo[player.Index] = new ConcurrentDictionary<ushort, WeaponInfo>();
}
try
{
await connection.ExecuteAsync(query, new { steamid = player.SteamId, team, newPin = pin });
if (_config.GlobalShare)
{
var values = new Dictionary<string, string>
{
{ "server_id", _globalShareServerId.ToString() },
{ "steamid", player.SteamId.ToString()! },
{ "skins", "1" }
};
UriBuilder builder = new UriBuilder(_globalShareApi);
builder.Query = string.Join("&", values.Select(p => $"{Uri.EscapeDataString(p.Key)}={Uri.EscapeDataString(p.Value)}"));
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = _globalShareApi;
var formContent = new FormUrlEncodedContent(values);
HttpResponseMessage response = await httpClient.GetAsync(builder.Uri);
if (response.IsSuccessStatusCode)
{
string responseBody = await response.Content.ReadAsStringAsync();
JArray jsonArray = JArray.Parse(responseBody);
if (jsonArray != null && jsonArray.Count > 0)
{
foreach (var weapon in jsonArray)
{
ushort? weaponDefIndex = weapon["weapon_defindex"]?.Value<ushort>();
ushort? weaponPaintId = weapon["weapon_paint_id"]?.Value<ushort>();
float? weaponWear = weapon["weapon_wear"]?.Value<float>();
ushort? weaponSeed = weapon["weapon_seed"]?.Value<ushort>();
if (weaponDefIndex != null && weaponPaintId != null && weaponWear != null && weaponSeed != null)
{
WeaponInfo weaponInfo = new WeaponInfo
{
Paint = weaponPaintId.Value,
Seed = weaponSeed.Value,
Wear = weaponWear.Value,
NameTag = null
};
WeaponPaints.gPlayerWeaponsInfo[player.Index][weaponDefIndex.Value] = weaponInfo;
}
}
}
return;
}
else
{
return;
}
}
}
if (!WeaponPaints.g_playersDatabaseIndex.TryGetValue(player.Index, out _))
{
return;
}
using (var connection = new MySqlConnection(_databaseConnectionString))
{
await connection.OpenAsync();
string query = "SELECT `weapon`, `paint`, `wear`, `seed`, `nametag` FROM `wp_users_items` WHERE `user_id` = @userId";
IEnumerable<dynamic> PlayerSkins = await connection.QueryAsync<dynamic>(query, new { userId = WeaponPaints.g_playersDatabaseIndex[player.Index] });
if (PlayerSkins != null && PlayerSkins.Any())
{
PlayerSkins.ToList().ForEach(row =>
{
ushort weaponDefIndex = row.weapon ?? default(ushort);
ushort weaponPaintId = row.paint ?? default(ushort);
float weaponWear = row.wear ?? default(float);
ushort weaponSeed = row.seed ?? default(ushort);
string weaponNameTag = row.nametag;
WeaponInfo weaponInfo = new WeaponInfo
{
Paint = weaponPaintId,
Seed = weaponSeed,
Wear = weaponWear,
NameTag = weaponNameTag
};
WeaponPaints.gPlayerWeaponsInfo[player.Index][weaponDefIndex] = weaponInfo;
});
}
else
{
return;
}
await connection.CloseAsync();
}
}
catch (Exception e)
{
Utility.Log("GetWeaponPaintsFromDatabase: " + e.Message);
return;
}
}
catch (Exception e)
internal async Task SyncKnifeToDatabase(PlayerInfo player, string knife)
{
Utility.Log($"Error syncing pin to database: {e.Message}");
if (!_config.AdditionalSetting.KnifeEnabled) return;
if(player == null || player.Index <= 0) return;
try
{
if (!WeaponPaints.g_playersDatabaseIndex.TryGetValue(player.Index, out _))
return;
using var connection = new MySqlConnection(_databaseConnectionString);
await connection.OpenAsync();
string query = "INSERT INTO `wp_users_knife` (`user_id`, `knife`) VALUES(@userId, @newKnife) ON DUPLICATE KEY UPDATE `knife` = @newKnife";
await connection.ExecuteAsync(query, new { userId = WeaponPaints.g_playersDatabaseIndex[player.Index], newKnife = knife });
await connection.CloseAsync();
}
catch (Exception e)
{
Utility.Log(e.Message);
return;
}
}
}
internal async Task SyncWeaponPaintToDatabase(PlayerInfo player, ushort weaponDefIndex)
{
if (!_config.AdditionalSetting.SkinEnabled) return;
if (player == null || player.Index <= 0) return;
internal async Task SyncStatTrakToDatabase(PlayerInfo player)
{
if (WeaponPaints.WeaponSync == null || WeaponPaints.GPlayerWeaponsInfo.IsEmpty) return;
if (string.IsNullOrEmpty(player.SteamId))
return;
if (!WeaponPaints.g_playersDatabaseIndex.TryGetValue(player.Index, out var playerDatabaseIndex))
return;
if (!WeaponPaints.gPlayerWeaponsInfo.TryGetValue(player.Index, out var playerSavedWeapons))
return;
if (!playerSavedWeapons.TryGetValue(weaponDefIndex, out var weaponInfo))
return;
try
{
await using var connection = await _database.GetConnectionAsync();
await using var transaction = await connection.BeginTransactionAsync();
// Check if player's slot exists in GPlayerWeaponsInfo
if (!WeaponPaints.GPlayerWeaponsInfo.TryGetValue(player.Slot, out var teamWeaponsInfo))
return;
// Iterate through each team in the player's weapon info
foreach (var teamInfo in teamWeaponsInfo)
{
// Retrieve weaponInfos for the current team
var weaponInfos = teamInfo.Value;
// Get StatTrak weapons for the current team
var statTrakWeapons = weaponInfos
.ToDictionary(
w => w.Key,
w => (w.Value.StatTrak, w.Value.StatTrakCount) // Store both StatTrak and StatTrakCount in a tuple
);
// Check if there are StatTrak weapons to sync
if (statTrakWeapons.Count == 0) continue;
// Get the current team ID
int weaponTeam = (int)teamInfo.Key;
// Sync StatTrak values for the current team
foreach (var (defindex, (statTrak, statTrakCount)) in statTrakWeapons)
{
const string query = @"
UPDATE `wp_player_skins`
SET `weapon_stattrak` = @StatTrak,
`weapon_stattrak_count` = @StatTrakCount
WHERE `steamid` = @steamid
AND `weapon_defindex` = @weaponDefIndex
AND `weapon_team` = @weaponTeam";
var parameters = new
{
steamid = player.SteamId,
weaponDefIndex = defindex,
StatTrak = statTrak,
StatTrakCount = statTrakCount,
weaponTeam
};
await connection.ExecuteAsync(query, parameters, transaction);
}
}
await transaction.CommitAsync();
}
catch (Exception e)
{
Utility.Log($"Error syncing stattrak to database: {e.Message}");
}
using var connection = new MySqlConnection(_databaseConnectionString);
string querySql = @"
INSERT INTO `wp_users_items`
(`user_id`, `weapon`, `paint`, `wear`, `seed`)
VALUES
(@userId, @weaponDefIndex, @paintId, @wear, @seed)
ON DUPLICATE KEY UPDATE
paint = @paintId,
wear = @wear,
seed = @seed";
var queryParams = new { weaponDefIndex, userId = playerDatabaseIndex, paintId = weaponInfo.Paint, wear = weaponInfo.Wear, seed = weaponInfo.Seed };
await connection.ExecuteAsync(querySql, queryParams);
await connection.CloseAsync();
}
}
}

View File

@@ -1,9 +0,0 @@
{
"CAttributeList_SetOrAddAttributeValueByName": {
"signatures": {
"library": "server",
"windows": "40 53 55 41 56 48 81 EC 90 00 00 00",
"linux": "55 48 89 E5 41 57 41 56 49 89 FE 41 55 41 54 53 48 89 F3 48 83 EC ? F3 0F 11 85"
}
}
}

View File

@@ -3,28 +3,12 @@
"wp_info_website": "Visit {lime}{0}{default} where you can change skins",
"wp_info_refresh": "Type {lime}!wp{default} to synchronize chosen skins",
"wp_info_knife": "Type {lime}!knife{default} to open knife menu",
"wp_info_glove": "Type {lime}!gloves{default} to open gloves menu",
"wp_info_agent": "Type {lime}!agents{default} to open agents menu",
"wp_info_music": "Type {lime}!music{default} to open music menu",
"wp_info_pin": "Type {lime}!pins{default} to open pins menu",
"wp_command_cooldown": "{lightred}You can't refresh weapon paints right now",
"wp_command_refresh_done": "{lime}Refreshing weapon paints",
"wp_knife_menu_select": "You have chosen {lime}{0}{default} as your knife",
"wp_knife_menu_kill": "",
"wp_knife_menu_kill": "To correctly apply skin for knife, you need to type {lime}!kill{default}",
"wp_knife_menu_title": "Knife Menu",
"wp_glove_menu_select": "You have chosen {lime}{0}{default} as your glove",
"wp_glove_menu_title": "Gloves Menu",
"wp_agent_menu_select": "You have chosen {lime}{0}{default} as your agent",
"wp_agent_menu_title": "Agents Menu",
"wp_music_menu_title": "Music Menu",
"wp_music_menu_select": "You have chosen {lime}{0}{default} as your music kit",
"wp_pins_menu_title": "Pins Menu",
"wp_pins_menu_select": "You have chosen {lime}{0}{default} as your pin",
"wp_skin_menu_weapon_title": "Weapon Menu",
"wp_skin_menu_skin_title": "Select skin for {lime}{0}{default}",
"wp_skin_menu_select": "You have chosen {lime}{0}{default} as your skin",
"wp_stattrak_action": "You have successfully changed the stattrak setting",
"None": "None"
"wp_skin_menu_select": "You have chosen {lime}{0}{default} as your skin"
}

View File

@@ -1,30 +1,14 @@
{
"wp_prefix": "{lightblue}[WeaponPaints] {default}",
"wp_info_website": "Apmeklē {lime}{0}{default}, kur varat mainīt ādas",
"wp_info_refresh": "Ievadiet {lime}!wp{default}, lai sinhronizētu izvēlētās ādas",
"wp_info_knife": "Ievadiet {lime}!knife{default}, lai atvērtu nazis izvēlni",
"wp_info_glove": "Ievadiet {lime}!gloves{default}, lai atvērtu cimdi izvēlni",
"wp_info_agent": "Ievadiet {lime}!agents{default}, lai atvērtu aģentu izvēlni",
"wp_info_music": "Ievadiet {lime}!music{default}, lai atvērtu mūzikas izvēlni",
"wp_info_pin": "Ierakstiet {lime}!pins{default}, lai atvērtu piespraudes izvēlni",
"wp_command_cooldown": "{lightred}Šobrīd nevarat atsvaidzināt ieroča krāsas",
"wp_command_refresh_done": "{lime}Atsvaidzinot ieroča krāsas",
"wp_knife_menu_select": "Jūs esat izvēlējies {lime}{0}{default} kā savu nazi",
"wp_knife_menu_kill": "",
"wp_knife_menu_title": "Nazi Izvēlne",
"wp_glove_menu_select": "Jūs esat izvēlējies {lime}{0}{default} kā savu cimdu",
"wp_glove_menu_title": "Cimdu Izvēlne",
"wp_agent_menu_select": "Jūs esat izvēlējies {lime}{0}{default} kā savu aģentu",
"wp_agent_menu_title": "Aģentu Izvēlne",
"wp_music_menu_title": "Mūzikas Izvēlne",
"wp_music_menu_select": "Jūs esat izvēlējies {lime}{0}{default} kā savu mūzikas komplektu",
"wp_pins_menu_title": "Piespraužu izvēlne",
"wp_pins_menu_select": "Jūs esat izvēlējies {lime}{0}{default} kā savu piespraudi",
"wp_prefix": "{lightblue}[Ieroču Ādiņas] {default}",
"wp_info_website": "Apmeklē {lime}{0}{default} kur tu vari nomainīt skinus",
"wp_info_refresh": "Raksti {lime}!wp{default} lai sinhronizētu izvēlētos skinus",
"wp_info_knife": "Raksti {lime}!knife{default} lai atvērtu nažu izvēlni",
"wp_command_cooldown": "{lightred} Tu šobrīd nevari atjaunot ieroču skinus...",
"wp_command_refresh_done": "{lime}Izvēlētie skini tiek atjaunoti",
"wp_knife_menu_select": "Tu esi izvēlējies {lime}{0}{default} nazi",
"wp_knife_menu_kill": "Lai pareizi atjaunotu naža skinu, ieraksti čatā {lime}!kill{default}",
"wp_knife_menu_title": "Nažu Izvēlne",
"wp_skin_menu_weapon_title": "Ieroču Izvēlne",
"wp_skin_menu_skin_title": "Izvēlieties ādu priekš {lime}{0}{default}",
"wp_skin_menu_select": "Jūs esat izvēlējies {lime}{0}{default} kā savu ādu",
"wp_stattrak_action": "Jūs veiksmīgi mainījāt stattrak iestatījumu",
"None": "Nav"
}
"wp_skin_menu_skin_title": "Izvēlies skinu ierocim: {lime}{0}{default}",
"wp_skin_menu_select": "Tu esi izvēlējies {lime}{0}{default} kā savu skinu"
}

View File

@@ -1,30 +1,14 @@
{
"wp_prefix": "{lightblue}[WeaponPaints] {default}",
"wp_info_website": "Odwiedź {lime}{0}{default}, gdzie możesz zmieniać skórki",
"wp_info_refresh": "Wpisz {lime}!wp{default}, aby zsynchronizować wybrane skórki",
"wp_info_knife": "Wpisz {lime}!knife{default}, aby otworzyć menu noży",
"wp_info_glove": "Wpisz {lime}!gloves{default}, aby otworzyć menu rękawic",
"wp_info_agent": "Wpisz {lime}!agents{default}, aby otworzyć menu agentów",
"wp_info_music": "Wpisz {lime}!music{default}, aby otworzyć menu muzyczne",
"wp_info_pin": "Wpisz {lime}!pins{default}, aby otworzyć menu pinów",
"wp_command_cooldown": "{lightred}Nie możesz teraz odświeżyć kolorów broni",
"wp_command_refresh_done": "{lime}Odświeżanie kolorów broni",
"wp_info_website": "Odwiedź {lime}{0}{default} gdzie będziesz mógł ustawić skiny",
"wp_info_refresh": "Wpisz {lime}!wp{default} aby zsynchronizować swoje skiny",
"wp_info_knife": "Wpisz {lime}!knife{default} aby wy<EFBFBD>wietlić menu no<EFBFBD>y",
"wp_command_cooldown": "{lightred}Odczekaj chwilę przed wykonaniem tej komendy...",
"wp_command_refresh_done": "{lime}Pomyslnie zsynchronizowano twoje skiny",
"wp_knife_menu_select": "Wybrałeś {lime}{0}{default} jako swój nóż",
"wp_knife_menu_kill": "",
"wp_knife_menu_title": "Menu Noży",
"wp_glove_menu_select": "Wybrałeś {lime}{0}{default} jako swoją rękawiczkę",
"wp_glove_menu_title": "Menu Rękawiczek",
"wp_agent_menu_select": "Wybrałeś {lime}{0}{default} jako swojego agenta",
"wp_agent_menu_title": "Menu Agentów",
"wp_music_menu_title": "Menu Muzyczne",
"wp_music_menu_select": "Wybrałeś {lime}{0}{default} jako swój zestaw muzyczny",
"wp_pins_menu_title": "Menu Pinów",
"wp_pins_menu_select": "Wybrałeś {lime}{0}{default} jako swój pin",
"wp_skin_menu_weapon_title": "Menu Broni",
"wp_skin_menu_skin_title": "Wybierz skórkę dla {lime}{0}{default}",
"wp_skin_menu_select": "Wybrałeś {lime}{0}{default} jako swoją skórkę",
"wp_stattrak_action": "Pomyślnie zmieniłeś ustawienie stattraka",
"None": "Brak"
"wp_knife_menu_kill": "Do prawidłowego zastosowania noża użyj {lime}!kill{default}",
"wp_knife_menu_title": "Menu noży",
"wp_skin_menu_weapon_title": "Menu broni",
"wp_skin_menu_skin_title": "Wybierz skin dla {lime}{0}{default}",
"wp_skin_menu_select": "Wybrałeś {lime}{0}{default} jako swój skin"
}

View File

@@ -1,30 +1,14 @@
{
"wp_prefix": "{lightblue}[WeaponPaints] {default}",
"wp_info_website": "Visite {lime}{0}{default}, onde você pode alterar as skins",
"wp_info_refresh": "Digite {lime}!wp{default} para sincronizar as skins escolhidas",
"wp_info_website": "Visite {lime}{0}{default} para mudar suas skins e faca",
"wp_info_refresh": "Digite {lime}!wp{default} para sincronizar as suas skins",
"wp_info_knife": "Digite {lime}!knife{default} para abrir o menu de facas",
"wp_info_glove": "Digite {lime}!gloves{default} para abrir o menu de luvas",
"wp_info_agent": "Digite {lime}!agents{default} para abrir o menu de agentes",
"wp_info_music": "Digite {lime}!music{default} para abrir o menu de música",
"wp_info_pin": "Digite {lime}!pins{default} para abrir o menu de pins",
"wp_command_cooldown": "{lightred}Você não pode atualizar as skins de armas agora",
"wp_command_refresh_done": "{lime}Atualizando as skins de armas",
"wp_command_cooldown": "{lightred}Você não pode atualizar as skins das armas agora",
"wp_command_refresh_done": "{lime}Sincronizando as suas skins",
"wp_knife_menu_select": "Você escolheu {lime}{0}{default} como sua faca",
"wp_knife_menu_kill": "",
"wp_knife_menu_kill": "Para aplicar corretamente a skin da faca, você precisa digitar {lime}!kill{default}",
"wp_knife_menu_title": "Menu de Facas",
"wp_glove_menu_select": "Você escolheu {lime}{0}{default} como sua luva",
"wp_glove_menu_title": "Menu de Luvas",
"wp_agent_menu_select": "Você escolheu {lime}{0}{default} como seu agente",
"wp_agent_menu_title": "Menu de Agentes",
"wp_music_menu_title": "Menu de Música",
"wp_music_menu_select": "Você escolheu {lime}{0}{default} como seu kit de música",
"wp_pins_menu_title": "Menu de Pins",
"wp_pins_menu_select": "Escolheu {lime}{0}{default} como o seu pin",
"wp_skin_menu_weapon_title": "Menu de Armas",
"wp_skin_menu_skin_title": "Selecione a skin para {lime}{0}{default}",
"wp_skin_menu_select": "Você escolheu {lime}{0}{default} como sua skin",
"wp_stattrak_action": "Você alterou a configuração de stattrak com sucesso",
"None": "Nenhum"
}
"wp_skin_menu_skin_title": "Selecionou a skin para {lime}{0}{default}",
"wp_skin_menu_select": "Você escolheu {lime}{0}{default} como sua skin"
}

View File

@@ -1,30 +1,14 @@
{
"wp_prefix": "{lightblue}[WeaponPaints] {default}",
"wp_info_website": "Visite {lime}{0}{default}, onde pode alterar as skins",
"wp_info_refresh": "Digite {lime}!wp{default} para sincronizar as skins escolhidas",
"wp_info_knife": "Digite {lime}!knife{default} para abrir o menu de facas",
"wp_info_glove": "Digite {lime}!gloves{default} para abrir o menu de luvas",
"wp_info_agent": "Digite {lime}!agents{default} para abrir o menu de agentes",
"wp_info_music": "Digite {lime}!music{default} para abrir o menu de música",
"wp_info_pin": "Escreva {lime}!pins{default} para abrir o menu de pins",
"wp_command_cooldown": "{lightred}Não pode atualizar as skins de armas de momento",
"wp_command_refresh_done": "{lime}Atualizando as skins de armas",
"wp_knife_menu_select": "Escolheu {lime}{0}{default} como a sua faca",
"wp_knife_menu_kill": "",
"wp_knife_menu_title": "Menu de Facas",
"wp_glove_menu_select": "Escolheu {lime}{0}{default} como a sua luva",
"wp_glove_menu_title": "Menu de Luvas",
"wp_agent_menu_select": "Escolheu {lime}{0}{default} como o seu agente",
"wp_agent_menu_title": "Menu de Agentes",
"wp_music_menu_title": "Menu de Música",
"wp_music_menu_select": "Escolheu {lime}{0}{default} como o seu kit de música",
"wp_pins_menu_title": "Menu de Pins",
"wp_pins_menu_select": "Escolheu {lime}{0}{default} como o seu pin",
"wp_info_website": "Visita {lime}{0}{default} onde podes mudar as tuas skins",
"wp_info_refresh": "Digita {lime}!wp{default} para sincronizar as tuas skins",
"wp_info_knife": "Digita {lime}!knife{default} para abrir o menu de facas",
"wp_command_cooldown": "{lightred}Tu não podes sincronizar agora as tuas skins",
"wp_command_refresh_done": "{lime}Sincronizando as tuas skins",
"wp_knife_menu_select": "Tu escolheste {lime}{0}{default} como a tua faca",
"wp_knife_menu_kill": "Para aplicar corretamente a skins para a tua faca, digita {lime}!kill{default}",
"wp_knife_menu_title": "Menu Facas",
"wp_skin_menu_weapon_title": "Menu de Armas",
"wp_skin_menu_skin_title": "Selecione a skin para {lime}{0}{default}",
"wp_skin_menu_select": "Escolheu {lime}{0}{default} como a sua skin",
"wp_stattrak_action": "Alterou com sucesso a configuração do stattrak",
"None": "Nenhum"
}
"wp_skin_menu_skin_title": "Escolhe a skin para {lime}{0}{default}",
"wp_skin_menu_select": "Tu escolheste {lime}{0}{default} como a tua skin"
}

View File

@@ -1,30 +1,14 @@
{
"wp_prefix": "{lightblue}[WeaponPaints] {default}",
"wp_info_website": "Посетите {lime}{0}{default}, где вы можете изменить скины",
"wp_info_refresh": "Введите {lime}!wp{default}, чтобы синхронизировать выбранные скины",
"wp_info_knife": "Введите {lime}!knife{default}, чтобы открыть меню ножей",
"wp_info_glove": "Введите {lime}!gloves{default}, чтобы открыть меню перчаток",
"wp_info_agent": "Введите {lime}!agents{default}, чтобы открыть меню агентов",
"wp_info_music": "Введите {lime}!music{default}, чтобы открыть меню музыки",
"wp_info_pin": "Введите {lime}!pins{default}, чтобы открыть меню пинов",
"wp_command_cooldown": "{lightred}Вы не можете обновить раскраску оружия сейчас",
"wp_command_refresh_done": "{lime}Обновление раскраски оружия",
"wp_knife_menu_select": "Вы выбрали {lime}{0}{default} в качестве вашего ножа",
"wp_knife_menu_kill": "",
"wp_knife_menu_title": "Меню Ножей",
"wp_glove_menu_select": "Вы выбрали {lime}{0}{default} в качестве ваших перчаток",
"wp_glove_menu_title": "Меню Перчаток",
"wp_agent_menu_select": "Вы выбрали {lime}{0}{default} в качестве вашего агента",
"wp_agent_menu_title": "Меню Агентов",
"wp_music_menu_title": "Меню Музыки",
"wp_music_menu_select": "Вы выбрали {lime}{0}{default} в качестве вашего музыкального набора",
"wp_pins_menu_title": "Меню пинов",
"wp_pins_menu_select": "Вы выбрали {lime}{0}{default} в качестве своего пина",
"wp_skin_menu_weapon_title": "Меню Оружия",
"wp_info_website": "Посетите сайт {lime}{0},{default} чтобы выбрать скин",
"wp_info_refresh": "Наберите в чат {lime}!wp{default} для синхронизации выбранных скинов",
"wp_info_knife": "Наберите в чат {lime}!knife,{default} чтобы выбрать нож",
"wp_command_cooldown": "{lightred}Вы не можете выбрать оружие прямо сейчас",
"wp_command_refresh_done": "{lime}Обновление скинов для оружия",
"wp_knife_menu_select": "Вы выбрали {lime}{0}{default} скин для ножа",
"wp_knife_menu_kill": "Чтобы правильно применить скин для ножа, набери в чат {lime}!kill{default}",
"wp_knife_menu_title": "Меню ножей",
"wp_skin_menu_weapon_title": "Меню оружия",
"wp_skin_menu_skin_title": "Выберите скин для {lime}{0}{default}",
"wp_skin_menu_select": "Вы выбрали {lime}{0}{default} в качестве вашего скина",
"wp_stattrak_action": "Вы успешно изменили настройки статтрак",
"None": "Нет"
"wp_skin_menu_select": "Вы выбрали {lime}{0}{default} скина для оружия"
}

View File

@@ -1,30 +1,14 @@
{
"wp_prefix": "{lightblue}[WeaponPaints] {default}",
"wp_info_website": "Ziyaret edin {lime}{0}{default}, nerede derileri değiştirebilirsiniz",
"wp_info_refresh": "Senkronize etmek için {lime}!wp{default} yazın seçilen deriler",
"wp_info_website": "Görünümleri değiştirebileceğiniz {lime}{0}{default} adresini ziyaret edin",
"wp_info_refresh": "Seçilen kaplamyı senkronize etmek için {lime}!wp{default} yazın",
"wp_info_knife": "Bıçak menüsünü açmak için {lime}!knife{default} yazın",
"wp_info_glove": "Handskar menüsünü açmak için {lime}!gloves{default} yazın",
"wp_info_agent": "Ajan menüsünü açmak için {lime}!agents{default} yazın",
"wp_info_music": "Müzik menüsünü açmak için {lime}!music{default} yazın",
"wp_info_pin": "{lime}!pins{default} yazarak pinler menüsünü açın",
"wp_command_cooldown": "{lightred}Şu anda silah boyalarını yenileyemezsiniz",
"wp_command_refresh_done": "{lime}Silah boyaları yenileniyor",
"wp_knife_menu_select": "{lime}{0}{default} olarak bıçağınızı seçtiniz",
"wp_knife_menu_kill": "",
"wp_command_cooldown": "{lightred}Şu anda silah kaplamasını yenileyemezsiniz",
"wp_command_refresh_done": "{lime}Silah kaplaması yenileniyor",
"wp_knife_menu_select": "Bıçağınız olarak {lime}{0}{default} seçtiniz",
"wp_knife_menu_kill": "Bıçak için doğru şekilde kaplama uygulamak için {lime}!kill{default} yazmanız gerekir",
"wp_knife_menu_title": "Bıçak Menüsü",
"wp_glove_menu_select": "{lime}{0}{default} olarak eldiveninizi seçtiniz",
"wp_glove_menu_title": "Eldiven Menüsü",
"wp_agent_menu_select": "{lime}{0}{default} olarak ajanınızı seçtiniz",
"wp_agent_menu_title": "Ajanlar Menüsü",
"wp_music_menu_title": "Müzik Menüsü",
"wp_music_menu_select": "{lime}{0}{default} olarak müzik setinizi seçtiniz",
"wp_pins_menu_title": "Pinler Menüsü",
"wp_pins_menu_select": "{lime}{0}{default} pinini seçtiniz",
"wp_skin_menu_weapon_title": "Silah Menüsü",
"wp_skin_menu_skin_title": "{lime}{0}{default} için cilt seçin",
"wp_skin_menu_select": "{lime}{0}{default} olarak cildinizi seçtiniz",
"wp_stattrak_action": "StatTrak ayarını başarıyla değiştirdiniz",
"None": "Hiçbiri"
}
"wp_skin_menu_skin_title": "Select skin for {lime}{0}{default}",
"wp_skin_menu_select": "Teniniz olarak {lime}{0}{default} seçtiniz"
}

View File

@@ -1,30 +1,14 @@
{
"wp_prefix": "{lightblue}[WeaponPaints] {default}",
"wp_info_website": "Відвідайте {lime}{0}{default}, де ви можете змінити шкури",
"wp_info_refresh": "Введіть {lime}!wp{default}, щоб синхронізувати обрані шкури",
"wp_info_knife": "Введіть {lime}!knife{default}, щоб відкрити меню ножів",
"wp_info_glove": "Введіть {lime}!gloves{default}, щоб відкрити меню рукавичок",
"wp_info_agent": "Введіть {lime}!agents{default}, щоб відкрити меню агентів",
"wp_info_music": "Введіть {lime}!music{default}, щоб відкрити меню музики",
"wp_info_pin": "Введіть {lime}!pins{default}, щоб відкрити меню пінів",
"wp_command_cooldown": "{lightred}Ви не можете оновити фарби зброї зараз",
"wp_command_refresh_done": "{lime}Оновлення фарби зброї",
"wp_knife_menu_select": "Ви обрали {lime}{0}{default} як свій ніж",
"wp_knife_menu_kill": "",
"wp_knife_menu_title": "Меню Ножів",
"wp_glove_menu_select": "Ви обрали {lime}{0}{default} як свої рукавички",
"wp_glove_menu_title": "Меню Рукавичок",
"wp_agent_menu_select": "Ви обрали {lime}{0}{default} як свого агента",
"wp_agent_menu_title": "Меню Агентів",
"wp_music_menu_title": "Меню Музики",
"wp_music_menu_select": "Ви обрали {lime}{0}{default} як свій набір музики",
"wp_pins_menu_title": "Меню пінів",
"wp_pins_menu_select": "Ви вибрали {lime}{0}{default} як свій пін",
"wp_skin_menu_weapon_title": "Меню Зброї",
"wp_skin_menu_skin_title": "Виберіть шкіру для {lime}{0}{default}",
"wp_skin_menu_select": "Ви обрали {lime}{0}{default} як свою шкіру",
"wp_stattrak_action": "Ви успішно змінили налаштування статтрака",
"None": "Немає"
"wp_info_website": "Відвідайте веб-сайт {lime}{0},{default} щоб вибрати скин",
"wp_info_refresh": "Напишіть у чат {lime}!wp{default} для синхронізації вибраних скинів",
"wp_info_knife": "Напишіть у чат {lime}!knife,{default} щоб вибрати ніж",
"wp_command_cooldown": "{lightred}Ви не можете вибрати зброю зараз",
"wp_command_refresh_done": "{lime}Оновлення скинів для зброї",
"wp_knife_menu_select": "Ви вибрали скин {lime}{0}{default} для ножа",
"wp_knife_menu_kill": "Щоб правильно застосувати скин для ножа, напишіть у чат {lime}!kill{default}",
"wp_knife_menu_title": "Меню ножів",
"wp_skin_menu_weapon_title": "Меню зброї",
"wp_skin_menu_skin_title": "Виберіть скин для {lime}{0}{default}",
"wp_skin_menu_select": "Ви вибрали скин {lime}{0}{default} для зброї"
}

View File

@@ -1,30 +1,14 @@
{
"wp_prefix": "{lightblue}[WeaponPaints] {default}",
"wp_info_website": "访问 {lime}{0}{default},您可以更改皮肤",
"wp_info_refresh": "输入 {lime}!wp{default} 同步选择的皮肤",
"wp_info_knife": "输入 {lime}!knife{default} 打开刀菜单",
"wp_info_glove": "输入 {lime}!gloves{default} 打开手套菜单",
"wp_info_agent": "输入 {lime}!agents{default} 打开代理菜单",
"wp_info_music": "输入 {lime}!music{default} 打开音乐菜单",
"wp_info_pin": "输入 {lime}!pins{default} 来打开固定项菜单",
"wp_command_cooldown": "{lightred}您现在无法刷新武器涂装",
"wp_command_refresh_done": "{lime}正在刷新武器涂装",
"wp_knife_menu_select": "您选择了 {lime}{0}{default} 作为您的刀具",
"wp_knife_menu_kill": "",
"wp_knife_menu_title": "刀具菜单",
"wp_glove_menu_select": "您选择了 {lime}{0}{default} 作为您的手套",
"wp_glove_menu_title": "手套菜单",
"wp_agent_menu_select": "您选择了 {lime}{0}{default} 作为您的代理",
"wp_agent_menu_title": "代理菜单",
"wp_music_menu_title": "音乐菜单",
"wp_music_menu_select": "您选择了 {lime}{0}{default} 作为您的音乐包",
"wp_pins_menu_title": "固定项菜单",
"wp_pins_menu_select": "您已选择 {lime}{0}{default} 作为您的固定项",
"wp_prefix": "{lightblue}[武器皮肤] {default}",
"wp_info_website": "在线访问 {lime}{0}{default} 更改你的武器皮肤",
"wp_info_refresh": "输入 {lime}!wp{default} 进行在线皮肤同步",
"wp_info_knife": "输入 {lime}!knife{default} 打开刀菜单",
"wp_command_cooldown": "{lightred}皮肤同步刷新冷却中",
"wp_command_refresh_done": "{lime}刷新武器皮肤中",
"wp_knife_menu_select": "你选择了 {lime}{0}{default} 作为你的刀",
"wp_knife_menu_kill": "如需完全应用皮肤到刀上, 你需要输入 {lime}!kill{default} 自杀来进行刷新",
"wp_knife_menu_title": "刀菜单",
"wp_skin_menu_weapon_title": "武器菜单",
"wp_skin_menu_skin_title": "选择 {lime}{0}{default} 的皮肤",
"wp_skin_menu_select": "选择了 {lime}{0}{default} 作为的皮肤",
"wp_stattrak_action": "您已成功更改 StatTrak 设置",
"None": "无"
}
"wp_skin_menu_select": "选择了 {lime}{0}{default} 作为的皮肤"
}

View File

@@ -1,6 +1,4 @@
<?php
define('SKIN_LANGUAGE', 'skins_en');
define('DB_HOST', 'localhost');
define('DB_PORT', '3306');
define('DB_NAME', '');

View File

@@ -1,29 +1,66 @@
<?php
/**
* Class DataBase
*
* This class handles database operations using PDO.
*/
class DataBase {
/**
* @var PDO The PDO instance for database connection.
*/
private $PDO;
/**
* Constructor method to initialize the database connection.
*/
public function __construct() {
try {
$this->PDO = new PDO("mysql:host=".DB_HOST."; port=".DB_PORT."; dbname=".DB_NAME, DB_USER, DB_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
// Establish a connection to the database using PDO
$this->PDO = new PDO(
"mysql:host=".DB_HOST.";port=".DB_PORT.";dbname=".DB_NAME,
DB_USER,
DB_PASS
);
// Set the connection to use utf8 encoding
$this->PDO->exec("SET NAMES utf8");
}
catch(PDOException $ex)
{
catch(PDOException $ex) {
// Display error message if connection fails
echo "<div style='display: flex; flex-direction: column;align-items: center;justify-content: center;text-align: center;'><h2>Problem with database!</h2>";
die("<pre style='padding: 10px;text-wrap: balance; border: 2px solid #ed6bd3;background: #252525; color: #ed6bd3; width: 50%;'>" . $ex . "</pre>");
}
}
public function select($query, $bindings = []) {
/**
* Perform a SELECT query on the database.
*
* @param string $query The SQL query to execute.
* @param array $bindings An associative array of parameters and their values.
* @return array|false Returns an array of rows as associative arrays or false if no results are found.
*/
public function select($query, $bindings = array()) {
// Prepare and execute the SQL query
$STH = $this->PDO->prepare($query);
$STH->execute($bindings);
// Fetch the results as associative arrays
$result = $STH->fetchAll(PDO::FETCH_ASSOC);
$result ??= false;
return $result;
if ($result === false) {
$result = array(); // Set $result to an empty array if no results found
}
return $result;
}
public function query($query, $bindings = []){
/**
* Perform a non-query SQL statement on the database.
*
* @param string $query The SQL query to execute.
* @param array $bindings An associative array of parameters and their values.
* @return bool Returns true on success or false on failure.
*/
public function query($query, $bindings = array()) {
// Prepare and execute the SQL query
$STH = $this->PDO->prepare($query);
return $STH->execute($bindings);
}
}
}

71
website/class/header.php Normal file
View File

@@ -0,0 +1,71 @@
<?php
// Set security headers to enhance security
header("X-Frame-Options: SAMEORIGIN");
header("X-XSS-Protection: 1; mode=block");
header("X-Content-Type-Options: nosniff");
header("Referrer-Policy: no-referrer-when-downgrade");
header("Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net https://code.jquery.com; style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; img-src 'self' data: https://cdn.jsdelivr.net https://steamcommunity-a.akamaihd.net https://raw.githubusercontent.com;");
// Include necessary classes and files
require 'class/config.php';
require 'class/database.php';
require 'steamauth/steamauth.php';
require 'class/utils.php';
// Create a database instance
$db = new DataBase();
// Check if the user is logged in
if (isset($_SESSION['steamid'])) {
// Insert or update user's Steam ID in the database
$steamid = $_SESSION['steamid'];
$db->query("INSERT INTO `wp_users` (`steamid`) VALUES ('{$steamid}') ON DUPLICATE KEY UPDATE `updated_at` = CURRENT_TIMESTAMP");
// Get user's database index
$userInfoQuery = $db->select("SELECT `id` FROM `wp_users` WHERE `steamid` = :steamid", ["steamid" => $steamid]);
$_SESSION['userDbIndex'] = $userDbIndex = (int)$userInfoQuery[0]['id'];
// Get weapons and skins information
$weapons = UtilsClass::getWeaponsFromArray();
$skins = UtilsClass::skinsFromJson();
// Retrieve user's selected skins and knife
$querySelected = $db->select("SELECT `weapon`, `paint`, `wear`, `seed`, `nametag` FROM `wp_users_items` WHERE `user_id` = :user_id", ["user_id" => $userDbIndex]);
$selectedSkins = UtilsClass::getSelectedSkins($querySelected);
$selectedKnifeResult = $db->select("SELECT `knife` FROM `wp_users_knife` WHERE `user_id` = :user_id", ["user_id" => $userDbIndex]);
// Determine user's selected knife or set default knife
if (!empty($selectedKnifeResult)) {
$selectedKnife = $selectedKnifeResult[0]['knife'];
} else {
$selectedKnife = "weapon_knife";
}
$knifes = UtilsClass::getKnifeTypes();
// Handle form submission
if (isset($_POST['forma'])) {
$ex = explode("-", $_POST['forma']);
// Handle knife selection
if ($ex[0] == "knife") {
$db->query("INSERT INTO `wp_users_knife` (`user_id`, `knife`) VALUES(:user_id, :knife) ON DUPLICATE KEY UPDATE `knife` = :knife", ["user_id" => $userDbIndex, "knife" => $knifes[$ex[1]]['weapon_name']]);
} else {
// Handle skin selection
if (array_key_exists($ex[1], $skins[$ex[0]]) && isset($_POST['wear']) && $_POST['wear'] >= 0.00 && $_POST['wear'] <= 1.00 && isset($_POST['seed'])) {
$wear = floatval($_POST['wear']); // wear
$seed = intval($_POST['seed']); // seed
// Check if the skin is already selected and update or insert accordingly
if (array_key_exists($ex[0], $selectedSkins)) {
$db->query("UPDATE wp_users_items SET paint = :weapon_paint_id, wear = :weapon_wear, seed = :weapon_seed WHERE user_id = :user_id AND weapon = :weapon_defindex", ["user_id" => $userDbIndex, "weapon_defindex" => $ex[0], "weapon_paint_id" => $ex[1], "weapon_wear" => $wear, "weapon_seed" => $seed]);
} else {
$db->query("INSERT INTO wp_users_items (`user_id`, `weapon`, `paint`, `wear`, `seed`) VALUES (:user_id, :weapon_defindex, :weapon_paint_id, :weapon_wear, :weapon_seed)", ["user_id" => $userDbIndex, "weapon_defindex" => $ex[0], "weapon_paint_id" => $ex[1], "weapon_wear" => $wear, "weapon_seed" => $seed]);
}
}
}
// Redirect to the same page after form submission
header("Location: {$_SERVER['PHP_SELF']}");
}
}
?>

View File

@@ -1,99 +1,112 @@
<?php
/**
* Class UtilsClass
*
* Provides utility methods for handling skin and weapon data.
*/
class UtilsClass
{
public static function skinsFromJson(): array
/**
* Retrieve skins data from the JSON file.
*
* @return array An associative array containing skin data.
*/
public static function skinsFromJson()
{
$skins = [];
$json = json_decode(file_get_contents(__DIR__ . "/../data/".SKIN_LANGUAGE.".json"), true);
$skins = array();
$jsonFilePath = __DIR__ . "/../data/skins.json";
foreach ($json as $skin) {
$skins[(int) $skin['weapon_defindex']][(int) $skin['paint']] = [
'weapon_name' => $skin['weapon_name'],
'paint_name' => $skin['paint_name'],
'image_url' => $skin['image'],
];
if (file_exists($jsonFilePath) && is_readable($jsonFilePath)) {
$json = json_decode(file_get_contents($jsonFilePath), true);
foreach ($json as $skin) {
$skins[(int) $skin['weapon_defindex']][(int) $skin['paint']] = array(
'weapon_name' => $skin['weapon_name'],
'paint_name' => $skin['paint_name'],
'image_url' => $skin['image'],
);
}
} else {
// Handle file not found or unreadable error
// You can throw an exception or log an error message
}
return $skins;
}
/**
* Retrieve weapons data from the skin data array.
*
* @return array An associative array containing weapon data.
*/
public static function getWeaponsFromArray()
{
$weapons = [];
$temp = self::skinsFromJson();
$weapons = array();
$skinsData = self::skinsFromJson();
foreach ($temp as $key => $value) {
if (key_exists($key, $weapons))
continue;
$weapons[$key] = [
foreach ($skinsData as $key => $value) {
$weapons[$key] = array(
'weapon_name' => $value[0]['weapon_name'],
'paint_name' => $value[0]['paint_name'],
'image_url' => $value[0]['image_url'],
];
);
}
return $weapons;
}
/**
* Retrieve knife types from the weapon data array.
*
* @return array An associative array containing knife types data.
*/
public static function getKnifeTypes()
{
$knifes = [];
$temp = self::getWeaponsFromArray();
$knifes = array();
$weaponsData = self::getWeaponsFromArray();
foreach ($temp as $key => $weapon) {
if (
!in_array($key, [
500,
503,
505,
506,
507,
508,
509,
512,
514,
515,
516,
517,
518,
519,
520,
521,
522,
523,
525,
526
])
)
continue;
$allowedKnifeKeys = array(
500, 503, 505, 506, 507, 508, 509, 512, 514, 515,
516, 517, 518, 519, 520, 521, 522, 523, 525
);
$knifes[$key] = [
'weapon_name' => $weapon['weapon_name'],
'paint_name' => rtrim(explode("|", $weapon['paint_name'])[0]),
'image_url' => $weapon['image_url'],
];
$knifes[0] = [
'weapon_name' => "weapon_knife",
'paint_name' => "Default knife",
'image_url' => "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/weapon_knife.png",
];
foreach ($weaponsData as $key => $weapon) {
if (in_array($key, $allowedKnifeKeys)) {
$knifes[$key] = array(
'weapon_name' => $weapon['weapon_name'],
'paint_name' => rtrim(explode("|", $weapon['paint_name'])[0]),
'image_url' => $weapon['image_url'],
);
}
}
// Add default knife
$knifes[0] = array(
'weapon_name' => "weapon_knife",
'paint_name' => "Default knife",
'image_url' => "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/weapon_knife.png",
);
ksort($knifes);
return $knifes;
}
public static function getSelectedSkins(array $temp)
/**
* Retrieve selected skins data from the database result.
*
* @param array $temp An array containing the selected skins data.
* @return array An associative array containing selected skins data.
*/
public static function getSelectedSkins($temp)
{
$selected = [];
$selected = array();
foreach ($temp as $weapon) {
$selected[$weapon['weapon_defindex']] = [
'weapon_paint_id' => $weapon['weapon_paint_id'],
'weapon_seed' => $weapon['weapon_seed'],
'weapon_wear' => $weapon['weapon_wear'],
];
$selected[$weapon['weapon']] = array(
'weapon_paint_id' => $weapon['paint'],
'weapon_seed' => $weapon['seed'],
'weapon_wear' => $weapon['wear'],
);
}
return $selected;

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

View File

@@ -1,14 +0,0 @@
[
{
"team": 2,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
},
{
"team": 3,
"image": "",
"model": "null",
"agent_name": "Agent | Default"
}
]

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,440 +0,0 @@
[
{
"weapon_defindex": 0,
"paint": 0,
"image": "",
"paint_name": "Gloves | Default"
},
{
"weapon_defindex": 5032,
"paint": "10010",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10010.png",
"paint_name": "★ Превръзки за ръце | Смърчова разпокъсана цифрова шарка"
},
{
"weapon_defindex": 5032,
"paint": "10081",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10081.png",
"paint_name": "★ Превръзки за ръце | Пустинен шемаг"
},
{
"weapon_defindex": 5032,
"paint": "10036",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10036.png",
"paint_name": "★ Превръзки за ръце | Пущинаци"
},
{
"weapon_defindex": 5032,
"paint": "10084",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10084.png",
"paint_name": "★ Превръзки за ръце | ВНИМАНИЕ!"
},
{
"weapon_defindex": 5032,
"paint": "10055",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10055.png",
"paint_name": "★ Превръзки за ръце | Изолирбанд"
},
{
"weapon_defindex": 5032,
"paint": "10053",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10053.png",
"paint_name": "★ Превръзки за ръце | Кобалтови черепи"
},
{
"weapon_defindex": 5032,
"paint": "10054",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10054.png",
"paint_name": "★ Превръзки за ръце | Препечатване"
},
{
"weapon_defindex": 5032,
"paint": "10082",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10082.png",
"paint_name": "★ Превръзки за ръце | Жираф"
},
{
"weapon_defindex": 5032,
"paint": "10056",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10056.png",
"paint_name": "★ Превръзки за ръце | Дървовидно"
},
{
"weapon_defindex": 5032,
"paint": "10009",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10009.png",
"paint_name": "★ Превръзки за ръце | Кожени"
},
{
"weapon_defindex": 5032,
"paint": "10083",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10083.png",
"paint_name": "★ Превръзки за ръце | Боа удушвач"
},
{
"weapon_defindex": 5032,
"paint": "10021",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10021.png",
"paint_name": "★ Превръзки за ръце | Клане"
},
{
"weapon_defindex": 5033,
"paint": "10024",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10024.png",
"paint_name": "★ Мотористки ръкавици | Затъмнение"
},
{
"weapon_defindex": 5033,
"paint": "10050",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10050.png",
"paint_name": "★ Мотористки ръкавици | Костенурка"
},
{
"weapon_defindex": 5033,
"paint": "10079",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10079.png",
"paint_name": "★ Мотористки ръкавици | Кръвно налягане"
},
{
"weapon_defindex": 5033,
"paint": "10077",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10077.png",
"paint_name": "★ Мотористки ръкавици | Финална линия"
},
{
"weapon_defindex": 5033,
"paint": "10049",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10049.png",
"paint_name": "★ Мотористки ръкавици | БУФ!"
},
{
"weapon_defindex": 5033,
"paint": "10080",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10080.png",
"paint_name": "★ Мотористки ръкавици | Командос от III рота"
},
{
"weapon_defindex": 5033,
"paint": "10026",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10026.png",
"paint_name": "★ Мотористки ръкавици | Градинска мента"
},
{
"weapon_defindex": 5033,
"paint": "10027",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10027.png",
"paint_name": "★ Мотористки ръкавици | Бум!"
},
{
"weapon_defindex": 5033,
"paint": "10078",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10078.png",
"paint_name": "★ Мотористки ръкавици | Задимяване"
},
{
"weapon_defindex": 5033,
"paint": "10028",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10028.png",
"paint_name": "★ Мотористки ръкавици | Освежаваща мента"
},
{
"weapon_defindex": 5033,
"paint": "10052",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10052.png",
"paint_name": "★ Мотористки ръкавици | Полигон"
},
{
"weapon_defindex": 5033,
"paint": "10051",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10051.png",
"paint_name": "★ Мотористки ръкавици | Транспорт"
},
{
"weapon_defindex": 5031,
"paint": "10013",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10013.png",
"paint_name": "★ Шофьорски ръкавици | Лунно вплитане"
},
{
"weapon_defindex": 5031,
"paint": "10070",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10070.png",
"paint_name": "★ Шофьорски ръкавици | Снежен леопард"
},
{
"weapon_defindex": 5031,
"paint": "10071",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10071.png",
"paint_name": "★ Шофьорски ръкавици | Кралицата ягуар"
},
{
"weapon_defindex": 5031,
"paint": "10015",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10015.png",
"paint_name": "★ Шофьорски ръкавици | Конвой"
},
{
"weapon_defindex": 5031,
"paint": "10042",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10042.png",
"paint_name": "★ Шофьорски ръкавици | Имперско каре"
},
{
"weapon_defindex": 5031,
"paint": "10016",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10016.png",
"paint_name": "★ Шофьорски ръкавици | Пурпурно вплитане"
},
{
"weapon_defindex": 5031,
"paint": "10069",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10069.png",
"paint_name": "★ Шофьорски ръкавици | Резан „Червеният“"
},
{
"weapon_defindex": 5031,
"paint": "10041",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10041.png",
"paint_name": "★ Шофьорски ръкавици | Кралска змия"
},
{
"weapon_defindex": 5031,
"paint": "10040",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10040.png",
"paint_name": "★ Шофьорски ръкавици | Диамантена гърмяща змия"
},
{
"weapon_defindex": 5031,
"paint": "10043",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10043.png",
"paint_name": "★ Шофьорски ръкавици | Застигане"
},
{
"weapon_defindex": 5031,
"paint": "10072",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10072.png",
"paint_name": "★ Шофьорски ръкавици | Черна вратовръзка"
},
{
"weapon_defindex": 5031,
"paint": "10044",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10044.png",
"paint_name": "★ Шофьорски ръкавици | Състезателно зелено"
},
{
"weapon_defindex": 5034,
"paint": "10030",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10030.png",
"paint_name": "★ Специализирани ръкавици | Горска разпокъсана цифрова шарка"
},
{
"weapon_defindex": 5034,
"paint": "10034",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10034.png",
"paint_name": "★ Специализирани ръкавици | Изумрудена паяжина"
},
{
"weapon_defindex": 5034,
"paint": "10063",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10063.png",
"paint_name": "★ Специализирани ръкавици | Избледняване"
},
{
"weapon_defindex": 5034,
"paint": "10068",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10068.png",
"paint_name": "★ Специализирани ръкавици | Полеви агент"
},
{
"weapon_defindex": 5034,
"paint": "10062",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10062.png",
"paint_name": "★ Специализирани ръкавици | Едри сачми"
},
{
"weapon_defindex": 5034,
"paint": "10033",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10033.png",
"paint_name": "★ Специализирани ръкавици | Пурпурно кимоно"
},
{
"weapon_defindex": 5034,
"paint": "10065",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10065.png",
"paint_name": "★ Специализирани ръкавици | Мраморно преливане"
},
{
"weapon_defindex": 5034,
"paint": "10035",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10035.png",
"paint_name": "★ Специализирани ръкавици | Фундамент"
},
{
"weapon_defindex": 5034,
"paint": "10066",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10066.png",
"paint_name": "★ Специализирани ръкавици | Подполковник"
},
{
"weapon_defindex": 5034,
"paint": "10067",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10067.png",
"paint_name": "★ Специализирани ръкавици | Тигрово нападение"
},
{
"weapon_defindex": 5034,
"paint": "10061",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10061.png",
"paint_name": "★ Специализирани ръкавици | Пурпурна паяжина"
},
{
"weapon_defindex": 5034,
"paint": "10064",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10064.png",
"paint_name": "★ Специализирани ръкавици | Монголско"
},
{
"weapon_defindex": 5030,
"paint": "10047",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10047.png",
"paint_name": "★ Спортни ръкавици | Омега"
},
{
"weapon_defindex": 5030,
"paint": "10048",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10048.png",
"paint_name": "★ Спортни ръкавици | Поквара"
},
{
"weapon_defindex": 5030,
"paint": "10038",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10038.png",
"paint_name": "★ Спортни ръкавици | Лабиринт от жив плет"
},
{
"weapon_defindex": 5030,
"paint": "10075",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10075.png",
"paint_name": "★ Спортни ръкавици | Ален шемаг"
},
{
"weapon_defindex": 5030,
"paint": "10074",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10074.png",
"paint_name": "★ Спортни ръкавици | Едър дивеч"
},
{
"weapon_defindex": 5030,
"paint": "10076",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10076.png",
"paint_name": "★ Спортни ръкавици | Нощни"
},
{
"weapon_defindex": 5030,
"paint": "10018",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10018.png",
"paint_name": "★ Спортни ръкавици | Свръхпроводник"
},
{
"weapon_defindex": 5030,
"paint": "10019",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10019.png",
"paint_name": "★ Спортни ръкавици | Суша"
},
{
"weapon_defindex": 5030,
"paint": "10045",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10045.png",
"paint_name": "★ Спортни ръкавици | Амфибийно"
},
{
"weapon_defindex": 5030,
"paint": "10046",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10046.png",
"paint_name": "★ Спортни ръкавици | Бронзово преобразуване"
},
{
"weapon_defindex": 5030,
"paint": "10037",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10037.png",
"paint_name": "★ Спортни ръкавици | Кутията на Пандора"
},
{
"weapon_defindex": 5030,
"paint": "10073",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10073.png",
"paint_name": "★ Спортни ръкавици | Прашка"
},
{
"weapon_defindex": 5027,
"paint": "10006",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10006.png",
"paint_name": "★ Ръкавици „Хрътка“ | Овъглени"
},
{
"weapon_defindex": 5027,
"paint": "10039",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10039.png",
"paint_name": "★ Ръкавици „Хрътка“ | Партизански"
},
{
"weapon_defindex": 5027,
"paint": "10008",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10008.png",
"paint_name": "★ Ръкавици „Хрътка“ | Бронзови"
},
{
"weapon_defindex": 5027,
"paint": "10007",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10007.png",
"paint_name": "★ Ръкавици „Хрътка“ | Змийско ухапване"
},
{
"weapon_defindex": 4725,
"paint": "10087",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10087.png",
"paint_name": "★ Ръкавици „Счупен зъб“ | Бродерия"
},
{
"weapon_defindex": 4725,
"paint": "10085",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10085.png",
"paint_name": "★ Ръкавици „Счупен зъб“ | Нефрит"
},
{
"weapon_defindex": 4725,
"paint": "10086",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10086.png",
"paint_name": "★ Ръкавици „Счупен зъб“ | Жълти ивици"
},
{
"weapon_defindex": 4725,
"paint": "10088",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10088.png",
"paint_name": "★ Ръкавици „Счупен зъб“ | Смахнато"
},
{
"weapon_defindex": 5035,
"paint": "10057",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10057.png",
"paint_name": "★ Ръкавици „Хидра“ | Изумруденозелено"
},
{
"weapon_defindex": 5035,
"paint": "10060",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10060.png",
"paint_name": "★ Ръкавици „Хидра“ | Закалено"
},
{
"weapon_defindex": 5035,
"paint": "10058",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10058.png",
"paint_name": "★ Ръкавици „Хидра“ | Мангрово"
},
{
"weapon_defindex": 5035,
"paint": "10059",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10059.png",
"paint_name": "★ Ръкавици „Хидра“ | Гърмяща змия"
}
]

View File

@@ -1,440 +0,0 @@
[
{
"weapon_defindex": 0,
"paint": 0,
"image": "",
"paint_name": "Gloves | Default"
},
{
"weapon_defindex": 5032,
"paint": "10010",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10010.png",
"paint_name": "Bandáže (★) | Spruce DDPAT"
},
{
"weapon_defindex": 5032,
"paint": "10081",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10081.png",
"paint_name": "Bandáže (★) | Desert Shamagh"
},
{
"weapon_defindex": 5032,
"paint": "10036",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10036.png",
"paint_name": "Bandáže (★) | Badlands"
},
{
"weapon_defindex": 5032,
"paint": "10084",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10084.png",
"paint_name": "Bandáže (★) | CAUTION!"
},
{
"weapon_defindex": 5032,
"paint": "10055",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10055.png",
"paint_name": "Bandáže (★) | Duct Tape"
},
{
"weapon_defindex": 5032,
"paint": "10053",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10053.png",
"paint_name": "Bandáže (★) | Cobalt Skulls"
},
{
"weapon_defindex": 5032,
"paint": "10054",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10054.png",
"paint_name": "Bandáže (★) | Overprint"
},
{
"weapon_defindex": 5032,
"paint": "10082",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10082.png",
"paint_name": "Bandáže (★) | Giraffe"
},
{
"weapon_defindex": 5032,
"paint": "10056",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10056.png",
"paint_name": "Bandáže (★) | Arboreal"
},
{
"weapon_defindex": 5032,
"paint": "10009",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10009.png",
"paint_name": "Bandáže (★) | Leather"
},
{
"weapon_defindex": 5032,
"paint": "10083",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10083.png",
"paint_name": "Bandáže (★) | Constrictor"
},
{
"weapon_defindex": 5032,
"paint": "10021",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10021.png",
"paint_name": "Bandáže (★) | Slaughter"
},
{
"weapon_defindex": 5033,
"paint": "10024",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10024.png",
"paint_name": "Motorkářské rukavice (★) | Eclipse"
},
{
"weapon_defindex": 5033,
"paint": "10050",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10050.png",
"paint_name": "Motorkářské rukavice (★) | Turtle"
},
{
"weapon_defindex": 5033,
"paint": "10079",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10079.png",
"paint_name": "Motorkářské rukavice (★) | Blood Pressure"
},
{
"weapon_defindex": 5033,
"paint": "10077",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10077.png",
"paint_name": "Motorkářské rukavice (★) | Finish Line"
},
{
"weapon_defindex": 5033,
"paint": "10049",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10049.png",
"paint_name": "Motorkářské rukavice (★) | POW!"
},
{
"weapon_defindex": 5033,
"paint": "10080",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10080.png",
"paint_name": "Motorkářské rukavice (★) | 3rd Commando Company"
},
{
"weapon_defindex": 5033,
"paint": "10026",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10026.png",
"paint_name": "Motorkářské rukavice (★) | Spearmint"
},
{
"weapon_defindex": 5033,
"paint": "10027",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10027.png",
"paint_name": "Motorkářské rukavice (★) | Boom!"
},
{
"weapon_defindex": 5033,
"paint": "10078",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10078.png",
"paint_name": "Motorkářské rukavice (★) | Smoke Out"
},
{
"weapon_defindex": 5033,
"paint": "10028",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10028.png",
"paint_name": "Motorkářské rukavice (★) | Cool Mint"
},
{
"weapon_defindex": 5033,
"paint": "10052",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10052.png",
"paint_name": "Motorkářské rukavice (★) | Polygon"
},
{
"weapon_defindex": 5033,
"paint": "10051",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10051.png",
"paint_name": "Motorkářské rukavice (★) | Transport"
},
{
"weapon_defindex": 5031,
"paint": "10013",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10013.png",
"paint_name": "Řidičské rukavice (★) | Lunar Weave"
},
{
"weapon_defindex": 5031,
"paint": "10070",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10070.png",
"paint_name": "Řidičské rukavice (★) | Snow Leopard"
},
{
"weapon_defindex": 5031,
"paint": "10071",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10071.png",
"paint_name": "Řidičské rukavice (★) | Queen Jaguar"
},
{
"weapon_defindex": 5031,
"paint": "10015",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10015.png",
"paint_name": "Řidičské rukavice (★) | Convoy"
},
{
"weapon_defindex": 5031,
"paint": "10042",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10042.png",
"paint_name": "Řidičské rukavice (★) | Imperial Plaid"
},
{
"weapon_defindex": 5031,
"paint": "10016",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10016.png",
"paint_name": "Řidičské rukavice (★) | Crimson Weave"
},
{
"weapon_defindex": 5031,
"paint": "10069",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10069.png",
"paint_name": "Řidičské rukavice (★) | Rezan the Red"
},
{
"weapon_defindex": 5031,
"paint": "10041",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10041.png",
"paint_name": "Řidičské rukavice (★) | King Snake"
},
{
"weapon_defindex": 5031,
"paint": "10040",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10040.png",
"paint_name": "Řidičské rukavice (★) | Diamondback"
},
{
"weapon_defindex": 5031,
"paint": "10043",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10043.png",
"paint_name": "Řidičské rukavice (★) | Overtake"
},
{
"weapon_defindex": 5031,
"paint": "10072",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10072.png",
"paint_name": "Řidičské rukavice (★) | Black Tie"
},
{
"weapon_defindex": 5031,
"paint": "10044",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10044.png",
"paint_name": "Řidičské rukavice (★) | Racing Green"
},
{
"weapon_defindex": 5034,
"paint": "10030",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10030.png",
"paint_name": "Profesionální rukavice (★) | Forest DDPAT"
},
{
"weapon_defindex": 5034,
"paint": "10034",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10034.png",
"paint_name": "Profesionální rukavice (★) | Emerald Web"
},
{
"weapon_defindex": 5034,
"paint": "10063",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10063.png",
"paint_name": "Profesionální rukavice (★) | Fade"
},
{
"weapon_defindex": 5034,
"paint": "10068",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10068.png",
"paint_name": "Profesionální rukavice (★) | Field Agent"
},
{
"weapon_defindex": 5034,
"paint": "10062",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10062.png",
"paint_name": "Profesionální rukavice (★) | Buckshot"
},
{
"weapon_defindex": 5034,
"paint": "10033",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10033.png",
"paint_name": "Profesionální rukavice (★) | Crimson Kimono"
},
{
"weapon_defindex": 5034,
"paint": "10065",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10065.png",
"paint_name": "Profesionální rukavice (★) | Marble Fade"
},
{
"weapon_defindex": 5034,
"paint": "10035",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10035.png",
"paint_name": "Profesionální rukavice (★) | Foundation"
},
{
"weapon_defindex": 5034,
"paint": "10066",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10066.png",
"paint_name": "Profesionální rukavice (★) | Lt. Commander"
},
{
"weapon_defindex": 5034,
"paint": "10067",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10067.png",
"paint_name": "Profesionální rukavice (★) | Tiger Strike"
},
{
"weapon_defindex": 5034,
"paint": "10061",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10061.png",
"paint_name": "Profesionální rukavice (★) | Crimson Web"
},
{
"weapon_defindex": 5034,
"paint": "10064",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10064.png",
"paint_name": "Profesionální rukavice (★) | Mogul"
},
{
"weapon_defindex": 5030,
"paint": "10047",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10047.png",
"paint_name": "Sportovní rukavice (★) | Omega"
},
{
"weapon_defindex": 5030,
"paint": "10048",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10048.png",
"paint_name": "Sportovní rukavice (★) | Vice"
},
{
"weapon_defindex": 5030,
"paint": "10038",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10038.png",
"paint_name": "Sportovní rukavice (★) | Hedge Maze"
},
{
"weapon_defindex": 5030,
"paint": "10075",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10075.png",
"paint_name": "Sportovní rukavice (★) | Scarlet Shamagh"
},
{
"weapon_defindex": 5030,
"paint": "10074",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10074.png",
"paint_name": "Sportovní rukavice (★) | Big Game"
},
{
"weapon_defindex": 5030,
"paint": "10076",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10076.png",
"paint_name": "Sportovní rukavice (★) | Nocts"
},
{
"weapon_defindex": 5030,
"paint": "10018",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10018.png",
"paint_name": "Sportovní rukavice (★) | Superconductor"
},
{
"weapon_defindex": 5030,
"paint": "10019",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10019.png",
"paint_name": "Sportovní rukavice (★) | Arid"
},
{
"weapon_defindex": 5030,
"paint": "10045",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10045.png",
"paint_name": "Sportovní rukavice (★) | Amphibious"
},
{
"weapon_defindex": 5030,
"paint": "10046",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10046.png",
"paint_name": "Sportovní rukavice (★) | Bronze Morph"
},
{
"weapon_defindex": 5030,
"paint": "10037",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10037.png",
"paint_name": "Sportovní rukavice (★) | Pandora's Box"
},
{
"weapon_defindex": 5030,
"paint": "10073",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10073.png",
"paint_name": "Sportovní rukavice (★) | Slingshot"
},
{
"weapon_defindex": 5027,
"paint": "10006",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10006.png",
"paint_name": "Extrémistické rukavice (★) | Charred"
},
{
"weapon_defindex": 5027,
"paint": "10039",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10039.png",
"paint_name": "Extrémistické rukavice (★) | Guerrilla"
},
{
"weapon_defindex": 5027,
"paint": "10008",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10008.png",
"paint_name": "Extrémistické rukavice (★) | Bronzed"
},
{
"weapon_defindex": 5027,
"paint": "10007",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10007.png",
"paint_name": "Extrémistické rukavice (★) | Snakebite"
},
{
"weapon_defindex": 4725,
"paint": "10087",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10087.png",
"paint_name": "Extrémistické rukavice (★) | Needle Point"
},
{
"weapon_defindex": 4725,
"paint": "10085",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10085.png",
"paint_name": "Extrémistické rukavice (★) | Jade"
},
{
"weapon_defindex": 4725,
"paint": "10086",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10086.png",
"paint_name": "Extrémistické rukavice (★) | Yellow-banded"
},
{
"weapon_defindex": 4725,
"paint": "10088",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10088.png",
"paint_name": "Extrémistické rukavice (★) | Unhinged"
},
{
"weapon_defindex": 5035,
"paint": "10057",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10057.png",
"paint_name": "Extrémistické rukavice (★) | Emerald"
},
{
"weapon_defindex": 5035,
"paint": "10060",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10060.png",
"paint_name": "Extrémistické rukavice (★) | Case Hardened"
},
{
"weapon_defindex": 5035,
"paint": "10058",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10058.png",
"paint_name": "Extrémistické rukavice (★) | Mangrove"
},
{
"weapon_defindex": 5035,
"paint": "10059",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10059.png",
"paint_name": "Extrémistické rukavice (★) | Rattler"
}
]

View File

@@ -1,440 +0,0 @@
[
{
"weapon_defindex": 0,
"paint": 0,
"image": "",
"paint_name": "Gloves | Default"
},
{
"weapon_defindex": 5032,
"paint": "10010",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10010.png",
"paint_name": "Håndbind (★) | Spruce DDPAT"
},
{
"weapon_defindex": 5032,
"paint": "10081",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10081.png",
"paint_name": "Håndbind (★) | Desert Shamagh"
},
{
"weapon_defindex": 5032,
"paint": "10036",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10036.png",
"paint_name": "Håndbind (★) | Badlands"
},
{
"weapon_defindex": 5032,
"paint": "10084",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10084.png",
"paint_name": "Håndbind (★) | CAUTION!"
},
{
"weapon_defindex": 5032,
"paint": "10055",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10055.png",
"paint_name": "Håndbind (★) | Duct Tape"
},
{
"weapon_defindex": 5032,
"paint": "10053",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10053.png",
"paint_name": "Håndbind (★) | Cobalt Skulls"
},
{
"weapon_defindex": 5032,
"paint": "10054",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10054.png",
"paint_name": "Håndbind (★) | Overprint"
},
{
"weapon_defindex": 5032,
"paint": "10082",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10082.png",
"paint_name": "Håndbind (★) | Giraffe"
},
{
"weapon_defindex": 5032,
"paint": "10056",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10056.png",
"paint_name": "Håndbind (★) | Arboreal"
},
{
"weapon_defindex": 5032,
"paint": "10009",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10009.png",
"paint_name": "Håndbind (★) | Leather"
},
{
"weapon_defindex": 5032,
"paint": "10083",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10083.png",
"paint_name": "Håndbind (★) | Constrictor"
},
{
"weapon_defindex": 5032,
"paint": "10021",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10021.png",
"paint_name": "Håndbind (★) | Slaughter"
},
{
"weapon_defindex": 5033,
"paint": "10024",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10024.png",
"paint_name": "Motorcykelhandsker (★) | Eclipse"
},
{
"weapon_defindex": 5033,
"paint": "10050",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10050.png",
"paint_name": "Motorcykelhandsker (★) | Turtle"
},
{
"weapon_defindex": 5033,
"paint": "10079",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10079.png",
"paint_name": "Motorcykelhandsker (★) | Blood Pressure"
},
{
"weapon_defindex": 5033,
"paint": "10077",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10077.png",
"paint_name": "Motorcykelhandsker (★) | Finish Line"
},
{
"weapon_defindex": 5033,
"paint": "10049",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10049.png",
"paint_name": "Motorcykelhandsker (★) | POW!"
},
{
"weapon_defindex": 5033,
"paint": "10080",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10080.png",
"paint_name": "Motorcykelhandsker (★) | 3rd Commando Company"
},
{
"weapon_defindex": 5033,
"paint": "10026",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10026.png",
"paint_name": "Motorcykelhandsker (★) | Spearmint"
},
{
"weapon_defindex": 5033,
"paint": "10027",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10027.png",
"paint_name": "Motorcykelhandsker (★) | Boom!"
},
{
"weapon_defindex": 5033,
"paint": "10078",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10078.png",
"paint_name": "Motorcykelhandsker (★) | Smoke Out"
},
{
"weapon_defindex": 5033,
"paint": "10028",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10028.png",
"paint_name": "Motorcykelhandsker (★) | Cool Mint"
},
{
"weapon_defindex": 5033,
"paint": "10052",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10052.png",
"paint_name": "Motorcykelhandsker (★) | Polygon"
},
{
"weapon_defindex": 5033,
"paint": "10051",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10051.png",
"paint_name": "Motorcykelhandsker (★) | Transport"
},
{
"weapon_defindex": 5031,
"paint": "10013",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10013.png",
"paint_name": "Kørehandsker (★) | Lunar Weave"
},
{
"weapon_defindex": 5031,
"paint": "10070",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10070.png",
"paint_name": "Kørehandsker (★) | Snow Leopard"
},
{
"weapon_defindex": 5031,
"paint": "10071",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10071.png",
"paint_name": "Kørehandsker (★) | Queen Jaguar"
},
{
"weapon_defindex": 5031,
"paint": "10015",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10015.png",
"paint_name": "Kørehandsker (★) | Convoy"
},
{
"weapon_defindex": 5031,
"paint": "10042",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10042.png",
"paint_name": "Kørehandsker (★) | Imperial Plaid"
},
{
"weapon_defindex": 5031,
"paint": "10016",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10016.png",
"paint_name": "Kørehandsker (★) | Crimson Weave"
},
{
"weapon_defindex": 5031,
"paint": "10069",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10069.png",
"paint_name": "Kørehandsker (★) | Rezan the Red"
},
{
"weapon_defindex": 5031,
"paint": "10041",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10041.png",
"paint_name": "Kørehandsker (★) | King Snake"
},
{
"weapon_defindex": 5031,
"paint": "10040",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10040.png",
"paint_name": "Kørehandsker (★) | Diamondback"
},
{
"weapon_defindex": 5031,
"paint": "10043",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10043.png",
"paint_name": "Kørehandsker (★) | Overtake"
},
{
"weapon_defindex": 5031,
"paint": "10072",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10072.png",
"paint_name": "Kørehandsker (★) | Black Tie"
},
{
"weapon_defindex": 5031,
"paint": "10044",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10044.png",
"paint_name": "Kørehandsker (★) | Racing Green"
},
{
"weapon_defindex": 5034,
"paint": "10030",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10030.png",
"paint_name": "Specialisthandsker (★) | Forest DDPAT"
},
{
"weapon_defindex": 5034,
"paint": "10034",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10034.png",
"paint_name": "Specialisthandsker (★) | Emerald Web"
},
{
"weapon_defindex": 5034,
"paint": "10063",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10063.png",
"paint_name": "Specialisthandsker (★) | Fade"
},
{
"weapon_defindex": 5034,
"paint": "10068",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10068.png",
"paint_name": "Specialisthandsker (★) | Field Agent"
},
{
"weapon_defindex": 5034,
"paint": "10062",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10062.png",
"paint_name": "Specialisthandsker (★) | Buckshot"
},
{
"weapon_defindex": 5034,
"paint": "10033",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10033.png",
"paint_name": "Specialisthandsker (★) | Crimson Kimono"
},
{
"weapon_defindex": 5034,
"paint": "10065",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10065.png",
"paint_name": "Specialisthandsker (★) | Marble Fade"
},
{
"weapon_defindex": 5034,
"paint": "10035",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10035.png",
"paint_name": "Specialisthandsker (★) | Foundation"
},
{
"weapon_defindex": 5034,
"paint": "10066",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10066.png",
"paint_name": "Specialisthandsker (★) | Lt. Commander"
},
{
"weapon_defindex": 5034,
"paint": "10067",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10067.png",
"paint_name": "Specialisthandsker (★) | Tiger Strike"
},
{
"weapon_defindex": 5034,
"paint": "10061",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10061.png",
"paint_name": "Specialisthandsker (★) | Crimson Web"
},
{
"weapon_defindex": 5034,
"paint": "10064",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10064.png",
"paint_name": "Specialisthandsker (★) | Mogul"
},
{
"weapon_defindex": 5030,
"paint": "10047",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10047.png",
"paint_name": "Sportshandsker (★) | Omega"
},
{
"weapon_defindex": 5030,
"paint": "10048",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10048.png",
"paint_name": "Sportshandsker (★) | Vice"
},
{
"weapon_defindex": 5030,
"paint": "10038",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10038.png",
"paint_name": "Sportshandsker (★) | Hedge Maze"
},
{
"weapon_defindex": 5030,
"paint": "10075",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10075.png",
"paint_name": "Sportshandsker (★) | Scarlet Shamagh"
},
{
"weapon_defindex": 5030,
"paint": "10074",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10074.png",
"paint_name": "Sportshandsker (★) | Big Game"
},
{
"weapon_defindex": 5030,
"paint": "10076",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10076.png",
"paint_name": "Sportshandsker (★) | Nocts"
},
{
"weapon_defindex": 5030,
"paint": "10018",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10018.png",
"paint_name": "Sportshandsker (★) | Superconductor"
},
{
"weapon_defindex": 5030,
"paint": "10019",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10019.png",
"paint_name": "Sportshandsker (★) | Arid"
},
{
"weapon_defindex": 5030,
"paint": "10045",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10045.png",
"paint_name": "Sportshandsker (★) | Amphibious"
},
{
"weapon_defindex": 5030,
"paint": "10046",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10046.png",
"paint_name": "Sportshandsker (★) | Bronze Morph"
},
{
"weapon_defindex": 5030,
"paint": "10037",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10037.png",
"paint_name": "Sportshandsker (★) | Pandora's Box"
},
{
"weapon_defindex": 5030,
"paint": "10073",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10073.png",
"paint_name": "Sportshandsker (★) | Slingshot"
},
{
"weapon_defindex": 5027,
"paint": "10006",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10006.png",
"paint_name": "Bloodhound-handsker (★) | Charred"
},
{
"weapon_defindex": 5027,
"paint": "10039",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10039.png",
"paint_name": "Bloodhound-handsker (★) | Guerrilla"
},
{
"weapon_defindex": 5027,
"paint": "10008",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10008.png",
"paint_name": "Bloodhound-handsker (★) | Bronzed"
},
{
"weapon_defindex": 5027,
"paint": "10007",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10007.png",
"paint_name": "Bloodhound-handsker (★) | Snakebite"
},
{
"weapon_defindex": 4725,
"paint": "10087",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10087.png",
"paint_name": "Broken Fang-handsker (★) | Needle Point"
},
{
"weapon_defindex": 4725,
"paint": "10085",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10085.png",
"paint_name": "Broken Fang-handsker (★) | Jade"
},
{
"weapon_defindex": 4725,
"paint": "10086",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10086.png",
"paint_name": "Broken Fang-handsker (★) | Yellow-banded"
},
{
"weapon_defindex": 4725,
"paint": "10088",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10088.png",
"paint_name": "Broken Fang-handsker (★) | Unhinged"
},
{
"weapon_defindex": 5035,
"paint": "10057",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10057.png",
"paint_name": "Hydra-handsker (★) | Emerald"
},
{
"weapon_defindex": 5035,
"paint": "10060",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10060.png",
"paint_name": "Hydra-handsker (★) | Case Hardened"
},
{
"weapon_defindex": 5035,
"paint": "10058",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10058.png",
"paint_name": "Hydra-handsker (★) | Mangrove"
},
{
"weapon_defindex": 5035,
"paint": "10059",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10059.png",
"paint_name": "Hydra-handsker (★) | Rattler"
}
]

View File

@@ -1,440 +0,0 @@
[
{
"weapon_defindex": 0,
"paint": 0,
"image": "",
"paint_name": "Gloves | Default"
},
{
"weapon_defindex": 5032,
"paint": "10010",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10010.png",
"paint_name": "Handbandagen (★) | Spruce DDPAT"
},
{
"weapon_defindex": 5032,
"paint": "10081",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10081.png",
"paint_name": "Handbandagen (★) | Wüsten-Kufiya"
},
{
"weapon_defindex": 5032,
"paint": "10036",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10036.png",
"paint_name": "Handbandagen (★) | Ödland"
},
{
"weapon_defindex": 5032,
"paint": "10084",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10084.png",
"paint_name": "Handbandagen (★) | ACHTUNG!"
},
{
"weapon_defindex": 5032,
"paint": "10055",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10055.png",
"paint_name": "Handbandagen (★) | Klebeband"
},
{
"weapon_defindex": 5032,
"paint": "10053",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10053.png",
"paint_name": "Handbandagen (★) | Kobaltblaue Totenschädel"
},
{
"weapon_defindex": 5032,
"paint": "10054",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10054.png",
"paint_name": "Handbandagen (★) | Aufdruck"
},
{
"weapon_defindex": 5032,
"paint": "10082",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10082.png",
"paint_name": "Handbandagen (★) | Giraffe"
},
{
"weapon_defindex": 5032,
"paint": "10056",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10056.png",
"paint_name": "Handbandagen (★) | Arboreal"
},
{
"weapon_defindex": 5032,
"paint": "10009",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10009.png",
"paint_name": "Handbandagen (★) | Leder"
},
{
"weapon_defindex": 5032,
"paint": "10083",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10083.png",
"paint_name": "Handbandagen (★) | Riesenschlange"
},
{
"weapon_defindex": 5032,
"paint": "10021",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10021.png",
"paint_name": "Handbandagen (★) | Metzelei"
},
{
"weapon_defindex": 5033,
"paint": "10024",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10024.png",
"paint_name": "Motorradhandschuhe (★) | Finsternis"
},
{
"weapon_defindex": 5033,
"paint": "10050",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10050.png",
"paint_name": "Motorradhandschuhe (★) | Schildkröte"
},
{
"weapon_defindex": 5033,
"paint": "10079",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10079.png",
"paint_name": "Motorradhandschuhe (★) | Blutdruck"
},
{
"weapon_defindex": 5033,
"paint": "10077",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10077.png",
"paint_name": "Motorradhandschuhe (★) | Ziellinie"
},
{
"weapon_defindex": 5033,
"paint": "10049",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10049.png",
"paint_name": "Motorradhandschuhe (★) | PENG!"
},
{
"weapon_defindex": 5033,
"paint": "10080",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10080.png",
"paint_name": "Motorradhandschuhe (★) | 3. Kommandokompanie"
},
{
"weapon_defindex": 5033,
"paint": "10026",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10026.png",
"paint_name": "Motorradhandschuhe (★) | Grüne Minze"
},
{
"weapon_defindex": 5033,
"paint": "10027",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10027.png",
"paint_name": "Motorradhandschuhe (★) | Bumm!"
},
{
"weapon_defindex": 5033,
"paint": "10078",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10078.png",
"paint_name": "Motorradhandschuhe (★) | Rauch"
},
{
"weapon_defindex": 5033,
"paint": "10028",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10028.png",
"paint_name": "Motorradhandschuhe (★) | Kühle Minze"
},
{
"weapon_defindex": 5033,
"paint": "10052",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10052.png",
"paint_name": "Motorradhandschuhe (★) | Polygon"
},
{
"weapon_defindex": 5033,
"paint": "10051",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10051.png",
"paint_name": "Motorradhandschuhe (★) | Transport"
},
{
"weapon_defindex": 5031,
"paint": "10013",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10013.png",
"paint_name": "Chauffeurshandschuhe (★) | Mondgewebe"
},
{
"weapon_defindex": 5031,
"paint": "10070",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10070.png",
"paint_name": "Chauffeurshandschuhe (★) | Schneeleopard"
},
{
"weapon_defindex": 5031,
"paint": "10071",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10071.png",
"paint_name": "Chauffeurshandschuhe (★) | Jaguarkönigin"
},
{
"weapon_defindex": 5031,
"paint": "10015",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10015.png",
"paint_name": "Chauffeurshandschuhe (★) | Konvoi"
},
{
"weapon_defindex": 5031,
"paint": "10042",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10042.png",
"paint_name": "Chauffeurshandschuhe (★) | Kaiserliches Karo"
},
{
"weapon_defindex": 5031,
"paint": "10016",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10016.png",
"paint_name": "Chauffeurshandschuhe (★) | Purpurnes Gewebe"
},
{
"weapon_defindex": 5031,
"paint": "10069",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10069.png",
"paint_name": "Chauffeurshandschuhe (★) | Rezan, der Rote"
},
{
"weapon_defindex": 5031,
"paint": "10041",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10041.png",
"paint_name": "Chauffeurshandschuhe (★) | Königsnatter"
},
{
"weapon_defindex": 5031,
"paint": "10040",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10040.png",
"paint_name": "Chauffeurshandschuhe (★) | Diamantenrücken"
},
{
"weapon_defindex": 5031,
"paint": "10043",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10043.png",
"paint_name": "Chauffeurshandschuhe (★) | Turbo"
},
{
"weapon_defindex": 5031,
"paint": "10072",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10072.png",
"paint_name": "Chauffeurshandschuhe (★) | Schwarze Fliege"
},
{
"weapon_defindex": 5031,
"paint": "10044",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10044.png",
"paint_name": "Chauffeurshandschuhe (★) | Renn-Grün"
},
{
"weapon_defindex": 5034,
"paint": "10030",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10030.png",
"paint_name": "Spezialistenhandschuhe (★) | Wald-DDPAT"
},
{
"weapon_defindex": 5034,
"paint": "10034",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10034.png",
"paint_name": "Spezialistenhandschuhe (★) | Smaragdgrünes Netz"
},
{
"weapon_defindex": 5034,
"paint": "10063",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10063.png",
"paint_name": "Spezialistenhandschuhe (★) | Farbverlauf"
},
{
"weapon_defindex": 5034,
"paint": "10068",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10068.png",
"paint_name": "Spezialistenhandschuhe (★) | Außendienstmitarbeiter"
},
{
"weapon_defindex": 5034,
"paint": "10062",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10062.png",
"paint_name": "Spezialistenhandschuhe (★) | Schrot"
},
{
"weapon_defindex": 5034,
"paint": "10033",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10033.png",
"paint_name": "Spezialistenhandschuhe (★) | Purpurner Kimono"
},
{
"weapon_defindex": 5034,
"paint": "10065",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10065.png",
"paint_name": "Spezialistenhandschuhe (★) | Marmorfärbung"
},
{
"weapon_defindex": 5034,
"paint": "10035",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10035.png",
"paint_name": "Spezialistenhandschuhe (★) | Fundierung"
},
{
"weapon_defindex": 5034,
"paint": "10066",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10066.png",
"paint_name": "Spezialistenhandschuhe (★) | Lt. Commander"
},
{
"weapon_defindex": 5034,
"paint": "10067",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10067.png",
"paint_name": "Spezialistenhandschuhe (★) | Tigerangriff"
},
{
"weapon_defindex": 5034,
"paint": "10061",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10061.png",
"paint_name": "Spezialistenhandschuhe (★) | Purpurnes Netz"
},
{
"weapon_defindex": 5034,
"paint": "10064",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10064.png",
"paint_name": "Spezialistenhandschuhe (★) | Mogul"
},
{
"weapon_defindex": 5030,
"paint": "10047",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10047.png",
"paint_name": "Sporthandschuhe (★) | Omega"
},
{
"weapon_defindex": 5030,
"paint": "10048",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10048.png",
"paint_name": "Sporthandschuhe (★) | Vice"
},
{
"weapon_defindex": 5030,
"paint": "10038",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10038.png",
"paint_name": "Sporthandschuhe (★) | Heckenirrgarten"
},
{
"weapon_defindex": 5030,
"paint": "10075",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10075.png",
"paint_name": "Sporthandschuhe (★) | Scharlachrote Kufiya"
},
{
"weapon_defindex": 5030,
"paint": "10074",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10074.png",
"paint_name": "Sporthandschuhe (★) | Großwildjagd"
},
{
"weapon_defindex": 5030,
"paint": "10076",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10076.png",
"paint_name": "Sporthandschuhe (★) | Nocts"
},
{
"weapon_defindex": 5030,
"paint": "10018",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10018.png",
"paint_name": "Sporthandschuhe (★) | Supraleiter"
},
{
"weapon_defindex": 5030,
"paint": "10019",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10019.png",
"paint_name": "Sporthandschuhe (★) | Dürr"
},
{
"weapon_defindex": 5030,
"paint": "10045",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10045.png",
"paint_name": "Sporthandschuhe (★) | Amphibisch"
},
{
"weapon_defindex": 5030,
"paint": "10046",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10046.png",
"paint_name": "Sporthandschuhe (★) | Bronze Morph"
},
{
"weapon_defindex": 5030,
"paint": "10037",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10037.png",
"paint_name": "Sporthandschuhe (★) | Pandoras Büchse"
},
{
"weapon_defindex": 5030,
"paint": "10073",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10073.png",
"paint_name": "Sporthandschuhe (★) | Schleuder"
},
{
"weapon_defindex": 5027,
"paint": "10006",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10006.png",
"paint_name": "Bloodhound-Handschuhe (★) | Verkohlt"
},
{
"weapon_defindex": 5027,
"paint": "10039",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10039.png",
"paint_name": "Bloodhound-Handschuhe (★) | Guerilla"
},
{
"weapon_defindex": 5027,
"paint": "10008",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10008.png",
"paint_name": "Bloodhound-Handschuhe (★) | Brüniert"
},
{
"weapon_defindex": 5027,
"paint": "10007",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10007.png",
"paint_name": "Bloodhound-Handschuhe (★) | Schlangenbiss"
},
{
"weapon_defindex": 4725,
"paint": "10087",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10087.png",
"paint_name": "Zerbrochener-Reißzahn-Handschuhe (★) | Nadelspitze"
},
{
"weapon_defindex": 4725,
"paint": "10085",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10085.png",
"paint_name": "Zerbrochener-Reißzahn-Handschuhe (★) | Jade"
},
{
"weapon_defindex": 4725,
"paint": "10086",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10086.png",
"paint_name": "Zerbrochener-Reißzahn-Handschuhe (★) | Gelbgebändert"
},
{
"weapon_defindex": 4725,
"paint": "10088",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10088.png",
"paint_name": "Zerbrochener-Reißzahn-Handschuhe (★) | Loser Kiefer"
},
{
"weapon_defindex": 5035,
"paint": "10057",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10057.png",
"paint_name": "Hydra-Handschuhe (★) | Smaragd"
},
{
"weapon_defindex": 5035,
"paint": "10060",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10060.png",
"paint_name": "Hydra-Handschuhe (★) | Einsatzgehärtet"
},
{
"weapon_defindex": 5035,
"paint": "10058",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10058.png",
"paint_name": "Hydra-Handschuhe (★) | Mangrove"
},
{
"weapon_defindex": 5035,
"paint": "10059",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10059.png",
"paint_name": "Hydra-Handschuhe (★) | Klapperschlange"
}
]

View File

@@ -1,440 +0,0 @@
[
{
"weapon_defindex": 0,
"paint": 0,
"image": "",
"paint_name": "Gloves | Default"
},
{
"weapon_defindex": 5032,
"paint": "10010",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10010.png",
"paint_name": "★ Περιτυλίγματα χεριών | Spruce DDPAT"
},
{
"weapon_defindex": 5032,
"paint": "10081",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10081.png",
"paint_name": "★ Περιτυλίγματα χεριών | Desert Shamagh"
},
{
"weapon_defindex": 5032,
"paint": "10036",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10036.png",
"paint_name": "★ Περιτυλίγματα χεριών | Badlands"
},
{
"weapon_defindex": 5032,
"paint": "10084",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10084.png",
"paint_name": "★ Περιτυλίγματα χεριών | CAUTION!"
},
{
"weapon_defindex": 5032,
"paint": "10055",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10055.png",
"paint_name": "★ Περιτυλίγματα χεριών | Duct Tape"
},
{
"weapon_defindex": 5032,
"paint": "10053",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10053.png",
"paint_name": "★ Περιτυλίγματα χεριών | Cobalt Skulls"
},
{
"weapon_defindex": 5032,
"paint": "10054",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10054.png",
"paint_name": "★ Περιτυλίγματα χεριών | Overprint"
},
{
"weapon_defindex": 5032,
"paint": "10082",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10082.png",
"paint_name": "★ Περιτυλίγματα χεριών | Giraffe"
},
{
"weapon_defindex": 5032,
"paint": "10056",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10056.png",
"paint_name": "★ Περιτυλίγματα χεριών | Arboreal"
},
{
"weapon_defindex": 5032,
"paint": "10009",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10009.png",
"paint_name": "★ Περιτυλίγματα χεριών | Leather"
},
{
"weapon_defindex": 5032,
"paint": "10083",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10083.png",
"paint_name": "★ Περιτυλίγματα χεριών | Constrictor"
},
{
"weapon_defindex": 5032,
"paint": "10021",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10021.png",
"paint_name": "★ Περιτυλίγματα χεριών | Slaughter"
},
{
"weapon_defindex": 5033,
"paint": "10024",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10024.png",
"paint_name": "★ Γάντια μηχανής | Eclipse"
},
{
"weapon_defindex": 5033,
"paint": "10050",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10050.png",
"paint_name": "★ Γάντια μηχανής | Turtle"
},
{
"weapon_defindex": 5033,
"paint": "10079",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10079.png",
"paint_name": "★ Γάντια μηχανής | Blood Pressure"
},
{
"weapon_defindex": 5033,
"paint": "10077",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10077.png",
"paint_name": "★ Γάντια μηχανής | Finish Line"
},
{
"weapon_defindex": 5033,
"paint": "10049",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10049.png",
"paint_name": "★ Γάντια μηχανής | POW!"
},
{
"weapon_defindex": 5033,
"paint": "10080",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10080.png",
"paint_name": "★ Γάντια μηχανής | 3rd Commando Company"
},
{
"weapon_defindex": 5033,
"paint": "10026",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10026.png",
"paint_name": "★ Γάντια μηχανής | Spearmint"
},
{
"weapon_defindex": 5033,
"paint": "10027",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10027.png",
"paint_name": "★ Γάντια μηχανής | Boom!"
},
{
"weapon_defindex": 5033,
"paint": "10078",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10078.png",
"paint_name": "★ Γάντια μηχανής | Smoke Out"
},
{
"weapon_defindex": 5033,
"paint": "10028",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10028.png",
"paint_name": "★ Γάντια μηχανής | Cool Mint"
},
{
"weapon_defindex": 5033,
"paint": "10052",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10052.png",
"paint_name": "★ Γάντια μηχανής | Polygon"
},
{
"weapon_defindex": 5033,
"paint": "10051",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10051.png",
"paint_name": "★ Γάντια μηχανής | Transport"
},
{
"weapon_defindex": 5031,
"paint": "10013",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10013.png",
"paint_name": "★ Γάντια οδηγού | Lunar Weave"
},
{
"weapon_defindex": 5031,
"paint": "10070",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10070.png",
"paint_name": "★ Γάντια οδηγού | Snow Leopard"
},
{
"weapon_defindex": 5031,
"paint": "10071",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10071.png",
"paint_name": "★ Γάντια οδηγού | Queen Jaguar"
},
{
"weapon_defindex": 5031,
"paint": "10015",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10015.png",
"paint_name": "★ Γάντια οδηγού | Convoy"
},
{
"weapon_defindex": 5031,
"paint": "10042",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10042.png",
"paint_name": "★ Γάντια οδηγού | Imperial Plaid"
},
{
"weapon_defindex": 5031,
"paint": "10016",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10016.png",
"paint_name": "★ Γάντια οδηγού | Crimson Weave"
},
{
"weapon_defindex": 5031,
"paint": "10069",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10069.png",
"paint_name": "★ Γάντια οδηγού | Rezan the Red"
},
{
"weapon_defindex": 5031,
"paint": "10041",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10041.png",
"paint_name": "★ Γάντια οδηγού | King Snake"
},
{
"weapon_defindex": 5031,
"paint": "10040",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10040.png",
"paint_name": "★ Γάντια οδηγού | Diamondback"
},
{
"weapon_defindex": 5031,
"paint": "10043",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10043.png",
"paint_name": "★ Γάντια οδηγού | Overtake"
},
{
"weapon_defindex": 5031,
"paint": "10072",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10072.png",
"paint_name": "★ Γάντια οδηγού | Black Tie"
},
{
"weapon_defindex": 5031,
"paint": "10044",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10044.png",
"paint_name": "★ Γάντια οδηγού | Racing Green"
},
{
"weapon_defindex": 5034,
"paint": "10030",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10030.png",
"paint_name": "★ Γάντια ειδικού | Forest DDPAT"
},
{
"weapon_defindex": 5034,
"paint": "10034",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10034.png",
"paint_name": "★ Γάντια ειδικού | Emerald Web"
},
{
"weapon_defindex": 5034,
"paint": "10063",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10063.png",
"paint_name": "★ Γάντια ειδικού | Fade"
},
{
"weapon_defindex": 5034,
"paint": "10068",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10068.png",
"paint_name": "★ Γάντια ειδικού | Field Agent"
},
{
"weapon_defindex": 5034,
"paint": "10062",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10062.png",
"paint_name": "★ Γάντια ειδικού | Buckshot"
},
{
"weapon_defindex": 5034,
"paint": "10033",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10033.png",
"paint_name": "★ Γάντια ειδικού | Crimson Kimono"
},
{
"weapon_defindex": 5034,
"paint": "10065",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10065.png",
"paint_name": "★ Γάντια ειδικού | Marble Fade"
},
{
"weapon_defindex": 5034,
"paint": "10035",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10035.png",
"paint_name": "★ Γάντια ειδικού | Foundation"
},
{
"weapon_defindex": 5034,
"paint": "10066",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10066.png",
"paint_name": "★ Γάντια ειδικού | Lt. Commander"
},
{
"weapon_defindex": 5034,
"paint": "10067",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10067.png",
"paint_name": "★ Γάντια ειδικού | Tiger Strike"
},
{
"weapon_defindex": 5034,
"paint": "10061",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10061.png",
"paint_name": "★ Γάντια ειδικού | Crimson Web"
},
{
"weapon_defindex": 5034,
"paint": "10064",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10064.png",
"paint_name": "★ Γάντια ειδικού | Mogul"
},
{
"weapon_defindex": 5030,
"paint": "10047",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10047.png",
"paint_name": "★ Σπορ γάντια | Omega"
},
{
"weapon_defindex": 5030,
"paint": "10048",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10048.png",
"paint_name": "★ Σπορ γάντια | Vice"
},
{
"weapon_defindex": 5030,
"paint": "10038",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10038.png",
"paint_name": "★ Σπορ γάντια | Hedge Maze"
},
{
"weapon_defindex": 5030,
"paint": "10075",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10075.png",
"paint_name": "★ Σπορ γάντια | Scarlet Shamagh"
},
{
"weapon_defindex": 5030,
"paint": "10074",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10074.png",
"paint_name": "★ Σπορ γάντια | Big Game"
},
{
"weapon_defindex": 5030,
"paint": "10076",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10076.png",
"paint_name": "★ Σπορ γάντια | Nocts"
},
{
"weapon_defindex": 5030,
"paint": "10018",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10018.png",
"paint_name": "★ Σπορ γάντια | Superconductor"
},
{
"weapon_defindex": 5030,
"paint": "10019",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10019.png",
"paint_name": "★ Σπορ γάντια | Arid"
},
{
"weapon_defindex": 5030,
"paint": "10045",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10045.png",
"paint_name": "★ Σπορ γάντια | Amphibious"
},
{
"weapon_defindex": 5030,
"paint": "10046",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10046.png",
"paint_name": "★ Σπορ γάντια | Bronze Morph"
},
{
"weapon_defindex": 5030,
"paint": "10037",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10037.png",
"paint_name": "★ Σπορ γάντια | Pandora's Box"
},
{
"weapon_defindex": 5030,
"paint": "10073",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10073.png",
"paint_name": "★ Σπορ γάντια | Slingshot"
},
{
"weapon_defindex": 5027,
"paint": "10006",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10006.png",
"paint_name": "★ Γάντια Bloodhound | Charred"
},
{
"weapon_defindex": 5027,
"paint": "10039",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10039.png",
"paint_name": "★ Γάντια Bloodhound | Guerrilla"
},
{
"weapon_defindex": 5027,
"paint": "10008",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10008.png",
"paint_name": "★ Γάντια Bloodhound | Bronzed"
},
{
"weapon_defindex": 5027,
"paint": "10007",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10007.png",
"paint_name": "★ Γάντια Bloodhound | Snakebite"
},
{
"weapon_defindex": 4725,
"paint": "10087",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10087.png",
"paint_name": "★ Γάντια Broken Fang | Needle Point"
},
{
"weapon_defindex": 4725,
"paint": "10085",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10085.png",
"paint_name": "★ Γάντια Broken Fang | Jade"
},
{
"weapon_defindex": 4725,
"paint": "10086",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10086.png",
"paint_name": "★ Γάντια Broken Fang | Yellow-banded"
},
{
"weapon_defindex": 4725,
"paint": "10088",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10088.png",
"paint_name": "★ Γάντια Broken Fang | Unhinged"
},
{
"weapon_defindex": 5035,
"paint": "10057",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10057.png",
"paint_name": "★ Γάντια Hydra | Emerald"
},
{
"weapon_defindex": 5035,
"paint": "10060",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10060.png",
"paint_name": "★ Γάντια Hydra | Case Hardened"
},
{
"weapon_defindex": 5035,
"paint": "10058",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10058.png",
"paint_name": "★ Γάντια Hydra | Mangrove"
},
{
"weapon_defindex": 5035,
"paint": "10059",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10059.png",
"paint_name": "★ Γάντια Hydra | Rattler"
}
]

View File

@@ -1,440 +0,0 @@
[
{
"weapon_defindex": 0,
"paint": 0,
"image": "",
"paint_name": "Gloves | Default"
},
{
"weapon_defindex": 5032,
"paint": "10010",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10010.png",
"paint_name": "★ Hand Wraps | Spruce DDPAT"
},
{
"weapon_defindex": 5032,
"paint": "10081",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10081.png",
"paint_name": "★ Hand Wraps | Desert Shamagh"
},
{
"weapon_defindex": 5032,
"paint": "10036",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10036.png",
"paint_name": "★ Hand Wraps | Badlands"
},
{
"weapon_defindex": 5032,
"paint": "10084",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10084.png",
"paint_name": "★ Hand Wraps | CAUTION!"
},
{
"weapon_defindex": 5032,
"paint": "10055",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10055.png",
"paint_name": "★ Hand Wraps | Duct Tape"
},
{
"weapon_defindex": 5032,
"paint": "10053",
"image": "https://raw.githubusercontent.com/Nereziel/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/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10054.png",
"paint_name": "★ Hand Wraps | Overprint"
},
{
"weapon_defindex": 5032,
"paint": "10082",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10082.png",
"paint_name": "★ Hand Wraps | Giraffe"
},
{
"weapon_defindex": 5032,
"paint": "10056",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10056.png",
"paint_name": "★ Hand Wraps | Arboreal"
},
{
"weapon_defindex": 5032,
"paint": "10009",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10009.png",
"paint_name": "★ Hand Wraps | Leather"
},
{
"weapon_defindex": 5032,
"paint": "10083",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10083.png",
"paint_name": "★ Hand Wraps | Constrictor"
},
{
"weapon_defindex": 5032,
"paint": "10021",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10021.png",
"paint_name": "★ Hand Wraps | Slaughter"
},
{
"weapon_defindex": 5033,
"paint": "10024",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10024.png",
"paint_name": "★ Moto Gloves | Eclipse"
},
{
"weapon_defindex": 5033,
"paint": "10050",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10050.png",
"paint_name": "★ Moto Gloves | Turtle"
},
{
"weapon_defindex": 5033,
"paint": "10079",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10079.png",
"paint_name": "★ Moto Gloves | Blood Pressure"
},
{
"weapon_defindex": 5033,
"paint": "10077",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10077.png",
"paint_name": "★ Moto Gloves | Finish Line"
},
{
"weapon_defindex": 5033,
"paint": "10049",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10049.png",
"paint_name": "★ Moto Gloves | POW!"
},
{
"weapon_defindex": 5033,
"paint": "10080",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10080.png",
"paint_name": "★ Moto Gloves | 3rd Commando Company"
},
{
"weapon_defindex": 5033,
"paint": "10026",
"image": "https://raw.githubusercontent.com/Nereziel/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/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10027.png",
"paint_name": "★ Moto Gloves | Boom!"
},
{
"weapon_defindex": 5033,
"paint": "10078",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10078.png",
"paint_name": "★ Moto Gloves | Smoke Out"
},
{
"weapon_defindex": 5033,
"paint": "10028",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10028.png",
"paint_name": "★ Moto Gloves | Cool Mint"
},
{
"weapon_defindex": 5033,
"paint": "10052",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10052.png",
"paint_name": "★ Moto Gloves | Polygon"
},
{
"weapon_defindex": 5033,
"paint": "10051",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10051.png",
"paint_name": "★ Moto Gloves | Transport"
},
{
"weapon_defindex": 5031,
"paint": "10013",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10013.png",
"paint_name": "★ Driver Gloves | Lunar Weave"
},
{
"weapon_defindex": 5031,
"paint": "10070",
"image": "https://raw.githubusercontent.com/Nereziel/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/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10071.png",
"paint_name": "★ Driver Gloves | Queen Jaguar"
},
{
"weapon_defindex": 5031,
"paint": "10015",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10015.png",
"paint_name": "★ Driver Gloves | Convoy"
},
{
"weapon_defindex": 5031,
"paint": "10042",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10042.png",
"paint_name": "★ Driver Gloves | Imperial Plaid"
},
{
"weapon_defindex": 5031,
"paint": "10016",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10016.png",
"paint_name": "★ Driver Gloves | Crimson Weave"
},
{
"weapon_defindex": 5031,
"paint": "10069",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10069.png",
"paint_name": "★ Driver Gloves | Rezan the Red"
},
{
"weapon_defindex": 5031,
"paint": "10041",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10041.png",
"paint_name": "★ Driver Gloves | King Snake"
},
{
"weapon_defindex": 5031,
"paint": "10040",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10040.png",
"paint_name": "★ Driver Gloves | Diamondback"
},
{
"weapon_defindex": 5031,
"paint": "10043",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10043.png",
"paint_name": "★ Driver Gloves | Overtake"
},
{
"weapon_defindex": 5031,
"paint": "10072",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10072.png",
"paint_name": "★ Driver Gloves | Black Tie"
},
{
"weapon_defindex": 5031,
"paint": "10044",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10044.png",
"paint_name": "★ Driver Gloves | Racing Green"
},
{
"weapon_defindex": 5034,
"paint": "10030",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10030.png",
"paint_name": "★ Specialist Gloves | Forest DDPAT"
},
{
"weapon_defindex": 5034,
"paint": "10034",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10034.png",
"paint_name": "★ Specialist Gloves | Emerald Web"
},
{
"weapon_defindex": 5034,
"paint": "10063",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10063.png",
"paint_name": "★ Specialist Gloves | Fade"
},
{
"weapon_defindex": 5034,
"paint": "10068",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10068.png",
"paint_name": "★ Specialist Gloves | Field Agent"
},
{
"weapon_defindex": 5034,
"paint": "10062",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10062.png",
"paint_name": "★ Specialist Gloves | Buckshot"
},
{
"weapon_defindex": 5034,
"paint": "10033",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10033.png",
"paint_name": "★ Specialist Gloves | Crimson Kimono"
},
{
"weapon_defindex": 5034,
"paint": "10065",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10065.png",
"paint_name": "★ Specialist Gloves | Marble Fade"
},
{
"weapon_defindex": 5034,
"paint": "10035",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10035.png",
"paint_name": "★ Specialist Gloves | Foundation"
},
{
"weapon_defindex": 5034,
"paint": "10066",
"image": "https://raw.githubusercontent.com/Nereziel/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/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10067.png",
"paint_name": "★ Specialist Gloves | Tiger Strike"
},
{
"weapon_defindex": 5034,
"paint": "10061",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10061.png",
"paint_name": "★ Specialist Gloves | Crimson Web"
},
{
"weapon_defindex": 5034,
"paint": "10064",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10064.png",
"paint_name": "★ Specialist Gloves | Mogul"
},
{
"weapon_defindex": 5030,
"paint": "10047",
"image": "https://raw.githubusercontent.com/Nereziel/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/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10048.png",
"paint_name": "★ Sport Gloves | Vice"
},
{
"weapon_defindex": 5030,
"paint": "10038",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10038.png",
"paint_name": "★ Sport Gloves | Hedge Maze"
},
{
"weapon_defindex": 5030,
"paint": "10075",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10075.png",
"paint_name": "★ Sport Gloves | Scarlet Shamagh"
},
{
"weapon_defindex": 5030,
"paint": "10074",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10074.png",
"paint_name": "★ Sport Gloves | Big Game"
},
{
"weapon_defindex": 5030,
"paint": "10076",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10076.png",
"paint_name": "★ Sport Gloves | Nocts"
},
{
"weapon_defindex": 5030,
"paint": "10018",
"image": "https://raw.githubusercontent.com/Nereziel/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/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10019.png",
"paint_name": "★ Sport Gloves | Arid"
},
{
"weapon_defindex": 5030,
"paint": "10045",
"image": "https://raw.githubusercontent.com/Nereziel/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/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10046.png",
"paint_name": "★ Sport Gloves | Bronze Morph"
},
{
"weapon_defindex": 5030,
"paint": "10037",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10037.png",
"paint_name": "★ Sport Gloves | Pandora's Box"
},
{
"weapon_defindex": 5030,
"paint": "10073",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10073.png",
"paint_name": "★ Sport Gloves | Slingshot"
},
{
"weapon_defindex": 5027,
"paint": "10006",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10006.png",
"paint_name": "★ Bloodhound Gloves | Charred"
},
{
"weapon_defindex": 5027,
"paint": "10039",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10039.png",
"paint_name": "★ Bloodhound Gloves | Guerrilla"
},
{
"weapon_defindex": 5027,
"paint": "10008",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10008.png",
"paint_name": "★ Bloodhound Gloves | Bronzed"
},
{
"weapon_defindex": 5027,
"paint": "10007",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10007.png",
"paint_name": "★ Bloodhound Gloves | Snakebite"
},
{
"weapon_defindex": 4725,
"paint": "10087",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10087.png",
"paint_name": "★ Broken Fang Gloves | Needle Point"
},
{
"weapon_defindex": 4725,
"paint": "10085",
"image": "https://raw.githubusercontent.com/Nereziel/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/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10086.png",
"paint_name": "★ Broken Fang Gloves | Yellow-banded"
},
{
"weapon_defindex": 4725,
"paint": "10088",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10088.png",
"paint_name": "★ Broken Fang Gloves | Unhinged"
},
{
"weapon_defindex": 5035,
"paint": "10057",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10057.png",
"paint_name": "★ Hydra Gloves | Emerald"
},
{
"weapon_defindex": 5035,
"paint": "10060",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10060.png",
"paint_name": "★ Hydra Gloves | Case Hardened"
},
{
"weapon_defindex": 5035,
"paint": "10058",
"image": "https://raw.githubusercontent.com/Nereziel/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/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10059.png",
"paint_name": "★ Hydra Gloves | Rattler"
}
]

View File

@@ -1,440 +0,0 @@
[
{
"weapon_defindex": 0,
"paint": 0,
"image": "",
"paint_name": "Gloves | Default"
},
{
"weapon_defindex": 5032,
"paint": "10010",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10010.png",
"paint_name": "Vendas de cuero ★ | DDPAT pícea"
},
{
"weapon_defindex": 5032,
"paint": "10081",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10081.png",
"paint_name": "Vendas de cuero ★ | Kufiya del desierto"
},
{
"weapon_defindex": 5032,
"paint": "10036",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10036.png",
"paint_name": "Vendas de cuero ★ | Tierra yerma"
},
{
"weapon_defindex": 5032,
"paint": "10084",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10084.png",
"paint_name": "Vendas de cuero ★ | ¡PRECAUCIÓN!"
},
{
"weapon_defindex": 5032,
"paint": "10055",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10055.png",
"paint_name": "Vendas de cuero ★ | Cinta adhesiva"
},
{
"weapon_defindex": 5032,
"paint": "10053",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10053.png",
"paint_name": "Vendas de cuero ★ | Cráneos de cobalto"
},
{
"weapon_defindex": 5032,
"paint": "10054",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10054.png",
"paint_name": "Vendas de cuero ★ | Sobreimpresión"
},
{
"weapon_defindex": 5032,
"paint": "10082",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10082.png",
"paint_name": "Vendas de cuero ★ | Jirafa"
},
{
"weapon_defindex": 5032,
"paint": "10056",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10056.png",
"paint_name": "Vendas de cuero ★ | Arbóreo"
},
{
"weapon_defindex": 5032,
"paint": "10009",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10009.png",
"paint_name": "Vendas de cuero ★ | Cuero"
},
{
"weapon_defindex": 5032,
"paint": "10083",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10083.png",
"paint_name": "Vendas de cuero ★ | Constrictor"
},
{
"weapon_defindex": 5032,
"paint": "10021",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/leather_handwraps-10021.png",
"paint_name": "Vendas de cuero ★ | Masacre"
},
{
"weapon_defindex": 5033,
"paint": "10024",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10024.png",
"paint_name": "Guantes de motorista ★ | Eclipse"
},
{
"weapon_defindex": 5033,
"paint": "10050",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10050.png",
"paint_name": "Guantes de motorista ★ | Tortuga"
},
{
"weapon_defindex": 5033,
"paint": "10079",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10079.png",
"paint_name": "Guantes de motorista ★ | Presión sanguínea"
},
{
"weapon_defindex": 5033,
"paint": "10077",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10077.png",
"paint_name": "Guantes de motorista ★ | Línea de meta"
},
{
"weapon_defindex": 5033,
"paint": "10049",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10049.png",
"paint_name": "Guantes de motorista ★ | ¡PLAS!"
},
{
"weapon_defindex": 5033,
"paint": "10080",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10080.png",
"paint_name": "Guantes de motorista ★ | 3.ª Compañía de Comandos"
},
{
"weapon_defindex": 5033,
"paint": "10026",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10026.png",
"paint_name": "Guantes de motorista ★ | Hierbabuena"
},
{
"weapon_defindex": 5033,
"paint": "10027",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10027.png",
"paint_name": "Guantes de motorista ★ | ¡Bum!"
},
{
"weapon_defindex": 5033,
"paint": "10078",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10078.png",
"paint_name": "Guantes de motorista ★ | Lanzando humo"
},
{
"weapon_defindex": 5033,
"paint": "10028",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10028.png",
"paint_name": "Guantes de motorista ★ | Menta fresca"
},
{
"weapon_defindex": 5033,
"paint": "10052",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10052.png",
"paint_name": "Guantes de motorista ★ | Polígono"
},
{
"weapon_defindex": 5033,
"paint": "10051",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/motorcycle_gloves-10051.png",
"paint_name": "Guantes de motorista ★ | Transporte"
},
{
"weapon_defindex": 5031,
"paint": "10013",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10013.png",
"paint_name": "Guantes de conductor ★ | Entrelazado lunar"
},
{
"weapon_defindex": 5031,
"paint": "10070",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10070.png",
"paint_name": "Guantes de conductor ★ | Irbis"
},
{
"weapon_defindex": 5031,
"paint": "10071",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10071.png",
"paint_name": "Guantes de conductor ★ | Reina jaguar"
},
{
"weapon_defindex": 5031,
"paint": "10015",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10015.png",
"paint_name": "Guantes de conductor ★ | Convoy"
},
{
"weapon_defindex": 5031,
"paint": "10042",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10042.png",
"paint_name": "Guantes de conductor ★ | Tartán imperial"
},
{
"weapon_defindex": 5031,
"paint": "10016",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10016.png",
"paint_name": "Guantes de conductor ★ | Entrelazado carmesí"
},
{
"weapon_defindex": 5031,
"paint": "10069",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10069.png",
"paint_name": "Guantes de conductor ★ | Rezan el Rojo"
},
{
"weapon_defindex": 5031,
"paint": "10041",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10041.png",
"paint_name": "Guantes de conductor ★ | Serpiente rey"
},
{
"weapon_defindex": 5031,
"paint": "10040",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10040.png",
"paint_name": "Guantes de conductor ★ | Diamantino"
},
{
"weapon_defindex": 5031,
"paint": "10043",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10043.png",
"paint_name": "Guantes de conductor ★ | Adelantamiento"
},
{
"weapon_defindex": 5031,
"paint": "10072",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10072.png",
"paint_name": "Guantes de conductor ★ | De punta en blanco"
},
{
"weapon_defindex": 5031,
"paint": "10044",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/slick_gloves-10044.png",
"paint_name": "Guantes de conductor ★ | Verde de competición"
},
{
"weapon_defindex": 5034,
"paint": "10030",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10030.png",
"paint_name": "Guantes de especialista ★ | DDPAT boscoso"
},
{
"weapon_defindex": 5034,
"paint": "10034",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10034.png",
"paint_name": "Guantes de especialista ★ | Telaraña esmeralda"
},
{
"weapon_defindex": 5034,
"paint": "10063",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10063.png",
"paint_name": "Guantes de especialista ★ | Desteñido"
},
{
"weapon_defindex": 5034,
"paint": "10068",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10068.png",
"paint_name": "Guantes de especialista ★ | Agente de campo"
},
{
"weapon_defindex": 5034,
"paint": "10062",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10062.png",
"paint_name": "Guantes de especialista ★ | Perdigón"
},
{
"weapon_defindex": 5034,
"paint": "10033",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10033.png",
"paint_name": "Guantes de especialista ★ | Kimono carmesí"
},
{
"weapon_defindex": 5034,
"paint": "10065",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10065.png",
"paint_name": "Guantes de especialista ★ | Mármol desteñido"
},
{
"weapon_defindex": 5034,
"paint": "10035",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10035.png",
"paint_name": "Guantes de especialista ★ | Fundación"
},
{
"weapon_defindex": 5034,
"paint": "10066",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10066.png",
"paint_name": "Guantes de especialista ★ | Capitán de corbeta"
},
{
"weapon_defindex": 5034,
"paint": "10067",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10067.png",
"paint_name": "Guantes de especialista ★ | Ataque de tigre"
},
{
"weapon_defindex": 5034,
"paint": "10061",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10061.png",
"paint_name": "Guantes de especialista ★ | Tela escarlata"
},
{
"weapon_defindex": 5034,
"paint": "10064",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/specialist_gloves-10064.png",
"paint_name": "Guantes de especialista ★ | Mogul"
},
{
"weapon_defindex": 5030,
"paint": "10047",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10047.png",
"paint_name": "Guantes de deporte ★ | Omega"
},
{
"weapon_defindex": 5030,
"paint": "10048",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10048.png",
"paint_name": "Guantes de deporte ★ | Antivicio"
},
{
"weapon_defindex": 5030,
"paint": "10038",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10038.png",
"paint_name": "Guantes de deporte ★ | Laberinto de setos"
},
{
"weapon_defindex": 5030,
"paint": "10075",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10075.png",
"paint_name": "Guantes de deporte ★ | Kufiya escarlata"
},
{
"weapon_defindex": 5030,
"paint": "10074",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10074.png",
"paint_name": "Guantes de deporte ★ | Caza mayor"
},
{
"weapon_defindex": 5030,
"paint": "10076",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10076.png",
"paint_name": "Guantes de deporte ★ | Nocts"
},
{
"weapon_defindex": 5030,
"paint": "10018",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10018.png",
"paint_name": "Guantes de deporte ★ | Superconductor"
},
{
"weapon_defindex": 5030,
"paint": "10019",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10019.png",
"paint_name": "Guantes de deporte ★ | Árido"
},
{
"weapon_defindex": 5030,
"paint": "10045",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10045.png",
"paint_name": "Guantes de deporte ★ | Anfibio"
},
{
"weapon_defindex": 5030,
"paint": "10046",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10046.png",
"paint_name": "Guantes de deporte ★ | Metamorfosis broncínea"
},
{
"weapon_defindex": 5030,
"paint": "10037",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10037.png",
"paint_name": "Guantes de deporte ★ | Caja de Pandora"
},
{
"weapon_defindex": 5030,
"paint": "10073",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/sporty_gloves-10073.png",
"paint_name": "Guantes de deporte ★ | Slingshot"
},
{
"weapon_defindex": 5027,
"paint": "10006",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10006.png",
"paint_name": "Guantes Bloodhound ★ | Chamuscado"
},
{
"weapon_defindex": 5027,
"paint": "10039",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10039.png",
"paint_name": "Guantes Bloodhound ★ | Guerrilla"
},
{
"weapon_defindex": 5027,
"paint": "10008",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10008.png",
"paint_name": "Guantes Bloodhound ★ | Bronceado"
},
{
"weapon_defindex": 5027,
"paint": "10007",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_bloodhound_gloves-10007.png",
"paint_name": "Guantes Bloodhound ★ | Mordedura de serpiente"
},
{
"weapon_defindex": 4725,
"paint": "10087",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10087.png",
"paint_name": "Guantes Broken Fang ★ | Punta de aguja"
},
{
"weapon_defindex": 4725,
"paint": "10085",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10085.png",
"paint_name": "Guantes Broken Fang ★ | Jade"
},
{
"weapon_defindex": 4725,
"paint": "10086",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10086.png",
"paint_name": "Guantes Broken Fang ★ | Con bandas amarillas"
},
{
"weapon_defindex": 4725,
"paint": "10088",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_brokenfang_gloves-10088.png",
"paint_name": "Guantes Broken Fang ★ | Inestable"
},
{
"weapon_defindex": 5035,
"paint": "10057",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10057.png",
"paint_name": "Guantes Hydra ★ | Esmeralda"
},
{
"weapon_defindex": 5035,
"paint": "10060",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10060.png",
"paint_name": "Guantes Hydra ★ | Acero templado"
},
{
"weapon_defindex": 5035,
"paint": "10058",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10058.png",
"paint_name": "Guantes Hydra ★ | Manglar"
},
{
"weapon_defindex": 5035,
"paint": "10059",
"image": "https://raw.githubusercontent.com/Nereziel/cs2-WeaponPaints/main/website/img/skins/studded_hydra_gloves-10059.png",
"paint_name": "Guantes Hydra ★ | Cascabel"
}
]

Some files were not shown because too many files have changed in this diff Show More