Decompiled source of FixNewCityIntroSong v0.1.1

FixNewCityIntroSong.dll

Decompiled 3 days ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using HarmonyLib;
using Il2CppSystem.Collections.Generic;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyCompany("FixNewCityIntroSong")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.1.1.0")]
[assembly: AssemblyInformationalVersion("0.1.1+5dd4040edbff35ee8a0821550b29339a7498d9bb")]
[assembly: AssemblyProduct("Fix New City Intro Song")]
[assembly: AssemblyTitle("FixNewCityIntroSong")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.1.1.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 FixNewCityIntroSong
{
	internal static class IntroMusicState
	{
		private static CutScenePreset _forcedPreset;

		private static bool _forcedActive;

		internal static void TryForceIntroMusic(CutSceneController controller)
		{
			if ((Object)(object)controller == (Object)null)
			{
				return;
			}
			CutScenePreset preset = controller.preset;
			if ((SoCustomComparison)(object)preset == (SoCustomComparison)null || !IsIntroPreset(preset))
			{
				return;
			}
			MusicController instance = MusicController.Instance;
			if (!((Object)(object)instance == (Object)null) && instance.cues != null)
			{
				MusicCue val = FindIntroCue(instance, preset);
				if (!((SoCustomComparison)(object)val == (SoCustomComparison)null))
				{
					_forcedPreset = preset;
					_forcedActive = true;
					instance.PlayNewTrack(val, true);
				}
			}
		}

		internal static void StopForcedMusicIfNeeded(CutScenePreset preset)
		{
			if (_forcedActive && (!((SoCustomComparison)(object)_forcedPreset != (SoCustomComparison)null) || !((SoCustomComparison)(object)preset != (SoCustomComparison)null) || _forcedPreset == preset))
			{
				MusicController instance = MusicController.Instance;
				if ((Object)(object)instance == (Object)null)
				{
					Reset();
					return;
				}
				instance.StopCurrentTrack();
				Reset();
			}
		}

		private static void Reset()
		{
			_forcedPreset = null;
			_forcedActive = false;
		}

		private static bool IsIntroPreset(CutScenePreset preset)
		{
			GameplayControls instance = GameplayControls.Instance;
			if ((Object)(object)instance == (Object)null)
			{
				return false;
			}
			return instance.intro == preset;
		}

		private static MusicCue FindIntroCue(MusicController music, CutScenePreset preset)
		{
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: Expected O, but got Unknown
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Invalid comparison between Unknown and I4
			Enumerator<MusicCue> enumerator = music.cues.GetEnumerator();
			while (enumerator.MoveNext())
			{
				MusicCue current = enumerator.Current;
				if (((current != null) ? current.triggers : null) == null)
				{
					continue;
				}
				Enumerator<MusicTrigger> enumerator2 = current.triggers.GetEnumerator();
				while (enumerator2.MoveNext())
				{
					MusicTrigger current2 = enumerator2.Current;
					if (current2 != null && (int)current2.onGameState == 3 && (current2.cutSceneReference == preset || CutsceneNameMatches(current2.cutSceneReference, preset)))
					{
						return current;
					}
				}
			}
			enumerator = music.cues.GetEnumerator();
			while (enumerator.MoveNext())
			{
				MusicCue current3 = enumerator.Current;
				if ((SoCustomComparison)(object)current3 != (SoCustomComparison)null && string.Equals(((Object)current3).name, "IntroMusic", StringComparison.OrdinalIgnoreCase))
				{
					return current3;
				}
			}
			string text = BuildCueDebugInfo(music, preset);
			ManualLogSource logSource = FixNewCityIntroSongPlugin.LogSource;
			if (logSource != null)
			{
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(76, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Intro music: no matching cue found (no trigger match, no 'IntroMusic' cue). ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text);
				}
				logSource.LogWarning(val);
			}
			return null;
		}

		private static bool CutsceneNameMatches(CutScenePreset a, CutScenePreset b)
		{
			if ((SoCustomComparison)(object)a == (SoCustomComparison)null || (SoCustomComparison)(object)b == (SoCustomComparison)null)
			{
				return false;
			}
			string name = ((Object)a).name;
			string name2 = ((Object)b).name;
			if (string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(name2))
			{
				return false;
			}
			return string.Equals(name, name2, StringComparison.OrdinalIgnoreCase);
		}

		private static string BuildCueDebugInfo(MusicController music, CutScenePreset preset)
		{
			if (((music != null) ? music.cues : null) == null)
			{
				return "Cues=<null>.";
			}
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append("Cutscene=");
			stringBuilder.Append(((SoCustomComparison)(object)preset != (SoCustomComparison)null) ? ((Object)preset).name : "<null>");
			stringBuilder.Append(". Cues=[");
			bool flag = true;
			Enumerator<MusicCue> enumerator = music.cues.GetEnumerator();
			while (enumerator.MoveNext())
			{
				MusicCue current = enumerator.Current;
				if (!flag)
				{
					stringBuilder.Append(", ");
				}
				flag = false;
				if ((SoCustomComparison)(object)current == (SoCustomComparison)null)
				{
					stringBuilder.Append("<null>");
					continue;
				}
				int value = current.triggers?.Count ?? 0;
				stringBuilder.Append(((Object)current).name);
				stringBuilder.Append("(triggers=");
				stringBuilder.Append(value);
				stringBuilder.Append(")");
			}
			stringBuilder.Append("].");
			return stringBuilder.ToString();
		}
	}
	[HarmonyPatch(typeof(CutSceneController), "SetActive")]
	internal static class CutSceneControllerSetActivePatch
	{
		public static void Prefix(CutSceneController __instance, bool val)
		{
			if (val)
			{
				IntroMusicState.TryForceIntroMusic(__instance);
			}
		}

		public static void Postfix(CutSceneController __instance, bool val)
		{
			if (!val)
			{
				IntroMusicState.StopForcedMusicIfNeeded((__instance != null) ? __instance.preset : null);
			}
		}
	}
	[BepInPlugin("dema77sr.SOD.FixNewCityIntroSong", "FixNewCityIntroSong", "0.1.1")]
	public class FixNewCityIntroSongPlugin : BasePlugin
	{
		public const string PLUGIN_GUID = "dema77sr.SOD.FixNewCityIntroSong";

		public const string PLUGIN_NAME = "FixNewCityIntroSong";

		public const string PLUGIN_VERSION = "0.1.1";

		internal static ManualLogSource LogSource;

		private Harmony _harmony;

		public override void Load()
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Expected O, but got Unknown
			if (LogSource == null)
			{
				LogSource = Logger.CreateLogSource("FixNewCityIntroSong");
			}
			ManualLogSource logSource = LogSource;
			bool flag = default(bool);
			BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(18, 1, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Plugin ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("dema77sr.SOD.FixNewCityIntroSong");
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" is loaded.");
			}
			logSource.LogInfo(val);
			_harmony = new Harmony("dema77sr.SOD.FixNewCityIntroSong");
			_harmony.PatchAll();
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "FixNewCityIntroSong";

		public const string PLUGIN_NAME = "Fix New City Intro Song";

		public const string PLUGIN_VERSION = "0.1.1";
	}
}