From 850e99cb45f03ea1a64a677c1dbc0781775c5203 Mon Sep 17 00:00:00 2001 From: Casey W Date: Wed, 28 Jan 2026 19:25:05 -0500 Subject: [PATCH 1/3] Allow controller input overrides to apply even without connected controller --- src/SMAPI/Framework/Input/GamePadStateBuilder.cs | 12 ------------ src/SMAPI/Framework/Input/SInputState.cs | 4 ++-- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/src/SMAPI/Framework/Input/GamePadStateBuilder.cs b/src/SMAPI/Framework/Input/GamePadStateBuilder.cs index 0f6e99ae3..2d2b485c0 100644 --- a/src/SMAPI/Framework/Input/GamePadStateBuilder.cs +++ b/src/SMAPI/Framework/Input/GamePadStateBuilder.cs @@ -55,9 +55,6 @@ public GamePadStateBuilder(GamePadState state) this.State = state; this.IsConnected = state.IsConnected; - if (!this.IsConnected) - return; - GamePadDPad pad = state.DPad; GamePadButtons buttons = state.Buttons; GamePadTriggers triggers = state.Triggers; @@ -90,9 +87,6 @@ public GamePadStateBuilder(GamePadState state) /// public GamePadStateBuilder OverrideButtons(IDictionary overrides) { - if (!this.IsConnected) - return this; - foreach (var pair in overrides) { bool changed = true; @@ -155,9 +149,6 @@ public GamePadStateBuilder OverrideButtons(IDictionary ov /// public IEnumerable GetPressedButtons() { - if (!this.IsConnected) - yield break; - // buttons foreach (Buttons button in this.GetPressedGamePadButtons()) yield return button.ToSButton(); @@ -213,9 +204,6 @@ public GamePadState GetState() /// Get the pressed gamepad buttons. private IEnumerable GetPressedGamePadButtons() { - if (!this.IsConnected) - yield break; - foreach (var pair in this.ButtonStates) { if (pair.Value == ButtonState.Pressed && pair.Key.TryGetController(out Buttons button)) diff --git a/src/SMAPI/Framework/Input/SInputState.cs b/src/SMAPI/Framework/Input/SInputState.cs index 44276b7c2..d41279e4c 100644 --- a/src/SMAPI/Framework/Input/SInputState.cs +++ b/src/SMAPI/Framework/Input/SInputState.cs @@ -238,14 +238,14 @@ private bool ApplyOverrides(ISet pressed, ISet released, GameP mouseOverrides[button] = newState; else if (button.TryGetKeyboard(out Keys _)) keyboardOverrides[button] = newState; - else if (controller.IsConnected && button.TryGetController(out Buttons _)) + else if (button.TryGetController(out Buttons _)) controllerOverrides[button] = newState; } // override states if (keyboardOverrides.Any()) keyboard.OverrideButtons(keyboardOverrides); - if (controller.IsConnected && controllerOverrides.Any()) + if (controllerOverrides.Any()) controller.OverrideButtons(controllerOverrides); if (mouseOverrides.Any()) mouse.OverrideButtons(mouseOverrides); From 5fc8e806c21db2d6f58db9813b53c125308d067b Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sun, 1 Feb 2026 16:59:08 -0500 Subject: [PATCH 2/3] avoid querying controller state if it's not connected --- .../Framework/Input/GamePadStateBuilder.cs | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/SMAPI/Framework/Input/GamePadStateBuilder.cs b/src/SMAPI/Framework/Input/GamePadStateBuilder.cs index 2d2b485c0..2c20c226e 100644 --- a/src/SMAPI/Framework/Input/GamePadStateBuilder.cs +++ b/src/SMAPI/Framework/Input/GamePadStateBuilder.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input; @@ -22,7 +21,7 @@ internal class GamePadStateBuilder : IInputStateBuilderThe current button states. - private readonly IDictionary? ButtonStates; + private readonly Dictionary ButtonStates; /// The left trigger value. private float LeftTrigger; @@ -41,7 +40,6 @@ internal class GamePadStateBuilder : IInputStateBuilderWhether the gamepad is currently connected. - [MemberNotNullWhen(true, nameof(GamePadStateBuilder.ButtonStates))] public bool IsConnected { get; } @@ -55,33 +53,38 @@ public GamePadStateBuilder(GamePadState state) this.State = state; this.IsConnected = state.IsConnected; - GamePadDPad pad = state.DPad; - GamePadButtons buttons = state.Buttons; - GamePadTriggers triggers = state.Triggers; - GamePadThumbSticks sticks = state.ThumbSticks; - this.ButtonStates = new Dictionary + if (this.IsConnected) { - [SButton.DPadUp] = pad.Up, - [SButton.DPadDown] = pad.Down, - [SButton.DPadLeft] = pad.Left, - [SButton.DPadRight] = pad.Right, - - [SButton.ControllerA] = buttons.A, - [SButton.ControllerB] = buttons.B, - [SButton.ControllerX] = buttons.X, - [SButton.ControllerY] = buttons.Y, - [SButton.LeftStick] = buttons.LeftStick, - [SButton.RightStick] = buttons.RightStick, - [SButton.LeftShoulder] = buttons.LeftShoulder, - [SButton.RightShoulder] = buttons.RightShoulder, - [SButton.ControllerBack] = buttons.Back, - [SButton.ControllerStart] = buttons.Start, - [SButton.BigButton] = buttons.BigButton - }; - this.LeftTrigger = triggers.Left; - this.RightTrigger = triggers.Right; - this.LeftStickPos = sticks.Left; - this.RightStickPos = sticks.Right; + GamePadDPad pad = state.DPad; + GamePadButtons buttons = state.Buttons; + GamePadTriggers triggers = state.Triggers; + GamePadThumbSticks sticks = state.ThumbSticks; + this.ButtonStates = new Dictionary + { + [SButton.DPadUp] = pad.Up, + [SButton.DPadDown] = pad.Down, + [SButton.DPadLeft] = pad.Left, + [SButton.DPadRight] = pad.Right, + + [SButton.ControllerA] = buttons.A, + [SButton.ControllerB] = buttons.B, + [SButton.ControllerX] = buttons.X, + [SButton.ControllerY] = buttons.Y, + [SButton.LeftStick] = buttons.LeftStick, + [SButton.RightStick] = buttons.RightStick, + [SButton.LeftShoulder] = buttons.LeftShoulder, + [SButton.RightShoulder] = buttons.RightShoulder, + [SButton.ControllerBack] = buttons.Back, + [SButton.ControllerStart] = buttons.Start, + [SButton.BigButton] = buttons.BigButton + }; + this.LeftTrigger = triggers.Left; + this.RightTrigger = triggers.Right; + this.LeftStickPos = sticks.Left; + this.RightStickPos = sticks.Right; + } + else + this.ButtonStates = []; } /// @@ -132,10 +135,7 @@ public GamePadStateBuilder OverrideButtons(IDictionary ov // buttons default: - if (this.ButtonStates.ContainsKey(pair.Key)) - this.ButtonStates[pair.Key] = isDown ? ButtonState.Pressed : ButtonState.Released; - else - changed = false; + this.ButtonStates[pair.Key] = isDown ? ButtonState.Pressed : ButtonState.Released; break; } From 39125a3ed21585c3dc76fcb400916abfaabf888d Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Sun, 1 Feb 2026 17:00:47 -0500 Subject: [PATCH 3/3] remove now-unneeded IsConnected property --- src/SMAPI/Framework/Input/GamePadStateBuilder.cs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/SMAPI/Framework/Input/GamePadStateBuilder.cs b/src/SMAPI/Framework/Input/GamePadStateBuilder.cs index 2c20c226e..25993d6ed 100644 --- a/src/SMAPI/Framework/Input/GamePadStateBuilder.cs +++ b/src/SMAPI/Framework/Input/GamePadStateBuilder.cs @@ -36,13 +36,6 @@ internal class GamePadStateBuilder : IInputStateBuilderWhether the gamepad is currently connected. - public bool IsConnected { get; } - - /********* ** Public methods *********/ @@ -51,9 +44,8 @@ internal class GamePadStateBuilder : IInputStateBuilder