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 GangleMasks v22.0.0
plugins/GangleMasks.dll
Decompiled a year agousing 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); } } } } }