Decompiled source of LethalSprayPaintColor v1.0.0

baer1.SprayPaintColor.dll

Decompiled 6 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Logging;
using ChatCommandAPI;
using ChatCommandAPI.Utils;
using GameNetcodeStuff;
using HarmonyLib;
using LethalCompanyInputUtils.Api;
using LethalCompanyInputUtils.BindingPathEnums;
using LethalSprayPaintColor.Commands;
using Microsoft.CodeAnalysis;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.InputSystem;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("AmazingAssets.TerrainToMesh")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("ClientNetworkTransform")]
[assembly: IgnoresAccessChecksTo("com.olegknyazev.softmask")]
[assembly: IgnoresAccessChecksTo("DissonanceVoip")]
[assembly: IgnoresAccessChecksTo("DunGen")]
[assembly: IgnoresAccessChecksTo("DunGen.Integration.ASPP")]
[assembly: IgnoresAccessChecksTo("DunGen.Integration.UnityNav")]
[assembly: IgnoresAccessChecksTo("EasyTextEffects")]
[assembly: IgnoresAccessChecksTo("Facepunch Transport for Netcode for GameObjects")]
[assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")]
[assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")]
[assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging")]
[assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging.DocCodeExamples")]
[assembly: IgnoresAccessChecksTo("Unity.Burst")]
[assembly: IgnoresAccessChecksTo("Unity.Burst.Unsafe")]
[assembly: IgnoresAccessChecksTo("Unity.Collections")]
[assembly: IgnoresAccessChecksTo("Unity.Collections.LowLevel.ILSupport")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")]
[assembly: IgnoresAccessChecksTo("Unity.Jobs")]
[assembly: IgnoresAccessChecksTo("Unity.Mathematics")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.Common")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.MetricTypes")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStats")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Component")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Configuration")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Implementation")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsReporting")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkProfiler.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkSolutionInterface")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Components")]
[assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.Networking.Transport")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Csg")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.KdTree")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Poly2Tri")]
[assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Stl")]
[assembly: IgnoresAccessChecksTo("Unity.Profiling.Core")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Config.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Authentication")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Analytics")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Components")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Configuration")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Device")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments.Internal")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Internal")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Networking")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Registration")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Scheduler")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Telemetry")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Core.Threading")]
[assembly: IgnoresAccessChecksTo("Unity.Services.QoS")]
[assembly: IgnoresAccessChecksTo("Unity.Services.Relay")]
[assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")]
[assembly: IgnoresAccessChecksTo("Unity.Timeline")]
[assembly: IgnoresAccessChecksTo("Unity.VisualEffectGraph.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.XR.CoreUtils")]
[assembly: IgnoresAccessChecksTo("Unity.XR.Management")]
[assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR")]
[assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.ConformanceAutomation")]
[assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.MetaQuestSupport")]
[assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.MockRuntime")]
[assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.OculusQuestSupport")]
[assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.RuntimeDebugger")]
[assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.SpatialTracking")]
[assembly: IgnoresAccessChecksTo("UnityEngine.UI")]
[assembly: IgnoresAccessChecksTo("UnityEngine.XR.LegacyInputHelpers")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("baer1.SprayPaintColor")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+7e6ebb4ec8b93483ed65f06a3ec22d4289ab13bf")]
[assembly: AssemblyProduct("LethalSprayPaintColor")]
[assembly: AssemblyTitle("baer1.SprayPaintColor")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[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]
	[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]
	[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 LethalSprayPaintColor
{
	public class KeybindManager : LcInputActions
	{
		internal KeybindManager()
		{
			foreach (SprayPaintColor.CommonColors i in Enum.GetValues(typeof(SprayPaintColor.CommonColors)))
			{
				((LcInputActions)this).Asset[string.Format("{0}{1}", "SprayPaintColor", i)].performed += delegate(CallbackContext ctx)
				{
					//IL_0000: Unknown result type (might be due to invalid IL or missing references)
					ChangeSprayColorKeybind(ctx, i);
				};
			}
		}

		public override void CreateInputActions(in InputActionMapBuilder builder)
		{
			foreach (SprayPaintColor.CommonColors value in Enum.GetValues(typeof(SprayPaintColor.CommonColors)))
			{
				builder.NewActionBinding().WithActionId(string.Format("{0}{1}", "SprayPaintColor", value)).WithActionType((InputActionType)1)
					.WithKeyboardControl((KeyboardControl)0)
					.WithBindingName($"Change spray color to <color=#{(uint)value:X6}>{value}</color>")
					.Finish();
			}
		}

		private static void ChangeSprayColorKeybind(CallbackContext ctx, SprayPaintColor.CommonColors i)
		{
			PlayerControllerB localPlayerController;
			if (((CallbackContext)(ref ctx)).performed && Object.op_Implicit((Object)(object)(localPlayerController = GameNetworkManager.Instance.localPlayerController)) && !localPlayerController.quickMenuManager.isMenuOpen && !localPlayerController.inTerminalMenu && !localPlayerController.isTypingChat)
			{
				GrabbableObject currentlyHeldObjectServer = localPlayerController.currentlyHeldObjectServer;
				SprayPaintItem val = (SprayPaintItem)(object)((currentlyHeldObjectServer is SprayPaintItem) ? currentlyHeldObjectServer : null);
				if (val != null && !val.isWeedKillerSprayBottle)
				{
					SprayPaintColor.RequestColorServerRpc(val, (uint)i);
					HUDManager.Instance.DisplayTip("SprayPaintColor", $"Requested color change to <color=#{(uint)i:X6}>{i}</color>", false, false, "LC_Tip1");
				}
				else
				{
					HUDManager.Instance.DisplayTip("SprayPaintColor", "You're not holding a spray can", true, false, "LC_Tip1");
				}
			}
		}
	}
	[BepInPlugin("baer1.SprayPaintColor", "LethalSprayPaintColor", "1.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class SprayPaintColor : BaseUnityPlugin
	{
		public enum CommonColors : uint
		{
			Red = 16711680u,
			Blue = 255u,
			Cyan = 65535u,
			Green = 65280u,
			Yellow = 16776960u,
			Pink = 16758465u,
			Purple = 9055202u,
			Orange = 16747520u,
			Gold = 16766720u,
			Indigo = 4915330u,
			Magenta = 16711935u,
			Brown = 9127187u,
			Crimson = 14423100u,
			Chartreuse = 8388352u,
			Coral = 16744272u,
			Goldenrod = 14329120u,
			Maroon = 8388608u,
			Navy = 128u,
			Olive = 8421376u,
			Orchid = 14315734u,
			Violet = 15631086u,
			DarkBlue = 139u,
			DarkGreen = 25600u,
			DarkRed = 9109504u,
			MediumBlue = 205u,
			MediumPurple = 9662683u,
			LightPink = 16761035u,
			LightBlue = 11393254u,
			HotPink = 16738740u,
			DeepPink = 16716947u,
			SkyBlue = 8900331u,
			DeepSkyBlue = 49151u,
			CornflowerBlue = 6591981u,
			LawnGreen = 8190976u,
			GreenYellow = 11403055u,
			OrangeRed = 16729344u,
			Silver = 12632256u,
			White = 16777215u,
			Gray = 8421504u,
			Black = 0u
		}

		[CompilerGenerated]
		private static class <>O
		{
			public static RpcReceiveHandler <0>____rpc_handler_RequestColorServerRpc;

			public static RpcReceiveHandler <1>____rpc_handler_SetColorClientRpc;
		}

		internal static Harmony Harmony = null;

		private const uint REQUEST_COLOR_SERVER_RPC = 1788770031u;

		private const uint SET_COLOR_CLIENT_RPC = 1788770032u;

		private static readonly Dictionary<uint, Material> SprayCanMaterials = new Dictionary<uint, Material>();

		private static readonly Dictionary<uint, Material> ParticleMaterials = new Dictionary<uint, Material>();

		public static SprayPaintColor Instance { get; private set; } = null;

		internal static ManualLogSource Logger { get; private set; } = null;

		private void Awake()
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Expected O, but got Unknown
			Logger = ((BaseUnityPlugin)this).Logger;
			Instance = this;
			Harmony = new Harmony("baer1.SprayPaintColor");
			Logger.LogDebug((object)"Patching...");
			Harmony.PatchAll(typeof(SprayPaintColor));
			Logger.LogDebug((object)"Finished patching!");
			if (Chainloader.PluginInfos.ContainsKey("baer1.ChatCommandAPI"))
			{
				registerChatCommand();
			}
			if (Chainloader.PluginInfos.ContainsKey("com.rune580.LethalCompanyInputUtils"))
			{
				registerInputActions();
			}
			Logger.LogInfo((object)"baer1.SprayPaintColor v1.0.0 has loaded!");
			[MethodImpl(MethodImplOptions.NoInlining)]
			static void registerChatCommand()
			{
				new LethalSprayPaintColor.Commands.SprayPaintColor();
			}
			[MethodImpl(MethodImplOptions.NoInlining)]
			static void registerInputActions()
			{
				new KeybindManager();
			}
		}

		[HarmonyPatch(typeof(SprayPaintItem), "__initializeRpcs")]
		[HarmonyPostfix]
		private static void SprayPaintItem___initializeRpcs(ref SprayPaintItem __instance)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Expected O, but got Unknown
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Expected O, but got Unknown
			SprayPaintItem obj = __instance;
			object obj2 = <>O.<0>____rpc_handler_RequestColorServerRpc;
			if (obj2 == null)
			{
				RpcReceiveHandler val = __rpc_handler_RequestColorServerRpc;
				<>O.<0>____rpc_handler_RequestColorServerRpc = val;
				obj2 = (object)val;
			}
			((NetworkBehaviour)obj).__registerRpc(1788770031u, (RpcReceiveHandler)obj2, "RequestColorServerRpc");
			SprayPaintItem obj3 = __instance;
			object obj4 = <>O.<1>____rpc_handler_SetColorClientRpc;
			if (obj4 == null)
			{
				RpcReceiveHandler val2 = __rpc_handler_SetColorClientRpc;
				<>O.<1>____rpc_handler_SetColorClientRpc = val2;
				obj4 = (object)val2;
			}
			((NetworkBehaviour)obj3).__registerRpc(1788770032u, (RpcReceiveHandler)obj4, "SetColorClientRpc");
		}

		private static void __rpc_handler_RequestColorServerRpc(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: 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)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Expected O, but got Unknown
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (!((Object)(object)networkManager == (Object)null) && networkManager.IsListening)
			{
				uint argb = default(uint);
				((FastBufferReader)(ref reader)).ReadValueSafe<uint>(ref argb, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				RequestColorServerRpc((SprayPaintItem)target, argb);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		private static void __rpc_handler_SetColorClientRpc(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: 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)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Expected O, but got Unknown
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = target.NetworkManager;
			if (!((Object)(object)networkManager == (Object)null) && networkManager.IsListening)
			{
				uint argb = default(uint);
				((FastBufferReader)(ref reader)).ReadValueSafe<uint>(ref argb, default(ForPrimitives));
				target.__rpc_exec_stage = (__RpcExecStage)1;
				SetColorClientRpc((SprayPaintItem)target, argb);
				target.__rpc_exec_stage = (__RpcExecStage)0;
			}
		}

		[ServerRpc(RequireOwnership = true)]
		internal static void RequestColorServerRpc(SprayPaintItem __instance, uint argb)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Invalid comparison between Unknown and I4
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Invalid comparison between Unknown and I4
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: 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_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)__instance).NetworkManager;
			if (!((Object)(object)networkManager == (Object)null) && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)__instance).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
				{
					ServerRpcParams val = default(ServerRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)__instance).__beginSendServerRpc(1788770031u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe<uint>(ref argb, default(ForPrimitives));
					((NetworkBehaviour)__instance).__endSendServerRpc(ref val2, 1788770031u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)__instance).__rpc_exec_stage == 1 && (networkManager == null || networkManager.IsServer || networkManager.IsHost))
				{
					((NetworkBehaviour)__instance).__rpc_exec_stage = (__RpcExecStage)0;
					SetColorClientRpc(__instance, argb);
				}
			}
		}

		[ClientRpc]
		private static void SetColorClientRpc(SprayPaintItem __instance, uint argb)
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Invalid comparison between Unknown and I4
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Invalid comparison between Unknown and I4
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: 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_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			NetworkManager networkManager = ((NetworkBehaviour)__instance).NetworkManager;
			if (!((Object)(object)networkManager == (Object)null) && networkManager.IsListening)
			{
				if ((int)((NetworkBehaviour)__instance).__rpc_exec_stage != 1 && (networkManager.IsServer || networkManager.IsHost))
				{
					ClientRpcParams val = default(ClientRpcParams);
					FastBufferWriter val2 = ((NetworkBehaviour)__instance).__beginSendClientRpc(1788770032u, val, (RpcDelivery)0);
					((FastBufferWriter)(ref val2)).WriteValueSafe<uint>(ref argb, default(ForPrimitives));
					((NetworkBehaviour)__instance).__endSendClientRpc(ref val2, 1788770032u, val, (RpcDelivery)0);
				}
				if ((int)((NetworkBehaviour)__instance).__rpc_exec_stage == 1 && (networkManager == null || networkManager.IsClient || networkManager.IsHost))
				{
					((NetworkBehaviour)__instance).__rpc_exec_stage = (__RpcExecStage)0;
					__instance.sprayCanMatsIndex = GetMatIndex(argb);
				}
			}
		}

		internal static int GetMatIndex(uint argb)
		{
			return (int)argb | -16777216;
		}

		internal static bool TryGetColor(int matIndex, out uint argb)
		{
			if (matIndex >= 0)
			{
				argb = 0u;
				return false;
			}
			argb = (uint)(matIndex | -16777216);
			return true;
		}

		[HarmonyPatch(typeof(SprayPaintItem), "AddSprayPaintLocal")]
		[HarmonyTranspiler]
		private static IEnumerable<CodeInstruction> SprayPaintItem_AddSprayPaintLocal(IEnumerable<CodeInstruction> instructions)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Expected O, but got Unknown
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Expected O, but got Unknown
			CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null);
			while (true)
			{
				val.MatchForward(false, (CodeMatch[])(object)new CodeMatch[1]
				{
					new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(SprayPaintItem), "sprayCanMats"), (string)null)
				});
				if (val.IsInvalid)
				{
					break;
				}
				val.MatchForward(false, (CodeMatch[])(object)new CodeMatch[1]
				{
					new CodeMatch((OpCode?)OpCodes.Ldelem_Ref, (object)null, (string)null)
				});
				if (val.IsInvalid)
				{
					break;
				}
				val.SetInstruction(new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(SprayPaintColor), "GetItemReplacement", (Type[])null, (Type[])null)));
			}
			return val.InstructionEnumeration();
		}

		private static Color32 UnityColor(uint argb)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			return new Color32((byte)((argb & 0xFF0000) >> 16), (byte)((argb & 0xFF00) >> 8), (byte)(argb & 0xFF), byte.MaxValue);
		}

		private static Material GetItemReplacement(Material[] sprayCanMats, int sprayCanMatsIndex)
		{
			//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)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Expected O, but got Unknown
			//IL_004e: Expected O, but got Unknown
			if (!TryGetColor(sprayCanMatsIndex, out var argb))
			{
				return sprayCanMats[sprayCanMatsIndex];
			}
			if (SprayCanMaterials.TryGetValue(argb, out Material value) && (Object)(object)value != (Object)null)
			{
				return value;
			}
			Dictionary<uint, Material> sprayCanMaterials = SprayCanMaterials;
			uint key = argb;
			Material val = new Material(sprayCanMats[0])
			{
				color = Color32.op_Implicit(UnityColor(argb))
			};
			Material result = val;
			sprayCanMaterials[key] = val;
			return result;
		}

		[HarmonyPatch(typeof(SprayPaintItem), "StartSpraying")]
		[HarmonyPatch(typeof(SprayPaintItem), "PlayCanEmptyEffect")]
		[HarmonyPrefix]
		private static void SprayPaintItem_StartSpraying(ref SprayPaintItem __instance)
		{
			Material particleMaterial = GetParticleMaterial(__instance.particleMats, __instance.sprayCanMatsIndex);
			((Renderer)((Component)__instance.sprayParticle).GetComponent<ParticleSystemRenderer>()).material = particleMaterial;
			((Renderer)((Component)__instance.sprayCanNeedsShakingParticle).GetComponent<ParticleSystemRenderer>()).material = particleMaterial;
		}

		private static Material GetParticleMaterial(Material[] particleMats, int sprayCanMatsIndex)
		{
			//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)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Expected O, but got Unknown
			//IL_004e: Expected O, but got Unknown
			if (!TryGetColor(sprayCanMatsIndex, out var argb))
			{
				return particleMats[sprayCanMatsIndex];
			}
			if (ParticleMaterials.TryGetValue(argb, out Material value) && (Object)(object)value != (Object)null)
			{
				return value;
			}
			Dictionary<uint, Material> particleMaterials = ParticleMaterials;
			uint key = argb;
			Material val = new Material(particleMats[0])
			{
				color = Color32.op_Implicit(UnityColor(argb))
			};
			Material result = val;
			particleMaterials[key] = val;
			return result;
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "baer1.SprayPaintColor";

		public const string PLUGIN_NAME = "LethalSprayPaintColor";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace LethalSprayPaintColor.Commands
{
	public class SprayPaintColor : Command
	{
		private static readonly Regex HexCode = new Regex("^(?:(?:#|0x)?([0-9A-F]{6})|([0-9A-F]{3}))$", RegexOptions.IgnoreCase | RegexOptions.Compiled);

		public override string Command => "spray";

		public override string Description => "Changes the color of your held spray can";

		public override string[] Syntax => new string[1] { "<color>" };

		public override void Invoke(string args)
		{
			//IL_001d: 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_00fc: Unknown result type (might be due to invalid IL or missing references)
			string[] array = Args.Parse(args, (uint?)null, true).ToArray();
			if (array.Length != 1)
			{
				throw new InvalidArgumentsException();
			}
			string text = array[0].Trim();
			Match match = HexCode.Match(text);
			uint num;
			if (match.Success)
			{
				num = uint.Parse(match.Groups[1].Success ? match.Groups[1].Value : string.Concat(match.Groups[2].Value.Select((char i) => $"{i}{i}")), NumberStyles.HexNumber);
			}
			else
			{
				if (!Enum.TryParse(typeof(LethalSprayPaintColor.SprayPaintColor.CommonColors), text, ignoreCase: true, out object result))
				{
					throw new InvalidArgumentsException();
				}
				num = (uint)result;
			}
			PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
			GrabbableObject currentlyHeldObjectServer = localPlayerController.currentlyHeldObjectServer;
			SprayPaintItem val = (SprayPaintItem)(object)((currentlyHeldObjectServer is SprayPaintItem) ? currentlyHeldObjectServer : null);
			if (val == null || val.isWeedKillerSprayBottle)
			{
				throw new CommandException("You're not holding a spray can");
			}
			LethalSprayPaintColor.SprayPaintColor.RequestColorServerRpc(val, num);
			Chat.Print($"Requested color change to <color=#{num:X6}>#{num:X6}</color>", (Color?)null);
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}