Decompiled source of MoreSongs v1.0.0

plugins/MoreSongs.dll

Decompiled 5 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Threading;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using BoplFixedMath;
using HarmonyLib;
using UnityEngine;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("MoreSongs")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("My first plugin")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("MoreSongs")]
[assembly: AssemblyTitle("MoreSongs")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace MoreSongs;

public class ModInfo
{
	public const string GUID = "com.reallybaddev.MoreSongs";

	public const string NAME = "MoreSongs";

	public const string VERSION = "1.0.0";
}
[BepInPlugin("com.reallybaddev.MoreSongs", "MoreSongs", "1.0.0")]
public class Plugin : BaseUnityPlugin
{
	public static List<string> audioFiles;

	public static ManualLogSource logger;

	public static ConfigEntry<bool> replaceMenuMusic;

	public static ConfigEntry<bool> combinedSongs;

	public static ConfigEntry<bool> suddenDeathMusic;

	private void Awake()
	{
		//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ce: Expected O, but got Unknown
		replaceMenuMusic = ((BaseUnityPlugin)this).Config.Bind<bool>("Music", "Replace Menu Music", true, "If true, replaces the main menu music, \"Friendship,\" with \"Friendship (Dream Team Mix).\" Otherwise, the music stays the same.");
		combinedSongs = ((BaseUnityPlugin)this).Config.Bind<bool>("Music", "Combined Songs", true, "If true, combines the new songs with songs already in the game. Otherwise, only plays the new music. Note that all new songs will play after all the original songs when combined.");
		suddenDeathMusic = ((BaseUnityPlugin)this).Config.Bind<bool>("Music", "Sudden Death Music", true, "If true, replaces the typical pitch shift during sudden death with the song \"Falling Pieces.\" Otherwise, only increases the pitch.");
		logger = ((BaseUnityPlugin)this).Logger;
		audioFiles = new List<string>(Directory.GetFiles(Path.Join((ReadOnlySpan<char>)Path.Join((ReadOnlySpan<char>)"BepInEx", (ReadOnlySpan<char>)"plugins", (ReadOnlySpan<char>)"MoreSongs"), (ReadOnlySpan<char>)"songs")));
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin com.reallybaddev.MoreSongs is loaded!");
		Harmony val = new Harmony("com.reallybaddev.MoreSongs");
		val.PatchAll(typeof(Patches));
		CharacterSelectHandler_online.clientSideMods_you_can_increment_this_to_enable_matchmaking_for_your_mods__please_dont_use_it_to_cheat_thats_really_cringe_especially_if_its_desyncing_others___you_didnt_even_win_on_your_opponents_screen___I_cannot_imagine_a_sadder_existence++;
	}
}
public class Patches
{
	public static Song suddenDeathSong;

	public static bool suddenDeathSongStarted;

	public static string GetSongPath(string name)
	{
		foreach (string audioFile in Plugin.audioFiles)
		{
			if (audioFile.EndsWith(name))
			{
				return Directory.GetCurrentDirectory() + "\\" + audioFile;
			}
		}
		return null;
	}

	public static string FilePathToFileUrl(string path)
	{
		return new UriBuilder("file", string.Empty)
		{
			Path = path.Replace("%", $"%{37:X2}").Replace("[", $"%{91:X2}").Replace("]", $"%{93:X2}")
		}.Uri.AbsoluteUri;
	}

	public static AudioClip GetAudioClip(string filePath, AudioType fileType)
	{
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		//IL_004a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Invalid comparison between Unknown and I4
		Plugin.logger.LogInfo((object)(FilePathToFileUrl(filePath) ?? ""));
		UnityWebRequest audioClip = UnityWebRequestMultimedia.GetAudioClip(FilePathToFileUrl(filePath), fileType);
		try
		{
			UnityWebRequestAsyncOperation val = audioClip.SendWebRequest();
			while (!((AsyncOperation)val).isDone)
			{
				Thread.Sleep(100);
			}
			if ((int)audioClip.result == 2)
			{
				Debug.Log((object)audioClip.error);
				return null;
			}
			return DownloadHandlerAudioClip.GetContent(audioClip);
		}
		finally
		{
			((IDisposable)audioClip)?.Dispose();
		}
	}

	[HarmonyPatch(typeof(AudioManager), "Awake")]
	[HarmonyPostfix]
	public static void Awake()
	{
		//IL_0089: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_0159: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_0229: Unknown result type (might be due to invalid IL or missing references)
		//IL_028f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0291: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0081: Unknown result type (might be due to invalid IL or missing references)
		//IL_0320: Unknown result type (might be due to invalid IL or missing references)
		//IL_0321: Unknown result type (might be due to invalid IL or missing references)
		//IL_0328: Unknown result type (might be due to invalid IL or missing references)
		//IL_0329: Unknown result type (might be due to invalid IL or missing references)
		//IL_0330: Unknown result type (might be due to invalid IL or missing references)
		//IL_0331: Unknown result type (might be due to invalid IL or missing references)
		//IL_0338: Unknown result type (might be due to invalid IL or missing references)
		//IL_0339: Unknown result type (might be due to invalid IL or missing references)
		//IL_02b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_0304: Unknown result type (might be due to invalid IL or missing references)
		if (Plugin.replaceMenuMusic.Value)
		{
			Song menuSong = default(Song);
			menuSong.name = "Friendship (Dream Team Mix)";
			menuSong.intro = GetAudioClip(GetSongPath("Friendship Dream Team Mix - Intro 2025.wav"), (AudioType)20);
			menuSong.introLength = 13.953f;
			menuSong.songLoop = GetAudioClip(GetSongPath("Friendship Dream Team Mix - Loop 2025.wav"), (AudioType)20);
			menuSong.volume = 1f;
			menuSong.pitch = 1f;
			AudioManager.instance.menuSong = menuSong;
		}
		Song val = default(Song);
		val.name = "The Bounce";
		val.intro = GetAudioClip(GetSongPath("The Bounce - Intro 2025.wav"), (AudioType)20);
		val.introLength = 22.04f;
		val.songLoop = GetAudioClip(GetSongPath("The Bounce - Loop 2025.wav"), (AudioType)20);
		val.volume = 1f;
		val.pitch = 1f;
		Song val2 = default(Song);
		val2.name = "Athletic Everything";
		val2.intro = GetAudioClip(GetSongPath("Athletic Everything - Intro 2025.wav"), (AudioType)20);
		val2.introLength = 11.163f;
		val2.songLoop = GetAudioClip(GetSongPath("Athletic Everything - Loop 2025.wav"), (AudioType)20);
		val2.volume = 1f;
		val2.pitch = 1f;
		Song val3 = default(Song);
		val3.name = "Out of My Way";
		val3.intro = GetAudioClip(GetSongPath("Out of My Way - Intro 2025.wav"), (AudioType)20);
		val3.introLength = 2.712f;
		val3.songLoop = GetAudioClip(GetSongPath("Out of My Way - Loop 2025.wav"), (AudioType)20);
		val3.volume = 1f;
		val3.pitch = 1f;
		Song val4 = default(Song);
		val4.name = "Slime On the Dance Floor";
		val4.intro = GetAudioClip(GetSongPath("Slime On the Dance Floor - Intro 2025.wav"), (AudioType)20);
		val4.introLength = 1.905f;
		val4.songLoop = GetAudioClip(GetSongPath("Slime On the Dance Floor - Loop 2025.wav"), (AudioType)20);
		val4.volume = 1f;
		val4.pitch = 1f;
		Song val5 = default(Song);
		val5.name = "Falling Pieces";
		val5.intro = GetAudioClip(GetSongPath("Falling Pieces - Intro 2025.wav"), (AudioType)20);
		val5.introLength = 9.637f;
		val5.songLoop = GetAudioClip(GetSongPath("Falling Pieces - Loop 2025.wav"), (AudioType)20);
		val5.volume = 1f;
		val5.pitch = 1f;
		suddenDeathSong = val5;
		if (Plugin.combinedSongs.Value)
		{
			AudioManager.instance.songs = CollectionExtensions.AddToArray<Song>(AudioManager.instance.songs, val);
			AudioManager.instance.songs = CollectionExtensions.AddToArray<Song>(AudioManager.instance.songs, val2);
			AudioManager.instance.songs = CollectionExtensions.AddToArray<Song>(AudioManager.instance.songs, val3);
			AudioManager.instance.songs = CollectionExtensions.AddToArray<Song>(AudioManager.instance.songs, val4);
		}
		else
		{
			AudioManager.instance.test_songs = (Song[])(object)new Song[4] { val2, val, val3, val4 };
		}
	}

	[HarmonyPatch(typeof(AudioManager), "suddenDeathMusicShift")]
	[HarmonyPrefix]
	public static bool SuddenDeathMusicShift()
	{
		//IL_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_003e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00da: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0136: Unknown result type (might be due to invalid IL or missing references)
		if (Plugin.suddenDeathMusic.Value)
		{
			AudioManager.instance.musicPlayer.Stop();
			AudioManager.instance.introMusicPlayer.Stop();
			Song val = suddenDeathSong;
			AudioManager.instance.currentClipPitch = val.pitch;
			AudioManager.instance.musicPlayer.clip = val.songLoop;
			AudioManager.instance.musicPlayer.volume = AudioManager.instance.currentMusicVolume * AudioManager.instance.currentMasterVolume * AudioManager.instance.musicVolumeMultiplier;
			AudioManager.instance.musicPlayer.pitch = val.pitch;
			AudioManager.instance.musicPlayer.loop = true;
			AudioManager.instance.musicPlayer.PlayDelayed((val.introLength > 0f) ? val.introLength : val.intro.length);
			AudioManager.instance.introMusicPlayer.clip = val.intro;
			AudioManager.instance.introMusicPlayer.volume = AudioManager.instance.currentMusicVolume * AudioManager.instance.currentMasterVolume * AudioManager.instance.musicVolumeMultiplier;
			AudioManager.instance.introMusicPlayer.pitch = val.pitch;
			AudioManager.instance.introMusicPlayer.loop = false;
			AudioManager.instance.introMusicPlayer.Play();
		}
		return !Plugin.suddenDeathMusic.Value;
	}

	[HarmonyPatch(typeof(AudioManager), "OnMatchStarted")]
	[HarmonyPrefix]
	public static void OnMatchStarted()
	{
		if (Plugin.suddenDeathMusic.Value)
		{
			suddenDeathSongStarted = false;
		}
	}

	[HarmonyPatch(typeof(GameSessionHandler), "UpdateSim")]
	[HarmonyPrefix]
	public static void GameSessionHandlerUpdateSim(Fix SimDeltaTime, GameSessionHandler __instance)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: 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_0016: Unknown result type (might be due to invalid IL or missing references)
		if (__instance.TimeBeforeSuddenDeath - Updater.SimTimeSinceLevelLoaded < (Fix)4.189f && !suddenDeathSongStarted && Plugin.suddenDeathMusic.Value)
		{
			suddenDeathSongStarted = true;
			AudioManager.instance.suddenDeathMusicShift();
		}
	}

	[HarmonyPatch(typeof(GameSessionHandler), "ActivateSuddenDeath")]
	[HarmonyPrefix]
	public static bool ActivateSuddenDeath(bool activate)
	{
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		if (Plugin.suddenDeathMusic.Value)
		{
			GameSessionHandler.SuddenDeathInProgress = activate;
			if (activate)
			{
				GameSessionHandler.SuddenDeathTimeStamp = Updater.SimTimeSinceLevelLoaded;
			}
		}
		return !Plugin.suddenDeathMusic.Value;
	}

	[HarmonyPatch(typeof(AudioManager), "OnMatchEnded")]
	[HarmonyPostfix]
	public static void OnMatchEnded(bool isDraw)
	{
		AudioManager.instance.timeSpentOnThisSong = 10000000f;
	}
}
public static class PluginInfo
{
	public const string PLUGIN_GUID = "MoreSongs";

	public const string PLUGIN_NAME = "MoreSongs";

	public const string PLUGIN_VERSION = "1.0.0";
}