using System;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using BetterSprayPaint;
using BetterSprayPaint.Ngo;
using GameNetcodeStuff;
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(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("BSPv80Fix")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("BSPv80Fix")]
[assembly: AssemblyTitle("BSPv80Fix")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace BSPv80Fix
{
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("aspect.BSPv80Fix", "BetterSprayPaint v80 Fix", "1.0.0")]
public class BSPv80Fix : BaseUnityPlugin
{
private static ManualLogSource Log;
private static Harmony harmony;
private void Awake()
{
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Expected O, but got Unknown
Log = ((BaseUnityPlugin)this).Logger;
Log.LogInfo((object)"BetterSprayPaint v80 Fix loaded");
harmony = new Harmony("aspect.BSPv80Fix");
harmony.PatchAll();
}
}
}
namespace BSPv80Fix.Patches
{
[HarmonyPatch(typeof(SprayPaintItemNetExt), "get_HeldByLocalPlayer")]
internal class HeldByLocalPlayerPatch
{
private static bool Prefix(SprayPaintItemNetExt __instance, ref bool __result)
{
SprayPaintItem item = ((Component)__instance).GetComponent<SprayPaintItem>();
PlayerControllerB val = ((GrabbableObject)(item?)).playerHeldBy;
if ((Object)(object)val == (Object)null || !Utils.IsLocalPlayer(val))
{
__result = false;
return false;
}
if (val.ItemSlots != null && val.ItemSlots.Any((GrabbableObject slot) => (Object)(object)slot == (Object)(object)item))
{
__result = true;
return false;
}
if (val.currentItemSlot == 50 && (Object)(object)val.currentlyHeldObjectServer == (Object)(object)item)
{
__result = true;
return false;
}
__result = false;
return false;
}
}
[HarmonyPatch(typeof(SprayPaintItemNetExt), "get_InActiveSlot")]
internal class SafeInActiveSlotPatch
{
private static bool Prefix(SprayPaintItemNetExt __instance, ref bool __result)
{
SprayPaintItem component = ((Component)__instance).GetComponent<SprayPaintItem>();
PlayerControllerB val = ((GrabbableObject)(component?)).playerHeldBy;
if ((Object)(object)val == (Object)null || !Utils.IsLocalPlayer(val))
{
__result = false;
return false;
}
int currentItemSlot = val.currentItemSlot;
if (currentItemSlot < 0 || currentItemSlot >= val.ItemSlots.Length)
{
__result = false;
return false;
}
__result = (Object)(object)val.ItemSlots[currentItemSlot] == (Object)(object)component;
return false;
}
}
[HarmonyPatch(typeof(SprayPaintItemExt), "ItemActive")]
internal class ItemActivePatch
{
private static bool Prefix(SprayPaintItemExt __instance, ref bool __result)
{
GrabbableObject instance = (GrabbableObject)(object)__instance.instance;
PlayerControllerB playerHeldBy = instance.playerHeldBy;
if ((Object)(object)playerHeldBy == (Object)null || !Utils.IsLocalPlayer(playerHeldBy))
{
__result = false;
return false;
}
if (playerHeldBy.currentItemSlot == 50 && (Object)(object)playerHeldBy.currentlyHeldObjectServer == (Object)(object)instance)
{
__result = true;
return false;
}
if (playerHeldBy.currentItemSlot >= 0 && playerHeldBy.currentItemSlot < playerHeldBy.ItemSlots.Length && (Object)(object)playerHeldBy.ItemSlots[playerHeldBy.currentItemSlot] == (Object)(object)instance)
{
__result = true;
return false;
}
__result = false;
return false;
}
}
[HarmonyPatch(typeof(SprayPaintItemNetExt), "Update")]
internal class NetUpdatePatch
{
private static void Postfix(SprayPaintItemNetExt __instance)
{
SprayPaintItem component = ((Component)__instance).GetComponent<SprayPaintItem>();
PlayerControllerB val = ((GrabbableObject)(component?)).playerHeldBy;
if (!((Object)(object)val == (Object)null) && Utils.IsLocalPlayer(val))
{
bool flag = val.currentItemSlot == 50 && (Object)(object)val.currentlyHeldObjectServer == (Object)(object)component;
bool flag2 = val.currentItemSlot >= 0 && val.currentItemSlot < val.ItemSlots.Length && (Object)(object)val.ItemSlots[val.currentItemSlot] == (Object)(object)component;
if (!flag && !flag2)
{
SprayPaintItemNetExt val2 = Utils.NetExt(component);
val2.IsErasing = false;
}
}
}
}
[HarmonyPatch(typeof(SprayPaintItemNetExt), "get_InActiveSlot")]
internal class InActiveSlotPatch
{
private static bool Prefix(SprayPaintItemNetExt __instance, ref bool __result)
{
SprayPaintItem component = ((Component)__instance).GetComponent<SprayPaintItem>();
PlayerControllerB val = ((GrabbableObject)(component?)).playerHeldBy;
if ((Object)(object)val == (Object)null || !Utils.IsLocalPlayer(val))
{
__result = false;
return false;
}
if (val.currentItemSlot == 50 && (Object)(object)val.currentlyHeldObjectServer == (Object)(object)component)
{
__result = true;
return false;
}
int currentItemSlot = val.currentItemSlot;
if (currentItemSlot < 0 || currentItemSlot >= val.ItemSlots.Length)
{
__result = false;
return false;
}
__result = (Object)(object)val.ItemSlots[currentItemSlot] == (Object)(object)component;
return false;
}
}
[HarmonyPatch(typeof(PlayerControllerB), "UseUtilitySlot_performed")]
internal class UtilitySlotPatch
{
private static void Postfix(PlayerControllerB __instance)
{
GrabbableObject currentlyHeldObjectServer = __instance.currentlyHeldObjectServer;
if (!((Object)(object)currentlyHeldObjectServer == (Object)null))
{
((Component)currentlyHeldObjectServer).SendMessage("ItemActive", (SendMessageOptions)1);
}
}
}
}