Decompiled source of ExchangeItem v2.1.0

BepInEx/plugins/Hikaria.ExchangeItem/Hikaria.ExchangeItem.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using AIGraph;
using Agents;
using GameData;
using Gear;
using Hikaria.Core;
using Hikaria.Core.Components;
using Hikaria.Core.SNetworkExt;
using Hikaria.ExchangeItem.Features;
using Hikaria.ExchangeItem.Handlers;
using Hikaria.ExchangeItem.Managers;
using Il2CppInterop.Runtime.InteropTypes;
using LevelGeneration;
using Player;
using SNetwork;
using TheArchive.Core;
using TheArchive.Core.Attributes;
using TheArchive.Core.Attributes.Feature.Settings;
using TheArchive.Core.FeaturesAPI;
using TheArchive.Core.FeaturesAPI.Settings;
using TheArchive.Core.Localization;
using TheArchive.Interfaces;
using TheArchive.Loader;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyVersion("0.0.0.0")]
namespace Hikaria.ExchangeItem
{
	[ArchiveDependency(/*Could not decode attribute arguments.*/)]
	[ArchiveModule("Hikaria.ExchangeItem", "ExchangeItem", "2.1.0")]
	public class EntryPoint : IArchiveModule
	{
		public static EntryPoint Instance { get; private set; }

		public bool ApplyHarmonyPatches => false;

		public bool UsesLegacyPatches => false;

		public ArchiveLegacyPatcher Patcher { get; set; }

		public string ModuleGroup => FeatureGroup.op_Implicit(FeatureGroups.GetOrCreateModuleGroup("Exchange Item", new Dictionary<Language, string>
		{
			{
				(Language)0,
				"Exchange Item"
			},
			{
				(Language)1,
				"资源交换"
			}
		}));

		public void Init()
		{
			Instance = this;
			Logs.LogMessage("OK");
		}

		public void OnSceneWasLoaded(int buildIndex, string sceneName)
		{
		}

		public void OnLateUpdate()
		{
		}

		public void OnExit()
		{
		}
	}
	internal static class Logs
	{
		private static IArchiveLogger _logger;

		private static IArchiveLogger Logger => _logger ?? (_logger = LoaderWrapper.CreateLoggerInstance("Hikaria.ExchangeItem", ConsoleColor.White));

		public static void LogDebug(object data)
		{
			Logger.Debug(data.ToString());
		}

		public static void LogError(object data)
		{
			Logger.Error(data.ToString());
		}

		public static void LogInfo(object data)
		{
			Logger.Info(data.ToString());
		}

		public static void LogMessage(object data)
		{
			Logger.Msg(ConsoleColor.White, data.ToString());
		}

		public static void LogWarning(object data)
		{
			Logger.Warning(data.ToString());
		}

		public static void LogNotice(object data)
		{
			Logger.Notice(data.ToString());
		}

		public static void LogSuccess(object data)
		{
			Logger.Success(data.ToString());
		}

		public static void LogException(Exception ex)
		{
			Logger.Exception(ex);
		}
	}
	public static class PluginInfo
	{
		public const string GUID = "Hikaria.ExchangeItem";

		public const string NAME = "ExchangeItem";

		public const string VERSION = "2.1.0";
	}
}
namespace Hikaria.ExchangeItem.Managers
{
	public class ExchangeItemManager
	{
		private static readonly Version MinVersion = new Version(2, 0, 0);

		private static bool LastFlashLightStatus;

		private static SNetExt_Packet<pExchangeItemRequest> s_ExchangeItemRequestPacket;

		private static SNetExt_Packet<pExchangeItemFix> s_ExchangeItemFixPacket;

		public static bool MasterHasExchangeItem { get; private set; }

		public static void Setup()
		{
			CoreAPI.OnPlayerModsSynced += OnPlayerModsSynced;
			GameEventAPI.OnMasterChanged += OnMasterChanged;
			s_ExchangeItemRequestPacket = SNetExt_Packet<pExchangeItemRequest>.Create(typeof(pExchangeItemRequest).FullName, (Action<ulong, pExchangeItemRequest>)MasterDoExchangeItem, (Action<pExchangeItemRequest>)DoExchangeItemValidate, false, (SNet_ChannelType)2);
			s_ExchangeItemFixPacket = SNetExt_Packet<pExchangeItemFix>.Create(typeof(pExchangeItemFix).FullName, (Action<ulong, pExchangeItemFix>)ReceiveExchangeItemFix, (Action<pExchangeItemFix>)null, true, (SNet_ChannelType)2);
		}

		private static void OnPlayerModsSynced(SNet_Player player, IEnumerable<pModInfo> mods)
		{
			if (player.IsMaster)
			{
				MasterHasExchangeItem = mods.Any((pModInfo m) => m.GUID == "Hikaria.ExchangeItem" && m.Version >= MinVersion);
			}
		}

		private static void OnMasterChanged()
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			MasterHasExchangeItem = CoreAPI.IsPlayerInstalledMod(SNet.Master, "Hikaria.ExchangeItem", MinVersion);
		}

		private static void ReceiveExchangeItemFix(ulong sender, pExchangeItemFix data)
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			PlayerAgent localPlayerAgent = PlayerManager.GetLocalPlayerAgent();
			if (!((Object)(object)localPlayerAgent == (Object)null))
			{
				localPlayerAgent.Sync.WantsToSetFlashlightEnabled(LastFlashLightStatus, true);
				localPlayerAgent.Inventory.ReceiveSetFlashlightStatus(LastFlashLightStatus, false);
				GuiManager.PlayerLayer.Inventory.UpdateAllSlots(SNet.LocalPlayer, localPlayerAgent.Inventory.WieldedSlot);
			}
		}

		private static void DoExchangeItemValidate(pExchangeItemRequest data)
		{
			if (SNet.IsMaster)
			{
				MasterDoExchangeItem(SNet.LocalPlayer.Lookup, data);
			}
		}

		private static void MasterDoExchangeItem(ulong sender, pExchangeItemRequest data)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Invalid comparison between Unknown and I4
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: 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_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			//IL_0195: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a9: 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_01c6: 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_01da: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_021c: Unknown result type (might be due to invalid IL or missing references)
			//IL_022b: Unknown result type (might be due to invalid IL or missing references)
			//IL_023f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0244: Unknown result type (might be due to invalid IL or missing references)
			//IL_025c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0261: Unknown result type (might be due to invalid IL or missing references)
			//IL_0270: Unknown result type (might be due to invalid IL or missing references)
			//IL_0272: Unknown result type (might be due to invalid IL or missing references)
			//IL_027b: Unknown result type (might be due to invalid IL or missing references)
			SNet_Player val = default(SNet_Player);
			SNet_Player val2 = default(SNet_Player);
			if (!SNet.IsMaster || !((pPlayer)(ref data.Source)).TryGetPlayer(ref val) || !((pPlayer)(ref data.Target)).TryGetPlayer(ref val2))
			{
				return;
			}
			InventorySlot slot = data.Slot;
			AmmoType val3 = (AmmoType)(((int)slot == 4) ? 3 : 5);
			PlayerBackpack val4 = default(PlayerBackpack);
			PlayerBackpackManager.TryGetBackpack(val, ref val4);
			PlayerBackpack val5 = default(PlayerBackpack);
			PlayerBackpackManager.TryGetBackpack(val2, ref val5);
			BackpackItem val6 = default(BackpackItem);
			bool flag = val4.TryGetBackpackItem(slot, ref val6);
			BackpackItem val7 = default(BackpackItem);
			bool flag2 = val5.TryGetBackpackItem(slot, ref val7);
			if (flag2 && flag)
			{
				pItemData_Custom val8 = default(pItemData_Custom);
				val8.ammo = val4.AmmoStorage.GetAmmoInPack(val3);
				val8.byteId = val6.Instance.pItemData.custom.byteId;
				val8.byteState = val6.Instance.pItemData.custom.byteState;
				pItemData_Custom val9 = val8;
				val6.Instance.SetCustomData(val9, false);
				val8 = default(pItemData_Custom);
				val8.ammo = val5.AmmoStorage.GetAmmoInPack(val3);
				val8.byteId = val7.Instance.pItemData.custom.byteId;
				val8.byteState = val7.Instance.pItemData.custom.byteState;
				pItemData_Custom val10 = val8;
				val7.Instance.SetCustomData(val10, false);
				PlayerBackpackManager.MasterRemoveItem(val6.Instance, val);
				PlayerBackpackManager.MasterRemoveItem(val7.Instance, val2);
				PlayerBackpackManager.MasterAddItem(val6.Instance, val2);
				PlayerBackpackManager.MasterAddItem(val7.Instance, val);
			}
			else if (!flag2 && flag)
			{
				pItemData_Custom val8 = default(pItemData_Custom);
				val8.ammo = val4.AmmoStorage.GetAmmoInPack(val3);
				val8.byteId = val6.Instance.pItemData.custom.byteId;
				val8.byteState = val6.Instance.pItemData.custom.byteState;
				pItemData_Custom val11 = val8;
				val6.Instance.SetCustomData(val11, false);
				PlayerBackpackManager.MasterRemoveItem(val6.Instance, val);
				PlayerBackpackManager.MasterAddItem(val6.Instance, val2);
			}
			else
			{
				if (!flag2 || flag)
				{
					return;
				}
				pItemData_Custom val8 = default(pItemData_Custom);
				val8.ammo = val5.AmmoStorage.GetAmmoInPack(val3);
				val8.byteId = val7.Instance.pItemData.custom.byteId;
				val8.byteState = val7.Instance.pItemData.custom.byteState;
				pItemData_Custom val12 = val8;
				val7.Instance.SetCustomData(val12, false);
				PlayerBackpackManager.MasterRemoveItem(val7.Instance, val2);
				PlayerBackpackManager.MasterAddItem(val7.Instance, val);
			}
			if (!val.IsBot)
			{
				s_ExchangeItemFixPacket.Send(default(pExchangeItemFix), val);
			}
			if (!val2.IsBot)
			{
				s_ExchangeItemFixPacket.Send(default(pExchangeItemFix), val2);
			}
		}

		public static void WantToExchangeItem(SNet_Player target, InventorySlot slot)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			PlayerAgent localPlayerAgent = PlayerManager.GetLocalPlayerAgent();
			if (!((Object)(object)localPlayerAgent == (Object)null))
			{
				LastFlashLightStatus = localPlayerAgent.Inventory.WantsFlashlightEnabled;
				s_ExchangeItemRequestPacket.Ask(new pExchangeItemRequest(SNet.LocalPlayer, target, slot));
			}
		}

		public static ItemInLevel DropItem(PlayerAgent player, InventorySlot slot)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			PlayerBackpack val = default(PlayerBackpack);
			BackpackItem val2 = default(BackpackItem);
			if (!PlayerBackpackManager.TryGetBackpack(player.Owner, ref val) || !val.TryGetBackpackItem(slot, ref val2) || (Object)(object)val2.Instance == (Object)null)
			{
				return null;
			}
			Item val3 = default(Item);
			if (PlayerBackpackManager.TryGetItemInLevelFromItemData(val2.Instance.Get_pItemData(), ref val3))
			{
				ItemInLevel obj = ((Il2CppObjectBase)val3).Cast<ItemInLevel>();
				float ammoInPack = val.AmmoStorage.GetAmmoInPack(PlayerAmmoStorage.GetAmmoTypeFromSlot(slot));
				pItemData_Custom custom = ((Item)obj).pItemData.custom;
				custom.ammo = ammoInPack;
				obj.GetSyncComponent().AttemptPickupInteraction((ePickupItemInteractionType)1, player.Owner, custom, ((Agent)player).Position, ((Agent)player).Rotation, ((Agent)player).CourseNode, true, true);
				return obj;
			}
			return null;
		}

		public static void PickupItem(PlayerAgent player, ItemInLevel itemInLevel)
		{
			//IL_0018: 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_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)itemInLevel))
			{
				itemInLevel.GetSyncComponent().AttemptPickupInteraction((ePickupItemInteractionType)0, player.Owner, default(pItemData_Custom), default(Vector3), default(Quaternion), (AIG_CourseNode)null, false, true);
			}
		}
	}
	[StructLayout(LayoutKind.Sequential, Size = 1)]
	public struct pExchangeItemFix
	{
	}
	public struct pExchangeItemRequest
	{
		public pPlayer Source;

		public pPlayer Target;

		public InventorySlot Slot;

		public pExchangeItemRequest(SNet_Player source, SNet_Player target, InventorySlot slot)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			Source = default(pPlayer);
			Target = default(pPlayer);
			Slot = (InventorySlot)0;
			((pPlayer)(ref Source)).SetPlayer(source);
			((pPlayer)(ref Target)).SetPlayer(target);
			Slot = slot;
		}
	}
}
namespace Hikaria.ExchangeItem.Handlers
{
	internal sealed class ExchangeItemUpdater : MonoBehaviour
	{
		private ResourcePackFirstPerson m_wieldResourcePack;

		private bool m_lastKeyDown;

		private bool m_keyReleased = true;

		private bool m_localItemInfAmmo;

		private bool m_targetItemInfAmmo;

		private int m_localItemTimes;

		private int m_receiverItemTimes;

		private bool m_localHasResourcePack;

		private bool m_localHasConsumable;

		private bool m_receiverHasResourcePack;

		private bool m_receiverHasConsumable;

		private bool m_allowGive;

		private bool m_allowGet;

		private bool m_allowExchange;

		private bool m_allowGetResourcePack;

		private bool m_allowGetConsumable;

		private BackpackItem m_receiverConsumableBPItem;

		private BackpackItem m_localConsumableBPItem;

		private BackpackItem m_receiverResourcePackBPItem;

		private BackpackItem m_localResourcePackBPItem;

		private PlayerBackpack m_receiverBackpack;

		private InventorySlot m_localWieldSlot;

		private PlayerAgent m_actionReceiver;

		private Item m_localItem;

		private Item m_targetItem;

		private ItemDataBlock m_targetItemDataBlock;

		private ItemDataBlock m_localItemDataBlock;

		private LocalPlayerAgent m_localPlayer;

		private ExchangeType m_exchangeType;

		private InventorySlot m_exchangeSlot;

		private Interact_ManualTimedWithCallback m_interactExchangeItem;

		private float m_interactionDuration = 0.6f;

		public string Prompt_Exchange => Hikaria.ExchangeItem.Features.ExchangeItem.Localization.Get(1u);

		public string Prompt_Get => Hikaria.ExchangeItem.Features.ExchangeItem.Localization.Get(2u);

		public string Prompt_Give => Hikaria.ExchangeItem.Features.ExchangeItem.Localization.Get(3u);

		public string Prompt_Times => Hikaria.ExchangeItem.Features.ExchangeItem.Localization.Get(4u);

		private void Awake()
		{
			m_localPlayer = ((Component)this).GetComponent<LocalPlayerAgent>();
			m_interactExchangeItem = ((Component)this).GetComponent<Interact_ManualTimedWithCallback>() ?? ((Component)this).gameObject.AddComponent<Interact_ManualTimedWithCallback>();
			((Interact_Timed)m_interactExchangeItem).InteractDuration = m_interactionDuration;
			((Interact_Timed)m_interactExchangeItem).AbortOnDotOrDistanceDiff = false;
			m_interactExchangeItem.OnTrigger = DoExchangeItem;
			UpdateInteractionActionName();
		}

		private void Update()
		{
			if (!((Object)(object)m_localPlayer == (Object)null) && (ExchangeItemManager.MasterHasExchangeItem || Hikaria.ExchangeItem.Features.ExchangeItem.Settings.ForceExchangeItem) && !((PlayerAgent)m_localPlayer).Interaction.HasWorldInteraction)
			{
				ItemEquippable wieldedItem = ((PlayerAgent)m_localPlayer).Inventory.WieldedItem;
				if (wieldedItem == null || wieldedItem.AllowPlayerInteraction)
				{
					ResourcePackFirstPerson wieldResourcePack = m_wieldResourcePack;
					if ((wieldResourcePack == null || !((Interact_Timed)wieldResourcePack.m_interactApplyResource).TimerIsActive) && ((Agent)m_localPlayer).Alive)
					{
						if (!((PlayerAgent)m_localPlayer).Interaction.HasWorldInteraction && !((PlayerAgent)m_localPlayer).FPItemHolder.ItemHiddenTrigger)
						{
							UpdateInteraction();
						}
						return;
					}
				}
			}
			if (((Interact_Timed)m_interactExchangeItem).TimerIsActive)
			{
				((Interact_Base)m_interactExchangeItem).PlayerSetSelected(false, (PlayerAgent)(object)m_localPlayer);
			}
		}

		public void OnWieldItemChanged()
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			if (((Interact_Base)m_interactExchangeItem).IsSelected)
			{
				((Interact_Base)m_interactExchangeItem).PlayerSetSelected(false, (PlayerAgent)(object)m_localPlayer);
			}
			m_localWieldSlot = ((PlayerAgent)m_localPlayer).Inventory.WieldedSlot;
			ItemEquippable wieldedItem = ((PlayerAgent)m_localPlayer).Inventory.WieldedItem;
			m_wieldResourcePack = ((wieldedItem != null) ? ((Il2CppObjectBase)wieldedItem).TryCast<ResourcePackFirstPerson>() : null);
		}

		public void OnInteractionKeyChanged()
		{
			UpdateInteractionActionName();
		}

		public void OnAmmoStorageChanged(PlayerAgent player)
		{
			if (((Interact_Base)m_interactExchangeItem).IsSelected && (((Agent)player).IsLocallyOwned || ((Agent)player).GlobalID == ((Agent)m_actionReceiver).GlobalID))
			{
				((Interact_Base)m_interactExchangeItem).PlayerSetSelected(false, (PlayerAgent)(object)m_localPlayer);
			}
		}

		private void UpdateInteractionActionName(string targetName = "")
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			m_interactExchangeItem.SetAction(targetName, Hikaria.ExchangeItem.Features.ExchangeItem.Settings.ExchangeItemKey);
		}

		private bool UpdateInteraction()
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			if (!((Interact_Timed)m_interactExchangeItem).TimerIsActive)
			{
				m_actionReceiver = null;
				Vector3 position = ((PlayerAgent)m_localPlayer).FPSCamera.Position;
				Vector3 forward = ((PlayerAgent)m_localPlayer).FPSCamera.Forward;
				RaycastHit val = default(RaycastHit);
				if (Physics.Raycast(position, forward, ref val, 2.4f, LayerManager.MASK_GIVE_RESOURCE_PACK))
				{
					iResourcePackReceiver componentInParent = ((Component)((RaycastHit)(ref val)).collider).GetComponentInParent<iResourcePackReceiver>();
					if (componentInParent != null)
					{
						PlayerAgent val2 = ((Il2CppObjectBase)componentInParent).TryCast<PlayerAgent>();
						if ((Object)(object)val2 != (Object)null)
						{
							m_actionReceiver = val2;
						}
					}
				}
			}
			return UpdateInteractionDetails();
		}

		private bool UpdateInteractionDetails()
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: 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_0142: Invalid comparison between Unknown and I4
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: Invalid comparison between Unknown and I4
			//IL_016b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Invalid comparison between Unknown and I4
			//IL_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Invalid comparison between Unknown and I4
			//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0201: Unknown result type (might be due to invalid IL or missing references)
			//IL_0206: Unknown result type (might be due to invalid IL or missing references)
			//IL_0246: Unknown result type (might be due to invalid IL or missing references)
			//IL_024c: Invalid comparison between Unknown and I4
			//IL_0239: Unknown result type (might be due to invalid IL or missing references)
			//IL_0289: Unknown result type (might be due to invalid IL or missing references)
			//IL_028f: Invalid comparison between Unknown and I4
			//IL_0229: Unknown result type (might be due to invalid IL or missing references)
			//IL_0373: Unknown result type (might be due to invalid IL or missing references)
			//IL_0378: Unknown result type (might be due to invalid IL or missing references)
			//IL_0394: Unknown result type (might be due to invalid IL or missing references)
			//IL_0399: Unknown result type (might be due to invalid IL or missing references)
			//IL_062b: Unknown result type (might be due to invalid IL or missing references)
			if (!m_keyReleased)
			{
				m_keyReleased = !Input.GetKey(((Interact_Base)m_interactExchangeItem).InputKey);
				if (!m_keyReleased)
				{
					((Interact_Base)m_interactExchangeItem).PlayerSetSelected(false, (PlayerAgent)(object)m_localPlayer);
					return false;
				}
			}
			if (!Object.op_Implicit((Object)(object)m_actionReceiver) || !PlayerBackpackManager.TryGetBackpack(m_actionReceiver.Owner, ref m_receiverBackpack))
			{
				m_exchangeType = ExchangeType.Invalid;
				m_exchangeSlot = (InventorySlot)0;
				((Interact_Base)m_interactExchangeItem).PlayerSetSelected(false, (PlayerAgent)(object)m_localPlayer);
				return false;
			}
			m_localHasResourcePack = PlayerBackpackManager.LocalBackpack.TryGetBackpackItem((InventorySlot)4, ref m_localResourcePackBPItem) && (Object)(object)m_localResourcePackBPItem.Instance != (Object)null;
			m_localHasConsumable = PlayerBackpackManager.LocalBackpack.TryGetBackpackItem((InventorySlot)5, ref m_localConsumableBPItem) && (Object)(object)m_localConsumableBPItem.Instance != (Object)null;
			m_receiverHasResourcePack = m_receiverBackpack.TryGetBackpackItem((InventorySlot)4, ref m_receiverResourcePackBPItem) && (Object)(object)m_receiverResourcePackBPItem.Instance != (Object)null;
			m_receiverHasConsumable = m_receiverBackpack.TryGetBackpackItem((InventorySlot)5, ref m_receiverConsumableBPItem) && (Object)(object)m_receiverConsumableBPItem.Instance != (Object)null;
			m_allowGive = ((int)m_localWieldSlot == 4 && !m_receiverHasResourcePack) || ((int)m_localWieldSlot == 5 && !m_receiverHasConsumable);
			m_allowExchange = ((int)m_localWieldSlot == 4 && m_receiverHasResourcePack) || ((int)m_localWieldSlot == 5 && m_receiverHasConsumable);
			m_allowGetConsumable = !m_localHasConsumable && m_receiverHasConsumable;
			m_allowGetResourcePack = !m_localHasResourcePack && m_receiverHasResourcePack;
			m_allowGet = m_allowGetConsumable || m_allowGetResourcePack;
			if (m_allowExchange)
			{
				m_exchangeSlot = m_localWieldSlot;
				m_exchangeType = ExchangeType.Exchange;
			}
			else if (m_allowGive)
			{
				m_exchangeSlot = m_localWieldSlot;
				m_exchangeType = ExchangeType.Give;
			}
			else if (m_allowGet)
			{
				m_exchangeSlot = (InventorySlot)(m_allowGetResourcePack ? 4 : 5);
				m_exchangeType = ExchangeType.Get;
			}
			else
			{
				m_exchangeSlot = (InventorySlot)0;
				m_exchangeType = ExchangeType.Invalid;
			}
			if ((int)m_exchangeSlot == 4)
			{
				m_localItem = (m_localHasResourcePack ? m_localResourcePackBPItem.Instance : null);
				m_targetItem = (m_receiverHasResourcePack ? m_receiverResourcePackBPItem.Instance : null);
			}
			else if ((int)m_exchangeSlot == 5)
			{
				m_localItem = (m_localHasConsumable ? m_localConsumableBPItem.Instance : null);
				m_targetItem = (m_receiverHasConsumable ? m_receiverConsumableBPItem.Instance : null);
			}
			else
			{
				m_localItem = null;
				m_targetItem = null;
			}
			Item localItem = m_localItem;
			m_localItemDataBlock = ((localItem != null) ? localItem.ItemDataBlock : null);
			Item targetItem = m_targetItem;
			m_targetItemDataBlock = ((targetItem != null) ? targetItem.ItemDataBlock : null);
			m_localItemInfAmmo = m_localItemDataBlock != null && (m_localItemDataBlock.GUIShowAmmoInfinite || !m_localItemDataBlock.GUIShowAmmoTotalRel);
			m_targetItemInfAmmo = m_targetItemDataBlock != null && (m_targetItemDataBlock.GUIShowAmmoInfinite || !m_targetItemDataBlock.GUIShowAmmoTotalRel);
			m_localItemTimes = PlayerBackpackManager.LocalBackpack.AmmoStorage.GetBulletsInPack(PlayerAmmoStorage.GetAmmoTypeFromSlot(m_exchangeSlot));
			m_receiverItemTimes = m_receiverBackpack.AmmoStorage.GetBulletsInPack(PlayerAmmoStorage.GetAmmoTypeFromSlot(m_exchangeSlot));
			if (m_exchangeType == ExchangeType.Exchange && m_localItemDataBlock != null && m_targetItemDataBlock != null && m_receiverItemTimes == m_localItemTimes && ((GameDataBlockBase<ItemDataBlock>)(object)m_localItem.ItemDataBlock).persistentID == ((GameDataBlockBase<ItemDataBlock>)(object)m_targetItem.ItemDataBlock).persistentID)
			{
				m_exchangeType = ExchangeType.Invalid;
			}
			switch (m_exchangeType)
			{
			case ExchangeType.Get:
				((Interact_Timed)m_interactExchangeItem).InteractionMessage = string.Format(Prompt_Get, PlayerNameExtentions.GetColoredName(m_actionReceiver, (string)null), m_targetItemInfAmmo ? string.Empty : (" " + string.Format(Prompt_Times, m_receiverItemTimes, (m_receiverItemTimes > 1) ? "s" : string.Empty)), m_targetItem.ArchetypeName);
				break;
			case ExchangeType.Give:
				((Interact_Timed)m_interactExchangeItem).InteractionMessage = string.Format(Prompt_Give, m_localItemInfAmmo ? string.Empty : (" " + string.Format(Prompt_Times, m_localItemTimes, (m_localItemTimes > 1) ? "s" : string.Empty)), m_localItem.ArchetypeName, PlayerNameExtentions.GetColoredName(m_actionReceiver, (string)null));
				break;
			case ExchangeType.Exchange:
				((Interact_Timed)m_interactExchangeItem).InteractionMessage = string.Format(Prompt_Exchange, m_localItemInfAmmo ? string.Empty : (" " + string.Format(Prompt_Times, m_localItemTimes, (m_localItemTimes > 1) ? "s" : string.Empty)), m_localItem.ArchetypeName, PlayerNameExtentions.GetColoredName(m_actionReceiver, (string)null), m_targetItemInfAmmo ? string.Empty : (" " + string.Format(Prompt_Times, m_receiverItemTimes, (m_receiverItemTimes > 1) ? "s" : string.Empty)), m_targetItem.ArchetypeName);
				break;
			}
			bool flag = m_exchangeType != ExchangeType.Invalid;
			bool timerIsActive = ((Interact_Timed)m_interactExchangeItem).TimerIsActive;
			m_interactExchangeItem.ManualUpdateWithCondition(flag, (PlayerAgent)(object)m_localPlayer, flag);
			if (flag && !timerIsActive && ((Interact_Timed)m_interactExchangeItem).TimerIsActive)
			{
				((PlayerAgent)m_localPlayer).Sync.SendGenericInteract((TypeEnum)((m_exchangeType == ExchangeType.Give) ? 5 : ((int)GetReachHeight())), false);
				((Interact_Timed)m_interactExchangeItem).ForceUpdatePrompt();
			}
			return true;
		}

		private TypeEnum GetReachHeight()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			float y = ((Agent)m_actionReceiver).Position.y;
			float y2 = ((Agent)m_localPlayer).Position.y;
			y2 += Mathf.Lerp(1.6f, 1.1f, ((PlayerAgent)m_localPlayer).Locomotion.GetCrouch());
			float num = y - y2;
			if (!(num > 0.25f))
			{
				if (!(num > -0.35f))
				{
					return (TypeEnum)1;
				}
				return (TypeEnum)2;
			}
			return (TypeEnum)3;
		}

		private void DoExchangeItem()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			m_keyReleased = false;
			if (ExchangeItemManager.MasterHasExchangeItem)
			{
				ExchangeItemManager.WantToExchangeItem(m_actionReceiver.Owner, m_exchangeSlot);
				return;
			}
			switch (m_exchangeType)
			{
			case ExchangeType.Give:
				ExchangeItemManager.PickupItem(m_actionReceiver, ExchangeItemManager.DropItem((PlayerAgent)(object)m_localPlayer, m_exchangeSlot));
				break;
			case ExchangeType.Get:
				ExchangeItemManager.PickupItem((PlayerAgent)(object)m_localPlayer, ExchangeItemManager.DropItem(m_actionReceiver, m_exchangeSlot));
				break;
			case ExchangeType.Exchange:
			{
				ItemInLevel itemInLevel = ExchangeItemManager.DropItem((PlayerAgent)(object)m_localPlayer, m_exchangeSlot);
				ItemInLevel itemInLevel2 = ExchangeItemManager.DropItem(m_actionReceiver, m_exchangeSlot);
				ExchangeItemManager.PickupItem((PlayerAgent)(object)m_localPlayer, itemInLevel2);
				ExchangeItemManager.PickupItem(m_actionReceiver, itemInLevel);
				break;
			}
			}
		}
	}
	public enum ExchangeType : byte
	{
		Get,
		Give,
		Exchange,
		Invalid
	}
}
namespace Hikaria.ExchangeItem.Features
{
	[EnableFeatureByDefault]
	[DisallowInGameToggle]
	public class ExchangeItem : Feature
	{
		public class ExchangeItemSetting
		{
			[FSDisplayName("物品交换按键")]
			public KeyCode ExchangeItemKey { get; set; } = (KeyCode)116;


			[FSDisplayName("强制物品交换")]
			[FSHide]
			[FSIgnore]
			public bool ForceExchangeItem { get; set; }
		}

		[ArchivePatch(/*Could not decode attribute arguments.*/)]
		private class LocalPlayerAgent__Setup__Patch
		{
			private static void Postfix(LocalPlayerAgent __instance)
			{
				_updater = ((Component)__instance).GetComponent<ExchangeItemUpdater>() ?? ((Component)__instance).gameObject.AddComponent<ExchangeItemUpdater>();
			}
		}

		[ArchivePatch(/*Could not decode attribute arguments.*/)]
		private class PlayerInventoryLocal__DoWieldItem__Patch
		{
			private static void Postfix(PlayerInventoryLocal __instance)
			{
				if (((PlayerInventoryBase)__instance).AllowedToWieldItem)
				{
					_updater?.OnWieldItemChanged();
				}
			}
		}

		[ArchivePatch(/*Could not decode attribute arguments.*/)]
		private class PlayerAmmoStorage__SetStorageData__Patch
		{
			private static void Postfix(PlayerAmmoStorage __instance)
			{
				if (!((Object)(object)_updater != (Object)null))
				{
					return;
				}
				PlayerBackpack playerBackpack = __instance.m_playerBackpack;
				object obj;
				if (playerBackpack == null)
				{
					obj = null;
				}
				else
				{
					SNet_Player owner = playerBackpack.Owner;
					if (owner == null)
					{
						obj = null;
					}
					else
					{
						SNet_IPlayerAgent playerAgent = owner.PlayerAgent;
						obj = ((playerAgent != null) ? ((Il2CppObjectBase)playerAgent).TryCast<PlayerAgent>() : null);
					}
				}
				PlayerAgent val = (PlayerAgent)obj;
				if ((Object)(object)val != (Object)null)
				{
					_updater.OnAmmoStorageChanged(val);
				}
			}
		}

		private static ExchangeItemUpdater _updater;

		public override string Name => "资源交换";

		public override bool InlineSettingsIntoParentMenu => true;

		public static ILocalizationService Localization { get; set; }

		[FeatureConfig]
		public static ExchangeItemSetting Settings { get; set; }

		public override void OnFeatureSettingChanged(FeatureSetting setting)
		{
			_updater?.OnInteractionKeyChanged();
		}

		public override void Init()
		{
			ClassInjector.RegisterTypeInIl2Cpp<ExchangeItemUpdater>(false);
			ExchangeItemManager.Setup();
		}
	}
}