Decompiled source of DroneUpgradeStation v1.0.1

DroneUpgradeStation/DroneUpgradeStation.dll

Decompiled 2 days ago
using System;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HG;
using IL.EntityStates.DroneAssemblyStation;
using LeTai.Asset.TranslucentImage;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.RoR2.UI;
using R2API;
using RoR2;
using RoR2.ExpansionManagement;
using RoR2.UI;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;
using UnityEngine.UI;

[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("DroneUpgradeStation")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("DroneUpgradeStation")]
[assembly: AssemblyTitle("DroneUpgradeStation")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace DroneUpgradeStation;

public static class Configs
{
	public static string defaultBlacklist = "TreasureCache, FreeChest, Firework, Squid, LowerPricedChests, ExtraShrineItem, Feather, JumpBoost, Duplicator, BarrageOnBoss, ExtraEquipment";

	public static string defaultSceneList = "dampcavesimple, shipgraveyard, rootjungle, repurposedcrater, conduitcanyon, skymeadow, helminthroost";

	public static ConfigEntry<bool> blacklistCannotCopy { get; private set; }

	public static ConfigEntry<string> blacklistExtraList { get; private set; }

	public static ConfigEntry<bool> bodyFlagMechanical { get; private set; }

	public static ConfigEntry<int> creditCost { get; private set; }

	public static ConfigEntry<int> maxSpawns { get; private set; }

	public static ConfigEntry<int> minStage { get; private set; }

	public static ConfigEntry<string> sceneList { get; private set; }

	public static ConfigEntry<int> weight { get; private set; }

	public static ConfigEntry<bool> spawnOnComputationalExchange { get; private set; }

	public static void Init(ConfigFile cfg)
	{
		blacklistCannotCopy = cfg.Bind<bool>("Functionality", "Blacklist CannotCopy Items", true, "Blacklist all items with the CannotCopy tag.\nOr, in other words, items that turrets don't inherit.");
		blacklistExtraList = cfg.Bind<string>("Functionality", "Blacklist Extra Items", defaultBlacklist, "Blacklist additional items of your choice by listing their internal names.\nMake sure to separate them with commas.");
		bodyFlagMechanical = cfg.Bind<bool>("Functionality", "Upgrade Mechanical Minions", true, "Allow all Mechanical minions to benefit from the interactable.\nSetting to false will only allow Drones to benefit.");
		creditCost = cfg.Bind<int>("Spawn Parameters", "Credit Cost", 30, "Set the director credit cost.\nFor reference, a regular Chest costs 15.");
		maxSpawns = cfg.Bind<int>("Spawn Parameters", "Max Spawns", 1, "Set the maximum amount of times it can spawn per stage. Set to negative for no limit.");
		minStage = cfg.Bind<int>("Spawn Parameters", "Minimum Stage", 1, "Set the earliest stage number it can spawn in.");
		sceneList = cfg.Bind<string>("Spawn Parameters", "Scene List", defaultSceneList, "List the internal names of the stages it'll spawn in.\nMake sure to separate them with commas.");
		weight = cfg.Bind<int>("Spawn Parameters", "Selection Weight", 4, "Set the odds of it being selected to spawn.\nBy default, it is as rare as Drone Combiner Stations, which is to say, pretty uncommon.");
		spawnOnComputationalExchange = cfg.Bind<bool>("Spawn Parameters", "Spawn on Computational Exchange", true, "A guaranteed Drone Upgrade Station will appear on Computational Exchange.");
	}
}
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);
	}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("Samuel17.DroneUpgradeStation", "DroneUpgradeStation", "1.0.1")]
public class Main : BaseUnityPlugin
{
	public static InteractableSpawnCard iscDroneAssemblyStation = Addressables.LoadAssetAsync<InteractableSpawnCard>((object)"RoR2/DLC3/DroneAssemblyStation/iscDroneAssemblyStation.asset").WaitForCompletion();

	public static Material matDroneAssemblyStation = Addressables.LoadAssetAsync<Material>((object)"RoR2/DLC3/DroneAssemblyStation/matDroneAssemblyStation.mat").WaitForCompletion();

	public static GameObject droneAssemblyStationPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC3/DroneAssemblyStation/DroneAssemblyStation.prefab").WaitForCompletion();

	public static ExplicitPickupDropTable blacklist = Addressables.LoadAssetAsync<ExplicitPickupDropTable>((object)"RoR2/DLC3/DroneAssemblyStation/ExcludedItemsDropTable.asset").WaitForCompletion();

	public static GameObject pickerPanel = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC3/DroneAssemblyStation/AssemblyStationPickerPanelv2.prefab").WaitForCompletion();

	public static ExpansionDef dlc3 = Addressables.LoadAssetAsync<ExpansionDef>((object)"RoR2/DLC3/DLC3.asset").WaitForCompletion();

	public void Awake()
	{
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: Expected O, but got Unknown
		//IL_0055: Unknown result type (might be due to invalid IL or missing references)
		//IL_005f: Expected O, but got Unknown
		//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
		Log.Init(((BaseUnityPlugin)this).Logger);
		Configs.Init(((BaseUnityPlugin)this).Config);
		if (Configs.bodyFlagMechanical.Value)
		{
			bool hookFailed = true;
			AssemblingDroneState.OnEnter += (Manipulator)delegate(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				ILCursor val2 = new ILCursor(il);
				if (val2.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1]
				{
					(Instruction x) => ILPatternMatchingExt.MatchLdfld(x, typeof(CharacterBody), "bodyFlags")
				}))
				{
					val2.RemoveRange(3);
					val2.EmitDelegate<Func<CharacterBody, bool>>((Func<CharacterBody, bool>)((CharacterBody body) => (body.bodyFlags & 2) > 0));
					hookFailed = false;
				}
				if (hookFailed)
				{
					Log.Error("Drone Upgrade Station BodyFlag hook failed!");
				}
			};
			bool hook2Failed = true;
			AssemblingDroneState.TransferItem += (Manipulator)delegate(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				ILCursor val = new ILCursor(il);
				if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1]
				{
					(Instruction x) => ILPatternMatchingExt.MatchLdfld(x, typeof(CharacterBody), "bodyFlags")
				}))
				{
					val.RemoveRange(3);
					val.EmitDelegate<Func<CharacterBody, bool>>((Func<CharacterBody, bool>)((CharacterBody body) => (body.bodyFlags & 2) > 0));
					hook2Failed = false;
				}
				if (hook2Failed)
				{
					Log.Error("Drone Upgrade Station BodyFlag hook (2/2) failed!");
				}
			};
		}
		ExpansionRequirementComponent component = droneAssemblyStationPrefab.GetComponent<ExpansionRequirementComponent>();
		if (!Object.op_Implicit((Object)(object)component))
		{
			component = droneAssemblyStationPrefab.AddComponent<ExpansionRequirementComponent>();
			component.requiredExpansion = dlc3;
		}
		matDroneAssemblyStation.color = new Color(0.5019608f, 1f, 0f);
		if (Configs.spawnOnComputationalExchange.Value)
		{
			Stage.onStageStartGlobal += OnStageStartGlobal;
		}
		OtherStuff();
		((SpawnCard)iscDroneAssemblyStation).directorCreditCost = Configs.creditCost.Value;
		iscDroneAssemblyStation.maxSpawnsPerStage = Configs.maxSpawns.Value;
		RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, (Action)delegate
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: 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)
			AddToStages(Configs.sceneList.Value);
			if (Configs.blacklistCannotCopy.Value)
			{
				Enumerator<ItemIndex> enumerator = ItemCatalog.GetItemsWithTag((ItemTag)13).GetEnumerator();
				try
				{
					while (enumerator.MoveNext())
					{
						ItemIndex current = enumerator.Current;
						ItemDef itemDef = ItemCatalog.GetItemDef(current);
						if (Object.op_Implicit((Object)(object)itemDef))
						{
							AddToBlacklist(itemDef);
						}
					}
				}
				finally
				{
					((IDisposable)enumerator).Dispose();
				}
			}
			BlacklistExtraItems(Configs.blacklistExtraList.Value);
		});
	}

	private void OnStageStartGlobal(Stage stage)
	{
		//IL_0052: 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_0054: 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)
		if (!((Object)(object)SceneInfo.instance.sceneDef != (Object)(object)SceneCatalog.FindSceneDef("computationalexchange")))
		{
			Vector3 val = default(Vector3);
			((Vector3)(ref val))..ctor(-47.6f, 121f, -50f);
			Vector3 val2 = default(Vector3);
			((Vector3)(ref val2))..ctor(5f, 165f, 0f);
			GameObject val3 = Object.Instantiate<GameObject>(droneAssemblyStationPrefab, val, Quaternion.Euler(val2));
			val3.transform.eulerAngles = val2;
			NetworkServer.Spawn(val3);
		}
	}

	private void OtherStuff()
	{
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: Expected O, but got Unknown
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
		PurchaseInteraction component = droneAssemblyStationPrefab.GetComponent<PurchaseInteraction>();
		if (Object.op_Implicit((Object)(object)component))
		{
			droneAssemblyStationPrefab.RemoveComponent<PurchaseInteraction>();
		}
		PickupPickerPanel.SetPickupOptions += new hook_SetPickupOptions(PickupPickerPanel_SetPickupOptions);
		RectTransform component2 = pickerPanel.GetComponent<RectTransform>();
		if (Object.op_Implicit((Object)(object)component2))
		{
			((Transform)component2).localScale = new Vector3(0.75f, 0.75f, 0.75f);
			component2.anchorMax = new Vector2(1.1f, 1f);
		}
		((Behaviour)pickerPanel.GetComponent<TranslucentImage>()).enabled = false;
		PickupPickerPanel component3 = pickerPanel.GetComponent<PickupPickerPanel>();
		if (Object.op_Implicit((Object)(object)component3))
		{
			component3.maxColumnCount = 12;
			GridLayoutGroup gridlayoutGroup = component3.gridlayoutGroup;
			if (Object.op_Implicit((Object)(object)gridlayoutGroup))
			{
				((Transform)((Component)gridlayoutGroup).GetComponent<RectTransform>()).localScale = new Vector3(0.8f, 0.8f, 0.8f);
			}
		}
	}

	private void AddToStages(string sceneList)
	{
		//IL_0066: 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)
		//IL_006c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_0083: Unknown result type (might be due to invalid IL or missing references)
		//IL_008a: Unknown result type (might be due to invalid IL or missing references)
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_00aa: Expected O, but got Unknown
		//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b3: Expected O, but got Unknown
		//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
		sceneList = new string((from c in sceneList.ToCharArray()
			where !char.IsWhiteSpace(c)
			select c).ToArray());
		string[] array = sceneList.Split(',');
		string[] array2 = array;
		foreach (string text in array2)
		{
			SceneDef val = SceneCatalog.FindSceneDef(text);
			if (Object.op_Implicit((Object)(object)val))
			{
				DirectorCardHolder val2 = new DirectorCardHolder
				{
					Card = new DirectorCard
					{
						minimumStageCompletions = Configs.minStage.Value - 1,
						preventOverhead = false,
						selectionWeight = Configs.weight.Value,
						spawnCard = (SpawnCard)(object)iscDroneAssemblyStation
					},
					InteractableCategory = (InteractableCategory)8
				};
				Helpers.AddNewInteractableToStage(val2, DirectorAPI.GetStageEnumFromSceneDef(val), text);
				Log.Message("Drone Upgrade Station added to " + val.baseSceneName + ".");
			}
		}
	}

	private void AddToBlacklist(ItemDef itemDef)
	{
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		ref PickupDefEntry[] pickupEntries = ref blacklist.pickupEntries;
		PickupDefEntry val = new PickupDefEntry
		{
			pickupDef = (Object)(object)itemDef
		};
		ArrayUtils.ArrayAppend<PickupDefEntry>(ref pickupEntries, ref val);
	}

	private void BlacklistExtraItems(string itemList)
	{
		//IL_004e: 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_0055: Unknown result type (might be due to invalid IL or missing references)
		//IL_0058: Invalid comparison between Unknown and I4
		//IL_0064: Unknown result type (might be due to invalid IL or missing references)
		itemList = new string((from c in itemList.ToCharArray()
			where !char.IsWhiteSpace(c)
			select c).ToArray());
		string[] array = itemList.Split(',');
		string[] array2 = array;
		foreach (string text in array2)
		{
			ItemIndex val = ItemCatalog.FindItemIndex(text);
			if ((int)val != -1)
			{
				ItemDef itemDef = ItemCatalog.GetItemDef(val);
				if (Object.op_Implicit((Object)(object)itemDef))
				{
					AddToBlacklist(itemDef);
				}
			}
		}
	}

	private void PickupPickerPanel_SetPickupOptions(orig_SetPickupOptions orig, PickupPickerPanel self, Option[] options)
	{
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: Unknown result type (might be due to invalid IL or missing references)
		//IL_007a: 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_008d: Unknown result type (might be due to invalid IL or missing references)
		//IL_011d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0143: Unknown result type (might be due to invalid IL or missing references)
		//IL_0178: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)self).name.StartsWith("AssemblyStationPickerPanelv2"))
		{
			orig.Invoke(self, options);
			return;
		}
		Transform val = ((Component)self).transform.Find("MainPanel");
		if (val != null)
		{
			Transform val2 = val.Find("Juice/BG");
			if (val2 != null)
			{
				Color color = ((Graphic)((Component)val2).GetComponent<Image>()).color;
				((Graphic)((Component)val2).GetComponent<Image>()).color = new Color(color.r, color.g, color.b, 0.5f);
			}
		}
		int num = options.Length;
		int num2 = 12;
		int num3 = Mathf.CeilToInt(Mathf.Sqrt((float)num) + 2f);
		GridLayoutGroup componentInChildren = ((Component)((Component)self).transform).GetComponentInChildren<GridLayoutGroup>();
		if (Object.op_Implicit((Object)(object)componentInChildren))
		{
			componentInChildren.constraint = (Constraint)1;
			componentInChildren.constraintCount = 12;
			self.maxColumnCount = componentInChildren.constraintCount;
			self.automaticButtonNavigation = true;
		}
		orig.Invoke(self, options);
		if (val != null)
		{
			RectTransform component = ((Component)val).GetComponent<RectTransform>();
			float num4 = (float)Mathf.Min(num3, num2) * (component.sizeDelta.x / 8f);
			num3 = ((num3 <= num2) ? num3 : (num3 + 1 + num3 - num2));
			float num5 = (float)num3 * (component.sizeDelta.x / 8f);
			num5 = Mathf.Max(num5, 340f);
			num4 = Mathf.Max(num4, 340f);
			component.sizeDelta = new Vector2(num5, num4);
		}
	}
}
public static class Utils
{
	public static void RemoveComponent<T>(this GameObject go) where T : Component
	{
		T val = default(T);
		if (go.TryGetComponent<T>(ref val))
		{
			Object.Destroy((Object)(object)val);
		}
	}
}