Add command input button for Virtual Keyboard Mod
This commit is contained in:
parent
dff5cbcae0
commit
3805301a44
|
@ -5,7 +5,7 @@
|
|||
<RootNamespace>StardewModdingAPI.Mods.SaveBackup</RootNamespace>
|
||||
<TargetFramework>net45</TargetFramework>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<OutputPath>C:\Users\Chris\source\repos\SMAPI\bin\Debug\Mods\SaveBackup\</OutputPath>
|
||||
<OutputPath></OutputPath>
|
||||
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
|
|
|
@ -1,10 +1,12 @@
|
|||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using Microsoft.Xna.Framework;
|
||||
using StardewModdingAPI.Events;
|
||||
using StardewValley;
|
||||
using StardewValley.Menus;
|
||||
using static StardewModdingAPI.Mods.VirtualKeyboard.ModConfig;
|
||||
using System.Reflection;
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
using static StardewModdingAPI.Mods.VirtualKeyboard.ModConfig;
|
||||
|
||||
namespace StardewModdingAPI.Mods.VirtualKeyboard
|
||||
{
|
||||
|
@ -50,8 +52,7 @@ namespace StardewModdingAPI.Mods.VirtualKeyboard
|
|||
helper.Events.Input.ButtonReleased += this.EventInputButtonReleased;
|
||||
helper.Events.Input.ButtonPressed += this.EventInputButtonPressed;
|
||||
|
||||
MainActivity activity = this.helper.Reflection.GetField<MainActivity>(typeof(MainActivity), "instance").GetValue();
|
||||
object score = activity.GetType().GetField("core", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(activity);
|
||||
object score = this.GetSCore(this.helper);
|
||||
object eventManager = score.GetType().GetField("EventManager", BindingFlags.Public | BindingFlags.Instance).GetValue(score);
|
||||
|
||||
this.buttonPressed = eventManager.GetType().GetField("ButtonPressed", BindingFlags.Public | BindingFlags.Instance).GetValue(eventManager);
|
||||
|
@ -61,9 +62,16 @@ namespace StardewModdingAPI.Mods.VirtualKeyboard
|
|||
this.RaiseButtonReleased = this.buttonReleased.GetType().GetMethod("Raise", BindingFlags.Public | BindingFlags.Instance);
|
||||
}
|
||||
|
||||
private object GetSCore(IModHelper helper)
|
||||
{
|
||||
MainActivity activity = this.helper.Reflection.GetField<MainActivity>(typeof(MainActivity), "instance").GetValue();
|
||||
object score = activity.GetType().GetField("core", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(activity);
|
||||
return score;
|
||||
}
|
||||
|
||||
private bool shouldTrigger(Vector2 screenPixels)
|
||||
{
|
||||
if (this.buttonRectangle.Contains(screenPixels.X * Game1.options.zoomLevel, screenPixels.Y * Game1.options.zoomLevel))
|
||||
if (this.buttonRectangle.Contains(screenPixels.X * Game1.options.zoomLevel, screenPixels.Y * Game1.options.zoomLevel) && !this.hidden)
|
||||
{
|
||||
if (!this.hidden)
|
||||
Toolbar.toolbarPressed = true;
|
||||
|
@ -80,7 +88,7 @@ namespace StardewModdingAPI.Mods.VirtualKeyboard
|
|||
}
|
||||
|
||||
Vector2 screenPixels = e.Cursor.ScreenPixels;
|
||||
if (this.shouldTrigger(screenPixels) && !this.hidden)
|
||||
if (this.shouldTrigger(screenPixels))
|
||||
{
|
||||
object inputState = e.GetType().GetField("InputState", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(e);
|
||||
|
||||
|
@ -108,6 +116,31 @@ namespace StardewModdingAPI.Mods.VirtualKeyboard
|
|||
Vector2 screenPixels = e.Cursor.ScreenPixels;
|
||||
if (this.shouldTrigger(screenPixels))
|
||||
{
|
||||
if (this.buttonKey == SButton.RightWindows)
|
||||
{
|
||||
Game1.activeClickableMenu = new NamingMenu(command =>
|
||||
{
|
||||
if (command.Length > 0)
|
||||
{
|
||||
object score = this.GetSCore(this.helper);
|
||||
object sgame = score.GetType().GetField("GameInstance", BindingFlags.Public | BindingFlags.Instance)?.GetValue(score);
|
||||
ConcurrentQueue<string> commandQueue = sgame.GetType().GetProperty("CommandQueue", BindingFlags.Public | BindingFlags.Instance)?.GetValue(sgame) as ConcurrentQueue<string>;
|
||||
commandQueue?.Enqueue(command);
|
||||
Game1.activeClickableMenu.exitThisMenu();
|
||||
}
|
||||
|
||||
}, "Command", "")
|
||||
{
|
||||
randomButton = new ClickableTextureComponent(new Rectangle(-100, -100, 0, 0),
|
||||
Game1.mobileSpriteSheet, new Rectangle(87, 22, 20, 20), 4f, false)
|
||||
};
|
||||
return;
|
||||
}
|
||||
if (this.buttonKey == SButton.RightControl)
|
||||
{
|
||||
SGameConsole.Instance.Show();
|
||||
return;
|
||||
}
|
||||
object inputState = e.GetType().GetField("InputState", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(e);
|
||||
object buttonReleasedEventArgs = Activator.CreateInstance(typeof(ButtonReleasedEventArgs), BindingFlags.NonPublic | BindingFlags.Instance, null, new object[] { this.buttonKey, e.Cursor, inputState }, null);
|
||||
try
|
||||
|
@ -127,9 +160,14 @@ namespace StardewModdingAPI.Mods.VirtualKeyboard
|
|||
/// <param name="e">The event arguments.</param>
|
||||
private void OnRenderingHud(object sender, EventArgs e)
|
||||
{
|
||||
if (!Game1.eventUp && !this.hidden && Game1.activeClickableMenu is GameMenu == false && Game1.activeClickableMenu is ShopMenu == false && Game1.activeClickableMenu is IClickableMenu == false)
|
||||
if (!this.hidden)
|
||||
{
|
||||
IClickableMenu.drawButtonWithText(Game1.spriteBatch, Game1.smallFont, this.alias, this.buttonRectangle.X, this.buttonRectangle.Y, this.buttonRectangle.Width, this.buttonRectangle.Height, Color.BurlyWood * this.transparency);
|
||||
float scale = this.transparency;
|
||||
if (!Game1.eventUp && Game1.activeClickableMenu is GameMenu == false && Game1.activeClickableMenu is ShopMenu == false && Game1.activeClickableMenu is IClickableMenu == false)
|
||||
{
|
||||
scale *= 0.5f;
|
||||
}
|
||||
IClickableMenu.drawButtonWithText(Game1.spriteBatch, Game1.smallFont, this.alias, this.buttonRectangle.X, this.buttonRectangle.Y, this.buttonRectangle.Width, this.buttonRectangle.Height, Color.BurlyWood * scale);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,27 +1,20 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Xna.Framework;
|
||||
using StardewValley;
|
||||
using StardewValley.Menus;
|
||||
|
||||
namespace StardewModdingAPI.Mods.VirtualKeyboard
|
||||
{
|
||||
class ModConfig
|
||||
{
|
||||
public Toggle vToggle = new Toggle(new Rectangle(36, 12, 64, 64));
|
||||
|
||||
public VirtualButton[] buttons { get; set; } = new VirtualButton[] {
|
||||
new VirtualButton(SButton.Q, new Rect(192, 150, 90, 90, 6), 0.5f),
|
||||
new VirtualButton(SButton.I, new Rect(288, 150, 90, 90, 6), 0.5f),
|
||||
new VirtualButton(SButton.O, new Rect(384, 150, 90, 90, 6), 0.5f),
|
||||
new VirtualButton(SButton.P, new Rect(480, 150, 90, 90, 6), 0.5f),
|
||||
new VirtualButton(SButton.MouseRight, new Rect(580, 150, 150, 90, 6), 0.5f, "RightMouse")
|
||||
public Toggle vToggle = new Toggle(new Rect(36, 12, 64, 64));
|
||||
public VirtualButton[] buttons { get; set;} = new VirtualButton[] {
|
||||
new VirtualButton(SButton.Q, new Rect(192, 80, 90, 90), 0.5f),
|
||||
new VirtualButton(SButton.I, new Rect(288, 80, 90, 90), 0.5f),
|
||||
new VirtualButton(SButton.O, new Rect(384, 80, 90, 90), 0.5f),
|
||||
new VirtualButton(SButton.P, new Rect(480, 80, 90, 90), 0.5f)
|
||||
};
|
||||
internal class VirtualButton
|
||||
{
|
||||
public VirtualButton[] buttonsExtend { get; set; } = new VirtualButton[] {
|
||||
new VirtualButton(SButton.MouseRight, new Rect(192, 170, 162, 90), 0.5f, "RightMouse"),
|
||||
new VirtualButton(SButton.RightWindows, new Rect(362, 170, 162, 90), 0.5f, "Command"),
|
||||
new VirtualButton(SButton.RightControl, new Rect(532, 170, 162, 90), 0.5f, "Console")
|
||||
};
|
||||
internal class VirtualButton {
|
||||
public SButton key;
|
||||
public Rect rectangle;
|
||||
public float transparency;
|
||||
|
@ -34,13 +27,12 @@ namespace StardewModdingAPI.Mods.VirtualKeyboard
|
|||
this.alias = alias;
|
||||
}
|
||||
}
|
||||
|
||||
internal class Toggle
|
||||
{
|
||||
public Rectangle rectangle;
|
||||
public Rect rectangle;
|
||||
//public float scale;
|
||||
|
||||
public Toggle(Rectangle rectangle)
|
||||
public Toggle(Rect rectangle)
|
||||
{
|
||||
this.rectangle = rectangle;
|
||||
//this.scale = scale;
|
||||
|
@ -52,15 +44,13 @@ namespace StardewModdingAPI.Mods.VirtualKeyboard
|
|||
public int Y;
|
||||
public int Width;
|
||||
public int Height;
|
||||
public int Padding;
|
||||
|
||||
public Rect(int x, int y, int width, int height, int padding)
|
||||
public Rect(int x, int y, int width, int height)
|
||||
{
|
||||
this.X = x;
|
||||
this.Y = y;
|
||||
this.Width = width;
|
||||
this.Height = height;
|
||||
this.Padding = padding;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using StardewModdingAPI;
|
||||
using StardewValley;
|
||||
using StardewValley.Tools;
|
||||
|
||||
namespace StardewModdingAPI.Mods.VirtualKeyboard
|
||||
{
|
||||
public class ModEntry : Mod
|
||||
class ModEntry : Mod
|
||||
{
|
||||
public override void Entry(IModHelper helper)
|
||||
{
|
||||
|
|
|
@ -13,11 +13,12 @@ namespace StardewModdingAPI.Mods.VirtualKeyboard
|
|||
private readonly IModHelper helper;
|
||||
private readonly IMonitor Monitor;
|
||||
|
||||
private bool enabled = false;
|
||||
private int enabledStage = 0;
|
||||
private bool isDefault = true;
|
||||
private ClickableTextureComponent virtualToggleButton;
|
||||
|
||||
private List<KeyButton> keyboard = new List<KeyButton>();
|
||||
private List<KeyButton> keyboardExtend = new List<KeyButton>();
|
||||
private ModConfig modConfig;
|
||||
private Texture2D texture;
|
||||
|
||||
|
@ -30,6 +31,8 @@ namespace StardewModdingAPI.Mods.VirtualKeyboard
|
|||
this.modConfig = helper.ReadConfig<ModConfig>();
|
||||
for (int i = 0; i < this.modConfig.buttons.Length; i++)
|
||||
this.keyboard.Add(new KeyButton(helper, this.modConfig.buttons[i], this.Monitor));
|
||||
for (int i = 0; i < this.modConfig.buttonsExtend.Length; i++)
|
||||
this.keyboardExtend.Add(new KeyButton(helper, this.modConfig.buttonsExtend[i], this.Monitor));
|
||||
|
||||
if (this.modConfig.vToggle.rectangle.X != 36 || this.modConfig.vToggle.rectangle.Y != 12)
|
||||
this.isDefault = false;
|
||||
|
@ -44,30 +47,48 @@ namespace StardewModdingAPI.Mods.VirtualKeyboard
|
|||
private void VirtualToggleButtonPressed(object sender, ButtonPressedEventArgs e)
|
||||
{
|
||||
Vector2 screenPixels = e.Cursor.ScreenPixels;
|
||||
if (!this.enabled && this.shouldTrigger(screenPixels))
|
||||
if (this.shouldTrigger(screenPixels))
|
||||
{
|
||||
this.hiddenKeys(true, false);
|
||||
}
|
||||
else if (this.enabled && this.shouldTrigger(screenPixels))
|
||||
{
|
||||
this.hiddenKeys(false, true);
|
||||
if (Game1.activeClickableMenu is IClickableMenu menu)
|
||||
switch (this.enabledStage)
|
||||
{
|
||||
menu.exitThisMenu();
|
||||
Toolbar.toolbarPressed = true;
|
||||
case 0:
|
||||
foreach (var keys in this.keyboard)
|
||||
{
|
||||
keys.hidden = false;
|
||||
}
|
||||
foreach (var keys in this.keyboardExtend)
|
||||
{
|
||||
keys.hidden = true;
|
||||
}
|
||||
this.enabledStage = 1;
|
||||
break;
|
||||
case 1 when this.keyboardExtend.Count > 0:
|
||||
foreach (var keys in this.keyboardExtend)
|
||||
{
|
||||
keys.hidden = false;
|
||||
}
|
||||
this.enabledStage = 2;
|
||||
break;
|
||||
default:
|
||||
foreach (var keys in this.keyboard)
|
||||
{
|
||||
keys.hidden = true;
|
||||
}
|
||||
foreach (var keys in this.keyboardExtend)
|
||||
{
|
||||
keys.hidden = true;
|
||||
}
|
||||
this.enabledStage = 0;
|
||||
if (Game1.activeClickableMenu is IClickableMenu menu)
|
||||
{
|
||||
menu.exitThisMenu();
|
||||
Toolbar.toolbarPressed = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void hiddenKeys(bool enabled, bool hidden)
|
||||
{
|
||||
this.enabled = enabled;
|
||||
foreach (var keys in this.keyboard)
|
||||
{
|
||||
keys.hidden = hidden;
|
||||
}
|
||||
}
|
||||
|
||||
private bool shouldTrigger(Vector2 screenPixels)
|
||||
{
|
||||
if (this.virtualToggleButton.containsPoint((int)(screenPixels.X * Game1.options.zoomLevel), (int)(screenPixels.Y * Game1.options.zoomLevel)))
|
||||
|
@ -104,12 +125,13 @@ namespace StardewModdingAPI.Mods.VirtualKeyboard
|
|||
}
|
||||
|
||||
float scale = 1f;
|
||||
if (!this.enabled)
|
||||
if (this.enabledStage == 0)
|
||||
{
|
||||
scale = 0.5f;
|
||||
}
|
||||
if(!Game1.eventUp && Game1.activeClickableMenu is GameMenu == false && Game1.activeClickableMenu is ShopMenu == false)
|
||||
this.virtualToggleButton.draw(Game1.spriteBatch, Color.White * scale, 0.000001f);
|
||||
if (!Game1.eventUp && Game1.activeClickableMenu is GameMenu == false && Game1.activeClickableMenu is ShopMenu == false)
|
||||
scale = 0.25f;
|
||||
this.virtualToggleButton.draw(Game1.spriteBatch, Color.White * scale, 0.000001f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
<AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
|
||||
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
|
||||
<AndroidUseLatestPlatformSdk>false</AndroidUseLatestPlatformSdk>
|
||||
<TargetFrameworkVersion>v10.0</TargetFrameworkVersion>
|
||||
<TargetFrameworkVersion>v9.0</TargetFrameworkVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
|
@ -83,9 +83,6 @@
|
|||
<Reference Include="xTile">
|
||||
<HintPath>..\..\..\..\..\AndroidStudioProjects\SMAPI Android Installer\app\src\main\assets\Stardew\xTile.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="TMXTile">
|
||||
<HintPath>..\..\..\..\..\AndroidStudioProjects\SMAPI Android Installer\app\src\main\assets\Stardew\TMXTile.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Constants.cs" />
|
||||
|
@ -239,10 +236,6 @@
|
|||
<Compile Include="Framework\Networking\MultiplayerPeerMod.cs" />
|
||||
<Compile Include="Framework\Networking\RemoteContextModel.cs" />
|
||||
<Compile Include="Framework\Networking\RemoteContextModModel.cs" />
|
||||
<Compile Include="Framework\Networking\SGalaxyNetClient.cs" />
|
||||
<Compile Include="Framework\Networking\SGalaxyNetServer.cs" />
|
||||
<Compile Include="Framework\Networking\SLidgrenClient.cs" />
|
||||
<Compile Include="Framework\Networking\SLidgrenServer.cs" />
|
||||
<Compile Include="Framework\Patching\GamePatcher.cs" />
|
||||
<Compile Include="Framework\Patching\IHarmonyPatch.cs" />
|
||||
<Compile Include="Framework\PerformanceMonitoring\AlertContext.cs" />
|
||||
|
|
Loading…
Reference in New Issue