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.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using DesolateCoast.Content; using EnemiesReturns.Configuration; using EnemiesReturns.Enemies.SandCrab; using HG; using HG.Reflection; using R2API; using RoR2; using RoR2.ContentManagement; using SS2; using ShaderSwapper; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: OptIn] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] public class ReplaceShaders : MonoBehaviour { } namespace DesolateCoast { [BepInPlugin("wormsworms.Desolate_Coast", "Desolate_Coast", "1.0.0")] public class DesolateCoast : BaseUnityPlugin { public const string Author = "wormsworms"; public const string Name = "Desolate_Coast"; public const string Version = "1.0.0"; public const string GUID = "wormsworms.Desolate_Coast"; public static DesolateCoast instance; public static ConfigEntry enableRegular; public static ConfigEntry enableSimulacrum; public static ConfigEntry stage1Simulacrum; public static ConfigEntry toggleSandCrab; public static ConfigEntry toggleWayfarer; public const string mapName = "coast_wormsworms"; public const string simuName = "itcoast_wormsworms"; private static GameObject fanPrefab; private void Awake() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown instance = this; Log.Init(((BaseUnityPlugin)this).Logger); ConfigSetup(); ContentManager.collectContentPackProviders += new CollectContentPackProvidersDelegate(GiveToRoR2OurContentPackProviders); Language.collectLanguageRootFolders += CollectLanguageRootFolders; SceneManager.sceneLoaded += SceneSetup; RoR2Application.onLoadFinished = (Action)Delegate.Combine(RoR2Application.onLoadFinished, new Action(AddModdedEnemies)); } public static void AddModdedEnemies() { if (IsEnemiesReturns.enabled) { EnemiesReturnsCompat.AddEnemies(); } if (IsStarstorm2.enabled) { Starstorm2Compat.AddEnemies(); } } private void Destroy() { Language.collectLanguageRootFolders -= CollectLanguageRootFolders; } private static void GiveToRoR2OurContentPackProviders(AddContentPackProviderDelegate addContentPackProvider) { addContentPackProvider.Invoke((IContentPackProvider)(object)new ContentProvider()); } public void CollectLanguageRootFolders(List folders) { folders.Add(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "Language")); folders.Add(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "Plugins/Language")); } private void CoastAmbienceSetup() { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: 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_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) GameObject val = GameObject.Find("Ambience"); if (Object.op_Implicit((Object)(object)val)) { AkBank component = val.GetComponent(); AkAmbient[] components = val.GetComponents(); AkAmbient val2 = components[0]; AkAmbient val3 = components[1]; if (Object.op_Implicit((Object)(object)component)) { WwiseBankReference wwiseObjectReference = Addressables.LoadAssetAsync((object)"Wwise/8AC8A9CB-604F-43BC-A864-873DC735786F.asset").WaitForCompletion(); WwiseEventReference wwiseObjectReference2 = Addressables.LoadAssetAsync((object)"Wwise/6C9A5B06-3C87-4DD2-835F-B0F2385B7700.asset").WaitForCompletion(); WwiseEventReference wwiseObjectReference3 = Addressables.LoadAssetAsync((object)"Wwise/6F2ADD1C-BD55-431F-A62F-80CCD5F9631D.asset").WaitForCompletion(); component.data.WwiseObjectReference = wwiseObjectReference; ((AkEvent)val2).data.WwiseObjectReference = wwiseObjectReference2; ((AkEvent)val3).data.WwiseObjectReference = wwiseObjectReference3; } } else { Log.Error("no ambience :("); } } private void SceneSetup(Scene newScene, LoadSceneMode loadSceneMode) { if (((Scene)(ref newScene)).name == "coast_wormsworms" || ((Scene)(ref newScene)).name == "itcoast_wormsworms") { CoastAmbienceSetup(); Transform transform = GameObject.Find("HOLDER: Geysers").transform; for (int i = 0; i < transform.childCount; i++) { GameObject gameObject = ((Component)transform.GetChild(i).GetChild(0).GetChild(0)).gameObject; GameObject gameObject2 = ((Component)transform.GetChild(i).GetChild(0).GetChild(1)).gameObject; ((Renderer)gameObject.GetComponent()).material = DesolateCoastContent.terrainMaterial; ((Renderer)gameObject2.GetComponent()).material = DesolateCoastContent.terrainMaterial; } Transform transform2 = GameObject.Find("HOLDER: Random/Spires/Geyser").transform; GameObject gameObject3 = ((Component)transform2.GetChild(0).GetChild(0)).gameObject; GameObject gameObject4 = ((Component)transform2.GetChild(0).GetChild(1)).gameObject; ((Renderer)gameObject3.GetComponent()).material = DesolateCoastContent.terrainMaterial; ((Renderer)gameObject4.GetComponent()).material = DesolateCoastContent.terrainMaterial; } } private void ConfigSetup() { enableRegular = ((BaseUnityPlugin)this).Config.Bind("00 - Stages", "Enable Desolate Coast", true, "If true, Desolate Coast can appear in regular runs."); enableSimulacrum = ((BaseUnityPlugin)this).Config.Bind("00 - Stages", "Enable Simulacrum Variant", true, "If true, Desolate Coast can appear in the Simulacrum."); stage1Simulacrum = ((BaseUnityPlugin)this).Config.Bind("00 - Stages", "Enable Simulacrum Variant on Stage 1", false, "If false, Desolate Coast will only appear after clearing at least one stage in the Simulacrum, like Commencement."); toggleSandCrab = ((BaseUnityPlugin)this).Config.Bind("01 - Monsters: EnemiesReturns", "Enable Sand Crab", true, "If true, Sand Crabs will appear in Desolate Coast."); toggleWayfarer = ((BaseUnityPlugin)this).Config.Bind("03 - Monsters: Starstorm 2", "Enable Wayfarer", true, "If true, Wayfarers will appear in Desolate Coast."); } } internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { _logSource.LogInfo(data); } internal static void Message(object data) { _logSource.LogMessage(data); } internal static void Warning(object data) { _logSource.LogWarning(data); } } public class IsStarstorm2 { private static bool? _enabled; public static bool enabled { get { if (!_enabled.HasValue) { _enabled = Chainloader.PluginInfos.ContainsKey("com.TeamMoonstorm.MSU") && Chainloader.PluginInfos.ContainsKey("com.TeamMoonstorm"); } return _enabled.Value; } } } public class IsEnemiesReturns { private static bool? _enabled; public static bool enabled { get { if (!_enabled.HasValue) { _enabled = Chainloader.PluginInfos.ContainsKey("com.Viliger.EnemiesReturns"); } return _enabled.Value; } } } public class IsSandswept { private static bool? _enabled; public static bool enabled { get { if (!_enabled.HasValue) { _enabled = Chainloader.PluginInfos.ContainsKey("com.TeamSandswept.Sandswept"); } return _enabled.Value; } } } public class IsForgottenRelics { private static bool? _enabled; public static bool enabled { get { if (!_enabled.HasValue) { _enabled = Chainloader.PluginInfos.ContainsKey("PlasmaCore.ForgottenRelics"); } return _enabled.Value; } } } public class EnemiesReturnsCompat { public static void AddEnemies() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: 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_005b: Expected O, but got Unknown //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: 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_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Expected O, but got Unknown if (DesolateCoast.toggleSandCrab.Value && General.EnableSandCrab.Value) { DirectorCard card = new DirectorCard { spawnCard = (SpawnCard)SpawnCards.cscSandCrabDefault, spawnDistance = (MonsterSpawnDistance)0, selectionWeight = SandCrab.SelectionWeight.Value, minimumStageCompletions = SandCrab.MinimumStageCompletion.Value }; DirectorCardHolder val = new DirectorCardHolder { Card = card, MonsterCategory = (MonsterCategory)3 }; if (!SandCrab.DefaultStageList.Value.Contains("coast_wormsworms")) { Helpers.AddNewMonsterToStage(val, false, (Stage)1, "coast_wormsworms"); Log.Info("Sand Crab added to Desolate Coast's spawn pool."); } if (!SandCrab.DefaultStageList.Value.Contains("itcoast_wormsworms")) { Helpers.AddNewMonsterToStage(val, false, (Stage)1, "itcoast_wormsworms"); Log.Info("Sand Crab added to Desolate Coast's simulacrum spawn pool."); } } } } public class Starstorm2Compat { public static string FindEnemyConfig(string monsterName) { string text = "00 - Enemy Disabling.Disable Enemy: " + monsterName; ConfigEntryBase[] configEntries = SS2Config.ConfigMonster.GetConfigEntries(); foreach (ConfigEntryBase val in configEntries) { if (((object)val.Definition).ToString() == text) { return val.GetSerializedValue(); } } return "false"; } public static void AddEnemies() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Expected O, but got Unknown //IL_0078: Expected O, but got Unknown string text = FindEnemyConfig("Lamp Boss"); if (DesolateCoast.toggleWayfarer.Value && text == "false") { DirectorCard card = new DirectorCard { spawnCard = SS2Assets.LoadAsset("scLampBoss", (SS2Bundle)17), spawnDistance = (MonsterSpawnDistance)0, selectionWeight = 1 }; DirectorCardHolder val = new DirectorCardHolder { Card = card, MonsterCategory = (MonsterCategory)4 }; Helpers.AddNewMonsterToStage(val, false, (Stage)1, "coast_wormsworms"); Helpers.AddNewMonsterToStage(val, false, (Stage)1, "itcoast_wormsworms"); Log.Info("Wayfarer added to Desolate Coast's spawn pool."); } } } } namespace DesolateCoast.Content { public static class DesolateCoastContent { internal const string ScenesAssetBundleFileName = "coastscenes"; internal const string AssetsAssetBundleFileName = "coastassets"; private static AssetBundle _scenesAssetBundle; private static AssetBundle _assetsAssetBundle; internal static UnlockableDef[] UnlockableDefs; internal static SceneDef[] SceneDefs; internal static SceneDef coastSceneDef; internal static Sprite coastSceneDefPreviewSprite; internal static Material coastBazaarSeer; internal static SceneDef simuSceneDef; internal static Sprite simuSceneDefPreviewSprite; internal static Material simuBazaarSeer; internal static Material terrainMaterial; internal static Material itTerrainMaterial; public static List SwappedMaterials = new List(); internal static IEnumerator LoadAssetBundlesAsync(AssetBundle scenesAssetBundle, AssetBundle assetsAssetBundle, IProgress progress, ContentPack contentPack) { _scenesAssetBundle = scenesAssetBundle; _assetsAssetBundle = assetsAssetBundle; IEnumerator upgradeStubbedShaders = ShaderSwapper.UpgradeStubbedShadersAsync(_assetsAssetBundle); while (upgradeStubbedShaders.MoveNext()) { yield return upgradeStubbedShaders.Current; } yield return LoadAllAssetsAsync(assetsAssetBundle, progress, (Action)delegate(UnlockableDef[] assets) { contentPack.unlockableDefs.Add(assets); }); yield return LoadAllAssetsAsync(_assetsAssetBundle, progress, (Action)delegate(Material[] assets) { terrainMaterial = assets.First((Material a) => ((Object)a).name == "matCoastTerrain"); itTerrainMaterial = assets.First((Material a) => ((Object)a).name == "matITCoastTerrain"); }); yield return LoadAllAssetsAsync(_assetsAssetBundle, progress, (Action)delegate(SceneDef[] assets) { SceneDefs = assets; coastSceneDef = SceneDefs.First((SceneDef sd) => sd.baseSceneNameOverride == "coast_wormsworms"); simuSceneDef = SceneDefs.First((SceneDef sd) => sd.baseSceneNameOverride == "itcoast_wormsworms"); Log.Debug(coastSceneDef.nameToken); contentPack.sceneDefs.Add(assets); }); coastSceneDef.portalMaterial = StageRegistration.MakeBazaarSeerMaterial((Texture2D)coastSceneDef.previewTexture); AsyncOperationHandle mainTrackDefRequest = Addressables.LoadAssetAsync((object)"RoR2/Base/Common/MusicTrackDefs/muFULLSong07.asset"); while (!mainTrackDefRequest.IsDone) { yield return null; } AsyncOperationHandle bossTrackDefRequest = Addressables.LoadAssetAsync((object)"RoR2/DLC2/Common/muSong_Lakes&HabitatBoss.asset"); while (!bossTrackDefRequest.IsDone) { yield return null; } coastSceneDef.mainTrack = mainTrackDefRequest.Result; coastSceneDef.bossTrack = bossTrackDefRequest.Result; simuSceneDef.mainTrack = coastSceneDef.mainTrack; simuSceneDef.bossTrack = coastSceneDef.bossTrack; if (DesolateCoast.enableRegular.Value) { StageRegistration.RegisterSceneDefToNormalProgression(coastSceneDef, 1f, true, true); } if (DesolateCoast.enableSimulacrum.Value && DesolateCoast.stage1Simulacrum.Value) { Simulacrum.RegisterSceneToSimulacrum(simuSceneDef); } else if (DesolateCoast.enableSimulacrum.Value && !DesolateCoast.stage1Simulacrum.Value) { Simulacrum.RegisterSceneToSimulacrum(simuSceneDef, canBeStage1: false); } } internal static void Unload() { _assetsAssetBundle.Unload(true); _scenesAssetBundle.Unload(true); } private static IEnumerator LoadAllAssetsAsync(AssetBundle assetBundle, IProgress progress, Action onAssetsLoaded) where T : Object { AssetBundleRequest sceneDefsRequest = assetBundle.LoadAllAssetsAsync(); while (!((AsyncOperation)sceneDefsRequest).isDone) { progress.Report(((AsyncOperation)sceneDefsRequest).progress); yield return null; } onAssetsLoaded(sceneDefsRequest.allAssets.Cast().ToArray()); } } public class ContentProvider : IContentPackProvider { private readonly ContentPack _contentPack = new ContentPack(); public static string assetDirectory; public string identifier => "wormsworms.Desolate_Coast.ContentProvider"; public IEnumerator LoadStaticContentAsync(LoadStaticContentAsyncArgs args) { _contentPack.identifier = identifier; string assetsFolderFullPath = (assetDirectory = Path.GetDirectoryName(typeof(ContentProvider).Assembly.Location)); AssetBundle scenesAssetBundle = null; yield return LoadAssetBundle(Path.Combine(assetsFolderFullPath, "coastscenes"), args.progressReceiver, delegate(AssetBundle assetBundle) { scenesAssetBundle = assetBundle; }); AssetBundle assetsAssetBundle = null; yield return LoadAssetBundle(Path.Combine(assetsFolderFullPath, "coastassets"), args.progressReceiver, delegate(AssetBundle assetBundle) { assetsAssetBundle = assetBundle; }); yield return DesolateCoastContent.LoadAssetBundlesAsync(scenesAssetBundle, assetsAssetBundle, args.progressReceiver, _contentPack); } private IEnumerator LoadAssetBundle(string assetBundleFullPath, IProgress progress, Action onAssetBundleLoaded) { AssetBundleCreateRequest assetBundleCreateRequest = AssetBundle.LoadFromFileAsync(assetBundleFullPath); while (!((AsyncOperation)assetBundleCreateRequest).isDone) { progress.Report(((AsyncOperation)assetBundleCreateRequest).progress); yield return null; } onAssetBundleLoaded(assetBundleCreateRequest.assetBundle); } public IEnumerator GenerateContentPackAsync(GetContentPackAsyncArgs args) { ContentPack.Copy(_contentPack, args.output); args.ReportProgress(1f); yield break; } public IEnumerator FinalizeAsync(FinalizeAsyncArgs args) { args.ReportProgress(1f); yield break; } } public static class Simulacrum { public static void RegisterSceneToSimulacrum(SceneDef sceneDef, bool canBeStage1 = true, float weight = 1f) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: 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_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0048: 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_0078: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) SceneCollection val = Addressables.LoadAssetAsync((object)"RoR2/DLC1/GameModes/InfiniteTowerRun/SceneGroups/sgInfiniteTowerStageX.asset").WaitForCompletion(); SceneCollection val2 = Addressables.LoadAssetAsync((object)"RoR2/DLC1/GameModes/InfiniteTowerRun/SceneGroups/sgInfiniteTowerStage1.asset").WaitForCompletion(); List list = new List(); Enumerator enumerator = val.sceneEntries.GetEnumerator(); try { while (enumerator.MoveNext()) { SceneEntry current = enumerator.Current; if ((Object)(object)current.sceneDef == (Object)(object)sceneDef) { Log.Error("SceneDef " + sceneDef.cachedName + " is already registered into the Simulacrum"); return; } if (current.sceneDef.hasAnyDestinations) { list.Add(current.sceneDef.destinationsGroup); } } } finally { ((IDisposable)enumerator/*cast due to .constrained prefix*/).Dispose(); } SceneCollection val3 = ScriptableObject.CreateInstance(); ((Object)val3).name = "sgInfiniteTowerStageX" + sceneDef.cachedName; val3._sceneEntries = val._sceneEntries; sceneDef.destinationsGroup = val3; SceneEntry val4 = new SceneEntry { sceneDef = sceneDef, weightMinusOne = weight - 1f }; ArrayUtils.ArrayAppend(ref val._sceneEntries, ref val4); if (canBeStage1) { ArrayUtils.ArrayAppend(ref val2._sceneEntries, ref val4); } foreach (SceneCollection item in list) { ArrayUtils.ArrayAppend(ref item._sceneEntries, ref val4); } } } }