diff --git a/src/SharpModMenu/PlayerMenuState.cs b/src/SharpModMenu/PlayerMenuState.cs index 2cf0917..96ab308 100644 --- a/src/SharpModMenu/PlayerMenuState.cs +++ b/src/SharpModMenu/PlayerMenuState.cs @@ -45,6 +45,9 @@ public bool HasKeyBinds public bool WasPressingReload { get; set; } public bool WasPressingTab { get; set; } + public int ClientTick { get; set; } + public int? InhibitWeaponSelection { get; set; } + public void HandleInput(PlayerKey key, bool fromBind) { if (key is >= PlayerKey.SelectItem1 and <= PlayerKey.SelectItem0 && fromBind) @@ -53,6 +56,9 @@ public void HandleInput(PlayerKey key, bool fromBind) if (CurrentMenu is null) return; + if (key is >= PlayerKey.SelectItem1 and <= PlayerKey.SelectItem0 && fromBind) + InhibitWeaponSelection = ClientTick + 1; + var itemsStart = CurrentMenu.CurrentPage * Menu.ItemsPerPage; var buttonState = CurrentMenu.GetButtonStates(); diff --git a/src/SharpModMenu/SharpModMenu.cs b/src/SharpModMenu/SharpModMenu.cs index 92670ac..6250680 100644 --- a/src/SharpModMenu/SharpModMenu.cs +++ b/src/SharpModMenu/SharpModMenu.cs @@ -15,10 +15,8 @@ using CSSUniversalMenuAPI; using static CounterStrikeSharp.API.Core.Listeners; - namespace SharpModMenu; - [MinimumApiVersion(314)] public sealed class SharpModMenuPlugin : BasePlugin { @@ -88,45 +86,63 @@ private void OnCheckTransmit(CCheckTransmitInfoList infoList) [GameEventHandler(HookMode.Pre)] public HookResult OnPlayerDisconnect(EventPlayerDisconnect e, GameEventInfo info) { + if (DriverInstance?.ActiveMenuStates is null) + return HookResult.Continue; + DriverInstance?.PlayerDisconnected(e.Userid); return HookResult.Continue; } [GameEventHandler(HookMode.Post)] - public HookResult OnPlayerDisconnect(EventGameStart e, GameEventInfo info) + public HookResult OnGameStart(EventGameStart e, GameEventInfo info) { + if (DriverInstance?.ActiveMenuStates is null) + return HookResult.Continue; + foreach (var state in DriverInstance!.ActiveMenuStates) state.ForceRefresh = true; return HookResult.Continue; } [GameEventHandler(HookMode.Post)] - public HookResult OnPlayerDisconnect(EventRoundStart e, GameEventInfo info) + public HookResult OnRoundStart(EventRoundStart e, GameEventInfo info) { + if (DriverInstance?.ActiveMenuStates is null) + return HookResult.Continue; + foreach (var state in DriverInstance!.ActiveMenuStates) state.ForceRefresh = true; return HookResult.Continue; } [GameEventHandler(HookMode.Post)] - public HookResult OnPlayerDisconnect(EventBeginNewMatch e, GameEventInfo info) + public HookResult OnBeginNewMatch(EventBeginNewMatch e, GameEventInfo info) { + if (DriverInstance?.ActiveMenuStates is null) + return HookResult.Continue; + foreach (var state in DriverInstance!.ActiveMenuStates) state.ForceRefresh = true; return HookResult.Continue; } [GameEventHandler(HookMode.Post)] - public HookResult OnPlayerDisconnect(EventGameInit e, GameEventInfo info) + public HookResult OnGameInit(EventGameInit e, GameEventInfo info) { + if (DriverInstance?.ActiveMenuStates is null) + return HookResult.Continue; + foreach (var state in DriverInstance!.ActiveMenuStates) state.ForceRefresh = true; return HookResult.Continue; } [GameEventHandler(HookMode.Post)] - public HookResult OnPlayerDisconnect(EventPlayerSpawned e, GameEventInfo info) + public HookResult OnPlayerSpawned(EventPlayerSpawned e, GameEventInfo info) { + if (DriverInstance?.ActiveMenuStates is null) + return HookResult.Continue; + foreach (var state in DriverInstance!.ActiveMenuStates) if (e.Userid == state.Player) state.ForceRefresh = true; @@ -255,6 +271,10 @@ private unsafe HookResult ProcessUserCmds(DynamicHook hook) var pressingTab = false; var pressingReload = false; + int? inhibitWeaponSelectionTick = menuState.InhibitWeaponSelection; + menuState.InhibitWeaponSelection = null; + bool inhibitWeaponSelect = false; + for (ulong i = 0; i < (ulong)cmdsCount; i++) { var cmd = (CUserCmdPB*)((ulong)cmdsPtr + i * CUserCmdPB.Size); @@ -262,6 +282,9 @@ private unsafe HookResult ProcessUserCmds(DynamicHook hook) if ((nint)cmd->Base == nint.Zero) continue; + inhibitWeaponSelect |= inhibitWeaponSelectionTick.HasValue && inhibitWeaponSelectionTick.Value <= cmd->Base->ClientTick; + menuState.ClientTick = cmd->Base->ClientTick; + var cmdPtr = (nint)cmd->Base; var span = new Span(cmd->Base, 0x82); @@ -283,7 +306,8 @@ private unsafe HookResult ProcessUserCmds(DynamicHook hook) if (menuState.IsUsingKeybinds) { - cmd->Base->WeaponSelect = 0; + if (inhibitWeaponSelect) + cmd->Base->WeaponSelect = 0; } else {