From 14e285d44fd07e930c089d61b7eb700a2733a935 Mon Sep 17 00:00:00 2001 From: Dawid Bepierszcz <41084667+daffyyyy@users.noreply.github.com> Date: Fri, 26 Jan 2024 17:53:11 +0100 Subject: [PATCH] 1.4b - Probably fixed empty skin --- Events.cs | 60 ++++++++++++++++++++++++++++++++++++++--------- PluginServices.cs | 1 - VERSION | 2 +- WeaponAction.cs | 41 +++++++++++++++++++++++++------- WeaponPaints.cs | 6 ++--- 5 files changed, 85 insertions(+), 25 deletions(-) delete mode 100644 PluginServices.cs diff --git a/Events.cs b/Events.cs index 315f4438..583d4b59 100644 --- a/Events.cs +++ b/Events.cs @@ -1,22 +1,19 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Entities; namespace WeaponPaints { public partial class WeaponPaints { - private void OnClientAuthorized(int playerSlot, SteamID steamID) + private void OnClientPutInServer(int playerSlot) { - int playerIndex = playerSlot + 1; - - CCSPlayerController? player = Utilities.GetPlayerFromIndex(playerIndex); + CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot); PlayerInfo playerInfo = new PlayerInfo { UserId = player.UserId, Index = (int)player.Index, - SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + SteamId = player.SteamID.ToString(), Name = player?.PlayerName, IpAddress = player?.IpAddress?.Split(":")[0] }; @@ -138,7 +135,7 @@ namespace WeaponPaints if (player == null || player.IsBot || player.IsHLTV) return HookResult.Continue; - if (player == null || !player.IsValid || player.AuthorizedSteamID == null || + if (player == null || !player.IsValid || player.SteamID.ToString() == "" || !g_knifePickupCount.ContainsKey((int)player.Index) || !g_playersKnife.ContainsKey((int)player.Index)) return HookResult.Continue; @@ -184,14 +181,14 @@ namespace WeaponPaints foreach (CCSPlayerController player in players) { - if (player.IsBot || player.IsHLTV || player.AuthorizedSteamID == null) continue; + if (player.IsBot || player.IsHLTV || player.SteamID.ToString() == "") continue; if (gPlayerWeaponsInfo.ContainsKey((int)player.Index)) continue; PlayerInfo playerInfo = new PlayerInfo { UserId = player.UserId, Index = (int)player.Index, - SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + SteamId = player?.SteamID.ToString(), Name = player?.PlayerName, IpAddress = player?.IpAddress?.Split(":")[0] }; @@ -214,7 +211,7 @@ namespace WeaponPaints { UserId = player.UserId, Index = (int)player.Index, - SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(), + SteamId = player?.SteamID.ToString(), Name = player?.PlayerName, IpAddress = player?.IpAddress?.Split(":")[0] }; @@ -276,12 +273,52 @@ namespace WeaponPaints return HookResult.Continue; } + private void OnTick() + { + foreach (var player in Utilities.GetPlayers()) + { + try + { + if (player == null || !player.IsValid || !player.PawnIsAlive || player.IsBot || player.IsHLTV) continue; + + var viewModels = GetPlayerViewModels(player); + + if (viewModels == null) continue; + + var viewModel = viewModels[0]; + if (viewModel == null || viewModel.Value == null || viewModel.Value.Weapon == null || viewModel.Value.Weapon.Value == null) continue; + CBasePlayerWeapon weapon = viewModel.Value.Weapon.Value; + + if (weapon == null || !weapon.IsValid) continue; + + var isKnife = viewModel.Value.VMName.Contains("knife"); + + if (!isKnife) + { + if ( + viewModel.Value.CBodyComponent != null + && viewModel.Value.CBodyComponent.SceneNode != null + ) + { + var skeleton = GetSkeletonInstance(viewModel.Value.CBodyComponent.SceneNode); + skeleton.ModelState.MeshGroupMask = 2; + } + + Utilities.SetStateChanged(viewModel.Value, "CBaseEntity", "m_CBodyComponent"); + } + } + catch (Exception) + { } + } + } + private void RegisterListeners() { RegisterListener(OnEntityCreated); - RegisterListener(OnClientAuthorized); + RegisterListener(OnClientPutInServer); RegisterListener(OnClientDisconnect); RegisterListener(OnMapStart); + RegisterListener(OnTick); RegisterEventHandler(OnPlayerConnectFull); RegisterEventHandler(OnPlayerSpawn); @@ -292,6 +329,7 @@ namespace WeaponPaints HookEntityOutput("weapon_knife", "OnPlayerPickup", OnPickup, HookMode.Pre); } + /* WORKAROUND FOR CLIENTS WITHOUT STEAMID ON AUTHORIZATION */ /*private HookResult OnPlayerConnectFull(EventPlayerConnectFull @event, GameEventInfo info) { diff --git a/PluginServices.cs b/PluginServices.cs deleted file mode 100644 index 5f282702..00000000 --- a/PluginServices.cs +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/VERSION b/VERSION index 2b2bf49a..4abff1d1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.4a \ No newline at end of file +1.4b \ No newline at end of file diff --git a/WeaponAction.cs b/WeaponAction.cs index 8203090f..67659f1b 100644 --- a/WeaponAction.cs +++ b/WeaponAction.cs @@ -3,6 +3,7 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Utils; using Microsoft.Extensions.Logging; +using System.Runtime.InteropServices; namespace WeaponPaints { @@ -20,14 +21,10 @@ namespace WeaponPaints int weaponDefIndex = weapon.AttributeManager.Item.ItemDefinitionIndex; + if (isKnife) { weapon.AttributeManager.Item.EntityQuality = 3; - if (weapon.CBodyComponent != null && weapon.CBodyComponent.SceneNode != null) - { - var skeleton = GetSkeletonInstance(weapon.CBodyComponent.SceneNode); - skeleton.ForceParentToBeNetworked = true; - } } if (_config.Additional.GiveRandomSkin && @@ -43,8 +40,10 @@ namespace WeaponPaints if (!isKnife && weapon.CBodyComponent != null && weapon.CBodyComponent.SceneNode != null) { var skeleton = GetSkeletonInstance(weapon.CBodyComponent.SceneNode); - //skeleton.ModelState.MeshGroupMask = 2; - skeleton.ForceParentToBeNetworked = true; + if (skeleton.ModelState.MeshGroupMask != 2) + { + skeleton.ModelState.MeshGroupMask = 2; + } } return; } @@ -62,8 +61,10 @@ namespace WeaponPaints if (!isKnife && weapon.CBodyComponent != null && weapon.CBodyComponent.SceneNode != null) { var skeleton = GetSkeletonInstance(weapon.CBodyComponent.SceneNode); - skeleton.ForceParentToBeNetworked = true; - //skeleton.ModelState.MeshGroupMask = 2; + if (skeleton.ModelState.MeshGroupMask != 2) + { + skeleton.ModelState.MeshGroupMask = 2; + } } } @@ -326,5 +327,27 @@ namespace WeaponPaints Func GetSkeletonInstance = VirtualFunction.Create(node.Handle, 8); return new CSkeletonInstance(GetSkeletonInstance(node.Handle)); } + + private static unsafe CHandle[]? GetPlayerViewModels(CCSPlayerController player) + { + if (player.PlayerPawn.Value == null || player.PlayerPawn.Value.ViewModelServices == null) return null; + CCSPlayer_ViewModelServices viewModelServices = new CCSPlayer_ViewModelServices(player.PlayerPawn.Value.ViewModelServices!.Handle); + return GetFixedArray>(viewModelServices.Handle, "CCSPlayer_ViewModelServices", "m_hViewModel", 3); + } + + public static unsafe T[] GetFixedArray(nint pointer, string @class, string member, int length) where T : CHandle + { + nint ptr = pointer + Schema.GetSchemaOffset(@class, member); + Span references = MemoryMarshal.CreateSpan(ref ptr, length); + T[] values = new T[length]; + + for (int 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/WeaponPaints.cs b/WeaponPaints.cs index a4a2fbf5..7cb447de 100644 --- a/WeaponPaints.cs +++ b/WeaponPaints.cs @@ -145,7 +145,7 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig "Nereziel & daffyy"; public override string ModuleDescription => "Skin and knife selector, standalone and web-based"; public override string ModuleName => "WeaponPaints"; - public override string ModuleVersion => "1.4a"; + public override string ModuleVersion => "1.4b"; public static WeaponPaintsConfig GetWeaponPaintsConfig() { @@ -168,14 +168,14 @@ public partial class WeaponPaints : BasePlugin, IPluginConfig