Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of PropHunt v1.2.8
PropHunt.dll
Decompiled 2 days 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