Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of OkayZoomer v1.0.0
plugins/OkayZoomer/OkayZoomer.dll
Decompiled 10 hours agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LethalConfig; using LethalConfig.ConfigItems; using LethalConfig.ConfigItems.Options; using Microsoft.CodeAnalysis; using OkayZoomer.Compats; using OkayZoomer.Configs; using OkayZoomer.NetcodePatcher; using TMPro; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("BepInEx")] [assembly: IgnoresAccessChecksTo("com.olegknyazev.softmask")] [assembly: IgnoresAccessChecksTo("Newtonsoft.Json")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")] [assembly: IgnoresAccessChecksTo("UnityEngine")] [assembly: IgnoresAccessChecksTo("UnityEngine.UI")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("s1ckboy")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("Copyright © 2026 s1ckboy")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("OkayZoomer")] [assembly: AssemblyTitle("OkayZoomer")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: NetcodePatchedAssembly] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace OkayZoomer { internal class Loggers { private static void Log(LogLevel logLevel, object data) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) Plugins.Logger.Log(logLevel, data); } internal static void Info(object data) { Log((LogLevel)16, data); } internal static void Debug(object data) { Log((LogLevel)32, data); } internal static void Message(object data) { Log((LogLevel)8, data); } internal static void Warning(object data) { Log((LogLevel)4, data); } internal static void Error(object data) { Log((LogLevel)2, data); } internal static void Fatal(object data) { Log((LogLevel)1, data); } } public class PlayerScreenZoomEffect : MonoBehaviour { private struct HudGraphicState { public Graphic Graphic; public bool OriginalEnabled; public HudGraphicState(Graphic graphic) { Graphic = graphic; OriginalEnabled = (Object)(object)graphic != (Object)null && ((Behaviour)graphic).enabled; } } private struct HudCanvasGroupState { public CanvasGroup CanvasGroup; public float OriginalAlpha; public bool OriginalInteractable; public bool OriginalBlocksRaycasts; public HudCanvasGroupState(CanvasGroup canvasGroup) { CanvasGroup = canvasGroup; OriginalAlpha = (((Object)(object)canvasGroup != (Object)null) ? canvasGroup.alpha : 1f); OriginalInteractable = (Object)(object)canvasGroup != (Object)null && canvasGroup.interactable; OriginalBlocksRaycasts = (Object)(object)canvasGroup != (Object)null && canvasGroup.blocksRaycasts; } } private const string ZoomShaderProperty = "_Zoom"; private const string MaxZoomShaderProperty = "_MaxZoom"; private const string DeployShaderProperty = "_Deploy"; private const string HudRootPath = "Systems/UI"; private const string HudCanvasPath = "Systems/UI/Canvas"; private const float NightVisionLightIntensity = 1200f; private const float NightVisionLightRange = 70f; private static readonly Color NightVisionLightColor = new Color(0.141f, 0.72f, 0f, 1f); private static readonly ZoomStyle[] StyleCycle = new ZoomStyle[10] { ZoomStyle.None, ZoomStyle.Clean, ZoomStyle.Binocular, ZoomStyle.Camcorder, ZoomStyle.InLove, ZoomStyle.GreedCurse, ZoomStyle.Melodrama, ZoomStyle.SpiderEyes, ZoomStyle.FlyEyes, ZoomStyle.NightVision }; private RawImage playerScreen; private Material originalMaterial; private Material activeMaterialInstance; private ZoomStyle currentStyle = (ZoomStyle)(-1); private Camera gameplayCamera; private float normalFOV; private bool hasStoredNormalFOV; private bool wasZoomingOrTransitioning; private Light nightVisionLight; private bool hasStoredNightVisionLight; private bool nightVisionBoostActive; private bool originalNightVisionEnabled; private float originalNightVisionIntensity; private float originalNightVisionRange; private Color originalNightVisionColor; private float zoomAmount; private bool zoomActive; private bool toggleZoomActive; private bool previousToggleMode; private Keyboard keyboard; private Mouse mouse; private ZoomInput currentZoomKey; private bool validZoomKey; private QuickMenuManager quickMenuManager; private RectTransform styleTextRoot; private TextMeshProUGUI previousKeyText; private TextMeshProUGUI zoomKeyText; private TextMeshProUGUI nextKeyText; private TextMeshProUGUI previousArrowText; private TextMeshProUGUI styleNameText; private TextMeshProUGUI nextArrowText; private Material styleTextMaterialInstance; private HudGraphicState[] hudGraphicStates = Array.Empty<HudGraphicState>(); private HudCanvasGroupState[] hudCanvasGroupStates = Array.Empty<HudCanvasGroupState>(); private bool hudHidden; private void Awake() { playerScreen = ((Component)this).GetComponent<RawImage>(); if (!((Object)(object)playerScreen == (Object)null)) { originalMaterial = ((Graphic)playerScreen).material; keyboard = Keyboard.current; mouse = Mouse.current; previousToggleMode = Plugins.ConfigEntries.ToggleZoom.Value; UpdateZoomKey(); ApplyStyle(Plugins.ConfigEntries.ZoomStyle.Value); } } private void Start() { CreateStyleText(); UpdateStyleText(); } private void Update() { if ((Object)(object)playerScreen == (Object)null) { return; } if (keyboard == null) { keyboard = Keyboard.current; } if (mouse == null) { mouse = Mouse.current; } UpdateStyleText(); if (IsEscapeMenuOpen()) { ResetZoomForMenu(); SetStyleTextVisible(visible: false); return; } HashSet<ZoomStyle> blacklistedStyles = ParseStyleBlacklist(); HandleStyleSwitchInput(blacklistedStyles); ZoomStyle allowedStyle = GetAllowedStyle(Plugins.ConfigEntries.ZoomStyle.Value, blacklistedStyles, 1); if (allowedStyle != Plugins.ConfigEntries.ZoomStyle.Value) { Plugins.ConfigEntries.ZoomStyle.Value = allowedStyle; } if (allowedStyle != currentStyle) { if (zoomActive || zoomAmount > 0.001f) { RestartZoomAnimation(); } ApplyStyle(allowedStyle); UpdateStyleText(); } if (currentStyle == ZoomStyle.None) { ResetZoomCompletely(); return; } HandleZoomInput(); UpdateZoomAmount(); ApplyMaterialZoom(); UpdateNightVisionBoost(); bool flag = zoomActive || zoomAmount > 0.001f; bool flag2 = currentStyle != ZoomStyle.None && currentStyle != ZoomStyle.NightVision && flag; SetHudHidden(flag2); if (flag2) { ForceHudHiddenInstant(); } if ((Object)(object)activeMaterialInstance != (Object)null && (Object)(object)((Graphic)playerScreen).material != (Object)(object)activeMaterialInstance) { ((Graphic)playerScreen).material = activeMaterialInstance; } } private void LateUpdate() { if (currentStyle != ZoomStyle.None) { if (IsEscapeMenuOpen()) { ResetZoomForMenu(); SetStyleTextVisible(visible: false); } else { UpdateCameraReference(); ApplyCameraFOV(); } } } private void SetStyleTextVisible(bool visible) { if ((Object)(object)styleTextRoot != (Object)null) { ((Component)styleTextRoot).gameObject.SetActive(visible); } } private void CreateStyleText() { //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Expected O, but got Unknown //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_021c: Unknown result type (might be due to invalid IL or missing references) //IL_022b: Unknown result type (might be due to invalid IL or missing references) //IL_0246: Unknown result type (might be due to invalid IL or missing references) //IL_0255: Unknown result type (might be due to invalid IL or missing references) //IL_0270: Unknown result type (might be due to invalid IL or missing references) //IL_027f: Unknown result type (might be due to invalid IL or missing references) //IL_029a: Unknown result type (might be due to invalid IL or missing references) //IL_02a9: Unknown result type (might be due to invalid IL or missing references) //IL_02c4: Unknown result type (might be due to invalid IL or missing references) //IL_02d3: Unknown result type (might be due to invalid IL or missing references) //IL_02ee: Unknown result type (might be due to invalid IL or missing references) //IL_02fd: Unknown result type (might be due to invalid IL or missing references) HUDManager instance = HUDManager.Instance; if (!((Object)(object)instance == (Object)null) && !((Object)(object)instance.chatText == (Object)null)) { GameObject val = GameObject.Find("Systems/UI/Canvas"); if ((Object)(object)val == (Object)null) { Plugins.Logger.LogWarning((object)"OkayZoomer: Could not find HUD canvas path 'Systems/UI/Canvas'."); return; } GameObject val2 = new GameObject("OkayZoomerStyleTextRoot"); val2.transform.SetParent(val.transform, false); styleTextRoot = val2.AddComponent<RectTransform>(); styleTextRoot.anchorMin = new Vector2(1f, 0f); styleTextRoot.anchorMax = new Vector2(1f, 0f); styleTextRoot.pivot = new Vector2(1f, 0f); styleTextRoot.anchoredPosition = Vector2.zero; styleTextRoot.sizeDelta = new Vector2(260f, 42f); ((Transform)styleTextRoot).localScale = Vector3.one; styleTextMaterialInstance = Object.Instantiate<Material>(((TMP_Text)instance.chatText).fontMaterial); styleTextMaterialInstance.EnableKeyword("UNDERLAY_ON"); styleTextMaterialInstance.SetColor("_UnderlayColor", new Color(0f, 0f, 0f, 0.9f)); styleTextMaterialInstance.SetFloat("_UnderlayOffsetX", 1.1f); styleTextMaterialInstance.SetFloat("_UnderlayOffsetY", -1.1f); styleTextMaterialInstance.SetFloat("_UnderlaySoftness", 0.25f); previousKeyText = CreateStyleTextPart("PreviousKey", instance, 10f); zoomKeyText = CreateStyleTextPart("ZoomKey", instance, 10f); nextKeyText = CreateStyleTextPart("NextKey", instance, 10f); previousArrowText = CreateStyleTextPart("PreviousArrow", instance, 15f); styleNameText = CreateStyleTextPart("StyleName", instance, 13f); nextArrowText = CreateStyleTextPart("NextArrow", instance, 15f); SetTextRect(previousKeyText, new Vector2(-78f, 17f), new Vector2(68f, 14f)); SetTextRect(zoomKeyText, new Vector2(0f, 17f), new Vector2(68f, 14f)); SetTextRect(nextKeyText, new Vector2(78f, 17f), new Vector2(68f, 14f)); SetTextRect(previousArrowText, new Vector2(-78f, 1f), new Vector2(28f, 22f)); SetTextRect(styleNameText, new Vector2(0f, 1f), new Vector2(128f, 22f)); SetTextRect(nextArrowText, new Vector2(78f, 1f), new Vector2(28f, 22f)); val2.transform.SetAsLastSibling(); } } private TextMeshProUGUI CreateStyleTextPart(string name, HUDManager hud, float fontSize) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0057: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name); val.transform.SetParent((Transform)(object)styleTextRoot, false); TextMeshProUGUI val2 = val.AddComponent<TextMeshProUGUI>(); ((TMP_Text)val2).font = ((TMP_Text)hud.chatText).font; ((TMP_Text)val2).fontMaterial = styleTextMaterialInstance; ((TMP_Text)val2).fontSize = fontSize; ((TMP_Text)val2).richText = false; ((TMP_Text)val2).alignment = (TextAlignmentOptions)514; ((Graphic)val2).color = Color.white; ((TMP_Text)val2).enableWordWrapping = false; ((TMP_Text)val2).enableKerning = false; ((Graphic)val2).raycastTarget = false; ((TMP_Text)val2).overflowMode = (TextOverflowModes)3; return val2; } private void SetTextRect(TextMeshProUGUI text, Vector2 position, Vector2 size) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0047: 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_0055: Unknown result type (might be due to invalid IL or missing references) RectTransform rectTransform = ((TMP_Text)text).rectTransform; rectTransform.anchorMin = new Vector2(0.5f, 0.5f); rectTransform.anchorMax = new Vector2(0.5f, 0.5f); rectTransform.pivot = new Vector2(0.5f, 0.5f); rectTransform.anchoredPosition = position; rectTransform.sizeDelta = size; ((Transform)rectTransform).localScale = Vector3.one; } private void UpdateStyleText() { //IL_003f: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)styleTextRoot == (Object)null)) { styleTextRoot.anchoredPosition = new Vector2(-10f + Plugins.ConfigEntries.StyleTextPositionX.Value, 22f - Plugins.ConfigEntries.StyleTextPositionY.Value); bool value = Plugins.ConfigEntries.ShowStyleKeybindTexts.Value; ((Component)previousKeyText).gameObject.SetActive(value); ((Component)zoomKeyText).gameObject.SetActive(value); ((Component)nextKeyText).gameObject.SetActive(value); ((TMP_Text)previousKeyText).text = "[" + GetInputDisplayName(Plugins.ConfigEntries.PreviousStyleKey.Value) + "]"; ((TMP_Text)zoomKeyText).text = "[" + GetInputDisplayName(Plugins.ConfigEntries.ZoomKey.Value) + "]"; ((TMP_Text)nextKeyText).text = "[" + GetInputDisplayName(Plugins.ConfigEntries.NextStyleKey.Value) + "]"; ((TMP_Text)previousArrowText).text = "◄"; ((TMP_Text)styleNameText).text = GetStyleDisplayName(Plugins.ConfigEntries.ZoomStyle.Value); ((TMP_Text)nextArrowText).text = "►"; SetStyleTextVisible(!hudHidden && !IsEscapeMenuOpen()); if (((Component)styleTextRoot).gameObject.activeSelf) { ((Transform)styleTextRoot).SetAsLastSibling(); } } } private void HandleStyleSwitchInput(HashSet<ZoomStyle> blacklistedStyles) { bool flag = WasInputPressed(Plugins.ConfigEntries.PreviousStyleKey.Value); bool flag2 = WasInputPressed(Plugins.ConfigEntries.NextStyleKey.Value); if (flag != flag2) { CycleZoomStyle((!flag) ? 1 : (-1), blacklistedStyles); } } private void CycleZoomStyle(int direction, HashSet<ZoomStyle> blacklistedStyles) { int num = Array.IndexOf(StyleCycle, Plugins.ConfigEntries.ZoomStyle.Value); if (num < 0) { num = 0; } for (int i = 1; i <= StyleCycle.Length; i++) { int num2 = (num + direction * i + StyleCycle.Length) % StyleCycle.Length; ZoomStyle zoomStyle = StyleCycle[num2]; if (!blacklistedStyles.Contains(zoomStyle)) { Plugins.ConfigEntries.ZoomStyle.Value = zoomStyle; break; } } } private ZoomStyle GetAllowedStyle(ZoomStyle style, HashSet<ZoomStyle> blacklistedStyles, int direction) { if (!blacklistedStyles.Contains(style)) { return style; } int num = Array.IndexOf(StyleCycle, style); if (num < 0) { num = 0; } for (int i = 1; i <= StyleCycle.Length; i++) { int num2 = (num + direction * i + StyleCycle.Length) % StyleCycle.Length; ZoomStyle zoomStyle = StyleCycle[num2]; if (!blacklistedStyles.Contains(zoomStyle)) { return zoomStyle; } } return ZoomStyle.Clean; } private HashSet<ZoomStyle> ParseStyleBlacklist() { HashSet<ZoomStyle> hashSet = new HashSet<ZoomStyle>(); string value = Plugins.ConfigEntries.StyleBlacklist.Value; if (string.IsNullOrWhiteSpace(value)) { return hashSet; } string[] array = value.Split(','); string[] array2 = array; foreach (string value2 in array2) { string text = NormalizeStyleName(value2); if (text.Length == 0) { continue; } ZoomStyle[] styleCycle = StyleCycle; for (int j = 0; j < styleCycle.Length; j++) { ZoomStyle item = styleCycle[j]; if (NormalizeStyleName(item.ToString()) == text) { hashSet.Add(item); break; } } } return hashSet; } private string NormalizeStyleName(string value) { if (string.IsNullOrWhiteSpace(value)) { return string.Empty; } string text = string.Empty; foreach (char c in value) { if (char.IsLetterOrDigit(c)) { text += char.ToLowerInvariant(c); } } return text; } private bool WasInputPressed(ZoomInput input) { ButtonControl inputControl = GetInputControl(input); if (inputControl != null) { return inputControl.wasPressedThisFrame; } return false; } private bool IsInputHeld(ZoomInput input) { ButtonControl inputControl = GetInputControl(input); if (inputControl != null) { return inputControl.isPressed; } return false; } private ButtonControl GetInputControl(ZoomInput input) { //IL_0099: 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_00bb: Unknown result type (might be due to invalid IL or missing references) if (input == ZoomInput.None) { return null; } if (mouse == null) { mouse = Mouse.current; } switch (input) { case ZoomInput.MouseMiddle: { Mouse obj = mouse; if (obj == null) { return null; } return obj.middleButton; } case ZoomInput.MouseBack: { Mouse obj2 = mouse; if (obj2 == null) { return null; } return obj2.backButton; } case ZoomInput.MouseForward: { Mouse obj3 = mouse; if (obj3 == null) { return null; } return obj3.forwardButton; } default: { if (keyboard == null) { keyboard = Keyboard.current; } if (keyboard == null) { return null; } if (!Enum.TryParse<Key>(input.ToString(), out Key result)) { return null; } if ((int)result == 0 || !Enum.IsDefined(typeof(Key), result)) { return null; } return (ButtonControl)(object)keyboard[result]; } } } private void HandleZoomInput() { if (currentZoomKey != Plugins.ConfigEntries.ZoomKey.Value) { toggleZoomActive = false; UpdateZoomKey(); } bool value = Plugins.ConfigEntries.ToggleZoom.Value; if (value != previousToggleMode) { toggleZoomActive = false; previousToggleMode = value; } bool flag = validZoomKey && WasInputPressed(currentZoomKey); bool flag2 = validZoomKey && IsInputHeld(currentZoomKey); if (value) { if (flag) { toggleZoomActive = !toggleZoomActive; } zoomActive = toggleZoomActive; } else { toggleZoomActive = false; zoomActive = flag2; } } private void UpdateZoomAmount() { float num = (zoomActive ? 1f : 0f); zoomAmount = Mathf.MoveTowards(zoomAmount, num, Time.deltaTime * Plugins.ConfigEntries.ZoomSpeed.Value); } private void RestartZoomAnimation() { RestoreCameraFOVNow(); zoomAmount = 0f; if ((Object)(object)activeMaterialInstance != (Object)null && activeMaterialInstance.HasProperty("_Zoom")) { activeMaterialInstance.SetFloat("_Zoom", 0f); } if ((Object)(object)activeMaterialInstance != (Object)null && activeMaterialInstance.HasProperty("_Deploy")) { activeMaterialInstance.SetFloat("_Deploy", 0f); } DisableNightVisionBoost(); } private void UpdateZoomKey() { currentZoomKey = Plugins.ConfigEntries.ZoomKey.Value; validZoomKey = currentZoomKey != ZoomInput.None; } private void ApplyStyle(ZoomStyle style) { //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Expected O, but got Unknown currentStyle = style; if ((Object)(object)activeMaterialInstance != (Object)null) { Object.Destroy((Object)(object)activeMaterialInstance); activeMaterialInstance = null; } if (style == ZoomStyle.None || style == ZoomStyle.Clean) { ((Graphic)playerScreen).material = originalMaterial; return; } if (!Plugins.ZoomMaterialTemplates.TryGetValue(style, out var value) || (Object)(object)value == (Object)null) { Plugins.Logger.LogWarning((object)$"OkayZoomer: Missing material for zoom style '{style}'. Falling back to Clean."); Plugins.ConfigEntries.ZoomStyle.Value = ZoomStyle.Clean; currentStyle = ZoomStyle.Clean; ((Graphic)playerScreen).material = originalMaterial; return; } activeMaterialInstance = new Material(value) { name = $"OkayZoomer Runtime Material - {style}" }; if (activeMaterialInstance.HasProperty("_Zoom")) { activeMaterialInstance.SetFloat("_Zoom", zoomAmount); } if (activeMaterialInstance.HasProperty("_Deploy")) { activeMaterialInstance.SetFloat("_Deploy", zoomAmount); } if (activeMaterialInstance.HasProperty("_MaxZoom")) { activeMaterialInstance.SetFloat("_MaxZoom", 1f); } ((Graphic)playerScreen).material = activeMaterialInstance; } private void ApplyMaterialZoom() { if (!((Object)(object)activeMaterialInstance == (Object)null)) { if (activeMaterialInstance.HasProperty("_Zoom")) { activeMaterialInstance.SetFloat("_Zoom", zoomAmount); } if (activeMaterialInstance.HasProperty("_Deploy")) { activeMaterialInstance.SetFloat("_Deploy", zoomAmount); } if (activeMaterialInstance.HasProperty("_MaxZoom")) { activeMaterialInstance.SetFloat("_MaxZoom", 1f); } } } private void UpdateNightVisionBoost() { if (currentStyle == ZoomStyle.NightVision && (zoomActive || zoomAmount > 0.001f) && !IsEscapeMenuOpen()) { EnableNightVisionBoost(); } else { DisableNightVisionBoost(); } } private void EnableNightVisionBoost() { //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009e: 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_0044: Unknown result type (might be due to invalid IL or missing references) Light val = GetNightVisionLight(); if (!((Object)(object)val == (Object)null)) { if (!hasStoredNightVisionLight) { originalNightVisionEnabled = ((Behaviour)val).enabled; originalNightVisionIntensity = val.intensity; originalNightVisionRange = val.range; originalNightVisionColor = val.color; hasStoredNightVisionLight = true; } float num = Mathf.Clamp01(zoomAmount); ((Behaviour)val).enabled = true; val.intensity = Mathf.Lerp(originalNightVisionIntensity, 1200f, num); val.range = Mathf.Lerp(originalNightVisionRange, 70f, num); val.color = Color.Lerp(originalNightVisionColor, NightVisionLightColor, num); nightVisionBoostActive = true; } } private void DisableNightVisionBoost() { //IL_0047: Unknown result type (might be due to invalid IL or missing references) if (nightVisionBoostActive) { Light val = GetNightVisionLight(); if ((Object)(object)val != (Object)null && hasStoredNightVisionLight) { ((Behaviour)val).enabled = originalNightVisionEnabled; val.intensity = originalNightVisionIntensity; val.range = originalNightVisionRange; val.color = originalNightVisionColor; } nightVisionBoostActive = false; hasStoredNightVisionLight = false; } } private Light GetNightVisionLight() { if ((Object)(object)nightVisionLight != (Object)null) { return nightVisionLight; } PlayerControllerB localPlayer = GetLocalPlayer(); if ((Object)(object)localPlayer == (Object)null) { return null; } FieldInfo field = typeof(PlayerControllerB).GetField("nightVision", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { ref Light reference = ref nightVisionLight; object? value = field.GetValue(localPlayer); reference = (Light)((value is Light) ? value : null); } if ((Object)(object)nightVisionLight != (Object)null) { return nightVisionLight; } Light[] componentsInChildren = ((Component)localPlayer).GetComponentsInChildren<Light>(true); Light[] array = componentsInChildren; foreach (Light val in array) { if (!((Object)(object)val == (Object)null) && ((Object)val).name.IndexOf("night", StringComparison.OrdinalIgnoreCase) >= 0) { nightVisionLight = val; return nightVisionLight; } } return null; } private PlayerControllerB GetLocalPlayer() { if ((Object)(object)StartOfRound.Instance != (Object)null && (Object)(object)StartOfRound.Instance.localPlayerController != (Object)null) { return StartOfRound.Instance.localPlayerController; } if ((Object)(object)GameNetworkManager.Instance != (Object)null && (Object)(object)GameNetworkManager.Instance.localPlayerController != (Object)null) { return GameNetworkManager.Instance.localPlayerController; } return null; } private void UpdateCameraReference() { if ((Object)(object)gameplayCamera != (Object)null) { return; } PlayerControllerB localPlayer = GetLocalPlayer(); if (!((Object)(object)localPlayer == (Object)null)) { gameplayCamera = localPlayer.gameplayCamera; if ((Object)(object)gameplayCamera != (Object)null && !hasStoredNormalFOV) { normalFOV = gameplayCamera.fieldOfView; hasStoredNormalFOV = true; } } } private void ApplyCameraFOV() { if ((Object)(object)gameplayCamera == (Object)null) { return; } if (!zoomActive && !(zoomAmount > 0.001f)) { if (wasZoomingOrTransitioning && hasStoredNormalFOV) { gameplayCamera.fieldOfView = normalFOV; } normalFOV = gameplayCamera.fieldOfView; hasStoredNormalFOV = true; wasZoomingOrTransitioning = false; } else { if (!wasZoomingOrTransitioning) { normalFOV = gameplayCamera.fieldOfView; hasStoredNormalFOV = true; wasZoomingOrTransitioning = true; } gameplayCamera.fieldOfView = Mathf.Lerp(normalFOV, GetTargetFOV(), zoomAmount); } } private float GetTargetFOV() { if (currentStyle == ZoomStyle.NightVision) { return normalFOV; } float value = Plugins.ConfigEntries.ZoomFOV.Value; if (currentStyle != ZoomStyle.GreedCurse) { return value; } float num = normalFOV - value; float num2 = normalFOV + num; return Mathf.Clamp(num2, normalFOV, 120f); } private void ResetZoomCompletely() { DisableNightVisionBoost(); toggleZoomActive = false; zoomActive = false; zoomAmount = 0f; SetHudHidden(hidden: false); RestoreCameraFOVNow(); if ((Object)(object)playerScreen != (Object)null && (Object)(object)((Graphic)playerScreen).material != (Object)(object)originalMaterial) { ((Graphic)playerScreen).material = originalMaterial; } if ((Object)(object)activeMaterialInstance != (Object)null) { Object.Destroy((Object)(object)activeMaterialInstance); activeMaterialInstance = null; } } private void ResetZoomForMenu() { DisableNightVisionBoost(); toggleZoomActive = false; zoomActive = false; zoomAmount = 0f; ApplyMaterialZoom(); SetHudHidden(hidden: false); RestoreCameraFOVNow(); } private void RestoreCameraFOVNow() { UpdateCameraReference(); if ((Object)(object)gameplayCamera != (Object)null && wasZoomingOrTransitioning && hasStoredNormalFOV) { gameplayCamera.fieldOfView = normalFOV; } wasZoomingOrTransitioning = false; if ((Object)(object)gameplayCamera != (Object)null) { normalFOV = gameplayCamera.fieldOfView; hasStoredNormalFOV = true; } } private void SetHudHidden(bool hidden) { if (hudHidden == hidden) { return; } if (hidden) { CacheHudStates(); RefreshHudStates(); HUDManager instance = HUDManager.Instance; if (instance != null) { instance.HideHUD(true); } ForceHudHiddenInstant(); } else { HUDManager instance2 = HUDManager.Instance; if (instance2 != null) { instance2.HideHUD(false); } RestoreHudInstant(); } hudHidden = hidden; } private void CacheHudStates() { GameObject val = GameObject.Find("Systems/UI"); if ((Object)(object)val == (Object)null) { return; } Graphic[] componentsInChildren = val.GetComponentsInChildren<Graphic>(true); CanvasGroup[] componentsInChildren2 = val.GetComponentsInChildren<CanvasGroup>(true); List<HudGraphicState> list = new List<HudGraphicState>(); List<HudCanvasGroupState> list2 = new List<HudCanvasGroupState>(); Graphic[] array = componentsInChildren; foreach (Graphic val2 in array) { if (!((Object)(object)val2 == (Object)null) && !((Object)(object)val2 == (Object)(object)playerScreen) && (!((Object)(object)styleTextRoot != (Object)null) || !((Component)val2).transform.IsChildOf((Transform)(object)styleTextRoot)) && (!((Object)(object)playerScreen != (Object)null) || !((Component)val2).transform.IsChildOf(((Component)playerScreen).transform)) && !IsEscapeMenuGraphic(((Component)val2).transform)) { list.Add(new HudGraphicState(val2)); } } CanvasGroup[] array2 = componentsInChildren2; foreach (CanvasGroup val3 in array2) { if (!((Object)(object)val3 == (Object)null) && (!((Object)(object)styleTextRoot != (Object)null) || !((Transform)styleTextRoot).IsChildOf(((Component)val3).transform)) && (!((Object)(object)playerScreen != (Object)null) || !((Component)playerScreen).transform.IsChildOf(((Component)val3).transform)) && !IsEscapeMenuGraphic(((Component)val3).transform)) { list2.Add(new HudCanvasGroupState(val3)); } } hudGraphicStates = list.ToArray(); hudCanvasGroupStates = list2.ToArray(); } private void RefreshHudStates() { for (int i = 0; i < hudGraphicStates.Length; i++) { if ((Object)(object)hudGraphicStates[i].Graphic != (Object)null) { hudGraphicStates[i].OriginalEnabled = ((Behaviour)hudGraphicStates[i].Graphic).enabled; } } for (int j = 0; j < hudCanvasGroupStates.Length; j++) { CanvasGroup canvasGroup = hudCanvasGroupStates[j].CanvasGroup; if (!((Object)(object)canvasGroup == (Object)null)) { hudCanvasGroupStates[j].OriginalAlpha = canvasGroup.alpha; hudCanvasGroupStates[j].OriginalInteractable = canvasGroup.interactable; hudCanvasGroupStates[j].OriginalBlocksRaycasts = canvasGroup.blocksRaycasts; } } } private void ForceHudHiddenInstant() { HudGraphicState[] array = hudGraphicStates; for (int i = 0; i < array.Length; i++) { HudGraphicState hudGraphicState = array[i]; if ((Object)(object)hudGraphicState.Graphic != (Object)null) { ((Behaviour)hudGraphicState.Graphic).enabled = false; } } HudCanvasGroupState[] array2 = hudCanvasGroupStates; for (int j = 0; j < array2.Length; j++) { HudCanvasGroupState hudCanvasGroupState = array2[j]; CanvasGroup canvasGroup = hudCanvasGroupState.CanvasGroup; if (!((Object)(object)canvasGroup == (Object)null)) { canvasGroup.alpha = 0f; canvasGroup.interactable = false; canvasGroup.blocksRaycasts = false; } } if ((Object)(object)playerScreen != (Object)null) { ((Behaviour)playerScreen).enabled = true; } if ((Object)(object)styleTextRoot != (Object)null) { ((Component)styleTextRoot).gameObject.SetActive(false); } } private void RestoreHudInstant() { HudCanvasGroupState[] array = hudCanvasGroupStates; for (int i = 0; i < array.Length; i++) { HudCanvasGroupState hudCanvasGroupState = array[i]; CanvasGroup canvasGroup = hudCanvasGroupState.CanvasGroup; if (!((Object)(object)canvasGroup == (Object)null)) { canvasGroup.alpha = hudCanvasGroupState.OriginalAlpha; canvasGroup.interactable = hudCanvasGroupState.OriginalInteractable; canvasGroup.blocksRaycasts = hudCanvasGroupState.OriginalBlocksRaycasts; } } HudGraphicState[] array2 = hudGraphicStates; for (int j = 0; j < array2.Length; j++) { HudGraphicState hudGraphicState = array2[j]; if ((Object)(object)hudGraphicState.Graphic != (Object)null) { ((Behaviour)hudGraphicState.Graphic).enabled = hudGraphicState.OriginalEnabled; } } if ((Object)(object)playerScreen != (Object)null) { ((Behaviour)playerScreen).enabled = true; } SetStyleTextVisible(!IsEscapeMenuOpen()); } private bool IsEscapeMenuOpen() { QuickMenuManager val = GetQuickMenuManager(); if ((Object)(object)val != (Object)null) { return val.isMenuOpen; } return false; } private bool IsEscapeMenuGraphic(Transform target) { QuickMenuManager val = GetQuickMenuManager(); if ((Object)(object)val != (Object)null) { return target.IsChildOf(((Component)val).transform); } return false; } private QuickMenuManager GetQuickMenuManager() { //IL_0034: 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) if ((Object)(object)quickMenuManager != (Object)null) { return quickMenuManager; } QuickMenuManager[] array = Resources.FindObjectsOfTypeAll<QuickMenuManager>(); QuickMenuManager[] array2 = array; foreach (QuickMenuManager val in array2) { if ((Object)(object)val != (Object)null) { Scene scene = ((Component)val).gameObject.scene; if (((Scene)(ref scene)).IsValid()) { quickMenuManager = val; return quickMenuManager; } } } return null; } private string GetInputDisplayName(ZoomInput input) { return input switch { ZoomInput.None => "None", ZoomInput.MouseMiddle => "M3", ZoomInput.MouseBack => "M4", ZoomInput.MouseForward => "M5", _ => GetKeyboardDisplayName(input.ToString()), }; } private string GetKeyboardDisplayName(string name) { if (name.StartsWith("Numpad")) { string text = name; int length = "Numpad".Length; return "Num " + text.Substring(length, text.Length - length); } if (name.StartsWith("Digit")) { string text = name; int length = "Digit".Length; return text.Substring(length, text.Length - length); } return name switch { "LeftCtrl" => "L Ctrl", "RightCtrl" => "R Ctrl", "LeftAlt" => "L Alt", "RightAlt" => "R Alt", "LeftShift" => "L Shift", "RightShift" => "R Shift", _ => name, }; } private string GetStyleDisplayName(ZoomStyle style) { return style switch { ZoomStyle.None => "None", ZoomStyle.Clean => "Clean", ZoomStyle.Binocular => "Binocular", ZoomStyle.Camcorder => "Camcorder", ZoomStyle.InLove => "In Love", ZoomStyle.GreedCurse => "Greed Curse", ZoomStyle.Melodrama => "Melodrama", ZoomStyle.SpiderEyes => "Spider Eyes", ZoomStyle.FlyEyes => "Fly Eyes", ZoomStyle.NightVision => "Night Vision", _ => style.ToString(), }; } } [BepInPlugin("OkayZoomer", "OkayZoomer", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugins : BaseUnityPlugin { private const string AssetBundleFileName = "okayzoomassets"; internal static Plugins Instance { get; private set; } internal static Harmony Harmony { get; private set; } internal static ManualLogSource Logger { get; private set; } internal static ConfigFile Config { get; private set; } internal static ConfigEntries ConfigEntries { get; private set; } internal static Dictionary<ZoomStyle, Material> ZoomMaterialTemplates { get; private set; } public void Awake() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown if ((Object)(object)Instance == (Object)null) { Instance = this; } Harmony = new Harmony("OkayZoomer"); Logger = Logger.CreateLogSource("OkayZoomer"); ConfigFile val = ConfigUtils.CreateLocalConfigFile((BaseUnityPlugin)(object)this, "bootstrap", saveOnInit: true); ConfigEntry<bool> val2 = val.Bind<bool>("Main", "Use Local Config", false, "If enabled, uses a local config file instead of the global config. Requires restart."); Config = (val2.Value ? ConfigUtils.CreateLocalConfigFile((BaseUnityPlugin)(object)this) : ConfigUtils.CreateGlobalConfigFile((BaseUnityPlugin)(object)this)); ConfigEntries = new ConfigEntries(); LoadZoomAssets(); Harmony.PatchAll(); val.Save(); Loggers.Info("Plugin OkayZoomer loaded!"); } private void LoadZoomAssets() { ZoomMaterialTemplates = new Dictionary<ZoomStyle, Material>(); string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location); string text = Path.Combine(directoryName, "okayzoomassets"); if (!File.Exists(text)) { Loggers.Warning("OkayZoomer AssetBundle was not found at: " + text); return; } AssetBundle val = AssetBundle.LoadFromFile(text); if ((Object)(object)val == (Object)null) { Loggers.Warning("Failed to load OkayZoomer AssetBundle."); return; } TryLoadMaterial(val, ZoomStyle.Binocular, "OZ_Zoom_Binocular"); TryLoadMaterial(val, ZoomStyle.Camcorder, "OZ_Zoom_Camcorder"); TryLoadMaterial(val, ZoomStyle.GreedCurse, "OZ_Zoom_GreedCurse"); TryLoadMaterial(val, ZoomStyle.Melodrama, "OZ_Zoom_Melodrama"); TryLoadMaterial(val, ZoomStyle.InLove, "OZ_Zoom_InLove"); TryLoadMaterial(val, ZoomStyle.SpiderEyes, "OZ_Zoom_SpiderEyes"); TryLoadMaterial(val, ZoomStyle.FlyEyes, "OZ_Zoom_FlyEyes"); TryLoadMaterial(val, ZoomStyle.NightVision, "OZ_Zoom_NightVision"); val.Unload(false); Loggers.Info($"Loaded {ZoomMaterialTemplates.Count} OkayZoomer material templates."); } private static void TryLoadMaterial(AssetBundle bundle, ZoomStyle style, string assetName) { Material val = LoadMaterialByName(bundle, assetName); if ((Object)(object)val == (Object)null) { Loggers.Warning($"Could not load zoom material '{assetName}' for style '{style}'."); return; } ZoomMaterialTemplates[style] = val; Loggers.Info($"Loaded zoom material '{assetName}' for style '{style}'."); } private static Material LoadMaterialByName(AssetBundle bundle, string assetName) { Material val = bundle.LoadAsset<Material>(assetName); if ((Object)(object)val != (Object)null) { return val; } string[] allAssetNames = bundle.GetAllAssetNames(); string[] array = allAssetNames; foreach (string text in array) { string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(text); if (string.Equals(fileNameWithoutExtension, assetName, StringComparison.OrdinalIgnoreCase)) { return bundle.LoadAsset<Material>(text); } } return null; } } public static class MyPluginInfo { public const string PLUGIN_GUID = "OkayZoomer"; public const string PLUGIN_NAME = "OkayZoomer"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace OkayZoomer.Patches { [HarmonyPatch(typeof(HUDManager))] internal static class HUDManagerPatch { private const string PlayerScreenPath = "Systems/GameSystems/UI/Canvas/Panel/GameObject/PlayerScreen"; [HarmonyPatch("Start")] [HarmonyPostfix] private static void StartPostfix(HUDManager __instance) { TryAttachZoomEffect(); } private static void TryAttachZoomEffect() { RawImage val = FindPlayerScreen(); if ((Object)(object)val == (Object)null) { Plugins.Logger.LogWarning((object)"Could not find PlayerScreen RawImage."); } else if (!((Object)(object)((Component)val).GetComponent<PlayerScreenZoomEffect>() != (Object)null)) { ((Component)val).gameObject.AddComponent<PlayerScreenZoomEffect>(); Plugins.Logger.LogInfo((object)"Added PlayerScreenZoomEffect to PlayerScreen."); } } private static RawImage FindPlayerScreen() { //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) GameObject val = GameObject.Find("Systems/GameSystems/UI/Canvas/Panel/GameObject/PlayerScreen"); RawImage result = default(RawImage); if ((Object)(object)val != (Object)null && val.TryGetComponent<RawImage>(ref result)) { return result; } RawImage[] array = Resources.FindObjectsOfTypeAll<RawImage>(); RawImage[] array2 = array; foreach (RawImage val2 in array2) { if (!((Object)(object)val2 == (Object)null) && !(((Object)val2).name != "PlayerScreen")) { Scene scene = ((Component)val2).gameObject.scene; if (((Scene)(ref scene)).IsValid()) { return val2; } } } return null; } } } namespace OkayZoomer.Configs { public enum ColorblindMode { Off, Protanopia, Protanomaly, Deuteranopia, Deuteranomaly, Tritanopia, Tritanomaly, Achromatopsia, Achromatomaly } public class ConfigEntries { public ConfigEntry<bool> ToggleZoom { get; private set; } public ConfigEntry<ZoomInput> ZoomKey { get; private set; } public ConfigEntry<ZoomInput> PreviousStyleKey { get; private set; } public ConfigEntry<ZoomInput> NextStyleKey { get; private set; } public ConfigEntry<float> ZoomFOV { get; private set; } public ConfigEntry<float> ZoomSpeed { get; private set; } public ConfigEntry<ZoomStyle> ZoomStyle { get; private set; } public ConfigEntry<string> StyleBlacklist { get; private set; } public ConfigEntry<bool> ShowStyleKeybindTexts { get; private set; } public ConfigEntry<float> StyleTextPositionX { get; private set; } public ConfigEntry<float> StyleTextPositionY { get; private set; } public ConfigEntries() { ConfigFile config = Plugins.Config; config.SaveOnConfigSet = false; Setup(); config.OrphanedEntries.Clear(); config.SaveOnConfigSet = true; config.Save(); } private void Setup() { ConfigHelper.SkipAutoGen(); ToggleZoom = ConfigHelper.Bind("Controls", "Toggle Zoom", defaultValue: false, "If enabled, pressing the zoom key toggles zoom on/off. If disabled, zoom only stays active while the key is held."); ZoomKey = ConfigHelper.Bind("Controls", "Zoom Key", ZoomInput.MouseMiddle, "Input used to zoom. Supports keyboard keys, MouseMiddle, MouseBack, and MouseForward."); PreviousStyleKey = ConfigHelper.Bind("Controls", "Previous Style Key", ZoomInput.Numpad1, "Input used to switch to the previous zoom style. Supports keyboard keys, MouseMiddle, MouseBack, and MouseForward."); NextStyleKey = ConfigHelper.Bind("Controls", "Next Style Key", ZoomInput.Numpad3, "Input used to switch to the next zoom style. Supports keyboard keys, MouseMiddle, MouseBack, and MouseForward."); ZoomFOV = ConfigHelper.Bind("Zoom", "Zoom FOV", 25f, "Camera FOV while zoomed.", requiresRestart: false, (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 120f)); ZoomSpeed = ConfigHelper.Bind("Zoom", "Zoom Speed", 8f, "How quickly zoom enters and exits.", requiresRestart: false, (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 50f)); ZoomStyle = ConfigHelper.Bind("Visuals", "Zoom Style", OkayZoomer.Configs.ZoomStyle.Binocular, "Visual style used while zooming. None disables zoom entirely. Clean means FOV zoom only."); StyleBlacklist = ConfigHelper.Bind("Visuals", "Style Blacklist", "", "Comma-separated zoom styles to skip when cycling. Example: FlyEyes, SpiderEyes, InLove"); ShowStyleKeybindTexts = ConfigHelper.Bind("Visuals", "Show Style Keybind Texts", defaultValue: true, "If enabled, shows the previous, zoom, and next input texts above the zoom style name."); StyleTextPositionX = ConfigHelper.Bind("Visuals", "Style Text Position X", 0f, "Moves the zoom style text horizontally. Positive moves right, negative moves left.", requiresRestart: false, (AcceptableValueBase)(object)new AcceptableValueRange<float>(-2000f, 2000f)); StyleTextPositionY = ConfigHelper.Bind("Visuals", "Style Text Position Y", 0f, "Moves the zoom style text vertically. Positive moves down, negative moves up.", requiresRestart: false, (AcceptableValueBase)(object)new AcceptableValueRange<float>(-1200f, 1200f)); } } internal static class ConfigHelper { internal static void SkipAutoGen() { if (ModCompats.IsLethalConfigPresent) { LethalConfigProxy.SkipAutoGen(); } } internal static ConfigEntry<string> Bind(bool isHexColor, string section, string key, string defaultValue, string description, bool requiresRestart = false, AcceptableValueBase acceptableValues = null, Action<string> settingChanged = null, ConfigFile configFile = null) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown if (configFile == null) { configFile = Plugins.Config; } ConfigEntry<string> configEntry = ((acceptableValues == null) ? configFile.Bind<string>(section, key, defaultValue, description) : configFile.Bind<string>(section, key, defaultValue, new ConfigDescription(description, acceptableValues, Array.Empty<object>()))); if (settingChanged != null) { configEntry.SettingChanged += delegate { settingChanged?.Invoke(configEntry.Value); }; } if (ModCompats.IsLethalConfigPresent) { LethalConfigProxy.AddConfig(configEntry, requiresRestart, isHexColor); } return configEntry; } internal static ConfigEntry<T> Bind<T>(string section, string key, T defaultValue, string description, bool requiresRestart = false, AcceptableValueBase acceptableValues = null, Action<T> settingChanged = null, ConfigFile configFile = null) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Expected O, but got Unknown if (configFile == null) { configFile = Plugins.Config; } ConfigEntry<T> configEntry = ((acceptableValues == null) ? configFile.Bind<T>(section, key, defaultValue, description) : configFile.Bind<T>(section, key, defaultValue, new ConfigDescription(description, acceptableValues, Array.Empty<object>()))); if (settingChanged != null) { configEntry.SettingChanged += delegate { settingChanged?.Invoke(configEntry.Value); }; } if (ModCompats.IsLethalConfigPresent) { LethalConfigProxy.AddConfig<T>(configEntry, requiresRestart); } return configEntry; } internal static void SetConfigEntryValue<T>(ConfigEntry<T> configEntry, string value) { if (typeof(T) == typeof(int) && int.TryParse(value, out var result)) { configEntry.Value = (T)(object)result; return; } if (typeof(T) == typeof(float) && float.TryParse(value, out var result2)) { configEntry.Value = (T)(object)result2; return; } if (typeof(T) == typeof(double) && double.TryParse(value, out var result3)) { configEntry.Value = (T)(object)result3; return; } if (typeof(T) == typeof(bool) && bool.TryParse(value, out var result4)) { configEntry.Value = (T)(object)result4; return; } if (typeof(T) == typeof(string)) { configEntry.Value = (T)(object)value; return; } throw new InvalidOperationException($"Unsupported type: {typeof(T)}"); } } internal static class ConfigUtils { private static string GetPluginPersistentDataPath() { return Path.Combine(Application.persistentDataPath, "OkayZoomer"); } private static ConfigFile CreateConfigFile(BaseUnityPlugin plugin, string path, string name = null, bool saveOnInit = false) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown BepInPlugin metadata = MetadataHelper.GetMetadata((object)plugin); if (name == null) { name = metadata.GUID; } name += ".cfg"; return new ConfigFile(Path.Combine(path, name), saveOnInit, metadata); } internal static ConfigFile CreateLocalConfigFile(BaseUnityPlugin plugin, string name = null, bool saveOnInit = false) { return CreateConfigFile(plugin, Paths.ConfigPath, name, saveOnInit); } internal static ConfigFile CreateGlobalConfigFile(BaseUnityPlugin plugin, string name = null, bool saveOnInit = false) { string pluginPersistentDataPath = GetPluginPersistentDataPath(); if (name == null) { name = "global"; } return CreateConfigFile(plugin, pluginPersistentDataPath, name, saveOnInit); } } public enum ZoomInput { None, MouseMiddle, MouseBack, MouseForward, Space, Enter, Tab, Backquote, Quote, Semicolon, Comma, Period, Slash, Backslash, LeftBracket, RightBracket, Minus, Equals, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, Digit1, Digit2, Digit3, Digit4, Digit5, Digit6, Digit7, Digit8, Digit9, Digit0, LeftShift, RightShift, LeftAlt, RightAlt, LeftCtrl, RightCtrl, LeftMeta, RightMeta, ContextMenu, Escape, LeftArrow, RightArrow, UpArrow, DownArrow, Backspace, PageDown, PageUp, Home, End, Insert, Delete, CapsLock, NumLock, PrintScreen, ScrollLock, Pause, NumpadEnter, NumpadDivide, NumpadMultiply, NumpadPlus, NumpadMinus, NumpadPeriod, NumpadEquals, Numpad0, Numpad1, Numpad2, Numpad3, Numpad4, Numpad5, Numpad6, Numpad7, Numpad8, Numpad9, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12 } public enum ZoomStyle { None, Clean, Binocular, Camcorder, GreedCurse, Melodrama, InLove, SpiderEyes, FlyEyes, NightVision } } namespace OkayZoomer.Compats { internal static class LethalConfigProxy { [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void SkipAutoGen() { LethalConfigManager.SkipAutoGen(); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddConfig(ConfigEntry<string> configEntry, bool requiresRestart = false, bool isHexColor = false) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Expected O, but got Unknown //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown BaseConfigItem val = (BaseConfigItem)((!isHexColor) ? ((object)new TextInputFieldConfigItem(configEntry, requiresRestart)) : ((object)new HexColorInputFieldConfigItem(configEntry, requiresRestart))); LethalConfigManager.AddConfigItem(val); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddConfig<T>(ConfigEntry<T> configEntry, bool requiresRestart = false) { //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Expected O, but got Unknown //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Expected O, but got Unknown //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Expected O, but got Unknown //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Expected O, but got Unknown AcceptableValueBase acceptableValues = ((ConfigEntryBase)configEntry).Description.AcceptableValues; if (acceptableValues != null) { if (acceptableValues is AcceptableValueRange<float> || acceptableValues is AcceptableValueRange<int>) { AddConfigSlider<T>(configEntry); return; } if (acceptableValues is AcceptableValueList<string>) { AddConfigDropdown<T>(configEntry); return; } } if (typeof(T).IsEnum) { Type type = typeof(EnumDropDownConfigItem<>).MakeGenericType(typeof(T)); object obj = Activator.CreateInstance(type, configEntry, requiresRestart); MethodInfo methodInfo = AccessTools.Method(typeof(LethalConfigManager), "AddConfigItem", new Type[1] { type }, (Type[])null); methodInfo.Invoke(null, new object[1] { obj }); } else if (!(configEntry is ConfigEntry<string> val)) { if (!(configEntry is ConfigEntry<bool> val2)) { if (!(configEntry is ConfigEntry<float> val3)) { if (!(configEntry is ConfigEntry<int> val4)) { throw new NotSupportedException($"Unsupported type: {typeof(T)}"); } LethalConfigManager.AddConfigItem((BaseConfigItem)new IntInputFieldConfigItem(val4, requiresRestart)); } else { LethalConfigManager.AddConfigItem((BaseConfigItem)new FloatInputFieldConfigItem(val3, requiresRestart)); } } else { LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(val2, requiresRestart)); } } else { LethalConfigManager.AddConfigItem((BaseConfigItem)new TextInputFieldConfigItem(val, requiresRestart)); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddConfigSlider<T>(ConfigEntry<T> configEntry, bool requiresRestart = false) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown if (!(configEntry is ConfigEntry<float> val)) { if (!(configEntry is ConfigEntry<int> val2)) { throw new NotSupportedException($"Slider not supported for type: {typeof(T)}"); } LethalConfigManager.AddConfigItem((BaseConfigItem)new IntSliderConfigItem(val2, requiresRestart)); } else { LethalConfigManager.AddConfigItem((BaseConfigItem)new FloatSliderConfigItem(val, requiresRestart)); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddConfigDropdown<T>(ConfigEntry<T> configEntry, bool requiresRestart = false) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Expected O, but got Unknown if (configEntry is ConfigEntry<string> val) { LethalConfigManager.AddConfigItem((BaseConfigItem)new TextDropDownConfigItem(val, requiresRestart)); return; } throw new NotSupportedException($"Dropdown not supported for type: {typeof(T)}"); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddButton(string section, string name, string description, string buttonText, Action callback) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown LethalConfigManager.AddConfigItem((BaseConfigItem)new GenericButtonConfigItem(section, name, description, buttonText, (GenericButtonHandler)delegate { callback?.Invoke(); })); } } internal class ModCompats { internal const string LethalConfig_PLUGIN_GUID = "ainavt.lc.lethalconfig"; internal static bool IsLethalConfigPresent => Chainloader.PluginInfos.ContainsKey("ainavt.lc.lethalconfig"); } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } } namespace __GEN { internal class NetworkVariableSerializationHelper { [RuntimeInitializeOnLoadMethod] internal static void InitializeSerialization() { } } } namespace OkayZoomer.NetcodePatcher { [AttributeUsage(AttributeTargets.Module)] internal class NetcodePatchedAssemblyAttribute : Attribute { } }