-
Notifications
You must be signed in to change notification settings - Fork 391
Expand file tree
/
Copy pathBuiltinControlsProvider.cs
More file actions
117 lines (104 loc) · 7.47 KB
/
Copy pathBuiltinControlsProvider.cs
File metadata and controls
117 lines (104 loc) · 7.47 KB
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
using System.Diagnostics.CodeAnalysis;
using Intersect.Client.Framework.Database;
using Intersect.Client.Framework.GenericClasses;
using Newtonsoft.Json;
namespace Intersect.Client.Framework.Input;
internal sealed class BuiltinControlsProvider : IControlsProvider
{
private readonly Dictionary<Control, ControlMapping> _defaultMappings = LoadDefaultMappings();
public Control[] Controls { get; } = Enum.GetValues<Control>().Where(control => control.IsValid()).ToArray();
public bool TryGetDefaultMapping(Control control, [NotNullWhen(true)] out ControlMapping? defaultMapping)
{
if (_defaultMappings.TryGetValue(control, out var mapping))
{
defaultMapping = new ControlMapping(mapping);
return true;
}
defaultMapping = null;
return false;
}
public void ReloadFromOptions(Options? options)
{
// Builtin controls don't change based on options
// Defaults are loaded once from default_settings.json at initialization
}
/// <summary>
/// Loads default mappings by starting with hardcoded defaults and then merging overrides from default_settings.json if present.
/// </summary>
public static Dictionary<Control, ControlMapping> LoadDefaultMappings()
{
// Start with all hardcoded defaults
var defaults = GetHardcodedDefaults();
// Load default controls from default_settings.json
var defaultSettingsPath = Path.Combine("resources", "default_settings.json");
if (File.Exists(defaultSettingsPath))
{
var db = new JsonDatabase(defaultSettingsPath);
foreach (var control in defaults.Keys)
{
var controlId = control.GetControlId();
var bindings = new List<ControlBinding>();
if (db.HasPreference($"{controlId}_binding0") && db.HasPreference($"{controlId}_binding1"))
{
var binding1 = JsonConvert.DeserializeObject<ControlBinding>(db.LoadPreference($"{controlId}_binding0"));
var binding2 = JsonConvert.DeserializeObject<ControlBinding>(db.LoadPreference($"{controlId}_binding1"));
if (binding1 != null && binding2 != null)
{
defaults[control] = new ControlMapping(binding1, binding2);
}
}
}
}
return defaults;
}
/// <summary>
/// Returns the hardcoded default control mappings.
/// </summary>
private static Dictionary<Control, ControlMapping> GetHardcodedDefaults()
{
return new Dictionary<Control, ControlMapping>
{
{ Control.MoveUp, new ControlMapping(new ControlBinding(Keys.None, Keys.Up), new ControlBinding(Keys.None, Keys.W)) },
{ Control.MoveDown, new ControlMapping(new ControlBinding(Keys.None, Keys.Down), new ControlBinding(Keys.None, Keys.S)) },
{ Control.MoveLeft, new ControlMapping(new ControlBinding(Keys.None, Keys.Left), new ControlBinding(Keys.None, Keys.A)) },
{ Control.MoveRight, new ControlMapping(new ControlBinding(Keys.None, Keys.Right), new ControlBinding(Keys.None, Keys.D)) },
{ Control.AttackInteract, new ControlMapping(new ControlBinding(Keys.None, Keys.E), new ControlBinding(Keys.None, Keys.LButton)) },
{ Control.Block, new ControlMapping(new ControlBinding(Keys.None, Keys.Q), new ControlBinding(Keys.None, Keys.RButton)) },
{ Control.AutoTarget, new ControlMapping(new ControlBinding(Keys.None, Keys.Tab), ControlBinding.Default) },
{ Control.HoldToSoftRetargetOnSelfCast, new ControlMapping(new ControlBinding(Keys.None, Keys.LMenu), ControlBinding.Default) },
{ Control.ToggleAutoSoftRetargetOnSelfCast, new ControlMapping(ControlBinding.Default, ControlBinding.Default) },
{ Control.PickUp, new ControlMapping(new ControlBinding(Keys.None, Keys.Space), ControlBinding.Default) },
{ Control.Enter, new ControlMapping(new ControlBinding(Keys.None, Keys.Enter), ControlBinding.Default) },
{ Control.Screenshot, new ControlMapping(new ControlBinding(Keys.None, Keys.F12), ControlBinding.Default) },
{ Control.OpenMenu, new ControlMapping(new ControlBinding(Keys.None, Keys.Escape), ControlBinding.Default) },
{ Control.OpenInventory, new ControlMapping(new ControlBinding(Keys.None, Keys.I), ControlBinding.Default) },
{ Control.OpenQuests, new ControlMapping(new ControlBinding(Keys.None, Keys.L), ControlBinding.Default) },
{ Control.OpenCharacterInfo, new ControlMapping(new ControlBinding(Keys.None, Keys.C), ControlBinding.Default) },
{ Control.OpenParties, new ControlMapping(new ControlBinding(Keys.None, Keys.P), ControlBinding.Default) },
{ Control.OpenSpells, new ControlMapping(new ControlBinding(Keys.None, Keys.K), ControlBinding.Default) },
{ Control.OpenFriends, new ControlMapping(new ControlBinding(Keys.None, Keys.F), ControlBinding.Default) },
{ Control.OpenGuild, new ControlMapping(new ControlBinding(Keys.None, Keys.G), ControlBinding.Default) },
{ Control.OpenSettings, new ControlMapping(new ControlBinding(Keys.None, Keys.O), ControlBinding.Default) },
{ Control.OpenDebugger, new ControlMapping(new ControlBinding(Keys.None, Keys.F2), ControlBinding.Default) },
{ Control.OpenAdminPanel, new ControlMapping(new ControlBinding(Keys.None, Keys.Insert), ControlBinding.Default) },
{ Control.ToggleGui, new ControlMapping(new ControlBinding(Keys.None, Keys.F11), ControlBinding.Default) },
{ Control.TurnAround, new ControlMapping(new ControlBinding(Keys.None, Keys.Control), ControlBinding.Default) },
{ Control.ToggleZoomIn, new ControlMapping(ControlBinding.Default, ControlBinding.Default) },
{ Control.ToggleZoomOut, new ControlMapping(ControlBinding.Default, ControlBinding.Default) },
{ Control.HoldToZoomIn, new ControlMapping(ControlBinding.Default, ControlBinding.Default) },
{ Control.HoldToZoomOut, new ControlMapping(ControlBinding.Default, ControlBinding.Default) },
{ Control.ToggleFullscreen, new ControlMapping(new ControlBinding(Keys.Alt, Keys.Enter), ControlBinding.Default) },
// Hotkeys should be at the end of the list
{ Control.Hotkey1, new ControlMapping(new ControlBinding(Keys.None, Keys.D1), ControlBinding.Default) },
{ Control.Hotkey2, new ControlMapping(new ControlBinding(Keys.None, Keys.D2), ControlBinding.Default) },
{ Control.Hotkey3, new ControlMapping(new ControlBinding(Keys.None, Keys.D3), ControlBinding.Default) },
{ Control.Hotkey4, new ControlMapping(new ControlBinding(Keys.None, Keys.D4), ControlBinding.Default) },
{ Control.Hotkey5, new ControlMapping(new ControlBinding(Keys.None, Keys.D5), ControlBinding.Default) },
{ Control.Hotkey6, new ControlMapping(new ControlBinding(Keys.None, Keys.D6), ControlBinding.Default) },
{ Control.Hotkey7, new ControlMapping(new ControlBinding(Keys.None, Keys.D7), ControlBinding.Default) },
{ Control.Hotkey8, new ControlMapping(new ControlBinding(Keys.None, Keys.D8), ControlBinding.Default) },
{ Control.Hotkey9, new ControlMapping(new ControlBinding(Keys.None, Keys.D9), ControlBinding.Default) },
{ Control.Hotkey10, new ControlMapping(new ControlBinding(Keys.None, Keys.D0), ControlBinding.Default) },
};
}
}