Decompiled source of ReviveMod v1.0.0

BeplnEx/plugins/ReviveMod/ReviveMod.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using InControl;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("ReviveModTest")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ReviveModTest")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("7469583b-4b99-463c-b4fb-5abc190a3d43")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
public class ReviveSystem
{
	public static void RevivePlayer(PlayerController target, Vector3 pos)
	{
		//IL_0036: Unknown result type (might be due to invalid IL or missing references)
		MethodInfo method = typeof(PlayerController).GetMethod("CoopResurrectInternal", BindingFlags.Instance | BindingFlags.NonPublic);
		if ((object)method != null && target != null && target.IsGhost)
		{
			IEnumerator enumerator = (IEnumerator)method.Invoke(target, new object[3] { pos, null, false });
			((MonoBehaviour)target).StartCoroutine(enumerator);
		}
	}
}
[BepInPlugin("revive.mod", "Revive Mod", "4.2")]
public class ReviveMod : BaseUnityPlugin
{
	[CompilerGenerated]
	private sealed class <HandleReviveHealth>d__34 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public PlayerController target;

		public ReviveMod <>4__this;

		private int <count>5__1;

		private float <maxHealth>5__2;

		private float <targetHealth>5__3;

		private float <timer>5__4;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <HandleReviveHealth>d__34(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				if ((Object)(object)target == (Object)null || (Object)(object)((BraveBehaviour)target).healthHaver == (Object)null)
				{
					return false;
				}
				if (!<>4__this.reviveCounts.ContainsKey(target))
				{
					<>4__this.reviveCounts[target] = 0;
				}
				<>4__this.reviveCounts[target]++;
				<count>5__1 = <>4__this.reviveCounts[target];
				<maxHealth>5__2 = ((BraveBehaviour)target).healthHaver.GetMaxHealth();
				<targetHealth>5__3 = Mathf.Max(<maxHealth>5__2 - (float)(<count>5__1 - 1), 1f);
				Debug.Log((object)$"复活次数: {<count>5__1} -> 锁定血量: {<targetHealth>5__3}");
				<timer>5__4 = 0f;
				break;
			case 1:
				<>1__state = -1;
				break;
			}
			if (<timer>5__4 < 1.5f)
			{
				if ((Object)(object)target != (Object)null && (Object)(object)((BraveBehaviour)target).healthHaver != (Object)null)
				{
					((BraveBehaviour)target).healthHaver.ForceSetCurrentHealth(<targetHealth>5__3);
				}
				<timer>5__4 += BraveTime.DeltaTime;
				<>2__current = null;
				<>1__state = 1;
				return true;
			}
			if ((Object)(object)target != (Object)null && (Object)(object)((BraveBehaviour)target).healthHaver != (Object)null)
			{
				((BraveBehaviour)target).healthHaver.ForceSetCurrentHealth(<targetHealth>5__3);
			}
			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();
		}
	}

	[CompilerGenerated]
	private sealed class <ReviveFlow>d__33 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public PlayerController target;

		public ReviveMod <>4__this;

		private Vector3 <corpsePos>5__1;

		private Vector3 <offset>5__2;

		private Vector3 <finalPos>5__3;

		private Vector3 <start>5__4;

		private float <t>5__5;

		private float <moveTime>5__6;

		private Vector3 <pos>5__7;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <ReviveFlow>d__33(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_01c8: 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_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_018e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: 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_009d: 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_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: 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)
			//IL_00ca: 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)
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<corpsePos>5__1 = ((target.PlayerIDX == 0) ? <>4__this.corpsePosP1 : <>4__this.corpsePosP2);
				<offset>5__2 = ((target.PlayerIDX == 0) ? new Vector3(-0.85f, -0.3f, 0f) : new Vector3(-0.8f, -0.25f, 0f));
				<finalPos>5__3 = <corpsePos>5__1 + <offset>5__2;
				<start>5__4 = ((BraveBehaviour)((BraveBehaviour)target).specRigidbody).transform.position;
				<t>5__5 = 0f;
				<moveTime>5__6 = 0.15f;
				goto IL_0168;
			case 1:
				<>1__state = -1;
				goto IL_0168;
			case 2:
				<>1__state = -1;
				ReviveSystem.RevivePlayer(target, <finalPos>5__3);
				<>2__current = null;
				<>1__state = 3;
				return true;
			case 3:
				{
					<>1__state = -1;
					((MonoBehaviour)<>4__this).StartCoroutine(<>4__this.HandleReviveHealth(target));
					return false;
				}
				IL_0168:
				if (<t>5__5 < <moveTime>5__6)
				{
					<t>5__5 += Time.deltaTime;
					<pos>5__7 = Vector3.Lerp(<start>5__4, <finalPos>5__3, <t>5__5 / <moveTime>5__6);
					((BraveBehaviour)((BraveBehaviour)target).specRigidbody).transform.position = <pos>5__7;
					((BraveBehaviour)target).specRigidbody.Reinitialize();
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				((BraveBehaviour)((BraveBehaviour)target).specRigidbody).transform.position = <finalPos>5__3;
				((BraveBehaviour)target).specRigidbody.Reinitialize();
				<>2__current = null;
				<>1__state = 2;
				return true;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	[CompilerGenerated]
	private sealed class <ShowFailBar>d__36 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public PlayerController player;

		public ReviveMod <>4__this;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <ShowFailBar>d__36(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				GameUIRoot.Instance.StartPlayerReloadBar(player, new Vector3(0f, 1.5f, 0f), 0.3f);
				<>2__current = null;
				<>1__state = 1;
				return true;
			case 1:
				<>1__state = -1;
				GameUIRoot.Instance.ForceClearReload(player.PlayerIDX);
				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();
		}
	}

	private Dictionary<PlayerController, float> glowTimers = new Dictionary<PlayerController, float>();

	private Dictionary<PlayerController, int> reviveCounts = new Dictionary<PlayerController, int>();

	private HashSet<PlayerController> hintedBodies = new HashSet<PlayerController>();

	private Transform[] hintPoints = (Transform[])(object)new Transform[2];

	private bool isReviving = false;

	private bool reviveDone = false;

	private float reviveTimer = 0f;

	private float saveTimer = 0f;

	private float saveDuration = 0.25f;

	private float reviveDuration = 3.5f;

	private PlayerController reviver;

	private PlayerController target;

	private Vector3 corpsePosP1;

	private Vector3 corpsePosP2;

	private GameObject glowP1;

	private GameObject glowP2;

	private float glowTimer = 0f;

	private bool corpseRecordedP1 = false;

	private bool corpseRecordedP2 = false;

	private bool globalHintShown = false;

	private bool runInitialized = false;

	private void Awake()
	{
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: Expected O, but got Unknown
		for (int i = 0; i < 2; i++)
		{
			GameObject val = new GameObject("ReviveHintPoint_" + i);
			hintPoints[i] = val.transform;
		}
	}

	private void Update()
	{
		//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_0111: Unknown result type (might be due to invalid IL or missing references)
		if (!GameManager.HasInstance || (Object)(object)GameManager.Instance.PrimaryPlayer == (Object)null)
		{
			runInitialized = false;
		}
		else
		{
			if (!GameManager.HasInstance)
			{
				return;
			}
			TrackDeath();
			HandlePlayer(GameManager.Instance.PrimaryPlayer);
			HandlePlayer(GameManager.Instance.SecondaryPlayer);
			UpdateRevive();
			UpdateGlow();
			if (Input.GetKeyDown((KeyCode)121))
			{
				PlayerController primaryPlayer = GameManager.Instance.PrimaryPlayer;
				if ((Object)(object)primaryPlayer != (Object)null && ((BraveBehaviour)primaryPlayer).healthHaver.IsAlive)
				{
					((BraveBehaviour)primaryPlayer).healthHaver.ApplyDamage(999f, Vector2.zero, "kill P1", (CoreDamageTypes)0, (DamageCategory)5, true, (PixelCollider)null, false);
				}
			}
			if (Input.GetKeyDown((KeyCode)117))
			{
				PlayerController secondaryPlayer = GameManager.Instance.SecondaryPlayer;
				if ((Object)(object)secondaryPlayer != (Object)null && ((BraveBehaviour)secondaryPlayer).healthHaver.IsAlive)
				{
					((BraveBehaviour)secondaryPlayer).healthHaver.ApplyDamage(999f, Vector2.zero, "kill P2", (CoreDamageTypes)0, (DamageCategory)5, true, (PixelCollider)null, false);
				}
			}
			UpdateGlowEffect();
		}
	}

	private void UpdateGlowEffect()
	{
		glowTimer += Time.deltaTime;
		float pulse = (Mathf.Sin(glowTimer * 3f) + 1f) / 2f;
		UpdateSingleGlow(glowP1, pulse);
		UpdateSingleGlow(glowP2, pulse);
	}

	private void UpdateGlow(tk2dSprite glow, float pulse)
	{
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)glow == (Object)null))
		{
			Color val = default(Color);
			((Color)(ref val))..ctor(0.3f, 0.7f, 1f, 0.4f);
			Color val2 = default(Color);
			((Color)(ref val2))..ctor(0.7f, 0.9f, 1f, 0.8f);
			((tk2dBaseSprite)glow).color = Color.Lerp(val, val2, pulse);
		}
	}

	private void UpdateSingleGlow(GameObject glow, float pulse)
	{
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: 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)
		//IL_010c: Unknown result type (might be due to invalid IL or missing references)
		//IL_010e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0112: Unknown result type (might be due to invalid IL or missing references)
		//IL_0117: Unknown result type (might be due to invalid IL or missing references)
		//IL_011a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0123: 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_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)glow == (Object)null)
		{
			return;
		}
		LineRenderer component = glow.GetComponent<LineRenderer>();
		if (!((Object)(object)component == (Object)null))
		{
			PlayerController primaryPlayer = GameManager.Instance.PrimaryPlayer;
			PlayerController secondaryPlayer = GameManager.Instance.SecondaryPlayer;
			float num = 999f;
			if ((Object)(object)primaryPlayer != (Object)null)
			{
				num = Mathf.Min(num, Vector3.Distance(Vector2.op_Implicit(((BraveBehaviour)primaryPlayer).specRigidbody.UnitCenter), glow.transform.position));
			}
			if ((Object)(object)secondaryPlayer != (Object)null)
			{
				num = Mathf.Min(num, Vector3.Distance(Vector2.op_Implicit(((BraveBehaviour)secondaryPlayer).specRigidbody.UnitCenter), glow.transform.position));
			}
			float num2 = Mathf.Clamp01(1f - num / 2f);
			float num3 = pulse * 0.5f + num2 * 0.5f;
			Color val = default(Color);
			((Color)(ref val))..ctor(0.3f, 0.7f, 1f, 0.2f);
			Color val2 = default(Color);
			((Color)(ref val2))..ctor(0.7f, 0.9f, 1f, 0.9f);
			Color endColor = (component.startColor = Color.Lerp(val, val2, num3));
			component.endColor = endColor;
			float endWidth = (component.startWidth = Mathf.Lerp(0.04f, 0.1f, num3));
			component.endWidth = endWidth;
		}
	}

	private void UpdateGlow()
	{
		PlayerController primaryPlayer = GameManager.Instance.PrimaryPlayer;
		PlayerController secondaryPlayer = GameManager.Instance.SecondaryPlayer;
		HandleGlow(primaryPlayer);
		HandleGlow(secondaryPlayer);
	}

	private void HandleGlow(PlayerController player)
	{
		//IL_003a: 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_00df: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)player == (Object)null || (Object)(object)((BraveBehaviour)player).sprite == (Object)null)
		{
			return;
		}
		if (!player.IsGhost)
		{
			((BraveBehaviour)player).sprite.color = Color.white;
			glowTimers.Remove(player);
			return;
		}
		if (!glowTimers.ContainsKey(player))
		{
			glowTimers[player] = 0f;
		}
		glowTimers[player] += Time.deltaTime;
		float num = glowTimers[player];
		float num2 = (Mathf.Sin(num * 3f) + 1f) / 2f;
		Color val = default(Color);
		((Color)(ref val))..ctor(0.3f, 0.6f, 1f);
		Color val2 = Color.Lerp(val, Color.white, num2);
		((BraveBehaviour)player).sprite.color = val2 * 1.2f;
	}

	private void TrackDeath()
	{
		//IL_008b: 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_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_0132: Unknown result type (might be due to invalid IL or missing references)
		//IL_0137: Unknown result type (might be due to invalid IL or missing references)
		//IL_013c: 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)
		PlayerController primaryPlayer = GameManager.Instance.PrimaryPlayer;
		if (!runInitialized && (Object)(object)primaryPlayer != (Object)null && ((BraveBehaviour)primaryPlayer).healthHaver.IsAlive)
		{
			reviveCounts.Clear();
			runInitialized = true;
			Debug.Log((object)"新一局,重置复活次数");
		}
		PlayerController secondaryPlayer = GameManager.Instance.SecondaryPlayer;
		if ((Object)(object)primaryPlayer != (Object)null)
		{
			if (primaryPlayer.IsGhost && !corpseRecordedP1)
			{
				corpsePosP1 = Vector2.op_Implicit(((BraveBehaviour)primaryPlayer).specRigidbody.UnitCenter);
				corpseRecordedP1 = true;
				CreateGlow(ref glowP1, corpsePosP1);
			}
			else if (!primaryPlayer.IsGhost && corpseRecordedP1)
			{
				corpseRecordedP1 = false;
				if ((Object)(object)glowP1 != (Object)null)
				{
					Object.Destroy((Object)(object)glowP1);
					glowP1 = null;
				}
			}
		}
		if (!((Object)(object)secondaryPlayer != (Object)null))
		{
			return;
		}
		if (secondaryPlayer.IsGhost && !corpseRecordedP2)
		{
			corpsePosP2 = Vector2.op_Implicit(((BraveBehaviour)secondaryPlayer).specRigidbody.UnitCenter);
			corpseRecordedP2 = true;
			CreateGlow(ref glowP2, corpsePosP2);
		}
		else if (!secondaryPlayer.IsGhost && corpseRecordedP2)
		{
			corpseRecordedP2 = false;
			if ((Object)(object)glowP2 != (Object)null)
			{
				Object.Destroy((Object)(object)glowP2);
				glowP2 = null;
			}
		}
	}

	private void CreateGlow(ref GameObject glow, Vector3 pos)
	{
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0023: Expected O, but got Unknown
		//IL_002a: 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_008f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Expected O, but got Unknown
		//IL_00e4: 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)
		//IL_012a: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)glow != (Object)null)
		{
			Object.Destroy((Object)(object)glow);
		}
		glow = new GameObject("ReviveGlow");
		glow.transform.position = pos;
		glow.transform.localScale = Vector3.one;
		LineRenderer val = glow.AddComponent<LineRenderer>();
		val.useWorldSpace = false;
		val.loop = true;
		val.positionCount = 64;
		val.alignment = (LineAlignment)0;
		val.numCornerVertices = 8;
		val.numCapVertices = 8;
		val.textureMode = (LineTextureMode)0;
		((Renderer)val).material = new Material(Shader.Find("Sprites/Default"));
		((Renderer)val).sortingOrder = 100;
		float num = 0.55f;
		for (int i = 0; i < val.positionCount; i++)
		{
			float num2 = (float)Math.PI * 2f * (float)i / (float)val.positionCount;
			float num3 = Mathf.Cos(num2) * num;
			float num4 = Mathf.Sin(num2) * num;
			val.SetPosition(i, new Vector3(num3, num4, 0f));
		}
		Color val2 = default(Color);
		((Color)(ref val2))..ctor(0.3f, 0.7f, 1f, 0.55f);
		val.startColor = val2;
		val.endColor = val2;
		val.startWidth = 0.07f;
		val.endWidth = 0.07f;
		glow.layer = 0;
	}

	private void HandlePlayer(PlayerController player)
	{
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: Unknown result type (might be due to invalid IL or missing references)
		//IL_0055: 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_0089: 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_00dc: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)player == (Object)null)
		{
			return;
		}
		PlayerController otherPlayer = GameManager.Instance.GetOtherPlayer(player);
		if ((Object)(object)otherPlayer == (Object)null)
		{
			return;
		}
		int playerIDX = player.PlayerIDX;
		BraveInput instanceForPlayer = BraveInput.GetInstanceForPlayer(playerIDX);
		Vector3 val = ((otherPlayer.PlayerIDX == 0) ? corpsePosP1 : corpsePosP2);
		bool flag = ((otherPlayer.PlayerIDX == 0) ? corpseRecordedP1 : corpseRecordedP2);
		if (flag)
		{
			float num = Vector3.Distance(Vector2.op_Implicit(((BraveBehaviour)player).specRigidbody.UnitCenter), val);
			bool flag2 = flag && num < 2f;
			if (flag2 && !isReviving && (Object)(object)player != (Object)(object)reviver && !globalHintShown)
			{
				ShowReviveHint(player, val);
				globalHintShown = true;
			}
			bool flag3 = false;
			PlayerAction actionFromType = instanceForPlayer.ActiveActions.GetActionFromType((GungeonActionType)10);
			flag3 = ((actionFromType == null) ? Input.GetKeyDown((KeyCode)101) : ((OneAxisInputControl)actionFromType).WasPressed);
			if (!isReviving && flag3 && flag2)
			{
				StartRevive(player, otherPlayer);
			}
		}
	}

	private void StartRevive(PlayerController player, PlayerController other)
	{
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)((BraveBehaviour)other).healthHaver != (Object)null) || !((BraveBehaviour)other).healthHaver.IsAlive)
		{
			isReviving = true;
			reviveDone = false;
			reviveTimer = 0f;
			saveTimer = 0f;
			reviver = player;
			target = other;
			HideReviveHint(player);
			hintedBodies.Remove(other);
			Debug.Log((object)"开始复活");
			if ((Object)(object)GameUIRoot.Instance != (Object)null)
			{
				GameUIRoot.Instance.StartPlayerReloadBar(player, new Vector3(0f, 1.5f, 0f), reviveDuration);
			}
		}
	}

	private void UpdateRevive()
	{
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		if (!isReviving || (Object)(object)reviver == (Object)null || (Object)(object)target == (Object)null)
		{
			return;
		}
		BraveInput instanceForPlayer = BraveInput.GetInstanceForPlayer(reviver.PlayerIDX);
		float x = ((TwoAxisInputControl)instanceForPlayer.ActiveActions.Move).Value.x;
		float y = ((TwoAxisInputControl)instanceForPlayer.ActiveActions.Move).Value.y;
		if ((Mathf.Abs(x) > 0.2f || Mathf.Abs(y) > 0.2f) && saveTimer > saveDuration)
		{
			Debug.Log((object)"移动中断救人");
			CancelRevive();
			return;
		}
		saveTimer += Time.deltaTime;
		reviveTimer += Time.deltaTime;
		if (isReviving && !reviveDone && reviveTimer >= reviveDuration)
		{
			reviveDone = true;
			isReviving = false;
			((MonoBehaviour)this).StartCoroutine(ReviveFlow(target));
			target = null;
			reviver = null;
		}
	}

	[IteratorStateMachine(typeof(<ReviveFlow>d__33))]
	private IEnumerator ReviveFlow(PlayerController target)
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <ReviveFlow>d__33(0)
		{
			<>4__this = this,
			target = target
		};
	}

	[IteratorStateMachine(typeof(<HandleReviveHealth>d__34))]
	private IEnumerator HandleReviveHealth(PlayerController target)
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <HandleReviveHealth>d__34(0)
		{
			<>4__this = this,
			target = target
		};
	}

	private void CancelRevive()
	{
		if ((Object)(object)reviver != (Object)null && (Object)(object)GameUIRoot.Instance != (Object)null)
		{
			GameUIRoot.Instance.ForceClearReload(reviver.PlayerIDX);
			((MonoBehaviour)this).StartCoroutine(ShowFailBar(reviver));
		}
		isReviving = false;
		reviveTimer = 0f;
		saveTimer = 0f;
		reviver = null;
		target = null;
	}

	[IteratorStateMachine(typeof(<ShowFailBar>d__36))]
	private IEnumerator ShowFailBar(PlayerController player)
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <ShowFailBar>d__36(0)
		{
			<>4__this = this,
			player = player
		};
	}

	private void EnsureHintPoint(int idx)
	{
		//IL_0025: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: Expected O, but got Unknown
		if ((Object)(object)hintPoints[idx] == (Object)null)
		{
			GameObject val = new GameObject("ReviveHintPoint_" + idx);
			hintPoints[idx] = val.transform;
		}
	}

	private void ShowReviveHint(PlayerController player, Vector3 pos)
	{
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		int playerIDX = player.PlayerIDX;
		EnsureHintPoint(playerIDX);
		Transform val = hintPoints[playerIDX];
		val.position = pos;
		string text = GetInteractKey(playerIDX);
		if (string.IsNullOrEmpty(text))
		{
			text = "E";
		}
		string text2 = (IsChinese() ? ("按 " + text + " 进行救援") : ("Press " + text + " to Revive"));
		if (!TextBoxManager.HasTextBox(val))
		{
			TextBoxManager.ShowTextBox(val.position, val, 0.8f, text2, string.Empty, false, (BoxSlideOrientation)0, false, false);
		}
	}

	private void HideReviveHint(PlayerController player)
	{
		int playerIDX = player.PlayerIDX;
		Transform val = hintPoints[playerIDX];
		if (TextBoxManager.HasTextBox(val))
		{
			TextBoxManager.ClearTextBox(val);
		}
	}

	private string GetInteractKey(int idx)
	{
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		BraveInput instanceForPlayer = BraveInput.GetInstanceForPlayer(idx);
		if ((Object)(object)instanceForPlayer == (Object)null)
		{
			return "E";
		}
		PlayerAction actionFromType = instanceForPlayer.ActiveActions.GetActionFromType((GungeonActionType)10);
		if (actionFromType == null)
		{
			return "E";
		}
		foreach (BindingSource binding in actionFromType.Bindings)
		{
			KeyBindingSource val = (KeyBindingSource)(object)((binding is KeyBindingSource) ? binding : null);
			if ((BindingSource)(object)val != (BindingSource)null)
			{
				KeyCombo control = val.Control;
				return ((object)(KeyCombo)(ref control)).ToString();
			}
		}
		return "E";
	}

	private bool IsChinese()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Invalid comparison between Unknown and I4
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: Invalid comparison between Unknown and I4
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Invalid comparison between Unknown and I4
		return (int)Application.systemLanguage == 6 || (int)Application.systemLanguage == 40 || (int)Application.systemLanguage == 41;
	}
}