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);
}
}
}
}
}