diff options
author | Zoryn <Zoryn4163@users.noreply.github.com> | 2016-03-20 17:13:24 -0400 |
---|---|---|
committer | Zoryn <Zoryn4163@users.noreply.github.com> | 2016-03-20 17:13:24 -0400 |
commit | 3ad423695d853be479b2998344f08154295addb8 (patch) | |
tree | b1bfc85c128cc015bc77a3324de00899f05aeab6 | |
parent | d367b0a7bceeac210ee7336477f98559b6122d13 (diff) | |
parent | cee85c88884d8fae48a675cdce1bc27b7cdbd353 (diff) | |
download | SMAPI-3ad423695d853be479b2998344f08154295addb8.tar.gz SMAPI-3ad423695d853be479b2998344f08154295addb8.tar.bz2 SMAPI-3ad423695d853be479b2998344f08154295addb8.zip |
Merge pull request #32 from Zoryn4163/master
Zoryn Returns - Added config and JSON. Manifests inbound.
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | StardewModdingAPI/Config.cs | 124 | ||||
-rw-r--r-- | StardewModdingAPI/Mod.cs | 5 | ||||
-rw-r--r-- | StardewModdingAPI/Program.cs | 781 | ||||
-rw-r--r-- | StardewModdingAPI/StardewModdingAPI.csproj | 26 | ||||
-rw-r--r-- | StardewModdingAPI/packages.config | 4 | ||||
-rw-r--r-- | TrainerMod/TrainerMod.csproj | 25 | ||||
-rw-r--r-- | TrainerMod/packages.config | 4 |
8 files changed, 567 insertions, 403 deletions
@@ -6,6 +6,7 @@ TrainerMod/obj/ StardewInjector/bin/ StardewInjector/obj/ packages/ +steamapps/ *.symlink *.lnk diff --git a/StardewModdingAPI/Config.cs b/StardewModdingAPI/Config.cs new file mode 100644 index 00000000..67c13a14 --- /dev/null +++ b/StardewModdingAPI/Config.cs @@ -0,0 +1,124 @@ +/* + Copyright 2016 Zoey (Zoryn) +*/ + +using System; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace StardewModdingAPI +{ + public class Config + { + [JsonIgnore] + public virtual JObject JObject { get; protected set; } + + [JsonIgnore] + public virtual string ConfigLocation { get; protected set; } + + public static Config Instance + { + get { return new Config(); } + } + + public static Config InitializeConfig(string configLocation, Config baseConfig) + { + if (baseConfig == null) + { + Console.WriteLine("A config must be instantiated before being passed to Initialize.\n\t" + configLocation); + return null; + } + + baseConfig.ConfigLocation = configLocation; + return baseConfig.LoadConfig(baseConfig); + } + + public virtual Config GenerateBaseConfig(Config baseConfig) + { + //Must be implemented in sub-class + return null; + } + + public virtual Config LoadConfig(Config baseConfig) + { + if (!File.Exists(baseConfig.ConfigLocation)) + { + var v = (Config)baseConfig.GetType().GetMethod("GenerateBaseConfig", BindingFlags.Public | BindingFlags.Instance).Invoke(baseConfig, new object[] { baseConfig }); + v.WriteConfig(); + } + else + { + var p = baseConfig.ConfigLocation; + + try + { + var j = JObject.Parse(Encoding.UTF8.GetString(File.ReadAllBytes(baseConfig.ConfigLocation))); + baseConfig = (Config)j.ToObject(baseConfig.GetType()); + baseConfig.ConfigLocation = p; + baseConfig.JObject = j; + + baseConfig = UpdateConfig(baseConfig); + baseConfig.ConfigLocation = p; + baseConfig.JObject = j; + + baseConfig.WriteConfig(); + } + catch + { + Console.WriteLine("Invalid JSON Renamed: " + p); + if (File.Exists(p)) + File.Move(p, Path.Combine(Path.GetDirectoryName(p), Path.GetFileNameWithoutExtension(p) + "." + Guid.NewGuid() + ".json")); //Get it out of the way for a new one + var v = (Config)baseConfig.GetType().GetMethod("GenerateBaseConfig", BindingFlags.Public | BindingFlags.Instance).Invoke(baseConfig, new object[] { baseConfig }); + v.WriteConfig(); + } + } + + return baseConfig; + } + + public virtual Config UpdateConfig(Config baseConfig) + { + try + { + //default config with all standard values + var b = JObject.FromObject(baseConfig.GetType().GetMethod("GenerateBaseConfig", BindingFlags.Public | BindingFlags.Instance).Invoke(baseConfig, new object[] { baseConfig })); + //user config with their values + var u = baseConfig.JObject; + + b.Merge(u); + + return (Config)b.ToObject(baseConfig.GetType()); + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + } + return baseConfig; + } + + public static string GetBasePath(Mod theMod) + { + return theMod.PathOnDisk + "\\config.json"; + } + } + + public static class ConfigExtensions + { + public static void WriteConfig(this Config baseConfig) + { + var toWrite = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(baseConfig, baseConfig.GetType(), Formatting.Indented, new JsonSerializerSettings())); + if (!File.Exists(baseConfig.ConfigLocation) || !File.ReadAllBytes(baseConfig.ConfigLocation).SequenceEqual(toWrite)) + File.WriteAllBytes(baseConfig.ConfigLocation, toWrite); + toWrite = null; + } + + public static Config ReloadConfig(this Config baseConfig) + { + return baseConfig.UpdateConfig(baseConfig); + } + } +}
\ No newline at end of file diff --git a/StardewModdingAPI/Mod.cs b/StardewModdingAPI/Mod.cs index eabdc539..a196c3a2 100644 --- a/StardewModdingAPI/Mod.cs +++ b/StardewModdingAPI/Mod.cs @@ -29,6 +29,11 @@ namespace StardewModdingAPI public virtual string Description { get; protected set; } /// <summary> + /// Where the mod is located on the disk. + /// </summary> + public string PathOnDisk { get; internal set; } + + /// <summary> /// A basic method that is the entry-point of your mod. It will always be called once when the mod loads. /// </summary> public virtual void Entry(params object[] objects) diff --git a/StardewModdingAPI/Program.cs b/StardewModdingAPI/Program.cs index 61770f8e..5ed2d644 100644 --- a/StardewModdingAPI/Program.cs +++ b/StardewModdingAPI/Program.cs @@ -1,50 +1,50 @@ -using Microsoft.Xna.Framework; -using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
using StardewModdingAPI.Events;
-using StardewModdingAPI.Inheritance; -using StardewModdingAPI.Inheritance.Menus; -using StardewValley; -using StardewValley.Menus; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Threading; -using System.Windows.Forms; -
-namespace StardewModdingAPI -{ - public class Program - { - private static List<string> _modPaths; - private static List<string> _modContentPaths; - - public static Texture2D DebugPixel { get; private set; } - - public static SGame gamePtr; - public static bool ready; - - public static Assembly StardewAssembly; - public static Type StardewProgramType; - public static FieldInfo StardewGameInfo; - public static Form StardewForm; - - public static Thread gameThread; - public static Thread consoleInputThread; - - public static bool StardewInjectorLoaded { get; private set; } - public static Mod StardewInjectorMod { get; private set; } - - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - +using StardewModdingAPI.Inheritance;
+using StardewModdingAPI.Inheritance.Menus;
+using StardewValley;
+using StardewValley.Menus;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Threading;
+using System.Windows.Forms;
+
+namespace StardewModdingAPI
+{
+ public class Program
+ {
+ private static List<string> _modPaths;
+ private static List<string> _modContentPaths;
+
+ public static Texture2D DebugPixel { get; private set; }
+
+ public static SGame gamePtr;
+ public static bool ready;
+
+ public static Assembly StardewAssembly;
+ public static Type StardewProgramType;
+ public static FieldInfo StardewGameInfo;
+ public static Form StardewForm;
+
+ public static Thread gameThread;
+ public static Thread consoleInputThread;
+
+ public static bool StardewInjectorLoaded { get; private set; }
+ public static Mod StardewInjectorMod { get; private set; }
+
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
/// <summary>
/// Main method holding the API execution
/// </summary>
- /// <param name="args"></param> - private static void Main(string[] args) - { + /// <param name="args"></param>
+ private static void Main(string[] args)
+ {
try
{
ConfigureUI();
@@ -62,16 +62,16 @@ namespace StardewModdingAPI StardewModdingAPI.Log.Comment("The API will now terminate. Press any key to continue...");
Console.ReadKey();
- } - + }
+
/// <summary>
/// Set up the console properties
- /// </summary> + /// </summary>
private static void ConfigureUI()
- { + {
Console.Title = Constants.ConsoleTitle;
- -#if DEBUG +
+#if DEBUG
Console.Title += " - DEBUG IS NOT FALSE, AUTHOUR NEEDS TO REUPLOAD THIS VERSION";
#endif
}
@@ -81,150 +81,152 @@ namespace StardewModdingAPI /// </summary>
private static void ConfigurePaths()
{
- StardewModdingAPI.Log.Info("Validating api paths..."); + StardewModdingAPI.Log.Info("Validating api paths...");
_modPaths = new List<string>();
_modContentPaths = new List<string>();
//TODO: Have an app.config and put the paths inside it so users can define locations to load mods from
- _modPaths.Add(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "StardewValley", "Mods")); - _modPaths.Add(Path.Combine(Constants.ExecutionPath, "Mods")); - _modContentPaths.Add(Path.Combine(Constants.ExecutionPath, "Mods", "Content")); - _modContentPaths.Add(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "StardewValley", "Mods", "Content")); - - //Checks that all defined modpaths exist as directories - _modPaths.ForEach(path => VerifyPath(path)); - _modContentPaths.ForEach(path => VerifyPath(path)); - VerifyPath(Constants.LogPath); - + _modPaths.Add(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "StardewValley", "Mods"));
+ _modPaths.Add(Path.Combine(Constants.ExecutionPath, "Mods"));
+ _modContentPaths.Add(Path.Combine(Constants.ExecutionPath, "Mods", "Content"));
+ _modContentPaths.Add(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "StardewValley", "Mods", "Content"));
+
+ //Checks that all defined modpaths exist as directories
+ _modPaths.ForEach(path => VerifyPath(path));
+ _modContentPaths.ForEach(path => VerifyPath(path));
+ VerifyPath(Constants.LogPath);
+
StardewModdingAPI.Log.Initialize(Constants.LogPath);
if (!File.Exists(Constants.ExecutionPath + "\\Stardew Valley.exe"))
- { + {
throw new FileNotFoundException(string.Format("Could not found: {0}\\Stardew Valley.exe", Constants.ExecutionPath));
- } - } - + }
+ }
+
/// <summary>
/// Load the injector.
- /// </summary> - /// <remarks> + /// Is this deprecated? Why is there a LoadMods?
+ /// </summary>
+ /// <remarks>
/// This will load the injector before anything else if it sees it
/// It doesn't matter though
/// I'll leave it as a feature in case anyone in the community wants to tinker with it
/// All you need is a DLL that inherits from mod and is called StardewInjector.dll with an Entry() method
- /// </remarks> + /// </remarks>
private static void ConfigureInjector()
- { - foreach (string ModPath in _modPaths) - { - foreach (String s in Directory.GetFiles(ModPath, "StardewInjector.dll")) - { - StardewModdingAPI.Log.Success(ConsoleColor.Green, "Found Stardew Injector DLL: " + s); - try - { - Assembly mod = Assembly.UnsafeLoadFrom(s); //to combat internet-downloaded DLLs - - if (mod.DefinedTypes.Count(x => x.BaseType == typeof(Mod)) > 0) - { - StardewModdingAPI.Log.Success("Loading Injector DLL..."); - TypeInfo tar = mod.DefinedTypes.First(x => x.BaseType == typeof(Mod)); - Mod m = (Mod)mod.CreateInstance(tar.ToString()); - Console.WriteLine("LOADED: {0} by {1} - Version {2} | Description: {3}", m.Name, m.Authour, m.Version, m.Description); - m.Entry(false); - StardewInjectorLoaded = true; - StardewInjectorMod = m; - } - else - { - StardewModdingAPI.Log.Error("Invalid Mod DLL"); - } - } - catch (Exception ex) - { - StardewModdingAPI.Log.Error("Failed to load mod '{0}'. Exception details:\n" + ex, s); - } - } - } - } - + {
+ foreach (string ModPath in _modPaths)
+ {
+ foreach (String s in Directory.GetFiles(ModPath, "StardewInjector.dll"))
+ {
+ StardewModdingAPI.Log.Success(ConsoleColor.Green, "Found Stardew Injector DLL: " + s);
+ try
+ {
+ Assembly mod = Assembly.UnsafeLoadFrom(s); //to combat internet-downloaded DLLs
+
+ if (mod.DefinedTypes.Count(x => x.BaseType == typeof(Mod)) > 0)
+ {
+ StardewModdingAPI.Log.Success("Loading Injector DLL...");
+ TypeInfo tar = mod.DefinedTypes.First(x => x.BaseType == typeof(Mod));
+ Mod m = (Mod)mod.CreateInstance(tar.ToString());
+ Console.WriteLine("LOADED: {0} by {1} - Version {2} | Description: {3} (@:{4})", m.Name, m.Authour, m.Version, m.Description, s);
+ m.PathOnDisk = Path.GetDirectoryName(s);
+ m.Entry(false);
+ StardewInjectorLoaded = true;
+ StardewInjectorMod = m;
+ }
+ else
+ {
+ StardewModdingAPI.Log.Error("Invalid Mod DLL");
+ }
+ }
+ catch (Exception ex)
+ {
+ StardewModdingAPI.Log.Error("Failed to load mod '{0}'. Exception details:\n" + ex, s);
+ }
+ }
+ }
+ }
+
/// <summary>
/// Load Stardev Valley and control features
- /// </summary> + /// </summary>
private static void ConfigureSDV()
- { - StardewModdingAPI.Log.Info("Initializing SDV Assembly..."); - - // Load in the assembly - ignores security - StardewAssembly = Assembly.UnsafeLoadFrom(Constants.ExecutionPath + "\\Stardew Valley.exe"); - StardewProgramType = StardewAssembly.GetType("StardewValley.Program", true); - StardewGameInfo = StardewProgramType.GetField("gamePtr"); - - // Change the game's version - StardewModdingAPI.Log.Verbose("Injecting New SDV Version..."); + {
+ StardewModdingAPI.Log.Info("Initializing SDV Assembly...");
+
+ // Load in the assembly - ignores security
+ StardewAssembly = Assembly.UnsafeLoadFrom(Constants.ExecutionPath + "\\Stardew Valley.exe");
+ StardewProgramType = StardewAssembly.GetType("StardewValley.Program", true);
+ StardewGameInfo = StardewProgramType.GetField("gamePtr");
+
+ // Change the game's version
+ StardewModdingAPI.Log.Verbose("Injecting New SDV Version...");
Game1.version += string.Format("-Z_MODDED | SMAPI {0}", Constants.VersionString);
- - // Create the thread for the game to run in. - gameThread = new Thread(RunGame); - StardewModdingAPI.Log.Info("Starting SDV..."); +
+ // Create the thread for the game to run in.
+ gameThread = new Thread(RunGame);
+ StardewModdingAPI.Log.Info("Starting SDV...");
gameThread.Start();
// Wait for the game to load up
- while (!ready) ; - - //SDV is running - StardewModdingAPI.Log.Comment("SDV Loaded Into Memory"); - - //Create definition to listen for input - StardewModdingAPI.Log.Verbose("Initializing Console Input Thread..."); - consoleInputThread = new Thread(ConsoleInputThread); - - // The only command in the API (at least it should be, for now) - Command.RegisterCommand("help", "Lists all commands | 'help <cmd>' returns command description").CommandFired += help_CommandFired; - //Command.RegisterCommand("crash", "crashes sdv").CommandFired += delegate { Game1.player.draw(null); }; - - //Subscribe to events - Events.ControlEvents.KeyPressed += Events_KeyPressed; + while (!ready) ;
+
+ //SDV is running
+ StardewModdingAPI.Log.Comment("SDV Loaded Into Memory");
+
+ //Create definition to listen for input
+ StardewModdingAPI.Log.Verbose("Initializing Console Input Thread...");
+ consoleInputThread = new Thread(ConsoleInputThread);
+
+ // The only command in the API (at least it should be, for now)
+ Command.RegisterCommand("help", "Lists all commands | 'help <cmd>' returns command description").CommandFired += help_CommandFired;
+ //Command.RegisterCommand("crash", "crashes sdv").CommandFired += delegate { Game1.player.draw(null); };
+
+ //Subscribe to events
+ Events.ControlEvents.KeyPressed += Events_KeyPressed;
Events.GameEvents.LoadContent += Events_LoadContent;
- //Events.MenuChanged += Events_MenuChanged; //Idk right now - - StardewModdingAPI.Log.Verbose("Applying Final SDV Tweaks..."); - StardewInvoke(() => + //Events.MenuChanged += Events_MenuChanged; //Idk right now
+
+ StardewModdingAPI.Log.Verbose("Applying Final SDV Tweaks...");
+ StardewInvoke(() =>
{
gamePtr.IsMouseVisible = false;
gamePtr.Window.Title = "Stardew Valley - Version " + Game1.version;
- StardewForm.Resize += Events.GraphicsEvents.InvokeResize; - }); - } - + StardewForm.Resize += Events.GraphicsEvents.InvokeResize;
+ });
+ }
+
/// <summary>
/// Wrap the 'RunGame' method for console output
- /// </summary> + /// </summary>
private static void GameRunInvoker()
- { - //Game's in memory now, send the event - StardewModdingAPI.Log.Verbose("Game Loaded"); - Events.GameEvents.InvokeGameLoaded(); - + {
+ //Game's in memory now, send the event
+ StardewModdingAPI.Log.Verbose("Game Loaded");
+ Events.GameEvents.InvokeGameLoaded();
+
StardewModdingAPI.Log.Comment("Type 'help' for help, or 'help <cmd>' for a command's usage");
- //Begin listening to input - consoleInputThread.Start(); - - - while (ready) - { - //Check if the game is still running 10 times a second - Thread.Sleep(1000 / 10); - } - - //abort the thread, we're closing - if (consoleInputThread != null && consoleInputThread.ThreadState == ThreadState.Running) - consoleInputThread.Abort(); - - StardewModdingAPI.Log.Verbose("Game Execution Finished"); - StardewModdingAPI.Log.Verbose("Shutting Down..."); - Thread.Sleep(100); - Environment.Exit(0); + //Begin listening to input
+ consoleInputThread.Start();
+
+
+ while (ready)
+ {
+ //Check if the game is still running 10 times a second
+ Thread.Sleep(1000 / 10);
+ }
+
+ //abort the thread, we're closing
+ if (consoleInputThread != null && consoleInputThread.ThreadState == ThreadState.Running)
+ consoleInputThread.Abort();
+
+ StardewModdingAPI.Log.Verbose("Game Execution Finished");
+ StardewModdingAPI.Log.Verbose("Shutting Down...");
+ Thread.Sleep(100);
+ Environment.Exit(0);
}
/// <summary>
@@ -241,186 +243,187 @@ namespace StardewModdingAPI }
}
catch (Exception ex)
- { + {
StardewModdingAPI.Log.Error("Could not create a path: " + path + "\n\n" + ex);
- } + }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- - public static void RunGame() - { - Application.ThreadException += StardewModdingAPI.Log.Application_ThreadException; - Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); - AppDomain.CurrentDomain.UnhandledException += StardewModdingAPI.Log.CurrentDomain_UnhandledException; - - try - { - gamePtr = new SGame(); - StardewModdingAPI.Log.Verbose("Patching SDV Graphics Profile..."); - Game1.graphics.GraphicsProfile = GraphicsProfile.HiDef; - LoadMods(); - - StardewForm = Control.FromHandle(Program.gamePtr.Window.Handle).FindForm(); - StardewForm.Closing += StardewForm_Closing; - - ready = true; - - StardewGameInfo.SetValue(StardewProgramType, gamePtr); - gamePtr.Run(); - - #region deprecated - if (false) - { - //Nope, I can't get it to work. I depend on Game1 being an SGame, and can't cast a parent to a child - //I'm leaving this here in case the community is interested - //StardewInjectorMod.Entry(true); - Type gt = StardewAssembly.GetType("StardewValley.Game1", true); - gamePtr = (SGame)Activator.CreateInstance(gt); - - ready = true; - - StardewGameInfo.SetValue(StardewProgramType, gamePtr); - gamePtr.Run(); - } - #endregion - } - catch (Exception ex) - { - StardewModdingAPI.Log.Error("Game failed to start: " + ex); - } - } - - static void StardewForm_Closing(object sender, CancelEventArgs e) - { - e.Cancel = true; - - if (true || MessageBox.Show("Are you sure you would like to quit Stardew Valley?\nUnsaved progress will be lost!", "Confirm Exit", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) - { - gamePtr.Exit(); - gamePtr.Dispose(); - StardewForm.Hide(); - ready = false; - } - } - - public static void LoadMods() - { - StardewModdingAPI.Log.Verbose("LOADING MODS"); - int loadedMods = 0; - foreach (string ModPath in _modPaths) - { - foreach (String s in Directory.GetFiles(ModPath, "*.dll")) - { - if (s.Contains("StardewInjector")) - continue; - StardewModdingAPI.Log.Success("Found DLL: " + s); - try - { - Assembly mod = Assembly.UnsafeLoadFrom(s); //to combat internet-downloaded DLLs - - if (mod.DefinedTypes.Count(x => x.BaseType == typeof(Mod)) > 0) - { - StardewModdingAPI.Log.Verbose("Loading Mod DLL..."); - TypeInfo tar = mod.DefinedTypes.First(x => x.BaseType == typeof(Mod)); - Mod m = (Mod)mod.CreateInstance(tar.ToString()); - Console.WriteLine("LOADED MOD: {0} by {1} - Version {2} | Description: {3}", m.Name, m.Authour, m.Version, m.Description); - loadedMods += 1; - m.Entry(); - } - else - { - StardewModdingAPI.Log.Error("Invalid Mod DLL"); - } - } - catch (Exception ex) - { - StardewModdingAPI.Log.Error("Failed to load mod '{0}'. Exception details:\n" + ex, s); - } - } - } - StardewModdingAPI.Log.Success("LOADED {0} MODS", loadedMods); - } - - public static void ConsoleInputThread() - { - string input = string.Empty; - - while (true) - { - Command.CallCommand(Console.ReadLine()); - } - } - - static void Events_LoadContent(object o, EventArgs e) - { - StardewModdingAPI.Log.Info("Initializing Debug Assets..."); - DebugPixel = new Texture2D(Game1.graphics.GraphicsDevice, 1, 1); +
+ public static void RunGame()
+ {
+ Application.ThreadException += StardewModdingAPI.Log.Application_ThreadException;
+ Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
+ AppDomain.CurrentDomain.UnhandledException += StardewModdingAPI.Log.CurrentDomain_UnhandledException;
+
+ try
+ {
+ gamePtr = new SGame();
+ StardewModdingAPI.Log.Verbose("Patching SDV Graphics Profile...");
+ Game1.graphics.GraphicsProfile = GraphicsProfile.HiDef;
+ LoadMods();
+
+ StardewForm = Control.FromHandle(Program.gamePtr.Window.Handle).FindForm();
+ StardewForm.Closing += StardewForm_Closing;
+
+ ready = true;
+
+ StardewGameInfo.SetValue(StardewProgramType, gamePtr);
+ gamePtr.Run();
+
+ #region deprecated
+ if (false)
+ {
+ //Nope, I can't get it to work. I depend on Game1 being an SGame, and can't cast a parent to a child
+ //I'm leaving this here in case the community is interested
+ //StardewInjectorMod.Entry(true);
+ Type gt = StardewAssembly.GetType("StardewValley.Game1", true);
+ gamePtr = (SGame)Activator.CreateInstance(gt);
+
+ ready = true;
+
+ StardewGameInfo.SetValue(StardewProgramType, gamePtr);
+ gamePtr.Run();
+ }
+ #endregion
+ }
+ catch (Exception ex)
+ {
+ StardewModdingAPI.Log.Error("Game failed to start: " + ex);
+ }
+ }
+
+ static void StardewForm_Closing(object sender, CancelEventArgs e)
+ {
+ e.Cancel = true;
+
+ if (true || MessageBox.Show("Are you sure you would like to quit Stardew Valley?\nUnsaved progress will be lost!", "Confirm Exit", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes)
+ {
+ gamePtr.Exit();
+ gamePtr.Dispose();
+ StardewForm.Hide();
+ ready = false;
+ }
+ }
+
+ public static void LoadMods()
+ {
+ StardewModdingAPI.Log.Verbose("LOADING MODS");
+ int loadedMods = 0;
+ foreach (string ModPath in _modPaths)
+ {
+ foreach (String s in Directory.GetFiles(ModPath, "*.dll"))
+ {
+ if (s.Contains("StardewInjector"))
+ continue;
+ StardewModdingAPI.Log.Success("Found DLL: " + s);
+ try
+ {
+ Assembly mod = Assembly.UnsafeLoadFrom(s); //to combat internet-downloaded DLLs
+
+ if (mod.DefinedTypes.Count(x => x.BaseType == typeof(Mod)) > 0)
+ {
+ StardewModdingAPI.Log.Verbose("Loading Mod DLL...");
+ TypeInfo tar = mod.DefinedTypes.First(x => x.BaseType == typeof(Mod));
+ Mod m = (Mod)mod.CreateInstance(tar.ToString());
+ m.PathOnDisk = Path.GetDirectoryName(s);
+ Console.WriteLine("LOADED MOD: {0} by {1} - Version {2} | Description: {3} (@{4})", m.Name, m.Authour, m.Version, m.Description, m.PathOnDisk);
+ loadedMods += 1;
+ m.Entry();
+ }
+ else
+ {
+ StardewModdingAPI.Log.Error("Invalid Mod DLL");
+ }
+ }
+ catch (Exception ex)
+ {
+ StardewModdingAPI.Log.Error("Failed to load mod '{0}'. Exception details:\n" + ex, s);
+ }
+ }
+ }
+ StardewModdingAPI.Log.Success("LOADED {0} MODS", loadedMods);
+ }
+
+ public static void ConsoleInputThread()
+ {
+ string input = string.Empty;
+
+ while (true)
+ {
+ Command.CallCommand(Console.ReadLine());
+ }
+ }
+
+ static void Events_LoadContent(object o, EventArgs e)
+ {
+ StardewModdingAPI.Log.Info("Initializing Debug Assets...");
+ DebugPixel = new Texture2D(Game1.graphics.GraphicsDevice, 1, 1);
DebugPixel.SetData(new Color[] { Color.White });
-#if DEBUG - StardewModdingAPI.Log.Verbose("REGISTERING BASE CUSTOM ITEM"); - SObject so = new SObject(); - so.Name = "Mario Block"; - so.CategoryName = "SMAPI Test Mod"; - so.Description = "It's a block from Mario!\nLoaded in realtime by SMAPI."; - so.Texture = Texture2D.FromStream(Game1.graphics.GraphicsDevice, new FileStream(_modContentPaths[0] + "\\Test.png", FileMode.Open)); - so.IsPassable = true; - so.IsPlaceable = true; - StardewModdingAPI.Log.Verbose("REGISTERED WITH ID OF: " + SGame.RegisterModItem(so)); - - //StardewModdingAPI.Log.Verbose("REGISTERING SECOND CUSTOM ITEM"); - //SObject so2 = new SObject(); - //so2.Name = "Mario Painting"; - //so2.CategoryName = "SMAPI Test Mod"; - //so2.Description = "It's a painting of a creature from Mario!\nLoaded in realtime by SMAPI."; - //so2.Texture = Texture2D.FromStream(Game1.graphics.GraphicsDevice, new FileStream(_modContentPaths[0] + "\\PaintingTest.png", FileMode.Open)); - //so2.IsPassable = true; - //so2.IsPlaceable = true; - //StardewModdingAPI.Log.Verbose("REGISTERED WITH ID OF: " + SGame.RegisterModItem(so2)); - - Command.CallCommand("load"); -#endif - } - - static void Events_KeyPressed(object o, EventArgsKeyPressed e) +#if DEBUG
+ StardewModdingAPI.Log.Verbose("REGISTERING BASE CUSTOM ITEM");
+ SObject so = new SObject();
+ so.Name = "Mario Block";
+ so.CategoryName = "SMAPI Test Mod";
+ so.Description = "It's a block from Mario!\nLoaded in realtime by SMAPI.";
+ so.Texture = Texture2D.FromStream(Game1.graphics.GraphicsDevice, new FileStream(_modContentPaths[0] + "\\Test.png", FileMode.Open));
+ so.IsPassable = true;
+ so.IsPlaceable = true;
+ StardewModdingAPI.Log.Verbose("REGISTERED WITH ID OF: " + SGame.RegisterModItem(so));
+
+ //StardewModdingAPI.Log.Verbose("REGISTERING SECOND CUSTOM ITEM");
+ //SObject so2 = new SObject();
+ //so2.Name = "Mario Painting";
+ //so2.CategoryName = "SMAPI Test Mod";
+ //so2.Description = "It's a painting of a creature from Mario!\nLoaded in realtime by SMAPI.";
+ //so2.Texture = Texture2D.FromStream(Game1.graphics.GraphicsDevice, new FileStream(_modContentPaths[0] + "\\PaintingTest.png", FileMode.Open));
+ //so2.IsPassable = true;
+ //so2.IsPlaceable = true;
+ //StardewModdingAPI.Log.Verbose("REGISTERED WITH ID OF: " + SGame.RegisterModItem(so2));
+
+ Command.CallCommand("load");
+#endif
+ }
+
+ static void Events_KeyPressed(object o, EventArgsKeyPressed e)
+ {
+
+ }
+
+ static void Events_MenuChanged(IClickableMenu newMenu)
{
+ StardewModdingAPI.Log.Verbose("NEW MENU: " + newMenu.GetType());
+ if (newMenu is GameMenu)
+ {
+ Game1.activeClickableMenu = SGameMenu.ConstructFromBaseClass(Game1.activeClickableMenu as GameMenu);
+ }
+ }
- } - - static void Events_MenuChanged(IClickableMenu newMenu) - { - StardewModdingAPI.Log.Verbose("NEW MENU: " + newMenu.GetType()); - if (newMenu is GameMenu) - { - Game1.activeClickableMenu = SGameMenu.ConstructFromBaseClass(Game1.activeClickableMenu as GameMenu); - } - } - - - static void Events_LocationsChanged(List<GameLocation> newLocations) +
+ static void Events_LocationsChanged(List<GameLocation> newLocations)
{
-#if DEBUG - SGame.ModLocations = SGameLocation.ConstructFromBaseClasses(Game1.locations); -#endif - } - - static void Events_CurrentLocationChanged(GameLocation newLocation) +#if DEBUG
+ SGame.ModLocations = SGameLocation.ConstructFromBaseClasses(Game1.locations);
+#endif
+ }
+
+ static void Events_CurrentLocationChanged(GameLocation newLocation)
{
//SGame.CurrentLocation = null;
//System.Threading.Thread.Sleep(10);
-#if DEBUG - Console.WriteLine(newLocation.name); - SGame.CurrentLocation = SGame.LoadOrCreateSGameLocationFromName(newLocation.name); -#endif - //Game1.currentLocation = SGame.CurrentLocation; - //Log.LogComment(((SGameLocation) newLocation).name); - //Log.LogComment("LOC CHANGED: " + SGame.currentLocation.name); - } - - public static void StardewInvoke(Action a) - { - StardewForm.Invoke(a); +#if DEBUG
+ Console.WriteLine(newLocation.name);
+ SGame.CurrentLocation = SGame.LoadOrCreateSGameLocationFromName(newLocation.name);
+#endif
+ //Game1.currentLocation = SGame.CurrentLocation;
+ //Log.LogComment(((SGameLocation) newLocation).name);
+ //Log.LogComment("LOC CHANGED: " + SGame.currentLocation.name);
+ }
+
+ public static void StardewInvoke(Action a)
+ {
+ StardewForm.Invoke(a);
}
static void help_CommandFired(object o, EventArgsCommand e)
@@ -442,66 +445,66 @@ namespace StardewModdingAPI StardewModdingAPI.Log.Info("Commands: " + Command.RegisteredCommands.Select(x => x.CommandName).ToSingular());
}
- #region Logging - [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")] - public static void Log(object o, params object[] format) + #region Logging
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void Log(object o, params object[] format)
+ {
+ StardewModdingAPI.Log.Info(o, format);
+ }
+
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void LogColour(ConsoleColor c, object o, params object[] format)
+ {
+ StardewModdingAPI.Log.Info(o, format);
+ }
+
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void LogInfo(object o, params object[] format)
+ {
+ StardewModdingAPI.Log.Info(o, format);
+ }
+
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void LogError(object o, params object[] format)
+ {
+ StardewModdingAPI.Log.Error(o, format);
+ }
+
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void LogDebug(object o, params object[] format)
+ {
+ StardewModdingAPI.Log.Debug(o, format);
+ }
+
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void LogValueNotSpecified()
+ {
+ StardewModdingAPI.Log.Error("<value> must be specified");
+ }
+
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void LogObjectValueNotSpecified()
+ {
+ StardewModdingAPI.Log.Error("<object> and <value> must be specified");
+ }
+
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void LogValueInvalid()
+ {
+ StardewModdingAPI.Log.Error("<value> is invalid");
+ }
+
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void LogObjectInvalid()
+ {
+ StardewModdingAPI.Log.Error("<object> is invalid");
+ }
+
+ [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")]
+ public static void LogValueNotInt32()
{
- StardewModdingAPI.Log.Info(o, format); - } - - [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")] - public static void LogColour(ConsoleColor c, object o, params object[] format) - { - StardewModdingAPI.Log.Info(o, format); - } - - [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")] - public static void LogInfo(object o, params object[] format) - { - StardewModdingAPI.Log.Info(o, format); - } - - [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")] - public static void LogError(object o, params object[] format) - { - StardewModdingAPI.Log.Error(o, format); - } - - [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")] - public static void LogDebug(object o, params object[] format) - { - StardewModdingAPI.Log.Debug(o, format); - } - - [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")] - public static void LogValueNotSpecified() - { - StardewModdingAPI.Log.Error("<value> must be specified"); - } - - [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")] - public static void LogObjectValueNotSpecified() - { - StardewModdingAPI.Log.Error("<object> and <value> must be specified"); - } - - [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")] - public static void LogValueInvalid() - { - StardewModdingAPI.Log.Error("<value> is invalid"); - } - - [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")] - public static void LogObjectInvalid() - { - StardewModdingAPI.Log.Error("<object> is invalid"); - } - - [Obsolete("This method is obsolete and will be removed in v0.39, please use the appropriate methods in the Log class")] - public static void LogValueNotInt32() - { - StardewModdingAPI.Log.Error("<value> must be a whole number (Int32)"); + StardewModdingAPI.Log.Error("<value> must be a whole number (Int32)");
}
#endregion
- } + }
}
\ No newline at end of file diff --git a/StardewModdingAPI/StardewModdingAPI.csproj b/StardewModdingAPI/StardewModdingAPI.csproj index 6fb1c336..b4494faf 100644 --- a/StardewModdingAPI/StardewModdingAPI.csproj +++ b/StardewModdingAPI/StardewModdingAPI.csproj @@ -44,7 +44,7 @@ </When>
<Otherwise>
<PropertyGroup>
- <SteamPath>..\..\..\..\Games\SteamLibrary</SteamPath>
+ <SteamPath>..\</SteamPath>
</PropertyGroup>
</Otherwise>
</Choose>
@@ -87,13 +87,26 @@ <ApplicationIcon>icon.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
- <Reference Include="Microsoft.Xna.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86" />
- <Reference Include="Microsoft.Xna.Framework.Game, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86" />
- <Reference Include="Microsoft.Xna.Framework.Graphics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86" />
- <Reference Include="Microsoft.Xna.Framework.Xact, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86" />
+ <Reference Include="Microsoft.Xna.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86">
+ <Private>False</Private>
+ </Reference>
+ <Reference Include="Microsoft.Xna.Framework.Game, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86">
+ <Private>False</Private>
+ </Reference>
+ <Reference Include="Microsoft.Xna.Framework.Graphics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86">
+ <Private>False</Private>
+ </Reference>
+ <Reference Include="Microsoft.Xna.Framework.Xact, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86">
+ <Private>False</Private>
+ </Reference>
+ <Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+ <HintPath>..\packages\Newtonsoft.Json.8.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
+ <Private>True</Private>
+ </Reference>
<Reference Include="Stardew Valley, Version=1.0.5905.5747, Culture=neutral, processorArchitecture=x86">
<SpecificVersion>False</SpecificVersion>
<HintPath>$(SteamPath)\steamapps\common\Stardew Valley\Stardew Valley.exe</HintPath>
+ <Private>False</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
@@ -107,10 +120,12 @@ <Reference Include="xTile, Version=2.0.4.0, Culture=neutral, processorArchitecture=x86">
<SpecificVersion>False</SpecificVersion>
<HintPath>$(SteamPath)\steamapps\common\Stardew Valley\xTile.dll</HintPath>
+ <Private>False</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Command.cs" />
+ <Compile Include="Config.cs" />
<Compile Include="Constants.cs" />
<Compile Include="Entities\SCharacter.cs" />
<Compile Include="Entities\SFarm.cs" />
@@ -143,6 +158,7 @@ </ItemGroup>
<ItemGroup>
<None Include="App.config" />
+ <None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<Content Include="icon.ico" />
diff --git a/StardewModdingAPI/packages.config b/StardewModdingAPI/packages.config new file mode 100644 index 00000000..583acbdf --- /dev/null +++ b/StardewModdingAPI/packages.config @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<packages> + <package id="Newtonsoft.Json" version="8.0.3" targetFramework="net45" /> +</packages>
\ No newline at end of file diff --git a/TrainerMod/TrainerMod.csproj b/TrainerMod/TrainerMod.csproj index ddf1b317..2baa6a26 100644 --- a/TrainerMod/TrainerMod.csproj +++ b/TrainerMod/TrainerMod.csproj @@ -34,16 +34,16 @@ <Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<Choose>
- <When Condition="'$(SteamInstallPath)' != ''">
- <PropertyGroup>
- <SteamPath>$(SteamInstallPath)</SteamPath>
+ <When Condition="'$(SteamInstallPath)' != ''">
+ <PropertyGroup>
+ <SteamPath>$(SteamInstallPath)</SteamPath>
</PropertyGroup>
- </When>
- <Otherwise>
- <PropertyGroup>
- <SteamPath>..\..\..\..\Games\SteamLibrary</SteamPath>
- </PropertyGroup>
- </Otherwise>
+ </When>
+ <Otherwise>
+ <PropertyGroup>
+ <SteamPath>..\</SteamPath>
+ </PropertyGroup>
+ </Otherwise>
</Choose>
<ItemGroup>
<Reference Include="Microsoft.Xna.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86">
@@ -52,6 +52,10 @@ <Reference Include="Microsoft.Xna.Framework.Game, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86">
<Private>False</Private>
</Reference>
+ <Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+ <HintPath>..\packages\Newtonsoft.Json.8.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
+ <Private>True</Private>
+ </Reference>
<Reference Include="Stardew Valley">
<HintPath>$(SteamPath)\steamapps\common\Stardew Valley\Stardew Valley.exe</HintPath>
<Private>False</Private>
@@ -80,6 +84,9 @@ <Private>False</Private>
</ProjectReference>
</ItemGroup>
+ <ItemGroup>
+ <None Include="packages.config" />
+ </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>
diff --git a/TrainerMod/packages.config b/TrainerMod/packages.config new file mode 100644 index 00000000..583acbdf --- /dev/null +++ b/TrainerMod/packages.config @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<packages> + <package id="Newtonsoft.Json" version="8.0.3" targetFramework="net45" /> +</packages>
\ No newline at end of file |