Decompiled source of Piss Ropes v1.0.0

tony4twentys-Piss Ropes.dll

Decompiled a day ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: AssemblyTitle("Piss Ropes")]
[assembly: AssemblyDescription("PEAK BepInEx plugin that restores the yellow unplaced rope-spool preview.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Piss Ropes")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("f98cebc2-1ce9-4cf7-9ff7-b53f425d9d45")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}
namespace Piss_Ropes
{
	[BepInPlugin("tony4twentys.Piss_Ropes", "Piss Ropes", "1.0.0")]
	[BepInProcess("PEAK.exe")]
	public class Plugin : BaseUnityPlugin
	{
		public const string PluginGuid = "tony4twentys.Piss_Ropes";

		public const string PluginName = "Piss Ropes";

		public const string PluginVersion = "1.0.0";

		internal static ConfigEntry<bool> EnabledConfig;

		internal static ConfigEntry<Color> PreviewColorConfig;

		internal static ConfigEntry<bool> ApplyToAntiRopeConfig;

		private Harmony _harmony;

		internal static Plugin Instance { get; private set; }

		internal static ManualLogSource Log { get; private set; }

		private void Awake()
		{
			//IL_0058: 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)
			//IL_009c: Expected O, but got Unknown
			Instance = this;
			Log = ((BaseUnityPlugin)this).Logger;
			EnabledConfig = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enabled", true, "When enabled, unplaced rope-spool previews use the yellow color instead of the vanilla blue.");
			PreviewColorConfig = ((BaseUnityPlugin)this).Config.Bind<Color>("General", "PreviewColor", new Color(0.95f, 0.82f, 0.12f, 1f), "Yellow used for the hanging rope while it is still attached to a spool.");
			ApplyToAntiRopeConfig = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "ApplyToAntiRope", true, "Also recolor anti-grav spool previews.");
			_harmony = new Harmony("tony4twentys.Piss_Ropes");
			_harmony.PatchAll(typeof(Plugin).Assembly);
			((BaseUnityPlugin)this).Logger.LogInfo((object)string.Format("{0} v{1} loaded.", "Piss Ropes", "1.0.0"));
		}

		private void OnDestroy()
		{
			if (_harmony != null)
			{
				_harmony.UnpatchSelf();
			}
			if ((Object)(object)Instance == (Object)(object)this)
			{
				Instance = null;
			}
			Log = null;
		}
	}
	internal static class GhostRopeColor
	{
		private static readonly string[] FallbackTintProperties = new string[11]
		{
			"_Color", "_BaseColor", "_Tint", "_Color0", "_Color1", "_Color2", "_Color21", "_Color3", "_Color4", "_TopColor",
			"_EmissionColor"
		};

		private static bool _loggedOnce;

		private static bool _loggedError;

		public static void Apply(RopeBoneVisualizer visualizer)
		{
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: 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_00f3: Unknown result type (might be due to invalid IL or missing references)
			if (Plugin.EnabledConfig == null || !Plugin.EnabledConfig.Value || (Object)(object)visualizer == (Object)null || (Object)(object)visualizer.ghostMaterial == (Object)null || (!Plugin.ApplyToAntiRopeConfig.Value && IsAntiRope(visualizer)))
			{
				return;
			}
			Color val = (Color)((Plugin.PreviewColorConfig != null) ? Plugin.PreviewColorConfig.Value : new Color(0.95f, 0.82f, 0.12f, 1f));
			Recolor(visualizer.ghostMaterial, val);
			if (!_loggedOnce)
			{
				_loggedOnce = true;
				Material ghostMaterial = visualizer.ghostMaterial;
				ManualLogSource log = Plugin.Log;
				if (log != null)
				{
					log.LogInfo((object)string.Format("Recolored spool preview '{0}' shader '{1}' to {2}.", ((Object)ghostMaterial).name, ((Object)(object)ghostMaterial.shader != (Object)null) ? ((Object)ghostMaterial.shader).name : "null", val));
				}
			}
		}

		public static void LogOnce(string message)
		{
			if (!_loggedError)
			{
				_loggedError = true;
				ManualLogSource log = Plugin.Log;
				if (log != null)
				{
					log.LogWarning((object)message);
				}
			}
		}

		private static bool IsAntiRope(RopeBoneVisualizer visualizer)
		{
			Rope rope = visualizer.rope;
			if ((Object)(object)rope != (Object)null)
			{
				if (rope.antigrav)
				{
					return true;
				}
				if ((Object)(object)rope.spool != (Object)null)
				{
					return rope.spool.isAntiRope;
				}
			}
			return false;
		}

		private static void Recolor(Material material, Color yellow)
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Invalid comparison between Unknown and I4
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: 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_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			if (material.HasProperty("_VertexGhost"))
			{
				material.SetFloat("_VertexGhost", 0f);
			}
			Shader shader = material.shader;
			bool flag = false;
			if ((Object)(object)shader != (Object)null)
			{
				int propertyCount = shader.GetPropertyCount();
				for (int i = 0; i < propertyCount; i++)
				{
					if ((int)shader.GetPropertyType(i) <= 0)
					{
						string propertyName = shader.GetPropertyName(i);
						if (IsTintProperty(propertyName))
						{
							Color color = material.GetColor(propertyName);
							material.SetColor(propertyName, MixYellow(yellow, color));
							flag = true;
						}
					}
				}
			}
			if (flag)
			{
				return;
			}
			for (int j = 0; j < FallbackTintProperties.Length; j++)
			{
				string text = FallbackTintProperties[j];
				if (material.HasProperty(text))
				{
					Color color2 = material.GetColor(text);
					material.SetColor(text, MixYellow(yellow, color2));
				}
			}
		}

		private static bool IsTintProperty(string name)
		{
			if (string.IsNullOrEmpty(name))
			{
				return false;
			}
			if (name.IndexOf("Remap", StringComparison.OrdinalIgnoreCase) >= 0 || name.IndexOf("Direction", StringComparison.OrdinalIgnoreCase) >= 0 || name.IndexOf("Offset", StringComparison.OrdinalIgnoreCase) >= 0 || name.IndexOf("Smoothstep", StringComparison.OrdinalIgnoreCase) >= 0 || name.IndexOf("Tightness", StringComparison.OrdinalIgnoreCase) >= 0 || name.IndexOf("HueShift", StringComparison.OrdinalIgnoreCase) >= 0)
			{
				return false;
			}
			return name.IndexOf("Color", StringComparison.OrdinalIgnoreCase) >= 0 || name.IndexOf("Tint", StringComparison.OrdinalIgnoreCase) >= 0;
		}

		private static Color MixYellow(Color yellow, Color current)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: 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_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			float num = Mathf.Max(current.r, Mathf.Max(current.g, current.b));
			Color result = yellow;
			result.a = current.a;
			if (num > 1f)
			{
				result.r *= num;
				result.g *= num;
				result.b *= num;
			}
			else if (num > 0.01f && num < 0.35f)
			{
				float num2 = num / 0.35f;
				result.r *= num2;
				result.g *= num2;
				result.b *= num2;
			}
			return result;
		}
	}
	[HarmonyPatch(typeof(RopeBoneVisualizer), "Awake")]
	internal static class RopeBoneVisualizer_Awake_Piss_Patch
	{
		private static void Postfix(RopeBoneVisualizer __instance)
		{
			try
			{
				GhostRopeColor.Apply(__instance);
			}
			catch (Exception ex)
			{
				GhostRopeColor.LogOnce("Preview recolor skipped: " + ex.Message);
			}
		}
	}
}