Decompiled source of TinyREPO v1.2.0

TinyRepo.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
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("Omniscye")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("TinyRepo")]
[assembly: AssemblyTitle("TinyRepo")]
[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 REPO.TinyPlayers
{
	public static class Entry
	{
		[RuntimeInitializeOnLoadMethod(/*Could not decode attribute arguments.*/)]
		private static void Bootstrap()
		{
			TinyPlayersMod.Init();
		}
	}
	[HarmonyPatch]
	public static class TinyPlayersMod
	{
		private static Harmony _harmony;

		private static bool _patched;

		public static void Init()
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Expected O, but got Unknown
			if (!_patched)
			{
				_patched = true;
				_harmony = new Harmony("repo.tinyplayers.toggle");
				_harmony.PatchAll(typeof(TinyPlayersMod).Assembly);
				Debug.Log((object)"[TinyPlayers] Harmony patches applied.");
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(RenderTextureMain), "Awake")]
		private static void RenderTextureMain_Awake_Postfix(RenderTextureMain __instance)
		{
			TinyController tinyController = default(TinyController);
			if (Object.op_Implicit((Object)(object)__instance) && !((Component)__instance).gameObject.TryGetComponent<TinyController>(ref tinyController))
			{
				((Component)__instance).gameObject.AddComponent<TinyController>();
			}
		}
	}
	public sealed class TinyController : MonoBehaviour
	{
		[CompilerGenerated]
		private sealed class <AvatarKeepTinyLoop>d__4 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public TinyController <>4__this;

			private WaitForSecondsRealtime <wait>5__1;

			private PlayerAvatar[] <avatars>5__2;

			private int <i>5__3;

			private PlayerAvatar <p>5__4;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <AvatarKeepTinyLoop>d__4(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<wait>5__1 = null;
				<avatars>5__2 = null;
				<p>5__4 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0029: Unknown result type (might be due to invalid IL or missing references)
				//IL_0033: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<wait>5__1 = new WaitForSecondsRealtime(0.75f);
					break;
				case 1:
					<>1__state = -1;
					<avatars>5__2 = null;
					break;
				}
				if (<>4__this.ModEnabled)
				{
					<avatars>5__2 = Object.FindObjectsByType<PlayerAvatar>((FindObjectsSortMode)0);
					<i>5__3 = 0;
					while (<i>5__3 < <avatars>5__2.Length)
					{
						<p>5__4 = <avatars>5__2[<i>5__3];
						if (Object.op_Implicit((Object)(object)<p>5__4) && ((Component)<p>5__4).gameObject.activeInHierarchy)
						{
							TinyAvatarUtil.AttachUniformScaler(<p>5__4, <>4__this.Factor);
							<p>5__4 = null;
						}
						<i>5__3++;
					}
					<>2__current = <wait>5__1;
					<>1__state = 1;
					return true;
				}
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		public bool ModEnabled = false;

		[Range(0.05f, 1f)]
		public float Factor = 0.3f;

		private Coroutine _avatarLoop;

		private void Update()
		{
			if (!Input.GetKeyDown((KeyCode)289))
			{
				return;
			}
			ModEnabled = !ModEnabled;
			if (ModEnabled)
			{
				((MonoBehaviour)this).StopAllCoroutines();
				_avatarLoop = ((MonoBehaviour)this).StartCoroutine(AvatarKeepTinyLoop());
				Debug.Log((object)"[TinyPlayers] ENABLED");
				return;
			}
			if (_avatarLoop != null)
			{
				((MonoBehaviour)this).StopCoroutine(_avatarLoop);
				_avatarLoop = null;
			}
			TinyAvatarUtil.DetachAll();
			Debug.Log((object)"[TinyPlayers] DISABLED");
		}

		[IteratorStateMachine(typeof(<AvatarKeepTinyLoop>d__4))]
		private IEnumerator AvatarKeepTinyLoop()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <AvatarKeepTinyLoop>d__4(0)
			{
				<>4__this = this
			};
		}

		private void OnDisable()
		{
			if (_avatarLoop != null)
			{
				((MonoBehaviour)this).StopCoroutine(_avatarLoop);
				_avatarLoop = null;
			}
			TinyAvatarUtil.DetachAll();
		}

		private void OnGUI()
		{
			//IL_0020: 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_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			//IL_0083: 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_00a1: Unknown result type (might be due to invalid IL or missing references)
			string text = (ModEnabled ? "Tiny Mode: ON (F8 to toggle)" : "Tiny Mode: OFF (F8 to toggle)");
			GUIStyle val = new GUIStyle(GUI.skin.label)
			{
				fontSize = 12
			};
			val.normal.textColor = Color.black;
			GUIStyle val2 = val;
			Rect val3 = default(Rect);
			((Rect)(ref val3))..ctor(10f, 10f, 400f, 30f);
			GUI.Label(new Rect(((Rect)(ref val3)).x + 1f, ((Rect)(ref val3)).y + 1f, ((Rect)(ref val3)).width, ((Rect)(ref val3)).height), text, val2);
			val2.normal.textColor = Color.green;
			GUI.Label(val3, text, val2);
		}
	}
	public sealed class AvatarUniformScaler : MonoBehaviour
	{
		public Transform Target;

		public float Factor = 0.3f;

		private Vector3 _origScale;

		private bool _hasOrig;

		public void Configure(Transform target, float factor)
		{
			//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)
			Target = target;
			Factor = Mathf.Clamp(factor, 0.05f, 1f);
			if (Object.op_Implicit((Object)(object)Target) && !_hasOrig)
			{
				_origScale = Target.localScale;
				_hasOrig = true;
			}
			((Behaviour)this).enabled = true;
		}

		private void LateUpdate()
		{
			//IL_003d: 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_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_0061: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)Target))
			{
				((Behaviour)this).enabled = false;
				return;
			}
			Vector3 val = default(Vector3);
			((Vector3)(ref val))..ctor(Factor, Factor, Factor);
			Vector3 val2 = Target.localScale - val;
			if (((Vector3)(ref val2)).sqrMagnitude > 1E-07f)
			{
				Target.localScale = val;
			}
		}

		private void OnDisable()
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)Target) && _hasOrig)
			{
				Target.localScale = _origScale;
			}
		}

		private void OnDestroy()
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)Target) && _hasOrig)
			{
				Target.localScale = _origScale;
			}
		}
	}
	internal static class TinyAvatarUtil
	{
		private static readonly string[] VISUALS_NAMES = new string[5] { "Player Visuals", "PlayerVisuals", "Player Visual", "Player_Visuals", "Visuals" };

		private static readonly string[] RIG_NAMES = new string[6] { "[RIG]", "RIG", "Rig", "Armature", "Root", "RootTransform" };

		private static readonly Dictionary<PlayerAvatar, Transform> _cachedTarget = new Dictionary<PlayerAvatar, Transform>();

		public static void AttachUniformScaler(PlayerAvatar avatar, float factor)
		{
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_012a: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)avatar))
			{
				if (!_cachedTarget.TryGetValue(avatar, out Transform value) || !Object.op_Implicit((Object)(object)value))
				{
					(Transform visuals, Transform rig, Transform usedRoot) tuple = ResolveAvatarRigLoose(((Component)avatar).transform);
					Transform item = tuple.visuals;
					Transform item2 = tuple.rig;
					Transform item3 = tuple.usedRoot;
					value = item2 ?? item ?? ((Component)avatar).transform;
					_cachedTarget[avatar] = value;
					Debug.Log((object)("[TinyPlayers] target -> root: " + ((item3 != null) ? ((Object)item3).name : null) + ", visuals: " + (Object.op_Implicit((Object)(object)item) ? ((Object)item).name : "<null>") + ", rig: " + (Object.op_Implicit((Object)(object)item2) ? ((Object)item2).name : "<null>") + ", use: " + ((Object)value).name));
				}
				AvatarUniformScaler avatarUniformScaler = ((Component)avatar).GetComponent<AvatarUniformScaler>() ?? ((Component)avatar).gameObject.AddComponent<AvatarUniformScaler>();
				avatarUniformScaler.Configure(value, factor);
				Vector3 val = default(Vector3);
				((Vector3)(ref val))..ctor(factor, factor, factor);
				Vector3 val2 = value.localScale - val;
				if (((Vector3)(ref val2)).sqrMagnitude > 1E-07f)
				{
					value.localScale = val;
				}
			}
		}

		public static void DetachAll()
		{
			AvatarUniformScaler[] array = Object.FindObjectsByType<AvatarUniformScaler>((FindObjectsSortMode)0);
			foreach (AvatarUniformScaler avatarUniformScaler in array)
			{
				if (Object.op_Implicit((Object)(object)avatarUniformScaler))
				{
					((Behaviour)avatarUniformScaler).enabled = false;
					Object.Destroy((Object)(object)avatarUniformScaler);
				}
			}
			_cachedTarget.Clear();
		}

		private static (Transform visuals, Transform rig, Transform usedRoot) ResolveAvatarRigLoose(Transform avatarNode)
		{
			if (!Object.op_Implicit((Object)(object)avatarNode))
			{
				return (null, null, null);
			}
			Transform val = FindNearestAncestorWhoseSubtreeHasLoose(avatarNode, VISUALS_NAMES) ?? avatarNode;
			Transform val2 = FindLooseBFS(val, VISUALS_NAMES);
			Transform val3 = (Object.op_Implicit((Object)(object)val2) ? FindLooseBFS(val2, RIG_NAMES) : null);
			if (!Object.op_Implicit((Object)(object)val3))
			{
				val3 = FindLooseBFS(avatarNode, RIG_NAMES);
			}
			return (val2, val3, val);
		}

		private static string Normalize(string s)
		{
			if (string.IsNullOrEmpty(s))
			{
				return "";
			}
			IEnumerable<char> source = from ch in s.ToLowerInvariant()
				where ch != ' ' && ch != '_' && ch != '-' && ch != '[' && ch != ']' && ch != '(' && ch != ')' && ch != '{' && ch != '}' && ch != '.'
				select ch;
			return new string(source.ToArray());
		}

		private static Transform FindLooseBFS(Transform root, params string[] names)
		{
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Expected O, but got Unknown
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Expected O, but got Unknown
			if (!Object.op_Implicit((Object)(object)root))
			{
				return null;
			}
			string[] source = names.Select(Normalize).ToArray();
			foreach (Transform item in root)
			{
				Transform val = item;
				string cn2 = Normalize(((Object)val).name);
				if (source.Any((string t) => t == cn2))
				{
					return val;
				}
			}
			Queue<Transform> queue = new Queue<Transform>();
			queue.Enqueue(root);
			while (queue.Count > 0)
			{
				Transform val2 = queue.Dequeue();
				foreach (Transform item2 in val2)
				{
					Transform val3 = item2;
					string cn = Normalize(((Object)val3).name);
					if (source.Any((string t) => t == cn || cn.Contains(t)))
					{
						return val3;
					}
					queue.Enqueue(val3);
				}
			}
			return null;
		}

		private static Transform FindNearestAncestorWhoseSubtreeHasLoose(Transform start, params string[] names)
		{
			Transform val = start;
			while ((Object)(object)val != (Object)null)
			{
				if (Object.op_Implicit((Object)(object)FindLooseBFS(val, names)))
				{
					return val;
				}
				val = val.parent;
			}
			return null;
		}
	}
	[HarmonyPatch(typeof(PlayerAvatar), "Start")]
	internal static class Patch_TinyPlayer_OnStart
	{
		private static void Postfix(PlayerAvatar __instance)
		{
			TinyController tinyController = Object.FindFirstObjectByType<TinyController>();
			if (Object.op_Implicit((Object)(object)__instance) && !((Object)(object)tinyController == (Object)null) && tinyController.ModEnabled)
			{
				TinyAvatarUtil.AttachUniformScaler(__instance, tinyController.Factor);
			}
		}
	}
}
namespace TinyRepo
{
	[BepInPlugin("Omniscye.TinyRepo", "TinyRepo", "1.0")]
	public class TinyRepo : BaseUnityPlugin
	{
		internal static TinyRepo 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();
			}
		}

		private void Update()
		{
		}
	}
}