Zoryn returns. Added JSON. Added Config.cs.
This commit is contained in:
parent
d367b0a7bc
commit
c50891a093
|
@ -6,6 +6,7 @@ TrainerMod/obj/
|
|||
StardewInjector/bin/
|
||||
StardewInjector/obj/
|
||||
packages/
|
||||
steamapps/
|
||||
|
||||
*.symlink
|
||||
*.lnk
|
||||
|
|
|
@ -0,0 +1,124 @@
|
|||
/*
|
||||
Copyright 2016 Zoey (Zoryn)
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace StardewModdingAPI
|
||||
{
|
||||
public class Config
|
||||
{
|
||||
[JsonIgnore]
|
||||
public virtual JObject JObject { get; protected set; }
|
||||
|
||||
[JsonIgnore]
|
||||
public virtual string ConfigLocation { get; protected set; }
|
||||
|
||||
public static Config Instance
|
||||
{
|
||||
get { return new Config(); }
|
||||
}
|
||||
|
||||
public static Config InitializeConfig(string configLocation, Config baseConfig)
|
||||
{
|
||||
if (baseConfig == null)
|
||||
{
|
||||
Console.WriteLine("A config must be instantiated before being passed to Initialize.\n\t" + configLocation);
|
||||
return null;
|
||||
}
|
||||
|
||||
baseConfig.ConfigLocation = configLocation;
|
||||
return baseConfig.LoadConfig(baseConfig);
|
||||
}
|
||||
|
||||
public virtual Config GenerateBaseConfig(Config baseConfig)
|
||||
{
|
||||
//Must be implemented in sub-class
|
||||
return null;
|
||||
}
|
||||
|
||||
public virtual Config LoadConfig(Config baseConfig)
|
||||
{
|
||||
if (!File.Exists(baseConfig.ConfigLocation))
|
||||
{
|
||||
var v = (Config)baseConfig.GetType().GetMethod("GenerateBaseConfig", BindingFlags.Public | BindingFlags.Instance).Invoke(baseConfig, new object[] { baseConfig });
|
||||
v.WriteConfig();
|
||||
}
|
||||
else
|
||||
{
|
||||
var p = baseConfig.ConfigLocation;
|
||||
|
||||
try
|
||||
{
|
||||
var j = JObject.Parse(Encoding.UTF8.GetString(File.ReadAllBytes(baseConfig.ConfigLocation)));
|
||||
baseConfig = (Config)j.ToObject(baseConfig.GetType());
|
||||
baseConfig.ConfigLocation = p;
|
||||
baseConfig.JObject = j;
|
||||
|
||||
baseConfig = UpdateConfig(baseConfig);
|
||||
baseConfig.ConfigLocation = p;
|
||||
baseConfig.JObject = j;
|
||||
|
||||
baseConfig.WriteConfig();
|
||||
}
|
||||
catch
|
||||
{
|
||||
Console.WriteLine("Invalid JSON Renamed: " + p);
|
||||
if (File.Exists(p))
|
||||
File.Move(p, Path.Combine(Path.GetDirectoryName(p), Path.GetFileNameWithoutExtension(p) + "." + Guid.NewGuid() + ".json")); //Get it out of the way for a new one
|
||||
var v = (Config)baseConfig.GetType().GetMethod("GenerateBaseConfig", BindingFlags.Public | BindingFlags.Instance).Invoke(baseConfig, new object[] { baseConfig });
|
||||
v.WriteConfig();
|
||||
}
|
||||
}
|
||||
|
||||
return baseConfig;
|
||||
}
|
||||
|
||||
public virtual Config UpdateConfig(Config baseConfig)
|
||||
{
|
||||
try
|
||||
{
|
||||
//default config with all standard values
|
||||
var b = JObject.FromObject(baseConfig.GetType().GetMethod("GenerateBaseConfig", BindingFlags.Public | BindingFlags.Instance).Invoke(baseConfig, new object[] { baseConfig }));
|
||||
//user config with their values
|
||||
var u = baseConfig.JObject;
|
||||
|
||||
b.Merge(u);
|
||||
|
||||
return (Config)b.ToObject(baseConfig.GetType());
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine(ex.ToString());
|
||||
}
|
||||
return baseConfig;
|
||||
}
|
||||
|
||||
public static string GetBasePath(Mod theMod)
|
||||
{
|
||||
return theMod.PathOnDisk + "\\config.json";
|
||||
}
|
||||
}
|
||||
|
||||
public static class ConfigExtensions
|
||||
{
|
||||
public static void WriteConfig(this Config baseConfig)
|
||||
{
|
||||
var toWrite = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(baseConfig, baseConfig.GetType(), Formatting.Indented, new JsonSerializerSettings()));
|
||||
if (!File.Exists(baseConfig.ConfigLocation) || !File.ReadAllBytes(baseConfig.ConfigLocation).SequenceEqual(toWrite))
|
||||
File.WriteAllBytes(baseConfig.ConfigLocation, toWrite);
|
||||
toWrite = null;
|
||||
}
|
||||
|
||||
public static Config ReloadConfig(this Config baseConfig)
|
||||
{
|
||||
return baseConfig.UpdateConfig(baseConfig);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -28,6 +28,11 @@ namespace StardewModdingAPI
|
|||
/// </summary>
|
||||
public virtual string Description { get; protected set; }
|
||||
|
||||
/// <summary>
|
||||
/// Where the mod is located on the disk.
|
||||
/// </summary>
|
||||
public string PathOnDisk { get; internal set; }
|
||||
|
||||
/// <summary>
|
||||
/// A basic method that is the entry-point of your mod. It will always be called once when the mod loads.
|
||||
/// </summary>
|
||||
|
|
|
@ -131,6 +131,7 @@ namespace StardewModdingAPI
|
|||
TypeInfo tar = mod.DefinedTypes.First(x => x.BaseType == typeof(Mod));
|
||||
Mod m = (Mod)mod.CreateInstance(tar.ToString());
|
||||
Console.WriteLine("LOADED: {0} by {1} - Version {2} | Description: {3}", m.Name, m.Authour, m.Version, m.Description);
|
||||
m.PathOnDisk = Path.GetDirectoryName(ModPath);
|
||||
m.Entry(false);
|
||||
StardewInjectorLoaded = true;
|
||||
StardewInjectorMod = m;
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
</When>
|
||||
<Otherwise>
|
||||
<PropertyGroup>
|
||||
<SteamPath>..\..\..\..\Games\SteamLibrary</SteamPath>
|
||||
<SteamPath>..\</SteamPath>
|
||||
</PropertyGroup>
|
||||
</Otherwise>
|
||||
</Choose>
|
||||
|
@ -91,6 +91,10 @@
|
|||
<Reference Include="Microsoft.Xna.Framework.Game, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86" />
|
||||
<Reference Include="Microsoft.Xna.Framework.Graphics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86" />
|
||||
<Reference Include="Microsoft.Xna.Framework.Xact, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86" />
|
||||
<Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.8.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Stardew Valley, Version=1.0.5905.5747, Culture=neutral, processorArchitecture=x86">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>$(SteamPath)\steamapps\common\Stardew Valley\Stardew Valley.exe</HintPath>
|
||||
|
@ -111,6 +115,7 @@
|
|||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Command.cs" />
|
||||
<Compile Include="Config.cs" />
|
||||
<Compile Include="Constants.cs" />
|
||||
<Compile Include="Entities\SCharacter.cs" />
|
||||
<Compile Include="Entities\SFarm.cs" />
|
||||
|
@ -143,6 +148,7 @@
|
|||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="icon.ico" />
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Newtonsoft.Json" version="8.0.2" targetFramework="net45" />
|
||||
</packages>
|
|
@ -41,7 +41,7 @@
|
|||
</When>
|
||||
<Otherwise>
|
||||
<PropertyGroup>
|
||||
<SteamPath>..\..\..\..\Games\SteamLibrary</SteamPath>
|
||||
<SteamPath>..\</SteamPath>
|
||||
</PropertyGroup>
|
||||
</Otherwise>
|
||||
</Choose>
|
||||
|
@ -52,6 +52,10 @@
|
|||
<Reference Include="Microsoft.Xna.Framework.Game, Version=4.0.0.0, Culture=neutral, PublicKeyToken=842cf8be1de50553, processorArchitecture=x86">
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=8.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Newtonsoft.Json.8.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="Stardew Valley">
|
||||
<HintPath>$(SteamPath)\steamapps\common\Stardew Valley\Stardew Valley.exe</HintPath>
|
||||
<Private>False</Private>
|
||||
|
@ -80,6 +84,9 @@
|
|||
<Private>False</Private>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Newtonsoft.Json" version="8.0.3" targetFramework="net45" />
|
||||
</packages>
|
Loading…
Reference in New Issue