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)
{
}
}
}