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 NeutronaWand v1.0.0
plugins/NeutronaWand.dll
Decompiled a year agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Threading; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using DigitalRuby.ThunderAndLightning; using GameNetcodeStuff; using HarmonyLib; using Microsoft.CodeAnalysis; using NeutronaWand; using NeutronaWand.Components; using NeutronaWand.Features; using NeutronaWand.Patches; using TMPro; using Unity.Netcode; using UnityEngine; using UnityEngine.Pool; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("NeutronaWand")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("NeutronaWand")] [assembly: AssemblyTitle("NeutronaWand")] [assembly: AssemblyVersion("1.0.0.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.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] [Microsoft.CodeAnalysis.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; } } } [HarmonyPatch(typeof(PatcherTool), "Start")] public static class NeutronaWandPatch { [HarmonyPostfix] private static void Postfix(PatcherTool __instance) { //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) try { if ((Object)(object)Plugin.NeutronaWandPrefab != (Object)null) { MeshFilter componentInChildren = Plugin.NeutronaWandPrefab.GetComponentInChildren<MeshFilter>(); MeshRenderer componentInChildren2 = Plugin.NeutronaWandPrefab.GetComponentInChildren<MeshRenderer>(); MeshFilter componentInChildren3 = ((Component)__instance).GetComponentInChildren<MeshFilter>(); MeshRenderer componentInChildren4 = ((Component)__instance).GetComponentInChildren<MeshRenderer>(); if ((Object)(object)componentInChildren != (Object)null && (Object)(object)componentInChildren3 != (Object)null) { componentInChildren3.mesh = componentInChildren.sharedMesh; ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)"Successfully replaced PatcherTool mesh"); } } else { ManualLogSource? logger2 = Plugin.Logger; if (logger2 != null) { logger2.LogError((object)"Could not find MeshFilter components"); } } if ((Object)(object)componentInChildren2 != (Object)null && (Object)(object)componentInChildren4 != (Object)null) { ((Renderer)componentInChildren4).materials = ((Renderer)componentInChildren2).sharedMaterials; ManualLogSource? logger3 = Plugin.Logger; if (logger3 != null) { logger3.LogInfo((object)"Successfully replaced PatcherTool materials"); } } else { ManualLogSource? logger4 = Plugin.Logger; if (logger4 != null) { logger4.LogError((object)"Could not find MeshRenderer components"); } } BoxCollider val = default(BoxCollider); if (((Component)__instance).TryGetComponent<BoxCollider>(ref val)) { BoxCollider obj = val; Bounds bounds = componentInChildren.sharedMesh.bounds; obj.center = ((Bounds)(ref bounds)).center; BoxCollider obj2 = val; bounds = componentInChildren.sharedMesh.bounds; obj2.size = ((Bounds)(ref bounds)).size; } } else { ManualLogSource? logger5 = Plugin.Logger; if (logger5 != null) { logger5.LogError((object)"NeutronaWandPrefab is null!"); } } } catch (Exception arg) { ManualLogSource? logger6 = Plugin.Logger; if (logger6 != null) { logger6.LogError((object)$"Error in NeutronaWandPatch: {arg}"); } } } } namespace NeutronaWand { [HarmonyPatch(typeof(Terminal), "ParseWord")] internal class TerminalParseWordPatch { private static bool Prefix(Terminal __instance, string playerWord, ref TerminalKeyword __result, int specificityRequired = 2) { Debug.Log((object)("[Terminal] Attempting to parse: '" + playerWord + "'")); if (playerWord.Length < specificityRequired) { Debug.Log((object)("[Terminal] Word too short: '" + playerWord + "'")); return true; } TerminalKeyword[] allKeywords = __instance.terminalNodes.allKeywords; foreach (TerminalKeyword val in allKeywords) { string text = val.word.ToLower(); string value = playerWord.ToLower(); if (text.StartsWith(value)) { __result = val; Debug.Log((object)("[Terminal] Matched '" + playerWord + "' to keyword '" + val.word + "'")); return false; } } Debug.Log((object)("[Terminal] No match found for: '" + playerWord + "'")); return true; } } [HarmonyPatch(typeof(Terminal), "Start")] internal class PatcherToolTerminalPatch { [HarmonyPostfix] [HarmonyPriority(200)] private static void Postfix(Terminal __instance) { Debug.Log((object)"[NeutronaWand] Starting terminal modification..."); bool flag = false; bool flag2 = false; Item[] buyableItemsList = __instance.buyableItemsList; foreach (Item val in buyableItemsList) { if (val.itemName.ToLower() == "zap gun" || val.itemName.ToLower() == "patcher tool") { Debug.Log((object)"[NeutronaWand] Found item to rename, updating..."); val.itemName = "NeutronaWand"; val.creditsWorth = 30; flag = true; } } if ((Object)(object)__instance.terminalNodes != (Object)null && __instance.terminalNodes.allKeywords != null) { TerminalKeyword[] allKeywords = __instance.terminalNodes.allKeywords; foreach (TerminalKeyword val2 in allKeywords) { if (val2.word.ToLower() == "zap gun" || val2.word.ToLower() == "patcher tool") { Debug.Log((object)"[NeutronaWand] Found keyword to update..."); val2.word = "NeutronaWand"; flag2 = true; } } } Debug.Log((object)$"[NeutronaWand] Modification complete - Item renamed: {flag}, Keyword renamed: {flag2}"); if ((Object)(object)__instance.terminalNodes != (Object)null && __instance.terminalNodes.allKeywords != null) { Debug.Log((object)"[NeutronaWand] Current keywords:"); TerminalKeyword[] allKeywords2 = __instance.terminalNodes.allKeywords; foreach (TerminalKeyword val3 in allKeywords2) { Debug.Log((object)("[NeutronaWand] - " + val3.word)); } } } } [BepInPlugin("GinjeesPacks.neutronawand", "NeutronaWand", "1.0.0")] public class Plugin : BaseUnityPlugin { public const string GUID = "GinjeesPacks.neutronawand"; public const string NAME = "NeutronaWand"; public const string VERSION = "1.0.0"; public static ManualLogSource? Logger; public static GameObject? NeutronaWandPrefab; public static Texture2D? SpookyCompanyLogo; public static ConfigEntry<bool>? EnableDressGirlx2; private readonly Harmony harmony = new Harmony("GinjeesPacks.neutronawand"); public static Plugin? Instance { get; private set; } private void Awake() { try { Instance = this; Logger = ((BaseUnityPlugin)this).Logger; Logger.LogInfo((object)"NeutronaWand Plugin Awake called."); SetupConfig(); LoadAssetBundle(); LoadSpookyLogo(); CustomMenuMusicPatch.Initialize(); harmony.PatchAll(); DressGirlGlowingFootsteps.Initialize(); Logger.LogInfo((object)"Plugin NeutronaWand is loaded!"); } catch (Exception arg) { ManualLogSource? logger = Logger; if (logger != null) { logger.LogError((object)$"Failed to initialize plugin: {arg}"); } throw; } } private void SetupConfig() { EnableDressGirlx2 = ((BaseUnityPlugin)this).Config.Bind<bool>("Features", "DressGirlx2", true, "When one girl is killed 2 spawn"); ManualLogSource? logger = Logger; if (logger != null) { logger.LogInfo((object)("Config initialized. DressGirlx2 is " + (EnableDressGirlx2.Value ? "enabled" : "disabled"))); } } private void LoadSpookyLogo() { //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown try { string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location); string text = Path.Combine(directoryName, "spookycompanytransparent.png"); ManualLogSource? logger = Logger; if (logger != null) { logger.LogInfo((object)("Looking for Spooky Company logo at: " + text)); } if (!File.Exists(text)) { ManualLogSource? logger2 = Logger; if (logger2 != null) { logger2.LogError((object)("Spooky Company logo not found at: " + text)); } return; } byte[] array = File.ReadAllBytes(text); Texture2D val = new Texture2D(2, 2); ImageConversion.LoadImage(val, array); SpookyCompanyLogo = val; MenuManagerLogoOverridePatch.spookyLogo = val; ManualLogSource? logger3 = Logger; if (logger3 != null) { logger3.LogInfo((object)"Spooky Company logo loaded successfully!"); } } catch (Exception ex) { ManualLogSource? logger4 = Logger; if (logger4 != null) { logger4.LogError((object)("Error loading Spooky Company logo: " + ex.Message)); } } } private void LoadAssetBundle() { try { string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location); string text = Path.Combine(directoryName, "neutronawand"); ManualLogSource? logger = Logger; if (logger != null) { logger.LogInfo((object)("Looking for asset bundle at: " + text)); } if (!File.Exists(text)) { ManualLogSource? logger2 = Logger; if (logger2 != null) { logger2.LogError((object)("Asset bundle not found at: " + text)); } return; } AssetBundle val = AssetBundle.LoadFromFile(text); if ((Object)(object)val == (Object)null) { ManualLogSource? logger3 = Logger; if (logger3 != null) { logger3.LogError((object)"Failed to load asset bundle!"); } return; } NeutronaWandPrefab = val.LoadAsset<GameObject>("neutronawand"); if ((Object)(object)NeutronaWandPrefab == (Object)null) { ManualLogSource? logger4 = Logger; if (logger4 != null) { logger4.LogError((object)"Failed to load NeutronaWand prefab from asset bundle!"); } } else { ManualLogSource? logger5 = Logger; if (logger5 != null) { logger5.LogInfo((object)"Asset bundle loaded successfully and prefab assigned."); } } } catch (Exception ex) { ManualLogSource? logger6 = Logger; if (logger6 != null) { logger6.LogError((object)("Error loading asset bundle: " + ex.Message)); } } } } } namespace NeutronaWand.Features { public class DressGirlGlowingFootsteps { public static class Config { public static float DistanceFalloff = 20f; public static float SecondsUntilFade = 60f; public static Vector3 Color = new Vector3(0.1f, 1f, 0.1f); public static float UpdateRate = 0.1f; } public class FootstepManager : MonoBehaviour { public readonly List<GlowingFootstep.Data> FootstepData = new List<GlowingFootstep.Data>(); public readonly FootstepPool PooledObjects = new FootstepPool(); private static Material _catwalkMaterial; public static Material CatwalkMaterial { get { if ((Object)(object)_catwalkMaterial == (Object)null) { GameObject obj = GameObject.Find("Environment/HangarShip/CatwalkShip"); object catwalkMaterial; if (obj == null) { catwalkMaterial = null; } else { Renderer component = obj.GetComponent<Renderer>(); catwalkMaterial = ((component != null) ? component.material : null); } _catwalkMaterial = (Material)catwalkMaterial; } return _catwalkMaterial; } } public void Start() { ((MonoBehaviour)this).InvokeRepeating("UpdateAllFootstepData", 1f, Config.UpdateRate); } public void AddNewFootstep(GlowingFootstep.Data footstepData) { FootstepData.Add(footstepData); } public void UpdateAllFootstepData() { if ((Object)(object)CatwalkMaterial == (Object)null) { return; } for (int i = 0; i < FootstepData.Count; i++) { GlowingFootstep.Data data = FootstepData[i]; data.UpdateFootstepData(Config.UpdateRate); if (data.IsEnabled && data.ShouldDraw) { data.Linked.SyncColorIntensity(data); } if (!data.IsEnabled && data.ShouldDraw) { GlowingFootstep glowingFootstep = ((ObjectPool<GlowingFootstep>)(object)PooledObjects).Get(); data.IsEnabled = true; data.Linked = glowingFootstep; glowingFootstep.SyncAll(data); } if (data.IsEnabled && !data.ShouldDraw) { ((ObjectPool<GlowingFootstep>)(object)PooledObjects).Release(data.Linked); data.IsEnabled = false; } FootstepData[i] = data; } FootstepData.RemoveAll((GlowingFootstep.Data d) => !d.IsEnabled && !d.ShouldDraw && (double)d.TimeLeftAlive <= 0.0); } } public class FootstepPool : ObjectPool<GlowingFootstep> { public FootstepPool() : base((Func<GlowingFootstep>)CreateNewFootstep, (Action<GlowingFootstep>)delegate(GlowingFootstep fs) { ((Component)fs).gameObject.SetActive(true); }, (Action<GlowingFootstep>)delegate(GlowingFootstep fs) { ((Component)fs).gameObject.SetActive(false); }, (Action<GlowingFootstep>)DestroyFootstep, true, 10, 10000) { } private static GlowingFootstep CreateNewFootstep() { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Expected O, but got Unknown ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)$"Creating new footstep object in pool. Object count {((ObjectPool<GlowingFootstep>)(object)footyManager.PooledObjects).CountAll} & active {((ObjectPool<GlowingFootstep>)(object)footyManager.PooledObjects).CountActive}"); } GameObject val = new GameObject("DressGirl Glow Step", new Type[1] { typeof(GlowingFootstep) }); val.transform.SetParent(((Component)footyManager).transform); return val.GetComponent<GlowingFootstep>(); } private static void DestroyFootstep(GlowingFootstep footstep) { ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)$"Destroying footstep object in pool. Object count {((ObjectPool<GlowingFootstep>)(object)footyManager.PooledObjects).CountAll} & active {((ObjectPool<GlowingFootstep>)(object)footyManager.PooledObjects).CountActive}"); } Object.Destroy((Object)(object)((Component)footstep).gameObject); } } public class GlowingFootstep : MonoBehaviour { public class Data { public Vector3 Position; public Quaternion Rotation; public float TimeLeftAlive; public int Strength; public bool LeftFoot; public Vector3 Color; public bool ShouldDraw; public bool IsEnabled; public GlowingFootstep Linked; public float LastDistance; public void UpdateFootstepData(float delta) { //IL_0028: 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) if ((Object)(object)GameNetworkManager.Instance != (Object)null && (Object)(object)GameNetworkManager.Instance.localPlayerController != (Object)null) { LastDistance = Vector3.Distance(Position, GameNetworkManager.Instance.localPlayerController.playerEye.position); float distanceFalloff = Config.DistanceFalloff; if (LastDistance <= distanceFalloff) { ShouldDraw = true; } if (LastDistance > distanceFalloff || (double)TimeLeftAlive <= 0.0) { ShouldDraw = false; } } else { ShouldDraw = false; } float num = 5f; float num2 = Config.SecondsUntilFade * 0.5f; if (TimeLeftAlive < num2) { num = 7.5f; } TimeLeftAlive -= delta * num; } } private Material _materialReference; private GameObject _subPlane; private static readonly int EmissiveExposureWeight = Shader.PropertyToID("_EmissiveExposureWeight"); private static readonly int EmissiveColorMode = Shader.PropertyToID("_EmissiveColorMode"); private static readonly int EmissiveColor = Shader.PropertyToID("_EmissiveColor"); private static readonly int BaseColorMap = Shader.PropertyToID("_BaseColorMap"); private static readonly int NormalMap = Shader.PropertyToID("_NormalMap"); private static readonly int MainTex = Shader.PropertyToID("_MainTex"); private void CreateFootShape(bool isLeftFoot) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00db: 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_0157: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0166: 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) _subPlane = new GameObject("FootShape"); _subPlane.transform.SetParent(((Component)this).transform, false); GameObject val = CreateQuad("Sole", new Vector3(0f, 0f, 0f), new Vector2(1f, 2.05f)); val.transform.SetParent(_subPlane.transform, false); GameObject val2 = CreateQuad("Ball", new Vector3(0f, 0f, 0.7f), new Vector2(1.4f, 1f)); val2.transform.SetParent(_subPlane.transform, false); GameObject val3 = CreateQuad("Heel", new Vector3(0f, 0f, -0.7f), new Vector2(1.25f, 0.9f)); val3.transform.SetParent(_subPlane.transform, false); if (!isLeftFoot) { _subPlane.transform.localScale = new Vector3(-1f, 1f, 1f); } _subPlane.transform.localScale = Vector3.Scale(_subPlane.transform.localScale, new Vector3(1f, 1f, 1f) / 18f); } private GameObject CreateQuad(string name, Vector3 position, Vector2 size) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: 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_009e: 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_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: 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_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Expected O, but got Unknown GameObject val = new GameObject(name); val.transform.localPosition = position; MeshFilter val2 = val.AddComponent<MeshFilter>(); MeshRenderer val3 = val.AddComponent<MeshRenderer>(); Mesh val4 = new Mesh(); float num = size.x / 2f; float num2 = size.y / 2f; Vector3[] vertices = (Vector3[])(object)new Vector3[4] { new Vector3(0f - num, 0f, 0f - num2), new Vector3(num, 0f, 0f - num2), new Vector3(0f - num, 0f, num2), new Vector3(num, 0f, num2) }; int[] triangles = new int[6] { 0, 2, 1, 2, 3, 1 }; Vector2[] uv = (Vector2[])(object)new Vector2[4] { new Vector2(0f, 0f), new Vector2(1f, 0f), new Vector2(0f, 1f), new Vector2(1f, 1f) }; val4.vertices = vertices; val4.triangles = triangles; val4.uv = uv; val4.RecalculateNormals(); val2.mesh = val4; ((Renderer)val3).material = new Material(_materialReference); return val; } public void Awake() { _materialReference = CreateNewMaterial(); } public void SyncAll(Data footstepData) { if ((Object)(object)_subPlane == (Object)null) { CreateFootShape(footstepData.LeftFoot); } SyncTransform(footstepData); SyncMaterial(footstepData); SyncColorIntensity(footstepData); } private void SyncTransform(Data footstepData) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) Transform transform = ((Component)this).transform; transform.position = footstepData.Position; transform.rotation = footstepData.Rotation; } private void SyncMaterial(Data footstepData) { _materialReference.SetTexture(MainTex, (Texture)null); _materialReference.SetTexture(BaseColorMap, (Texture)null); } public void SyncColorIntensity(Data footstepData) { //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) float num = Mathf.Clamp(footstepData.TimeLeftAlive, 0f, 30f) / 30f; float num2 = Mathf.Min(num, Mathf.Pow(Mathf.Clamp(2f - footstepData.LastDistance / Config.DistanceFalloff, 0f, 1f), 4f)); Renderer[] componentsInChildren = _subPlane.GetComponentsInChildren<Renderer>(); foreach (Renderer val in componentsInChildren) { val.material.SetVector(EmissiveColor, new Vector4(footstepData.Color.x, footstepData.Color.y, footstepData.Color.z, 1f) * num2); } } private static Material CreateNewMaterial() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_003c: 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) Material val = new Material(FootstepManager.CatwalkMaterial); val.SetTexture(NormalMap, (Texture)null); val.SetFloat(EmissiveColorMode, 1f); val.SetFloat(EmissiveExposureWeight, 1f); val.mainTextureScale = Vector2.one; val.color = Color.white; return val; } } [HarmonyPatch(typeof(Terminal), "Start")] public static class Terminal_Start_Patch { [HarmonyPostfix] public static void CreateFootstepManager(Terminal __instance) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown if (!((Object)(object)footyManager != (Object)null)) { GameObject val = new GameObject("DressGirl Footstep Manager", new Type[1] { typeof(FootstepManager) }); footyManager = val.GetComponent<FootstepManager>(); Object.DontDestroyOnLoad((Object)(object)((Component)footyManager).gameObject); ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)"DressGirl Footstep Manager created"); } } } } [HarmonyPatch(typeof(DressGirlAI), "Update")] public static class DressGirlAI_Update_Patch { private static Dictionary<ulong, float> _leftFoots = new Dictionary<ulong, float>(); private static Dictionary<ulong, Vector3> _lastPositions = new Dictionary<ulong, Vector3>(); private static Dictionary<ulong, float> _footstepTimers = new Dictionary<ulong, float>(); private static float footstepInterval = 0.5f; [HarmonyPostfix] public static void AddFootstepsForDressGirl(DressGirlAI __instance) { //IL_0087: 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_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_0053: Unknown result type (might be due to invalid IL or missing references) //IL_024e: Unknown result type (might be due to invalid IL or missing references) //IL_010b: 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_011c: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_01f4: 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_0205: Unknown result type (might be due to invalid IL or missing references) //IL_020a: Unknown result type (might be due to invalid IL or missing references) //IL_020f: Unknown result type (might be due to invalid IL or missing references) try { if (!((NetworkBehaviour)__instance).IsOwner || (Object)(object)footyManager == (Object)null || ((EnemyAI)__instance).isEnemyDead) { return; } ulong networkObjectId = ((NetworkBehaviour)__instance).NetworkObjectId; if (!_lastPositions.ContainsKey(networkObjectId)) { _lastPositions[networkObjectId] = ((Component)__instance).transform.position; _leftFoots[networkObjectId] = -1f; _footstepTimers[networkObjectId] = 0f; } Vector3 position = ((Component)__instance).transform.position; float num = Vector3.Distance(_lastPositions[networkObjectId], position); bool flag = num > 0.01f; _footstepTimers[networkObjectId] += Time.deltaTime; if (flag && _footstepTimers[networkObjectId] >= footstepInterval) { _footstepTimers[networkObjectId] = 0f; Transform transform = ((Component)__instance).transform; RaycastHit val = default(RaycastHit); if (Physics.Raycast(new Ray(transform.position + transform.right * 0.1f * _leftFoots[networkObjectId], Vector3.down), ref val, 10f, LayerMask.GetMask(new string[3] { "Room", "Railing", "Default" }))) { GlowingFootstep.Data footstepData = new GlowingFootstep.Data { Color = Config.Color, LeftFoot = ((double)_leftFoots[networkObjectId] <= 0.0), Strength = ((((EnemyAI)__instance).currentBehaviourStateIndex == 1) ? 3 : 2), TimeLeftAlive = Config.SecondsUntilFade, Position = ((RaycastHit)(ref val)).point + new Vector3(0f, 0.001f, 0f), Rotation = Quaternion.LookRotation(((Component)__instance).transform.forward * -1f, ((RaycastHit)(ref val)).normal) }; footyManager.AddNewFootstep(footstepData); _leftFoots[networkObjectId] *= -1f; } } _lastPositions[networkObjectId] = position; } catch (Exception arg) { ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogError((object)$"Error in DressGirlAI_Update_Patch: {arg}"); } } } } public static FootstepManager footyManager; public static void Initialize() { ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)"Initializing DressGirl Glowing Footsteps feature"); } } } } namespace NeutronaWand.Patches { [HarmonyPatch] public static class CustomMenuMusicPatch { private static AudioClip customMenuMusic; private static bool musicLoaded; private static bool patchApplied; public static void Initialize() { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Expected O, but got Unknown try { string location = Assembly.GetExecutingAssembly().Location; string directoryName = Path.GetDirectoryName(location); string text = Path.Combine(directoryName, "MenuMusic1.wav"); if (File.Exists(text)) { ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)("Custom music file found at: " + text)); } WWW val = new WWW("file://" + text); try { while (!val.isDone) { Thread.Sleep(5); } if (string.IsNullOrEmpty(val.error)) { customMenuMusic = val.GetAudioClip(false, false); ((Object)customMenuMusic).name = "MenuMusic1"; musicLoaded = true; ManualLogSource? logger2 = Plugin.Logger; if (logger2 != null) { logger2.LogInfo((object)"Custom menu music loaded successfully!"); } } else { ManualLogSource? logger3 = Plugin.Logger; if (logger3 != null) { logger3.LogError((object)("Error loading audio file: " + val.error)); } } return; } finally { ((IDisposable)val)?.Dispose(); } } ManualLogSource? logger4 = Plugin.Logger; if (logger4 != null) { logger4.LogError((object)("Custom music file not found at: " + text)); } } catch (Exception arg) { ManualLogSource? logger5 = Plugin.Logger; if (logger5 != null) { logger5.LogError((object)$"Error initializing custom music: {arg}"); } } } [HarmonyPatch(typeof(MenuManager), "PlayMenuMusicDelayed")] [HarmonyPrefix] public static bool PlayMenuMusicDelayed_Prefix(MenuManager __instance, ref IEnumerator __result) { if ((Object)(object)customMenuMusic != (Object)null && musicLoaded) { ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)"Replacing menu music with custom track"); } __result = CustomPlayMenuMusicDelayed(__instance); return false; } ManualLogSource? logger2 = Plugin.Logger; if (logger2 != null) { logger2.LogWarning((object)"Custom music not loaded, using original menu music"); } return true; } [HarmonyPatch(typeof(MenuManager), "Start")] [HarmonyPostfix] public static void Start_Postfix(MenuManager __instance) { if (!__instance.isInitScene && (Object)(object)customMenuMusic != (Object)null && musicLoaded && !patchApplied) { patchApplied = true; ((MonoBehaviour)__instance).StartCoroutine(ReplaceMenuMusicDelayed(__instance)); ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)"Applied menu music patch in Start method"); } } } private static IEnumerator CustomPlayMenuMusicDelayed(MenuManager menuManager) { ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)"Starting custom menu music playback sequence"); } if ((Object)(object)GameNetworkManager.Instance != (Object)null && GameNetworkManager.Instance.firstTimeInMenu) { GameNetworkManager.Instance.firstTimeInMenu = false; menuManager.MenuAudio.PlayOneShot(menuManager.openMenuSound, 1f); yield return (object)new WaitForSeconds(0.3f); } else { menuManager.menuAnimator.SetTrigger("skipOpening"); } yield return (object)new WaitForSeconds(0.1f); menuManager.MenuAudio.Stop(); menuManager.MenuAudio.clip = customMenuMusic; menuManager.MenuAudio.Play(); ManualLogSource? logger2 = Plugin.Logger; if (logger2 != null) { logger2.LogInfo((object)"Custom menu music started playing"); } } private static IEnumerator ReplaceMenuMusicDelayed(MenuManager menuManager) { yield return (object)new WaitForSeconds(0.5f); if ((Object)(object)menuManager.MenuAudio.clip != (Object)(object)customMenuMusic && (Object)(object)customMenuMusic != (Object)null) { ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)"Backup method: Replacing menu music"); } menuManager.MenuAudio.Stop(); menuManager.MenuAudio.clip = customMenuMusic; menuManager.MenuAudio.Play(); } } } [HarmonyPatch(typeof(DressGirlAI))] public class DressGirlAI_ShockablePatch { [HarmonyPatch("Start")] [HarmonyPostfix] private static void MakeShockable(DressGirlAI __instance) { //IL_0091: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance != (Object)null) { ((Component)__instance).gameObject.layer = LayerMask.NameToLayer("Enemies"); ((Component)__instance).gameObject.layer = LayerMask.NameToLayer("Enemies") | LayerMask.NameToLayer("EnemyDetection"); if ((Object)(object)((Component)__instance).gameObject.GetComponent<Collider>() == (Object)null) { CapsuleCollider val = ((Component)__instance).gameObject.AddComponent<CapsuleCollider>(); val.height = 2f; val.radius = 1.3f; val.center = new Vector3(0f, 1f, 0f); ((Collider)val).isTrigger = true; } if (!Object.op_Implicit((Object)(object)((Component)__instance).gameObject.GetComponent<DressGirlShockable>())) { ((Component)__instance).gameObject.AddComponent<DressGirlShockable>(); } } } } public class DressGirlShockable : NetworkBehaviour, IShockableWithGun { private DressGirlAI dressGirl = null; private bool isBeingShocked; private void Awake() { dressGirl = ((Component)this).GetComponent<DressGirlAI>(); ((Component)this).gameObject.layer = LayerMask.NameToLayer("Enemies"); } public bool CanBeShocked() { return (Object)(object)dressGirl != (Object)null && !((EnemyAI)dressGirl).isEnemyDead && (dressGirl.staringInHaunt || ((EnemyAI)dressGirl).currentBehaviourStateIndex == 1 || !dressGirl.disappearingFromStare); } public NetworkObject GetNetworkObject() { return ((NetworkBehaviour)dressGirl).NetworkObject; } public Vector3 GetShockablePosition() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) return ((Component)this).transform.position + Vector3.up * 2f; } public Transform GetShockableTransform() { return ((Component)this).transform; } public float GetDifficultyMultiplier() { return 0.5f; } public void ShockWithGun(PlayerControllerB player) { //IL_0096: Unknown result type (might be due to invalid IL or missing references) if (!isBeingShocked && (Object)(object)dressGirl != (Object)null && !((EnemyAI)dressGirl).isEnemyDead) { isBeingShocked = true; if (NetworkManager.Singleton.IsServer || NetworkManager.Singleton.IsHost) { ((EnemyAI)dressGirl).EnableEnemyMesh(true, true); StopAllAnimations(); ((MonoBehaviour)this).StartCoroutine(DressGirlAI_ZapLevitateKillPatch.LevitateThenKill(dressGirl, player, 2f, 1.7f)); } else { NetworkObjectReference playerRef = default(NetworkObjectReference); ((NetworkObjectReference)(ref playerRef))..ctor(((NetworkBehaviour)player).NetworkObject); RequestKillServerRpc(playerRef); } } } private void StopAllAnimations() { if ((Object)(object)dressGirl != (Object)null && (Object)(object)((EnemyAI)dressGirl).creatureAnimator != (Object)null) { ((EnemyAI)dressGirl).agent.speed = 0f; ((EnemyAI)dressGirl).creatureAnimator.SetBool("Walk", false); ((EnemyAI)dressGirl).creatureAnimator.SetBool("Attacking", false); ((EnemyAI)dressGirl).creatureAnimator.SetBool("Chasing", false); ((EnemyAI)dressGirl).creatureAnimator.SetBool("Staring", false); ((EnemyAI)dressGirl).creatureAnimator.Play("Idle"); dressGirl.staringInHaunt = false; dressGirl.disappearingFromStare = false; } } [ServerRpc(RequireOwnership = false)] private void RequestKillServerRpc(NetworkObjectReference playerRef) { NetworkObject val = default(NetworkObject); if (((NetworkObjectReference)(ref playerRef)).TryGet(ref val, (NetworkManager)null)) { PlayerControllerB component = ((Component)val).GetComponent<PlayerControllerB>(); if ((Object)(object)component != (Object)null) { StopAllAnimations(); ((MonoBehaviour)this).StartCoroutine(DressGirlAI_ZapLevitateKillPatch.LevitateThenKill(dressGirl, component, 2f, 1.7f)); } } } [ClientRpc] private void SyncAnimationStopClientRpc() { StopAllAnimations(); } public void StopShockingWithGun() { isBeingShocked = false; } } [HarmonyPatch(typeof(DressGirlAI))] [HarmonyPatch("OnCollideWithPlayer")] [HarmonyPriority(200)] public class DressGirlAI_ZapLevitateKillPatch { private static float LEVITATE_HEIGHT = 5f; private const float LEVITATE_DURATION = 4f; private static bool flashApplied = false; private static bool enemyKilled = false; private static bool Prefix(Collider other, DressGirlAI __instance) { if ((Object)(object)((Component)other).GetComponent<NeutronaWandDamageMarker>() != (Object)null || (Object)(object)((Component)other).GetComponent<PatcherTool>() != (Object)null) { if (NetworkManager.Singleton.IsServer || NetworkManager.Singleton.IsHost) { ((MonoBehaviour)__instance).StartCoroutine(LevitateThenKill(__instance, StartOfRound.Instance.localPlayerController, 4f, LEVITATE_HEIGHT)); } return false; } return true; } public static IEnumerator LevitateThenKill(DressGirlAI instance, PlayerControllerB shootingPlayer, float liftDuration, float upwardForce) { float slowedLiftDuration = liftDuration * 2f; if (!NetworkManager.Singleton.IsServer && !NetworkManager.Singleton.IsHost) { yield break; } if ((Object)(object)((EnemyAI)instance).agent != (Object)null) { _ = ((Behaviour)((EnemyAI)instance).agent).enabled; ((Behaviour)((EnemyAI)instance).agent).enabled = false; } flashApplied = false; enemyKilled = false; ((EnemyAI)instance).EnableEnemyMesh(true, true); instance.staringInHaunt = false; instance.disappearingFromStare = false; ((EnemyAI)instance).creatureAnimator.SetBool("Walk", false); ((EnemyAI)instance).creatureAnimator.SetBool("Attacking", false); ((EnemyAI)instance).creatureAnimator.SetBool("Chasing", false); ((EnemyAI)instance).creatureAnimator.SetBool("Staring", false); ((EnemyAI)instance).creatureAnimator.Play("Idle"); Vector3 startPos = ((Component)instance).transform.position; float initialYPos = startPos.y; Vector3 targetPos = new Vector3(startPos.x, initialYPos + upwardForce, startPos.z); Rigidbody rb = ((Component)instance).gameObject.GetComponent<Rigidbody>(); bool wasKinematic = false; if ((Object)(object)rb != (Object)null) { wasKinematic = rb.isKinematic; rb.isKinematic = true; } List<Collider> colliders = new List<Collider>(((Component)instance).gameObject.GetComponents<Collider>()); foreach (Collider collider2 in colliders) { collider2.enabled = false; } float levitateTime = 0f; float spinSpeed = 2880f; while (levitateTime < slowedLiftDuration) { float t = levitateTime / slowedLiftDuration; float smoothT = Mathf.SmoothStep(0f, 1f, t); Vector3 newPosition = Vector3.Lerp(startPos, targetPos, smoothT); ((Component)instance).transform.position = newPosition; ((Component)instance).transform.Rotate(Vector3.up, spinSpeed * Time.deltaTime); if (Mathf.Abs(((Component)instance).transform.position.y - newPosition.y) > 0.01f) { Vector3 correctedPos = ((Component)instance).transform.position; correctedPos.y = newPosition.y; ((Component)instance).transform.position = correctedPos; } levitateTime += Time.deltaTime; yield return null; } ((Component)instance).transform.position = targetPos; if ((Object)(object)HUDManager.Instance != (Object)null) { HUDManager.Instance.flashFilter = 0.85f; try { GameObject flashLight = new GameObject("ZapDeathLight"); Light light = flashLight.AddComponent<Light>(); light.type = (LightType)2; light.color = new Color(0.2f, 1f, 0f); light.intensity = 5f; light.range = 10f; flashLight.transform.position = ((Component)instance).transform.position; ((MonoBehaviour)instance).StartCoroutine(FadeAndDestroyLight(flashLight)); } catch (Exception) { } } float postFlashDuration = 1.5f; float postFlashTimer = 0f; while (postFlashTimer < postFlashDuration) { if (((Component)instance).transform.position.y < targetPos.y - 0.01f) { Vector3 correctedPos2 = ((Component)instance).transform.position; correctedPos2.y = targetPos.y; ((Component)instance).transform.position = correctedPos2; } ((Component)instance).transform.Rotate(Vector3.up, spinSpeed * Time.deltaTime); postFlashTimer += Time.deltaTime; yield return null; } GrabbableObject val = shootingPlayer?.currentlyHeldObjectServer; PatcherTool patcherTool = (PatcherTool)(object)((val is PatcherTool) ? val : null); if (patcherTool != null) { patcherTool.StopShockingServerRpc(); patcherTool.StopShockingAnomalyOnClient(false); } ((EnemyAI)instance).isEnemyDead = true; ((EnemyAI)instance).KillEnemyServerRpc(true); ((EnemyAI)instance).EnableEnemyMesh(false, true); ((Component)instance).gameObject.SetActive(false); if ((Object)(object)rb != (Object)null) { rb.isKinematic = wasKinematic; } foreach (Collider collider in colliders) { collider.enabled = true; } } private static IEnumerator FadeAndDestroyLight(GameObject lightObject) { if ((Object)(object)lightObject == (Object)null) { yield break; } Light light = lightObject.GetComponent<Light>(); if (!((Object)(object)light == (Object)null)) { float duration = 0.5f; float startIntensity = light.intensity; float timer = 0f; while (timer < duration && !((Object)(object)light == (Object)null)) { float t = timer / duration; light.intensity = Mathf.Lerp(startIntensity, 0f, t); timer += Time.deltaTime; yield return null; } if ((Object)(object)lightObject != (Object)null) { Object.Destroy((Object)(object)lightObject); } } } } [HarmonyPatch] public static class DressGirlSpawnPatch { private static Dictionary<int, int> dressGirlsKilledOnMoon = new Dictionary<int, int>(); private static bool hasSpawnedInitialDressGirl = false; private static EnemyType dressGirlEnemyType; private static List<DressGirlAI> spawnedDressGirls = new List<DressGirlAI>(); [HarmonyPatch(typeof(RoundManager), "FinishGeneratingLevel")] [HarmonyPostfix] public static void FinishGeneratingLevel_Postfix(RoundManager __instance) { if (Plugin.EnableDressGirlx2 == null || !Plugin.EnableDressGirlx2.Value) { ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)"DressGirlx2 feature is disabled in config"); } return; } hasSpawnedInitialDressGirl = false; spawnedDressGirls.Clear(); int currentLevelID = StartOfRound.Instance.currentLevelID; if (!dressGirlsKilledOnMoon.ContainsKey(currentLevelID)) { dressGirlsKilledOnMoon[currentLevelID] = 0; } else { dressGirlsKilledOnMoon[currentLevelID] = 0; } if (((NetworkBehaviour)RoundManager.Instance).IsServer) { ManualLogSource? logger2 = Plugin.Logger; if (logger2 != null) { logger2.LogInfo((object)$"Starting DressGirl spawn setup for level {currentLevelID}"); } ((MonoBehaviour)__instance).StartCoroutine(WaitForNavMeshAndSpawnDressGirl()); } } private static IEnumerator WaitForNavMeshAndSpawnDressGirl() { if (Plugin.EnableDressGirlx2 == null || !Plugin.EnableDressGirlx2.Value) { yield break; } yield return (object)new WaitUntil((Func<bool>)(() => RoundManager.Instance.bakedNavMesh)); if ((Object)(object)dressGirlEnemyType == (Object)null) { SelectableLevel[] levels = StartOfRound.Instance.levels; foreach (SelectableLevel level in levels) { foreach (SpawnableEnemyWithRarity enemy in level.Enemies) { if ((Object)(object)enemy.enemyType.enemyPrefab.GetComponent<DressGirlAI>() != (Object)null) { dressGirlEnemyType = enemy.enemyType; ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)"Found DressGirl enemy type"); } break; } } if ((Object)(object)dressGirlEnemyType != (Object)null) { break; } } if ((Object)(object)dressGirlEnemyType == (Object)null) { ManualLogSource? logger2 = Plugin.Logger; if (logger2 != null) { logger2.LogError((object)"Could not find DressGirl enemy type!"); } yield break; } } ManualLogSource? logger3 = Plugin.Logger; if (logger3 != null) { logger3.LogInfo((object)"Waiting 1 minute before spawning initial DressGirl"); } yield return (object)new WaitForSeconds(60f); if (Plugin.EnableDressGirlx2 == null || !Plugin.EnableDressGirlx2.Value) { yield break; } if (!hasSpawnedInitialDressGirl) { SpawnDressGirl(1); hasSpawnedInitialDressGirl = true; ManualLogSource? logger4 = Plugin.Logger; if (logger4 != null) { logger4.LogInfo((object)"Spawned initial DressGirl after 1 minute delay"); } } ((MonoBehaviour)RoundManager.Instance).StartCoroutine(MonitorDressGirlDeaths()); } private static IEnumerator MonitorDressGirlDeaths() { while (Plugin.EnableDressGirlx2 != null && Plugin.EnableDressGirlx2.Value) { for (int i = spawnedDressGirls.Count - 1; i >= 0; i--) { if ((Object)(object)spawnedDressGirls[i] == (Object)null || ((EnemyAI)spawnedDressGirls[i]).isEnemyDead) { int currentLevelID = StartOfRound.Instance.currentLevelID; dressGirlsKilledOnMoon[currentLevelID]++; ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)$"DressGirl killed! Total killed on moon {currentLevelID}: {dressGirlsKilledOnMoon[currentLevelID]}"); } ((MonoBehaviour)RoundManager.Instance).StartCoroutine(SpawnAdditionalDressGirls()); spawnedDressGirls.RemoveAt(i); } } yield return (object)new WaitForSeconds(1f); } } private static IEnumerator SpawnAdditionalDressGirls() { if (Plugin.EnableDressGirlx2 == null || !Plugin.EnableDressGirlx2.Value) { yield break; } yield return (object)new WaitForSeconds(3f); if (Plugin.EnableDressGirlx2 != null && Plugin.EnableDressGirlx2.Value) { SpawnDressGirl(2); ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)"Spawned 2 additional DressGirls"); } } } private static void SpawnDressGirl(int count) { //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_0090: 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_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_0201: 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_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0115: 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) if ((Object)(object)dressGirlEnemyType == (Object)null || !((NetworkBehaviour)RoundManager.Instance).IsServer || Plugin.EnableDressGirlx2 == null || !Plugin.EnableDressGirlx2.Value) { return; } for (int i = 0; i < count; i++) { if (GameNetworkManager.Instance.localPlayerController.isInsideFactory) { GameObject[] array = GameObject.FindGameObjectsWithTag("AINode"); if (array.Length == 0) { continue; } for (int j = 0; j < 10; j++) { int num = Random.Range(0, array.Length); Vector3 position = array[num].transform.position; bool flag = true; PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (val.isPlayerControlled && Vector3.Distance(position, ((Component)val).transform.position) < 15f) { flag = false; break; } } if (flag) { NetworkObjectReference enemyRef = RoundManager.Instance.SpawnEnemyGameObject(position, 0f, -1, dressGirlEnemyType); TrackSpawnedDressGirl(enemyRef); break; } } continue; } GameObject[] array2 = GameObject.FindGameObjectsWithTag("OutsideAINode"); if (array2.Length == 0) { continue; } for (int l = 0; l < 10; l++) { int num2 = Random.Range(0, array2.Length); Vector3 position2 = array2[num2].transform.position; bool flag2 = true; PlayerControllerB[] allPlayerScripts2 = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val2 in allPlayerScripts2) { if (val2.isPlayerControlled && Vector3.Distance(position2, ((Component)val2).transform.position) < 20f) { flag2 = false; break; } } if (flag2) { NetworkObjectReference enemyRef2 = RoundManager.Instance.SpawnEnemyGameObject(position2, 0f, -1, dressGirlEnemyType); TrackSpawnedDressGirl(enemyRef2); break; } } } } private static void TrackSpawnedDressGirl(NetworkObjectReference enemyRef) { NetworkObject val = default(NetworkObject); if (!((NetworkObjectReference)(ref enemyRef)).TryGet(ref val, (NetworkManager)null)) { return; } DressGirlAI component = ((Component)val).GetComponent<DressGirlAI>(); if ((Object)(object)component != (Object)null) { spawnedDressGirls.Add(component); ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)"Successfully spawned and tracked DressGirl"); } } } } [HarmonyPatch(typeof(EnemyAI))] [HarmonyPatch("Start")] public class Enemy_ShockablePatch { static Enemy_ShockablePatch() { ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)"Enemy_ShockablePatch class initialized"); } } [HarmonyPostfix] private static void MakeShockable(EnemyAI __instance) { SpringManAI val = (SpringManAI)(object)((__instance is SpringManAI) ? __instance : null); if (val != null && !Object.op_Implicit((Object)(object)((Component)val).gameObject.GetComponent<SpringManShockable>())) { ((Component)val).gameObject.AddComponent<SpringManShockable>(); } NutcrackerEnemyAI val2 = (NutcrackerEnemyAI)(object)((__instance is NutcrackerEnemyAI) ? __instance : null); if (val2 != null && !Object.op_Implicit((Object)(object)((Component)val2).gameObject.GetComponent<NutcrackerShockable>())) { ((Component)val2).gameObject.AddComponent<NutcrackerShockable>(); } JesterAI val3 = (JesterAI)(object)((__instance is JesterAI) ? __instance : null); if (val3 != null && !Object.op_Implicit((Object)(object)((Component)val3).gameObject.GetComponent<JesterShockable>())) { ((Component)val3).gameObject.AddComponent<JesterShockable>(); } } } public class SpringManShockable : MonoBehaviour, IShockableWithGun { private SpringManAI? springMan; private void Awake() { if ((Object)(object)((Component)this).gameObject != (Object)null) { springMan = ((Component)this).GetComponent<SpringManAI>(); } } public bool CanBeShocked() { return (Object)(object)springMan != (Object)null && !((EnemyAI)springMan).isEnemyDead; } public float GetDifficultyMultiplier() { return 1f; } public NetworkObject? GetNetworkObject() { if ((Object)(object)springMan == (Object)null) { return null; } return ((NetworkBehaviour)springMan).NetworkObject; } public Vector3 GetShockablePosition() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: 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_001d: 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_002c: 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_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_003e: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)((Component)this).transform != (Object)null) { return ((Component)this).transform.position + Vector3.up * 2f; } return Vector3.zero; } public Transform GetShockableTransform() { return ((Component)this).transform; } public void ShockWithGun(PlayerControllerB shockedByPlayer) { if ((Object)(object)springMan != (Object)null && CanBeShocked() && (Object)(object)shockedByPlayer != (Object)null) { ((EnemyAI)springMan).HitEnemy(999, shockedByPlayer, false, -1); } } public void StopShockingWithGun() { } } public class NutcrackerShockable : MonoBehaviour, IShockableWithGun { private NutcrackerEnemyAI? nutcracker; private void Awake() { if ((Object)(object)((Component)this).gameObject != (Object)null) { nutcracker = ((Component)this).GetComponent<NutcrackerEnemyAI>(); } } public bool CanBeShocked() { return (Object)(object)nutcracker != (Object)null && !((EnemyAI)nutcracker).isEnemyDead; } public float GetDifficultyMultiplier() { return 1f; } public NetworkObject? GetNetworkObject() { if ((Object)(object)nutcracker == (Object)null) { return null; } return ((NetworkBehaviour)nutcracker).NetworkObject; } public Vector3 GetShockablePosition() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: 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_001d: 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_002c: 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_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_003e: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)((Component)this).transform != (Object)null) { return ((Component)this).transform.position + Vector3.up * 2f; } return Vector3.zero; } public Transform GetShockableTransform() { return ((Component)this).transform; } public void ShockWithGun(PlayerControllerB shockedByPlayer) { if ((Object)(object)nutcracker != (Object)null && CanBeShocked() && (Object)(object)shockedByPlayer != (Object)null) { ((EnemyAI)nutcracker).HitEnemy(999, shockedByPlayer, false, -1); } } public void StopShockingWithGun() { } } public class JesterShockable : MonoBehaviour, IShockableWithGun { private JesterAI? jester; private void Awake() { if ((Object)(object)((Component)this).gameObject != (Object)null) { jester = ((Component)this).GetComponent<JesterAI>(); } } public bool CanBeShocked() { return (Object)(object)jester != (Object)null && !((EnemyAI)jester).isEnemyDead; } public float GetDifficultyMultiplier() { return 1f; } public NetworkObject? GetNetworkObject() { if ((Object)(object)jester == (Object)null) { return null; } return ((NetworkBehaviour)jester).NetworkObject; } public Vector3 GetShockablePosition() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: 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_001d: 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_002c: 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_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_003e: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)((Component)this).transform != (Object)null) { return ((Component)this).transform.position + Vector3.up * 2f; } return Vector3.zero; } public Transform GetShockableTransform() { return ((Component)this).transform; } public void ShockWithGun(PlayerControllerB shockedByPlayer) { if ((Object)(object)jester != (Object)null && CanBeShocked() && (Object)(object)shockedByPlayer != (Object)null) { ((EnemyAI)jester).HitEnemy(999, shockedByPlayer, false, -1); } } public void StopShockingWithGun() { } } [HarmonyPatch] public static class MenuManagerLogoOverridePatch { public static Texture2D? spookyLogo; [HarmonyPatch(typeof(MenuManager), "Awake")] [HarmonyPostfix] [HarmonyPriority(0)] public static void Awake_Postfix(MenuManager __instance) { //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) if (__instance.isInitScene) { return; } try { if ((Object)(object)spookyLogo == (Object)null) { ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogError((object)"Spooky logo texture is null!"); } return; } Sprite sprite = Sprite.Create(spookyLogo, new Rect(0f, 0f, (float)((Texture)spookyLogo).width, (float)((Texture)spookyLogo).height), new Vector2(0.5f, 0.5f)); GameObject gameObject = ((Component)((Component)__instance).transform.parent).gameObject; Transform val = gameObject.transform.Find("MenuContainer/MainButtons/HeaderImage"); if ((Object)(object)val != (Object)null) { ((Component)val).gameObject.GetComponent<Image>().sprite = sprite; } Transform val2 = gameObject.transform.Find("MenuContainer/LoadingScreen"); if ((Object)(object)val2 != (Object)null) { val2.localScale = new Vector3(1.02f, 1.06f, 1.02f); Transform val3 = val2.Find("Image"); if ((Object)(object)val3 != (Object)null) { ((Component)val3).GetComponent<Image>().sprite = sprite; } } ManualLogSource? logger2 = Plugin.Logger; if (logger2 != null) { logger2.LogInfo((object)"Spooky Company logo applied successfully!"); } } catch (Exception arg) { ManualLogSource? logger3 = Plugin.Logger; if (logger3 != null) { logger3.LogError((object)$"Failed to replace logo: {arg}"); } } } } [HarmonyPatch] public static class SpookyMenuColorPatch { public static Color SpookyGreen = new Color(0f, 1f, 0f); [HarmonyPatch(typeof(MenuManager), "Start")] [HarmonyPostfix] [HarmonyPriority(0)] public static void Start_Postfix(MenuManager __instance) { if (!__instance.isInitScene) { ((MonoBehaviour)__instance).StartCoroutine(ApplySpookyTheme(__instance)); } } private static IEnumerator ApplySpookyTheme(MenuManager menuManager) { yield return (object)new WaitForSeconds(0.3f); try { ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)"Applying Spooky Company theme..."); } if ((Object)(object)menuManager.versionNumberText != (Object)null) { ((Graphic)menuManager.versionNumberText).color = SpookyGreen; ManualLogSource? logger2 = Plugin.Logger; if (logger2 != null) { logger2.LogInfo((object)"Changed version text color"); } } ChangeMenuButtonColors(menuManager); ChangeBorderElements(menuManager); if ((Object)(object)menuManager.menuNotificationText != (Object)null) { ((Graphic)menuManager.menuNotificationText).color = SpookyGreen; } if ((Object)(object)menuManager.menuNotificationButtonText != (Object)null) { ((Graphic)menuManager.menuNotificationButtonText).color = SpookyGreen; } if ((Object)(object)menuManager.loadingText != (Object)null) { ((Graphic)menuManager.loadingText).color = SpookyGreen; } if ((Object)(object)menuManager.launchedInLanModeText != (Object)null) { ((Graphic)menuManager.launchedInLanModeText).color = SpookyGreen; } if ((Object)(object)menuManager.tipTextHostSettings != (Object)null) { ((Graphic)menuManager.tipTextHostSettings).color = SpookyGreen; } if ((Object)(object)menuManager.logText != (Object)null) { ((Graphic)menuManager.logText).color = SpookyGreen; } if ((Object)(object)menuManager.privatePublicDescription != (Object)null) { ((Graphic)menuManager.privatePublicDescription).color = SpookyGreen; } if ((Object)(object)menuManager.changesNotAppliedText != (Object)null) { ((Graphic)menuManager.changesNotAppliedText).color = SpookyGreen; } if ((Object)(object)menuManager.settingsBackButton != (Object)null) { ((Graphic)menuManager.settingsBackButton).color = SpookyGreen; } if ((Object)(object)menuManager.leaderboardHeaderText != (Object)null) { ((Graphic)menuManager.leaderboardHeaderText).color = SpookyGreen; } if ((Object)(object)menuManager.leaderboardLoadingText != (Object)null) { ((Graphic)menuManager.leaderboardLoadingText).color = SpookyGreen; } if ((Object)(object)menuManager.submittedRankText != (Object)null) { ((Graphic)menuManager.submittedRankText).color = SpookyGreen; } ManualLogSource? logger3 = Plugin.Logger; if (logger3 != null) { logger3.LogInfo((object)"Spooky Company theme applied successfully!"); } } catch (Exception ex) { ManualLogSource? logger4 = Plugin.Logger; if (logger4 != null) { logger4.LogError((object)$"Failed to apply Spooky Company theme: {ex}"); } } } private static void ChangeMenuButtonColors(MenuManager menuManager) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) try { Transform transform = menuManager.menuButtons.transform; TextMeshProUGUI[] componentsInChildren = ((Component)transform).GetComponentsInChildren<TextMeshProUGUI>(true); foreach (TextMeshProUGUI val in componentsInChildren) { ((Graphic)val).color = SpookyGreen; ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)("Changed color of text: " + ((TMP_Text)val).text)); } } Image[] componentsInChildren2 = ((Component)transform).GetComponentsInChildren<Image>(true); foreach (Image val2 in componentsInChildren2) { if (((Object)val2).name.Contains("Background")) { continue; } if (((Object)val2).name.Contains("Highlight")) { float a = ((Graphic)val2).color.a; ((Graphic)val2).color = new Color(SpookyGreen.r, SpookyGreen.g, SpookyGreen.b, a); ManualLogSource? logger2 = Plugin.Logger; if (logger2 != null) { logger2.LogInfo((object)("Changed highlight color: " + ((Object)val2).name)); } } else if (((Object)val2).name.Contains("Chevron") || ((Object)val2).name.Contains("Arrow") || ((Object)val2).name == ">") { ((Graphic)val2).color = SpookyGreen; ManualLogSource? logger3 = Plugin.Logger; if (logger3 != null) { logger3.LogInfo((object)("Changed indicator color: " + ((Object)val2).name)); } } } } catch (Exception arg) { ManualLogSource? logger4 = Plugin.Logger; if (logger4 != null) { logger4.LogError((object)$"Error changing menu button colors: {arg}"); } } } private static void ChangeBorderElements(MenuManager menuManager) { //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) try { Image[] array = Object.FindObjectsOfType<Image>(true); foreach (Image val in array) { if (((Object)val).name.Contains("Corner") || ((Object)val).name.Contains("Border") || ((Object)val).name.Contains("Frame") || ((Object)val).name.Contains("Edge")) { ((Graphic)val).color = SpookyGreen; ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)("Changed border element: " + ((Object)val).name)); } } } GameObject gameObject = ((Component)((Component)menuManager).transform.parent).gameObject; string[] array2 = new string[8] { "CornerTL", "CornerTR", "CornerBL", "CornerBR", "BorderTopLeft", "BorderTopRight", "BorderBottomLeft", "BorderBottomRight" }; string[] array3 = array2; foreach (string text in array3) { Transform val2 = gameObject.transform.Find(text); if (!((Object)(object)val2 != (Object)null)) { continue; } Image component = ((Component)val2).GetComponent<Image>(); if ((Object)(object)component != (Object)null) { ((Graphic)component).color = SpookyGreen; ManualLogSource? logger2 = Plugin.Logger; if (logger2 != null) { logger2.LogInfo((object)("Changed corner: " + text)); } } } } catch (Exception arg) { ManualLogSource? logger3 = Plugin.Logger; if (logger3 != null) { logger3.LogError((object)$"Error changing border elements: {arg}"); } } } } [HarmonyPatch(typeof(PatcherTool))] internal class PatcherToolPatch { public static readonly Dictionary<PatcherTool, LightningBoltScript> SecondaryBeams = new Dictionary<PatcherTool, LightningBoltScript>(); public static readonly Dictionary<PatcherTool, LightningBoltScript> TertiaryBeams = new Dictionary<PatcherTool, LightningBoltScript>(); public static readonly Dictionary<PatcherTool, LightningBoltScript> QuaternaryBeams = new Dictionary<PatcherTool, LightningBoltScript>(); public static readonly Dictionary<PatcherTool, LightningBoltScript> QuinaryBeams = new Dictionary<PatcherTool, LightningBoltScript>(); private static readonly Color SecondaryColor = new Color(0.1f, 0.4f, 0.8f, 1f); private static readonly Color SecondaryGlow = new Color(0.3f, 0.6f, 1f, 1f) * 2f; private static readonly Color TertiaryColor = new Color(1f, 0.2f, 0.2f, 1f); private static readonly Color TertiaryGlow = new Color(1f, 0.4f, 0.4f, 1f) * 2f; private static readonly Color QuaternaryColor = new Color(0.2f, 1f, 0f, 1f); private static readonly Color QuaternaryGlow = new Color(0.4f, 1f, 0.2f, 1f) * 2f; private static readonly Color QuinaryColor = new Color(0.5f, 0f, 1f, 1f); private static readonly Color QuinaryGlow = new Color(0.7f, 0.2f, 1f, 1f) * 2f; private const float SecondaryOffset = 0.1f; private const float TertiaryOffset = 0.2f; private const float QuaternaryOffset = 0.3f; private const float QuinaryOffset = 0.4f; [HarmonyPostfix] [HarmonyPatch("BeginShockingAnomalyOnClient")] private static void BeginShockingPatch(PatcherTool __instance) { //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0075: 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_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: 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_00c5: 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_00d8: 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_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01bb: Unknown result type (might be due to invalid IL or missing references) try { if ((Object)(object)__instance?.lightningObject == (Object)null) { ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogError((object)"BeginShockingPatch: Missing lightningObject"); } return; } ManualLogSource? logger2 = Plugin.Logger; if (logger2 != null) { logger2.LogInfo((object)"BeginShockingPatch called"); } LightningSplineScript component = __instance.lightningObject.GetComponent<LightningSplineScript>(); if ((Object)(object)component != (Object)null) { ((LightningBoltScript)component).LightningTintColor = Color32.op_Implicit(new Color32((byte)100, (byte)200, (byte)100, (byte)0)); ((LightningBoltScript)component).GlowTintColor = Color32.op_Implicit(new Color32((byte)50, (byte)150, (byte)50, (byte)0)); LightningBoltScript component2 = __instance.lightningObject.GetComponent<LightningBoltScript>(); if ((Object)(object)component2 != (Object)null) { component2.LightningTintColor = Color32.op_Implicit(new Color32(byte.MaxValue, (byte)140, (byte)0, (byte)0)); component2.GlowTintColor = Color32.op_Implicit(new Color32(byte.MaxValue, (byte)0, (byte)0, (byte)0)); } if (!SecondaryBeams.ContainsKey(__instance)) { SecondaryBeams[__instance] = CreateCustomBeam(__instance, "SecondaryBeam", SecondaryColor, SecondaryGlow, 0.1f); } if (!TertiaryBeams.ContainsKey(__instance)) { TertiaryBeams[__instance] = CreateCustomBeam(__instance, "TertiaryBeam", TertiaryColor, TertiaryGlow, 0.2f); } if (!QuaternaryBeams.ContainsKey(__instance)) { QuaternaryBeams[__instance] = CreateCustomBeam(__instance, "QuaternaryBeam", QuaternaryColor, QuaternaryGlow, 0.3f); } if (!QuinaryBeams.ContainsKey(__instance)) { QuinaryBeams[__instance] = CreateCustomBeam(__instance, "QuinaryBeam", QuinaryColor, QuinaryGlow, 0.4f); } } } catch (Exception ex) { ManualLogSource? logger3 = Plugin.Logger; if (logger3 != null) { logger3.LogError((object)("Error in BeginShockingPatch: " + ex.Message)); } } } [HarmonyPostfix] [HarmonyPatch("LateUpdate")] private static void LateUpdatePatch(PatcherTool __instance) { if (!((Object)(object)__instance == (Object)null) && __instance.isShocking && __instance.shockedTargetScript != null) { UpdateBeam(__instance, SecondaryBeams, 0.1f); UpdateBeam(__instance, TertiaryBeams, 0.2f); UpdateBeam(__instance, QuaternaryBeams, 0.3f); UpdateBeam(__instance, QuinaryBeams, 0.4f); } } [HarmonyPostfix] [HarmonyPatch("StopShockingAnomalyOnClient")] private static void StopShockingPatch(PatcherTool __instance) { PatcherTool __instance2 = __instance; try { if (!((Object)(object)__instance2 == (Object)null)) { SafeDeactivateBeam(SecondaryBeams); SafeDeactivateBeam(TertiaryBeams); SafeDeactivateBeam(QuaternaryBeams); SafeDeactivateBeam(QuinaryBeams); } } catch (Exception ex) { ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogError((object)("Error in StopShockingPatch: " + ex.Message)); } } void SafeDeactivateBeam(Dictionary<PatcherTool, LightningBoltScript> beams) { if (beams.TryGetValue(__instance2, out LightningBoltScript value) && (Object)(object)((value != null) ? ((Component)value).gameObject : null) != (Object)null) { ((Component)value).gameObject.SetActive(false); try { MethodInfo method = typeof(LightningBoltScript).GetMethod("OnDisable", BindingFlags.Instance | BindingFlags.NonPublic); if (method != null) { method.Invoke(value, null); } } catch (Exception ex2) { ManualLogSource? logger2 = Plugin.Logger; if (logger2 != null) { logger2.LogWarning((object)("Could not call OnDisable: " + ex2.Message)); } } } } } private static LightningBoltScript CreateCustomBeam(PatcherTool instance, string beamName, Color tintColor, Color glowColor, float horizontalOffset) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Expected O, but got Unknown //IL_01fa: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Unknown result type (might be due to invalid IL or missing references) //IL_0202: 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_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_01c1: Unknown result type (might be due to invalid IL or missing references) //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01e5: Expected O, but got Unknown //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01f7: Expected O, but got Unknown try { GameObject val = new GameObject(beamName); val.transform.SetParent(((Component)instance).transform, false); LightningBoltScript val2 = val.AddComponent<LightningBoltScript>(); if ((Object)(object)instance.lightningObject != (Object)null) { LightningBoltScript component = instance.lightningObject.GetComponent<LightningBoltScript>(); if ((Object)(object)component != (Object)null) { val2.Camera = component.Camera; val2.CameraMode = component.CameraMode; val2.UseWorldSpace = component.UseWorldSpace; val2.CompensateForParentTransform = component.CompensateForParentTransform; val2.MultiThreaded = component.MultiThreaded; val2.LevelOfDetailDistance = component.LevelOfDetailDistance; val2.UseGameTime = component.UseGameTime; val2.SortLayerName = component.SortLayerName; val2.SortOrderInLayer = component.SortOrderInLayer; val2.SoftParticlesFactor = component.SoftParticlesFactor; val2.RenderQueue = component.RenderQueue; val2.LightningStartedCallback = component.LightningStartedCallback; val2.LightningEndedCallback = component.LightningEndedCallback; val2.LightAddedCallback = component.LightAddedCallback; val2.LightRemovedCallback = component.LightRemovedCallback; val2.LightningTexture = component.LightningTexture; val2.LightningGlowTexture = component.LightningGlowTexture; val2.LightningOriginParticleSystem = component.LightningOriginParticleSystem; val2.LightningDestinationParticleSystem = component.LightningDestinationParticleSystem; val2.SourceBlendMode = component.SourceBlendMode; val2.DestinationBlendMode = component.DestinationBlendMode; val2.SourceBlendModeGlow = component.SourceBlendModeGlow; val2.DestinationBlendModeGlow = component.DestinationBlendModeGlow; val2.JitterMultiplier = component.JitterMultiplier; val2.Turbulence = component.Turbulence; val2.TurbulenceVelocity = component.TurbulenceVelocity; val2.IntensityFlicker = component.IntensityFlicker; val2.QualitySetting = component.QualitySetting; val2.MainTrunkTintColor = component.MainTrunkTintColor; val2.LightningMaterialMesh = new Material(component.LightningMaterialMesh); val2.LightningMaterialMeshNoGlow = new Material(component.LightningMaterialMeshNoGlow); } } val2.LightningTintColor = tintColor; val2.GlowTintColor = glowColor; MethodInfo method = typeof(LightningBoltScript).GetMethod("Start", BindingFlags.Instance | BindingFlags.NonPublic); if (method != null) { ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)("Calling Start() method on " + beamName)); } method.Invoke(val2, null); } else { ManualLogSource? logger2 = Plugin.Logger; if (logger2 != null) { logger2.LogWarning((object)"Could not find Start method on LightningBoltScript"); } } val.SetActive(false); return val2; } catch (Exception ex) { ManualLogSource? logger3 = Plugin.Logger; if (logger3 != null) { logger3.LogError((object)("Error in CreateCustomBeam: " + ex.Message + "\n" + ex.StackTrace)); } return null; } } private static void UpdateBeam(PatcherTool __instance, Dictionary<PatcherTool, LightningBoltScript> beams, float offset) { //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: 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_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_01e7: Unknown result type (might be due to invalid IL or missing references) //IL_01e9: Unknown result type (might be due to invalid IL or missing references) //IL_01f5: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_0201: 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_02b3: Unknown result type (might be due to invalid IL or missing references) //IL_023d: Unknown result type (might be due to invalid IL or missing references) //IL_0254: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Unknown result type (might be due to invalid IL or missing references) //IL_025b: Unknown result type (might be due to invalid IL or missing references) //IL_0272: Unknown result type (might be due to invalid IL or missing references) //IL_0277: Unknown result type (might be due to invalid IL or missing references) //IL_0279: Unknown result type (might be due to invalid IL or missing references) //IL_028b: Unknown result type (might be due to invalid IL or missing references) //IL_02c0: Unknown result type (might be due to invalid IL or missing references) //IL_02c6: Unknown result type (might be due to invalid IL or missing references) try { if ((Object)(object)__instance == (Object)null || !__instance.isShocking || !beams.TryGetValue(__instance, out LightningBoltScript value) || !((Object)(object)((value != null) ? ((Component)value).gameObject : null) != (Object)null) || !((Object)(object)((Component)__instance).transform != (Object)null) || __instance.shockedTargetScript == null) { return; } if (!((Component)value).gameObject.activeInHierarchy) { ((Component)value).gameObject.SetActive(true); } LightningBoltScript component = __instance.lightningObject.GetComponent<LightningBoltScript>(); if (!((Object)(object)component != (Object)null) || component.HasActiveBolts) { } LightningBoltParameters orCreateParameters = LightningBoltParameters.GetOrCreateParameters(); orCreateParameters.Generations = 6; orCreateParameters.ChaosFactor = 0.075f; orCreateParameters.ChaosFactorForks = 0f; orCreateParameters.TrunkWidth = 0.1f; orCreateParameters.LifeTime = 0.1f; orCreateParameters.Intensity = 1f; orCreateParameters.GlowIntensity = 0.1f; orCreateParameters.GlowWidthMultiplier = 1f; orCreateParameters.Forkedness = 0f; orCreateParameters.FadePercent = 0f; orCreateParameters.FadeInMultiplier = 1f; orCreateParameters.FadeOutMultiplier = 1f; orCreateParameters.GrowthMultiplier = 0f; orCreateParameters.EndWidthMultiplier = 1f; orCreateParameters.GenerationWhereForksStopSubtractor = 5; if ((Object)(object)__instance.lightningObject != (Object)null) { LightningBoltScript component2 = __instance.lightningObject.GetComponent<LightningBoltScript>(); if (!((Object)(object)component2 != (Object)null)) { } } float num = 0.31f; float num2 = -0.27f; Vector3 val = __instance.aimDirection.right * offset; Vector3 val2 = Vector3.up * num2; Vector3 start = __instance.aimDirection.position + __instance.aimDirection.forward * num + val + val2; orCreateParameters.Start = start; orCreateParameters.End = __instance.shockedTargetScript.GetShockablePosition() + val; orCreateParameters.Points.Clear(); if ((Object)(object)__instance.lightningBend1 != (Object)null && (Object)(object)__instance.lightningBend2 != (Object)null) { orCreateParameters.Points.Add(orCreateParameters.Start); orCreateParameters.Points.Add(__instance.lightningBend1.position + val); orCreateParameters.Points.Add(__instance.lightningBend2.position + val); orCreateParameters.Points.Add(orCreateParameters.End); } else { orCreateParameters.Points.Add(orCreateParameters.Start); orCreateParameters.Points.Add(orCreateParameters.End); } if (Vector3.Distance(orCreateParameters.Start, orCreateParameters.End) > 0.1f) { value.CreateLightningBolt(orCreateParameters); } else { LightningBoltParameters.ReturnParametersToCache(orCreateParameters); } } catch (Exception ex) { ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogError((object)("Error in UpdateBeam: " + ex.Message + "\n" + ex.StackTrace)); } } } } } namespace NeutronaWand.Components { public class NeutronaWandDamageMarker : MonoBehaviour { private void Awake() { ManualLogSource? logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)"NeutronaWandDamageMarker component initialized"); } } } }