using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; 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 UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("")] [assembly: AssemblyCompany("Empress")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.9.0.0")] [assembly: AssemblyInformationalVersion("1.9.0")] [assembly: AssemblyProduct("PropHunt")] [assembly: AssemblyTitle("PropHunt")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.9.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.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.PropHunt { internal static class GameAccess { private static readonly FieldInfo GameDirectorPlayerList = AccessTools.Field(typeof(GameDirector), "PlayerList"); private static readonly FieldInfo GameDirectorCurrentState = AccessTools.Field(typeof(GameDirector), "currentState"); private static readonly FieldInfo PlayerAvatarHealth = AccessTools.Field(typeof(PlayerAvatar), "playerHealth"); private static readonly FieldInfo PlayerHealthValue = AccessTools.Field(typeof(PlayerHealth), "health"); private static readonly FieldInfo PlayerAvatarPhysGrabber = AccessTools.Field(typeof(PlayerAvatar), "physGrabber"); private static readonly FieldInfo PlayerAvatarIsCrouching = AccessTools.Field(typeof(PlayerAvatar), "isCrouching"); private static readonly FieldInfo PhysGrabObjectLastPlayerGrabbing = AccessTools.Field(typeof(PhysGrabObject), "lastPlayerGrabbing"); private static readonly FieldInfo PhysGrabberPlayerAvatar = AccessTools.Field(typeof(PhysGrabber), "playerAvatar"); private static readonly FieldInfo ItemGunPhysGrabObject = AccessTools.Field(typeof(ItemGun), "physGrabObject"); private static readonly FieldInfo ItemGunItemBattery = AccessTools.Field(typeof(ItemGun), "itemBattery"); private static readonly FieldInfo ItemGunGunMuzzle = AccessTools.Field(typeof(ItemGun), "gunMuzzle"); private static readonly FieldInfo ItemGunGunRange = AccessTools.Field(typeof(ItemGun), "gunRange"); private static readonly FieldInfo ItemBatteryLife = AccessTools.Field(typeof(ItemBattery), "batteryLife"); private static readonly FieldInfo ItemBatteryLifePrev = AccessTools.Field(typeof(ItemBattery), "batteryLifePrev"); private static readonly FieldInfo ItemBatteryLifeInt = AccessTools.Field(typeof(ItemBattery), "batteryLifeInt"); private static readonly FieldInfo ItemBatteryBars = AccessTools.Field(typeof(ItemBattery), "batteryBars"); private static readonly FieldInfo ItemEquippableOwnerPlayerId = AccessTools.Field(typeof(ItemEquippable), "ownerPlayerId"); private static readonly MethodInfo ItemEquippableGetOwnerPlayerAvatar = AccessTools.Method(typeof(ItemEquippable), "GetOwnerPlayerAvatar", (Type[])null, (Type[])null); private static readonly FieldInfo StatsItemDictionary = AccessTools.Field(typeof(StatsManager), "itemDictionary"); private static readonly FieldInfo ItemPrefab = AccessTools.Field(typeof(Item), "prefab"); private static readonly FieldInfo ItemDisabled = AccessTools.Field(typeof(Item), "disabled"); private static readonly FieldInfo ItemName = AccessTools.Field(typeof(Item), "itemName"); private static readonly MethodInfo InventoryGetFirstFreeSpot = AccessTools.Method(typeof(Inventory), "GetFirstFreeInventorySpotIndex", (Type[])null, (Type[])null); private static readonly MethodInfo ItemEquippableRequestEquip = AccessTools.Method(typeof(ItemEquippable), "RequestEquip", new Type[2] { typeof(int), typeof(int) }, (Type[])null); private static readonly MethodInfo BatteryFullPercentChange = AccessTools.Method(typeof(ItemBattery), "BatteryFullPercentChange", new Type[2] { typeof(int), typeof(bool) }, (Type[])null); private static readonly PropertyInfo PrefabRefPrefab = AccessTools.Property(typeof(PrefabRef), "Prefab"); private static readonly PropertyInfo PrefabRefResourcePath = AccessTools.Property(typeof(PrefabRef), "ResourcePath"); private static readonly FieldInfo ValuableDirectorValuableDebug = AccessTools.Field(typeof(ValuableDirector), "valuableDebug"); private static readonly FieldInfo LevelGeneratorEnemiesSpawnTarget = AccessTools.Field(typeof(LevelGenerator), "EnemiesSpawnTarget"); private static readonly FieldInfo LevelGeneratorEnemiesSpawned = AccessTools.Field(typeof(LevelGenerator), "EnemiesSpawned"); private static readonly FieldInfo LevelGeneratorEnemyReady = AccessTools.Field(typeof(LevelGenerator), "EnemyReady"); private static readonly FieldInfo RunManagerPreviousRunLevel = AccessTools.Field(typeof(RunManager), "previousRunLevel"); private static readonly MethodInfo RunManagerChangeLevel = AccessTools.Method(typeof(RunManager), "ChangeLevel", new Type[3] { typeof(bool), typeof(bool), typeof(ChangeLevelType) }, (Type[])null); private static readonly FieldInfo PlayerControllerRigidbody = AccessTools.Field(typeof(PlayerController), "rb"); private static readonly FieldInfo PlayerAvatarRigidbody = AccessTools.Field(typeof(PlayerAvatar), "rb"); private static readonly FieldInfo PlayerAvatarClientPosition = AccessTools.Field(typeof(PlayerAvatar), "clientPosition"); private static readonly FieldInfo PlayerAvatarClientPositionCurrent = AccessTools.Field(typeof(PlayerAvatar), "clientPositionCurrent"); private static readonly FieldInfo PlayerAvatarRbVelocity = AccessTools.Field(typeof(PlayerAvatar), "rbVelocity"); private static readonly FieldInfo PlayerAvatarRbVelocityRaw = AccessTools.Field(typeof(PlayerAvatar), "rbVelocityRaw"); private static readonly Type ValuableDebugType = AccessTools.Inner(typeof(ValuableDirector), "ValuableDebug"); internal static List PlayerList() { if (!((Object)(object)GameDirector.instance == (Object)null)) { return GameDirectorPlayerList?.GetValue(GameDirector.instance) as List; } return null; } internal static bool IsMainState() { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Invalid comparison between Unknown and I4 if ((Object)(object)GameDirector.instance == (Object)null || GameDirectorCurrentState == null) { return false; } return (int)(gameState)GameDirectorCurrentState.GetValue(GameDirector.instance) == 2; } internal static PlayerHealth Health(PlayerAvatar avatar) { if (!((Object)(object)avatar == (Object)null)) { object? obj = PlayerAvatarHealth?.GetValue(avatar); return (PlayerHealth)((obj is PlayerHealth) ? obj : null); } return null; } internal static int HealthValue(PlayerHealth health) { if ((Object)(object)health == (Object)null || PlayerHealthValue == null) { return 0; } try { return (int)PlayerHealthValue.GetValue(health); } catch { return 0; } } internal static PhysGrabber AvatarGrabber(PlayerAvatar avatar) { if (!((Object)(object)avatar == (Object)null)) { object? obj = PlayerAvatarPhysGrabber?.GetValue(avatar); return (PhysGrabber)((obj is PhysGrabber) ? obj : null); } return null; } internal static bool GetIsCrouching(PlayerAvatar avatar) { if ((Object)(object)avatar == (Object)null || PlayerAvatarIsCrouching == null) { return false; } return (bool)PlayerAvatarIsCrouching.GetValue(avatar); } internal static void SetIsCrouching(PlayerAvatar avatar, bool value) { if ((Object)(object)avatar != (Object)null) { PlayerAvatarIsCrouching?.SetValue(avatar, value); } } internal static PhysGrabObject GunPhysGrabObject(ItemGun gun) { if (!((Object)(object)gun == (Object)null)) { object? obj = ItemGunPhysGrabObject?.GetValue(gun); return (PhysGrabObject)((obj is PhysGrabObject) ? obj : null); } return null; } internal static ItemBattery GunBattery(ItemGun gun) { object obj2; if (!((Object)(object)gun == (Object)null)) { object? obj = ItemGunItemBattery?.GetValue(gun); obj2 = ((obj is ItemBattery) ? obj : null); if (obj2 == null) { if (gun == null) { return null; } return ((Component)gun).GetComponent(); } } else { obj2 = null; } return (ItemBattery)obj2; } internal static Transform GunMuzzle(ItemGun gun) { if (!((Object)(object)gun == (Object)null)) { object? obj = ItemGunGunMuzzle?.GetValue(gun); return (Transform)((obj is Transform) ? obj : null); } return null; } internal static float GunRange(ItemGun gun, float fallback) { if ((Object)(object)gun == (Object)null || ItemGunGunRange == null) { return fallback; } return Mathf.Max(1f, Convert.ToSingle(ItemGunGunRange.GetValue(gun))); } internal static PlayerAvatar GunOwner(ItemGun gun) { if ((Object)(object)gun == (Object)null) { return null; } ItemEquippable component = ((Component)gun).GetComponent(); if ((Object)(object)component != (Object)null) { try { object? obj = ItemEquippableGetOwnerPlayerAvatar?.Invoke(component, null); PlayerAvatar val = (PlayerAvatar)((obj is PlayerAvatar) ? obj : null); if ((Object)(object)val != (Object)null) { return val; } } catch { } try { int num = ((ItemEquippableOwnerPlayerId == null) ? (-1) : ((int)ItemEquippableOwnerPlayerId.GetValue(component))); if (num != -1) { PhotonView val2 = PhotonView.Find(num); PlayerAvatar val3 = (((Object)(object)val2 != (Object)null) ? ((Component)val2).GetComponent() : null); if ((Object)(object)val3 != (Object)null) { return val3; } } } catch { } } PhysGrabObject val4 = GunPhysGrabObject(gun); PhysGrabber val5 = (PhysGrabber)(((Object)(object)val4 == (Object)null) ? null : /*isinst with value type is only supported in some contexts*/); if (!((Object)(object)val5 == (Object)null)) { object? obj4 = PhysGrabberPlayerAvatar?.GetValue(val5); return (PlayerAvatar)((obj4 is PlayerAvatar) ? obj4 : null); } return null; } internal static void RefillBattery(ItemGun gun) { ItemBattery val = GunBattery(gun); if ((Object)(object)val == (Object)null) { return; } int num = 6; if (ItemBatteryBars != null) { try { num = Mathf.Max(1, (int)ItemBatteryBars.GetValue(val)); } catch { } } ItemBatteryLife?.SetValue(val, 100f); ItemBatteryLifePrev?.SetValue(val, 100f); ItemBatteryLifeInt?.SetValue(val, num); try { BatteryFullPercentChange?.Invoke(val, new object[2] { num, false }); } catch { } } internal static bool IsItemDisabled(Item item) { if ((Object)(object)item == (Object)null || ItemDisabled == null) { return true; } return (bool)ItemDisabled.GetValue(item); } internal static string ItemDisplayName(Item item) { if ((Object)(object)item == (Object)null) { return ""; } return (ItemName?.GetValue(item) as string) ?? ((Object)item).name ?? ""; } internal static Dictionary ItemDictionary() { if (!((Object)(object)StatsManager.instance == (Object)null)) { return StatsItemDictionary?.GetValue(StatsManager.instance) as Dictionary; } return null; } internal static PrefabRef ItemPrefabRef(Item item) { if (!((Object)(object)item == (Object)null)) { object? obj = ItemPrefab?.GetValue(item); return (PrefabRef)((obj is PrefabRef) ? obj : null); } return null; } internal static GameObject LoadPrefab(PrefabRef prefabRef) { if (prefabRef == null || PrefabRefPrefab == null) { return null; } try { object? value = PrefabRefPrefab.GetValue(prefabRef, null); return (GameObject)((value is GameObject) ? value : null); } catch { return null; } } internal static string ResourcePath(PrefabRef prefabRef) { if (prefabRef == null || PrefabRefResourcePath == null) { return ""; } try { return (PrefabRefResourcePath.GetValue(prefabRef, null) as string) ?? ""; } catch { return ""; } } internal static int FirstFreeInventorySpot() { if ((Object)(object)Inventory.instance == (Object)null || InventoryGetFirstFreeSpot == null) { return -1; } try { return (int)InventoryGetFirstFreeSpot.Invoke(Inventory.instance, null); } catch { return -1; } } internal static void RequestEquip(ItemEquippable equippable, int spot, int physGrabberViewId) { if ((Object)(object)equippable == (Object)null || ItemEquippableRequestEquip == null) { return; } try { ItemEquippableRequestEquip.Invoke(equippable, new object[2] { spot, physGrabberViewId }); } catch { } } internal static void SetValuableDebugAll(ValuableDirector director) { if ((Object)(object)director == (Object)null || ValuableDirectorValuableDebug == null || ValuableDebugType == null) { return; } try { ValuableDirectorValuableDebug.SetValue(director, Enum.ToObject(ValuableDebugType, 1)); } catch { } } internal static void SetEnemyGenerationSkipped(LevelGenerator levelGenerator) { if ((Object)(object)levelGenerator == (Object)null) { return; } try { LevelGeneratorEnemiesSpawnTarget?.SetValue(levelGenerator, 0); } catch { } try { LevelGeneratorEnemiesSpawned?.SetValue(levelGenerator, 0); } catch { } try { LevelGeneratorEnemyReady?.SetValue(levelGenerator, true); } catch { } } internal static void ChangeToRandomRunLevel() { RunManager instance = RunManager.instance; if ((Object)(object)instance == (Object)null) { return; } try { RunManagerPreviousRunLevel?.SetValue(instance, instance.levelCurrent); } catch { } try { RunManagerChangeLevel?.Invoke(instance, new object[3] { false, false, (object)(ChangeLevelType)1 }); } catch { try { instance.ChangeLevel(false, false, (ChangeLevelType)1); } catch { } } } internal static void FreezeLocalPlayerPosition(PlayerAvatar avatar, Vector3 avatarPosition, Vector3 controllerPosition) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_007d: 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_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: 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) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) PlayerController instance = PlayerController.instance; if ((Object)(object)instance != (Object)null) { ((Component)instance).transform.position = controllerPosition; object? obj = PlayerControllerRigidbody?.GetValue(instance); Rigidbody val = (Rigidbody)((obj is Rigidbody) ? obj : null); if ((Object)(object)val != (Object)null) { val.position = controllerPosition; val.velocity = Vector3.zero; val.angularVelocity = Vector3.zero; } } if ((Object)(object)avatar != (Object)null) { ((Component)avatar).transform.position = avatarPosition; PlayerAvatarClientPosition?.SetValue(avatar, avatarPosition); PlayerAvatarClientPositionCurrent?.SetValue(avatar, avatarPosition); PlayerAvatarRbVelocity?.SetValue(avatar, Vector3.zero); PlayerAvatarRbVelocityRaw?.SetValue(avatar, Vector3.zero); object? obj2 = PlayerAvatarRigidbody?.GetValue(avatar); Rigidbody val2 = (Rigidbody)((obj2 is Rigidbody) ? obj2 : null); if ((Object)(object)val2 != (Object)null) { val2.position = avatarPosition; val2.velocity = Vector3.zero; val2.angularVelocity = Vector3.zero; } } } } [HarmonyPatch(typeof(WorldSpaceUIPlayerName), "Update")] internal static class EmpressPropHuntHidePlayerNamesPatch { private static bool Prefix(WorldSpaceUIPlayerName __instance) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance != (Object)null && (Object)(object)__instance.text != (Object)null) { Color color = ((Graphic)__instance.text).color; ((Graphic)__instance.text).color = new Color(color.r, color.g, color.b, 0f); } return false; } } [HarmonyPatch(typeof(ItemGun), "Shoot")] internal static class EmpressPropHuntItemGunShootPatch { private static void Prefix(ItemGun __instance) { if (IsHunterGun(__instance)) { GameAccess.RefillBattery(__instance); } } private static void Postfix(ItemGun __instance) { if (IsHunterGun(__instance)) { GameAccess.RefillBattery(__instance); } } internal static bool IsHunterGun(ItemGun gun) { PropHuntManager instance = PropHuntManager.Instance; if ((Object)(object)instance == (Object)null || (Object)(object)gun == (Object)null) { return false; } PlayerAvatar avatar = GameAccess.GunOwner(gun); return instance.IsActorHunter(instance.ActorNumber(avatar)); } } [HarmonyPatch(typeof(ItemGun), "ShootRPC")] internal static class EmpressPropHuntItemGunShootRpcPatch { private static void Postfix(ItemGun __instance) { PropHuntManager instance = PropHuntManager.Instance; if (!((Object)(object)instance == (Object)null) && !((Object)(object)__instance == (Object)null)) { if (EmpressPropHuntItemGunShootPatch.IsHunterGun(__instance)) { GameAccess.RefillBattery(__instance); } if (instance.TryApplyHunterShotCost(__instance)) { instance.TryResolveHunterGunHit(__instance); } } } } [HarmonyPatch(typeof(ItemBattery), "RemoveFullBar")] internal static class EmpressPropHuntBatteryRemoveFullBarPatch { private static bool Prefix(ItemBattery __instance) { ItemGun gun = (((Object)(object)__instance != (Object)null) ? ((Component)__instance).GetComponent() : null); if (!EmpressPropHuntItemGunShootPatch.IsHunterGun(gun)) { return true; } GameAccess.RefillBattery(gun); return false; } } public sealed class HunterWeaponController : MonoBehaviour { public PropHuntManager Manager; private float _nextTick; public void Tick(PlayerAvatar avatar) { if (!((Object)(object)Manager == (Object)null) && !((Object)(object)avatar == (Object)null) && PhotonNetwork.InRoom && Manager.IsMainState && !(Time.time < _nextTick)) { _nextTick = Time.time + 0.75f; Manager.EnsureHunterWeaponForLocalHunter(avatar); } } } public class PropHuntManager : MonoBehaviourPunCallbacks, IOnEventCallback { private int _hunterWeaponViewId = -1; private float _nextHunterWeaponSpawnAttempt; private float _nextHunterWeaponRequest; private float _nextHunterWeaponEquip; private Item _cachedGunItem; private const string ROOM_KEY_ACTIVE = "PH_Active"; private const string ROOM_KEY_HUNTER = "PH_Hunter"; private const string PLAYER_KEY_PROP = "PH_PropVID"; private const string PLAYER_KEY_LOCKED = "PH_Locked"; private const byte EVT_KILL = 101; private const byte EVT_PLAYERDOWN = 102; private const byte EVT_MATCHEND = 103; private const byte EVT_HUNTER_GUN_REQUEST = 105; private const byte EVT_HUNTER_GUN_SYNC = 106; private const string EVT_TAG = "PH1"; public KeyCode KeyHiderToggle = (KeyCode)118; public KeyCode KeyDisguiseViewToggle = (KeyCode)99; public KeyCode KeyPositionLock = (KeyCode)120; public float HunterLockSeconds = 30f; public float PreHideSeconds = 30f; public float RoundSeconds = 300f; public float GunRangeMeters = 60f; private double _roundEndRealtime; private bool _roundArmed; private bool _hudShown; private PHRole _localRole; private int _hunterActor = -1; private HunterWeaponController _gun; private readonly HashSet _deadActors = new HashSet(); private bool _ending; private float _endUntil; private string _endMsg = ""; private PHWinner _whoWon; private float _hunterLockUntil; internal const float TINY_FACTOR = 0.0001f; private int _cachedPropPhotonViewId; private float _preHideUntil; private bool _preHideArmed; private bool _positionLocked; private Vector3 _positionLockAvatar; private Vector3 _positionLockController; private string _flashMsg = ""; private float _flashMsgUntil; public static PropHuntManager Instance { get; private set; } public bool IsHunterLocked { get { if (_localRole == PHRole.Hunter) { return Time.time < _hunterLockUntil; } return false; } } private bool PreHideActive { get { if (_preHideArmed) { return Time.time < _preHideUntil; } return false; } } public bool IsMainState => GameAccess.IsMainState(); public bool PreHidePhaseActive => PreHideActive; public bool RoundIsLive { get { if (_roundArmed) { return (double)Time.time < _roundEndRealtime; } return false; } } internal bool IsActorHunter(int actorNumber) { if (actorNumber > 0) { return actorNumber == _hunterActor; } return false; } internal bool IsActorDisguised(int actorNumber) { if (actorNumber <= 0 || _deadActors.Contains(actorNumber)) { return false; } Room currentRoom = PhotonNetwork.CurrentRoom; Player val = ((currentRoom != null) ? currentRoom.GetPlayer(actorNumber, false) : null); if (val == null || !((Dictionary)(object)val.CustomProperties).ContainsKey((object)"PH_PropVID")) { return false; } if (TryToInt(val.CustomProperties[(object)"PH_PropVID"], out var val2)) { return val2 > 0; } return false; } internal int ActorNumber(PlayerAvatar avatar) { int? obj; if (avatar == null) { obj = null; } else { PhotonView photonView = avatar.photonView; if (photonView == null) { obj = null; } else { Player owner = photonView.Owner; obj = ((owner != null) ? new int?(owner.ActorNumber) : null); } } int? num = obj; return num.GetValueOrDefault(-1); } internal void EnsureHunterWeaponForLocalHunter(PlayerAvatar avatar) { //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Expected O, but got Unknown if (_localRole != PHRole.Hunter || (Object)(object)avatar == (Object)null || (!PreHidePhaseActive && !RoundIsLive)) { return; } if (TryFindOwnedHunterGun(avatar, out var gun)) { GameAccess.RefillBattery(gun); return; } TryEquipSyncedHunterWeapon(avatar); if (TryFindOwnedHunterGun(avatar, out gun)) { GameAccess.RefillBattery(gun); } else if (PhotonNetwork.IsMasterClient) { TrySpawnHunterWeapon(avatar); } else if (Time.time >= _nextHunterWeaponRequest) { _nextHunterWeaponRequest = Time.time + 2f; object[] array = new object[2] { "PH1", PhotonNetwork.LocalPlayer.ActorNumber }; PhotonNetwork.RaiseEvent((byte)105, (object)array, new RaiseEventOptions { Receivers = (ReceiverGroup)2 }, SendOptions.SendReliable); } } internal bool HandleHunterWeaponEvent(EventData e) { if (e.Code != 105 && e.Code != 106) { return false; } if (!(e.CustomData is object[] array) || array.Length < 2) { return true; } if (!(array[0] is string text) || text != "PH1") { return true; } if (e.Code == 105) { if (!PhotonNetwork.IsMasterClient) { return true; } if (!TryToInt(array[1], out var val) || val != _hunterActor) { return true; } PlayerAvatar val2 = FindAvatarByActor(val); if ((Object)(object)val2 != (Object)null) { TrySpawnHunterWeapon(val2); } return true; } if (TryToInt(array[1], out var val3)) { _hunterWeaponViewId = val3; } return true; } internal bool TryResolveHunterGunHit(ItemGun gun) { //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)gun == (Object)null || !PhotonNetwork.InRoom) { return false; } if (!RoundIsLive || IsHunterLocked) { return false; } if (!PhotonNetwork.IsMasterClient) { return false; } PlayerAvatar avatar = GameAccess.GunOwner(gun); int num = ActorNumber(avatar); if (!IsActorHunter(num)) { return false; } Transform val = GameAccess.GunMuzzle(gun); Transform val2 = (((Object)(object)val != (Object)null) ? val : ((Component)gun).transform); Ray ray = default(Ray); ((Ray)(ref ray))..ctor(val2.position, val2.forward); float num2 = Mathf.Max(GunRangeMeters, GameAccess.GunRange(gun, GunRangeMeters)); int num3 = -1; float maxDistance = num2; List list = GameAccess.PlayerList(); if (list == null) { return false; } foreach (PlayerAvatar item in list) { int num4 = ActorNumber(item); if (num4 > 0 && num4 != num && IsActorDisguised(num4)) { PropDisguiseController component = ((Component)item).GetComponent(); if (!((Object)(object)component == (Object)null) && component.TryRaycastDisguise(ray, maxDistance, out var distance) && !ShotBlocked(ray, distance, item)) { maxDistance = distance; num3 = num4; } } } if (num3 <= 0) { return false; } RequestEliminateFromActor(num, num3); return true; } internal bool TryApplyHunterShotCost(ItemGun gun) { //IL_0069: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)gun == (Object)null || !PhotonNetwork.InRoom) { return false; } if (!RoundIsLive || IsHunterLocked) { return false; } if (!PhotonNetwork.IsMasterClient) { return false; } PlayerAvatar val = GameAccess.GunOwner(gun); int actorNumber = ActorNumber(val); if (!IsActorHunter(actorNumber)) { return false; } PlayerHealth val2 = GameAccess.Health(val); if ((Object)(object)val2 == (Object)null) { return false; } try { int num = GameAccess.HealthValue(val2); val2.HurtOther(5, ((Component)val).transform.position, false, -1, false); return num > 5; } catch { return false; } } private void RequestEliminateFromActor(int shooterActor, int targetActor) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown object[] array = new object[3] { "PH1", shooterActor, targetActor }; PhotonNetwork.RaiseEvent((byte)101, (object)array, new RaiseEventOptions { Receivers = (ReceiverGroup)1 }, SendOptions.SendReliable); } private bool ShotBlocked(Ray ray, float targetDistance, PlayerAvatar targetAvatar) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) try { int num = LayerMask.op_Implicit(SemiFunc.LayerMaskGetVisionObstruct()); RaycastHit val = default(RaycastHit); if (!Physics.Raycast(ray, ref val, Mathf.Max(0.01f, targetDistance - 0.04f), num, (QueryTriggerInteraction)1)) { return false; } PlayerAvatar val2 = (((Object)(object)((RaycastHit)(ref val)).collider != (Object)null) ? ((Component)((RaycastHit)(ref val)).collider).GetComponentInParent() : null); return (Object)(object)val2 == (Object)null || (Object)(object)val2 != (Object)(object)targetAvatar; } catch { return false; } } private bool TryFindOwnedHunterGun(PlayerAvatar avatar, out ItemGun gun) { gun = null; ItemGun[] array = Object.FindObjectsOfType(); foreach (ItemGun val in array) { if (!((Object)(object)val == (Object)null) && !((Object)(object)GameAccess.GunOwner(val) != (Object)(object)avatar)) { gun = val; return true; } } return false; } private void TryEquipSyncedHunterWeapon(PlayerAvatar avatar) { if (Time.time < _nextHunterWeaponEquip || _hunterWeaponViewId <= 0) { return; } _nextHunterWeaponEquip = Time.time + 1f; PhotonView val = PhotonView.Find(_hunterWeaponViewId); if ((Object)(object)val == (Object)null) { return; } ItemGun component = ((Component)val).GetComponent(); if ((Object)(object)component == (Object)null) { return; } GameAccess.RefillBattery(component); PhysGrabObject val2 = GameAccess.GunPhysGrabObject(component); PhysGrabber val3 = GameAccess.AvatarGrabber(avatar) ?? PhysGrabber.instance; if ((Object)(object)val2 != (Object)null && (Object)(object)val3 != (Object)null) { try { val3.OverrideGrab(val2, 0.2f, false); val3.OverrideGrabDistance(0.8f); } catch { } } ItemEquippable component2 = ((Component)component).GetComponent(); if (!((Object)(object)component2 == (Object)null) && !((Object)(object)val3 == (Object)null) && !((Object)(object)val3.photonView == (Object)null)) { int num = GameAccess.FirstFreeInventorySpot(); if (num >= 0) { GameAccess.RequestEquip(component2, num, val3.photonView.ViewID); } } } private bool TrySpawnHunterWeapon(PlayerAvatar avatar) { //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: 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_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_009f: 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_00a9: 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_014b: 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_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Expected O, but got Unknown if ((Object)(object)avatar == (Object)null || Time.time < _nextHunterWeaponSpawnAttempt) { return false; } _nextHunterWeaponSpawnAttempt = Time.time + 1.5f; if (_hunterWeaponViewId > 0 && (Object)(object)PhotonView.Find(_hunterWeaponViewId) != (Object)null) { return true; } if (!TryFindHunterGunItem(out var _, out var resourcePath)) { return false; } Vector3 val = ((Component)avatar).transform.position + ((Component)avatar).transform.forward * 0.75f + Vector3.up * 1.05f; Quaternion val2 = Quaternion.LookRotation(((Component)avatar).transform.forward, Vector3.up); GameObject val3 = null; try { val3 = PhotonNetwork.InstantiateRoomObject(resourcePath, val, val2, (byte)0, (object[])null); } catch (Exception ex) { LogGate.WarnThrottled(PropHuntPlugin.Log, "[Empress Prop Hunt] Hunter handgun spawn failed: " + ex.Message); return false; } PhotonView val4 = (((Object)(object)val3 != (Object)null) ? val3.GetComponent() : null); if ((Object)(object)val4 == (Object)null) { return false; } _hunterWeaponViewId = val4.ViewID; ItemGun component = val3.GetComponent(); if ((Object)(object)component != (Object)null) { GameAccess.RefillBattery(component); } object[] array = new object[2] { "PH1", _hunterWeaponViewId }; PhotonNetwork.RaiseEvent((byte)106, (object)array, new RaiseEventOptions { Receivers = (ReceiverGroup)1 }, SendOptions.SendReliable); PropHuntPlugin.Log.LogInfo((object)"[Empress Prop Hunt] Hunter handgun spawned."); return true; } private bool TryFindHunterGunItem(out Item item, out string resourcePath) { item = null; resourcePath = ""; if ((Object)(object)_cachedGunItem != (Object)null) { PrefabRef prefabRef = GameAccess.ItemPrefabRef(_cachedGunItem); resourcePath = GameAccess.ResourcePath(prefabRef); item = _cachedGunItem; if (!string.IsNullOrEmpty(resourcePath)) { return true; } } Dictionary dictionary = GameAccess.ItemDictionary(); if (dictionary == null || dictionary.Count == 0) { return false; } int num = int.MinValue; foreach (KeyValuePair item2 in dictionary) { Item value = item2.Value; if ((Object)(object)value == (Object)null || GameAccess.IsItemDisabled(value)) { continue; } PrefabRef prefabRef2 = GameAccess.ItemPrefabRef(value); GameObject val = GameAccess.LoadPrefab(prefabRef2); if ((Object)(object)val == (Object)null || (Object)(object)val.GetComponentInChildren(true) == (Object)null) { continue; } string text = (item2.Key + " " + GameAccess.ItemDisplayName(value) + " " + ((Object)val).name).ToLowerInvariant(); int num2 = 0; if (text.Contains("handgun")) { num2 += 200; } if (text.Contains("pistol")) { num2 += 180; } if (text.Contains("gun")) { num2 += 120; } if (text.Contains("weapon")) { num2 += 30; } if (text.Contains("laser") || text.Contains("orb") || text.Contains("staff")) { num2 -= 100; } if (num2 > num) { string text2 = GameAccess.ResourcePath(prefabRef2); if (!string.IsNullOrEmpty(text2)) { num = num2; item = value; resourcePath = text2; } } } if ((Object)(object)item == (Object)null) { return false; } _cachedGunItem = item; return true; } private void Awake() { Instance = this; ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); } private void OnEnable() { PhotonNetwork.AddCallbackTarget((object)this); SceneManager.sceneLoaded += OnSceneLoaded_ResetOrDie; } private void OnDisable() { PhotonNetwork.RemoveCallbackTarget((object)this); SceneManager.sceneLoaded -= OnSceneLoaded_ResetOrDie; } private void OnSceneLoaded_ResetOrDie(Scene scene, LoadSceneMode mode) { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: 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_006f: Expected O, but got Unknown //IL_0076: Expected O, but got Unknown bool flag = !SemiFunc.MenuLevel() && (Object)(object)LevelGenerator.Instance != (Object)null && (Object)(object)GameDirector.instance != (Object)null; HardResetUI(!flag); if (!flag) { DeactivateManager("scene changed to menu/lobby"); return; } try { Player localPlayer = PhotonNetwork.LocalPlayer; if (localPlayer != null) { Hashtable val = new Hashtable(); ((Dictionary)val).Add((object)"PH_PropVID", (object)0); ((Dictionary)val).Add((object)"PH_Locked", (object)0); localPlayer.SetCustomProperties(val, (Hashtable)null, (WebFlags)null); } } catch { } Room currentRoom = PhotonNetwork.CurrentRoom; ApplyRoomState((currentRoom != null) ? ((RoomInfo)currentRoom).CustomProperties : null); try { EnsureControllersOnAllAvatars(); SyncAllPlayerDisguises(); } catch { } if (!_preHideArmed) { ((MonoBehaviour)this).StartCoroutine(ArmPreHideWhenGameplayReady()); } } private void Start() { //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Expected O, but got Unknown //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown //IL_00aa: Expected O, but got Unknown if (PhotonNetwork.IsMasterClient && !((Dictionary)(object)((RoomInfo)PhotonNetwork.CurrentRoom).CustomProperties).ContainsKey((object)"PH_Active")) { List list = PhotonNetwork.PlayerList.Where((Player p) => !p.IsInactive).ToList(); if (list.Count > 0) { Player val = list[new Random().Next(list.Count)]; Room currentRoom = PhotonNetwork.CurrentRoom; Hashtable val2 = new Hashtable(); ((Dictionary)val2).Add((object)"PH_Active", (object)1); ((Dictionary)val2).Add((object)"PH_Hunter", (object)val.ActorNumber); currentRoom.SetCustomProperties(val2, (Hashtable)null, (WebFlags)null); PropHuntPlugin.Log.LogInfo((object)$"[Empress Prop Hunt] Master picked Hunter actor {val.ActorNumber}."); } } Room currentRoom2 = PhotonNetwork.CurrentRoom; ApplyRoomState((currentRoom2 != null) ? ((RoomInfo)currentRoom2).CustomProperties : null); EnsureControllersOnAllAvatars(); SyncAllPlayerDisguises(); if (!_preHideArmed) { ((MonoBehaviour)this).StartCoroutine(ArmPreHideWhenGameplayReady()); } } private IEnumerator ArmPreHideWhenGameplayReady() { while (!GameAccess.IsMainState()) { yield return null; } while (GameAccess.PlayerList() == null || GameAccess.PlayerList().Count == 0) { yield return null; } yield return (object)new WaitForSeconds(0.25f); _preHideArmed = true; _preHideUntil = Time.time + Mathf.Max(1f, PreHideSeconds); if (_localRole == PHRole.Hunter) { _hunterLockUntil = Time.time + Mathf.Max(1f, HunterLockSeconds); Flash($"Hunter locked for {Mathf.CeilToInt(HunterLockSeconds)}s."); } if (PhotonNetwork.IsMasterClient) { ((MonoBehaviour)this).StartCoroutine(HostHealPassesDuringAndAfterPrehide()); } } private IEnumerator HostHealPassesDuringAndAfterPrehide() { HostTopOffAll(); yield return (object)new WaitForSeconds(Mathf.Max(0.25f, PreHideSeconds * 0.5f)); HostTopOffAll(); while (PreHideActive) { yield return null; } HostTopOffAll(); yield return (object)new WaitForSeconds(0.75f); HostTopOffAll(); } private void HostTopOffAll() { try { List list = GameAccess.PlayerList(); if (list == null || list.Count == 0) { return; } foreach (PlayerAvatar item in list) { PlayerHealth val = GameAccess.Health(item); if ((Object)(object)item == (Object)null || (Object)(object)val == (Object)null) { continue; } try { val.HealOther(val.maxHealth, true); } catch (Exception ex) { ManualLogSource log = PropHuntPlugin.Log; int? obj; if (item == null) { obj = null; } else { PhotonView photonView = item.photonView; if (photonView == null) { obj = null; } else { Player owner = photonView.Owner; obj = ((owner != null) ? new int?(owner.ActorNumber) : null); } } int? num = obj; LogGate.WarnThrottled(log, $"[Empress Prop Hunt] Heal failed for actor {num.GetValueOrDefault(-1)}: {ex.Message}"); } } } catch (Exception ex2) { LogGate.WarnThrottled(PropHuntPlugin.Log, "[Empress Prop Hunt] HostTopOffAll guarded: " + ex2.Message); } } private IEnumerator HostHealPlayerWhenReady(int actorNumber) { if (!PhotonNetwork.IsMasterClient) { yield break; } float t = 4f; while (t > 0f) { PlayerAvatar val = FindAvatarByActor(actorNumber); PlayerHealth health = GameAccess.Health(val); if ((Object)(object)val != (Object)null && (Object)(object)health != (Object)null) { try { health.HealOther(health.maxHealth, true); } catch { } yield return (object)new WaitForSeconds(0.5f); try { health.HealOther(health.maxHealth, true); break; } catch { break; } } t -= Time.deltaTime; yield return null; } } private void HardResetUI(bool clearRole) { //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: 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_0093: Unknown result type (might be due to invalid IL or missing references) _ending = false; _endMsg = ""; _whoWon = PHWinner.None; _hudShown = false; _flashMsg = ""; _flashMsgUntil = 0f; _roundArmed = false; _roundEndRealtime = 0.0; _deadActors.Clear(); _gun = null; _hunterLockUntil = 0f; _preHideArmed = false; _preHideUntil = 0f; _positionLocked = false; _positionLockAvatar = Vector3.zero; _positionLockController = Vector3.zero; if (clearRole) { _localRole = PHRole.None; } _cachedPropPhotonViewId = 0; } private void DeactivateManager(string why) { try { if ((Object)(object)Instance == (Object)(object)this) { Instance = null; } ((Behaviour)this).enabled = false; PropHuntPlugin.Log.LogInfo((object)("[Empress Prop Hunt] Manager stopped (" + why + ").")); } catch { } } public override void OnLeftRoom() { HardResetUI(clearRole: true); DeactivateManager("left room"); } public override void OnDisconnected(DisconnectCause cause) { HardResetUI(clearRole: true); DeactivateManager("disconnected"); } public override void OnJoinedRoom() { Room currentRoom = PhotonNetwork.CurrentRoom; ApplyRoomState((currentRoom != null) ? ((RoomInfo)currentRoom).CustomProperties : null); EnsureControllersOnAllAvatars(); SyncAllPlayerDisguises(); if (!_preHideArmed) { ((MonoBehaviour)this).StartCoroutine(ArmPreHideWhenGameplayReady()); } } public override void OnPlayerEnteredRoom(Player newPlayer) { ((MonoBehaviour)this).StartCoroutine(ApplyDisguiseForPlayerWhenReady(newPlayer)); ((MonoBehaviour)this).StartCoroutine(HostHealPlayerWhenReady(newPlayer.ActorNumber)); } private IEnumerator ApplyDisguiseForPlayerWhenReady(Player p) { float t = 3f; while (t > 0f) { PlayerAvatar val = FindAvatarByActor(p.ActorNumber); if ((Object)(object)val != (Object)null) { ApplyOnePlayerDisguise(p, val); break; } t -= Time.deltaTime; yield return null; } } private void Update() { //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) if (SemiFunc.MenuLevel() || (Object)(object)LevelGenerator.Instance == (Object)null || (Object)(object)GameDirector.instance == (Object)null || !PhotonNetwork.InRoom || _localRole == PHRole.None) { return; } RefreshConfigValues(); if (_ending) { TryLockControls(); if (PhotonNetwork.IsMasterClient && Time.time >= _endUntil) { _ending = false; SafeAdvanceScene(); } return; } PlayerAvatar val = FindLocalAvatar(); if ((Object)(object)val == (Object)null) { return; } if (!_hudShown) { ((MonoBehaviour)this).StartCoroutine(HUDBurst()); _hudShown = true; } if (!_roundArmed && _preHideArmed && !PreHideActive) { _roundArmed = true; _roundEndRealtime = Time.time + Mathf.Max(5f, RoundSeconds); } if (PhotonNetwork.IsMasterClient && _roundArmed && (double)Time.time >= _roundEndRealtime) { _roundArmed = false; BroadcastMatchEnd(PHWinner.Hiders, "Time expired"); } if (_localRole == PHRole.Hider) { PropDisguiseController component = ((Component)val).GetComponent(); if ((Object)(object)component == (Object)null || !component.IsDisguised) { UpdateCachedTargetFromPhysGrab(); } if (Input.GetKeyDown(KeyHiderToggle)) { ToggleDisguise(val); } if (Input.GetKeyDown(KeyPositionLock)) { TogglePositionLock(val); } if (Input.GetKeyDown(KeyDisguiseViewToggle) && (Object)(object)component != (Object)null && component.IsDisguised) { bool flag = component.ToggleDisguiseView(); Flash(flag ? "View: third-person" : "View: first-person"); } TickPositionLock(val); } else { if (_localRole != PHRole.Hunter) { return; } if ((Object)(object)_gun == (Object)null) { _gun = ((Component)val).gameObject.GetComponent() ?? ((Component)val).gameObject.AddComponent(); } _gun.Manager = this; _gun.Tick(val); if (!IsHunterLocked) { return; } try { PlayerController instance = PlayerController.instance; if ((Object)(object)instance != (Object)null) { instance.OverrideSpeed(0f, 0.2f); } } catch { } } } private void RefreshConfigValues() { //IL_000d: 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_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) if (PropHuntPlugin.CfgKeyDisguiseToggle != null) { KeyHiderToggle = PropHuntPlugin.CfgKeyDisguiseToggle.Value; } if (PropHuntPlugin.CfgKeyViewToggle != null) { KeyDisguiseViewToggle = PropHuntPlugin.CfgKeyViewToggle.Value; } if (PropHuntPlugin.CfgKeyPositionLock != null) { KeyPositionLock = PropHuntPlugin.CfgKeyPositionLock.Value; } if (PropHuntPlugin.CfgGunRangeMeters != null) { GunRangeMeters = Mathf.Max(1f, PropHuntPlugin.CfgGunRangeMeters.Value); } } private void TogglePositionLock(PlayerAvatar me) { //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) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) if (_positionLocked) { _positionLocked = false; SetLocalVisualLock(me, locked: false); SetLocalLockProperty(locked: false); Flash("Position unlocked."); return; } PropDisguiseController propDisguiseController = (((Object)(object)me != (Object)null) ? ((Component)me).GetComponent() : null); if ((Object)(object)propDisguiseController == (Object)null || !propDisguiseController.IsDisguised) { Flash("Disguise first."); return; } _positionLocked = true; _positionLockAvatar = ((Component)me).transform.position; _positionLockController = (((Object)(object)PlayerController.instance != (Object)null) ? ((Component)PlayerController.instance).transform.position : _positionLockAvatar); propDisguiseController.SetVisualPoseLocked(locked: true); SetLocalLockProperty(locked: true); Flash("Position locked."); } private void TickPositionLock(PlayerAvatar me) { //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) if (!_positionLocked) { return; } PropDisguiseController propDisguiseController = (((Object)(object)me != (Object)null) ? ((Component)me).GetComponent() : null); if ((Object)(object)me == (Object)null || (Object)(object)propDisguiseController == (Object)null || !propDisguiseController.IsDisguised || _localRole != PHRole.Hider) { _positionLocked = false; SetLocalVisualLock(me, locked: false); SetLocalLockProperty(locked: false); return; } try { PlayerController instance = PlayerController.instance; if ((Object)(object)instance != (Object)null) { instance.OverrideSpeed(0f, 0.25f); } GameAccess.FreezeLocalPlayerPosition(me, _positionLockAvatar, _positionLockController); } catch { } } private void SetLocalVisualLock(PlayerAvatar me, bool locked) { try { PropDisguiseController propDisguiseController = (((Object)(object)me != (Object)null) ? ((Component)me).GetComponent() : null); if ((Object)(object)propDisguiseController != (Object)null) { propDisguiseController.SetVisualPoseLocked(locked); } } catch { } } private void SetLocalLockProperty(bool locked) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_002b: Expected O, but got Unknown try { Player localPlayer = PhotonNetwork.LocalPlayer; if (localPlayer != null) { Hashtable val = new Hashtable(); ((Dictionary)val).Add((object)"PH_Locked", (object)(locked ? 1 : 0)); localPlayer.SetCustomProperties(val, (Hashtable)null, (WebFlags)null); } } catch { } } private void BroadcastMatchEnd(PHWinner winner, string reason) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown object[] array = new object[3] { "PH1", (int)winner, reason ?? "" }; PhotonNetwork.RaiseEvent((byte)103, (object)array, new RaiseEventOptions { Receivers = (ReceiverGroup)1 }, SendOptions.SendReliable); StartEndBannerLocal(winner, reason); } private void StartEndBannerLocal(PHWinner winner, string reason) { _whoWon = winner; _endMsg = winner switch { PHWinner.Hiders => "HIDERS WIN!", PHWinner.Hunter => "HUNTER WINS!", _ => "DRAW", }; if (!string.IsNullOrEmpty(reason)) { _endMsg = _endMsg + " (" + reason + ")"; } _ending = true; _endUntil = Time.time + 10f; TryLockControls(); } private void RepickHunterForNextRound() { //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Expected O, but got Unknown //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Expected O, but got Unknown //IL_00c4: Expected O, but got Unknown if (!PhotonNetwork.IsMasterClient || !PhotonNetwork.InRoom) { return; } List list = PhotonNetwork.PlayerList.Where((Player p) => !p.IsInactive).ToList(); if (list.Count != 0) { List list2 = ((list.Count > 1) ? list.Where((Player p) => p.ActorNumber != _hunterActor).ToList() : list); if (list2.Count == 0) { list2 = list; } int actorNumber = list2[new Random().Next(list2.Count)].ActorNumber; Room currentRoom = PhotonNetwork.CurrentRoom; Hashtable val = new Hashtable(); ((Dictionary)val).Add((object)"PH_Active", (object)1); ((Dictionary)val).Add((object)"PH_Hunter", (object)actorNumber); currentRoom.SetCustomProperties(val, (Hashtable)null, (WebFlags)null); PropHuntPlugin.Log.LogInfo((object)$"[Empress Prop Hunt] Next-round hunter: {actorNumber} (was {_hunterActor})."); } } private void SafeAdvanceScene() { if (PhotonNetwork.IsMasterClient) { RepickHunterForNextRound(); ClearDisguisesBeforeLevelChange(); GameAccess.ChangeToRandomRunLevel(); } } private void ClearDisguisesBeforeLevelChange() { //IL_000d: 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_0023: Expected O, but got Unknown //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Expected O, but got Unknown //IL_003b: Expected O, but got Unknown try { Player[] playerList = PhotonNetwork.PlayerList; foreach (Player obj in playerList) { Hashtable val = new Hashtable(); ((Dictionary)val).Add((object)"PH_PropVID", (object)0); ((Dictionary)val).Add((object)"PH_Locked", (object)0); obj.SetCustomProperties(val, (Hashtable)null, (WebFlags)null); } } catch { } try { List list = GameAccess.PlayerList(); if (list == null) { return; } foreach (PlayerAvatar item in list) { if (!((Object)(object)item == (Object)null)) { PropDisguiseController component = ((Component)item).GetComponent(); if ((Object)(object)component != (Object)null) { component.ApplyClearLocal(); } } } } catch { } } private void TryLockControls() { try { PlayerController instance = PlayerController.instance; if ((Object)(object)instance != (Object)null) { instance.InputDisable(0.25f); instance.OverrideSpeed(0f, 0.3f); instance.OverrideLookSpeed(0.2f, 0.15f, 0.15f, 0.3f); } } catch { } } private IEnumerator HUDBurst() { float t = 1.5f; while (t > 0f) { t -= Time.deltaTime; yield return null; } } private void OnGUI() { //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_0198: 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_0311: Unknown result type (might be due to invalid IL or missing references) //IL_0208: 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_0376: Unknown result type (might be due to invalid IL or missing references) //IL_038f: Unknown result type (might be due to invalid IL or missing references) //IL_03a3: Unknown result type (might be due to invalid IL or missing references) //IL_03b7: Unknown result type (might be due to invalid IL or missing references) //IL_03bc: 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_03ca: Unknown result type (might be due to invalid IL or missing references) //IL_03f0: Unknown result type (might be due to invalid IL or missing references) //IL_03f9: Expected O, but got Unknown //IL_0400: Unknown result type (might be due to invalid IL or missing references) //IL_0426: Unknown result type (might be due to invalid IL or missing references) //IL_0442: Unknown result type (might be due to invalid IL or missing references) //IL_0447: Unknown result type (might be due to invalid IL or missing references) //IL_044e: Unknown result type (might be due to invalid IL or missing references) //IL_0474: Unknown result type (might be due to invalid IL or missing references) //IL_047d: Expected O, but got Unknown //IL_0498: Unknown result type (might be due to invalid IL or missing references) //IL_04c4: 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_02d0: Unknown result type (might be due to invalid IL or missing references) if (SemiFunc.MenuLevel() || (Object)(object)LevelGenerator.Instance == (Object)null || (Object)(object)GameDirector.instance == (Object)null || !PhotonNetwork.InRoom || _localRole == PHRole.None) { return; } GUI.depth = 0; Rect val = default(Rect); ((Rect)(ref val))..ctor(20f, 20f, 720f, 180f); string text = ((_localRole == PHRole.Hunter) ? "EMPRESS PROP HUNT - HUNTER\nShoot disguised valuables with the hunter handgun." : $"PROP HUNT — HIDER\n{KeyHiderToggle}: Toggle disguise | {KeyDisguiseViewToggle}: Toggle view | {KeyPositionLock}: Lock position"); if (!_ending) { GUI.Box(val, text); } float num = ((Rect)(ref val)).yMax + 6f; if (_localRole == PHRole.Hider && !_ending && PreHideActive) { float num2 = Mathf.Max(0f, _preHideUntil - Time.time); int num3 = Mathf.FloorToInt(num2 / 60f); int num4 = Mathf.FloorToInt(num2 % 60f); GUI.Label(new Rect(((Rect)(ref val)).x + 8f, num, ((Rect)(ref val)).width, 24f), $"Hide time: {num3:00}:{num4:00}"); num += 22f; } if (_roundArmed && !_ending) { float num5 = Mathf.Max(0f, (float)(_roundEndRealtime - (double)Time.time)); int num6 = Mathf.FloorToInt(num5 / 60f); int num7 = Mathf.FloorToInt(num5 % 60f); GUI.Label(new Rect(((Rect)(ref val)).x + 8f, num, ((Rect)(ref val)).width, 24f), $"Time left: {num6:00}:{num7:00}"); num += 22f; } if (_localRole == PHRole.Hunter && !_ending && IsHunterLocked) { int num8 = Mathf.CeilToInt(_hunterLockUntil - Time.time); GUI.Label(new Rect(((Rect)(ref val)).x + 8f, num, ((Rect)(ref val)).width, 24f), $"Hunter lock: {num8}s"); num += 22f; } if (_localRole == PHRole.Hider && !_ending) { string text2 = ((_cachedPropPhotonViewId != 0 && (Object)(object)PhotonView.Find(_cachedPropPhotonViewId) != (Object)null) ? "Target locked" : "Look at a Valuable to lock target"); GUI.Label(new Rect(((Rect)(ref val)).x + 8f, num, ((Rect)(ref val)).width, 24f), "Disguise: " + text2); num += 22f; if (_positionLocked) { GUI.Label(new Rect(((Rect)(ref val)).x + 8f, num, ((Rect)(ref val)).width, 24f), $"Position locked ({KeyPositionLock} to release)"); num += 22f; } } if (Time.time < _flashMsgUntil) { GUI.Label(new Rect(30f, num + 8f, ((Rect)(ref val)).width, 24f), _flashMsg); } if (_ending) { string text3 = (PhotonNetwork.IsMasterClient ? Mathf.CeilToInt(Mathf.Max(0f, _endUntil - Time.time)).ToString() : "…"); Rect val2 = new Rect(0f, 0f, (float)Screen.width, (float)Screen.height); GUI.color = new Color(0f, 0f, 0f, 0.55f); GUI.DrawTexture(val2, (Texture)(object)Texture2D.whiteTexture); GUI.color = Color.white; GUIStyle val3 = new GUIStyle(GUI.skin.label) { alignment = (TextAnchor)4, fontStyle = (FontStyle)1, fontSize = Mathf.RoundToInt(Mathf.Clamp((float)Screen.width * 0.06f, 32f, 72f)), wordWrap = false }; val3.normal.textColor = Color.white; GUI.Label(new Rect(0f, (float)Screen.height * 0.35f, (float)Screen.width, 80f), _endMsg, val3); GUIStyle val4 = new GUIStyle(GUI.skin.label) { alignment = (TextAnchor)4, fontSize = Mathf.RoundToInt(Mathf.Clamp((float)Screen.width * 0.03f, 18f, 36f)), wordWrap = false }; val4.normal.textColor = new Color(1f, 1f, 1f, 0.9f); GUI.Label(new Rect(0f, (float)Screen.height * 0.35f + 68f, (float)Screen.width, 60f), "Next round starting in " + text3, val4); } } internal void Flash(string msg, float dur = 1.5f) { _flashMsg = msg; _flashMsgUntil = Time.time + dur; } public override void OnRoomPropertiesUpdate(Hashtable changed) { ApplyRoomState(changed); } public override void OnPlayerPropertiesUpdate(Player targetPlayer, Hashtable changedProps) { if (!((Dictionary)(object)changedProps).ContainsKey((object)"PH_PropVID") && !((Dictionary)(object)changedProps).ContainsKey((object)"PH_Locked")) { return; } PlayerAvatar val = FindAvatarByActor(targetPlayer.ActorNumber); if ((Object)(object)val == (Object)null) { return; } PropDisguiseController propDisguiseController = ((Component)val).GetComponent() ?? ((Component)val).gameObject.AddComponent(); if (((Dictionary)(object)changedProps).ContainsKey((object)"PH_PropVID") && TryToInt(changedProps[(object)"PH_PropVID"], out var val2)) { if (val2 == 0 || (Object)(object)PhotonView.Find(val2) == (Object)null) { propDisguiseController.ApplyClearLocal(); } else { propDisguiseController.ApplyDisguiseLocal(val2, 0.0001f); } } int val3; bool visualPoseLocked = ((Dictionary)(object)targetPlayer.CustomProperties).ContainsKey((object)"PH_Locked") && TryToInt(targetPlayer.CustomProperties[(object)"PH_Locked"], out val3) && val3 == 1; propDisguiseController.SetVisualPoseLocked(visualPoseLocked); } public override void OnPlayerLeftRoom(Player otherPlayer) { //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Expected O, but got Unknown //IL_0097: Expected O, but got Unknown if (PhotonNetwork.IsMasterClient && otherPlayer != null && otherPlayer.ActorNumber == _hunterActor) { List list = PhotonNetwork.PlayerList.Where((Player p) => !p.IsInactive).ToList(); if (list.Count > 0) { Player val = list[new Random().Next(list.Count)]; Room currentRoom = PhotonNetwork.CurrentRoom; Hashtable val2 = new Hashtable(); ((Dictionary)val2).Add((object)"PH_Hunter", (object)val.ActorNumber); currentRoom.SetCustomProperties(val2, (Hashtable)null, (WebFlags)null); PropHuntPlugin.Log.LogInfo((object)$"[Empress Prop Hunt] Hunter left; new hunter {val.ActorNumber}."); } } } private void ApplyRoomState(Hashtable props) { if (props == null || !((Dictionary)(object)props).ContainsKey((object)"PH_Active")) { return; } bool flag = (int)props[(object)"PH_Active"] == 1; int num = (_hunterActor = (((Dictionary)(object)props).ContainsKey((object)"PH_Hunter") ? ((int)props[(object)"PH_Hunter"]) : (-1))); Player localPlayer = PhotonNetwork.LocalPlayer; _localRole = (flag ? ((localPlayer.ActorNumber == num) ? PHRole.Hunter : PHRole.Hider) : PHRole.None); PropHuntPlugin.Log.LogInfo((object)$"[Empress Prop Hunt] Role set: {_localRole} (hunter actor={num})."); if (_localRole == PHRole.Hunter) { PlayerAvatar val = FindLocalAvatar(); if ((Object)(object)val != (Object)null) { _gun = ((Component)val).gameObject.GetComponent() ?? ((Component)val).gameObject.AddComponent(); _gun.Manager = this; } } _deadActors.Clear(); _ending = false; _roundArmed = false; _roundEndRealtime = 0.0; } public void RequestEliminate(int targetActorNumber) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Expected O, but got Unknown if (PhotonNetwork.InRoom) { object[] array = new object[3] { "PH1", PhotonNetwork.LocalPlayer.ActorNumber, targetActorNumber }; PhotonNetwork.RaiseEvent((byte)101, (object)array, new RaiseEventOptions { Receivers = (ReceiverGroup)1 }, SendOptions.SendReliable); } } public void OnEvent(EventData e) { try { if (HandleHunterWeaponEvent(e)) { return; } int val4; if (e.Code == 101) { if (e.CustomData is object[] array && array.Length >= 3 && array[0] is string text && !(text != "PH1") && TryToInt(array[1], out var val) && val == _hunterActor && TryToInt(array[2], out var val2) && val2 > 0 && PhotonNetwork.LocalPlayer.ActorNumber == val2) { KillLocalPlayerClean(); } } else if (e.Code == 102) { if (e.CustomData is object[] array2 && array2.Length >= 2 && array2[0] is string text2 && !(text2 != "PH1") && TryToInt(array2[1], out var val3) && PhotonNetwork.IsMasterClient) { _deadActors.Add(val3); if (val3 == _hunterActor) { _roundArmed = false; BroadcastMatchEnd(PHWinner.Hiders, "Hunter eliminated"); } else if (AllHidersDead()) { _roundArmed = false; BroadcastMatchEnd(PHWinner.Hunter, "All hiders eliminated"); } } } else if (e.Code == 103 && e.CustomData is object[] array3 && array3.Length >= 3 && array3[0] is string text3 && !(text3 != "PH1") && TryToInt(array3[1], out val4)) { string reason = (array3[2] as string) ?? ""; StartEndBannerLocal((PHWinner)val4, reason); } } catch (Exception ex) { LogGate.WarnThrottled(PropHuntPlugin.Log, "[Empress Prop Hunt] OnEvent guarded: " + ex.Message); } } private bool AllHidersDead() { Player[] playerList = PhotonNetwork.PlayerList; foreach (Player val in playerList) { if (!val.IsInactive && val.ActorNumber != _hunterActor && !_deadActors.Contains(val.ActorNumber)) { return false; } } return true; } private void KillLocalPlayerClean() { //IL_004b: Unknown result type (might be due to invalid IL or missing references) try { PlayerAvatar val = FindLocalAvatar(); if ((Object)(object)val != (Object)null) { val.PlayerDeath(0); return; } } catch { } try { PlayerAvatar val2 = FindLocalAvatar(); PlayerHealth val3 = GameAccess.Health(val2); if ((Object)(object)val2 != (Object)null && (Object)(object)val3 != (Object)null) { val3.HurtOther(9999, ((Component)val2).transform.position, false, -1, false); } } catch (Exception ex) { LogGate.WarnThrottled(PropHuntPlugin.Log, "[Empress Prop Hunt] KillLocalPlayerClean: " + ex.Message); } } private void EnsureControllersOnAllAvatars() { List list = GameAccess.PlayerList(); if (list == null) { return; } foreach (PlayerAvatar item in list) { if ((Object)(object)item != (Object)null && (Object)(object)((Component)item).GetComponent() == (Object)null) { ((Component)item).gameObject.AddComponent(); } } } private void SyncAllPlayerDisguises() { Player[] playerList = PhotonNetwork.PlayerList; foreach (Player val in playerList) { PlayerAvatar val2 = FindAvatarByActor(val.ActorNumber); if (!((Object)(object)val2 == (Object)null)) { ApplyOnePlayerDisguise(val, val2); } } } private void ApplyOnePlayerDisguise(Player pl, PlayerAvatar av) { if (pl != null && !((Object)(object)av == (Object)null) && ((Dictionary)(object)pl.CustomProperties).ContainsKey((object)"PH_PropVID") && TryToInt(pl.CustomProperties[(object)"PH_PropVID"], out var val)) { PropDisguiseController propDisguiseController = ((Component)av).GetComponent() ?? ((Component)av).gameObject.AddComponent(); if (val == 0 || (Object)(object)PhotonView.Find(val) == (Object)null) { propDisguiseController.ApplyClearLocal(); return; } propDisguiseController.ApplyDisguiseLocal(val, 0.0001f); int val2; bool visualPoseLocked = ((Dictionary)(object)pl.CustomProperties).ContainsKey((object)"PH_Locked") && TryToInt(pl.CustomProperties[(object)"PH_Locked"], out val2) && val2 == 1; propDisguiseController.SetVisualPoseLocked(visualPoseLocked); } } private PlayerAvatar FindLocalAvatar() { List list = GameAccess.PlayerList(); if (list == null) { return null; } foreach (PlayerAvatar item in list) { if ((Object)(object)item != (Object)null && (Object)(object)item.photonView != (Object)null && item.photonView.IsMine) { return item; } } return null; } private PlayerAvatar FindAvatarByActor(int actorNr) { List list = GameAccess.PlayerList(); if (list == null) { return null; } foreach (PlayerAvatar item in list) { if (!((Object)(object)item == (Object)null) && !((Object)(object)item.photonView == (Object)null) && item.photonView.Owner != null && item.photonView.Owner.ActorNumber == actorNr) { return item; } } return null; } private ValuableObject GetTargetValuable() { PhysGrabObject val = PhysGrabber.instance?.currentlyLookingAtPhysGrabObject; if ((Object)(object)val == (Object)null) { return null; } return ((Component)val).GetComponent(); } private void UpdateCachedTargetFromPhysGrab() { try { ValuableObject targetValuable = GetTargetValuable(); if (!((Object)(object)targetValuable == (Object)null)) { PhotonView component = ((Component)targetValuable).GetComponent(); if ((Object)(object)component != (Object)null && component.ViewID != 0) { _cachedPropPhotonViewId = component.ViewID; } } } catch { } } private void ToggleDisguise(PlayerAvatar me) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown //IL_0051: Expected O, but got Unknown //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Expected O, but got Unknown //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Expected O, but got Unknown //IL_0100: Expected O, but got Unknown PropDisguiseController propDisguiseController = ((Component)me).GetComponent() ?? ((Component)me).gameObject.AddComponent(); if (propDisguiseController.IsDisguised) { Player localPlayer = PhotonNetwork.LocalPlayer; Hashtable val = new Hashtable(); ((Dictionary)val).Add((object)"PH_PropVID", (object)0); ((Dictionary)val).Add((object)"PH_Locked", (object)0); localPlayer.SetCustomProperties(val, (Hashtable)null, (WebFlags)null); me.photonView.RPC("PH_RPC_TinyOff", (RpcTarget)4, new object[1] { me.photonView.ViewID }); propDisguiseController.ApplyClearLocal(); _positionLocked = false; Flash("Disguise cleared."); } else if (_cachedPropPhotonViewId == 0 || (Object)(object)PhotonView.Find(_cachedPropPhotonViewId) == (Object)null) { Flash("No disguise target. Look at a Valuable."); } else { int cachedPropPhotonViewId = _cachedPropPhotonViewId; Player localPlayer2 = PhotonNetwork.LocalPlayer; Hashtable val2 = new Hashtable(); ((Dictionary)val2).Add((object)"PH_PropVID", (object)cachedPropPhotonViewId); ((Dictionary)val2).Add((object)"PH_Locked", (object)0); localPlayer2.SetCustomProperties(val2, (Hashtable)null, (WebFlags)null); me.photonView.RPC("PH_RPC_TinyOn", (RpcTarget)4, new object[3] { me.photonView.ViewID, cachedPropPhotonViewId, 0.0001f }); propDisguiseController.ApplyDisguiseLocal(cachedPropPhotonViewId, 0.0001f); _positionLocked = false; Flash("Disguised."); } } private static bool TryToInt(object o, out int val) { try { if (o is int num) { val = num; return true; } if (o is byte b) { val = b; return true; } if (o is short num2) { val = num2; return true; } if (o is long num3) { val = (int)num3; return true; } if (o is float num4) { val = (int)num4; return true; } if (o is double num5) { val = (int)num5; return true; } if (o is string s && int.TryParse(s, out var result)) { val = result; return true; } } catch { } val = -1; return false; } } [BepInPlugin("empress.repo.prophunt", "Empress Prop Hunt", "1.9.0")] public class PropHuntPlugin : BaseUnityPlugin { internal static ManualLogSource Log; internal static Harmony Harmony; internal static ConfigEntry CfgPreHideSeconds; internal static ConfigEntry CfgHunterLockSeconds; internal static ConfigEntry CfgRoundSeconds; internal static ConfigEntry CfgGunRangeMeters; internal static ConfigEntry CfgKeyDisguiseToggle; internal static ConfigEntry CfgKeyViewToggle; internal static ConfigEntry CfgKeyPositionLock; internal static ConfigEntry CfgDisableEnemies; internal static ConfigEntry CfgMaxOutValuables; private void Awake() { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); Harmony = new Harmony("empress.repo.prophunt"); CfgPreHideSeconds = ((BaseUnityPlugin)this).Config.Bind("Gameplay", "PreHideSeconds", 30f, "Seconds of hide time before the round starts."); CfgHunterLockSeconds = ((BaseUnityPlugin)this).Config.Bind("Gameplay", "HunterLockSeconds", 30f, "Seconds the Hunter is locked during pre-hide."); CfgRoundSeconds = ((BaseUnityPlugin)this).Config.Bind("Gameplay", "RoundSeconds", 300f, "Live round duration in seconds."); CfgGunRangeMeters = ((BaseUnityPlugin)this).Config.Bind("Hunter", "GunRangeMeters", 60f, "Hunter handgun hit range in meters."); CfgKeyDisguiseToggle = ((BaseUnityPlugin)this).Config.Bind("Controls", "HiderDisguiseKey", (KeyCode)118, "Hider: toggle disguise."); CfgKeyViewToggle = ((BaseUnityPlugin)this).Config.Bind("Controls", "HiderViewToggleKey", (KeyCode)99, "Hider: toggle first/third person."); CfgKeyPositionLock = ((BaseUnityPlugin)this).Config.Bind("Controls", "HiderPositionLockKey", (KeyCode)120, "Hider: lock position while disguised."); CfgDisableEnemies = ((BaseUnityPlugin)this).Config.Bind("Round Rules", "DisableEnemies", true, "Disable enemy spawns during Prop Hunt rounds."); CfgMaxOutValuables = ((BaseUnityPlugin)this).Config.Bind("Round Rules", "MaxOutValuables", true, "Spawn more valuables for hider choices."); Harmony.PatchAll(); SceneManager.sceneLoaded += OnSceneLoaded; ((MonoBehaviour)this).StartCoroutine(LevelWatcher()); Log.LogInfo((object)"[Empress Prop Hunt] Loaded v1.9.0."); } private void OnDestroy() { SceneManager.sceneLoaded -= OnSceneLoaded; } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { } private IEnumerator LevelWatcher() { while (true) { yield return (object)new WaitForSeconds(0.5f); if (SemiFunc.IsMultiplayer() && PhotonNetwork.InRoom && !SemiFunc.MenuLevel() && !((Object)(object)LevelGenerator.Instance == (Object)null) && !((Object)(object)GameDirector.instance == (Object)null)) { List list = GameAccess.PlayerList(); bool num = list != null && list.Count > 0; bool flag = GameAccess.IsMainState(); if (num && flag && (Object)(object)PropHuntManager.Instance == (Object)null) { GameObject val = new GameObject("PropHuntManager"); val.transform.parent = null; ((Object)val).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)val); PropHuntManager propHuntManager = val.AddComponent(); propHuntManager.PreHideSeconds = Mathf.Max(1f, CfgPreHideSeconds.Value); propHuntManager.HunterLockSeconds = Mathf.Max(0f, CfgHunterLockSeconds.Value); propHuntManager.RoundSeconds = Mathf.Max(5f, CfgRoundSeconds.Value); propHuntManager.GunRangeMeters = Mathf.Max(1f, CfgGunRangeMeters.Value); propHuntManager.KeyHiderToggle = CfgKeyDisguiseToggle.Value; propHuntManager.KeyDisguiseViewToggle = CfgKeyViewToggle.Value; propHuntManager.KeyPositionLock = CfgKeyPositionLock.Value; Log.LogInfo((object)"[Empress Prop Hunt] Manager created."); } } } } } public enum PHRole { None, Hunter, Hider } public enum PHWinner { None, Hunter, Hiders, Draw } internal static class LogGate { private static float _nextWarnTime; public static void WarnThrottled(ManualLogSource log, string msg, float everySeconds = 2f) { if (!(Time.realtimeSinceStartup < _nextWarnTime)) { _nextWarnTime = Time.realtimeSinceStartup + everySeconds; log.LogWarning((object)msg); } } } [HarmonyPatch(typeof(PlayerAvatar), "PlayerDeath")] public static class PH_Patch_PlayerDeath { private static void Postfix(PlayerAvatar __instance) { //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: 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_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown try { if (PhotonNetwork.InRoom) { object obj; if (__instance == null) { obj = null; } else { PhotonView photonView = __instance.photonView; obj = ((photonView != null) ? photonView.Owner : null); } Player val = (Player)obj; if (val != null) { object[] array = new object[2] { "PH1", val.ActorNumber }; PhotonNetwork.RaiseEvent((byte)102, (object)array, new RaiseEventOptions { Receivers = (ReceiverGroup)1 }, SendOptions.SendReliable); } } } catch { } } } [HarmonyPatch(typeof(PlayerAvatar), "OnPhotonSerializeView")] public static class PH_SpoofCrouch_OnSerialize { private static void Prefix(PlayerAvatar __instance, PhotonStream stream, PhotonMessageInfo info, ref object __state) { __state = null; try { if (stream.IsWriting) { PropDisguiseController component = ((Component)__instance).GetComponent(); if (!((Object)(object)component == (Object)null) && component.IsDisguised) { bool isCrouching = GameAccess.GetIsCrouching(__instance); __state = isCrouching; GameAccess.SetIsCrouching(__instance, value: true); } } } catch { } } private static void Postfix(PlayerAvatar __instance, PhotonStream stream, PhotonMessageInfo info, object __state) { try { if (stream.IsWriting && __state is bool) { bool value = (bool)__state; GameAccess.SetIsCrouching(__instance, value); } } catch { } } } public class PropDisguiseController : MonoBehaviourPun { private PlayerAvatar _avatar; private PlayerAvatarVisuals _visuals; private GameObject _disguiseRoot; private Transform _tinyTarget; private Vector3 _tinyOrigScale; private bool _hasTinyOrig; private GameObject _flashlightGO; private bool _visualPoseLocked; private Vector3 _visualLockWorldPosition; private Quaternion _visualLockWorldRotation; private bool _thirdEnabled; private bool _camBaseValid; private Transform _camOrigParent; private Vector3 _camOrigLocalPos; private float _camBack; private float _camUp; private Vector3 _camVel; private float _camSmoothTime = 0.08f; private static readonly string[] VISUALS_NAMES = new string[5] { "Player Visuals", "PlayerVisuals", "Player Visual", "Player_Visuals", "Visuals" }; private static readonly string[] RIG_NAMES = new string[6] { "[RIG]", "RIG", "Rig", "Armature", "Root", "RootTransform" }; private static readonly string[] FLASH_NAMES = new string[7] { "flashlight", "flash_light", "flash", "torch", "headlamp", "head_lamp", "lamp" }; public bool IsDisguised { get; private set; } public bool TryRaycastDisguise(Ray ray, float maxDistance, out float distance) { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) distance = 0f; if (!IsDisguised || (Object)(object)_disguiseRoot == (Object)null) { return false; } float num = maxDistance; bool flag = false; Renderer[] componentsInChildren = _disguiseRoot.GetComponentsInChildren(true); float num2 = default(float); foreach (Renderer val in componentsInChildren) { if (!((Object)(object)val == (Object)null) && val.enabled) { Bounds bounds = val.bounds; if (((Bounds)(ref bounds)).IntersectRay(ray, ref num2) && !(num2 < 0f) && !(num2 > num)) { num = num2; flag = true; } } } if (!flag) { return false; } distance = num; return true; } private void Awake() { _avatar = ((Component)this).GetComponent(); CacheVisualRefs(); } private void CacheVisualRefs() { if ((Object)(object)_visuals == (Object)null) { _visuals = ((Component)this).GetComponentInChildren(true); } if ((Object)(object)_flashlightGO == (Object)null) { Transform val = FindFlashlightTransform(((Component)this).transform); if ((Object)(object)val != (Object)null) { _flashlightGO = ((Component)val).gameObject; } } } public void ApplyDisguiseLocal(int propVid, float tinyFactor) { DoApply(propVid, tinyFactor); } public void ApplyClearLocal() { DoClear(); } [PunRPC] public void PH_RPC_TinyOn(int playerViewID, int propPhotonViewId, float tinyFactor) { if (!((Object)(object)((MonoBehaviourPun)this).photonView == (Object)null) && ((MonoBehaviourPun)this).photonView.ViewID == playerViewID && !((MonoBehaviourPun)this).photonView.IsMine) { DoApply(propPhotonViewId, tinyFactor); } } [PunRPC] public void PH_RPC_TinyOff(int playerViewID) { if (!((Object)(object)((MonoBehaviourPun)this).photonView == (Object)null) && ((MonoBehaviourPun)this).photonView.ViewID == playerViewID && !((MonoBehaviourPun)this).photonView.IsMine) { DoClear(); } } private void DoApply(int propPhotonViewId, float tinyFactor) { CacheVisualRefs(); float factor = Mathf.Clamp(tinyFactor, 0.0001f, 0.1f); if (!BuildOrRefreshClone(propPhotonViewId)) { DoClear(); return; } ApplyTinyToVisualRig(factor); PhysGrabber val = GameAccess.AvatarGrabber(_avatar); if ((Object)(object)val != (Object)null) { ((Behaviour)val).enabled = false; } if ((Object)(object)((MonoBehaviourPun)this).photonView != (Object)null && ((MonoBehaviourPun)this).photonView.IsMine) { SetupLocalViewOffsets(); } IsDisguised = true; } private void DoClear() { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) CacheVisualRefs(); SetVisualPoseLocked(locked: false); ClearTinyOnVisualRig(); PhysGrabber val = GameAccess.AvatarGrabber(_avatar); if ((Object)(object)val != (Object)null) { ((Behaviour)val).enabled = true; } IsDisguised = false; if ((Object)(object)((MonoBehaviourPun)this).photonView != (Object)null && ((MonoBehaviourPun)this).photonView.IsMine) { _thirdEnabled = false; RestoreLocalViewOffsets(); _camOrigParent = null; _camOrigLocalPos = Vector3.zero; } RemoveClone(); } private void ApplyTinyToVisualRig(float factor) { //IL_0056: 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_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_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) _tinyTarget = ResolveTinyTarget(((Component)_avatar).transform); if (!((Object)(object)_tinyTarget == (Object)null)) { if (!_hasTinyOrig) { _tinyOrigScale = _tinyTarget.localScale; _hasTinyOrig = true; } Vector3 val = default(Vector3); ((Vector3)(ref val))..ctor(factor, factor, factor); Vector3 val2 = _tinyTarget.localScale - val; if (((Vector3)(ref val2)).sqrMagnitude > 1E-08f) { _tinyTarget.localScale = val; } Light[] componentsInChildren = ((Component)this).GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { ((Behaviour)componentsInChildren[i]).enabled = false; } } } private void ClearTinyOnVisualRig() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_tinyTarget != (Object)null && _hasTinyOrig) { _tinyTarget.localScale = _tinyOrigScale; } Light[] componentsInChildren = ((Component)this).GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { ((Behaviour)componentsInChildren[i]).enabled = true; } } private Transform FindFlashlightTransform(Transform root) { //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Expected O, but got Unknown string[] fLASH_NAMES = FLASH_NAMES; foreach (string text in fLASH_NAMES) { Transform val = root.Find(text) ?? root.Find(ToTitle(text)); if ((Object)(object)val != (Object)null) { return val; } } Queue queue = new Queue(); queue.Enqueue(root); while (queue.Count > 0) { Transform val2 = queue.Dequeue(); string cn = Normalize(((Object)val2).name); if (FLASH_NAMES.Any((string n) => cn.Contains(Normalize(n)))) { return val2; } foreach (Transform item2 in val2) { Transform item = item2; queue.Enqueue(item); } } Light[] componentsInChildren = ((Component)root).GetComponentsInChildren(true); foreach (Light val3 in componentsInChildren) { Transform t = ((Component)val3).transform; while ((Object)(object)t != (Object)null && (Object)(object)t != (Object)(object)root) { if (FLASH_NAMES.Any((string n) => Normalize(((Object)t).name).Contains(Normalize(n)))) { return t; } t = t.parent; } } return null; } private static string ToTitle(string s) { if (!string.IsNullOrEmpty(s)) { return char.ToUpperInvariant(s[0]) + s.Substring(1); } return s; } private Transform ResolveTinyTarget(Transform avatarRoot) { if ((Object)(object)avatarRoot == (Object)null) { return null; } Transform val = FindLooseBFS(FindNearestAncestorWhoseSubtreeHasLoose(avatarRoot, VISUALS_NAMES) ?? avatarRoot, VISUALS_NAMES); Transform val2 = (((Object)(object)val != (Object)null) ? FindLooseBFS(val, RIG_NAMES) : null); if ((Object)(object)val2 == (Object)null) { val2 = FindLooseBFS(avatarRoot, RIG_NAMES); } if ((Object)(object)val2 != (Object)null) { return val2; } if ((Object)(object)val != (Object)null) { return val; } Renderer componentInChildren = ((Component)avatarRoot).GetComponentInChildren(true); if (!((Object)(object)componentInChildren != (Object)null)) { return avatarRoot; } return ((Component)componentInChildren).transform; } private static Transform FindLooseBFS(Transform root, params string[] names) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Expected O, but got Unknown if ((Object)(object)root == (Object)null) { return null; } string[] source = names.Select(Normalize).ToArray(); foreach (Transform item in root) { Transform val = item; string cn2 = Normalize(((Object)val).name); if (source.Any((string t) => t == cn2)) { return val; } } Queue queue = new Queue(); queue.Enqueue(root); while (queue.Count > 0) { foreach (Transform item2 in queue.Dequeue()) { Transform val2 = item2; string cn = Normalize(((Object)val2).name); if (source.Any((string t) => t == cn || cn.Contains(t))) { return val2; } queue.Enqueue(val2); } } return null; } private static Transform FindNearestAncestorWhoseSubtreeHasLoose(Transform start, params string[] names) { Transform val = start; while ((Object)(object)val != (Object)null) { if ((Object)(object)FindLooseBFS(val, names) != (Object)null) { return val; } val = val.parent; } return null; } private static string Normalize(string s) { if (string.IsNullOrEmpty(s)) { return ""; } s = s.ToLowerInvariant(); return new string(s.Where((char ch) => ch != ' ' && ch != '_' && ch != '-' && ch != '[' && ch != ']' && ch != '(' && ch != ')' && ch != '{' && ch != '}' && ch != '.').ToArray()); } private bool BuildOrRefreshClone(int propPhotonViewId) { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Expected O, but got Unknown //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) RemoveClone(); PhotonView val = PhotonView.Find(propPhotonViewId); if ((Object)(object)val == (Object)null) { PropHuntPlugin.Log.LogWarning((object)$"[Empress Prop Hunt] Valuable view {propPhotonViewId} not found."); return false; } _disguiseRoot = new GameObject("PH_Disguise"); _disguiseRoot.transform.SetParent(((Component)_avatar).transform, false); _disguiseRoot.transform.localPosition = Vector3.zero; _disguiseRoot.transform.localRotation = Quaternion.identity; _disguiseRoot.transform.localScale = Vector3.one; int avatarLayer = 0; CloneRelativeModel(((Component)val).transform, _disguiseRoot.transform, avatarLayer); Collider[] componentsInChildren = _disguiseRoot.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { Object.Destroy((Object)(object)componentsInChildren[i]); } Rigidbody[] componentsInChildren2 = _disguiseRoot.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren2.Length; i++) { Object.Destroy((Object)(object)componentsInChildren2[i]); } return true; } private void RemoveClone() { if ((Object)(object)_disguiseRoot != (Object)null) { Object.Destroy((Object)(object)_disguiseRoot); _disguiseRoot = null; } } public void SetVisualPoseLocked(bool locked) { //IL_0023: 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_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) if (!locked) { _visualPoseLocked = false; if ((Object)(object)_disguiseRoot != (Object)null) { _disguiseRoot.transform.localPosition = Vector3.zero; _disguiseRoot.transform.localRotation = Quaternion.identity; } } else if (IsDisguised && !((Object)(object)_disguiseRoot == (Object)null)) { _visualLockWorldPosition = _disguiseRoot.transform.position; _visualLockWorldRotation = _disguiseRoot.transform.rotation; _visualPoseLocked = true; MaintainVisualLockPose(); } } private void MaintainVisualLockPose() { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: 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_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) if (_visualPoseLocked && !((Object)(object)_disguiseRoot == (Object)null)) { Transform transform = _disguiseRoot.transform; Transform parent = transform.parent; if ((Object)(object)parent == (Object)null) { transform.position = _visualLockWorldPosition; transform.rotation = _visualLockWorldRotation; } else { transform.localPosition = parent.InverseTransformPoint(_visualLockWorldPosition); transform.localRotation = Quaternion.Inverse(parent.rotation) * _visualLockWorldRotation; } } } private void CloneRelativeModel(Transform srcRoot, Transform dstRoot, int avatarLayer) { CloneNodeRecursive(srcRoot, dstRoot, avatarLayer, isRoot: true); } private void CloneNodeRecursive(Transform src, Transform dstParent, int avatarLayer, bool isRoot) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Expected O, but got Unknown //IL_0068: 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_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0044: 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_0118: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Expected O, but got Unknown GameObject val = new GameObject(((Object)src).name + "_PH"); val.layer = avatarLayer; val.transform.SetParent(dstParent, false); if (isRoot) { val.transform.localPosition = Vector3.zero; val.transform.localRotation = Quaternion.identity; val.transform.localScale = src.localScale; } else { val.transform.localPosition = src.localPosition; val.transform.localRotation = src.localRotation; val.transform.localScale = src.localScale; } MeshFilter component = ((Component)src).GetComponent(); MeshRenderer component2 = ((Component)src).GetComponent(); SkinnedMeshRenderer component3 = ((Component)src).GetComponent(); if ((Object)(object)component2 != (Object)null && (Object)(object)component != (Object)null && (Object)(object)component.sharedMesh != (Object)null) { MeshFilter obj = val.AddComponent(); MeshRenderer val2 = val.AddComponent(); obj.sharedMesh = component.sharedMesh; ((Renderer)val2).sharedMaterials = ((Renderer)component2).sharedMaterials; ((Renderer)val2).enabled = true; ((Renderer)val2).forceRenderingOff = false; } else if ((Object)(object)component3 != (Object)null && (Object)(object)component3.sharedMesh != (Object)null) { Mesh val3 = new Mesh(); try { component3.BakeMesh(val3); } catch { val3 = Object.Instantiate(component3.sharedMesh); } MeshFilter val4 = val.AddComponent(); MeshRenderer obj3 = val.AddComponent(); val4.sharedMesh = val3; ((Renderer)obj3).sharedMaterials = ((Renderer)component3).sharedMaterials; ((Renderer)obj3).enabled = true; ((Renderer)obj3).forceRenderingOff = false; } for (int i = 0; i < src.childCount; i++) { CloneNodeRecursive(src.GetChild(i), val.transform, avatarLayer, isRoot: false); } } private void SetupLocalViewOffsets() { //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) _thirdEnabled = true; Camera main = Camera.main; if (!((Object)(object)main == (Object)null)) { if ((Object)(object)_camOrigParent == (Object)null && !_camBaseValid) { _camOrigParent = ((Component)main).transform.parent; _camOrigLocalPos = ((Component)main).transform.localPosition; } if ((Object)(object)_camOrigParent == (Object)null) { _camOrigParent = ((Component)main).transform.parent; _camOrigLocalPos = ((Component)main).transform.localPosition; } float num = ComputeBoundsRadius(((Object)(object)_disguiseRoot != (Object)null) ? _disguiseRoot.transform : ((Component)this).transform); _camBack = Mathf.Max(1.6f, num * 2.2f); _camUp = Mathf.Clamp(num * 0.6f, 0.25f, 1.2f); } } private void RestoreLocalViewOffsets() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: 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) Camera main = Camera.main; if ((Object)(object)main == (Object)null) { _camBaseValid = false; return; } _thirdEnabled = false; _camBaseValid = false; _camVel = Vector3.zero; Vector3 val = (((Object)(object)_camOrigParent != (Object)null) ? _camOrigParent.TransformPoint(_camOrigLocalPos) : ((Component)main).transform.position); if ((Object)(object)((Component)main).transform.parent == (Object)(object)_camOrigParent) { ((Component)main).transform.localPosition = _camOrigLocalPos; } else if ((Object)(object)((Component)main).transform.parent != (Object)null) { ((Component)main).transform.localPosition = ((Component)main).transform.parent.InverseTransformPoint(val); } else { ((Component)main).transform.position = val; } } private float ComputeBoundsRadius(Transform root) { //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_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) Renderer[] componentsInChildren = ((Component)root).GetComponentsInChildren(true); if (componentsInChildren.Length == 0) { return 0.6f; } Bounds bounds = componentsInChildren[0].bounds; Bounds val = default(Bounds); ((Bounds)(ref val))..ctor(((Bounds)(ref bounds)).center, Vector3.zero); for (int i = 1; i < componentsInChildren.Length; i++) { ((Bounds)(ref val)).Encapsulate(componentsInChildren[i].bounds); } Vector3 extents = ((Bounds)(ref val)).extents; return ((Vector3)(ref extents)).magnitude * 0.75f; } private void LateUpdate() { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0043: 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_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008b: 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_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) if (IsDisguised) { MaintainVisualLockPose(); } if (IsDisguised && _thirdEnabled) { Camera main = Camera.main; if (!((Object)(object)main == (Object)null)) { Vector3 val = (((Object)(object)_camOrigParent != (Object)null) ? _camOrigParent.TransformPoint(_camOrigLocalPos) : ((Component)main).transform.position); Vector3 val2 = (((Object)(object)_camOrigParent != (Object)null) ? _camOrigParent.TransformDirection(new Vector3(0f, _camUp, 0f - _camBack)) : (((Component)main).transform.rotation * new Vector3(0f, _camUp, 0f - _camBack))); Vector3 val3 = val + val2; ((Component)main).transform.position = Vector3.SmoothDamp(((Component)main).transform.position, val3, ref _camVel, _camSmoothTime); } } } private void OnDisable() { if ((Object)(object)((MonoBehaviourPun)this).photonView != (Object)null && ((MonoBehaviourPun)this).photonView.IsMine) { _thirdEnabled = false; RestoreLocalViewOffsets(); } } private void OnDestroy() { if ((Object)(object)((MonoBehaviourPun)this).photonView != (Object)null && ((MonoBehaviourPun)this).photonView.IsMine) { _thirdEnabled = false; RestoreLocalViewOffsets(); } } public bool ToggleDisguiseView() { if (!IsDisguised) { return _thirdEnabled; } _thirdEnabled = !_thirdEnabled; if (!_thirdEnabled) { RestoreLocalViewOffsets(); } else { SetupLocalViewOffsets(); } return _thirdEnabled; } } [BepInPlugin("empress.repo.prophunt.menu", "Empress Prop Hunt Menu", "1.1.2")] public class MainMenuPrefabSwapPlugin : BaseUnityPlugin { private void Awake() { //IL_002e: Unknown result type (might be due to invalid IL or missing references) ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); new Harmony("empress.repo.prophunt.menu").PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Empress Prop Hunt Menu loaded"); } } [HarmonyPatch(typeof(LevelGenerator), "StartRoomGeneration")] public static class Patch_LevelGenerator_StartRoomGeneration { private const string BundleStem = "omnilikeag6"; private const string PreferredFolder = "Empress-PropHunt"; private const string PrefabName = "Start Room - Main Menu"; private const string MusicAssetName = "Constant Music - Main Menu"; private const string GameMusicClipName = "msc main menu"; private const string GameMusicSOName = "Constant Music - Main Menu"; private static AssetBundle _bundle; private static GameObject _cachedPrefab; private static AudioClip _cachedMusic; private static bool _attemptedLoad; private static readonly FieldInfo WaitingFlag = AccessTools.Field(typeof(LevelGenerator), "waitingForSubCoroutine"); private static bool InMainMenu() { RunManager instance = RunManager.instance; if ((Object)(object)instance != (Object)null) { return (Object)(object)instance.levelCurrent == (Object)(object)instance.levelMainMenu; } return false; } private static bool Prefix(LevelGenerator __instance, ref IEnumerator __result) { if (!InMainMenu()) { return true; } if (!EnsureAssetsLoaded()) { return true; } __result = ReplacementCoroutine(__instance, _cachedPrefab, _cachedMusic); return false; } private static IEnumerator ReplacementCoroutine(LevelGenerator gen, GameObject customPrefab, AudioClip music) { if (WaitingFlag != null) { WaitingFlag.SetValue(gen, true); } gen.State = (LevelState)3; DisableGameMenuMusic(); GameObject val = Object.Instantiate(customPrefab, Vector3.zero, Quaternion.identity); Camera[] componentsInChildren = val.GetComponentsInChildren(true); foreach (Camera val2 in componentsInChildren) { if ((Object)(object)val2 != (Object)null && (Object)(object)val2.targetTexture != (Object)null) { val2.targetTexture = null; } } if ((Object)(object)gen.LevelParent != (Object)null) { val.transform.parent = gen.LevelParent.transform; } if ((Object)(object)music != (Object)null) { GameObject val3 = new GameObject("MainMenuMusic_Swap"); val3.transform.SetParent(val.transform, false); AudioSource obj = val3.AddComponent(); obj.clip = music; obj.loop = true; obj.playOnAwake = true; obj.spatialBlend = 0f; obj.volume = 1f; obj.priority = 128; obj.Play(); } yield return null; if (WaitingFlag != null) { WaitingFlag.SetValue(gen, false); } } private static void DisableGameMenuMusic() { //IL_020b: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) int num = 0; int num2 = 0; int num3 = 0; try { AudioSource[] array = Object.FindObjectsOfType(true); foreach (AudioSource val in array) { AudioClip val2 = (((Object)(object)val != (Object)null) ? val.clip : null); if ((Object)(object)val2 != (Object)null && StringEquals(((Object)val2).name, "msc main menu")) { try { val.Stop(); val.mute = true; val.loop = false; val.clip = null; num++; } catch { } } } } catch { } try { AudioClip[] array2 = Resources.FindObjectsOfTypeAll(); foreach (AudioClip val3 in array2) { if ((Object)(object)val3 != (Object)null && StringEquals(((Object)val3).name, "msc main menu")) { try { Resources.UnloadAsset((Object)(object)val3); num2++; } catch (Exception ex) { Debug.LogWarning((object)("[Empress Prop Hunt Menu] Couldn't UnloadAsset for 'msc main menu': " + ex.Message)); } } } } catch { } try { ScriptableObject[] array3 = Resources.FindObjectsOfTypeAll(); foreach (ScriptableObject val4 in array3) { if ((Object)(object)val4 == (Object)null || !StringEquals(((Object)val4).name, "Constant Music - Main Menu")) { continue; } Type type = ((object)val4).GetType(); bool flag = false; PropertyInfo propertyInfo = FindPropertyQuiet(type, "clip"); if (propertyInfo != null && typeof(AudioClip).IsAssignableFrom(propertyInfo.PropertyType)) { try { propertyInfo.SetValue(val4, null); flag = true; } catch { } } FieldInfo fieldInfo = FindFieldQuiet(type, "clip"); if (!flag && fieldInfo != null && typeof(AudioClip).IsAssignableFrom(fieldInfo.FieldType)) { try { fieldInfo.SetValue(val4, null); flag = true; } catch { } } FieldInfo fieldInfo2 = FindFieldQuiet(type, "music"); if (!flag && fieldInfo2 != null && typeof(AudioClip).IsAssignableFrom(fieldInfo2.FieldType)) { try { fieldInfo2.SetValue(val4, null); flag = true; } catch { } } if (flag) { ((Object)val4).hideFlags = (HideFlags)(((Object)val4).hideFlags | 0x37); num3++; } } } catch { } Debug.Log((object)string.Format("[Empress Prop Hunt Menu] Stopped {0} source(s), unloaded {1} clip(s), updated {2} SO(s) for '{3}'.", num, num2, num3, "msc main menu")); } private static bool EnsureAssetsLoaded() { if (_attemptedLoad) { return (Object)(object)_cachedPrefab != (Object)null; } _attemptedLoad = true; try { string text = FindBundlePath(Paths.PluginPath, "omnilikeag6", "Empress-PropHunt"); if (text == null) { Debug.LogError((object)"[Empress Prop Hunt Menu] Could not find asset bundle starting with 'omnilikeag6' under plugins."); return false; } _bundle = AssetBundle.LoadFromFile(text); if ((Object)(object)_bundle == (Object)null) { Debug.LogError((object)("[Empress Prop Hunt Menu] Failed to load AssetBundle at: " + text)); return false; } _cachedPrefab = _bundle.LoadAsset("Start Room - Main Menu"); if ((Object)(object)_cachedPrefab == (Object)null) { Debug.LogError((object)("[Empress Prop Hunt Menu] Prefab 'Start Room - Main Menu' not found in bundle: " + text)); return false; } Debug.Log((object)("[Empress Prop Hunt Menu] Loaded 'Start Room - Main Menu' from: " + text)); _cachedMusic = TryLoadMusicClip(_bundle, "Constant Music - Main Menu"); if ((Object)(object)_cachedMusic != (Object)null) { Debug.Log((object)"[Empress Prop Hunt Menu] Loaded music 'Constant Music - Main Menu'."); } else { Debug.LogWarning((object)"[Empress Prop Hunt Menu] Music asset 'Constant Music - Main Menu' not found or not an AudioClip."); } } catch (Exception arg) { Debug.LogError((object)$"[Empress Prop Hunt Menu] Exception loading assets: {arg}"); return false; } return true; } private static AudioClip TryLoadMusicClip(AssetBundle bundle, string name) { AudioClip val = bundle.LoadAsset(name); if ((Object)(object)val != (Object)null) { return val; } Object val2 = bundle.LoadAsset(name); if (val2 == (Object)null) { return null; } Type type = ((object)val2).GetType(); PropertyInfo propertyInfo = FindPropertyQuiet(type, "clip"); if (propertyInfo != null && typeof(AudioClip).IsAssignableFrom(propertyInfo.PropertyType)) { try { object? value = propertyInfo.GetValue(val2); return (AudioClip)((value is AudioClip) ? value : null); } catch { } } FieldInfo fieldInfo = FindFieldQuiet(type, "clip"); if (fieldInfo != null && typeof(AudioClip).IsAssignableFrom(fieldInfo.FieldType)) { try { object? value2 = fieldInfo.GetValue(val2); return (AudioClip)((value2 is AudioClip) ? value2 : null); } catch { } } return null; } private static string FindBundlePath(string pluginsRoot, string stem, string preferredFolder) { if (string.IsNullOrEmpty(pluginsRoot) || !Directory.Exists(pluginsRoot)) { Debug.LogError((object)("[Empress Prop Hunt Menu] Plugins folder not found: '" + pluginsRoot + "'")); return null; } List list = (from p in Directory.EnumerateFiles(pluginsRoot, "*", SearchOption.AllDirectories) where Path.GetFileName(p)?.StartsWith(stem, StringComparison.OrdinalIgnoreCase) ?? false select p).ToList(); if (list.Count == 0) { return null; } return Pick(list.ToArray()); string Pick(string[] arr) { return (from p in arr orderby p.Split(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar).Any((string seg) => seg.Equals(preferredFolder, StringComparison.OrdinalIgnoreCase)) descending, p.Count((char ch) => ch == Path.DirectorySeparatorChar || ch == Path.AltDirectorySeparatorChar), Path.GetFileName(p).Length select p).First(); } } private static PropertyInfo FindPropertyQuiet(Type type, string name) { Type type2 = type; while (type2 != null) { PropertyInfo propertyInfo = AccessTools.GetDeclaredProperties(type2).FirstOrDefault((PropertyInfo p) => p.Name == name); if (propertyInfo != null) { return propertyInfo; } type2 = type2.BaseType; } return null; } private static FieldInfo FindFieldQuiet(Type type, string name) { Type type2 = type; while (type2 != null) { FieldInfo fieldInfo = AccessTools.GetDeclaredFields(type2).FirstOrDefault((FieldInfo f) => f.Name == name); if (fieldInfo != null) { return fieldInfo; } type2 = type2.BaseType; } return null; } private static bool StringEquals(string a, string b) { return string.Equals(a?.Trim(), b?.Trim(), StringComparison.OrdinalIgnoreCase); } } [HarmonyPatch(typeof(LevelGenerator), "EnemySetup")] internal static class EmpressPropHuntEnemySetupPatch { private static bool Prefix(LevelGenerator __instance, ref IEnumerator __result) { if (PropHuntPlugin.CfgDisableEnemies == null || !PropHuntPlugin.CfgDisableEnemies.Value) { return true; } __result = SkipEnemySetup(__instance); return false; } private static IEnumerator SkipEnemySetup(LevelGenerator levelGenerator) { GameAccess.SetEnemyGenerationSkipped(levelGenerator); yield return null; } } [HarmonyPatch(typeof(ValuableDirector), "Awake")] internal static class EmpressPropHuntValuableDirectorPatch { private static void Postfix(ValuableDirector __instance) { if (PropHuntPlugin.CfgMaxOutValuables != null && PropHuntPlugin.CfgMaxOutValuables.Value) { GameAccess.SetValuableDebugAll(__instance); } } } }