From 9a1b910ea32f518b605c88315f192afc6fc40f28 Mon Sep 17 00:00:00 2001 From: Zoryn Date: Thu, 3 Mar 2016 15:06:25 -0500 Subject: resync for merge conflicts --- .gitignore | 1 - Release/Mods/TrainerMod.dll | Bin 23552 -> 24064 bytes Release/StardewModdingAPI.exe | Bin 69120 -> 72704 bytes StardewInjector/App.config | 15 + StardewInjector/CecilUtils.cs | 173 + StardewInjector/Config.cs | 72 + StardewInjector/Program.cs | 30 + StardewInjector/Properties/AssemblyInfo.cs | 36 + StardewInjector/StardewHooker.cs | 190 + StardewInjector/StardewInjector.cs | 55 + StardewInjector/StardewInjector.csproj | 77 + StardewInjector/bin/Debug/Lidgren.Network.dll | Bin 0 -> 123904 bytes .../bin/Debug/Microsoft.Xna.Framework.Game.dll | Bin 0 -> 74752 bytes .../bin/Debug/Microsoft.Xna.Framework.Game.xml | 625 ++ .../bin/Debug/Microsoft.Xna.Framework.Graphics.dll | Bin 0 -> 427520 bytes .../bin/Debug/Microsoft.Xna.Framework.Graphics.xml | 3431 +++++++++ .../bin/Debug/Microsoft.Xna.Framework.Xact.dll | Bin 0 -> 75776 bytes .../bin/Debug/Microsoft.Xna.Framework.Xact.xml | 283 + .../bin/Debug/Microsoft.Xna.Framework.dll | Bin 0 -> 679424 bytes .../bin/Debug/Microsoft.Xna.Framework.xml | 7375 ++++++++++++++++++++ StardewInjector/bin/Debug/Mono.Cecil.dll | Bin 0 -> 280576 bytes StardewInjector/bin/Debug/Stardew Valley.exe | Bin 0 -> 2185728 bytes StardewInjector/bin/Debug/StardewInjector.dll | Bin 0 -> 18432 bytes .../bin/Debug/StardewInjector.dll.config | 15 + StardewInjector/bin/Debug/StardewInjector.pdb | Bin 0 -> 42496 bytes StardewInjector/bin/Debug/StardewModdingAPI.exe | Bin 0 -> 72704 bytes StardewInjector/bin/Debug/StardewModdingAPI.pdb | Bin 0 -> 138752 bytes StardewInjector/bin/Debug/Steamworks.NET.dll | Bin 0 -> 249856 bytes StardewInjector/bin/Debug/steam_appid.txt | 1 + StardewInjector/bin/Debug/xTile.dll | Bin 0 -> 157696 bytes .../DesignTimeResolveAssemblyReferencesInput.cache | Bin 0 -> 7163 bytes .../StardewInjector.csproj.FileListAbsolute.txt | 22 + ...ewInjector.csprojResolveAssemblyReference.cache | Bin 0 -> 60415 bytes StardewInjector/obj/Debug/StardewInjector.dll | Bin 0 -> 18432 bytes StardewInjector/obj/Debug/StardewInjector.pdb | Bin 0 -> 42496 bytes ...tedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs | 0 ...tedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs | 0 ...tedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs | 0 StardewInjector/packages.config | 4 + StardewModdingAPI.sln | 28 +- StardewModdingAPI.v12.suo | Bin 58880 -> 89088 bytes StardewModdingAPI/Command.cs | 2 +- StardewModdingAPI/Program.cs | 540 +- StardewModdingAPI/StardewModdingAPI.csproj | 104 - .../StardewModdingAPI.csproj.FileListAbsolute.txt | 39 - TrainerMod/TrainerMod.cs | 2 +- TrainerMod/TrainerMod.csproj | 1 - TrainerMod/bin/Debug/Lidgren.Network.dll | Bin 0 -> 123904 bytes .../bin/Debug/Microsoft.Xna.Framework.Xact.dll | Bin 0 -> 75776 bytes .../bin/Debug/Microsoft.Xna.Framework.Xact.xml | 283 + TrainerMod/bin/Debug/StardewModdingAPI.exe | Bin 0 -> 72704 bytes TrainerMod/bin/Debug/StardewModdingAPI.pdb | Bin 0 -> 138752 bytes TrainerMod/bin/Debug/Steamworks.NET.dll | Bin 0 -> 249856 bytes TrainerMod/bin/Debug/TrainerMod.dll | Bin 23552 -> 24064 bytes TrainerMod/bin/Debug/TrainerMod.pdb | Bin 34304 -> 34304 bytes TrainerMod/bin/Debug/steam_appid.txt | 1 + TrainerMod/bin/Debug/xTile.dll | Bin 0 -> 157696 bytes .../DesignTimeResolveAssemblyReferencesInput.cache | Bin 6915 -> 7012 bytes .../Debug/TrainerMod.csproj.FileListAbsolute.txt | 8 + ...TrainerMod.csprojResolveAssemblyReference.cache | Bin 75042 -> 79113 bytes TrainerMod/obj/Debug/TrainerMod.dll | Bin 23552 -> 24064 bytes TrainerMod/obj/Debug/TrainerMod.pdb | Bin 34304 -> 34304 bytes UpgradeLog.htm | Bin 0 -> 28862 bytes UpgradeLog2.htm | Bin 0 -> 28862 bytes 64 files changed, 12726 insertions(+), 687 deletions(-) create mode 100644 StardewInjector/App.config create mode 100644 StardewInjector/CecilUtils.cs create mode 100644 StardewInjector/Config.cs create mode 100644 StardewInjector/Program.cs create mode 100644 StardewInjector/Properties/AssemblyInfo.cs create mode 100644 StardewInjector/StardewHooker.cs create mode 100644 StardewInjector/StardewInjector.cs create mode 100644 StardewInjector/StardewInjector.csproj create mode 100644 StardewInjector/bin/Debug/Lidgren.Network.dll create mode 100644 StardewInjector/bin/Debug/Microsoft.Xna.Framework.Game.dll create mode 100644 StardewInjector/bin/Debug/Microsoft.Xna.Framework.Game.xml create mode 100644 StardewInjector/bin/Debug/Microsoft.Xna.Framework.Graphics.dll create mode 100644 StardewInjector/bin/Debug/Microsoft.Xna.Framework.Graphics.xml create mode 100644 StardewInjector/bin/Debug/Microsoft.Xna.Framework.Xact.dll create mode 100644 StardewInjector/bin/Debug/Microsoft.Xna.Framework.Xact.xml create mode 100644 StardewInjector/bin/Debug/Microsoft.Xna.Framework.dll create mode 100644 StardewInjector/bin/Debug/Microsoft.Xna.Framework.xml create mode 100644 StardewInjector/bin/Debug/Mono.Cecil.dll create mode 100644 StardewInjector/bin/Debug/Stardew Valley.exe create mode 100644 StardewInjector/bin/Debug/StardewInjector.dll create mode 100644 StardewInjector/bin/Debug/StardewInjector.dll.config create mode 100644 StardewInjector/bin/Debug/StardewInjector.pdb create mode 100644 StardewInjector/bin/Debug/StardewModdingAPI.exe create mode 100644 StardewInjector/bin/Debug/StardewModdingAPI.pdb create mode 100644 StardewInjector/bin/Debug/Steamworks.NET.dll create mode 100644 StardewInjector/bin/Debug/steam_appid.txt create mode 100644 StardewInjector/bin/Debug/xTile.dll create mode 100644 StardewInjector/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache create mode 100644 StardewInjector/obj/Debug/StardewInjector.csproj.FileListAbsolute.txt create mode 100644 StardewInjector/obj/Debug/StardewInjector.csprojResolveAssemblyReference.cache create mode 100644 StardewInjector/obj/Debug/StardewInjector.dll create mode 100644 StardewInjector/obj/Debug/StardewInjector.pdb create mode 100644 StardewInjector/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs create mode 100644 StardewInjector/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs create mode 100644 StardewInjector/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs create mode 100644 StardewInjector/packages.config create mode 100644 TrainerMod/bin/Debug/Lidgren.Network.dll create mode 100644 TrainerMod/bin/Debug/Microsoft.Xna.Framework.Xact.dll create mode 100644 TrainerMod/bin/Debug/Microsoft.Xna.Framework.Xact.xml create mode 100644 TrainerMod/bin/Debug/StardewModdingAPI.exe create mode 100644 TrainerMod/bin/Debug/StardewModdingAPI.pdb create mode 100644 TrainerMod/bin/Debug/Steamworks.NET.dll create mode 100644 TrainerMod/bin/Debug/steam_appid.txt create mode 100644 TrainerMod/bin/Debug/xTile.dll create mode 100644 UpgradeLog.htm create mode 100644 UpgradeLog2.htm diff --git a/.gitignore b/.gitignore index ab067b03..4737a5d6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ StardewModdingAPI/bin/ StardewModdingAPI/obj/ packages/ -StardewInjector/ *.symlink *.lnk diff --git a/Release/Mods/TrainerMod.dll b/Release/Mods/TrainerMod.dll index bcf663ab..d39f4375 100644 Binary files a/Release/Mods/TrainerMod.dll and b/Release/Mods/TrainerMod.dll differ diff --git a/Release/StardewModdingAPI.exe b/Release/StardewModdingAPI.exe index 5c6d556b..c4813237 100644 Binary files a/Release/StardewModdingAPI.exe and b/Release/StardewModdingAPI.exe differ diff --git a/StardewInjector/App.config b/StardewInjector/App.config new file mode 100644 index 00000000..f1914205 --- /dev/null +++ b/StardewInjector/App.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/StardewInjector/CecilUtils.cs b/StardewInjector/CecilUtils.cs new file mode 100644 index 00000000..acdf5198 --- /dev/null +++ b/StardewInjector/CecilUtils.cs @@ -0,0 +1,173 @@ +using Mono.Cecil; +using Mono.Cecil.Cil; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace StardewInjector +{ + public struct ScannerState + { + public ILProcessor ILProcessor; + public Instruction Instruction; + + public ScannerState(ILProcessor ilProc, Instruction ins) + { + ILProcessor = ilProc; + Instruction = ins; + } + + public ScannerState Previous(Func until = null) + { + if (until != null) + { + Instruction cur = this.Instruction; + do + { + cur = cur.Previous; + } while (!until(cur)); + return new ScannerState(this.ILProcessor, cur); + } + return new ScannerState(this.ILProcessor, Instruction.Previous); + } + + public ScannerState Next(Func until = null) + { + if (until != null) + { + Instruction cur = this.Instruction; + do + { + cur = cur.Next; + } while (!until(cur)); + return new ScannerState(this.ILProcessor, cur); + } + return new ScannerState(this.ILProcessor, Instruction.Next); + } + + public ScannerState Last() + { + var instructions = this.ILProcessor.Body.Instructions; + return new ScannerState(this.ILProcessor, instructions[instructions.Count - 1]); + } + + public ScannerState First() + { + var instructions = this.ILProcessor.Body.Instructions; + return new ScannerState(this.ILProcessor, instructions[0]); + } + + public ScannerState ReplaceCreate(OpCode opcode) + { + Instruction ins = this.ILProcessor.Create(opcode); + this.ILProcessor.Replace(this.Instruction, ins); + return new ScannerState(this.ILProcessor, ins); + } + + public ScannerState ReplaceCreate(OpCode opcode, object arg) + { + Instruction ins = this.ILProcessor.Create(opcode, arg as dynamic); + this.ILProcessor.Replace(this.Instruction, ins); + return new ScannerState(this.ILProcessor, ins); + } + + public ScannerState CreateBefore(OpCode opcode) + { + Instruction ins = this.ILProcessor.Create(opcode); + this.ILProcessor.InsertBefore(this.Instruction, ins); + return new ScannerState(this.ILProcessor, ins); + } + + public ScannerState CreateBefore(OpCode opcode, object arg) + { + Instruction ins = this.ILProcessor.Create(opcode, arg as dynamic); + this.ILProcessor.InsertBefore(this.Instruction, ins); + return new ScannerState(this.ILProcessor, ins); + } + + public ScannerState CreateAfter(OpCode opcode) + { + Instruction ins = this.ILProcessor.Create(opcode); + this.ILProcessor.InsertAfter(this.Instruction, ins); + return new ScannerState(this.ILProcessor, ins); + } + + public ScannerState CreateAfter(OpCode opcode, object arg) + { + Instruction ins = this.ILProcessor.Create(opcode, arg as dynamic); + this.ILProcessor.InsertAfter(this.Instruction, ins); + return new ScannerState(this.ILProcessor, ins); + } + } + + public static class CecilUtils + { + public static ScannerState Scanner(this MethodDefinition me) + { + return new ScannerState(me.Body.GetILProcessor(), me.Body.Instructions[0]); + } + + public static ScannerState FindSetField(this MethodDefinition me, string fieldName) + { + var instruction = me.Body.Instructions + .FirstOrDefault(i => i.OpCode == OpCodes.Stsfld && (i.Operand as FieldDefinition).Name == fieldName); + return new ScannerState(me.Body.GetILProcessor(), instruction); + } + + public static ScannerState FindLoadField(this MethodDefinition me, string fieldName) + { + var instruction = me.Body.Instructions + .FirstOrDefault(i => { + if (i.OpCode != OpCodes.Ldfld && i.OpCode != OpCodes.Ldsfld) + return false; + if (i.Operand is FieldDefinition && (i.Operand as FieldDefinition).Name == fieldName) + return true; + if (i.Operand is FieldReference && (i.Operand as FieldReference).Name == fieldName) + return true; + return false; + }); + return new ScannerState(me.Body.GetILProcessor(), instruction); + } + + public static ScannerState FindLoadConstant(this MethodDefinition me, int val) + { + var instruction = me.Body.Instructions + .FirstOrDefault(i => i.OpCode == OpCodes.Ldc_I4 && (int)i.Operand == val); + return new ScannerState(me.Body.GetILProcessor(), instruction); + } + + public static ScannerState FindLoadConstant(this MethodDefinition me, float val) + { + var instruction = me.Body.Instructions + .FirstOrDefault(i => i.OpCode == OpCodes.Ldc_R4 && (float)i.Operand == val); + return new ScannerState(me.Body.GetILProcessor(), instruction); + } + + public static MethodDefinition FindMethod(this ModuleDefinition me, string name) + { + var nameSplit = name.Split(new string[] { "::" }, StringSplitOptions.RemoveEmptyEntries); + if (nameSplit.Length < 2) + throw new ArgumentException("Invalid method full name", "name"); + + var currentType = me.Types.FirstOrDefault(t => t.FullName == nameSplit[0]); + if (currentType == null) + return null; + + return currentType.Methods.FirstOrDefault(m => m.Name == nameSplit[1]); + } + + public static FieldDefinition FindField(this ModuleDefinition me, string name) + { + var nameSplit = name.Split(new string[] { "::" }, StringSplitOptions.RemoveEmptyEntries); + if (nameSplit.Length < 2) + throw new ArgumentException("Invalid field full name", "name"); + + var currentType = me.Types.FirstOrDefault(t => t.FullName == nameSplit[0]); + if (currentType == null) + return null; + + return currentType.Fields.FirstOrDefault(m => m.Name == nameSplit[1]); + } + } +} diff --git a/StardewInjector/Config.cs b/StardewInjector/Config.cs new file mode 100644 index 00000000..cea45e98 --- /dev/null +++ b/StardewInjector/Config.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Text; + +namespace StardewInjector +{ + public static class Config + { + public static bool EnableDebugMode + { + get + { + bool val = false; + bool.TryParse(ConfigurationManager.AppSettings["EnableDebugMode"], out val); + return val; + } + } + + public static bool EnableAlwaysSpawnFishingBubble + { + get + { + bool val = false; + bool.TryParse(ConfigurationManager.AppSettings["EnableAlwaysSpawnFishingBubble"], out val); + return val; + } + } + + public static bool EnableEasyFishing + { + get + { + bool val = false; + bool.TryParse(ConfigurationManager.AppSettings["EnableEasyFishing"], out val); + return val; + } + } + + public static int SecondsPerTenMinutes + { + get + { + int val = 7; + int.TryParse(ConfigurationManager.AppSettings["SecondsPerTenMinutes"], out val); + return val; + } + } + + public static float RunSpeed + { + get + { + float val = 1f; + float.TryParse(ConfigurationManager.AppSettings["RunSpeed"], out val); + return val; + } + } + + public static bool EnableTweakedDiagonalMovement + { + get + { + bool val = false; + bool.TryParse(ConfigurationManager.AppSettings["EnableTweakedDiagonalMovement"], out val); + return val; + } + } + + } +} diff --git a/StardewInjector/Program.cs b/StardewInjector/Program.cs new file mode 100644 index 00000000..41c72240 --- /dev/null +++ b/StardewInjector/Program.cs @@ -0,0 +1,30 @@ +/* +using Mono.Cecil; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace Stardew_Injector +{ + class Program + { + + private static Stardew_Hooker hooker = new Stardew_Hooker(); + + static void Main(string[] args) + { + hooker.Initialize(); + hooker.ApplyHooks(); + hooker.Finalize(); + + hooker.Run(); + Console.ReadLine(); + } + + } +} +*/ \ No newline at end of file diff --git a/StardewInjector/Properties/AssemblyInfo.cs b/StardewInjector/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..0ba4aafe --- /dev/null +++ b/StardewInjector/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("StardewInjector")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("StardewInjector")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("820406dc-ae78-461f-8c7f-6329f34f986c")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/StardewInjector/StardewHooker.cs b/StardewInjector/StardewHooker.cs new file mode 100644 index 00000000..a92b96c1 --- /dev/null +++ b/StardewInjector/StardewHooker.cs @@ -0,0 +1,190 @@ +using Microsoft.Xna.Framework; +using Mono.Cecil; +using Mono.Cecil.Cil; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using StardewModdingAPI; + +namespace StardewInjector +{ + public class Stardew_Hooker + { + private AssemblyDefinition m_vAsmDefinition = null; + private ModuleDefinition m_vModDefinition = null; + private Assembly m_vAssembly = null; + + public bool Initialize() + { + Console.WriteLine("Initiating StarDew_Injector...."); + try + { + this.m_vAsmDefinition = AssemblyDefinition.ReadAssembly(@"Stardew Valley.exe"); + this.m_vModDefinition = this.m_vAsmDefinition.MainModule; + return true; + } + catch (Exception ex) + { + Program.LogError(ex); + return false; + } + } + + public bool Finalize() + { + Console.WriteLine("Finalizing StarDew_Injector...."); + try + { + if (this.m_vAsmDefinition == null) + return false; + + using (MemoryStream mStream = new MemoryStream()) + { + // Write the edited data to the memory stream.. + this.m_vAsmDefinition.Write(mStream); + + // Load the new assembly from the memory stream buffer.. + this.m_vAssembly = Assembly.Load(mStream.GetBuffer()); + + Program.StardewAssembly = m_vAssembly; + + return true; + } + } + catch (Exception ex) + { + Program.LogError(ex); + return false; + } + } + + public bool Run() + { + if (this.m_vAssembly == null) + return false; + + Console.WriteLine("Starting Stardew Valley..."); + + m_vAssembly.EntryPoint.Invoke(null, new object[] {new string[0]}); + + return true; + } + + public void ApplyHooks() + { + Console.WriteLine("Applying StarDew_Injector...."); + try + { + InjectMovementSpeed(); + + if (Config.SecondsPerTenMinutes != 7) + InjectClockScale(); + + if (Config.EnableEasyFishing) + InjectEasyFishing(); + + if (Config.EnableAlwaysSpawnFishingBubble) + InjectMoreBubbles(); + + /* + if (Config.EnableDebugMode) + InjectDebugMode(); + */ + } + catch (Exception ex) + { + Program.LogError(ex); + } + + } + + private void InjectDebugMode() + { + this.m_vModDefinition.FindMethod("StardewValley.Program::.cctor") + .FindSetField("releaseBuild").Previous() + .ReplaceCreate(OpCodes.Ldc_I4_0); + + Console.WriteLine("Enabled debug mode."); + } + + private void InjectMoreBubbles() + { + this.m_vModDefinition.FindMethod("StardewValley.GameLocation::performTenMinuteUpdate") + .FindLoadField("currentLocation").Next(i => i.ToString().Contains("NextDouble")).Next() + .ReplaceCreate(OpCodes.Ldc_R8, 1.1); + + Console.WriteLine("Forced each area to always spawn a fishing bubble."); + } + + private void InjectEasyFishing() + { + this.m_vModDefinition.FindMethod("StardewValley.Menus.BobberBar::update") + .FindLoadConstant(694) + .Next(i => i.OpCode == OpCodes.Ldc_R4) + .ReplaceCreate(OpCodes.Ldc_R4, 0.001f) + .Next(i => i.OpCode == OpCodes.Ldc_R4) + .ReplaceCreate(OpCodes.Ldc_R4, 0.001f); + + Console.WriteLine("Replaced fish escape constants for all bobbers & bobber id 694 with 0.001, slowing it down."); + } + + private void InjectClockScale() + { + int timeScale = Config.SecondsPerTenMinutes; + timeScale *= 1000; + + this.m_vModDefinition.FindMethod("StardewValley.Game1::UpdateGameClock") + .FindLoadConstant(7000f) + .ReplaceCreate(OpCodes.Ldc_R4, timeScale*1.0f) + .Next(i => i.OpCode == OpCodes.Ldc_R4 && (float) i.Operand == 7000f) + .ReplaceCreate(OpCodes.Ldc_R4, timeScale*1.0f) + .Next(i => i.OpCode == OpCodes.Ldc_I4 && (int) i.Operand == 7000) + .ReplaceCreate(OpCodes.Ldc_I4, timeScale); + + Console.WriteLine("Updated lighting for new timescale ({0}).", timeScale); + } + + private void InjectMovementSpeed() + { + + + if (Config.EnableTweakedDiagonalMovement) + { + this.m_vModDefinition.FindMethod("StardewValley.Farmer::getMovementSpeed") + .FindLoadField("movementDirections").Next(i => i.OpCode == OpCodes.Ldc_I4_1) + .ReplaceCreate(OpCodes.Ldc_I4_4); + + Console.WriteLine("Removed diagonal movement check."); + } + + if (Config.RunSpeed > 0) + { + this.m_vModDefinition.FindMethod("StardewValley.Farmer::getMovementSpeed") + .FindLoadField("movementDirections").Last().CreateBefore(OpCodes.Ldc_R4, (float) Config.RunSpeed).CreateAfter(OpCodes.Add); + + Console.WriteLine("Added run speed: " + Config.RunSpeed); + } + + + } + + + + private void DumpInstructionsToFile(MethodDefinition methodDefinition) + { + var fileName = string.Format("{0}.{1}.txt", methodDefinition.DeclaringType.Name, methodDefinition.Name); + + using (var stream = File.OpenWrite(Path.Combine(".", fileName))) + using (var writer = new StreamWriter(stream)) + { + var ilProcessor = methodDefinition.Body.GetILProcessor(); + for (int i = 0; i < ilProcessor.Body.Instructions.Count; i++) + writer.WriteLine((i) + ":" + ilProcessor.Body.Instructions[i]); + } + } + } +} \ No newline at end of file diff --git a/StardewInjector/StardewInjector.cs b/StardewInjector/StardewInjector.cs new file mode 100644 index 00000000..055a79f9 --- /dev/null +++ b/StardewInjector/StardewInjector.cs @@ -0,0 +1,55 @@ +using StardewModdingAPI; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace StardewInjector +{ + public class StardewInjector : Mod + { + public override string Name + { + get { return "Stardew Injector"; } + } + + public override string Authour + { + get { return "Zoryn Aaron"; } + } + + public override string Version + { + get { return "1.0"; } + } + + public override string Description + { + get { return "Pulled from https://github.com/kevinmurphy678/Stardew_Injector and converted to a mod."; } + } + + public static Stardew_Hooker hooker { get; set; } + public override void Entry(params object[] objects) + { + if (objects.Length <= 0 || (objects.Length > 0 && objects[0].AsBool() == false)) + { + hooker = new Stardew_Hooker(); + hooker.Initialize(); + hooker.ApplyHooks(); + hooker.Finalize(); + + Program.LogInfo("INJECTOR ENTERED"); + } + else if (objects.Length > 0 && objects[0].AsBool() == true) + { + Program.LogInfo("INJECTOR LAUNCHING"); + hooker.Run(); + } + else + { + Program.LogError("INVALID PARAMETERS FOR INJECTOR"); + } + } + } +} diff --git a/StardewInjector/StardewInjector.csproj b/StardewInjector/StardewInjector.csproj new file mode 100644 index 00000000..7987a7bd --- /dev/null +++ b/StardewInjector/StardewInjector.csproj @@ -0,0 +1,77 @@ + + + + + Debug + AnyCPU + {C9388F35-68D2-431C-88BB-E26286272256} + Library + Properties + StardewInjector + StardewInjector + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + Z:\Games\Stardew Valley\Mono.Cecil.dll + + + + + + + + + + + + + + + + + + + + + + + + + {f1a573b0-f436-472c-ae29-0b91ea6b9f8f} + StardewModdingAPI + + + + + mkdir "$(SolutionDir)Release\Mods\" +copy /y "$(SolutionDir)$(ProjectName)\$(OutDir)$(TargetFileName)" "$(SolutionDir)Release\Mods\" + + + \ No newline at end of file diff --git a/StardewInjector/bin/Debug/Lidgren.Network.dll b/StardewInjector/bin/Debug/Lidgren.Network.dll new file mode 100644 index 00000000..2cd9d5b3 Binary files /dev/null and b/StardewInjector/bin/Debug/Lidgren.Network.dll differ diff --git a/StardewInjector/bin/Debug/Microsoft.Xna.Framework.Game.dll b/StardewInjector/bin/Debug/Microsoft.Xna.Framework.Game.dll new file mode 100644 index 00000000..9ba4aa23 Binary files /dev/null and b/StardewInjector/bin/Debug/Microsoft.Xna.Framework.Game.dll differ diff --git a/StardewInjector/bin/Debug/Microsoft.Xna.Framework.Game.xml b/StardewInjector/bin/Debug/Microsoft.Xna.Framework.Game.xml new file mode 100644 index 00000000..d0b7a111 --- /dev/null +++ b/StardewInjector/bin/Debug/Microsoft.Xna.Framework.Game.xml @@ -0,0 +1,625 @@ + + + + + A game component that is notified when it needs to draw itself. + + + Creates a new instance of DrawableGameComponent. + The Game that the game component should be attached to. + + + Releases the unmanaged resources used by the DrawableGameComponent and optionally releases the managed resources. + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + Called when the DrawableGameComponent needs to be drawn. Override this method with component-specific drawing code. Reference page contains links to related conceptual articles. + Time passed since the last call to Draw. + + + Order in which the component should be drawn, relative to other components that are in the same GameComponentCollection. Reference page contains code sample. + + + Raised when the DrawOrder property changes. + + + + The GraphicsDevice the DrawableGameComponent is associated with. + + + Initializes the component. Override this method to load any non-graphics resources and query for any required services. + + + Called when graphics resources need to be loaded. Override this method to load any component-specific graphics resources. + + + Called when the DrawOrder property changes. Raises the DrawOrderChanged event. + The DrawableGameComponent. + Arguments to the DrawOrderChanged event. + + + Called when the Visible property changes. Raises the VisibleChanged event. + The DrawableGameComponent. + Arguments to the VisibleChanged event. + + + Called when graphics resources need to be unloaded. Override this method to unload any component-specific graphics resources. + + + Indicates whether Draw should be called. + + + Raised when the Visible property changes. + + + + Provides basic graphics device initialization, game logic, and rendering code. + + + Initializes a new instance of this class, which provides basic graphics device initialization, game logic, rendering code, and a game loop. Reference page contains code sample. + + + Raised when the game gains focus. + + + + Starts the drawing of a frame. This method is followed by calls to Draw and EndDraw. + + + Called after all components are initialized but before the first update in the game loop. + + + Gets the collection of GameComponents owned by the game. + + + Gets or sets the current ContentManager. + + + Raised when the game loses focus. + + + + Immediately releases the unmanaged resources used by this object. + + + Releases all resources used by the Game class. + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + Raised when the game is being disposed. + + + + Reference page contains code sample. + Time passed since the last call to Draw. + + + Ends the drawing of a frame. This method is preceeded by calls to Draw and BeginDraw. + + + Called after the game loop has stopped running before exiting. + + + Exits the game. + + + Raised when the game is exiting. + + + + Allows a Game to attempt to free resources and perform other cleanup operations before garbage collection reclaims the Game. + + + Gets the current GraphicsDevice. + + + Gets or sets the time to sleep when the game is inactive. + + + Called after the Game and GraphicsDevice are created, but before LoadContent. Reference page contains code sample. + + + Indicates whether the game is currently the active application. + + + Gets or sets a value indicating whether to use fixed time steps. + + + Gets or sets a value indicating whether the mouse cursor should be visible. + + + Gets the start up parameters in LaunchParameters. + + + + + + Raises the Activated event. Override this method to add code to handle when the game gains focus. + The Game. + Arguments for the Activated event. + + + Raises the Deactivated event. Override this method to add code to handle when the game loses focus. + The Game. + Arguments for the Deactivated event. + + + Raises an Exiting event. Override this method to add code to handle when the game is exiting. + The Game. + Arguments for the Exiting event. + + + Resets the elapsed time counter. + + + Call this method to initialize the game, begin running the game loop, and start processing events for the game. + + + Run the game through what would happen in a single tick of the game clock; this method is designed for debugging only. + + + Gets the GameServiceContainer holding all the service providers attached to the Game. + + + This is used to display an error message if there is no suitable graphics device or sound card. + The exception to display. + + + Prevents calls to Draw until the next Update. + + + Gets or sets the target time between calls to Update when IsFixedTimeStep is true. Reference page contains links to related code samples. + + + Updates the game's clock and calls Update and Draw. + + + Called when graphics resources need to be unloaded. Override this method to unload any game-specific graphics resources. + + + Reference page contains links to related conceptual articles. + Time passed since the last call to Update. + + + Gets the underlying operating system window. + + + Base class for all XNA Framework game components. + + + Initializes a new instance of this class. + Game that the game component should be attached to. + + + Immediately releases the unmanaged resources used by this object. + + + Releases the unmanaged resources used by the GameComponent and optionally releases the managed resources. + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + Raised when the GameComponent is disposed. + + + + Indicates whether GameComponent.Update should be called when Game.Update is called. + + + Raised when the Enabled property changes. + + + + Allows a GameComponent to attempt to free resources and perform other cleanup operations before garbage collection reclaims the GameComponent. + + + Gets the Game associated with this GameComponent. + + + Reference page contains code sample. + + + Called when the Enabled property changes. Raises the EnabledChanged event. + The GameComponent. + Arguments to the EnabledChanged event. + + + Called when the UpdateOrder property changes. Raises the UpdateOrderChanged event. + The GameComponent. + Arguments to the UpdateOrderChanged event. + + + Called when the GameComponent needs to be updated. Override this method with component-specific update code. + Time elapsed since the last call to Update + + + Indicates the order in which the GameComponent should be updated relative to other GameComponent instances. Lower values are updated first. + + + Raised when the UpdateOrder property changes. + + + + A collection of game components. + + + Initializes a new instance of this class. + + + Raised when a component is added to the GameComponentCollection. + + + + Raised when a component is removed from the GameComponentCollection. + + + + Arguments used with events from the GameComponentCollection. + + + Creates a new instance of GameComponentCollectionEventArgs. + The game component affected by the event. + + + The game component affected by the event. + + + A collection of game services. + + + Initializes a new instance of this class, which represents a collection of game services. + + + Adds a service to the GameServiceContainer. + The type of service to add. + The service provider to add. + + + Gets the object providing a specified service. + The type of service. + + + Removes the object providing a specified service. + The type of service. + + + Snapshot of the game timing state expressed in values that can be used by variable-step (real time) or fixed-step (game time) games. + + + Creates a new instance of GameTime. + + + Creates a new instance of GameTime. + The amount of game time since the start of the game. + The amount of elapsed game time since the last update. + + + Creates a new instance of GameTime. + The amount of game time since the start of the game. + The amount of elapsed game time since the last update. + Whether the game is running multiple updates this frame. + + + The amount of elapsed game time since the last update. + + + Gets a value indicating that the game loop is taking longer than its TargetElapsedTime. In this case, the game loop can be considered to be running too slowly and should do something to "catch up." + + + The amount of game time since the start of the game. + + + The system window associated with a Game. + + + Specifies whether to allow the user to resize the game window. + + + Starts a device transition (windowed to full screen or vice versa). + Specifies whether the device will be in full-screen mode upon completion of the change. + + + The screen dimensions of the game window's client rectangle. + + + Raised when the size of the GameWindow changes. + + + + Gets the current display orientation, which reflects the physical orientation of the phone in the user's hand. + + + Completes a device transition. + The desktop screen to move the window to. This should be the screen device name of the graphics device that has transitioned to full screen. + + + Completes a device transition. + The desktop screen to move the window to. This should be the screen device name of the graphics device that has transitioned to full screen. + The new width of the game's client window. + The new height of the game's client window. + + + Gets the handle to the system window. + + + Called when the GameWindow gets focus. + + + Called when the size of the client window changes. Raises the ClientSizeChanged event. + + + Called when the GameWindow loses focus. + + + Called when the GameWindow display orientation changes. + + + Called when the GameWindow needs to be painted. + + + Called when the GameWindow is moved to a different screen. Raises the ScreenDeviceNameChanged event. + + + Describes the event raised when the display orientation of the GameWindow changes. When this event occurs, the XNA Framework automatically adjusts the game orientation based on the value specified by the developer with SupportedOrientations. + + + + Gets the device name of the screen the window is currently in. + + + Raised when the GameWindow moves to a different display. + + + + Sets the supported display orientations. + A set of supported display orientations. + + + Sets the title of the GameWindow. + The new title of the GameWindow. + + + Gets and sets the title of the system window. + + + Holds the settings for creating a graphics device on Windows. + + + Initializes a new instance of this class. + + + Specifies which graphics adapter to create the device on. + + + Creates a clone of this object. + + + Returns a value that indicates whether the current instance is equal to a specified object. + The Object to compare with the current GraphicsDeviceInformation. + + + Gets the hash code for this object. + + + Gets the graphics profile, which determines the graphics feature set. + + + Specifies the presentation parameters to use when creating a graphics device. + + + Handles the configuration and management of the graphics device. + + + Creates a new GraphicsDeviceManager and registers it to handle the configuration and management of the graphics device for the specified Game. + Game the GraphicsDeviceManager should be associated with. + + + Applies any changes to device-related properties, changing the graphics device as necessary. + + + Determines whether the given GraphicsDeviceInformation is compatible with the existing graphics device. + Information describing the desired device configuration. + + + Specifies the default minimum back-buffer height. + + + Specifies the default minimum back-buffer width. + + + Raised when a new graphics device is created. + + + + Raised when the GraphicsDeviceManager is being disposed. + + + + Raised when the GraphicsDeviceManager is reset. + + + + Raised when the GraphicsDeviceManager is about to be reset. + + + + Releases the unmanaged resources used by the GraphicsDeviceManager and optionally releases the managed resources. + true to release both automatic and manual resources; false to release only manual resources. + + + Raised when the GraphicsDeviceManager is disposed. + + + + Finds the best device configuration that is compatible with the current device preferences. + true if the FindBestDevice can select devices from any available adapter; false if only the current adapter should be considered. + + + Gets the GraphicsDevice associated with the GraphicsDeviceManager. + + + Gets the graphics profile, which determines the graphics feature set. + + + Gets or sets a value that indicates whether the device should start in full-screen mode. + + + Prepares the GraphicsDevice to draw. + + + Called to ensure that the device manager has created a valid device. + + + Called by the game at the end of drawing and presents the final rendering. + + + Called when a device is created. Raises the DeviceCreated event. + The GraphicsDeviceManager. + Arguments for the DeviceCreated event. + + + Called when a device is being disposed. Raises the DeviceDisposing event. + The GraphicsDeviceManager. + Arguments for the DeviceDisposing event. + + + Called when the device has been reset. Raises the DeviceReset event. +