diff --git a/Config.cs b/Config.cs index a5ad70a3..be606645 100644 --- a/Config.cs +++ b/Config.cs @@ -65,7 +65,7 @@ namespace WeaponPaints public class WeaponPaintsConfig : BasePluginConfig { - [JsonPropertyName("ConfigVersion")] public override int Version { get; set; } = 7; + [JsonPropertyName("ConfigVersion")] public override int Version { get; set; } = 8; [JsonPropertyName("SkinsLanguage")] public string SkinsLanguage { get; set; } = "en"; @@ -91,7 +91,7 @@ namespace WeaponPaints [JsonPropertyName("Website")] public string Website { get; set; } = "example.com/skins"; - [JsonPropertyName("Additionalss")] + [JsonPropertyName("Additional")] public Additional Additional { get; set; } = new(); } } \ No newline at end of file diff --git a/Events.cs b/Events.cs index 97513753..1570eaa0 100644 --- a/Events.cs +++ b/Events.cs @@ -4,8 +4,6 @@ using CounterStrikeSharp.API.Core.Attributes.Registration; using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; -using System.Runtime.InteropServices; -using System.Collections.Concurrent; namespace WeaponPaints { @@ -81,8 +79,9 @@ namespace WeaponPaints if (!GPlayerWeaponsInfo.TryGetValue(player.Slot, out var weaponInfos)) return HookResult.Continue; - - _ = Task.Run(async () => await SyncStatTrakForPlayer(playerInfo, weaponInfos)); + + if (WeaponSync != null) + _ = Task.Run(async () => await WeaponSync.SyncStatTrakToDatabase(playerInfo, weaponInfos)); if (Config.Additional.SkinEnabled) { @@ -110,31 +109,10 @@ namespace WeaponPaints } _temporaryPlayerWeaponWear.TryRemove(player.Slot, out _); - CommandsCooldown.Remove(player.Slot); return HookResult.Continue; } - - public async Task SyncStatTrakForPlayer(PlayerInfo playerInfo, ConcurrentDictionary weaponInfos) - { - if (WeaponSync == null || weaponInfos == null || weaponInfos.Count == 0) return; - - var statTrakWeapons = weaponInfos - .Where(w => w.Value.StatTrak) - .ToDictionary(w => w.Key, w => w.Value.StatTrakCount); - - if (statTrakWeapons.Count == 0) return; - - try - { - await WeaponSync.SyncStatTrakToDatabase(playerInfo, statTrakWeapons); - } - catch (Exception ex) - { - Utility.Log($"Error syncing StatTrak for player {playerInfo.SteamId}: {ex.Message}"); - } - } private void OnMapStart(string mapName) { @@ -286,30 +264,18 @@ namespace WeaponPaints int weaponDefIndex = weapon.AttributeManager.Item.ItemDefinitionIndex; - if (!GPlayerWeaponsInfo[player.Slot].TryGetValue(weaponDefIndex, out var value) || value.Paint == 0) return HookResult.Continue; - - var weaponInfo = value; - - if (weaponInfo.StatTrak) - { - weaponInfo.StatTrakCount += 1; - - 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] - }; - - 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); + if (!GPlayerWeaponsInfo[player.Slot].TryGetValue(weaponDefIndex, out var weaponInfo) || weaponInfo.Paint == 0) + return HookResult.Continue; + + if (!weaponInfo.StatTrak) return HookResult.Continue; + + weaponInfo.StatTrakCount += 1; - 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); - } + 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; } diff --git a/VERSION b/VERSION index 4b887540..4818b1b8 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.6a \ No newline at end of file +2.7a \ No newline at end of file diff --git a/WeaponAction.cs b/WeaponAction.cs index 5f13c1b2..6724cd82 100644 --- a/WeaponAction.cs +++ b/WeaponAction.cs @@ -6,7 +6,6 @@ using CounterStrikeSharp.API.Modules.Timers; using CounterStrikeSharp.API.Modules.Utils; using Microsoft.Extensions.Logging; using System.Collections.Concurrent; -using System.Linq.Expressions; using System.Runtime.InteropServices; namespace WeaponPaints @@ -518,21 +517,7 @@ namespace WeaponPaints 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 float ViewAsFloat(uint value) + private static float ViewAsFloat(uint value) { return BitConverter.Int32BitsToSingle((int)value); } diff --git a/WeaponInfo.cs b/WeaponInfo.cs index 7f89ebb3..1bd66f6a 100644 --- a/WeaponInfo.cs +++ b/WeaponInfo.cs @@ -3,13 +3,13 @@ public class WeaponInfo { public int Paint { get; set; } - public int Seed { get; set; } = 0; - public float Wear { get; set; } = 0f; + public int Seed { get; set; } + public float Wear { get; set; } public string Nametag { get; set; } = ""; public bool StatTrak { get; set; } = false; - public int StatTrakCount { get; set; } = 0; + public int StatTrakCount { get; set; } public KeyChainInfo? KeyChain { get; set; } - public List Stickers { get; set; } = new List(); + public List Stickers { get; set; } = new(); } public class StickerInfo diff --git a/WeaponPaints.cs b/WeaponPaints.cs index f9e75230..9bb28247 100644 --- a/WeaponPaints.cs +++ b/WeaponPaints.cs @@ -16,7 +16,7 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig "Nereziel & daffyy"; public override string ModuleDescription => "Skin, gloves, agents and knife selector, standalone and web-based"; public override string ModuleName => "WeaponPaints"; - public override string ModuleVersion => "2.6a"; + public override string ModuleVersion => "2.7a"; public override void Load(bool hotReload) { @@ -53,6 +53,8 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig OnAllPluginsLoaded(hotReload)); } Utility.LoadSkinsFromFile(ModuleDirectory + $"/data/skins_{_config.SkinsLanguage}.json", Logger); diff --git a/WeaponSynchronization.cs b/WeaponSynchronization.cs index 3603018c..801bdc8e 100644 --- a/WeaponSynchronization.cs +++ b/WeaponSynchronization.cs @@ -373,9 +373,17 @@ namespace WeaponPaints } } - internal async Task SyncStatTrakToDatabase(PlayerInfo player, Dictionary weaponStatTrakCounts) + internal async Task SyncStatTrakToDatabase(PlayerInfo player, ConcurrentDictionary weaponInfos) { - if (string.IsNullOrEmpty(player.SteamId) || weaponStatTrakCounts == null || weaponStatTrakCounts.Count == 0) + if (WeaponPaints.WeaponSync == null || weaponInfos.IsEmpty) return; + + var statTrakWeapons = weaponInfos + .Where(w => w.Value is { StatTrak: true, StatTrakCount: > 0 }) + .ToDictionary(w => w.Key, w => w.Value.StatTrakCount); + + if (statTrakWeapons.Count == 0) return; + + if (string.IsNullOrEmpty(player.SteamId)) return; try @@ -383,11 +391,8 @@ namespace WeaponPaints await using var connection = await _database.GetConnectionAsync(); await using var transaction = await connection.BeginTransactionAsync(); - foreach (var weapon in weaponStatTrakCounts) + foreach (var (defindex, statTrakCount) in statTrakWeapons) { - int defindex = weapon.Key; - int statTrakCount = weapon.Value; - const string query = @" INSERT INTO `wp_player_skins` (`steamid`, `weapon_defindex`, `weapon_stattrak_count`) VALUES (@steamid, @weaponDefIndex, @StatTrakCount) @@ -407,7 +412,7 @@ namespace WeaponPaints } catch (Exception e) { - Utility.Log($"Error syncing weapon paints to database: {e.Message}"); + Utility.Log($"Error syncing stattrak to database: {e.Message}"); } } }