From 322b1b425b220cdc8219ea2dad9c07810b9bf144 Mon Sep 17 00:00:00 2001 From: Nereziel Date: Sun, 26 May 2024 19:28:36 +0200 Subject: [PATCH] part one --- Commands.cs | 4 +- Config.cs | 7 +- Events.cs | 15 +- PlayerInfo.cs | 2 +- Utility.cs | 50 +- WeaponAction.cs | 890 ++++++++++++++++--------------- WeaponInfo.cs | 10 +- WeaponPaints.cs | 10 +- WeaponSynchronization.cs | 529 +++++++++--------- website/class/database.php | 57 +- website/class/header.php | 71 +++ website/class/utils.php | 137 ++--- website/getskins.php | 11 +- website/index.php | 281 +--------- website/steamauth/licence.txt | 21 + website/steamauth/steamauth.php | 8 +- website/steamauth/userInfo.php | 2 - website/style.css | 14 +- website/view/display_gloves.php | 42 ++ website/view/display_knife.php | 42 ++ website/view/display_weapons.php | 154 ++++++ 21 files changed, 1264 insertions(+), 1093 deletions(-) create mode 100644 website/class/header.php create mode 100644 website/steamauth/licence.txt create mode 100644 website/view/display_gloves.php create mode 100644 website/view/display_knife.php create mode 100644 website/view/display_weapons.php diff --git a/Commands.cs b/Commands.cs index 10091103..74930422 100644 --- a/Commands.cs +++ b/Commands.cs @@ -224,8 +224,8 @@ namespace WeaponPaints if (firstSkin == null || !firstSkin.TryGetValue("weapon_defindex", out var weaponDefIndexObj) || - !int.TryParse(weaponDefIndexObj.ToString(), out var weaponDefIndex) || - !int.TryParse(selectedPaintId, out var paintId)) return; + !ushort.TryParse(weaponDefIndexObj.ToString(), out var weaponDefIndex) || + !ushort.TryParse(selectedPaintId, out var paintId)) return; { if (Config.Additional.ShowSkinImage && skinsList != null) { diff --git a/Config.cs b/Config.cs index a9d7ae48..929760b0 100644 --- a/Config.cs +++ b/Config.cs @@ -20,7 +20,10 @@ namespace WeaponPaints [JsonPropertyName("SkinEnabled")] public bool SkinEnabled { get; set; } = true; - [JsonPropertyName("CommandWpEnabled")] + [JsonPropertyName("NameTagEnabled")] + public bool NameTagEnabled { get; set; } = true; + + [JsonPropertyName("CommandWpEnabled")] public bool CommandWpEnabled { get; set; } = true; [JsonPropertyName("CommandKillEnabled")] @@ -62,7 +65,7 @@ namespace WeaponPaints public class WeaponPaintsConfig : BasePluginConfig { - public override int Version { get; set; } = 6; + public override int Version { get; set; } = 7; [JsonPropertyName("DatabaseHost")] public string DatabaseHost { get; set; } = ""; diff --git a/Events.cs b/Events.cs index 9c0e8ca6..53488a4e 100644 --- a/Events.cs +++ b/Events.cs @@ -23,14 +23,14 @@ namespace WeaponPaints 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] }; try { - _ = Task.Run(async () => await weaponSync.GetPlayerData(playerInfo)); + _ = Task.Run(async () => await weaponSync.GetPlayerDatabaseIndex(playerInfo)); /* if (Config.Additional.SkinEnabled) { @@ -54,9 +54,10 @@ namespace WeaponPaints } */ } - catch - { - } + catch (Exception) + { + return HookResult.Continue; + } return HookResult.Continue; } @@ -68,7 +69,9 @@ namespace WeaponPaints if (player is null || !player.IsValid || player.IsBot) return HookResult.Continue; - if (Config.Additional.SkinEnabled) + g_playersDatabaseIndex.TryRemove(player.Slot, out _); + + if (Config.Additional.SkinEnabled) { gPlayerWeaponsInfo.TryRemove(player.Slot, out _); } diff --git a/PlayerInfo.cs b/PlayerInfo.cs index 8190c0d0..0d4d44a4 100644 --- a/PlayerInfo.cs +++ b/PlayerInfo.cs @@ -5,7 +5,7 @@ public int Index { get; set; } public int Slot { get; init; } public int? UserId { get; set; } - public string? SteamId { get; init; } + public ulong? SteamId { get; init; } public string? Name { get; set; } public string? IpAddress { get; set; } } diff --git a/Utility.cs b/Utility.cs index cda54412..1ea1b914 100644 --- a/Utility.cs +++ b/Utility.cs @@ -22,46 +22,16 @@ namespace WeaponPaints await using var transaction = await connection.BeginTransactionAsync(); try - { - string[] createTableQueries = - [ - """ - CREATE TABLE IF NOT EXISTS `wp_player_skins` ( - `steamid` varchar(18) 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 - ) ENGINE=InnoDB - """, - @"CREATE TABLE IF NOT EXISTS `wp_player_knife` ( - `steamid` varchar(18) NOT NULL, - `knife` varchar(64) NOT NULL, - UNIQUE (`steamid`) - ) ENGINE = InnoDB", - """ - CREATE TABLE IF NOT EXISTS `wp_player_gloves` ( - `steamid` varchar(18) NOT NULL, - `weapon_defindex` int(11) NOT NULL, - UNIQUE (`steamid`) - ) ENGINE=InnoDB - """, - """ - 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`) - ) ENGINE=InnoDB - """, - """ - CREATE TABLE IF NOT EXISTS `wp_player_music` ( - `steamid` varchar(64) NOT NULL, - `music_id` int(11) NOT NULL, - UNIQUE (`steamid`) - ) ENGINE=InnoDB - """, - ]; + { + var createTableQueries = new[] + { + "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.001, `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_gloves` (`user_id` INT UNSIGNED NOT NULL, `weapon_defindex` SMALLINT UNSIGNED DEFAULT NULL, PRIMARY KEY (`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;", + "CREATE TABLE IF NOT EXISTS `wp_users_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;", + "CREATE TABLE IF NOT EXISTS `wp_users_agents` (`user_id` INT UNSIGNED NOT NULL,`agent_ct` varchar(64) DEFAULT NULL,`agent_t` varchar(64) DEFAULT NULL, PRIMARY KEY (`user_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;" + }; foreach (var query in createTableQueries) { diff --git a/WeaponAction.cs b/WeaponAction.cs index 9c994a98..fe3225bf 100644 --- a/WeaponAction.cs +++ b/WeaponAction.cs @@ -1,451 +1,457 @@ -using CounterStrikeSharp.API; +using System.Diagnostics; +using System.Reflection.Metadata.Ecma335; +using System.Runtime.InteropServices; +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.Runtime.InteropServices; -namespace WeaponPaints +namespace WeaponPaints; + +public partial class WeaponPaints { - public partial class WeaponPaints - { - private void GivePlayerWeaponSkin(CCSPlayerController player, CBasePlayerWeapon weapon) - { - if (!Config.Additional.SkinEnabled) return; - if (!gPlayerWeaponsInfo.TryGetValue(player.Slot, out _)) return; - - bool isKnife = weapon.DesignerName.Contains("knife") || weapon.DesignerName.Contains("bayonet"); - - if (isKnife && !g_playersKnife.ContainsKey(player.Slot) || isKnife && g_playersKnife[player.Slot] == "weapon_knife") return; - - int[] newPaints = { 1171, 1170, 1169, 1164, 1162, 1161, 1159, 1175, 1174, 1167, 1165, 1168, 1163, 1160, 1166, 1173 }; - - if (isKnife) - { - var newDefIndex = WeaponDefindex.FirstOrDefault(x => x.Value == g_playersKnife[player.Slot]); - 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; - } - - UpdatePlayerEconItemId(weapon.AttributeManager.Item); - - int weaponDefIndex = weapon.AttributeManager.Item.ItemDefinitionIndex; - int fallbackPaintKit = 0; - - weapon.AttributeManager.Item.AccountID = (uint)player.SteamID; - - if (_config.Additional.GiveRandomSkin && - !gPlayerWeaponsInfo[player.Slot].ContainsKey(weaponDefIndex)) - { - // Random skins - 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; - - if (isKnife) return; - UpdatePlayerWeaponMeshGroupMask(player, weapon, !newPaints.Contains(fallbackPaintKit)); - return; - } - - if (!gPlayerWeaponsInfo[player.Slot].TryGetValue(weaponDefIndex, out var value) || value.Paint == 0) return; - - var weaponInfo = value; - //Log($"Apply on {weapon.DesignerName}({weapon.AttributeManager.Item.ItemDefinitionIndex}) paint {gPlayerWeaponPaints[steamId.SteamId64][weapon.AttributeManager.Item.ItemDefinitionIndex]} seed {gPlayerWeaponSeed[steamId.SteamId64][weapon.AttributeManager.Item.ItemDefinitionIndex]} wear {gPlayerWeaponWear[steamId.SteamId64][weapon.AttributeManager.Item.ItemDefinitionIndex]}"); - 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.Seed; - weapon.FallbackWear = weaponInfo.Wear; - CAttributeListSetOrAddAttributeValueByName.Invoke(weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle, "set item texture prefab", weapon.FallbackPaintKit); - - fallbackPaintKit = weapon.FallbackPaintKit; - - if (fallbackPaintKit == 0) - return; - - if (isKnife) return; - UpdatePlayerWeaponMeshGroupMask(player, weapon, !newPaints.Contains(fallbackPaintKit)); - } - - 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); - } - - private static bool PlayerHasKnife(CCSPlayerController? player) - { - if (!_config.Additional.KnifeEnabled) return false; - - if (player == null || !player.IsValid || !player.PlayerPawn.IsValid) - { - return false; - } - - 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")) - { - return true; - } - } - return false; - } - - private void RefreshWeapons(CCSPlayerController? player) - { - if (!g_bCommandsAllowed) 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; - - var weapons = player.PlayerPawn.Value.WeaponServices.MyWeapons; - - if (weapons.Count == 0) - return; - if (player.Team is CsTeam.None or CsTeam.Spectator) - return; - - int playerTeam = player.TeamNum; - - Dictionary> weaponsWithAmmo = []; - - foreach (var weapon in weapons) - { - if (!weapon.IsValid || weapon.Value == null || - !weapon.Value.IsValid || !weapon.Value.DesignerName.Contains("weapon_")) - continue; - - CCSWeaponBaseGun gun = weapon.Value.As(); - - if (weapon.Value.Entity == null) continue; - if (!weapon.Value.OwnerEntity.IsValid) continue; - if (gun.Entity == null) continue; - if (!gun.IsValid) continue; - if (!gun.VisibleinPVS) continue; - - try - { - CCSWeaponBaseVData? weaponData = weapon.Value.As().VData; - - if (weaponData == null) continue; - - if (weaponData.GearSlot == gear_slot_t.GEAR_SLOT_RIFLE || weaponData.GearSlot == gear_slot_t.GEAR_SLOT_PISTOL) - { - 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)) - { - value = []; - weaponsWithAmmo.Add(weaponByDefindex, value); - } - - value.Add((clip1, reservedAmmo)); - - if (gun.VData == null) return; - - weapon.Value.Remove(); - } - } - catch (Exception ex) - { - Logger.LogWarning(ex.Message); - continue; - } - } - - try - { - player.ExecuteClientCommand("slot 3"); - player.ExecuteClientCommand("slot 3"); - - var weapon = player.PlayerPawn.Value.WeaponServices.ActiveWeapon; - if (!weapon.IsValid || weapon.Value == null) return; - CCSWeaponBaseVData? weaponData = weapon.Value.As().VData; - - if (weapon.Value.DesignerName.Contains("knife") || weaponData?.GearSlot == gear_slot_t.GEAR_SLOT_KNIFE) - { - CCSWeaponBaseGun gun; - - AddTimer(0.3f, () => - { - if (player.TeamNum != playerTeam) return; - - player.ExecuteClientCommand("slot 3"); - gun = weapon.Value.As(); - player.DropActiveWeapon(); - - AddTimer(0.7f, () => - { - if (player.TeamNum != playerTeam) return; - - if (!gun.IsValid || gun.State != CSWeaponState_t.WEAPON_NOT_CARRIED) return; - - gun.Remove(); - }); - - GiveKnifeToPlayer(player); - }); - } - } - catch (Exception ex) - { - Logger.LogWarning($"Cannot remove knife: {ex.Message}"); - } - - AddTimer(0.6f, () => - { - if (!g_bCommandsAllowed) return; - - foreach (var entry in weaponsWithAmmo) - { - foreach (var ammo in entry.Value) - { - var newWeapon = new CBasePlayerWeapon(player.GiveNamedItem(entry.Key)); - Server.NextFrame(() => - { - try - { - newWeapon.Clip1 = ammo.Item1; - newWeapon.ReserveAmmo[0] = ammo.Item2; - } - 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); - } - - Instance.AddTimer(0.06f, () => - { - CEconItemView item = pawn.EconGloves; - try - { - if (!player.IsValid) - return; - - if (!player.PawnIsAlive) - return; - - if (!g_playersGlove.TryGetValue(player.Slot, out var gloveInfo) || gloveInfo == 0) return; - - WeaponInfo weaponInfo = gPlayerWeaponsInfo[player.Slot][gloveInfo]; - - item.ItemDefinitionIndex = gloveInfo; - item.ItemIDLow = 16384 & 0xFFFFFFFF; - item.ItemIDHigh = 16384; - - 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.Initialized = true; - - SetBodygroup(pawn.Handle, "default_gloves", 1); - } - catch (Exception) { } - }, TimerFlags.STOP_ON_MAPCHANGE); - } - - 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; - } - - private static void SubclassChange(CBasePlayerWeapon weapon, ushort itemD) - { - var subclassChangeFunc = VirtualFunction.Create( - GameData.GetSignature("ChangeSubclass") - ); - - subclassChangeFunc(weapon.Handle, itemD.ToString()); - } - - private static void UpdateWeaponMeshGroupMask(CBaseEntity weapon, bool isLegacy = false) - { - if (weapon.CBodyComponent?.SceneNode == null) return; - var skeleton = weapon.CBodyComponent.SceneNode.GetSkeletonInstance(); - var value = (ulong)(isLegacy ? 2 : 1); - - if (skeleton.ModelState.MeshGroupMask != value) - { - skeleton.ModelState.MeshGroupMask = value; - } - } - - private static void UpdatePlayerWeaponMeshGroupMask(CCSPlayerController player, CBasePlayerWeapon weapon, bool isLegacy) - { - UpdateWeaponMeshGroupMask(weapon, isLegacy); - - var viewModel = GetPlayerViewModel(player); - if (viewModel == null || viewModel.Weapon.Value == null || - viewModel.Weapon.Value.Index != weapon.Index) return; - UpdateWeaponMeshGroupMask(viewModel, isLegacy); - Utilities.SetStateChanged(viewModel, "CBaseEntity", "m_CBodyComponent"); - } - - private static void GivePlayerAgent(CCSPlayerController player) - { - if (!g_playersAgent.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 - { - Server.NextFrame(() => - { - player.PlayerPawn.Value.SetModel( - $"characters/models/{model}.vmdl" - ); - }); - } - catch (Exception) - { - } - } - - private static void GivePlayerMusicKit(CCSPlayerController player) - { - if (!g_playersMusic.TryGetValue(player.Slot, out var value)) return; - if (player.InventoryServices == null) return; - - player.InventoryServices.MusicID = value; - Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInventoryServices"); - player.MusicKitID = value; - Utilities.SetStateChanged(player, "CCSPlayerController", "m_iMusicKitID"); - } - - 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.DesignerName.Contains("knife")) - { - GivePlayerWeaponSkin(player, weapon); - } - } - } - - private void UpdatePlayerEconItemId(CEconItemView econItemView) - { - var itemId = _nextItemId++; - econItemView.ItemID = itemId; - - econItemView.ItemIDLow = (uint)itemId & 0xFFFFFFFF; - econItemView.ItemIDHigh = (uint)itemId >> 32; - } - - private static CCSPlayerController? GetPlayerFromItemServices(CCSPlayer_ItemServices itemServices) - { - 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; - } - - private static unsafe CBaseViewModel? GetPlayerViewModel(CCSPlayerController player) - { - if (player.PlayerPawn.Value == null || player.PlayerPawn.Value.ViewModelServices == null) return null; - CCSPlayer_ViewModelServices viewModelServices = new(player.PlayerPawn.Value.ViewModelServices!.Handle); - var ptr = viewModelServices.Handle + Schema.GetSchemaOffset("CCSPlayer_ViewModelServices", "m_hViewModel"); - var references = MemoryMarshal.CreateSpan(ref ptr, 3); - var viewModel = (CHandle)Activator.CreateInstance(typeof(CHandle), references[0])!; - return viewModel.Value == null ? null : viewModel.Value; - } - - public static unsafe T[] GetFixedArray(nint pointer, string @class, string member, int length) where T : CHandle - { - var ptr = pointer + Schema.GetSchemaOffset(@class, member); - var references = MemoryMarshal.CreateSpan(ref ptr, length); - var values = new T[length]; - - for (var i = 0; i < length; i++) - { - values[i] = (T)Activator.CreateInstance(typeof(T), references[i])!; - } - - return values; - } - } + private void GivePlayerWeaponSkin(CCSPlayerController player, CBasePlayerWeapon weapon) + { + if (!Config.Additional.SkinEnabled) return; + if (!gPlayerWeaponsInfo.TryGetValue(player.Slot, out _)) return; + + var isKnife = weapon.DesignerName.Contains("knife") || weapon.DesignerName.Contains("bayonet"); + + if ((isKnife && !g_playersKnife.ContainsKey(player.Slot)) || + (isKnife && g_playersKnife[player.Slot] == "weapon_knife")) return; + + int[] newPaints = + [1171, 1170, 1169, 1164, 1162, 1161, 1159, 1175, 1174, 1167, 1165, 1168, 1163, 1160, 1166, 1173]; + + if (isKnife) + { + var newDefIndex = WeaponDefindex.FirstOrDefault(x => x.Value == g_playersKnife[player.Slot]); + 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; + } + + UpdatePlayerEconItemId(weapon.AttributeManager.Item); + + int weaponDefIndex = weapon.AttributeManager.Item.ItemDefinitionIndex; + var fallbackPaintKit = 0; + + weapon.AttributeManager.Item.AccountID = (uint)player.SteamID; + + if (_config.Additional.GiveRandomSkin && + !gPlayerWeaponsInfo[player.Slot].ContainsKey(weaponDefIndex)) + { + // Random skins + 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; + + if (isKnife) return; + UpdatePlayerWeaponMeshGroupMask(player, weapon, !newPaints.Contains(fallbackPaintKit)); + return; + } + + if (!gPlayerWeaponsInfo[player.Slot].TryGetValue(weaponDefIndex, out var value) || value.Paint == 0) return; + + var weaponInfo = value; + //Log($"Apply on {weapon.DesignerName}({weapon.AttributeManager.Item.ItemDefinitionIndex}) paint {gPlayerWeaponPaints[steamId.SteamId64][weapon.AttributeManager.Item.ItemDefinitionIndex]} seed {gPlayerWeaponSeed[steamId.SteamId64][weapon.AttributeManager.Item.ItemDefinitionIndex]} wear {gPlayerWeaponWear[steamId.SteamId64][weapon.AttributeManager.Item.ItemDefinitionIndex]}"); + 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.Seed; + weapon.FallbackWear = weaponInfo.Wear; + CAttributeListSetOrAddAttributeValueByName.Invoke( + weapon.AttributeManager.Item.NetworkedDynamicAttributes.Handle, "set item texture prefab", + weapon.FallbackPaintKit); + + fallbackPaintKit = weapon.FallbackPaintKit; + + if (fallbackPaintKit == 0) + return; + + if (isKnife) return; + UpdatePlayerWeaponMeshGroupMask(player, weapon, !newPaints.Contains(fallbackPaintKit)); + } + + 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); + } + + private static bool PlayerHasKnife(CCSPlayerController? player) + { + if (!_config.Additional.KnifeEnabled) return false; + + if (player == null || !player.IsValid || !player.PlayerPawn.IsValid) return false; + + 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")) + return true; + } + + return false; + } + + private void RefreshWeapons(CCSPlayerController? player) + { + if (!g_bCommandsAllowed) 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; + + var weapons = player.PlayerPawn.Value.WeaponServices.MyWeapons; + + if (weapons.Count == 0) + return; + if (player.Team is CsTeam.None or CsTeam.Spectator) + return; + + int playerTeam = player.TeamNum; + + Dictionary> weaponsWithAmmo = []; + + foreach (var weapon in weapons) + { + if (!weapon.IsValid || weapon.Value == null || + !weapon.Value.IsValid || !weapon.Value.DesignerName.Contains("weapon_")) + continue; + + var gun = weapon.Value.As(); + + if (weapon.Value.Entity == null) continue; + if (!weapon.Value.OwnerEntity.IsValid) continue; + if (gun.Entity == null) continue; + if (!gun.IsValid) continue; + if (!gun.VisibleinPVS) continue; + + try + { + var weaponData = weapon.Value.As().VData; + + if (weaponData == null) continue; + + if (weaponData.GearSlot == gear_slot_t.GEAR_SLOT_RIFLE || + weaponData.GearSlot == gear_slot_t.GEAR_SLOT_PISTOL) + { + if (!WeaponDefindex.TryGetValue(weapon.Value.AttributeManager.Item.ItemDefinitionIndex, + out var weaponByDefindex)) + continue; + + var clip1 = weapon.Value.Clip1; + var reservedAmmo = weapon.Value.ReserveAmmo[0]; + + if (!weaponsWithAmmo.TryGetValue(weaponByDefindex, out var value)) + { + value = []; + weaponsWithAmmo.Add(weaponByDefindex, value); + } + + value.Add((clip1, reservedAmmo)); + + if (gun.VData == null) return; + + weapon.Value.Remove(); + } + } + catch (Exception ex) + { + Logger.LogWarning(ex.Message); + } + } + + try + { + player.ExecuteClientCommand("slot 3"); + player.ExecuteClientCommand("slot 3"); + + var weapon = player.PlayerPawn.Value.WeaponServices.ActiveWeapon; + if (!weapon.IsValid || weapon.Value == null) return; + var weaponData = weapon.Value.As().VData; + + if (weapon.Value.DesignerName.Contains("knife") || weaponData?.GearSlot == gear_slot_t.GEAR_SLOT_KNIFE) + { + CCSWeaponBaseGun gun; + + AddTimer(0.3f, () => + { + if (player.TeamNum != playerTeam) return; + + player.ExecuteClientCommand("slot 3"); + gun = weapon.Value.As(); + player.DropActiveWeapon(); + + AddTimer(0.7f, () => + { + if (player.TeamNum != playerTeam) return; + + if (!gun.IsValid || gun.State != CSWeaponState_t.WEAPON_NOT_CARRIED) return; + + gun.Remove(); + }); + + GiveKnifeToPlayer(player); + }); + } + } + catch (Exception ex) + { + Logger.LogWarning($"Cannot remove knife: {ex.Message}"); + } + + AddTimer(0.6f, () => + { + if (!g_bCommandsAllowed) return; + + foreach (var entry in weaponsWithAmmo) + foreach (var ammo in entry.Value) + { + var newWeapon = new CBasePlayerWeapon(player.GiveNamedItem(entry.Key)); + Server.NextFrame(() => + { + try + { + newWeapon.Clip1 = ammo.Item1; + newWeapon.ReserveAmmo[0] = ammo.Item2; + } + 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; + + var 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); + } + + Instance.AddTimer(0.06f, () => + { + var item = pawn.EconGloves; + try + { + if (!player.IsValid) + return; + + if (!player.PawnIsAlive) + return; + + if (!g_playersGlove.TryGetValue(player.Slot, out var gloveInfo) || gloveInfo == 0) return; + + var weaponInfo = gPlayerWeaponsInfo[player.Slot][gloveInfo]; + + item.ItemDefinitionIndex = gloveInfo; + item.ItemIDLow = 16384 & 0xFFFFFFFF; + item.ItemIDHigh = 16384; + + 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.Initialized = true; + + SetBodygroup(pawn.Handle, "default_gloves", 1); + } + catch (Exception) + { + } + }, TimerFlags.STOP_ON_MAPCHANGE); + } + + private static int GetRandomPaint(int defindex) + { + if (skinsList.Count == 0) + return 0; + + var 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; + } + + private static void SubclassChange(CBasePlayerWeapon weapon, ushort itemD) + { + var subclassChangeFunc = VirtualFunction.Create( + GameData.GetSignature("ChangeSubclass") + ); + + subclassChangeFunc(weapon.Handle, itemD.ToString()); + } + + private static void UpdateWeaponMeshGroupMask(CBaseEntity weapon, bool isLegacy = false) + { + if (weapon.CBodyComponent?.SceneNode == null) return; + var skeleton = weapon.CBodyComponent.SceneNode.GetSkeletonInstance(); + var value = (ulong)(isLegacy ? 2 : 1); + + if (skeleton.ModelState.MeshGroupMask != value) skeleton.ModelState.MeshGroupMask = value; + } + + private static void UpdatePlayerWeaponMeshGroupMask(CCSPlayerController player, CBasePlayerWeapon weapon, + bool isLegacy) + { + UpdateWeaponMeshGroupMask(weapon, isLegacy); + + var viewModel = GetPlayerViewModel(player); + if (viewModel == null || viewModel.Weapon.Value == null || + viewModel.Weapon.Value.Index != weapon.Index) return; + UpdateWeaponMeshGroupMask(viewModel, isLegacy); + Utilities.SetStateChanged(viewModel, "CBaseEntity", "m_CBodyComponent"); + } + + private static void GivePlayerAgent(CCSPlayerController player) + { + if (!g_playersAgent.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 + { + Server.NextFrame(() => + { + player.PlayerPawn.Value.SetModel( + $"characters/models/{model}.vmdl" + ); + }); + } + catch (Exception) + { + } + } + + private static void GivePlayerMusicKit(CCSPlayerController player) + { + if (!g_playersMusic.TryGetValue(player.Slot, out var value)) return; + if (player.InventoryServices == null) return; + + player.InventoryServices.MusicID = value; + Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInventoryServices"); + player.MusicKitID = value; + Utilities.SetStateChanged(player, "CCSPlayerController", "m_iMusicKitID"); + } + + 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.DesignerName.Contains("knife")) GivePlayerWeaponSkin(player, weapon); + } + } + + private void UpdatePlayerEconItemId(CEconItemView econItemView) + { + var itemId = _nextItemId++; + econItemView.ItemID = itemId; + + econItemView.ItemIDLow = (uint)itemId & 0xFFFFFFFF; + econItemView.ItemIDHigh = (uint)itemId >> 32; + } + + private static CCSPlayerController? GetPlayerFromItemServices(CCSPlayer_ItemServices itemServices) + { + 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; + } + + private static CBaseViewModel? GetPlayerViewModel(CCSPlayerController player) + { + if (player.PlayerPawn.Value == null || player.PlayerPawn.Value.ViewModelServices == null) return null; + CCSPlayer_ViewModelServices viewModelServices = new(player.PlayerPawn.Value.ViewModelServices!.Handle); + var ptr = viewModelServices.Handle + Schema.GetSchemaOffset("CCSPlayer_ViewModelServices", "m_hViewModel"); + var references = MemoryMarshal.CreateSpan(ref ptr, 3); + var viewModel = + (CHandle)Activator.CreateInstance(typeof(CHandle), references[0])!; + return viewModel.Value == null ? null : viewModel.Value; + } + + public static T[] GetFixedArray(nint pointer, string @class, string member, int length) + where T : CHandle + { + var ptr = pointer + Schema.GetSchemaOffset(@class, member); + var references = MemoryMarshal.CreateSpan(ref ptr, length); + var values = new T[length]; + + for (var i = 0; i < length; i++) values[i] = (T)Activator.CreateInstance(typeof(T), references[i])!; + + return values; + } } \ No newline at end of file diff --git a/WeaponInfo.cs b/WeaponInfo.cs index c1a97d58..7e347e35 100644 --- a/WeaponInfo.cs +++ b/WeaponInfo.cs @@ -2,8 +2,12 @@ { public class WeaponInfo { - public int Paint { get; set; } - public int Seed { get; set; } = 0; + public ushort Paint { get; set; } + public ushort Seed { get; set; } = 0; public float Wear { get; set; } = 0f; - } + public string? NameTag { get; set; } + public ushort Quality { get; set; } + public uint StatTrack { get; set; } + public bool StatTrackEnabled { get; set; } + } } \ No newline at end of file diff --git a/WeaponPaints.cs b/WeaponPaints.cs index d644a411..cb4a0a51 100644 --- a/WeaponPaints.cs +++ b/WeaponPaints.cs @@ -83,8 +83,10 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig g_playersGlove = new(); internal static ConcurrentDictionary g_playersMusic = new(); internal static ConcurrentDictionary g_playersAgent = new(); - internal static ConcurrentDictionary> gPlayerWeaponsInfo = new(); - internal static List skinsList = new(); + internal static ConcurrentDictionary> gPlayerWeaponsInfo = new(); + internal static ConcurrentDictionary g_playersDatabaseIndex = new(); + + internal static List skinsList = new(); internal static List glovesList = new(); internal static List agentsList = new(); internal static List musicList = new(); @@ -196,14 +198,14 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig { - if (weaponSync != null) await weaponSync.GetPlayerData(playerInfo); + if (weaponSync != null) await weaponSync.GetPlayerDatabaseIndex(playerInfo); }); } } diff --git a/WeaponSynchronization.cs b/WeaponSynchronization.cs index c8c04aec..71b2566c 100644 --- a/WeaponSynchronization.cs +++ b/WeaponSynchronization.cs @@ -1,287 +1,322 @@ -using Dapper; +using System.Collections.Concurrent; +using Dapper; using MySqlConnector; -using System.Collections.Concurrent; -namespace WeaponPaints +namespace WeaponPaints; + +internal class WeaponSynchronization { - internal class WeaponSynchronization - { - private readonly WeaponPaintsConfig _config; - private readonly Database _database; + private readonly WeaponPaintsConfig _config; + private readonly Database _database; - internal WeaponSynchronization(Database database, WeaponPaintsConfig config) - { - _database = database; - _config = config; - } + internal WeaponSynchronization(Database database, WeaponPaintsConfig config) + { + _database = database; + _config = config; + } - internal async Task GetPlayerData(PlayerInfo? player) - { - try - { - 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); - } - catch (Exception ex) - { - // Log the exception or handle it appropriately - Console.WriteLine($"An error occurred: {ex.Message}"); - } - } + internal async Task GetPlayerDatabaseIndex(PlayerInfo playerInfo) + { + if (playerInfo.SteamId == null || playerInfo.Slot == 0) return; + try + { + await using var connection = await _database.GetConnectionAsync(); + const string query = "SELECT `id` FROM `wp_users` WHERE `steamid` = @steamid"; + var databaseIndex = + await connection.QueryFirstOrDefaultAsync(query, new { steamid = playerInfo.SteamId }); - private void GetKnifeFromDatabase(PlayerInfo? player, MySqlConnection connection) - { - try - { - if (!_config.Additional.KnifeEnabled || string.IsNullOrEmpty(player?.SteamId)) - return; + if (databaseIndex != null) + { + WeaponPaints.g_playersDatabaseIndex[playerInfo.Slot] = (int)databaseIndex; + } + else + { + const string insertQuery = "INSERT INTO `wp_users` (`steamid`) VALUES (@steamid)"; + await connection.ExecuteAsync(insertQuery, new { steamid = playerInfo.SteamId }); + Console.WriteLine("SQL Insert Query: " + insertQuery); + databaseIndex = + await connection.QueryFirstOrDefaultAsync(query, new { steamid = playerInfo.SteamId }); + WeaponPaints.g_playersDatabaseIndex[playerInfo.Slot] = (int)databaseIndex; + } - const string query = "SELECT `knife` FROM `wp_player_knife` WHERE `steamid` = @steamid"; - var playerKnife = connection.QueryFirstOrDefault(query, new { steamid = player.SteamId }); + await GetPlayerData(playerInfo, connection); + } + catch (Exception ex) + { + Utility.Log($"An error occurred in GetPlayerDatabaseIndex: {ex.Message}"); + } + } - if (!string.IsNullOrEmpty(playerKnife)) - { - WeaponPaints.g_playersKnife[player.Slot] = playerKnife; - } - } - catch (Exception ex) - { - Utility.Log($"An error occurred in GetKnifeFromDatabase: {ex.Message}"); - } - } + internal async Task GetPlayerData(PlayerInfo? player, MySqlConnection connection) + { + try + { + 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); + } + catch (Exception ex) + { + // Log the exception or handle it appropriately + Console.WriteLine($"An error occurred: {ex.Message}"); + } + } - private void GetGloveFromDatabase(PlayerInfo? player, MySqlConnection connection) - { - try - { - if (!_config.Additional.GloveEnabled || string.IsNullOrEmpty(player?.SteamId)) - return; + private void GetKnifeFromDatabase(PlayerInfo? player, MySqlConnection connection) + { + try + { + if (!_config.Additional.KnifeEnabled || string.IsNullOrEmpty(player?.SteamId.ToString())) + return; - const string query = "SELECT `weapon_defindex` FROM `wp_player_gloves` WHERE `steamid` = @steamid"; - var gloveData = connection.QueryFirstOrDefault(query, new { steamid = player.SteamId }); + const string query = "SELECT `knife` FROM `wp_users_knife` WHERE `user_id` = @userId"; + var playerKnife = connection.QueryFirstOrDefault(query, + new { userId = WeaponPaints.g_playersDatabaseIndex[player.Slot] }); - if (gloveData != null) - { - WeaponPaints.g_playersGlove[player.Slot] = gloveData.Value; - } - } - catch (Exception ex) - { - Utility.Log($"An error occurred in GetGloveFromDatabase: {ex.Message}"); - } - } + if (!string.IsNullOrEmpty(playerKnife)) WeaponPaints.g_playersKnife[player.Slot] = playerKnife; + } + catch (Exception ex) + { + Utility.Log($"An error occurred in GetKnifeFromDatabase: {ex.Message}"); + } + } - private void GetAgentFromDatabase(PlayerInfo? player, MySqlConnection connection) - { - try - { - if (!_config.Additional.AgentEnabled || string.IsNullOrEmpty(player?.SteamId)) - return; + private void GetGloveFromDatabase(PlayerInfo? player, MySqlConnection connection) + { + try + { + if (!_config.Additional.GloveEnabled || string.IsNullOrEmpty(player?.SteamId.ToString())) + 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 }); + const string query = "SELECT `weapon_defindex` FROM `wp_users_gloves` WHERE `userId` = @userId"; + var gloveData = connection.QueryFirstOrDefault(query, new { userId = WeaponPaints.g_playersDatabaseIndex[player.Slot] }); - if (agentData == default) return; - var agentCT = agentData.Item1; - var agentT = agentData.Item2; + if (gloveData != null) WeaponPaints.g_playersGlove[player.Slot] = gloveData.Value; + } + catch (Exception ex) + { + Utility.Log($"An error occurred in GetGloveFromDatabase: {ex.Message}"); + } + } - if (!string.IsNullOrEmpty(agentCT) || !string.IsNullOrEmpty(agentT)) - { - WeaponPaints.g_playersAgent[player.Slot] = ( - agentCT, - agentT - ); - } - } - catch (Exception ex) - { - Utility.Log($"An error occurred in GetAgentFromDatabase: {ex.Message}"); - } - } + private void GetAgentFromDatabase(PlayerInfo? player, MySqlConnection connection) + { + try + { + if (!_config.Additional.AgentEnabled || string.IsNullOrEmpty(player?.SteamId.ToString())) + return; - private void GetWeaponPaintsFromDatabase(PlayerInfo? player, MySqlConnection connection) - { - try - { - if (!_config.Additional.SkinEnabled || player == null || string.IsNullOrEmpty(player.SteamId)) - return; + const string query = "SELECT `agent_ct`, `agent_t` FROM `wp_users_agents` WHERE `user_id` = @userId"; + var agentData = connection.QueryFirstOrDefault<(string, string)>(query, new { userId = WeaponPaints.g_playersDatabaseIndex[player.Slot] }); - var weaponInfos = new ConcurrentDictionary(); + if (agentData == default) return; + var agentCT = agentData.Item1; + var agentT = agentData.Item2; - const string query = "SELECT * FROM `wp_player_skins` WHERE `steamid` = @steamid"; - var playerSkins = connection.Query(query, new { steamid = player.SteamId }); + if (!string.IsNullOrEmpty(agentCT) || !string.IsNullOrEmpty(agentT)) + WeaponPaints.g_playersAgent[player.Slot] = ( + agentCT, + agentT + ); + } + catch (Exception ex) + { + Utility.Log($"An error occurred in GetAgentFromDatabase: {ex.Message}"); + } + } - 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; + private void GetWeaponPaintsFromDatabase(PlayerInfo? player, MySqlConnection connection) + { + try + { + if (!_config.Additional.SkinEnabled || player == null || string.IsNullOrEmpty(player.SteamId.ToString())) + return; - WeaponInfo weaponInfo = new WeaponInfo - { - Paint = weaponPaintId, - Seed = weaponSeed, - Wear = weaponWear - }; - - weaponInfos[weaponDefIndex] = weaponInfo; - } - - WeaponPaints.gPlayerWeaponsInfo[player.Slot] = 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` FROM `wp_player_music` WHERE `steamid` = @steamid"; - var musicData = connection.QueryFirstOrDefault(query, new { steamid = player.SteamId }); - - if (musicData != null) - { - WeaponPaints.g_playersMusic[player.Slot] = musicData.Value; - } - } - catch (Exception ex) - { - Utility.Log($"An error occurred in GetMusicFromDatabase: {ex.Message}"); - } - } + var weaponInfos = new ConcurrentDictionary(); + const string query = "SELECT `weapon`, `paint`, `wear`, `seed`, `nametag` FROM `wp_users_items` WHERE `user_id` = @userId"; + var playerSkins = connection.Query(query, new { userId = WeaponPaints.g_playersDatabaseIndex[player.Index] }); - internal async Task SyncKnifeToDatabase(PlayerInfo player, string knife) - { - if (!_config.Additional.KnifeEnabled || string.IsNullOrEmpty(player.SteamId) || string.IsNullOrEmpty(knife)) return; + foreach (var row in playerSkins) + { + ushort weaponDefIndex = row?.weapon_defindex ?? 0; + ushort weaponPaintId = row?.weapon_paint_id ?? 0; + float weaponWear = row?.weapon_wear ?? 0f; + ushort weaponSeed = row?.weapon_seed ?? 0; + string weaponNameTag = row?.nametag ?? string.Empty; - const string query = "INSERT INTO `wp_player_knife` (`steamid`, `knife`) VALUES(@steamid, @newKnife) ON DUPLICATE KEY UPDATE `knife` = @newKnife"; - - try - { - await using var connection = await _database.GetConnectionAsync(); - await connection.ExecuteAsync(query, new { steamid = player.SteamId, newKnife = knife }); - } - catch (Exception e) - { - Utility.Log($"Error syncing knife to database: {e.Message}"); - } - } + var weaponInfo = new WeaponInfo + { + Paint = weaponPaintId, + Seed = weaponSeed, + Wear = weaponWear, + NameTag = weaponNameTag + }; - internal async Task SyncGloveToDatabase(PlayerInfo player, int defindex) - { - if (!_config.Additional.GloveEnabled || string.IsNullOrEmpty(player.SteamId)) return; + weaponInfos[weaponDefIndex] = weaponInfo; + } - try - { - await using var connection = await _database.GetConnectionAsync(); - const string query = "INSERT INTO `wp_player_gloves` (`steamid`, `weapon_defindex`) VALUES(@steamid, @weapon_defindex) ON DUPLICATE KEY UPDATE `weapon_defindex` = @weapon_defindex"; - await connection.ExecuteAsync(query, new { steamid = player.SteamId, weapon_defindex = defindex }); - } - catch (Exception e) - { - Utility.Log($"Error syncing glove to database: {e.Message}"); - } - } + WeaponPaints.gPlayerWeaponsInfo[player.Slot] = weaponInfos; + } + catch (Exception ex) + { + Utility.Log($"An error occurred in GetWeaponPaintsFromDatabase: {ex.Message}"); + } + } - internal async Task SyncAgentToDatabase(PlayerInfo player) - { - if (!_config.Additional.AgentEnabled || string.IsNullOrEmpty(player.SteamId)) return; + private void GetMusicFromDatabase(PlayerInfo? player, MySqlConnection connection) + { + try + { + if (!_config.Additional.MusicEnabled || string.IsNullOrEmpty(player?.SteamId.ToString())) + 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(); + const string query = "SELECT `music` FROM `wp_users_music` WHERE `user_id` = @userId"; + var musicData = connection.QueryFirstOrDefault(query, new { userId = WeaponPaints.g_playersDatabaseIndex[player.Slot] }); - await connection.ExecuteAsync(query, new { steamid = player.SteamId, agent_ct = WeaponPaints.g_playersAgent[player.Slot].CT, agent_t = WeaponPaints.g_playersAgent[player.Slot].T }); - } - catch (Exception e) - { - Utility.Log($"Error syncing agents to database: {e.Message}"); - } - } + if (musicData != null) WeaponPaints.g_playersMusic[player.Slot] = musicData.Value; + } + catch (Exception ex) + { + Utility.Log($"An error occurred in GetMusicFromDatabase: {ex.Message}"); + } + } - internal async Task SyncWeaponPaintsToDatabase(PlayerInfo player) - { - if (string.IsNullOrEmpty(player.SteamId) || !WeaponPaints.gPlayerWeaponsInfo.TryGetValue(player.Slot, out var weaponsInfo)) - return; - try - { - await using var connection = await _database.GetConnectionAsync(); + internal async Task SyncKnifeToDatabase(PlayerInfo player, string knife) + { + if (!_config.Additional.KnifeEnabled || string.IsNullOrEmpty(player.SteamId.ToString()) || + string.IsNullOrEmpty(knife)) return; - foreach (var (weaponDefIndex, weaponInfo) in weaponsInfo) - { - var paintId = weaponInfo.Paint; - var wear = weaponInfo.Wear; - var seed = weaponInfo.Seed; + const string query = + "INSERT INTO `wp_users_knife` (`user_id`, `knife`) VALUES(@userId, @newKnife) ON DUPLICATE KEY UPDATE `knife` = @newKnife"; - const string queryCheckExistence = "SELECT COUNT(*) FROM `wp_player_skins` WHERE `steamid` = @steamid AND `weapon_defindex` = @weaponDefIndex"; + try + { + await using var connection = await _database.GetConnectionAsync(); + await connection.ExecuteAsync(query, new { userId = WeaponPaints.g_playersDatabaseIndex[player.Slot], newKnife = knife }); + } + catch (Exception e) + { + Utility.Log($"Error syncing knife to database: {e.Message}"); + } + } - var existingRecordCount = await connection.ExecuteScalarAsync(queryCheckExistence, new { steamid = player.SteamId, weaponDefIndex = weaponDefIndex }); + internal async Task SyncGloveToDatabase(PlayerInfo player, int defindex) + { + if (!_config.Additional.GloveEnabled || string.IsNullOrEmpty(player.SteamId.ToString())) return; - string query; - object parameters; + try + { + await using var connection = await _database.GetConnectionAsync(); + const string query = + "INSERT INTO `wp_users_gloves` (`user_id`, `weapon_defindex`) VALUES(@userId, @weapon_defindex) ON DUPLICATE KEY UPDATE `weapon_defindex` = @weapon_defindex"; + await connection.ExecuteAsync(query, new { userId = WeaponPaints.g_playersDatabaseIndex[player.Slot], weapon_defindex = defindex }); + } + catch (Exception e) + { + Utility.Log($"Error syncing glove to database: {e.Message}"); + } + } - if (existingRecordCount > 0) - { - query = "UPDATE `wp_player_skins` SET `weapon_paint_id` = @paintId, `weapon_wear` = @wear, `weapon_seed` = @seed WHERE `steamid` = @steamid AND `weapon_defindex` = @weaponDefIndex"; - parameters = new { steamid = player.SteamId, weaponDefIndex = weaponDefIndex, paintId, wear, seed }; - } - else - { - query = "INSERT INTO `wp_player_skins` (`steamid`, `weapon_defindex`, `weapon_paint_id`, `weapon_wear`, `weapon_seed`) " + - "VALUES (@steamid, @weaponDefIndex, @paintId, @wear, @seed)"; - parameters = new { steamid = player.SteamId, weaponDefIndex = weaponDefIndex, paintId, wear, seed }; - } + internal async Task SyncAgentToDatabase(PlayerInfo player) + { + if (!_config.Additional.AgentEnabled || string.IsNullOrEmpty(player.SteamId.ToString())) return; - await connection.ExecuteAsync(query, parameters); - } - } - catch (Exception e) - { - Utility.Log($"Error syncing weapon paints to database: {e.Message}"); - } - } + const string query = """ + INSERT INTO `wp_users_agents` (`user_id`, `agent_ct`, `agent_t`) + VALUES(@userId, @agent_ct, @agent_t) + ON DUPLICATE KEY UPDATE + `agent_ct` = @agent_ct, + `agent_t` = @agent_t + """; + try + { + await using var connection = await _database.GetConnectionAsync(); - internal async Task SyncMusicToDatabase(PlayerInfo player, ushort music) - { - if (!_config.Additional.MusicEnabled || string.IsNullOrEmpty(player.SteamId)) return; + await connection.ExecuteAsync(query, + new + { + userId = WeaponPaints.g_playersDatabaseIndex[player.Slot], agent_ct = WeaponPaints.g_playersAgent[player.Slot].CT, + agent_t = WeaponPaints.g_playersAgent[player.Slot].T + }); + } + catch (Exception e) + { + Utility.Log($"Error syncing agents to database: {e.Message}"); + } + } - try - { - await using var connection = await _database.GetConnectionAsync(); - const string query = "INSERT INTO `wp_player_music` (`steamid`, `music_id`) VALUES(@steamid, @newMusic) ON DUPLICATE KEY UPDATE `music_id` = @newMusic"; - await connection.ExecuteAsync(query, new { steamid = player.SteamId, newMusic = music }); - } - catch (Exception e) - { - Utility.Log($"Error syncing music kit to database: {e.Message}"); - } - } - } + internal async Task SyncWeaponPaintsToDatabase(PlayerInfo player) + { + if (string.IsNullOrEmpty(player.SteamId.ToString()) || + !WeaponPaints.gPlayerWeaponsInfo.TryGetValue(player.Slot, out var weaponsInfo)) + return; + + try + { + await using var connection = await _database.GetConnectionAsync(); + + foreach (var (weaponDefIndex, weaponInfo) in weaponsInfo) + { + var paintId = weaponInfo.Paint; + var wear = weaponInfo.Wear; + var seed = weaponInfo.Seed; + + const string queryCheckExistence = + "SELECT COUNT(*) FROM `wp_users_items` WHERE `user_id` = @userId AND `weapon_defindex` = @weaponDefIndex"; + + var existingRecordCount = await connection.ExecuteScalarAsync(queryCheckExistence, + new { userId = WeaponPaints.g_playersDatabaseIndex[player.Slot], weaponDefIndex }); + + string query; + object parameters; + + if (existingRecordCount > 0) + { + query = + "UPDATE `wp_users_items` SET `weapon_paint_id` = @paintId, `weapon_wear` = @wear, `weapon_seed` = @seed WHERE `user_id` = @userId AND `weapon_defindex` = @weaponDefIndex"; + parameters = new { userId = WeaponPaints.g_playersDatabaseIndex[player.Slot], weaponDefIndex, paintId, wear, seed }; + } + else + { + query = + "INSERT INTO `wp_users_items` (`user_id`, `weapon_defindex`, `weapon_paint_id`, `weapon_wear`, `weapon_seed`) " + + "VALUES (@userId, @weaponDefIndex, @paintId, @wear, @seed)"; + parameters = new { userId = WeaponPaints.g_playersDatabaseIndex[player.Slot], weaponDefIndex, paintId, wear, seed }; + } + + await connection.ExecuteAsync(query, parameters); + } + } + catch (Exception e) + { + Utility.Log($"Error syncing weapon paints to database: {e.Message}"); + } + } + + internal async Task SyncMusicToDatabase(PlayerInfo player, ushort music) + { + if (!_config.Additional.MusicEnabled || string.IsNullOrEmpty(player.SteamId.ToString())) return; + + try + { + await using var connection = await _database.GetConnectionAsync(); + const string query = + "INSERT INTO `wp_users_music` (`user_id`, `music_id`) VALUES(@userId, @newMusic) ON DUPLICATE KEY UPDATE `music_id` = @newMusic"; + await connection.ExecuteAsync(query, new { userId = WeaponPaints.g_playersDatabaseIndex[player.Slot], newMusic = music }); + } + catch (Exception e) + { + Utility.Log($"Error syncing music kit to database: {e.Message}"); + } + } } \ No newline at end of file diff --git a/website/class/database.php b/website/class/database.php index 2b4550f6..654abda9 100644 --- a/website/class/database.php +++ b/website/class/database.php @@ -1,29 +1,66 @@ 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 "

Problem with database!

"; die("
" . $ex . "
"); } } - 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); } - -} +} \ No newline at end of file diff --git a/website/class/header.php b/website/class/header.php new file mode 100644 index 00000000..8acb64ca --- /dev/null +++ b/website/class/header.php @@ -0,0 +1,71 @@ +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']}"); + } +} +?> diff --git a/website/class/utils.php b/website/class/utils.php index cc6e7168..d97f2ea6 100644 --- a/website/class/utils.php +++ b/website/class/utils.php @@ -1,99 +1,112 @@ $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; diff --git a/website/getskins.php b/website/getskins.php index 04895ff0..95539e97 100644 --- a/website/getskins.php +++ b/website/getskins.php @@ -8,7 +8,7 @@ $weapons = array ( "weapon_aug" => 8, "weapon_awp" => 9, "weapon_famas" => 10, -"weapon_g3sg1" => 11, +"weapon_g3sg1" => 10, "weapon_galilar" => 13, "weapon_m249" => 14, "weapon_m4a1" => 16, @@ -53,14 +53,7 @@ $weapons = array ( "weapon_knife_stiletto" => 522, "weapon_knife_widowmaker" => 523, "weapon_knife_skeleton" => 525); - - - -$ - -$json = json_decode(file_get_contents('https://bymykel.github.io/CSGO-API/api/en/skins.json')); - -die(var_dump($json)); +$json = json_decode(file_get_contents('skins.json')); echo "
";
 foreach($json as $skin)
 {
diff --git a/website/index.php b/website/index.php
index dca1be27..89e8e262 100644
--- a/website/index.php
+++ b/website/index.php
@@ -1,261 +1,36 @@
 select("SELECT `weapon_defindex`, `weapon_paint_id`, `weapon_wear`, `weapon_seed` FROM `wp_player_skins` WHERE `wp_player_skins`.`steamid` = :steamid", ["steamid" => $steamid]);
-	$selectedSkins = UtilsClass::getSelectedSkins($querySelected);
-	$selectedKnife = $db->select("SELECT * FROM `wp_player_knife` WHERE `wp_player_knife`.`steamid` = :steamid", ["steamid" => $steamid]);
-	$knifes = UtilsClass::getKnifeTypes();
-
-	if (isset($_POST['forma'])) {
-		$ex = explode("-", $_POST['forma']);
-
-		if ($ex[0] == "knife") {
-			$db->query("INSERT INTO `wp_player_knife` (`steamid`, `knife`) VALUES(:steamid, :knife) ON DUPLICATE KEY UPDATE `knife` = :knife", ["steamid" => $steamid, "knife" => $knifes[$ex[1]]['weapon_name']]);
-		} else {
-			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
-				if (array_key_exists($ex[0], $selectedSkins)) {
-					$db->query("UPDATE wp_player_skins SET weapon_paint_id = :weapon_paint_id, weapon_wear = :weapon_wear, weapon_seed = :weapon_seed WHERE steamid = :steamid AND weapon_defindex = :weapon_defindex", ["steamid" => $steamid, "weapon_defindex" => $ex[0], "weapon_paint_id" => $ex[1], "weapon_wear" => $wear, "weapon_seed" => $seed]);
-				} else {
-					$db->query("INSERT INTO wp_player_skins (`steamid`, `weapon_defindex`, `weapon_paint_id`, `weapon_wear`, `weapon_seed`) VALUES (:steamid, :weapon_defindex, :weapon_paint_id, :weapon_wear, :weapon_seed)", ["steamid" => $steamid, "weapon_defindex" => $ex[0], "weapon_paint_id" => $ex[1], "weapon_wear" => $wear, "weapon_seed" => $seed]);
-				}
-			}
-		}
-		header("Location: {$_SERVER['PHP_SELF']}");
-	}
-}
+require 'class/header.php';
 ?>
-
 
->
-
+>
 
-	
-	
-	
-	
-	
-	
-	CS2 Simple Weapon Paints
+    
+    
+    
+    
+    
+    
+    CS2 Simple Weapon Paints
 
-
 
-
-	

To choose weapon paints loadout, you need to "; - loginbutton("rectangle"); - echo "

"; - } else { - echo "

Your current weapon skin loadout Logout

"; - echo "
"; - ?> - -
-
-
- "; - echo "
Knife type
"; - echo "
{$actualKnife["paint_name"]}
"; - echo "
"; - echo ""; - ?> -
- -
-
- - $default) { ?> -
-
-
- "; - echo "
{$skins[$defindex][$selectedSkins[$defindex]['weapon_paint_id']]["paint_name"]}
"; - echo "
"; - echo ""; - } else { - echo "
"; - echo "
{$default["paint_name"]}
"; - echo "
"; - echo ""; - } - ?> -
- - - - - - -
- - - - - - -
- -
+ +

To choose weapon paints loadout, you need to

+ +

Your current weapon skin loadout ?logout'>Logout

+
+ + + + +
+ + +
+ +
- diff --git a/website/steamauth/licence.txt b/website/steamauth/licence.txt new file mode 100644 index 00000000..d5223517 --- /dev/null +++ b/website/steamauth/licence.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Benjamin Smith + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/website/steamauth/steamauth.php b/website/steamauth/steamauth.php index 89fcf340..2b8dfae2 100644 --- a/website/steamauth/steamauth.php +++ b/website/steamauth/steamauth.php @@ -1,9 +1,11 @@ "; //logout button + echo "
"; //logout button } function loginbutton($buttonstyle = "square") { diff --git a/website/steamauth/userInfo.php b/website/steamauth/userInfo.php index 5cdf77e5..3fcdedc1 100644 --- a/website/steamauth/userInfo.php +++ b/website/steamauth/userInfo.php @@ -7,7 +7,6 @@ if (empty($_SESSION['steam_uptodate']) or empty($_SESSION['steam_personaname'])) $_SESSION['steam_communityvisibilitystate'] = $content['response']['players'][0]['communityvisibilitystate']; $_SESSION['steam_profilestate'] = $content['response']['players'][0]['profilestate']; $_SESSION['steam_personaname'] = $content['response']['players'][0]['personaname']; - $_SESSION['steam_lastlogoff'] = $content['response']['players'][0]['lastlogoff']; $_SESSION['steam_profileurl'] = $content['response']['players'][0]['profileurl']; $_SESSION['steam_avatar'] = $content['response']['players'][0]['avatar']; $_SESSION['steam_avatarmedium'] = $content['response']['players'][0]['avatarmedium']; @@ -27,7 +26,6 @@ $steamprofile['steamid'] = $_SESSION['steam_steamid']; $steamprofile['communityvisibilitystate'] = $_SESSION['steam_communityvisibilitystate']; $steamprofile['profilestate'] = $_SESSION['steam_profilestate']; $steamprofile['personaname'] = $_SESSION['steam_personaname']; -$steamprofile['lastlogoff'] = $_SESSION['steam_lastlogoff']; $steamprofile['profileurl'] = $_SESSION['steam_profileurl']; $steamprofile['avatar'] = $_SESSION['steam_avatar']; $steamprofile['avatarmedium'] = $_SESSION['steam_avatarmedium']; diff --git a/website/style.css b/website/style.css index 43f6cdd4..af64ad2f 100644 --- a/website/style.css +++ b/website/style.css @@ -1,16 +1,16 @@ .bg-primary { - padding: 15px; + padding: 15px; } -.card-title item-name { +.card-title item-name{ //text-align:center; - font-weight: bold; + font-weight:bold; } .skin-image { margin: 0 auto; - display: block; - text-align: center; - width: 50%; + display:block; + text-align:center; + width:50%; //border-bottom: solid 1px #eee; -} \ No newline at end of file +} diff --git a/website/view/display_gloves.php b/website/view/display_gloves.php new file mode 100644 index 00000000..1ffc02f9 --- /dev/null +++ b/website/view/display_gloves.php @@ -0,0 +1,42 @@ +
+
+
+ "; + echo "
Knife type
"; + echo "
{$actualGloves["paint_name"]}
"; + echo "
"; + echo ""; + ?> +
+ +
+ diff --git a/website/view/display_knife.php b/website/view/display_knife.php new file mode 100644 index 00000000..8be708bb --- /dev/null +++ b/website/view/display_knife.php @@ -0,0 +1,42 @@ +
+
+
+ "; + echo "
Knife type
"; + echo "
{$actualKnife["paint_name"]}
"; + echo "
"; + echo ""; + ?> +
+ +
+ diff --git a/website/view/display_weapons.php b/website/view/display_weapons.php new file mode 100644 index 00000000..e8a22337 --- /dev/null +++ b/website/view/display_weapons.php @@ -0,0 +1,154 @@ + $default) { +?> +
+
+
+ "; + echo "
{$skins[$defindex][$selectedSkins[$defindex]['weapon_paint_id']]["paint_name"]}
"; + echo "
"; + echo ""; + } else { + echo "
"; + echo "
{$default["paint_name"]}
"; + echo "
"; + echo ""; + } + ?> +
+ + + + + + +
+ + + +