Decompiled source of GangleMasks v22.0.0

plugins/GangleMasks.dll

Decompiled 5 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using GangleMasks.Patches;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("GangleMasks")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("GangleMasks")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("2d3a43ca-7d1d-4a63-ab1f-617d0920a727")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace GangleMasks
{
	public static class Assets
	{
		internal static readonly List<AssetBundle> AssetBundles = new List<AssetBundle>();

		private static readonly Dictionary<string, int> AssetIndices = new Dictionary<string, int>();

		public static void LoadAssetBundlesFromFolder(string folderName)
		{
			folderName = Path.Combine(Path.GetDirectoryName(GangleMasksPlugin.PInfo.Location), folderName);
			string[] files = Directory.GetFiles(folderName);
			foreach (string text in files)
			{
				AssetBundle val = AssetBundle.LoadFromFile(text);
				int count = AssetBundles.Count;
				AssetBundles.Add(val);
				string[] allAssetNames = val.GetAllAssetNames();
				foreach (string text2 in allAssetNames)
				{
					string text3 = text2.ToLowerInvariant();
					if (text3.StartsWith("assets/"))
					{
						text3 = text3.Remove(0, "assets/".Length);
					}
					GangleMasksPlugin.Instance.manualLogSource.LogInfo((object)$"paring [{text3}] with [{count}]");
					AssetIndices[text3] = count;
				}
				GangleMasksPlugin.Instance.manualLogSource.LogInfo((object)("Loaded AssetBundle: " + Path.GetFileName(text)));
			}
		}

		public static T Load<T>(string assetName) where T : Object
		{
			try
			{
				assetName = assetName.ToLowerInvariant();
				if (assetName.Contains(":"))
				{
					string[] array = assetName.Split(new char[1] { ':' });
					assetName = array[1].ToLowerInvariant();
				}
				if (assetName.StartsWith("assets/"))
				{
					assetName = assetName.Remove(0, "assets/".Length);
				}
				int index = AssetIndices[assetName];
				return AssetBundles[index].LoadAsset<T>("assets/" + assetName);
			}
			catch (Exception arg)
			{
				GangleMasksPlugin.Instance.manualLogSource.LogInfo((object)$"Couldn't load asset [{assetName}] reason: {arg}");
				return default(T);
			}
		}
	}
	[BepInPlugin("slapitnow.ganglemasks", "Gangle Masks", "22.0.0")]
	public class GangleMasksPlugin : BaseUnityPlugin
	{
		private const string modGUID = "slapitnow.ganglemasks";

		private const string modName = "Gangle Masks";

		private const string modVersion = "22.0.0";

		public static GangleMasksPlugin Instance;

		private readonly Harmony harmony = new Harmony("slapitnow.ganglemasks");

		public ManualLogSource manualLogSource;

		public static GameObject ComedyMask;

		public static GameObject TragedyMask;

		public static GameObject AttachingComedyMask;

		public static GameObject AttachingTragedyMask;

		public static GameObject WornComedyMask;

		public static GameObject WornTragedyMask;

		public static AudioClip[] audioClips;

		public const int COMEDY_ID = 4;

		public const int TRAGEDY_ID = 5;

		public static PluginInfo PInfo { get; private set; }

		private void Awake()
		{
			Instance = this;
			PInfo = ((BaseUnityPlugin)this).Info;
			manualLogSource = Logger.CreateLogSource("slapitnow.ganglemasks");
			Assets.LoadAssetBundlesFromFolder("assetbundles");
			ComedyMask = Assets.Load<GameObject>("comedymask.prefab");
			TragedyMask = Assets.Load<GameObject>("tragedymask.prefab");
			AttachingComedyMask = Assets.Load<GameObject>("attachingcomedymask.prefab");
			AttachingTragedyMask = Assets.Load<GameObject>("attachingtragedymask.prefab");
			WornComedyMask = Assets.Load<GameObject>("worncomedymask.prefab");
			WornTragedyMask = Assets.Load<GameObject>("worntragedymask.prefab");
			AudioClip val = Assets.Load<AudioClip>("ganglelaugh1.ogg");
			AudioClip val2 = Assets.Load<AudioClip>("ganglelaugh2.ogg");
			AudioClip val3 = Assets.Load<AudioClip>("ganglelaugh3.ogg");
			audioClips = (AudioClip[])(object)new AudioClip[3] { val, val2, val3 };
			harmony.PatchAll(typeof(GangleMasksPlugin));
			harmony.PatchAll(typeof(HauntedMaskItemPatch));
			harmony.PatchAll(typeof(MaskedPlayerEnemyPatch));
			manualLogSource.LogInfo((object)"Successfully loaded Gangle Masks");
		}
	}
}
namespace GangleMasks.Patches
{
	[HarmonyPatch(typeof(HauntedMaskItem))]
	internal class HauntedMaskItemPatch
	{
		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		private static void PostUpdate(HauntedMaskItem __instance)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Expected O, but got Unknown
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Expected O, but got Unknown
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)__instance == (Object)null || !(((Object)((Component)__instance.maskEyesFilled).gameObject).name != "DebugMaskChange") || (Object)__instance.maskEyesFilled == (Object)null)
			{
				return;
			}
			int maskTypeId = __instance.maskTypeId;
			int num = maskTypeId;
			GameObject val;
			GameObject headMaskPrefab;
			if (num == 4 || num != 5)
			{
				val = GangleMasksPlugin.ComedyMask;
				headMaskPrefab = GangleMasksPlugin.AttachingComedyMask;
			}
			else
			{
				val = GangleMasksPlugin.TragedyMask;
				headMaskPrefab = GangleMasksPlugin.AttachingTragedyMask;
			}
			((Object)((Component)__instance.maskEyesFilled).gameObject).name = "DebugMaskChange";
			__instance.headMaskPrefab = headMaskPrefab;
			Renderer[] componentsInChildren = ((Component)__instance).gameObject.GetComponentsInChildren<Renderer>();
			Renderer[] array = componentsInChildren;
			foreach (Renderer val2 in array)
			{
				if (((Object)((Component)val2).gameObject).name == "MaskMesh")
				{
					((Object)((Component)val2).gameObject).name = "MaskMeshOld";
					GameObject val3 = Object.Instantiate<GameObject>(val, ((Component)val2).transform.parent);
					val3.transform.localEulerAngles = Vector3.zero;
					val3.transform.localPosition = Vector3.zero;
					val3.transform.localScale = Vector3.one;
					((Component)val2).gameObject.SetActive(false);
				}
			}
			RandomPeriodicAudioPlayer component = ((Component)__instance).gameObject.GetComponent<RandomPeriodicAudioPlayer>();
			if ((Object)(object)component != (Object)null)
			{
				component.randomClips = GangleMasksPlugin.audioClips;
			}
		}
	}
	[HarmonyPatch(typeof(MaskedPlayerEnemy))]
	internal class MaskedPlayerEnemyPatch
	{
		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		public static void PostStart(ref MaskedPlayerEnemy __instance)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected O, but got Unknown
			//IL_0185: Unknown result type (might be due to invalid IL or missing references)
			//IL_018a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b0: 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_01ea: 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_025e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0284: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02be: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)__instance == (Object)null)
			{
				return;
			}
			Transform val = ((Component)__instance).gameObject.transform.Find("ScavengerModel").Find("metarig").Find("spine")
				.Find("spine.001")
				.Find("spine.002")
				.Find("spine.003")
				.Find("spine.004")
				.Find("HeadMaskComedy");
			Transform val2 = ((Component)__instance).gameObject.transform.Find("ScavengerModel").Find("metarig").Find("spine")
				.Find("spine.001")
				.Find("spine.002")
				.Find("spine.003")
				.Find("spine.004")
				.Find("HeadMaskTragedy");
			if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null)
			{
				return;
			}
			Transform val3 = val.Find("ComedyMaskLOD1");
			Transform val4 = val2.Find("ComedyMaskLOD1");
			if ((Object)(object)val3 == (Object)null || (Object)(object)val4 == (Object)null)
			{
				return;
			}
			((Component)val3).gameObject.SetActive(false);
			((Component)val4).gameObject.SetActive(false);
			Renderer[] componentsInChildren = ((Component)val).gameObject.GetComponentsInChildren<Renderer>();
			foreach (Renderer val5 in componentsInChildren)
			{
				if (((Object)((Component)val5).gameObject).name == "Mesh")
				{
					GameObject val6 = Object.Instantiate<GameObject>(GangleMasksPlugin.WornComedyMask, Vector3.zero, Quaternion.identity, ((Component)val5).transform.parent);
					val6.transform.localRotation = ((Component)val5).transform.localRotation;
					val6.transform.localPosition = new Vector3(0f, 0f, -0.2f);
					val6.transform.localScale = ((Component)val5).transform.localScale;
					((Component)val5).gameObject.SetActive(false);
				}
			}
			Renderer[] componentsInChildren2 = ((Component)val2).gameObject.GetComponentsInChildren<Renderer>();
			foreach (Renderer val7 in componentsInChildren2)
			{
				if (((Object)((Component)val7).gameObject).name == "Mesh")
				{
					GameObject val8 = Object.Instantiate<GameObject>(GangleMasksPlugin.WornTragedyMask, Vector3.zero, Quaternion.identity, ((Component)val7).transform.parent);
					val8.transform.localRotation = ((Component)val7).transform.localRotation;
					val8.transform.localPosition = new Vector3(0f, 0f, -0.2f);
					val8.transform.localScale = ((Component)val7).transform.localScale;
					((Component)val7).gameObject.SetActive(false);
				}
			}
			RandomPeriodicAudioPlayer[] componentsInChildren3 = ((Component)__instance).gameObject.GetComponentsInChildren<RandomPeriodicAudioPlayer>();
			RandomPeriodicAudioPlayer[] array = componentsInChildren3;
			foreach (RandomPeriodicAudioPlayer val9 in array)
			{
				val9.randomClips = GangleMasksPlugin.audioClips;
			}
		}

		[HarmonyPatch("SetMaskType")]
		[HarmonyPrefix]
		private static void PreSetMaskType(MaskedPlayerEnemy __instance, int maskType)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Expected O, but got Unknown
			if (!((Object)__instance == (Object)null) && maskType == 5)
			{
				Transform val = ((Component)__instance).gameObject.transform.Find("ScavengerModel").Find("metarig").Find("spine")
					.Find("spine.001")
					.Find("spine.002")
					.Find("spine.003")
					.Find("spine.004")
					.Find("HeadMaskComedy");
				Transform val2 = ((Component)__instance).gameObject.transform.Find("ScavengerModel").Find("metarig").Find("spine")
					.Find("spine.001")
					.Find("spine.002")
					.Find("spine.003")
					.Find("spine.004")
					.Find("HeadMaskTragedy");
				if (!((Object)(object)val == (Object)null) && !((Object)(object)val2 == (Object)null))
				{
					((Component)val).gameObject.SetActive(false);
					((Component)val2).gameObject.SetActive(true);
				}
			}
		}
	}
}