Decompiled source of EnchantmentRunicChannel v1.0.3

EnchantmentRunicChannel.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("OutwardModTemplate")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("OutwardModTemplate")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("c5450fe0-edcf-483f-b9ea-4b1ef9d36da7")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace RE_EnchantmentRunicChannel
{
	public class RE_EnchantmentRecipeItem_ProcessDescription
	{
		public static bool Prefix(EnchantmentRecipeItem __instance, ManualLogSource Log)
		{
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_017e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0227: Unknown result type (might be due to invalid IL or missing references)
			//IL_0276: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02be: Unknown result type (might be due to invalid IL or missing references)
			//IL_0312: Unknown result type (might be due to invalid IL or missing references)
			//IL_0527: Unknown result type (might be due to invalid IL or missing references)
			//IL_052c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0566: Unknown result type (might be due to invalid IL or missing references)
			//IL_05b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_05bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_05e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_05fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0613: Unknown result type (might be due to invalid IL or missing references)
			//IL_061a: Unknown result type (might be due to invalid IL or missing references)
			//IL_061f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0684: Unknown result type (might be due to invalid IL or missing references)
			//IL_0637: Unknown result type (might be due to invalid IL or missing references)
			//IL_063e: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_06c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_096d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0972: Unknown result type (might be due to invalid IL or missing references)
			//IL_0974: Unknown result type (might be due to invalid IL or missing references)
			//IL_098b: Expected I4, but got Unknown
			if (__instance.Recipes.Length < 1)
			{
				((Item)__instance).m_localizedDescription = ((Item)__instance).Description;
				return true;
			}
			StringBuilder stringBuilder = new StringBuilder();
			string loc = LocalizationManager.Instance.GetLoc("ItemTag_Incense");
			stringBuilder.AppendLine(loc + ": " + __instance.Recipes[0].PillarDatas[0].CompatibleIngredients[0].SpecificIngredient.Name);
			stringBuilder.AppendLine("");
			StringBuilder stringBuilder2 = new StringBuilder();
			for (int i = 0; i < __instance.Recipes[0].PillarDatas.Length; i++)
			{
				if (i > 0)
				{
					stringBuilder2.Append(", ");
				}
				stringBuilder2.Append(LocalizationManager.Instance.GetLoc($"Compass_{__instance.Recipes[0].PillarDatas[i].Direction}"));
				if (__instance.Recipes[0].PillarDatas[i].IsFar)
				{
					stringBuilder2.Append(LocalizationManager.Instance.GetLoc("EnchantmentCondition_PillarFar"));
				}
				else
				{
					stringBuilder2.Append(LocalizationManager.Instance.GetLoc("EnchantmentCondition_PillarClose"));
				}
			}
			stringBuilder.AppendLine(LocalizationManager.Instance.GetLoc("EnchantmentCondition_PillarPlacement") + ": " + stringBuilder2.ToString());
			stringBuilder.AppendLine("");
			bool flag = true;
			for (int j = 0; j < __instance.Recipes.Length; j++)
			{
				for (int k = 0; k < __instance.Recipes[j].CompatibleEquipments.CompatibleEquipments.Length; k++)
				{
					if ((int)__instance.Recipes[j].CompatibleEquipments.CompatibleEquipments[k].Type == 0)
					{
						flag = false;
						break;
					}
				}
				if (!flag)
				{
					break;
				}
			}
			StringBuilder stringBuilder3 = new StringBuilder();
			HashSet<string> hashSet = new HashSet<string>();
			Tag tag;
			for (int l = 0; l < __instance.Recipes.Length; l++)
			{
				if (l > 0)
				{
					stringBuilder3.Append(", ");
				}
				tag = __instance.Recipes[l].CompatibleEquipments.EquipmentTag.Tag;
				if (((Tag)(ref tag)).IsSet)
				{
					stringBuilder3.Append(LocalizationManager.Instance.GetLoc("ItemTag_" + __instance.Recipes[l].CompatibleEquipments.EquipmentTag.Tag.TagName.Replace(" ", "")));
				}
				else
				{
					flag = true;
				}
				for (int m = 0; m < __instance.Recipes[l].CompatibleEquipments.CompatibleEquipments.Length; m++)
				{
					if ((int)__instance.Recipes[l].CompatibleEquipments.CompatibleEquipments[m].Type == 0)
					{
						string text = "";
						if (__instance.Recipes[l].CompatibleEquipments.CompatibleEquipments[m].IngredientTag.Tag == __instance.Recipes[l].CompatibleEquipments.EquipmentTag.Tag)
						{
							text = text + LocalizationManager.Instance.GetLoc("EnchantmentCondition_AnyTag") + " ";
						}
						text += LocalizationManager.Instance.GetLoc("ItemTag_" + __instance.Recipes[l].CompatibleEquipments.CompatibleEquipments[m].IngredientTag.Tag.TagName.Replace(" ", ""));
						hashSet.Add(text);
					}
					else if ((Object)(object)__instance.Recipes[l].CompatibleEquipments.CompatibleEquipments[m].SpecificIngredient != (Object)null)
					{
						hashSet.Add(LocalizationManager.Instance.GetItemName(__instance.Recipes[l].CompatibleEquipments.CompatibleEquipments[m].SpecificIngredient.ItemID));
					}
				}
			}
			StringBuilder stringBuilder4 = new StringBuilder();
			int num = 0;
			foreach (string item in hashSet)
			{
				if (num >= 1)
				{
					stringBuilder4.Append(", ");
				}
				stringBuilder4.Append(item);
				num++;
			}
			if (!flag)
			{
				stringBuilder.AppendLine(LocalizationManager.Instance.GetLoc("EnchantmentCondition_Equipment") + ": " + stringBuilder3.ToString());
				stringBuilder.AppendLine(LocalizationManager.Instance.GetLoc("EnchantmentCondition_Type") + ": " + stringBuilder4.ToString());
			}
			else
			{
				stringBuilder.AppendLine(LocalizationManager.Instance.GetLoc("EnchantmentCondition_Equipment") + ": " + stringBuilder4.ToString());
			}
			stringBuilder.AppendLine("");
			Log.LogMessage((object)$"EnchantmentRecipeItem_ProcessDescription {((Item)__instance).Name} with {__instance.Recipes.Length} recipes");
			for (int n = 0; n < __instance.Recipes.Length; n++)
			{
				EnchantmentRecipe val = __instance.Recipes[n];
				Log.LogMessage((object)$"Recipe {n} {val.RecipeID} {((Object)val).name}.");
				tag = val.CompatibleEquipments.EquipmentTag.Tag;
				if (((Tag)(ref tag)).IsSet)
				{
					Log.LogMessage((object)("Recipe " + ((Object)val).name + " EquipmentTag= " + val.CompatibleEquipments.EquipmentTag.Tag.TagName + "."));
				}
				else
				{
					Log.LogMessage((object)("Recipe " + ((Object)val).name + " EquipmentTag null."));
				}
				for (int num2 = 0; num2 < val.CompatibleEquipments.CompatibleEquipments.Length; num2++)
				{
					IngredientData val2 = val.CompatibleEquipments.CompatibleEquipments[num2];
					Log.LogMessage((object)$"Recipe Ingredient {num2} type= {((object)(IngredientType)(ref val2.Type)).ToString()}.");
					if (val2.IngredientTag != null)
					{
						Log.LogMessage((object)$"Recipe Ingredient {num2} tag= {((object)val2.IngredientTag).ToString()} .");
						tag = val2.IngredientTag.Tag;
						if (((Tag)(ref tag)).IsSet)
						{
							Log.LogMessage((object)$"Recipe Ingredient {num2} IngredientTag= {val2.IngredientTag.Tag.TagName}.");
						}
						else
						{
							Log.LogMessage((object)$"Recipe Ingredient {num2} IngredientTag not set.");
						}
					}
					else
					{
						Log.LogMessage((object)$"Recipe Ingredient {num2} IngredientTag null.");
					}
					if ((Object)(object)val2.SpecificIngredient != (Object)null)
					{
						Log.LogMessage((object)$"Recipe Ingredient {num2} SpecificIngredient= {((object)val2.SpecificIngredient).ToString()} Name= {val2.SpecificIngredient.Name} ItemId={val2.SpecificIngredient.ItemID}.");
					}
					else
					{
						Log.LogMessage((object)$"Recipe Ingredient {num2} SpecificIngredient null.");
					}
				}
			}
			bool flag2 = false;
			StringBuilder stringBuilder5 = new StringBuilder();
			for (int num3 = 0; num3 < __instance.Recipes[0].TimeOfDay.Length; num3++)
			{
				if (flag2)
				{
					stringBuilder5.Append(", ");
				}
				if (__instance.Recipes[0].TimeOfDay[num3].x == 18f && __instance.Recipes[0].TimeOfDay[num3].y == 5f)
				{
					stringBuilder5.Append(LocalizationManager.Instance.GetLoc("TimeOfDay_Night"));
				}
				else if (__instance.Recipes[0].TimeOfDay[num3].x == 5f && __instance.Recipes[0].TimeOfDay[num3].y == 18f)
				{
					stringBuilder5.Append(LocalizationManager.Instance.GetLoc("TimeOfDay_Day"));
				}
				else
				{
					stringBuilder5.Append($"Between {__instance.Recipes[0].TimeOfDay[num3].x} and {__instance.Recipes[0].TimeOfDay[num3].y}");
				}
				flag2 = true;
			}
			if (UnityEngineExtensions.Contains<TemperatureSteps>(__instance.Recipes[0].Temperature, (TemperatureSteps)2))
			{
				if (flag2)
				{
					stringBuilder5.Append(", ");
				}
				stringBuilder5.Append(LocalizationManager.Instance.GetLoc("EnchantmentCondition_ColdWeather"));
				flag2 = true;
			}
			if (UnityEngineExtensions.Contains<TemperatureSteps>(__instance.Recipes[0].Temperature, (TemperatureSteps)6))
			{
				if (flag2)
				{
					stringBuilder5.Append(", ");
				}
				stringBuilder5.Append(LocalizationManager.Instance.GetLoc("EnchantmentCondition_HotWeather"));
				flag2 = true;
			}
			if (__instance.Recipes[0].WindAltarActivated)
			{
				if (flag2)
				{
					stringBuilder5.Append(", ");
				}
				stringBuilder5.Append(LocalizationManager.Instance.GetLoc("EnchantmentCondition_WindAltar"));
				flag2 = true;
			}
			if (__instance.Recipes[0].Weather.Length != 0)
			{
				for (int num4 = 0; num4 < __instance.Recipes[0].Weather.Length; num4++)
				{
					if (flag2)
					{
						stringBuilder5.Append(", ");
					}
					WeaterType weather = __instance.Recipes[0].Weather[num4].Weather;
					switch ((int)weather)
					{
					case 0:
						stringBuilder5.Append(LocalizationManager.Instance.GetLoc("EnchantmentCondition_WeatherClear"));
						flag2 = true;
						break;
					case 1:
						stringBuilder5.Append(LocalizationManager.Instance.GetLoc("EnchantmentCondition_WeatherRain"));
						flag2 = true;
						break;
					case 2:
						stringBuilder5.Append(LocalizationManager.Instance.GetLoc("EnchantmentCondition_WeatherSnow"));
						flag2 = true;
						break;
					case 3:
						stringBuilder5.Append(LocalizationManager.Instance.GetLoc("EnchantmentCondition_WeatherFog"));
						flag2 = true;
						break;
					}
				}
			}
			if (flag2)
			{
				stringBuilder.AppendLine(LocalizationManager.Instance.GetLoc("EnchantmentCondition_ExtraConditions") + ": " + stringBuilder5.ToString());
			}
			if (string.IsNullOrEmpty(__instance.Recipes[0].OverrideRegionLocKey))
			{
				if (__instance.Recipes[0].Region != null && __instance.Recipes[0].Region.Length != 0)
				{
					StringBuilder stringBuilder6 = new StringBuilder();
					if (UnityEngineExtensions.SequenceEqualExt<AreaEnum>((IList<AreaEnum>)__instance.Recipes[0].Region, (IList<AreaEnum>)AreaManager.Regions))
					{
						stringBuilder6.Append(LocalizationManager.Instance.GetLoc("EnchantmentCondition_Outdoors"));
					}
					else if (UnityEngineExtensions.SequenceEqualExt<AreaEnum>((IList<AreaEnum>)__instance.Recipes[0].Region, (IList<AreaEnum>)AreaManager.TrogDungeons))
					{
						stringBuilder6.Append(LocalizationManager.Instance.GetLoc("EnchantmentCondition_TrogDungeons"));
					}
					else
					{
						for (int num5 = 0; num5 < __instance.Recipes[0].Region.Length; num5++)
						{
							if (num5 >= 1)
							{
								stringBuilder6.Append(", ");
							}
							stringBuilder6.Append(AreaManager.Instance.GetAreaName(__instance.Recipes[0].Region[num5]));
						}
					}
					stringBuilder.AppendLine(LocalizationManager.Instance.GetLoc("EnchantmentCondition_Locations") + ": " + stringBuilder6.ToString());
				}
			}
			else
			{
				stringBuilder.AppendLine(string.Concat(str2: (!__instance.Recipes[0].OverrideRegionLocKey.StartsWith("BuildingID_")) ? LocalizationManager.Instance.GetLoc(__instance.Recipes[0].OverrideRegionLocKey) : ((!int.TryParse(__instance.Recipes[0].OverrideRegionLocKey.Replace("BuildingID_", ""), out var result)) ? LocalizationManager.Instance.GetLoc(__instance.Recipes[0].OverrideRegionLocKey) : LocalizationManager.Instance.GetItemName(result)), str0: LocalizationManager.Instance.GetLoc("EnchantmentCondition_Locations"), str1: ": "));
			}
			((Item)__instance).m_localizedDescription = stringBuilder.ToString();
			return false;
		}
	}
}
namespace EnchantmentRunicChannel
{
	[BepInPlugin("Tchernobill.EnchantmentRunicChannel", "EnchantmentRunicChannel", "1.0.3")]
	public class EnchantmentRunicChannel : BaseUnityPlugin
	{
		[HarmonyPatch(typeof(AttackSkill), "OwnerHasAllRequiredItems")]
		public class AttackSkill_OwnerHasAllRequiredItems
		{
			[HarmonyPrefix]
			public static bool Prefix(AttackSkill __instance, ref bool __result)
			{
				//IL_004e: Unknown result type (might be due to invalid IL or missing references)
				if (IsRune(__instance))
				{
					CharacterEquipment equipment = ((EffectSynchronizer)__instance).OwnerCharacter.Inventory.Equipment;
					for (int i = 0; i < equipment.m_equipmentSlots.Length; i++)
					{
						EquipmentSlot val = equipment.m_equipmentSlots[i];
						if (!((Object)(object)val != (Object)null) || !Object.op_Implicit((Object)(object)val.EquippedItem))
						{
							continue;
						}
						for (int j = 0; j < __instance.RequiredTags.Length; j++)
						{
							if (((Item)val.EquippedItem).HasTag(__instance.RequiredTags[j].Tag))
							{
								__result = true;
								return false;
							}
						}
					}
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(Equipment), "AddEnchantment", new Type[]
		{
			typeof(int),
			typeof(bool)
		})]
		public class Equipment_AddEnchantment
		{
			[HarmonyPrefix]
			public static bool Prefix(Equipment __instance, ref int _enchantmentID, ref bool _fromSync)
			{
				//IL_0020: 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)
				if (_enchantmentID == -71000)
				{
					Tag? lexiconTag = GetLexiconTag();
					if (lexiconTag.HasValue)
					{
						((TagListSelectorComponent)((Item)__instance).m_tagSource).AddTag(lexiconTag.Value);
						Log.LogMessage((object)string.Format("{0} {1} Equipment_AddEnchantment Runic Channel({2}) adds {3} Tag on {4}", "EnchantmentRunicChannel", "1.0.3", _enchantmentID, lexiconTag.Value.TagName, ((Item)__instance).Name));
					}
				}
				return true;
			}
		}

		public const string GUID = "Tchernobill.EnchantmentRunicChannel";

		public const string NAME = "EnchantmentRunicChannel";

		public const string VERSION = "1.0.3";

		internal static ManualLogSource Log;

		private static List<int> runesList = new List<int> { 8100210, 8100220, 8100230, 8100240 };

		public const int runicChannel = -71000;

		public const string lexiconTagName = "Lexicon";

		private static Tag? lexiconTag = null;

		internal void Awake()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			Log = ((BaseUnityPlugin)this).Logger;
			new Harmony("Tchernobill.EnchantmentRunicChannel").PatchAll();
		}

		public static Tag? GetLexiconTag()
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: 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)
			if (!lexiconTag.HasValue)
			{
				foreach (Tag dbTag in TagSourceManager.Instance.DbTags)
				{
					if (dbTag.TagName == "Lexicon")
					{
						return lexiconTag = dbTag;
					}
				}
				return null;
			}
			return lexiconTag;
		}

		public static bool IsRune(AttackSkill instance)
		{
			foreach (int runes in runesList)
			{
				if (((Item)instance).ItemID == runes)
				{
					return true;
				}
			}
			return false;
		}
	}
}