Decompiled source of PropHunt v1.2.5
PropHunt.dll
Decompiled 2 weeks ago
The result has been truncated due to the large size, download it to view full contents!
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.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Omniscye")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("PropHunt")] [assembly: AssemblyTitle("PropHunt")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } [HarmonyPatch(typeof(WorldSpaceUIPlayerName), "Update")] public class Patch_HidePlayerNames { private static bool Prefix(WorldSpaceUIPlayerName __instance) { //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_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0036: 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_0047: 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; } } [BepInPlugin("omni.repo.harmony.mainmenu.swap", "MainMenu Prefab+Music Swap", "1.1.1")] public class MainMenuPrefabSwapPlugin : BaseUnityPlugin { private void Awake() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown Harmony val = new Harmony("omni.repo.harmony.mainmenu.swap"); val.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"MainMenu Prefab+Music Swap loaded"); } } [HarmonyPatch(typeof(LevelGenerator), "StartRoomGeneration")] public static class Patch_LevelGenerator_StartRoomGeneration { [CompilerGenerated] private sealed class <ReplacementCoroutine>d__13 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public LevelGenerator gen; public GameObject customPrefab; public AudioClip music; private GameObject <go>5__1; private Camera[] <>s__2; private int <>s__3; private Camera <cam>5__4; private GameObject <musicGO>5__5; private AudioSource <audio>5__6; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ReplacementCoroutine>d__13(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <go>5__1 = null; <>s__2 = null; <cam>5__4 = null; <musicGO>5__5 = null; <audio>5__6 = null; <>1__state = -2; } private bool MoveNext() { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; if (WaitingFlag != null) { WaitingFlag.SetValue(gen, true); } gen.State = (LevelState)3; YeetGamesMenuMusic(); <go>5__1 = Object.Instantiate<GameObject>(customPrefab, Vector3.zero, Quaternion.identity); <>s__2 = <go>5__1.GetComponentsInChildren<Camera>(true); for (<>s__3 = 0; <>s__3 < <>s__2.Length; <>s__3++) { <cam>5__4 = <>s__2[<>s__3]; if ((Object)(object)<cam>5__4 != (Object)null && (Object)(object)<cam>5__4.targetTexture != (Object)null) { <cam>5__4.targetTexture = null; } <cam>5__4 = null; } <>s__2 = null; if ((Object)(object)gen.LevelParent != (Object)null) { <go>5__1.transform.parent = gen.LevelParent.transform; } if ((Object)(object)music != (Object)null) { <musicGO>5__5 = new GameObject("MainMenuMusic_Swap"); <musicGO>5__5.transform.SetParent(<go>5__1.transform, false); <audio>5__6 = <musicGO>5__5.AddComponent<AudioSource>(); <audio>5__6.clip = music; <audio>5__6.loop = true; <audio>5__6.playOnAwake = true; <audio>5__6.spatialBlend = 0f; <audio>5__6.volume = 1f; <audio>5__6.priority = 128; <audio>5__6.Play(); <musicGO>5__5 = null; <audio>5__6 = null; } <>2__current = null; <>1__state = 1; return true; case 1: <>1__state = -1; if (WaitingFlag != null) { WaitingFlag.SetValue(gen, false); } return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private const string BundleStem = "omnilikeag6"; private const string PreferredFolder = "Omniscye-SemiBotMenu"; 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; return (Object)(object)instance != (Object)null && (Object)(object)instance.levelCurrent == (Object)(object)instance.levelMainMenu; } private static bool Prefix(LevelGenerator __instance, ref IEnumerator __result) { if (!InMainMenu()) { return true; } if (!EnsureAssetsLoaded()) { return true; } __result = ReplacementCoroutine(__instance, _cachedPrefab, _cachedMusic); return false; } [IteratorStateMachine(typeof(<ReplacementCoroutine>d__13))] private static IEnumerator ReplacementCoroutine(LevelGenerator gen, GameObject customPrefab, AudioClip music) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ReplacementCoroutine>d__13(0) { gen = gen, customPrefab = customPrefab, music = music }; } private static void YeetGamesMenuMusic() { //IL_0291: Unknown result type (might be due to invalid IL or missing references) //IL_0298: 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<AudioSource>(true); AudioSource[] array2 = array; foreach (AudioSource val in array2) { 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[] array3 = Resources.FindObjectsOfTypeAll<AudioClip>(); AudioClip[] array4 = array3; foreach (AudioClip val3 in array4) { 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)("[MainMenuSwap] Couldn't UnloadAsset for 'msc main menu': " + ex.Message)); } } } } catch { } try { ScriptableObject[] array5 = Resources.FindObjectsOfTypeAll<ScriptableObject>(); ScriptableObject[] array6 = array5; foreach (ScriptableObject val4 in array6) { if ((Object)(object)val4 == (Object)null || !StringEquals(((Object)val4).name, "Constant Music - Main Menu")) { continue; } Type type = ((object)val4).GetType(); bool flag = false; PropertyInfo property = type.GetProperty("clip", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (property != null && typeof(AudioClip).IsAssignableFrom(property.PropertyType)) { try { property.SetValue(val4, null); flag = true; } catch { } } FieldInfo field = type.GetField("clip", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (!flag && field != null && typeof(AudioClip).IsAssignableFrom(field.FieldType)) { try { field.SetValue(val4, null); flag = true; } catch { } } FieldInfo field2 = type.GetField("music", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (!flag && field2 != null && typeof(AudioClip).IsAssignableFrom(field2.FieldType)) { try { field2.SetValue(val4, null); flag = true; } catch { } } if (flag) { ((Object)val4).hideFlags = (HideFlags)(((Object)val4).hideFlags | 0x37); num3++; } } } catch { } Debug.Log((object)string.Format("[MainMenuSwap] Stopped {0} source(s), unloaded {1} clip(s), neutered {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", "Omniscye-SemiBotMenu"); if (text == null) { Debug.LogError((object)"[MainMenuSwap] Could not find asset bundle starting with 'omnilikeag6' under plugins (searched recursively)."); return false; } _bundle = AssetBundle.LoadFromFile(text); if ((Object)(object)_bundle == (Object)null) { Debug.LogError((object)("[MainMenuSwap] Failed to load AssetBundle at: " + text)); return false; } _cachedPrefab = _bundle.LoadAsset<GameObject>("Start Room - Main Menu"); if ((Object)(object)_cachedPrefab == (Object)null) { Debug.LogError((object)("[MainMenuSwap] Prefab 'Start Room - Main Menu' not found in bundle: " + text)); return false; } Debug.Log((object)("[MainMenuSwap] Loaded 'Start Room - Main Menu' from: " + text)); _cachedMusic = TryLoadMusicClip(_bundle, "Constant Music - Main Menu"); if ((Object)(object)_cachedMusic != (Object)null) { Debug.Log((object)"[MainMenuSwap] Loaded music 'Constant Music - Main Menu'."); } else { Debug.LogWarning((object)"[MainMenuSwap] Music asset 'Constant Music - Main Menu' not found or not an AudioClip; continuing without music swap."); } } catch (Exception arg) { Debug.LogError((object)$"[MainMenuSwap] Exception loading assets: {arg}"); return false; } return true; } private static AudioClip TryLoadMusicClip(AssetBundle bundle, string name) { AudioClip val = bundle.LoadAsset<AudioClip>(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 property = type.GetProperty("clip", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (property != null && typeof(AudioClip).IsAssignableFrom(property.PropertyType)) { try { object? value = property.GetValue(val2); return (AudioClip)((value is AudioClip) ? value : null); } catch { } } FieldInfo field = type.GetField("clip", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null && typeof(AudioClip).IsAssignableFrom(field.FieldType)) { try { object? value2 = field.GetValue(val2); return (AudioClip)((value2 is AudioClip) ? value2 : null); } catch { } } return null; } private static string FindBundlePath(string pluginsRoot, string stem, string preferredFolder) { string stem2 = stem; string preferredFolder2 = preferredFolder; if (string.IsNullOrEmpty(pluginsRoot) || !Directory.Exists(pluginsRoot)) { Debug.LogError((object)("[MainMenuSwap] Plugins folder not found: '" + pluginsRoot + "'")); return null; } List<string> list = (from p in Directory.EnumerateFiles(pluginsRoot, "*", SearchOption.AllDirectories) where Path.GetFileName(p)?.StartsWith(stem2, 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(preferredFolder2, StringComparison.OrdinalIgnoreCase)) descending, p.Count((char ch) => ch == Path.DirectorySeparatorChar || ch == Path.AltDirectorySeparatorChar), Path.GetFileName(p).Length select p).First(); } } private static bool StringEquals(string a, string b) { return string.Equals(a?.Trim(), b?.Trim(), StringComparison.OrdinalIgnoreCase); } } namespace RepoMods.PropHunt { [BepInPlugin("omni.repo.prophunt", "Prop Hunt Gamemode", "1.8.8")] public class PropHuntPlugin : BaseUnityPlugin { [CompilerGenerated] private sealed class <LevelWatcher>d__14 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public PropHuntPlugin <>4__this; private bool <playersReady>5__1; private bool <mainState>5__2; private GameObject <go>5__3; private PropHuntManager <mgr>5__4; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LevelWatcher>d__14(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <go>5__3 = null; <mgr>5__4 = null; <>1__state = -2; } private bool MoveNext() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Invalid comparison between Unknown and I4 //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Expected O, but got Unknown //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_01f4: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_0209: Unknown result type (might be due to invalid IL or missing references) //IL_020e: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; if (SemiFunc.IsMultiplayer() && PhotonNetwork.InRoom && !SemiFunc.MenuLevel() && !((Object)(object)LevelGenerator.Instance == (Object)null) && !((Object)(object)GameDirector.instance == (Object)null)) { <playersReady>5__1 = GameDirector.instance.PlayerList != null && GameDirector.instance.PlayerList.Count > 0; <mainState>5__2 = (int)GameDirector.instance.currentState == 2; if ((<playersReady>5__1 & <mainState>5__2) && (Object)(object)PropHuntManager.Instance == (Object)null) { <go>5__3 = new GameObject("PropHuntManager"); <mgr>5__4 = <go>5__3.AddComponent<PropHuntManager>(); <mgr>5__4.PreHideSeconds = Mathf.Max(1f, CfgPreHideSeconds.Value); <mgr>5__4.HunterLockSeconds = Mathf.Max(0f, CfgHunterLockSeconds.Value); <mgr>5__4.RoundSeconds = Mathf.Max(5f, CfgRoundSeconds.Value); <mgr>5__4.MissPenaltyHP = Mathf.Max(0, CfgMissPenaltyHP.Value); <mgr>5__4.GunRangeMeters = Mathf.Max(1f, CfgGunRangeMeters.Value); <mgr>5__4.GunCooldownSeconds = Mathf.Max(0f, CfgGunCooldownSeconds.Value); <mgr>5__4.KeyHiderToggle = CfgKeyDisguiseToggle.Value; <mgr>5__4.KeyDisguiseViewToggle = CfgKeyViewToggle.Value; <mgr>5__4.KeyLockToggle = CfgKeyLockToggle.Value; Log.LogInfo((object)"[PropHunt] Manager created (with config)."); <go>5__3 = null; <mgr>5__4 = null; } } break; } <>2__current = (object)new WaitForSeconds(0.5f); <>1__state = 1; return true; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } internal static ManualLogSource Log; internal static Harmony Harmony; internal static ConfigEntry<float> CfgPreHideSeconds; internal static ConfigEntry<float> CfgHunterLockSeconds; internal static ConfigEntry<float> CfgRoundSeconds; internal static ConfigEntry<int> CfgMissPenaltyHP; internal static ConfigEntry<float> CfgGunRangeMeters; internal static ConfigEntry<float> CfgGunCooldownSeconds; internal static ConfigEntry<KeyCode> CfgKeyDisguiseToggle; internal static ConfigEntry<KeyCode> CfgKeyViewToggle; internal static ConfigEntry<KeyCode> CfgKeyLockToggle; private void Awake() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; Harmony = new Harmony("omni.repo.prophunt"); CfgPreHideSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Gameplay", "PreHideSeconds", 30f, "Seconds of hide time before the round starts."); CfgHunterLockSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Gameplay", "HunterLockSeconds", 30f, "Seconds the Hunter is locked during pre-hide."); CfgRoundSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Gameplay", "RoundSeconds", 300f, "Live round duration in seconds."); CfgMissPenaltyHP = ((BaseUnityPlugin)this).Config.Bind<int>("Hunter", "MissPenaltyHP", 5, "HP the Hunter loses on a missed scan."); CfgGunRangeMeters = ((BaseUnityPlugin)this).Config.Bind<float>("Hunter", "GunRangeMeters", 60f, "Hunter scan ray range in meters."); CfgGunCooldownSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Hunter", "GunCooldownSeconds", 0.18f, "Hunter scan cooldown in seconds."); CfgKeyDisguiseToggle = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "HiderDisguiseKey", (KeyCode)118, "Hider: toggle disguise."); CfgKeyViewToggle = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "HiderViewToggleKey", (KeyCode)99, "Hider: toggle first/third person."); CfgKeyLockToggle = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "HiderLockKey", (KeyCode)308, "Hider: lock rotation/position."); Harmony.PatchAll(); Object.DontDestroyOnLoad((Object)(object)this); SceneManager.sceneLoaded += OnSceneLoaded; ((MonoBehaviour)this).StartCoroutine(LevelWatcher()); Log.LogInfo((object)"[PropHunt] Loaded v1.8.8."); } private void OnDestroy() { SceneManager.sceneLoaded -= OnSceneLoaded; try { Harmony.UnpatchSelf(); } catch { } } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { } [IteratorStateMachine(typeof(<LevelWatcher>d__14))] private IEnumerator LevelWatcher() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LevelWatcher>d__14(0) { <>4__this = this }; } } 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); } } } public class PropHuntManager : MonoBehaviourPunCallbacks, IOnEventCallback { [CompilerGenerated] private sealed class <ApplyDisguiseForPlayerWhenReady>d__63 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public Player p; public PropHuntManager <>4__this; private float <t>5__1; private PlayerAvatar <av>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ApplyDisguiseForPlayerWhenReady>d__63(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <av>5__2 = null; <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <t>5__1 = 3f; break; case 1: <>1__state = -1; <av>5__2 = null; break; } if (<t>5__1 > 0f) { <av>5__2 = <>4__this.FindAvatarByActor(p.ActorNumber); if ((Object)(object)<av>5__2 != (Object)null) { <>4__this.ApplyOnePlayerDisguise(p, <av>5__2); return false; } <t>5__1 -= Time.deltaTime; <>2__current = null; <>1__state = 1; return true; } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <ArmPreHideWhenGameplayReady>d__53 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public PropHuntManager <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ArmPreHideWhenGameplayReady>d__53(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Invalid comparison between Unknown and I4 //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; goto IL_004d; case 1: <>1__state = -1; goto IL_004d; case 2: <>1__state = -1; goto IL_008a; case 3: { <>1__state = -1; <>4__this._preHideArmed = true; <>4__this._preHideUntil = Time.time + Mathf.Max(1f, <>4__this.PreHideSeconds); if (<>4__this._localRole == PHRole.Hunter) { <>4__this._hunterLockUntil = Time.time + Mathf.Max(1f, <>4__this.HunterLockSeconds); <>4__this.Flash($"Hunter locked for {Mathf.CeilToInt(<>4__this.HunterLockSeconds)}s."); } if (PhotonNetwork.IsMasterClient) { ((MonoBehaviour)<>4__this).StartCoroutine(<>4__this.HostHealPassesDuringAndAfterPrehide()); } return false; } IL_004d: if ((Object)(object)GameDirector.instance == (Object)null || (int)GameDirector.instance.currentState != 2) { <>2__current = null; <>1__state = 1; return true; } goto IL_008a; IL_008a: if (GameDirector.instance.PlayerList == null || GameDirector.instance.PlayerList.Count == 0) { <>2__current = null; <>1__state = 2; return true; } <>2__current = (object)new WaitForSeconds(0.25f); <>1__state = 3; return true; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <HUDBurst>d__70 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public PropHuntManager <>4__this; private float <t>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <HUDBurst>d__70(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <t>5__1 = 1.5f; break; case 1: <>1__state = -1; break; } if (<t>5__1 > 0f) { <t>5__1 -= Time.deltaTime; <>2__current = null; <>1__state = 1; return true; } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <HostHealPassesDuringAndAfterPrehide>d__54 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public PropHuntManager <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <HostHealPassesDuringAndAfterPrehide>d__54(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Expected O, but got Unknown //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>4__this.HostTopOffAll(); <>2__current = (object)new WaitForSeconds(Mathf.Max(0.25f, <>4__this.PreHideSeconds * 0.5f)); <>1__state = 1; return true; case 1: <>1__state = -1; <>4__this.HostTopOffAll(); goto IL_009b; case 2: <>1__state = -1; goto IL_009b; case 3: { <>1__state = -1; <>4__this.HostTopOffAll(); return false; } IL_009b: if (<>4__this.PreHideActive) { <>2__current = null; <>1__state = 2; return true; } <>4__this.HostTopOffAll(); <>2__current = (object)new WaitForSeconds(0.75f); <>1__state = 3; return true; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <HostHealPlayerWhenReady>d__56 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public int actorNumber; public PropHuntManager <>4__this; private float <t>5__1; private PlayerAvatar <av>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <HostHealPlayerWhenReady>d__56(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <av>5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; if (!PhotonNetwork.IsMasterClient) { return false; } <t>5__1 = 4f; break; case 1: <>1__state = -1; try { <av>5__2.playerHealth.HealOther(<av>5__2.playerHealth.maxHealth, true); } catch { } return false; case 2: <>1__state = -1; <av>5__2 = null; break; } if (<t>5__1 > 0f) { <av>5__2 = <>4__this.FindAvatarByActor(actorNumber); if ((Object)(object)<av>5__2 != (Object)null && (Object)(object)<av>5__2.playerHealth != (Object)null) { try { <av>5__2.playerHealth.HealOther(<av>5__2.playerHealth.maxHealth, true); } catch { } <>2__current = (object)new WaitForSeconds(0.5f); <>1__state = 1; return true; } <t>5__1 -= Time.deltaTime; <>2__current = null; <>1__state = 2; return true; } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private 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_PropLocked"; private const byte EVT_KILL = 101; private const byte EVT_PLAYERDOWN = 102; private const byte EVT_MATCHEND = 103; private const byte EVT_SCENERELOAD = 104; private const string EVT_TAG = "PH1"; public KeyCode KeyHiderToggle = (KeyCode)118; public KeyCode KeyDisguiseViewToggle = (KeyCode)99; public KeyCode KeyLockToggle = (KeyCode)308; public float HunterLockSeconds = 30f; public float PreHideSeconds = 30f; public float RoundSeconds = 300f; public int MissPenaltyHP = 10; public float GunRangeMeters = 60f; public float GunCooldownSeconds = 0.18f; private double _roundEndRealtime; private bool _roundArmed; private bool _hudShown; private PHRole _localRole = PHRole.None; private int _hunterActor = -1; private HunterGunController _gun; private readonly HashSet<int> _deadActors = new HashSet<int>(); private bool _ending; private float _endUntil; private string _endMsg = ""; private PHWinner _whoWon = PHWinner.None; private float _hunterLockUntil = 0f; internal const float TINY_FACTOR = 0.0001f; private int _cachedPropPhotonViewId = 0; private float _preHideUntil = 0f; private bool _preHideArmed = false; private string _flashMsg = ""; private float _flashMsgUntil = 0f; public static PropHuntManager Instance { get; private set; } public bool IsHunterLocked => _localRole == PHRole.Hunter && Time.time < _hunterLockUntil; private bool PreHideActive => _preHideArmed && Time.time < _preHideUntil; public bool IsMainState => (Object)(object)GameDirector.instance != (Object)null && (int)GameDirector.instance.currentState == 2; public bool PreHidePhaseActive => PreHideActive; public bool RoundIsLive => _roundArmed && (double)Time.time < _roundEndRealtime; private void Awake() { Instance = this; Object.DontDestroyOnLoad((Object)(object)this); } 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_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Expected O, but got Unknown //IL_0075: 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) { TryDestroySelf("scene changed to menu/lobby"); return; } try { Hashtable val = new Hashtable(); ((Dictionary<object, object>)val).Add((object)"PH_PropVID", (object)0); ((Dictionary<object, object>)val).Add((object)"PH_PropLocked", (object)false); Hashtable val2 = val; Player localPlayer = PhotonNetwork.LocalPlayer; if (localPlayer != null) { localPlayer.SetCustomProperties(val2, (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_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Expected O, but got Unknown //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Expected O, but got Unknown //IL_00c1: Expected O, but got Unknown if (PhotonNetwork.IsMasterClient) { Hashtable customProperties = ((RoomInfo)PhotonNetwork.CurrentRoom).CustomProperties; if (!((Dictionary<object, object>)(object)customProperties).ContainsKey((object)"PH_Active")) { List<Player> 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<object, object>)val2).Add((object)"PH_Active", (object)1); ((Dictionary<object, object>)val2).Add((object)"PH_Hunter", (object)val.ActorNumber); currentRoom.SetCustomProperties(val2, (Hashtable)null, (WebFlags)null); PropHuntPlugin.Log.LogInfo((object)$"[PropHunt] 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()); } } [IteratorStateMachine(typeof(<ArmPreHideWhenGameplayReady>d__53))] private IEnumerator ArmPreHideWhenGameplayReady() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ArmPreHideWhenGameplayReady>d__53(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<HostHealPassesDuringAndAfterPrehide>d__54))] private IEnumerator HostHealPassesDuringAndAfterPrehide() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <HostHealPassesDuringAndAfterPrehide>d__54(0) { <>4__this = this }; } private void HostTopOffAll() { try { List<PlayerAvatar> list = GameDirector.instance?.PlayerList; if (list == null || list.Count == 0) { return; } foreach (PlayerAvatar item in list) { if ((Object)(object)item == (Object)null || (Object)(object)item.playerHealth == (Object)null) { continue; } try { item.playerHealth.HealOther(item.playerHealth.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, $"[PropHunt] Heal failed for actor {num.GetValueOrDefault(-1)}: {ex.Message}"); } } } catch (Exception ex2) { LogGate.WarnThrottled(PropHuntPlugin.Log, "[PropHunt] HostTopOffAll guarded: " + ex2.Message); } } [IteratorStateMachine(typeof(<HostHealPlayerWhenReady>d__56))] private IEnumerator HostHealPlayerWhenReady(int actorNumber) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <HostHealPlayerWhenReady>d__56(0) { <>4__this = this, actorNumber = actorNumber }; } private void HardResetUI(bool clearRole) { _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; if (clearRole) { _localRole = PHRole.None; } _cachedPropPhotonViewId = 0; } private void TryDestroySelf(string why) { try { if ((Object)(object)Instance == (Object)(object)this) { Instance = null; } Object.Destroy((Object)(object)((Component)this).gameObject); PropHuntPlugin.Log.LogInfo((object)("[PropHunt] Manager destroyed (" + why + ").")); } catch { } } public override void OnLeftRoom() { HardResetUI(clearRole: true); TryDestroySelf("left room"); } public override void OnDisconnected(DisconnectCause cause) { HardResetUI(clearRole: true); TryDestroySelf("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)); } [IteratorStateMachine(typeof(<ApplyDisguiseForPlayerWhenReady>d__63))] private IEnumerator ApplyDisguiseForPlayerWhenReady(Player p) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ApplyDisguiseForPlayerWhenReady>d__63(0) { <>4__this = this, p = p }; } private void Update() { //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Unknown result type (might be due to invalid IL or missing references) //IL_0248: Unknown result type (might be due to invalid IL or missing references) //IL_024d: Unknown result type (might be due to invalid IL or missing references) //IL_025f: Expected O, but got Unknown //IL_0267: Expected O, but got Unknown if (SemiFunc.MenuLevel() || (Object)(object)LevelGenerator.Instance == (Object)null || (Object)(object)GameDirector.instance == (Object)null || !PhotonNetwork.InRoom || _localRole == PHRole.None) { return; } 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<PropDisguiseController>(); if ((Object)(object)component == (Object)null || !component.IsDisguised) { UpdateCachedTargetFromPhysGrab(); } if (Input.GetKeyDown(KeyHiderToggle)) { ToggleDisguise(val); } if (Input.GetKeyDown(KeyDisguiseViewToggle) && (Object)(object)component != (Object)null && component.IsDisguised) { bool flag = component.ToggleDisguiseView(); Flash(flag ? "View: third-person" : "View: first-person"); } if (Input.GetKeyDown(KeyLockToggle) && (Object)(object)component != (Object)null && component.IsDisguised) { bool flag2 = !component.IsLocked; component.SetLockedLocal(flag2); Player localPlayer = PhotonNetwork.LocalPlayer; Hashtable val2 = new Hashtable(); ((Dictionary<object, object>)val2).Add((object)"PH_PropLocked", (object)flag2); localPlayer.SetCustomProperties(val2, (Hashtable)null, (WebFlags)null); Flash(flag2 ? "Position LOCKED" : "Position UNLOCKED"); } if (!((Object)(object)component != (Object)null) || !component.IsLocked) { return; } try { PlayerController instance = PlayerController.instance; if ((Object)(object)instance != (Object)null) { instance.InputDisable(0.1f); instance.OverrideSpeed(0f, 0.1f); } return; } catch { return; } } if (_localRole != PHRole.Hunter) { return; } if ((Object)(object)_gun == (Object)null) { _gun = ((Component)val).gameObject.GetComponent<HunterGunController>() ?? ((Component)val).gameObject.AddComponent<HunterGunController>(); } _gun.Manager = this; if (!IsHunterLocked) { return; } try { PlayerController instance2 = PlayerController.instance; if ((Object)(object)instance2 != (Object)null) { instance2.OverrideSpeed(0f, 0.2f); } } catch { } } private void BroadcastMatchEnd(PHWinner winner, string reason) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: 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_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003f: 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_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Expected O, but got Unknown //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Expected O, but got Unknown //IL_00e5: Expected O, but got Unknown if (!PhotonNetwork.IsMasterClient || !PhotonNetwork.InRoom) { return; } List<Player> list = PhotonNetwork.PlayerList.Where((Player p) => !p.IsInactive).ToList(); if (list.Count != 0) { List<Player> 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<object, object>)val).Add((object)"PH_Active", (object)1); ((Dictionary<object, object>)val).Add((object)"PH_Hunter", (object)actorNumber); currentRoom.SetCustomProperties(val, (Hashtable)null, (WebFlags)null); PropHuntPlugin.Log.LogInfo((object)$"[PropHunt] Next-round hunter: {actorNumber} (was {_hunterActor})."); } } private void SafeAdvanceScene() { //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Expected O, but got Unknown if (!PhotonNetwork.IsMasterClient) { return; } RepickHunterForNextRound(); if ((Object)(object)RunManager.instance != (Object)null && RunManager.instance.levels != null && RunManager.instance.levels.Count > 0) { List<Level> list = RunManager.instance.levels.Where((Level l) => (Object)(object)l != (Object)(object)RunManager.instance.levelCurrent).ToList(); if (list.Count == 0) { list = RunManager.instance.levels; } Level val = list[Random.Range(0, list.Count)]; RunManager.instance.levelCurrent = val; if ((Object)(object)RunManager.instance.runManagerPUN != (Object)null && (Object)(object)RunManager.instance.runManagerPUN.photonView != (Object)null) { RunManager.instance.runManagerPUN.photonView.RPC("UpdateLevelRPC", (RpcTarget)4, new object[3] { ((Object)val).name, RunManager.instance.levelsCompleted, false }); } PropHuntPlugin.Log.LogInfo((object)("[PropHunt] Selected next level: " + ((Object)val).name)); } Scene activeScene = SceneManager.GetActiveScene(); string name = ((Scene)(ref activeScene)).name; object[] array = new object[2] { "PH1", name }; PhotonNetwork.RaiseEvent((byte)104, (object)array, new RaiseEventOptions { Receivers = (ReceiverGroup)1 }, SendOptions.SendReliable); } 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 { } } [IteratorStateMachine(typeof(<HUDBurst>d__70))] private IEnumerator HUDBurst() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <HUDBurst>d__70(0) { <>4__this = this }; } private void OnGUI() { //IL_007b: 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_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_01e7: Unknown result type (might be due to invalid IL or missing references) //IL_0261: Unknown result type (might be due to invalid IL or missing references) //IL_037c: Unknown result type (might be due to invalid IL or missing references) //IL_0331: Unknown result type (might be due to invalid IL or missing references) //IL_0402: Unknown result type (might be due to invalid IL or missing references) //IL_040d: Unknown result type (might be due to invalid IL or missing references) //IL_041a: Unknown result type (might be due to invalid IL or missing references) //IL_042f: Unknown result type (might be due to invalid IL or missing references) //IL_0434: Unknown result type (might be due to invalid IL or missing references) //IL_043c: Unknown result type (might be due to invalid IL or missing references) //IL_0444: Unknown result type (might be due to invalid IL or missing references) //IL_046b: Unknown result type (might be due to invalid IL or missing references) //IL_0475: Expected O, but got Unknown //IL_047c: Unknown result type (might be due to invalid IL or missing references) //IL_04a3: Unknown result type (might be due to invalid IL or missing references) //IL_04c0: Unknown result type (might be due to invalid IL or missing references) //IL_04c5: Unknown result type (might be due to invalid IL or missing references) //IL_04cd: Unknown result type (might be due to invalid IL or missing references) //IL_04f4: Unknown result type (might be due to invalid IL or missing references) //IL_04fe: Expected O, but got Unknown //IL_0519: Unknown result type (might be due to invalid IL or missing references) //IL_0546: 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) ? $"PROP HUNT — HUNTER\nRMB: Scan (line-of-sight) | Miss: -{MissPenaltyHP} HP" : $"PROP HUNT — HIDER\n{KeyHiderToggle}: Toggle disguise (PhysGrab target) | {KeyDisguiseViewToggle}: Toggle view (local) | {KeyLockToggle}: 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"); PlayerAvatar val2 = FindLocalAvatar(); if ((Object)(object)val2 != (Object)null) { PropDisguiseController component = ((Component)val2).GetComponent<PropDisguiseController>(); if ((Object)(object)component != (Object)null && component.IsLocked) { text2 += " [LOCKED]"; } } GUI.Label(new Rect(((Rect)(ref val)).x + 8f, num, ((Rect)(ref val)).width, 24f), "Disguise: " + text2); 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 val3 = default(Rect); ((Rect)(ref val3))..ctor(0f, 0f, (float)Screen.width, (float)Screen.height); GUI.color = new Color(0f, 0f, 0f, 0.55f); GUI.DrawTexture(val3, (Texture)(object)Texture2D.whiteTexture); GUI.color = Color.white; GUIStyle val4 = 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 }; val4.normal.textColor = Color.white; GUI.Label(new Rect(0f, (float)Screen.height * 0.35f, (float)Screen.width, 80f), _endMsg, val4); GUIStyle val5 = new GUIStyle(GUI.skin.label) { alignment = (TextAnchor)4, fontSize = Mathf.RoundToInt(Mathf.Clamp((float)Screen.width * 0.03f, 18f, 36f)), wordWrap = false }; val5.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, val5); } } private 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, object>)(object)changedProps).ContainsKey((object)"PH_PropVID") && TryToInt(changedProps[(object)"PH_PropVID"], out var val)) { PlayerAvatar val2 = FindAvatarByActor(targetPlayer.ActorNumber); if ((Object)(object)val2 != (Object)null) { PropDisguiseController propDisguiseController = ((Component)val2).GetComponent<PropDisguiseController>() ?? ((Component)val2).gameObject.AddComponent<PropDisguiseController>(); if (val == 0) { propDisguiseController.ApplyClearLocal(); } else { propDisguiseController.ApplyDisguiseLocal(val, 0.0001f); } } } if (!((Dictionary<object, object>)(object)changedProps).ContainsKey((object)"PH_PropLocked")) { return; } object obj = changedProps[(object)"PH_PropLocked"]; if (!(obj is bool)) { return; } bool lockedLocal = (bool)obj; if (true) { PlayerAvatar val3 = FindAvatarByActor(targetPlayer.ActorNumber); if ((Object)(object)val3 != (Object)null) { PropDisguiseController propDisguiseController2 = ((Component)val3).GetComponent<PropDisguiseController>() ?? ((Component)val3).gameObject.AddComponent<PropDisguiseController>(); propDisguiseController2.SetLockedLocal(lockedLocal); } } } public override void OnPlayerLeftRoom(Player otherPlayer) { //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Expected O, but got Unknown //IL_00a0: Expected O, but got Unknown if (PhotonNetwork.IsMasterClient && otherPlayer != null && otherPlayer.ActorNumber == _hunterActor) { List<Player> 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<object, object>)val2).Add((object)"PH_Hunter", (object)val.ActorNumber); currentRoom.SetCustomProperties(val2, (Hashtable)null, (WebFlags)null); PropHuntPlugin.Log.LogInfo((object)$"[PropHunt] Hunter left; new hunter {val.ActorNumber}."); } } } private void ApplyRoomState(Hashtable props) { if (props == null || !((Dictionary<object, object>)(object)props).ContainsKey((object)"PH_Active")) { return; } bool flag = (int)props[(object)"PH_Active"] == 1; int num = (_hunterActor = (((Dictionary<object, object>)(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)$"[PropHunt] Role set: {_localRole} (hunter actor={num})."); if (_localRole == PHRole.Hunter) { PlayerAvatar val = FindLocalAvatar(); if ((Object)(object)val != (Object)null) { _gun = ((Component)val).gameObject.GetComponent<HunterGunController>() ?? ((Component)val).gameObject.AddComponent<HunterGunController>(); _gun.Manager = this; } } _deadActors.Clear(); _ending = false; _roundArmed = false; _roundEndRealtime = 0.0; } public void RequestEliminate(int targetActorNumber) { //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_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0052: 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 (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)) { return; } if (val3 == PhotonNetwork.LocalPlayer.ActorNumber) { PlayerAvatar val4 = FindLocalAvatar(); if ((Object)(object)val4 != (Object)null) { PropDisguiseController component = ((Component)val4).GetComponent<PropDisguiseController>(); if ((Object)(object)component != (Object)null) { component.ApplyClearLocal(); } } } if (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) { if (e.CustomData is object[] array3 && array3.Length >= 3 && array3[0] is string text3 && !(text3 != "PH1") && TryToInt(array3[1], out var val5)) { string reason = (array3[2] as string) ?? ""; StartEndBannerLocal((PHWinner)val5, reason); } } else { if (e.Code != 104 || !(e.CustomData is object[] array4) || array4.Length < 2 || !(array4[0] is string text4) || text4 != "PH1") { return; } string text5 = array4[1] as string; if (!string.IsNullOrEmpty(text5)) { try { SceneManager.LoadScene(text5); return; } catch { return; } } } } catch (Exception ex) { LogGate.WarnThrottled(PropHuntPlugin.Log, "[PropHunt] 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_007d: Unknown result type (might be due to invalid IL or missing references) try { PlayerAvatar val = FindLocalAvatar(); if ((Object)(object)val != (Object)null) { PropDisguiseController component = ((Component)val).GetComponent<PropDisguiseController>(); if ((Object)(object)component != (Object)null) { component.ApplyClearLocal(); } val.PlayerDeath(0); return; } } catch { } try { PlayerAvatar val2 = FindLocalAvatar(); if ((Object)(object)val2 != (Object)null && (Object)(object)val2.playerHealth != (Object)null) { val2.playerHealth.HurtOther(9999, ((Component)val2).transform.position, false, -1); } } catch (Exception ex) { LogGate.WarnThrottled(PropHuntPlugin.Log, "[PropHunt] KillLocalPlayerClean: " + ex.Message); } } private void EnsureControllersOnAllAvatars() { foreach (PlayerAvatar player in GameDirector.instance.PlayerList) { if ((Object)(object)player != (Object)null && (Object)(object)((Component)player).GetComponent<PropDisguiseController>() == (Object)null) { ((Component)player).gameObject.AddComponent<PropDisguiseController>(); } } } 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, object>)(object)pl.CustomProperties).ContainsKey((object)"PH_PropVID") || !TryToInt(pl.CustomProperties[(object)"PH_PropVID"], out var val)) { return; } PropDisguiseController propDisguiseController = ((Component)av).GetComponent<PropDisguiseController>() ?? ((Component)av).gameObject.AddComponent<PropDisguiseController>(); if (val == 0) { propDisguiseController.ApplyClearLocal(); } else { propDisguiseController.ApplyDisguiseLocal(val, 0.0001f); } if (!((Dictionary<object, object>)(object)pl.CustomProperties).ContainsKey((object)"PH_PropLocked")) { return; } object obj = pl.CustomProperties[(object)"PH_PropLocked"]; if (obj is bool) { bool lockedLocal = (bool)obj; if (true) { propDisguiseController.SetLockedLocal(lockedLocal); } } } private PlayerAvatar FindLocalAvatar() { foreach (PlayerAvatar player in GameDirector.instance.PlayerList) { if ((Object)(object)player != (Object)null && (Object)(object)player.photonView != (Object)null && player.photonView.IsMine) { return player; } } return null; } private PlayerAvatar FindAvatarByActor(int actorNr) { foreach (PlayerAvatar player in GameDirector.instance.PlayerList) { if ((Object)(object)player == (Object)null || (Object)(object)player.photonView == (Object)null || player.photonView.Owner == null || player.photonView.Owner.ActorNumber != actorNr) { continue; } return player; } return null; } private ValuableObject GetTargetValuable() { PhysGrabObject val = PhysGrabber.instance?.currentlyLookingAtPhysGrabObject; if ((Object)(object)val == (Object)null) { return null; } return ((Component)val).GetComponent<ValuableObject>(); } private void UpdateCachedTargetFromPhysGrab() { try { ValuableObject targetValuable = GetTargetValuable(); if (!((Object)(object)targetValuable == (Object)null)) { PhotonView component = ((Component)targetValuable).GetComponent<PhotonView>(); if ((Object)(object)component != (Object)null && component.ViewID != 0) { _cachedPropPhotonViewId = component.ViewID; } } } catch { } } private void ToggleDisguise(PlayerAvatar me) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown //IL_0057: Expected O, but got Unknown //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Expected O, but got Unknown //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Expected O, but got Unknown //IL_0113: Expected O, but got Unknown PropDisguiseController propDisguiseController = ((Component)me).GetComponent<PropDisguiseController>() ?? ((Component)me).gameObject.AddComponent<PropDisguiseController>(); if (propDisguiseController.IsDisguised) { Player localPlayer = PhotonNetwork.LocalPlayer; Hashtable val = new Hashtable(); ((Dictionary<object, object>)val).Add((object)"PH_PropVID", (object)0); ((Dictionary<object, object>)val).Add((object)"PH_PropLocked", (object)false); localPlayer.SetCustomProperties(val, (Hashtable)null, (WebFlags)null); me.photonView.RPC("PH_RPC_TinyOff", (RpcTarget)4, new object[1] { me.photonView.ViewID }); propDisguiseController.ApplyClearLocal(); 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<object, object>)val2).Add((object)"PH_PropVID", (object)cachedPropPhotonViewId); ((Dictionary<object, object>)val2).Add((object)"PH_PropLocked", (object)false); 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); 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; } } [HarmonyPatch(typeof(PlayerAvatar), "PlayerDeath")] public static class PH_Patch_PlayerDeath { private static void Postfix(PlayerAvatar __instance) { //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0069: 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) { return; } PropDisguiseController component = ((Component)__instance).GetComponent<PropDisguiseController>(); if (!((Object)(object)component == (Object)null) && component.IsDisguised) { FieldInfo fieldInfo = AccessTools.Field(typeof(PlayerAvatar), "isCrouching"); if (!(fieldInfo == null)) { bool flag = (bool)fieldInfo.GetValue(__instance); __state = flag; fieldInfo.SetValue(__instance, true); } } } catch { } } private static void Postfix(PlayerAvatar __instance, PhotonStream stream, PhotonMessageInfo info, object __state) { try { if (!stream.IsWriting || !(__state is bool)) { return; } bool flag = (bool)__state; if (true) { FieldInfo fieldInfo = AccessTools.Field(typeof(PlayerAvatar), "isCrouching"); if (!(fieldInfo == null)) { fieldInfo.SetValue(__instance, flag); } } } catch { } } } [HarmonyPatch(typeof(PlayerController), "FixedUpdate")] public static class PH_Patch_FixedUpdateRotation { private static bool Prefix(PlayerController __instance) { //IL_005b: 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_0108: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: Unknown result type (might be due to invalid IL or missing references) //IL_0369: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)PropHuntManager.Instance == (Object)null) { return true; } PlayerAvatar playerAvatarScript = __instance.playerAvatarScript; if ((Object)(object)playerAvatarScript == (Object)null) { return true; } PropDisguiseController component = ((Component)playerAvatarScript).GetComponent<PropDisguiseController>(); if ((Object)(object)component != (Object)null && component.IsLocked) { Quaternion rotation = ((Component)__instance).transform.rotation; Traverse.Create((object)__instance).Method("OverrideSpeedTick", Array.Empty<object>()).GetValue(); Traverse.Create((object)__instance).Method("OverrideTimeScaleTick", Array.Empty<object>()).GetValue(); Traverse.Create((object)__instance).Method("OverrideLookSpeedTick", Array.Empty<object>()).GetValue(); Traverse.Create((object)__instance).Method("OverrideVoicePitchTick", Array.Empty<object>()).GetValue(); float value = Traverse.Create((object)__instance).Field("kinematicTimer").GetValue<float>(); if (value > 0f) { Traverse.Create((object)__instance).Field("VelocityImpulse").SetValue((object)Vector3.zero); __instance.rb.isKinematic = true; value -= Time.fixedDeltaTime; Traverse.Create((object)__instance).Field("kinematicTimer").SetValue((object)value); if (value <= 0f) { __instance.rb.collisionDetectionMode = (CollisionDetectionMode)2; __instance.rb.isKinematic = false; } return false; } if (playerAvatarScript.isTumbling) { ((Component)__instance).transform.position = ((Component)playerAvatarScript.tumble).transform.position + Vector3.down * 0.3f; } bool value2 = Traverse.Create((object)__instance).Field("previousCrawlingState").GetValue<bool>(); bool value3 = Traverse.Create((object)__instance).Field("previousCrouchingState").GetValue<bool>(); bool value4 = Traverse.Create((object)__instance).Field("previousSprintingState").GetValue<bool>(); bool value5 = Traverse.Create((object)__instance).Field("previousSlidingState").GetValue<bool>(); bool value6 = Traverse.Create((object)__instance).Field("previousMovingState").GetValue<bool>(); if (__instance.Crawling != value2) { __instance.ChangeState(); Traverse.Create((object)__instance).Field("previousCrawlingState").SetValue((object)__instance.Crawling); } if (__instance.Crouching != value3) { __instance.ChangeState(); Traverse.Create((object)__instance).Field("previousCrouchingState").SetValue((object)__instance.Crouching); } if (__instance.sprinting != value4) { __instance.ChangeState(); Traverse.Create((object)__instance).Field("previousSprintingState").SetValue((object)__instance.sprinting); } if (__instance.Sliding != value5) { __instance.ChangeState(); Traverse.Create((object)__instance).Field("previousSlidingState").SetValue((object)__instance.Sliding); } if (__instance.moving != value6) { __instance.ChangeState(); Traverse.Create((object)__instance).Field("previousMovingState").SetValue((object)__instance.moving); } ((Component)__instance).transform.rotation = rotation; return false; } return true; } } public class HunterGunController : MonoBehaviour { public PropHuntManager Manager; private float _nextShoot; private void Update() { //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: 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) //IL_01fa: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Manager == (Object)null || !PhotonNetwork.InRoom || !Manager.IsMainState || !Manager.RoundIsLive || Manager.IsHunterLocked || Time.time < _nextShoot) { return; } float gunRangeMeters = Manager.GunRangeMeters; float gunCooldownSeconds = Manager.GunCooldownSeconds; if (!Input.GetMouseButtonDown(1)) { return; } _nextShoot = Time.time + gunCooldownSeconds; Camera main = Camera.main; if ((Object)(object)main == (Object)null) { return; } bool flag = false; Ray val = default(Ray); ((Ray)(ref val))..ctor(((Component)main).transform.position, ((Component)main).transform.forward); RaycastHit val2 = default(RaycastHit); if (Physics.Raycast(val, ref val2, gunRangeMeters, -1, (QueryTriggerInteraction)1)) { PlayerAvatar componentInParent = ((Component)((RaycastHit)(ref val2)).collider).GetComponentInParent<PlayerAvatar>(); if ((Object)(object)componentInParent != (Object)null && (Object)(object)componentInParent.photonView != (Object)null && componentInParent.photonView.Owner != null) { int actorNumber = componentInParent.photonView.Owner.ActorNumber; if (actorNumber != PhotonNetwork.LocalPlayer.ActorNumber) { PropDisguiseController component = ((Component)componentInParent).GetComponent<PropDisguiseController>(); if ((Object)(object)component != (Object)null && component.IsDisguised) { Manager.RequestEliminate(actorNumber); flag = true; } } } } if (!flag) { PlayerAvatar val3 = FindLocalAvatar(); if ((Object)(object)val3 != (Object)null && (Object)(object)val3.playerHealth != (Object)null) { val3.playerHealth.HurtOther(Manager.MissPenaltyHP, ((Component)val3).transform.position, false, -1); FlashLocal($"-{Manager.MissPenaltyHP} HP (miss)"); } } } private PlayerAvatar FindLocalAvatar() { foreach (PlayerAvatar player in GameDirector.instance.PlayerList) { if ((Object)(object)player != (Object)null && (Object)(object)player.photonView != (Object)null && player.photonView.IsMine) { return player; } } return null; } private void FlashLocal(string msg) { MethodInfo method = typeof(PropHuntManager).GetMethod("Flash", BindingFlags.Instance | BindingFlags.NonPublic); if (method != null) { method.Invoke(Manager, new object[2] { msg, 1f }); } } } 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 _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 IsLocked { get; private set; } private void Awake() { _avatar = ((Component)this).GetComponent<PlayerAvatar>(); CacheVisualRefs(); } private void CacheVisualRefs() { if ((Object)(object)_visuals == (Object)null) { _visuals = ((Component)this).GetComponentInChildren<PlayerAvatarVisuals>(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(); } public void SetLockedLocal(bool locked) { //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: 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) IsLocked = locked; if ((Object)(object)_avatar != (Object)null) { Rigidbody component = ((Component)_avatar).GetComponent<Rigidbody>(); if ((Object)(object)component != (Object)null) { component.isKinematic = locked; } } if (!((Object)(object)_disguiseRoot == (Object)null)) { if (IsLocked) { _disguiseRoot.transform.SetParent((Transform)null, true); } else if ((Object)(object)_avatar != (Object)null) { _disguiseRoot.transform.SetParent(((Component)_avatar).transform, false); _disguiseRoot.transform.localPosition = Vector3.zero; _disguiseRoot.transform.localRotation = Quaternion.identity; _disguiseRoot.transform.localScale = Vector3.one; } } } [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) { //IL_008b: 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) CacheVisualRefs(); IsLocked = false; float factor = Mathf.Clamp(tinyFactor, 0.0001f, 0.1f); ApplyTinyToVisualRig(factor); BuildOrRefreshClone(propPhotonViewId); if ((Object)(object)_avatar?.physGrabber != (Object)null) { ((Behaviour)_avatar.physGrabber).enabled = false; } if ((Object)(object)_avatar != (Object)null) { Rigidbody component = ((Component)_avatar).GetComponent<Rigidbody>(); if ((Object)(object)component != (Object)null) { component.velocity = Vector3.zero; component.angularVelocity = Vector3.zero; } } if ((Object)(object)((MonoBehaviourPun)this).photonView != (Object)null && ((MonoBehaviourPun)this).photonView.IsMine) { SetupLocalViewOffsets(); } IsDisguised = true; } private void DoClear() { //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) CacheVisualRefs(); if (IsLocked && (Object)(object)_avatar != (Object)null) { Rigidbody component = ((Component)_avatar).GetComponent<Rigidbody>(); if ((Object)(object)component != (Object)null) { component.isKinematic = false; } } ClearTinyOnVisualRig(); if ((Object)(object)_avatar?.physGrabber != (Object)null) { ((Behaviour)_avatar.physGrabber).enabled = true; } if ((Object)(object)((MonoBehaviourPun)this).photonView != (Object)null && ((MonoBehaviourPun)this).photonView.IsMine) { _thirdEnabled = false; IsDisguised = false; RestoreLocalViewOffsets(); _camOrigParent = null; _camOrigLocalPos = Vector3.zero; } IsLocked = false; RemoveClone(); } private void ApplyTinyToVisualRig(float factor) { //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: 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_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: 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) _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<Light>(true); foreach (Light val3 in componentsInChildren) { ((Behaviour)val3).enabled = false; } } } private void ClearTinyOnVisualRig() { //IL_0023: 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<Light>(true); foreach (Light val in componentsInChildren) { ((Behaviour)val).enabled = true; } } private Transform FindFlashlightTransform(Transform root) { //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: 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<Transform> queue = new Queue<Transform>(); 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<Light>(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) { return string.IsNullOrEmpty(s) ? s : (char.ToUpperInvariant(s[0]) + s.Substring(1)); } private Transform ResolveTinyTarget(Transform avatarRoot) { if ((Object)(object)avatarRoot == (Object)null) { return null; } Transform root = FindNearestAncestorWhoseSubtreeHasLoose(avatarRoot, VISUALS_NAMES) ?? avatarRoot; Transform val = FindLooseBFS(root, 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<Renderer>(true); return (Transform)(((Object)(object)componentInChildren != (Object)null) ? ((object)((Component)componentInChildren).transform) : ((object)avatarRoot)); } private static Transform FindLooseBFS(Transform root, params string[] names) { //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Expected O, but got Unknown //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: 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<Transform> queue = new Queue<Transform>(); queue.Enqueue(root); while (queue.Count > 0) { Transform val2 = queue.Dequeue(); foreach (Transform item2 in val2) { Transform val3 = item2; string cn = Normalize(((Object)val3).name); if (source.Any((string t) => t == cn || cn.Contains(t))) { return val3; } queue.Enqueue(val3); } } 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(); IEnumerable<char> source = s.Where((char ch) => ch != ' ' && ch != '_' && ch != '-' && ch != '[' && ch != ']' && ch != '(' && ch != ')' && ch != '{' && ch != '}' && ch != '.'); return new string(source.ToArray()); } private void BuildOrRefreshClone(int propPhotonViewId) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Expected O, but got Unknown //IL_0073: 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_009f: 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)$"[PropHunt] Valuable view {propPhotonViewId} not found."); return; } _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<Collider>(true); foreach (Collider val2 in componentsInChildren) { Object.Destroy((Object)(object)val2); } Rigidbody[] componentsInChildren2 = _disguiseRoot.GetComponentsInChildren<Rigidbody>(true); foreach (Rigidbody val3 in componentsInChildren2) { Object.Destroy((Object)(object)val3); } } private void RemoveClone() { if ((Object)(object)_disguiseRoot != (Object)null) { Object.Destroy((Object)(object)_disguiseRoot); _disguiseRoot = null; } } 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_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0099: 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_004d: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014c: 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<MeshFilter>(); MeshRenderer component2 = ((Component)src).GetComponent<MeshRenderer>(); SkinnedMeshRenderer component3 = ((Component)src).GetComponent<SkinnedMeshRenderer>(); if ((Object)(object)component2 != (Object)null && (Object)(object)component != (Object)null && (Object)(object)component.sharedMesh != (Object)null) { MeshFilter val2 = val.AddComponent<MeshFilter>(); MeshRenderer val3 = val.AddComponent<MeshRenderer>(); val2.sharedMesh = component.sharedMesh; ((Renderer)val3).sharedMaterials = ((Renderer)component2).sharedMaterials; ((Renderer)val3).enabled = true; ((Renderer)val3).forceRenderingOff = false; } else if ((Object)(object)component3 != (Object)null && (Object)(object)component3.sharedMesh != (Object)null) { Mesh val4 = new Mesh(); try { component3.BakeMesh(val4); } catch { val4 = Object.Instantiate<Mesh>(component3.sharedMesh); } MeshFilter val5 = val.AddComponent<MeshFilter>(); MeshRenderer val6 = val.AddComponent<MeshRenderer>(); val5.sharedMesh = val4; ((Renderer)val6).sharedMaterials = ((Renderer)component3).sharedMaterials; ((Renderer)val6).enabled = true; ((Renderer)val6).forceRenderingOff = false; } for (int i = 0; i < src.childCount; i++) { CloneNodeRecursive(src.GetChild(i), val.transform, avatarLayer, isRoot: false); } } private void SetupLocalViewOffsets() { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: 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_0090: 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_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: 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_0064: 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_00cf: 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_00bc: 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_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_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_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) Renderer[] componentsInChildren = ((Component)root).GetComponentsInChildren<Renderer>(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_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: 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_0064: 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_00b9: 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_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: 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_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) 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