Confirm split with space; fix armor tooltip; remember repairer

This commit is contained in:
Tyfon
2024-06-02 14:50:54 -07:00
parent e562563cc2
commit cd5527827a
7 changed files with 155 additions and 37 deletions

View File

@@ -1,11 +1,21 @@
using Aki.Reflection.Patching; using Aki.Reflection.Patching;
using EFT.InputSystem;
using EFT.UI;
using HarmonyLib; using HarmonyLib;
using System.Reflection; using System.Reflection;
using UnityEngine; using UnityEngine;
namespace UIFixes namespace UIFixes
{ {
public class ConfirmationDialogKeysPatch : ModulePatch public static class ConfirmDialogKeysPatches
{
public static void Enable()
{
new DialogWindowPatch().Enable();
new SplitDialogPatch().Enable();
}
public class DialogWindowPatch : ModulePatch
{ {
protected override MethodBase GetTargetMethod() protected override MethodBase GetTargetMethod()
{ {
@@ -29,4 +39,27 @@ namespace UIFixes
} }
} }
} }
public class SplitDialogPatch : ModulePatch
{
protected override MethodBase GetTargetMethod()
{
return AccessTools.Method(typeof(ItemUiContext), nameof(ItemUiContext.TranslateCommand));
}
[PatchPrefix]
public static bool Prefix(ECommand command, ref InputNode.ETranslateResult __result, SplitDialog ___splitDialog_0)
{
// It's wild to me that they implement UI keyboard shortcuts via the in-raid movement keybinds
if (___splitDialog_0 != null && ___splitDialog_0.gameObject.activeSelf && command == ECommand.Jump)
{
___splitDialog_0.Accept();
__result = InputNode.ETranslateResult.Block;
return false;
}
return true;
}
}
}
} }

View File

@@ -1,11 +1,21 @@
using Aki.Reflection.Patching; using Aki.Reflection.Patching;
using EFT.UI;
using EFT.UI.DragAndDrop; using EFT.UI.DragAndDrop;
using HarmonyLib; using HarmonyLib;
using System.Reflection; using System.Reflection;
using TMPro;
namespace UIFixes namespace UIFixes
{ {
public class FixTooltipPatch : ModulePatch public static class FixTooltipPatches
{
public static void Enable()
{
new QuestTooltipPatch().Enable();
new ArmorTooltipPatch().Enable();
}
public class QuestTooltipPatch : ModulePatch
{ {
protected override MethodBase GetTargetMethod() protected override MethodBase GetTargetMethod()
{ {
@@ -19,4 +29,30 @@ namespace UIFixes
parent?.ShowTooltip(); parent?.ShowTooltip();
} }
} }
public class ArmorTooltipPatch : ModulePatch
{
protected override MethodBase GetTargetMethod()
{
return AccessTools.Method(typeof(GridItemView), nameof(GridItemView.NewGridItemView));
}
// BSG loves to implement the same stuff in totally different ways, and this way is bad and also wrong
[PatchPostfix]
public static void Postfix(GridItemView __instance, TextMeshProUGUI ___ItemValue, PointerEventsProxy ____valuePointerEventsProxy)
{
// Add hover events to the correct place
HoverTrigger trigger = ___ItemValue.GetOrAddComponent<HoverTrigger>();
trigger.OnHoverStart += eventData => __instance.method_31();
trigger.OnHoverEnd += eventData =>
{
__instance.method_32();
__instance.ShowTooltip();
};
// Remove them from the wrong place
UnityEngine.Object.Destroy(____valuePointerEventsProxy);
}
}
}
} }

View File

@@ -192,7 +192,7 @@ namespace UIFixes
contextInteractions.OnRedrawRequired += createButton; contextInteractions.OnRedrawRequired += createButton;
// And unsubscribe when the window goes away // And unsubscribe when the window goes away
buttonsContainer.AddDisposable(() => buttonsContainer.UI.AddDisposable(() =>
{ {
contextInteractions.OnRedrawRequired -= createButton; contextInteractions.OnRedrawRequired -= createButton;
Settings.ShowModStats.SettingChanged -= onSettingChanged; Settings.ShowModStats.SettingChanged -= onSettingChanged;

View File

@@ -0,0 +1,29 @@
using Aki.Reflection.Patching;
using EFT.UI;
using HarmonyLib;
using System.Reflection;
using UnityEngine;
namespace UIFixes
{
public class RememberRepairerPatch : ModulePatch
{
private static readonly string PlayerPrefKey = "UIFixes.Repair.CurrentRepairerIndex";
protected override MethodBase GetTargetMethod()
{
return AccessTools.Method(typeof(RepairerParametersPanel), nameof(RepairerParametersPanel.Show));
}
[PatchPostfix]
public static void Postfix(RepairerParametersPanel __instance, DropDownBox ____tradersDropDown)
{
__instance.R().UI.AddDisposable(____tradersDropDown.OnValueChanged.Subscribe(index => PlayerPrefs.SetInt(PlayerPrefKey, index)));
if (PlayerPrefs.HasKey(PlayerPrefKey))
{
____tradersDropDown.UpdateValue(PlayerPrefs.GetInt(PlayerPrefKey));
}
}
}
}

View File

@@ -35,7 +35,7 @@ namespace UIFixes
BuyTab = wrappedInstance.BuyTab; BuyTab = wrappedInstance.BuyTab;
SellTab = wrappedInstance.SellTab; SellTab = wrappedInstance.SellTab;
wrappedInstance.AddDisposable(() => wrappedInstance.UI.AddDisposable(() =>
{ {
BuyTab = null; BuyTab = null;
SellTab = null; SellTab = null;

View File

@@ -13,9 +13,9 @@ namespace UIFixes
R.Init(); R.Init();
new ConfirmationDialogKeysPatch().Enable(); ConfirmDialogKeysPatches.Enable();
new FixMailRecieveAllPatch().Enable(); new FixMailRecieveAllPatch().Enable();
new FixTooltipPatch().Enable(); FixTooltipPatches.Enable();
new FixWeaponBindsDisplayPatch().Enable(); new FixWeaponBindsDisplayPatch().Enable();
FocusFleaOfferNumberPatches.Enable(); FocusFleaOfferNumberPatches.Enable();
HideoutSearchPatches.Enable(); HideoutSearchPatches.Enable();
@@ -42,6 +42,7 @@ namespace UIFixes
AddOfferRememberAutoselectPatches.Enable(); AddOfferRememberAutoselectPatches.Enable();
KeepMessagesOpenPatches.Enable(); KeepMessagesOpenPatches.Enable();
new FocusTradeQuantityPatch().Enable(); new FocusTradeQuantityPatch().Enable();
new RememberRepairerPatch().Enable();
} }
public static bool InRaid() public static bool InRaid()

47
R.cs
View File

@@ -23,6 +23,8 @@ namespace UIFixes
public static void Init() public static void Init()
{ {
// Order is significant, as some reference each other // Order is significant, as some reference each other
UIElement.InitUITypes();
UIContext.InitTypes();
DialogWindow.InitTypes(); DialogWindow.InitTypes();
ControlSettings.InitTypes(); ControlSettings.InitTypes();
ProductionPanel.InitTypes(); ProductionPanel.InitTypes();
@@ -58,6 +60,32 @@ namespace UIFixes
public object Value { get; protected set; } = value; public object Value { get; protected set; } = value;
} }
public class UIElement(object value) : Wrapper(value)
{
private static FieldInfo UIField;
public static void InitUITypes()
{
UIField = AccessTools.Field(typeof(EFT.UI.UIElement), "UI");
}
public UIContext UI { get { return new UIContext(UIField.GetValue(Value)); } }
}
public class UIContext(object value) : Wrapper(value)
{
public static Type Type { get; private set; }
private static MethodInfo AddDisposableActionMethod;
public static void InitTypes()
{
Type = AccessTools.Field(typeof(EFT.UI.UIElement), "UI").FieldType;
AddDisposableActionMethod = AccessTools.Method(Type, "AddDisposable", [typeof(Action)]);
}
public void AddDisposable(Action destroy) => AddDisposableActionMethod.Invoke(Value, [destroy]);
}
public class DialogWindow(object value) : Wrapper(value) public class DialogWindow(object value) : Wrapper(value)
{ {
public static Type Type { get; private set; } public static Type Type { get; private set; }
@@ -288,27 +316,21 @@ namespace UIFixes
public object ToGridViewCanAcceptOperation() => ImplicitCastToGridViewCanAcceptOperationMethod.Invoke(null, [Value]); public object ToGridViewCanAcceptOperation() => ImplicitCastToGridViewCanAcceptOperationMethod.Invoke(null, [Value]);
} }
public class InteractionButtonsContainer(object value) : Wrapper(value) public class InteractionButtonsContainer(object value) : UIElement(value)
{ {
public static Type Type { get; private set; } public static Type Type { get; private set; }
private static FieldInfo ButtonTemplateField; private static FieldInfo ButtonTemplateField;
private static FieldInfo ContainerField; private static FieldInfo ContainerField;
private static FieldInfo UIField;
private static MethodInfo UIAddDisposableMethod;
public static void InitTypes() public static void InitTypes()
{ {
Type = typeof(EFT.UI.InteractionButtonsContainer); Type = typeof(EFT.UI.InteractionButtonsContainer);
ButtonTemplateField = AccessTools.Field(Type, "_buttonTemplate"); ButtonTemplateField = AccessTools.Field(Type, "_buttonTemplate");
ContainerField = AccessTools.Field(Type, "_buttonsContainer"); ContainerField = AccessTools.Field(Type, "_buttonsContainer");
UIField = AccessTools.Field(Type, "UI"); // GClass767
UIAddDisposableMethod = AccessTools.Method(UIField.FieldType, "AddDisposable", [typeof(Action)]);
} }
public SimpleContextMenuButton ButtonTemplate { get { return (SimpleContextMenuButton)ButtonTemplateField.GetValue(Value); } } public SimpleContextMenuButton ButtonTemplate { get { return (SimpleContextMenuButton)ButtonTemplateField.GetValue(Value); } }
public Transform Container { get { return (Transform)ContainerField.GetValue(Value); } } public Transform Container { get { return (Transform)ContainerField.GetValue(Value); } }
public object UI { get { return UIField.GetValue(Value); } }
public void AddDisposable(Action action) => UIAddDisposableMethod.Invoke(UI, [action]);
} }
public class ContextMenuButton(object value) : Wrapper(value) public class ContextMenuButton(object value) : Wrapper(value)
@@ -488,25 +510,19 @@ namespace UIFixes
public static Dictionary<ECurrencyType, int> GetMoneySums(IEnumerable<Item> items) => (Dictionary<ECurrencyType, int>)GetMoneySumsMethod.Invoke(null, [items]); public static Dictionary<ECurrencyType, int> GetMoneySums(IEnumerable<Item> items) => (Dictionary<ECurrencyType, int>)GetMoneySumsMethod.Invoke(null, [items]);
} }
public class TraderScreensGroup(object value) : Wrapper(value) public class TraderScreensGroup(object value) : UIElement(value)
{ {
public static Type Type { get; private set; } public static Type Type { get; private set; }
private static FieldInfo UIField;
private static MethodInfo UIAddDisposableMethod;
private static FieldInfo BuyTabField; private static FieldInfo BuyTabField;
private static FieldInfo SellTabField; private static FieldInfo SellTabField;
public static void InitTypes() public static void InitTypes()
{ {
Type = typeof(EFT.UI.TraderScreensGroup); Type = typeof(EFT.UI.TraderScreensGroup);
UIField = AccessTools.Field(Type, "UI");
UIAddDisposableMethod = AccessTools.Method(UIField.FieldType, "AddDisposable", [typeof(Action)]);
BuyTabField = AccessTools.Field(Type, "_buyTab"); BuyTabField = AccessTools.Field(Type, "_buyTab");
SellTabField = AccessTools.Field(Type, "_sellTab"); SellTabField = AccessTools.Field(Type, "_sellTab");
} }
public object UI { get { return UIField.GetValue(Value); } }
public void AddDisposable(Action action) => UIAddDisposableMethod.Invoke(UI, [action]);
public Tab BuyTab { get { return (Tab)BuyTabField.GetValue(Value); } } public Tab BuyTab { get { return (Tab)BuyTabField.GetValue(Value); } }
public Tab SellTab { get { return (Tab)SellTabField.GetValue(Value); } } public Tab SellTab { get { return (Tab)SellTabField.GetValue(Value); } }
} }
@@ -552,6 +568,8 @@ namespace UIFixes
public Button Button { get { return (Button)ButtonField.GetValue(Value); } } public Button Button { get { return (Button)ButtonField.GetValue(Value); } }
} }
public class RepairerParametersPanel(object value) : UIElement(value) { }
} }
public static class RExtentensions public static class RExtentensions
@@ -574,5 +592,6 @@ namespace UIFixes
public static R.TradingItemView R(this TradingItemView value) => new(value); public static R.TradingItemView R(this TradingItemView value) => new(value);
public static R.GridWindow R(this GridWindow value) => new(value); public static R.GridWindow R(this GridWindow value) => new(value);
public static R.GridSortPanel R(this GridSortPanel value) => new(value); public static R.GridSortPanel R(this GridSortPanel value) => new(value);
public static R.RepairerParametersPanel R(this RepairerParametersPanel value) => new(value);
} }
} }