using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("")]
[assembly: AssemblyCompany("rin_jugatla")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+3293a5c5fc93c0e2066ee040fbca7fbd5622e2d8")]
[assembly: AssemblyProduct("ItemSwapper")]
[assembly: AssemblyTitle("ItemSwapper")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace ItemSwapper
{
[BepInPlugin("rin_jugatla.ItemSwapper", "ItemSwapper", "1.0.1")]
public class ItemSwapper : BaseUnityPlugin
{
internal static ItemSwapper Instance { get; private set; }
internal static ManualLogSource Logger => Instance._logger;
private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger;
internal Harmony? Harmony { get; set; }
private void Awake()
{
Instance = this;
((Component)this).gameObject.transform.parent = null;
((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
Patch();
Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!");
}
internal void Patch()
{
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Expected O, but got Unknown
//IL_0026: Expected O, but got Unknown
if (Harmony == null)
{
Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID);
Harmony val2 = val;
Harmony = val;
}
Harmony.PatchAll();
}
internal void Unpatch()
{
Harmony? harmony = Harmony;
if (harmony != null)
{
harmony.UnpatchSelf();
}
}
}
[HarmonyPatch(typeof(InventorySpot), "HandleInput")]
internal static class InventorySpot_HandleInput_Patch
{
private static bool Prefix(InventorySpot __instance)
{
if (ShouldSkipInput(__instance))
{
return true;
}
return SwapItem(__instance);
}
private static bool ShouldSkipInput(InventorySpot instance)
{
if (SemiFunc.RunIsArena() || PlayerController.instance.InputDisableTimer > 0f)
{
return true;
}
if (IsInCooldown(instance))
{
return true;
}
return false;
}
private static bool IsInCooldown(InventorySpot instance)
{
Type type = ((object)instance).GetType();
FieldInfo field = type.GetField("lastEquipTime", BindingFlags.Instance | BindingFlags.NonPublic);
FieldInfo field2 = type.GetField("equipCooldown", BindingFlags.Instance | BindingFlags.NonPublic);
if (field == null || field2 == null)
{
ItemSwapper.Logger.LogWarning((object)"[MOD] Could not find cooldown fields on InventorySpot");
return false;
}
float num = (float)field.GetValue(instance);
float num2 = (float)field2.GetValue(instance);
return Time.time - num < num2;
}
private static void SetLastEquipTime(InventorySpot instance, float time)
{
Type type = ((object)instance).GetType();
FieldInfo field = type.GetField("lastEquipTime", BindingFlags.Instance | BindingFlags.NonPublic);
if (field != null)
{
field.SetValue(instance, time);
}
}
private static bool SwapItem(InventorySpot instance)
{
bool grabbed = PhysGrabber.instance.grabbed;
PhysGrabObject grabbedPhysGrabObject = PhysGrabber.instance.grabbedPhysGrabObject;
ItemEquippable val = ((!grabbed) ? null : ((grabbedPhysGrabObject != null) ? ((Component)grabbedPhysGrabObject).GetComponent<ItemEquippable>() : null));
bool flag = instance.IsOccupied();
ItemEquippable currentItem = instance.CurrentItem;
if (!flag || !((Object)(object)val != (Object)null))
{
return true;
}
currentItem.RequestUnequip();
val.RequestEquip(instance.inventorySpotIndex, PhysGrabber.instance.photonView.ViewID);
ItemSwapper.Logger.LogInfo((object)$"[MOD] Swap slot {instance.inventorySpotIndex}: {((val != null) ? ((Object)val).name : null)} <-> {((Object)currentItem).name}");
SetLastEquipTime(instance, Time.time);
return false;
}
}
}