summaryrefslogtreecommitdiff
path: root/StardewModdingAPI
diff options
context:
space:
mode:
Diffstat (limited to 'StardewModdingAPI')
-rw-r--r--StardewModdingAPI/App.config17
-rw-r--r--StardewModdingAPI/Command.cs63
-rw-r--r--StardewModdingAPI/Config.cs55
-rw-r--r--StardewModdingAPI/Constants.cs35
-rw-r--r--StardewModdingAPI/Entities/SCharacter.cs4
-rw-r--r--StardewModdingAPI/Entities/SFarm.cs4
-rw-r--r--StardewModdingAPI/Entities/SFarmAnimal.cs4
-rw-r--r--StardewModdingAPI/Entities/SNpc.cs4
-rw-r--r--StardewModdingAPI/Entities/SPlayer.cs50
-rw-r--r--StardewModdingAPI/Events/Controls.cs2
-rw-r--r--StardewModdingAPI/Events/EventArgs.cs47
-rw-r--r--StardewModdingAPI/Events/Game.cs29
-rw-r--r--StardewModdingAPI/Events/Graphics.cs4
-rw-r--r--StardewModdingAPI/Events/Location.cs4
-rw-r--r--StardewModdingAPI/Events/Menu.cs2
-rw-r--r--StardewModdingAPI/Events/Mine.cs2
-rw-r--r--StardewModdingAPI/Events/Player.cs2
-rw-r--r--StardewModdingAPI/Events/Time.cs10
-rw-r--r--StardewModdingAPI/Extensions.cs28
-rw-r--r--StardewModdingAPI/Inheritance/ItemStackChange.cs2
-rw-r--r--StardewModdingAPI/Inheritance/Menus/SBobberBar.cs29
-rw-r--r--StardewModdingAPI/Inheritance/Menus/SGameMenu.cs14
-rw-r--r--StardewModdingAPI/Inheritance/Menus/SInventoryPage.cs12
-rw-r--r--StardewModdingAPI/Inheritance/Minigames/SMinigameBase.cs4
-rw-r--r--StardewModdingAPI/Inheritance/SBareObject.cs11
-rw-r--r--StardewModdingAPI/Inheritance/SGame.cs397
-rw-r--r--StardewModdingAPI/Inheritance/SObject.cs538
-rw-r--r--StardewModdingAPI/JsonResolver.cs61
-rw-r--r--StardewModdingAPI/Logger.cs86
-rw-r--r--StardewModdingAPI/Manifest.cs16
-rw-r--r--StardewModdingAPI/Mod.cs24
-rw-r--r--StardewModdingAPI/ModItem.cs10
-rw-r--r--StardewModdingAPI/Program.cs149
-rw-r--r--StardewModdingAPI/Properties/AssemblyInfo.cs6
-rw-r--r--StardewModdingAPI/Version.cs9
-rw-r--r--StardewModdingAPI/packages.config1
36 files changed, 964 insertions, 771 deletions
diff --git a/StardewModdingAPI/App.config b/StardewModdingAPI/App.config
index 697c237b..dc6eaae3 100644
--- a/StardewModdingAPI/App.config
+++ b/StardewModdingAPI/App.config
@@ -1,9 +1,10 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
+
<configuration>
- <startup>
- <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
- </startup>
- <runtime>
- <loadFromRemoteSources enabled="true"/>
- </runtime>
-</configuration>
+ <startup>
+ <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
+ </startup>
+ <runtime>
+ <loadFromRemoteSources enabled="true" />
+ </runtime>
+</configuration> \ No newline at end of file
diff --git a/StardewModdingAPI/Command.cs b/StardewModdingAPI/Command.cs
index 7cf2b67b..8bc2c0c3 100644
--- a/StardewModdingAPI/Command.cs
+++ b/StardewModdingAPI/Command.cs
@@ -7,27 +7,43 @@ namespace StardewModdingAPI
public class Command
{
internal static List<Command> RegisteredCommands = new List<Command>();
+ public string[] CalledArgs;
+ public string[] CommandArgs;
+ public string CommandDesc;
+
+ public string CommandName;
+
+ /// <summary>
+ /// Creates a Command from a Name, Description, and Arguments
+ /// </summary>
+ /// <param name="cname">Name</param>
+ /// <param name="cdesc">Description</param>
+ /// <param name="args">Arguments</param>
+ public Command(string cname, string cdesc, string[] args = null)
+ {
+ CommandName = cname;
+ CommandDesc = cdesc;
+ if (args == null)
+ args = new string[0];
+ CommandArgs = args;
+ }
- public String CommandName;
- public String CommandDesc;
- public String[] CommandArgs;
- public String[] CalledArgs;
public event EventHandler<EventArgsCommand> CommandFired;
/// <summary>
- /// Calls the specified command. (It runs the command)
+ /// Calls the specified command. (It runs the command)
/// </summary>
/// <param name="input">The command to run</param>
public static void CallCommand(string input)
{
input = input.TrimEnd(' ');
- string[] args = new string[0];
+ var args = new string[0];
Command fnd;
if (input.Contains(" "))
{
args = input.Split(new[] {" "}, 2, StringSplitOptions.RemoveEmptyEntries);
fnd = FindCommand(args[0]);
- args = args[1].Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
+ args = args[1].Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries);
}
else
{
@@ -41,12 +57,12 @@ namespace StardewModdingAPI
}
else
{
- Log.Error("Unknown Command");
+ Log.AsyncR("Unknown Command");
}
}
/// <summary>
- /// Registers a command to the list of commands properly
+ /// Registers a command to the list of commands properly
/// </summary>
/// <param name="command">Name of the command to register</param>
/// <param name="cdesc">Description</param>
@@ -54,21 +70,21 @@ namespace StardewModdingAPI
/// <returns></returns>
public static Command RegisterCommand(string command, string cdesc, string[] args = null)
{
- Command c = new Command(command, cdesc, args);
+ var c = new Command(command, cdesc, args);
if (RegisteredCommands.Contains(c))
{
- Log.Error("Command already registered! [{0}]", c.CommandName);
+ Log.AsyncR($"Command already registered! [{c.CommandName}]");
return RegisteredCommands.Find(x => x.Equals(c));
}
RegisteredCommands.Add(c);
- Log.Verbose("Registered command: " + command);
+ Log.AsyncY("Registered command: " + command);
return c;
}
/// <summary>
- /// Looks up a command in the list of registered commands. Returns null if it doesn't exist (I think)
+ /// Looks up a command in the list of registered commands. Returns null if it doesn't exist (I think)
/// </summary>
/// <param name="name">Name of command to find</param>
/// <returns></returns>
@@ -78,31 +94,16 @@ namespace StardewModdingAPI
}
/// <summary>
- /// Creates a Command from a Name, Description, and Arguments
- /// </summary>
- /// <param name="cname">Name</param>
- /// <param name="cdesc">Description</param>
- /// <param name="args">Arguments</param>
- public Command(String cname, String cdesc, String[] args = null)
- {
- CommandName = cname;
- CommandDesc = cdesc;
- if (args == null)
- args = new string[0];
- CommandArgs = args;
- }
-
- /// <summary>
- /// Runs a command. Fires it. Calls it. Any of those.
+ /// Runs a command. Fires it. Calls it. Any of those.
/// </summary>
public void Fire()
{
if (CommandFired == null)
{
- Log.Error("Command failed to fire because it's fire event is null: " + CommandName);
+ Log.AsyncR("Command failed to fire because it's fire event is null: " + CommandName);
return;
}
CommandFired.Invoke(this, new EventArgsCommand(this));
}
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Config.cs b/StardewModdingAPI/Config.cs
index d5517535..035d28d7 100644
--- a/StardewModdingAPI/Config.cs
+++ b/StardewModdingAPI/Config.cs
@@ -5,7 +5,6 @@
using System;
using System.IO;
using System.Linq;
-using System.Reflection;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
@@ -22,15 +21,7 @@ namespace StardewModdingAPI
public virtual Config Instance<T>() where T : Config => Activator.CreateInstance<T>();
/// <summary>
- /// Should never be used for anything.
- /// </summary>
- public Config()
- {
-
- }
-
- /// <summary>
- /// Loads the config from the json blob on disk, updating and re-writing to the disk if needed.
+ /// Loads the config from the json blob on disk, updating and re-writing to the disk if needed.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
@@ -38,7 +29,7 @@ namespace StardewModdingAPI
{
if (string.IsNullOrEmpty(ConfigLocation))
{
- Log.Error("A config tried to load without specifying a location on the disk.");
+ Log.AsyncR("A config tried to load without specifying a location on the disk.");
return null;
}
@@ -47,7 +38,7 @@ namespace StardewModdingAPI
if (!File.Exists(ConfigLocation))
{
//no config exists, generate default values
- var c = this.GenerateDefaultConfig<T>();
+ var c = GenerateDefaultConfig<T>();
c.ConfigLocation = ConfigLocation;
ret = c;
}
@@ -56,7 +47,7 @@ namespace StardewModdingAPI
try
{
//try to load the config from a json blob on disk
- T c = JsonConvert.DeserializeObject<T>(File.ReadAllText(ConfigLocation), new JsonSerializerSettings() {ContractResolver = new JsonResolver()});
+ var c = JsonConvert.DeserializeObject<T>(File.ReadAllText(ConfigLocation), new JsonSerializerSettings {ContractResolver = new JsonResolver()});
c.ConfigLocation = ConfigLocation;
@@ -67,7 +58,7 @@ namespace StardewModdingAPI
}
catch (Exception ex)
{
- Log.Error("Invalid JSON ({0}): {1} \n{2}", GetType().Name, ConfigLocation, ex);
+ Log.AsyncR($"Invalid JSON ({GetType().Name}): {ConfigLocation} \n{ex}");
return GenerateDefaultConfig<T>();
}
}
@@ -77,7 +68,7 @@ namespace StardewModdingAPI
}
/// <summary>
- /// MUST be implemented in inheriting class!
+ /// MUST be implemented in inheriting class!
/// </summary>
public virtual T GenerateDefaultConfig<T>() where T : Config
{
@@ -85,7 +76,7 @@ namespace StardewModdingAPI
}
/// <summary>
- /// Merges a default-value config with the user-config on disk.
+ /// Merges a default-value config with the user-config on disk.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
@@ -94,16 +85,16 @@ namespace StardewModdingAPI
try
{
//default config
- var b = JObject.FromObject(Instance<T>().GenerateDefaultConfig<T>(), new JsonSerializer() {ContractResolver = new JsonResolver()});
+ var b = JObject.FromObject(Instance<T>().GenerateDefaultConfig<T>(), new JsonSerializer {ContractResolver = new JsonResolver()});
//user config
- var u = JObject.FromObject(this, new JsonSerializer() {ContractResolver = new JsonResolver()});
+ var u = JObject.FromObject(this, new JsonSerializer {ContractResolver = new JsonResolver()});
//overwrite default values with user values
b.Merge(u, new JsonMergeSettings {MergeArrayHandling = MergeArrayHandling.Replace});
//cast json object to config
- T c = b.ToObject<T>();
+ var c = b.ToObject<T>();
//re-write the location on disk to the object
c.ConfigLocation = ConfigLocation;
@@ -112,7 +103,7 @@ namespace StardewModdingAPI
}
catch (Exception ex)
{
- Log.Error("An error occured when updating a config: " + ex);
+ Log.AsyncR("An error occured when updating a config: " + ex);
return this as T;
}
}
@@ -121,10 +112,10 @@ namespace StardewModdingAPI
public static class ConfigExtensions
{
/// <summary>
- /// Initializes an instance of any class that inherits from Config.
- /// This method performs the loading, saving, and merging of the config on the disk and in memory at a default state.
- /// This method should not be used to re-load or to re-save a config.
- /// NOTE: You MUST set your config EQUAL to the return of this method!
+ /// Initializes an instance of any class that inherits from Config.
+ /// This method performs the loading, saving, and merging of the config on the disk and in memory at a default state.
+ /// This method should not be used to re-load or to re-save a config.
+ /// NOTE: You MUST set your config EQUAL to the return of this method!
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="baseConfig"></param>
@@ -136,35 +127,35 @@ namespace StardewModdingAPI
{
baseConfig = Activator.CreateInstance<T>();
/*
- Log.Error("A config tried to initialize whilst being null.");
+ Log.AsyncR("A config tried to initialize whilst being null.");
return null;
*/
}
if (string.IsNullOrEmpty(configLocation))
{
- Log.Error("A config tried to initialize without specifying a location on the disk.");
+ Log.AsyncR("A config tried to initialize without specifying a location on the disk.");
return null;
}
baseConfig.ConfigLocation = configLocation;
- T c = baseConfig.LoadConfig<T>();
+ var c = baseConfig.LoadConfig<T>();
return c;
}
/// <summary>
- /// Writes a config to a json blob on the disk specified in the config's properties.
+ /// Writes a config to a json blob on the disk specified in the config's properties.
/// </summary>
public static void WriteConfig<T>(this T baseConfig) where T : Config
{
if (string.IsNullOrEmpty(baseConfig?.ConfigLocation) || string.IsNullOrEmpty(baseConfig.ConfigDir))
{
- Log.Error("A config attempted to save when it itself or it's location were null.");
+ Log.AsyncR("A config attempted to save when it itself or it's location were null.");
return;
}
- string s = JsonConvert.SerializeObject(baseConfig, typeof (T), Formatting.Indented, new JsonSerializerSettings() {ContractResolver = new JsonResolver()});
+ var s = JsonConvert.SerializeObject(baseConfig, typeof (T), Formatting.Indented, new JsonSerializerSettings {ContractResolver = new JsonResolver()});
if (!Directory.Exists(baseConfig.ConfigDir))
Directory.CreateDirectory(baseConfig.ConfigDir);
@@ -174,8 +165,8 @@ namespace StardewModdingAPI
}
/// <summary>
- /// Re-reads the json blob on the disk and merges its values with a default config
- /// NOTE: You MUST set your config EQUAL to the return of this method!
+ /// Re-reads the json blob on the disk and merges its values with a default config
+ /// NOTE: You MUST set your config EQUAL to the return of this method!
/// </summary>
public static T ReloadConfig<T>(this T baseConfig) where T : Config
{
diff --git a/StardewModdingAPI/Constants.cs b/StardewModdingAPI/Constants.cs
index 109f22f8..ddd46115 100644
--- a/StardewModdingAPI/Constants.cs
+++ b/StardewModdingAPI/Constants.cs
@@ -6,13 +6,20 @@ using StardewValley;
namespace StardewModdingAPI
{
/// <summary>
- /// Static class containing readonly values.
+ /// Static class containing readonly values.
/// </summary>
public static class Constants
{
+ public static readonly Version Version = new Version(0, 39, 3, "Alpha");
+
/// <summary>
- /// Stardew Valley's roaming app data location.
- /// %AppData%//StardewValley
+ /// Not quite "constant", but it makes more sense for it to be here, at least for now
+ /// </summary>
+ public static int ModsLoaded = 0;
+
+ /// <summary>
+ /// Stardew Valley's roaming app data location.
+ /// %AppData%//StardewValley
/// </summary>
public static string DataPath => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "StardewValley");
@@ -29,33 +36,27 @@ namespace StardewModdingAPI
public static bool PlayerNull => !Game1.hasLoadedGame || Game1.player == null || string.IsNullOrEmpty(Game1.player.name);
/// <summary>
- /// Execution path to execute the code.
+ /// Execution path to execute the code.
/// </summary>
public static string ExecutionPath => Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
/// <summary>
- /// Title for the API console
+ /// Title for the API console
/// </summary>
public static string ConsoleTitle => $"Stardew Modding API Console - Version {Version.VersionString} - Mods Loaded: {ModsLoaded}";
/// <summary>
- /// Path for log files to be output to.
- /// %LocalAppData%//StardewValley//ErrorLogs
+ /// Path for log files to be output to.
+ /// %LocalAppData%//StardewValley//ErrorLogs
/// </summary>
public static string LogDir => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "StardewValley", "ErrorLogs");
- public static string LogPath => Path.Combine(LogDir, "MODDED_ProgramLog.Log_LATEST.txt");
- public static readonly Version Version = new Version(0, 39, 3, "Alpha");
-
- /// <summary>
- /// Not quite "constant", but it makes more sense for it to be here, at least for now
- /// </summary>
- public static int ModsLoaded = 0;
+ public static string LogPath => Path.Combine(LogDir, "MODDED_ProgramLog.Log_LATEST.txt");
/// <summary>
- /// Whether or not to enable the Render Target drawing code offered by ClxS
- /// Do not mark as 'const' or else 'if' checks will complain that the expression is always true in ReSharper
+ /// Whether or not to enable the Render Target drawing code offered by ClxS
+ /// Do not mark as 'const' or else 'if' checks will complain that the expression is always true in ReSharper
/// </summary>
public static bool EnableDrawingIntoRenderTarget => true;
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Entities/SCharacter.cs b/StardewModdingAPI/Entities/SCharacter.cs
index 39e4f9c8..2d941d55 100644
--- a/StardewModdingAPI/Entities/SCharacter.cs
+++ b/StardewModdingAPI/Entities/SCharacter.cs
@@ -1,6 +1,6 @@
namespace StardewModdingAPI.Entities
{
- class SCharacter
+ internal class SCharacter
{
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Entities/SFarm.cs b/StardewModdingAPI/Entities/SFarm.cs
index 4895df7e..c6c64681 100644
--- a/StardewModdingAPI/Entities/SFarm.cs
+++ b/StardewModdingAPI/Entities/SFarm.cs
@@ -1,6 +1,6 @@
namespace StardewModdingAPI.Entities
{
- class SFarm
+ internal class SFarm
{
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Entities/SFarmAnimal.cs b/StardewModdingAPI/Entities/SFarmAnimal.cs
index 8bd99e1c..fb8ee267 100644
--- a/StardewModdingAPI/Entities/SFarmAnimal.cs
+++ b/StardewModdingAPI/Entities/SFarmAnimal.cs
@@ -1,6 +1,6 @@
namespace StardewModdingAPI.Entities
{
- class SFarmAnimal
+ internal class SFarmAnimal
{
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Entities/SNpc.cs b/StardewModdingAPI/Entities/SNpc.cs
index 612c9c89..727dcff7 100644
--- a/StardewModdingAPI/Entities/SNpc.cs
+++ b/StardewModdingAPI/Entities/SNpc.cs
@@ -1,6 +1,6 @@
namespace StardewModdingAPI.Entities
{
- class SNpc
+ internal class SNpc
{
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Entities/SPlayer.cs b/StardewModdingAPI/Entities/SPlayer.cs
index c74ba461..d464cded 100644
--- a/StardewModdingAPI/Entities/SPlayer.cs
+++ b/StardewModdingAPI/Entities/SPlayer.cs
@@ -1,33 +1,33 @@
-using System.Collections.Generic;
-using StardewModdingAPI.Inheritance;
+using System;
+using System.Collections.Generic;
using StardewValley;
namespace StardewModdingAPI.Entities
{
- public static class SPlayer
+ /// <summary>
+ /// Static class for intergrating with the player
+ /// </summary>
+ public class SPlayer
{
- public static List<Farmer> AllFarmers
- {
- get
- {
- return SGame.getAllFarmers();
- }
- }
+ /// <summary>
+ /// Calls 'getAllFarmers' in Game1
+ /// </summary>
+ public static List<Farmer> AllFarmers => Game1.getAllFarmers();
- public static Farmer CurrentFarmer
- {
- get
- {
- return SGame.player;
- }
- }
+ /// <summary>
+ /// Do not use.
+ /// </summary>
+ [Obsolete("Use 'Player' instead.")]
+ public static Farmer CurrentFarmer => Game1.player;
- public static GameLocation CurrentFarmerLocation
- {
- get
- {
- return SGame.player.currentLocation;
- }
- }
+ /// <summary>
+ /// Gets the current player from Game1
+ /// </summary>
+ public static Farmer Player => Game1.player;
+
+ /// <summary>
+ /// Gets the player's current location from Game1
+ /// </summary>
+ public static GameLocation CurrentFarmerLocation => Player.currentLocation;
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Events/Controls.cs b/StardewModdingAPI/Events/Controls.cs
index 5c604492..87319f37 100644
--- a/StardewModdingAPI/Events/Controls.cs
+++ b/StardewModdingAPI/Events/Controls.cs
@@ -55,4 +55,4 @@ namespace StardewModdingAPI.Events
ControllerTriggerReleased.Invoke(null, new EventArgsControllerTriggerReleased(playerIndex, buttons, value));
}
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Events/EventArgs.cs b/StardewModdingAPI/Events/EventArgs.cs
index 59fa1bbd..91151e86 100644
--- a/StardewModdingAPI/Events/EventArgs.cs
+++ b/StardewModdingAPI/Events/EventArgs.cs
@@ -17,6 +17,7 @@ namespace StardewModdingAPI.Events
NewState = newState;
NewState = newState;
}
+
public KeyboardState NewState { get; private set; }
public KeyboardState PriorState { get; private set; }
}
@@ -27,6 +28,7 @@ namespace StardewModdingAPI.Events
{
KeyPressed = keyPressed;
}
+
public Keys KeyPressed { get; private set; }
}
@@ -37,6 +39,7 @@ namespace StardewModdingAPI.Events
PlayerIndex = playerIndex;
ButtonPressed = buttonPressed;
}
+
public PlayerIndex PlayerIndex { get; private set; }
public Buttons ButtonPressed { get; private set; }
}
@@ -48,6 +51,7 @@ namespace StardewModdingAPI.Events
PlayerIndex = playerIndex;
ButtonReleased = buttonReleased;
}
+
public PlayerIndex PlayerIndex { get; private set; }
public Buttons ButtonReleased { get; private set; }
}
@@ -60,6 +64,7 @@ namespace StardewModdingAPI.Events
ButtonPressed = buttonPressed;
Value = value;
}
+
public PlayerIndex PlayerIndex { get; private set; }
public Buttons ButtonPressed { get; private set; }
public float Value { get; private set; }
@@ -73,18 +78,20 @@ namespace StardewModdingAPI.Events
ButtonReleased = buttonReleased;
Value = value;
}
+
public PlayerIndex PlayerIndex { get; private set; }
public Buttons ButtonReleased { get; private set; }
public float Value { get; private set; }
}
public class EventArgsMouseStateChanged : EventArgs
- {
+ {
public EventArgsMouseStateChanged(MouseState priorState, MouseState newState)
{
NewState = newState;
NewState = newState;
}
+
public MouseState NewState { get; private set; }
public MouseState PriorState { get; private set; }
}
@@ -96,6 +103,7 @@ namespace StardewModdingAPI.Events
NewMenu = newMenu;
PriorMenu = priorMenu;
}
+
public IClickableMenu NewMenu { get; private set; }
public IClickableMenu PriorMenu { get; private set; }
}
@@ -106,8 +114,10 @@ namespace StardewModdingAPI.Events
{
NewLocations = newLocations;
}
+
public List<GameLocation> NewLocations { get; private set; }
}
+
public class EventArgsMineLevelChanged : EventArgs
{
public EventArgsMineLevelChanged(int previousMineLevel, int currentMineLevel)
@@ -115,6 +125,7 @@ namespace StardewModdingAPI.Events
PreviousMineLevel = previousMineLevel;
CurrentMineLevel = currentMineLevel;
}
+
public int PreviousMineLevel { get; private set; }
public int CurrentMineLevel { get; private set; }
}
@@ -125,6 +136,7 @@ namespace StardewModdingAPI.Events
{
NewObjects = newObjects;
}
+
public SerializableDictionary<Vector2, Object> NewObjects { get; private set; }
}
@@ -135,6 +147,7 @@ namespace StardewModdingAPI.Events
NewLocation = newLocation;
PriorLocation = priorLocation;
}
+
public GameLocation NewLocation { get; private set; }
public GameLocation PriorLocation { get; private set; }
}
@@ -146,8 +159,9 @@ namespace StardewModdingAPI.Events
NewFarmer = NewFarmer;
PriorFarmer = PriorFarmer;
}
- public Farmer NewFarmer { get; private set; }
- public Farmer PriorFarmer { get; private set; }
+
+ public Farmer NewFarmer { get; }
+ public Farmer PriorFarmer { get; }
}
public class EventArgsInventoryChanged : EventArgs
@@ -159,6 +173,7 @@ namespace StardewModdingAPI.Events
Removed = changedItems.Where(n => n.ChangeType == ChangeType.Removed).ToList();
QuantityChanged = changedItems.Where(n => n.ChangeType == ChangeType.StackChange).ToList();
}
+
public List<Item> Inventory { get; private set; }
public List<ItemStackChange> Added { get; private set; }
public List<ItemStackChange> Removed { get; private set; }
@@ -169,42 +184,46 @@ namespace StardewModdingAPI.Events
{
public enum LevelType
{
- Combat,
+ Combat,
Farming,
Fishing,
Foraging,
Mining,
Luck
}
- public EventArgsLevelUp(LevelType type, Int32 newLevel)
+
+ public EventArgsLevelUp(LevelType type, int newLevel)
{
Type = type;
NewLevel = newLevel;
}
+
public LevelType Type { get; private set; }
- public Int32 NewLevel { get; private set; }
+ public int NewLevel { get; private set; }
}
public class EventArgsIntChanged : EventArgs
{
- public EventArgsIntChanged(Int32 priorInt, Int32 newInt)
+ public EventArgsIntChanged(int priorInt, int newInt)
{
NewInt = NewInt;
PriorInt = PriorInt;
}
- public Int32 NewInt { get; private set; }
- public Int32 PriorInt { get; private set; }
+
+ public int NewInt { get; }
+ public int PriorInt { get; }
}
public class EventArgsStringChanged : EventArgs
{
- public EventArgsStringChanged(String priorString, String newString)
+ public EventArgsStringChanged(string priorString, string newString)
{
NewString = newString;
PriorString = priorString;
}
- public String NewString { get; private set; }
- public String PriorString { get; private set; }
+
+ public string NewString { get; private set; }
+ public string PriorString { get; private set; }
}
public class EventArgsLoadedGameChanged : EventArgs
@@ -224,7 +243,7 @@ namespace StardewModdingAPI.Events
{
Command = command;
}
+
public Command Command { get; private set; }
}
-}
-
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Events/Game.cs b/StardewModdingAPI/Events/Game.cs
index 85022391..c8052962 100644
--- a/StardewModdingAPI/Events/Game.cs
+++ b/StardewModdingAPI/Events/Game.cs
@@ -8,32 +8,39 @@ namespace StardewModdingAPI.Events
public static event EventHandler Initialize = delegate { };
public static event EventHandler LoadContent = delegate { };
public static event EventHandler FirstUpdateTick = delegate { };
+
/// <summary>
- /// Fires every update (1/60 of a second)
+ /// Fires every update (1/60 of a second)
/// </summary>
public static event EventHandler UpdateTick = delegate { };
+
/// <summary>
- /// Fires every other update (1/30 of a second)
+ /// Fires every other update (1/30 of a second)
/// </summary>
public static event EventHandler SecondUpdateTick = delegate { };
+
/// <summary>
- /// Fires every fourth update (1/15 of a second)
+ /// Fires every fourth update (1/15 of a second)
/// </summary>
public static event EventHandler FourthUpdateTick = delegate { };
+
/// <summary>
- /// Fires every eighth update (roughly 1/8 of a second)
+ /// Fires every eighth update (roughly 1/8 of a second)
/// </summary>
public static event EventHandler EighthUpdateTick = delegate { };
+
/// <summary>
- /// Fires every fifthteenth update (1/4 of a second)
+ /// Fires every fifthteenth update (1/4 of a second)
/// </summary>
public static event EventHandler QuarterSecondTick = delegate { };
+
/// <summary>
- /// Fires every thirtieth update (1/2 of a second)
+ /// Fires every thirtieth update (1/2 of a second)
/// </summary>
public static event EventHandler HalfSecondTick = delegate { };
+
/// <summary>
- /// Fires every sixtieth update (a second)
+ /// Fires every sixtieth update (a second)
/// </summary>
public static event EventHandler OneSecondTick = delegate { };
@@ -50,7 +57,7 @@ namespace StardewModdingAPI.Events
}
catch (Exception ex)
{
- Log.Error("An exception occured in XNA Initialize: " + ex);
+ Log.AsyncR("An exception occured in XNA Initialize: " + ex);
}
}
@@ -62,7 +69,7 @@ namespace StardewModdingAPI.Events
}
catch (Exception ex)
{
- Log.Error("An exception occured in XNA LoadContent: " + ex);
+ Log.AsyncR("An exception occured in XNA LoadContent: " + ex);
}
}
@@ -74,7 +81,7 @@ namespace StardewModdingAPI.Events
}
catch (Exception ex)
{
- Log.Error("An exception occured in XNA UpdateTick: " + ex);
+ Log.AsyncR("An exception occured in XNA UpdateTick: " + ex);
}
}
@@ -113,4 +120,4 @@ namespace StardewModdingAPI.Events
FirstUpdateTick.Invoke(null, EventArgs.Empty);
}
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Events/Graphics.cs b/StardewModdingAPI/Events/Graphics.cs
index db963924..a2e7fc40 100644
--- a/StardewModdingAPI/Events/Graphics.cs
+++ b/StardewModdingAPI/Events/Graphics.cs
@@ -16,7 +16,7 @@ namespace StardewModdingAPI.Events
}
catch (Exception ex)
{
- Log.Error("An exception occured in a Mod's DrawTick: " + ex);
+ Log.AsyncR("An exception occured in a Mod's DrawTick: " + ex);
}
}
@@ -30,4 +30,4 @@ namespace StardewModdingAPI.Events
Resize.Invoke(sender, e);
}
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Events/Location.cs b/StardewModdingAPI/Events/Location.cs
index 63b0f602..d5b6cdec 100644
--- a/StardewModdingAPI/Events/Location.cs
+++ b/StardewModdingAPI/Events/Location.cs
@@ -21,10 +21,10 @@ namespace StardewModdingAPI.Events
{
CurrentLocationChanged.Invoke(null, new EventArgsCurrentLocationChanged(priorLocation, newLocation));
}
-
+
internal static void InvokeOnNewLocationObject(SerializableDictionary<Vector2, Object> newObjects)
{
LocationObjectsChanged.Invoke(null, new EventArgsLocationObjectsChanged(newObjects));
}
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Events/Menu.cs b/StardewModdingAPI/Events/Menu.cs
index d3f3e008..8acfc863 100644
--- a/StardewModdingAPI/Events/Menu.cs
+++ b/StardewModdingAPI/Events/Menu.cs
@@ -12,4 +12,4 @@ namespace StardewModdingAPI.Events
MenuChanged.Invoke(null, new EventArgsClickableMenuChanged(priorMenu, newMenu));
}
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Events/Mine.cs b/StardewModdingAPI/Events/Mine.cs
index f48e9574..2f89c91d 100644
--- a/StardewModdingAPI/Events/Mine.cs
+++ b/StardewModdingAPI/Events/Mine.cs
@@ -11,4 +11,4 @@ namespace StardewModdingAPI.Events
MineLevelChanged.Invoke(null, new EventArgsMineLevelChanged(previousMinelevel, currentMineLevel));
}
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Events/Player.cs b/StardewModdingAPI/Events/Player.cs
index ca05c05b..a658259e 100644
--- a/StardewModdingAPI/Events/Player.cs
+++ b/StardewModdingAPI/Events/Player.cs
@@ -32,4 +32,4 @@ namespace StardewModdingAPI.Events
LoadedGame.Invoke(null, loaded);
}
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Events/Time.cs b/StardewModdingAPI/Events/Time.cs
index a3fcee19..56b23dc3 100644
--- a/StardewModdingAPI/Events/Time.cs
+++ b/StardewModdingAPI/Events/Time.cs
@@ -9,24 +9,24 @@ namespace StardewModdingAPI.Events
public static event EventHandler<EventArgsIntChanged> YearOfGameChanged = delegate { };
public static event EventHandler<EventArgsStringChanged> SeasonOfYearChanged = delegate { };
- public static void InvokeTimeOfDayChanged(Int32 priorInt, Int32 newInt)
+ public static void InvokeTimeOfDayChanged(int priorInt, int newInt)
{
TimeOfDayChanged.Invoke(null, new EventArgsIntChanged(priorInt, newInt));
}
- public static void InvokeDayOfMonthChanged(Int32 priorInt, Int32 newInt)
+ public static void InvokeDayOfMonthChanged(int priorInt, int newInt)
{
DayOfMonthChanged.Invoke(null, new EventArgsIntChanged(priorInt, newInt));
}
- public static void InvokeYearOfGameChanged(Int32 priorInt, Int32 newInt)
+ public static void InvokeYearOfGameChanged(int priorInt, int newInt)
{
YearOfGameChanged.Invoke(null, new EventArgsIntChanged(priorInt, newInt));
}
- public static void InvokeSeasonOfYearChanged(String priorString, String newString)
+ public static void InvokeSeasonOfYearChanged(string priorString, string newString)
{
SeasonOfYearChanged.Invoke(null, new EventArgsStringChanged(priorString, newString));
}
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Extensions.cs b/StardewModdingAPI/Extensions.cs
index 58430a6e..fcf7eda2 100644
--- a/StardewModdingAPI/Extensions.cs
+++ b/StardewModdingAPI/Extensions.cs
@@ -25,16 +25,16 @@ namespace StardewModdingAPI
[Obsolete("The usage of ToSingular has changed. Please update your call to use ToSingular<T>")]
public static string ToSingular(this IEnumerable ienum, string split = ", ")
{
- Log.Error("The usage of ToSingular has changed. Please update your call to use ToSingular<T>");
+ Log.AsyncR("The usage of ToSingular has changed. Please update your call to use ToSingular<T>");
return "";
}
- public static string ToSingular<T>(this IEnumerable<T> ienum, string split = ", ")// where T : class
+ public static string ToSingular<T>(this IEnumerable<T> ienum, string split = ", ") // where T : class
{
//Apparently Keys[] won't split normally :l
- if (typeof(T) == typeof(Keys))
+ if (typeof (T) == typeof (Keys))
{
- return string.Join<T>(split, ienum.ToArray<T>());
+ return string.Join(split, ienum.ToArray());
}
return string.Join(split, ienum);
}
@@ -47,28 +47,28 @@ namespace StardewModdingAPI
public static bool IsInt32(this object o)
{
int i;
- return Int32.TryParse(o.ToString(), out i);
+ return int.TryParse(o.ToString(), out i);
}
- public static Int32 AsInt32(this object o)
+ public static int AsInt32(this object o)
{
- return Int32.Parse(o.ToString());
+ return int.Parse(o.ToString());
}
public static bool IsBool(this object o)
{
bool b;
- return Boolean.TryParse(o.ToString(), out b);
+ return bool.TryParse(o.ToString(), out b);
}
public static bool AsBool(this object o)
{
- return Boolean.Parse(o.ToString());
+ return bool.Parse(o.ToString());
}
-
+
public static int GetHash(this IEnumerable enumerable)
{
- int hash = 0;
+ var hash = 0;
foreach (var v in enumerable)
{
hash ^= v.GetHashCode();
@@ -107,7 +107,7 @@ namespace StardewModdingAPI
return o.GetType().GetBaseFieldInfo(name).GetValue(o) as T;
}*/
- /*
+ /*
public static object GetBaseFieldValue(this object o, string name)
{
return o.GetType().GetBaseFieldInfo(name).GetValue(o);
@@ -121,8 +121,8 @@ namespace StardewModdingAPI
public static string RemoveNumerics(this string st)
{
- string s = st;
- foreach (char c in s)
+ var s = st;
+ foreach (var c in s)
{
if (!char.IsLetterOrDigit(c))
{
diff --git a/StardewModdingAPI/Inheritance/ItemStackChange.cs b/StardewModdingAPI/Inheritance/ItemStackChange.cs
index cfadea04..88fc002e 100644
--- a/StardewModdingAPI/Inheritance/ItemStackChange.cs
+++ b/StardewModdingAPI/Inheritance/ItemStackChange.cs
@@ -15,4 +15,4 @@ namespace StardewModdingAPI.Inheritance
public int StackChange { get; set; }
public ChangeType ChangeType { get; set; }
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Inheritance/Menus/SBobberBar.cs b/StardewModdingAPI/Inheritance/Menus/SBobberBar.cs
index ecfc0c38..ddac33c6 100644
--- a/StardewModdingAPI/Inheritance/Menus/SBobberBar.cs
+++ b/StardewModdingAPI/Inheritance/Menus/SBobberBar.cs
@@ -7,20 +7,28 @@ namespace StardewModdingAPI.Inheritance.Menus
{
public class SBobberBar : BobberBar
{
+ /// <summary>
+ /// DO NOT CONSTRUCT THIS CLASS
+ /// To retrieve an instance of SBobberBar, use SBobberBar.ConstructFromBaseClass()
+ /// </summary>
+ public SBobberBar(int whichFish, float fishSize, bool treasure, int bobber) : base(whichFish, fishSize, treasure, bobber)
+ {
+ }
+
public BobberBar BaseBobberBar { get; private set; }
/// <summary>
- /// The green rectangle bar that moves up and down
+ /// The green rectangle bar that moves up and down
/// </summary>
public float bobberPosition
{
get { return (float) GetBaseFieldInfo("bobberPosition").GetValue(BaseBobberBar); }
set { GetBaseFieldInfo("bobberPosition").SetValue(BaseBobberBar, value); }
}
-
+
/// <summary>
- /// The green bar on the right. How close to catching the fish you are
- /// Range: 0 - 1 | 1 = catch, 0 = fail
+ /// The green bar on the right. How close to catching the fish you are
+ /// Range: 0 - 1 | 1 = catch, 0 = fail
/// </summary>
public float distanceFromCatching
{
@@ -137,7 +145,7 @@ namespace StardewModdingAPI.Inheritance.Menus
}
/// <summary>
- /// Whether or not a treasure chest appears
+ /// Whether or not a treasure chest appears
/// </summary>
public bool treasure
{
@@ -266,20 +274,11 @@ namespace StardewModdingAPI.Inheritance.Menus
public static SBobberBar ConstructFromBaseClass(BobberBar baseClass)
{
- SBobberBar b = new SBobberBar(0, 0, false, 0);
+ var b = new SBobberBar(0, 0, false, 0);
b.BaseBobberBar = baseClass;
return b;
}
- /// <summary>
- /// DO NOT CONSTRUCT THIS CLASS
- /// To retrieve an instance of SBobberBar, use SBobberBar.ConstructFromBaseClass()
- /// </summary>
- public SBobberBar(int whichFish, float fishSize, bool treasure, int bobber) : base(whichFish, fishSize, treasure, bobber)
- {
-
- }
-
public static FieldInfo[] GetPrivateFields()
{
return typeof (BobberBar).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
diff --git a/StardewModdingAPI/Inheritance/Menus/SGameMenu.cs b/StardewModdingAPI/Inheritance/Menus/SGameMenu.cs
index 43ea30d7..f45758f7 100644
--- a/StardewModdingAPI/Inheritance/Menus/SGameMenu.cs
+++ b/StardewModdingAPI/Inheritance/Menus/SGameMenu.cs
@@ -10,19 +10,19 @@ namespace StardewModdingAPI.Inheritance.Menus
public List<ClickableComponent> tabs
{
- get { return (List<ClickableComponent>)GetBaseFieldInfo("tabs").GetValue(BaseGameMenu); }
+ get { return (List<ClickableComponent>) GetBaseFieldInfo("tabs").GetValue(BaseGameMenu); }
set { GetBaseFieldInfo("tabs").SetValue(BaseGameMenu, value); }
}
public List<IClickableMenu> pages
{
- get { return (List<IClickableMenu>)GetBaseFieldInfo("pages").GetValue(BaseGameMenu); }
+ get { return (List<IClickableMenu>) GetBaseFieldInfo("pages").GetValue(BaseGameMenu); }
set { GetBaseFieldInfo("pages").SetValue(BaseGameMenu, value); }
}
public static SGameMenu ConstructFromBaseClass(GameMenu baseClass)
{
- SGameMenu s = new SGameMenu();
+ var s = new SGameMenu();
s.BaseGameMenu = baseClass;
return s;
}
@@ -31,19 +31,19 @@ namespace StardewModdingAPI.Inheritance.Menus
{
if (pages[currentTab] is InventoryPage)
{
- Log.Verbose("INV SCREEN");
+ Log.AsyncY("INV SCREEN");
}
base.receiveRightClick(x, y, playSound);
}
public static FieldInfo[] GetPrivateFields()
{
- return typeof(GameMenu).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
+ return typeof (GameMenu).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
}
public static FieldInfo GetBaseFieldInfo(string name)
{
- return typeof(GameMenu).GetField(name, BindingFlags.Instance | BindingFlags.NonPublic);
+ return typeof (GameMenu).GetField(name, BindingFlags.Instance | BindingFlags.NonPublic);
}
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Inheritance/Menus/SInventoryPage.cs b/StardewModdingAPI/Inheritance/Menus/SInventoryPage.cs
index d798fc95..a51b2d71 100644
--- a/StardewModdingAPI/Inheritance/Menus/SInventoryPage.cs
+++ b/StardewModdingAPI/Inheritance/Menus/SInventoryPage.cs
@@ -4,17 +4,17 @@ namespace StardewModdingAPI.Inheritance.Menus
{
public class SInventoryPage : InventoryPage
{
+ public SInventoryPage(int x, int y, int width, int height) : base(x, y, width, height)
+ {
+ }
+
public InventoryPage BaseInventoryPage { get; private set; }
public static SInventoryPage ConstructFromBaseClass(InventoryPage baseClass)
{
- SInventoryPage s = new SInventoryPage(0,0,0,0);
+ var s = new SInventoryPage(0, 0, 0, 0);
s.BaseInventoryPage = baseClass;
return s;
}
-
- public SInventoryPage(int x, int y, int width, int height) : base(x, y, width, height)
- {
- }
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Inheritance/Minigames/SMinigameBase.cs b/StardewModdingAPI/Inheritance/Minigames/SMinigameBase.cs
index 08a5e861..f30021de 100644
--- a/StardewModdingAPI/Inheritance/Minigames/SMinigameBase.cs
+++ b/StardewModdingAPI/Inheritance/Minigames/SMinigameBase.cs
@@ -5,7 +5,7 @@ using StardewValley.Minigames;
namespace StardewModdingAPI.Inheritance.Minigames
{
- abstract class SMinigameBase : IMinigame
+ internal abstract class SMinigameBase : IMinigame
{
public abstract bool tick(GameTime time);
@@ -31,4 +31,4 @@ namespace StardewModdingAPI.Inheritance.Minigames
public abstract void receiveEventPoke(int data);
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Inheritance/SBareObject.cs b/StardewModdingAPI/Inheritance/SBareObject.cs
index 905dac0d..5bef7b3e 100644
--- a/StardewModdingAPI/Inheritance/SBareObject.cs
+++ b/StardewModdingAPI/Inheritance/SBareObject.cs
@@ -1,11 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Security.AccessControl;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace StardewModdingAPI.Inheritance
+namespace StardewModdingAPI.Inheritance
{
public struct SBareObject
{
@@ -24,4 +17,4 @@ namespace StardewModdingAPI.Inheritance
quality = qua;
}
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Inheritance/SGame.cs b/StardewModdingAPI/Inheritance/SGame.cs
index ce2488d5..f1887253 100644
--- a/StardewModdingAPI/Inheritance/SGame.cs
+++ b/StardewModdingAPI/Inheritance/SGame.cs
@@ -11,60 +11,264 @@ using StardewValley.Menus;
namespace StardewModdingAPI.Inheritance
{
+ /// <summary>
+ /// The 'SGame' class.
+ /// This summary, and many others, only exists because XML doc tags.
+ /// </summary>
public class SGame : Game1
{
- public static Dictionary<Int32, SObject> ModItems { get; private set; }
- public const Int32 LowestModItemID = 1000;
+ /// <summary>
+ /// Useless right now.
+ /// </summary>
+ public const int LowestModItemID = 1000;
- public static FieldInfo[] StaticFields { get { return GetStaticFields(); } }
+ private bool FireLoadedGameEvent;
+
+ /// <summary>
+ /// Gets a jagged array of all buttons pressed on the gamepad the prior frame.
+ /// </summary>
+ public Buttons[][] PreviouslyPressedButtons;
- public static FieldInfo[] GetStaticFields()
+ internal SGame()
{
- return typeof(Game1).GetFields();
+ Instance = this;
+ FirstUpdate = true;
}
+ /// <summary>
+ /// Useless at this time.
+ /// </summary>
+ [Obsolete]
+ public static Dictionary<int, SObject> ModItems { get; private set; }
+
+ /// <summary>
+ /// The current KeyboardState
+ /// </summary>
public KeyboardState KStateNow { get; private set; }
+ /// <summary>
+ /// The prior KeyboardState
+ /// </summary>
public KeyboardState KStatePrior { get; private set; }
+ /// <summary>
+ /// The current MouseState
+ /// </summary>
public MouseState MStateNow { get; private set; }
+
+ /// <summary>
+ /// The prior MouseState
+ /// </summary>
public MouseState MStatePrior { get; private set; }
+ /// <summary>
+ /// All keys pressed on the current frame
+ /// </summary>
public Keys[] CurrentlyPressedKeys => KStateNow.GetPressedKeys();
+
+ /// <summary>
+ /// All keys pressed on the prior frame
+ /// </summary>
public Keys[] PreviouslyPressedKeys => KStatePrior.GetPressedKeys();
+ /// <summary>
+ /// All keys pressed on this frame except for the ones pressed on the prior frame
+ /// </summary>
public Keys[] FramePressedKeys => CurrentlyPressedKeys.Except(PreviouslyPressedKeys).ToArray();
+ /// <summary>
+ /// All keys pressed on the prior frame except for the ones pressed on the current frame
+ /// </summary>
public Keys[] FrameReleasedKeys => PreviouslyPressedKeys.Except(CurrentlyPressedKeys).ToArray();
- public Buttons[][] PreviouslyPressedButtons;
+ /// <summary>
+ /// Whether or not a save was tagged as 'Loaded' the prior frame.
+ /// </summary>
+ public bool PreviouslyLoadedGame { get; private set; }
+
+ /// <summary>
+ /// The list of GameLocations on the prior frame
+ /// </summary>
+ public int PreviousGameLocations { get; private set; }
+
+ /// <summary>
+ /// The list of GameObjects on the prior frame
+ /// </summary>
+ public int PreviousLocationObjects { get; private set; }
+ /// <summary>
+ /// The list of Items in the player's inventory on the prior frame
+ /// </summary>
+ public Dictionary<Item, int> PreviousItems { get; private set; }
+
+ /// <summary>
+ /// The player's Combat level on the prior frame
+ /// </summary>
+ public int PreviousCombatLevel { get; private set; }
+ /// <summary>
+ /// The player's Farming level on the prior frame
+ /// </summary>
+ public int PreviousFarmingLevel { get; private set; }
+ /// <summary>
+ /// The player's Fishing level on the prior frame
+ /// </summary>
+ public int PreviousFishingLevel { get; private set; }
+ /// <summary>
+ /// The player's Foraging level on the prior frame
+ /// </summary>
+ public int PreviousForagingLevel { get; private set; }
+ /// <summary>
+ /// The player's Mining level on the prior frame
+ /// </summary>
+ public int PreviousMiningLevel { get; private set; }
+ /// <summary>
+ /// The player's Luck level on the prior frame
+ /// </summary>
+ public int PreviousLuckLevel { get; private set; }
+
+ //Kill me now comments are so boring
+
+ /// <summary>
+ /// The player's previous game location
+ /// </summary>
+ public GameLocation PreviousGameLocation { get; private set; }
+
+ /// <summary>
+ /// The previous ActiveGameMenu in Game1
+ /// </summary>
+ public IClickableMenu PreviousActiveMenu { get; private set; }
+
+ /// <summary>
+ /// The previous mine level
+ /// </summary>
+ public int PreviousMineLevel { get; private set; }
+
+ /// <summary>
+ /// The previous TimeOfDay (Int32 between 600 and 2400?)
+ /// </summary>
+ public int PreviousTimeOfDay { get; private set; }
+
+ /// <summary>
+ /// The previous DayOfMonth (Int32 between 1 and 28?)
+ /// </summary>
+ public int PreviousDayOfMonth { get; private set; }
+
+ /// <summary>
+ /// The previous Season (String as follows: "winter", "spring", "summer", "fall")
+ /// </summary>
+ public string PreviousSeasonOfYear { get; private set; }
+
+ /// <summary>
+ /// The previous Year
+ /// </summary>
+ public int PreviousYearOfGame { get; private set; }
+
+ /// <summary>
+ /// The previous 'Farmer' (Player)
+ /// </summary>
+ public Farmer PreviousFarmer { get; private set; }
+
+ /// <summary>
+ /// The current index of the update tick. Recycles every 60th tick to 0. (Int32 between 0 and 59)
+ /// </summary>
+ public int CurrentUpdateTick { get; private set; }
+
+ /// <summary>
+ /// Whether or not this update frame is the very first of the entire game
+ /// </summary>
+ public bool FirstUpdate { get; private set; }
+
+ /// <summary>
+ /// The current RenderTarget in Game1 (Private field, uses reflection)
+ /// </summary>
+ public RenderTarget2D Screen
+ {
+ get { return typeof (Game1).GetBaseFieldValue<RenderTarget2D>(Program.gamePtr, "screen"); }
+ set { typeof (Game1).SetBaseFieldValue<RenderTarget2D>(this, "screen", value); }
+ }
+
+ /// <summary>
+ /// Static accessor for an Instance of the class SGame
+ /// </summary>
+ public static SGame Instance { get; private set; }
+
+ /// <summary>
+ /// The game's FPS. Re-determined every Draw update.
+ /// </summary>
+ public static float FramesPerSecond { get; private set; }
+
+ /// <summary>
+ /// Whether or not we're in a pseudo 'debug' mode. Mostly for displaying information like FPS.
+ /// </summary>
+ public static bool Debug { get; private set; }
+
+ /// <summary>
+ /// The current player (equal to Farmer.Player)
+ /// </summary>
+ [Obsolete("Use Farmer.Player instead")]
+ public Farmer CurrentFarmer => player;
+
+ /// <summary>
+ /// Gets ALL static fields that belong to 'Game1'
+ /// </summary>
+ public static FieldInfo[] GetStaticFields => typeof (Game1).GetFields();
+
+ /// <summary>
+ /// Whether or not a button was just pressed on the controller
+ /// </summary>
+ /// <param name="button"></param>
+ /// <param name="buttonState"></param>
+ /// <param name="stateIndex"></param>
+ /// <returns></returns>
private bool WasButtonJustPressed(Buttons button, ButtonState buttonState, PlayerIndex stateIndex)
{
- return buttonState == ButtonState.Pressed && !PreviouslyPressedButtons[(int)stateIndex].Contains(button);
+ return buttonState == ButtonState.Pressed && !PreviouslyPressedButtons[(int) stateIndex].Contains(button);
}
+ /// <summary>
+ /// Whether or not a button was just released on the controller
+ /// </summary>
+ /// <param name="button"></param>
+ /// <param name="buttonState"></param>
+ /// <param name="stateIndex"></param>
+ /// <returns></returns>
private bool WasButtonJustReleased(Buttons button, ButtonState buttonState, PlayerIndex stateIndex)
{
- return buttonState == ButtonState.Released && PreviouslyPressedButtons[(int)stateIndex].Contains(button);
+ return buttonState == ButtonState.Released && PreviouslyPressedButtons[(int) stateIndex].Contains(button);
}
+ /// <summary>
+ /// Whether or not an analog button was just pressed on the controller
+ /// </summary>
+ /// <param name="button"></param>
+ /// <param name="value"></param>
+ /// <param name="stateIndex"></param>
+ /// <returns></returns>
private bool WasButtonJustPressed(Buttons button, float value, PlayerIndex stateIndex)
{
return WasButtonJustPressed(button, value > 0.2f ? ButtonState.Pressed : ButtonState.Released, stateIndex);
}
-
+
+ /// <summary>
+ /// Whether or not an analog button was just released on the controller
+ /// </summary>
+ /// <param name="button"></param>
+ /// <param name="value"></param>
+ /// <param name="stateIndex"></param>
+ /// <returns></returns>
private bool WasButtonJustReleased(Buttons button, float value, PlayerIndex stateIndex)
{
return WasButtonJustReleased(button, value > 0.2f ? ButtonState.Pressed : ButtonState.Released, stateIndex);
}
- public bool PreviouslyLoadedGame { get; private set; }
- private bool FireLoadedGameEvent;
-
+ /// <summary>
+ /// Gets an array of all Buttons pressed on a joystick
+ /// </summary>
+ /// <param name="index"></param>
+ /// <returns></returns>
public Buttons[] GetButtonsDown(PlayerIndex index)
{
- GamePadState state = GamePad.GetState(index);
- List<Buttons> buttons = new List<Buttons>();
+ var state = GamePad.GetState(index);
+ var buttons = new List<Buttons>();
if (state.IsConnected)
{
if (state.Buttons.A == ButtonState.Pressed) buttons.Add(Buttons.A);
@@ -88,15 +292,20 @@ namespace StardewModdingAPI.Inheritance
return buttons.ToArray();
}
+ /// <summary>
+ /// Gets all buttons that were pressed on the current frame of a joystick
+ /// </summary>
+ /// <param name="index"></param>
+ /// <returns></returns>
public Buttons[] GetFramePressedButtons(PlayerIndex index)
- {
- GamePadState state = GamePad.GetState(index);
- List<Buttons> buttons = new List<Buttons>();
+ {
+ var state = GamePad.GetState(index);
+ var buttons = new List<Buttons>();
if (state.IsConnected)
{
- if (WasButtonJustPressed(Buttons.A, state.Buttons.A, index)) buttons.Add(Buttons.A);
- if (WasButtonJustPressed(Buttons.B, state.Buttons.B, index)) buttons.Add(Buttons.B);
- if (WasButtonJustPressed(Buttons.Back, state.Buttons.Back, index)) buttons.Add(Buttons.Back);
+ if (WasButtonJustPressed(Buttons.A, state.Buttons.A, index)) buttons.Add(Buttons.A);
+ if (WasButtonJustPressed(Buttons.B, state.Buttons.B, index)) buttons.Add(Buttons.B);
+ if (WasButtonJustPressed(Buttons.Back, state.Buttons.Back, index)) buttons.Add(Buttons.Back);
if (WasButtonJustPressed(Buttons.BigButton, state.Buttons.BigButton, index)) buttons.Add(Buttons.BigButton);
if (WasButtonJustPressed(Buttons.LeftShoulder, state.Buttons.LeftShoulder, index)) buttons.Add(Buttons.LeftShoulder);
if (WasButtonJustPressed(Buttons.LeftStick, state.Buttons.LeftStick, index)) buttons.Add(Buttons.LeftStick);
@@ -112,13 +321,18 @@ namespace StardewModdingAPI.Inheritance
if (WasButtonJustPressed(Buttons.LeftTrigger, state.Triggers.Left, index)) buttons.Add(Buttons.LeftTrigger);
if (WasButtonJustPressed(Buttons.RightTrigger, state.Triggers.Right, index)) buttons.Add(Buttons.RightTrigger);
}
- return buttons.ToArray();
+ return buttons.ToArray();
}
+ /// <summary>
+ /// Gets all buttons that were released on the current frame of a joystick
+ /// </summary>
+ /// <param name="index"></param>
+ /// <returns></returns>
public Buttons[] GetFrameReleasedButtons(PlayerIndex index)
{
- GamePadState state = GamePad.GetState(index);
- List<Buttons> buttons = new List<Buttons>();
+ var state = GamePad.GetState(index);
+ var buttons = new List<Buttons>();
if (state.IsConnected)
{
if (WasButtonJustReleased(Buttons.A, state.Buttons.A, index)) buttons.Add(Buttons.A);
@@ -142,70 +356,34 @@ namespace StardewModdingAPI.Inheritance
return buttons.ToArray();
}
- public int PreviousGameLocations { get; private set; }
- public int PreviousLocationObjects { get; private set; }
- public Dictionary<Item, int> PreviousItems { get; private set; }
-
- public int PreviousCombatLevel { get; private set; }
- public int PreviousFarmingLevel { get; private set; }
- public int PreviousFishingLevel { get; private set; }
- public int PreviousForagingLevel { get; private set; }
- public int PreviousMiningLevel { get; private set; }
- public int PreviousLuckLevel { get; private set; }
-
- public GameLocation PreviousGameLocation { get; private set; }
- public IClickableMenu PreviousActiveMenu { get; private set; }
-
- public int PreviousMineLevel { get; private set; }
-
- public Int32 PreviousTimeOfDay { get; private set; }
- public Int32 PreviousDayOfMonth { get; private set; }
- public String PreviousSeasonOfYear { get; private set; }
- public Int32 PreviousYearOfGame { get; private set; }
-
- public Farmer PreviousFarmer { get; private set; }
-
- public Int32 CurrentUpdateTick { get; private set; }
- public bool FirstUpdate { get; private set; }
-
- public RenderTarget2D Screen
- {
- get { return typeof (Game1).GetBaseFieldValue<RenderTarget2D>(Program.gamePtr, "screen"); }
- set { typeof (Game1).SetBaseFieldValue<RenderTarget2D>(this, "screen", value); }
- }
-
- private static SGame instance;
- public static SGame Instance => instance;
-
- public static float FramesPerSecond { get; private set; }
- public static bool Debug { get; private set; }
-
- public Farmer CurrentFarmer => player;
-
- public SGame()
- {
- instance = this;
- FirstUpdate = true;
- }
-
+ /// <summary>
+ /// XNA Init Method
+ /// </summary>
protected override void Initialize()
{
- Log.Verbose("XNA Initialize");
- ModItems = new Dictionary<Int32, SObject>();
+ Log.AsyncY("XNA Initialize");
+ //ModItems = new Dictionary<int, SObject>();
PreviouslyPressedButtons = new Buttons[4][];
- for (int i = 0; i < 4; ++i) PreviouslyPressedButtons[i] = new Buttons[0];
+ for (var i = 0; i < 4; ++i) PreviouslyPressedButtons[i] = new Buttons[0];
base.Initialize();
GameEvents.InvokeInitialize();
}
+ /// <summary>
+ /// XNA LC Method
+ /// </summary>
protected override void LoadContent()
{
- Log.Verbose("XNA LoadContent");
+ Log.AsyncY("XNA LoadContent");
base.LoadContent();
GameEvents.InvokeLoadContent();
}
+ /// <summary>
+ /// XNA Update Method
+ /// </summary>
+ /// <param name="gameTime"></param>
protected override void Update(GameTime gameTime)
{
UpdateEventCalls();
@@ -221,7 +399,7 @@ namespace StardewModdingAPI.Inheritance
}
catch (Exception ex)
{
- Log.Error("An error occured in the base update loop: " + ex);
+ Log.AsyncR("An error occured in the base update loop: " + ex);
Console.ReadKey();
}
@@ -257,15 +435,19 @@ namespace StardewModdingAPI.Inheritance
if (KStatePrior != KStateNow)
KStatePrior = KStateNow;
- for (PlayerIndex i = PlayerIndex.One; i <= PlayerIndex.Four; i++)
+ for (var i = PlayerIndex.One; i <= PlayerIndex.Four; i++)
{
- PreviouslyPressedButtons[(int)i] = GetButtonsDown(i);
+ PreviouslyPressedButtons[(int) i] = GetButtonsDown(i);
}
}
+ /// <summary>
+ /// XNA Draw Method
+ /// </summary>
+ /// <param name="gameTime"></param>
protected override void Draw(GameTime gameTime)
{
- FramesPerSecond = 1 / (float)gameTime.ElapsedGameTime.TotalSeconds;
+ FramesPerSecond = 1 / (float) gameTime.ElapsedGameTime.TotalSeconds;
try
{
@@ -273,7 +455,7 @@ namespace StardewModdingAPI.Inheritance
}
catch (Exception ex)
{
- Log.Error("An error occured in the base draw loop: " + ex);
+ Log.AsyncR("An error occured in the base draw loop: " + ex);
Console.ReadKey();
}
@@ -299,6 +481,12 @@ namespace StardewModdingAPI.Inheritance
//spriteBatch.End();
+ //Re-draw the HUD
+ spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp, null, null);
+ if ((displayHUD || eventUp) && currentBillboard == 0 && gameMode == 3 && !freezeControls && !panMode)
+ typeof (Game1).GetMethod("drawHUD", BindingFlags.NonPublic | BindingFlags.Instance)?.Invoke(Program.gamePtr, null);
+ spriteBatch.End();
+
if (!options.zoomLevel.Equals(1.0f))
{
GraphicsDevice.SetRenderTarget(null);
@@ -306,11 +494,6 @@ namespace StardewModdingAPI.Inheritance
spriteBatch.Draw(Screen, Vector2.Zero, Screen.Bounds, Color.White, 0.0f, Vector2.Zero, options.zoomLevel, SpriteEffects.None, 1f);
spriteBatch.End();
}
-
- //Re-draw the mouse
- spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp, null, null);
- spriteBatch.Draw(mouseCursors, new Vector2(getMouseX(), getMouseY()), getSourceRectForStandardTileSheet(mouseCursors, mouseCursor, 16, 16), Color.White * mouseCursorTransparency, 0.0f, Vector2.Zero, pixelZoom + dialogueButtonScale / 150f, SpriteEffects.None, 1f);
- spriteBatch.End();
}
if (Debug)
@@ -321,14 +504,15 @@ namespace StardewModdingAPI.Inheritance
}
}
- public static Int32 RegisterModItem(SObject modItem)
+ [Obsolete("Do not use at this time.")]
+ private static int RegisterModItem(SObject modItem)
{
if (modItem.HasBeenRegistered)
{
- Log.Error("The item {0} has already been registered with ID {1}", modItem.Name, modItem.RegisteredId);
+ Log.AsyncR($"The item {modItem.Name} has already been registered with ID {modItem.RegisteredId}");
return modItem.RegisteredId;
}
- Int32 newId = LowestModItemID;
+ var newId = LowestModItemID;
if (ModItems.Count > 0)
newId = Math.Max(LowestModItemID, ModItems.OrderBy(x => x.Key).First().Key + 1);
ModItems.Add(newId, modItem);
@@ -337,7 +521,8 @@ namespace StardewModdingAPI.Inheritance
return newId;
}
- public static SObject PullModItemFromDict(Int32 id, bool isIndex)
+ [Obsolete("Do not use at this time.")]
+ private static SObject PullModItemFromDict(int id, bool isIndex)
{
if (isIndex)
{
@@ -345,35 +530,35 @@ namespace StardewModdingAPI.Inheritance
{
return ModItems.ElementAt(id).Value.Clone();
}
- Log.Error("ModItem Dictionary does not contain index: " + id);
+ Log.AsyncR("ModItem Dictionary does not contain index: " + id);
return null;
}
if (ModItems.ContainsKey(id))
{
return ModItems[id].Clone();
}
- Log.Error("ModItem Dictionary does not contain ID: " + id);
+ Log.AsyncR("ModItem Dictionary does not contain ID: " + id);
return null;
}
-
- public void UpdateEventCalls()
+
+ private void UpdateEventCalls()
{
KStateNow = Keyboard.GetState();
MStateNow = Mouse.GetState();
- foreach (Keys k in FramePressedKeys)
+ foreach (var k in FramePressedKeys)
ControlEvents.InvokeKeyPressed(k);
- foreach (Keys k in FrameReleasedKeys)
+ foreach (var k in FrameReleasedKeys)
ControlEvents.InvokeKeyReleased(k);
- for (PlayerIndex i = PlayerIndex.One; i <= PlayerIndex.Four; i++)
+ for (var i = PlayerIndex.One; i <= PlayerIndex.Four; i++)
{
- Buttons[] buttons = GetFramePressedButtons(i);
- foreach (Buttons b in buttons)
+ var buttons = GetFramePressedButtons(i);
+ foreach (var b in buttons)
{
- if(b == Buttons.LeftTrigger || b == Buttons.RightTrigger)
+ if (b == Buttons.LeftTrigger || b == Buttons.RightTrigger)
{
ControlEvents.InvokeTriggerPressed(i, b, b == Buttons.LeftTrigger ? GamePad.GetState(i).Triggers.Left : GamePad.GetState(i).Triggers.Right);
}
@@ -384,9 +569,9 @@ namespace StardewModdingAPI.Inheritance
}
}
- for (PlayerIndex i = PlayerIndex.One; i <= PlayerIndex.Four; i++)
+ for (var i = PlayerIndex.One; i <= PlayerIndex.Four; i++)
{
- foreach (Buttons b in GetFrameReleasedButtons(i))
+ foreach (var b in GetFrameReleasedButtons(i))
{
if (b == Buttons.LeftTrigger || b == Buttons.RightTrigger)
{
@@ -471,7 +656,7 @@ namespace StardewModdingAPI.Inheritance
PreviousLuckLevel = player.luckLevel;
}
- List<ItemStackChange> changedItems;
+ List<ItemStackChange> changedItems;
if (player != null && HasInventoryChanged(player.items, out changedItems))
{
PlayerEvents.InvokeInventoryChanged(player.items, changedItems);
@@ -479,7 +664,7 @@ namespace StardewModdingAPI.Inheritance
}
var objectHash = currentLocation?.objects?.GetHash();
- if(objectHash != null && PreviousLocationObjects != objectHash)
+ if (objectHash != null && PreviousLocationObjects != objectHash)
{
LocationEvents.InvokeOnNewLocationObject(currentLocation.objects);
PreviousLocationObjects = objectHash ?? -1;
@@ -537,24 +722,24 @@ namespace StardewModdingAPI.Inheritance
{
if (PreviousItems != null && PreviousItems.ContainsKey(item))
{
- if(PreviousItems[item] != item.Stack)
+ if (PreviousItems[item] != item.Stack)
{
- changedItems.Add(new ItemStackChange { Item = item, StackChange = item.Stack - PreviousItems[item], ChangeType = ChangeType.StackChange });
+ changedItems.Add(new ItemStackChange {Item = item, StackChange = item.Stack - PreviousItems[item], ChangeType = ChangeType.StackChange});
}
}
else
{
- changedItems.Add(new ItemStackChange { Item = item, StackChange = item.Stack, ChangeType = ChangeType.Added });
+ changedItems.Add(new ItemStackChange {Item = item, StackChange = item.Stack, ChangeType = ChangeType.Added});
}
}
if (PreviousItems != null)
{
changedItems.AddRange(PreviousItems.Where(n => actualItems.All(i => i != n.Key)).Select(n =>
- new ItemStackChange { Item = n.Key, StackChange = -n.Key.Stack, ChangeType = ChangeType.Removed }));
+ new ItemStackChange {Item = n.Key, StackChange = -n.Key.Stack, ChangeType = ChangeType.Removed}));
}
- return (changedItems.Any());
+ return changedItems.Any();
}
}
} \ No newline at end of file
diff --git a/StardewModdingAPI/Inheritance/SObject.cs b/StardewModdingAPI/Inheritance/SObject.cs
index ea32d2fc..9ffe2a85 100644
--- a/StardewModdingAPI/Inheritance/SObject.cs
+++ b/StardewModdingAPI/Inheritance/SObject.cs
@@ -1,271 +1,275 @@
-using System;
-using System.Xml.Serialization;
-using Microsoft.Xna.Framework;
-using Microsoft.Xna.Framework.Graphics;
-using StardewValley;
-using Object = StardewValley.Object;
-
-namespace StardewModdingAPI.Inheritance
-{
- public class SObject : Object
- {
- public override String Name {
- get { return name; }
- set { name = value; }
- }
- public String Description { get; set; }
- public Texture2D Texture { get; set; }
- public String CategoryName { get; set; }
- public Color CategoryColour { get; set; }
- public Boolean IsPassable { get; set; }
- public Boolean IsPlaceable { get; set; }
- public Boolean HasBeenRegistered { get; set; }
- public Int32 RegisteredId { get; set; }
-
- public Int32 MaxStackSize { get; set; }
-
- public Boolean WallMounted { get; set; }
- public Vector2 DrawPosition { get; set; }
-
- public Boolean FlaggedForPickup { get; set; }
-
- [XmlIgnore]
- public Vector2 CurrentMouse { get; protected set; }
- [XmlIgnore]
- public Vector2 PlacedAt { get; protected set; }
-
- public override int Stack
- {
- get { return stack; }
- set { stack = value; }
- }
-
- public SObject()
- {
- name = "Modded Item Name";
- Description = "Modded Item Description";
- CategoryName = "Modded Item Category";
- Category = 4163;
- CategoryColour = Color.White;
- IsPassable = false;
- IsPlaceable = false;
- boundingBox = new Rectangle(0, 0, 64, 64);
- MaxStackSize = 999;
-
- type = "interactive";
- }
-
- public override string getDescription()
- {
- return Description;
- }
-
- public override void draw(SpriteBatch spriteBatch, int x, int y, float alpha = 1)
+using System;
+using System.Xml.Serialization;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using StardewValley;
+using Object = StardewValley.Object;
+
+#pragma warning disable 1591
+
+namespace StardewModdingAPI.Inheritance
+{
+ [Obsolete("Do not use at this time.")]
+ public class SObject : Object
+ {
+ public SObject()
+ {
+ name = "Modded Item Name";
+ Description = "Modded Item Description";
+ CategoryName = "Modded Item Category";
+ Category = 4163;
+ CategoryColour = Color.White;
+ IsPassable = false;
+ IsPlaceable = false;
+ boundingBox = new Rectangle(0, 0, 64, 64);
+ MaxStackSize = 999;
+
+ type = "interactive";
+ }
+
+ public override string Name
+ {
+ get { return name; }
+ set { name = value; }
+ }
+
+ public string Description { get; set; }
+ public Texture2D Texture { get; set; }
+ public string CategoryName { get; set; }
+ public Color CategoryColour { get; set; }
+ public bool IsPassable { get; set; }
+ public bool IsPlaceable { get; set; }
+ public bool HasBeenRegistered { get; set; }
+ public int RegisteredId { get; set; }
+
+ public int MaxStackSize { get; set; }
+
+ public bool WallMounted { get; set; }
+ public Vector2 DrawPosition { get; set; }
+
+ public bool FlaggedForPickup { get; set; }
+
+ [XmlIgnore]
+ public Vector2 CurrentMouse { get; protected set; }
+
+ [XmlIgnore]
+ public Vector2 PlacedAt { get; protected set; }
+
+ public override int Stack
+ {
+ get { return stack; }
+ set { stack = value; }
+ }
+
+ public override string getDescription()
+ {
+ return Description;
+ }
+
+ public override void draw(SpriteBatch spriteBatch, int x, int y, float alpha = 1)
+ {
+ if (Texture != null)
+ {
+ spriteBatch.Draw(Texture, Game1.GlobalToLocal(Game1.viewport, new Vector2(x * Game1.tileSize + Game1.tileSize / 2 + (shakeTimer > 0 ? Game1.random.Next(-1, 2) : 0), y * Game1.tileSize + Game1.tileSize / 2 + (shakeTimer > 0 ? Game1.random.Next(-1, 2) : 0))), Game1.currentLocation.getSourceRectForObject(ParentSheetIndex), Color.White * alpha, 0f, new Vector2(8f, 8f), scale.Y > 1f ? getScale().Y : Game1.pixelZoom, flipped ? SpriteEffects.FlipHorizontally : SpriteEffects.None, (isPassable() ? getBoundingBox(new Vector2(x, y)).Top : getBoundingBox(new Vector2(x, y)).Bottom) / 10000f);
+ }
+ }
+
+ public new void drawAsProp(SpriteBatch b)
+ {
+ }
+
+ public override void draw(SpriteBatch spriteBatch, int xNonTile, int yNonTile, float layerDepth, float alpha = 1)
+ {
+ Log.Debug("THIS DRAW FUNCTION IS NOT IMPLEMENTED I WANT TO KNOW WHERE IT IS CALLED");
+ //try
+ //{
+ // if (Texture != null)
+ // {
+ // int targSize = Game1.tileSize;
+ // int midX = (xNonTile) + 32;
+ // int midY = (yNonTile) + 32;
+
+ // int targX = midX - targSize / 2;
+ // int targY = midY - targSize / 2;
+
+ // Rectangle targ = new Rectangle(targX, targY, targSize, targSize);
+ // spriteBatch.Draw(Texture, targ, null, new Color(255, 255, 255, 255f * alpha), 0, Vector2.Zero, SpriteEffects.None, layerDepth);
+ // //spriteBatch.Draw(Program.DebugPixel, targ, null, Color.Red, 0, Vector2.Zero, SpriteEffects.None, layerDepth);
+ // /*
+ // spriteBatch.DrawString(Game1.dialogueFont, "TARG: " + targ, new Vector2(128, 0), Color.Red);
+ // spriteBatch.DrawString(Game1.dialogueFont, ".", new Vector2(targX * 0.5f, targY), Color.Orange);
+ // spriteBatch.DrawString(Game1.dialogueFont, ".", new Vector2(targX, targY), Color.Red);
+ // spriteBatch.DrawString(Game1.dialogueFont, ".", new Vector2(targX * 1.5f, targY), Color.Yellow);
+ // spriteBatch.DrawString(Game1.dialogueFont, ".", new Vector2(targX * 2f, targY), Color.Green);
+ // */
+ // }
+ //}
+ //catch (Exception ex)
+ //{
+ // Log.AsyncR(ex.ToString());
+ // Console.ReadKey();
+ //}
+ }
+
+ public override void drawInMenu(SpriteBatch spriteBatch, Vector2 location, float scaleSize, float transparency, float layerDepth, bool drawStackNumber)
+ {
+ if (isRecipe)
+ {
+ transparency = 0.5f;
+ scaleSize *= 0.75f;
+ }
+
+ if (Texture != null)
+ {
+ var targSize = (int) (64 * scaleSize * 0.9f);
+ var midX = (int) (location.X + 32);
+ var midY = (int) (location.Y + 32);
+
+ var targX = midX - targSize / 2;
+ var targY = midY - targSize / 2;
+
+ spriteBatch.Draw(Texture, new Rectangle(targX, targY, targSize, targSize), null, new Color(255, 255, 255, transparency), 0, Vector2.Zero, SpriteEffects.None, layerDepth);
+ }
+ if (drawStackNumber)
+ {
+ var _scale = 0.5f + scaleSize;
+ Game1.drawWithBorder(stack.ToString(), Color.Black, Color.White, location + new Vector2(Game1.tileSize - Game1.tinyFont.MeasureString(string.Concat(stack.ToString())).X * _scale, Game1.tileSize - (float) ((double) Game1.tinyFont.MeasureString(string.Concat(stack.ToString())).Y * 3.0f / 4.0f) * _scale), 0.0f, _scale, 1f, true);
+ }
+ }
+
+ public override void drawWhenHeld(SpriteBatch spriteBatch, Vector2 objectPosition, Farmer f)
+ {
+ if (Texture != null)
+ {
+ var targSize = 64;
+ var midX = (int) (objectPosition.X + 32);
+ var midY = (int) (objectPosition.Y + 32);
+
+ var targX = midX - targSize / 2;
+ var targY = midY - targSize / 2;
+
+ spriteBatch.Draw(Texture, new Rectangle(targX, targY, targSize, targSize), null, Color.White, 0, Vector2.Zero, SpriteEffects.None, (f.getStandingY() + 2) / 10000f);
+ }
+ }
+
+ public override Color getCategoryColor()
{
- if (Texture != null)
- {
- spriteBatch.Draw(Texture, Game1.GlobalToLocal(Game1.viewport, new Vector2(((x * Game1.tileSize) + (Game1.tileSize / 2)) + ((shakeTimer > 0) ? Game1.random.Next(-1, 2) : 0), ((y * Game1.tileSize) + (Game1.tileSize / 2)) + ((shakeTimer > 0) ? Game1.random.Next(-1, 2) : 0))), Game1.currentLocation.getSourceRectForObject(ParentSheetIndex), Color.White * alpha, 0f, new Vector2(8f, 8f), (scale.Y > 1f) ? getScale().Y : Game1.pixelZoom, flipped ? SpriteEffects.FlipHorizontally : SpriteEffects.None, (isPassable() ? getBoundingBox(new Vector2(x, y)).Top : getBoundingBox(new Vector2(x, y)).Bottom) / 10000f);
- }
- }
-
- public void drawAsProp(SpriteBatch b)
+ return CategoryColour;
+ }
+
+ public override string getCategoryName()
+ {
+ if (string.IsNullOrEmpty(CategoryName))
+ return "Modded Item";
+ return CategoryName;
+ }
+
+ public override bool isPassable()
+ {
+ return IsPassable;
+ }
+
+ public override bool isPlaceable()
+ {
+ return IsPlaceable;
+ }
+
+ public override int maximumStackSize()
+ {
+ return MaxStackSize;
+ }
+
+ public SObject Clone()
+ {
+ var toRet = new SObject();
+
+ toRet.Name = Name;
+ toRet.CategoryName = CategoryName;
+ toRet.Description = Description;
+ toRet.Texture = Texture;
+ toRet.IsPassable = IsPassable;
+ toRet.IsPlaceable = IsPlaceable;
+ toRet.quality = quality;
+ toRet.scale = scale;
+ toRet.isSpawnedObject = isSpawnedObject;
+ toRet.isRecipe = isRecipe;
+ toRet.questItem = questItem;
+ toRet.stack = 1;
+ toRet.HasBeenRegistered = HasBeenRegistered;
+ toRet.RegisteredId = RegisteredId;
+
+ return toRet;
+ }
+
+ public override Item getOne()
+ {
+ return Clone();
+ }
+
+ public override void actionWhenBeingHeld(Farmer who)
+ {
+ var x = Game1.oldMouseState.X + Game1.viewport.X;
+ var y = Game1.oldMouseState.Y + Game1.viewport.Y;
+
+ x = x / Game1.tileSize;
+ y = y / Game1.tileSize;
+
+ CurrentMouse = new Vector2(x, y);
+ //Program.LogDebug(canBePlacedHere(Game1.currentLocation, CurrentMouse));
+ base.actionWhenBeingHeld(who);
+ }
+
+ public override bool canBePlacedHere(GameLocation l, Vector2 tile)
+ {
+ //Program.LogDebug(CurrentMouse.ToString().Replace("{", "").Replace("}", ""));
+ if (!l.objects.ContainsKey(tile))
+ return true;
+
+ return false;
+ }
+
+ public override bool placementAction(GameLocation location, int x, int y, Farmer who = null)
+ {
+ if (Game1.didPlayerJustRightClick())
+ return false;
+
+ x = x / Game1.tileSize;
+ y = y / Game1.tileSize;
+
+ //Program.LogDebug(x + " - " + y);
+ //Console.ReadKey();
+
+ var key = new Vector2(x, y);
+
+ if (!canBePlacedHere(location, key))
+ return false;
+
+ var s = Clone();
+
+ s.PlacedAt = key;
+ s.boundingBox = new Rectangle(x / Game1.tileSize * Game1.tileSize, y / Game1.tileSize * Game1.tileSize, boundingBox.Width, boundingBox.Height);
+
+ location.objects.Add(key, s);
+ Log.Async($"{GetHashCode()} - {s.GetHashCode()}");
+
+ return true;
+ }
+
+ public override void actionOnPlayerEntry()
+ {
+ //base.actionOnPlayerEntry();
+ }
+
+ public override void drawPlacementBounds(SpriteBatch spriteBatch, GameLocation location)
{
+ if (canBePlacedHere(location, CurrentMouse))
+ {
+ var targSize = Game1.tileSize;
- }
-
- public override void draw(SpriteBatch spriteBatch, int xNonTile, int yNonTile, float layerDepth, float alpha = 1)
- {
- Log.Debug("THIS DRAW FUNCTION IS NOT IMPLEMENTED I WANT TO KNOW WHERE IT IS CALLED");
- return;
- try
- {
- if (Texture != null)
- {
- int targSize = Game1.tileSize;
- int midX = (xNonTile) + 32;
- int midY = (yNonTile) + 32;
-
- int targX = midX - targSize / 2;
- int targY = midY - targSize / 2;
-
- Rectangle targ = new Rectangle(targX, targY, targSize, targSize);
- spriteBatch.Draw(Texture, targ, null, new Color(255, 255, 255, 255f * alpha), 0, Vector2.Zero, SpriteEffects.None, layerDepth);
- //spriteBatch.Draw(Program.DebugPixel, targ, null, Color.Red, 0, Vector2.Zero, SpriteEffects.None, layerDepth);
- /*
- spriteBatch.DrawString(Game1.dialogueFont, "TARG: " + targ, new Vector2(128, 0), Color.Red);
- spriteBatch.DrawString(Game1.dialogueFont, ".", new Vector2(targX * 0.5f, targY), Color.Orange);
- spriteBatch.DrawString(Game1.dialogueFont, ".", new Vector2(targX, targY), Color.Red);
- spriteBatch.DrawString(Game1.dialogueFont, ".", new Vector2(targX * 1.5f, targY), Color.Yellow);
- spriteBatch.DrawString(Game1.dialogueFont, ".", new Vector2(targX * 2f, targY), Color.Green);
- */
- }
- }
- catch (Exception ex)
- {
- Log.Error(ex.ToString());
- Console.ReadKey();
- }
- }
-
- public override void drawInMenu(SpriteBatch spriteBatch, Vector2 location, float scaleSize, float transparency, float layerDepth, bool drawStackNumber)
- {
- if (isRecipe)
- {
- transparency = 0.5f;
- scaleSize *= 0.75f;
- }
-
- if (Texture != null)
- {
- int targSize = (int) (64 * scaleSize * 0.9f);
- int midX = (int) ((location.X) + 32);
- int midY = (int) ((location.Y) + 32);
-
- int targX = midX - targSize / 2;
- int targY = midY - targSize / 2;
-
- spriteBatch.Draw(Texture, new Rectangle(targX, targY, targSize, targSize), null, new Color(255, 255, 255, transparency), 0, Vector2.Zero, SpriteEffects.None, layerDepth);
- }
- if (drawStackNumber)
- {
- float scale = 0.5f + scaleSize;
- Game1.drawWithBorder(string.Concat(stack.ToString()), Color.Black, Color.White, location + new Vector2(Game1.tileSize - Game1.tinyFont.MeasureString(string.Concat(stack.ToString())).X * scale, Game1.tileSize - (float) ((double) Game1.tinyFont.MeasureString(string.Concat(stack.ToString())).Y * 3.0f / 4.0f) * scale), 0.0f, scale, 1f, true);
- }
- }
-
- public override void drawWhenHeld(SpriteBatch spriteBatch, Vector2 objectPosition, Farmer f)
- {
- if (Texture != null)
- {
- int targSize = 64;
- int midX = (int) ((objectPosition.X) + 32);
- int midY = (int) ((objectPosition.Y) + 32);
-
- int targX = midX - targSize / 2;
- int targY = midY - targSize / 2;
-
- spriteBatch.Draw(Texture, new Rectangle(targX, targY, targSize, targSize), null, Color.White, 0, Vector2.Zero, SpriteEffects.None, (f.getStandingY() + 2) / 10000f);
- }
- }
-
- public override Color getCategoryColor()
- {
- return CategoryColour;
- }
-
- public override string getCategoryName()
- {
- if (string.IsNullOrEmpty(CategoryName))
- return "Modded Item";
- return CategoryName;
- }
-
- public override bool isPassable()
- {
- return IsPassable;
- }
-
- public override bool isPlaceable()
- {
- return IsPlaceable;
- }
-
- public override int maximumStackSize()
- {
- return MaxStackSize;
- }
-
- public SObject Clone()
- {
- SObject toRet = new SObject();
-
- toRet.Name = Name;
- toRet.CategoryName = CategoryName;
- toRet.Description = Description;
- toRet.Texture = Texture;
- toRet.IsPassable = IsPassable;
- toRet.IsPlaceable = IsPlaceable;
- toRet.quality = quality;
- toRet.scale = scale;
- toRet.isSpawnedObject = isSpawnedObject;
- toRet.isRecipe = isRecipe;
- toRet.questItem = questItem;
- toRet.stack = 1;
- toRet.HasBeenRegistered = HasBeenRegistered;
- toRet.RegisteredId = RegisteredId;
-
- return toRet;
- }
-
- public override Item getOne()
- {
- return Clone();
- }
-
- public override void actionWhenBeingHeld(Farmer who)
- {
- int x = Game1.oldMouseState.X + Game1.viewport.X;
- int y = Game1.oldMouseState.Y + Game1.viewport.Y;
-
- x = x / Game1.tileSize;
- y = y / Game1.tileSize;
-
- CurrentMouse = new Vector2(x, y);
- //Program.LogDebug(canBePlacedHere(Game1.currentLocation, CurrentMouse));
- base.actionWhenBeingHeld(who);
- }
-
- public override bool canBePlacedHere(GameLocation l, Vector2 tile)
- {
- //Program.LogDebug(CurrentMouse.ToString().Replace("{", "").Replace("}", ""));
- if (!l.objects.ContainsKey(tile))
- return true;
-
- return false;
- }
-
- public override bool placementAction(GameLocation location, int x, int y, Farmer who = null)
- {
- if (Game1.didPlayerJustRightClick())
- return false;
-
- x = (x / Game1.tileSize);
- y = (y / Game1.tileSize);
-
- //Program.LogDebug(x + " - " + y);
- //Console.ReadKey();
-
- Vector2 key = new Vector2(x, y);
-
- if (!canBePlacedHere(location, key))
- return false;
-
- SObject s = Clone();
-
- s.PlacedAt = key;
- s.boundingBox = new Rectangle(x / Game1.tileSize * Game1.tileSize, y / Game1.tileSize * Game1.tileSize, boundingBox.Width, boundingBox.Height);
-
- location.objects.Add(key, s);
- Log.Verbose("{0} - {1}", GetHashCode(), s.GetHashCode());
-
- return true;
- }
-
- public override void actionOnPlayerEntry()
- {
- //base.actionOnPlayerEntry();
- }
-
- public override void drawPlacementBounds(SpriteBatch spriteBatch, GameLocation location)
- {
- if (canBePlacedHere(location, CurrentMouse))
- {
- int targSize = Game1.tileSize;
-
- int x = Game1.oldMouseState.X + Game1.viewport.X;
- int y = Game1.oldMouseState.Y + Game1.viewport.Y;
- spriteBatch.Draw(Game1.mouseCursors, new Vector2(x / Game1.tileSize * Game1.tileSize - Game1.viewport.X, y / Game1.tileSize * Game1.tileSize - Game1.viewport.Y), new Rectangle(Utility.playerCanPlaceItemHere(location, this, x, y, Game1.player) ? 194 : 210, 388, 16, 16), Color.White, 0.0f, Vector2.Zero, Game1.pixelZoom, SpriteEffects.None, 0.01f);
- }
- }
- }
+ var x = Game1.oldMouseState.X + Game1.viewport.X;
+ var y = Game1.oldMouseState.Y + Game1.viewport.Y;
+ spriteBatch.Draw(Game1.mouseCursors, new Vector2(x / Game1.tileSize * Game1.tileSize - Game1.viewport.X, y / Game1.tileSize * Game1.tileSize - Game1.viewport.Y), new Rectangle(Utility.playerCanPlaceItemHere(location, this, x, y, Game1.player) ? 194 : 210, 388, 16, 16), Color.White, 0.0f, Vector2.Zero, Game1.pixelZoom, SpriteEffects.None, 0.01f);
+ }
+ }
+ }
} \ No newline at end of file
diff --git a/StardewModdingAPI/JsonResolver.cs b/StardewModdingAPI/JsonResolver.cs
index bd5831e0..8aac2313 100644
--- a/StardewModdingAPI/JsonResolver.cs
+++ b/StardewModdingAPI/JsonResolver.cs
@@ -1,34 +1,31 @@
using System;
using System.Collections.Generic;
-using System.ComponentModel;
using Microsoft.Xna.Framework;
-using Microsoft.Xna.Framework.Design;
using Newtonsoft.Json;
-using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
using StardewModdingAPI.Inheritance;
+using Object = StardewValley.Object;
namespace StardewModdingAPI
{
- class JsonResolver : DefaultContractResolver
+ internal class JsonResolver : DefaultContractResolver
{
protected override JsonContract CreateContract(Type objectType)
{
- if (objectType == typeof(Rectangle) || objectType == typeof(Rectangle?))
+ if (objectType == typeof (Rectangle) || objectType == typeof (Rectangle?))
{
Console.WriteLine("FOUND A RECT");
- JsonContract contract = base.CreateObjectContract(objectType);
+ JsonContract contract = CreateObjectContract(objectType);
contract.Converter = new RectangleConverter();
return contract;
}
- if (objectType == typeof(StardewValley.Object))
+ if (objectType == typeof (Object))
{
- Log.Verbose("FOUND AN OBJECT");
- JsonContract contract = base.CreateObjectContract(objectType);
+ Log.AsyncY("FOUND AN OBJECT");
+ JsonContract contract = CreateObjectContract(objectType);
contract.Converter = new ObjectConverter();
return contract;
-
}
return base.CreateContract(objectType);
}
@@ -38,20 +35,20 @@ namespace StardewModdingAPI
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
- Log.Verbose("TRYING TO WRITE");
- var obj = (StardewValley.Object)value;
- Log.Verbose("TRYING TO WRITE");
+ Log.AsyncY("TRYING TO WRITE");
+ var obj = (Object) value;
+ Log.AsyncY("TRYING TO WRITE");
var jObject = GetObject(obj);
- Log.Verbose("TRYING TO WRITE");
+ Log.AsyncY("TRYING TO WRITE");
try
{
- Log.Verbose(jObject.ToString());
+ Log.AsyncY(jObject.ToString());
}
catch (Exception ex)
{
- Log.Error(ex);
+ Log.AsyncR(ex);
}
Console.ReadKey();
@@ -71,7 +68,7 @@ namespace StardewModdingAPI
throw new NotImplementedException();
}
- protected static JObject GetObject(StardewValley.Object o)
+ protected static JObject GetObject(Object o)
{
try
{
@@ -82,29 +79,29 @@ namespace StardewModdingAPI
var quality = o.quality;
var oo = new SBareObject(parentSheetIndex, stack, isRecipe, price, quality);
- Log.Success(JsonConvert.SerializeObject(oo));
+ Log.AsyncG(JsonConvert.SerializeObject(oo));
return JObject.FromObject(oo);
}
catch (Exception ex)
{
- Log.Error(ex);
+ Log.AsyncR(ex);
Console.ReadKey();
}
return null;
}
- protected static StardewValley.Object GetObject(JObject jObject)
+ protected static Object GetObject(JObject jObject)
{
- int? parentSheetIndex = GetTokenValue<object>(jObject, "parentSheetIndex") as int?;
- int? stack = GetTokenValue<object>(jObject, "parentSheetIndex") as int?;
- bool? isRecipe = GetTokenValue<object>(jObject, "parentSheetIndex") as bool?;
- int? price = GetTokenValue<object>(jObject, "parentSheetIndex") as int?;
- int? quality = GetTokenValue<object>(jObject, "parentSheetIndex") as int?;
+ var parentSheetIndex = GetTokenValue<object>(jObject, "parentSheetIndex") as int?;
+ var stack = GetTokenValue<object>(jObject, "parentSheetIndex") as int?;
+ var isRecipe = GetTokenValue<object>(jObject, "parentSheetIndex") as bool?;
+ var price = GetTokenValue<object>(jObject, "parentSheetIndex") as int?;
+ var quality = GetTokenValue<object>(jObject, "parentSheetIndex") as int?;
- return new StardewValley.Object(parentSheetIndex ?? 0, stack ?? 0, isRecipe ?? false, price ?? -1, quality ?? 0);
+ return new Object(parentSheetIndex ?? 0, stack ?? 0, isRecipe ?? false, price ?? -1, quality ?? 0);
}
- protected static StardewValley.Object GetObject(JToken jToken)
+ protected static Object GetObject(JToken jToken)
{
var jObject = JObject.FromObject(jToken);
@@ -123,7 +120,7 @@ namespace StardewModdingAPI
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
- var rectangle = (Rectangle)value;
+ var rectangle = (Rectangle) value;
var jObject = GetObject(rectangle);
@@ -150,7 +147,7 @@ namespace StardewModdingAPI
var width = rectangle.Width;
var height = rectangle.Height;
- return JObject.FromObject(new { x, y, width, height });
+ return JObject.FromObject(new {x, y, width, height});
}
protected static Rectangle GetRectangle(JObject jObject)
@@ -173,7 +170,7 @@ namespace StardewModdingAPI
protected static int? GetTokenValue(JObject jObject, string tokenName)
{
JToken jToken;
- return jObject.TryGetValue(tokenName, StringComparison.InvariantCultureIgnoreCase, out jToken) ? (int)jToken : (int?)null;
+ return jObject.TryGetValue(tokenName, StringComparison.InvariantCultureIgnoreCase, out jToken) ? (int) jToken : (int?) null;
}
}
@@ -181,7 +178,7 @@ namespace StardewModdingAPI
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
- var rectangleList = (IList<Rectangle>)value;
+ var rectangleList = (IList<Rectangle>) value;
var jArray = new JArray();
@@ -212,4 +209,4 @@ namespace StardewModdingAPI
throw new NotImplementedException();
}
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Logger.cs b/StardewModdingAPI/Logger.cs
index 5f758994..35903513 100644
--- a/StardewModdingAPI/Logger.cs
+++ b/StardewModdingAPI/Logger.cs
@@ -1,13 +1,9 @@
using System;
-using System.Collections;
using System.Collections.Concurrent;
-using System.Collections.Generic;
-using System.Configuration;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using StardewModdingAPI;
namespace StardewModdingAPI
{
@@ -28,7 +24,7 @@ namespace StardewModdingAPI
#region Sync Logging
/// <summary>
- /// NOTICE: Sync logging is discouraged. Please use Async instead.
+ /// NOTICE: Sync logging is discouraged. Please use Async instead.
/// </summary>
/// <param name="message">Message to log</param>
/// <param name="colour">Colour of message</param>
@@ -39,13 +35,31 @@ namespace StardewModdingAPI
#endregion
+ /// <summary>
+ /// Catch unhandled exception from the application
+ /// </summary>
+ /// <remarks>Should be moved out of here if we do more than just log the exception.</remarks>
+ public static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
+ {
+ Console.WriteLine("An exception has been caught");
+ File.WriteAllText(Constants.LogDir + "\\MODDED_ErrorLog.Log_" + DateTime.UtcNow.Ticks + ".txt", e.ExceptionObject.ToString());
+ }
+
+ /// <summary>
+ /// Catch thread exception from the application
+ /// </summary>
+ /// <remarks>Should be moved out of here if we do more than just log the exception.</remarks>
+ public static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
+ {
+ Console.WriteLine("A thread exception has been caught");
+ File.WriteAllText(Constants.LogDir + "\\MODDED_ErrorLog.Log_" + Extensions.Random.Next(100000000, 999999999) + ".txt", e.Exception.ToString());
+ }
+
#region Async Logging
public static void AsyncColour(object message, ConsoleColor colour)
{
- Task.Run(() => {
- PrintLog(new LogInfo(message?.ToString(), colour));
- });
+ Task.Run(() => { PrintLog(new LogInfo(message?.ToString(), colour)); });
}
public static void Async(object message)
@@ -85,55 +99,31 @@ namespace StardewModdingAPI
#endregion
-
-
-
-
- /// <summary>
- /// Catch unhandled exception from the application
- /// </summary>
- /// <remarks>Should be moved out of here if we do more than just log the exception.</remarks>
- public static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
- {
- Console.WriteLine("An exception has been caught");
- File.WriteAllText(Constants.LogDir + "\\MODDED_ErrorLog.Log_" + DateTime.UtcNow.Ticks + ".txt", e.ExceptionObject.ToString());
- }
-
- /// <summary>
- /// Catch thread exception from the application
- /// </summary>
- /// <remarks>Should be moved out of here if we do more than just log the exception.</remarks>
- public static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
- {
- Console.WriteLine("A thread exception has been caught");
- File.WriteAllText(Constants.LogDir + "\\MODDED_ErrorLog.Log_" + Extensions.Random.Next(100000000, 999999999) + ".txt", e.Exception.ToString());
- }
-
#region ToRemove
public static void LogValueNotSpecified()
{
- Error("<value> must be specified");
+ AsyncR("<value> must be specified");
}
public static void LogObjectValueNotSpecified()
{
- Error("<object> and <value> must be specified");
+ AsyncR("<object> and <value> must be specified");
}
public static void LogValueInvalid()
{
- Error("<value> is invalid");
+ AsyncR("<value> is invalid");
}
public static void LogObjectInvalid()
{
- Error("<object> is invalid");
+ AsyncR("<object> is invalid");
}
public static void LogValueNotInt32()
{
- Error("<value> must be a whole number (Int32)");
+ AsyncR("<value> must be a whole number (Int32)");
}
[Obsolete("Parameter 'values' is no longer supported. Format before logging.")]
@@ -167,7 +157,7 @@ namespace StardewModdingAPI
}
[Obsolete("Parameter 'values' is no longer supported. Format before logging.")]
- public static void Error(object message, params object[] values)
+ public static void AsyncR(object message, params object[] values)
{
AsyncR(message);
}
@@ -182,7 +172,7 @@ namespace StardewModdingAPI
}
/// <summary>
- /// A Logging class implementing the Singleton pattern and an internal Queue to be flushed perdiodically
+ /// A Logging class implementing the Singleton pattern and an internal Queue to be flushed perdiodically
/// </summary>
public class LogWriter
{
@@ -192,12 +182,14 @@ namespace StardewModdingAPI
private static StreamWriter _stream;
/// <summary>
- /// Private to prevent creation of other instances
+ /// Private to prevent creation of other instances
/// </summary>
- private LogWriter() { }
+ private LogWriter()
+ {
+ }
/// <summary>
- /// Exposes _instace and creates a new one if it is null
+ /// Exposes _instace and creates a new one if it is null
/// </summary>
internal static LogWriter Instance
{
@@ -218,14 +210,14 @@ namespace StardewModdingAPI
}
/// <summary>
- /// Writes into the ConcurrentQueue the Message specified
+ /// Writes into the ConcurrentQueue the Message specified
/// </summary>
/// <param name="message">The message to write to the log</param>
public void WriteToLog(string message)
{
lock (_logQueue)
{
- LogInfo logEntry = new LogInfo(message);
+ var logEntry = new LogInfo(message);
_logQueue.Enqueue(logEntry);
if (_logQueue.Any())
@@ -236,7 +228,7 @@ namespace StardewModdingAPI
}
/// <summary>
- /// Writes into the ConcurrentQueue the Entry specified
+ /// Writes into the ConcurrentQueue the Entry specified
/// </summary>
/// <param name="logEntry">The logEntry to write to the log</param>
public void WriteToLog(LogInfo logEntry)
@@ -253,7 +245,7 @@ namespace StardewModdingAPI
}
/// <summary>
- /// Flushes the ConcurrentQueue to the log file specified in Constants
+ /// Flushes the ConcurrentQueue to the log file specified in Constants
/// </summary>
private void FlushLog()
{
@@ -276,7 +268,7 @@ namespace StardewModdingAPI
}
/// <summary>
- /// A struct to store the message and the Date and Time the log entry was created
+ /// A struct to store the message and the Date and Time the log entry was created
/// </summary>
public struct LogInfo
{
diff --git a/StardewModdingAPI/Manifest.cs b/StardewModdingAPI/Manifest.cs
index a1a9b6fb..162ab399 100644
--- a/StardewModdingAPI/Manifest.cs
+++ b/StardewModdingAPI/Manifest.cs
@@ -5,37 +5,37 @@ namespace StardewModdingAPI
public class Manifest : Config
{
/// <summary>
- /// The name of your mod.
+ /// The name of your mod.
/// </summary>
public virtual string Name { get; set; }
/// <summary>
- /// The name of the mod's authour.
+ /// The name of the mod's authour.
/// </summary>
public virtual string Authour { get; set; }
/// <summary>
- /// The version of the mod.
+ /// The version of the mod.
/// </summary>
public virtual Version Version { get; set; }
/// <summary>
- /// A description of the mod.
+ /// A description of the mod.
/// </summary>
public virtual string Description { get; set; }
/// <summary>
- /// The unique ID of the mod. It doesn't *need* to be anything.
+ /// The unique ID of the mod. It doesn't *need* to be anything.
/// </summary>
public virtual string UniqueID { get; set; }
/// <summary>
- /// Whether or not the mod uses per-save-config files.
+ /// Whether or not the mod uses per-save-config files.
/// </summary>
public virtual bool PerSaveConfigs { get; set; }
/// <summary>
- /// The name of the DLL in the directory that has the Entry() method.
+ /// The name of the DLL in the directory that has the Entry() method.
/// </summary>
public virtual string EntryDll { get; set; }
@@ -51,4 +51,4 @@ namespace StardewModdingAPI
return this as T;
}
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Mod.cs b/StardewModdingAPI/Mod.cs
index 8d08f8de..8edfcf7e 100644
--- a/StardewModdingAPI/Mod.cs
+++ b/StardewModdingAPI/Mod.cs
@@ -1,43 +1,41 @@
-using System;
-using System.IO;
+using System.IO;
namespace StardewModdingAPI
{
public class Mod
{
/// <summary>
- /// The mod's manifest
+ /// The mod's manifest
/// </summary>
public Manifest Manifest { get; internal set; }
/// <summary>
- /// Where the mod is located on the disk.
+ /// Where the mod is located on the disk.
/// </summary>
public string PathOnDisk { get; internal set; }
/// <summary>
- /// A basic path to store your mod's config at.
+ /// A basic path to store your mod's config at.
/// </summary>
public string BaseConfigPath => PathOnDisk + "\\config.json";
/// <summary>
- /// A basic path to where per-save configs are stored
+ /// A basic path to where per-save configs are stored
/// </summary>
public string PerSaveConfigFolder => GetPerSaveConfigFolder();
/// <summary>
- /// A basic path to store your mod's config at, dependent on the current save.
- /// The Manifest must allow for per-save configs. This is to keep from having an
- /// empty directory in every mod folder.
+ /// A basic path to store your mod's config at, dependent on the current save.
+ /// The Manifest must allow for per-save configs. This is to keep from having an
+ /// empty directory in every mod folder.
/// </summary>
public string PerSaveConfigPath => Constants.CurrentSavePathExists ? Path.Combine(PerSaveConfigFolder, Constants.SaveFolderName + ".json") : "";
/// <summary>
- /// A basic method that is the entry-point of your mod. It will always be called once when the mod loads.
+ /// 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)
{
-
}
private string GetPerSaveConfigFolder()
@@ -46,8 +44,8 @@ namespace StardewModdingAPI
{
return Path.Combine(PathOnDisk, "psconfigs");
}
- Log.Error("The mod [{0}] is not configured to use per-save configs.", Manifest.Name);
+ Log.AsyncR($"The mod [{Manifest.Name}] is not configured to use per-save configs.");
return "";
}
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/ModItem.cs b/StardewModdingAPI/ModItem.cs
index aea3a131..10c4fde4 100644
--- a/StardewModdingAPI/ModItem.cs
+++ b/StardewModdingAPI/ModItem.cs
@@ -3,12 +3,16 @@ using StardewValley;
namespace StardewModdingAPI
{
- class ModItem : Object
+ internal class ModItem : Object
{
- public Item AsItem { get { return this; } }
+ public Item AsItem
+ {
+ get { return this; }
+ }
+
public override string Name { get; set; }
public string Description { get; set; }
public int ID { get; set; }
public Texture2D Texture { get; set; }
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/Program.cs b/StardewModdingAPI/Program.cs
index 05da664c..e6ba103b 100644
--- a/StardewModdingAPI/Program.cs
+++ b/StardewModdingAPI/Program.cs
@@ -20,9 +20,6 @@ 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;
@@ -34,6 +31,9 @@ namespace StardewModdingAPI
public static Thread gameThread;
public static Thread consoleInputThread;
+ //private static List<string> _modContentPaths;
+
+ public static Texture2D DebugPixel { get; private set; }
public static bool StardewInjectorLoaded { get; private set; }
public static Mod StardewInjectorMod { get; private set; }
@@ -41,7 +41,7 @@ namespace StardewModdingAPI
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
- /// Main method holding the API execution
+ /// Main method holding the API execution
/// </summary>
/// <param name="args"></param>
private static void Main(string[] args)
@@ -61,15 +61,15 @@ namespace StardewModdingAPI
// Catch and display all exceptions.
Console.WriteLine(e);
Console.ReadKey();
- Log.Error("Critical error: " + e);
+ Log.AsyncR("Critical error: " + e);
}
- Log.Comment("The API will now terminate. Press any key to continue...");
+ Log.AsyncY("The API will now terminate. Press any key to continue...");
Console.ReadKey();
}
/// <summary>
- /// Set up the console properties
+ /// Set up the console properties
/// </summary>
private static void ConfigureUI()
{
@@ -81,11 +81,11 @@ namespace StardewModdingAPI
}
/// <summary>
- /// Setup the required paths and logging
+ /// Setup the required paths and logging
/// </summary>
private static void ConfigurePaths()
{
- Log.Info("Validating api paths...");
+ Log.AsyncY("Validating api paths...");
_modPaths = new List<string>();
//_modContentPaths = new List<string>();
@@ -110,11 +110,11 @@ namespace StardewModdingAPI
}
/// <summary>
- /// Load Stardev Valley and control features
+ /// Load Stardev Valley and control features
/// </summary>
private static void ConfigureSDV()
{
- Log.Info("Initializing SDV Assembly...");
+ Log.AsyncY("Initializing SDV Assembly...");
// Load in the assembly - ignores security
StardewAssembly = Assembly.UnsafeLoadFrom(Constants.ExecutionPath + "\\Stardew Valley.exe");
@@ -122,22 +122,24 @@ namespace StardewModdingAPI
StardewGameInfo = StardewProgramType.GetField("gamePtr");
// Change the game's version
- Log.Verbose("Injecting New SDV Version...");
- Game1.version += string.Format("-Z_MODDED | SMAPI {0}", Constants.Version.VersionString);
+ Log.AsyncY("Injecting New SDV Version...");
+ Game1.version += $"-Z_MODDED | SMAPI {Constants.Version.VersionString}";
// Create the thread for the game to run in.
gameThread = new Thread(RunGame);
- Log.Info("Starting SDV...");
+ Log.AsyncY("Starting SDV...");
gameThread.Start();
// Wait for the game to load up
- while (!ready) ;
+ while (!ready)
+ {
+ }
//SDV is running
- Log.Comment("SDV Loaded Into Memory");
+ Log.AsyncY("SDV Loaded Into Memory");
//Create definition to listen for input
- Log.Verbose("Initializing Console Input Thread...");
+ Log.AsyncY("Initializing Console Input Thread...");
consoleInputThread = new Thread(ConsoleInputThread);
// The only command in the API (at least it should be, for now)
@@ -149,7 +151,7 @@ namespace StardewModdingAPI
GameEvents.LoadContent += Events_LoadContent;
//Events.MenuChanged += Events_MenuChanged; //Idk right now
- Log.Verbose("Applying Final SDV Tweaks...");
+ Log.AsyncY("Applying Final SDV Tweaks...");
StardewInvoke(() =>
{
gamePtr.IsMouseVisible = false;
@@ -159,15 +161,15 @@ namespace StardewModdingAPI
}
/// <summary>
- /// Wrap the 'RunGame' method for console output
+ /// Wrap the 'RunGame' method for console output
/// </summary>
private static void GameRunInvoker()
{
//Game's in memory now, send the event
- Log.Verbose("Game Loaded");
+ Log.AsyncY("Game Loaded");
GameEvents.InvokeGameLoaded();
- Log.Comment("Type 'help' for help, or 'help <cmd>' for a command's usage");
+ Log.AsyncY("Type 'help' for help, or 'help <cmd>' for a command's usage");
//Begin listening to input
consoleInputThread.Start();
@@ -182,14 +184,14 @@ namespace StardewModdingAPI
if (consoleInputThread != null && consoleInputThread.ThreadState == ThreadState.Running)
consoleInputThread.Abort();
- Log.Verbose("Game Execution Finished");
- Log.Verbose("Shutting Down...");
+ Log.AsyncY("Game Execution Finished");
+ Log.AsyncY("Shutting Down...");
Thread.Sleep(100);
Environment.Exit(0);
}
/// <summary>
- /// Create the given directory path if it does not exist
+ /// Create the given directory path if it does not exist
/// </summary>
/// <param name="path">Desired directory path</param>
private static void VerifyPath(string path)
@@ -203,7 +205,7 @@ namespace StardewModdingAPI
}
catch (Exception ex)
{
- Log.Error("Could not create a path: " + path + "\n\n" + ex);
+ Log.AsyncR("Could not create a path: " + path + "\n\n" + ex);
}
}
@@ -218,7 +220,7 @@ namespace StardewModdingAPI
try
{
gamePtr = new SGame();
- Log.Verbose("Patching SDV Graphics Profile...");
+ Log.AsyncY("Patching SDV Graphics Profile...");
Game1.graphics.GraphicsProfile = GraphicsProfile.HiDef;
LoadMods();
@@ -232,11 +234,11 @@ namespace StardewModdingAPI
}
catch (Exception ex)
{
- Log.Error("Game failed to start: " + ex);
+ Log.AsyncR("Game failed to start: " + ex);
}
}
- static void StardewForm_Closing(object sender, CancelEventArgs e)
+ private static void StardewForm_Closing(object sender, CancelEventArgs e)
{
e.Cancel = true;
@@ -251,23 +253,23 @@ namespace StardewModdingAPI
public static void LoadMods()
{
- Log.Verbose("LOADING MODS");
- foreach (string ModPath in _modPaths)
+ Log.AsyncY("LOADING MODS");
+ foreach (var ModPath in _modPaths)
{
- foreach (string d in Directory.GetDirectories(ModPath))
+ foreach (var d in Directory.GetDirectories(ModPath))
{
- foreach (string s in Directory.GetFiles(d, "manifest.json"))
+ foreach (var s in Directory.GetFiles(d, "manifest.json"))
{
if (s.Contains("StardewInjector"))
continue;
- Log.Success("Found Manifest: " + s);
- Manifest manifest = new Manifest();
+ Log.AsyncG("Found Manifest: " + s);
+ var manifest = new Manifest();
try
{
- string t = File.ReadAllText(s);
+ var t = File.ReadAllText(s);
if (string.IsNullOrEmpty(t))
{
- Log.Error($"Failed to read mod manifest '{s}'. Manifest is empty!");
+ Log.AsyncR($"Failed to read mod manifest '{s}'. Manifest is empty!");
continue;
}
@@ -275,18 +277,18 @@ namespace StardewModdingAPI
if (string.IsNullOrEmpty(manifest.EntryDll))
{
- Log.Error($"Failed to read mod manifest '{s}'. EntryDll is empty!");
+ Log.AsyncR($"Failed to read mod manifest '{s}'. EntryDll is empty!");
continue;
}
}
catch (Exception ex)
{
- Log.Error($"Failed to read mod manifest '{s}'. Exception details:\n" + ex);
+ Log.AsyncR($"Failed to read mod manifest '{s}'. Exception details:\n" + ex);
continue;
}
- string targDir = Path.GetDirectoryName(s);
- string psDir = Path.Combine(targDir, "psconfigs");
- Log.Info($"Created psconfigs directory @{psDir}");
+ var targDir = Path.GetDirectoryName(s);
+ var psDir = Path.Combine(targDir, "psconfigs");
+ Log.AsyncY($"Created psconfigs directory @{psDir}");
try
{
if (manifest.PerSaveConfigs)
@@ -294,63 +296,63 @@ namespace StardewModdingAPI
if (!Directory.Exists(psDir))
{
Directory.CreateDirectory(psDir);
- Log.Info($"Created psconfigs directory @{psDir}");
+ Log.AsyncY($"Created psconfigs directory @{psDir}");
}
if (!Directory.Exists(psDir))
{
- Log.Error($"Failed to create psconfigs directory '{psDir}'. No exception occured.");
+ Log.AsyncR($"Failed to create psconfigs directory '{psDir}'. No exception occured.");
continue;
}
}
}
catch (Exception ex)
{
- Log.Error($"Failed to create psconfigs directory '{targDir}'. Exception details:\n" + ex);
+ Log.AsyncR($"Failed to create psconfigs directory '{targDir}'. Exception details:\n" + ex);
continue;
}
- string targDll = string.Empty;
+ var targDll = string.Empty;
try
{
targDll = Path.Combine(targDir, manifest.EntryDll);
if (!File.Exists(targDll))
{
- Log.Error($"Failed to load mod '{manifest.EntryDll}'. File {targDll} does not exist!");
+ Log.AsyncR($"Failed to load mod '{manifest.EntryDll}'. File {targDll} does not exist!");
continue;
}
- Assembly mod = Assembly.UnsafeLoadFrom(targDll);
+ var mod = Assembly.UnsafeLoadFrom(targDll);
if (mod.DefinedTypes.Count(x => x.BaseType == typeof (Mod)) > 0)
{
- Log.Verbose("Loading Mod DLL...");
- TypeInfo tar = mod.DefinedTypes.First(x => x.BaseType == typeof (Mod));
- Mod m = (Mod) mod.CreateInstance(tar.ToString());
+ Log.AsyncY("Loading Mod DLL...");
+ var tar = mod.DefinedTypes.First(x => x.BaseType == typeof (Mod));
+ var m = (Mod) mod.CreateInstance(tar.ToString());
m.PathOnDisk = targDir;
m.Manifest = manifest;
- Log.Success($"LOADED MOD: {m.Manifest.Name} by {m.Manifest.Authour} - Version {m.Manifest.Version} | Description: {m.Manifest.Description} (@ {targDll})");
+ Log.AsyncG($"LOADED MOD: {m.Manifest.Name} by {m.Manifest.Authour} - Version {m.Manifest.Version} | Description: {m.Manifest.Description} (@ {targDll})");
Constants.ModsLoaded += 1;
m.Entry();
}
else
{
- Log.Error("Invalid Mod DLL");
+ Log.AsyncR("Invalid Mod DLL");
}
}
catch (Exception ex)
{
- Log.Error($"Failed to load mod '{targDll}'. Exception details:\n" + ex);
+ Log.AsyncR($"Failed to load mod '{targDll}'. Exception details:\n" + ex);
}
}
}
}
- Log.Success($"LOADED {Constants.ModsLoaded} MODS");
+ Log.AsyncG($"LOADED {Constants.ModsLoaded} MODS");
Console.Title = Constants.ConsoleTitle;
}
public static void ConsoleInputThread()
{
- string input = string.Empty;
+ var input = string.Empty;
while (true)
{
@@ -358,14 +360,14 @@ namespace StardewModdingAPI
}
}
- static void Events_LoadContent(object o, EventArgs e)
+ private static void Events_LoadContent(object o, EventArgs e)
{
- Log.Info("Initializing Debug Assets...");
+ Log.AsyncY("Initializing Debug Assets...");
DebugPixel = new Texture2D(Game1.graphics.GraphicsDevice, 1, 1);
- DebugPixel.SetData(new[] { Color.White });
+ DebugPixel.SetData(new[] {Color.White});
#if DEBUG
- StardewModdingAPI.Log.Verbose("REGISTERING BASE CUSTOM ITEM");
+ StardewModdingAPI.Log.Async("REGISTERING BASE CUSTOM ITEM");
SObject so = new SObject();
so.Name = "Mario Block";
so.CategoryName = "SMAPI Test Mod";
@@ -373,9 +375,9 @@ namespace StardewModdingAPI
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.Async("REGISTERED WITH ID OF: " + SGame.RegisterModItem(so));
- //StardewModdingAPI.Log.Verbose("REGISTERING SECOND CUSTOM ITEM");
+ //StardewModdingAPI.Log.Async("REGISTERING SECOND CUSTOM ITEM");
//SObject so2 = new SObject();
//so2.Name = "Mario Painting";
//so2.CategoryName = "SMAPI Test Mod";
@@ -383,34 +385,33 @@ namespace StardewModdingAPI
//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));
+ //StardewModdingAPI.Log.Async("REGISTERED WITH ID OF: " + SGame.RegisterModItem(so2));
Command.CallCommand("load");
#endif
}
- static void Events_KeyPressed(object o, EventArgsKeyPressed e)
+ private static void Events_KeyPressed(object o, EventArgsKeyPressed e)
{
-
}
- static void Events_MenuChanged(IClickableMenu newMenu)
+ private static void Events_MenuChanged(IClickableMenu newMenu)
{
- Log.Verbose("NEW MENU: " + newMenu.GetType());
+ Log.AsyncY("NEW MENU: " + newMenu.GetType());
if (newMenu is GameMenu)
{
Game1.activeClickableMenu = SGameMenu.ConstructFromBaseClass(Game1.activeClickableMenu as GameMenu);
}
}
- static void Events_LocationsChanged(List<GameLocation> newLocations)
+ private static void Events_LocationsChanged(List<GameLocation> newLocations)
{
#if DEBUG
SGame.ModLocations = SGameLocation.ConstructFromBaseClasses(Game1.locations);
#endif
}
- static void Events_CurrentLocationChanged(GameLocation newLocation)
+ private static void Events_CurrentLocationChanged(GameLocation newLocation)
{
//SGame.CurrentLocation = null;
//System.Threading.Thread.Sleep(10);
@@ -428,23 +429,23 @@ namespace StardewModdingAPI
StardewForm.Invoke(a);
}
- static void help_CommandFired(object o, EventArgsCommand e)
+ private static void help_CommandFired(object o, EventArgsCommand e)
{
if (e.Command.CalledArgs.Length > 0)
{
- Command fnd = Command.FindCommand(e.Command.CalledArgs[0]);
+ var fnd = Command.FindCommand(e.Command.CalledArgs[0]);
if (fnd == null)
- Log.Error("The command specified could not be found");
+ Log.AsyncR("The command specified could not be found");
else
{
if (fnd.CommandArgs.Length > 0)
- Log.Info("{0}: {1} - {2}", fnd.CommandName, fnd.CommandDesc, fnd.CommandArgs.ToSingular());
+ Log.AsyncY($"{fnd.CommandName}: {fnd.CommandDesc} - {fnd.CommandArgs.ToSingular()}");
else
- Log.Info("{0}: {1}", fnd.CommandName, fnd.CommandDesc);
+ Log.AsyncY($"{fnd.CommandName}: {fnd.CommandDesc}");
}
}
else
- Log.Info("Commands: " + Command.RegisteredCommands.Select(x => x.CommandName).ToSingular());
+ Log.AsyncY("Commands: " + Command.RegisteredCommands.Select(x => x.CommandName).ToSingular());
}
}
} \ No newline at end of file
diff --git a/StardewModdingAPI/Properties/AssemblyInfo.cs b/StardewModdingAPI/Properties/AssemblyInfo.cs
index 9dd4272e..4ba998e1 100644
--- a/StardewModdingAPI/Properties/AssemblyInfo.cs
+++ b/StardewModdingAPI/Properties/AssemblyInfo.cs
@@ -4,6 +4,7 @@ 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("StardewModdingAPI")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
@@ -16,9 +17,11 @@ using System.Runtime.InteropServices;
// 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("5c3f7f42-fefd-43db-aaea-92ea3bcad531")]
// Version information for an assembly consists of the following four values:
@@ -31,5 +34,6 @@ using System.Runtime.InteropServices;
// 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")]
+[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file
diff --git a/StardewModdingAPI/Version.cs b/StardewModdingAPI/Version.cs
index 824790d6..5e47a703 100644
--- a/StardewModdingAPI/Version.cs
+++ b/StardewModdingAPI/Version.cs
@@ -1,9 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using Newtonsoft.Json;
+using Newtonsoft.Json;
namespace StardewModdingAPI
{
@@ -25,4 +20,4 @@ namespace StardewModdingAPI
Build = build;
}
}
-}
+} \ No newline at end of file
diff --git a/StardewModdingAPI/packages.config b/StardewModdingAPI/packages.config
index 28d59862..0a24a27d 100644
--- a/StardewModdingAPI/packages.config
+++ b/StardewModdingAPI/packages.config
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
+
<packages>
<package id="Costura.Fody" version="1.3.3.0" targetFramework="net45" developmentDependency="true" />
<package id="Fody" version="1.28.3" targetFramework="net45" developmentDependency="true" />