using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BoneLib.BoneMenu; using HarmonyLib; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppSLZ.Marrow; using MelonLoader; using MelonLoader.Preferences; using Microsoft.CodeAnalysis; using QuickGunFX; using UnityEngine; using UnityEngine.Rendering; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: MelonInfo(typeof(GunFXMod), "QuickGunFX", "1.0.0", "nontendo", null)] [assembly: MelonGame("Stress Level Zero", "BONELAB")] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("QuickGunFX")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("QuickGunFX")] [assembly: AssemblyTitle("QuickGunFX")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace QuickGunFX { [HarmonyPatch(typeof(Gun), "Fire")] public static class Gun_Fire_Patch { private static readonly Dictionary _lastAmmo = new Dictionary(); public static void Postfix(Gun __instance) { try { int num; try { num = __instance.AmmoCount(); } catch { return; } int value; bool flag = _lastAmmo.TryGetValue(__instance, out value); bool flag2; try { flag2 = __instance.isTriggerPressed; } catch { flag2 = true; } bool flag3 = flag && num < value && flag2; _lastAmmo[__instance] = num; if (GunFXSettings.DebugLog && (flag3 || !flag || num != value)) { MelonLogger.Msg($"[QuickGunFX] ammo {(flag ? value : (-1))}->{num} trigger={flag2} fired={flag3}"); } if (GunFXSettings.Enabled && flag3) { GunFX.OnShot(__instance); } } catch (Exception ex) { MelonLogger.Warning("[QuickGunFX] shot fx failed: " + ex.Message); } } } public static class GunFX { private struct Pending { public Gun gun; public float emitTime; public int chamberN; public int barrelN; public int chamberRep; public int barrelRep; public int gen; } private struct Impact { public Vector3 pos; public Vector3 dir; public float emitTime; public int repeats; public int gen; } private static ParticleSystem? _chamber; private static ParticleSystem? _barrel; private static ParticleSystem? _impact; private static Material? _mat; private static Texture2D? _tex; private static readonly Dictionary _heat = new Dictionary(); private static readonly List _heatKeys = new List(); private static readonly List _pending = new List(); private static readonly List _impacts = new List(); private static int Buildup(int n, int gen) { if (!GunFXSettings.RepeatBuildup) { return n; } return Mathf.RoundToInt((float)n * (1f + (float)gen * 0.5f)); } public static void OnShot(Gun gun) { if (GunFXSettings.RecoilEnabled) { ApplyRecoil(gun, gun.firePointTransform); } if (GunFXSettings.ImpactEnabled) { TryQueueImpact(gun); } float value; float num = (_heat.TryGetValue(gun, out value) ? value : 0f); int num2 = (GunFXSettings.ChamberEnabled ? Mathf.RoundToInt(GunFXSettings.ChamberAmount * (0.1f + 0.9f * num)) : 0); int num3 = (GunFXSettings.BarrelEnabled ? Mathf.RoundToInt(GunFXSettings.BarrelAmount * (0.15f + 0.85f * num)) : 0); _heat[gun] = Mathf.Min(1f, num + GunFXSettings.Buildup); if (num2 > 0 || num3 > 0) { _pending.Add(new Pending { gun = gun, emitTime = Time.time + Mathf.Max(0f, GunFXSettings.Delay), chamberN = num2, barrelN = num3, chamberRep = Mathf.Clamp(Mathf.RoundToInt(GunFXSettings.ChamberRepeat), 0, 50), barrelRep = Mathf.Clamp(Mathf.RoundToInt(GunFXSettings.BarrelRepeat), 0, 50) }); } } public static void Update() { //IL_029a: Unknown result type (might be due to invalid IL or missing references) //IL_02a1: Unknown result type (might be due to invalid IL or missing references) //IL_02f7: Unknown result type (might be due to invalid IL or missing references) //IL_02fc: Unknown result type (might be due to invalid IL or missing references) //IL_0305: Unknown result type (might be due to invalid IL or missing references) //IL_030a: Unknown result type (might be due to invalid IL or missing references) float time = Time.time; float deltaTime = Time.deltaTime; if (_heat.Count > 0) { _heatKeys.Clear(); foreach (Gun key in _heat.Keys) { _heatKeys.Add(key); } float num = GunFXSettings.Fade * deltaTime; foreach (Gun heatKey in _heatKeys) { if ((Object)(object)heatKey == (Object)null) { _heat.Remove(heatKey); continue; } float num2 = _heat[heatKey] - num; if (num2 <= 0.01f) { _heat.Remove(heatKey); } else { _heat[heatKey] = num2; } } } for (int num3 = _pending.Count - 1; num3 >= 0; num3--) { if (!(time < _pending[num3].emitTime)) { Pending p = _pending[num3]; _pending.RemoveAt(num3); if (!((Object)(object)p.gun == (Object)null)) { try { EnsureBuilt(); EmitShot(p); if (p.chamberRep > 0 || p.barrelRep > 0) { _pending.Add(new Pending { gun = p.gun, emitTime = time + Mathf.Max(0.02f, GunFXSettings.RepeatDelay), chamberN = ((p.chamberRep > 0) ? p.chamberN : 0), barrelN = ((p.barrelRep > 0) ? p.barrelN : 0), chamberRep = Mathf.Max(0, p.chamberRep - 1), barrelRep = Mathf.Max(0, p.barrelRep - 1), gen = p.gen + 1 }); } } catch (Exception ex) { MelonLogger.Warning("[QuickGunFX] emit failed: " + ex.Message); } } } } for (int num4 = _impacts.Count - 1; num4 >= 0; num4--) { if (!(time < _impacts[num4].emitTime)) { Impact impact = _impacts[num4]; _impacts.RemoveAt(num4); try { EnsureBuilt(); if ((Object)(object)_impact != (Object)null) { Emit(_impact, impact.pos, impact.dir, Buildup((int)GunFXSettings.ImpactAmount, impact.gen), GunFXSettings.ImpactSize, GunFXSettings.ImpactLifetime, GunFXSettings.ImpactOpacity, GunFXSettings.ImpactRise, GunFXSettings.ImpactRise * 0.3f); } if (impact.repeats > 0) { _impacts.Add(new Impact { pos = impact.pos, dir = impact.dir, emitTime = time + Mathf.Max(0.02f, GunFXSettings.RepeatDelay), repeats = impact.repeats - 1, gen = impact.gen + 1 }); } } catch (Exception ex2) { MelonLogger.Warning("[QuickGunFX] impact emit failed: " + ex2.Message); } } } } private static void TryQueueImpact(Gun gun) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) Transform firePointTransform = gun.firePointTransform; RaycastHit val = default(RaycastHit); if (!((Object)(object)firePointTransform == (Object)null) && Physics.Raycast(firePointTransform.position, firePointTransform.forward, ref val, GunFXSettings.ImpactRange, -1, (QueryTriggerInteraction)1)) { Vector3 val2 = ((RaycastHit)(ref val)).normal * 0.6f + Vector3.up * 0.4f; Vector3 normalized = ((Vector3)(ref val2)).normalized; float num = Mathf.Clamp(((RaycastHit)(ref val)).distance / 250f, 0f, 0.25f); _impacts.Add(new Impact { pos = ((RaycastHit)(ref val)).point + ((RaycastHit)(ref val)).normal * 0.02f, dir = normalized, emitTime = Time.time + num, repeats = Mathf.Clamp(Mathf.RoundToInt(GunFXSettings.ImpactRepeat), 0, 50) }); } } private static void EmitShot(Pending p) { //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) Gun gun = p.gun; Transform firePointTransform = gun.firePointTransform; Transform shellSpawnTransform = gun.shellSpawnTransform; Transform val = (((Object)(object)firePointTransform != (Object)null) ? firePointTransform : ((Component)gun).transform); int num = Buildup(p.chamberN, p.gen); int num2 = Buildup(p.barrelN, p.gen); if (num > 0 && (Object)(object)_chamber != (Object)null) { Vector3 pos = (((Object)(object)shellSpawnTransform != (Object)null) ? shellSpawnTransform.position : (((Object)(object)firePointTransform != (Object)null) ? (firePointTransform.position - firePointTransform.forward * 0.12f + firePointTransform.up * 0.03f) : ((Component)gun).transform.position)); Vector3 dir = val.right * GunFXSettings.ChamberDirSide + val.up * GunFXSettings.ChamberDirUp + val.forward * GunFXSettings.ChamberDirForward; if (((Vector3)(ref dir)).sqrMagnitude < 0.0001f) { dir = Vector3.up; } dir = ((Vector3)(ref dir)).normalized; Emit(_chamber, pos, dir, num, GunFXSettings.ChamberSize, GunFXSettings.ChamberLifetime, GunFXSettings.ChamberOpacity, GunFXSettings.ChamberRise, GunFXSettings.ChamberDrift); } if (num2 > 0 && (Object)(object)_barrel != (Object)null && (Object)(object)firePointTransform != (Object)null) { Emit(_barrel, firePointTransform.position, firePointTransform.forward, num2, GunFXSettings.BarrelSize, GunFXSettings.BarrelLifetime, GunFXSettings.BarrelOpacity, GunFXSettings.BarrelPush, GunFXSettings.ChamberDrift); } } private static void Emit(ParticleSystem ps, Vector3 pos, Vector3 dir, int count, float size, float life, float opacity, float rise, float drift) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) if (count > 0) { float gray = GunFXSettings.Gray; Color val = default(Color); ((Color)(ref val))..ctor(gray, gray, gray, opacity); for (int i = 0; i < count; i++) { Vector3 val2 = Random.insideUnitSphere * drift; val2.y *= 0.3f; EmitParams val3 = default(EmitParams); ((EmitParams)(ref val3)).position = pos + Random.insideUnitSphere * 0.008f; ((EmitParams)(ref val3)).velocity = dir * (rise * Random.Range(0.8f, 1.2f)) + val2; ((EmitParams)(ref val3)).startSize = size * Random.Range(0.75f, 1.25f); ((EmitParams)(ref val3)).startLifetime = life * Random.Range(0.6f, 1.15f); ((EmitParams)(ref val3)).startColor = Color32.op_Implicit(val); ps.Emit(val3, 1); } } } private static void ApplyRecoil(Gun gun, Transform? fire) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) try { Rigidbody componentInParent = ((Component)gun).GetComponentInParent(); if (!((Object)(object)componentInParent == (Object)null) && !componentInParent.isKinematic) { object obj = (((Object)(object)fire != (Object)null) ? ((object)fire) : ((object)((Component)gun).transform)); Vector3 forward = ((Transform)obj).forward; Vector3 up = ((Transform)obj).up; Vector3 val = Random.insideUnitSphere * GunFXSettings.RecoilRandom; componentInParent.AddForce((-forward + val) * GunFXSettings.RecoilKick, (ForceMode)2); Vector3 val2 = Vector3.Cross(forward, up); Vector3 normalized = ((Vector3)(ref val2)).normalized; componentInParent.AddTorque(normalized * GunFXSettings.RecoilRise, (ForceMode)2); } } catch { } } private static void EnsureBuilt() { if ((Object)(object)_chamber == (Object)null) { _chamber = BuildSystem("[QuickGunFX] ChamberVapor"); } if ((Object)(object)_barrel == (Object)null) { _barrel = BuildSystem("[QuickGunFX] MuzzleVapor"); } if ((Object)(object)_impact == (Object)null) { _impact = BuildSystem("[QuickGunFX] ImpactSmoke"); } } private static ParticleSystem BuildSystem(string name) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Expected O, but got Unknown //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Expected O, but got Unknown //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Expected O, but got Unknown //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Expected O, but got Unknown //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Expected O, but got Unknown //IL_019e: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Expected O, but got Unknown //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01c9: Expected O, but got Unknown //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Expected O, but got Unknown //IL_01f6: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Expected O, but got Unknown GameObject val = new GameObject(name); Object.DontDestroyOnLoad((Object)(object)val); ParticleSystem obj = val.AddComponent(); MainModule main = obj.main; main.loop = true; main.playOnAwake = false; main.maxParticles = 800; main.simulationSpace = (ParticleSystemSimulationSpace)1; main.startSpeed = new MinMaxCurve(0f); main.startSize = new MinMaxCurve(0.03f); main.startLifetime = new MinMaxCurve(0.6f); main.gravityModifier = MinMaxCurve.op_Implicit(0f); main.startRotation = new MinMaxCurve(0f, (float)Math.PI * 2f); EmissionModule emission = obj.emission; emission.enabled = true; emission.rateOverTime = MinMaxCurve.op_Implicit(0f); ColorOverLifetimeModule colorOverLifetime = obj.colorOverLifetime; colorOverLifetime.enabled = true; Gradient val2 = new Gradient(); val2.SetKeys(new Il2CppStructArray(2L) { [0] = new GradientColorKey(Color.white, 0f), [1] = new GradientColorKey(Color.white, 1f) }, new Il2CppStructArray(3L) { [0] = new GradientAlphaKey(0f, 0f), [1] = new GradientAlphaKey(1f, 0.25f), [2] = new GradientAlphaKey(0f, 1f) }); colorOverLifetime.color = new MinMaxGradient(val2); SizeOverLifetimeModule sizeOverLifetime = obj.sizeOverLifetime; sizeOverLifetime.enabled = true; AnimationCurve val3 = new AnimationCurve(); val3.AddKey(0f, 0.7f); val3.AddKey(0.3f, 1f); val3.AddKey(1f, 1.6f); sizeOverLifetime.size = new MinMaxCurve(1f, val3); RotationOverLifetimeModule rotationOverLifetime = obj.rotationOverLifetime; rotationOverLifetime.enabled = true; rotationOverLifetime.z = new MinMaxCurve(-0.6f, 0.6f); NoiseModule noise = obj.noise; noise.enabled = true; noise.strength = new MinMaxCurve(0.04f); noise.frequency = 0.8f; noise.scrollSpeed = new MinMaxCurve(0.25f); ParticleSystemRenderer component = val.GetComponent(); if ((Object)(object)component != (Object)null) { ((Renderer)component).material = SmokeMaterial(); component.renderMode = (ParticleSystemRenderMode)0; component.sortMode = (ParticleSystemSortMode)1; ((Renderer)component).shadowCastingMode = (ShadowCastingMode)0; ((Renderer)component).receiveShadows = false; } obj.Play(); return obj; } private static Material SmokeMaterial() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown if ((Object)(object)_mat != (Object)null) { return _mat; } _mat = new Material(Shader.Find("Sprites/Default")); _mat.mainTexture = (Texture)(object)SmokeTexture(); return _mat; } private static Texture2D SmokeTexture() { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown //IL_00ec: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_tex != (Object)null) { return _tex; } Texture2D val = new Texture2D(128, 128, (TextureFormat)4, false) { wrapMode = (TextureWrapMode)1 }; float num = Random.value * 100f; float num2 = Random.value * 100f; for (int i = 0; i < 128; i++) { for (int j = 0; j < 128; j++) { float num3 = ((float)j + 0.5f) / 128f - 0.5f; float num4 = ((float)i + 0.5f) / 128f - 0.5f; float num5 = Mathf.Sqrt(num3 * num3 + num4 * num4) * 2f; float num6 = Mathf.Clamp01(1f - num5); num6 = num6 * num6 * num6; float num7 = 0.85f + 0.15f * Mathf.PerlinNoise((float)j * 0.03f + num, (float)i * 0.03f + num2); val.SetPixel(j, i, new Color(1f, 1f, 1f, num6 * num7)); } } val.Apply(); _tex = val; return val; } } public class GunFXMod : MelonMod { public override void OnInitializeMelon() { GunFXSettings.Initialize(); QuickModsTheme.Initialize(); SetupMenu(); ((MelonBase)this).LoggerInstance.Msg("QuickGunFX loaded!"); } public override void OnUpdate() { GunFX.Update(); } private static Page GetOrCreateQuickModsPage() { //IL_0033: Unknown result type (might be due to invalid IL or missing references) object? data = AppDomain.CurrentDomain.GetData("QuickMods.RootPage"); Page val = (Page)((data is Page) ? data : null); if (val != null) { return val; } Page val2 = Page.Root.CreatePage("Quick Mods", new Color(0.35f, 0.27f, 0.9f), 0, true); AppDomain.CurrentDomain.SetData("QuickMods.RootPage", val2); return val2; } private static void SetupMenu() { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_01fe: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_0245: Unknown result type (might be due to invalid IL or missing references) //IL_0289: Unknown result type (might be due to invalid IL or missing references) //IL_02cd: Unknown result type (might be due to invalid IL or missing references) //IL_0311: Unknown result type (might be due to invalid IL or missing references) //IL_0355: Unknown result type (might be due to invalid IL or missing references) //IL_0399: Unknown result type (might be due to invalid IL or missing references) //IL_03dd: Unknown result type (might be due to invalid IL or missing references) //IL_0421: Unknown result type (might be due to invalid IL or missing references) //IL_0474: Unknown result type (might be due to invalid IL or missing references) //IL_04c7: Unknown result type (might be due to invalid IL or missing references) //IL_0519: Unknown result type (might be due to invalid IL or missing references) //IL_056c: Unknown result type (might be due to invalid IL or missing references) //IL_057e: Unknown result type (might be due to invalid IL or missing references) //IL_05b3: Unknown result type (might be due to invalid IL or missing references) //IL_05f7: Unknown result type (might be due to invalid IL or missing references) //IL_063b: Unknown result type (might be due to invalid IL or missing references) //IL_067f: Unknown result type (might be due to invalid IL or missing references) //IL_06c3: Unknown result type (might be due to invalid IL or missing references) //IL_0706: Unknown result type (might be due to invalid IL or missing references) //IL_0759: Unknown result type (might be due to invalid IL or missing references) //IL_076b: Unknown result type (might be due to invalid IL or missing references) //IL_07a0: Unknown result type (might be due to invalid IL or missing references) //IL_07e4: Unknown result type (might be due to invalid IL or missing references) //IL_0828: Unknown result type (might be due to invalid IL or missing references) //IL_086c: Unknown result type (might be due to invalid IL or missing references) //IL_08b0: Unknown result type (might be due to invalid IL or missing references) //IL_08f4: Unknown result type (might be due to invalid IL or missing references) //IL_0937: Unknown result type (might be due to invalid IL or missing references) //IL_0989: Unknown result type (might be due to invalid IL or missing references) //IL_099b: Unknown result type (might be due to invalid IL or missing references) //IL_09d0: Unknown result type (might be due to invalid IL or missing references) //IL_0a14: Unknown result type (might be due to invalid IL or missing references) //IL_0a57: Unknown result type (might be due to invalid IL or missing references) Page orCreateQuickModsPage = GetOrCreateQuickModsPage(); QuickModsTheme.BuildMenu(orCreateQuickModsPage); Page obj = orCreateQuickModsPage.CreatePage("QuickGunFX", new Color(0.82f, 0.82f, 0.88f), 0, true); obj.CreateBool("Enabled", Color.white, GunFXSettings.Enabled, (Action)delegate(bool v) { GunFXSettings.Enabled = v; }); obj.CreateFloat("Delay (s)", Color.white, GunFXSettings.Delay, 0.02f, 0f, 0.5f, (Action)delegate(float v) { GunFXSettings.Delay = v; }); obj.CreateFloat("Buildup / Shot", Color.white, GunFXSettings.Buildup, 0.02f, 0.02f, 1f, (Action)delegate(float v) { GunFXSettings.Buildup = v; }); obj.CreateFloat("Fade / Sec", Color.white, GunFXSettings.Fade, 0.1f, 0.1f, 6f, (Action)delegate(float v) { GunFXSettings.Fade = v; }); obj.CreateFloat("Repeat Delay (s)", Color.white, GunFXSettings.RepeatDelay, 0.02f, 0.02f, 1f, (Action)delegate(float v) { GunFXSettings.RepeatDelay = v; }); obj.CreateBool("Repeat Buildup", Color.white, GunFXSettings.RepeatBuildup, (Action)delegate(bool v) { GunFXSettings.RepeatBuildup = v; }); obj.CreateBool("Debug Logging", new Color(0.6f, 0.6f, 0.6f), GunFXSettings.DebugLog, (Action)delegate(bool v) { GunFXSettings.DebugLog = v; }); Page obj2 = obj.CreatePage("Chamber Vapor", new Color(0.75f, 0.78f, 0.85f), 0, true); obj2.CreateBool("Enabled", Color.white, GunFXSettings.ChamberEnabled, (Action)delegate(bool v) { GunFXSettings.ChamberEnabled = v; }); obj2.CreateFloat("Amount / Shot (max)", Color.white, GunFXSettings.ChamberAmount, 1f, 0f, 20f, (Action)delegate(float v) { GunFXSettings.ChamberAmount = v; }); obj2.CreateFloat("Size", Color.white, GunFXSettings.ChamberSize, 0.005f, 0.01f, 0.15f, (Action)delegate(float v) { GunFXSettings.ChamberSize = v; }); obj2.CreateFloat("Lifetime (s)", Color.white, GunFXSettings.ChamberLifetime, 0.05f, 0.1f, 2f, (Action)delegate(float v) { GunFXSettings.ChamberLifetime = v; }); obj2.CreateFloat("Opacity", Color.white, GunFXSettings.ChamberOpacity, 0.02f, 0f, 1f, (Action)delegate(float v) { GunFXSettings.ChamberOpacity = v; }); obj2.CreateFloat("Rise Speed", Color.white, GunFXSettings.ChamberRise, 0.05f, 0f, 3f, (Action)delegate(float v) { GunFXSettings.ChamberRise = v; }); obj2.CreateFloat("Drift", Color.white, GunFXSettings.ChamberDrift, 0.02f, 0f, 0.6f, (Action)delegate(float v) { GunFXSettings.ChamberDrift = v; }); obj2.CreateFloat("Repeat x", Color.white, GunFXSettings.ChamberRepeat, 1f, 0f, 50f, (Action)delegate(float v) { GunFXSettings.ChamberRepeat = v; }); obj2.CreateFloat("Gray (1=white)", Color.white, GunFXSettings.Gray, 0.02f, 0f, 1f, (Action)delegate(float v) { GunFXSettings.Gray = v; }); obj2.CreateFloat("Dir Side (+R/-L)", new Color(1f, 0.8f, 0.3f), GunFXSettings.ChamberDirSide, 0.1f, -1f, 1f, (Action)delegate(float v) { GunFXSettings.ChamberDirSide = v; }); obj2.CreateFloat("Dir Up", new Color(1f, 0.8f, 0.3f), GunFXSettings.ChamberDirUp, 0.1f, -1f, 1f, (Action)delegate(float v) { GunFXSettings.ChamberDirUp = v; }); obj2.CreateFloat("Dir Forward", new Color(1f, 0.8f, 0.3f), GunFXSettings.ChamberDirForward, 0.1f, -1f, 1f, (Action)delegate(float v) { GunFXSettings.ChamberDirForward = v; }); Page obj3 = obj.CreatePage("Muzzle Vapor (optional)", new Color(0.7f, 0.7f, 0.75f), 0, true); obj3.CreateBool("Enabled", Color.white, GunFXSettings.BarrelEnabled, (Action)delegate(bool v) { GunFXSettings.BarrelEnabled = v; }); obj3.CreateFloat("Amount / Shot (max)", Color.white, GunFXSettings.BarrelAmount, 1f, 0f, 20f, (Action)delegate(float v) { GunFXSettings.BarrelAmount = v; }); obj3.CreateFloat("Size", Color.white, GunFXSettings.BarrelSize, 0.005f, 0.01f, 0.15f, (Action)delegate(float v) { GunFXSettings.BarrelSize = v; }); obj3.CreateFloat("Lifetime (s)", Color.white, GunFXSettings.BarrelLifetime, 0.05f, 0.1f, 2f, (Action)delegate(float v) { GunFXSettings.BarrelLifetime = v; }); obj3.CreateFloat("Opacity", Color.white, GunFXSettings.BarrelOpacity, 0.02f, 0f, 1f, (Action)delegate(float v) { GunFXSettings.BarrelOpacity = v; }); obj3.CreateFloat("Forward Push", Color.white, GunFXSettings.BarrelPush, 0.05f, 0f, 2f, (Action)delegate(float v) { GunFXSettings.BarrelPush = v; }); obj3.CreateFloat("Repeat x", Color.white, GunFXSettings.BarrelRepeat, 1f, 0f, 50f, (Action)delegate(float v) { GunFXSettings.BarrelRepeat = v; }); Page obj4 = obj.CreatePage("Bullet-Hole Smoke", new Color(0.8f, 0.75f, 0.7f), 0, true); obj4.CreateBool("Enabled", Color.white, GunFXSettings.ImpactEnabled, (Action)delegate(bool v) { GunFXSettings.ImpactEnabled = v; }); obj4.CreateFloat("Amount / Hit", Color.white, GunFXSettings.ImpactAmount, 1f, 0f, 20f, (Action)delegate(float v) { GunFXSettings.ImpactAmount = v; }); obj4.CreateFloat("Size", Color.white, GunFXSettings.ImpactSize, 0.005f, 0.01f, 0.15f, (Action)delegate(float v) { GunFXSettings.ImpactSize = v; }); obj4.CreateFloat("Lifetime (s)", Color.white, GunFXSettings.ImpactLifetime, 0.05f, 0.1f, 2f, (Action)delegate(float v) { GunFXSettings.ImpactLifetime = v; }); obj4.CreateFloat("Opacity", Color.white, GunFXSettings.ImpactOpacity, 0.02f, 0f, 1f, (Action)delegate(float v) { GunFXSettings.ImpactOpacity = v; }); obj4.CreateFloat("Rise Speed", Color.white, GunFXSettings.ImpactRise, 0.05f, 0f, 3f, (Action)delegate(float v) { GunFXSettings.ImpactRise = v; }); obj4.CreateFloat("Range (m)", Color.white, GunFXSettings.ImpactRange, 10f, 10f, 300f, (Action)delegate(float v) { GunFXSettings.ImpactRange = v; }); obj4.CreateFloat("Repeat x", Color.white, GunFXSettings.ImpactRepeat, 1f, 0f, 50f, (Action)delegate(float v) { GunFXSettings.ImpactRepeat = v; }); Page obj5 = obj.CreatePage("Recoil", new Color(1f, 0.4f, 0.2f), 0, true); obj5.CreateBool("Enabled", Color.white, GunFXSettings.RecoilEnabled, (Action)delegate(bool v) { GunFXSettings.RecoilEnabled = v; }); obj5.CreateFloat("Kick", Color.white, GunFXSettings.RecoilKick, 0.1f, 0f, 10f, (Action)delegate(float v) { GunFXSettings.RecoilKick = v; }); obj5.CreateFloat("Muzzle Rise", Color.white, GunFXSettings.RecoilRise, 0.1f, 0f, 15f, (Action)delegate(float v) { GunFXSettings.RecoilRise = v; }); obj5.CreateFloat("Randomness", Color.white, GunFXSettings.RecoilRandom, 0.02f, 0f, 1f, (Action)delegate(float v) { GunFXSettings.RecoilRandom = v; }); } } public static class GunFXSettings { private const int ConfigVersion = 9; private const bool DEF_Enabled = true; private const bool DEF_DebugLog = false; private const float DEF_Delay = 0.05f; private const float DEF_Buildup = 0.34f; private const float DEF_Fade = 1.6f; private const float DEF_RepeatDelay = 0.12f; private const bool DEF_RepeatBuildup = false; private const bool DEF_ChamberEnabled = true; private const float DEF_ChamberAmount = 6f; private const float DEF_ChamberSize = 0.03f; private const float DEF_ChamberLifetime = 0.6f; private const float DEF_ChamberOpacity = 0.25f; private const float DEF_ChamberRise = 0.6f; private const float DEF_ChamberDrift = 0.12f; private const float DEF_ChamberRepeat = 0f; private const float DEF_ChamberDirSide = 0f; private const float DEF_ChamberDirUp = 1f; private const float DEF_ChamberDirForward = 0f; private const float DEF_Gray = 0.85f; private const bool DEF_BarrelEnabled = false; private const float DEF_BarrelAmount = 5f; private const float DEF_BarrelSize = 0.04f; private const float DEF_BarrelLifetime = 0.7f; private const float DEF_BarrelOpacity = 0.25f; private const float DEF_BarrelPush = 0.5f; private const float DEF_BarrelRepeat = 0f; private const bool DEF_ImpactEnabled = true; private const float DEF_ImpactAmount = 5f; private const float DEF_ImpactSize = 0.025f; private const float DEF_ImpactLifetime = 0.7f; private const float DEF_ImpactOpacity = 0.3f; private const float DEF_ImpactRise = 0.45f; private const float DEF_ImpactRange = 120f; private const float DEF_ImpactRepeat = 0f; private const bool DEF_RecoilEnabled = true; private const float DEF_RecoilKick = 2f; private const float DEF_RecoilRise = 2.5f; private const float DEF_RecoilRandom = 0.2f; private static MelonPreferences_Category _cat; private static MelonPreferences_Entry _ver; private static MelonPreferences_Entry _enabled; private static MelonPreferences_Entry _debugLog; private static MelonPreferences_Entry _delay; private static MelonPreferences_Entry _buildup; private static MelonPreferences_Entry _fade; private static MelonPreferences_Entry _repeatDelay; private static MelonPreferences_Entry _repeatBuildup; private static MelonPreferences_Entry _chamberEnabled; private static MelonPreferences_Entry _chamberAmount; private static MelonPreferences_Entry _chamberSize; private static MelonPreferences_Entry _chamberLifetime; private static MelonPreferences_Entry _chamberOpacity; private static MelonPreferences_Entry _chamberRise; private static MelonPreferences_Entry _chamberDrift; private static MelonPreferences_Entry _chamberRepeat; private static MelonPreferences_Entry _chamberDirSide; private static MelonPreferences_Entry _chamberDirUp; private static MelonPreferences_Entry _chamberDirForward; private static MelonPreferences_Entry _gray; private static MelonPreferences_Entry _barrelEnabled; private static MelonPreferences_Entry _barrelAmount; private static MelonPreferences_Entry _barrelSize; private static MelonPreferences_Entry _barrelLifetime; private static MelonPreferences_Entry _barrelOpacity; private static MelonPreferences_Entry _barrelPush; private static MelonPreferences_Entry _barrelRepeat; private static MelonPreferences_Entry _impactEnabled; private static MelonPreferences_Entry _impactAmount; private static MelonPreferences_Entry _impactSize; private static MelonPreferences_Entry _impactLifetime; private static MelonPreferences_Entry _impactOpacity; private static MelonPreferences_Entry _impactRise; private static MelonPreferences_Entry _impactRange; private static MelonPreferences_Entry _impactRepeat; private static MelonPreferences_Entry _recoilEnabled; private static MelonPreferences_Entry _recoilKick; private static MelonPreferences_Entry _recoilRise; private static MelonPreferences_Entry _recoilRandom; public static bool Enabled { get { return _enabled.Value; } set { _enabled.Value = value; Save(); } } public static bool DebugLog { get { return _debugLog.Value; } set { _debugLog.Value = value; Save(); } } public static float Delay { get { return _delay.Value; } set { _delay.Value = value; Save(); } } public static float Buildup { get { return _buildup.Value; } set { _buildup.Value = value; Save(); } } public static float Fade { get { return _fade.Value; } set { _fade.Value = value; Save(); } } public static float RepeatDelay { get { return _repeatDelay.Value; } set { _repeatDelay.Value = value; Save(); } } public static bool RepeatBuildup { get { return _repeatBuildup.Value; } set { _repeatBuildup.Value = value; Save(); } } public static bool ChamberEnabled { get { return _chamberEnabled.Value; } set { _chamberEnabled.Value = value; Save(); } } public static float ChamberAmount { get { return _chamberAmount.Value; } set { _chamberAmount.Value = value; Save(); } } public static float ChamberSize { get { return _chamberSize.Value; } set { _chamberSize.Value = value; Save(); } } public static float ChamberLifetime { get { return _chamberLifetime.Value; } set { _chamberLifetime.Value = value; Save(); } } public static float ChamberOpacity { get { return _chamberOpacity.Value; } set { _chamberOpacity.Value = value; Save(); } } public static float ChamberRise { get { return _chamberRise.Value; } set { _chamberRise.Value = value; Save(); } } public static float ChamberDrift { get { return _chamberDrift.Value; } set { _chamberDrift.Value = value; Save(); } } public static float ChamberRepeat { get { return _chamberRepeat.Value; } set { _chamberRepeat.Value = value; Save(); } } public static float ChamberDirSide { get { return _chamberDirSide.Value; } set { _chamberDirSide.Value = value; Save(); } } public static float ChamberDirUp { get { return _chamberDirUp.Value; } set { _chamberDirUp.Value = value; Save(); } } public static float ChamberDirForward { get { return _chamberDirForward.Value; } set { _chamberDirForward.Value = value; Save(); } } public static float Gray { get { return _gray.Value; } set { _gray.Value = value; Save(); } } public static bool BarrelEnabled { get { return _barrelEnabled.Value; } set { _barrelEnabled.Value = value; Save(); } } public static float BarrelAmount { get { return _barrelAmount.Value; } set { _barrelAmount.Value = value; Save(); } } public static float BarrelSize { get { return _barrelSize.Value; } set { _barrelSize.Value = value; Save(); } } public static float BarrelLifetime { get { return _barrelLifetime.Value; } set { _barrelLifetime.Value = value; Save(); } } public static float BarrelOpacity { get { return _barrelOpacity.Value; } set { _barrelOpacity.Value = value; Save(); } } public static float BarrelPush { get { return _barrelPush.Value; } set { _barrelPush.Value = value; Save(); } } public static float BarrelRepeat { get { return _barrelRepeat.Value; } set { _barrelRepeat.Value = value; Save(); } } public static bool ImpactEnabled { get { return _impactEnabled.Value; } set { _impactEnabled.Value = value; Save(); } } public static float ImpactAmount { get { return _impactAmount.Value; } set { _impactAmount.Value = value; Save(); } } public static float ImpactSize { get { return _impactSize.Value; } set { _impactSize.Value = value; Save(); } } public static float ImpactLifetime { get { return _impactLifetime.Value; } set { _impactLifetime.Value = value; Save(); } } public static float ImpactOpacity { get { return _impactOpacity.Value; } set { _impactOpacity.Value = value; Save(); } } public static float ImpactRise { get { return _impactRise.Value; } set { _impactRise.Value = value; Save(); } } public static float ImpactRange { get { return _impactRange.Value; } set { _impactRange.Value = value; Save(); } } public static float ImpactRepeat { get { return _impactRepeat.Value; } set { _impactRepeat.Value = value; Save(); } } public static bool RecoilEnabled { get { return _recoilEnabled.Value; } set { _recoilEnabled.Value = value; Save(); } } public static float RecoilKick { get { return _recoilKick.Value; } set { _recoilKick.Value = value; Save(); } } public static float RecoilRise { get { return _recoilRise.Value; } set { _recoilRise.Value = value; Save(); } } public static float RecoilRandom { get { return _recoilRandom.Value; } set { _recoilRandom.Value = value; Save(); } } public static void Initialize() { _cat = MelonPreferences.CreateCategory("QuickGunFX"); _ver = _cat.CreateEntry("ConfigVersion", 0, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _enabled = _cat.CreateEntry("Enabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _debugLog = _cat.CreateEntry("DebugLog", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _delay = _cat.CreateEntry("Delay", 0.05f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _buildup = _cat.CreateEntry("Buildup", 0.34f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _fade = _cat.CreateEntry("Fade", 1.6f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _repeatDelay = _cat.CreateEntry("RepeatDelay", 0.12f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _repeatBuildup = _cat.CreateEntry("RepeatBuildup", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _chamberEnabled = _cat.CreateEntry("ChamberEnabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _chamberAmount = _cat.CreateEntry("ChamberAmount", 6f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _chamberSize = _cat.CreateEntry("ChamberSize", 0.03f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _chamberLifetime = _cat.CreateEntry("ChamberLifetime", 0.6f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _chamberOpacity = _cat.CreateEntry("ChamberOpacity", 0.25f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _chamberRise = _cat.CreateEntry("ChamberRise", 0.6f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _chamberDrift = _cat.CreateEntry("ChamberDrift", 0.12f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _chamberRepeat = _cat.CreateEntry("ChamberRepeat", 0f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _chamberDirSide = _cat.CreateEntry("ChamberDirSide", 0f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _chamberDirUp = _cat.CreateEntry("ChamberDirUp", 1f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _chamberDirForward = _cat.CreateEntry("ChamberDirForward", 0f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _gray = _cat.CreateEntry("Gray", 0.85f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _barrelEnabled = _cat.CreateEntry("BarrelEnabled", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _barrelAmount = _cat.CreateEntry("BarrelAmount", 5f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _barrelSize = _cat.CreateEntry("BarrelSize", 0.04f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _barrelLifetime = _cat.CreateEntry("BarrelLifetime", 0.7f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _barrelOpacity = _cat.CreateEntry("BarrelOpacity", 0.25f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _barrelPush = _cat.CreateEntry("BarrelPush", 0.5f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _barrelRepeat = _cat.CreateEntry("BarrelRepeat", 0f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _impactEnabled = _cat.CreateEntry("ImpactEnabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _impactAmount = _cat.CreateEntry("ImpactAmount", 5f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _impactSize = _cat.CreateEntry("ImpactSize", 0.025f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _impactLifetime = _cat.CreateEntry("ImpactLifetime", 0.7f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _impactOpacity = _cat.CreateEntry("ImpactOpacity", 0.3f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _impactRise = _cat.CreateEntry("ImpactRise", 0.45f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _impactRange = _cat.CreateEntry("ImpactRange", 120f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _impactRepeat = _cat.CreateEntry("ImpactRepeat", 0f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _recoilEnabled = _cat.CreateEntry("RecoilEnabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _recoilKick = _cat.CreateEntry("RecoilKick", 2f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _recoilRise = _cat.CreateEntry("RecoilRise", 2.5f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _recoilRandom = _cat.CreateEntry("RecoilRandom", 0.2f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); if (_ver.Value < 9) { _debugLog.Value = false; _delay.Value = 0.05f; _buildup.Value = 0.34f; _fade.Value = 1.6f; _repeatDelay.Value = 0.12f; _repeatBuildup.Value = false; _chamberEnabled.Value = true; _chamberAmount.Value = 6f; _chamberSize.Value = 0.03f; _chamberLifetime.Value = 0.6f; _chamberOpacity.Value = 0.25f; _chamberRise.Value = 0.6f; _chamberDrift.Value = 0.12f; _chamberRepeat.Value = 0f; _chamberDirSide.Value = 0f; _chamberDirUp.Value = 1f; _chamberDirForward.Value = 0f; _gray.Value = 0.85f; _barrelEnabled.Value = false; _barrelAmount.Value = 5f; _barrelSize.Value = 0.04f; _barrelLifetime.Value = 0.7f; _barrelOpacity.Value = 0.25f; _barrelPush.Value = 0.5f; _barrelRepeat.Value = 0f; _impactEnabled.Value = true; _impactAmount.Value = 5f; _impactSize.Value = 0.025f; _impactLifetime.Value = 0.7f; _impactOpacity.Value = 0.3f; _impactRise.Value = 0.45f; _impactRange.Value = 120f; _impactRepeat.Value = 0f; _recoilKick.Value = 2f; _recoilRise.Value = 2.5f; _recoilRandom.Value = 0.2f; _ver.Value = 9; _cat.SaveToFile(false); } } private static void Save() { _cat.SaveToFile(false); } } public static class QuickModsTheme { private const string ShareKey = "QuickMods.GlobalTheme"; private const string MenuKey = "QuickMods.GlobalThemeMenuBuilt"; private static MelonPreferences_Category _cat; private static MelonPreferences_Entry _useGlobal; private static MelonPreferences_Entry _hue; private static MelonPreferences_Entry _sat; private static MelonPreferences_Entry _forceQB; private static MelonPreferences_Entry _rainbow; private static MelonPreferences_Entry _rainbowSpeed; public static bool UseGlobalTheme { get { return _useGlobal.Value; } set { _useGlobal.Value = value; Save(); } } public static float Hue { get { return _hue.Value; } set { _hue.Value = value; Save(); } } public static float Saturation { get { return _sat.Value; } set { _sat.Value = value; Save(); } } public static bool ForceQuickBeatsSync { get { return _forceQB.Value; } set { _forceQB.Value = value; Save(); } } public static Color GlobalColor => Color.HSVToRGB(Hue / 360f, Saturation, 1f); public static bool RainbowMode { get { return _rainbow.Value; } set { _rainbow.Value = value; Save(); } } public static float RainbowSpeed { get { return _rainbowSpeed.Value; } set { _rainbowSpeed.Value = value; Save(); } } public static Color RainbowColor => Color.HSVToRGB(Time.time * RainbowSpeed % 1f, 0.85f, 1f); public static Color ResolveAccent(Color modDefault, bool modThemeToSong, Func qbGetter) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) if (RainbowMode) { return RainbowColor; } if (ForceQuickBeatsSync) { Color? val = SafeGet(qbGetter); if (val.HasValue) { return val.Value; } } if (UseGlobalTheme) { return GlobalColor; } if (modThemeToSong) { Color? val2 = SafeGet(qbGetter); if (val2.HasValue) { return val2.Value; } } return modDefault; } private static Color? SafeGet(Func getter) { try { return getter?.Invoke(); } catch { return null; } } public static void Initialize() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown if (AppDomain.CurrentDomain.GetData("QuickMods.GlobalTheme") is object[] array) { _cat = (MelonPreferences_Category)array[0]; _useGlobal = (MelonPreferences_Entry)array[1]; _hue = (MelonPreferences_Entry)array[2]; _sat = (MelonPreferences_Entry)array[3]; _forceQB = (MelonPreferences_Entry)array[4]; _rainbow = (MelonPreferences_Entry)array[5]; _rainbowSpeed = (MelonPreferences_Entry)array[6]; return; } _cat = MelonPreferences.CreateCategory("QuickModsTheme"); _useGlobal = _cat.CreateEntry("UseGlobalTheme", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _hue = _cat.CreateEntry("Hue", 200f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _sat = _cat.CreateEntry("Saturation", 0.72f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _forceQB = _cat.CreateEntry("ForceQuickBeatsSync", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _rainbow = _cat.CreateEntry("RainbowMode", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); _rainbowSpeed = _cat.CreateEntry("RainbowSpeed", 0.15f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); AppDomain.CurrentDomain.SetData("QuickMods.GlobalTheme", new object[7] { _cat, _useGlobal, _hue, _sat, _forceQB, _rainbow, _rainbowSpeed }); } public static void BuildMenu(Page rootPage) { //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) object data = AppDomain.CurrentDomain.GetData("QuickMods.GlobalThemeMenuBuilt"); bool flag = default(bool); int num; if (data is bool) { flag = (bool)data; num = 1; } else { num = 0; } if (((uint)num & (flag ? 1u : 0u)) == 0) { AppDomain.CurrentDomain.SetData("QuickMods.GlobalThemeMenuBuilt", true); Page obj = rootPage.CreatePage("Global Theme", new Color(1f, 0.55f, 0.85f), 0, true); obj.CreateBool("Use Global Theme", Color.white, UseGlobalTheme, (Action)delegate(bool v) { UseGlobalTheme = v; }); obj.CreateFloat("Hue", Color.white, Hue, 5f, 0f, 360f, (Action)delegate(float v) { Hue = v; }); obj.CreateFloat("Saturation", Color.white, Saturation, 0.05f, 0.1f, 1f, (Action)delegate(float v) { Saturation = v; }); obj.CreateBool("Force QuickBeats (All Mods)", Color.magenta, ForceQuickBeatsSync, (Action)delegate(bool v) { ForceQuickBeatsSync = v; }); obj.CreateBool("Rainbow Mode (All Mods)", Color.red, RainbowMode, (Action)delegate(bool v) { RainbowMode = v; }); obj.CreateFloat("Rainbow Speed", Color.red, RainbowSpeed, 0.02f, 0.02f, 1f, (Action)delegate(float v) { RainbowSpeed = v; }); } } private static void Save() { _cat.SaveToFile(false); } } }