using System;
using System.Collections;
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.Logging;
using ExitGames.Client.Photon;
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.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("com.github.vavedev.PeakLateJoin")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.4.0.0")]
[assembly: AssemblyInformationalVersion("1.4.0+3fa897d6573d254d234718a7b49321b711dd01cf")]
[assembly: AssemblyProduct("com.github.vavedev.PeakLateJoin")]
[assembly: AssemblyTitle("Peak Late Join")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.4.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 BepInEx
{
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
[Conditional("CodeGeneration")]
internal sealed class BepInAutoPluginAttribute : Attribute
{
public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
{
}
}
}
namespace BepInEx.Preloader.Core.Patching
{
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
[Conditional("CodeGeneration")]
internal sealed class PatcherAutoPluginAttribute : Attribute
{
public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null)
{
}
}
}
namespace PeakLateJoin
{
public class ImprovedSpawnTarget
{
private float _lowestY;
public Character LowestCharacter { get; private set; }
public ImprovedSpawnTarget()
{
LowestCharacter = null;
_lowestY = float.PositiveInfinity;
}
public void RegisterCharacter(Character character, float y)
{
if (!((Object)(object)character == (Object)null) && ((Object)(object)LowestCharacter == (Object)null || y < _lowestY))
{
LowestCharacter = character;
_lowestY = y;
}
}
}
public class LateJoinHandler : MonoBehaviourPunCallbacks
{
[CompilerGenerated]
private sealed class <HandleLateJoin>d__9 : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
public Player newPlayer;
public LateJoinHandler <>4__this;
private Character <newCharacter>5__2;
private float <timer>5__3;
private bool <wasDead>5__4;
private string <savedStage>5__5;
private string <currentStage>5__6;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <HandleLateJoin>d__9(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<newCharacter>5__2 = null;
<savedStage>5__5 = null;
<currentStage>5__6 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0193: Unknown result type (might be due to invalid IL or missing references)
//IL_019d: Expected O, but got Unknown
//IL_0361: Unknown result type (might be due to invalid IL or missing references)
//IL_026e: Unknown result type (might be due to invalid IL or missing references)
//IL_0273: Unknown result type (might be due to invalid IL or missing references)
//IL_0378: Unknown result type (might be due to invalid IL or missing references)
//IL_039a: Unknown result type (might be due to invalid IL or missing references)
//IL_0373: Unknown result type (might be due to invalid IL or missing references)
//IL_03d7: Unknown result type (might be due to invalid IL or missing references)
//IL_02d6: Unknown result type (might be due to invalid IL or missing references)
//IL_02e0: Expected O, but got Unknown
int num = <>1__state;
LateJoinHandler lateJoinHandler = <>4__this;
switch (num)
{
default:
return false;
case 0:
<>1__state = -1;
if (newPlayer == null)
{
ManualLogSource logger = lateJoinHandler._logger;
if (logger != null)
{
logger.LogWarning((object)"[LateJoin] newPlayer was null.");
}
return false;
}
<newCharacter>5__2 = null;
<timer>5__3 = 0f;
goto IL_00f9;
case 1:
<>1__state = -1;
<timer>5__3 += Time.deltaTime;
if (<timer>5__3 > 10f)
{
ManualLogSource logger2 = lateJoinHandler._logger;
if (logger2 != null)
{
logger2.LogWarning((object)$"[LateJoin] Timeout waiting for Character for player {newPlayer.NickName} (actor {newPlayer.ActorNumber}). Aborting late-join handling.");
}
return false;
}
goto IL_00f9;
case 2:
<>1__state = -1;
<timer>5__3 += Time.deltaTime;
if (<timer>5__3 > 10f)
{
ManualLogSource logger3 = lateJoinHandler._logger;
if (logger3 != null)
{
logger3.LogWarning((object)("[LateJoin] Timeout waiting for CharacterData for " + <newCharacter>5__2.characterName + ". Aborting."));
}
return false;
}
goto IL_017a;
case 3:
{
<>1__state = -1;
<wasDead>5__4 = false;
<savedStage>5__5 = null;
if (PhotonNetwork.InRoom && PhotonNetwork.CurrentRoom != null)
{
if (((Dictionary<object, object>)(object)((RoomInfo)PhotonNetwork.CurrentRoom).CustomProperties).TryGetValue((object)$"dead_{newPlayer.ActorNumber}", out object value))
{
bool flag = default(bool);
int num2;
if (value is bool)
{
flag = (bool)value;
num2 = 1;
}
else
{
num2 = 0;
}
<wasDead>5__4 = (byte)((uint)num2 & (flag ? 1u : 0u)) != 0;
}
if (((Dictionary<object, object>)(object)((RoomInfo)PhotonNetwork.CurrentRoom).CustomProperties).TryGetValue((object)$"stage_{newPlayer.ActorNumber}", out object value2))
{
<savedStage>5__5 = value2 as string;
}
}
else
{
ManualLogSource logger5 = lateJoinHandler._logger;
if (logger5 != null)
{
logger5.LogWarning((object)"[LateJoin] Not in room while handling late join; skipping saved state read.");
}
}
Scene activeScene = SceneManager.GetActiveScene();
<currentStage>5__6 = ((Scene)(ref activeScene)).name;
ManualLogSource logger6 = lateJoinHandler._logger;
if (logger6 != null)
{
logger6.LogInfo((object)$"[LateJoin] {<newCharacter>5__2.characterName} joined. SavedStage={<savedStage>5__5}, CurrentStage={<currentStage>5__6}, WasDead={<wasDead>5__4}");
}
<>2__current = (object)new WaitForSeconds(0.5f);
<>1__state = 4;
return true;
}
case 4:
{
<>1__state = -1;
ImprovedSpawnTarget improvedSpawnTarget = PopulateSpawnData(<newCharacter>5__2);
if ((Object)(object)improvedSpawnTarget.LowestCharacter == (Object)null)
{
lateJoinHandler._logger.LogWarning((object)("[LateJoin] No valid spawn target found. Keeping " + <newCharacter>5__2.characterName + " at spawn."));
return false;
}
Vector3 val = (((Object)(object)improvedSpawnTarget.LowestCharacter.data != (Object)null && improvedSpawnTarget.LowestCharacter.data.isGrounded) ? improvedSpawnTarget.LowestCharacter.data.groundPos : ((Component)improvedSpawnTarget.LowestCharacter).transform.position);
lateJoinHandler._logger.LogInfo((object)$"[LateJoin] {<newCharacter>5__2.characterName} → warping near {improvedSpawnTarget.LowestCharacter.characterName} at Y={val.y:F2}");
if ((Object)(object)<newCharacter>5__2.data.spawnPoint != (Object)null)
{
try
{
<newCharacter>5__2.data.spawnPoint.position = val;
}
catch (Exception ex)
{
ManualLogSource logger4 = lateJoinHandler._logger;
if (logger4 != null)
{
logger4.LogWarning((object)("[LateJoin] Failed to update spawnPoint: " + ex.Message));
}
}
}
<>2__current = TeleportUtils.SafeWarp(<newCharacter>5__2, improvedSpawnTarget.LowestCharacter, lateJoinHandler._logger);
<>1__state = 5;
return true;
}
case 5:
{
<>1__state = -1;
if (<wasDead>5__4)
{
if (<savedStage>5__5 == <currentStage>5__6)
{
<newCharacter>5__2.data.dead = true;
lateJoinHandler._logger.LogInfo((object)("[LateJoin] " + <newCharacter>5__2.characterName + " kept dead (same stage)."));
}
else
{
<newCharacter>5__2.data.dead = false;
lateJoinHandler._logger.LogInfo((object)("[LateJoin] " + <newCharacter>5__2.characterName + " revived (stage changed)."));
}
}
lateJoinHandler.SaveDeathState(newPlayer, <newCharacter>5__2.data.dead);
lateJoinHandler._lastKnownDead[newPlayer.ActorNumber] = <newCharacter>5__2.data.dead;
lateJoinHandler._logger.LogInfo((object)("[LateJoin] Finished processing " + <newCharacter>5__2.characterName + "."));
return false;
}
IL_017a:
if ((Object)(object)<newCharacter>5__2.data == (Object)null)
{
<>2__current = null;
<>1__state = 2;
return true;
}
<>2__current = (object)new WaitForSeconds(1.5f);
<>1__state = 3;
return true;
IL_00f9:
if ((Object)(object)<newCharacter>5__2 == (Object)null)
{
<newCharacter>5__2 = PlayerHandler.GetPlayerCharacter(newPlayer);
if (!((Object)(object)<newCharacter>5__2 != (Object)null))
{
<>2__current = null;
<>1__state = 1;
return true;
}
}
<timer>5__3 = 0f;
goto IL_017a;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
private ManualLogSource _logger;
private readonly Dictionary<int, bool> _lastKnownDead = new Dictionary<int, bool>();
private const float InitialJoinWaitSeconds = 1.5f;
private const float AfterSyncWaitSeconds = 0.5f;
private const float CharacterWaitTimeoutSeconds = 10f;
public void InitLogger(ManualLogSource logger)
{
_logger = logger;
}
private void Update()
{
foreach (Character allCharacter in Character.AllCharacters)
{
if ((Object)(object)((allCharacter != null) ? ((MonoBehaviourPun)allCharacter).photonView : null) == (Object)null || ((MonoBehaviourPun)allCharacter).photonView.Owner == null || (Object)(object)allCharacter.data == (Object)null)
{
continue;
}
int actorNumber = ((MonoBehaviourPun)allCharacter).photonView.Owner.ActorNumber;
bool dead = allCharacter.data.dead;
if (!_lastKnownDead.TryGetValue(actorNumber, out var value) || value != dead)
{
SaveDeathState(((MonoBehaviourPun)allCharacter).photonView.Owner, dead);
_lastKnownDead[actorNumber] = dead;
ManualLogSource logger = _logger;
if (logger != null)
{
logger.LogInfo((object)("[DeathSync] " + allCharacter.characterName + ": " + (dead ? "dead" : "alive")));
}
}
}
}
public override void OnPlayerEnteredRoom(Player newPlayer)
{
//IL_0000: 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)
Scene activeScene = SceneManager.GetActiveScene();
if (((Scene)(ref activeScene)).name != "Airport")
{
((MonoBehaviour)this).StartCoroutine(HandleLateJoin(newPlayer));
}
}
public override void OnPlayerLeftRoom(Player otherPlayer)
{
if (otherPlayer != null)
{
Character playerCharacter = PlayerHandler.GetPlayerCharacter(otherPlayer);
if ((Object)(object)playerCharacter != (Object)null && (Object)(object)playerCharacter.data != (Object)null)
{
SaveDeathState(otherPlayer, playerCharacter.data.dead);
_lastKnownDead[otherPlayer.ActorNumber] = playerCharacter.data.dead;
}
}
}
[IteratorStateMachine(typeof(<HandleLateJoin>d__9))]
private IEnumerator HandleLateJoin(Player newPlayer)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <HandleLateJoin>d__9(0)
{
<>4__this = this,
newPlayer = newPlayer
};
}
private static ImprovedSpawnTarget PopulateSpawnData(Character newCharacter)
{
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
ImprovedSpawnTarget improvedSpawnTarget = new ImprovedSpawnTarget();
foreach (Character allCharacter in Character.AllCharacters)
{
if (!((Object)(object)allCharacter == (Object)null) && !((Object)(object)allCharacter == (Object)(object)newCharacter) && !((Object)(object)allCharacter.data == (Object)null) && !allCharacter.data.dead)
{
float y = (allCharacter.data.isGrounded ? allCharacter.data.groundPos.y : ((Component)allCharacter).transform.position.y);
improvedSpawnTarget.RegisterCharacter(allCharacter, y);
}
}
return improvedSpawnTarget;
}
private void SaveDeathState(Player player, bool isDead)
{
//IL_0038: 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: Expected O, but got Unknown
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Expected O, but got Unknown
//IL_0087: Expected O, but got Unknown
if (player == null)
{
return;
}
if (!PhotonNetwork.InRoom || PhotonNetwork.CurrentRoom == null)
{
ManualLogSource logger = _logger;
if (logger != null)
{
logger.LogWarning((object)$"[SaveDeathState] Not in room; can't save death state for actor {player.ActorNumber}.");
}
return;
}
Hashtable val = new Hashtable();
((Dictionary<object, object>)val).Add((object)$"dead_{player.ActorNumber}", (object)isDead);
string key = $"stage_{player.ActorNumber}";
Scene activeScene = SceneManager.GetActiveScene();
((Dictionary<object, object>)val).Add((object)key, (object)((Scene)(ref activeScene)).name);
Hashtable val2 = val;
try
{
PhotonNetwork.CurrentRoom.SetCustomProperties(val2, (Hashtable)null, (WebFlags)null);
}
catch (Exception ex)
{
ManualLogSource logger2 = _logger;
if (logger2 != null)
{
logger2.LogWarning((object)("[SaveDeathState] SetCustomProperties failed: " + ex.Message));
}
}
}
}
[BepInPlugin("vavedev.PeakLateJoin", "Peak Late Join", "1.4.0")]
public class Plugin : BaseUnityPlugin
{
public const string PLUGIN_GUID = "vavedev.PeakLateJoin";
public const string PLUGIN_NAME = "Peak Late Join";
public const string PLUGIN_VERSION = "1.4.0";
internal static ManualLogSource Log { get; private set; }
private void Awake()
{
Log = ((BaseUnityPlugin)this).Logger;
Log.LogInfo((object)"Plugin Peak Late Join v1.4.0 loaded!");
LateJoinHandler lateJoinHandler = ((Component)this).gameObject.AddComponent<LateJoinHandler>();
lateJoinHandler.InitLogger(Log);
}
}
public static class TeleportUtils
{
[CompilerGenerated]
private sealed class <SafeWarp>d__0 : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
public Character newCharacter;
public ManualLogSource logger;
public Character targetCharacter;
private Rigidbody <rb>5__2;
private Collider <newCol>5__3;
private Collider <targetCol>5__4;
private Vector3 <safePos>5__5;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <SafeWarp>d__0(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<rb>5__2 = null;
<newCol>5__3 = null;
<targetCol>5__4 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0407: Unknown result type (might be due to invalid IL or missing references)
//IL_03c3: Unknown result type (might be due to invalid IL or missing references)
//IL_03d3: Unknown result type (might be due to invalid IL or missing references)
//IL_03e3: Unknown result type (might be due to invalid IL or missing references)
//IL_0417: Unknown result type (might be due to invalid IL or missing references)
//IL_0421: Expected O, but got Unknown
//IL_0394: Unknown result type (might be due to invalid IL or missing references)
//IL_039e: Expected O, but got Unknown
//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
//IL_0139: Unknown result type (might be due to invalid IL or missing references)
//IL_0150: Unknown result type (might be due to invalid IL or missing references)
//IL_0164: Unknown result type (might be due to invalid IL or missing references)
//IL_0169: Unknown result type (might be due to invalid IL or missing references)
//IL_0173: Unknown result type (might be due to invalid IL or missing references)
//IL_0178: Unknown result type (might be due to invalid IL or missing references)
//IL_018a: Unknown result type (might be due to invalid IL or missing references)
//IL_0194: Unknown result type (might be due to invalid IL or missing references)
//IL_0199: Unknown result type (might be due to invalid IL or missing references)
//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
//IL_01ba: Unknown result type (might be due to invalid IL or missing references)
//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
//IL_01db: Unknown result type (might be due to invalid IL or missing references)
//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
//IL_014b: Unknown result type (might be due to invalid IL or missing references)
//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
//IL_0200: Unknown result type (might be due to invalid IL or missing references)
//IL_0202: Unknown result type (might be due to invalid IL or missing references)
//IL_0203: Unknown result type (might be due to invalid IL or missing references)
//IL_0205: Unknown result type (might be due to invalid IL or missing references)
//IL_020a: Unknown result type (might be due to invalid IL or missing references)
//IL_0214: Unknown result type (might be due to invalid IL or missing references)
//IL_0219: Unknown result type (might be due to invalid IL or missing references)
//IL_021e: Unknown result type (might be due to invalid IL or missing references)
//IL_0220: Unknown result type (might be due to invalid IL or missing references)
//IL_0222: Unknown result type (might be due to invalid IL or missing references)
//IL_022c: Unknown result type (might be due to invalid IL or missing references)
//IL_0231: Unknown result type (might be due to invalid IL or missing references)
//IL_0236: Unknown result type (might be due to invalid IL or missing references)
//IL_024d: Unknown result type (might be due to invalid IL or missing references)
//IL_0257: Unknown result type (might be due to invalid IL or missing references)
//IL_02c4: Unknown result type (might be due to invalid IL or missing references)
//IL_02c5: Unknown result type (might be due to invalid IL or missing references)
//IL_02cf: Unknown result type (might be due to invalid IL or missing references)
//IL_02d4: Unknown result type (might be due to invalid IL or missing references)
//IL_02d9: Unknown result type (might be due to invalid IL or missing references)
//IL_02b7: Unknown result type (might be due to invalid IL or missing references)
//IL_02bc: Unknown result type (might be due to invalid IL or missing references)
//IL_0271: Unknown result type (might be due to invalid IL or missing references)
//IL_0276: Unknown result type (might be due to invalid IL or missing references)
//IL_0280: Unknown result type (might be due to invalid IL or missing references)
//IL_0285: Unknown result type (might be due to invalid IL or missing references)
//IL_034d: Unknown result type (might be due to invalid IL or missing references)
switch (<>1__state)
{
default:
return false;
case 0:
{
<>1__state = -1;
if ((Object)(object)newCharacter == (Object)null)
{
ManualLogSource obj = logger;
if (obj != null)
{
obj.LogWarning((object)"[SafeWarp] newCharacter is null. Aborting warp.");
}
return false;
}
if ((Object)(object)targetCharacter == (Object)null)
{
ManualLogSource obj2 = logger;
if (obj2 != null)
{
obj2.LogWarning((object)"[SafeWarp] targetCharacter is null. Aborting warp.");
}
return false;
}
<rb>5__2 = ((Component)newCharacter).GetComponent<Rigidbody>();
<newCol>5__3 = ((Component)newCharacter).GetComponent<Collider>();
<targetCol>5__4 = ((Component)targetCharacter).GetComponent<Collider>();
if ((Object)(object)<rb>5__2 != (Object)null)
{
<rb>5__2.isKinematic = true;
<rb>5__2.velocity = Vector3.zero;
<rb>5__2.angularVelocity = Vector3.zero;
}
if ((Object)(object)<newCol>5__3 != (Object)null && (Object)(object)<targetCol>5__4 != (Object)null)
{
Physics.IgnoreCollision(<newCol>5__3, <targetCol>5__4, true);
}
Vector3 val = (((Object)(object)targetCharacter.data != (Object)null && targetCharacter.data.isGrounded) ? targetCharacter.data.groundPos : ((Component)targetCharacter).transform.position);
Vector3[] array = (Vector3[])(object)new Vector3[4]
{
-((Component)targetCharacter).transform.forward * 1.5f,
((Component)targetCharacter).transform.right * 1.5f,
-((Component)targetCharacter).transform.right * 1.5f,
((Component)targetCharacter).transform.forward * 1.5f
};
List<Vector3> list = new List<Vector3>();
Vector3[] array2 = array;
RaycastHit val4 = default(RaycastHit);
foreach (Vector3 val2 in array2)
{
Vector3 val3 = val + val2 + Vector3.up * 0.1f;
if (Physics.Raycast(val3 + Vector3.up * 2f, Vector3.down, ref val4, 6f, -1, (QueryTriggerInteraction)1))
{
float num = Mathf.Abs(((RaycastHit)(ref val4)).point.y - val.y);
if (num < 1.5f)
{
list.Add(((RaycastHit)(ref val4)).point + Vector3.up * 0.05f);
}
}
}
if (list.Count > 0)
{
<safePos>5__5 = list[Random.Range(0, list.Count)];
}
else
{
<safePos>5__5 = val + Vector3.up * 1.5f;
}
ManualLogSource obj3 = logger;
if (obj3 != null)
{
obj3.LogInfo((object)$"[SafeWarp] Warping {newCharacter.characterName} near {targetCharacter.characterName} → Y={<safePos>5__5.y:F2}");
}
try
{
if ((Object)(object)((MonoBehaviourPun)newCharacter).photonView != (Object)null)
{
((MonoBehaviourPun)newCharacter).photonView.RPC("WarpPlayerRPC", (RpcTarget)0, new object[2] { <safePos>5__5, false });
}
}
catch (Exception ex)
{
ManualLogSource obj4 = logger;
if (obj4 != null)
{
obj4.LogWarning((object)("[SafeWarp] RPC WarpPlayerRPC call failed: " + ex.Message));
}
}
<>2__current = (object)new WaitForSeconds(0.5f);
<>1__state = 1;
return true;
}
case 1:
<>1__state = -1;
if ((Object)(object)<rb>5__2 != (Object)null)
{
<rb>5__2.position = <safePos>5__5;
<rb>5__2.velocity = Vector3.zero;
<rb>5__2.angularVelocity = Vector3.zero;
<rb>5__2.isKinematic = false;
}
else
{
((Component)newCharacter).transform.position = <safePos>5__5;
}
<>2__current = (object)new WaitForSeconds(0.5f);
<>1__state = 2;
return true;
case 2:
<>1__state = -1;
if ((Object)(object)<newCol>5__3 != (Object)null && (Object)(object)<targetCol>5__4 != (Object)null)
{
Physics.IgnoreCollision(<newCol>5__3, <targetCol>5__4, false);
}
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();
}
}
[IteratorStateMachine(typeof(<SafeWarp>d__0))]
public static IEnumerator SafeWarp(Character newCharacter, Character targetCharacter, ManualLogSource logger)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <SafeWarp>d__0(0)
{
newCharacter = newCharacter,
targetCharacter = targetCharacter,
logger = logger
};
}
}
}
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
internal sealed class IgnoresAccessChecksToAttribute : Attribute
{
public IgnoresAccessChecksToAttribute(string assemblyName)
{
}
}
}