Toggle/Hold aiming

This commit is contained in:
Tyfon
2024-07-08 00:12:27 -07:00
parent d64a07d102
commit 3e93d55b8c
4 changed files with 171 additions and 2 deletions

View File

@@ -0,0 +1,72 @@
using Comfort.Common;
using EFT.InputSystem;
using HarmonyLib;
using SPT.Reflection.Patching;
using System.Collections.Generic;
using System.Reflection;
namespace UIFixes
{
public static class AimToggleHoldPatches
{
public static void Enable()
{
new AddStatesPatch().Enable();
new UpdateInputPatch().Enable();
Settings.ToggleOrHoldAim.SettingChanged += (_, _) =>
{
// Will "save" control settings, running GClass1911.UpdateInput, which will set (or unset) toggle/hold behavior
Singleton<SharedGameSettingsClass>.Instance.Control.Controller.method_3();
};
}
public class AddStatesPatch : ModulePatch
{
private static FieldInfo StateMachineArray;
protected override MethodBase GetTargetMethod()
{
StateMachineArray = AccessTools.Field(typeof(GClass1911), "keyCombinationState_1");
return AccessTools.Constructor(typeof(GClass1912), [typeof(EGameKey), typeof(ECommand), typeof(ECommand), typeof(int)]);
}
[PatchPostfix]
public static void Postfix(GClass1912 __instance, EGameKey gameKey, ECommand disableCommand, GClass1911.KeyCombinationState[] ___keyCombinationState_1)
{
if (!Settings.ToggleOrHoldAim.Value || gameKey != EGameKey.Aim)
{
return;
}
List<GClass1911.KeyCombinationState> states = new(___keyCombinationState_1)
{
new ToggleHoldIdleState(__instance),
new ToggleHoldClickOrHoldState(__instance),
new ToggleHoldHoldState(__instance, disableCommand)
};
StateMachineArray.SetValue(__instance, states.ToArray());
}
}
public class UpdateInputPatch : ModulePatch
{
protected override MethodBase GetTargetMethod()
{
return AccessTools.Method(typeof(GClass1911), nameof(GClass1911.UpdateInput));
}
[PatchPostfix]
public static void Postfix(GClass1911 __instance)
{
if (!Settings.ToggleOrHoldAim.Value || __instance.GameKey != EGameKey.Aim)
{
return;
}
__instance.method_0((GClass1911.EKeyState)ToggleHoldState.Idle);
}
}
}
}

View File

@@ -57,6 +57,7 @@ namespace UIFixes
LoadMultipleMagazinesPatches.Enable();
new PutToolsBackPatch().Enable();
new RebindGrenadesPatch().Enable();
AimToggleHoldPatches.Enable();
}
public static bool InRaid()

View File

@@ -50,6 +50,7 @@ namespace UIFixes
public static ConfigEntry<bool> RestoreAsyncScrollPositions { get; set; } // Advanced
// Input
public static ConfigEntry<bool> ToggleOrHoldAim { get; set; }
public static ConfigEntry<bool> UseHomeEnd { get; set; }
public static ConfigEntry<bool> RebindPageUpDown { get; set; }
public static ConfigEntry<int> MouseScrollMulti { get; set; }
@@ -176,14 +177,23 @@ namespace UIFixes
new ConfigurationManagerAttributes { IsAdvanced = true })));
// Input
configEntries.Add(ToggleOrHoldAim = config.Bind(
InputSection,
"Use Toggle/Hold Aiming",
false,
new ConfigDescription(
"Tap the aim key to toggle aiming, or hold the aim key for continuous aiming",
null,
new ConfigurationManagerAttributes { })));
configEntries.Add(UseHomeEnd = config.Bind(
InputSection,
"Enable Home/End Keys",
true,
new ConfigDescription(
"Use the Home and End keys to scroll to the top and bottom of inventories",
null,
new ConfigurationManagerAttributes { })));
null,
new ConfigurationManagerAttributes { })));
configEntries.Add(RebindPageUpDown = config.Bind(
InputSection,

86
ToggleHold.cs Normal file
View File

@@ -0,0 +1,86 @@
using EFT.InputSystem;
namespace UIFixes
{
public enum ToggleHoldState
{
Idle = 13,
ClickOrHold = 14,
Holding = 15
}
public class ToggleHoldIdleState(GClass1911 keyCombination) : GClass1911.KeyCombinationState(keyCombination)
{
public override ECommand GetCommand(float deltaTime)
{
if (!CanProcess())
{
return ECommand.None;
}
HandleKeys(false);
KeyCombination.method_0((GClass1911.EKeyState)ToggleHoldState.ClickOrHold);
return GetCommandInternal();
}
protected bool CanProcess()
{
return GetKeysStatus(out EKeyPress ekeyPress) && (ekeyPress == EKeyPress.Down);
}
}
public class ToggleHoldClickOrHoldState(GClass1911 keyCombination) : GClass1911.KeyCombinationState(keyCombination)
{
public override void Enter()
{
timer = KeyCombination.DoubleClickTimeout;
}
public override ECommand GetCommand(float deltaTime)
{
if (GetKeysStatus(out EKeyPress ekeyPress))
{
if (ekeyPress == EKeyPress.Hold)
{
HandleKeys(false);
if (LongEnough(deltaTime))
{
KeyCombination.method_0((GClass1911.EKeyState)ToggleHoldState.Holding);
}
return ECommand.None;
}
}
UnhandleKeys(null);
KeyCombination.method_0((GClass1911.EKeyState)ToggleHoldState.Idle);
return ECommand.None;
}
private bool LongEnough(float deltaTime)
{
timer -= deltaTime;
return timer <= 0f;
}
private float timer;
}
public class ToggleHoldHoldState(GClass1911 keyCombination, ECommand disableCommand) : GClass1911.KeyCombinationState(keyCombination)
{
private readonly ECommand disableCommand = disableCommand;
public override ECommand GetCommand(float deltaTime)
{
if (GetKeysStatus(out EKeyPress ekeyPress) && ekeyPress == EKeyPress.Hold)
{
HandleKeys(false);
return ECommand.None;
}
UnhandleKeys(null);
KeyCombination.method_0((GClass1911.EKeyState)ToggleHoldState.Idle);
return disableCommand;
}
}
}