using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using SoftReferenceableAssets;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.TextCore;
using UnityEngine.UI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("Advize_Armoire")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Valheim Game Modification")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("8424dd46-f4b9-4fae-873e-59bc805d8112")]
[assembly: AssemblyFileVersion("1.1.1.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.1.1.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 Advize_Armoire
{
[BepInPlugin("advize.Armoire", "Armoire", "1.1.1")]
public sealed class Armoire : BaseUnityPlugin
{
public const string PluginID = "advize.Armoire";
public const string PluginName = "Armoire";
public const string Version = "1.1.1";
internal void Awake()
{
Runtime.MakeAllAssetsLoadable();
Logger.Sources.Add((ILogSource)(object)StaticMembers.ModLogger);
StaticMembers.config = new ModConfig(((BaseUnityPlugin)this).Config);
StaticMembers.assetBundle = StaticMembers.LoadAssetBundle("armoire");
StaticMembers.guiPrefab = StaticMembers.assetBundle.LoadAsset<GameObject>("ArmoireGUI");
StaticMembers.armoireSlot = StaticMembers.assetBundle.LoadAsset<GameObject>("ArmoireSlot");
StaticMembers.armoirePiecePrefab = StaticMembers.assetBundle.LoadAsset<GameObject>("ArmoirePiece");
Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "advize.Armoire");
}
}
public class ArmoireDoor : MonoBehaviour, Hoverable, Interactable
{
[Header("Transform References")]
public Transform playerAttachPoint;
public Transform cameraPosition;
public GameObject equipmentAttachPoint;
private const string AttachAnimation = "onGround";
private const float UseDistance = 2f;
private static Gradient _hoverGradient;
internal static List<EffectList> SoundEffects = new List<EffectList>();
private ZNetView _nview;
private Animator _animator;
private uint _lastDataRevision = uint.MaxValue;
private static Gradient HoverGradient => _hoverGradient ?? InitializeGradient();
internal bool CanInteract
{
get
{
//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)
AnimatorStateInfo currentAnimatorStateInfo = _animator.GetCurrentAnimatorStateInfo(0);
return ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsTag("openable");
}
}
public void Awake()
{
_nview = ((Component)this).GetComponent<ZNetView>();
if (Object.op_Implicit((Object)(object)_nview) && _nview.IsValid())
{
_animator = ((Component)this).GetComponentInChildren<Animator>();
_nview.Register("UseArmoire", (Action<long>)RPC_UseArmoire);
((MonoBehaviour)this).InvokeRepeating("UpdateState", 0f, 5f);
}
}
private void RPC_UseArmoire(long uid)
{
if (CanInteract)
{
int @int = _nview.GetZDO().GetInt(ZDOVars.s_state, 0);
_nview.GetZDO().Set(ZDOVars.s_state, 1 - @int, false);
UpdateState();
}
}
private void UpdateState()
{
if (_nview.IsValid())
{
ZDO zdo = _nview.m_zdo;
if (zdo != null && zdo.DataRevision != _lastDataRevision)
{
_lastDataRevision = zdo.DataRevision;
SetState(zdo.GetInt(ZDOVars.s_state, 0));
}
}
}
private void SetState(int state)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
if (_animator.GetInteger("state") != state)
{
SoundEffects[state].Create(((Component)this).transform.position, ((Component)this).transform.rotation, (Transform)null, 1f, -1);
_animator.SetInteger("state", state);
}
}
public void ResetState()
{
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
_nview.InvokeRPC("UseArmoire", Array.Empty<object>());
playerAttachPoint.localRotation = Quaternion.Euler(0f, 0f, 0f);
}
public string GetHoverText()
{
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
if (ArmoireUIController.IsArmoirePanelActive())
{
return string.Empty;
}
float num = Mathf.Clamp01((float)AppearanceTracker.UnlockedPercentage);
string text = ColorUtility.ToHtmlStringRGB(HoverGradient.Evaluate(num));
return $"{GetHoverName()}\nCollected: <color=#{text}>{AppearanceTracker.TotalUnlocked}/{AppearanceTracker.TotalCollectable}</color>";
}
public string GetHoverName()
{
return "Armoire";
}
public bool Interact(Humanoid character, bool hold, bool alt)
{
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
StaticMembers.Dbgl("Interacted with armoire", forceLog: false, (LogLevel)16);
if (hold || !CanInteract)
{
return false;
}
Player val = (Player)(object)((character is Player) ? character : null);
if (val == null || !InUsingDistance((Humanoid)(object)val) || ((Character)val).IsEncumbered())
{
return false;
}
Player closestPlayer = Player.GetClosestPlayer(playerAttachPoint.position, 0.1f);
if (Object.op_Implicit((Object)(object)closestPlayer) && (Object)(object)closestPlayer != (Object)(object)Player.m_localPlayer)
{
((Character)Player.m_localPlayer).Message((MessageType)2, "$msg_blocked", 0, (Sprite)null);
return false;
}
if (!PrivateArea.CheckAccess(((Component)this).transform.position, 0f, true, false))
{
return true;
}
AnimatorStateInfo currentAnimatorStateInfo = _animator.GetCurrentAnimatorStateInfo(0);
if (!((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("opened"))
{
((Character)val).AttachStart(playerAttachPoint, (GameObject)null, false, false, false, "onGround", default(Vector3), cameraPosition);
ArmoireUIController.ToggleArmoirePanel(this);
equipmentAttachPoint.SetActive(true);
_nview.ClaimOwnership();
}
_nview.InvokeRPC("UseArmoire", Array.Empty<object>());
return true;
}
public bool UseItem(Humanoid user, ItemData item)
{
return false;
}
private static Gradient InitializeGradient()
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Expected O, but got Unknown
//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_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_008d: Unknown result type (might be due to invalid IL or missing references)
_hoverGradient = new Gradient();
_hoverGradient.SetKeys((GradientColorKey[])(object)new GradientColorKey[5]
{
new GradientColorKey(Color.red, 0f),
new GradientColorKey(new Color(1f, 0.6470588f, 0f), 0.3f),
new GradientColorKey(Color.yellow, 0.6f),
new GradientColorKey(Color.green, 0.9f),
new GradientColorKey(Color.cyan, 1f)
}, Array.Empty<GradientAlphaKey>());
return _hoverGradient;
}
private bool InUsingDistance(Humanoid human)
{
//IL_0006: 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)
return Vector3.Distance(((Component)human).transform.position, playerAttachPoint.position) < 2f;
}
}
[HarmonyPatch]
internal static class VersionHandshake
{
private static readonly List<ZRpc> ValidatedPeers = new List<ZRpc>();
private static string ConnectionError = string.Empty;
private static bool ClientVersionValidated = false;
private static void RPC_ArmoireVersionCheck(ZRpc rpc, ZPackage pkg)
{
string text = pkg.ReadString();
bool flag = ZNet.instance.IsServer();
StaticMembers.Dbgl("Version check, local: 1.1.1, remote: " + text, forceLog: false, (LogLevel)16);
if (text != "1.1.1")
{
ConnectionError = "Armoire Installed: 1.1.1\n Needed: " + text;
if (flag)
{
StaticMembers.Dbgl("Peer (" + rpc.m_socket.GetHostName() + ") has incompatible version, disconnecting...", forceLog: true, (LogLevel)4);
rpc.Invoke("Error", new object[1] { 3 });
}
}
else if (flag)
{
StaticMembers.Dbgl("Adding peer (" + rpc.m_socket.GetHostName() + ") to validated list", forceLog: false, (LogLevel)16);
ValidatedPeers.Add(rpc);
}
else
{
StaticMembers.Dbgl("Received same version from server!", forceLog: false, (LogLevel)16);
ClientVersionValidated = true;
}
}
[HarmonyPatch(typeof(ZNet), "OnNewConnection")]
[HarmonyPrefix]
private static void InitiateVersionHandshake(ZNetPeer peer)
{
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_003e: Expected O, but got Unknown
string text = "ArmoireVersionCheck";
StaticMembers.Dbgl("Registering version RPC handler", forceLog: false, (LogLevel)16);
peer.m_rpc.Register<ZPackage>(text, (Action<ZRpc, ZPackage>)RPC_ArmoireVersionCheck);
StaticMembers.Dbgl("Invoking version check", forceLog: false, (LogLevel)16);
ZPackage val = new ZPackage();
val.Write("1.1.1");
peer.m_rpc.Invoke(text, new object[1] { val });
}
[HarmonyPatch(typeof(ZNet), "RPC_PeerInfo")]
[HarmonyPrefix]
private static bool EnforceValidationStatus(ZRpc rpc, ref ZNet __instance)
{
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
bool flag = __instance.IsServer();
if (ValidatedPeers.Contains(rpc) || (!flag && ClientVersionValidated))
{
return true;
}
ConnectionError = "No <color=\"red\">Armoire</color> version received";
if (flag)
{
StaticMembers.Dbgl("Peer (" + rpc.m_socket.GetHostName() + ") never sent version or couldn't due to previous disconnect, disconnecting", forceLog: true, (LogLevel)4);
rpc.Invoke("Error", new object[1] { 3 });
}
else
{
StaticMembers.Dbgl("No version number received, mod may not be installed on server", forceLog: true, (LogLevel)4);
Game.instance.Logout(true, true);
ZNet.m_connectionStatus = (ConnectionStatus)3;
}
return false;
}
[HarmonyPatch(typeof(ZNet), "Disconnect")]
[HarmonyPrefix]
private static void InvalidateDisconnectingPeer(ZNetPeer peer, ref ZNet __instance)
{
if (__instance.IsServer())
{
StaticMembers.Dbgl("Peer (" + peer.m_rpc.m_socket.GetHostName() + ") disconnected, removing from validated list", forceLog: false, (LogLevel)16);
ValidatedPeers.Remove(peer.m_rpc);
}
else
{
ClientVersionValidated = false;
}
}
[HarmonyPatch(typeof(FejdStartup), "ShowConnectError")]
[HarmonyPostfix]
private static void ShowConnectionError(FejdStartup __instance)
{
if (__instance.m_connectionFailedPanel.activeSelf)
{
TMP_Text connectionFailedError = __instance.m_connectionFailedError;
connectionFailedError.text = connectionFailedError.text + "\n" + ConnectionError;
}
}
}
public class ArmoireInputMonitor : MonoBehaviour
{
private Button button;
private Toggle toggle;
public GameObject hint;
public string zInputKey;
public KeyCode keyCode;
public void Start()
{
button = ((Component)this).GetComponent<Button>();
toggle = ((Component)this).GetComponent<Toggle>();
GameObject obj = hint;
if (obj != null)
{
obj.SetActive(false);
}
}
public void Update()
{
GameObject obj = hint;
if (obj != null)
{
obj.SetActive(IsInteractive());
}
if (ButtonPressed())
{
if (Object.op_Implicit((Object)(object)button))
{
((Selectable)button).Select();
button.OnSubmit((BaseEventData)null);
}
if (Object.op_Implicit((Object)(object)toggle))
{
((Selectable)toggle).Select();
toggle.OnSubmit((BaseEventData)null);
}
}
}
private bool ButtonPressed()
{
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
if (IsBlocked())
{
return false;
}
if (string.IsNullOrEmpty(zInputKey) || !ZInput.GetButtonDown(zInputKey))
{
if ((int)keyCode != 0)
{
return ZInput.GetKeyDown(keyCode, false);
}
return false;
}
return true;
}
private bool IsBlocked()
{
if (Object.op_Implicit((Object)(object)Console.instance))
{
return Console.IsVisible();
}
return false;
}
private bool IsInteractive()
{
if (!Object.op_Implicit((Object)(object)button) || ((Selectable)button).interactable)
{
if (Object.op_Implicit((Object)(object)toggle))
{
return ((Selectable)toggle).interactable;
}
return true;
}
return false;
}
}
public class ArmoireInputHandler : MonoBehaviour, IPointerClickHandler, IEventSystemHandler, ISelectHandler, IDeselectHandler
{
public UnityEvent onRightClick;
public UnityEvent<bool> onSelectChange;
public void OnPointerClick(PointerEventData eventData)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Invalid comparison between Unknown and I4
if ((int)eventData.button == 1)
{
UnityEvent obj = onRightClick;
if (obj != null)
{
obj.Invoke();
}
}
}
public void OnSelect(BaseEventData eventData)
{
onSelectChange?.Invoke(true);
}
public void OnDeselect(BaseEventData eventData)
{
onSelectChange?.Invoke(false);
}
public void RemoveAllListeners()
{
((UnityEventBase)((Component)this).GetComponent<Button>().onClick).RemoveAllListeners();
((UnityEventBase)onRightClick).RemoveAllListeners();
((UnityEventBase)onSelectChange).RemoveAllListeners();
}
}
public class ArmoireUI : MonoBehaviour
{
[CompilerGenerated]
private sealed class <DeferredSetCurrentSelected>d__49 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public ArmoireUI <>4__this;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <DeferredSetCurrentSelected>d__49(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
int num = <>1__state;
ArmoireUI armoireUI = <>4__this;
switch (num)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = null;
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
((Selectable)armoireUI.currentAppearanceButton).Select();
return false;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
private const int OutfitSlotCount = 3;
[Header("GameObject References")]
public GameObject slotsPanel;
public GameObject scrollView;
public GameObject outfitsPanel;
public GameObject scrollViewContent;
public GameObject outfitNumBG;
[Header("Button References")]
public List<Button> slotButtons;
public Button currentAppearanceButton;
public Button hideSlotButton;
public Toggle toggleHidden;
public Button outfitsButton;
public Button cancelButton;
public List<Button> cycleOutfitButtons;
public Button saveOutfitButton;
public Button loadOutfitButton;
public Button deleteOutfitButton;
[Header("Image References")]
public Image panelBorder;
public Image verticalScrollbar;
public List<Image> panelBackgrounds;
public List<Image> childIcons;
public List<Image> hintKeyBKG;
[Header("Misc References")]
public ScrollRect scrollRect;
public UITooltip currentAppearanceButtonTooltip;
[Header("Runtime State")]
private readonly List<GameObject> generatedScrollViewButtons = new List<GameObject>();
private TextMeshProUGUI _acquiredAppearanceText;
private Button _currentlySelectedButton;
private AppearanceSlotType _lastSlotTypeSelected;
private int _currentOutfitIndex;
public void LateUpdate()
{
KeyHints.instance.m_barberHints.SetActive(true);
KeyHints.instance.m_combatHints.SetActive(false);
if (ArmoireUIController.HandleEscapeOrCancelInput())
{
return;
}
if (ZInput.GamepadActive && ZInput.GetButtonDown("JoyButtonX") && Object.op_Implicit((Object)(object)_currentlySelectedButton) && !scrollView.activeSelf)
{
AppearanceSlotButtonRightClicked(slotButtons.FindIndex((Button x) => (Object)(object)x == (Object)(object)_currentlySelectedButton));
}
if (ZInput.GetKey((KeyCode)324, false) || ZInput.IsGamepadActive())
{
ControlAttachedPlayer();
}
}
public void OnEnable()
{
StaticMembers.Dbgl("Enabled", forceLog: false, (LogLevel)16);
_currentlySelectedButton = null;
((Selectable)cancelButton).Select();
}
private void AppearanceSlotButtonClicked(int slotIndex)
{
BuildScrollableGrid((AppearanceSlotType)slotIndex);
ShowScrollView();
}
private void AppearanceSlotButtonRightClicked(int slotIndex)
{
UpdateAppearanceSlot((AppearanceSlotType)slotIndex, string.Empty, 0, hidden: false);
}
private void UpdateAppearanceSlotButtonSelection(bool isSelected, int slotIndex)
{
_currentlySelectedButton = (isSelected ? slotButtons[slotIndex] : null);
}
private void HideSlotButtonClick()
{
UpdateAppearanceSlot(_lastSlotTypeSelected, string.Empty, 0, hidden: true);
HideScrollView();
}
private void UnlockedAppearanceOnClick(int buttonIndex, int variant)
{
UpdateAppearanceSlot(_lastSlotTypeSelected, ((Object)generatedScrollViewButtons[buttonIndex]).name, variant, hidden: false);
HideScrollView();
}
private void ToggleHiddenClicked(bool showAllAppearances)
{
StaticMembers.config.ShowAllAppearances = showAllAppearances;
RebuildScrollableGrid();
}
private void CycleOutfitButtonClicked(int direction)
{
_currentOutfitIndex = (_currentOutfitIndex + direction + 3) % 3;
UpdateOutfitLabel();
UpdateOutfitState();
UpdateOutfitIcons();
}
private void UpdateOutfitLabel()
{
((TMP_Text)((Component)outfitNumBG.transform.GetChild(0)).GetComponent<TextMeshProUGUI>()).text = $"Outfit {_currentOutfitIndex + 1}";
}
private void UpdateOutfitState()
{
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
//IL_0070: Expected O, but got Unknown
if (Player.m_localPlayer.m_customData.TryGetValue(GetOutfitKey(), out var value))
{
StaticMembers.Dbgl($"Data in outfit slot {_currentOutfitIndex + 1}", forceLog: false, (LogLevel)16);
UpdateOutfitButtonStates(enabled: true, new Color32(byte.MaxValue, (byte)161, (byte)60, byte.MaxValue));
AppearanceData.LoadAppearanceData(new ZPackage(value), StaticMembers.OutfitOverrides[_currentOutfitIndex]);
}
else
{
StaticMembers.Dbgl($"No data in outfit slot {_currentOutfitIndex + 1}", forceLog: false, (LogLevel)16);
UpdateOutfitButtonStates(enabled: false, new Color32((byte)128, (byte)128, (byte)128, byte.MaxValue));
}
}
private void UpdateOutfitIcons()
{
UpdateItemSlotIcons(StaticMembers.OutfitOverrides[_currentOutfitIndex]);
}
private void CancelButtonClicked()
{
if (scrollView.activeSelf)
{
HideScrollView();
}
else if (outfitsPanel.activeSelf)
{
HideOutfitsPanel();
}
else
{
ArmoireUIController.cancelButtonWasClicked = true;
}
}
private void SaveOutfitButtonClicked()
{
AppearanceData.SaveAppearanceData(GetOutfitKey());
UpdateOutfitState();
UpdateItemSlotIcons(StaticMembers.ActiveOverrides);
}
private void LoadOutfitButtonClicked()
{
StaticMembers.ActiveOverrides = PluginUtils.CloneOverrides(StaticMembers.OutfitOverrides[_currentOutfitIndex]);
((Humanoid)Player.m_localPlayer).SetupEquipment();
}
private void DeleteOutfitButtonClicked()
{
StaticMembers.OutfitOverrides[_currentOutfitIndex].Values.ToList().ForEach(delegate(AppearanceSlot slot)
{
slot.ResetSlot();
});
Player.m_localPlayer.m_customData.Remove(GetOutfitKey());
UpdateItemSlotIcons(StaticMembers.OutfitOverrides[_currentOutfitIndex]);
}
private void UpdateScrollViewButtonSelection(bool selected, GameObject go)
{
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
StaticMembers.Dbgl("Updating scroll view button selection", forceLog: false, (LogLevel)16);
((Component)go.transform.Find("selected")).gameObject.SetActive(selected);
if (selected)
{
RectTransform component = go.GetComponent<RectTransform>();
Rect rect = scrollRect.content.rect;
float height = ((Rect)(ref rect)).height;
rect = scrollRect.viewport.rect;
float height2 = ((Rect)(ref rect)).height;
float num = Mathf.Clamp01((0f - component.anchoredPosition.y - height2 / 2f) / (height - height2));
scrollRect.verticalNormalizedPosition = 1f - num;
}
}
internal void UpdateAppearanceSlot(AppearanceSlotType itemCategory, string itemName, int itemVariant, bool hidden)
{
StaticMembers.Dbgl("UpdateAppearanceSlot", forceLog: false, (LogLevel)16);
AppearanceSlot appearanceSlot = StaticMembers.ActiveOverrides[itemCategory];
appearanceSlot.ItemName = itemName;
appearanceSlot.ItemVariant = itemVariant;
appearanceSlot.Hidden = hidden;
UpdateItemIcon(itemCategory, StaticMembers.ActiveOverrides);
((Humanoid)Player.m_localPlayer).SetupEquipment();
AppearanceData.SaveAppearanceData("Armoire_Appearances");
}
public void UpdateItemSlotIcons(Dictionary<AppearanceSlotType, AppearanceSlot> overrides)
{
Array.ForEach(StaticMembers.ActiveOverrides.Keys.ToArray(), delegate(AppearanceSlotType itemCategory)
{
UpdateItemIcon(itemCategory, overrides);
});
}
public void UpdateItemIcon(AppearanceSlotType itemCategory, Dictionary<AppearanceSlotType, AppearanceSlot> overrides)
{
AppearanceSlot appearanceSlot = overrides[itemCategory];
string itemName = appearanceSlot.ItemName;
int itemVariant = appearanceSlot.ItemVariant;
bool hidden = appearanceSlot.Hidden;
Sprite val = (hidden ? UIResources.GetSprite("mapicon_hildir") : (string.IsNullOrEmpty(itemName) ? null : UIResources.GetItemIcon(itemName, itemVariant)));
Transform child = ((Component)slotButtons[(int)itemCategory]).transform.GetChild(0);
GameObject obj = ((child.childCount > 0) ? ((Component)child.GetChild(0)).gameObject : null);
((Component)child).GetComponent<Image>().sprite = val;
((Component)child).gameObject.SetActive(Object.op_Implicit((Object)(object)val) || hidden);
string topic = ((!Object.op_Implicit((Object)(object)val)) ? "" : (hidden ? "Slot Hidden" : ZNetScene.instance.GetPrefab(itemName).GetComponent<ItemDrop>().m_itemData.m_shared.m_name));
((Component)slotButtons[(int)itemCategory]).GetComponent<UITooltip>().m_topic = topic;
if (obj != null)
{
obj.SetActive(hidden);
}
}
private void ShowScrollView()
{
ToggleScrollView();
((MonoBehaviour)this).StartCoroutine(DeferredSetCurrentSelected());
}
[IteratorStateMachine(typeof(<DeferredSetCurrentSelected>d__49))]
private IEnumerator DeferredSetCurrentSelected()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <DeferredSetCurrentSelected>d__49(0)
{
<>4__this = this
};
}
private void HideScrollView()
{
ToggleScrollView();
((Selectable)slotButtons[(int)_lastSlotTypeSelected]).Select();
DestroyScrollableGrid();
}
private void ToggleScrollView()
{
bool flag = !scrollView.activeSelf;
scrollView.SetActive(flag);
slotsPanel.SetActive(!flag);
ToggleExtraneousButtons();
}
private void ShowOutfitsPanel()
{
ToggleOutfitsPanel();
((Selectable)cancelButton).Select();
}
private void HideOutfitsPanel()
{
ToggleOutfitsPanel();
UpdateItemSlotIcons(StaticMembers.ActiveOverrides);
((Selectable)outfitsButton).Select();
}
private void ToggleOutfitsPanel()
{
bool flag = !outfitsPanel.activeSelf;
outfitsPanel.SetActive(flag);
Image obj = panelBackgrounds[1];
((Behaviour)obj).enabled = !flag;
((Component)((Component)obj).transform.GetChild(0)).gameObject.SetActive(!flag);
foreach (Button slotButton in slotButtons)
{
((Selectable)slotButton).interactable = !((Selectable)slotButton).interactable;
((Component)((Component)slotButton).transform.Find("LabelBG")).gameObject.SetActive(!flag);
}
if (flag)
{
UpdateOutfitState();
UpdateOutfitIcons();
}
ToggleExtraneousButtons();
}
private string GetOutfitKey()
{
return $"Armoire_Outfit{_currentOutfitIndex + 1}";
}
private void UpdateOutfitButtonStates(bool enabled, Color32 color)
{
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
((Selectable)loadOutfitButton).interactable = enabled;
((Graphic)((Component)((Component)loadOutfitButton).transform.GetChild(0)).GetComponent<Image>()).color = Color32.op_Implicit(color);
((Selectable)deleteOutfitButton).interactable = enabled;
}
internal void ToggleExtraneousButtons(bool forceReset = false)
{
((Selectable)outfitsButton).interactable = forceReset || !((Selectable)outfitsButton).interactable;
for (int i = 0; i < 2; i++)
{
bool active = (forceReset ? (i == 0) : (!((Component)((Component)cancelButton).transform.GetChild(i)).gameObject.activeSelf));
((Component)((Component)cancelButton).transform.GetChild(i)).gameObject.SetActive(active);
}
}
private void BuildScrollableGrid(AppearanceSlotType slotType)
{
//IL_0140: Unknown result type (might be due to invalid IL or missing references)
//IL_014a: Expected O, but got Unknown
_lastSlotTypeSelected = slotType;
AppearanceSlot appearanceSlot = StaticMembers.ActiveOverrides[slotType];
string itemName = appearanceSlot.ItemName;
int itemVariant = appearanceSlot.ItemVariant;
((Component)hideSlotButton).gameObject.SetActive(appearanceSlot.CanBeHidden);
Transform child = ((Component)currentAppearanceButton).transform.GetChild(0);
Sprite val = (string.IsNullOrEmpty(itemName) ? null : UIResources.GetItemIcon(itemName, itemVariant));
currentAppearanceButtonTooltip.m_topic = (Object.op_Implicit((Object)(object)val) ? ZNetScene.instance.GetPrefab(itemName).GetComponent<ItemDrop>().m_itemData.m_shared.m_name : "No Override Selected");
((Component)child).gameObject.SetActive(Object.op_Implicit((Object)(object)val));
if (Object.op_Implicit((Object)(object)val))
{
((Component)child).GetComponent<Image>().sprite = val;
}
int num = 0;
foreach (KeyValuePair<ItemDrop, int> item in StaticMembers.UnlockedAppearances[slotType])
{
for (int i = 0; i < item.Value; i++)
{
GameObject armoireSlotButton2 = CreateArmoireSlot(((Object)item.Key).name, i);
int closureIndex = num;
int closureIndex2 = i;
((UnityEvent)armoireSlotButton2.GetComponent<Button>().onClick).AddListener((UnityAction)delegate
{
UnlockedAppearanceOnClick(closureIndex, closureIndex2);
});
armoireSlotButton2.GetComponent<ArmoireInputHandler>().onSelectChange.AddListener((UnityAction<bool>)delegate(bool isSelected)
{
UpdateScrollViewButtonSelection(isSelected, armoireSlotButton2);
});
generatedScrollViewButtons.Add(armoireSlotButton2);
num++;
}
}
if (StaticMembers.config.ShowAllAppearances)
{
foreach (KeyValuePair<ItemDrop, int> item2 in StaticMembers.GetLockedAppearances()[slotType])
{
for (int j = 0; j < item2.Value; j++)
{
GameObject armoireSlotButton = CreateArmoireSlot(((Object)item2.Key).name, j, locked: true);
armoireSlotButton.GetComponent<ArmoireInputHandler>().onSelectChange.AddListener((UnityAction<bool>)delegate(bool isSelected)
{
UpdateScrollViewButtonSelection(isSelected, armoireSlotButton);
});
generatedScrollViewButtons.Add(armoireSlotButton);
}
}
}
for (int k = 0; k < generatedScrollViewButtons.Count; k++)
{
if (!(((Object)generatedScrollViewButtons[k]).name != itemName))
{
generatedScrollViewButtons[k + itemVariant].SetActive(false);
break;
}
}
((TMP_Text)_acquiredAppearanceText).text = $"{AppearanceTracker.Unlocked(slotType)} / {AppearanceTracker.Total(slotType)}";
}
internal void DestroyScrollableGrid()
{
StaticMembers.Dbgl("Destroying scrollable grid (buttons and listeners)", forceLog: false, (LogLevel)16);
foreach (GameObject generatedScrollViewButton in generatedScrollViewButtons)
{
generatedScrollViewButton.GetComponent<ArmoireInputHandler>().RemoveAllListeners();
Object.Destroy((Object)(object)generatedScrollViewButton);
}
generatedScrollViewButtons.Clear();
}
internal void RebuildScrollableGrid()
{
DestroyScrollableGrid();
BuildScrollableGrid(_lastSlotTypeSelected);
}
private GameObject CreateArmoireSlot(string prefabName, int variant, bool locked = false)
{
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
Sprite itemIcon = UIResources.GetItemIcon(prefabName, variant);
GameObject obj = Object.Instantiate<GameObject>(StaticMembers.armoireSlot, scrollViewContent.transform);
((Object)obj).name = prefabName;
UITooltip component = obj.GetComponent<UITooltip>();
component.m_topic = (locked ? "???" : ZNetScene.instance.GetPrefab(prefabName).GetComponent<ItemDrop>().m_itemData.m_shared.m_name);
component.m_text = ((!locked || StaticMembers.config.ShowUndiscoveredHoverDetails) ? ("</i><size=90%>" + prefabName + ((variant > 0) ? $"\nVariant: {variant}" : "") + "<i>") : "");
Image component2 = ((Component)obj.transform.GetChild(0)).GetComponent<Image>();
component2.sprite = itemIcon;
((Graphic)component2).color = (locked ? Color.black : Color.white);
obj.SetActive(true);
return obj;
}
private void ControlAttachedPlayer()
{
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: 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_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_0108: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
if (Hud.InRadial())
{
return;
}
Vector2 val;
if (ZInput.IsGamepadActive())
{
val = Vector2.zero;
if (!ZInput.GetButton("JoyRotate"))
{
float joyRightStickX = ZInput.GetJoyRightStickX(true);
float joyRightStickY = ZInput.GetJoyRightStickY(true);
Vector2 val2 = default(Vector2);
((Vector2)(ref val2))..ctor(joyRightStickX, 0f - joyRightStickY);
if (PlayerController.cameraDirectionLock != Vector2.zero && val2 != PlayerController.cameraDirectionLock)
{
PlayerController.cameraDirectionLock = Vector2.zero;
}
if (PlayerController.cameraDirectionLock == Vector2.zero)
{
float num = 110f * Time.deltaTime * PlayerController.m_gamepadSens;
val = val2 * num;
}
}
if (PlayerController.m_invertCameraX)
{
val.x *= -1f;
}
if (PlayerController.m_invertCameraY)
{
val.y *= -1f;
}
}
else
{
val = ZInput.GetMouseDelta() * PlayerController.m_mouseSens * 2f;
if (PlayerController.m_invertMouse)
{
val.y *= -1f;
}
}
Player.m_localPlayer.SetMouseLook(val);
Transform attachPoint = Player.m_localPlayer.GetAttachPoint();
attachPoint.localRotation *= Quaternion.Euler(0f, 0f - val.x, 0f);
}
internal void Initialize()
{
SetupPanelPosition();
SetupTooltipFonts();
SetupLabelFonts();
SetupPanelSprites();
SetupSlotButtonSprites();
SetupCycleOutfitButtonSprites();
SetupOutfitButtonSprites();
SetupMiscIcons();
SetupScrollViewSprites();
SetupToggleHidden();
SetupExtraneousButtonSprites();
SetupSpriteStates();
SetupButtonListeners();
}
private void SetupPanelPosition()
{
StaticMembers.config.UpdateUIPanelPosition(null, null);
}
private void SetupTooltipFonts()
{
Transform child = ((Component)this).GetComponentsInChildren<UITooltip>().First().m_tooltipPrefab.transform.GetChild(0);
string[] array = new string[2] { "Topic", "Text" };
foreach (string text in array)
{
TextMeshProUGUI component = ((Component)child.Find(text)).GetComponent<TextMeshProUGUI>();
((TMP_Text)component).font = UIResources.GetFontAsset("Valheim-AveriaSerifLibre");
((TMP_Text)component).fontMaterial = UIResources.GetMaterial("Valheim-AveriaSerifLibre - Outline");
}
}
private void SetupLabelFonts()
{
TextMeshProUGUI[] componentsInChildren = ((Component)this).GetComponentsInChildren<TextMeshProUGUI>(true);
foreach (TextMeshProUGUI obj in componentsInChildren)
{
((TMP_Text)obj).font = UIResources.GetFontAsset("Valheim-AveriaSerifLibre");
((TMP_Text)obj).fontMaterial = UIResources.GetMaterial("Valheim-AveriaSerifLibre - Outline");
((TMP_Text)obj).fontStyle = (FontStyles)0;
((TMP_Text)obj).fontWeight = (FontWeight)400;
((TMP_Text)obj).fontFeatures = new List<OTL_FeatureTag>(1) { (OTL_FeatureTag)1801810542 };
}
}
private void SetupPanelSprites()
{
panelBorder.sprite = UIResources.GetSprite("panel_interior_bkg_128");
panelBackgrounds.ForEach(delegate(Image bg)
{
bg.sprite = UIResources.GetSprite("panel_bkg_128");
});
}
private void SetupSlotButtonSprites()
{
foreach (Button slotButton in slotButtons)
{
((Component)slotButton).GetComponent<Image>().sprite = UIResources.GetSprite("panel_bkg");
((Component)((Component)slotButton).transform.Find("LabelBG")).GetComponent<Image>().sprite = UIResources.GetSprite("button_disabled");
}
}
private void SetupCycleOutfitButtonSprites()
{
foreach (Button cycleOutfitButton in cycleOutfitButtons)
{
((Component)cycleOutfitButton).GetComponent<Image>().sprite = UIResources.GetSprite("button");
}
outfitNumBG.GetComponent<Image>().sprite = UIResources.GetSprite("button_disabled");
}
private void SetupOutfitButtonSprites()
{
SetupOutfitButton(saveOutfitButton, "file_local");
SetupOutfitButton(loadOutfitButton, "winddirection");
SetupOutfitButton(deleteOutfitButton, "mapicon_checked");
}
private void SetupOutfitButton(Button button, string iconSprite)
{
((Component)button).GetComponent<Image>().sprite = UIResources.GetSprite("button");
((Component)((Component)button).transform.GetChild(0)).GetComponent<Image>().sprite = UIResources.GetSprite(iconSprite);
((Component)((Component)button).transform.GetChild(1)).GetComponent<Image>().sprite = UIResources.GetSprite("button_disabled");
}
private void SetupMiscIcons()
{
childIcons.ForEach(delegate(Image i)
{
i.sprite = UIResources.GetSprite("mapicon_checked");
});
hintKeyBKG.ForEach(delegate(Image i)
{
i.sprite = UIResources.GetSprite("key_base");
});
}
private void SetupScrollViewSprites()
{
SetupScrollButton(currentAppearanceButton, "item_background_sunken", "selection_frame");
SetupScrollButton(hideSlotButton, "item_background_sunken", "selection_frame", "mapicon_hildir", "mapicon_checked");
verticalScrollbar.sprite = UIResources.GetSprite("panel_interior_bkg_128");
((Component)((Component)verticalScrollbar).transform.GetChild(0).GetChild(0)).GetComponent<Image>().sprite = UIResources.GetSprite("crafting_panel_bkg");
StaticMembers.armoireSlot.GetComponent<Image>().sprite = UIResources.GetSprite("item_background_sunken");
((Component)StaticMembers.armoireSlot.transform.GetChild(1)).GetComponent<Image>().sprite = UIResources.GetSprite("selection_frame");
}
private void SetupScrollButton(Button button, string bgSprite, string frameSprite, string iconSprite = null, string iconChildSprite = null)
{
((Component)button).GetComponent<Image>().sprite = UIResources.GetSprite(bgSprite);
((Component)((Component)button).transform.GetChild(1)).GetComponent<Image>().sprite = UIResources.GetSprite(frameSprite);
if (iconSprite != null)
{
Transform child = ((Component)button).transform.GetChild(0);
((Component)child).GetComponent<Image>().sprite = UIResources.GetSprite(iconSprite);
if (iconChildSprite != null)
{
((Component)child.GetChild(0)).GetComponent<Image>().sprite = UIResources.GetSprite(iconChildSprite);
}
}
}
private void SetupToggleHidden()
{
Transform child = ((Component)toggleHidden).transform.GetChild(2);
((Component)child).GetComponent<Image>().sprite = UIResources.GetSprite("button_small");
((Component)child.GetChild(0)).GetComponent<Image>().sprite = UIResources.GetSprite("checkbox_marker_filtered");
toggleHidden.isOn = StaticMembers.config.ShowAllAppearances;
_acquiredAppearanceText = ((Component)((Component)toggleHidden).transform.GetChild(0)).GetComponent<TextMeshProUGUI>();
}
private void SetupExtraneousButtonSprites()
{
((Component)outfitsButton).GetComponent<Image>().sprite = UIResources.GetSprite("button");
((Component)cancelButton).GetComponent<Image>().sprite = UIResources.GetSprite("button");
}
private void SetupSpriteStates()
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
SpriteState val = default(SpriteState);
((SpriteState)(ref val)).highlightedSprite = UIResources.GetSprite("button_highlight");
((SpriteState)(ref val)).pressedSprite = UIResources.GetSprite("button_pressed");
((SpriteState)(ref val)).selectedSprite = UIResources.GetSprite("button_highlight");
((SpriteState)(ref val)).disabledSprite = UIResources.GetSprite("button_disabled");
SpriteState spriteState = val;
List<Button> list = cycleOutfitButtons;
List<Button> list2 = new List<Button>(5 + list.Count);
list2.AddRange(list);
list2.Add(outfitsButton);
list2.Add(cancelButton);
list2.Add(saveOutfitButton);
list2.Add(loadOutfitButton);
list2.Add(deleteOutfitButton);
foreach (Button item in list2)
{
((Selectable)item).spriteState = spriteState;
}
}
internal void SetupButtonListeners()
{
SetupSlotPanelButtonListeners();
SetupScrollViewButtonListeners();
SetupToggleHiddenListener();
SetupExtraneousButtonListeners();
SetupOutfitPanelButtonListeners();
}
private void SetupSlotPanelButtonListeners()
{
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Expected O, but got Unknown
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Expected O, but got Unknown
for (int i = 0; i < slotButtons.Count; i++)
{
int index = i;
Button obj = slotButtons[i];
((UnityEvent)obj.onClick).AddListener((UnityAction)delegate
{
AppearanceSlotButtonClicked(index);
});
ArmoireInputHandler component = ((Component)obj).GetComponent<ArmoireInputHandler>();
component.onRightClick.AddListener((UnityAction)delegate
{
AppearanceSlotButtonRightClicked(index);
});
component.onSelectChange.AddListener((UnityAction<bool>)delegate(bool isSelected)
{
UpdateAppearanceSlotButtonSelection(isSelected, index);
});
}
}
private void SetupScrollViewButtonListeners()
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Expected O, but got Unknown
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Expected O, but got Unknown
SetupScrollViewButton(currentAppearanceButton, new UnityAction(HideScrollView));
SetupScrollViewButton(hideSlotButton, new UnityAction(HideSlotButtonClick));
}
private void SetupScrollViewButton(Button button, UnityAction clickAction)
{
((UnityEvent)button.onClick).AddListener(clickAction);
((Component)button).GetComponent<ArmoireInputHandler>().onSelectChange.AddListener((UnityAction<bool>)delegate(bool isSelected)
{
UpdateScrollViewButtonSelection(isSelected, ((Component)button).gameObject);
});
}
private void SetupToggleHiddenListener()
{
((UnityEvent<bool>)(object)toggleHidden.onValueChanged).AddListener((UnityAction<bool>)ToggleHiddenClicked);
}
private void SetupExtraneousButtonListeners()
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Expected O, but got Unknown
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
((UnityEvent)cancelButton.onClick).AddListener(new UnityAction(CancelButtonClicked));
((UnityEvent)outfitsButton.onClick).AddListener(new UnityAction(ShowOutfitsPanel));
}
private void SetupOutfitPanelButtonListeners()
{
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Expected O, but got Unknown
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_007d: Expected O, but got Unknown
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_0099: Expected O, but got Unknown
//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
//IL_00b5: Expected O, but got Unknown
int num = -1;
foreach (Button cycleOutfitButton in cycleOutfitButtons)
{
int closureDirection = num;
((UnityEvent)cycleOutfitButton.onClick).AddListener((UnityAction)delegate
{
CycleOutfitButtonClicked(closureDirection);
});
num = Math.Abs(num);
}
((UnityEvent)saveOutfitButton.onClick).AddListener(new UnityAction(SaveOutfitButtonClicked));
((UnityEvent)loadOutfitButton.onClick).AddListener(new UnityAction(LoadOutfitButtonClicked));
((UnityEvent)deleteOutfitButton.onClick).AddListener(new UnityAction(DeleteOutfitButtonClicked));
}
}
internal static class ArmoireUIController
{
private static ArmoireDoor lastUsedArmoire = null;
private static Quaternion oldLookYaw = Quaternion.identity;
private static float oldLookPitch;
private static Vector3 oldLookDir = default(Vector3);
internal static bool cancelButtonWasClicked = false;
internal static ArmoireUI ArmoireUIInstance { get; set; }
internal static void CreateArmoireUI(Transform hudroot)
{
StaticMembers.Dbgl("Creating ArmoireUI", forceLog: false, (LogLevel)16);
(ArmoireUIInstance = Object.Instantiate<GameObject>(StaticMembers.guiPrefab, hudroot, false).GetComponent<ArmoireUI>()).Initialize();
}
internal static void DestroyArmoireUI()
{
StaticMembers.Dbgl("Destroying ArmoireUI", forceLog: false, (LogLevel)16);
Object.Destroy((Object)(object)ArmoireUIInstance);
}
internal static bool IsArmoirePanelValid()
{
return Object.op_Implicit((Object)(object)ArmoireUIInstance);
}
internal static bool TryGetArmoirePanel(out ArmoireUI armoireUI)
{
armoireUI = ArmoireUIInstance;
return armoireUI != null;
}
internal static bool IsArmoirePanelActive()
{
if (IsArmoirePanelValid())
{
return ((Component)ArmoireUIInstance).gameObject.activeSelf;
}
return false;
}
private static void HideArmoirePanel()
{
((Component)ArmoireUIInstance).gameObject.SetActive(false);
ArmoireUIInstance.DestroyScrollableGrid();
}
private static void ShowArmoireUI()
{
((Component)ArmoireUIInstance).gameObject.SetActive(true);
ArmoireUIInstance.slotsPanel.SetActive(true);
ArmoireUIInstance.scrollView.SetActive(false);
}
internal static void ToggleArmoirePanel(ArmoireDoor openedArmoire = null)
{
if (IsArmoirePanelActive())
{
CloseArmoirePanel();
}
else
{
OpenArmoirePanel(openedArmoire);
}
}
private static void CloseArmoirePanel()
{
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: 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)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
HideArmoirePanel();
if (Object.op_Implicit((Object)(object)lastUsedArmoire))
{
lastUsedArmoire.ResetState();
Player localPlayer = Player.m_localPlayer;
((Character)localPlayer).m_lookYaw = oldLookYaw;
localPlayer.m_lookPitch = oldLookPitch;
((Character)localPlayer).m_lookDir = oldLookDir;
localPlayer.ResetAttachCameraPoint();
((Character)localPlayer).AttachStop();
lastUsedArmoire = null;
}
}
private static void OpenArmoirePanel(ArmoireDoor openedArmoire)
{
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
ShowArmoireUI();
if (Object.op_Implicit((Object)(object)openedArmoire))
{
lastUsedArmoire = openedArmoire;
Player localPlayer = Player.m_localPlayer;
oldLookYaw = ((Character)localPlayer).m_lookYaw;
oldLookPitch = localPlayer.m_lookPitch;
oldLookDir = ((Character)localPlayer).m_lookDir;
localPlayer.m_lookPitch = -20f;
((Character)localPlayer).UpdateEyeRotation();
((Character)localPlayer).m_lookDir = ((Character)localPlayer).m_eye.forward;
}
}
internal static bool HandleEscapeOrCancelInput()
{
if (cancelButtonWasClicked)
{
cancelButtonWasClicked = false;
ArmoireDoor armoireDoor = lastUsedArmoire;
if (armoireDoor != null && armoireDoor.CanInteract)
{
ToggleArmoirePanel();
return true;
}
}
if (!Object.op_Implicit((Object)(object)lastUsedArmoire))
{
ArmoireUIInstance.ToggleExtraneousButtons(forceReset: true);
ToggleArmoirePanel();
return true;
}
return false;
}
}
internal sealed class ModConfig
{
private readonly ConfigFile ConfigFile;
private readonly ConfigEntry<bool> enableOverrides;
private readonly ConfigEntry<bool> showAllAppearances;
private readonly ConfigEntry<string> disabledAppearanceNames;
private readonly ConfigEntry<bool> excludeDLCItems;
private readonly ConfigEntry<bool> showUndiscoveredHoverDetails;
private readonly ConfigEntry<bool> enableDebugMessages;
private readonly ConfigEntry<bool> allowDragging;
private readonly ConfigEntry<Vector2> uiPosition;
internal bool EnableOverrides
{
get
{
return enableOverrides.Value;
}
set
{
((ConfigEntryBase)enableOverrides).BoxedValue = value;
}
}
internal bool ShowAllAppearances
{
get
{
return showAllAppearances.Value;
}
set
{
((ConfigEntryBase)showAllAppearances).BoxedValue = value;
}
}
internal HashSet<string> DisabledAppearanceNames
{
get
{
HashSet<string> hashSet = new HashSet<string>();
string[] array = disabledAppearanceNames.Value.Split(new char[1] { ',' });
foreach (string item in array)
{
hashSet.Add(item);
}
return hashSet;
}
}
internal bool ExcludeDLCItems => excludeDLCItems.Value;
internal bool ShowUndiscoveredHoverDetails => showUndiscoveredHoverDetails.Value;
internal bool EnableDebugMessages => enableDebugMessages.Value;
internal bool AllowDragging => allowDragging.Value;
internal Vector2 UIPosition
{
get
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
return uiPosition.Value;
}
set
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
((ConfigEntryBase)uiPosition).BoxedValue = value;
}
}
internal ModConfig(ConfigFile configFile)
{
//IL_016e: Unknown result type (might be due to invalid IL or missing references)
ConfigFile = configFile;
configFile.SaveOnConfigSet = false;
enableOverrides = ConfigFile.Bind<bool>("General", "EnableOverrides", true, "Enables overriding of appearances on local player.");
showAllAppearances = ConfigFile.Bind<bool>("General", "ShowAllAppearances", true, "Enables display of all unlockable appearances.");
disabledAppearanceNames = ConfigFile.Bind<string>("General", "DisabledAppearanceNames", "ShieldKnight,ShieldIronSquare,CapeTest,PickaxeStone, SledgeCheat, SwordCheat", "To disable specific appearances from being totalled as locked/unlocked, list their prefab names here separated by a comma. Names are case-sensitive.");
excludeDLCItems = ConfigFile.Bind<bool>("General", "ExcludeDLCItems", true, "Excludes DLC items (OdinCape, HelmetOdin) from being totalled as locked/unlocked.");
showUndiscoveredHoverDetails = ConfigFile.Bind<bool>("General", "ShowUndiscoveredHoverDetails", false, "Shows/hides additional details in undiscovered appearance tooltips.");
enableDebugMessages = ConfigFile.Bind<bool>("General", "EnableDebugMessages", false, "Enable mod debug messages in console.");
enableOverrides.SettingChanged += delegate
{
Player localPlayer2 = Player.m_localPlayer;
if (localPlayer2 != null)
{
((Humanoid)localPlayer2).SetupEquipment();
}
};
excludeDLCItems.SettingChanged += delegate
{
Player localPlayer = Player.m_localPlayer;
if (localPlayer != null)
{
AppearanceCategorizer.RecalculateAppearances(localPlayer);
}
if (ArmoireUIController.TryGetArmoirePanel(out var armoireUI) && armoireUI.scrollView.activeSelf)
{
armoireUI.RebuildScrollableGrid();
}
};
allowDragging = ConfigFile.Bind<bool>("UIPosition", "AllowDragging", false, "If set to true, the ArmoireUI panel can be moved by holding left ctrl then clicking and dragging.");
uiPosition = ConfigFile.Bind<Vector2>("UIPosition", "UIPosition", new Vector2(290f, 0f), "X,Y position of Armoire UI Panel from center-left anchor.");
uiPosition.SettingChanged += UpdateUIPanelPosition;
configFile.Save();
configFile.SaveOnConfigSet = true;
}
internal void UpdateUIPanelPosition(object sender, EventArgs e)
{
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
if (ArmoireUIController.TryGetArmoirePanel(out var armoireUI))
{
((Component)armoireUI).GetComponent<RectTransform>().anchoredPosition = uiPosition.Value;
}
}
}
internal static class AppearanceCategorizer
{
private static readonly HashSet<ItemType> RelevantTypes = new HashSet<ItemType>
{
(ItemType)6,
(ItemType)7,
(ItemType)11,
(ItemType)17,
(ItemType)18,
(ItemType)24,
(ItemType)4,
(ItemType)5,
(ItemType)3,
(ItemType)14
};
private static readonly HashSet<ItemType> ArmorTypes = new HashSet<ItemType>
{
(ItemType)6,
(ItemType)7,
(ItemType)11,
(ItemType)17,
(ItemType)18,
(ItemType)24
};
internal static void CategorizeAppearances(Player player)
{
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
IEnumerable<ItemDrop> enumerable = from item in GetAllItemsByTypes(RelevantTypes)
where item.m_itemData.m_shared.m_icons.Length != 0 && !StaticMembers.config.DisabledAppearanceNames.Contains(((Object)item).name) && (!StaticMembers.config.ExcludeDLCItems || string.IsNullOrEmpty(item.m_itemData.m_shared.m_dlc))
select item;
Dictionary<AppearanceSlotType, List<ItemDrop>> dictionary = new Dictionary<AppearanceSlotType, List<ItemDrop>>();
foreach (ItemDrop item in enumerable)
{
ItemType itemType = item.m_itemData.m_shared.m_itemType;
SkillType skillType = item.m_itemData.m_shared.m_skillType;
AddToCategory(dictionary, MapAppearanceSlot(itemType, skillType), item);
}
Dictionary<AppearanceSlotType, List<ItemDrop>> source = dictionary.ToDictionary((KeyValuePair<AppearanceSlotType, List<ItemDrop>> kvp) => kvp.Key, (KeyValuePair<AppearanceSlotType, List<ItemDrop>> kvp) => kvp.Value.Where((ItemDrop item) => player.m_knownMaterial.Contains(item.m_itemData.m_shared.m_name)).ToList());
StaticMembers.AllAppearances = dictionary.ToDictionary((KeyValuePair<AppearanceSlotType, List<ItemDrop>> kvp) => kvp.Key, (KeyValuePair<AppearanceSlotType, List<ItemDrop>> kvp) => BuildIconCountMap(kvp.Value));
StaticMembers.UnlockedAppearances = source.ToDictionary((KeyValuePair<AppearanceSlotType, List<ItemDrop>> kvp) => kvp.Key, (KeyValuePair<AppearanceSlotType, List<ItemDrop>> kvp) => BuildIconCountMap(kvp.Value));
}
private static void AddToCategory(Dictionary<AppearanceSlotType, List<ItemDrop>> dict, AppearanceSlotType? slotType, ItemDrop item)
{
if (slotType.HasValue)
{
AppearanceSlotType valueOrDefault = slotType.GetValueOrDefault();
if (!dict.ContainsKey(valueOrDefault))
{
dict[valueOrDefault] = new List<ItemDrop>();
}
dict[valueOrDefault].Add(item);
}
}
private static AppearanceSlotType? MapAppearanceSlot(ItemType type, SkillType skill)
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0090: Expected I4, but got Unknown
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Invalid comparison between Unknown and I4
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
//IL_00be: Expected I4, but got Unknown
//IL_019b: Unknown result type (might be due to invalid IL or missing references)
//IL_019d: Invalid comparison between Unknown and I4
//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
//IL_01c8: Invalid comparison between Unknown and I4
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
//IL_0093: Invalid comparison between Unknown and I4
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: Invalid comparison between Unknown and I4
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Invalid comparison between Unknown and I4
//IL_019f: Unknown result type (might be due to invalid IL or missing references)
//IL_01a2: Invalid comparison between Unknown and I4
//IL_0103: Unknown result type (might be due to invalid IL or missing references)
//IL_0105: Unknown result type (might be due to invalid IL or missing references)
//IL_013b: Expected I4, but got Unknown
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Invalid comparison between Unknown and I4
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Invalid comparison between Unknown and I4
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Invalid comparison between Unknown and I4
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Invalid comparison between Unknown and I4
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Invalid comparison between Unknown and I4
ItemType val;
if (ArmorTypes.Contains(type))
{
val = type;
if ((int)val <= 11)
{
if ((int)val == 6)
{
return AppearanceSlotType.Helmet;
}
if ((int)val == 7)
{
return AppearanceSlotType.Chest;
}
if ((int)val == 11)
{
return AppearanceSlotType.Legs;
}
}
else
{
if ((int)val == 17)
{
return AppearanceSlotType.Shoulder;
}
if ((int)val != 18)
{
if ((int)val == 24)
{
return AppearanceSlotType.Trinket;
}
}
else if ((int)skill == 1)
{
return AppearanceSlotType.Utility;
}
}
return null;
}
val = type;
switch (val - 3)
{
default:
{
if ((int)val != 14)
{
break;
}
AppearanceSlotType? result;
switch (skill - 1)
{
case 6:
result = AppearanceSlotType.TwoHandedAxe;
break;
case 2:
result = AppearanceSlotType.TwoHandedClub;
break;
case 0:
result = AppearanceSlotType.TwoHandedSword;
break;
case 3:
result = AppearanceSlotType.Polearm;
break;
case 11:
result = AppearanceSlotType.Pickaxe;
break;
case 8:
case 9:
result = AppearanceSlotType.Staff;
break;
case 1:
result = AppearanceSlotType.Knife;
break;
case 10:
result = AppearanceSlotType.Fist;
break;
default:
result = null;
break;
}
return result;
}
case 0:
return (skill - 1) switch
{
6 => AppearanceSlotType.OneHandedAxe,
2 => AppearanceSlotType.OneHandedClub,
0 => AppearanceSlotType.OneHandedSword,
1 => AppearanceSlotType.Knife,
4 => AppearanceSlotType.Spear,
_ => null,
};
case 1:
return ((int)skill == 8) ? new AppearanceSlotType?(AppearanceSlotType.Bow) : (((int)skill != 14) ? null : new AppearanceSlotType?(AppearanceSlotType.Crossbow));
case 2:
if ((int)skill == 6)
{
return AppearanceSlotType.Shield;
}
break;
}
return null;
}
private static List<ItemDrop> GetAllItemsByTypes(HashSet<ItemType> types)
{
return (from go in ObjectDB.instance.m_items
select go.GetComponent<ItemDrop>() into item
where Object.op_Implicit((Object)(object)item) && types.Contains(item.m_itemData.m_shared.m_itemType)
select item).ToList();
}
private static Dictionary<ItemDrop, int> BuildIconCountMap(List<ItemDrop> items)
{
return items.ToDictionary((ItemDrop item) => item, (ItemDrop item) => item.m_itemData.m_shared.m_icons.Length);
}
internal static void RecalculateAppearances(Player player)
{
CategorizeAppearances(player);
AppearanceTracker.UpdateTotal();
}
}
internal sealed class AppearanceData
{
private static readonly Version MinimumSupported = new Version("1.0.0");
internal static void LoadAppearanceData(ZPackage package, Dictionary<AppearanceSlotType, AppearanceSlot> overrides)
{
try
{
StaticMembers.Dbgl("Loading player armoire data...", forceLog: false, (LogLevel)16);
string text = package.ReadString();
if (!Version.TryParse(text, out Version result))
{
StaticMembers.Dbgl("Invalid version format: " + text, forceLog: true, (LogLevel)4);
return;
}
if (result < MinimumSupported)
{
StaticMembers.Dbgl("Unsupported armoire data version: " + text, forceLog: true, (LogLevel)4);
return;
}
int num = package.ReadInt();
for (int i = 0; i < num; i++)
{
if (Enum.TryParse<AppearanceSlotType>(package.ReadString(), out var result2) && overrides.TryGetValue(result2, out var value))
{
value.ItemName = package.ReadString();
value.ItemVariant = package.ReadInt();
if (value.CanBeHidden)
{
value.Hidden = package.ReadBool();
}
}
}
StaticMembers.Dbgl("...player armoire data loading complete", forceLog: false, (LogLevel)16);
}
catch (Exception ex)
{
StaticMembers.Dbgl("Error loading appearance data: " + ex.Message, forceLog: true, (LogLevel)2);
}
}
internal static void SaveAppearanceData(string dataKey)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Expected O, but got Unknown
ZPackage val = new ZPackage();
val.Write("1.1.1");
val.Write(StaticMembers.ActiveOverrides.Count);
foreach (KeyValuePair<AppearanceSlotType, AppearanceSlot> activeOverride in StaticMembers.ActiveOverrides)
{
val.Write(activeOverride.Key.ToString());
val.Write(activeOverride.Value.ItemName);
val.Write(activeOverride.Value.ItemVariant);
if (activeOverride.Value.CanBeHidden)
{
val.Write(activeOverride.Value.Hidden);
}
}
Player.m_localPlayer.m_customData[dataKey] = val.GetBase64();
StaticMembers.Dbgl("Saved player armoire data", forceLog: false, (LogLevel)16);
}
}
public sealed class AppearanceSlot
{
public Func<SharedData, bool> IsValidForSlot;
public string ItemName;
public int ItemVariant;
public bool Hidden;
public bool CanBeHidden;
public AppearanceSlot(Func<SharedData, bool> slotCriteria, bool canBeHidden = false)
{
IsValidForSlot = slotCriteria;
ItemName = string.Empty;
CanBeHidden = canBeHidden;
base..ctor();
}
public void ResetSlot()
{
ItemName = string.Empty;
ItemVariant = 0;
Hidden = false;
}
public AppearanceSlot(AppearanceSlot other)
: this(other.IsValidForSlot, other.CanBeHidden)
{
ItemName = other.ItemName;
ItemVariant = other.ItemVariant;
Hidden = other.Hidden;
}
public bool IsMatch(SharedData sd)
{
return IsValidForSlot(sd);
}
}
public enum AppearanceSlotType
{
Helmet,
Chest,
Legs,
Shoulder,
Utility,
Trinket,
Bow,
Crossbow,
Shield,
OneHandedAxe,
OneHandedClub,
OneHandedSword,
Knife,
Spear,
TwoHandedAxe,
TwoHandedClub,
TwoHandedSword,
Polearm,
Pickaxe,
Staff,
Fist
}
internal static class AppearanceTracker
{
internal static int TotalUnlocked { get; set; }
internal static int TotalCollectable { get; set; }
internal static double UnlockedPercentage
{
get
{
if (TotalCollectable != 0)
{
return (double)TotalUnlocked / (double)TotalCollectable;
}
return 0.0;
}
}
internal static int Unlocked(AppearanceSlotType slotType)
{
return StaticMembers.UnlockedAppearances[slotType].Values.Sum();
}
internal static int Total(AppearanceSlotType slotType)
{
return StaticMembers.AllAppearances[slotType].Values.Sum();
}
internal static void UpdateTotal()
{
TotalUnlocked = StaticMembers.UnlockedAppearances.Values.Sum((Dictionary<ItemDrop, int> dict) => dict.Values.Sum());
TotalCollectable = StaticMembers.AllAppearances.Values.Sum((Dictionary<ItemDrop, int> dict) => dict.Values.Sum());
StaticMembers.Dbgl($"UnlockedAppearances Count: {TotalUnlocked}", forceLog: false, (LogLevel)16);
StaticMembers.Dbgl($"AllAppearances Count: {TotalCollectable}", forceLog: false, (LogLevel)16);
}
}
internal static class PluginUtils
{
internal static AppearanceSlot FindMatchingSlot(SharedData sd)
{
return StaticMembers.ActiveOverrides.Values.FirstOrDefault((AppearanceSlot slot) => slot.IsMatch(sd));
}
internal static AppearanceSlotType? GetSlotTypeForItemDrop(ItemDrop item)
{
foreach (KeyValuePair<AppearanceSlotType, Dictionary<ItemDrop, int>> allAppearance in StaticMembers.AllAppearances)
{
if (allAppearance.Value.ContainsKey(item))
{
return allAppearance.Key;
}
}
return null;
}
internal static Dictionary<AppearanceSlotType, AppearanceSlot> CloneOverrides(Dictionary<AppearanceSlotType, AppearanceSlot> source)
{
return source.ToDictionary((KeyValuePair<AppearanceSlotType, AppearanceSlot> entry) => entry.Key, (KeyValuePair<AppearanceSlotType, AppearanceSlot> entry) => new AppearanceSlot(entry.Value));
}
}
[HarmonyPatch(typeof(PlayerProfile), "LoadPlayerData")]
internal static class LoadDataPatches
{
private static void Postfix(Player player)
{
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Expected O, but got Unknown
if (player.m_customData.TryGetValue("Armoire_Appearances", out var value))
{
StaticMembers.Dbgl("Armoire_Appearances key found in player.m_customData", forceLog: false, (LogLevel)16);
AppearanceData.LoadAppearanceData(new ZPackage(value), StaticMembers.ActiveOverrides);
}
else
{
StaticMembers.ActiveOverrides.Values.ToList().ForEach(delegate(AppearanceSlot slot)
{
slot.ResetSlot();
});
}
if (ArmoireUIController.IsArmoirePanelValid())
{
StaticMembers.Dbgl("UI is initialized, updating item slot icons", forceLog: false, (LogLevel)16);
ArmoireUIController.ArmoireUIInstance.UpdateItemSlotIcons(StaticMembers.ActiveOverrides);
}
else
{
StaticMembers.Dbgl("UI isn't initialized, can't update item slot icons", forceLog: false, (LogLevel)16);
}
((Humanoid)player).SetupEquipment();
AppearanceCategorizer.RecalculateAppearances(player);
}
}
[HarmonyPatch]
internal static class UIPatches
{
[HarmonyPatch(typeof(Hud))]
private static class HUDPatches
{
[HarmonyPatch("Awake")]
private static void Postfix(Hud __instance)
{
ArmoireUIController.CreateArmoireUI(__instance.m_rootObject.transform);
}
[HarmonyPatch("OnDestroy")]
private static void Prefix()
{
ArmoireUIController.DestroyArmoireUI();
}
}
[HarmonyPatch(typeof(UnifiedPopup), "IsVisible")]
private static class UnifiedPopupIsVisiblePatch
{
private static bool Prefix(ref bool __result)
{
if (Object.op_Implicit((Object)(object)Player.m_localPlayer) && ArmoireUIController.IsArmoirePanelActive())
{
__result = true;
return false;
}
return true;
}
}
}
[HarmonyPatch(typeof(ZNetScene), "Awake")]
internal static class PieceInitPatches
{
private static bool isInitialized;
private static void Postfix(ZNetScene __instance)
{
__instance.m_prefabs.Add(StaticMembers.armoirePiecePrefab);
__instance.m_namedPrefabs.Add(__instance.GetPrefabHash(StaticMembers.armoirePiecePrefab), StaticMembers.armoirePiecePrefab);
PieceTable buildPieces = __instance.GetPrefab("Hammer").GetComponent<ItemDrop>().m_itemData.m_shared.m_buildPieces;
if (!buildPieces.m_pieces.Contains(StaticMembers.armoirePiecePrefab))
{
StaticMembers.Dbgl("piece is not in build table, adding", forceLog: false, (LogLevel)16);
buildPieces.m_pieces.Add(StaticMembers.armoirePiecePrefab);
}
if (!isInitialized)
{
InitializeArmoirePiece(__instance);
isInitialized = true;
}
}
private static void InitializeArmoirePiece(ZNetScene instance)
{
GameObject prefab = instance.GetPrefab("wood_door");
Door component = prefab.GetComponent<Door>();
Piece component2 = prefab.GetComponent<Piece>();
WearNTear component3 = prefab.GetComponent<WearNTear>();
Piece component4 = StaticMembers.armoirePiecePrefab.GetComponent<Piece>();
WearNTear component5 = StaticMembers.armoirePiecePrefab.GetComponent<WearNTear>();
ArmoireDoor.SoundEffects.Add(component.m_closeEffects);
ArmoireDoor.SoundEffects.Add(component.m_openEffects);
component5.m_destroyedEffect.m_effectPrefabs = component3.m_destroyedEffect.m_effectPrefabs;
component5.m_hitEffect.m_effectPrefabs = component3.m_hitEffect.m_effectPrefabs;
component4.m_placeEffect = component2.m_placeEffect;
component4.m_craftingStation = component2.m_craftingStation;
string[] array = new string[3] { "Wood", "Tin", "Bronze" };
for (int i = 0; i < array.Length; i++)
{
component4.m_resources[i].m_resItem = ObjectDB.instance.GetItemPrefab(array[i]).GetComponent<ItemDrop>();
}
Material[] materials = CreateArmoireMaterials();
Array.ForEach(new string[3] { "DoorLeft", "DoorRight", "Wardrobe" }, delegate(string child)
{
((Renderer)((Component)StaticMembers.armoirePiecePrefab.transform.Find(child)).GetComponent<MeshRenderer>()).sharedMaterials = materials;
});
Transform val = StaticMembers.armoirePiecePrefab.transform.Find("EquipmentAttachPoints");
ReplaceMesh(instance, "ShieldIronBuckler", "attach/model (1)", val.GetChild(0).GetChild(0));
ReplaceMesh(instance, "SpearElderbark", "attach/default", val.GetChild(1).GetChild(0));
ReplaceMesh(instance, "Bow", "attach/default", val.GetChild(1).GetChild(1));
ReplaceSkinnedMesh(instance, "HelmetOdin", "attach_skin/hood", val.GetChild(2).GetChild(0).GetChild(0));
ReplaceSkinnedMesh(instance, "CapeOdin", "attach_skin/cape1", val.GetChild(2).GetChild(1).GetChild(0));
}
private static Material[] CreateArmoireMaterials()
{
//IL_000f: 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_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Expected O, but got Unknown
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Expected O, but got Unknown
AssetID val = default(AssetID);
AssetID.TryParse("f6de4704e075b4095ae641aed283b641", ref val);
SoftReference<Shader> val2 = default(SoftReference<Shader>);
val2..ctor(val);
val2.Load();
Material val3 = new Material(val2.Asset)
{
mainTexture = (Texture)(object)UIResources.GetTexture("woodtower_d")
};
val3.SetInt("_Cull", 0);
val3.SetFloat("_TwoSidedNormals", 1f);
Material val4 = new Material(val2.Asset)
{
mainTexture = (Texture)(object)UIResources.GetTexture("DarkWoodBeams_d")
};
return (Material[])(object)new Material[2] { val3, val4 };
}
private static void ReplaceMesh(ZNetScene scene, string prefabName, string path, Transform target)
{
Transform val = scene.GetPrefab(prefabName).transform.Find(path);
((Component)target).GetComponent<MeshFilter>().sharedMesh = ((Component)val).GetComponent<MeshFilter>().sharedMesh;
((Renderer)((Component)target).GetComponent<MeshRenderer>()).sharedMaterials = ((Renderer)((Component)val).GetComponent<MeshRenderer>()).sharedMaterials;
}
private static void ReplaceSkinnedMesh(ZNetScene scene, string prefabName, string path, Transform target)
{
SkinnedMeshRenderer component = ((Component)scene.GetPrefab(prefabName).transform.Find(path)).GetComponent<SkinnedMeshRenderer>();
SkinnedMeshRenderer component2 = ((Component)target).GetComponent<SkinnedMeshRenderer>();
component2.sharedMesh = component.sharedMesh;
((Renderer)component2).sharedMaterials = ((Renderer)component).sharedMaterials;
}
}
[HarmonyPatch(typeof(Player), "AddKnownItem")]
internal static class DiscoverItemPatches
{
private static Sprite _armoireIcon;
private static Sprite ArmoireIcon => _armoireIcon ?? (_armoireIcon = StaticMembers.armoirePiecePrefab.GetComponent<Piece>().m_icon);
[HarmonyTranspiler]
private static IEnumerable<CodeInstruction> AddKnownItemPatch(IEnumerable<CodeInstruction> instructions)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Expected O, but got Unknown
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Expected O, but got Unknown
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Expected O, but got Unknown
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Expected O, but got Unknown
return new CodeMatcher(instructions, (ILGenerator)null).Start().MatchStartForward((CodeMatch[])(object)new CodeMatch[2]
{
new CodeMatch((OpCode?)OpCodes.Callvirt, (object)AccessTools.Method(typeof(HashSet<string>), "Contains", (Type[])null, (Type[])null), (string)null),
new CodeMatch((OpCode?)OpCodes.Brtrue, (object)null, (string)null)
}).ThrowIfInvalid("Could not patch Player.AddKnownItem()!")
.Advance(2)
.InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[2]
{
new CodeInstruction(OpCodes.Ldarg_1, (object)null),
new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(DiscoverItemPatches), "UnlockNewAppearance", (Type[])null, (Type[])null))
})
.InstructionEnumeration();
}
private static void UnlockNewAppearance(ItemData discoveredItem)
{
StaticMembers.Dbgl("New item discovered: " + discoveredItem.m_shared.m_name, forceLog: false, (LogLevel)16);
ItemDrop component = discoveredItem.m_dropPrefab.GetComponent<ItemDrop>();
AppearanceSlotType? slotTypeForItemDrop = PluginUtils.GetSlotTypeForItemDrop(component);
if (slotTypeForItemDrop.HasValue)
{
MessageHud.instance.QueueUnlockMsg(ArmoireIcon, "<color=#00FFFF>Appearance Unlocked!</color>", discoveredItem.m_shared.m_name);
StaticMembers.UnlockedAppearances[slotTypeForItemDrop.Value][component] = component.m_itemData.m_shared.m_icons.Length;
AppearanceTracker.UpdateTotal();
}
}
}
[HarmonyPatch]
internal static class EquipmentPatches
{
[HarmonyPatch(typeof(VisEquipment))]
private static class VisEquipmentPatches
{
private enum OverrideTarget
{
LeftItem,
RightItem
}
[HarmonyPatch("SetHelmetItem")]
[HarmonyPrefix]
private static void SetHelmetItem(VisEquipment __instance, ref string name)
{
TryOverrideItem(__instance, ref name, (Player p) => ((Humanoid)p).m_helmetItem, AppearanceSlotType.Helmet);
}
[HarmonyPatch("SetChestItem")]
[HarmonyPrefix]
private static void SetChestItem(VisEquipment __instance, ref string name)
{
TryOverrideItem(__instance, ref name, (Player p) => ((Humanoid)p).m_chestItem, AppearanceSlotType.Chest);
}
[HarmonyPatch("SetLegItem")]
[HarmonyPrefix]
private static void SetLegItem(VisEquipment __instance, ref string name)
{
TryOverrideItem(__instance, ref name, (Player p) => ((Humanoid)p).m_legItem, AppearanceSlotType.Legs);
}
[HarmonyPatch("SetShoulderItem")]
[HarmonyPrefix]
private static void SetShoulderItem(VisEquipment __instance, ref string name, ref int variant)
{
TryOverrideItemWithVariant(__instance, ref name, ref variant, (Player p) => ((Humanoid)p).m_shoulderItem, AppearanceSlotType.Shoulder);
}
[HarmonyPatch("SetUtilityItem")]
[HarmonyPrefix]
private static void SetUtilityItem(VisEquipment __instance, ref string name)
{
TryOverrideItem(__instance, ref name, (Player p) => ((Humanoid)p).m_utilityItem, AppearanceSlotType.Utility);
}
[HarmonyPatch("SetTrinketItem")]
[HarmonyPrefix]
private static void SetTrinketItem(VisEquipment __instance, ref string name)
{
TryOverrideItem(__instance, ref name, (Player p) => ((Humanoid)p).m_trinketItem, AppearanceSlotType.Trinket);
}
[HarmonyPatch("SetLeftItem")]
[HarmonyPrefix]
private static void SetLeftItem(VisEquipment __instance, ref string name, ref int variant)
{
TryOverrideMatchingItem(__instance, ref name, ref variant, (Player p) => ((Humanoid)p).m_leftItem, OverrideTarget.LeftItem);
}
[HarmonyPatch("SetLeftBackItem")]
[HarmonyPrefix]
private static void SetLeftBackItem(VisEquipment __instance, ref string name, ref int variant)
{
TryOverrideMatchingItem(__instance, ref name, ref variant, (Player p) => ((Humanoid)p).m_hiddenLeftItem);
}
[HarmonyPatch("SetRightItem")]
[HarmonyPrefix]
private static void SetRightItem(VisEquipment __instance, ref string name)
{
int variant = 0;
TryOverrideMatchingItem(__instance, ref name, ref variant, (Player p) => ((Humanoid)p).m_rightItem, OverrideTarget.RightItem);
}
[HarmonyPatch("SetRightBackItem")]
[HarmonyPrefix]
private static void SetRightBackItem(VisEquipment __instance, ref string name)
{
int variant = 0;
TryOverrideMatchingItem(__instance, ref name, ref variant, (Player p) => ((Humanoid)p).m_hiddenRightItem);
}
private static bool ShouldOverrideAppearance(VisEquipment instance)
{
if (StaticMembers.config.EnableOverrides)
{
GameObject gameObject = ((Component)instance).gameObject;
Player localPlayer = Player.m_localPlayer;
if (!((Object)(object)gameObject == (Object)(object)((localPlayer != null) ? ((Component)localPlayer).gameObject : null)))
{
return !Object.op_Implicit((Object)(object)ZNetScene.instance);
}
return true;
}
return false;
}
private static void TryOverrideItem(VisEquipment instance, ref string name, Func<Player, ItemData> targetedItem, AppearanceSlotType slotType)
{
Player arg = default(Player);
if (ShouldOverrideAppearance(instance) && ((Component)instance).TryGetComponent<Player>(ref arg) && targetedItem(arg) != null)
{
AppearanceSlot appearanceSlot = StaticMembers.ActiveOverrides[slotType];
if (!string.IsNullOrEmpty(appearanceSlot.ItemName) || appearanceSlot.Hidden)
{
name = appearanceSlot.ItemName;
}
}
}
private static void TryOverrideItemWithVariant(VisEquipment instance, ref string name, ref int variant, Func<Player, ItemData> targetedItem, AppearanceSlotType slotType)
{
Player arg = default(Player);
if (ShouldOverrideAppearance(instance) && ((Component)instance).TryGetComponent<Player>(ref arg) && targetedItem(arg) != null)
{
AppearanceSlot appearanceSlot = StaticMembers.ActiveOverrides[slotType];
if (!string.IsNullOrEmpty(appearanceSlot.ItemName) || appearanceSlot.Hidden)
{
name = appearanceSlot.ItemName;
variant = appearanceSlot.ItemVariant;
}
}
}
private static void TryOverrideMatchingItem(VisEquipment instance, ref string name, ref int variant, Func<Player, ItemData> targetedItem, OverrideTarget? target = null)
{
Player arg = default(Player);
if (!ShouldOverrideAppearance(instance) || !((Component)instance).TryGetComponent<Player>(ref arg))
{
return;
}
ItemData val = targetedItem(arg);
if (val != null)
{
AppearanceSlot appearanceSlot = PluginUtils.FindMatchingSlot(val.m_shared);
bool flag = !string.IsNullOrEmpty(appearanceSlot?.ItemName);
if (flag)
{
name = appearanceSlot.ItemName;
variant = appearanceSlot.ItemVariant;
}
if (target == OverrideTarget.LeftItem)
{
overriddenLeftItem = (flag ? name : "");
}
else if (target.GetValueOrDefault() == OverrideTarget.RightItem)
{
overriddenRightItem = (flag ? name : "");
}
}
}
}
[HarmonyPatch(typeof(Humanoid))]
private static class MiscEquipmentPatches
{
[HarmonyPatch("SetupAnimationState")]
[HarmonyPostfix]
private static void FixAnimationState(Humanoid __instance)
{
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
string text = ((__instance.m_leftItem != null) ? overriddenLeftItem : ((__instance.m_rightItem != null) ? overriddenRightItem : null));
if (string.IsNullOrEmpty(text))
{
return;
}
GameObject prefab = ZNetScene.instance.GetPrefab(text);
ItemDrop val = ((prefab != null) ? prefab.GetComponent<ItemDrop>() : null);
if (!((Object)(object)val == (Object)null))
{
SharedData shared = val.m_itemData.m_shared;
if (!string.IsNullOrEmpty(PluginUtils.FindMatchingSlot(shared)?.ItemName))
{
__instance.SetAnimationState(shared.m_animationState);
}
}
}
}
internal static string overriddenLeftItem = "";
internal static string overriddenRightItem = "";
}
internal static class StaticMembers
{
internal static ManualLogSource ModLogger = new ManualLogSource(" Armoire");
internal static ModConfig config;
internal static AssetBundle assetBundle;
internal static GameObject guiPrefab = null;
internal static GameObject armoireSlot = null;
internal static GameObject armoirePiecePrefab = null;
internal static readonly Dictionary<LogLevel, Action<string>> logActions = new Dictionary<LogLevel, Action<string>>
{
{
(LogLevel)1,
(Action<string>)ModLogger.LogFatal
},
{
(LogLevel)2,
(Action<string>)ModLogger.LogError
},
{
(LogLevel)4,
(Action<string>)ModLogger.LogWarning
},
{
(LogLevel)8,
(Action<string>)ModLogger.LogMessage
},
{
(LogLevel)16,
(Action<string>)ModLogger.LogInfo
},
{
(LogLevel)32,
(Action<string>)ModLogger.LogDebug
}
};
internal static Dictionary<AppearanceSlotType, AppearanceSlot> ActiveOverrides = new Dictionary<AppearanceSlotType, AppearanceSlot>
{
{
AppearanceSlotType.Helmet,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 6 && (int)sd.m_skillType == 1, canBeHidden: true)
},
{
AppearanceSlotType.Chest,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 7 && (int)sd.m_skillType == 1, canBeHidden: true)
},
{
AppearanceSlotType.Legs,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 11 && (int)sd.m_skillType == 1, canBeHidden: true)
},
{
AppearanceSlotType.Shoulder,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 17 && (int)sd.m_skillType == 1, canBeHidden: true)
},
{
AppearanceSlotType.Utility,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 18 && (int)sd.m_skillType == 1, canBeHidden: true)
},
{
AppearanceSlotType.Trinket,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 24 && (int)sd.m_skillType == 1, canBeHidden: true)
},
{
AppearanceSlotType.Bow,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 4 && (int)sd.m_skillType == 8)
},
{
AppearanceSlotType.Crossbow,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 4 && (int)sd.m_skillType == 14)
},
{
AppearanceSlotType.Shield,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 5 && (int)sd.m_skillType == 6)
},
{
AppearanceSlotType.OneHandedAxe,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 3 && (int)sd.m_skillType == 7)
},
{
AppearanceSlotType.OneHandedClub,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 3 && (int)sd.m_skillType == 3)
},
{
AppearanceSlotType.OneHandedSword,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 3 && (int)sd.m_skillType == 1)
},
{
AppearanceSlotType.Knife,
new AppearanceSlot(delegate(SharedData sd)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Invalid comparison between Unknown and I4
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Invalid comparison between Unknown and I4
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Invalid comparison between Unknown and I4
ItemType itemType = sd.m_itemType;
return (((int)itemType == 3 || (int)itemType == 14) ? true : false) && (int)sd.m_skillType == 2;
})
},
{
AppearanceSlotType.Spear,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 3 && (int)sd.m_skillType == 5)
},
{
AppearanceSlotType.TwoHandedAxe,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 14 && (int)sd.m_skillType == 7)
},
{
AppearanceSlotType.TwoHandedClub,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 14 && (int)sd.m_skillType == 3)
},
{
AppearanceSlotType.TwoHandedSword,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 14 && (int)sd.m_skillType == 1)
},
{
AppearanceSlotType.Polearm,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 14 && (int)sd.m_skillType == 4)
},
{
AppearanceSlotType.Pickaxe,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 14 && (int)sd.m_skillType == 12)
},
{
AppearanceSlotType.Staff,
new AppearanceSlot(delegate(SharedData sd)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Invalid comparison between Unknown and I4
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Invalid comparison between Unknown and I4
bool flag = (int)sd.m_itemType == 14;
if (flag)
{
SkillType skillType = sd.m_skillType;
bool flag2 = skillType - 9 <= 1;
flag = flag2;
}
return flag;
})
},
{
AppearanceSlotType.Fist,
new AppearanceSlot((SharedData sd) => (int)sd.m_itemType == 14 && (int)sd.m_skillType == 11)
}
};
internal static List<Dictionary<AppearanceSlotType, AppearanceSlot>> OutfitOverrides = (from _ in Enumerable.Range(0, 3)
select PluginUtils.CloneOverrides(ActiveOverrides)).ToList();
internal static Dictionary<AppearanceSlotType, Dictionary<ItemDrop, int>> AllAppearances = new Dictionary<AppearanceSlotType, Dictionary<ItemDrop, int>>();
internal static Dictionary<AppearanceSlotType, Dictionary<ItemDrop, int>> UnlockedAppearances = new Dictionary<AppearanceSlotType, Dictionary<ItemDrop, int>>();
internal static Dictionary<AppearanceSlotType, Dictionary<ItemDrop, int>> GetLockedAppearances()
{
Dictionary<ItemDrop, int> unlocked;
return AllAppearances.ToDictionary((KeyValuePair<AppearanceSlotType, Dictionary<ItemDrop, int>> kvp) => kvp.Key, (KeyValuePair<AppearanceSlotType, Dictionary<ItemDrop, int>> kvp) => (!UnlockedAppearances.TryGetValue(kvp.Key, out unlocked)) ? new Dictionary<ItemDrop, int>(kvp.Value) : kvp.Value.Where((KeyValuePair<ItemDrop, int> pair) => !unlocked.ContainsKey(pair.Key)).ToDictionary((KeyValuePair<ItemDrop, int> pair) => pair.Key, (KeyValuePair<ItemDrop, int> pair) => pair.Value));
}
internal static AssetBundle LoadAssetBundle(string fileName)
{
return AssetBundle.LoadFromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream("Advize_Armoire.Assets." + fileName));
}
internal static void Dbgl(string message, bool forceLog = false, LogLevel level = 16)
{
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
if (forceLog || config.EnableDebugMessages)
{
logActions[level](message);
}
}
}
public class ArmoireUIDragHandler : MonoBehaviour, IDragHandler, IEventSystemHandler, IEndDragHandler
{
public RectTransform panelTransform;
private Vector2 _lastUpdatedPosition;
private bool _hasBeenDragged;
public void OnDrag(PointerEventData eventData)
{
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
if (StaticMembers.config.AllowDragging && ZInput.GetKey((KeyCode)306, true))
{
_hasBeenDragged = true;
RectTransform obj = panelTransform;
obj.anchoredPosition += eventData.delta;
_lastUpdatedPosition = panelTransform.anchoredPosition;
}
}
public void OnEndDrag(PointerEventData eventData)
{
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
if (_hasBeenDragged)
{
StaticMembers.config.UIPosition = _lastUpdatedPosition;
_hasBeenDragged = false;
}
}
}
public static class UIResources
{
public static readonly ResourceCache<Sprite> SpriteCache = new ResourceCache<Sprite>();
public static readonly ResourceCache<Material> MaterialCache = new ResourceCache<Material>();
public static readonly ResourceCache<Texture2D> TextureCache = new ResourceCache<Texture2D>();
public static readonly Dictionary<string, Font> FontCache = new Dictionary<string, Font>();
public static readonly Dictionary<string, TMP_FontAsset> FontAssetCache = new Dictionary<string, TMP_FontAsset>();
public static Sprite GetSprite(string spriteName)
{
return SpriteCache.GetResource(spriteName);
}
public static Material GetMaterial(string materialName)
{
return MaterialCache.GetResource(materialName);
}
public static Texture2D GetTexture(string textureName)
{
return TextureCache.GetResource(textureName);
}
public static Sprite GetItemIcon(string prefabName, int variant = 0)
{
string resourceName = $"{prefabName}.{variant}";
Sprite resource = SpriteCache.GetResource(resourceName);
if (Object.op_Implicit((Object)(object)resource))
{
return resource;
}
GameObject prefab = ZNetScene.instance.GetPrefab(prefabName);
ItemDrop val = default(ItemDrop);
if (Object.op_Implicit((Object)(object)prefab) && prefab.TryGetComponent<ItemDrop>(ref val))
{
ItemData itemData = val.m_itemData;
if (itemData != null && itemData.m_shared?.m_icons?.Length > variant)
{
Sprite val2 = val.m_itemData.m_shared.m_icons[variant];
if (Object.op_Implicit((Object)(object)val2))
{
SpriteCache.SetResource(resourceName, val2);
return val2;
}
}
}
return null;
}
public static TMP_FontAsset GetFontAsset(string fontName)
{
if (!FontAssetCache.TryGetValue(fontName, out var value))
{
value = ((IEnumerable<TMP_FontAsset>)Resources.FindObjectsOfTypeAll<TMP_FontAsset>()).FirstOrDefault((Func<TMP_FontAsset, bool>)((TMP_FontAsset x) => ((Object)x).name == fontName));
FontAssetCache[fontName] = value;
}
return value;
}
}
public sealed class ResourceCache<T> where T : Object
{
private readonly Dictionary<string, T> _cache = new Dictionary<string, T>();
public T GetResource(string resourceName)
{
if (!_cache.TryGetValue(resourceName, out var value))
{
value = Resources.FindObjectsOfTypeAll<T>().FirstOrDefault((T x) => ((Object)x).name == resourceName);
_cache[resourceName] = value;
}
return value;
}
public void SetResource(string resourceName, T resource)
{
_cache[resourceName] = resource;
}
}
}