Decompiled source of FrenchSysiphusReloaded v2.5.5

BepInEx/plugins/CrazyFrenchFace.dll

Decompiled 2 days ago
using System;
using System.Collections;
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 System.Security;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using BepInEx;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.SceneManagement;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("CrazyFrenchFace")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Fak U Punch")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("CrazyFrenchFace")]
[assembly: AssemblyTitle("CrazyFrenchFace")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace CrazyFrenchFace
{
	[BepInPlugin("prideunique.ultrakill.customsisyphus", "Custom Sisyphus", "1.0.0")]
	public class CustomSisyphus : BaseUnityPlugin
	{
		public const string modGUID = "prideunique.ultrakill.customsisyphus";

		public const string modName = "Custom Sisyphus";

		public const string modVersion = "1.0.0";

		public static Dictionary<string, List<string>> AudioReplacements = new Dictionary<string, List<string>>();

		public static Material SisyphusHeadMaterial = null;

		public static string ReplacementsPath;

		public static Harmony HarmonyPatch = new Harmony("prideunique.ultrakill.customsisyphus");

		private void Awake()
		{
			ReplacementsPath = Path.Combine(Paths.PluginPath, "SisyphusAudios");
			if (!Directory.Exists(ReplacementsPath))
			{
				Directory.CreateDirectory(ReplacementsPath);
			}
			LoadReplacements();
			((MonoBehaviour)this).StartCoroutine(InitializeHeadMaterial());
			HarmonyPatch.PatchAll(typeof(FleshPrisonPatch));
			HarmonyPatch.PatchAll(typeof(SisyphusPrimeIntroPatch));
			HarmonyPatch.PatchAll(typeof(SisyphusPrimePatch));
		}

		public static IEnumerator InitializeHeadMaterial()
		{
			string text = Directory.GetFiles(ReplacementsPath, "*.png").FirstOrDefault();
			UnityWebRequest request = UnityWebRequestTexture.GetTexture(text);
			try
			{
				yield return request.SendWebRequest();
				SisyphusHeadMaterial = new Material(Shader.Find("Standard"));
				SisyphusHeadMaterial.mainTexture = (Texture)(object)DownloadHandlerTexture.GetContent(request);
			}
			finally
			{
				((IDisposable)request)?.Dispose();
			}
		}

		private void LoadReplacements()
		{
			string[] files = Directory.GetFiles(ReplacementsPath, "*.ogg", SearchOption.AllDirectories);
			foreach (string text in files)
			{
				string key = Regex.Replace(Path.GetFileName(text).Split(new char[1] { '.' })[0], "[\\d-]", string.Empty);
				if (!AudioReplacements.ContainsKey(key))
				{
					AudioReplacements[key] = new List<string>();
				}
				AudioReplacements[key].Add(text);
			}
		}
	}
	public static class FleshPrisonPatch
	{
		[HarmonyPatch(typeof(FleshPrison), "Start")]
		[HarmonyPostfix]
		private static void FleshPrisonStart(FleshPrison __instance)
		{
			ReplaceAudioClips(__instance);
		}

		private static void ReplaceAudioClips(FleshPrison __instance)
		{
			SubtitledAudioSource val = default(SubtitledAudioSource);
			foreach (AudioSource item in ObjectFinder.FindObjectsOfType<AudioSource>())
			{
				if (Object.op_Implicit((Object)(object)item.clip))
				{
					List<SubtitleDataLine> list = new List<SubtitleDataLine>();
					bool flag = false;
					if (((Object)item.clip).name == "sp_thisprison")
					{
						Debug.Log((object)"Replacing sisyphus intro (prison)");
						((MonoBehaviour)__instance).StartCoroutine(Utils.ReplaceAudioSourceClip(item, "sp_thisprison.ogg"));
						flag = true;
					}
					if (flag && ((Component)item).TryGetComponent<SubtitledAudioSource>(ref val))
					{
						object value = Traverse.Create((object)val).Field("subtitles").GetValue();
						((SubtitleData)((value is SubtitleData) ? value : null)).lines = list.ToArray();
					}
				}
			}
		}
	}
	public static class ObjectFinder
	{
		public static List<T> FindObjectsOfType<T>() where T : Component
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			List<T> list = new List<T>();
			Scene activeScene = SceneManager.GetActiveScene();
			GameObject[] rootGameObjects = ((Scene)(ref activeScene)).GetRootGameObjects();
			for (int i = 0; i < rootGameObjects.Length; i++)
			{
				FindInChildren(rootGameObjects[i], list);
			}
			return list;
		}

		private static void FindInChildren<T>(GameObject gameObject, List<T> results) where T : Component
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			T item = default(T);
			if (gameObject.TryGetComponent<T>(ref item))
			{
				results.Add(item);
			}
			foreach (Transform item2 in gameObject.transform)
			{
				FindInChildren(((Component)item2).gameObject, results);
			}
		}
	}
	public static class SisyphusPrimeIntroPatch
	{
		[HarmonyPatch(typeof(SisyphusPrimeIntro), "Start")]
		[HarmonyPostfix]
		private static void SisyphusPrimeIntroStart(SisyphusPrimeIntro __instance)
		{
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Expected O, but got Unknown
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Expected O, but got Unknown
			Transform val = ((Component)__instance).transform.Find("Sisyphus (1)").Find("Sisyphus_Head");
			Transform val2 = ((Component)__instance).transform.Find("Sisyphus (1)").Find("Sisyphus_Hair");
			Transform val3 = ((Component)__instance).transform.Find("Sisyphus (1)").Find("Sisyphus_Beard");
			ChangeMaterials component = ((Component)val).GetComponent<ChangeMaterials>();
			for (int i = 0; i < component.materials.Length; i++)
			{
				Material val4 = new Material(component.materials[i]);
				val4.mainTexture = CustomSisyphus.SisyphusHeadMaterial.mainTexture;
				component.materials[i] = val4;
			}
			Renderer component2 = ((Component)val).GetComponent<Renderer>();
			Material val5 = new Material(component2.material);
			val5.mainTexture = CustomSisyphus.SisyphusHeadMaterial.mainTexture;
			component2.sharedMaterial = val5;
			Object.Destroy((Object)(object)((Component)val3).gameObject);
			Object.Destroy((Object)(object)((Component)val2).gameObject);
			ReplaceAudioClips(__instance);
		}

		private static void ReplaceAudioClips(SisyphusPrimeIntro __instance)
		{
			SubtitledAudioSource val = default(SubtitledAudioSource);
			foreach (AudioSource item in ObjectFinder.FindObjectsOfType<AudioSource>())
			{
				if (Object.op_Implicit((Object)(object)item.clip))
				{
					List<SubtitleDataLine> list = new List<SubtitleDataLine>();
					bool flag = false;
					switch (((Object)item.clip).name)
					{
					case "sp_intro":
						Debug.Log((object)"Replacing sisyphus intro");
						((MonoBehaviour)__instance).StartCoroutine(Utils.ReplaceAudioSourceClip(item, "sp_intro.ogg"));
						flag = true;
						break;
					case "sp_outro":
						Debug.Log((object)"Replacing sisyphus outro");
						((MonoBehaviour)__instance).StartCoroutine(Utils.ReplaceAudioSourceClip(item, "sp_outro.ogg"));
						flag = true;
						break;
					case "sp_keepthemcoming":
						Debug.Log((object)"Replacing keep them coming");
						((MonoBehaviour)__instance).StartCoroutine(Utils.ReplaceAudioSourceClip(item, "sp_keepthemcoming.ogg"));
						flag = true;
						break;
					}
					if (flag && ((Component)item).TryGetComponent<SubtitledAudioSource>(ref val))
					{
						object value = Traverse.Create((object)val).Field("subtitles").GetValue();
						((SubtitleData)((value is SubtitleData) ? value : null)).lines = list.ToArray();
					}
				}
			}
		}
	}
	public static class SisyphusPrimePatch
	{
		[HarmonyPatch(typeof(SisyphusPrime), "Start")]
		[HarmonyPostfix]
		private static void SisyphusPrimeStart(SisyphusPrime __instance)
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Expected O, but got Unknown
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Expected O, but got Unknown
			Transform val = ((Component)__instance).transform.Find("Sisyphus (1)").Find("Sisyphus_Head");
			ChangeMaterials component = ((Component)val).GetComponent<ChangeMaterials>();
			for (int i = 0; i < component.materials.Length; i++)
			{
				Material val2 = new Material(component.materials[i]);
				val2.mainTexture = CustomSisyphus.SisyphusHeadMaterial.mainTexture;
				component.materials[i] = val2;
			}
			Renderer component2 = ((Component)val).GetComponent<Renderer>();
			Material val3 = new Material(component2.material);
			val3.mainTexture = CustomSisyphus.SisyphusHeadMaterial.mainTexture;
			component2.sharedMaterial = val3;
			((MonoBehaviour)__instance).StartCoroutine(LoadAndReplaceAudioClips(__instance, "destroy"));
			((MonoBehaviour)__instance).StartCoroutine(LoadAndReplaceAudioClips(__instance, "clap"));
			((MonoBehaviour)__instance).StartCoroutine(LoadAndReplaceAudioClips(__instance, "explode"));
			((MonoBehaviour)__instance).StartCoroutine(LoadAndReplaceAudioClips(__instance, "hurt"));
			((MonoBehaviour)__instance).StartCoroutine(LoadAndReplaceAudioClips(__instance, "taunt"));
			((MonoBehaviour)__instance).StartCoroutine(LoadAndReplaceAudioClips(__instance, "player_death"));
			((MonoBehaviour)__instance).StartCoroutine(ReplaceSisyphusPhaseAudioClip(__instance, "phase"));
		}

		private static IEnumerator LoadAndReplaceAudioClips(SisyphusPrime __instance, string audioSet)
		{
			if (!CustomSisyphus.AudioReplacements.ContainsKey(audioSet))
			{
				yield break;
			}
			List<AudioClip> loadedAudioClips = new List<AudioClip>();
			for (int i = 0; i < CustomSisyphus.AudioReplacements[audioSet].Count; i++)
			{
				string text = CustomSisyphus.AudioReplacements[audioSet][i];
				UnityWebRequest request = UnityWebRequestMultimedia.GetAudioClip(text, (AudioType)14);
				try
				{
					yield return request.SendWebRequest();
					loadedAudioClips.Add(DownloadHandlerAudioClip.GetContent(request));
				}
				finally
				{
					((IDisposable)request)?.Dispose();
				}
			}
			ReplaceAudioClips(__instance, loadedAudioClips, audioSet);
		}

		private static void ReplaceAudioClips(SisyphusPrime __instance, List<AudioClip> audioClips, string audioSet)
		{
			switch (audioSet)
			{
			case "destroy":
				__instance.uppercutComboVoice = audioClips.ToArray();
				break;
			case "clap":
				__instance.clapVoice = audioClips.ToArray();
				break;
			case "explode":
				__instance.explosionVoice = audioClips.ToArray();
				break;
			case "hurt":
				__instance.hurtVoice = audioClips.ToArray();
				break;
			case "taunt":
				__instance.tauntVoice = audioClips.ToArray();
				break;
			case "player_death":
				__instance.stompComboVoice = audioClips.ToArray();
				break;
			}
		}

		public static IEnumerator ReplaceSisyphusPhaseAudioClip(SisyphusPrime __instance, string audioSet)
		{
			if (CustomSisyphus.AudioReplacements.ContainsKey(audioSet))
			{
				string text = CustomSisyphus.AudioReplacements[audioSet][0];
				UnityWebRequest request = UnityWebRequestMultimedia.GetAudioClip(text, (AudioType)14);
				try
				{
					yield return request.SendWebRequest();
					Utils.ReplaceAudioClip(ref __instance.phaseChangeVoice, DownloadHandlerAudioClip.GetContent(request));
				}
				finally
				{
					((IDisposable)request)?.Dispose();
				}
			}
		}
	}
	public static class Utils
	{
		public static IEnumerator ReplaceAudioSourceClip(AudioSource audioSource, string fileName)
		{
			string text = Path.Combine(CustomSisyphus.ReplacementsPath, fileName);
			UnityWebRequest request = UnityWebRequestMultimedia.GetAudioClip(text, (AudioType)14);
			try
			{
				yield return request.SendWebRequest();
				ReplaceAudioSourceClip(ref audioSource, DownloadHandlerAudioClip.GetContent(request));
			}
			finally
			{
				((IDisposable)request)?.Dispose();
			}
		}

		public static void ReplaceAudioClip(ref AudioClip audioClip, AudioClip replaceAudioClip)
		{
			audioClip = replaceAudioClip;
		}

		public static void ReplaceAudioSourceClip(ref AudioSource audioSource, AudioClip replaceAudioClip)
		{
			audioSource.clip = replaceAudioClip;
		}

		public static SubtitleDataLine MakeLine(string subtitle, float time)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: 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_0014: Expected O, but got Unknown
			return new SubtitleDataLine
			{
				subtitle = subtitle,
				time = time
			};
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "CrazyFrenchFace";

		public const string PLUGIN_NAME = "CrazyFrenchFace";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}