watermod.dll

Decompiled 9 months ago
using System;
using System.Collections.Generic;
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.Configuration;
using BepInEx.Logging;
using DunGen;
using DunGen.Graph;
using HarmonyLib;
using LethalLevelLoader;
using Unity.Netcode;
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("watermod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("watermod")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("09bfd390-c977-4ea2-8460-6b5fdeb84117")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace watermod
{
	[BepInPlugin("ZGAF.WaterDungeonMod", "ZGAF Water Dungeon", "0.0.1")]
	public class WaterModBase : BaseUnityPlugin
	{
		[HarmonyPatch(typeof(RoundManager))]
		internal class RoundManagerPatch
		{
			[HarmonyPatch("GenerateNewFloor")]
			[HarmonyPostfix]
			private static void FixTeleportDoors(ref RuntimeDungeon ___dungeonGenerator)
			{
				//IL_0068: Unknown result type (might be due to invalid IL or missing references)
				//IL_006d: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
				//IL_012d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0132: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ac: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
				//IL_0201: Unknown result type (might be due to invalid IL or missing references)
				//IL_0206: Unknown result type (might be due to invalid IL or missing references)
				//IL_0245: Unknown result type (might be due to invalid IL or missing references)
				//IL_0247: Unknown result type (might be due to invalid IL or missing references)
				if (((Object)___dungeonGenerator.Generator.DungeonFlow).name != "dungeonflow")
				{
					return;
				}
				GameObject val = GameObject.Find("DungeonEntranceTeleport");
				NetworkManager val2 = Object.FindObjectOfType<NetworkManager>();
				if (!Object.op_Implicit((Object)(object)val))
				{
					Instance.mls.LogInfo((object)"++++++++++++++ Dungeon Door Not Found. ");
					return;
				}
				Vector3 position = val.transform.position;
				NetworkPrefab val3 = val2.NetworkConfig.Prefabs.Prefabs.First((NetworkPrefab x) => ((Object)x.Prefab).name == "EntranceTeleportA");
				if (val3 == null)
				{
					Instance.mls.LogInfo((object)"++++++++++++++ Unable to find instance of building entrance.");
					return;
				}
				Instance.mls.LogInfo((object)"++++++++++++++ Found DungeonEntranceTeleportA placeholder, swapping with network prefab...");
				Object.Instantiate<GameObject>(val3.Prefab, position, Quaternion.identity);
				GameObject val4 = GameObject.Find("DungeonFireExitTeleport");
				if (!Object.op_Implicit((Object)(object)val4))
				{
					Instance.mls.LogInfo((object)"++++++++++++++ Fire Exit Not Found. ");
					return;
				}
				Vector3 position2 = val4.transform.position;
				NetworkPrefab val5 = val2.NetworkConfig.Prefabs.Prefabs.First((NetworkPrefab x) => ((Object)x.Prefab).name == "EntranceTeleportB");
				if (val5 == null)
				{
					Instance.mls.LogInfo((object)"++++++++++++++ Unable to find instance of fire exit entrance.");
					return;
				}
				Instance.mls.LogInfo((object)"++++++++++++++ Found DungeonEntranceTeleportB placeholder, swapping with network prefab...");
				Object.Instantiate<GameObject>(val5.Prefab, position2, Quaternion.identity);
				IEnumerable<GameObject> enumerable = from obj in Resources.FindObjectsOfTypeAll<GameObject>()
					where ((Object)obj).name == "VentDummy"
					select obj;
				foreach (GameObject item in enumerable)
				{
					Vector3 position3 = item.transform.position;
					NetworkPrefab val6 = val2.NetworkConfig.Prefabs.Prefabs.First((NetworkPrefab x) => ((Object)x.Prefab).name == "VentEntrance");
					Object.Instantiate<GameObject>(val6.Prefab, position3, Quaternion.identity);
				}
			}

			[HarmonyPatch("SpawnScrapInLevel")]
			[HarmonyPrefix]
			private static bool SetItemSpawnPoints(ref SelectableLevel ___currentLevel, ref RuntimeDungeon ___dungeonGenerator)
			{
				if (((Object)___dungeonGenerator.Generator.DungeonFlow).name != "dungeonflow")
				{
					return true;
				}
				SpawnableItemWithRarity val = ___currentLevel.spawnableScrap.Find((SpawnableItemWithRarity x) => x.spawnableItem.itemName == "Bottles");
				if (val == null)
				{
					Instance.mls.LogError((object)"Failed to find bottle bin item for reference snatching; is this a custom moon without the bottle bin item?");
					return true;
				}
				SpawnableItemWithRarity val2 = ___currentLevel.spawnableScrap.Find((SpawnableItemWithRarity x) => x.spawnableItem.itemName == "Golden cup");
				ItemGroup spawnableItems = val.spawnableItem.spawnPositionTypes.Find((ItemGroup x) => ((Object)x).name == "GeneralItemClass");
				ItemGroup val3 = val.spawnableItem.spawnPositionTypes.Find((ItemGroup x) => ((Object)x).name == "TabletopItems");
				ItemGroup spawnableItems2 = (ItemGroup)((val2 == null) ? ((object)val3) : ((object)val2.spawnableItem.spawnPositionTypes.Find((ItemGroup x) => ((Object)x).name == "SmallItems")));
				GameObject[] array = GameObject.FindGameObjectsWithTag("ScrapSpawn");
				if (!array.Any())
				{
					Instance.mls.LogInfo((object)"!!!!!!!!!!!!!!! Could Not Find Scrap Spawn Locations");
					return true;
				}
				GameObject[] array2 = array;
				foreach (GameObject val4 in array2)
				{
					switch (((Object)val4).name)
					{
					case "GeneralItemClassDummy":
					{
						Instance.mls.LogInfo((object)"++++++++++++++++ Creating General Scrap Spawn");
						RandomScrapSpawn val7 = val4.AddComponent<RandomScrapSpawn>();
						val7.spawnableItems = spawnableItems;
						val7.itemSpawnRange = 3f;
						val7.spawnedItemsCopyPosition = false;
						val7.spawnUsed = false;
						break;
					}
					case "TabletopItemsDummy":
					{
						Instance.mls.LogInfo((object)"++++++++++++++++ Creating Table Scrap Spawn");
						RandomScrapSpawn val6 = val4.AddComponent<RandomScrapSpawn>();
						val6.spawnableItems = val3;
						val6.itemSpawnRange = 2f;
						val6.spawnedItemsCopyPosition = false;
						val6.spawnUsed = false;
						break;
					}
					case "SmallItemsDummy":
					{
						Instance.mls.LogInfo((object)"++++++++++++++++ Creating Small Scrap Spawn");
						RandomScrapSpawn val5 = val4.AddComponent<RandomScrapSpawn>();
						val5.spawnableItems = spawnableItems2;
						val5.itemSpawnRange = 2f;
						val5.spawnedItemsCopyPosition = false;
						val5.spawnUsed = false;
						break;
					}
					}
				}
				return true;
			}

			[HarmonyPatch("SpawnSyncedProps")]
			[HarmonyPrefix]
			private static bool SpawnMapHazard(ref RuntimeDungeon ___dungeonGenerator)
			{
				//IL_011a: Unknown result type (might be due to invalid IL or missing references)
				if (((Object)___dungeonGenerator.Generator.DungeonFlow).name != "dungeonflow")
				{
					return true;
				}
				NetworkManager val = Object.FindObjectOfType<NetworkManager>();
				GameObject[] array = Object.FindObjectsOfType<GameObject>();
				NetworkPrefab val2 = val.NetworkConfig.Prefabs.Prefabs.First((NetworkPrefab x) => ((Object)x.Prefab).name == "TurretContainer");
				NetworkPrefab val3 = val.NetworkConfig.Prefabs.Prefabs.First((NetworkPrefab x) => ((Object)x.Prefab).name == "Landmine");
				List<GameObject> spawnablePrefabs = new List<GameObject> { val2.Prefab, val3.Prefab };
				GameObject[] array2 = array;
				foreach (GameObject val4 in array2)
				{
					string name = ((Object)val4).name;
					string text = name;
					if (text == "MapHazardSpawnType1")
					{
						RandomMapObject val5 = val4.AddComponent<RandomMapObject>();
						val5.spawnablePrefabs = spawnablePrefabs;
						(string, Vector3) tuple = ($"++++++++++++++++ Created Hazard Spawn at {0}", ((Component)val5).transform.position);
						Instance.mls.LogInfo((object)tuple);
					}
				}
				return true;
			}

			[HarmonyPatch("SpawnSyncedProps")]
			[HarmonyPrefix]
			private static bool SpawnAsaparagus(ref RuntimeDungeon ___dungeonGenerator)
			{
				//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
				if (((Object)___dungeonGenerator.Generator.DungeonFlow).name != "dungeonflow")
				{
					return true;
				}
				NetworkManager val = Object.FindObjectOfType<NetworkManager>();
				GameObject val2 = GameObject.Find("LungSpawn");
				if ((Object)(object)val2 == (Object)null)
				{
					Instance.mls.LogInfo((object)"++++++++++++++++ Asparagus spawn location not found!");
					return true;
				}
				SpawnSyncedObject val3 = val2.AddComponent<SpawnSyncedObject>();
				NetworkPrefab val4 = val.NetworkConfig.Prefabs.Prefabs.First((NetworkPrefab x) => ((Object)x.Prefab).name == "LungApparatus");
				val3.spawnPrefab = val4.Prefab;
				if ((Object)(object)val3.spawnPrefab == (Object)null)
				{
					Instance.mls.LogInfo((object)"++++++++++++++++ Asparagus prefab not found!");
					return true;
				}
				(string, Vector3) tuple = ($"++++++++++++++++ Spawned Asparagus at {0}", ((Component)val3).transform.position);
				Instance.mls.LogInfo((object)tuple);
				return true;
			}
		}

		private const string modGUID = "ZGAF.WaterDungeonMod";

		private const string modName = "ZGAF Water Dungeon";

		private const string modVersion = "0.0.1";

		private readonly Harmony harmony = new Harmony("ZGAF.WaterDungeonMod");

		private static WaterModBase Instance;

		internal ManualLogSource mls;

		private ConfigEntry<int> configWDRarity;

		private ConfigEntry<string> configMoons;

		private ConfigEntry<bool> configGuaranteedWD;

		private string[] MoonConfigs = new string[5] { "vanilla", "modded", "all", "paid", "titan" };

		private void Awake()
		{
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Expected O, but got Unknown
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Expected O, but got Unknown
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Expected O, but got Unknown
			//IL_01d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Expected O, but got Unknown
			//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f5: Expected O, but got Unknown
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = this;
			}
			mls = Logger.CreateLogSource("ZGAF.WaterDungeonMod");
			mls.LogInfo((object)"ZGAF Water Dungeon v0.0.1");
			string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
			AssetBundle val = AssetBundle.LoadFromFile(Path.Combine(directoryName, "waterdungeon"));
			if ((Object)(object)val == (Object)null)
			{
				mls.LogError((object)"Failed to load Water Dungeon Assets");
				return;
			}
			harmony.PatchAll(typeof(WaterModBase));
			harmony.PatchAll(typeof(RoundManagerPatch));
			configWDRarity = ((BaseUnityPlugin)this).Config.Bind<int>("General", "WDRarity", 100, new ConfigDescription("How rare it is for the foundation to be chosen. Higher values increases the chance of spawning the foundation.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 300), Array.Empty<object>()));
			configMoons = ((BaseUnityPlugin)this).Config.Bind<string>("General", "WDMoons", "all", new ConfigDescription("The moon(s) that the foundation can spawn on, from the given presets.", (AcceptableValueBase)(object)new AcceptableValueList<string>(MoonConfigs), Array.Empty<object>()));
			configGuaranteedWD = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "WDGuaranteed", true, new ConfigDescription("If enabled, the foundation will be effectively guaranteed to spawn. Only recommended for debugging/sightseeing purposes.", (AcceptableValueBase)null, Array.Empty<object>()));
			mls.LogInfo((object)"Loaded zgaf waterdungeon moon config!");
			DungeonFlow val2 = val.LoadAsset<DungeonFlow>("assets/Mods/waterdungeon/dungeonscripts/dungeonflow.asset");
			if ((Object)(object)val2 == (Object)null)
			{
				mls.LogError((object)"Failed to load WaterDungeon Flow.");
				return;
			}
			ExtendedDungeonFlow val3 = ScriptableObject.CreateInstance<ExtendedDungeonFlow>();
			val3.dungeonFlow = val2;
			val3.dungeonFirstTimeAudio = null;
			val3.dungeonDefaultRarity = 0;
			int num = (configGuaranteedWD.Value ? 99999 : configWDRarity.Value);
			val3.manualContentSourceNameReferenceList.Add(new StringWithRarity("Lethal Company", num));
			val3.manualContentSourceNameReferenceList.Add(new StringWithRarity("Custom", num));
			Instance.mls.LogInfo((object)"Registered dungeon interior on all moons, including modded.");
			AssetBundleLoader.RegisterExtendedDungeonFlow(val3);
			mls.LogInfo((object)"WaterDungeon for Lethal Company [Version 0.0.1] successfully loaded.");
		}
	}
}
namespace watermod.Patches
{
	[HarmonyPatch(typeof(CurrentLevelValues))]
	internal class CurrentLevelValues
	{
		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		private static void maxScrapPatch(ref float ___maxScrap)
		{
			___maxScrap = 0f;
		}
	}
}