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 System.Threading.Tasks;
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.3.0")]
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.3.0";
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.3.0!");
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;
private InputField _itemFilterInput;
private InputField _enchantmentFilterInput;
private int availableEquipmentCount;
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;
}
}
public InputField EnchantmentFilterInput
{
get
{
return _enchantmentFilterInput;
}
set
{
_enchantmentFilterInput = value;
}
}
public InputField ItemFilterInput
{
get
{
return _itemFilterInput;
}
set
{
_itemFilterInput = value;
}
}
public int AvailableEquipmentCount
{
get
{
return availableEquipmentCount;
}
set
{
availableEquipmentCount = 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");
}
Transform obj6 = ((Component)this).transform.Find(text + "Middle-Panel/ItemFilter-Panel/ItemFilter-Input");
ItemFilterInput = ((obj6 != null) ? ((Component)obj6).GetComponent<InputField>() : null);
if ((Object)(object)ItemFilterInput == (Object)null)
{
ResultAndLogMessage("Couldn't find Item Filter Input component");
}
else
{
((UnityEvent<string>)(object)ItemFilterInput.onEndEdit).AddListener((UnityAction<string>)HandleOnItemFilterEnd);
}
Transform obj7 = ((Component)this).transform.Find(text + "Middle-Panel/EnchantmentFilter-Panel/EnchantmentFilter-Input");
EnchantmentFilterInput = ((obj7 != null) ? ((Component)obj7).GetComponent<InputField>() : null);
if ((Object)(object)EnchantmentFilterInput == (Object)null)
{
ResultAndLogMessage("Couldn't find Enchantment Filter Input component");
}
else
{
((UnityEvent<string>)(object)EnchantmentFilterInput.onEndEdit).AddListener((UnityAction<string>)HandleOnEnchantmentFilterEnd);
}
}
public void HandleOnItemFilterEnd(string text)
{
FilterItemsData(text);
}
public void HandleOnEnchantmentFilterEnd(string text)
{
FilterItemsData(ItemFilterInput.text);
FilterEnchantmentsDataBasedOnItem(text);
}
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: {AvailableEquipmentCount}");
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 (text2 == "None")
{
try
{
Item val = SpawnEquipment(value);
val.Start();
if (val is Equipment)
{
val.ApplyVisualModifications();
EnchantmentsHelper.SetItemAsGenerated(val);
ResultMessage("Successfully spawned! \nequipment: " + ChooseItemDropdown.options[ChooseItemDropdown.value].text);
}
}
catch (Exception ex)
{
ResultAndLogMessage("Spawning error: " + ex.Message);
}
}
if (!value2.GetHasMatchingEquipment((Item)(object)value))
{
ResultAndLogMessage("Provided incompatible enchantment recipe with equipment!");
return;
}
try
{
Item val2 = SpawnEquipment(value);
val2.Start();
Equipment val3 = (Equipment)(object)((val2 is Equipment) ? val2 : null);
if (val3 != null)
{
Enchantment enchantmentPrefab = ResourcesPrefabManager.Instance.GetEnchantmentPrefab(value2.RecipeID);
val3.AddEnchantment(((EffectPreset)enchantmentPrefab).PresetID, false);
val2.ApplyVisualModifications();
EnchantmentsHelper.SetItemAsGenerated(val2);
ResultMessage("Successfully enchanted! \nequipment: " + ChooseItemDropdown.options[ChooseItemDropdown.value].text + " \nenchantment: " + ChooseEnchantmentDropdown.options[ChooseEnchantmentDropdown.value].text);
}
}
catch (Exception ex2)
{
ResultAndLogMessage("Enchanting error: " + ex2.Message);
}
}
public void HandleOnChooseItemChange(int index)
{
try
{
FilterEnchantmentsDataBasedOnItem(EnchantmentFilterInput.text);
}
catch (Exception ex)
{
OutwardEnchanter.LogMessage("GUIMainCanvasManager@HandleOnChooseItemChange error: " + ex.Message);
}
}
public void FilterItemsData(string filter)
{
string previousValue = "";
int selectionValue = 0;
if (ChooseItemDropdown.options.Count > 0)
{
previousValue = ChooseItemDropdown.options[ChooseItemDropdown.value].text;
}
ResultMessage("Loading Items . . .");
((Selectable)ChooseEnchantmentDropdown).interactable = false;
((Selectable)ChooseItemDropdown).interactable = false;
Task.Run(delegate
{
List<string> list = new List<string>();
string text = "";
Dictionary<string, Equipment> dictionary = new Dictionary<string, Equipment>();
List<Equipment> list2 = AvailableEquipment;
if (EnchantmentFilterInput.text != "")
{
list2 = ItemsHelper.GetEquipmentsByEnchantmentName(EnchantmentFilterInput.text, AvailableEquipment, EnchantmentRecipeDictionary);
}
int count = list2.Count;
if (string.IsNullOrEmpty(previousValue))
{
foreach (Equipment item in list2)
{
text = ItemsHelper.GetUniqueEquipmentsName(item, dictionary);
if (EnchantmentsHelper.ContainsIgnoreCase(text, filter))
{
list.Add(text);
dictionary.Add(text, item);
}
}
}
else
{
foreach (Equipment item2 in list2)
{
text = ItemsHelper.GetUniqueEquipmentsName(item2, dictionary);
if (EnchantmentsHelper.ContainsIgnoreCase(text, filter))
{
if (string.Equals(text, previousValue, StringComparison.OrdinalIgnoreCase))
{
selectionValue = list.Count;
}
list.Add(text);
dictionary.Add(text, item2);
}
}
}
return (list, dictionary, selectionValue, count);
}).ContinueWith(delegate(Task<(List<string> dropdownOptions, Dictionary<string, Equipment> localEquipmentDictionary, int selectionValue, int availableCount)> t)
{
var (options, equipmentDictionary, value, num) = t.Result;
EquipmentDictionary = equipmentDictionary;
AvailableEquipmentCount = num;
FillDropdownChoices(ChooseItemDropdown, options);
ChooseItemDropdown.value = value;
ChooseItemDropdown.RefreshShownValue();
((UnityEvent<int>)(object)ChooseItemDropdown.onValueChanged).Invoke(ChooseItemDropdown.value);
ResultMessage("Finished Loading Equipment!");
((Selectable)ChooseEnchantmentDropdown).interactable = true;
((Selectable)ChooseItemDropdown).interactable = true;
}, TaskScheduler.FromCurrentSynchronizationContext());
}
public void FilterEnchantmentsDataBasedOnItem(string filter)
{
if (ChooseItemDropdown.value < 0 || ChooseItemDropdown.value >= ChooseItemDropdown.options.Count)
{
ResultAndLogMessage($"Invalid dropdown selection: {ChooseItemDropdown.value}, options count: {ChooseItemDropdown.options.Count}");
return;
}
string text = ChooseItemDropdown.options[ChooseItemDropdown.value].text;
if (!EquipmentDictionary.TryGetValue(text, out var equipment))
{
ResultAndLogMessage($"Item: {text} is not found! Tried to access: {ChooseItemDropdown.value}");
return;
}
string previousValue = "";
int selectionValue = 0;
if (ChooseEnchantmentDropdown.options.Count > 0)
{
previousValue = ChooseEnchantmentDropdown.options[ChooseEnchantmentDropdown.value].text;
}
ResultMessage("Loading Enchantments and Items . . .");
((Selectable)ChooseEnchantmentDropdown).interactable = false;
((Selectable)ChooseItemDropdown).interactable = false;
Task.Run(delegate
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Expected O, but got Unknown
List<EnchantmentRecipe> availableEnchantmentRecipies = EnchantmentsHelper.GetAvailableEnchantmentRecipies((Item)(object)equipment);
Dictionary<string, EnchantmentRecipe> dictionary = new Dictionary<string, EnchantmentRecipe>();
List<string> list = new List<string>();
string text2 = "";
dictionary.Add("None", new EnchantmentRecipe());
list.Add("None");
if (string.IsNullOrEmpty(previousValue))
{
foreach (EnchantmentRecipe item in availableEnchantmentRecipies)
{
text2 = EnchantmentsHelper.GetUniqueEnchantmentsName(item, dictionary);
if (text2 != null && EnchantmentsHelper.ContainsIgnoreCase(text2, filter))
{
dictionary.Add(text2, item);
list.Add(text2);
}
}
}
else
{
foreach (EnchantmentRecipe item2 in availableEnchantmentRecipies)
{
text2 = EnchantmentsHelper.GetUniqueEnchantmentsName(item2, dictionary);
if (text2 != null && EnchantmentsHelper.ContainsIgnoreCase(text2, filter))
{
if (string.Equals(text2, previousValue, StringComparison.OrdinalIgnoreCase))
{
selectionValue = list.Count;
}
dictionary.Add(text2, item2);
list.Add(text2);
}
}
}
return (list, dictionary, selectionValue);
}).ContinueWith(delegate(Task<(List<string> availableRecipesOptions, Dictionary<string, EnchantmentRecipe> localRecipeDictionary, int selectionValue)> t)
{
var (options, enchantmentRecipeDictionary, value) = t.Result;
if ((Object)(object)ChooseEnchantmentDropdown != (Object)null)
{
EnchantmentRecipeDictionary = enchantmentRecipeDictionary;
FillDropdownChoices(ChooseEnchantmentDropdown, options);
ChooseEnchantmentDropdown.value = value;
ChooseEnchantmentDropdown.RefreshShownValue();
((UnityEvent<int>)(object)ChooseEnchantmentDropdown.onValueChanged).Invoke(ChooseEnchantmentDropdown.value);
ResultMessage("Finished Loading Enchantments and Equipment!");
((Selectable)ChooseEnchantmentDropdown).interactable = true;
((Selectable)ChooseItemDropdown).interactable = true;
}
}, TaskScheduler.FromCurrentSynchronizationContext());
}
public void FillItemsData()
{
try
{
ResultMessage("Loading Enchantments . . .");
((Selectable)ChooseEnchantmentDropdown).interactable = false;
((Selectable)ChooseItemDropdown).interactable = false;
Task.Run(delegate
{
List<string> list = new List<string>();
Dictionary<string, Equipment> dictionary2 = new Dictionary<string, Equipment>();
string text = "";
foreach (Equipment item2 in AvailableEquipment)
{
text = ItemsHelper.GetUniqueEquipmentsName(item2, dictionary2);
list.Add(text);
dictionary2.Add(text, item2);
}
return (list, dictionary2);
}).ContinueWith(delegate(Task<(List<string> dropdownOptions, Dictionary<string, Equipment> localEquipmentDictionary)> t)
{
(List<string> dropdownOptions, Dictionary<string, Equipment> localEquipmentDictionary) result = t.Result;
var (options, _) = result;
Dictionary<string, Equipment> dictionary = (EquipmentDictionary = result.localEquipmentDictionary);
AvailableEquipmentCount = dictionary.Count;
FillDropdownChoices(ChooseItemDropdown, options);
ChooseItemDropdown.value = 0;
ChooseItemDropdown.RefreshShownValue();
((UnityEvent<int>)(object)ChooseItemDropdown.onValueChanged).Invoke(ChooseItemDropdown.value);
ResultMessage("Finished Loading Enchantments!");
((Selectable)ChooseEnchantmentDropdown).interactable = true;
((Selectable)ChooseItemDropdown).interactable = true;
}, TaskScheduler.FromCurrentSynchronizationContext());
}
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 bool ContainsIgnoreCase(string source, string toCheck)
{
if (source == null)
{
return false;
}
return source.IndexOf(toCheck, StringComparison.OrdinalIgnoreCase) >= 0;
}
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");
}
public static string GetUniqueEnchantmentsName(EnchantmentRecipe recipe, Dictionary<string, EnchantmentRecipe> EnchantmentRecipeDictionary)
{
Enchantment val = null;
string text = "";
text = ((Object)recipe).name;
if (text == "")
{
val = ResourcesPrefabManager.Instance.GetEnchantmentPrefab(recipe.RecipeID);
if ((Object)(object)val == (Object)null)
{
return null;
}
text = ((EffectPreset)val).PresetID + "_" + val.Name;
}
if (EnchantmentRecipeDictionary.TryGetValue(text, out var _))
{
text = text + "_" + Guid.NewGuid();
}
return text;
}
public static void SetItemAsGenerated(Item item)
{
item.IsGenerated = true;
item.ClientGenerated = true;
string text = (string.IsNullOrWhiteSpace(item.Description) ? "" : (item.Description + "\n\n"));
item.m_localizedDescription = text + "Item is generated using GymMed Enchanter mod!";
}
}
public class ItemsHelper
{
public static List<Equipment> GetEquipmentsByEnchantmentName(string filter, List<Equipment> availableEquipment, Dictionary<string, EnchantmentRecipe> EnchantmentDictionary)
{
List<Equipment> list = new List<Equipment>();
string text = "";
foreach (Equipment item in availableEquipment)
{
foreach (EnchantmentRecipe availableEnchantmentRecipy in EnchantmentsHelper.GetAvailableEnchantmentRecipies((Item)(object)item))
{
text = EnchantmentsHelper.GetUniqueEnchantmentsName(availableEnchantmentRecipy, EnchantmentDictionary);
if (text != null && EnchantmentsHelper.ContainsIgnoreCase(text, filter))
{
list.Add(item);
break;
}
}
}
return list;
}
public static string GetUniqueEquipmentsName(Equipment equipment, Dictionary<string, Equipment> EquipmentDictionary)
{
string text = "";
text = ((Item)equipment).ItemID + "_" + ((Item)equipment).Name.Replace(" ", "_");
if (EquipmentDictionary.TryGetValue(text, out var _))
{
text = text + "_" + Guid.NewGuid();
}
return text;
}
}
}