diff --git a/.gitignore b/.gitignore index 83917490..47f2b2bb 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ bin/ obj/ website/getskins.php +.idea/ \ No newline at end of file diff --git a/Commands.cs b/Commands.cs index c683ac48..10091103 100644 --- a/Commands.cs +++ b/Commands.cs @@ -1,4 +1,5 @@ -using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Menu; using Newtonsoft.Json.Linq; @@ -34,30 +35,8 @@ namespace WeaponPaints if (weaponSync != null) { _ = 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)); - } - */ - RefreshGloves(player); + GivePlayerGloves(player); RefreshWeapons(player); } @@ -358,76 +337,71 @@ namespace WeaponPaints var selectedGlove = glovesList.FirstOrDefault(g => g.ContainsKey("paint_name") && g["paint_name"]?.ToString() == selectedPaintName); var image = selectedGlove?["image"]?.ToString() ?? ""; - if ( - selectedGlove != null && - selectedGlove.ContainsKey("weapon_defindex") && - selectedGlove.ContainsKey("paint") && - int.TryParse(selectedGlove["weapon_defindex"]?.ToString(), out var weaponDefindex) && - int.TryParse(selectedGlove["paint"]?.ToString(), out var paint) - ) + if (selectedGlove == null || + !selectedGlove.ContainsKey("weapon_defindex") || + !selectedGlove.ContainsKey("paint") || + !int.TryParse(selectedGlove["weapon_defindex"]?.ToString(), out var weaponDefindex) || + !int.TryParse(selectedGlove["paint"]?.ToString(), out var paint)) return; + if (Config.Additional.ShowSkinImage) { - if (Config.Additional.ShowSkinImage) - { - PlayerWeaponImage[player.Slot] = image; - AddTimer(2.0f, () => PlayerWeaponImage.Remove(player.Slot), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - } - - PlayerInfo 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] - }; - - if (paint != 0) - { - g_playersGlove[player.Slot] = (ushort)weaponDefindex; - - if (!gPlayerWeaponsInfo[player.Slot].ContainsKey(weaponDefindex)) - { - WeaponInfo weaponInfo = new() - { - Paint = paint - }; - gPlayerWeaponsInfo[player.Slot][weaponDefindex] = weaponInfo; - } - } - else - { - g_playersGlove.TryRemove(player.Slot, out _); - } - - if (!string.IsNullOrEmpty(Localizer["wp_glove_menu_select"])) - { - player!.Print(Localizer["wp_glove_menu_select", selectedPaintName]); - } - - if (weaponSync != null) - { - _ = Task.Run(async () => - { - await weaponSync.SyncGloveToDatabase(playerInfo, weaponDefindex); - - if (!gPlayerWeaponsInfo[playerInfo.Slot].TryGetValue(weaponDefindex, out var value)) - { - value = new WeaponInfo(); - gPlayerWeaponsInfo[playerInfo.Slot][weaponDefindex] = value; - } - - value.Paint = paint; - value.Wear = 0.00f; - value.Seed = 0; - - await weaponSync.SyncWeaponPaintsToDatabase(playerInfo); - }); - } - - RefreshGloves(player); + PlayerWeaponImage[player.Slot] = image; + AddTimer(2.0f, () => PlayerWeaponImage.Remove(player.Slot), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } - ; + + PlayerInfo 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] + }; + + if (paint != 0) + { + g_playersGlove[player.Slot] = (ushort)weaponDefindex; + + if (!gPlayerWeaponsInfo[player.Slot].ContainsKey(weaponDefindex)) + { + WeaponInfo weaponInfo = new() + { + Paint = paint + }; + gPlayerWeaponsInfo[player.Slot][weaponDefindex] = weaponInfo; + } + } + else + { + g_playersGlove.TryRemove(player.Slot, out _); + } + + if (!string.IsNullOrEmpty(Localizer["wp_glove_menu_select"])) + { + player!.Print(Localizer["wp_glove_menu_select", selectedPaintName]); + } + + if (weaponSync == null) return; + + _ = Task.Run(async () => + { + await weaponSync.SyncGloveToDatabase(playerInfo, weaponDefindex); + + if (!gPlayerWeaponsInfo[playerInfo.Slot].TryGetValue(weaponDefindex, out var value)) + { + value = new WeaponInfo(); + gPlayerWeaponsInfo[playerInfo.Slot][weaponDefindex] = value; + } + + value.Paint = paint; + value.Wear = 0.00f; + value.Seed = 0; + + await weaponSync.SyncWeaponPaintsToDatabase(playerInfo); + }); + + AddTimer(0.1f, () => GivePlayerGloves(player)); + AddTimer(0.15f, () => GivePlayerGloves(player)); }; // Add weapon options to the weapon selection menu diff --git a/Events.cs b/Events.cs index 51c68b36..9c0e8ca6 100644 --- a/Events.cs +++ b/Events.cs @@ -15,10 +15,10 @@ namespace WeaponPaints { CCSPlayerController? player = @event.Userid; - if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || player.SteamID.ToString().Length != 17 || + if (player is null || !player.IsValid || player.IsBot || weaponSync == null || _database == null) return HookResult.Continue; - PlayerInfo? playerInfo = new PlayerInfo + PlayerInfo playerInfo = new PlayerInfo { UserId = player.UserId, Slot = player.Slot, @@ -64,20 +64,9 @@ namespace WeaponPaints [GameEventHandler] public HookResult OnPlayerDisconnect(EventPlayerDisconnect @event, GameEventInfo info) { - CCSPlayerController player = @event.Userid; + CCSPlayerController? player = @event.Userid; - if (player is null || !player.IsValid || player.IsBot || - player.IsHLTV || player.SteamID.ToString().Length != 17) return HookResult.Continue; - - PlayerInfo 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] - }; + if (player is null || !player.IsValid || player.IsBot) return HookResult.Continue; if (Config.Additional.SkinEnabled) { @@ -104,80 +93,7 @@ namespace WeaponPaints return HookResult.Continue; } - - 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; - } - - int weaponDefIndex = weapon.AttributeManager.Item.ItemDefinitionIndex; - int fallbackPaintKit = 0; - - if (_config.Additional.GiveRandomSkin && - !gPlayerWeaponsInfo[player.Slot].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.000001f; - 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)); - 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 void OnMapStart(string mapName) { if (Config.Additional is { KnifeEnabled: false, SkinEnabled: false, GloveEnabled: false }) return; @@ -202,11 +118,7 @@ namespace WeaponPaints GivePlayerMusicKit(player); GivePlayerAgent(player); - - Server.NextFrame(() => - { - RefreshGloves(player); - }); + GivePlayerGloves(player); return HookResult.Continue; } @@ -294,8 +206,8 @@ namespace WeaponPaints foreach (var player in Utilities.GetPlayers().Where(p => p is { IsValid: true, PlayerPawn.IsValid: true } && - (LifeState_t)p.LifeState == LifeState_t.LIFE_ALIVE && p.SteamID.ToString().Length == 17 - && !p.IsBot && p is { IsHLTV: false, Connected: PlayerConnectedState.PlayerConnected } + (LifeState_t)p.LifeState == LifeState_t.LIFE_ALIVE + && !p.IsBot && p is { Connected: PlayerConnectedState.PlayerConnected } ) ) { @@ -305,6 +217,20 @@ namespace WeaponPaints } } } + + [GameEventHandler] + public HookResult OnItemPickup(EventItemPickup @event, GameEventInfo _) + { + if (!IsWindows) return HookResult.Continue; + + var player = @event.Userid; + if (player != null && player is { IsValid: true, Connected: PlayerConnectedState.PlayerConnected, PawnIsAlive: true, PlayerPawn.IsValid: true }) + { + GiveOnItemPickup(player); + } + + return HookResult.Continue; + } private void RegisterListeners() { @@ -318,7 +244,7 @@ namespace WeaponPaints if (Config.Additional.ShowSkinImage) RegisterListener(OnTick); - if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + if (!IsWindows) VirtualFunctions.GiveNamedItemFunc.Hook(OnGiveNamedItemPost, HookMode.Post); } } diff --git a/Utility.cs b/Utility.cs index 54758988..cda54412 100644 --- a/Utility.cs +++ b/Utility.cs @@ -91,7 +91,7 @@ namespace WeaponPaints internal static void LoadSkinsFromFile(string filePath, ILogger logger) { - string json = File.ReadAllText(filePath); + var json = File.ReadAllText(filePath); try { var deserializedSkins = JsonConvert.DeserializeObject>(json); diff --git a/VERSION b/VERSION index 832b7c58..0699a485 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.4e \ No newline at end of file +2.5a \ No newline at end of file diff --git a/WeaponAction.cs b/WeaponAction.cs index 26b29545..9c994a98 100644 --- a/WeaponAction.cs +++ b/WeaponAction.cs @@ -11,6 +11,87 @@ namespace 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; @@ -178,12 +259,12 @@ namespace WeaponPaints }, TimerFlags.STOP_ON_MAPCHANGE); } - private static void RefreshGloves(CCSPlayerController player) + 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 || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) + if (pawn == null || !pawn.IsValid) return; var model = pawn.CBodyComponent?.SceneNode?.GetSkeletonInstance()?.ModelState.ModelName ?? string.Empty; @@ -218,7 +299,7 @@ namespace WeaponPaints item.Initialized = true; - CBaseModelEntitySetBodygroup.Invoke(pawn, "default_gloves", 1); + SetBodygroup(pawn.Handle, "default_gloves", 1); } catch (Exception) { } }, TimerFlags.STOP_ON_MAPCHANGE); @@ -302,10 +383,37 @@ namespace WeaponPaints { if (!g_playersMusic.TryGetValue(player.Slot, out var value)) return; if (player.InventoryServices == null) return; - - Console.WriteLine(value); - + 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) diff --git a/WeaponPaints.cs b/WeaponPaints.cs index 3b60fac1..d644a411 100644 --- a/WeaponPaints.cs +++ b/WeaponPaints.cs @@ -7,10 +7,11 @@ using Microsoft.Extensions.Logging; using MySqlConnector; using Newtonsoft.Json.Linq; using System.Collections.Concurrent; +using System.Runtime.InteropServices; namespace WeaponPaints; -[MinimumApiVersion(215)] +[MinimumApiVersion(230)] public partial class WeaponPaints : BasePlugin, IPluginConfig { internal static WeaponPaints Instance { get; private set; } = new(); @@ -96,8 +97,10 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig CAttributeListSetOrAddAttributeValueByName = new(GameData.GetSignature("CAttributeList_SetOrAddAttributeValueByName")); - private static readonly MemoryFunctionVoid CBaseModelEntitySetBodygroup = - new(GameData.GetSignature("CBaseModelEntity_SetBodygroup")); + private static readonly MemoryFunctionWithReturn SetBodygroupFunc = new( + GameData.GetSignature("CBaseModelEntity_SetBodygroup")); + + private static readonly Func SetBodygroup = SetBodygroupFunc.Invoke; private static Dictionary WeaponDefindex { get; } = new Dictionary { @@ -158,16 +161,15 @@ 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.4e"; - - public static WeaponPaintsConfig GetWeaponPaintsConfig() - { - return _config; - } + public override string ModuleVersion => "2.5a"; public override void Load(bool hotReload) { @@ -177,7 +179,11 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig(Utilities.GetPlayers().TakeWhile(player => weaponSync != null)).Where(player => player.IsValid && player.SteamID.ToString().Length == 17 && !string.IsNullOrEmpty(player.IpAddress) && player is { IsBot: false, IsHLTV: false, Connected: PlayerConnectedState.PlayerConnected })) + foreach (var player in Enumerable + .OfType(Utilities.GetPlayers().TakeWhile(player => weaponSync != null)) + .Where(player => player.IsValid && + !string.IsNullOrEmpty(player.IpAddress) && player is + { IsBot: false, Connected: PlayerConnectedState.PlayerConnected })) { g_knifePickupCount[player.Slot] = 0; gPlayerWeaponsInfo.TryRemove(player.Slot, out _); @@ -226,11 +232,18 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig - + diff --git a/gamedata/weaponpaints.json b/gamedata/weaponpaints.json index 69f8c130..6f2beaf2 100644 --- a/gamedata/weaponpaints.json +++ b/gamedata/weaponpaints.json @@ -3,7 +3,7 @@ "signatures": { "library": "server", "windows": "\\x48\\x89\\x5C\\x24\\x08\\x57\\x48\\x83\\xEC\\x20\\x48\\x8B\\xDA\\x48\\x8B\\xF9\\xE8\\x2A\\x2A\\x2A\\x2A\\x84\\xC0\\x74\\x2A\\x41\\xB0\\x01", - "linux": "\\x55\\x48\\x89\\xE5\\x41\\x57\\x41\\x56\\x41\\x55\\x49\\x89\\xF5\\x41\\x54\\x49\\x89\\xFC\\x53\\x48\\x81\\xEC\\xA8\\x00\\x00\\x00" + "linux": "55 48 89 E5 41 57 41 56 49 89 FE 41 55 41 54 45 31 E4 53 48 81 EC 98 00 00 00 48 85 F6 74 ? 80 3E 00 49 89 F5 75 ? 48 81 C4 98 00 00 00 44 89 E6 4C 89 F7 5B 41 5C 41 5D 41 5E 41 5F 5D E9 ? ? ? ? 0F 1F 44 00 00 4C 8D BD 40 FF FF FF 48 89 F7 E8 ? ? ? ? 45 31 C0 4C 89 EA 31 F6 49 89 C4 4C 89 FF 89 C3 48 C7 85 48 FF FF FF 00 00 00 00 48 B8 00 00 00 00 80 00 00 C0 44 89 E1 48 89 85 40 FF FF FF E8 ? ? ? ? 31 F6 4C 89 FF E8 ? ? ? ? 48 8D 8D 48 FF FF FF F6 85 47 FF FF FF 40 75 ? F7 85 44 FF FF FF FF FF FF 3F 48 8D 0D F3 D1 C7 00" } }, "CAttributeList_SetOrAddAttributeValueByName": {