Decompiled source of KnarrTheTrader v0.5.2
plugins/Trader20.dll
Decompiled a year ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using Auga; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using JetBrains.Annotations; using JoshH.Extensions; using JoshH.UI; using Microsoft.CodeAnalysis; using ServerSync; using TMPro; using Trader20; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.Experimental.Rendering; using UnityEngine.PostProcessing; using UnityEngine.UI; using UnityStandardAssets.ImageEffects; using YamlDotNet.Core; using YamlDotNet.Core.Events; using YamlDotNet.Core.Tokens; using YamlDotNet.Helpers; using YamlDotNet.Serialization; using YamlDotNet.Serialization.Converters; using YamlDotNet.Serialization.EventEmitters; using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization.NodeDeserializers; using YamlDotNet.Serialization.NodeTypeResolvers; using YamlDotNet.Serialization.ObjectFactories; using YamlDotNet.Serialization.ObjectGraphTraversalStrategies; using YamlDotNet.Serialization.ObjectGraphVisitors; using YamlDotNet.Serialization.Schemas; using YamlDotNet.Serialization.TypeInspectors; using YamlDotNet.Serialization.TypeResolvers; using YamlDotNet.Serialization.Utilities; using YamlDotNet.Serialization.ValueDeserializers; [assembly: Guid("F9B815D6-6EF4-44DB-9A0F-436849B24670")] [assembly: ComVisible(false)] [assembly: AssemblyTrademark("")] [assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyProduct("Trader2.0")] [assembly: AssemblyCompany("")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyDescription("")] [assembly: AssemblyTitle("Trader2.0")] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: CompilationRelaxations(8)] [assembly: AssemblyFileVersion("0.5.2")] [assembly: AssemblyConfiguration("")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.5.2.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [<e98b1d1a-1a8b-4fce-ab38-33f0ba39e46b>Embedded] internal sealed class <e98b1d1a-1a8b-4fce-ab38-33f0ba39e46b>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [<e98b1d1a-1a8b-4fce-ab38-33f0ba39e46b>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class <a546a844-44b5-4146-be53-ef59919185cc>NullableAttribute : Attribute { public readonly byte[] NullableFlags; public <a546a844-44b5-4146-be53-ef59919185cc>NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public <a546a844-44b5-4146-be53-ef59919185cc>NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [<e98b1d1a-1a8b-4fce-ab38-33f0ba39e46b>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class <6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContextAttribute : Attribute { public readonly byte Flag; public <6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContextAttribute(byte P_0) { Flag = P_0; } } } public class DragHandler : MonoBehaviour, IBeginDragHandler, IEventSystemHandler, IDragHandler, IEndDragHandler { private Vector2 pointerOffset; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] private RectTransform canvasRectTransform; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] private RectTransform panelRectTransform; private bool clampedToLeft; private bool clampedToRight; private bool clampedToTop; private bool clampedToBottom; public void Start() { Canvas componentInParent = ((Component)this).GetComponentInParent<Canvas>(); if ((Object)(object)componentInParent != (Object)null) { ref RectTransform reference = ref canvasRectTransform; Transform transform = ((Component)componentInParent).transform; reference = (RectTransform)(object)((transform is RectTransform) ? transform : null); ref RectTransform reference2 = ref panelRectTransform; Transform transform2 = ((Component)this).transform; reference2 = (RectTransform)(object)((transform2 is RectTransform) ? transform2 : null); } clampedToLeft = false; clampedToRight = false; clampedToTop = false; clampedToBottom = false; } [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(1)] public void OnBeginDrag(PointerEventData eventData) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) ((Transform)panelRectTransform).SetAsLastSibling(); RectTransformUtility.ScreenPointToLocalPointInRectangle(panelRectTransform, eventData.position, eventData.pressEventCamera, ref pointerOffset); } [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(1)] public void OnDrag(PointerEventData eventData) { //IL_0035: 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_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: 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_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Unknown result type (might be due to invalid IL or missing references) Vector2 val = default(Vector2); if (!((Object)(object)panelRectTransform == (Object)null) && (!((Object)(object)OdinStore.instance != (Object)null) || ((Component)OdinStore.instance).gameObject.activeSelf) && RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRectTransform, eventData.position, eventData.pressEventCamera, ref val)) { ((Transform)panelRectTransform).localPosition = Vector2.op_Implicit(val - pointerOffset); ClampToWindow(); Vector2 val2 = Vector2.op_Implicit(((Transform)panelRectTransform).localPosition); Rect rect; if (clampedToRight) { rect = canvasRectTransform.rect; float num = ((Rect)(ref rect)).width * 0.5f; rect = panelRectTransform.rect; val2.x = num - ((Rect)(ref rect)).width * (1f - panelRectTransform.pivot.x); } else if (clampedToLeft) { rect = canvasRectTransform.rect; float num2 = (0f - ((Rect)(ref rect)).width) * 0.5f; rect = panelRectTransform.rect; val2.x = num2 + ((Rect)(ref rect)).width * panelRectTransform.pivot.x; } if (clampedToTop) { rect = canvasRectTransform.rect; float num3 = ((Rect)(ref rect)).height * 0.5f; rect = panelRectTransform.rect; val2.y = num3 - ((Rect)(ref rect)).height * (1f - panelRectTransform.pivot.y); } else if (clampedToBottom) { rect = canvasRectTransform.rect; float num4 = (0f - ((Rect)(ref rect)).height) * 0.5f; rect = panelRectTransform.rect; val2.y = num4 + ((Rect)(ref rect)).height * panelRectTransform.pivot.y; } ((Transform)panelRectTransform).localPosition = Vector2.op_Implicit(val2); } } [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(1)] public void OnEndDrag(PointerEventData eventData) { } private void ClampToWindow() { Vector3[] array = (Vector3[])(object)new Vector3[4]; Vector3[] array2 = (Vector3[])(object)new Vector3[4]; canvasRectTransform.GetWorldCorners(array); panelRectTransform.GetWorldCorners(array2); if (array2[2].x > array[2].x) { if (!clampedToRight) { clampedToRight = true; } } else if (clampedToRight) { clampedToRight = false; } else if (array2[0].x < array[0].x) { if (!clampedToLeft) { clampedToLeft = true; } } else if (clampedToLeft) { clampedToLeft = false; } if (array2[2].y > array[2].y) { if (!clampedToTop) { clampedToTop = true; } } else if (clampedToTop) { clampedToTop = false; } else if (array2[0].y < array[0].y) { if (!clampedToBottom) { clampedToBottom = true; } } else if (clampedToBottom) { clampedToBottom = false; } } } [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(2)] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(0)] public class ElementScript : MonoBehaviour { public GameObject Icon; public Image Icon2; } [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(1)] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(0)] public class LitPanelizer : MonoBehaviour { [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] public Image referenceimg; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] public Image repairBkg; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(new byte[] { 1, 2 })] public List<Image> _TabImages = new List<Image>(); public List<Image> _ButtonImages = new List<Image>(); private Material litpanel; private void Awake() { litpanel = ((Graphic)repairBkg).material; Transform[] componentsInChildren = ((Component)this).gameObject.GetComponentsInChildren<Transform>(); Transform[] array = componentsInChildren; foreach (Transform val in array) { if ((Object)(object)((Component)val).GetComponent<Image>() != (Object)null && ((Object)((Graphic)((Component)val).GetComponent<Image>()).material).name.StartsWith("REPLACE_")) { ((Graphic)((Component)val).GetComponent<Image>()).material = litpanel; } } foreach (Image tabImage in _TabImages) { tabImage.sprite = referenceimg.sprite; ((Graphic)tabImage).material = ((Graphic)referenceimg).material; } foreach (Image buttonImage in _ButtonImages) { ((Graphic)buttonImage).material = litpanel; } } private void OnEnable() { foreach (Image tabImage in _TabImages) { tabImage.sprite = referenceimg.sprite; ((Graphic)tabImage).material = ((Graphic)repairBkg).material; ((Graphic)tabImage).material.mainTexture = ((Graphic)referenceimg).mainTexture; } } } public class MaterialReplacer : MonoBehaviour { private void Awake() { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown GameObject[] array = Resources.FindObjectsOfTypeAll<GameObject>(); foreach (GameObject val in array) { if (((Object)val).name == "InteriorEnvirnomentZone") { Renderer component = ((Component)this).gameObject.GetComponent<Renderer>(); component = (Renderer)val.GetComponents<Renderer>().Clone(); } } } } [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(2)] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(0)] public class PlayerBaseMaker : MonoBehaviour { private EffectArea _playerBase; private GameObject _holder; private void OnEnable() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown //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_0065: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_playerBase != (Object)null)) { _holder = new GameObject(); _holder.SetActive(false); GameObject val = Object.Instantiate<GameObject>(_holder, ((Component)this).transform.position, Quaternion.identity); _playerBase = val.AddComponent<EffectArea>(); if (!((Object)(object)_playerBase == (Object)null)) { _playerBase.m_type = (Type)32; SphereCollider val2 = val.AddComponent<SphereCollider>(); val2.radius = 5f; ((Collider)val2).isTrigger = true; _playerBase.m_statusEffect = "SE_Cozy"; _holder.transform.SetParent(((Component)this).transform); } } } } [Serializable] internal enum ShaderType { Alpha, Blob, Bonemass, Clouds, Creature, Decal, Distortion, Flow, FlowOpaque, Grass, GuiScroll, HeightMap, Icon, InteriorSide, LitGui, LitParticles, MapShader, ParticleDetail, Piece, Player, Rug, ShadowBlob, SkyboxProcedural, SkyObject, StaticRock, Tar, TrilinearMap, BGBlur, Water, WaterBottom, WaterMask, Yggdrasil, YggdrasilRoot, ToonDeferredShading2017 } [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(1)] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(0)] public class ShaderReplacerNew : MonoBehaviour { [Tooltip("Use this Field For Normal Renderers")] [SerializeField] internal Renderer[] _renderers; [SerializeField] internal ShaderType _shaderType = ShaderType.Creature; [SerializeField] internal bool DebugOutput; private void Awake() { if (IsHeadlessMode() || _renderers.Length == 0 || !((Component)this).gameObject.activeInHierarchy) { return; } Renderer[] renderers = _renderers; foreach (Renderer val in renderers) { if ((Object)(object)val == (Object)null) { continue; } Material[] sharedMaterials = val.sharedMaterials; foreach (Material val2 in sharedMaterials) { if ((Object)(object)val2 == (Object)null) { ((Component)val).gameObject.SetActive(false); } else { val2.shader = Shader.Find(ReturnEnumString(_shaderType)); } } } } internal string ReturnEnumString(ShaderType shaderchoice) { string result = ""; switch (shaderchoice) { case ShaderType.Alpha: result = "Custom/AlphaParticle"; break; case ShaderType.Blob: result = "Custom/Blob"; break; case ShaderType.Bonemass: result = "Custom/Bonemass"; break; case ShaderType.Clouds: result = "Custom/Clouds"; break; case ShaderType.Creature: result = "Custom/Creature"; break; case ShaderType.Decal: result = "Custom/Decal"; break; case ShaderType.Distortion: result = "Custom/Distortion"; break; case ShaderType.Flow: result = "Custom/Flow"; break; case ShaderType.FlowOpaque: result = "Custom/FlowOpaque"; break; case ShaderType.Grass: result = "Custom/Grass"; break; case ShaderType.GuiScroll: result = "Custom/GuiScroll"; break; case ShaderType.HeightMap: result = "Custom/HeightMap"; break; case ShaderType.Icon: result = "Custom/Icon"; break; case ShaderType.InteriorSide: result = "Custom/InteriorSide"; break; case ShaderType.LitGui: result = "Custom/LitGui"; break; case ShaderType.LitParticles: result = "Lux Lit Particles/ Bumped"; break; case ShaderType.MapShader: result = "Custom/mapshader"; break; case ShaderType.ParticleDetail: result = "Custom/ParticleDecal"; break; case ShaderType.Piece: result = "Custom/Piece"; break; default: throw new ArgumentOutOfRangeException("shaderchoice", shaderchoice, null); case ShaderType.Player: case ShaderType.Rug: case ShaderType.ShadowBlob: case ShaderType.SkyboxProcedural: case ShaderType.SkyObject: case ShaderType.StaticRock: case ShaderType.Tar: case ShaderType.TrilinearMap: case ShaderType.BGBlur: case ShaderType.Water: case ShaderType.WaterBottom: case ShaderType.WaterMask: case ShaderType.Yggdrasil: case ShaderType.YggdrasilRoot: case ShaderType.ToonDeferredShading2017: break; } return result; } public static bool IsHeadlessMode() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Invalid comparison between Unknown and I4 return (int)SystemInfo.graphicsDeviceType == 4; } } [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(0)] [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(1)] public class NewTrader : MonoBehaviour, Hoverable, Interactable { [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] private static NewTrader m_instance; public string m_name = "Knarr"; public float m_standRange = 15f; public float m_greetRange = 5f; public float m_byeRange = 5f; [Header("Dialog")] public float m_hideDialogDelay = 5f; public float m_randomTalkInterval = 30f; public List<string> m_randomTalk = new List<string>(); public List<string> m_randomGreets = new List<string>(); public List<string> m_randomGoodbye = new List<string>(); public List<string> m_randomStartTrade = new List<string>(); public List<string> m_randomBuy = new List<string>(); public List<string> m_randomSell = new List<string>(); public EffectList m_randomTalkFX = new EffectList(); public EffectList m_randomGreetFX = new EffectList(); public EffectList m_randomGoodbyeFX = new EffectList(); public EffectList m_randomStartTradeFX = new EffectList(); public EffectList m_randomSellFX = new EffectList(); [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] public SnapToGround _snapper; private bool m_didGreet; private bool m_didGoodbye; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] private Animator m_animator; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] private LookAt m_lookAt; [SerializeField] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] internal OdinStore _store; [SerializeField] internal float rotateAtPlayerSpeed; private static readonly int Stand = Animator.StringToHash("Stand"); [SerializeField] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] internal ZNetView m_netview; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] public static NewTrader instance { [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(2)] get { return m_instance; } } [SerializeField] private float nextTime { get; set; } [SerializeField] private float modifier { get; set; } private void Start() { m_animator = ((Component)this).GetComponentInChildren<Animator>(); m_lookAt = ((Component)this).GetComponentInChildren<LookAt>(); ((MonoBehaviour)this).InvokeRepeating("RandomTalk", m_randomTalkInterval, m_randomTalkInterval); nextTime = 0f; SnapToGround.SnappAll(); _snapper = ((Component)this).GetComponent<SnapToGround>(); if (Object.op_Implicit((Object)(object)_snapper)) { _snapper.Snap(); } } private void Awake() { m_instance = this; } private void OnDestroy() { if ((Object)(object)m_instance == (Object)(object)this) { m_instance = null; } } private void Update() { modifier = Random.Range(-0.08f, 40f); } private void LateUpdate() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_004a: 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_0050: 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) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) Player closestPlayer = Player.GetClosestPlayer(((Component)this).transform.position, m_standRange); if (Object.op_Implicit((Object)(object)closestPlayer)) { m_animator.SetBool(Stand, true); m_lookAt.SetLoockAtTarget(((Character)closestPlayer).GetHeadPoint()); Vector3 position = ((Component)closestPlayer).transform.position; float num = Vector3.Distance(position, ((Component)instance).transform.position); if (!m_didGreet && num <= m_greetRange) { m_didGreet = true; m_didGoodbye = false; Say(m_randomGreets, "Greet"); if (global::Trader20.Trader20.KnarrPlaySound.Value) { GameObject prefab = m_randomGreetFX.m_effectPrefabs[Random.Range(0, m_randomGreetFX.m_effectPrefabs.Length)].m_prefab; prefab.GetComponent<AudioSource>().outputAudioMixerGroup = AudioMan.instance.m_ambientMixer; Object.Instantiate<GameObject>(prefab, ((Component)this).transform.position, Quaternion.identity); } } if (m_didGreet && !m_didGoodbye && num >= m_byeRange) { m_didGoodbye = true; m_didGreet = false; Say(m_randomGoodbye, "Greet"); if (global::Trader20.Trader20.KnarrPlaySound.Value) { GameObject prefab2 = m_randomGoodbyeFX.m_effectPrefabs[Random.Range(0, m_randomGoodbyeFX.m_effectPrefabs.Length)].m_prefab; prefab2.GetComponent<AudioSource>().outputAudioMixerGroup = AudioMan.instance.m_ambientMixer; Object.Instantiate<GameObject>(prefab2, ((Component)this).transform.position, Quaternion.identity); } } } else { m_animator.SetBool(Stand, false); m_lookAt.ResetTarget(); } } private void RandomTalk() { //IL_001f: 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 (m_animator.GetBool(Stand) && !StoreGui.IsVisible() && Player.IsPlayerInRange(((Component)this).transform.position, m_greetRange)) { Say(m_randomTalk, "Talk"); if (global::Trader20.Trader20.KnarrPlaySound.Value) { m_randomTalkFX.Create(((Component)this).transform.position, Quaternion.identity, (Transform)null, 1f, -1); } } } public string GetHoverText() { return Localization.instance.Localize(m_name + "\n[<color=yellow><b>$KEY_Use</b></color>] $raven_interact"); } public string GetHoverName() { return Localization.instance.Localize(m_name); } public bool Interact(Humanoid character, bool hold, bool alt) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) if (hold) { return false; } if ((Object)(object)OdinStore.instance != (Object)null) { OdinStore.instance.Show(); } Say(m_randomStartTrade, "Talk"); m_randomStartTradeFX.Create(((Component)this).transform.position, Quaternion.identity, (Transform)null, 1f, -1); return false; } private void Say(List<string> texts, string trigger) { Say(texts[Random.Range(0, texts.Count)], trigger); } private void Say(string text, string trigger) { //IL_000b: 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) Chat.instance.SetNpcText(((Component)this).gameObject, Vector3.up * 1.5f, 20f, m_hideDialogDelay, "", text, false); if (trigger.Length > 0) { m_animator.SetTrigger(trigger); } } public bool UseItem(Humanoid user, ItemData item) { return false; } public void OnSold() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) Say(m_randomSell, "Sell"); EffectData[] array = RandomSellFX(1); GameObject prefab = array[Random.Range(0, array.Length)].m_prefab; Object.Instantiate<GameObject>(prefab, ((Component)this).transform.position, Quaternion.identity); } private EffectData[] RandomSellFX(int numRequired) { EffectData[] array = (EffectData[])(object)new EffectData[numRequired]; int num = numRequired; for (int num2 = m_randomSellFX.m_effectPrefabs.Length; num2 > 0; num2--) { float num3 = (float)num / (float)num2; if (Random.value <= num3) { num--; array[num] = m_randomSellFX.m_effectPrefabs[num2 - 1]; if (num == 0) { break; } } } return array; } } [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(1)] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(0)] public class OdinStore : MonoBehaviour { [Serializable] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(0)] [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(2)] public class ElementFormat { private int? _inventoryCount; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(1)] private GameObject _element; private GameObject _itemObject; private Sprite _icon; private string _itemName; private int? _price; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(1)] internal GameObject Element { [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(1)] get { return _element; } [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(1)] set { _element = value; } } internal Sprite Icon { get { return _icon; } set { _icon = value; } } internal string ItemName { get { return _itemName; } set { _itemName = value; } } internal int? Price { get { return _price; } set { _price = value; } } internal GameObject ItemObject { get { return _itemObject; } set { _itemObject = value; } } internal int? InventoryCount { get { return _inventoryCount; } set { _inventoryCount = value; } } internal UITooltip _uiTooltip { get; set; } public ElementFormat(GameObject element) { Element = element; } } [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] [Header("Store instance")] private static OdinStore m_instance; [SerializeField] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] private GameObject m_StorePanel; [SerializeField] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] private TextMeshProUGUI StoreTitle_TMP; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] [SerializeField] internal Image Bkg1; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] [SerializeField] internal Image Bkg2; [SerializeField] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] internal RectTransform TabRect; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] [SerializeField] [Header("Items Panel")] [Space] private RectTransform ListRoot; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] [SerializeField] private Image ItemDropIcon; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] [SerializeField] internal TextMeshProUGUI SelectedCost_TMP; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] [SerializeField] private TextMeshProUGUI SelectedItemDescription_TMP; [SerializeField] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] private TextMeshProUGUI SelectedName_TMP; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] [Space] [Header("Sell Panel")] [SerializeField] private Button SellButton; [SerializeField] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] private RectTransform SellListRoot; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] [SerializeField] private TextMeshProUGUI InventoryCount_TMP; [SerializeField] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] internal TextMeshProUGUI repairText_TMP; [SerializeField] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] internal GameObject InvCountPanel; [SerializeField] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] internal Image SellButtonImage; [SerializeField] internal bool SellPageActive; [Header("Buy Panel")] [SerializeField] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] [Space] private Button BuyButton; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] [SerializeField] internal Image BuyButtonImage; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] [SerializeField] internal Image Coins; [SerializeField] internal bool BuyPageActive = true; [SerializeField] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] [Space] [Header("Elements")] private GameObject ElementGO; [SerializeField] [Header("Repair Tab")] [Space] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] internal RectTransform RepairRect; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] [SerializeField] internal Image repairImage; [SerializeField] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] internal Button repairButton; [SerializeField] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] internal Image repairHammerImage; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] internal InventoryGui gui; internal GameObject splitDiagGO; internal Transform m_splitPanel; internal Slider m_splitSlider; internal Text m_splitAmount; internal Button m_splitCancelButton; internal Button m_splitOkButton; internal Image m_splitIcon; internal Text m_splitIconName; internal ItemData m_splitItem; private string m_splitInput = ""; private DateTime m_lastSplitInput; public float m_splitNumInputTimeoutSec = 0.5f; internal Dictionary<ItemDrop, StoreInfo<int, int, int>> _storeInventory = new Dictionary<ItemDrop, StoreInfo<int, int, int>>(); [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] internal static ElementFormat tempElement; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] internal static Material litpanel; internal List<ElementFormat> _knarSellElements = new List<ElementFormat>(); internal List<ElementFormat> _playerSellElements; private List<ItemData> m_tempItems = new List<ItemData>(); internal GameObject ElementPoolGO; internal List<ElementFormat> ElementPoolObjects = new List<ElementFormat>(); internal int currentIdx; internal bool iscurrentlysplitting; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] public static OdinStore instance { [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(2)] get { return m_instance; } } private void Awake() { //IL_0028: 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) _playerSellElements = new List<ElementFormat>(); m_instance = this; Transform transform = m_StorePanel.transform; RectTransform val = (RectTransform)(object)((transform is RectTransform) ? transform : null); val.anchoredPosition = Vector2.op_Implicit(global::Trader20.Trader20.StoreScreenPos.Value); ((TMP_Text)StoreTitle_TMP).SetText("Knarr's Shop"); CreateAndFillElementPool(); m_StorePanel.SetActive(false); } private void Start() { ConfigEntry<bool> configShowRepair = global::Trader20.Trader20.ConfigShowRepair; if (configShowRepair != null && !configShowRepair.Value && (Object)(object)RepairRect != (Object)null) { ((Component)RepairRect).gameObject.SetActive(false); } ConfigEntry<bool> configShowTabs = global::Trader20.Trader20.ConfigShowTabs; if (configShowTabs != null && !configShowTabs.Value) { ((Component)TabRect).gameObject.SetActive(false); } } private void Update() { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) if (!IsActive()) { return; } if (IsActive()) { StoreGui.instance.m_hiddenFrames = 0; } Player localPlayer = Player.m_localPlayer; if (localPlayer != null) { if (Vector3.Distance(((Component)NewTrader.instance).transform.position, ((Component)localPlayer).transform.position) > 15f) { Hide(); } if (Input.GetKeyDown((KeyCode)27) || ZInput.GetButtonDown("JoyButtonB")) { ZInput.ResetButtonStatus("JoyButtonB"); Hide(); } if (InventoryGui.IsVisible() || Minimap.IsOpen()) { Hide(); } if ((Object)(object)Player.m_localPlayer == (Object)null || ((Character)Player.m_localPlayer).IsDead() || ((Character)Player.m_localPlayer).InCutscene()) { Hide(); } UpdateRecipeGamepadInput(); if (iscurrentlysplitting) { UpdateSplitDialog(); } } } private void OnDestroy() { if ((Object)(object)m_instance == (Object)(object)this) { m_instance = null; } } private ElementFormat GetPooledElement() { for (int i = 0; i < ElementPoolObjects.Count; i++) { if (!ElementPoolObjects[i].Element.activeSelf && !ElementPoolObjects[i].Element.activeSelf) { return ElementPoolObjects[i]; } } return null; } private void ReturnPooledElement(ElementFormat element) { element.Element.transform.SetParent(ElementPoolGO.transform); element.Element.transform.SetSiblingIndex(-1); element.Element.SetActive(false); element._uiTooltip = null; element.Icon = null; element.Price = null; element.InventoryCount = null; element.ItemName = null; } private void CreateAndFillElementPool() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown ElementPoolGO = new GameObject("ElementPool"); ElementPoolGO.transform.SetParent(((Component)this).transform); ElementPoolGO.transform.SetSiblingIndex(-1); ElementPoolGO.SetActive(false); for (int i = 0; i < ObjectDB.instance.m_items.Count; i++) { GameObject val = Object.Instantiate<GameObject>(ElementGO, ElementPoolGO.transform, false); val.SetActive(false); ElementFormat item = new ElementFormat(val); ElementPoolObjects.Add(item); } } private bool IsActive() { return m_StorePanel.activeSelf; } internal void ClearStore() { if (BuyPageActive && _knarSellElements.Count != _storeInventory.Count) { foreach (ElementFormat knarSellElement in _knarSellElements) { ReturnPooledElement(knarSellElement); } _knarSellElements.Clear(); ReadStoreItems(); } if (SellPageActive) { FillPlayerItemListVoid(); } } public void AddItemToDisplayList(GameObject dropObj, int stack, int cost, int invCount, RectTransform rectForElements, bool isPlayerItem) { //IL_0267: Unknown result type (might be due to invalid IL or missing references) //IL_0271: Expected O, but got Unknown //IL_0556: Unknown result type (might be due to invalid IL or missing references) //IL_0560: Expected O, but got Unknown //IL_0845: Unknown result type (might be due to invalid IL or missing references) //IL_084f: Expected O, but got Unknown ElementFormat newElement; ItemDrop drop; switch (Utilities.GetConnectionState()) { case Utilities.ConnectionState.Client: { newElement = GetPooledElement(); newElement.ItemObject = dropObj; drop = dropObj.GetComponent<ItemDrop>(); newElement.Icon = drop.m_itemData.m_shared.m_icons.FirstOrDefault(); newElement.ItemName = drop.m_itemData.m_shared.m_name; newElement._uiTooltip = newElement.Element.GetComponent<UITooltip>(); newElement._uiTooltip.m_text = Localization.instance.Localize(drop.m_itemData.m_shared.m_name); if ((Object)(object)Player.m_localPlayer != (Object)null) { string tooltip2 = drop.m_itemData.GetTooltip(); if (!Utility.IsNullOrWhiteSpace(tooltip2)) { newElement._uiTooltip.m_topic = Localization.instance.Localize(tooltip2); } } newElement.InventoryCount = invCount; ((Component)newElement.Element.transform.Find("icon")).GetComponent<Image>().sprite = newElement.Icon; Text component = ((Component)newElement.Element.transform.Find("name")).GetComponent<Text>(); component.text = newElement.ItemName; ((Component)component).gameObject.AddComponent<Localize>(); ((Component)newElement.Element.transform.Find("price")).GetComponent<Text>().text = cost.ToString(); Text component3 = ((Component)newElement.Element.transform.Find("stack")).GetComponent<Text>(); string text = ((stack > 1) ? ("x" + stack) : ((stack != 1) ? ((Component)newElement.Element.transform.Find("stack")).GetComponent<Text>().text : "")); component3.text = text; ((UnityEvent)newElement.Element.GetComponent<Button>().onClick).AddListener((UnityAction)delegate { UpdateGenDescription(newElement); if (invCount <= 0) { InvCountPanel.SetActive(false); } else { InvCountPanel.SetActive(true); ((TMP_Text)InventoryCount_TMP).SetText(_storeInventory.ElementAt(FindIndex(drop)).Value.InvCount.ToString()); } }); newElement.Element.transform.SetParent((Transform)(object)rectForElements, false); newElement.Element.transform.SetSiblingIndex(((Component)rectForElements).transform.GetSiblingIndex() - 1); ((Component)newElement.Element.transform.Find("coin_bkg/coin icon")).GetComponent<Image>().sprite = global::Trader20.Trader20.Coins; if (isPlayerItem) { _playerSellElements.Add(newElement); } else { _knarSellElements.Add(newElement); } newElement.Element.SetActive(true); break; } case Utilities.ConnectionState.Local: { newElement = GetPooledElement(); newElement.ItemObject = dropObj; drop = dropObj.GetComponent<ItemDrop>(); newElement.Icon = drop.m_itemData.m_shared.m_icons.FirstOrDefault(); newElement.ItemName = drop.m_itemData.m_shared.m_name; newElement._uiTooltip = newElement.Element.GetComponent<UITooltip>(); newElement._uiTooltip.m_text = Localization.instance.Localize(drop.m_itemData.m_shared.m_name); if (!Utility.IsNullOrWhiteSpace(drop.m_itemData.m_shared.m_description)) { string tooltip3 = drop.m_itemData.GetTooltip(); if (!Utility.IsNullOrWhiteSpace(tooltip3)) { newElement._uiTooltip.m_topic = Localization.instance.Localize(tooltip3); } } newElement.InventoryCount = invCount; ((Component)newElement.Element.transform.Find("icon")).GetComponent<Image>().sprite = newElement.Icon; Text component = ((Component)newElement.Element.transform.Find("name")).GetComponent<Text>(); component.text = newElement.ItemName; ((Component)component).gameObject.AddComponent<Localize>(); ((Component)newElement.Element.transform.Find("price")).GetComponent<Text>().text = cost.ToString(); Text component4 = ((Component)newElement.Element.transform.Find("stack")).GetComponent<Text>(); string text = ((stack > 1) ? ("x" + stack) : ((stack != 1) ? ((Component)newElement.Element.transform.Find("stack")).GetComponent<Text>().text : "")); component4.text = text; ((UnityEvent)newElement.Element.GetComponent<Button>().onClick).AddListener((UnityAction)delegate { UpdateGenDescription(newElement); if (invCount <= 0) { InvCountPanel.SetActive(false); } else { InvCountPanel.SetActive(true); ((TMP_Text)InventoryCount_TMP).SetText(_storeInventory.ElementAt(FindIndex(drop)).Value.InvCount.ToString()); } }); newElement.Element.transform.SetParent((Transform)(object)rectForElements, false); newElement.Element.transform.SetSiblingIndex(((Component)rectForElements).transform.GetSiblingIndex() - 1); ((Component)newElement.Element.transform.Find("coin_bkg/coin icon")).GetComponent<Image>().sprite = global::Trader20.Trader20.Coins; if (isPlayerItem) { _playerSellElements.Add(newElement); } else { _knarSellElements.Add(newElement); } newElement.Element.SetActive(true); break; } case Utilities.ConnectionState.Unknown: { newElement = GetPooledElement(); newElement.ItemObject = dropObj; drop = dropObj.GetComponent<ItemDrop>(); newElement.Icon = drop.m_itemData.m_shared.m_icons.FirstOrDefault(); newElement.ItemName = drop.m_itemData.m_shared.m_name; newElement._uiTooltip = newElement.Element.GetComponent<UITooltip>(); newElement._uiTooltip.m_text = Localization.instance.Localize(drop.m_itemData.m_shared.m_name); if (!Utility.IsNullOrWhiteSpace(drop.m_itemData.m_shared.m_description)) { string tooltip = drop.m_itemData.GetTooltip(); if (!Utility.IsNullOrWhiteSpace(tooltip)) { newElement._uiTooltip.m_topic = Localization.instance.Localize(tooltip); } } newElement.InventoryCount = invCount; ((Component)newElement.Element.transform.Find("icon")).GetComponent<Image>().sprite = newElement.Icon; Text component = ((Component)newElement.Element.transform.Find("name")).GetComponent<Text>(); component.text = newElement.ItemName; ((Component)component).gameObject.AddComponent<Localize>(); ((Component)newElement.Element.transform.Find("price")).GetComponent<Text>().text = cost.ToString(); Text component2 = ((Component)newElement.Element.transform.Find("stack")).GetComponent<Text>(); string text = ((stack > 1) ? ("x" + stack) : ((stack != 1) ? ((Component)newElement.Element.transform.Find("stack")).GetComponent<Text>().text : "")); component2.text = text; ((UnityEvent)newElement.Element.GetComponent<Button>().onClick).AddListener((UnityAction)delegate { UpdateGenDescription(newElement); if (invCount <= 0) { InvCountPanel.SetActive(false); } else { InvCountPanel.SetActive(true); ((TMP_Text)InventoryCount_TMP).SetText(_storeInventory.ElementAt(FindIndex(drop)).Value.InvCount.ToString()); } }); newElement.Element.transform.SetParent((Transform)(object)rectForElements, false); newElement.Element.transform.SetSiblingIndex(((Component)rectForElements).transform.GetSiblingIndex() - 1); ((Component)newElement.Element.transform.Find("coin_bkg/coin icon")).GetComponent<Image>().sprite = global::Trader20.Trader20.Coins; if (isPlayerItem) { _playerSellElements.Add(newElement); } else { _knarSellElements.Add(newElement); } newElement.Element.SetActive(true); break; } case Utilities.ConnectionState.Server: break; } } private void ReadStoreItems() { //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Invalid comparison between Unknown and I4 try { if (_knarSellElements.Count >= 1) { _knarSellElements.Clear(); } if (_storeInventory.Count <= 0) { return; } foreach (KeyValuePair<ItemDrop, StoreInfo<int, int, int>> item in _storeInventory) { ConfigEntry<bool> onlySellKnownItems = global::Trader20.Trader20.OnlySellKnownItems; if (onlySellKnownItems != null && onlySellKnownItems.Value) { if (item.Value.InvCount != 0) { if (Player.m_localPlayer.m_knownRecipes.Contains(item.Key.m_itemData.m_shared.m_name) || Player.m_localPlayer.m_knownMaterial.Contains(item.Key.m_itemData.m_shared.m_name)) { AddItemToDisplayList(((Component)item.Key).gameObject, item.Value.Stack, item.Value.Cost, item.Value.InvCount, ListRoot, isPlayerItem: false); } else if ((int)item.Key.m_itemData.m_shared.m_itemType == 1 && global::Trader20.Trader20.ShowMatsWhenHidingRecipes.Value) { AddItemToDisplayList(((Component)item.Key).gameObject, item.Value.Stack, item.Value.Cost, item.Value.InvCount, ListRoot, isPlayerItem: false); } } } else if (item.Value.InvCount != 0) { AddItemToDisplayList(((Component)item.Key).gameObject, item.Value.Stack, item.Value.Cost, item.Value.InvCount, ListRoot, isPlayerItem: false); } } } catch (Exception ex) { global::Trader20.Trader20.knarrlogger.LogDebug((object)ex); } } public void SellItem(int i) { //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_010d: 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_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) Inventory inventory = ((Humanoid)Player.m_localPlayer).GetInventory(); ItemDrop key = _storeInventory.ElementAt(i).Key; if ((Object)(object)key == (Object)null || key.m_itemData == null) { return; } int num = Mathf.Min(_storeInventory.ElementAt(i).Value.Stack, key.m_itemData.m_shared.m_maxStackSize); int quality = key.m_itemData.m_quality; int variant = key.m_itemData.m_variant; key.m_itemData.m_dropPrefab = ObjectDB.instance.GetItemPrefab(((Object)((Component)key).gameObject).name); key.m_itemData.m_durability = key.m_itemData.GetMaxDurability(); if (inventory.AddItem(((Object)key).name, num, quality, variant, 0L, "", false) != null) { ((Character)Player.m_localPlayer).ShowPickupMessage(key.m_itemData, num); Gogan.LogEvent("Game", "BoughtItem", ((Object)key.m_itemData.m_dropPrefab).name, 0L); } else { Vector3 val = Random.insideUnitSphere * 0.5f; Transform transform = ((Component)Player.m_localPlayer).transform; GameObject val2 = Object.Instantiate<GameObject>(((Component)_storeInventory.ElementAt(i).Key).gameObject, transform.position + transform.forward * 2f + Vector3.up + val, Quaternion.identity); val2.GetComponent<ItemDrop>().m_itemData.m_stack = num; } int invCount = _storeInventory.ElementAt(i).Value.InvCount; if (invCount < 1) { if (invCount <= -1) { } } else { _storeInventory.ElementAt(i).Value.InvCount -= _storeInventory.ElementAt(i).Value.Stack; ((TMP_Text)InventoryCount_TMP).SetText(_storeInventory.ElementAt(i).Value.InvCount.ToString()); int? num2 = _storeInventory.ElementAt(i).Value.InvCount; UpdateYmlFileFromSaleOrBuy(_storeInventory.ElementAt(i).Key.m_itemData, num2.Value, isPlayerItem: false); if (num2 <= 0) { try { UpdateGenDescription(_knarSellElements[0]); ((TMP_Text)InventoryCount_TMP).SetText(_knarSellElements[0].InventoryCount.ToString()); tempElement = null; UpdateYmlFileFromSaleOrBuy(_storeInventory.ElementAt(i).Key.m_itemData, num2.Value, isPlayerItem: false); if (RemoveItemFromDict(key)) { ClearStore(); } } catch (Exception ex) { global::Trader20.Trader20.knarrlogger.LogDebug((object)ex); } } } if (!global::Trader20.Trader20.LOGStoreSales.Value) { return; } string text = Player.m_localPlayer.GetPlayerID().ToString(); string text2 = Player.m_localPlayer.GetPlayerName() ?? throw new ArgumentNullException("i"); string text3 = _storeInventory.ElementAt(i).Value.Cost.ToString(); EnvMan val3 = EnvMan.instance; DateTime dateTime = DateTime.Now; string text4 = ""; switch (Utilities.GetConnectionState()) { case Utilities.ConnectionState.Server: if (Object.op_Implicit((Object)(object)val3)) { float smoothDayFraction2 = val3.m_smoothDayFraction; int num5 = (int)(smoothDayFraction2 * 24f); int num6 = (int)((smoothDayFraction2 * 24f - (float)num5) * 60f); int second2 = (int)(((smoothDayFraction2 * 24f - (float)num5) * 60f - (float)num6) * 60f); DateTime now2 = DateTime.Now; dateTime = new DateTime(now2.Year, now2.Month, now2.Day, num5, num6, second2); int currentDay2 = EnvMan.instance.GetCurrentDay(); } text4 = "[" + dateTime.ToString() + "] " + text + " - " + text2 + " Purchased: " + Localization.instance.Localize(key.m_itemData.m_shared.m_name) + " For: " + text3; Gogan.LogEvent("Game", "Knarr Sold Item", text4, 0L); ZLog.Log((object)("Knarr Sold Item " + text4)); LogSales(text4).ConfigureAwait(continueOnCapturedContext: false); break; case Utilities.ConnectionState.Client: ZRoutedRpc.instance.InvokeRoutedRPC("SendLogItemToServer", new object[2] { ((Object)key.m_itemData.m_dropPrefab).name, _storeInventory.ElementAt(i).Value.Cost }); break; case Utilities.ConnectionState.Local: if (Object.op_Implicit((Object)(object)val3)) { float smoothDayFraction = val3.m_smoothDayFraction; int num3 = (int)(smoothDayFraction * 24f); int num4 = (int)((smoothDayFraction * 24f - (float)num3) * 60f); int second = (int)(((smoothDayFraction * 24f - (float)num3) * 60f - (float)num4) * 60f); DateTime now = DateTime.Now; dateTime = new DateTime(now.Year, now.Month, now.Day, num3, num4, second); int currentDay = EnvMan.instance.GetCurrentDay(); text4 = "[" + dateTime.ToString() + "] " + text + " - " + text2 + " Purchased: " + Localization.instance.Localize(key.m_itemData.m_shared.m_name) + " For: " + text3; Gogan.LogEvent("Game", "Knarr Sold Item", text4, 0L); ZLog.Log((object)("Knarr Sold Item " + text4)); LogSales(text4).ConfigureAwait(continueOnCapturedContext: false); } break; case Utilities.ConnectionState.Unknown: break; } } internal void UpdateYmlFileFromSaleOrBuy(ItemData sellableItem, int newInvCount, bool isPlayerItem) { ConfigEntry<bool> configWriteSalesBuysToYml = global::Trader20.Trader20.ConfigWriteSalesBuysToYml; if (configWriteSalesBuysToYml == null || !configWriteSalesBuysToYml.Value) { return; } string configPath = Paths.ConfigPath; char directorySeparatorChar = Path.DirectorySeparatorChar; StreamReader streamReader = File.OpenText(configPath + directorySeparatorChar + "trader_config.yaml"); Dictionary<string, ItemDataEntry> dictionary = YMLParser.ReadSerializedData(streamReader.ReadToEnd()); streamReader.Close(); switch (Utilities.GetConnectionState()) { case Utilities.ConnectionState.Server: if (YMLParser.CheckForEntry(dictionary, ((Object)sellableItem.m_dropPrefab).name)) { if (dictionary.TryGetValue(((Object)sellableItem.m_dropPrefab).name, out var value3)) { if (isPlayerItem) { value3.Invcount += sellableItem.m_stack; } else { value3.Invcount = newInvCount; } dictionary[((Object)sellableItem.m_dropPrefab).name] = value3; string contents2 = YMLParser.Serializers(dictionary); string configPath3 = Paths.ConfigPath; directorySeparatorChar = Path.DirectorySeparatorChar; File.WriteAllText(configPath3 + directorySeparatorChar + "trader_config.yaml", contents2); } } else { ItemDataEntry value4 = default(ItemDataEntry); value4.Invcount += sellableItem.m_stack; value4.ItemCount += sellableItem.m_stack; Dictionary<string, ItemDataEntry> dictionary3 = new Dictionary<string, ItemDataEntry>(); dictionary3.Add(((Object)sellableItem.m_dropPrefab).name, value4); string s2 = YMLParser.Serializers(dictionary3); YMLParser.AppendYmLfile(s2); } break; case Utilities.ConnectionState.Client: ZRoutedRpc.instance.InvokeRoutedRPC("SendItemInfoToServer", new object[3] { ((Object)sellableItem.m_dropPrefab).name, newInvCount, isPlayerItem }); break; case Utilities.ConnectionState.Local: if (YMLParser.CheckForEntry(dictionary, ((Object)sellableItem.m_dropPrefab).name)) { if (!dictionary.TryGetValue(((Object)sellableItem.m_dropPrefab).name, out var value)) { break; } if (isPlayerItem) { if (iscurrentlysplitting) { value.Invcount += newInvCount; } else { value.Invcount += sellableItem.m_stack; } } else { value.Invcount = newInvCount; } dictionary[((Object)sellableItem.m_dropPrefab).name] = value; string contents = YMLParser.Serializers(dictionary); string configPath2 = Paths.ConfigPath; directorySeparatorChar = Path.DirectorySeparatorChar; File.WriteAllText(configPath2 + directorySeparatorChar + "trader_config.yaml", contents); } else { ItemDataEntry value2 = default(ItemDataEntry); value2.Invcount += sellableItem.m_stack; value2.ItemCount += sellableItem.m_stack; Dictionary<string, ItemDataEntry> dictionary2 = new Dictionary<string, ItemDataEntry>(); dictionary2.Add(((Object)sellableItem.m_dropPrefab).name, value2); string s = YMLParser.Serializers(dictionary2); YMLParser.AppendYmLfile(s); } break; case Utilities.ConnectionState.Unknown: break; } } internal async Task LogSales(string saleinfo) { await WriteSales(saleinfo).ConfigureAwait(continueOnCapturedContext: false); } private static async Task WriteSales(string saleInfo) { UnicodeEncoding encoding = new UnicodeEncoding(); string path = Paths.ConfigPath + "/TraderSales.log"; byte[] bytes = encoding.GetBytes(saleInfo); using FileStream sourceStream = File.Open(path, FileMode.OpenOrCreate); sourceStream.Seek(0L, SeekOrigin.End); await sourceStream.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(continueOnCapturedContext: false); await sourceStream.WriteAsync(encoding.GetBytes(Environment.NewLine), 0, Environment.NewLine.Length).ConfigureAwait(continueOnCapturedContext: false); } public void AddItemToDict(ItemDrop itemDrop, int price, int stack, int invCount) { _storeInventory.Add(itemDrop, new StoreInfo<int, int, int>(price, stack, invCount)); } private bool RemoveItemFromDict(ItemDrop itemDrop) { Dictionary<string, ItemDataEntry> dictionary = new Dictionary<string, ItemDataEntry>(); foreach (KeyValuePair<ItemDrop, StoreInfo<int, int, int>> item in _storeInventory) { ItemDataEntry value = default(ItemDataEntry); value.Invcount = item.Value.InvCount; value.ItemCount = item.Value.Stack; value.ItemCostInt = item.Value.Cost; dictionary.Add(((Object)item.Key).name, value); } global::Trader20.Trader20.TraderConfig.Value = dictionary; return _storeInventory.Remove(itemDrop); } private int FindIndex(ItemDrop itemDrop) { List<ItemDrop> list = _storeInventory.Keys.ToList(); return list.IndexOf(itemDrop); } public void UpdateGenDescription(ElementFormat element) { ((Component)SelectedItemDescription_TMP).gameObject.SetActive(true); ((Component)ItemDropIcon).gameObject.SetActive(true); ((TMP_Text)SelectedItemDescription_TMP).SetText(element.ItemObject.GetComponent<ItemDrop>().m_itemData.m_shared.m_description); ((Component)SelectedItemDescription_TMP).gameObject.AddComponent<Localize>(); ItemDropIcon.sprite = element.Icon; tempElement = element; } public void DisableGenDescription() { ((Component)SelectedItemDescription_TMP).gameObject.SetActive(false); ((Component)ItemDropIcon).gameObject.SetActive(false); tempElement = null; } public void UpdateCoins() { ((TMP_Text)SelectedCost_TMP).SetText(GetPlayerCoins().ToString()); } public void BuyButtonAction() { try { if (!((Object)(object)tempElement?.ItemObject == (Object)null)) { int i = FindIndex(tempElement.ItemObject.GetComponent<ItemDrop>()); if (CanBuy(i)) { SellItem(i); NewTrader.instance.OnSold(); UpdateCoins(); } } } catch (Exception ex) { global::Trader20.Trader20.knarrlogger.LogDebug((object)ex); } } private bool CanBuy(int i) { int playerCoins = GetPlayerCoins(); int cost = _storeInventory.ElementAt(i).Value.Cost; if (playerCoins < cost) { return false; } ((Humanoid)Player.m_localPlayer).GetInventory().RemoveItem(ObjectDB.instance.GetItemPrefab(global::Trader20.Trader20.CurrencyPrefabName?.Value).GetComponent<ItemDrop>().m_itemData.m_shared.m_name, cost, -1, true); return true; } public void Hide() { m_StorePanel.SetActive(false); } public void Show() { if (_storeInventory.Count <= 0) { global::Trader20.Trader20.knarrlogger.LogWarning((object)"Store is empty not showing UI"); return; } m_StorePanel.SetActive(true); ClearStore(); if (_knarSellElements.Count >= 1) { UpdateGenDescription(_knarSellElements[0]); int? inventoryCount = _knarSellElements[0].InventoryCount; if (inventoryCount.HasValue) { int valueOrDefault = inventoryCount.GetValueOrDefault(); if (valueOrDefault >= 1) { ((TMP_Text)InventoryCount_TMP).SetText(_storeInventory.ElementAt(0).Value.InvCount.ToString()); } else { InvCountPanel.SetActive(false); } } } UpdateCoins(); } public void SetBuyBool() { if (SellPageActive) { SellPageActive = false; } BuyPageActive = true; } public void SetSellBool() { if (BuyPageActive) { BuyPageActive = false; } SellPageActive = true; } public void SelectKnarrFirstItemForDisplay() { if (_knarSellElements.Count > 0) { UpdateGenDescription(_knarSellElements[0]); } } public void SelectPlayerFirstItemForDisplay() { if (_playerSellElements.Count <= 0) { return; } int count = _playerSellElements.Count; if (count < 1) { if (count == 0) { DisableGenDescription(); } } else { UpdateGenDescription(_playerSellElements[0]); } } private static GameObject CurrentCurrency() { return ZNetScene.instance.GetPrefab(global::Trader20.Trader20.CurrencyPrefabName.Value); } private static int GetPlayerCoins() { return ((Humanoid)Player.m_localPlayer).GetInventory().CountItems(CurrentCurrency().GetComponent<ItemDrop>().m_itemData.m_shared.m_name, -1, true); } public void DumpDict() { _storeInventory.Clear(); } internal int RollTheDice() { int num = 0; int num2 = 0; for (int i = 0; i <= 20; i++) { num = Random.Range(0, 6); } return num + 1; } public async void FillPlayerItemListVoid() { await FillPlayerSaleList().ConfigureAwait(continueOnCapturedContext: true); } private Task FillPlayerSaleList() { SetupPlayerItemListTask(); return Task.CompletedTask; } private void SetupPlayerItemListTask() { Inventory inventory = ((Humanoid)Player.m_localPlayer).GetInventory(); List<ItemData> allItems = inventory.GetAllItems(); m_tempItems = allItems; if (_playerSellElements.Count() > 0) { foreach (ElementFormat playerSellElement in _playerSellElements) { ReturnPooledElement(playerSellElement); } _playerSellElements.Clear(); } foreach (ItemData tempItem in m_tempItems) { if (YMLContainsKey(((Object)tempItem.m_dropPrefab).name) && ReturnYMLPlayerPurchaseValue(((Object)tempItem.m_dropPrefab).name) != 0) { AddItemToDisplayList(tempItem.m_dropPrefab, tempItem.m_stack, ReturnYMLPlayerPurchaseValue(((Object)tempItem.m_dropPrefab).name), tempItem.m_stack, SellListRoot, isPlayerItem: true); } } } public void OnBuyItem() { Inventory inventory = ((Humanoid)Player.m_localPlayer).GetInventory(); ElementFormat elementFormat = tempElement; ItemData item = inventory.GetItem((elementFormat == null) ? null : elementFormat.ItemObject.GetComponent<ItemDrop>()?.m_itemData?.m_shared.m_name, -1, false); if (item == null) { return; } if (item.m_stack > 1) { ShowSplitDialog(item); } else { int num = ReturnYMLPlayerPurchaseValue(((Object)item.m_dropPrefab).name) * item.m_stack; if (((Humanoid)Player.m_localPlayer).GetInventory().RemoveItem(item)) { ((Humanoid)Player.m_localPlayer).GetInventory().AddItem(((Object)CurrentCurrency()).name, num, CurrentCurrency().GetComponent<ItemDrop>().m_itemData.m_quality, CurrentCurrency().GetComponent<ItemDrop>().m_itemData.m_variant, 0L, "", false); string text = ""; text = ((item.m_stack <= 1) ? item.m_shared.m_name : (item.m_stack + "x" + item.m_shared.m_name)); ((Character)Player.m_localPlayer).Message((MessageType)1, Localization.instance.Localize("$msg_sold", new string[2] { text, num.ToString() }), num, item.m_shared.m_icons[0]); Gogan.LogEvent("Game", "SoldItem", text, 0L); UpdateYmlFileFromSaleOrBuy(item, item.m_stack, isPlayerItem: true); } int num2 = FindIndex(item.m_dropPrefab.GetComponent<ItemDrop>()); if (!global::Trader20.Trader20.LOGStoreSales.Value) { return; } string text2 = Player.m_localPlayer.GetPlayerID().ToString(); string text3 = Player.m_localPlayer.GetPlayerName() ?? throw new ArgumentNullException("i"); EnvMan val = EnvMan.instance; DateTime dateTime = DateTime.Now; string text4 = ""; switch (Utilities.GetConnectionState()) { case Utilities.ConnectionState.Server: if (Object.op_Implicit((Object)(object)val)) { float smoothDayFraction2 = val.m_smoothDayFraction; int num5 = (int)(smoothDayFraction2 * 24f); int num6 = (int)((smoothDayFraction2 * 24f - (float)num5) * 60f); int second2 = (int)(((smoothDayFraction2 * 24f - (float)num5) * 60f - (float)num6) * 60f); DateTime now2 = DateTime.Now; dateTime = new DateTime(now2.Year, now2.Month, now2.Day, num5, num6, second2); int currentDay2 = EnvMan.instance.GetCurrentDay(); } text4 = "[" + dateTime.ToString() + "] " + text2 + " - " + text3 + " Sold: " + Localization.instance.Localize(item.m_shared.m_name) + " For: " + num; Gogan.LogEvent("Game", "Knarr Bought Item", text4, 0L); ZLog.Log((object)("Knarr Bought Item " + text4)); LogSales(text4).ConfigureAwait(continueOnCapturedContext: false); break; case Utilities.ConnectionState.Client: ZRoutedRpc.instance.InvokeRoutedRPC("SendLogItemToServer", new object[2] { ((Object)item.m_dropPrefab).name, num }); break; case Utilities.ConnectionState.Local: if (Object.op_Implicit((Object)(object)val)) { float smoothDayFraction = val.m_smoothDayFraction; int num3 = (int)(smoothDayFraction * 24f); int num4 = (int)((smoothDayFraction * 24f - (float)num3) * 60f); int second = (int)(((smoothDayFraction * 24f - (float)num3) * 60f - (float)num4) * 60f); DateTime now = DateTime.Now; dateTime = new DateTime(now.Year, now.Month, now.Day, num3, num4, second); int currentDay = EnvMan.instance.GetCurrentDay(); text4 = "[" + dateTime.ToString() + "] " + text2 + " - " + text3 + " Purchased: " + Localization.instance.Localize(item.m_shared.m_name) + " For: " + num; Gogan.LogEvent("Game", "Knarr Bought Item", text4, 0L); ZLog.Log((object)("Knarr Bought Item " + text4)); LogSales(text4).ConfigureAwait(continueOnCapturedContext: false); } break; } ClearStore(); int count = _playerSellElements.Count; if (count > 0) { UpdateGenDescription(_playerSellElements[0]); } else { DisableGenDescription(); } } UpdateCoins(); } private int ReturnYMLPlayerPurchaseValue(string s) { Dictionary<string, ItemDataEntry> dictionary = new Dictionary<string, ItemDataEntry>(); switch (Utilities.GetConnectionState()) { case Utilities.ConnectionState.Server: { string configPath2 = Paths.ConfigPath; char directorySeparatorChar = Path.DirectorySeparatorChar; StreamReader streamReader = File.OpenText(configPath2 + directorySeparatorChar + "trader_config.yaml"); dictionary = YMLParser.ReadSerializedData(streamReader.ReadToEnd()); streamReader.Close(); return dictionary[s].PurchaseFromPlayerCost; } case Utilities.ConnectionState.Client: return global::Trader20.Trader20.TraderConfig.Value[s].PurchaseFromPlayerCost; case Utilities.ConnectionState.Local: { string configPath = Paths.ConfigPath; char directorySeparatorChar = Path.DirectorySeparatorChar; StreamReader streamReader = File.OpenText(configPath + directorySeparatorChar + "trader_config.yaml"); dictionary = YMLParser.ReadSerializedData(streamReader.ReadToEnd()); streamReader.Close(); return dictionary[s].PurchaseFromPlayerCost; } default: return 0; } } private bool YMLContainsKey(string s) { Dictionary<string, ItemDataEntry> dictionary = new Dictionary<string, ItemDataEntry>(); switch (Utilities.GetConnectionState()) { case Utilities.ConnectionState.Server: { string configPath2 = Paths.ConfigPath; char directorySeparatorChar = Path.DirectorySeparatorChar; StreamReader streamReader = File.OpenText(configPath2 + directorySeparatorChar + "trader_config.yaml"); dictionary = YMLParser.ReadSerializedData(streamReader.ReadToEnd()); streamReader.Close(); return dictionary.ContainsKey(s); } case Utilities.ConnectionState.Client: if (global::Trader20.Trader20.TraderConfig.Value.ContainsKey(s)) { return true; } break; case Utilities.ConnectionState.Local: { string configPath = Paths.ConfigPath; char directorySeparatorChar = Path.DirectorySeparatorChar; StreamReader streamReader = File.OpenText(configPath + directorySeparatorChar + "trader_config.yaml"); dictionary = YMLParser.ReadSerializedData(streamReader.ReadToEnd()); streamReader.Close(); return dictionary.ContainsKey(s); } } return false; } private void SetActiveSelection() { int num = 0; foreach (ElementFormat knarSellElement in _knarSellElements) { num++; if (num == currentIdx) { ((Component)knarSellElement.Element.gameObject.transform.Find("selected")).gameObject.SetActive(true); } ((Component)knarSellElement.Element.gameObject.transform.Find("selected")).gameObject.SetActive(false); } num = 0; } private void UpdateRecipeGamepadInput() { if (BuyPageActive) { if (ZInput.GetButtonDown("JoyLStickDown")) { currentIdx++; if (currentIdx >= _knarSellElements.Count) { currentIdx = _knarSellElements.Count - 1; } if (_knarSellElements.Count >= 1) { UpdateGenDescription(_knarSellElements[currentIdx]); SetActiveSelection(); } } if (ZInput.GetButtonDown("JoyLStickUp")) { currentIdx--; if (currentIdx <= 0) { currentIdx = 0; } if (_knarSellElements.Count >= 1) { UpdateGenDescription(_knarSellElements[currentIdx]); SetActiveSelection(); } } if (ZInput.GetButtonDown("JoyTabRight")) { SetSellBool(); SelectPlayerFirstItemForDisplay(); } } else { if (!SellPageActive) { return; } if (ZInput.GetButtonDown("JoyLStickDown")) { currentIdx++; if (currentIdx >= _playerSellElements.Count) { currentIdx = _playerSellElements.Count - 1; } if (_playerSellElements.Count >= 1) { UpdateGenDescription(_playerSellElements[currentIdx]); SetActiveSelection(); } } if (ZInput.GetButtonDown("JoyLStickUp")) { currentIdx--; if (currentIdx <= 0) { currentIdx = 0; } if (_playerSellElements.Count >= 1) { UpdateGenDescription(_playerSellElements[currentIdx]); SetActiveSelection(); } } if (ZInput.GetButtonDown("JoyTabLeft")) { SetBuyBool(); SelectKnarrFirstItemForDisplay(); } } } [UsedImplicitly] internal void BuildKnarrSplitDialog() { //IL_02bd: Unknown result type (might be due to invalid IL or missing references) //IL_02c7: Expected O, but got Unknown //IL_02d9: Unknown result type (might be due to invalid IL or missing references) //IL_02e3: Expected O, but got Unknown //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Expected O, but got Unknown //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Expected O, but got Unknown if (API.IsLoaded()) { splitDiagGO = Object.Instantiate<GameObject>(((Component)gui.m_splitPanel).gameObject, ((Component)this).transform, false); m_splitPanel = splitDiagGO.transform; m_splitIcon = ((Component)splitDiagGO.transform.Find("Dialog/InventoryElement/icon")).gameObject.GetComponent<Image>(); m_splitSlider = splitDiagGO.GetComponentInChildren<Slider>(); m_splitCancelButton = ((Component)splitDiagGO.transform.Find("Dialog/ButtonCancel")).gameObject.GetComponent<Button>(); m_splitOkButton = ((Component)splitDiagGO.transform.Find("Dialog/ButtonOk")).gameObject.GetComponent<Button>(); m_splitIconName = ((Component)splitDiagGO.transform.Find("Dialog/InventoryElement/DummyText")).gameObject.GetComponent<Text>(); m_splitAmount = ((Component)splitDiagGO.transform.Find("Dialog/InventoryElement/amount")).gameObject.GetComponent<Text>(); ((Component)splitDiagGO.transform.Find("Dialog/Background")).gameObject.GetComponent<Image>().sprite = Resources.FindObjectsOfTypeAll<Sprite>().ToList().Find([<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(0)] (Sprite x) => ((Object)x).name == "Background"); ((UnityEvent)m_splitCancelButton.onClick).AddListener((UnityAction)delegate { OnSplitCancel(); }); ((UnityEvent)m_splitOkButton.onClick).AddListener((UnityAction)delegate { OnSplitOK(); }); ((UnityEvent<float>)(object)m_splitSlider.onValueChanged).AddListener((UnityAction<float>)delegate(float val) { OnSplitSliderChanged(val); }); } else { splitDiagGO = Object.Instantiate<GameObject>(((Component)gui.m_splitPanel).gameObject, ((Component)this).transform, false); m_splitPanel = splitDiagGO.transform; m_splitIcon = ((Component)splitDiagGO.transform.Find("win_bkg/Icon_bkg/Icon")).gameObject.GetComponent<Image>(); m_splitSlider = splitDiagGO.GetComponentInChildren<Slider>(); m_splitCancelButton = ((Component)splitDiagGO.transform.Find("win_bkg/Button_cancel")).gameObject.GetComponent<Button>(); m_splitOkButton = ((Component)splitDiagGO.transform.Find("win_bkg/Button_ok")).gameObject.GetComponent<Button>(); m_splitIconName = ((Component)splitDiagGO.transform.Find("win_bkg/Icon_bkg/res_name")).gameObject.GetComponent<Text>(); m_splitAmount = ((Component)splitDiagGO.transform.Find("win_bkg/amount")).gameObject.GetComponent<Text>(); ((UnityEvent)m_splitCancelButton.onClick).AddListener((UnityAction)delegate { OnSplitCancel(); }); ((UnityEvent)m_splitOkButton.onClick).AddListener((UnityAction)delegate { OnSplitOK(); }); ((UnityEvent<float>)(object)m_splitSlider.onValueChanged).AddListener((UnityAction<float>)delegate(float val) { OnSplitSliderChanged(val); }); } } private void OnSplitCancel() { m_splitItem = null; iscurrentlysplitting = false; ((Component)m_splitPanel).gameObject.SetActive(false); } private void OnSplitSliderChanged(float value) { Text splitAmount = m_splitAmount; string text = ((int)value).ToString(); string text2 = ((int)m_splitSlider.maxValue).ToString(); string text3 = text + "/" + text2; splitAmount.text = text3; } private void ShowSplitDialog(ItemData item) { int num = (Input.GetKey((KeyCode)306) ? 1 : (Input.GetKey((KeyCode)305) ? 1 : 0)); m_splitSlider.minValue = 1f; m_splitSlider.maxValue = item.m_stack; if (num == 0) { m_splitSlider.value = Mathf.CeilToInt((float)item.m_stack / 2f); } else if ((double)m_splitSlider.value / (double)item.m_stack > 0.5) { m_splitSlider.value = Mathf.Min(m_splitSlider.value, (float)item.m_stack); } m_splitIcon.sprite = item.GetIcon(); m_splitIconName.text = Localization.instance.Localize(item.m_shared.m_name); ((Component)m_splitPanel).gameObject.SetActive(true); m_splitItem = item; iscurrentlysplitting = true; OnSplitSliderChanged(m_splitSlider.value); } private void UpdateSplitDialog() { if (!((Component)m_splitSlider).gameObject.activeInHierarchy) { return; } for (int i = 0; i < 10; i++) { if (Input.GetKeyDown((KeyCode)(256 + i)) || Input.GetKeyDown((KeyCode)(48 + i))) { if (m_lastSplitInput + TimeSpan.FromSeconds(m_splitNumInputTimeoutSec) < DateTime.Now) { m_splitInput = ""; } m_lastSplitInput = DateTime.Now; m_splitInput += i; if (int.TryParse(m_splitInput, out var result)) { m_splitSlider.value = Mathf.Clamp((float)result, 1f, m_splitSlider.maxValue); OnSplitSliderChanged(m_splitSlider.value); } } } if (Input.GetKeyDown((KeyCode)276) && (double)m_splitSlider.value > 1.0) { Slider splitSlider = m_splitSlider; float value = splitSlider.value - 1f; splitSlider.value = value; OnSplitSliderChanged(m_splitSlider.value); } if (Input.GetKeyDown((KeyCode)275) && (double)m_splitSlider.value < (double)m_splitSlider.maxValue) { Slider splitSlider2 = m_splitSlider; float value = splitSlider2.value + 1f; splitSlider2.value = value; OnSplitSliderChanged(m_splitSlider.value); } if (Input.GetKeyDown((KeyCode)271) || Input.GetKeyDown((KeyCode)13)) { OnSplitOK(); } } private void OnSplitOK() { int num = (int)((float)ReturnYMLPlayerPurchaseValue(((Object)m_splitItem.m_dropPrefab).name) * m_splitSlider.value); ((Humanoid)Player.m_localPlayer).GetInventory().RemoveItem(m_splitItem, (int)m_splitSlider.value); ((Humanoid)Player.m_localPlayer).GetInventory().AddItem(((Object)CurrentCurrency()).name, num, CurrentCurrency().GetComponent<ItemDrop>().m_itemData.m_quality, CurrentCurrency().GetComponent<ItemDrop>().m_itemData.m_variant, 0L, "", false); string text = ""; text = ((m_splitItem.m_stack <= 1) ? m_splitItem.m_shared.m_name : (m_splitItem.m_stack + "x" + m_splitItem.m_shared.m_name)); ((Character)Player.m_localPlayer).Message((MessageType)1, Localization.instance.Localize("$msg_sold", new string[2] { text, m_splitSlider.value.ToString() }), (int)m_splitSlider.value, m_splitItem.m_shared.m_icons[0]); Gogan.LogEvent("Game", "SoldItem", text, 0L); UpdateYmlFileFromSaleOrBuy(m_splitItem, (int)m_splitSlider.value, isPlayerItem: true); ClearStore(); int count = _playerSellElements.Count; if (count > 0) { UpdateGenDescription(_playerSellElements[0]); } else { DisableGenDescription(); } ((Component)m_splitPanel).gameObject.SetActive(false); iscurrentlysplitting = false; UpdateCoins(); } } [Serializable] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(0)] [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(1)] public class StoreInfo<[<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] ItemCost, [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] ItemStack, [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] ItemInventoryCount> { public ItemCost Cost { get; set; } public ItemStack Stack { get; set; } public ItemInventoryCount InvCount { get; set; } public StoreInfo(ItemCost cost, ItemStack stack, ItemInventoryCount count) { Cost = cost; Stack = stack; InvCount = count; } } namespace Trader20 { [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(1)] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(0)] public class YMLParser { public static string Serializers(Dictionary<string, ItemDataEntry> data) { ISerializer serializer = new SerializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build(); return serializer.Serialize(data); } public static Dictionary<string, ItemDataEntry> ReadSerializedData(string s) { IDeserializer deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build(); return deserializer.Deserialize<Dictionary<string, ItemDataEntry>>(s); } internal static bool CheckForEntry(Dictionary<string, ItemDataEntry> dataEntries, string keyName) { return dataEntries.ContainsKey(keyName); } internal static void AppendYmLfile(string s) { string configPath = Paths.ConfigPath; char directorySeparatorChar = Path.DirectorySeparatorChar; string path = configPath + directorySeparatorChar + "trader_config.yaml"; using StreamWriter streamWriter = File.AppendText(path); streamWriter.WriteLine(s); } } public struct ItemDataEntry { [YamlMember(Alias = "cost", ApplyNamingConventions = false)] public int ItemCostInt { get; set; } [YamlMember(Alias = "stack", ApplyNamingConventions = false)] public int ItemCount { get; set; } [YamlMember(Alias = "inventory count", ApplyNamingConventions = false)] public int Invcount { get; set; } [YamlMember(Alias = "purchase price", ApplyNamingConventions = false)] public int PurchaseFromPlayerCost { get; set; } } [BepInDependency(/*Could not decode attribute arguments.*/)] [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(2)] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(0)] [BepInPlugin("com.zarboz.KnarrTheTrader", "KnarrTheTrader", "0.5.2")] public class Trader20 : BaseUnityPlugin { [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(1)] private const string ModName = "KnarrTheTrader"; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(1)] public const string ModVersion = "0.5.2"; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(1)] private const string ModGUID = "com.zarboz.KnarrTheTrader"; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(1)] internal static ConfigSync configSync = new ConfigSync("com.zarboz.KnarrTheTrader") { DisplayName = "KnarrTheTrader", CurrentVersion = "0.5.2", MinimumRequiredVersion = "0.5.2", ModRequired = true }; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(1)] public static readonly CustomSyncedValue<Dictionary<string, ItemDataEntry>> TraderConfig = new CustomSyncedValue<Dictionary<string, ItemDataEntry>>(configSync, "trader config", new Dictionary<string, ItemDataEntry>()); internal static GameObject Knarr; internal static GameObject CustomTraderScreen; internal static Sprite Coins; internal static ConfigEntry<bool> _serverConfigLocked; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(new byte[] { 2, 1 })] internal static ConfigEntry<string> CurrencyPrefabName; internal static ConfigEntry<Vector3> StoreScreenPos; internal static ConfigEntry<bool> RandomlySpawnKnarr; internal static ConfigEntry<bool> LOGStoreSales; internal static ConfigEntry<bool> OnlySellKnownItems; internal static ConfigEntry<int> LuckyNumber; internal static ConfigEntry<bool> ShowMatsWhenHidingRecipes; internal static ConfigEntry<bool> ConfigWriteSalesBuysToYml; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(new byte[] { 2, 1 })] internal static ConfigEntry<string> BuyPageLocalization; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(new byte[] { 2, 1 })] internal static ConfigEntry<string> SellPageLocalization; internal static ConfigEntry<bool> ConfigShowTabs; internal static ConfigEntry<bool> ConfigShowRepair; internal static ConfigEntry<bool> KnarrPlaySound; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(1)] internal static ManualLogSource knarrlogger = new ManualLogSource("KnarrTheTrader"); [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(1)] [field: <a546a844-44b5-4146-be53-ef59919185cc>Nullable(1)] private static Dictionary<string, ItemDataEntry> entry_ { [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(1)] get; [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(1)] set; } = null; internal static AssetBundle AssetBundle { get; private set; } [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(1)] private ConfigEntry<T> config<[<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] T>(string group, string configName, T value, ConfigDescription description, bool synchronizedSetting = true) { ConfigEntry<T> val = ((BaseUnityPlugin)this).Config.Bind<T>(group, configName, value, description); SyncedConfigEntry<T> syncedConfigEntry = configSync.AddConfigEntry<T>(val); syncedConfigEntry.SynchronizedConfig = synchronizedSetting; return val; } [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(1)] private ConfigEntry<T> config<[<a546a844-44b5-4146-be53-ef59919185cc>Nullable(2)] T>(string group, string configName, T value, string description, bool synchronizedSetting = true) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown return config(group, configName, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty<object>()), synchronizedSetting); } public void Awake() { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Expected O, but got Unknown knarrlogger = ((BaseUnityPlugin)this).Logger; Assembly executingAssembly = Assembly.GetExecutingAssembly(); Harmony val = new Harmony("com.zarboz.KnarrTheTrader"); val.PatchAll(executingAssembly); AssetBundle = Utilities.LoadAssetBundle("traderbundle"); _serverConfigLocked = config("General", "Lock Configuration", value: false, "Lock Configuration"); configSync.AddLockingConfigEntry<bool>(_serverConfigLocked); string configPath = Paths.ConfigPath; char directorySeparatorChar = Path.DirectorySeparatorChar; if (!File.Exists(configPath + directorySeparatorChar + "trader_config.yaml")) { string configPath2 = Paths.ConfigPath; directorySeparatorChar = Path.DirectorySeparatorChar; File.Create(configPath2 + directorySeparatorChar + "trader_config.yaml").Close(); } ReadYamlConfigFile(null, null); TraderConfig.ValueChanged += OnValChangUpdateStore; CurrencyPrefabName = config("General", "Config Prefab Name", "Coins", "This is the prefab name for the currency that Knarr uses in his trades"); StoreScreenPos = config<Vector3>("General", "Position Of Trader Prefab On Screen", Vector3.zero, "This is the location on screen of the traders for sale screen", synchronizedSetting: false); RandomlySpawnKnarr = config("General", "Should Knarr randomly spawn around your BRAND NEW world?", value: false, "Whether or not knarr should spawn using locationsystem on fresh worlds"); LOGStoreSales = config("General", "Log what/when/to whom knarr sells things", value: false, "This is to log when a player buys an item from Knarr and in what volume"); OnlySellKnownItems = config("General", "Only sell known recipes and materials", value: false, "If set true Knarr will only vend a player recipes and materials the player has discovered already"); ShowMatsWhenHidingRecipes = config("General", "Sell ALL Materials when hiding unknown recipes", value: false, "If set true Knarr will still vend ALL materials"); ConfigWriteSalesBuysToYml = config("General", "Change the YML file on sells/buys", value: true, "If set true Knarr will edit the values in the YML file when a player buys or sells items to him"); LuckyNumber = config("General", "Lucky Number for repairs", 6, new ConfigDescription("This is the lucky number for your repair button if you roll this number your repairs will go through", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 6), Array.Empty<object>())); BuyPageLocalization = config("Localization", "Buy Page Tab", "Buy", "The Translation for the Buy Page Tab"); SellPageLocalization = config("Localization", "Sell Page Tab", "Sell", "The Translation for the Sell Page Tab"); ConfigShowTabs = config("General", "Show the Buy/Sell tabs", value: true, "This is the setting to enable/disable the selling interface"); ConfigShowRepair = config("General", "Show the Repair Icon", value: true, "This is the setting to enable/disable showing of the repair icon"); KnarrPlaySound = config("General", "Should Knarr play his audio?", value: true, "This is the setting to enable/disable the audio playback when walking up to knarr"); SetupWatcher(); if (LOGStoreSales.Value) { string configPath3 = Paths.ConfigPath; directorySeparatorChar = Path.DirectorySeparatorChar; if (!File.Exists(configPath3 + directorySeparatorChar + "TraderSales.log")) { string configPath4 = Paths.ConfigPath; directorySeparatorChar = Path.DirectorySeparatorChar; File.Create(configPath4 + directorySeparatorChar + "TraderSales.log"); } } Game.isModded = true; } private static void OnValChangUpdateStore() { if (!Object.op_Implicit((Object)(object)ObjectDB.instance) || ObjectDB.instance.m_items.Count <= 0 || (Object)(object)ObjectDB.instance.GetItemPrefab("Wood") == (Object)null) { return; } OdinStore.instance.DumpDict(); foreach (KeyValuePair<string, ItemDataEntry> item in TraderConfig.Value) { GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(item.Key); ItemDrop val = null; if (Object.op_Implicit((Object)(object)itemPrefab)) { val = itemPrefab.GetComponent<ItemDrop>(); if ((Object)(object)val == (Object)null) { knarrlogger.LogError((object)("Failed to load ItemDrop for trader's item: " + item.Key)); continue; } OdinStore.instance.AddItemToDict(val, item.Value.ItemCostInt, item.Value.ItemCount, item.Value.Invcount); } if (!Object.op_Implicit((Object)(object)itemPrefab)) { knarrlogger.LogError((object)("Failed to load trader's item: " + item.Key)); knarrlogger.LogError((object)("Please Check your Prefab name " + item.Key)); } } if ((Object)(object)OdinStore.instance != (Object)null) { OdinStore.instance.ClearStore(); } } private void SetupWatcher() { FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(Paths.ConfigPath, "trader_config.yaml"); fileSystemWatcher.Changed += ReadYamlConfigFile; fileSystemWatcher.Created += ReadYamlConfigFile; fileSystemWatcher.Renamed += ReadYamlConfigFile; fileSystemWatcher.IncludeSubdirectories = true; fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject; fileSystemWatcher.EnableRaisingEvents = true; } [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(1)] private void ReadYamlConfigFile(object sender, FileSystemEventArgs e) { try { string configPath = Paths.ConfigPath; char directorySeparatorChar = Path.DirectorySeparatorChar; StreamReader streamReader = File.OpenText(configPath + directorySeparatorChar + "trader_config.yaml"); entry_ = YMLParser.ReadSerializedData(streamReader.ReadToEnd()); streamReader.Close(); TraderConfig.AssignLocalValue(entry_); } catch { knarrlogger.LogError((object)"There was an issue loading your trader_config.yaml"); knarrlogger.LogError((object)"Please check your config entries for spelling and format!"); } } internal void SaveConfig() { ((BaseUnityPlugin)this).Config.Save(); } } public class Patches { [HarmonyPatch(typeof(ZNetScene), "Awake")] public static class ZNetPatch { [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(1)] [UsedImplicitly] public static void Prefix(ZNetScene __instance) { if (__instance.m_prefabs.Count > 0) { Utilities.LoadAssets(Trader20.AssetBundle, __instance); Trader20.Knarr = __instance.GetPrefab("Knarr"); } } } [HarmonyPatch(typeof(Game), "Start")] public static class RegisterRPCPatch { [UsedImplicitly] [HarmonyPostfix] public static void Postfix() { ZRoutedRpc.instance.Register<bool>("RemoveKnarrDone", (Action<long, bool>)RPC_RemoveKnarrResponse); ZRoutedRpc.instance.Register<bool>("RequestRemoveKnarr", (Action<long, bool>)RPC_RemoveKnarrReq); ZRoutedRpc.instance.Register<bool>("FindKnarrDone", (Action<long, bool>)RPC_FindKnarrResponse); ZRoutedRpc.instance.Register<Vector3>("SetKnarrMapPin", (Action<long, Vector3>)RPC_SetKnarrMapIcon); ZRoutedRpc.instance.Register<string, int, bool>("SendItemInfoToServer", (Action<long, string, int, bool>)RPC_ServerRecvItemInfo); ZRoutedRpc.instance.Register<string, int>("SendLogItemToServer", (Action<long, string, int>)RPC_SendSaleLogInfoToServer); ZRoutedRpc.instance.Register("DumpAllLoadedItemsReq", (Action<long>)RPC_DumpAllLoadedItemsToYamlReq); ZRoutedRpc.instance.Register<bool>("DumpAllLoadedItems", (Action<long, bool>)RPC_DumpAllLoadedItemsToYaml); } } [HarmonyPatch(typeof(FejdStartup), "SetupGui")] public static class TestPatch { [HarmonyPostfix] [UsedImplicitly] public static void Postfix() { Localization.instance.AddWord("BuyPage", Trader20.BuyPageLocalization?.Value); Localization.instance.AddWord("SellPage", Trader20.SellPageLocalization?.Value); } } [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(1)] [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(0)] [HarmonyPatch(typeof(StoreGui), "Awake")] [HarmonyAfter(new string[] { "randyknapp.mods.auga" })] public static class ItemListPatch { [Serializable] [CompilerGenerated] private sealed class <>c { [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(0)] public static readonly <>c <>9 = new <>c(); [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(0)] public static Predicate<Sprite> <>9__7_0; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(0)] public static Func<ItemData, bool> <>9__7_2; [<a546a844-44b5-4146-be53-ef59919185cc>Nullable(0)] public static UnityAction <>9__7_1; [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(0)] internal bool <Postfix>b__7_0(Sprite x) { return ((Object)x).name == "RepairButtonOver"; } internal void <Postfix>b__7_1() { if ((Object)(object)Player.m_localPlayer == (Object)null) { return; } ((Character)Player.m_localPlayer).Message((MessageType)1, "Rolling dice", 0, (Sprite)null); int num = OdinStore.instance.RollTheDice(); ((Character)Player.m_localPlayer).Message((MessageType)2, "Result is " + num, 0, (Sprite)null); if (num != Trader20.LuckyNumber.Value) { return; } ((Humanoid)Player.m_localPlayer).GetInventory().GetWornItems(m_wornItems); using IEnumerator<ItemData> enumerator = m_wornItems.Where([<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(0)] (ItemData itemData) => itemData.m_durability < itemData.GetMaxDurability()).GetEnumerator(); if (enumerator.MoveNext()) { ItemData current = enumerator.Current; current.m_durability = current.GetMaxDurability(); ((Character)Player.m_localPlayer).Message((MessageType)2, Localization.instance.Localize("$msg_repaired", new string[1] { current.m_shared.m_name }), 0, (Sprite)null); } } [<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(0)] internal bool <Postfix>b__7_2(ItemData itemData) { return itemData.m_durability < itemData.GetMaxDurability(); } } internal static bool AuguaSetupRan = false; internal static List<ItemData> m_wornItems = new List<ItemData>(); private static readonly Color Topleft = new Color(0.1254902f, 0.1019608f, 7f / 85f, 1f); private static readonly Color TopRight = new Color(0.282353f, 0.2352941f, 16f / 85f, 1f); private static readonly Color LowerLeft = new Color(0.1803922f, 0.1529412f, 0.1254902f, 1f); private static readonly Color LowerRight = new Color(0.3215686f, 0.2666667f, 0.2156863f, 1f); internal static UIGradient SetGradient(UIGradient gradient) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001e: 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) gradient.GradientType = UIGradient.UIGradientType.Corner; gradient.CornerColorUpperLeft = Topleft; gradient.CornerColorLowerLeft = LowerLeft; gradient.CornerColorLowerRight = LowerRight; gradient.CornerColorUpperRight = TopRight; return gradient; } public static void Postfix(StoreGui __instance) { //IL_0430: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01be: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_0655: Unknown result type (might be due to invalid IL or missing references) //IL_0629: Unknown result type (might be due to invalid IL or missing references) //IL_062e: Unknown result type (might be due to invalid IL or missing references) //IL_0634: Expected O, but got Unknown GameObject prefab = ZNetScene.instance.GetPrefab("CustomTrader"); if (Object.op_Implicit((Object)(object)prefab)) { if (API.IsLoaded()) { if (AuguaSetupRan) { return; } Trader20.CustomTraderScreen = Object.Instantiate<GameObject>(prefab, ((Component)((Component)__instance).GetComponent<Localize>()).transform.parent, false); Trader20.Coins = ZNetScene.instance.GetPrefab(Trader20.CurrencyPrefabName.Value).GetComponent<ItemDrop>().m_itemData.GetIcon(); Trader20.Coins = ZNetScene.instance.GetPrefab(Trader20.CurrencyPrefabName.Value).GetComponent<ItemDrop>().m_itemData.GetIcon(); Transform transform = Trader20.CustomTraderScreen.transform; RectTransform val = (RectTransform)(object)((transform is RectTransform) ? transform : null); val.anchoredPosition = Vector2.op_Implicit(Trader20.StoreScreenPos.Value); GameObject gameObject = ((Component)((Component)__instance).transform.Find("Store/AugaPanelBase/Background")).gameObject; Image component = gameObject.GetComponent<Image>(); OdinStore.instance.Bkg2.sprite = component.sprite; ((Graphic)OdinStore.instance.Bkg2).material = ((Graphic)component).material; ((Component)OdinStore.instance.Bkg2).gameObject.AddComponent<UIGradient>(); Image component2 = ((Component)((Component)__instance).transform.Find("Store/AugaPanelBase/Darken")).GetComponent<Image>(); OdinStore.instance.Bkg1.sprite = component2.sprite; ((Graphic)OdinStore.instance.Bkg1).material = ((Graphic)component2).material; OdinStore.instance.Coins.sprite = Trader20.Coins; ((Component)OdinStore.instance.Coins).transform.localPosition = new Vector3(-174.054f, 308.3599f, 0f); ((TMP_Text)OdinStore.instance.SelectedCost_TMP).transform.localPosition = new Vector3(-57.6711f, 324.26f, 0f); OdinStore.instance.InvCountPanel.transform.localPosition = new Vector3(200f, -175f, 0f); OdinStore.instance.BuyButtonImage.sprite = ((Component)((Component)__instance).transform.Find("Store/BuyButton/Image")).GetComponent<Image>().sprite; OdinStore.instance.SellButtonImage.sprite = OdinStore.instance.BuyButtonImage.sprite; ((Graphic)OdinStore.instance.SellButtonImage).material = ((Graphic)component).material; SetGradient(((Component)OdinStore.instance.RepairRect).gameObject.AddComponent<UIGradient>()); SetGradient(((Component)OdinStore.instance.repairImage).gameObject.AddComponent<UIGradient>()); SetGradient(((Component)((Component)OdinStore.instance.TabRect).transform.Find("BuyTab/BuyTabButton")).gameObject.AddComponent<UIGradient>()); SetGradient(((Component)((Component)OdinStore.instance.TabRect).transform.Find("SellTab/SellTabButton/Selected")).gameObject.AddComponent<UIGradient>()); SetGradient(((Component)((Component)OdinStore.instance.TabRect).transform.Find("SellTab/SellTabButton/Selected")).gameObject.GetComponent<UIGradient>()); SetGradient(((Component)((Component)OdinStore.instance.TabRect).transform.Find("SellTab/SellTabButton")).gameObject.AddComponent<UIGradient>()); SetGradient(((Component)OdinStore.instance.Bkg2).gameObject.GetComponent<UIGradient>()); OdinStore.instance.repairHammerImage.sprite = Resources.FindObjectsOfTypeAll<Sprite>().ToList().Find([<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(0)] (Sprite x) => ((Object)x).name == "RepairButtonOver"); OdinStore.instance.gui = ((Component)((Component)((Component)__instance).transform.parent).transform.Find("Inventory_screen")).gameObject.GetComponent<InventoryGui>(); OdinStore.instance.BuildKnarrSplitDialog(); AuguaSetupRan = true; } else { Sprite icon = ZNetScene.instance.GetPrefab(Trader20.CurrencyPrefabName.Value).GetComponent<ItemDrop>().m_itemData.GetIcon(); if ((Object)(object)icon == (Object)null) { Debug.LogError((object)"I cant locate your coin prefab please check the mod loading it or the spelling "); return; } Trader20.Coins = icon; Trader20.CustomTraderScreen = Object.Instantiate<GameObject>(prefab, ((Component)((Component)__instance).GetComponentInParent<Localize>()).transform, false); Transform transform2 = Trader20.CustomTraderScreen.transform; RectTransform val2 = (RectTransform)(object)((transform2 is RectTransform) ? transform2 : null); val2.anchoredPosition = __instance.m_listRoot.anchoredPosition; OdinStore.instance.Coins.sprite = Trader20.Coins; OdinStore.instance.BuyButtonImage.sprite = Object.Instantiate<Sprite>(((Component)((Component)__instance).transform.Find("Store/BuyButton")).GetComponent<Image>().sprite); OdinStore.instance.SellButtonImage.sprite = OdinStore.instance.BuyButtonImage.sprite; Image val3 = Object.Instantiate<Image>(((Component)((Component)__instance).transform.Find("Store/bkg")).GetComponent<Image>()); OdinStore.instance.Bkg1.sprite = val3.sprite; ((Graphic)OdinStore.instance.Bkg1).material = ((Graphic)val3).material; Image val4 = Object.Instantiate<Image>(((Component)((Component)__instance).transform.Find("Store/border (1)")).GetComponent<Image>()); OdinStore.instance.Bkg2.sprite = val4.sprite; ((Graphic)OdinStore.instance.Bkg2).material = ((Graphic)val4).material; GameObject val5 = Object.Instantiate<GameObject>(((Component)((Component)InventoryGui.instance).transform.Find("root/Crafting/RepairButton")).gameObject); Button component3 = val5.GetComponent<Button>(); Image component4 = ((Component)val5.transform.Find("Image")).gameObject.GetComponent<Image>(); Image component5 = ((Component)((Component)InventoryGui.instance).transform.Find("root/Crafting/RepairSimple")).gameObject.GetComponent<Image>(); ((Component)OdinStore.instance.RepairRect).gameObject.GetComponent<Image>().sprite = component5.sprite; ((Graphic)((Component)OdinStore.instance.RepairRect).gameObject.GetComponent<Image>()).material = ((Graphic)component5).material; OdinStore.instance.repairHammerImage.sprite = component4.sprite; ((Selectable)OdinStore.instance.repairButton).image.sprite = ((Selectable)component3).image.sprite; ButtonClickedEvent onClick = OdinStore.instance.repairButton.onClick; object obj = <>c.<>9__7_1; if (obj == null) { UnityAction val6 = delegate { if (!((Object)(object)Player.m_localPlayer == (Object)null)) { ((Character)Player.m_localPlayer).Message((MessageType)1, "Rolling dice", 0, (Sprite)null); int num = OdinStore.instance.RollTheDice(); ((Character)Player.m_localPlayer).Message((MessageType)2, "Result is " + num, 0, (Sprite)null); if (num == Trader20.LuckyNumber.Value) { ((Humanoid)Player.m_localPlayer).GetInventory().GetWornItems(m_wornItems); using IEnumerator<ItemData> enumerator3 = m_wornItems.Where([<6b3368ed-19e4-4b9e-87d4-a3d784686383>NullableContext(0)] (ItemData itemData) => itemData.m_durability < itemData.GetMaxDurability()).GetEnumerator(); if (enumerator3.MoveNext()) { ItemData current3 = enumerator3.Current; current3.m_durability = current3.GetMaxDurability(); ((Character)Player.m_localPlayer).Message((MessageType)2, Localization.instance.Localize("$msg_repaired", new string[1] { current3.m_shared.m_name }), 0, (Sprite)null); } } } }; <>c.<>9__7_1 = val6; obj = (object)val6; } ((UnityEvent)onClick).AddListener((UnityAction)obj); ((Selectable)OdinStore.instance.repairButton).transition = (Transition)2; ((Selectable)OdinStore.instance.repairButton).spriteState = ((Selectable)component3).spriteState; OdinStore.instance.gui = ((Component