using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using LLBML;
using LLBML.Audio;
using LLBML.Utils;
using LLHandlers;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("MusicHax (org.pkpenguin.plugins.llb.musichax)")]
[assembly: AssemblyProduct("MusicHax")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("3.5.2.0")]
[module: UnverifiableCode]
namespace MusicHax;
[BepInPlugin("org.pkpenguin.plugins.llb.musichax", "MusicHax", "3.5.2")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInProcess("LLBlaze.exe")]
public class MusicHax : BaseUnityPlugin
{
internal static AudioInfo currentInfo;
private static AudioCache musicCache = new AudioCache();
private static AudioCache sfxCache = new AudioCache();
private static AudioCache voiceCache = new AudioCache();
private static ConfigEntry<bool> enablePreloading;
private static ConfigEntry<bool> enableVanillaMusics;
private static DirectoryInfo SongsDirectory;
private static DirectoryInfo SFXDirectory;
private static DirectoryInfo VoicesDirectory;
private readonly string loadingText = "MusicHax is loading External Songs...";
private bool directoryAlreadyCreated;
internal static DirectoryInfo MHResourcesDir { get; private set; } = null;
internal static ManualLogSource Log { get; private set; } = null;
private void Awake()
{
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
Log = ((BaseUnityPlugin)this).Logger;
((BaseUnityPlugin)this).Logger.LogInfo((object)"Hello, world!");
MHResourcesDir = ModdingFolder.GetModSubFolder(((BaseUnityPlugin)this).Info);
Harmony val = new Harmony("org.pkpenguin.plugins.llb.musichax");
((BaseUnityPlugin)this).Logger.LogDebug((object)"Patching AudioHandler");
val.PatchAll(typeof(PlayMusicPatch));
enablePreloading = ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "EnablePreloading", true, (ConfigDescription)null);
enableVanillaMusics = ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "EnableVanillaMusics", false, (ConfigDescription)null);
CreateDirectoryStructure();
}
private void Start()
{
ModDependenciesUtils.RegisterToModMenu(((BaseUnityPlugin)this).Info, (List<string>)null);
if (enablePreloading.Value)
{
LoadMusics();
LoadSfx();
LoadVoice();
}
}
private void Update()
{
}
private void LoadMusics()
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: 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_006b: Unknown result type (might be due to invalid IL or missing references)
((GenericCache<string, AudioAsset>)(object)musicCache).Clear();
DirectoryInfo[] directories = SongsDirectory.GetDirectories();
foreach (DirectoryInfo directoryInfo in directories)
{
foreach (AudioInfo audioInfo in AudioUtils.GetAudioInfos(directoryInfo))
{
((BaseUnityPlugin)this).Logger.LogDebug((object)("Loading new " + directoryInfo.Name + " : " + audioInfo.file.FullName));
musicCache.LoadClip(directoryInfo.Name, audioInfo);
}
}
}
private void LoadSfx()
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: 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_006b: Unknown result type (might be due to invalid IL or missing references)
((GenericCache<string, AudioAsset>)(object)sfxCache).Clear();
DirectoryInfo[] directories = SFXDirectory.GetDirectories();
foreach (DirectoryInfo directoryInfo in directories)
{
foreach (AudioInfo audioInfo in AudioUtils.GetAudioInfos(directoryInfo))
{
((BaseUnityPlugin)this).Logger.LogDebug((object)("Loading new " + directoryInfo.Name + " : " + audioInfo.file.FullName));
sfxCache.LoadClip(directoryInfo.Name, audioInfo);
}
}
}
private static string GetVoiceCacheKey(string audioFile, Character character)
{
return ((object)(Character)(ref character)).ToString() + "_" + audioFile;
}
private void LoadVoice()
{
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_0065: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Unknown result type (might be due to invalid IL or missing references)
((GenericCache<string, AudioAsset>)(object)voiceCache).Clear();
DirectoryInfo[] directories = VoicesDirectory.GetDirectories();
foreach (DirectoryInfo directoryInfo in directories)
{
DirectoryInfo[] directories2 = directoryInfo.GetDirectories();
foreach (DirectoryInfo directoryInfo2 in directories2)
{
foreach (AudioInfo audioInfo in AudioUtils.GetAudioInfos(directoryInfo2))
{
((BaseUnityPlugin)this).Logger.LogDebug((object)("Loading new " + directoryInfo2.Name + " : " + audioInfo.file.FullName));
string voiceCacheKey = GetVoiceCacheKey(directoryInfo2.Name, CharacterApi.GetCharacterByName(directoryInfo.Name));
voiceCache.LoadClip(voiceCacheKey, audioInfo);
}
}
}
}
private void ReloadMusics()
{
LoadMusics();
}
public static void CreateDirectoryStructure()
{
//IL_0094: 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)
SongsDirectory = MHResourcesDir.CreateSubdirectory("Songs");
string[] songs = FileStructure.Songs;
foreach (string path in songs)
{
SongsDirectory.CreateSubdirectory(path);
}
SFXDirectory = MHResourcesDir.CreateSubdirectory("SFX");
songs = FileStructure.SFX;
foreach (string path2 in songs)
{
SFXDirectory.CreateSubdirectory(path2);
}
VoicesDirectory = MHResourcesDir.CreateSubdirectory("Voices");
foreach (Character playableCharacter in CharacterApi.GetPlayableCharacters())
{
Character current = playableCharacter;
DirectoryInfo directoryInfo = VoicesDirectory.CreateSubdirectory(((object)(Character)(ref current)).ToString());
songs = FileStructure.Voices;
foreach (string text in songs)
{
directoryInfo.CreateSubdirectory(((object)(Character)(ref current)).ToString().ToLower() + text);
}
}
}
public static void CreateMusicDirectory(string clipName)
{
Directory.CreateDirectory(Path.Combine(SongsDirectory.FullName, clipName));
}
public void CreateMusicDirectories()
{
if (directoryAlreadyCreated)
{
return;
}
for (int i = 1; i < 21; i++)
{
if (i != 13)
{
string audioClipName = DNPFJHMAIBP.AKGAOAEJ.musicAssetLinks.GetMusicAsset((AudioTrack)i).audioClipName;
((BaseUnityPlugin)this).Logger.LogDebug((object)("Creating directory: " + audioClipName));
Directory.CreateDirectory(Path.Combine(SongsDirectory.FullName, audioClipName));
}
}
directoryAlreadyCreated = true;
}
public static AudioAsset GetAudioAssetFor(string clipName)
{
Log.LogDebug((object)("Got asked for a clip named: \"" + clipName + "\""));
if (enablePreloading.Value && ((GenericCache<string, AudioAsset>)(object)musicCache).ContainsKey(clipName))
{
int num = ((GenericCache<string, AudioAsset>)(object)musicCache)[clipName].Count;
Log.LogDebug((object)$"Preloading: key exists : \"{clipName}\" | Found list length: {((GenericCache<string, AudioAsset>)(object)musicCache)[clipName].Count}");
if (enableVanillaMusics.Value)
{
num++;
}
if (num > 0)
{
int num2 = Random.Range(0, num);
if (enableVanillaMusics.Value)
{
num2--;
}
Log.LogDebug((object)$"Rolled {num2} out of {num}");
if (num2 < 0)
{
return null;
}
return ((GenericCache<string, AudioAsset>)(object)musicCache)[clipName][num2];
}
}
else
{
try
{
string[] files = Directory.GetFiles(Path.Combine(SongsDirectory.FullName, clipName));
if (files.Length != 0)
{
return AudioUtils.GetAssetSynchronously(files[Random.Range(0, files.Length - 1)]);
}
}
catch (Exception ex)
{
Log.LogError((object)("MusicHax: Exception caught:\n" + ex.Message));
}
}
return null;
}
public static AudioClip GetAudioClipFor(string clipName)
{
return GetAudioAssetFor(clipName).audioClip;
}
public static AudioClip[] GetSfxClips(string audioFile)
{
Log.LogDebug((object)("MusicHax: Got asked for a sfx clip named: \"" + audioFile + "\""));
Directory.CreateDirectory(Path.Combine(SFXDirectory.FullName, audioFile));
if (((GenericCache<string, AudioAsset>)(object)sfxCache).ContainsKey(audioFile) && ((GenericCache<string, AudioAsset>)(object)sfxCache)[audioFile].Count > 0)
{
return ((GenericCache<string, AudioAsset>)(object)sfxCache)[audioFile].ConvertAll((AudioAsset input) => input.audioClip).ToArray();
}
return null;
}
public static AudioClip[] GetVoiceClips(string audioFile, Character character)
{
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
Log.LogDebug((object)("MusicHax: Got asked for a voice clip named: \"" + audioFile + "\" for " + ((object)(Character)(ref character)).ToString()));
Directory.CreateDirectory(Path.Combine(Path.Combine(VoicesDirectory.FullName, ((object)(Character)(ref character)).ToString()), audioFile));
string voiceCacheKey = GetVoiceCacheKey(audioFile, character);
if (((GenericCache<string, AudioAsset>)(object)voiceCache).ContainsKey(voiceCacheKey) && ((GenericCache<string, AudioAsset>)(object)voiceCache)[voiceCacheKey].Count > 0)
{
return ((GenericCache<string, AudioAsset>)(object)voiceCache)[voiceCacheKey].ConvertAll((AudioAsset input) => input.audioClip).ToArray();
}
return null;
}
}
internal static class PluginInfos
{
public const string PLUGIN_NAME = "MusicHax";
public const string PLUGIN_ID = "org.pkpenguin.plugins.llb.musichax";
public const string PLUGIN_VERSION = "3.5.2";
}
public static class PlayMusicPatch
{
[HarmonyPatch(typeof(AudioHandler), "PlayMusic", new Type[]
{
typeof(AudioClip),
typeof(Vector2)
})]
[HarmonyPrefix]
public static bool PlayMusic_Prefix(ref AudioClip clip, ref Vector2 pLoopData)
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
//IL_013e: Unknown result type (might be due to invalid IL or missing references)
MusicHax.Log.LogDebug((object)$"Clip {((Object)clip).name} had loop data {pLoopData}");
MusicHax.CreateMusicDirectory(((Object)clip).name);
AudioAsset audioAssetFor = MusicHax.GetAudioAssetFor(((Object)clip).name);
if ((Object)(object)audioAssetFor?.audioClip == (Object)null)
{
AudioInfo currentInfo = default(AudioInfo);
currentInfo.volume = 1f;
MusicHax.currentInfo = currentInfo;
return true;
}
MusicHax.currentInfo = audioAssetFor.audioInfo;
clip = audioAssetFor.audioClip;
pLoopData = audioAssetFor.audioInfo.loopData;
if (DebugSettings.instance.musicOff)
{
return false;
}
if ((Object)(object)clip == (Object)null || AudioHandler.musicPlaying == ((Object)clip).name)
{
return false;
}
AudioHandler.musicLoop = pLoopData;
if (AudioHandler.musicLoop.y <= 0f)
{
AudioHandler.musicLoop.y = clip.length;
}
AudioHandler.audioSourceMusic1.clip = clip;
AudioHandler.audioSourceMusic2.clip = clip;
AudioHandler.audioSourceMusic1.loop = true;
AudioHandler.audioSourceMusic2.loop = true;
AudioHandler.activeMusicChannel = 1;
AudioHandler.musicPlaying = ((Object)clip).name;
if (CGLLJHHAJAK.GIGAKBJGFDI.delayMusicUntilLoaded)
{
((KoroutineBehaviour)AudioHandler.instance).StopKoroutine(AudioHandler.kPlayMusic, true);
((KoroutineBehaviour)AudioHandler.instance).StartKoroutine(AudioHandler.instance.KPlayMusic(), ref AudioHandler.kPlayMusic);
}
else if (AudioHandler.musicLoop.x > 0f)
{
double num = AudioSettings.dspTime + 0.009999999776482582;
AudioHandler.nextMusicLoopTime = num + (double)AudioHandler.musicLoop.y;
AudioHandler.audioSourceMusic1.time = 0f;
AudioHandler.audioSourceMusic1.PlayScheduled(num);
AudioHandler.audioSourceMusic1.SetScheduledEndTime(AudioHandler.nextMusicLoopTime);
}
else
{
AudioHandler.audioSourceMusic1.Play();
}
AudioHandler.SetMusicLoudness(audioAssetFor.audioInfo.volume);
return false;
}
[HarmonyPatch(typeof(AudioHandler), "SetMusicLoudness")]
[HarmonyPrefix]
public static bool SetMusicLoudnessPrefix(ref float f)
{
f *= MusicHax.currentInfo.volume;
return true;
}
[HarmonyPatch(typeof(AudioHandler), "Update")]
[HarmonyPrefix]
public static bool Update_Prefix()
{
if (AudioHandler.musicLoop.x > 0f && (AudioHandler.audioSourceMusic1.isPlaying || AudioHandler.audioSourceMusic2.isPlaying) && AudioSettings.dspTime + 1.0 > AudioHandler.nextMusicLoopTime)
{
if (AudioHandler.activeMusicChannel == 0)
{
AudioHandler.audioSourceMusic1.time = AudioHandler.musicLoop.x;
AudioHandler.audioSourceMusic1.PlayScheduled(AudioHandler.nextMusicLoopTime);
AudioHandler.audioSourceMusic1.SetScheduledEndTime(AudioHandler.nextMusicLoopTime + (double)AudioHandler.musicLoop.y - (double)AudioHandler.musicLoop.x);
}
else if (AudioHandler.activeMusicChannel == 1)
{
AudioHandler.audioSourceMusic2.time = AudioHandler.musicLoop.x;
AudioHandler.audioSourceMusic2.PlayScheduled(AudioHandler.nextMusicLoopTime);
AudioHandler.audioSourceMusic2.SetScheduledEndTime(AudioHandler.nextMusicLoopTime + (double)AudioHandler.musicLoop.y - (double)AudioHandler.musicLoop.x);
}
AudioHandler.activeMusicChannel = 1 - AudioHandler.activeMusicChannel;
AudioHandler.nextMusicLoopTime += (double)(AudioHandler.musicLoop.y - AudioHandler.musicLoop.x);
}
return false;
}
[HarmonyPatch(typeof(AudioHandler), "PlayMusic", new Type[]
{
typeof(AudioClip),
typeof(Vector2)
})]
[HarmonyPostfix]
public static void PlayMusic_Postfix()
{
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
MusicHax.Log.LogDebug((object)$"At the end of PlayMusic, the loop data was {AudioHandler.musicLoop})");
}
[HarmonyPatch(typeof(SfxInfo), "Preload")]
[HarmonyPrefix]
public static bool SfxInfoPreload_Prefix(SfxInfo __instance, ref bool __result)
{
if (__instance.isLoaded)
{
__result = false;
return false;
}
AudioClip[] sfxClips = MusicHax.GetSfxClips(__instance.audioFile);
if (sfxClips != null)
{
__instance.audioClips = sfxClips;
__instance.isLoaded = true;
__result = true;
return false;
}
return true;
}
[HarmonyPatch(typeof(VoiceInfo), "Preload")]
[HarmonyPrefix]
public static bool VoiceInfoPreload_Prefix(VoiceInfo __instance, ref bool __result)
{
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
if (((SfxInfo)__instance).isLoaded)
{
__result = false;
return false;
}
AudioClip[] voiceClips = MusicHax.GetVoiceClips(((SfxInfo)__instance).audioFile, __instance.character);
if (voiceClips != null)
{
((SfxInfo)__instance).audioClips = voiceClips;
((SfxInfo)__instance).isLoaded = true;
__result = true;
return false;
}
return true;
}
}
public static class FileStructure
{
public static readonly string[] SFX = new string[94]
{
"announcer_candyman", "announcer_dice", "announcer_doombox", "announcer_dustandashes", "announcer_eight", "announcer_five", "announcer_four", "announcer_game", "announcer_get_ready", "announcer_grid",
"announcer_jet", "announcer_latch", "announcer_lethal_league", "announcer_nine", "announcer_nitro", "announcer_one", "announcer_play_ball", "announcer_random", "announcer_raptor", "announcer_select",
"announcer_seven", "announcer_six", "announcer_sonata", "announcer_switch", "announcer_ten", "announcer_three", "announcer_time_up", "announcer_toxic", "announcer_two", "bubble_pop",
"catch", "deflect", "express", "get_hit1", "get_hit2", "get_hit3", "get_hit4", "getupgrab", "graffitiPlace", "jump",
"kill", "KO_in", "KO_out", "lobby_character_select", "lobby_player_in", "lobby_player_out", "lobby_start_game", "medium_hit", "medium_smash", "menu_back",
"menu_confirm", "menu_scroll", "menu_set", "next_line", "page_turn", "parry", "parry_activate", "parry_counter", "powerup_heal", "powerup_insert",
"powerup_insert_noroll", "powerup_invisible", "powerup_multi_bounce", "powerup_phantom_hit", "powerup_random", "powerup_result", "powerup_spark", "powerup_ultra", "powerup_warp", "result_xp_gain",
"sax1", "sax10", "sax11", "sax2", "sax3", "sax4", "sax5", "sax6", "sax7", "sax8",
"sax9", "special_activate", "strong_hit", "strong_smash", "swing", "teleport", "throw", "tutorial_ok", "volleyball_hit", "volleyball_smash",
"wall_bounce", "wall_bounce_fast", "weak_hit", "weak_smash"
};
public static readonly string[] Songs = new string[19]
{
"AAron EVO - Beverly Chills", "B. Bravo & Lean Rock - Shred", "Bignic - Ruiner", "Bignic - Scream", "D Fast - Jungaaaa", "D Fast - Whipz", "Doctor Lazer - Headbangeren", "Doctor Lazer - Thuggin", "Frank Klepacki - Decible", "Grillo - Urabon",
"Hideki Naganuma - AIN'T NOTHIN' LIKE A FUNKY BEAT", "Klaus Veen - Dial Hop", "Klaus Veen - Ordinary Days", "Klaus Veen - Ordinary Days V2", "Klaus Veen - Snibbit", "Pixelord - Dominator", "Pixelord - Killa Swing", "The Sleepers RecordZ ft. Nasty Den - Nasty Lovers", "zeroSCAR - X"
};
public static readonly string[] Voices = new string[7] { "_gamewin", "_gethit", "_intense_swing", "_jump", "_normal_swing", "_score", "_special_activation" };
}