Decompiled source of Web Swing v1.0.0

WebSwing.dll

Decompiled a week 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 ExitGames.Client.Photon;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using Photon.Realtime;
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: AssemblyCompany("Omniscye")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+c574138cfea486cfa7104eae1a6f135c166daf8b")]
[assembly: AssemblyProduct("WebSwing")]
[assembly: AssemblyTitle("WebSwing")]
[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 SpiderHookMod
{
	[BepInPlugin("com.empress.spiderhook", "Web Swing", "1.3.0")]
	public class SpiderHookMod : BaseUnityPlugin, IOnEventCallback
	{
		private class RemoteGrappleData
		{
			public GameObject visualObj;

			public LineRenderer line;

			public Vector3 targetPoint;

			public PlayerAvatar avatar;
		}

		public const byte GrappleStartEvent = 120;

		public const byte GrappleEndEvent = 121;

		private ConfigEntry<float> configGrappleSpeed;

		private ConfigEntry<KeyCode> configKey;

		private ConfigEntry<float> configColorR;

		private ConfigEntry<float> configColorG;

		private ConfigEntry<float> configColorB;

		private float maxDistance = 40f;

		private float stopDistance = 1.5f;

		private bool isGrappling = false;

		private Vector3 localGrapplePoint;

		private GameObject localHookObj;

		private LineRenderer localLine;

		private PlayerAvatar localPlayer;

		private PlayerController localController;

		private bool callbacksRegistered = false;

		private Dictionary<int, RemoteGrappleData> remoteGrapples = new Dictionary<int, RemoteGrappleData>();

		private void Awake()
		{
			configKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Web Swing Settings", "WebSwingKey", (KeyCode)118, "Key to use the Web Swing");
			configGrappleSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Web Swing Settings", "WebSwingSpeed", 35f, "How fast the Web Swing pulls you");
			configColorR = ((BaseUnityPlugin)this).Config.Bind<float>("Visuals", "ColorR", 0f, "Red amount (0-1)");
			configColorG = ((BaseUnityPlugin)this).Config.Bind<float>("Visuals", "ColorG", 1f, "Green amount (0-1)");
			configColorB = ((BaseUnityPlugin)this).Config.Bind<float>("Visuals", "ColorB", 1f, "Blue amount (0-1)");
		}

		private void OnDisable()
		{
			if (callbacksRegistered)
			{
				PhotonNetwork.RemoveCallbackTarget((object)this);
				callbacksRegistered = false;
			}
		}

		private bool IsGameReady()
		{
			if (!PhotonNetwork.IsConnected || !PhotonNetwork.InRoom)
			{
				return false;
			}
			if (SemiFunc.MenuLevel())
			{
				return false;
			}
			if (!SemiFunc.LevelGenDone())
			{
				return false;
			}
			if ((Object)(object)SemiFunc.PlayerAvatarLocal() == (Object)null)
			{
				return false;
			}
			return true;
		}

		private void Update()
		{
			if (IsGameReady())
			{
				if (!callbacksRegistered)
				{
					PhotonNetwork.AddCallbackTarget((object)this);
					callbacksRegistered = true;
				}
				HandleLocalPlayer();
				UpdateRemoteVisuals();
			}
			else if (callbacksRegistered)
			{
				PhotonNetwork.RemoveCallbackTarget((object)this);
				callbacksRegistered = false;
				remoteGrapples.Clear();
			}
		}

		private void HandleLocalPlayer()
		{
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: 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_00be: 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)
			if ((Object)(object)localPlayer == (Object)null)
			{
				localPlayer = SemiFunc.PlayerAvatarLocal();
				if ((Object)(object)localPlayer != (Object)null)
				{
					localController = PlayerController.instance;
				}
				return;
			}
			if ((Object)(object)localLine == (Object)null)
			{
				CreateLocalVisuals();
			}
			if (Input.GetKeyDown(configKey.Value) && TryStartLocalGrapple())
			{
				SendGrappleEvent(120, localGrapplePoint);
			}
			if (Input.GetKey(configKey.Value) && isGrappling)
			{
				ApplyLocalPhysics();
				UpdateLocalVisuals();
			}
			if (Input.GetKeyUp(configKey.Value) && isGrappling)
			{
				StopLocalGrapple();
				SendGrappleEvent(121, Vector3.zero);
			}
		}

		private void CreateLocalVisuals()
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)localHookObj != (Object)null)
			{
				Object.Destroy((Object)(object)localHookObj);
			}
			localHookObj = new GameObject("SpiderHookLocal");
			localHookObj.transform.parent = null;
			((Object)localHookObj).hideFlags = (HideFlags)61;
			Object.DontDestroyOnLoad((Object)(object)localHookObj);
			localLine = localHookObj.AddComponent<LineRenderer>();
			Color col = default(Color);
			((Color)(ref col))..ctor(configColorR.Value, configColorG.Value, configColorB.Value);
			SetupLineRenderer(localLine, col);
			((Renderer)localLine).enabled = false;
		}

		private bool TryStartLocalGrapple()
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: 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_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)Camera.main == (Object)null)
			{
				return false;
			}
			RaycastHit val = default(RaycastHit);
			if (Physics.Raycast(((Component)Camera.main).transform.position, ((Component)Camera.main).transform.forward, ref val, maxDistance, LayerMask.op_Implicit(SemiFunc.LayerMaskGetVisionObstruct())))
			{
				isGrappling = true;
				localGrapplePoint = ((RaycastHit)(ref val)).point;
				((Renderer)localLine).enabled = true;
				Color val2 = default(Color);
				((Color)(ref val2))..ctor(configColorR.Value, configColorG.Value, configColorB.Value);
				SetupLineRenderer(localLine, val2);
				SemiFunc.UIFocusText("WEB SWING!", val2, Color.white, 0.5f);
				if ((Object)(object)AssetManager.instance != (Object)null)
				{
					AssetManager.instance.PhysImpactEffect(localGrapplePoint);
				}
				return true;
			}
			return false;
		}

		private void ApplyLocalPhysics()
		{
			//IL_0037: 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_0058: 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_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: 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_0093: 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_00b4: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)localController == (Object)null) && !((Object)(object)localController.rb == (Object)null))
			{
				float num = Vector3.Distance(((Component)localPlayer).transform.position, localGrapplePoint);
				if (!(num < stopDistance))
				{
					Vector3 val = localGrapplePoint - ((Component)localPlayer).transform.position;
					Vector3 normalized = ((Vector3)(ref val)).normalized;
					localController.rb.AddForce(normalized * configGrappleSpeed.Value, (ForceMode)5);
					localController.rb.AddForce(Vector3.up * 15f, (ForceMode)5);
					localController.CollisionGrounded.Grounded = false;
				}
			}
		}

		private void UpdateLocalVisuals()
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: 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_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: 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_0067: 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_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)localLine == (Object)null) && !((Object)(object)Camera.main == (Object)null))
			{
				Vector3 val = ((Component)Camera.main).transform.position + ((Component)Camera.main).transform.right * 0.3f - Vector3.up * 0.2f;
				localLine.SetPosition(0, val);
				localLine.SetPosition(1, localGrapplePoint);
				((Renderer)localLine).material.mainTextureOffset = new Vector2((0f - Time.time) * 5f, 0f);
			}
		}

		private void StopLocalGrapple()
		{
			isGrappling = false;
			if ((Object)(object)localLine != (Object)null)
			{
				((Renderer)localLine).enabled = false;
			}
		}

		private void SendGrappleEvent(byte eventCode, Vector3 pos)
		{
			//IL_003c: 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_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Expected O, but got Unknown
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			if (PhotonNetwork.IsConnected)
			{
				object[] array = ((eventCode != 120) ? new object[1] { localPlayer.photonView.ViewID } : new object[5]
				{
					localPlayer.photonView.ViewID,
					pos,
					configColorR.Value,
					configColorG.Value,
					configColorB.Value
				});
				RaiseEventOptions val = new RaiseEventOptions
				{
					Receivers = (ReceiverGroup)0
				};
				PhotonNetwork.RaiseEvent(eventCode, (object)array, val, SendOptions.SendReliable);
			}
		}

		public void OnEvent(EventData photonEvent)
		{
			//IL_0028: 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_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			if (photonEvent.Code == 120)
			{
				object[] array = (object[])photonEvent.CustomData;
				int viewID = (int)array[0];
				Vector3 target = (Vector3)array[1];
				float num = (float)array[2];
				float num2 = (float)array[3];
				float num3 = (float)array[4];
				Color color = default(Color);
				((Color)(ref color))..ctor(num, num2, num3);
				StartRemoteGrapple(viewID, target, color);
			}
			else if (photonEvent.Code == 121)
			{
				object[] array2 = (object[])photonEvent.CustomData;
				int viewID2 = (int)array2[0];
				StopRemoteGrapple(viewID2);
			}
		}

		private void StartRemoteGrapple(int viewID, Vector3 target, Color color)
		{
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: 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_00c2: Unknown result type (might be due to invalid IL or missing references)
			StopRemoteGrapple(viewID);
			PhotonView val = PhotonView.Find(viewID);
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			PlayerAvatar component = ((Component)val).GetComponent<PlayerAvatar>();
			if (!((Object)(object)component == (Object)null))
			{
				GameObject val2 = new GameObject($"SpiderHook_Remote_{viewID}");
				((Object)val2).hideFlags = (HideFlags)61;
				Object.DontDestroyOnLoad((Object)(object)val2);
				LineRenderer val3 = val2.AddComponent<LineRenderer>();
				SetupLineRenderer(val3, color);
				((Renderer)val3).enabled = true;
				RemoteGrappleData value = new RemoteGrappleData
				{
					visualObj = val2,
					line = val3,
					targetPoint = target,
					avatar = component
				};
				remoteGrapples[viewID] = value;
				if ((Object)(object)AssetManager.instance != (Object)null)
				{
					AssetManager.instance.PhysImpactEffect(target);
				}
			}
		}

		private void StopRemoteGrapple(int viewID)
		{
			if (remoteGrapples.ContainsKey(viewID))
			{
				if ((Object)(object)remoteGrapples[viewID].visualObj != (Object)null)
				{
					Object.Destroy((Object)(object)remoteGrapples[viewID].visualObj);
				}
				remoteGrapples.Remove(viewID);
			}
		}

		private void UpdateRemoteVisuals()
		{
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: 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_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: 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_00a8: 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_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			List<int> list = new List<int>();
			foreach (KeyValuePair<int, RemoteGrappleData> remoteGrapple in remoteGrapples)
			{
				RemoteGrappleData value = remoteGrapple.Value;
				if ((Object)(object)value.avatar == (Object)null || (Object)(object)value.line == (Object)null)
				{
					list.Add(remoteGrapple.Key);
					continue;
				}
				Vector3 position = value.avatar.PlayerVisionTarget.VisionTransform.position;
				position += ((Component)value.avatar).transform.right * 0.3f - Vector3.up * 0.4f;
				value.line.SetPosition(0, position);
				value.line.SetPosition(1, value.targetPoint);
				((Renderer)value.line).material.mainTextureOffset = new Vector2((0f - Time.time) * 5f, 0f);
			}
			foreach (int item in list)
			{
				StopRemoteGrapple(item);
			}
		}

		private void SetupLineRenderer(LineRenderer line, Color col)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: 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_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			((Renderer)line).material = new Material(Shader.Find("Sprites/Default"));
			line.startColor = col;
			line.endColor = new Color(col.r, col.g, col.b, 0f);
			line.startWidth = 0.1f;
			line.endWidth = 0.05f;
			line.positionCount = 2;
		}
	}
}