-
Notifications
You must be signed in to change notification settings - Fork 0
/
Yoinker.cs
130 lines (108 loc) · 4.9 KB
/
Yoinker.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using Blish_HUD;
using Blish_HUD.Controls;
using Microsoft.Xna.Framework;
using Blish_HUD.Input;
using BagOfHolding.UI.Controls;
using System.Collections.Generic;
namespace BagOfHolding {
internal class Yoinker {
private readonly ModuleState _state;
private readonly List<int> _ignoreList = new List<int>() {
2147483647, // Blish HUD icon
};
public CornerIcon ActiveIcon { get; private set; } = null;
private Point _iconOffset = Point.Zero;
private FakeIcon _fakeIcon = null;
public Yoinker(ModuleState state) {
_state = state;
}
public void Start() {
_fakeIcon = new FakeIcon() {
Parent = GameService.Graphics.SpriteScreen,
Visible = false
};
GameService.Input.Mouse.LeftMouseButtonPressed += GlobalLeftMouseButtonPressed;
GameService.Input.Mouse.LeftMouseButtonReleased += GlobalLeftMouseButtonReleased;
}
private void GlobalLeftMouseButtonReleased(object sender, MouseEventArgs e) {
if (this.ActiveIcon != null) {
if (_state.Bag.AbsoluteBounds.Contains(GameService.Input.Mouse.Position)) {
//Logger.GetLogger<Yoinker>().Info($"{this.ActiveIcon.BasicTooltipText}: {this.ActiveIcon.Priority} {this.ActiveIcon.GetType().FullName}");
_state.Locker.LockUp(this.ActiveIcon);
} else {
_state.Locker.Release(this.ActiveIcon);
this.ActiveIcon.Show();
}
}
this.ActiveIcon = null;
}
private void GlobalLeftMouseButtonPressed(object sender, MouseEventArgs e) {
CornerIcon icon = null;
if (GameService.Input.Mouse.ActiveControl == _state.Bag) {
icon = _state.Bag.GetIconFromRelativePosition().Icon;
if (icon != null) {
_iconOffset = new Point(icon.Size.X / 2, icon.Size.Y / 2);
}
} else if (GameService.Input.Mouse.ActiveControl is CornerIcon ci) {
icon = ci;
_iconOffset = icon.RelativeMousePosition;
}
if (icon != null) {
if (_ignoreList.Contains(icon.Priority) || icon == _state.Icon) {
return;
}
// SHIFT toggle
//if (_state.Settings.HoldShiftToToggleCapture.Value && GameService.Input.Keyboard.ActiveModifiers.HasFlag(ModifierKeys.Shift)) {
// if (icon.Visible) {
// _state.Locker.LockUp(icon);
// } else {
// _state.Locker.Release(icon);
// }
// return;
//}
// Normal yoink
this.ActiveIcon = icon;
_fakeIcon.Impersonate(this.ActiveIcon);
} else if (GameService.Input.Mouse.ActiveControl != _state.Bag) {
_state.Bag.Hide();
}
}
public void Update() {
if (this.ActiveIcon != null) {
if (_state.OneOff.NexusShimIsRunning && this.ActiveIcon.Priority == Locker.LOCKED_PRIORITY) {
// Bag handling is weird when Nexus Shim is enabled.
if (!_state.Bag.MouseOver) {
this.ActiveIcon.Visible = false;
_fakeIcon.Visible = true;
_fakeIcon.Location = GameService.Input.Mouse.Position - _iconOffset;
if (!_state.Bag.Visible) {
_state.Bag.Show();
}
} else {
_fakeIcon.Visible = false;
}
} else if (GameService.Input.Mouse.Position.Y > this.ActiveIcon.Bottom + _iconOffset.Y
|| (!_state.OneOff.NexusShimIsRunning && GameService.Input.Mouse.Position.X < this.ActiveIcon.Left)
|| (!_state.OneOff.NexusShimIsRunning && GameService.Input.Mouse.Position.X > this.ActiveIcon.Right)) {
this.ActiveIcon.Visible = false;
_fakeIcon.Visible = true;
_fakeIcon.Location = GameService.Input.Mouse.Position - _iconOffset;
if (!_state.Bag.Visible) {
_state.Bag.Show();
}
} else {
this.ActiveIcon.Visible = true;
_fakeIcon.Visible = false;
}
} else {
_fakeIcon.Visible = false; ;
}
}
public void Stop() {
_fakeIcon?.Dispose();
this.ActiveIcon = null;
GameService.Input.Mouse.LeftMouseButtonPressed -= GlobalLeftMouseButtonPressed;
GameService.Input.Mouse.LeftMouseButtonReleased -= GlobalLeftMouseButtonReleased;
}
}
}