Decompiled source of Empress RPCVisualizer v1.0.0

EmpressRPCVisualizer.dll

Decompiled 3 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 ExitGames.Client.Photon;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine;
using UnityEngine.SceneManagement;

[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: AssemblyCompany("Omniscye")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("EmpressRPCVisualizer")]
[assembly: AssemblyTitle("EmpressRPCVisualizer")]
[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 Empress.RpcViz
{
	[BepInPlugin("Empress.RpcViz", "Empress_RpcViz", "1.1.0")]
	public class Empress_RpcViz : BaseUnityPlugin
	{
		internal class Visualizer
		{
			private class Dot
			{
				public GameObject go = null;

				public Vector3 from;

				public Vector3 to;

				public float t;

				public float travelTime;
			}

			private readonly Transform _root;

			private readonly List<Dot> _active = new List<Dot>(64);

			private readonly Stack<GameObject> _pool = new Stack<GameObject>();

			private const float Speed = 14f;

			private const float MinTime = 0.08f;

			private const float MaxTime = 0.8f;

			public int MaxActive { get; set; }

			public float Scale { get; set; }

			public Visualizer(Transform root, int maxActive, float scale)
			{
				_root = root;
				MaxActive = maxActive;
				Scale = scale;
			}

			public void Tick(float dt)
			{
				//IL_0069: Unknown result type (might be due to invalid IL or missing references)
				//IL_006f: 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_008b: Unknown result type (might be due to invalid IL or missing references)
				for (int num = _active.Count - 1; num >= 0; num--)
				{
					Dot dot = _active[num];
					dot.t += dt / dot.travelTime;
					if (dot.t >= 1f)
					{
						Reclaim(dot.go);
						_active.RemoveAt(num);
					}
					else
					{
						Vector3 position = Vector3.LerpUnclamped(dot.from, dot.to, dot.t);
						dot.go.transform.position = position;
					}
				}
			}

			public void Shoot(Vector3 from, Vector3 to, Color color)
			{
				//IL_001e: 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_0026: Unknown result type (might be due to invalid IL or missing references)
				//IL_004a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0064: Unknown result type (might be due to invalid IL or missing references)
				//IL_0065: Unknown result type (might be due to invalid IL or missing references)
				//IL_006b: Unknown result type (might be due to invalid IL or missing references)
				//IL_006c: Unknown result type (might be due to invalid IL or missing references)
				if (_active.Count < MaxActive)
				{
					GameObject val = Spawn(color);
					float num = Vector3.Distance(from, to);
					float travelTime = Mathf.Clamp(num / 14f, 0.08f, 0.8f);
					val.transform.position = from;
					_active.Add(new Dot
					{
						go = val,
						from = from,
						to = to,
						t = 0f,
						travelTime = travelTime
					});
				}
			}

			private GameObject Spawn(Color tint)
			{
				//IL_0084: 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_0033: Unknown result type (might be due to invalid IL or missing references)
				//IL_003e: 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_0104: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f2: Expected O, but got Unknown
				GameObject val;
				if (_pool.Count > 0)
				{
					val = _pool.Pop();
					if (Object.op_Implicit((Object)(object)val))
					{
						val.transform.localScale = Vector3.one * Scale;
						ApplyColor(val, tint);
					}
					return val;
				}
				val = GameObject.CreatePrimitive((PrimitiveType)0);
				((Object)val).hideFlags = (HideFlags)61;
				val.transform.SetParent(_root, false);
				val.transform.localScale = Vector3.one * Scale;
				Collider component = val.GetComponent<Collider>();
				if (Object.op_Implicit((Object)(object)component))
				{
					component.enabled = false;
				}
				MeshRenderer component2 = val.GetComponent<MeshRenderer>();
				if ((Object)(object)component2 != (Object)null)
				{
					Shader val2 = Shader.Find("Unlit/Color");
					if ((Object)(object)val2 != (Object)null)
					{
						((Renderer)component2).material = new Material(val2);
					}
					EnsureTransparent(((Renderer)component2).material);
				}
				ApplyColor(val, tint);
				return val;
			}

			private void ApplyColor(GameObject go, Color tint)
			{
				//IL_0031: Unknown result type (might be due to invalid IL or missing references)
				//IL_0032: Unknown result type (might be due to invalid IL or missing references)
				//IL_004a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0068: Unknown result type (might be due to invalid IL or missing references)
				//IL_0086: 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)
				//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
				//IL_00be: Unknown result type (might be due to invalid IL or missing references)
				MeshRenderer component = go.GetComponent<MeshRenderer>();
				if ((Object)(object)component == (Object)null)
				{
					return;
				}
				Material material = ((Renderer)component).material;
				if (!((Object)(object)material == (Object)null))
				{
					if (material.HasProperty("_BaseColor"))
					{
						material.SetColor("_BaseColor", tint);
					}
					if (material.HasProperty("_Color"))
					{
						material.SetColor("_Color", tint);
					}
					if (material.HasProperty("_AlbedoColor"))
					{
						material.SetColor("_AlbedoColor", tint);
					}
					if (material.HasProperty("_EmissionColor"))
					{
						Color val = default(Color);
						((Color)(ref val))..ctor(tint.r, tint.g, tint.b);
						material.SetColor("_EmissionColor", val);
						material.EnableKeyword("_EMISSION");
					}
					EnsureTransparent(material);
				}
			}

			private void EnsureTransparent(Material mat)
			{
				if (!((Object)(object)mat == (Object)null))
				{
					if (mat.HasProperty("_Surface"))
					{
						mat.SetFloat("_Surface", 1f);
					}
					if (mat.HasProperty("_Mode"))
					{
						mat.SetFloat("_Mode", 3f);
					}
					mat.SetInt("_SrcBlend", 5);
					mat.SetInt("_DstBlend", 10);
					mat.SetInt("_ZWrite", 0);
					mat.DisableKeyword("_ALPHATEST_ON");
					mat.EnableKeyword("_ALPHABLEND_ON");
					mat.DisableKeyword("_ALPHAPREMULTIPLY_ON");
					mat.renderQueue = 3000;
				}
			}

			private void Reclaim(GameObject go)
			{
				if (Object.op_Implicit((Object)(object)go))
				{
					_pool.Push(go);
				}
			}
		}

		private bool _subscribed;

		private static byte _rpcEventCode = byte.MaxValue;

		internal static Visualizer _viz;

		private ConfigEntry<bool> _enableInboundRPC = null;

		private ConfigEntry<bool> _enableOutboundRPC = null;

		private ConfigEntry<bool> _ignoreSelfInbound = null;

		private ConfigEntry<string> _rpcMethodAllow = null;

		private ConfigEntry<string> _rpcMethodBlock = null;

		private ConfigEntry<string> _allowedTargets = null;

		private ConfigEntry<float> _perActorMinInterval = null;

		private ConfigEntry<int> _maxActiveDots = null;

		private ConfigEntry<float> _dotScale = null;

		private readonly HashSet<string> _allowedTargetSet = new HashSet<string>(StringComparer.OrdinalIgnoreCase);

		private readonly string[] _empty = Array.Empty<string>();

		private string[] _allowNames = Array.Empty<string>();

		private string[] _blockNames = Array.Empty<string>();

		private readonly Dictionary<int, float> _lastInbound = new Dictionary<int, float>(16);

		private readonly Dictionary<int, float> _lastOutbound = new Dictionary<int, float>(16);

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


		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;
			_enableInboundRPC = ((BaseUnityPlugin)this).Config.Bind<bool>("Filter", "EnableInboundRPC", true, "");
			_enableOutboundRPC = ((BaseUnityPlugin)this).Config.Bind<bool>("Filter", "EnableOutboundRPC", true, "");
			_ignoreSelfInbound = ((BaseUnityPlugin)this).Config.Bind<bool>("Filter", "IgnoreSelfInbound", true, "");
			_rpcMethodAllow = ((BaseUnityPlugin)this).Config.Bind<string>("Filter", "RpcMethodAllowList", "", "");
			_rpcMethodBlock = ((BaseUnityPlugin)this).Config.Bind<string>("Filter", "RpcMethodBlockList", "", "");
			_allowedTargets = ((BaseUnityPlugin)this).Config.Bind<string>("Filter", "AllowedTargets", "All;AllBuffered;AllViaServer;AllBufferedViaServer;Others;OthersBuffered;MasterClient;Player", "");
			_perActorMinInterval = ((BaseUnityPlugin)this).Config.Bind<float>("Filter", "PerActorMinIntervalSeconds", 0.15f, "");
			_maxActiveDots = ((BaseUnityPlugin)this).Config.Bind<int>("Visual", "MaxActiveDots", 96, "");
			_dotScale = ((BaseUnityPlugin)this).Config.Bind<float>("Visual", "DotScale", 0.16f, "");
			RebuildTargetAllowlist();
			RebuildNameLists();
			_viz = new Visualizer(((Component)this).gameObject.transform, _maxActiveDots.Value, Mathf.Max(0.02f, _dotScale.Value));
			ResolveRpcEventCode();
			Patch();
			SceneManager.sceneLoaded += OnSceneLoaded;
			RetargetEventHook();
			Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} loaded");
		}

		private void OnDestroy()
		{
			SceneManager.sceneLoaded -= OnSceneLoaded;
			Unsubscribe();
			Harmony? harmony = Harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
		}

		private void OnSceneLoaded(Scene s, LoadSceneMode m)
		{
			RetargetEventHook();
			RebuildTargetAllowlist();
			RebuildNameLists();
		}

		private static bool IsGameplayScene()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			Scene activeScene = SceneManager.GetActiveScene();
			string text = ((Scene)(ref activeScene)).name ?? string.Empty;
			if (string.IsNullOrEmpty(text))
			{
				return false;
			}
			if (text.IndexOf("Lobby", StringComparison.OrdinalIgnoreCase) >= 0)
			{
				return false;
			}
			if (text.IndexOf("Menu", StringComparison.OrdinalIgnoreCase) >= 0)
			{
				return false;
			}
			if (text.IndexOf("MainMenu", StringComparison.OrdinalIgnoreCase) >= 0)
			{
				return false;
			}
			if (text.IndexOf("Title", StringComparison.OrdinalIgnoreCase) >= 0)
			{
				return false;
			}
			return true;
		}

		private void RetargetEventHook()
		{
			if (IsGameplayScene())
			{
				Subscribe();
			}
			else
			{
				Unsubscribe();
			}
		}

		private void Subscribe()
		{
			if (!_subscribed)
			{
				LoadBalancingClient networkingClient = PhotonNetwork.NetworkingClient;
				if (networkingClient != null)
				{
					networkingClient.EventReceived += OnEventReceived;
					_subscribed = true;
				}
			}
		}

		private void Unsubscribe()
		{
			if (_subscribed)
			{
				LoadBalancingClient networkingClient = PhotonNetwork.NetworkingClient;
				if (networkingClient != null)
				{
					networkingClient.EventReceived -= OnEventReceived;
				}
				_subscribed = false;
			}
		}

		private void Update()
		{
			if (_rpcEventCode == byte.MaxValue)
			{
				ResolveRpcEventCode();
			}
			if (!IsGameplayScene())
			{
				if (_subscribed)
				{
					Unsubscribe();
				}
			}
			else if (!_subscribed)
			{
				Subscribe();
			}
			if (_viz != null)
			{
				if (_viz.MaxActive != _maxActiveDots.Value)
				{
					_viz.MaxActive = _maxActiveDots.Value;
				}
				if (Mathf.Abs(_viz.Scale - _dotScale.Value) > 0.001f)
				{
					_viz.Scale = Mathf.Max(0.02f, _dotScale.Value);
				}
				_viz.Tick(Time.deltaTime);
			}
		}

		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 static bool Ready()
		{
			if (!PhotonNetwork.IsConnected)
			{
				return false;
			}
			if (!PhotonNetwork.InRoom)
			{
				return false;
			}
			if (SemiFunc.MenuLevel())
			{
				return false;
			}
			PlayerAvatar val = SemiFunc.PlayerAvatarLocal();
			if (!Object.op_Implicit((Object)(object)val))
			{
				return false;
			}
			return true;
		}

		private static void ResolveRpcEventCode()
		{
			try
			{
				Assembly assembly = typeof(PhotonNetwork).Assembly;
				Type type = assembly.GetType("Photon.Pun.PunEvent");
				if (type != null && type.IsEnum)
				{
					object value = Enum.Parse(type, "RPC");
					_rpcEventCode = Convert.ToByte(value);
					return;
				}
			}
			catch
			{
			}
			_rpcEventCode = 200;
		}

		private void OnEventReceived(EventData photonEvent)
		{
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			if (!Ready())
			{
				return;
			}
			byte code = photonEvent.Code;
			if ((code != _rpcEventCode && code != 200) || !_enableInboundRPC.Value)
			{
				return;
			}
			int sender = photonEvent.Sender;
			if ((_ignoreSelfInbound.Value && PhotonNetwork.LocalPlayer != null && sender == PhotonNetwork.LocalPlayer.ActorNumber) || !PassThrottle(_lastInbound, sender, _perActorMinInterval.Value))
			{
				return;
			}
			Room currentRoom = PhotonNetwork.CurrentRoom;
			Player val = ((currentRoom != null) ? currentRoom.GetPlayer(sender, false) : null);
			if (val != null)
			{
				PlayerAvatar val2 = AvatarFromPlayer(val);
				PlayerAvatar val3 = SemiFunc.PlayerAvatarLocal();
				if (Object.op_Implicit((Object)(object)val2) && Object.op_Implicit((Object)(object)val3))
				{
					Color color = TryGetAvatarColor(val2, Color.yellow, 0.35f);
					_viz.Shoot(AvatarPos(val2), AvatarPos(val3), color);
				}
			}
		}

		internal static PlayerAvatar AvatarFromPlayer(Player p)
		{
			if (p == null)
			{
				return null;
			}
			PlayerAvatar val = AvatarFromActorNumber(p.ActorNumber);
			if (Object.op_Implicit((Object)(object)val))
			{
				return val;
			}
			string userId = p.UserId;
			if (string.IsNullOrEmpty(userId))
			{
				return null;
			}
			return SemiFunc.PlayerGetFromSteamID(userId);
		}

		internal static PlayerAvatar AvatarFromActorNumber(int actorNumber)
		{
			if (actorNumber <= 0)
			{
				return null;
			}
			PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>(true);
			foreach (PlayerAvatar val in array)
			{
				if (!Object.op_Implicit((Object)(object)val))
				{
					continue;
				}
				PhotonView photonView = val.photonView;
				if (!Object.op_Implicit((Object)(object)photonView))
				{
					continue;
				}
				try
				{
					if (photonView.OwnerActorNr == actorNumber)
					{
						return val;
					}
				}
				catch
				{
				}
			}
			return null;
		}

		internal static Vector3 AvatarPos(PlayerAvatar av)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: 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_0038: 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_004c: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)av))
			{
				return Vector3.zero;
			}
			Transform val = (Object.op_Implicit((Object)(object)av.playerTransform) ? av.playerTransform : ((Component)av).transform);
			return val.position + Vector3.up * 1.6f;
		}

		private static bool PassThrottle(Dictionary<int, float> map, int key, float minInterval)
		{
			if (minInterval <= 0f)
			{
				return true;
			}
			float time = Time.time;
			if (map.TryGetValue(key, out var value))
			{
				if (time - value < minInterval)
				{
					return false;
				}
				map[key] = time;
				return true;
			}
			map[key] = time;
			return true;
		}

		private static string[] SplitList(string s)
		{
			if (string.IsNullOrWhiteSpace(s))
			{
				return Array.Empty<string>();
			}
			string[] array = s.Split(new char[3] { ';', ',', '|' }, StringSplitOptions.RemoveEmptyEntries);
			for (int i = 0; i < array.Length; i++)
			{
				array[i] = array[i].Trim();
			}
			return array;
		}

		private void RebuildTargetAllowlist()
		{
			_allowedTargetSet.Clear();
			string[] array = SplitList(_allowedTargets.Value);
			for (int i = 0; i < array.Length; i++)
			{
				_allowedTargetSet.Add(array[i]);
			}
		}

		private void RebuildNameLists()
		{
			_allowNames = SplitList(_rpcMethodAllow.Value);
			_blockNames = SplitList(_rpcMethodBlock.Value);
		}

		internal static Color TryGetAvatarColor(PlayerAvatar av, Color fallback, float alpha)
		{
			//IL_00dd: 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_00e2: 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_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (Object.op_Implicit((Object)(object)av) && Object.op_Implicit((Object)(object)av.playerAvatarVisuals) && Object.op_Implicit((Object)(object)av.playerAvatarVisuals.meshParent))
				{
					Renderer componentInChildren = av.playerAvatarVisuals.meshParent.GetComponentInChildren<Renderer>(true);
					if (Object.op_Implicit((Object)(object)componentInChildren) && Object.op_Implicit((Object)(object)componentInChildren.sharedMaterial))
					{
						if (componentInChildren.sharedMaterial.HasProperty("_AlbedoColor"))
						{
							Color color = componentInChildren.sharedMaterial.GetColor("_AlbedoColor");
							color.a = alpha;
							return color;
						}
						if (componentInChildren.sharedMaterial.HasProperty("_Color"))
						{
							Color color2 = componentInChildren.sharedMaterial.GetColor("_Color");
							color2.a = alpha;
							return color2;
						}
					}
				}
			}
			catch
			{
			}
			fallback.a = alpha;
			return fallback;
		}

		internal static bool MethodPasses(string methodName)
		{
			string[] allowNames = Instance._allowNames;
			string[] blockNames = Instance._blockNames;
			if (blockNames != null && blockNames.Length != 0)
			{
				for (int i = 0; i < blockNames.Length; i++)
				{
					if (!string.IsNullOrEmpty(blockNames[i]) && methodName.IndexOf(blockNames[i], StringComparison.OrdinalIgnoreCase) >= 0)
					{
						return false;
					}
				}
			}
			if (allowNames != null && allowNames.Length != 0)
			{
				bool flag = false;
				for (int j = 0; j < allowNames.Length; j++)
				{
					if (!string.IsNullOrEmpty(allowNames[j]) && methodName.IndexOf(allowNames[j], StringComparison.OrdinalIgnoreCase) >= 0)
					{
						flag = true;
						break;
					}
				}
				if (!flag)
				{
					return false;
				}
			}
			return true;
		}

		internal static bool TargetPasses(string key)
		{
			return Instance._allowedTargetSet.Count == 0 || Instance._allowedTargetSet.Contains(key);
		}

		internal static bool OutboundEnabled()
		{
			return Instance._enableOutboundRPC.Value;
		}

		internal static bool OutboundThrottlePass(int actorNumber)
		{
			return PassThrottle(Instance._lastOutbound, actorNumber, Instance._perActorMinInterval.Value);
		}
	}
	[HarmonyPatch(typeof(PhotonView), "RPC", new Type[]
	{
		typeof(string),
		typeof(RpcTarget),
		typeof(object[])
	})]
	public static class Patch_PhotonView_RPC_RpcTarget
	{
		public static void Postfix(PhotonView __instance, string methodName, RpcTarget target, object[] parameters)
		{
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: 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)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			if (!Empress_RpcViz.Ready() || !Empress_RpcViz.OutboundEnabled() || !Empress_RpcViz.MethodPasses(methodName))
			{
				return;
			}
			string key = ((object)(RpcTarget)(ref target)).ToString();
			if (!Empress_RpcViz.TargetPasses(key))
			{
				return;
			}
			PlayerAvatar val = SemiFunc.PlayerAvatarLocal();
			if (!Object.op_Implicit((Object)(object)val))
			{
				return;
			}
			Color color = Empress_RpcViz.TryGetAvatarColor(val, Color.yellow, 0.35f);
			IEnumerable<Player> enumerable = ResolveTargets(target);
			if (enumerable == null)
			{
				return;
			}
			foreach (Player item in enumerable)
			{
				if (item != null && item != PhotonNetwork.LocalPlayer && Empress_RpcViz.OutboundThrottlePass(item.ActorNumber))
				{
					PlayerAvatar val2 = Empress_RpcViz.AvatarFromPlayer(item);
					if (Object.op_Implicit((Object)(object)val2))
					{
						Empress_RpcViz._viz.Shoot(Empress_RpcViz.AvatarPos(val), Empress_RpcViz.AvatarPos(val2), color);
					}
				}
			}
		}

		private static IEnumerable<Player> ResolveTargets(RpcTarget t)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Expected I4, but got Unknown
			switch ((int)t)
			{
			case 0:
			case 3:
			case 5:
			case 6:
				return PhotonNetwork.PlayerList;
			case 1:
			case 4:
				return PhotonNetwork.PlayerListOthers;
			case 2:
				return (IEnumerable<Player>)(object)new Player[1] { PhotonNetwork.MasterClient };
			default:
				return null;
			}
		}
	}
	[HarmonyPatch(typeof(PhotonView), "RPC", new Type[]
	{
		typeof(string),
		typeof(Player),
		typeof(object[])
	})]
	public static class Patch_PhotonView_RPC_Player
	{
		public static void Postfix(PhotonView __instance, string methodName, Player targetPlayer, object[] parameters)
		{
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: 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_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			if (!Empress_RpcViz.Ready() || !Empress_RpcViz.OutboundEnabled() || !Empress_RpcViz.MethodPasses(methodName) || !Empress_RpcViz.TargetPasses("Player"))
			{
				return;
			}
			PlayerAvatar val = SemiFunc.PlayerAvatarLocal();
			if (Object.op_Implicit((Object)(object)val) && targetPlayer != null && targetPlayer != PhotonNetwork.LocalPlayer && Empress_RpcViz.OutboundThrottlePass(targetPlayer.ActorNumber))
			{
				PlayerAvatar val2 = Empress_RpcViz.AvatarFromPlayer(targetPlayer);
				if (Object.op_Implicit((Object)(object)val2))
				{
					Color color = Empress_RpcViz.TryGetAvatarColor(val, Color.yellow, 0.35f);
					Empress_RpcViz._viz.Shoot(Empress_RpcViz.AvatarPos(val), Empress_RpcViz.AvatarPos(val2), color);
				}
			}
		}
	}
}