diff --git a/HelloModdingWorld/MyPlugin.cs b/HelloModdingWorld/MyPlugin.cs
deleted file mode 100644
index d8749b6..0000000
--- a/HelloModdingWorld/MyPlugin.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-using System.Reflection;
-
-using IllusionPlugin;
-//using GamecraftModdingAPI;
-
-namespace HelloModdingWorld
-{
- public class MyPlugin : IPlugin // the Illusion Plugin Architecture (IPA) will ignore classes that don't implement IPlugin'
- {
- public string Name { get; } = Assembly.GetExecutingAssembly().GetName().Name; // HelloModdingWorld by default
- // To change the name, change the project's name
-
- public string Version { get; } = Assembly.GetExecutingAssembly().GetName().Version.ToString(); // 0.0.1 by default
- // To change the version, change 0.0.1 in HelloModdingWorld.csproj
-
- // called when Gamecraft shuts down
- public void OnApplicationQuit()
- {
- // Shutdown this mod
- GamecraftModdingAPI.Utility.Logging.LogDebug($"{Name} has shutdown");
-
- // Shutdown the Gamecraft modding API last
- GamecraftModdingAPI.Main.Shutdown();
- }
-
- // called when Gamecraft starts up
- public void OnApplicationStart()
- {
- // Initialize the Gamecraft modding API first
- GamecraftModdingAPI.Main.Init();
- // check out the modding API docs here: https://mod.exmods.org/
-
- // Initialize this mod
- // create HelloWorld command
- // this writes "Hello modding world!" when you execute it in Gamecraft's console
- // (use the forward-slash key '/' to open the console in Gamecraft when in a game)
- GamecraftModdingAPI.Commands.CommandBuilder.Builder()
- .Name("HelloWorld") // command name (used to invoke it in the console)
- .Description("Says Hello modding world!") // command description (displayed in help and hint toolbar)
- .Action(() => { GamecraftModdingAPI.Utility.Logging.CommandLog("Hello modding world!"); })
- .Build(); // construct and automatically register the command so the modding API knows about it
-
- GamecraftModdingAPI.Utility.Logging.LogDebug($"{Name} has started up");
- }
-
- // unused methods
-
- public void OnFixedUpdate() { } // called once per physics update
-
- public void OnLevelWasInitialized(int level) { } // called after a level is initialized
-
- public void OnLevelWasLoaded(int level) { } // called after a level is loaded
-
- public void OnUpdate() { } // called once per rendered frame (frame update)
- }
-}
\ No newline at end of file
diff --git a/HelloModdingWorld.sln b/Kompressor.sln
similarity index 85%
rename from HelloModdingWorld.sln
rename to Kompressor.sln
index 53b74f0..c3477fe 100644
--- a/HelloModdingWorld.sln
+++ b/Kompressor.sln
@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29609.76
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HelloModdingWorld", "HelloModdingWorld\HelloModdingWorld.csproj", "{E0EEA15D-AB3C-4C73-A000-C49B5AE9EA66}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kompressor", "Kompressor\Kompressor.csproj", "{E0EEA15D-AB3C-4C73-A000-C49B5AE9EA66}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
diff --git a/HelloModdingWorld/HelloModdingWorld.csproj b/Kompressor/Kompressor.csproj
similarity index 99%
rename from HelloModdingWorld/HelloModdingWorld.csproj
rename to Kompressor/Kompressor.csproj
index bd9c18d..4564771 100644
--- a/HelloModdingWorld/HelloModdingWorld.csproj
+++ b/Kompressor/Kompressor.csproj
@@ -4,9 +4,9 @@
net472
true
0.0.1
- Me
+ NGnius
MIT
- https://git.exmods.org/modtainers/HelloModdingWorld
+ https://git.exmods.org/NGnius/Kompressor
en-CA
@@ -16,6 +16,9 @@
+
+ ..\..\ref\Gamecraft_Data\Managed\Assembly-CSharp.dll
+
diff --git a/Kompressor/MyPlugin.cs b/Kompressor/MyPlugin.cs
new file mode 100644
index 0000000..628402f
--- /dev/null
+++ b/Kompressor/MyPlugin.cs
@@ -0,0 +1,134 @@
+using System;
+using System.Reflection;
+
+//using UnityEngine;
+
+using IllusionPlugin;
+//using GamecraftModdingAPI;
+using GamecraftModdingAPI.Commands;
+
+namespace Kompressor
+{
+ public class MyPlugin : IPlugin // the Illusion Plugin Architecture (IPA) will ignore classes that don't implement IPlugin'
+ {
+ public string Name { get; } = Assembly.GetExecutingAssembly().GetName().Name; // Kompressor by default
+ // To change the name, change the project's name
+
+ public string Version { get; } = Assembly.GetExecutingAssembly().GetName().Version.ToString(); // 0.0.1.0 by default
+ // To change the version, change 0.0.1 in Kompressor.csproj
+
+ private const string SETTINGS_PATH = "kompressor.json";
+
+ // called when Gamecraft shuts down
+ public void OnApplicationQuit()
+ {
+ // Shutdown this mod
+ GamecraftModdingAPI.Utility.Logging.LogDebug($"{Name} has shutdown");
+
+ // Shutdown the Gamecraft modding API last
+ GamecraftModdingAPI.Main.Shutdown();
+ }
+
+ // called when Gamecraft starts up
+ public void OnApplicationStart()
+ {
+ // Initialize the Gamecraft modding API first
+ GamecraftModdingAPI.Main.Init();
+ // check out the modding API docs here: https://mod.exmods.org/
+
+ // reload command
+ CommandBuilder.Builder()
+ .Name("ReloadKompressor")
+ .Description("Reload Kompressor quality settings.")
+ .Action(() => { LoadAndApplySettings(); })
+ .Build();
+
+ // apply settings after the game starts up (but only once)
+ bool IsGamecraftStarted = false;
+ GamecraftModdingAPI.App.Client.EnterMenu += (_, __) =>
+ {
+ if (IsGamecraftStarted) return;
+ IsGamecraftStarted = true;
+ try
+ {
+ LoadAndApplySettings();
+ }
+ catch (Exception)
+ {
+ GamecraftModdingAPI.Utility.Logging.LogWarning("Failed to load kompressor.json, generated default file.");
+ }
+
+ };
+
+ GamecraftModdingAPI.Utility.Logging.MetaLog($"{Name} has started up");
+ }
+
+ internal void LoadAndApplySettings(bool suppress = false)
+ {
+ QualitySettings qs = QualitySettingsUtility.Default();
+ try
+ {
+ qs = QualitySettingsUtility.Load(SETTINGS_PATH);
+ }
+ catch (Exception e)
+ {
+ QualitySettingsUtility.Save(qs, SETTINGS_PATH);
+ if (!suppress) throw e;
+ }
+
+ ApplySettings(qs);
+ }
+
+ internal void ApplySettings(QualitySettings qs)
+ {
+ UnityEngine.QualitySettings.SetQualityLevel(qs.QualitySettingIndex, true);
+ // TODO
+ UnityEngine.QualitySettings.anisotropicFiltering = (UnityEngine.AnisotropicFiltering)System.Enum.Parse(typeof(UnityEngine.AnisotropicFiltering), qs.AnisotropicFiltering);
+ UnityEngine.QualitySettings.antiAliasing = qs.AntiAliasing;
+ UnityEngine.QualitySettings.asyncUploadBufferSize = qs.AsyncUploadBufferSize;
+ UnityEngine.QualitySettings.asyncUploadPersistentBuffer = qs.AsyncUploadPersistentBuffer;
+ UnityEngine.QualitySettings.asyncUploadTimeSlice = qs.AsyncUploadTimeSlice;
+ UnityEngine.QualitySettings.billboardsFaceCameraPosition = qs.BillBoardsFaceCameraPosition;
+ UnityEngine.QualitySettings.lodBias = qs.LODBias;
+ UnityEngine.QualitySettings.masterTextureLimit = qs.MasterTextureLimit;
+ UnityEngine.QualitySettings.maximumLODLevel = qs.MaximumLODLevel;
+ UnityEngine.QualitySettings.maxQueuedFrames = qs.MaxQueuedFrames;
+ UnityEngine.QualitySettings.particleRaycastBudget = qs.ParticleRaycastBudget;
+ UnityEngine.QualitySettings.pixelLightCount = qs.PixelLightCount;
+ UnityEngine.QualitySettings.realtimeReflectionProbes = qs.RealtimeReflectionProbes;
+ UnityEngine.QualitySettings.resolutionScalingFixedDPIFactor = qs.ResolutionScalingFixedDPIFactor;
+ UnityEngine.QualitySettings.shadowCascade2Split = qs.ShadowCascade2Split;
+ // TODO shadowCascade4Split
+ UnityEngine.QualitySettings.shadowCascades = qs.ShadowCascades;
+ UnityEngine.QualitySettings.shadowDistance = qs.ShadowDistance;
+ UnityEngine.QualitySettings.shadowmaskMode = (UnityEngine.ShadowmaskMode)Enum.Parse(typeof(UnityEngine.ShadowmaskMode), qs.ShadowmaskMode);
+ UnityEngine.QualitySettings.shadowNearPlaneOffset = qs.ShadowNearPlaneOffset;
+ UnityEngine.QualitySettings.shadowProjection = (UnityEngine.ShadowProjection)Enum.Parse(typeof(UnityEngine.ShadowProjection), qs.ShadowProjection);
+ UnityEngine.QualitySettings.shadowResolution = (UnityEngine.ShadowResolution)Enum.Parse(typeof(UnityEngine.ShadowResolution), qs.ShadowResolution);
+ UnityEngine.QualitySettings.shadows = (UnityEngine.ShadowQuality)Enum.Parse(typeof(UnityEngine.ShadowQuality), qs.Shadows);
+ UnityEngine.QualitySettings.skinWeights = (UnityEngine.SkinWeights)Enum.Parse(typeof(UnityEngine.SkinWeights), qs.SkinWeights);
+ UnityEngine.QualitySettings.softParticles = qs.SoftParticles;
+ UnityEngine.QualitySettings.softVegetation = qs.SoftVegetation;
+ UnityEngine.QualitySettings.streamingMipmapsActive = qs.StreamingMipmapsActive;
+ UnityEngine.QualitySettings.streamingMipmapsAddAllCameras = qs.StreamingMipmapsAddAllCameras;
+ UnityEngine.QualitySettings.streamingMipmapsMaxFileIORequests = qs.StreamingMipmapsMaxFileIORequests;
+ UnityEngine.QualitySettings.streamingMipmapsMaxLevelReduction = qs.StreamingMipmapsMaxLevelReduction;
+ UnityEngine.QualitySettings.streamingMipmapsMemoryBudget = qs.StreamingMipmapsMemoryBudget;
+ //UnityEngine.QualitySettings.streamingMipmapsRenderersPerFrame = qs.StreamingMipmapsRendersPerFrame;
+ UnityEngine.QualitySettings.vSyncCount = qs.VSyncCount;
+ UnityEngine.Application.targetFrameRate = qs.TargetFrameRate;
+
+ UnityEngine.Camera.main.fieldOfView = qs.FieldOfView;
+ }
+
+ // unused methods
+
+ public void OnFixedUpdate() { } // called once per physics update
+
+ public void OnLevelWasInitialized(int level) { } // called after a level is initialized
+
+ public void OnLevelWasLoaded(int level) { } // called after a level is loaded
+
+ public void OnUpdate() { } // called once per rendered frame (frame update)
+ }
+}
\ No newline at end of file
diff --git a/Kompressor/QualitySettings.cs b/Kompressor/QualitySettings.cs
new file mode 100644
index 0000000..b1a8928
--- /dev/null
+++ b/Kompressor/QualitySettings.cs
@@ -0,0 +1,137 @@
+using System;
+using System.IO;
+using Newtonsoft.Json;
+
+namespace Kompressor
+{
+ public struct QualitySettings
+ {
+ public int QualitySettingIndex;
+
+ public string AnisotropicFiltering;
+
+ public int AntiAliasing;
+
+ public int AsyncUploadBufferSize;
+
+ public bool AsyncUploadPersistentBuffer;
+
+ public int AsyncUploadTimeSlice;
+
+ public bool BillBoardsFaceCameraPosition;
+
+ public float LODBias;
+
+ public int MasterTextureLimit;
+
+ public int MaximumLODLevel;
+
+ public int MaxQueuedFrames;
+
+ public int ParticleRaycastBudget;
+
+ public int PixelLightCount;
+
+ public bool RealtimeReflectionProbes;
+
+ public float ResolutionScalingFixedDPIFactor;
+
+ public float ShadowCascade2Split;
+
+ //public float[] ShadowCascade4Split;
+
+ public int ShadowCascades;
+
+ public float ShadowDistance;
+
+ public string ShadowmaskMode;
+
+ public float ShadowNearPlaneOffset;
+
+ public string ShadowProjection;
+
+ public string ShadowResolution;
+
+ public string Shadows;
+
+ public string SkinWeights;
+
+ public bool SoftParticles;
+
+ public bool SoftVegetation;
+
+ public bool StreamingMipmapsActive;
+
+ public bool StreamingMipmapsAddAllCameras;
+
+ public int StreamingMipmapsMaxFileIORequests;
+
+ public int StreamingMipmapsMaxLevelReduction;
+
+ public float StreamingMipmapsMemoryBudget;
+
+ //public int StreamingMipmapsRendersPerFrame;
+
+ public int VSyncCount;
+
+ public int TargetFrameRate;
+
+ public float FieldOfView;
+ }
+
+ public static class QualitySettingsUtility
+ {
+ internal static QualitySettings Load(string filepath)
+ {
+ string contents = File.ReadAllText(filepath);
+ return JsonConvert.DeserializeObject(contents);
+ }
+
+ internal static void Save(QualitySettings qs, string filepath)
+ {
+ string contents = JsonConvert.SerializeObject(qs);
+ File.WriteAllText(filepath, contents);
+ }
+
+ internal static QualitySettings Default()
+ {
+ QualitySettings qs = new QualitySettings
+ {
+ AnisotropicFiltering = "Disable",
+ AntiAliasing = 0,
+ AsyncUploadBufferSize = 16,
+ AsyncUploadPersistentBuffer = true,
+ AsyncUploadTimeSlice = 2,
+ BillBoardsFaceCameraPosition = false,
+ LODBias = 0.3f,
+ MasterTextureLimit = 3,
+ MaximumLODLevel = 0,
+ MaxQueuedFrames = 2,
+ ParticleRaycastBudget = 4,
+ PixelLightCount = 0,
+ RealtimeReflectionProbes = false,
+ ResolutionScalingFixedDPIFactor = 1,
+ ShadowCascade2Split = 1/3,
+ ShadowCascades = 1,
+ ShadowDistance = 22,
+ ShadowmaskMode = "Shadowmask",
+ ShadowNearPlaneOffset = 3,
+ ShadowProjection = "StableFit",
+ ShadowResolution = "Low",
+ Shadows = "Disable",
+ SkinWeights = "OneBone",
+ SoftParticles = false,
+ SoftVegetation = false,
+ StreamingMipmapsActive = false,
+ StreamingMipmapsAddAllCameras = true,
+ StreamingMipmapsMaxFileIORequests = 1024,
+ StreamingMipmapsMaxLevelReduction = 4,
+ StreamingMipmapsMemoryBudget = 512,
+ VSyncCount = 0,
+ TargetFrameRate = -1,
+ FieldOfView = 60,
+ };
+ return qs;
+ }
+ }
+}