Decompiled source of V70PoweredLights Fix v1.1.0

V72LightFix.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using DunGen;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;

[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("V72LightFix")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("V72LightFix")]
[assembly: AssemblyTitle("V72LightFix")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
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;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.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;
		}
	}
	internal static class IsExternalInit
	{
	}
}
namespace V72LightFix
{
	internal static class PoweredLightsAnimators
	{
		private delegate void ManualPatch(GameObject animatorContainer);

		private readonly record struct AnimatorPatch(string AnimatorContainerPath, RuntimeAnimatorController AnimatorController, bool AddTagAndAnimator, ManualPatch? ManualPatch);

		private readonly record struct TilePatch(string TileName, AnimatorPatch[] Patches)
		{
			public readonly string TileCloneName = TileName + "(Clone)";
		}

		private readonly record struct AnimatorPatchDescriptor(string AnimatorContainerPath, string AnimatorControllerAssetPath, bool AddTagAndAnimator = false, ManualPatch? ManualPatch = null)
		{
			public AnimatorPatch Load(AssetBundle assetBundle)
			{
				RuntimeAnimatorController animatorController = assetBundle.LoadAsset<RuntimeAnimatorController>(AnimatorControllerAssetPath) ?? throw new FileNotFoundException("RuntimeAnimatorController not found: " + AnimatorControllerAssetPath, AnimatorControllerAssetPath);
				return new AnimatorPatch(AnimatorContainerPath, animatorController, AddTagAndAnimator, ManualPatch);
			}
		}

		private readonly record struct TilePatchDescriptor(string[] TileNames, AnimatorPatchDescriptor[] Descriptors)
		{
			public TilePatchDescriptor(string[] TileNames, AnimatorPatchDescriptor[] Descriptors)
			{
				this.TileNames = TileNames;
				this.Descriptors = Descriptors;
			}

			public TilePatchDescriptor(string TileName, AnimatorPatchDescriptor[] Descriptors)
				: this(new string[1] { TileName }, Descriptors)
			{
			}

			public TilePatch[] Load(AssetBundle assetBundle)
			{
				AnimatorPatch[] patches = Descriptors.Select((AnimatorPatchDescriptor d) => d.Load(assetBundle)).ToArray();
				return TileNames.Select((string tileName) => new TilePatch(tileName, patches)).ToArray();
			}
		}

		private const string PoweredLightTag = "PoweredLight";

		private static IDictionary<string, TilePatch> Patches = new Dictionary<string, TilePatch>();

		private static AudioClip AudioClipOn = null;

		private static AudioClip AudioClipOff = null;

		private static AudioClip AudioClipFlicker = null;

		public static void Load()
		{
			string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "poweredlightsanimators");
			AssetBundle assetBundle = AssetBundle.LoadFromFile(text) ?? throw new NullReferenceException("Failed to load bundle");
			AudioClipOn = assetBundle.LoadAsset<AudioClip>("Assets/LethalCompany/Mods/MuzikaGromche/AudioClips/LightOn.ogg");
			AudioClipOff = assetBundle.LoadAsset<AudioClip>("Assets/LethalCompany/Mods/MuzikaGromche/AudioClips/LightOff.ogg");
			AudioClipFlicker = assetBundle.LoadAsset<AudioClip>("Assets/LethalCompany/Mods/MuzikaGromche/AudioClips/LightFlicker.ogg");
			TilePatchDescriptor[] source = new TilePatchDescriptor[10]
			{
				new TilePatchDescriptor("KitchenTile", new AnimatorPatchDescriptor[2]
				{
					new AnimatorPatchDescriptor("PoweredLightTypeB", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/Point Light (4) (Patched).controller"),
					new AnimatorPatchDescriptor("PoweredLightTypeB (1)", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/Point Light (4) (Patched).controller")
				}),
				new TilePatchDescriptor("ManorStartRoom", new AnimatorPatchDescriptor[2]
				{
					new AnimatorPatchDescriptor("ManorStartRoom/Chandelier/PoweredLightTypeB (1)", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/Point Light (4) (Patched).controller"),
					new AnimatorPatchDescriptor("ManorStartRoom/Chandelier2/PoweredLightTypeB", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/Point Light (4) (Patched).controller")
				}),
				new TilePatchDescriptor("ManorStartRoomSmall", new AnimatorPatchDescriptor[2]
				{
					new AnimatorPatchDescriptor("ManorStartRoomMesh/Chandelier/PoweredLightTypeB (1)", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/Point Light (4) (Patched).controller"),
					new AnimatorPatchDescriptor("ManorStartRoomMesh/Chandelier2/PoweredLightTypeB", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/Point Light (4) (Patched).controller")
				}),
				new TilePatchDescriptor("NarrowHallwayTile2x2", new AnimatorPatchDescriptor[2]
				{
					new AnimatorPatchDescriptor("MineshaftSpotlight (1)", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/MineshaftSpotlight (Patched).controller"),
					new AnimatorPatchDescriptor("MineshaftSpotlight (2)", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/MineshaftSpotlight (Patched).controller")
				}),
				new TilePatchDescriptor("BirthdayRoomTile", new AnimatorPatchDescriptor[1]
				{
					new AnimatorPatchDescriptor("Lights/MineshaftSpotlight", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/MineshaftSpotlight (Patched).controller")
				}),
				new TilePatchDescriptor("BathroomTileContainer", new AnimatorPatchDescriptor[2]
				{
					new AnimatorPatchDescriptor("MineshaftSpotlight", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/MineshaftSpotlight (Patched).controller"),
					new AnimatorPatchDescriptor("LightbulbLine/lightbulbsLineMesh", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/lightbulbsLineMesh (Patched).controller")
				}),
				new TilePatchDescriptor(new string[2] { "BedroomTile", "BedroomTileB" }, new AnimatorPatchDescriptor[2]
				{
					new AnimatorPatchDescriptor("CeilingFanAnimContainer", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/CeilingFan (originally GameObject) (Patched).controller"),
					new AnimatorPatchDescriptor("MineshaftSpotlight (1)", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/MineshaftSpotlight (Patched).controller")
				}),
				new TilePatchDescriptor("GarageTile", new AnimatorPatchDescriptor[2]
				{
					new AnimatorPatchDescriptor("HangingLEDBarLight (3)", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/LEDHangingLight (Patched).controller"),
					new AnimatorPatchDescriptor("HangingLEDBarLight (4)", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/LEDHangingLight (Patched).controller")
				}),
				new TilePatchDescriptor("PoolTile", new AnimatorPatchDescriptor[3]
				{
					new AnimatorPatchDescriptor("PoolLights/HangingLEDBarLight", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/LEDHangingLight (Patched).controller"),
					new AnimatorPatchDescriptor("PoolLights/HangingLEDBarLight (4)", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/LEDHangingLight (Patched).controller"),
					new AnimatorPatchDescriptor("PoolLights/HangingLEDBarLight (5)", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/LEDHangingLight (Patched).controller")
				}),
				new TilePatchDescriptor("MineshaftStartTile", new AnimatorPatchDescriptor[2]
				{
					new AnimatorPatchDescriptor("Cylinder.001 (1)", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/MineshaftStartTileSpotlight (New).controller", AddTagAndAnimator: true),
					new AnimatorPatchDescriptor("Cylinder.001 (2)", "Assets/LethalCompany/Mods/MuzikaGromche/AnimatorControllers/MineshaftStartTileSpotlight (New).controller", AddTagAndAnimator: true)
				})
			};
			Patches = source.SelectMany((TilePatchDescriptor d) => d.Load(assetBundle)).ToDictionary((TilePatch d) => d.TileCloneName, (TilePatch d) => d);
		}

		public static void Patch(Tile tile)
		{
			//IL_019b: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)tile == (Object)null)
			{
				throw new ArgumentNullException("tile");
			}
			if (!Patches.TryGetValue(((Object)((Component)tile).gameObject).name, out var value))
			{
				return;
			}
			AnimatorPatch[] patches = value.Patches;
			PlayAudioAnimationEvent val3 = default(PlayAudioAnimationEvent);
			AudioSource val4 = default(AudioSource);
			for (int i = 0; i < patches.Length; i++)
			{
				AnimatorPatch animatorPatch = patches[i];
				Transform val = ((Component)tile).gameObject.transform.Find(animatorPatch.AnimatorContainerPath);
				if ((Object)(object)val == (Object)null)
				{
					throw new NullReferenceException(value.TileName + "/" + animatorPatch.AnimatorContainerPath + " Animation Container not found");
				}
				GameObject gameObject = ((Component)val).gameObject;
				Animator val2 = gameObject.GetComponent<Animator>();
				if (animatorPatch.AddTagAndAnimator)
				{
					gameObject.tag = "PoweredLight";
					if ((Object)(object)val2 == (Object)null)
					{
						val2 = gameObject.AddComponent<Animator>();
					}
					if (!gameObject.TryGetComponent<PlayAudioAnimationEvent>(ref val3))
					{
						val3 = gameObject.AddComponent<PlayAudioAnimationEvent>();
						val3.audioClip = AudioClipOn;
						val3.audioClip2 = AudioClipOff;
						val3.audioClip3 = AudioClipFlicker;
					}
					if (!gameObject.TryGetComponent<AudioSource>(ref val4))
					{
						AudioSource componentInChildren = ((Component)tile).gameObject.GetComponentInChildren<AudioSource>();
						if ((Object)(object)componentInChildren != (Object)null)
						{
							val4 = gameObject.AddComponent<AudioSource>();
							val4.spatialBlend = 1f;
							val4.playOnAwake = false;
							val4.outputAudioMixerGroup = componentInChildren.outputAudioMixerGroup;
							val4.spread = componentInChildren.spread;
							val4.rolloffMode = componentInChildren.rolloffMode;
							val4.maxDistance = componentInChildren.maxDistance;
							val4.SetCustomCurve((AudioSourceCurveType)0, componentInChildren.GetCustomCurve((AudioSourceCurveType)0));
						}
					}
				}
				if ((Object)(object)val2 == (Object)null)
				{
					throw new NullReferenceException(value.TileName + "/" + animatorPatch.AnimatorContainerPath + " Animation Component not found");
				}
				animatorPatch.ManualPatch?.Invoke(gameObject);
				val2.runtimeAnimatorController = animatorPatch.AnimatorController;
				Debug.Log((object)("PoweredLightsAnimatorsPatch " + value.TileName + "/" + animatorPatch.AnimatorContainerPath + ": Replaced animator controller"));
			}
		}
	}
	[HarmonyPatch(typeof(Tile), "AddTriggerVolume")]
	internal static class PoweredLightsAnimatorsPatch
	{
		[HarmonyPostfix]
		public static void OnAddTriggerVolume(Tile __instance)
		{
			if (((Object)((Component)__instance).gameObject).name.Contains("BathroomTileContainer"))
			{
				Transform val = ((Component)__instance).gameObject.transform.Find("MineshaftSpotlight");
				((Component)val).tag = "PoweredLight";
				Debug.Log((object)"Fixed Lights at BathRoom");
			}
			if (((Object)((Component)__instance).gameObject).name.Contains("BirthdayRoomTile"))
			{
				Transform val2 = ((Component)__instance).gameObject.transform.Find("Lights/MineshaftSpotlight");
				((Component)val2).tag = "PoweredLight";
				Debug.Log((object)"Fixed Lights at PartyRoom");
			}
			if (((Object)((Component)__instance).gameObject).name.Contains("BedroomTile"))
			{
				Transform val3 = ((Component)__instance).gameObject.transform.Find("MineshaftSpotlight (1)");
				((Component)val3).tag = "PoweredLight";
				Debug.Log((object)"Fixed Lights at Bedroom");
			}
			if (((Object)((Component)__instance).gameObject).name.Contains("BedroomTileB"))
			{
				Transform val4 = ((Component)__instance).gameObject.transform.Find("MineshaftSpotlight (1)");
				((Component)val4).tag = "PoweredLight";
				Debug.Log((object)"Fixed Lights at BedroomB");
			}
			if (((Object)((Component)__instance).gameObject).name.Contains("PoolTile"))
			{
				Transform val5 = ((Component)__instance).gameObject.transform.Find("PoolLights/HangingLEDBarLight");
				Transform val6 = ((Component)__instance).gameObject.transform.Find("PoolLights/HangingLEDBarLight (4)");
				Transform val7 = ((Component)__instance).gameObject.transform.Find("PoolLights/HangingLEDBarLight (5)");
				((Component)val5).tag = "PoweredLight";
				((Component)val6).tag = "PoweredLight";
				((Component)val7).tag = "PoweredLight";
				Debug.Log((object)"Fixed Lights at SwimingPool");
			}
			if (((Object)((Component)__instance).gameObject).name.Contains("GarageTile"))
			{
				Transform val8 = ((Component)__instance).gameObject.transform.Find("HangingLEDBarLight (4)/IndirectLight (1)");
				((Object)((Component)val8).gameObject).name = "IndirectLight";
			}
			PoweredLightsAnimators.Patch(__instance);
		}
	}
	[HarmonyPatch(typeof(RoundManager), "RefreshLightsList")]
	internal static class AllPoweredLightsPatch
	{
		[HarmonyPrefix]
		public static bool OnRefreshLightsList(RoundManager __instance)
		{
			RefreshLightsListPatched(__instance);
			return false;
		}

		public static void RefreshLightsListPatched(RoundManager self)
		{
			List<Light> list = new List<Light>();
			self.allPoweredLights.Clear();
			self.allPoweredLightsAnimators.Clear();
			GameObject[] array = GameObject.FindGameObjectsWithTag("PoweredLight");
			if (array == null)
			{
				return;
			}
			GameObject[] array2 = array;
			foreach (GameObject val in array2)
			{
				Animator componentInChildren = val.GetComponentInChildren<Animator>();
				if (!((Object)(object)componentInChildren == (Object)null))
				{
					self.allPoweredLightsAnimators.Add(componentInChildren);
					val.GetComponentsInChildren<Light>(true, list);
					self.allPoweredLights.AddRange(list);
				}
			}
			foreach (Animator allPoweredLightsAnimator in self.allPoweredLightsAnimators)
			{
				allPoweredLightsAnimator.SetFloat("flickerSpeed", Random.Range(0.6f, 1.4f));
			}
		}
	}
	[BepInPlugin("watergun.v72lightfix", "V72LightFix", "1.1.0")]
	public class Plugin : BaseUnityPlugin
	{
		private const string GUID = "watergun.v72lightfix";

		private const string NAME = "V72LightFix";

		private const string VER = "1.1.0";

		private void Awake()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			Harmony val = new Harmony("watergun.v72lightfix");
			val.PatchAll();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded!");
		}
	}
}