Decompiled source of CoolSongArena v1.8.0

BepInEx/plugins/CoolRandomArenaSound/CoolRandomArenaSound.dll

Decompiled 2 days ago
using System;
using System.Collections;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Photon.Pun;
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("CoolRandomArenaSound")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("CoolRandomArenaSound")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("9c631775-9d03-49e6-9a28-061df1b3025b")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace CoolRandomArenaSound;

[BepInPlugin("cool_random_arena_sound", "Cool Random Arena Sound", "1.8.0")]
internal class Plugin : BaseUnityPlugin
{
	private readonly Harmony harmony = new Harmony("cool_random_arena_sound");

	internal static ManualLogSource logger;

	private void Awake()
	{
		logger = ((BaseUnityPlugin)this).Logger;
		logger.LogInfo((object)" Cool Random Arena Sound Plugin Loaded");
		harmony.PatchAll(typeof(ArenaMusicAwakePatch));
	}
}
[HarmonyPatch(typeof(Arena), "Awake")]
internal static class ArenaMusicAwakePatch
{
	[HarmonyPostfix]
	private static void ReplaceArenaMusic()
	{
		((Component)Arena.instance).gameObject.AddComponent<ArenaMusicSync>().Init();
	}
}
public class ArenaMusicSync : MonoBehaviourPun
{
	private string[] oggFiles;

	public void Init()
	{
		//IL_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: Expected O, but got Unknown
		MethodInfo methodInfo = AccessTools.Method(typeof(Sound), "PlayLoop", (Type[])null, (Type[])null);
		if (methodInfo != null)
		{
			Patches patchInfo = Harmony.GetPatchInfo((MethodBase)methodInfo);
			if (patchInfo != null)
			{
				Harmony val = new Harmony("cool_random_arena_sound_temp_disable_loaforc");
				if (patchInfo.Prefixes != null)
				{
					foreach (Patch item in patchInfo.Prefixes.Where((Patch p) => p.owner.Contains("loaforc")))
					{
						Plugin.logger.LogInfo((object)("Suppression Prefix de loaforcs: " + item.PatchMethod.Name));
						val.Unpatch((MethodBase)methodInfo, item.PatchMethod);
					}
				}
				if (patchInfo.Transpilers != null)
				{
					foreach (Patch item2 in patchInfo.Transpilers.Where((Patch p) => p.owner.Contains("loaforc")))
					{
						Plugin.logger.LogInfo((object)("Suppression Transpiler de loaforcs: " + item2.PatchMethod.Name));
						val.Unpatch((MethodBase)methodInfo, item2.PatchMethod);
					}
				}
			}
			else
			{
				Plugin.logger.LogInfo((object)"Pas de patch loaforcsSoundAPI.REPO détecté sur Sound.PlayLoop.");
			}
		}
		string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "ArenaSounds");
		if (!Directory.Exists(text))
		{
			Plugin.logger.LogError((object)(" Folder not found: " + text));
			return;
		}
		oggFiles = Directory.GetFiles(text, "*.ogg");
		if (oggFiles.Length == 0)
		{
			Plugin.logger.LogError((object)" No .ogg files found.");
		}
		else if (PhotonNetwork.InRoom)
		{
			if (PhotonNetwork.IsMasterClient)
			{
				string fileName = Path.GetFileName(oggFiles[Random.Range(0, oggFiles.Length)]);
				Plugin.logger.LogInfo((object)("Host selected: " + fileName));
				((MonoBehaviourPun)this).photonView.RPC("RPC_PlayArenaMusic", (RpcTarget)0, new object[1] { fileName });
			}
		}
		else
		{
			string fileName2 = Path.GetFileName(oggFiles[Random.Range(0, oggFiles.Length)]);
			Plugin.logger.LogInfo((object)("Solo mode - selected: " + fileName2));
			((MonoBehaviour)this).StartCoroutine(LoadAndSetClip(fileName2));
		}
	}

	[PunRPC]
	public void RPC_PlayArenaMusic(string fileName)
	{
		Plugin.logger.LogInfo((object)("RPC received - playing: " + fileName));
		((MonoBehaviour)this).StartCoroutine(LoadAndSetClip(fileName));
	}

	private IEnumerator LoadAndSetClip(string fileName)
	{
		string folderPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "ArenaSounds");
		string fullPath = Path.Combine(folderPath, fileName);
		if (!File.Exists(fullPath))
		{
			Plugin.logger.LogError((object)(" File not found: " + fullPath));
			yield break;
		}
		string uri = "file://" + fullPath.Replace("\\", "/");
		WWW www = new WWW(uri);
		try
		{
			yield return www;
			if (!string.IsNullOrEmpty(www.error))
			{
				Plugin.logger.LogError((object)(" WWW error: " + www.error));
				yield break;
			}
			AudioClip clip = www.GetAudioClip(false, false, (AudioType)14);
			if ((Object)(object)clip == (Object)null)
			{
				Plugin.logger.LogError((object)(" Failed to load clip: " + fileName));
				yield break;
			}
			Plugin.logger.LogInfo((object)(" Playing clip: " + ((Object)clip).name));
			Arena.instance.soundArenaMusic.Sounds = (AudioClip[])(object)new AudioClip[1] { clip };
			Arena.instance.soundArenaMusic.PlayLoop(true, 20f, 2f, 1f);
			Arena.instance.soundArenaMusic.Source.time = 0f;
		}
		finally
		{
			((IDisposable)www)?.Dispose();
		}
	}
}