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();
}
}
}