Decompiled source of TranslucentCart v1.0.1

TranslucentCart.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
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.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("")]
[assembly: AssemblyCompany("Tolga")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("TranslucentCart")]
[assembly: AssemblyTitle("TranslucentCart")]
[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 TranslucentCart
{
	[HarmonyPatch(typeof(PhysGrabCart))]
	internal static class PhysGrabCartPatch
	{
		[HarmonyPostfix]
		[HarmonyPatch("Start")]
		private static void Start_Postfix(PhysGrabCart __instance)
		{
			TranslucentCart.ApplyCartTransparency(__instance);
		}

		[HarmonyPostfix]
		[HarmonyPatch("StateSwitchRPC")]
		private static void StateSwitchRPC_Postfix(PhysGrabCart __instance)
		{
			TranslucentCart.ApplyCartTransparency(__instance);
		}
	}
	[HarmonyPatch(typeof(PhysGrabObject))]
	internal static class PhysGrabObjectCartGrabPatch
	{
		[HarmonyPostfix]
		[HarmonyPatch("GrabStarted")]
		private static void GrabStarted_Postfix(PhysGrabObject __instance)
		{
			PhysGrabCart component = ((Component)__instance).GetComponent<PhysGrabCart>();
			if (Object.op_Implicit((Object)(object)component))
			{
				TranslucentCart.ApplyCartTransparency(component);
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("GrabEnded")]
		private static void GrabEnded_Postfix(PhysGrabObject __instance)
		{
			PhysGrabCart component = ((Component)__instance).GetComponent<PhysGrabCart>();
			if (Object.op_Implicit((Object)(object)component))
			{
				TranslucentCart.ApplyCartTransparency(component);
			}
		}
	}
	[BepInPlugin("Tolga.TranslucentCart", "TranslucentCart", "1.0")]
	public class TranslucentCart : BaseUnityPlugin
	{
		private struct MaterialSnapshot
		{
			public bool Initialized;

			public int RenderQueue;

			public string RenderTypeTag;

			public bool HasSurface;

			public float Surface;

			public bool HasMode;

			public float Mode;

			public bool HasSrcBlend;

			public int SrcBlend;

			public bool HasDstBlend;

			public int DstBlend;

			public bool HasZWrite;

			public int ZWrite;

			public bool HasAlphaClip;

			public float AlphaClip;

			public bool HasCutoff;

			public float Cutoff;

			public bool AlphaTestKeyword;

			public bool AlphaBlendKeyword;

			public bool AlphaPremultiplyKeyword;

			public bool HasColor;

			public Color Color;

			public bool HasBaseColor;

			public Color BaseColor;

			public bool HasTintColor;

			public Color TintColor;
		}

		private struct RendererSnapshot
		{
			public bool Initialized;

			public bool Enabled;

			public ShadowCastingMode ShadowCastingMode;

			public bool ReceiveShadows;
		}

		private static readonly Dictionary<int, MaterialSnapshot> MaterialSnapshots = new Dictionary<int, MaterialSnapshot>();

		private static readonly Dictionary<int, RendererSnapshot> RendererSnapshots = new Dictionary<int, RendererSnapshot>();

		private static readonly HashSet<string> VanillaCartNames = new HashSet<string> { "Item Cart Small", "Item Cart Medium" };

		private static readonly HashSet<string> CustomCartNames = new HashSet<string> { "Shopping Cart" };

		private static readonly HashSet<string> SeenCartNames = new HashSet<string>();

		private static bool _refreshAllCartsRequested;

		internal static TranslucentCart Instance { get; private set; } = null;


		internal static ManualLogSource Logger => Instance._logger;

		private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger;

		internal Harmony? Harmony { get; set; }

		internal static ConfigEntry<float> CartTransparencyPercent { get; private set; } = null;


		internal static ConfigEntry<bool> OnlyWhenGrabbing { get; private set; } = null;


		internal static ConfigEntry<bool> IncludeCustomCarts { get; private set; } = null;


		internal static float CartAlpha
		{
			get
			{
				float num = Mathf.Clamp(CartTransparencyPercent.Value, 0f, 100f) / 100f;
				return Mathf.Clamp01(1f - num);
			}
		}

		private void Awake()
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Expected O, but got Unknown
			Instance = this;
			CartTransparencyPercent = ((BaseUnityPlugin)this).Config.Bind<float>("General", "CartTransparencyPercent", 40f, new ConfigDescription("How transparent the cart should be as a percent. 0 = opaque, 100 = invisible.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 100f), Array.Empty<object>()));
			OnlyWhenGrabbing = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "OnlyWhenGrabbing", false, "If true, only apply transparency while you are grabbing the cart (local player). If false, always apply.");
			IncludeCustomCarts = ((BaseUnityPlugin)this).Config.Bind<bool>("Compatibility", "IncludeCustomCarts", false, "If true, also apply translucency to custom/modded carts (not just vanilla carts). Uses a safer cutout-preserving transparency mode for basket/wire meshes to avoid black/solid artifacts.");
			CartTransparencyPercent.SettingChanged += OnAnySettingChanged;
			OnlyWhenGrabbing.SettingChanged += OnAnySettingChanged;
			IncludeCustomCarts.SettingChanged += OnAnySettingChanged;
			((BaseUnityPlugin)this).Config.ConfigReloaded += OnConfigReloaded;
			((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!");
		}

		private void OnDestroy()
		{
			try
			{
				CartTransparencyPercent.SettingChanged -= OnAnySettingChanged;
				OnlyWhenGrabbing.SettingChanged -= OnAnySettingChanged;
				IncludeCustomCarts.SettingChanged -= OnAnySettingChanged;
				((BaseUnityPlugin)this).Config.ConfigReloaded -= OnConfigReloaded;
			}
			catch
			{
			}
		}

		private static void OnAnySettingChanged(object sender, EventArgs e)
		{
			RequestRefreshAllCarts();
		}

		private static void OnConfigReloaded(object sender, EventArgs e)
		{
			RequestRefreshAllCarts();
		}

		private static void RequestRefreshAllCarts()
		{
			_refreshAllCartsRequested = true;
		}

		internal void Patch()
		{
			//IL_0019: 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_0020: Expected O, but got Unknown
			//IL_0025: 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();
			}
		}

		private void Update()
		{
			if (_refreshAllCartsRequested)
			{
				_refreshAllCartsRequested = false;
				RefreshAllCarts();
			}
		}

		internal static void RefreshAllCarts()
		{
			PhysGrabCart[] array;
			try
			{
				array = Object.FindObjectsOfType<PhysGrabCart>();
			}
			catch
			{
				return;
			}
			PhysGrabCart[] array2 = array;
			foreach (PhysGrabCart cart in array2)
			{
				ApplyCartTransparency(cart);
			}
		}

		internal static void ApplyCartTransparency(PhysGrabCart cart)
		{
			if (!Object.op_Implicit((Object)(object)cart))
			{
				return;
			}
			string text = ((Object)cart).name.Replace("(Clone)", "").Trim();
			if (!SeenCartNames.Contains(text))
			{
				SeenCartNames.Add(text);
				Logger.LogInfo((object)("[CartDiscovery] New cart type seen: '" + text + "'"));
			}
			bool flag = IsLikelyCustomCart(cart);
			if (flag && !IncludeCustomCarts.Value)
			{
				Logger.LogInfo((object)("[CartTransparency] '" + text + "' → SKIPPED (custom cart, IncludeCustomCarts=false)"));
				RestoreCartOpacity(cart);
				return;
			}
			if (!flag)
			{
				Logger.LogInfo((object)("[CartTransparency] '" + text + "' → APPLYING (vanilla cart)"));
			}
			else
			{
				Logger.LogInfo((object)("[CartTransparency] '" + text + "' → APPLYING (custom cart, IncludeCustomCarts=true)"));
			}
			float effectiveAlpha = GetEffectiveAlpha(cart);
			Renderer[] componentsInChildren = ((Component)cart).GetComponentsInChildren<Renderer>(true);
			foreach (Renderer val in componentsInChildren)
			{
				if ((val is MeshRenderer || val is SkinnedMeshRenderer) && !((Object)(object)((Component)val).GetComponent("TMPro.TMP_Text") != (Object)null) && !((Object)(object)((Component)val).GetComponent("TMPro.TextMeshPro") != (Object)null))
				{
					Material[] materials;
					try
					{
						materials = val.materials;
					}
					catch
					{
						continue;
					}
					Material[] array = materials;
					foreach (Material material in array)
					{
						bool preferCutout = flag || IsBasketLike(((Object)((Component)val).gameObject).name);
						ApplyMaterialFade(material, effectiveAlpha, preferCutout);
					}
					ApplyRendererShadowRules(val, effectiveAlpha);
				}
			}
		}

		private static void RestoreCartOpacity(PhysGrabCart cart)
		{
			Renderer[] componentsInChildren = ((Component)cart).GetComponentsInChildren<Renderer>(true);
			foreach (Renderer val in componentsInChildren)
			{
				if (val is MeshRenderer || val is SkinnedMeshRenderer)
				{
					Material[] materials;
					try
					{
						materials = val.materials;
					}
					catch
					{
						continue;
					}
					Material[] array = materials;
					foreach (Material material in array)
					{
						ApplyMaterialFade(material, 1f, preferCutout: false);
					}
					ApplyRendererShadowRules(val, 1f);
				}
			}
		}

		private static float GetEffectiveAlpha(PhysGrabCart cart)
		{
			if (!OnlyWhenGrabbing.Value)
			{
				return CartAlpha;
			}
			PhysGrabObject val;
			try
			{
				val = ((Component)cart).GetComponent<PhysGrabObject>();
			}
			catch
			{
				val = null;
			}
			if (!((Object)(object)val != (Object)null) || !val.grabbedLocal)
			{
				return 1f;
			}
			return CartAlpha;
		}

		private static void ApplyRendererShadowRules(Renderer renderer, float alphaMultiplier)
		{
			//IL_0046: 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_0091: Unknown result type (might be due to invalid IL or missing references)
			alphaMultiplier = Mathf.Clamp01(alphaMultiplier);
			int instanceID = ((Object)renderer).GetInstanceID();
			if (!RendererSnapshots.TryGetValue(instanceID, out var value) || !value.Initialized)
			{
				RendererSnapshot rendererSnapshot = default(RendererSnapshot);
				rendererSnapshot.Initialized = true;
				rendererSnapshot.Enabled = renderer.enabled;
				rendererSnapshot.ShadowCastingMode = renderer.shadowCastingMode;
				rendererSnapshot.ReceiveShadows = renderer.receiveShadows;
				value = rendererSnapshot;
				RendererSnapshots[instanceID] = value;
			}
			if (alphaMultiplier <= 0.001f)
			{
				renderer.enabled = false;
				renderer.shadowCastingMode = (ShadowCastingMode)0;
			}
			else
			{
				renderer.enabled = value.Enabled;
				renderer.shadowCastingMode = value.ShadowCastingMode;
			}
			renderer.receiveShadows = value.ReceiveShadows;
		}

		private static void ApplyMaterialFade(Material material, float alphaMultiplier, bool preferCutout)
		{
			//IL_0083: 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)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: 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_00c8: 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_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)material))
			{
				return;
			}
			alphaMultiplier = Mathf.Clamp01(alphaMultiplier);
			int instanceID = ((Object)material).GetInstanceID();
			if (!MaterialSnapshots.TryGetValue(instanceID, out var value) || !value.Initialized)
			{
				value = CaptureSnapshot(material);
				MaterialSnapshots[instanceID] = value;
			}
			if (alphaMultiplier >= 0.999f)
			{
				RestoreSnapshot(material, value);
				return;
			}
			if (preferCutout || IsCutoutLike(material, value))
			{
				SetMaterialTransparentPreserveCutout(material, value);
			}
			else
			{
				SetMaterialTransparent(material);
			}
			if (value.HasColor && material.HasProperty("_Color"))
			{
				Color color = value.Color;
				color.a = Mathf.Clamp01(value.Color.a * alphaMultiplier);
				material.color = color;
			}
			if (value.HasBaseColor && material.HasProperty("_BaseColor"))
			{
				Color baseColor = value.BaseColor;
				baseColor.a = Mathf.Clamp01(value.BaseColor.a * alphaMultiplier);
				material.SetColor("_BaseColor", baseColor);
			}
			if (value.HasTintColor && material.HasProperty("_TintColor"))
			{
				Color tintColor = value.TintColor;
				tintColor.a = Mathf.Clamp01(value.TintColor.a * alphaMultiplier);
				material.SetColor("_TintColor", tintColor);
			}
		}

		private static MaterialSnapshot CaptureSnapshot(Material material)
		{
			//IL_0196: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
			//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)
			MaterialSnapshot materialSnapshot = default(MaterialSnapshot);
			materialSnapshot.Initialized = true;
			materialSnapshot.RenderQueue = material.renderQueue;
			materialSnapshot.RenderTypeTag = material.GetTag("RenderType", false, "");
			MaterialSnapshot result = materialSnapshot;
			if (material.HasProperty("_Surface"))
			{
				result.HasSurface = true;
				result.Surface = material.GetFloat("_Surface");
			}
			if (material.HasProperty("_Mode"))
			{
				result.HasMode = true;
				result.Mode = material.GetFloat("_Mode");
			}
			if (material.HasProperty("_SrcBlend"))
			{
				result.HasSrcBlend = true;
				result.SrcBlend = material.GetInt("_SrcBlend");
			}
			if (material.HasProperty("_DstBlend"))
			{
				result.HasDstBlend = true;
				result.DstBlend = material.GetInt("_DstBlend");
			}
			if (material.HasProperty("_ZWrite"))
			{
				result.HasZWrite = true;
				result.ZWrite = material.GetInt("_ZWrite");
			}
			if (material.HasProperty("_AlphaClip"))
			{
				result.HasAlphaClip = true;
				result.AlphaClip = material.GetFloat("_AlphaClip");
			}
			if (material.HasProperty("_Cutoff"))
			{
				result.HasCutoff = true;
				result.Cutoff = material.GetFloat("_Cutoff");
			}
			result.AlphaTestKeyword = material.IsKeywordEnabled("_ALPHATEST_ON");
			result.AlphaBlendKeyword = material.IsKeywordEnabled("_ALPHABLEND_ON");
			result.AlphaPremultiplyKeyword = material.IsKeywordEnabled("_ALPHAPREMULTIPLY_ON");
			if (material.HasProperty("_Color"))
			{
				result.HasColor = true;
				result.Color = material.color;
			}
			if (material.HasProperty("_BaseColor"))
			{
				result.HasBaseColor = true;
				result.BaseColor = material.GetColor("_BaseColor");
			}
			if (material.HasProperty("_TintColor"))
			{
				result.HasTintColor = true;
				result.TintColor = material.GetColor("_TintColor");
			}
			return result;
		}

		private static void RestoreSnapshot(Material material, MaterialSnapshot snap)
		{
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
			material.renderQueue = snap.RenderQueue;
			material.SetOverrideTag("RenderType", snap.RenderTypeTag);
			if (snap.HasSurface && material.HasProperty("_Surface"))
			{
				material.SetFloat("_Surface", snap.Surface);
			}
			if (snap.HasMode && material.HasProperty("_Mode"))
			{
				material.SetFloat("_Mode", snap.Mode);
			}
			if (snap.HasSrcBlend && material.HasProperty("_SrcBlend"))
			{
				material.SetInt("_SrcBlend", snap.SrcBlend);
			}
			if (snap.HasDstBlend && material.HasProperty("_DstBlend"))
			{
				material.SetInt("_DstBlend", snap.DstBlend);
			}
			if (snap.HasZWrite && material.HasProperty("_ZWrite"))
			{
				material.SetInt("_ZWrite", snap.ZWrite);
			}
			if (snap.HasAlphaClip && material.HasProperty("_AlphaClip"))
			{
				material.SetFloat("_AlphaClip", snap.AlphaClip);
			}
			if (snap.HasCutoff && material.HasProperty("_Cutoff"))
			{
				material.SetFloat("_Cutoff", snap.Cutoff);
			}
			if (snap.AlphaTestKeyword)
			{
				material.EnableKeyword("_ALPHATEST_ON");
			}
			else
			{
				material.DisableKeyword("_ALPHATEST_ON");
			}
			if (snap.AlphaBlendKeyword)
			{
				material.EnableKeyword("_ALPHABLEND_ON");
			}
			else
			{
				material.DisableKeyword("_ALPHABLEND_ON");
			}
			if (snap.AlphaPremultiplyKeyword)
			{
				material.EnableKeyword("_ALPHAPREMULTIPLY_ON");
			}
			else
			{
				material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
			}
			if (snap.HasColor && material.HasProperty("_Color"))
			{
				material.color = snap.Color;
			}
			if (snap.HasBaseColor && material.HasProperty("_BaseColor"))
			{
				material.SetColor("_BaseColor", snap.BaseColor);
			}
			if (snap.HasTintColor && material.HasProperty("_TintColor"))
			{
				material.SetColor("_TintColor", snap.TintColor);
			}
		}

		private static void SetMaterialTransparent(Material material)
		{
			material.SetOverrideTag("RenderType", "Transparent");
			if (material.HasProperty("_Surface"))
			{
				material.SetFloat("_Surface", 1f);
			}
			if (material.HasProperty("_Mode"))
			{
				material.SetFloat("_Mode", 3f);
			}
			if (material.HasProperty("_SrcBlend"))
			{
				material.SetInt("_SrcBlend", 5);
			}
			if (material.HasProperty("_DstBlend"))
			{
				material.SetInt("_DstBlend", 10);
			}
			if (material.HasProperty("_ZWrite"))
			{
				material.SetInt("_ZWrite", 0);
			}
			material.DisableKeyword("_ALPHATEST_ON");
			material.EnableKeyword("_ALPHABLEND_ON");
			material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
			material.renderQueue = 3000;
		}

		private static bool IsLikelyCustomCart(PhysGrabCart cart)
		{
			string text = ((Object)cart).name.Replace("(Clone)", "").Trim();
			if (CustomCartNames.Contains(text))
			{
				Logger.LogInfo((object)("[CartDetection] '" + text + "' → CUSTOM (in explicit custom list)"));
				return true;
			}
			if (VanillaCartNames.Count > 0 && !VanillaCartNames.Contains(text))
			{
				Logger.LogInfo((object)("[CartDetection] '" + text + "' → CUSTOM (not in vanilla whitelist)"));
				return true;
			}
			int num = 0;
			try
			{
				MonoBehaviour[] componentsInChildren = ((Component)cart).GetComponentsInChildren<MonoBehaviour>(true);
				MonoBehaviour[] array = componentsInChildren;
				foreach (MonoBehaviour val in array)
				{
					if ((Object)(object)val == (Object)null)
					{
						num++;
					}
				}
				if (num > 0)
				{
					Logger.LogInfo((object)$"[CartDetection] '{text}' → CUSTOM (found {num} missing script(s))");
					return true;
				}
			}
			catch
			{
			}
			List<string> list = new List<string>();
			try
			{
				Component[] componentsInChildren2 = ((Component)cart).GetComponentsInChildren<Component>(true);
				Component[] array2 = componentsInChildren2;
				foreach (Component val2 in array2)
				{
					if (!((Object)(object)val2 == (Object)null) && !((Object)(object)val2 == (Object)(object)cart))
					{
						Type type = ((object)val2).GetType();
						string text2 = type.Assembly.GetName().Name ?? string.Empty;
						if (!IsVanillaAssemblyName(text2) && !list.Contains(text2))
						{
							list.Add(text2);
						}
					}
				}
				if (list.Count > 0)
				{
					Logger.LogInfo((object)("[CartDetection] '" + text + "' → CUSTOM (non-vanilla assemblies: " + string.Join(", ", list) + ")"));
					return true;
				}
			}
			catch
			{
			}
			Logger.LogInfo((object)("[CartDetection] '" + text + "' → VANILLA (passed all custom checks)"));
			return false;
		}

		private static bool IsVanillaAssemblyName(string assemblyName)
		{
			if (string.IsNullOrEmpty(assemblyName))
			{
				return true;
			}
			if (assemblyName == "Assembly-CSharp")
			{
				return true;
			}
			if (assemblyName.StartsWith("Assembly-CSharp-", StringComparison.OrdinalIgnoreCase))
			{
				return true;
			}
			if (assemblyName.StartsWith("Unity", StringComparison.OrdinalIgnoreCase))
			{
				return true;
			}
			if (assemblyName.IndexOf("Photon", StringComparison.OrdinalIgnoreCase) >= 0)
			{
				return true;
			}
			switch (assemblyName)
			{
			case "TMPro":
				return true;
			default:
				if (!assemblyName.StartsWith("System.", StringComparison.OrdinalIgnoreCase))
				{
					if (assemblyName == "netstandard")
					{
						return true;
					}
					return false;
				}
				goto case "mscorlib";
			case "mscorlib":
			case "System":
				return true;
			}
		}

		private static bool IsBasketLike(string name)
		{
			if (string.IsNullOrEmpty(name))
			{
				return false;
			}
			string text = name.ToLowerInvariant();
			if (!text.Contains("basket") && !text.Contains("wire") && !text.Contains("grid") && !text.Contains("net") && !text.Contains("mesh"))
			{
				return text.Contains("cage");
			}
			return true;
		}

		private static bool IsCutoutLike(Material material, MaterialSnapshot snap)
		{
			if (snap.AlphaTestKeyword)
			{
				return true;
			}
			if (!string.IsNullOrEmpty(snap.RenderTypeTag) && snap.RenderTypeTag.ToLowerInvariant().Contains("cutout"))
			{
				return true;
			}
			if (material.HasProperty("_AlphaClip"))
			{
				try
				{
					if (material.GetFloat("_AlphaClip") > 0.5f)
					{
						return true;
					}
				}
				catch
				{
				}
			}
			if (material.HasProperty("_Cutoff"))
			{
				return true;
			}
			if (snap.HasMode && Mathf.Abs(snap.Mode - 1f) < 0.01f)
			{
				return true;
			}
			return false;
		}

		private static void SetMaterialTransparentPreserveCutout(Material material, MaterialSnapshot snap)
		{
			material.SetOverrideTag("RenderType", "TransparentCutout");
			if (material.HasProperty("_Surface"))
			{
				material.SetFloat("_Surface", 1f);
			}
			if (material.HasProperty("_AlphaClip"))
			{
				material.SetFloat("_AlphaClip", 1f);
			}
			if (material.HasProperty("_Cutoff"))
			{
				float num = 0.5f;
				try
				{
					if (snap.HasCutoff)
					{
						num = snap.Cutoff;
					}
				}
				catch
				{
				}
				material.SetFloat("_Cutoff", num);
			}
			if (material.HasProperty("_Mode"))
			{
				material.SetFloat("_Mode", 3f);
			}
			if (material.HasProperty("_SrcBlend"))
			{
				material.SetInt("_SrcBlend", 5);
			}
			if (material.HasProperty("_DstBlend"))
			{
				material.SetInt("_DstBlend", 10);
			}
			if (material.HasProperty("_ZWrite"))
			{
				material.SetInt("_ZWrite", 0);
			}
			if (snap.AlphaTestKeyword)
			{
				material.EnableKeyword("_ALPHATEST_ON");
			}
			material.EnableKeyword("_ALPHABLEND_ON");
			material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
			material.renderQueue = 3000;
		}

		private static void SetMaterialOpaque(Material material)
		{
			material.SetOverrideTag("RenderType", "Opaque");
			if (material.HasProperty("_Surface"))
			{
				material.SetFloat("_Surface", 0f);
			}
			if (material.HasProperty("_Mode"))
			{
				material.SetFloat("_Mode", 0f);
			}
			if (material.HasProperty("_SrcBlend"))
			{
				material.SetInt("_SrcBlend", 1);
			}
			if (material.HasProperty("_DstBlend"))
			{
				material.SetInt("_DstBlend", 0);
			}
			if (material.HasProperty("_ZWrite"))
			{
				material.SetInt("_ZWrite", 1);
			}
			material.DisableKeyword("_ALPHATEST_ON");
			material.DisableKeyword("_ALPHABLEND_ON");
			material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
			material.renderQueue = 2000;
		}
	}
}