Decompiled source of ConfigEgocentrismEdit v1.0.0

ConfigEgocentrism.dll

Decompiled 8 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
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 Microsoft.CodeAnalysis;
using On.RoR2;
using R2API.Utils;
using RoR2;
using RoR2.Projectile;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("ConfigEgocentrism")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("ConfigEgocentrism")]
[assembly: AssemblyTitle("ConfigEgocentrism")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace ConfigEgocentrism
{
	[BepInPlugin("Judgy.ConfigEgocentrism", "ConfigEgocentrism", "1.2.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class ConfigEgocentrismPlugin : BaseUnityPlugin
	{
		public const string PluginGUID = "Judgy.ConfigEgocentrism";

		public const string PluginAuthor = "Judgy";

		public const string PluginName = "ConfigEgocentrism";

		public const string PluginVersion = "1.2.1";

		private List<ItemTier> TransformInvalidItemTiers;

		private static ConfigEntry<bool> ConfigProjectilesEnabled { get; set; }

		private static ConfigEntry<float> ConfigProjectilesIntervalBase { get; set; }

		private static ConfigEntry<float> ConfigProjectilesIntervalStackMult { get; set; }

		private static ConfigEntry<float> ConfigProjectilesIntervalStackExponent { get; set; }

		private static ConfigEntry<float> ConfigProjectilesDamageBase { get; set; }

		private static ConfigEntry<float> ConfigProjectilesDamageStackMult { get; set; }

		private static ConfigEntry<float> ConfigProjectilesDamageStackExponent { get; set; }

		private static ConfigEntry<float> ConfigProjectilesMaxAmountBase { get; set; }

		private static ConfigEntry<float> ConfigProjectilesMaxAmountStackMult { get; set; }

		private static ConfigEntry<float> ConfigProjectilesMaxAmountStackExponent { get; set; }

		private static ConfigEntry<string> ConfigProjectilesMaxAmountRoundingMode { get; set; }

		private static ConfigEntry<float> ConfigProjectilesRangeBase { get; set; }

		private static ConfigEntry<float> ConfigProjectilesRangeStackMult { get; set; }

		private static ConfigEntry<float> ConfigProjectilesRangeStackExponent { get; set; }

		private static ConfigEntry<bool> ConfigTransformEnabled { get; set; }

		private static ConfigEntry<float> ConfigTransformIntervalBase { get; set; }

		private static ConfigEntry<float> ConfigTransformIntervalStackMult { get; set; }

		private static ConfigEntry<float> ConfigTransformIntervalStackExponent { get; set; }

		private static ConfigEntry<float> ConfigTransformAmountBase { get; set; }

		private static ConfigEntry<float> ConfigTransformAmountStackMult { get; set; }

		private static ConfigEntry<float> ConfigTransformAmountStackExponent { get; set; }

		private static ConfigEntry<string> ConfigTransformAmountRoundingMode { get; set; }

		private static ConfigEntry<string> ConfigTransformItemFilter { get; set; }

		private static ConfigEntry<string> ConfigPluginVersion { get; set; }

		public void Awake()
		{
			Log.Init(((BaseUnityPlugin)this).Logger);
			CreateConfig();
			BuildItemFilters();
			SetupHooks();
			Log.LogInfo("Awake done.");
		}

		private void CreateConfig()
		{
			//IL_01c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cb: Expected O, but got Unknown
			//IL_0351: Unknown result type (might be due to invalid IL or missing references)
			//IL_035b: Expected O, but got Unknown
			ConfigProjectilesEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Feature Toggle", "Projectiles Enabled", true, "Enables the generation of projectiles.");
			ConfigTransformEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Feature Toggle", "Transform Enabled", true, "Enables the transformation of other items.");
			ConfigProjectilesIntervalBase = ((BaseUnityPlugin)this).Config.Bind<float>("Projectiles Interval", "Interval Base", 3f, "Sets the base interval between each generation of projectiles (in seconds).\nFormula: _Base_ / (Stack * StackMult)^StackExponent");
			ConfigProjectilesIntervalStackMult = ((BaseUnityPlugin)this).Config.Bind<float>("Projectiles Interval", "Interval Stack Multiplier", 1f, "Sets the stack multiplier in projectiles interval formula.\nOnly accepts positive values or 0.0. Default value used if input is negative.\nFormula: Base / (Stack * _StackMult_)^StackExponent");
			ConfigProjectilesIntervalStackExponent = ((BaseUnityPlugin)this).Config.Bind<float>("Projectiles Interval", "Interval Stack Exponent", 1f, "Sets the stack exponent in projectiles interval formula.\nOnly accepts positive values or 0.0. Default value used if input is negative.\nFormula: Base / (Stack * StackMult)^_StackExponent_");
			ConfigProjectilesDamageBase = ((BaseUnityPlugin)this).Config.Bind<float>("Projectiles Damage", "Damage Base", 3.6f, "Sets the base damage multiplier of projectiles.\nFormula: _Base_ + (Stack * StackMult)^StackExponent");
			ConfigProjectilesDamageStackMult = ((BaseUnityPlugin)this).Config.Bind<float>("Projectiles Damage", "Damage Stack Multiplier", 0f, "Sets the stack multiplier in projectiles damage formula.\nFormula: Base + (Stack * _StackMult_)^StackExponent");
			ConfigProjectilesDamageStackExponent = ((BaseUnityPlugin)this).Config.Bind<float>("Projectiles Damage", "Damage Stack Exponent", 1f, "Sets the stack exponent in projectiles damage formula.\nFormula: Base + (Stack * StackMult)^_StackExponent_");
			ConfigProjectilesMaxAmountBase = ((BaseUnityPlugin)this).Config.Bind<float>("Projectiles Max Amount", "Max Amount Base", 2f, "Sets the base max amount of projectiles.\nFormula: _Base_ + (Stack * StackMult)^StackExponent");
			ConfigProjectilesMaxAmountStackMult = ((BaseUnityPlugin)this).Config.Bind<float>("Projectiles Max Amount", "Max Amount Stack Multiplier", 1f, "Sets the stack multiplier in projectiles max amount formula.\nFormula: Base + (Stack * _StackMult_)^StackExponent");
			ConfigProjectilesMaxAmountStackExponent = ((BaseUnityPlugin)this).Config.Bind<float>("Projectiles Max Amount", "Max Amount Stack Exponent", 1f, "Sets the stack multiplier in projectiles max amount formula.\nFormula: Base + (Stack * StackMult)^_StackExponent_");
			ConfigProjectilesMaxAmountRoundingMode = ((BaseUnityPlugin)this).Config.Bind<string>("Projectiles Max Amount", "Max Amount Rounding Mode", Utils.RoundingMode.AlwaysDown.ToString(), new ConfigDescription("Sets the rounding mode when calculating projectiles max amount.", (AcceptableValueBase)(object)new AcceptableValueList<string>(Enum.GetNames(typeof(Utils.RoundingMode))), Array.Empty<object>()));
			ConfigProjectilesRangeBase = ((BaseUnityPlugin)this).Config.Bind<float>("Projectiles Range", "Range Base", 15f, "Sets the base targeting range of projectiles.\nFormula: _Base_ + (Stack * StackMult)^StackExponent");
			ConfigProjectilesRangeStackMult = ((BaseUnityPlugin)this).Config.Bind<float>("Projectiles Range", "Range Stack Mutliplier", 0f, "Sets the stack multiplier in projectiles range formula.\nFormula: Base + (Stack * _StackMult_)^StackExponent");
			ConfigProjectilesRangeStackExponent = ((BaseUnityPlugin)this).Config.Bind<float>("Projectiles Range", "Range Stack Exponent", 1f, "Sets the stack exponent in projectiles range formula.\nFormula: Base + (Stack * StackMult)^_StackExponent_");
			ConfigTransformIntervalBase = ((BaseUnityPlugin)this).Config.Bind<float>("Transform Interval", "Interval Base", 60f, "Sets the base interval between each item transform (in seconds).\nFormula: _Base_ / (Stack * StackMult)^StackExponent");
			ConfigTransformIntervalStackMult = ((BaseUnityPlugin)this).Config.Bind<float>("Transform Interval", "Interval Stack Multiplier", 0f, "Sets the stack multiplier in item transform interval formula.\nOnly accepts positive values or 0.0. Default value used if input is negative.\nFormula: Base / (Stack * _StackMult_)^StackExponent");
			ConfigTransformIntervalStackExponent = ((BaseUnityPlugin)this).Config.Bind<float>("Transform Interval", "Interval Stack Exponent", 0f, "Sets the stack exponent in item transform interval formula.\nOnly accepts positive values or 0.0. Default value used if input is negative.\nFormula: Base / (Stack * StackMult)^_StackExponent_");
			ConfigTransformAmountBase = ((BaseUnityPlugin)this).Config.Bind<float>("Transform Item Amount", "Transform Amount Base", 1f, "Sets the base number of items transformed at each iteration.\nFormula: _Base_ + (Stack * StackMult)^StackExponent");
			ConfigTransformAmountStackMult = ((BaseUnityPlugin)this).Config.Bind<float>("Transform Item Amount", "Transform Amount Stack Multiplier", 0f, "Sets the stack multiplier in transform item amount formula.\nFormula: Base + (Stack * _StackMult_)^StackExponent");
			ConfigTransformAmountStackExponent = ((BaseUnityPlugin)this).Config.Bind<float>("Transform Item Amount", "Transform Amount Stack Exponent", 1f, "Sets the stack exponent in transform item amount formula.\nFormula: Base + (Stack * StackMult)^_StackExponent_");
			ConfigTransformAmountRoundingMode = ((BaseUnityPlugin)this).Config.Bind<string>("Transform Item Amount", "Transform Amount Rounding Mode", Utils.RoundingMode.AlwaysDown.ToString(), new ConfigDescription("Sets the rounding mode when calculating item transform amount.", (AcceptableValueBase)(object)new AcceptableValueList<string>(Enum.GetNames(typeof(Utils.RoundingMode))), Array.Empty<object>()));
			ConfigTransformItemFilter = ((BaseUnityPlugin)this).Config.Bind<string>("Transform Item Filter", "Filter", "untiered", "Filters Item Tiers to NOT transform. Avoid removing `untiered` from that list to not lose character passives, artifacts and other hidden stuff.\r\nFormat : tier1,tier2,tier3\r\nValid Tiers: untiered,white,green,red,blue,yellow,voidwhite,voidgreen,voidred,voidyellow");
			ConfigTransformItemFilter.SettingChanged += RebuildItemFiltersEvent;
			ConfigPluginVersion = ((BaseUnityPlugin)this).Config.Bind<string>("zMiscellaneous", "Plugin Version", "0.0.0", "Plugin Version, used for cleaning old configs entries.\nAvoid editing this unless you want duplicate config entries.");
			if (ConfigPluginVersion.Value == (string)((ConfigEntryBase)ConfigPluginVersion).DefaultValue)
			{
				ConfigCleanup();
			}
			ConfigPluginVersion.Value = "1.2.1";
		}

		private void ConfigCleanup()
		{
			Log.LogWarning("Old Config data cleaned up. This should only get triggered once ever.");
			Reflection.GetPropertyValue<Dictionary<ConfigDefinition, string>>((object)((BaseUnityPlugin)this).Config, "OrphanedEntries").Clear();
			((BaseUnityPlugin)this).Config.Save();
		}

		private void RebuildItemFiltersEvent(object s, EventArgs e)
		{
			BuildItemFilters();
		}

		private void BuildItemFilters()
		{
			TransformInvalidItemTiers = new List<ItemTier>();
			string[] array = ConfigTransformItemFilter.Value.Split(new char[1] { ',' });
			foreach (string text in array)
			{
				if (!string.IsNullOrWhiteSpace(text))
				{
					if (Enum.TryParse<Utils.ItemTierLookup>(text.Trim().ToLower(), out var result))
					{
						TransformInvalidItemTiers.Add((ItemTier)result);
					}
					else
					{
						Log.LogDebug("TransformItemFilter: Invalid tier input `" + text + "`");
					}
				}
			}
			Log.LogInfo($"TransformItemFilter: Filter List built ({TransformInvalidItemTiers.Count} filters)");
		}

		private void SetupHooks()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			LunarSunBehavior.FixedUpdate += (hook_FixedUpdate)delegate(orig_FixedUpdate orig, LunarSunBehavior self)
			{
				//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
				//IL_0115: Unknown result type (might be due to invalid IL or missing references)
				//IL_011a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0121: Unknown result type (might be due to invalid IL or missing references)
				//IL_0126: Unknown result type (might be due to invalid IL or missing references)
				//IL_012b: 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_0134: Unknown result type (might be due to invalid IL or missing references)
				//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
				//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
				//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
				//IL_01de: Unknown result type (might be due to invalid IL or missing references)
				//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
				//IL_01ec: Unknown result type (might be due to invalid IL or missing references)
				//IL_0231: Unknown result type (might be due to invalid IL or missing references)
				//IL_0234: Invalid comparison between Unknown and I4
				//IL_0206: Unknown result type (might be due to invalid IL or missing references)
				//IL_023c: Unknown result type (might be due to invalid IL or missing references)
				//IL_025b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0262: Unknown result type (might be due to invalid IL or missing references)
				//IL_0212: Unknown result type (might be due to invalid IL or missing references)
				//IL_0214: Unknown result type (might be due to invalid IL or missing references)
				CharacterBody fieldValue = Reflection.GetFieldValue<CharacterBody>((object)self, "body");
				GameObject fieldValue2 = Reflection.GetFieldValue<GameObject>((object)self, "projectilePrefab");
				int fieldValue3 = Reflection.GetFieldValue<int>((object)self, "stack");
				float num = Reflection.GetFieldValue<float>((object)self, "projectileTimer");
				float num2 = Reflection.GetFieldValue<float>((object)self, "transformTimer");
				Xoroshiro128Plus fieldValue4 = Reflection.GetFieldValue<Xoroshiro128Plus>((object)self, "transformRng");
				if (ConfigProjectilesEnabled.Value)
				{
					num += Time.fixedDeltaTime;
					float projectilesInterval = GetProjectilesInterval(fieldValue3);
					int num3 = (int)(num / projectilesInterval);
					for (int i = 0; i < num3; i++)
					{
						if (!fieldValue.master.IsDeployableLimited((DeployableSlot)16))
						{
							num -= num;
							ProjectileSphereTargetFinder component = fieldValue2.GetComponent<ProjectileSphereTargetFinder>();
							if (Object.op_Implicit((Object)(object)component))
							{
								component.lookRange = GetProjectilesRange(fieldValue3);
							}
							else
							{
								Log.LogError("LunarSunBehavior: Unable to modify projectile Range (ProjectileSphereTargetFinder component not found)");
							}
							FireProjectileInfo val = default(FireProjectileInfo);
							val.projectilePrefab = fieldValue2;
							val.crit = fieldValue.RollCrit();
							val.damage = fieldValue.damage * GetProjectilesDamage(fieldValue3);
							val.damageColorIndex = (DamageColorIndex)3;
							val.force = 0f;
							val.owner = ((Component)self).gameObject;
							val.position = fieldValue.transform.position;
							val.rotation = Quaternion.identity;
							FireProjectileInfo val2 = val;
							ProjectileManager.instance.FireProjectile(val2);
						}
						else
						{
							num = 0f;
						}
					}
				}
				if (ConfigTransformEnabled.Value)
				{
					num2 += Time.fixedDeltaTime;
					if (num2 > GetTransformInterval(fieldValue3))
					{
						num2 = 0f;
						if (Object.op_Implicit((Object)(object)fieldValue.master) && Object.op_Implicit((Object)(object)fieldValue.inventory))
						{
							int transformAmount = GetTransformAmount(fieldValue3);
							for (int j = 0; j < transformAmount; j++)
							{
								List<ItemIndex> list = new List<ItemIndex>(fieldValue.inventory.itemAcquisitionOrder);
								ItemIndex val3 = (ItemIndex)(-1);
								Util.ShuffleList<ItemIndex>(list, fieldValue4);
								foreach (ItemIndex item in list)
								{
									if (item != Items.LunarSun.itemIndex)
									{
										ItemDef itemDef = ItemCatalog.GetItemDef(item);
										if (Object.op_Implicit((Object)(object)itemDef) && !TransformInvalidItemTiers.Contains(itemDef.tier))
										{
											val3 = item;
											break;
										}
									}
								}
								if ((int)val3 != -1)
								{
									fieldValue.inventory.RemoveItem(val3, 1);
									fieldValue.inventory.GiveItem(Items.LunarSun, 1);
									CharacterMasterNotificationQueue.PushItemTransformNotification(fieldValue.master, val3, Items.LunarSun.itemIndex, (TransformationType)4);
								}
							}
						}
					}
				}
				Reflection.SetFieldValue<float>((object)self, "projectileTimer", num);
				Reflection.SetFieldValue<float>((object)self, "transformTimer", num2);
			};
			LunarSunBehavior.GetMaxProjectiles += (hook_GetMaxProjectiles)((orig_GetMaxProjectiles orig, Inventory inventory) => GetProjectilesMaxAmount(inventory.GetItemCount(Items.LunarSun)));
		}

		private float GetProjectilesInterval(int stack)
		{
			float value = ConfigProjectilesIntervalBase.Value;
			float positiveConfigFloat = Utils.GetPositiveConfigFloat(ConfigProjectilesIntervalStackMult);
			float positiveConfigFloat2 = Utils.GetPositiveConfigFloat(ConfigProjectilesIntervalStackExponent);
			return Utils.GetDividingFormulaValue(value, stack, positiveConfigFloat, positiveConfigFloat2);
		}

		private float GetProjectilesDamage(int stack)
		{
			float value = ConfigProjectilesDamageBase.Value;
			float value2 = ConfigProjectilesDamageStackMult.Value;
			float value3 = ConfigProjectilesDamageStackExponent.Value;
			return Utils.GetAdditionalFormulaValue(value, stack, value2, value3);
		}

		private int GetProjectilesMaxAmount(int stack)
		{
			float value = ConfigProjectilesMaxAmountBase.Value;
			float value2 = ConfigProjectilesMaxAmountStackMult.Value;
			float value3 = ConfigProjectilesMaxAmountStackExponent.Value;
			return Utils.Round(Utils.GetAdditionalFormulaValue(value, stack, value2, value3), ConfigProjectilesMaxAmountRoundingMode.Value);
		}

		private float GetProjectilesRange(int stack)
		{
			float value = ConfigProjectilesRangeBase.Value;
			float value2 = ConfigProjectilesRangeStackMult.Value;
			float value3 = ConfigProjectilesRangeStackExponent.Value;
			return Utils.GetAdditionalFormulaValue(value, stack, value2, value3);
		}

		private float GetTransformInterval(int stack)
		{
			float value = ConfigTransformIntervalBase.Value;
			float positiveConfigFloat = Utils.GetPositiveConfigFloat(ConfigTransformIntervalStackMult);
			float positiveConfigFloat2 = Utils.GetPositiveConfigFloat(ConfigTransformIntervalStackExponent);
			return Utils.GetDividingFormulaValue(value, stack, positiveConfigFloat, positiveConfigFloat2);
		}

		private int GetTransformAmount(int stack)
		{
			float value = ConfigTransformAmountBase.Value;
			float value2 = ConfigTransformAmountStackMult.Value;
			float value3 = ConfigTransformAmountStackExponent.Value;
			return Utils.Round(Utils.GetAdditionalFormulaValue(value, stack, value2, value3), ConfigTransformAmountRoundingMode.Value);
		}
	}
	internal static class Log
	{
		internal static ManualLogSource _logSource;

		internal static void Init(ManualLogSource logSource)
		{
			_logSource = logSource;
		}

		internal static void LogDebug(object data)
		{
			_logSource.LogDebug(data);
		}

		internal static void LogError(object data)
		{
			_logSource.LogError(data);
		}

		internal static void LogFatal(object data)
		{
			_logSource.LogFatal(data);
		}

		internal static void LogInfo(object data)
		{
			_logSource.LogInfo(data);
		}

		internal static void LogMessage(object data)
		{
			_logSource.LogMessage(data);
		}

		internal static void LogWarning(object data)
		{
			_logSource.LogWarning(data);
		}
	}
	public static class Utils
	{
		public enum ItemTierLookup
		{
			white,
			green,
			red,
			blue,
			yellow,
			untiered,
			voidwhite,
			voidgreen,
			voidred,
			voidyellow
		}

		public enum RoundingMode
		{
			AlwaysDown,
			AlwaysUp,
			Closest
		}

		public static int Round(float f, string roundingModeStr, int defaultVal = 0)
		{
			RoundingMode roundingMode = RoundingMode.AlwaysDown;
			if (Enum.TryParse<RoundingMode>(roundingModeStr, out var result))
			{
				roundingMode = result;
			}
			switch (roundingMode)
			{
			case RoundingMode.AlwaysDown:
				return Mathf.FloorToInt(f);
			case RoundingMode.AlwaysUp:
				return Mathf.CeilToInt(f);
			case RoundingMode.Closest:
				return Mathf.RoundToInt(f);
			default:
				Log.LogError("Rounding mode \"" + roundingModeStr + "\" not implemented. Returning default value (" + defaultVal + ")");
				return defaultVal;
			}
		}

		public static float GetPositiveConfigFloat(ConfigEntry<float> config)
		{
			if (config.Value >= 0f)
			{
				return config.Value;
			}
			return (float)((ConfigEntryBase)config).DefaultValue;
		}

		public static float GetAdditionalFormulaValue(float baseVal, int stack, float stackMult, float stackExponent)
		{
			return baseVal + Mathf.Pow((float)stack * stackMult, stackExponent);
		}

		public static float GetDividingFormulaValue(float baseVal, int stack, float stackMult, float stackExponent)
		{
			float num = Mathf.Pow((float)stack * stackMult, stackExponent);
			if (num <= 0f)
			{
				num = 1f;
			}
			return baseVal / num;
		}
	}
}