Decompiled source of Player Bounties v1.0.0

Bounty.dll

Decompiled 2 months ago
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.Configuration;
using BepInEx.Logging;
using ExitGames.Client.Photon;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using Photon.Realtime;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[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: AssemblyCompany("Omniscye")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("Bounty")]
[assembly: AssemblyTitle("Bounty")]
[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 Empress.REPO.BountyHunt
{
	[BepInPlugin("empress.repo.bountyhunt", "Empress Bounty Hunt", "1.4.2")]
	public class BountyPlugin : BaseUnityPlugin
	{
		[CompilerGenerated]
		private sealed class <LevelWatcher>d__23 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public BountyPlugin <>4__this;

			private bool <playersReady>5__1;

			private bool <mainState>5__2;

			private BountyManager <mgr>5__3;

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

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

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

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

			private bool MoveNext()
			{
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0036: Expected O, but got Unknown
				//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e7: Invalid comparison between Unknown and I4
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					break;
				case 1:
					<>1__state = -1;
					if (!EnableMode.Value || !SemiFunc.IsMultiplayer() || !PhotonNetwork.InRoom || SemiFunc.MenuLevel() || (Object)(object)LevelGenerator.Instance == (Object)null || (Object)(object)GameDirector.instance == (Object)null)
					{
						break;
					}
					<playersReady>5__1 = GameDirector.instance.PlayerList != null && GameDirector.instance.PlayerList.Count > 0;
					<mainState>5__2 = (int)GameDirector.instance.currentState == 2;
					if (!<playersReady>5__1 || !<mainState>5__2)
					{
						break;
					}
					<>4__this.CreateManagersIfMissing();
					<mgr>5__3 = BountyManager.Instance;
					if (!((Object)(object)<mgr>5__3 == (Object)null))
					{
						<mgr>5__3.EnsureHudBoundForAllPlayers();
						if (!<mgr>5__3.HasAssignedThisLevel)
						{
							<mgr>5__3.TryAssignRandomBountyThisLevel();
						}
						<mgr>5__3 = null;
					}
					break;
				}
				<>2__current = (object)new WaitForSeconds(0.5f);
				<>1__state = 1;
				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();
			}
		}

		internal static ConfigEntry<bool> EnableMode;

		internal static ConfigEntry<float> ChancePerLevel;

		internal static ConfigEntry<int> MinDollars;

		internal static ConfigEntry<int> MaxDollars;

		internal static ConfigEntry<float> DurationSeconds;

		internal static ConfigEntry<bool> OnlyOneBountyPerLevel;

		private const string AsciiBanner = "\r\n ▄▄▄▄▄▄▄▄▄▄   ▄▄▄▄▄▄▄▄▄▄▄  ▄         ▄  ▄▄        ▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄         ▄ \r\n▐░░░░░░░░░░▌ ▐░░░░░░░░░░░▌▐░▌       ▐░▌▐░░▌      ▐░▌▐░░░░░░░░░░░▌▐░▌       ▐░▌\r\n▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌▐░▌       ▐░▌▐░▌░▌     ▐░▌ ▀▀▀▀█░█▀▀▀▀ ▐░▌       ▐░▌\r\n▐░▌       ▐░▌▐░▌       ▐░▌▐░▌       ▐░▌▐░▌▐░▌    ▐░▌     ▐░▌     ▐░▌       ▐░▌\r\n▐░█▄▄▄▄▄▄▄█░▌▐░▌       ▐░▌▐░▌       ▐░▌▐░▌ ▐░▌   ▐░▌     ▐░▌     ▐░█▄▄▄▄▄▄▄█░▌\r\n▐░░░░░░░░░░▌ ▐░▌       ▐░▌▐░▌       ▐░▌▐░▌  ▐░▌  ▐░▌     ▐░▌     ▐░░░░░░░░░░░▌\r\n▐░█▀▀▀▀▀▀▀█░▌▐░▌       ▐░▌▐░▌       ▐░▌▐░▌   ▐░▌ ▐░▌     ▐░▌      ▀▀▀▀█░█▀▀▀▀ \r\n▐░▌       ▐░▌▐░▌       ▐░▌▐░▌       ▐░▌▐░▌    ▐░▌▐░▌     ▐░▌          ▐░▌     \r\n▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌▐░▌     ▐░▐░▌     ▐░▌          ▐░▌     \r\n▐░░░░░░░░░░▌ ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░▌      ▐░░▌     ▐░▌          ▐░▌     \r\n ▀▀▀▀▀▀▀▀▀▀   ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀        ▀▀       ▀            ▀      ";

		internal static BountyPlugin Instance { get; private set; }

		internal static ManualLogSource Logger => Instance._logger;

		private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger;

		internal Harmony Harmony { get; private set; }

		private void Awake()
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Expected O, but got Unknown
			Instance = this;
			((Component)this).gameObject.transform.parent = null;
			((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
			Object.DontDestroyOnLoad((Object)(object)this);
			Harmony = new Harmony("empress.repo.bountyhunt");
			Harmony.PatchAll();
			EnableMode = ((BaseUnityPlugin)this).Config.Bind<bool>("Bounty", "Enable", true, "Enable Bounty Hunt.");
			ChancePerLevel = ((BaseUnityPlugin)this).Config.Bind<float>("Bounty", "ChancePerLevel", 0.45f, "Probability a level spawns a bounty (0..1).");
			MinDollars = ((BaseUnityPlugin)this).Config.Bind<int>("Bounty", "MinDollars", 1, "Minimum bounty dollars displayed.");
			MaxDollars = ((BaseUnityPlugin)this).Config.Bind<int>("Bounty", "MaxDollars", 100000, "Maximum bounty dollars displayed.");
			DurationSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Bounty", "DurationSeconds", 60f, "Bounty timer seconds.");
			OnlyOneBountyPerLevel = ((BaseUnityPlugin)this).Config.Bind<bool>("Bounty", "OnlyOneBountyPerLevel", true, "At most one bounty per level.");
			SceneManager.sceneLoaded += OnSceneLoaded;
			((MonoBehaviour)this).StartCoroutine(LevelWatcher());
			Logger.LogMessage((object)"\r\n ▄▄▄▄▄▄▄▄▄▄   ▄▄▄▄▄▄▄▄▄▄▄  ▄         ▄  ▄▄        ▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄         ▄ \r\n▐░░░░░░░░░░▌ ▐░░░░░░░░░░░▌▐░▌       ▐░▌▐░░▌      ▐░▌▐░░░░░░░░░░░▌▐░▌       ▐░▌\r\n▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌▐░▌       ▐░▌▐░▌░▌     ▐░▌ ▀▀▀▀█░█▀▀▀▀ ▐░▌       ▐░▌\r\n▐░▌       ▐░▌▐░▌       ▐░▌▐░▌       ▐░▌▐░▌▐░▌    ▐░▌     ▐░▌     ▐░▌       ▐░▌\r\n▐░█▄▄▄▄▄▄▄█░▌▐░▌       ▐░▌▐░▌       ▐░▌▐░▌ ▐░▌   ▐░▌     ▐░▌     ▐░█▄▄▄▄▄▄▄█░▌\r\n▐░░░░░░░░░░▌ ▐░▌       ▐░▌▐░▌       ▐░▌▐░▌  ▐░▌  ▐░▌     ▐░▌     ▐░░░░░░░░░░░▌\r\n▐░█▀▀▀▀▀▀▀█░▌▐░▌       ▐░▌▐░▌       ▐░▌▐░▌   ▐░▌ ▐░▌     ▐░▌      ▀▀▀▀█░█▀▀▀▀ \r\n▐░▌       ▐░▌▐░▌       ▐░▌▐░▌       ▐░▌▐░▌    ▐░▌▐░▌     ▐░▌          ▐░▌     \r\n▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌▐░▌     ▐░▐░▌     ▐░▌          ▐░▌     \r\n▐░░░░░░░░░░▌ ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░▌      ▐░░▌     ▐░▌          ▐░▌     \r\n ▀▀▀▀▀▀▀▀▀▀   ▀▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀▀  ▀        ▀▀       ▀            ▀      ");
		}

		private void OnDestroy()
		{
			SceneManager.sceneLoaded -= OnSceneLoaded;
			try
			{
				Harmony harmony = Harmony;
				if (harmony != null)
				{
					harmony.UnpatchSelf();
				}
			}
			catch
			{
			}
		}

		private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
		{
			if (EnableMode.Value)
			{
				CreateManagersIfMissing();
				BountyManager.Instance?.OnNewLevelSceneLoaded();
			}
		}

		private void CreateManagersIfMissing()
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Expected O, but got Unknown
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Expected O, but got Unknown
			if ((Object)(object)BountyManager.Instance == (Object)null)
			{
				GameObject val = new GameObject("Empress_BountyManager");
				((Object)val).hideFlags = (HideFlags)61;
				Object.DontDestroyOnLoad((Object)(object)val);
				val.AddComponent<BountyManager>();
			}
			if ((Object)(object)BountyEventManager.Instance == (Object)null)
			{
				GameObject val2 = new GameObject("Empress_BountyEventManager");
				((Object)val2).hideFlags = (HideFlags)61;
				Object.DontDestroyOnLoad((Object)(object)val2);
				val2.AddComponent<BountyEventManager>();
			}
		}

		[IteratorStateMachine(typeof(<LevelWatcher>d__23))]
		private IEnumerator LevelWatcher()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <LevelWatcher>d__23(0)
			{
				<>4__this = this
			};
		}
	}
	internal static class BountyEvt
	{
		internal const byte EVT_CODE = 66;

		internal const string TAG = "BNT1";

		internal const byte SET_BOUNTY = 1;

		private static readonly SendOptions Reliable;

		private static readonly RaiseEventOptions ToAllCached;

		internal static void SendAllCached(byte innerId, params object[] args)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			object[] array = Build(innerId, args);
			PhotonNetwork.RaiseEvent((byte)66, (object)array, ToAllCached, Reliable);
		}

		private static object[] Build(byte innerId, object[] args)
		{
			object[] array = new object[2 + ((args != null) ? args.Length : 0)];
			array[0] = "BNT1";
			array[1] = innerId;
			if (args != null && args.Length != 0)
			{
				Array.Copy(args, 0, array, 2, args.Length);
			}
			return array;
		}

		static BountyEvt()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Expected O, but got Unknown
			SendOptions reliable = default(SendOptions);
			((SendOptions)(ref reliable)).Reliability = true;
			Reliable = reliable;
			ToAllCached = new RaiseEventOptions
			{
				Receivers = (ReceiverGroup)1,
				CachingOption = (EventCaching)4
			};
		}
	}
	public class BountyEventManager : MonoBehaviourPunCallbacks, IOnEventCallback
	{
		public static BountyEventManager Instance { get; private set; }

		private void Awake()
		{
			if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this)
			{
				Object.Destroy((Object)(object)this);
				return;
			}
			Instance = this;
			Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
		}

		private void OnEnable()
		{
			if (PhotonNetwork.NetworkingClient != null)
			{
				PhotonNetwork.AddCallbackTarget((object)this);
			}
		}

		private void OnDisable()
		{
			PhotonNetwork.RemoveCallbackTarget((object)this);
		}

		public void OnEvent(EventData photonEvent)
		{
			try
			{
				if (photonEvent.Code != 66 || !(photonEvent.CustomData is object[] array) || array.Length < 2 || !(array[0] is string text) || text != "BNT1")
				{
					return;
				}
				BountyManager instance = BountyManager.Instance;
				if (!((Object)(object)instance == (Object)null))
				{
					byte b = (byte)array[1];
					byte b2 = b;
					if (b2 == 1 && array.Length >= 6)
					{
						int actor = Convert.ToInt32(array[2]);
						int dollars = Convert.ToInt32(array[3]);
						double startTime = Convert.ToDouble(array[4]);
						float duration = Convert.ToSingle(array[5]);
						instance.ApplyBounty(actor, dollars, startTime, duration);
					}
				}
			}
			catch (Exception ex)
			{
				BountyPlugin.Logger.LogWarning((object)("[Bounty] OnEvent guarded: " + ex.Message));
			}
		}
	}
	public class BountyManager : MonoBehaviourPunCallbacks
	{
		private readonly HashSet<int> reviveLockedActors = new HashSet<int>();

		public static BountyManager Instance { get; private set; }

		public int TargetActor { get; private set; } = -1;


		public int BountyDollars { get; private set; } = 0;


		public double StartTime { get; private set; } = 0.0;


		public float Duration { get; private set; } = 0f;


		public bool HasAssignedThisLevel { get; private set; } = false;


		private void Awake()
		{
			if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this)
			{
				Object.Destroy((Object)(object)this);
				return;
			}
			Instance = this;
			Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
		}

		public override void OnJoinedRoom()
		{
			ResetForNewLevel(clearHudOnly: true);
		}

		public override void OnLeftRoom()
		{
			ResetForNewLevel(clearHudOnly: true);
		}

		public void OnNewLevelSceneLoaded()
		{
			ResetForNewLevel(clearHudOnly: false);
		}

		private void ResetForNewLevel(bool clearHudOnly)
		{
			if (!clearHudOnly)
			{
				TargetActor = -1;
				BountyDollars = 0;
				StartTime = 0.0;
				Duration = 0f;
				reviveLockedActors.Clear();
				HasAssignedThisLevel = false;
			}
			PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>();
			foreach (PlayerAvatar val in array)
			{
				((Component)val).GetComponent<BountyHud>()?.SetActive(on: false);
			}
		}

		public bool IsBountyActive()
		{
			if (TargetActor <= 0 || Duration <= 0f)
			{
				return false;
			}
			return PhotonNetwork.Time < StartTime + (double)Duration;
		}

		public float GetSecondsRemaining()
		{
			if (!IsBountyActive())
			{
				return 0f;
			}
			return Mathf.Max(0f, (float)(StartTime + (double)Duration - PhotonNetwork.Time));
		}

		public bool IsReviveLocked(int actor)
		{
			return reviveLockedActors.Contains(actor);
		}

		public void LockReviveForLevel(int actor)
		{
			if (actor > 0)
			{
				reviveLockedActors.Add(actor);
			}
		}

		public void EnsureHudBoundForAllPlayers()
		{
			try
			{
				List<PlayerAvatar> list = GameDirector.instance?.PlayerList;
				if (list == null)
				{
					return;
				}
				int num = ((PhotonNetwork.LocalPlayer != null) ? PhotonNetwork.LocalPlayer.ActorNumber : (-1));
				foreach (PlayerAvatar item in list)
				{
					if (!((Object)(object)item == (Object)null))
					{
						BountyHud bountyHud = ((Component)item).GetComponent<BountyHud>();
						if ((Object)(object)bountyHud == (Object)null)
						{
							bountyHud = ((Component)item).gameObject.AddComponent<BountyHud>();
							bountyHud.Bind(item);
						}
						PhotonView photonView = item.photonView;
						int num2 = (((Object)(object)photonView != (Object)null && photonView.Owner != null) ? photonView.Owner.ActorNumber : (-1));
						bool active = num2 == TargetActor && IsBountyActive() && num2 != num;
						bountyHud.SetActive(active);
					}
				}
			}
			catch (Exception ex)
			{
				BountyPlugin.Logger.LogWarning((object)("[Bounty] EnsureHudBoundForAllPlayers: " + ex.Message));
			}
		}

		public void TryAssignRandomBountyThisLevel()
		{
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Invalid comparison between Unknown and I4
			if (HasAssignedThisLevel || (PhotonNetwork.IsConnected && (!PhotonNetwork.InRoom || !PhotonNetwork.IsMasterClient)) || SemiFunc.MenuLevel() || (Object)(object)LevelGenerator.Instance == (Object)null || (Object)(object)GameDirector.instance == (Object)null || (int)GameDirector.instance.currentState != 2)
			{
				return;
			}
			List<PlayerAvatar> playerList = GameDirector.instance.PlayerList;
			if (playerList == null || playerList.Count == 0)
			{
				return;
			}
			Random random = new Random();
			if (random.NextDouble() > (double)Mathf.Clamp01(BountyPlugin.ChancePerLevel.Value))
			{
				HasAssignedThisLevel = true;
				return;
			}
			PlayerAvatar val = playerList[random.Next(playerList.Count)];
			int? obj;
			if (val == null)
			{
				obj = null;
			}
			else
			{
				PhotonView photonView = val.photonView;
				if (photonView == null)
				{
					obj = null;
				}
				else
				{
					Player owner = photonView.Owner;
					obj = ((owner != null) ? new int?(owner.ActorNumber) : null);
				}
			}
			int? num = obj;
			int valueOrDefault = num.GetValueOrDefault(-1);
			if (valueOrDefault <= 0)
			{
				HasAssignedThisLevel = true;
				return;
			}
			int num2 = Mathf.Max(1, BountyPlugin.MinDollars.Value);
			int num3 = Mathf.Max(num2, BountyPlugin.MaxDollars.Value);
			int num4 = random.Next(num2, num3 + 1);
			float num5 = Mathf.Max(1f, BountyPlugin.DurationSeconds.Value);
			object[] args = new object[4]
			{
				valueOrDefault,
				num4,
				PhotonNetwork.Time,
				num5
			};
			if (PhotonNetwork.IsConnected && PhotonNetwork.InRoom)
			{
				BountyEvt.SendAllCached(1, args);
			}
			else
			{
				ApplyBounty(valueOrDefault, num4, PhotonNetwork.Time, num5);
			}
			HasAssignedThisLevel = true;
		}

		public void ApplyBounty(int actor, int dollars, double startTime, float duration)
		{
			TargetActor = actor;
			BountyDollars = dollars;
			StartTime = startTime;
			Duration = duration;
			EnsureHudBoundForAllPlayers();
		}

		public void OnBountyTargetDied(int actor, bool wasInsideExtraction)
		{
			if (actor <= 0)
			{
				return;
			}
			if (wasInsideExtraction && IsBountyActive() && actor == TargetActor)
			{
				LockReviveForLevel(actor);
				if (!PhotonNetwork.IsConnected || PhotonNetwork.IsMasterClient)
				{
					int num = Mathf.Max(1, Mathf.RoundToInt((float)BountyDollars / 1000f));
					int num2 = SemiFunc.StatGetRunCurrency();
					int num3 = Mathf.Max(0, num2 + num);
					SemiFunc.StatSetRunCurrency(num3);
				}
			}
			PlayerAvatar[] array = Object.FindObjectsOfType<PlayerAvatar>();
			foreach (PlayerAvatar val in array)
			{
				((Component)val).GetComponent<BountyHud>()?.SetActive(on: false);
			}
			TargetActor = -1;
			BountyDollars = 0;
			StartTime = 0.0;
			Duration = 0f;
		}

		internal static bool IsInExtraction(PlayerAvatar p)
		{
			try
			{
				List<RoomVolume> list = (p?.RoomVolumeCheck)?.CurrentRooms;
				if (list == null)
				{
					return false;
				}
				for (int i = 0; i < list.Count; i++)
				{
					RoomVolume val = list[i];
					if ((Object)(object)val != (Object)null && val.Extraction)
					{
						return true;
					}
				}
			}
			catch
			{
			}
			return false;
		}
	}
	public class BountyHud : MonoBehaviour
	{
		private PlayerAvatar _player;

		private WorldSpaceUIPlayerName _nameplate;

		private TextMeshProUGUI _nameplateText;

		private GameObject _root;

		private WorldSpaceUIChild _wui;

		private TextMeshProUGUI _text;

		private bool _shown;

		private const float WorldYOffset = 0.2f;

		private static FieldInfo _fiWorldPos;

		private static FieldInfo _fiNameText;

		public void Bind(PlayerAvatar p)
		{
			_player = p;
			TryFindNameplate();
			TrySetupUI();
			UpdateImmediateText();
		}

		public void SetActive(bool on)
		{
			if (_shown != on)
			{
				_shown = on;
				if ((Object)(object)_root != (Object)null)
				{
					_root.SetActive(on);
				}
			}
		}

		private void TryFindNameplate()
		{
			if ((Object)(object)_player != (Object)null)
			{
				try
				{
					FieldInfo field = typeof(PlayerAvatar).GetField("worldSpaceUIPlayerName", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
					if (field != null)
					{
						ref WorldSpaceUIPlayerName nameplate = ref _nameplate;
						object? value = field.GetValue(_player);
						nameplate = (WorldSpaceUIPlayerName)((value is WorldSpaceUIPlayerName) ? value : null);
					}
				}
				catch
				{
				}
			}
			if ((Object)(object)_nameplate == (Object)null)
			{
				WorldSpaceUIPlayerName[] array = Object.FindObjectsOfType<WorldSpaceUIPlayerName>();
				WorldSpaceUIPlayerName[] array2 = array;
				foreach (WorldSpaceUIPlayerName val in array2)
				{
					try
					{
						if ((Object)(object)val != (Object)null && (Object)(object)val.playerAvatar == (Object)(object)_player)
						{
							_nameplate = val;
							break;
						}
					}
					catch
					{
					}
				}
			}
			if (_fiWorldPos == null)
			{
				_fiWorldPos = typeof(WorldSpaceUIChild).GetField("worldPosition", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			}
			_nameplateText = null;
			if (!((Object)(object)_nameplate != (Object)null))
			{
				return;
			}
			try
			{
				if (_fiNameText == null)
				{
					_fiNameText = typeof(WorldSpaceUIPlayerName).GetField("text", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
				}
				if (_fiNameText != null)
				{
					ref TextMeshProUGUI nameplateText = ref _nameplateText;
					object? value2 = _fiNameText.GetValue(_nameplate);
					nameplateText = (TextMeshProUGUI)((value2 is TextMeshProUGUI) ? value2 : null);
				}
				if ((Object)(object)_nameplateText == (Object)null)
				{
					_nameplateText = ((Component)_nameplate).GetComponentInChildren<TextMeshProUGUI>(true);
				}
			}
			catch
			{
			}
		}

		private void LateUpdate()
		{
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: 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_00b4: Unknown result type (might be due to invalid IL or missing references)
			if (!_shown)
			{
				return;
			}
			if ((Object)(object)_nameplate == (Object)null || _fiWorldPos == null)
			{
				TryFindNameplate();
				if ((Object)(object)_nameplate == (Object)null || _fiWorldPos == null)
				{
					return;
				}
			}
			if ((Object)(object)_wui == (Object)null)
			{
				return;
			}
			Vector3 val = (Vector3)_fiWorldPos.GetValue(_nameplate);
			Vector3 worldPosition = val + new Vector3(0f, 0.2f, 0f);
			_wui.worldPosition = worldPosition;
			BountyManager instance = BountyManager.Instance;
			if ((Object)(object)instance != (Object)null && (Object)(object)_text != (Object)null)
			{
				float secondsRemaining = instance.GetSecondsRemaining();
				TimeSpan timeSpan = TimeSpan.FromSeconds(secondsRemaining);
				string text = $"{timeSpan.Minutes:0}:{timeSpan.Seconds:00}";
				string text2 = $"${instance.BountyDollars:N0}";
				((TMP_Text)_text).text = "<color=#FF5555><b>BOUNTY</b></color>  " + text2 + "  <size=80%><color=#FFFF66>(" + text + ")</color></size>";
				if ((Object)(object)_nameplateText == (Object)null)
				{
					TryFindNameplate();
				}
				if ((Object)(object)_nameplateText != (Object)null)
				{
					((TMP_Text)_text).fontSize = Mathf.Min(18f, ((TMP_Text)_nameplateText).fontSize);
				}
				else
				{
					((TMP_Text)_text).fontSize = 18f;
				}
			}
			if ((Object)(object)BountyManager.Instance != (Object)null && !BountyManager.Instance.IsBountyActive())
			{
				SetActive(on: false);
			}
		}

		private void UpdateImmediateText()
		{
			BountyManager instance = BountyManager.Instance;
			if ((Object)(object)instance != (Object)null && (Object)(object)_text != (Object)null)
			{
				string text = $"${instance.BountyDollars:N0}";
				((TMP_Text)_text).text = "<color=#FF5555><b>BOUNTY</b></color>  " + text + "  <size=80%><color=#FFFF66>(1:00)</color></size>";
			}
		}

		private void TrySetupUI()
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Expected O, but got Unknown
			//IL_0091: 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_00b8: 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)
			//IL_00c8: Expected O, but got Unknown
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: 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_0193: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_root != (Object)null)
			{
				return;
			}
			try
			{
				WorldSpaceUIParent instance = WorldSpaceUIParent.instance;
				if ((Object)(object)instance == (Object)null)
				{
					BountyPlugin.Logger.LogWarning((object)"[Bounty] WorldSpaceUIParent missing; bounty tag hidden.");
					return;
				}
				_root = new GameObject("Empress_BountyHud");
				_root.transform.SetParent(((Component)instance).transform, false);
				_root.transform.SetAsLastSibling();
				RectTransform val = _root.AddComponent<RectTransform>();
				val.sizeDelta = new Vector2(320f, 32f);
				_wui = _root.AddComponent<WorldSpaceUIChild>();
				_wui.positionOffset = Vector3.zero;
				GameObject val2 = new GameObject("Text");
				val2.transform.SetParent(_root.transform, false);
				RectTransform val3 = val2.AddComponent<RectTransform>();
				val3.anchorMin = new Vector2(0f, 0f);
				val3.anchorMax = new Vector2(1f, 1f);
				val3.offsetMin = Vector2.zero;
				val3.offsetMax = Vector2.zero;
				_text = val2.AddComponent<TextMeshProUGUI>();
				((TMP_Text)_text).alignment = (TextAlignmentOptions)514;
				((TMP_Text)_text).enableAutoSizing = false;
				((TMP_Text)_text).fontStyle = (FontStyles)1;
				((Graphic)_text).raycastTarget = false;
				((TMP_Text)_text).outlineColor = Color32.op_Implicit(new Color(0f, 0f, 0f, 0.8f));
				((TMP_Text)_text).outlineWidth = 0.26f;
				((TMP_Text)_text).fontSize = 18f;
				_root.SetActive(false);
				_shown = false;
			}
			catch (Exception ex)
			{
				BountyPlugin.Logger.LogWarning((object)("[Bounty] HUD setup failed: " + ex.Message));
			}
		}
	}
	[HarmonyPatch]
	internal static class BountyPatches
	{
		[HarmonyPostfix]
		[HarmonyPatch(typeof(WorldSpaceUIParent), "PlayerName")]
		private static void WorldSpaceUIParent_PlayerName_Postfix(PlayerAvatar _player)
		{
			try
			{
				if (!((Object)(object)_player == (Object)null))
				{
					BountyHud bountyHud = ((Component)_player).GetComponent<BountyHud>();
					if ((Object)(object)bountyHud == (Object)null)
					{
						bountyHud = ((Component)_player).gameObject.AddComponent<BountyHud>();
						bountyHud.Bind(_player);
					}
					BountyManager instance = BountyManager.Instance;
					if ((Object)(object)instance != (Object)null)
					{
						PhotonView photonView = _player.photonView;
						int num = (((Object)(object)photonView != (Object)null && photonView.Owner != null) ? photonView.Owner.ActorNumber : (-1));
						int num2 = ((PhotonNetwork.LocalPlayer != null) ? PhotonNetwork.LocalPlayer.ActorNumber : (-1));
						bool active = num == instance.TargetActor && instance.IsBountyActive() && num != num2;
						bountyHud.SetActive(active);
					}
				}
			}
			catch (Exception ex)
			{
				BountyPlugin.Logger.LogWarning((object)("[Bounty] Nameplate postfix failed: " + ex.Message));
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(PlayerAvatar), "Revive")]
		private static bool PlayerAvatar_Revive_Prefix(PlayerAvatar __instance)
		{
			try
			{
				BountyManager instance = BountyManager.Instance;
				if ((Object)(object)instance == (Object)null)
				{
					return true;
				}
				PhotonView val = __instance?.photonView;
				int num = (((Object)(object)val != (Object)null && val.Owner != null) ? val.Owner.ActorNumber : (-1));
				if (num > 0 && instance.IsReviveLocked(num))
				{
					return false;
				}
			}
			catch
			{
			}
			return true;
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(PlayerAvatar), "PlayerDeathDone")]
		private static void PlayerAvatar_PlayerDeathDone_Postfix(PlayerAvatar __instance)
		{
			try
			{
				BountyManager instance = BountyManager.Instance;
				if (!((Object)(object)instance == (Object)null))
				{
					PhotonView val = __instance?.photonView;
					int num = (((Object)(object)val != (Object)null && val.Owner != null) ? val.Owner.ActorNumber : (-1));
					if (num > 0 && instance.TargetActor == num)
					{
						bool wasInsideExtraction = BountyManager.IsInExtraction(__instance);
						instance.OnBountyTargetDied(num, wasInsideExtraction);
					}
				}
			}
			catch (Exception ex)
			{
				BountyPlugin.Logger.LogWarning((object)("[Bounty] Death handling failed: " + ex.Message));
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(PlayerDeathHead), "Revive")]
		private static bool PlayerDeathHead_Revive_Prefix(PlayerDeathHead __instance)
		{
			try
			{
				BountyManager instance = BountyManager.Instance;
				if ((Object)(object)instance == (Object)null)
				{
					return true;
				}
				PhotonView val = (__instance?.playerAvatar)?.photonView;
				int num = (((Object)(object)val != (Object)null && val.Owner != null) ? val.Owner.ActorNumber : (-1));
				if (num > 0 && instance.IsReviveLocked(num))
				{
					return false;
				}
			}
			catch
			{
			}
			return true;
		}
	}
}