summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--StardewModdingAPI/Config.cs8
-rw-r--r--StardewModdingAPI/Events/Mine.cs10
-rw-r--r--StardewModdingAPI/Extensions.cs17
-rw-r--r--StardewModdingAPI/Inheritance/SBareObject.cs27
-rw-r--r--StardewModdingAPI/JsonResolver.cs215
-rw-r--r--StardewModdingAPI/Log.cs45
-rw-r--r--StardewModdingAPI/StardewModdingAPI.csproj2
7 files changed, 297 insertions, 27 deletions
diff --git a/StardewModdingAPI/Config.cs b/StardewModdingAPI/Config.cs
index c2cd6db1..d5517535 100644
--- a/StardewModdingAPI/Config.cs
+++ b/StardewModdingAPI/Config.cs
@@ -56,7 +56,7 @@ namespace StardewModdingAPI
try
{
//try to load the config from a json blob on disk
- T c = JsonConvert.DeserializeObject<T>(File.ReadAllText(ConfigLocation));
+ T c = JsonConvert.DeserializeObject<T>(File.ReadAllText(ConfigLocation), new JsonSerializerSettings() {ContractResolver = new JsonResolver()});
c.ConfigLocation = ConfigLocation;
@@ -94,10 +94,10 @@ namespace StardewModdingAPI
try
{
//default config
- var b = JObject.FromObject(Instance<T>().GenerateDefaultConfig<T>());
+ var b = JObject.FromObject(Instance<T>().GenerateDefaultConfig<T>(), new JsonSerializer() {ContractResolver = new JsonResolver()});
//user config
- var u = JObject.FromObject(this);
+ var u = JObject.FromObject(this, new JsonSerializer() {ContractResolver = new JsonResolver()});
//overwrite default values with user values
b.Merge(u, new JsonMergeSettings {MergeArrayHandling = MergeArrayHandling.Replace});
@@ -164,7 +164,7 @@ namespace StardewModdingAPI
return;
}
- string s = JsonConvert.SerializeObject(baseConfig, typeof (T), Formatting.Indented, new JsonSerializerSettings());
+ string s = JsonConvert.SerializeObject(baseConfig, typeof (T), Formatting.Indented, new JsonSerializerSettings() {ContractResolver = new JsonResolver()});
if (!Directory.Exists(baseConfig.ConfigDir))
Directory.CreateDirectory(baseConfig.ConfigDir);
diff --git a/StardewModdingAPI/Events/Mine.cs b/StardewModdingAPI/Events/Mine.cs
index ea23a8a3..2f4e9ba7 100644
--- a/StardewModdingAPI/Events/Mine.cs
+++ b/StardewModdingAPI/Events/Mine.cs
@@ -1,6 +1,14 @@
-namespace StardewModdingAPI.Events
+using System;
+
+namespace StardewModdingAPI.Events
{
public static class MineEvents
{
+ public static event EventHandler<EventArgsCurrentLocationChanged> MineLevelChanged = delegate { };
+
+ public static void InvokeLocationsChanged(int currentMineLevel)
+ {
+
+ }
}
}
diff --git a/StardewModdingAPI/Extensions.cs b/StardewModdingAPI/Extensions.cs
index 53c69c29..58430a6e 100644
--- a/StardewModdingAPI/Extensions.cs
+++ b/StardewModdingAPI/Extensions.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
+using System.Linq;
using System.Reflection;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
@@ -21,16 +22,28 @@ namespace StardewModdingAPI
return new Color(Random.Next(0, 255), Random.Next(0, 255), Random.Next(0, 255));
}
+ [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>");
+ return "";
+ }
+
+ public static string ToSingular<T>(this IEnumerable<T> ienum, string split = ", ")// where T : class
+ {
//Apparently Keys[] won't split normally :l
- if (ienum is Keys[])
+ if (typeof(T) == typeof(Keys))
{
- return string.Join(split, (Keys[])ienum);
+ return string.Join<T>(split, ienum.ToArray<T>());
}
return string.Join(split, ienum);
}
+ /*public static string ToSingular<T>(this IEnumerable<T> ienum, string split = ", ")
+ {
+ return string.Join(split, ienum);
+ }*/
+
public static bool IsInt32(this object o)
{
int i;
diff --git a/StardewModdingAPI/Inheritance/SBareObject.cs b/StardewModdingAPI/Inheritance/SBareObject.cs
new file mode 100644
index 00000000..905dac0d
--- /dev/null
+++ b/StardewModdingAPI/Inheritance/SBareObject.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.AccessControl;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace StardewModdingAPI.Inheritance
+{
+ public struct SBareObject
+ {
+ public int parentSheetIndex { get; set; }
+ public int stack { get; set; }
+ public bool isRecipe { get; set; }
+ public int price { get; set; }
+ public int quality { get; set; }
+
+ public SBareObject(int psi, int sta, bool ir, int pri, int qua)
+ {
+ parentSheetIndex = psi;
+ stack = sta;
+ isRecipe = ir;
+ price = pri;
+ quality = qua;
+ }
+ }
+}
diff --git a/StardewModdingAPI/JsonResolver.cs b/StardewModdingAPI/JsonResolver.cs
new file mode 100644
index 00000000..bd5831e0
--- /dev/null
+++ b/StardewModdingAPI/JsonResolver.cs
@@ -0,0 +1,215 @@
+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;
+
+namespace StardewModdingAPI
+{
+ class JsonResolver : DefaultContractResolver
+ {
+ protected override JsonContract CreateContract(Type objectType)
+ {
+ if (objectType == typeof(Rectangle) || objectType == typeof(Rectangle?))
+ {
+ Console.WriteLine("FOUND A RECT");
+ JsonContract contract = base.CreateObjectContract(objectType);
+ contract.Converter = new RectangleConverter();
+ return contract;
+ }
+ if (objectType == typeof(StardewValley.Object))
+ {
+ Log.Verbose("FOUND AN OBJECT");
+ JsonContract contract = base.CreateObjectContract(objectType);
+ contract.Converter = new ObjectConverter();
+ return contract;
+
+ }
+ return base.CreateContract(objectType);
+ }
+ }
+
+ public class ObjectConverter : JsonConverter
+ {
+ 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");
+
+ var jObject = GetObject(obj);
+ Log.Verbose("TRYING TO WRITE");
+
+ try
+ {
+ Log.Verbose(jObject.ToString());
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex);
+ }
+
+ Console.ReadKey();
+
+ jObject.WriteTo(writer);
+ }
+
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ {
+ var jObject = JObject.Load(reader);
+
+ return GetObject(jObject);
+ }
+
+ public override bool CanConvert(Type objectType)
+ {
+ throw new NotImplementedException();
+ }
+
+ protected static JObject GetObject(StardewValley.Object o)
+ {
+ try
+ {
+ var parentSheetIndex = o.parentSheetIndex;
+ var stack = o.stack;
+ var isRecipe = o.isRecipe;
+ var price = o.price;
+ var quality = o.quality;
+
+ var oo = new SBareObject(parentSheetIndex, stack, isRecipe, price, quality);
+ Log.Success(JsonConvert.SerializeObject(oo));
+ return JObject.FromObject(oo);
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex);
+ Console.ReadKey();
+ }
+ return null;
+ }
+
+ protected static StardewValley.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?;
+
+ return new StardewValley.Object(parentSheetIndex ?? 0, stack ?? 0, isRecipe ?? false, price ?? -1, quality ?? 0);
+ }
+
+ protected static StardewValley.Object GetObject(JToken jToken)
+ {
+ var jObject = JObject.FromObject(jToken);
+
+ return GetObject(jObject);
+ }
+
+ protected static T GetTokenValue<T>(JObject jObject, string tokenName) where T : class
+ {
+ JToken jToken;
+ jObject.TryGetValue(tokenName, StringComparison.InvariantCultureIgnoreCase, out jToken);
+ return jToken as T;
+ }
+ }
+
+ public class RectangleConverter : JsonConverter
+ {
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ var rectangle = (Rectangle)value;
+
+ var jObject = GetObject(rectangle);
+
+ jObject.WriteTo(writer);
+ }
+
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ {
+ Console.WriteLine(reader.ReadAsString());
+ var jObject = JObject.Load(reader);
+
+ return GetRectangle(jObject);
+ }
+
+ public override bool CanConvert(Type objectType)
+ {
+ throw new NotImplementedException();
+ }
+
+ protected static JObject GetObject(Rectangle rectangle)
+ {
+ var x = rectangle.X;
+ var y = rectangle.Y;
+ var width = rectangle.Width;
+ var height = rectangle.Height;
+
+ return JObject.FromObject(new { x, y, width, height });
+ }
+
+ protected static Rectangle GetRectangle(JObject jObject)
+ {
+ var x = GetTokenValue(jObject, "x") ?? 0;
+ var y = GetTokenValue(jObject, "y") ?? 0;
+ var width = GetTokenValue(jObject, "width") ?? 0;
+ var height = GetTokenValue(jObject, "height") ?? 0;
+
+ return new Rectangle(x, y, width, height);
+ }
+
+ protected static Rectangle GetRectangle(JToken jToken)
+ {
+ var jObject = JObject.FromObject(jToken);
+
+ return GetRectangle(jObject);
+ }
+
+ protected static int? GetTokenValue(JObject jObject, string tokenName)
+ {
+ JToken jToken;
+ return jObject.TryGetValue(tokenName, StringComparison.InvariantCultureIgnoreCase, out jToken) ? (int)jToken : (int?)null;
+ }
+ }
+
+ public class RectangleListConverter : RectangleConverter
+ {
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ var rectangleList = (IList<Rectangle>)value;
+
+ var jArray = new JArray();
+
+ foreach (var rectangle in rectangleList)
+ {
+ jArray.Add(GetObject(rectangle));
+ }
+
+ jArray.WriteTo(writer);
+ }
+
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ {
+ var rectangleList = new List<Rectangle>();
+
+ var jArray = JArray.Load(reader);
+
+ foreach (var jToken in jArray)
+ {
+ rectangleList.Add(GetRectangle(jToken));
+ }
+
+ return rectangleList;
+ }
+
+ public override bool CanConvert(Type objectType)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/StardewModdingAPI/Log.cs b/StardewModdingAPI/Log.cs
index c6294194..6c338edc 100644
--- a/StardewModdingAPI/Log.cs
+++ b/StardewModdingAPI/Log.cs
@@ -32,15 +32,9 @@ namespace StardewModdingAPI
}
}
- /// <summary>
- /// Print provided parameters to the console/file as applicable
- /// </summary>
- /// <param name="message">Desired message</param>
- /// <param name="disableLogging">When true, writes to ONLY console and not the log file.</param>
- /// <param name="values">Additional params to be added to the message</param>
- private static void PrintLog(object message, bool disableLogging, params object[] values)
+ private static void PrintLog(object message, bool disableLogging)
{
- string logOutput = $"[{DateTime.Now.ToLongTimeString()}] {string.Format(message.ToString(), values)}";
+ string logOutput = $"[{DateTime.Now.ToLongTimeString()}] {message?.ToString()}";
Console.WriteLine(logOutput);
if (_logStream != null && !disableLogging)
@@ -51,14 +45,25 @@ namespace StardewModdingAPI
}
/// <summary>
+ /// Print provided parameters to the console/file as applicable
+ /// </summary>
+ /// <param name="message">Desired message</param>
+ /// <param name="disableLogging">When true, writes to ONLY console and not the log file.</param>
+ /// <param name="values">Deprecated. Does nothing.</param>
+ private static void PrintLog(object message, bool disableLogging, params object[] values)
+ {
+ PrintLog(message, disableLogging);
+ }
+
+ /// <summary>
/// Successful message to display to console and logging.
/// </summary>
/// <param name="message"></param>
- /// <param name="values"></param>
+ /// <param name="values">Deprecated. Do not use.</param>
public static void Success(object message, params object[] values)
{
Console.ForegroundColor = ConsoleColor.Green;
- PrintLog(message?.ToString(), false, values);
+ PrintLog(message?.ToString(), false);
Console.ForegroundColor = ConsoleColor.Gray;
}
@@ -66,11 +71,11 @@ namespace StardewModdingAPI
/// Generic comment to display to console and logging.
/// </summary>
/// <param name="message"></param>
- /// <param name="values"></param>
+ /// <param name="values">Deprecated. Do not use.</param>
public static void Verbose(object message, params object[] values)
{
Console.ForegroundColor = ConsoleColor.Gray;
- PrintLog(message?.ToString(), false, values);
+ PrintLog(message?.ToString(), false);
Console.ForegroundColor = ConsoleColor.Gray;
}
@@ -78,11 +83,11 @@ namespace StardewModdingAPI
/// Additional comment to display to console and logging.
/// </summary>
/// <param name="message"></param>
- /// <param name="values"></param>
+ /// <param name="values">Deprecated. Do not use.</param>
public static void Comment(object message, params object[] values)
{
Console.ForegroundColor = ConsoleColor.Yellow;
- PrintLog(message?.ToString(), false, values);
+ PrintLog(message?.ToString(), false);
Console.ForegroundColor = ConsoleColor.Gray;
}
@@ -90,11 +95,11 @@ namespace StardewModdingAPI
/// Message for only console. Does not appear in logging.
/// </summary>
/// <param name="message"></param>
- /// <param name="values"></param>
+ /// <param name="values">Deprecated. Do not use.</param>
public static void Info(object message, params object[] values)
{
Console.ForegroundColor = ConsoleColor.Gray;
- PrintLog(message?.ToString(), true, values);
+ PrintLog(message?.ToString(), true);
Console.ForegroundColor = ConsoleColor.Gray;
}
@@ -102,11 +107,11 @@ namespace StardewModdingAPI
/// Important message indicating an error.
/// </summary>
/// <param name="message"></param>
- /// <param name="values"></param>
+ /// <param name="values">Deprecated. Do not use.</param>
public static void Error(object message, params object[] values)
{
Console.ForegroundColor = ConsoleColor.Red;
- PrintLog(message?.ToString(), false, values);
+ PrintLog(message?.ToString(), false);
Console.ForegroundColor = ConsoleColor.Gray;
}
@@ -114,12 +119,12 @@ namespace StardewModdingAPI
/// A message displayed only while in DEBUG mode
/// </summary>
/// <param name="message"></param>
- /// <param name="values"></param>
+ /// <param name="values">Deprecated. Do not use.</param>
public static void Debug(object message, params object[] values)
{
#if DEBUG
Console.ForegroundColor = ConsoleColor.Yellow;
- Log.PrintLog(message.ToString(), false, values);
+ Log.PrintLog(message.ToString(), false);
Console.ForegroundColor = ConsoleColor.Gray;
#endif
}
diff --git a/StardewModdingAPI/StardewModdingAPI.csproj b/StardewModdingAPI/StardewModdingAPI.csproj
index a2dd442a..76ebd86c 100644
--- a/StardewModdingAPI/StardewModdingAPI.csproj
+++ b/StardewModdingAPI/StardewModdingAPI.csproj
@@ -149,7 +149,9 @@
<Compile Include="Inheritance\Menus\SGameMenu.cs" />
<Compile Include="Inheritance\Menus\SInventoryPage.cs" />
<Compile Include="Inheritance\Minigames\SMinigameBase.cs" />
+ <Compile Include="Inheritance\SBareObject.cs" />
<Compile Include="Inheritance\SObject.cs" />
+ <Compile Include="JsonResolver.cs" />
<Compile Include="Log.cs" />
<Compile Include="Manifest.cs" />
<Compile Include="Mod.cs" />