Decompiled source of InstantTeleport v0.0.2

InstantTeleport.dll

Decompiled 3 days ago
using System;
using System.Collections;
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 GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.AI;

[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-CSharp")]
[assembly: AssemblyCompany("InstantTeleport")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+0e14460f7cfc4423db0502c178e3415750870e39")]
[assembly: AssemblyProduct("InstantTeleport")]
[assembly: AssemblyTitle("InstantTeleport")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
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;
		}
	}
}
[BepInPlugin("DeathWrench.InstantTeleport", "Instant Teleport", "0.0.2")]
public class Plugin : BaseUnityPlugin
{
	public static ConfigEntry<bool> oldBehavior;

	private void Awake()
	{
		//IL_0037: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: Expected O, but got Unknown
		oldBehavior = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "Inverse Semi Instant", false, "If true, inverse teleporter will only be instant if you're on it when the button is pressed.");
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin DeathWrench.InstantTeleport is loaded!");
		Harmony val = new Harmony("DeathWrench.InstantTeleport");
		val.PatchAll();
	}
}
[HarmonyPatch(typeof(ShipTeleporter))]
[HarmonyPatch("beamUpPlayer")]
public class ShipTeleporter_BeamUpPlayer_Patch
{
	private static bool Prefix(ShipTeleporter __instance)
	{
		//IL_02ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_02fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_0210: Unknown result type (might be due to invalid IL or missing references)
		__instance.shipTeleporterAudio.PlayOneShot(__instance.teleporterSpinSFX);
		PlayerControllerB targetedPlayer = StartOfRound.Instance.mapScreen.targetedPlayer;
		if ((Object)(object)targetedPlayer == (Object)null)
		{
			Debug.Log((object)"Targeted player is null");
			return false;
		}
		if ((Object)(object)targetedPlayer.redirectToEnemy != (Object)null)
		{
			Debug.Log((object)$"Attempting to teleport enemy '{((Object)((Component)targetedPlayer.redirectToEnemy).gameObject).name}' (tied to player #{targetedPlayer.playerClientId}) to ship.");
			if (StartOfRound.Instance.shipIsLeaving)
			{
				Debug.Log((object)$"Ship could not teleport enemy '{((Object)((Component)targetedPlayer.redirectToEnemy).gameObject).name}' (tied to player #{targetedPlayer.playerClientId}) because the ship is leaving the nav mesh.");
			}
			targetedPlayer.redirectToEnemy.ShipTeleportEnemy();
			__instance.shipTeleporterAudio.PlayOneShot(__instance.teleporterBeamUpSFX);
			if (GameNetworkManager.Instance.localPlayerController.isInHangarShipRoom)
			{
				HUDManager.Instance.ShakeCamera((ScreenShakeType)1);
			}
		}
		__instance.SetPlayerTeleporterId(targetedPlayer, 1);
		if ((Object)(object)targetedPlayer.deadBody != (Object)null)
		{
			if ((Object)(object)targetedPlayer.deadBody.beamUpParticle == (Object)null)
			{
				return false;
			}
			targetedPlayer.deadBody.beamUpParticle.Play();
			targetedPlayer.deadBody.bodyAudio.PlayOneShot(__instance.beamUpPlayerBodySFX);
		}
		else
		{
			targetedPlayer.beamUpParticle.Play();
			targetedPlayer.movementAudio.PlayOneShot(__instance.beamUpPlayerBodySFX);
		}
		bool flag = false;
		if ((Object)(object)targetedPlayer.deadBody != (Object)null)
		{
			if ((Object)(object)targetedPlayer.deadBody.grabBodyObject == (Object)null || !targetedPlayer.deadBody.grabBodyObject.isHeldByEnemy)
			{
				flag = true;
				targetedPlayer.deadBody.attachedTo = null;
				targetedPlayer.deadBody.attachedLimb = null;
				targetedPlayer.deadBody.secondaryAttachedLimb = null;
				targetedPlayer.deadBody.secondaryAttachedTo = null;
				targetedPlayer.deadBody.SetRagdollPositionSafely(__instance.teleporterPosition.position, true);
				((Component)targetedPlayer.deadBody).transform.SetParent(StartOfRound.Instance.elevatorTransform, true);
				if ((Object)(object)targetedPlayer.deadBody.grabBodyObject != (Object)null && targetedPlayer.deadBody.grabBodyObject.isHeld && (Object)(object)targetedPlayer.deadBody.grabBodyObject.playerHeldBy != (Object)null)
				{
					targetedPlayer.deadBody.grabBodyObject.playerHeldBy.DropAllHeldItems(true, false);
				}
			}
		}
		else
		{
			flag = true;
			targetedPlayer.DropAllHeldItems(true, false);
			if (Object.op_Implicit((Object)(object)Object.FindObjectOfType<AudioReverbPresets>()))
			{
				Object.FindObjectOfType<AudioReverbPresets>().audioPresets[3].ChangeAudioReverbForPlayer(targetedPlayer);
			}
			targetedPlayer.isInElevator = true;
			targetedPlayer.isInHangarShipRoom = true;
			targetedPlayer.isInsideFactory = false;
			targetedPlayer.averageVelocity = 0f;
			targetedPlayer.velocityLastFrame = Vector3.zero;
			targetedPlayer.TeleportPlayer(__instance.teleporterPosition.position, true, 160f, false, true);
		}
		__instance.SetPlayerTeleporterId(targetedPlayer, -1);
		if (flag)
		{
			__instance.shipTeleporterAudio.PlayOneShot(__instance.teleporterBeamUpSFX);
			if (GameNetworkManager.Instance.localPlayerController.isInHangarShipRoom)
			{
				HUDManager.Instance.ShakeCamera((ScreenShakeType)1);
			}
		}
		return false;
	}
}
[HarmonyPatch(typeof(ShipTeleporter))]
[HarmonyPatch("beamOutPlayer")]
public class ShipTeleporter_BeamOutPlayerPatch
{
	private const float InstantTeleportDuration = 5f;

	private static void Prefix(ShipTeleporter __instance)
	{
		//IL_00a5: 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_00db: 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_00d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_013e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0143: Unknown result type (might be due to invalid IL or missing references)
		//IL_014a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0153: Unknown result type (might be due to invalid IL or missing references)
		//IL_0159: Unknown result type (might be due to invalid IL or missing references)
		//IL_0162: Unknown result type (might be due to invalid IL or missing references)
		//IL_0167: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0190: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)null)
		{
			return;
		}
		if (StartOfRound.Instance.inShipPhase)
		{
			Debug.Log((object)"Attempted using teleporter while in ship phase");
			return;
		}
		__instance.shipTeleporterAudio.PlayOneShot(__instance.teleporterSpinSFX);
		if (!Plugin.oldBehavior.Value)
		{
			((MonoBehaviour)__instance).StartCoroutine(InstantTeleportationRoutine(__instance));
			return;
		}
		for (int i = 0; i < StartOfRound.Instance.allPlayerObjects.Length; i++)
		{
			PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[i];
			if (val.shipTeleporterId == 1)
			{
				continue;
			}
			Vector3 position = ((Component)val).transform.position;
			if ((Object)(object)val.deadBody != (Object)null)
			{
				position = ((Component)val.deadBody.bodyParts[5]).transform.position;
			}
			if (Vector3.Distance(position, __instance.teleportOutPosition.position) < 2f)
			{
				if (RoundManager.Instance.insideAINodes.Length != 0)
				{
					Vector3 position2 = RoundManager.Instance.insideAINodes[__instance.shipTeleporterSeed.Next(0, RoundManager.Instance.insideAINodes.Length)].transform.position;
					position2 = RoundManager.Instance.GetRandomNavMeshPositionInBoxPredictable(position2, 10f, default(NavMeshHit), __instance.shipTeleporterSeed, -1);
					__instance.SetPlayerTeleporterId(val, 2);
					if ((Object)(object)val.deadBody != (Object)null)
					{
						__instance.TeleportPlayerBodyOutServerRpc((int)val.playerClientId, position2);
						continue;
					}
					__instance.TeleportPlayerOutWithInverseTeleporter((int)val.playerClientId, position2);
					__instance.TeleportPlayerOutServerRpc((int)val.playerClientId, position2);
				}
			}
			else
			{
				Debug.Log((object)$"Player #{val.playerClientId} is not close enough to teleporter to beam out");
			}
		}
	}

	private static IEnumerator InstantTeleportationRoutine(ShipTeleporter teleporter)
	{
		for (float timer = 0f; timer < 5f; timer += Time.deltaTime)
		{
			for (int i = 0; i < StartOfRound.Instance.allPlayerObjects.Length; i++)
			{
				PlayerControllerB playerControllerB = StartOfRound.Instance.allPlayerScripts[i];
				if (playerControllerB.shipTeleporterId == 1)
				{
					continue;
				}
				Vector3 position = ((Component)playerControllerB).transform.position;
				if ((Object)(object)playerControllerB.deadBody != (Object)null)
				{
					position = ((Component)playerControllerB.deadBody.bodyParts[5]).transform.position;
				}
				if (Vector3.Distance(position, teleporter.teleportOutPosition.position) < 2f)
				{
					Vector3 randomTeleportPosition2 = RoundManager.Instance.insideAINodes[Random.Range(0, RoundManager.Instance.insideAINodes.Length)].transform.position;
					randomTeleportPosition2 = RoundManager.Instance.GetRandomNavMeshPositionInBoxPredictable(randomTeleportPosition2, 10f, default(NavMeshHit), teleporter.shipTeleporterSeed, -1);
					teleporter.SetPlayerTeleporterId(playerControllerB, 2);
					if ((Object)(object)playerControllerB.deadBody != (Object)null)
					{
						teleporter.TeleportPlayerBodyOutServerRpc((int)playerControllerB.playerClientId, randomTeleportPosition2);
						continue;
					}
					teleporter.TeleportPlayerOutWithInverseTeleporter((int)playerControllerB.playerClientId, randomTeleportPosition2);
					teleporter.TeleportPlayerOutServerRpc((int)playerControllerB.playerClientId, randomTeleportPosition2);
				}
				else
				{
					Debug.Log((object)$"Player #{playerControllerB.playerClientId} is not close enough to teleporter to beam out");
				}
			}
			yield return null;
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}