Decompiled source of Enchanter v0.0.1

OutwardEnchanter.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using OutwardEnchanter.Helpers;
using OutwardEnchanter.Managers;
using SideLoader;
using SideLoader.Helpers;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("OutwardEnchanter")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("OutwardEnchanter")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[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]
public class DragParent : MonoBehaviour, IDragHandler, IEventSystemHandler, IBeginDragHandler
{
	private RectTransform parentRectTransform;

	private Vector3 offset;

	private void Start()
	{
		parentRectTransform = ((Component)((Component)this).transform.parent).GetComponent<RectTransform>();
	}

	public void OnBeginDrag(PointerEventData eventData)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		offset = ((Transform)parentRectTransform).position - Input.mousePosition;
	}

	public void OnDrag(PointerEventData eventData)
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		((Transform)parentRectTransform).position = Input.mousePosition + offset;
	}
}
namespace OutwardEnchanter
{
	[BepInPlugin("gymmed.outwardenchanter", "Outward Enchanter", "0.0.1")]
	public class OutwardEnchanter : BaseUnityPlugin
	{
		[HarmonyPatch(typeof(CharacterManager), "OnAllPlayersDoneLoading")]
		public class CharacterManager_OnAllPlayersDoneLoading
		{
			private static void Postfix()
			{
				FillSpawnableItemToGUI();
			}
		}

		public const string GUID = "gymmed.outwardenchanter";

		public const string NAME = "Outward Enchanter";

		public const string VERSION = "0.0.1";

		public static string prefix = "[GymMed-Enchanter]";

		public const string GUI_SHOW = "Outward Enchanter GUI Show/Hide";

		internal static ManualLogSource Log;

		internal void Awake()
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			Log = ((BaseUnityPlugin)this).Logger;
			Log.LogMessage((object)"Hello world from Outward Enchanter 0.0.1!");
			CustomKeybindings.AddAction("Outward Enchanter GUI Show/Hide", (KeybindingsCategory)0, (ControlType)2, (InputType)1);
			SL.OnPacksLoaded += delegate
			{
				GUIManager.Instance.CreateCanvas();
			};
			new Harmony("gymmed.outwardenchanter").PatchAll();
		}

		internal void Update()
		{
			if (CustomKeybindings.GetKeyDown("Outward Enchanter GUI Show/Hide"))
			{
				GUIMainCanvasManager gUIMainCanvasManager = GUIManager.Instance?.MainCanvasManager;
				if ((Object)(object)gUIMainCanvasManager == (Object)null)
				{
					LogMessage("Can't access null! Make sure GUI Canvas exist!");
					return;
				}
				if (((Component)gUIMainCanvasManager).gameObject.activeSelf)
				{
					gUIMainCanvasManager.HideCanvas();
					return;
				}
				gUIMainCanvasManager.ShowCanvas();
				((Component)gUIMainCanvasManager).transform.SetAsLastSibling();
			}
		}

		public static void LogMessage(string message)
		{
			Log.LogMessage((object)(prefix + " " + message));
		}

		public static void FillSpawnableItemToGUI()
		{
			try
			{
				GUIMainCanvasManager gUIMainCanvasManager = GUIManager.Instance?.MainCanvasManager;
				if ((Object)(object)gUIMainCanvasManager == (Object)null)
				{
					LogMessage("Can't access null! Make sure GUI Canvas exist!");
					return;
				}
				LogMessage($"OutwardEnchanter@FillSpawnableItemToGUI character exist: {(Object)(object)CharacterEnchanterManager.Instance?.MainCharacter == (Object)null}");
				List<Item> list = ResourcesPrefabManager.Instance.EDITOR_GetSpawnableItemPrefabs(CharacterEnchanterManager.Instance.MainCharacter);
				if (list == null || list.Count < 1)
				{
					string arg = ((list == null) ? "null" : list.Count.ToString());
					LogMessage("OutwardEnchanter@FillSpawnableItemToGUI spawnable items doesn't exist. " + $"spawnableItems: {arg} character exist: {(Object)(object)CharacterEnchanterManager.Instance.MainCharacter == (Object)null}");
					return;
				}
				List<Equipment> availableEquipment = new List<Equipment>(list.OfType<Equipment>().ToList());
				gUIMainCanvasManager.AvailableEquipment = availableEquipment;
				gUIMainCanvasManager.FillItemsData();
				((Component)gUIMainCanvasManager).transform.SetAsLastSibling();
			}
			catch (Exception ex)
			{
				LogMessage("OutwardEnchanter@FillSpawnableItemToGUI error: " + ex.Message);
			}
		}
	}
}
namespace OutwardEnchanter.Managers
{
	public class CharacterEnchanterManager
	{
		private static CharacterEnchanterManager _instance;

		private Character _mainCharacter;

		public static CharacterEnchanterManager Instance
		{
			get
			{
				if (_instance == null)
				{
					_instance = new CharacterEnchanterManager();
				}
				return _instance;
			}
		}

		public Character MainCharacter
		{
			get
			{
				return _mainCharacter;
			}
			set
			{
				_mainCharacter = value;
			}
		}

		private CharacterEnchanterManager()
		{
			MainCharacter = Global.Lobby.PlayersInLobby[0].ControlledCharacter;
		}
	}
	public class GUIMainCanvasManager : MonoBehaviour
	{
		private static GUIMainCanvasManager _instance;

		private List<Equipment> _availableEquipment = new List<Equipment>();

		private List<EnchantmentRecipe> _availableEnchantmentRecipes = new List<EnchantmentRecipe>();

		private Dictionary<string, Equipment> _equipmentDictionary = new Dictionary<string, Equipment>();

		private Dictionary<string, EnchantmentRecipe> _enchantmentRecipeDictionary = new Dictionary<string, EnchantmentRecipe>();

		private Text _resultText;

		private Button _enchantButton;

		private Button _closeButton;

		private Dropdown _chooseItemDropdown;

		private Dropdown _chooseEnchantmentDropdown;

		public static GUIMainCanvasManager Instance
		{
			get
			{
				if ((Object)(object)_instance == (Object)null)
				{
					_instance = new GUIMainCanvasManager();
				}
				return _instance;
			}
		}

		public Text ResultText
		{
			get
			{
				return _resultText;
			}
			set
			{
				_resultText = value;
			}
		}

		public Button EnchantButton
		{
			get
			{
				return _enchantButton;
			}
			set
			{
				_enchantButton = value;
			}
		}

		public Button CloseButton
		{
			get
			{
				return _closeButton;
			}
			set
			{
				_closeButton = value;
			}
		}

		public Dropdown ChooseItemDropdown
		{
			get
			{
				return _chooseItemDropdown;
			}
			set
			{
				_chooseItemDropdown = value;
			}
		}

		public Dropdown ChooseEnchantmentDropdown
		{
			get
			{
				return _chooseEnchantmentDropdown;
			}
			set
			{
				_chooseEnchantmentDropdown = value;
			}
		}

		public List<Equipment> AvailableEquipment
		{
			get
			{
				return _availableEquipment;
			}
			set
			{
				_availableEquipment = value;
			}
		}

		public List<EnchantmentRecipe> AvailableEnchantmentRecipes
		{
			get
			{
				return _availableEnchantmentRecipes;
			}
			set
			{
				_availableEnchantmentRecipes = value;
			}
		}

		public Dictionary<string, Equipment> EquipmentDictionary
		{
			get
			{
				return _equipmentDictionary;
			}
			set
			{
				_equipmentDictionary = value;
			}
		}

		public Dictionary<string, EnchantmentRecipe> EnchantmentRecipeDictionary
		{
			get
			{
				return _enchantmentRecipeDictionary;
			}
			set
			{
				_enchantmentRecipeDictionary = value;
			}
		}

		private GUIMainCanvasManager()
		{
			try
			{
				Init();
			}
			catch (Exception ex)
			{
				OutwardEnchanter.LogMessage("GUIMainCanvasManager error: " + ex.Message);
			}
		}

		public void Init()
		{
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Expected O, but got Unknown
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Expected O, but got Unknown
			string text = "Background-Panel/Main-Panel/";
			Transform obj = ((Component)this).transform.Find(text + "Lower-Panel/Result-Text");
			ResultText = ((obj != null) ? ((Component)obj).GetComponent<Text>() : null);
			if ((Object)(object)ResultText == (Object)null)
			{
				OutwardEnchanter.LogMessage("Couldn't find Result Text component");
			}
			Transform val = ((Component)this).transform.Find(text + "Header-Panel/");
			if ((Object)(object)val == (Object)null)
			{
				ResultAndLogMessage("Couldn't find GUI header");
			}
			else
			{
				((Component)val).gameObject.AddComponent<DragParent>();
				Transform obj2 = val.Find("Close-Button");
				CloseButton = ((obj2 != null) ? ((Component)obj2).GetComponent<Button>() : null);
				if ((Object)(object)CloseButton == (Object)null)
				{
					ResultAndLogMessage("Couldn't find Close Button component");
				}
				else
				{
					((UnityEvent)CloseButton.onClick).AddListener((UnityAction)delegate
					{
						HideCanvas();
					});
				}
			}
			Transform obj3 = ((Component)this).transform.Find(text + "Middle-Panel/Enchant-Button");
			EnchantButton = ((obj3 != null) ? ((Component)obj3).GetComponent<Button>() : null);
			if ((Object)(object)EnchantButton == (Object)null)
			{
				ResultAndLogMessage("Couldn't find Enchant Button component");
			}
			else
			{
				((UnityEvent)EnchantButton.onClick).AddListener((UnityAction)delegate
				{
					HandleOnEnchantButtonClick();
				});
			}
			Transform obj4 = ((Component)this).transform.Find(text + "Middle-Panel/ItemPicker-Panel/ItemPick-Dropdown");
			ChooseItemDropdown = ((obj4 != null) ? ((Component)obj4).GetComponent<Dropdown>() : null);
			if ((Object)(object)ChooseItemDropdown == (Object)null)
			{
				ResultAndLogMessage("Couldn't find Items Dropdown component");
			}
			else
			{
				try
				{
					FillItemsData();
					((UnityEvent<int>)(object)ChooseItemDropdown.onValueChanged).AddListener((UnityAction<int>)delegate(int index)
					{
						HandleOnChooseItemChange(index);
					});
				}
				catch (Exception ex)
				{
					OutwardEnchanter.LogMessage("GUIMainCanvasManager@Init error: " + ex.Message);
				}
			}
			Transform obj5 = ((Component)this).transform.Find(text + "Middle-Panel/EnchantmentPicker-Panel/EnchantmentPick-Dropdown");
			ChooseEnchantmentDropdown = ((obj5 != null) ? ((Component)obj5).GetComponent<Dropdown>() : null);
			if ((Object)(object)ChooseEnchantmentDropdown == (Object)null)
			{
				ResultAndLogMessage("Couldn't find Enchantments Dropdown component");
			}
		}

		public void HandleOnEnchantButtonClick()
		{
			if ((Object)(object)ChooseItemDropdown == (Object)null)
			{
				ResultAndLogMessage("Couldn't find item selection dropdown!");
				return;
			}
			if ((Object)(object)ChooseEnchantmentDropdown == (Object)null)
			{
				ResultAndLogMessage("Couldn't find enchantment recipe selection dropdown!");
				return;
			}
			if (ChooseItemDropdown.options == null || ChooseItemDropdown.options.Count < 1)
			{
				ResultAndLogMessage($"Couldn't generate equipment options in dropdown! Available equipment count: {AvailableEquipment.Count}");
				return;
			}
			string text = ChooseItemDropdown.options[ChooseItemDropdown.value].text;
			if (!EquipmentDictionary.TryGetValue(text, out var value))
			{
				ResultAndLogMessage("Tried to enchant without providing and item!");
				return;
			}
			if (ChooseEnchantmentDropdown.options == null || ChooseEnchantmentDropdown.options.Count < 1)
			{
				ResultAndLogMessage($"Couldn't generate enchantments options in dropdown! Available enchantments count: {AvailableEnchantmentRecipes.Count}");
				return;
			}
			string text2 = ChooseEnchantmentDropdown.options[ChooseEnchantmentDropdown.value].text;
			if (!EnchantmentRecipeDictionary.TryGetValue(text2, out var value2))
			{
				ResultAndLogMessage("Tried to enchant without providing and enchantment!");
				return;
			}
			if (!value2.GetHasMatchingEquipment((Item)(object)value))
			{
				ResultAndLogMessage("Provided incompatible enchantment recipe with equipment!");
				return;
			}
			try
			{
				Item val = SpawnEquipment(value);
				val.Start();
				Equipment val2 = (Equipment)(object)((val is Equipment) ? val : null);
				if (val2 != null)
				{
					Enchantment enchantmentPrefab = ResourcesPrefabManager.Instance.GetEnchantmentPrefab(value2.RecipeID);
					val2.AddEnchantment(((EffectPreset)enchantmentPrefab).PresetID, false);
					val.ApplyVisualModifications();
					ResultMessage("Successfully enchanted! \nequipment: " + ChooseItemDropdown.options[ChooseItemDropdown.value].text + " \nenchantment: " + ChooseEnchantmentDropdown.options[ChooseEnchantmentDropdown.value].text);
				}
			}
			catch (Exception ex)
			{
				ResultAndLogMessage("Enchanting error: " + ex.Message);
			}
		}

		public void HandleOnChooseItemChange(int index)
		{
			try
			{
				string text = ChooseItemDropdown.options[index].text;
				if (!EquipmentDictionary.TryGetValue(text, out var value))
				{
					return;
				}
				List<EnchantmentRecipe> availableEnchantmentRecipies = EnchantmentsHelper.GetAvailableEnchantmentRecipies((Item)(object)value);
				EnchantmentRecipeDictionary = new Dictionary<string, EnchantmentRecipe>();
				List<string> list = new List<string>();
				Enchantment val = null;
				string text2 = "";
				foreach (EnchantmentRecipe item in availableEnchantmentRecipies)
				{
					text2 = ((Object)item).name;
					if (text2 == "")
					{
						val = ResourcesPrefabManager.Instance.GetEnchantmentPrefab(item.RecipeID);
						if ((Object)(object)val == (Object)null)
						{
							continue;
						}
						text2 = ((EffectPreset)val).PresetID + "_" + val.Name;
					}
					if (EnchantmentRecipeDictionary.TryGetValue(text2, out var _))
					{
						text2 = text2 + "_" + Guid.NewGuid();
					}
					EnchantmentRecipeDictionary.Add(text2, item);
					list.Add(text2);
				}
				if ((Object)(object)ChooseEnchantmentDropdown != (Object)null)
				{
					FillDropdownChoices(ChooseEnchantmentDropdown, list);
				}
			}
			catch (Exception ex)
			{
				OutwardEnchanter.LogMessage("GUIMainCanvasManager@HandleOnChooseItemChange error: " + ex.Message);
			}
		}

		public void FillItemsData()
		{
			try
			{
				List<string> list = new List<string>();
				EquipmentDictionary = new Dictionary<string, Equipment>();
				string text = "";
				foreach (Equipment item in AvailableEquipment)
				{
					text = ((Item)item).ItemID + "_" + ((Item)item).Name;
					if (EquipmentDictionary.TryGetValue(text, out var _))
					{
						text = text + "_" + Guid.NewGuid();
					}
					list.Add(text);
					EquipmentDictionary.Add(text, item);
				}
				FillDropdownChoices(ChooseItemDropdown, list);
				ChooseItemDropdown.value = 0;
				ChooseItemDropdown.RefreshShownValue();
				((UnityEvent<int>)(object)ChooseItemDropdown.onValueChanged).Invoke(ChooseItemDropdown.value);
			}
			catch (Exception ex)
			{
				OutwardEnchanter.LogMessage("GUIMainCanvasManager@FillItemsData error: " + ex.Message);
			}
		}

		public void FillDropdownChoices(Dropdown dropdown, List<string> options)
		{
			dropdown.ClearOptions();
			dropdown.AddOptions(options);
		}

		public void ResultAndLogMessage(string message)
		{
			OutwardEnchanter.LogMessage(message);
			ResultMessage(message);
		}

		public void ResultMessage(string message)
		{
			if ((Object)(object)ResultText == (Object)null)
			{
				OutwardEnchanter.LogMessage("Tried to display result message: \"" + message + "\" on null UI Result reference");
			}
			else
			{
				ResultText.text = message;
			}
		}

		public void HideCanvas()
		{
			((Component)this).gameObject.SetActive(false);
			ForceUnlockCursor.RemoveUnlockSource();
		}

		public void ShowCanvas()
		{
			((Component)this).gameObject.SetActive(true);
			ForceUnlockCursor.AddUnlockSource();
		}

		public Item SpawnEquipment(Equipment equipment)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: 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_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: 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_005b: Unknown result type (might be due to invalid IL or missing references)
			Character mainCharacter = CharacterEnchanterManager.Instance.MainCharacter;
			Vector3 position = mainCharacter.CenterPosition + ((Component)mainCharacter).transform.forward * 1.5f;
			Quaternion localRotation = ((Component)mainCharacter).transform.localRotation;
			Item val = ItemManager.Instance.GenerateItemNetwork(((Item)equipment).ItemID);
			((Component)val).transform.position = position;
			((Component)val).transform.rotation = localRotation;
			if ((Object)(object)((Component)equipment).GetComponent<MultipleUsage>() != (Object)null)
			{
				((Component)val).GetComponent<MultipleUsage>().RemainingAmount = 1;
			}
			((Component)val).gameObject.AddComponent<SafeFalling>();
			return val;
		}
	}
	public class GUIManager
	{
		private static GUIManager _instance;

		private Dictionary<int, Enchantment> _enchantmentsDictionary;

		private Canvas _mainCanvas;

		private GUIMainCanvasManager _mainCanvasManager;

		public static GUIManager Instance
		{
			get
			{
				if (_instance == null)
				{
					_instance = new GUIManager();
				}
				return _instance;
			}
		}

		public Dictionary<int, Enchantment> EnchantmentsDictionary
		{
			get
			{
				return _enchantmentsDictionary;
			}
			set
			{
				_enchantmentsDictionary = value;
			}
		}

		public Canvas MainCanvas
		{
			get
			{
				return _mainCanvas;
			}
			set
			{
				_mainCanvas = value;
			}
		}

		public GUIMainCanvasManager MainCanvasManager
		{
			get
			{
				return _mainCanvasManager;
			}
			set
			{
				_mainCanvasManager = value;
			}
		}

		private GUIManager()
		{
		}

		public void CreateCanvas()
		{
			OutwardEnchanter.LogMessage("Initalizing Canvas..");
			GameObject fromAssetBundle = AssetsHelper.GetFromAssetBundle<GameObject>("OutwardEnchanter", "outwardenchanterbundle", "OutwardEnchanterCanvas");
			if ((Object)(object)fromAssetBundle == (Object)null)
			{
				OutwardEnchanter.LogMessage("Failed to load outwardenchanterbundle Asset Bundle");
				return;
			}
			MainCanvas = Object.Instantiate<GameObject>(fromAssetBundle).GetComponent<Canvas>();
			MainCanvasManager = ((Component)MainCanvas).gameObject.AddComponent<GUIMainCanvasManager>();
			Object.DontDestroyOnLoad((Object)(object)MainCanvas);
		}
	}
}
namespace OutwardEnchanter.Helpers
{
	public class AssetsHelper
	{
		public static T GetFromAssetBundle<T>(string SLPackName, string AssetBundle, string key) where T : Object
		{
			if (!SL.PacksLoaded)
			{
				return default(T);
			}
			return SL.GetSLPack(SLPackName).AssetBundles[AssetBundle].LoadAsset<T>(key);
		}
	}
	public class EnchantmentsHelper
	{
		public static List<EnchantmentRecipe> GetAvailableEnchantmentRecipies(Item item)
		{
			List<EnchantmentRecipe> enchantmentRecipes = RecipeManager.Instance.GetEnchantmentRecipes();
			List<EnchantmentRecipe> list = new List<EnchantmentRecipe>();
			foreach (EnchantmentRecipe item2 in enchantmentRecipes)
			{
				if (item2.GetHasMatchingEquipment(item))
				{
					list.Add(item2);
				}
			}
			return list;
		}

		public static void RefreshEnchantmentStatModifications(EquipmentStats stats)
		{
			//IL_019c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0205: Unknown result type (might be due to invalid IL or missing references)
			OutwardEnchanter.LogMessage("GUIMainCanvasManager@RefreshEnchantmentStatModifications called!");
			stats.m_statModifications.Clear();
			Item item = ((ItemStats)stats).m_item;
			Equipment val = (Equipment)(object)((item is Equipment) ? item : null);
			float num = 0f;
			float num2 = 0f;
			int num3 = 0;
			float num4 = 1f;
			bool flag = false;
			stats.m_totalStatusEffectResistance = stats.m_baseStatusEffectResistance;
			if (stats.m_totalDamageBonus == null)
			{
				stats.m_totalDamageBonus = new float[stats.m_damageAttack.Length];
			}
			stats.m_damageAttack.CopyTo(stats.m_totalDamageBonus, 0);
			OutwardEnchanter.LogMessage("GUIMainCanvasManager@RefreshEnchantmentStatModifications 1!");
			stats.m_bonusDamageProtection[0] = 0f;
			stats.m_bonusDamageResistance = new float[9];
			if (Object.op_Implicit((Object)(object)val))
			{
				OutwardEnchanter.LogMessage("GUIMainCanvasManager@RefreshEnchantmentStatModifications 2!");
				for (int i = 0; i < val.ActiveEnchantments.Count; i++)
				{
					StatModificationList statModifications = val.ActiveEnchantments[i].StatModifications;
					OutwardEnchanter.LogMessage("GUIMainCanvasManager@RefreshEnchantmentStatModifications 3!");
					stats.m_statModifications.AddRange(statModifications);
					OutwardEnchanter.LogMessage("GUIMainCanvasManager@RefreshEnchantmentStatModifications 4!");
					stats.m_totalStatusEffectResistance += val.ActiveEnchantments[i].GlobalStatusResistance;
					OutwardEnchanter.LogMessage("GUIMainCanvasManager@RefreshEnchantmentStatModifications 5!");
					num += statModifications.GetBonusValue((Stat)0);
					num2 += statModifications.GetModifierValue((Stat)0);
					num3 += (int)statModifications.GetBonusValue((Stat)1);
					num4 += statModifications.GetModifierValue((Stat)1);
					OutwardEnchanter.LogMessage("GUIMainCanvasManager@RefreshEnchantmentStatModifications 6!");
					if (val.ActiveEnchantments[i].Indestructible)
					{
						flag = true;
					}
					OutwardEnchanter.LogMessage("GUIMainCanvasManager@RefreshEnchantmentStatModifications 7!");
					foreach (DamageType item2 in val.ActiveEnchantments[i].ElementalResistances.List)
					{
						stats.m_bonusDamageResistance[item2.Type] += item2.Damage;
					}
					OutwardEnchanter.LogMessage("GUIMainCanvasManager@RefreshEnchantmentStatModifications 8!");
					foreach (DamageType item3 in val.ActiveEnchantments[i].DamageModifier.List)
					{
						stats.m_totalDamageBonus[item3.Type] += item3.Damage;
					}
					OutwardEnchanter.LogMessage("GUIMainCanvasManager@RefreshEnchantmentStatModifications 9!");
					stats.m_bonusDamageProtection[0] += statModifications.GetBonusValue((Stat)11);
				}
			}
			OutwardEnchanter.LogMessage("GUIMainCanvasManager@RefreshEnchantmentStatModifications 10!");
			stats.m_realWeight = Mathf.Clamp(((ItemStats)stats).RawWeight * (1f + num2 * 0.01f) + num, 0.1f, float.MaxValue);
			if (flag)
			{
				stats.m_realDurability = -1;
				((ItemStats)stats).m_item.ResetDurabiltiy();
				return;
			}
			OutwardEnchanter.LogMessage("GUIMainCanvasManager@RefreshEnchantmentStatModifications 11!");
			stats.m_realDurability = ((((ItemStats)stats).m_baseMaxDurability != -1) ? (Mathf.RoundToInt((float)((ItemStats)stats).m_baseMaxDurability * num4) + num3) : (-1));
			OutwardEnchanter.LogMessage("GUIMainCanvasManager@RefreshEnchantmentStatModifications 12!");
			if (stats.m_realDurability < 1 && ((ItemStats)stats).m_baseMaxDurability != -1)
			{
				stats.m_realDurability = 1;
			}
		}

		public static void FindEnchantingBugs(Item item, EnchantmentRecipe enchantmentRecipe)
		{
			Equipment val = (Equipment)(object)((item is Equipment) ? item : null);
			if (val == null)
			{
				return;
			}
			GUIMainCanvasManager mainCanvasManager = GUIManager.Instance.MainCanvasManager;
			Enchantment enchantmentPrefab = ResourcesPrefabManager.Instance.GetEnchantmentPrefab(enchantmentRecipe.RecipeID);
			OutwardEnchanter.LogMessage("got enchantment!");
			if ((Object)(object)enchantmentPrefab == (Object)null)
			{
				mainCanvasManager.ResultAndLogMessage("Couldn't find Enchantment through ResourcesPrefabManager@GetEnchantmentPrefab!");
				return;
			}
			OutwardEnchanter.LogMessage("before enchanting!");
			if ((Object)(object)val == (Object)null)
			{
				OutwardEnchanter.LogMessage("You dont have and equipment derived class!");
			}
			if (val.m_enchantmentIDs.Contains(((EffectPreset)enchantmentPrefab).PresetID))
			{
				return;
			}
			Enchantment val2 = ResourcesPrefabManager.Instance.GenerateEnchantment(((EffectPreset)enchantmentPrefab).PresetID, ((Component)item).transform);
			OutwardEnchanter.LogMessage("before enchanting!1");
			if (!Object.op_Implicit((Object)(object)val2))
			{
				return;
			}
			OutwardEnchanter.LogMessage("before enchanting!1.5");
			val2.ApplyEnchantment(val);
			OutwardEnchanter.LogMessage("before enchanting!2");
			RecipeManager.Instance.GetEnchantmentRecipeForID(((EffectPreset)enchantmentPrefab).PresetID);
			OutwardEnchanter.LogMessage("before enchanting!3");
			val.m_enchantmentIDs.Add(((EffectPreset)enchantmentPrefab).PresetID);
			OutwardEnchanter.LogMessage("before enchanting!4");
			val.m_activeEnchantments.Add(val2);
			OutwardEnchanter.LogMessage("before enchanting!5");
			val.m_enchantmentsHaveChanged = true;
			OutwardEnchanter.LogMessage("before enchanting!6");
			if ((Object)(object)item.Stats != (Object)null)
			{
				OutwardEnchanter.LogMessage("item have stats!");
			}
			if ((Object)(object)val.Stats != (Object)null)
			{
				OutwardEnchanter.LogMessage("equipment have stats!");
				if (val.ActiveEnchantments != null)
				{
					if (val.ActiveEnchantments[0].StatModifications == null)
					{
						OutwardEnchanter.LogMessage("trying to access missing stat modifications of enchantment!");
					}
				}
				else
				{
					OutwardEnchanter.LogMessage("missing active enchantments!");
				}
				RefreshEnchantmentStatModifications(val.Stats);
			}
			else
			{
				OutwardEnchanter.LogMessage("equipment doesn't have stats!");
				Weapon val3 = (Weapon)(object)((val is Weapon) ? val : null);
				if (val3 != null)
				{
					((Item)val3).m_stats = (ItemStats)(object)((Component)val).GetComponent<WeaponStats>();
					if ((Object)(object)((Item)val3).m_stats == (Object)null)
					{
						OutwardEnchanter.LogMessage("weapon failed to add stats!");
					}
				}
				else
				{
					((Item)val).m_stats = (ItemStats)(object)((Component)val).GetComponent<EquipmentStats>();
					if ((Object)(object)((Item)val).m_stats == (Object)null)
					{
						OutwardEnchanter.LogMessage("armor failed to add stats!");
					}
				}
				if ((Object)(object)item.m_stats == (Object)null)
				{
					OutwardEnchanter.LogMessage("still no stats!");
				}
				else
				{
					if ((Object)(object)item.m_stats.m_item == (Object)null)
					{
						OutwardEnchanter.LogMessage("Can't find item on stats?!");
						item.Start();
						if ((Object)(object)item.m_stats.m_item == (Object)null)
						{
							OutwardEnchanter.LogMessage("Can't find item on stats?! recursion");
							item.StartInit();
						}
					}
					RefreshEnchantmentStatModifications(val.Stats);
				}
			}
			val.RefreshEnchantmentModifiers();
			OutwardEnchanter.LogMessage("before enchanting!7");
		}
	}
}