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) } }