summaryrefslogtreecommitdiff
path: root/src/SMAPI
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI')
-rw-r--r--src/SMAPI/Events/EventArgsInput.cs18
-rw-r--r--src/SMAPI/Events/InputEvents.cs15
-rw-r--r--src/SMAPI/Framework/SGame.cs13
3 files changed, 27 insertions, 19 deletions
diff --git a/src/SMAPI/Events/EventArgsInput.cs b/src/SMAPI/Events/EventArgsInput.cs
index 617dac35..ff904675 100644
--- a/src/SMAPI/Events/EventArgsInput.cs
+++ b/src/SMAPI/Events/EventArgsInput.cs
@@ -2,7 +2,6 @@ using System;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
-using StardewModdingAPI.Utilities;
using StardewValley;
namespace StardewModdingAPI.Events
@@ -20,7 +19,14 @@ namespace StardewModdingAPI.Events
public ICursorPosition Cursor { get; set; }
/// <summary>Whether the input is considered a 'click' by the game for enabling action.</summary>
- public bool IsClick { get; }
+ [Obsolete("Use " + nameof(EventArgsInput.IsActionButton) + " or " + nameof(EventArgsInput.IsUseToolButton) + " instead")] // deprecated in SMAPI 2.1
+ public bool IsClick => this.IsActionButton;
+
+ /// <summary>Whether the input should trigger actions on the affected tile.</summary>
+ public bool IsActionButton { get; }
+
+ /// <summary>Whether the input should use tools on the affected tile.</summary>
+ public bool IsUseToolButton { get; }
/*********
@@ -29,12 +35,14 @@ namespace StardewModdingAPI.Events
/// <summary>Construct an instance.</summary>
/// <param name="button">The button on the controller, keyboard, or mouse.</param>
/// <param name="cursor">The cursor position.</param>
- /// <param name="isClick">Whether the input is considered a 'click' by the game for enabling action.</param>
- public EventArgsInput(SButton button, ICursorPosition cursor, bool isClick)
+ /// <param name="isActionButton">Whether the input should trigger actions on the affected tile.</param>
+ /// <param name="isUseToolButton">Whether the input should use tools on the affected tile.</param>
+ public EventArgsInput(SButton button, ICursorPosition cursor, bool isActionButton, bool isUseToolButton)
{
this.Button = button;
this.Cursor = cursor;
- this.IsClick = isClick;
+ this.IsActionButton = isActionButton;
+ this.IsUseToolButton = isUseToolButton;
}
/// <summary>Prevent the game from handling the vurrent button press. This doesn't prevent other mods from receiving the event.</summary>
diff --git a/src/SMAPI/Events/InputEvents.cs b/src/SMAPI/Events/InputEvents.cs
index c31eb698..985aed99 100644
--- a/src/SMAPI/Events/InputEvents.cs
+++ b/src/SMAPI/Events/InputEvents.cs
@@ -1,6 +1,5 @@
using System;
using StardewModdingAPI.Framework;
-using StardewModdingAPI.Utilities;
namespace StardewModdingAPI.Events
{
@@ -24,20 +23,22 @@ namespace StardewModdingAPI.Events
/// <param name="monitor">Encapsulates monitoring and logging.</param>
/// <param name="button">The button on the controller, keyboard, or mouse.</param>
/// <param name="cursor">The cursor position.</param>
- /// <param name="isClick">Whether the input is considered a 'click' by the game for enabling action.</param>
- internal static void InvokeButtonPressed(IMonitor monitor, SButton button, ICursorPosition cursor, bool isClick)
+ /// <param name="isActionButton">Whether the input should trigger actions on the affected tile.</param>
+ /// <param name="isUseToolButton">Whether the input should use tools on the affected tile.</param>
+ internal static void InvokeButtonPressed(IMonitor monitor, SButton button, ICursorPosition cursor, bool isActionButton, bool isUseToolButton)
{
- monitor.SafelyRaiseGenericEvent($"{nameof(InputEvents)}.{nameof(InputEvents.ButtonPressed)}", InputEvents.ButtonPressed?.GetInvocationList(), null, new EventArgsInput(button, cursor, isClick));
+ monitor.SafelyRaiseGenericEvent($"{nameof(InputEvents)}.{nameof(InputEvents.ButtonPressed)}", InputEvents.ButtonPressed?.GetInvocationList(), null, new EventArgsInput(button, cursor, isActionButton, isUseToolButton));
}
/// <summary>Raise a <see cref="ButtonReleased"/> event.</summary>
/// <param name="monitor">Encapsulates monitoring and logging.</param>
/// <param name="button">The button on the controller, keyboard, or mouse.</param>
/// <param name="cursor">The cursor position.</param>
- /// <param name="isClick">Whether the input is considered a 'click' by the game for enabling action.</param>
- internal static void InvokeButtonReleased(IMonitor monitor, SButton button, ICursorPosition cursor, bool isClick)
+ /// <param name="isActionButton">Whether the input should trigger actions on the affected tile.</param>
+ /// <param name="isUseToolButton">Whether the input should use tools on the affected tile.</param>
+ internal static void InvokeButtonReleased(IMonitor monitor, SButton button, ICursorPosition cursor, bool isActionButton, bool isUseToolButton)
{
- monitor.SafelyRaiseGenericEvent($"{nameof(InputEvents)}.{nameof(InputEvents.ButtonReleased)}", InputEvents.ButtonReleased?.GetInvocationList(), null, new EventArgsInput(button, cursor, isClick));
+ monitor.SafelyRaiseGenericEvent($"{nameof(InputEvents)}.{nameof(InputEvents.ButtonReleased)}", InputEvents.ButtonReleased?.GetInvocationList(), null, new EventArgsInput(button, cursor, isActionButton, isUseToolButton));
}
}
}
diff --git a/src/SMAPI/Framework/SGame.cs b/src/SMAPI/Framework/SGame.cs
index 6f8f7cef..ca19d726 100644
--- a/src/SMAPI/Framework/SGame.cs
+++ b/src/SMAPI/Framework/SGame.cs
@@ -12,7 +12,6 @@ using Microsoft.Xna.Framework.Input;
using StardewModdingAPI.Events;
using StardewModdingAPI.Framework.Reflection;
using StardewModdingAPI.Framework.Utilities;
-using StardewModdingAPI.Utilities;
using StardewValley;
using StardewValley.BellsAndWhistles;
using StardewValley.Locations;
@@ -371,7 +370,8 @@ namespace StardewModdingAPI.Framework
SButton[] previousPressedKeys = this.PreviousPressedButtons;
SButton[] framePressedKeys = currentlyPressedKeys.Except(previousPressedKeys).ToArray();
SButton[] frameReleasedKeys = previousPressedKeys.Except(currentlyPressedKeys).ToArray();
- bool isClick = framePressedKeys.Contains(SButton.MouseLeft) || (framePressedKeys.Contains(SButton.ControllerA) && !currentlyPressedKeys.Contains(SButton.ControllerX));
+ bool isUseToolButton = Game1.options.useToolButton.Any(p => framePressedKeys.Contains(p.ToSButton()));
+ bool isActionButton = !isUseToolButton && Game1.options.actionButton.Any(p => framePressedKeys.Contains(p.ToSButton()));
// get cursor position
ICursorPosition cursor;
@@ -388,7 +388,7 @@ namespace StardewModdingAPI.Framework
// raise button pressed
foreach (SButton button in framePressedKeys)
{
- InputEvents.InvokeButtonPressed(this.Monitor, button, cursor, isClick);
+ InputEvents.InvokeButtonPressed(this.Monitor, button, cursor, isActionButton, isUseToolButton);
// legacy events
if (button.TryGetKeyboard(out Keys key))
@@ -408,10 +408,9 @@ namespace StardewModdingAPI.Framework
// raise button released
foreach (SButton button in frameReleasedKeys)
{
- bool wasClick =
- (button == SButton.MouseLeft && previousPressedKeys.Contains(SButton.MouseLeft)) // released left click
- || (button == SButton.ControllerA && previousPressedKeys.Contains(SButton.ControllerA) && !previousPressedKeys.Contains(SButton.ControllerX));
- InputEvents.InvokeButtonReleased(this.Monitor, button, cursor, wasClick);
+ bool wasUseToolButton = (from opt in Game1.options.useToolButton let optButton = opt.ToSButton() where optButton == button && framePressedKeys.Contains(optButton) select optButton).Any();
+ bool wasActionButton = !wasUseToolButton && (from opt in Game1.options.actionButton let optButton = opt.ToSButton() where optButton == button && framePressedKeys.Contains(optButton) select optButton).Any();
+ InputEvents.InvokeButtonReleased(this.Monitor, button, cursor, wasActionButton, wasUseToolButton);
// legacy events
if (button.TryGetKeyboard(out Keys key))