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 CursedMaskMod v1.4.0
BepInEx\plugins\CursedMaskMod\CursedMaskMod.dll
Decompiled 2 months 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.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 CursedMaskMod; using GameNetcodeStuff; using HarmonyLib; using Microsoft.CodeAnalysis; using On; using Unity.Collections; using Unity.Netcode; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("CursedMaskMod")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Lethal Company Mod: Cursed Comedy Mask - Wear it to become invisible to monsters, but a death timer starts ticking.")] [assembly: AssemblyFileVersion("1.4.0.0")] [assembly: AssemblyInformationalVersion("1.4.0")] [assembly: AssemblyProduct("CursedMaskMod")] [assembly: AssemblyTitle("CursedMaskMod")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.4.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } public class CursedMaskBehaviour : MonoBehaviour { [CompilerGenerated] private sealed class <PermanentCurseSequence>d__84 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public CursedMaskBehaviour <>4__this; private bool <loc>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <PermanentCurseSequence>d__84(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_01c2: 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_0204: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Expected O, but got Unknown //IL_0236: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; CursedMaskBehaviour cursedMaskBehaviour = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; if ((Object)(object)cursedMaskBehaviour._wearingPlayer == (Object)null) { return false; } <loc>5__2 = (Object)(object)cursedMaskBehaviour._localPlayer != (Object)null && cursedMaskBehaviour._wearingPlayer == cursedMaskBehaviour._localPlayer; Debug.Log((object)"[CursedMask] Timer abgelaufen - PERMANENT VERFLUCHT!"); if (<loc>5__2 && (Object)(object)cursedMaskBehaviour._purpleFilter != (Object)null) { ((Graphic)cursedMaskBehaviour._purpleFilter).color = new Color(0.4f, 0f, 0.5f, 0.6f); } if (<loc>5__2 && (Object)(object)cursedMaskBehaviour._heartbeatSource != (Object)null) { cursedMaskBehaviour._heartbeatSource.volume = 1f; cursedMaskBehaviour._heartbeatSource.pitch = 3f; } if (<loc>5__2) { ((MonoBehaviour)cursedMaskBehaviour).StartCoroutine(cursedMaskBehaviour.ScreenShake(0.6f, 0.15f)); } <>2__current = (object)new WaitForSeconds(1f); <>1__state = 1; return true; case 1: <>1__state = -1; cursedMaskBehaviour._permanentCurse = true; cursedMaskBehaviour._timerActive = false; cursedMaskBehaviour.StopHeartbeat(); if (<loc>5__2) { if ((Object)(object)cursedMaskBehaviour._timerText != (Object)null) { cursedMaskBehaviour._timerText.text = "PERMANENT"; cursedMaskBehaviour._timerText.fontSize = 40; ((Graphic)cursedMaskBehaviour._timerText).color = new Color(0.8f, 0.2f, 0.2f, 0.9f); } if ((Object)(object)cursedMaskBehaviour._cursedLabel != (Object)null) { cursedMaskBehaviour._cursedLabel.text = "MASKE FEST - Nähre dich Spielern um sie zu verfluchen"; cursedMaskBehaviour._cursedLabel.fontSize = 18; ((Graphic)cursedMaskBehaviour._cursedLabel).color = new Color(0.7f, 0.3f, 0.3f, 0.8f); } if ((Object)(object)cursedMaskBehaviour._searchHint != (Object)null) { cursedMaskBehaviour._searchHint.text = "Nähre dich anderen Spielern um den Fluch weiterzugeben!"; ((Graphic)cursedMaskBehaviour._searchHint).color = new Color(1f, 0.3f, 0.3f, 0.9f); } if ((Object)(object)cursedMaskBehaviour._purpleFilter != (Object)null) { ((Graphic)cursedMaskBehaviour._purpleFilter).color = new Color(0.3f, 0.05f, 0.4f, 0.2f); } } Debug.Log((object)"[CursedMask] Spieler ist jetzt PERMANENT verflucht!"); 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 <ScreenShake>d__85 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public CursedMaskBehaviour <>4__this; public float mag; public float dur; private Transform <cam>5__2; private Vector3 <orig>5__3; private float <t>5__4; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ScreenShake>d__85(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <cam>5__2 = null; <>1__state = -2; } private bool MoveNext() { //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_0078: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; CursedMaskBehaviour cursedMaskBehaviour = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; if ((Object)(object)cursedMaskBehaviour._localPlayer?.gameplayCamera == (Object)null) { return false; } <cam>5__2 = ((Component)cursedMaskBehaviour._localPlayer.gameplayCamera).transform; <orig>5__3 = <cam>5__2.localPosition; <t>5__4 = 0f; break; case 1: <>1__state = -1; break; } if (<t>5__4 < dur) { <cam>5__2.localPosition = <orig>5__3 + new Vector3(Random.Range(0f - mag, mag), Random.Range(0f - mag, mag), 0f); <t>5__4 += Time.deltaTime; <>2__current = null; <>1__state = 1; return true; } <cam>5__2.localPosition = <orig>5__3; return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <TakeoverAnimation>d__69 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public CursedMaskBehaviour <>4__this; private float <holdTime>5__2; private float <t>5__3; private float <fadeTime>5__4; private float <fadeT>5__5; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <TakeoverAnimation>d__69(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_00ab: 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_0313: Unknown result type (might be due to invalid IL or missing references) //IL_036d: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0255: Unknown result type (might be due to invalid IL or missing references) //IL_03ad: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; CursedMaskBehaviour cursedMaskBehaviour = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; cursedMaskBehaviour._inAnimation = true; cursedMaskBehaviour._timerActive = false; cursedMaskBehaviour.PlayMaskSound(); if ((Object)(object)cursedMaskBehaviour._localPlayer != (Object)null && (Object)(object)cursedMaskBehaviour._localPlayer.gameplayCamera != (Object)null) { ((MonoBehaviour)cursedMaskBehaviour).StartCoroutine(cursedMaskBehaviour.ScreenShake(0.5f, 0.1f)); } cursedMaskBehaviour._needsDrop = true; cursedMaskBehaviour._dropFrameDelay = 0; if ((Object)(object)cursedMaskBehaviour._blackout != (Object)null) { ((Graphic)cursedMaskBehaviour._blackout).color = new Color(0f, 0f, 0f, 0.97f); } if ((Object)(object)cursedMaskBehaviour._takeoverText != (Object)null) { ((Component)cursedMaskBehaviour._takeoverText).gameObject.SetActive(true); cursedMaskBehaviour._takeoverText.text = "Die Maske übernimmt dich..."; } if ((Object)(object)cursedMaskBehaviour._purpleFilter != (Object)null) { ((Graphic)cursedMaskBehaviour._purpleFilter).color = new Color(0f, 0f, 0f, 0f); } if ((Object)(object)cursedMaskBehaviour._timerText != (Object)null) { ((Component)cursedMaskBehaviour._timerText).gameObject.SetActive(false); } if ((Object)(object)cursedMaskBehaviour._cursedLabel != (Object)null) { ((Component)cursedMaskBehaviour._cursedLabel).gameObject.SetActive(false); } if ((Object)(object)cursedMaskBehaviour._transferPrompt != (Object)null) { ((Component)cursedMaskBehaviour._transferPrompt).gameObject.SetActive(false); } if ((Object)(object)cursedMaskBehaviour._searchHint != (Object)null) { ((Component)cursedMaskBehaviour._searchHint).gameObject.SetActive(false); } <holdTime>5__2 = 5f; <t>5__3 = 0f; goto IL_0276; case 1: <>1__state = -1; goto IL_0276; case 2: { <>1__state = -1; break; } IL_0276: if (<t>5__3 < <holdTime>5__2) { <t>5__3 += Time.deltaTime; if ((Object)(object)cursedMaskBehaviour._blackout != (Object)null) { float num2 = Mathf.Sin(<t>5__3 * 1.5f) * 0.03f; ((Graphic)cursedMaskBehaviour._blackout).color = new Color(0.02f, 0f, 0.04f, 0.94f + num2); } if ((Object)(object)cursedMaskBehaviour._takeoverText != (Object)null) { float num3 = Mathf.Abs(Mathf.Sin(<t>5__3 * 1.2f)); ((Graphic)cursedMaskBehaviour._takeoverText).color = new Color(0.6f, 0.2f, 0.8f, Mathf.Lerp(0.4f, 1f, num3)); } <>2__current = null; <>1__state = 1; return true; } if ((Object)(object)cursedMaskBehaviour._takeoverText != (Object)null) { ((Component)cursedMaskBehaviour._takeoverText).gameObject.SetActive(false); } <fadeTime>5__4 = 1.5f; <fadeT>5__5 = 0f; break; } if (<fadeT>5__5 < <fadeTime>5__4) { <fadeT>5__5 += Time.deltaTime; float num4 = Mathf.Lerp(0.95f, 0f, <fadeT>5__5 / <fadeTime>5__4); if ((Object)(object)cursedMaskBehaviour._blackout != (Object)null) { ((Graphic)cursedMaskBehaviour._blackout).color = new Color(0.02f, 0f, 0.04f, num4); } <>2__current = null; <>1__state = 2; return true; } if ((Object)(object)cursedMaskBehaviour._blackout != (Object)null) { ((Graphic)cursedMaskBehaviour._blackout).color = new Color(0f, 0f, 0f, 0f); } cursedMaskBehaviour._inAnimation = false; cursedMaskBehaviour._timerActive = true; if ((Object)(object)cursedMaskBehaviour._purpleFilter != (Object)null) { ((Graphic)cursedMaskBehaviour._purpleFilter).color = new Color(0.35f, 0.1f, 0.5f, 0.15f); } if ((Object)(object)cursedMaskBehaviour._timerText != (Object)null) { ((Component)cursedMaskBehaviour._timerText).gameObject.SetActive(true); } if ((Object)(object)cursedMaskBehaviour._cursedLabel != (Object)null) { ((Component)cursedMaskBehaviour._cursedLabel).gameObject.SetActive(true); } if ((Object)(object)cursedMaskBehaviour._searchHint != (Object)null) { ((Component)cursedMaskBehaviour._searchHint).gameObject.SetActive(true); cursedMaskBehaviour._searchHint.text = "Finde einen Spieler um den Fluch loszuwerden!"; } cursedMaskBehaviour.MuteVoice(mute: 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 float _maxTime = 60f; private float _remainingTime = 60f; private bool _timerActive; private bool _cursed; private bool _inAnimation; private bool _permanentCurse; private const float INFECT_RANGE = 2.5f; private const float INFECT_COOLDOWN = 8f; private float _lastInfectTime; public bool AlreadyCursed; public bool IsTransferring; private float _transferCooldownEnd; private const float TRANSFER_COOLDOWN = 5f; private const float TRANSFER_RANGE = 3.5f; private PlayerControllerB _wearingPlayer; private PlayerControllerB _localPlayer; private GameObject _hudCanvas; private Text _timerText; private Text _cursedLabel; private Image _purpleFilter; private Image _blackout; private Text _takeoverText; private Text _transferPrompt; private Text _searchHint; private AudioSource _heartbeatSource; private AudioClip _heartbeatClip; private bool _voiceWasMuffled; private float _originalVoiceVolume = 1f; private float _originalIngameVoiceVolume = 1f; private bool _broadcastWasEnabled = true; private MonoBehaviour _voiceBroadcastTrigger; private Canvas _savedUsernameCanvas; private CanvasGroup _usernameCanvasGroup; private float _savedUsernameAlpha = 1f; private static Canvas _staticSavedCanvas; private static CanvasGroup _staticCanvasGroup; private static float _staticSavedAlpha = 1f; private static GameObject _staticBillboardGO; private bool _deathTriggered; private bool _intentionalDespawn; private bool _needsDrop; private int _dropFrameDelay; private HauntedMaskItem _maskItem; private static CursedMaskBehaviour _activeInstance = null; private static readonly BindingFlags BF = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; private static readonly BindingFlags BFS = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; private bool _dissonanceWasMuted; private MonoBehaviour _dissonanceComms; private void Awake() { _maskItem = ((Component)this).GetComponent<HauntedMaskItem>(); try { Type type = Type.GetType("CursedMaskMod.Plugin, CursedMaskMod"); if (type != null) { FieldInfo field = type.GetField("cfgTimerDuration", BFS); if (field != null) { object value = field.GetValue(null); PropertyInfo property = value.GetType().GetProperty("Value"); if (property != null) { _maxTime = (float)property.GetValue(value); _remainingTime = _maxTime; } } } } catch { } _heartbeatClip = GenerateHeartbeatClip(); } private void Update() { if ((Object)(object)_localPlayer == (Object)null) { _localPlayer = GameNetworkManager.Instance?.localPlayerController; } if (_needsDrop) { _dropFrameDelay--; if (_dropFrameDelay <= 0) { _needsDrop = false; ExecuteDrop(); } } bool flag = (Object)(object)_localPlayer != (Object)null && (Object)(object)_wearingPlayer != (Object)null && _wearingPlayer == _localPlayer; if (_cursed && (Object)(object)_wearingPlayer != (Object)null) { KeepNameHidden(); } if (_permanentCurse && flag) { ReduceStamina(); HandleInfectNearby(); return; } if (_timerActive && !_inAnimation && (Object)(object)_wearingPlayer != (Object)null) { _remainingTime -= Time.deltaTime; if (flag) { UpdateHUD(); UpdateHeartbeat(); ReduceStamina(); } if (_remainingTime <= 0f && !_deathTriggered) { _deathTriggered = true; ((MonoBehaviour)this).StartCoroutine(PermanentCurseSequence()); } } if (flag && _cursed && !_inAnimation && !_deathTriggered && !_permanentCurse) { HandleTransferInput(); } } public void OnMaskEquipped(PlayerControllerB player) { if (!((Object)(object)player == (Object)null) && (!_cursed || !((Object)(object)_wearingPlayer != (Object)null) || _wearingPlayer != player) && !(Time.time < _transferCooldownEnd)) { _wearingPlayer = player; _cursed = true; _deathTriggered = false; _transferCooldownEnd = Time.time + 5f; _activeInstance = this; try { Type.GetType("CursedMaskMod.Plugin, CursedMaskMod")?.GetField("CurseActive", BFS)?.SetValue(null, true); } catch { } SetMaskedPlayerRef(player); HidePlayerName(player); if ((Object)(object)_localPlayer != (Object)null && player == _localPlayer) { CreateHUD(); ((MonoBehaviour)this).StartCoroutine(TakeoverAnimation()); } else { _timerActive = true; } } } public void OnMaskRemoved() { ClearMaskedPlayerRef(); if ((Object)(object)_wearingPlayer != (Object)null) { ShowPlayerName(_wearingPlayer); } if (((Object)(object)_localPlayer != (Object)null && (Object)(object)_wearingPlayer != (Object)null && _wearingPlayer == _localPlayer) || (Object)(object)_hudCanvas != (Object)null) { DestroyHUD(); MuteVoice(mute: false); StopHeartbeat(); } _wearingPlayer = null; _timerActive = false; _cursed = false; _inAnimation = false; _permanentCurse = false; _deathTriggered = false; AlreadyCursed = false; try { Type.GetType("CursedMaskMod.Plugin, CursedMaskMod")?.GetField("CurseActive", BFS)?.SetValue(null, false); } catch { } if ((Object)(object)_activeInstance == (Object)(object)this) { _activeInstance = null; } Debug.Log((object)"[CursedMask] Fluch KOMPLETT aufgeraeumt"); } public static void ActivateLocalCurse(PlayerControllerB player) { //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Expected O, but got Unknown if ((Object)(object)player == (Object)null) { return; } CursedMaskBehaviour cursedMaskBehaviour = _activeInstance; if ((Object)(object)cursedMaskBehaviour == (Object)null) { HauntedMaskItem val = FindMaskOnPlayer(player); if ((Object)(object)val != (Object)null) { cursedMaskBehaviour = ((Component)val).GetComponent<CursedMaskBehaviour>(); if ((Object)(object)cursedMaskBehaviour == (Object)null) { cursedMaskBehaviour = ((Component)val).gameObject.AddComponent<CursedMaskBehaviour>(); } } else { GameObject val2 = new GameObject("CursedMaskEffect_Standalone"); Object.DontDestroyOnLoad((Object)val2); cursedMaskBehaviour = val2.AddComponent<CursedMaskBehaviour>(); } } cursedMaskBehaviour.OnMaskEquipped(player); } public static void ActivateLocalCurseWithTime(PlayerControllerB player, float remainingTime) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown if (!((Object)(object)player == (Object)null)) { if ((Object)(object)_activeInstance != (Object)null && _activeInstance._cursed) { _activeInstance.CleanupLocalEffects(); } CursedMaskBehaviour cursedMaskBehaviour = _activeInstance; if ((Object)(object)cursedMaskBehaviour == (Object)null) { GameObject val = new GameObject("CursedMaskEffect_Transfer"); Object.DontDestroyOnLoad((Object)val); cursedMaskBehaviour = val.AddComponent<CursedMaskBehaviour>(); } cursedMaskBehaviour._remainingTime = remainingTime; cursedMaskBehaviour.OnMaskEquipped(player); } } public static void RemoveLocalCurse() { if ((Object)(object)_activeInstance != (Object)null && _activeInstance._cursed) { _activeInstance.OnMaskRemoved(); } } private static HauntedMaskItem FindMaskOnPlayer(PlayerControllerB player) { if ((Object)(object)player == (Object)null) { return null; } try { GrabbableObject currentlyHeldObjectServer = player.currentlyHeldObjectServer; HauntedMaskItem val = (HauntedMaskItem)(object)((currentlyHeldObjectServer is HauntedMaskItem) ? currentlyHeldObjectServer : null); if (val != null) { return val; } if (player.ItemSlots != null) { GrabbableObject[] itemSlots = player.ItemSlots; foreach (GrabbableObject obj in itemSlots) { HauntedMaskItem val2 = (HauntedMaskItem)(object)((obj is HauntedMaskItem) ? obj : null); if (val2 != null) { return val2; } } } } catch { } return null; } public static void HidePlayerNameStatic(PlayerControllerB player) { if ((Object)(object)player == (Object)null) { return; } try { FieldInfo field = typeof(PlayerControllerB).GetField("usernameCanvas", BF); if (field != null) { object? value = field.GetValue(player); _staticSavedCanvas = (Canvas)((value is Canvas) ? value : null); if ((Object)(object)_staticSavedCanvas != (Object)null) { ((Behaviour)_staticSavedCanvas).enabled = false; } } } catch { } try { FieldInfo field2 = typeof(PlayerControllerB).GetField("usernameAlpha", BF); if (field2 != null) { object value2 = field2.GetValue(player); CanvasGroup val = (CanvasGroup)((value2 is CanvasGroup) ? value2 : null); if (val != null) { _staticCanvasGroup = val; _staticSavedAlpha = val.alpha; val.alpha = 0f; } else if (value2 is float) { float staticSavedAlpha = (float)value2; _staticSavedAlpha = staticSavedAlpha; field2.SetValue(player, 0f); } } } catch { } try { FieldInfo field3 = typeof(PlayerControllerB).GetField("usernameBillboard", BF); if (field3 != null) { object value3 = field3.GetValue(player); Component val2 = (Component)((value3 is Component) ? value3 : null); if (val2 != null && (Object)(object)val2.gameObject != (Object)null) { _staticBillboardGO = val2.gameObject; val2.gameObject.SetActive(false); } else { GameObject val3 = (GameObject)((value3 is GameObject) ? value3 : null); if (val3 != null) { _staticBillboardGO = val3; val3.SetActive(false); } } } } catch { } Debug.Log((object)("[CursedMask] Name STATISCH versteckt: " + player.playerUsername)); } public static void ShowPlayerNameStatic(PlayerControllerB player) { if ((Object)(object)player == (Object)null) { return; } try { if ((Object)(object)_staticSavedCanvas != (Object)null) { ((Behaviour)_staticSavedCanvas).enabled = true; _staticSavedCanvas = null; } } catch { } try { if ((Object)(object)_staticCanvasGroup != (Object)null) { _staticCanvasGroup.alpha = _staticSavedAlpha; _staticCanvasGroup = null; } } catch { } try { if ((Object)(object)_staticBillboardGO != (Object)null) { _staticBillboardGO.SetActive(true); _staticBillboardGO = null; } } catch { } Debug.Log((object)("[CursedMask] Name STATISCH sichtbar: " + player.playerUsername)); } public static void KeepNameHiddenStatic() { try { if ((Object)(object)_staticCanvasGroup != (Object)null) { _staticCanvasGroup.alpha = 0f; } if ((Object)(object)_staticSavedCanvas != (Object)null && ((Behaviour)_staticSavedCanvas).enabled) { ((Behaviour)_staticSavedCanvas).enabled = false; } } catch { } } public static void CleanupAllCurses() { Debug.Log((object)"[CursedMask] === GLOBALES CLEANUP ==="); try { CursedMaskBehaviour[] array = Object.FindObjectsOfType<CursedMaskBehaviour>(); foreach (CursedMaskBehaviour cursedMaskBehaviour in array) { if ((Object)(object)cursedMaskBehaviour != (Object)null && cursedMaskBehaviour._cursed) { Debug.Log((object)"[CursedMask] Fluch aufgeraeumt auf Behaviour"); cursedMaskBehaviour.OnMaskRemoved(); } } } catch { } try { Type type = Type.GetType("CursedMaskMod.Plugin, CursedMaskMod"); if (type != null) { FieldInfo field = type.GetField("MaskedPlayer", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { field.SetValue(null, null); } FieldInfo field2 = type.GetField("CurseActive", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); if (field2 != null) { field2.SetValue(null, false); } } } catch { } _staticSavedCanvas = null; _staticCanvasGroup = null; _staticBillboardGO = null; _activeInstance = null; Debug.Log((object)"[CursedMask] === CLEANUP FERTIG ==="); } private void ExecuteDrop() { //IL_02b6: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: 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_01b7: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB val = _wearingPlayer ?? _localPlayer; if ((Object)(object)val == (Object)null || (Object)(object)_maskItem == (Object)null) { return; } Debug.Log((object)"[CursedMask] === DROP ==="); BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; try { if (val.ItemSlots != null) { for (int i = 0; i < val.ItemSlots.Length; i++) { if (!((Object)(object)val.ItemSlots[i] != (Object)null) || val.ItemSlots[i] != _maskItem) { continue; } val.ItemSlots[i] = null; try { HUDManager instance = HUDManager.Instance; if ((Object)(object)instance != (Object)null && instance.itemSlotIcons != null && i < instance.itemSlotIcons.Length) { instance.itemSlotIcons[i].sprite = null; ((Behaviour)instance.itemSlotIcons[i]).enabled = false; } } catch { } break; } } } catch { } ((GrabbableObject)_maskItem).isHeld = false; ((GrabbableObject)_maskItem).isPocketed = false; ((GrabbableObject)_maskItem).heldByPlayerOnServer = false; ((GrabbableObject)_maskItem).grabbable = true; ((GrabbableObject)_maskItem).grabbableToEnemies = true; ((GrabbableObject)_maskItem).playerHeldBy = null; ((GrabbableObject)_maskItem).parentObject = null; try { FieldInfo field = typeof(HauntedMaskItem).GetField("previousPlayerHeldBy", bindingAttr); if (field != null) { field.SetValue(_maskItem, null); } } catch { } try { Transform val2 = StartOfRound.Instance?.propsContainer; ((Component)_maskItem).transform.SetParent(val2, true); Vector3 val3 = ((Component)val).transform.position + ((Component)val).transform.forward * 1.5f; val3.y = ((Component)val).transform.position.y; ((Component)_maskItem).transform.position = val3; ((GrabbableObject)_maskItem).startFallingPosition = val3; ((GrabbableObject)_maskItem).targetFloorPosition = val3; ((GrabbableObject)_maskItem).floorYRot = -1; ((GrabbableObject)_maskItem).fallTime = 0f; } catch { } try { ((GrabbableObject)_maskItem).EnablePhysics(true); } catch { } try { Collider[] componentsInChildren = ((Component)_maskItem).GetComponentsInChildren<Collider>(true); foreach (Collider val4 in componentsInChildren) { if (!val4.enabled) { val4.enabled = true; } } Renderer[] componentsInChildren2 = ((Component)_maskItem).GetComponentsInChildren<Renderer>(true); foreach (Renderer val5 in componentsInChildren2) { if (!val5.enabled) { val5.enabled = true; } } } catch { } try { val.SetObjectAsNoLongerHeld(val.isInElevator, val.isInHangarShipRoom, ((Component)_maskItem).transform.position, (GrabbableObject)(object)_maskItem, -1); } catch { } int num = -1; GrabbableObject val6 = null; try { if (val.ItemSlots != null) { for (int k = 0; k < val.ItemSlots.Length; k++) { if ((Object)(object)val.ItemSlots[k] != (Object)null) { num = k; val6 = val.ItemSlots[k]; break; } } } } catch { } if ((Object)(object)val6 != (Object)null) { try { val.currentlyHeldObjectServer = val6; val.currentlyHeldObject = val6; val.currentItemSlot = num; val.isHoldingObject = true; val.twoHanded = (Object)(object)val6.itemProperties != (Object)null && val6.itemProperties.twoHanded; MethodInfo method = typeof(PlayerControllerB).GetMethod("SwitchToItemSlot", bindingAttr); if (method != null) { method.Invoke(val, new object[2] { num, null }); } } catch { } Debug.Log((object)$"[CursedMask] Gewechselt zu Slot {num}"); } else { try { val.currentlyHeldObjectServer = null; } catch { } try { val.currentlyHeldObject = null; } catch { } try { FieldInfo field2 = typeof(PlayerControllerB).GetField("currentlyGrabbingObject", bindingAttr); if (field2 != null) { field2.SetValue(val, null); } } catch { } try { val.isHoldingObject = false; } catch { } try { val.twoHanded = false; } catch { } try { val.twoHandedAnimation = false; } catch { } try { val.carryWeight = 1f; } catch { } try { val.heldObjectServerCopy = null; } catch { } Debug.Log((object)"[CursedMask] Keine Items mehr, Haende leer"); } try { if ((Object)(object)((GrabbableObject)_maskItem).itemProperties != (Object)null) { float num2 = ((GrabbableObject)_maskItem).itemProperties.weight - 1f; val.carryWeight = Mathf.Max(1f, val.carryWeight - num2); } } catch { } try { MethodInfo method2 = typeof(PlayerControllerB).GetMethod("SetSpecialGrabAnimationBool", bindingAttr); if (method2 != null) { method2.Invoke(val, new object[2] { false, _maskItem }); } if ((Object)(object)((GrabbableObject)_maskItem).itemProperties != (Object)null && !string.IsNullOrEmpty(((GrabbableObject)_maskItem).itemProperties.grabAnim)) { Animator playerBodyAnimator = val.playerBodyAnimator; if (playerBodyAnimator != null) { playerBodyAnimator.SetBool(((GrabbableObject)_maskItem).itemProperties.grabAnim, false); } } Animator playerBodyAnimator2 = val.playerBodyAnimator; if ((Object)(object)playerBodyAnimator2 != (Object)null) { playerBodyAnimator2.SetBool("cancelHolding", true); playerBodyAnimator2.SetBool("Grab", false); playerBodyAnimator2.SetBool("GrabValidated", false); playerBodyAnimator2.SetBool("GrabInvalidated", true); playerBodyAnimator2.SetBool("Hold", false); playerBodyAnimator2.SetBool("holdingObject", false); playerBodyAnimator2.SetTrigger("Throw"); } val.isGrabbingObjectAnimation = false; val.activatingItem = false; } catch { } Debug.Log((object)"[CursedMask] === DROP FERTIG ==="); } private void HidePlayerName(PlayerControllerB player) { if ((Object)(object)player == (Object)null) { return; } try { FieldInfo field = typeof(PlayerControllerB).GetField("usernameCanvas", BF); if (field != null) { ref Canvas savedUsernameCanvas = ref _savedUsernameCanvas; object? value = field.GetValue(player); savedUsernameCanvas = (Canvas)((value is Canvas) ? value : null); if ((Object)(object)_savedUsernameCanvas != (Object)null) { ((Behaviour)_savedUsernameCanvas).enabled = false; } } } catch { } try { FieldInfo field2 = typeof(PlayerControllerB).GetField("usernameAlpha", BF); if (field2 != null) { object value2 = field2.GetValue(player); CanvasGroup val = (CanvasGroup)((value2 is CanvasGroup) ? value2 : null); if (val != null) { _usernameCanvasGroup = val; _savedUsernameAlpha = val.alpha; val.alpha = 0f; } else if (value2 is float) { float savedUsernameAlpha = (float)value2; _savedUsernameAlpha = savedUsernameAlpha; field2.SetValue(player, 0f); } } } catch { } try { FieldInfo field3 = typeof(PlayerControllerB).GetField("usernameBillboard", BF); if (field3 != null) { object value3 = field3.GetValue(player); Component val2 = (Component)((value3 is Component) ? value3 : null); if (val2 != null && (Object)(object)val2.gameObject != (Object)null) { val2.gameObject.SetActive(false); } else { GameObject val3 = (GameObject)((value3 is GameObject) ? value3 : null); if (val3 != null) { val3.SetActive(false); } } } } catch { } HidePlayerNameStatic(player); } private void ShowPlayerName(PlayerControllerB player) { if ((Object)(object)player == (Object)null) { return; } try { if ((Object)(object)_savedUsernameCanvas != (Object)null) { ((Behaviour)_savedUsernameCanvas).enabled = true; _savedUsernameCanvas = null; } } catch { } try { if ((Object)(object)_usernameCanvasGroup != (Object)null) { _usernameCanvasGroup.alpha = _savedUsernameAlpha; _usernameCanvasGroup = null; } else { FieldInfo field = typeof(PlayerControllerB).GetField("usernameAlpha", BF); if (field != null) { field.SetValue(player, _savedUsernameAlpha); } } } catch { } try { FieldInfo field2 = typeof(PlayerControllerB).GetField("usernameBillboard", BF); if (field2 != null) { object value = field2.GetValue(player); Component val = (Component)((value is Component) ? value : null); if (val != null && (Object)(object)val.gameObject != (Object)null) { val.gameObject.SetActive(true); } else { GameObject val2 = (GameObject)((value is GameObject) ? value : null); if (val2 != null) { val2.SetActive(true); } } } } catch { } ShowPlayerNameStatic(player); } private void KeepNameHidden() { try { if ((Object)(object)_usernameCanvasGroup != (Object)null) { _usernameCanvasGroup.alpha = 0f; } if ((Object)(object)_savedUsernameCanvas != (Object)null && ((Behaviour)_savedUsernameCanvas).enabled) { ((Behaviour)_savedUsernameCanvas).enabled = false; } } catch { } } public bool IsOnCooldown() { return Time.time < _transferCooldownEnd; } private void CleanupLocalEffects() { DestroyHUD(); MuteVoice(mute: false); StopHeartbeat(); _cursed = false; _timerActive = false; _permanentCurse = false; _deathTriggered = false; _inAnimation = false; if ((Object)(object)_activeInstance == (Object)(object)this) { _activeInstance = null; } } private void HandleTransferInput() { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_localPlayer == (Object)null) { return; } PlayerControllerB val = FindNearestPlayer(); UpdateTransferPrompt(val); bool flag = false; try { MovementActions movement = _localPlayer.playerActions.Movement; flag = ((MovementActions)(ref movement)).Interact.WasPressedThisFrame(); } catch { try { flag = Input.GetKeyDown((KeyCode)101); } catch { } } if (flag && !((Object)(object)val == (Object)null) && !(Time.time < _transferCooldownEnd)) { Debug.Log((object)("[CursedMask] E-Transfer an " + val.playerUsername + "!")); ulong actualClientId = _localPlayer.actualClientId; ulong actualClientId2 = val.actualClientId; float maxTime = _maxTime; CurseNetwork.ClientRequestTransfer(actualClientId, actualClientId2, maxTime); } } private void HandleInfectNearby() { //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_localPlayer == (Object)null || Time.time < _lastInfectTime + 8f) { return; } try { PlayerControllerB[] array = Object.FindObjectsOfType<PlayerControllerB>(); foreach (PlayerControllerB val in array) { if (!((Object)(object)val == (Object)null) && val != _localPlayer && !val.isPlayerDead && val.isPlayerControlled && !(Vector3.Distance(((Component)_localPlayer).transform.position, ((Component)val).transform.position) > 2.5f)) { Debug.Log((object)("[CursedMask] INFECT! " + val.playerUsername + " ist zu nah!")); _lastInfectTime = Time.time; ulong actualClientId = _localPlayer.actualClientId; ulong actualClientId2 = val.actualClientId; CurseNetwork.ClientRequestTransfer(actualClientId, actualClientId2, _maxTime); break; } } } catch { } } private PlayerControllerB FindNearestPlayer() { //IL_0058: 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) if ((Object)(object)_localPlayer == (Object)null) { return null; } PlayerControllerB result = null; float num = 3.5f; try { PlayerControllerB[] array = Object.FindObjectsOfType<PlayerControllerB>(); foreach (PlayerControllerB val in array) { if (!((Object)(object)val == (Object)null) && val != _localPlayer && !val.isPlayerDead && val.isPlayerControlled) { float num2 = Vector3.Distance(((Component)_localPlayer).transform.position, ((Component)val).transform.position); if (num2 < num) { num = num2; result = val; } } } } catch { } return result; } private void UpdateTransferPrompt(PlayerControllerB nearest) { //IL_00ce: 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) if (!((Object)(object)_transferPrompt == (Object)null)) { bool flag = Time.time < _transferCooldownEnd; if ((Object)(object)nearest != (Object)null && !flag) { ((Component)_transferPrompt).gameObject.SetActive(true); _transferPrompt.text = "[E] Fluch übertragen\n→ " + nearest.playerUsername; ((Graphic)_transferPrompt).color = new Color(0.8f, 0.5f, 1f, 0.9f); } else if (flag) { ((Component)_transferPrompt).gameObject.SetActive(true); _transferPrompt.text = $"Cooldown: {_transferCooldownEnd - Time.time:F1}s"; ((Graphic)_transferPrompt).color = new Color(0.6f, 0.3f, 0.3f, 0.7f); } else { ((Component)_transferPrompt).gameObject.SetActive(false); } } } private void ReduceStamina() { if ((Object)(object)_localPlayer == (Object)null || !_cursed) { return; } try { FieldInfo field = typeof(PlayerControllerB).GetField("sprintMeter", BF); if (field != null && (float)field.GetValue(_localPlayer) > 0.5f) { field.SetValue(_localPlayer, 0.5f); } } catch { } } [IteratorStateMachine(typeof(<TakeoverAnimation>d__69))] private IEnumerator TakeoverAnimation() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <TakeoverAnimation>d__69(0) { <>4__this = this }; } private void PlayMaskSound() { if ((Object)(object)_maskItem == (Object)null) { return; } try { if ((Object)(object)_maskItem.maskAudio != (Object)null && (Object)(object)_maskItem.maskAttachAudioLocal != (Object)null) { _maskItem.maskAudio.PlayOneShot(_maskItem.maskAttachAudioLocal, 1f); } else if ((Object)(object)_maskItem.maskAudio != (Object)null && (Object)(object)_maskItem.maskAttachAudio != (Object)null) { _maskItem.maskAudio.PlayOneShot(_maskItem.maskAttachAudio, 1f); } } catch { } } private void CreateHUD() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0091: 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_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_0103: 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_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_016c: 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_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_01f6: Unknown result type (might be due to invalid IL or missing references) //IL_0239: Unknown result type (might be due to invalid IL or missing references) //IL_0268: Unknown result type (might be due to invalid IL or missing references) //IL_0277: Unknown result type (might be due to invalid IL or missing references) //IL_0290: Unknown result type (might be due to invalid IL or missing references) //IL_02c3: Unknown result type (might be due to invalid IL or missing references) //IL_0302: Unknown result type (might be due to invalid IL or missing references) //IL_0311: Unknown result type (might be due to invalid IL or missing references) //IL_032a: Unknown result type (might be due to invalid IL or missing references) //IL_035d: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_hudCanvas != (Object)null)) { _hudCanvas = new GameObject("CursedMaskHUD"); Object.DontDestroyOnLoad((Object)(object)_hudCanvas); Canvas obj = _hudCanvas.AddComponent<Canvas>(); obj.renderMode = (RenderMode)0; obj.sortingOrder = 1000; CanvasScaler obj2 = _hudCanvas.AddComponent<CanvasScaler>(); obj2.uiScaleMode = (ScaleMode)1; obj2.referenceResolution = new Vector2(1920f, 1080f); _blackout = MakeImage("Blackout", Vector2.zero, Vector2.one, new Color(0f, 0f, 0f, 0f)); _takeoverText = MakeText("TakeoverText", 36, (TextAnchor)4, new Vector2(0.15f, 0.4f), new Vector2(0.85f, 0.6f), new Color(0.6f, 0.2f, 0.8f, 0f)); ((Component)_takeoverText).gameObject.SetActive(false); _purpleFilter = MakeImage("PurpleFilter", Vector2.zero, Vector2.one, new Color(0f, 0f, 0f, 0f)); _timerText = MakeText("Timer", 48, (TextAnchor)1, new Vector2(0.3f, 0.85f), new Vector2(0.7f, 0.95f), new Color(0.7f, 0.3f, 0.9f, 0.9f)); ((Shadow)((Component)_timerText).gameObject.AddComponent<Outline>()).effectColor = new Color(0f, 0f, 0f, 0.8f); ((Component)_timerText).gameObject.SetActive(false); _cursedLabel = MakeText("Cursed", 24, (TextAnchor)1, new Vector2(0.35f, 0.95f), new Vector2(0.65f, 1f), new Color(0.6f, 0.2f, 0.8f, 0.6f)); _cursedLabel.text = "V E R F L U C H T"; ((Shadow)((Component)_cursedLabel).gameObject.AddComponent<Outline>()).effectColor = new Color(0f, 0f, 0f, 0.8f); ((Component)_cursedLabel).gameObject.SetActive(false); _searchHint = MakeText("SearchHint", 18, (TextAnchor)2, new Vector2(0.55f, 0.72f), new Vector2(0.98f, 0.8f), new Color(1f, 0.7f, 0.3f, 0.9f)); ((Shadow)((Component)_searchHint).gameObject.AddComponent<Outline>()).effectColor = new Color(0f, 0f, 0f, 0.8f); _searchHint.text = "Finde einen Spieler um den Fluch loszuwerden!"; ((Component)_searchHint).gameObject.SetActive(false); _transferPrompt = MakeText("Transfer", 22, (TextAnchor)2, new Vector2(0.62f, 0.86f), new Vector2(0.98f, 0.98f), new Color(0.8f, 0.5f, 1f, 0.9f)); ((Shadow)((Component)_transferPrompt).gameObject.AddComponent<Outline>()).effectColor = new Color(0f, 0f, 0f, 0.8f); ((Component)_transferPrompt).gameObject.SetActive(false); } } private Image MakeImage(string name, Vector2 anchorMin, Vector2 anchorMax, Color color) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name); val.transform.SetParent(_hudCanvas.transform, false); Image val2 = val.AddComponent<Image>(); ((Graphic)val2).color = color; ((Graphic)val2).raycastTarget = false; RectTransform component = val.GetComponent<RectTransform>(); component.anchorMin = anchorMin; component.anchorMax = anchorMax; component.offsetMin = Vector2.zero; component.offsetMax = Vector2.zero; return val2; } private Text MakeText(string name, int size, TextAnchor align, Vector2 anchorMin, Vector2 anchorMax, Color color) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name); val.transform.SetParent(_hudCanvas.transform, false); Text val2 = val.AddComponent<Text>(); val2.font = Font.CreateDynamicFontFromOSFont("Arial", size); val2.fontSize = size; val2.alignment = align; ((Graphic)val2).color = color; RectTransform component = val.GetComponent<RectTransform>(); component.anchorMin = anchorMin; component.anchorMax = anchorMax; component.offsetMin = Vector2.zero; component.offsetMax = Vector2.zero; return val2; } private void UpdateHUD() { //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_0231: Unknown result type (might be due to invalid IL or missing references) //IL_01b7: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_timerText == (Object)null) { return; } float num = Mathf.Max(0f, _remainingTime); _timerText.text = $"{(int)(num / 60f):D1}:{(int)(num % 60f):D2}.{(int)(num % 1f * 100f):D2}"; if ((Object)(object)_searchHint != (Object)null && ((Component)_searchHint).gameObject.activeSelf) { float num2 = Mathf.Abs(Mathf.Sin(Time.time * 1.5f)); ((Graphic)_searchHint).color = new Color(1f, 0.7f, 0.3f, Mathf.Lerp(0.5f, 1f, num2)); } if (!((Object)(object)_purpleFilter == (Object)null)) { float num3 = 1f - Mathf.Clamp01(_remainingTime / _maxTime); if (_remainingTime < 10f) { float num4 = Mathf.Abs(Mathf.Sin(Time.time * 3f)); ((Graphic)_purpleFilter).color = new Color(0.5f, 0.05f, 0.3f, Mathf.Lerp(0.2f, 0.45f, num4)); ((Graphic)_timerText).color = new Color(1f, 0.2f, 0.2f, 1f); _timerText.fontSize = (int)Mathf.Lerp(48f, 72f, num4); } else if (_remainingTime < 30f) { ((Graphic)_purpleFilter).color = new Color(0.4f, 0.08f, 0.45f, Mathf.Lerp(0.15f, 0.25f, num3)); ((Graphic)_timerText).color = new Color(0.9f, 0.4f, 0.9f, 0.9f); _timerText.fontSize = 52; } else { ((Graphic)_purpleFilter).color = new Color(0.35f, 0.1f, 0.5f, 0.15f); ((Graphic)_timerText).color = new Color(0.7f, 0.3f, 0.9f, 0.85f); _timerText.fontSize = 48; } } } private void DestroyHUD() { if ((Object)(object)_hudCanvas != (Object)null) { Object.Destroy((Object)(object)_hudCanvas); _hudCanvas = null; _timerText = null; _purpleFilter = null; _blackout = null; _takeoverText = null; _cursedLabel = null; _transferPrompt = null; _searchHint = null; } } private void UpdateHeartbeat() { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown if (!((Object)(object)_heartbeatClip == (Object)null)) { if ((Object)(object)_heartbeatSource == (Object)null && (Object)(object)_localPlayer?.gameplayCamera != (Object)null) { GameObject val = new GameObject("CursedMaskHB"); val.transform.SetParent(((Component)_localPlayer.gameplayCamera).transform); _heartbeatSource = val.AddComponent<AudioSource>(); _heartbeatSource.clip = _heartbeatClip; _heartbeatSource.loop = true; _heartbeatSource.spatialBlend = 0f; _heartbeatSource.volume = 0f; _heartbeatSource.Play(); } if (!((Object)(object)_heartbeatSource == (Object)null)) { float num = 1f - Mathf.Clamp01(_remainingTime / _maxTime); _heartbeatSource.volume = Mathf.Lerp(0.05f, 0.6f, num); _heartbeatSource.pitch = Mathf.Lerp(0.7f, 2f, num); } } } private void StopHeartbeat() { if ((Object)(object)_heartbeatSource != (Object)null) { _heartbeatSource.Stop(); Object.Destroy((Object)(object)((Component)_heartbeatSource).gameObject); _heartbeatSource = null; } } private AudioClip GenerateHeartbeatClip() { int num = 22050; float num2 = 1f; int num3 = (int)((float)num * num2); float[] array = new float[num3]; for (int i = 0; i < num3; i++) { float num4 = (float)i / (float)num; float num5 = ((num4 < 0.08f) ? (Mathf.Sin(num4 * 2f * MathF.PI * 55f) * Mathf.Exp((0f - num4) * 40f)) : 0f); float num6 = ((num4 > 0.15f && num4 < 0.23f) ? (Mathf.Sin((num4 - 0.15f) * 2f * MathF.PI * 50f) * Mathf.Exp((0f - (num4 - 0.15f)) * 45f) * 0.8f) : 0f); array[i] = Mathf.Clamp(num5 + num6, -1f, 1f); } AudioClip obj = AudioClip.Create("hb", num3, 1, num, false); obj.SetData(array, 0); return obj; } private void MuteVoice(bool mute) { try { Type type = Type.GetType("CursedMaskMod.Plugin, CursedMaskMod"); if (type != null) { FieldInfo field = type.GetField("cfgVoiceMute", BFS); if (field != null) { object value = field.GetValue(null); PropertyInfo property = value.GetType().GetProperty("Value"); if (property != null && !(bool)property.GetValue(value)) { return; } } } } catch { } if ((Object)(object)_localPlayer == (Object)null) { return; } if (mute) { MuteDissonanceMic(mute: true); _voiceWasMuffled = _localPlayer.voiceMuffledByEnemy; _localPlayer.voiceMuffledByEnemy = true; if ((Object)(object)_localPlayer.currentVoiceChatAudioSource != (Object)null) { _originalVoiceVolume = _localPlayer.currentVoiceChatAudioSource.volume; _localPlayer.currentVoiceChatAudioSource.volume = 0f; } try { FieldInfo field2 = typeof(PlayerControllerB).GetField("currentVoiceChatIngameAudio", BF); if (field2 != null) { object? value2 = field2.GetValue(_localPlayer); AudioSource val = (AudioSource)((value2 is AudioSource) ? value2 : null); if ((Object)(object)val != (Object)null) { _originalIngameVoiceVolume = val.volume; val.volume = 0f; } } } catch { } DisableVoiceBroadcast(disable: true); Debug.Log((object)"[CursedMask] MIKROFON + Voice KOMPLETT gemutet (Dissonance IsMuted + Broadcast + Audio)"); return; } MuteDissonanceMic(mute: false); _localPlayer.voiceMuffledByEnemy = _voiceWasMuffled; if ((Object)(object)_localPlayer.currentVoiceChatAudioSource != (Object)null) { _localPlayer.currentVoiceChatAudioSource.volume = _originalVoiceVolume; } try { FieldInfo field3 = typeof(PlayerControllerB).GetField("currentVoiceChatIngameAudio", BF); if (field3 != null) { object? value3 = field3.GetValue(_localPlayer); AudioSource val2 = (AudioSource)((value3 is AudioSource) ? value3 : null); if ((Object)(object)val2 != (Object)null) { val2.volume = _originalIngameVoiceVolume; } } } catch { } DisableVoiceBroadcast(disable: false); Debug.Log((object)"[CursedMask] MIKROFON + Voice WIEDERHERGESTELLT"); } private void MuteDissonanceMic(bool mute) { try { if ((Object)(object)_dissonanceComms == (Object)null) { MonoBehaviour[] array = Object.FindObjectsOfType<MonoBehaviour>(); foreach (MonoBehaviour val in array) { if ((Object)(object)val != (Object)null && ((object)val).GetType().FullName == "Dissonance.DissonanceComms") { _dissonanceComms = val; Debug.Log((object)("[CursedMask] DissonanceComms gefunden: " + ((Object)((Component)val).gameObject).name)); break; } } } if ((Object)(object)_dissonanceComms != (Object)null) { PropertyInfo property = ((object)_dissonanceComms).GetType().GetProperty("IsMuted"); if (property != null) { if (mute) { _dissonanceWasMuted = (bool)property.GetValue(_dissonanceComms); property.SetValue(_dissonanceComms, true); Debug.Log((object)"[CursedMask] DissonanceComms.IsMuted = TRUE (Mikrofon AUS)"); } else { property.SetValue(_dissonanceComms, _dissonanceWasMuted); Debug.Log((object)$"[CursedMask] DissonanceComms.IsMuted = {_dissonanceWasMuted} (wiederhergestellt)"); } } } else { Debug.LogWarning((object)"[CursedMask] DissonanceComms NICHT gefunden - Mic-Mute Fallback aktiv"); } } catch (Exception ex) { Debug.LogError((object)("[CursedMask] DissonanceComms Mute Fehler: " + ex.Message)); } } private void DisableVoiceBroadcast(bool disable) { if ((Object)(object)_localPlayer == (Object)null) { return; } try { if ((Object)(object)_voiceBroadcastTrigger == (Object)null) { MonoBehaviour[] componentsInChildren = ((Component)_localPlayer).GetComponentsInChildren<MonoBehaviour>(true); foreach (MonoBehaviour val in componentsInChildren) { if ((Object)(object)val != (Object)null && ((object)val).GetType().Name.Contains("VoiceBroadcast")) { _voiceBroadcastTrigger = val; _broadcastWasEnabled = ((Behaviour)val).enabled; break; } } if ((Object)(object)_voiceBroadcastTrigger == (Object)null) { componentsInChildren = Object.FindObjectsOfType<MonoBehaviour>(); foreach (MonoBehaviour val2 in componentsInChildren) { if ((Object)(object)val2 != (Object)null && ((object)val2).GetType().Name.Contains("VoiceBroadcast")) { _voiceBroadcastTrigger = val2; _broadcastWasEnabled = ((Behaviour)val2).enabled; Debug.Log((object)("[CursedMask] VoiceBroadcastTrigger GLOBAL gefunden: " + ((Object)((Component)val2).gameObject).name)); break; } } } } if ((Object)(object)_voiceBroadcastTrigger != (Object)null) { if (disable) { _broadcastWasEnabled = ((Behaviour)_voiceBroadcastTrigger).enabled; ((Behaviour)_voiceBroadcastTrigger).enabled = false; Debug.Log((object)"[CursedMask] VoiceBroadcast DEAKTIVIERT"); } else { ((Behaviour)_voiceBroadcastTrigger).enabled = _broadcastWasEnabled; Debug.Log((object)"[CursedMask] VoiceBroadcast AKTIVIERT"); } } } catch (Exception ex) { Debug.LogError((object)("[CursedMask] Voice-Broadcast Fehler: " + ex.Message)); } } [IteratorStateMachine(typeof(<PermanentCurseSequence>d__84))] private IEnumerator PermanentCurseSequence() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <PermanentCurseSequence>d__84(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<ScreenShake>d__85))] private IEnumerator ScreenShake(float dur, float mag) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ScreenShake>d__85(0) { <>4__this = this, dur = dur, mag = mag }; } private void SetMaskedPlayerRef(PlayerControllerB p) { try { Type.GetType("CursedMaskMod.Plugin, CursedMaskMod")?.GetField("MaskedPlayer", BFS)?.SetValue(null, p); } catch { } } private void ClearMaskedPlayerRef() { try { Type.GetType("CursedMaskMod.Plugin, CursedMaskMod")?.GetField("MaskedPlayer", BFS)?.SetValue(null, null); } catch { } } private void OnDestroy() { OnMaskRemoved(); DestroyHUD(); StopHeartbeat(); } private void OnDisable() { if (!_intentionalDespawn && _cursed) { Debug.Log((object)"[CursedMask] OnDisable → Fluch aufräumen"); OnMaskRemoved(); } } } namespace CursedMaskMod { internal static class CurseNetwork { [CompilerGenerated] private static class <>O { public static HandleNamedMessageDelegate <0>__OnCurseReceived; public static HandleNamedMessageDelegate <1>__OnTransferReceived; public static HandleNamedMessageDelegate <2>__OnCleanReceived; public static HandleNamedMessageDelegate <3>__OnReqTransferReceived; public static HandleNamedMessageDelegate <4>__OnReqCurseReceived; } private const string MSG_CURSE = "CM_Curse"; private const string MSG_TRANSFER = "CM_Transfer"; private const string MSG_CLEAN = "CM_Clean"; private const string MSG_REQT = "CM_ReqT"; private const string MSG_REQCURSE = "CM_ReqC"; private static bool _registered; internal static bool IsHost { get { try { return (Object)(object)NetworkManager.Singleton != (Object)null && (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer); } catch { return true; } } } internal static bool Registered => _registered; internal static void Register() { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown //IL_005f: 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_006a: Expected O, but got Unknown //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Expected O, but got Unknown //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Expected O, but got Unknown //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Expected O, but got Unknown if (_registered) { return; } try { NetworkManager singleton = NetworkManager.Singleton; CustomMessagingManager val = ((singleton != null) ? singleton.CustomMessagingManager : null); if (val != null) { object obj = <>O.<0>__OnCurseReceived; if (obj == null) { HandleNamedMessageDelegate val2 = OnCurseReceived; <>O.<0>__OnCurseReceived = val2; obj = (object)val2; } val.RegisterNamedMessageHandler("CM_Curse", (HandleNamedMessageDelegate)obj); object obj2 = <>O.<1>__OnTransferReceived; if (obj2 == null) { HandleNamedMessageDelegate val3 = OnTransferReceived; <>O.<1>__OnTransferReceived = val3; obj2 = (object)val3; } val.RegisterNamedMessageHandler("CM_Transfer", (HandleNamedMessageDelegate)obj2); object obj3 = <>O.<2>__OnCleanReceived; if (obj3 == null) { HandleNamedMessageDelegate val4 = OnCleanReceived; <>O.<2>__OnCleanReceived = val4; obj3 = (object)val4; } val.RegisterNamedMessageHandler("CM_Clean", (HandleNamedMessageDelegate)obj3); object obj4 = <>O.<3>__OnReqTransferReceived; if (obj4 == null) { HandleNamedMessageDelegate val5 = OnReqTransferReceived; <>O.<3>__OnReqTransferReceived = val5; obj4 = (object)val5; } val.RegisterNamedMessageHandler("CM_ReqT", (HandleNamedMessageDelegate)obj4); object obj5 = <>O.<4>__OnReqCurseReceived; if (obj5 == null) { HandleNamedMessageDelegate val6 = OnReqCurseReceived; <>O.<4>__OnReqCurseReceived = val6; obj5 = (object)val6; } val.RegisterNamedMessageHandler("CM_ReqC", (HandleNamedMessageDelegate)obj5); _registered = true; Plugin.Logger.LogInfo((object)"[CurseNet] Netzwerk-Handler registriert!"); } } catch (Exception ex) { Plugin.Logger.LogError((object)("[CurseNet] Register Fehler: " + ex.Message)); } } internal static void Unregister() { if (!_registered) { return; } try { NetworkManager singleton = NetworkManager.Singleton; CustomMessagingManager val = ((singleton != null) ? singleton.CustomMessagingManager : null); if (val != null) { val.UnregisterNamedMessageHandler("CM_Curse"); val.UnregisterNamedMessageHandler("CM_Transfer"); val.UnregisterNamedMessageHandler("CM_Clean"); val.UnregisterNamedMessageHandler("CM_ReqT"); val.UnregisterNamedMessageHandler("CM_ReqC"); } } catch { } _registered = false; Plugin.Logger.LogInfo((object)"[CurseNet] Netzwerk-Handler entfernt."); } internal static void HostBroadcastCurse(ulong playerClientId) { if (IsHost) { SendToAll("CM_Curse", delegate(FastBufferWriter w) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) ((FastBufferWriter)(ref w)).WriteValueSafe<ulong>(ref playerClientId, default(ForPrimitives)); }); ApplyCurseLocally(playerClientId); } } internal static void HostBroadcastTransfer(ulong fromId, ulong toId, float remainingTime) { if (IsHost) { SendToAll("CM_Transfer", delegate(FastBufferWriter w) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0026: 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) ((FastBufferWriter)(ref w)).WriteValueSafe<ulong>(ref fromId, default(ForPrimitives)); ((FastBufferWriter)(ref w)).WriteValueSafe<ulong>(ref toId, default(ForPrimitives)); ((FastBufferWriter)(ref w)).WriteValueSafe<float>(ref remainingTime, default(ForPrimitives)); }); ApplyTransferLocally(fromId, toId, remainingTime); } } internal static void HostBroadcastCleanup() { if (IsHost) { SendToAll("CM_Clean", delegate(FastBufferWriter w) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) byte b = 0; ((FastBufferWriter)(ref w)).WriteValueSafe<byte>(ref b, default(ForPrimitives)); }); } } internal static void ClientNotifyCurse(ulong playerClientId) { //IL_0027: 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_0044: Unknown result type (might be due to invalid IL or missing references) if (IsHost) { HostBroadcastCurse(playerClientId); } else if (_registered) { try { FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(8, (Allocator)2, -1); ((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref playerClientId, default(ForPrimitives)); NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("CM_ReqC", 0uL, val, (NetworkDelivery)3); ((FastBufferWriter)(ref val)).Dispose(); Debug.Log((object)$"[CurseNet] Host informiert: Spieler {playerClientId} ist verflucht"); } catch (Exception ex) { Debug.LogError((object)("[CurseNet] ClientNotifyCurse Fehler: " + ex.Message)); } } } internal static void ClientRequestTransfer(ulong fromId, ulong toId, float remainingTime) { //IL_002a: 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_003c: 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_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) if (IsHost) { HostBroadcastTransfer(fromId, toId, remainingTime); } else if (_registered) { try { FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(20, (Allocator)2, -1); ((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref fromId, default(ForPrimitives)); ((FastBufferWriter)(ref val)).WriteValueSafe<ulong>(ref toId, default(ForPrimitives)); ((FastBufferWriter)(ref val)).WriteValueSafe<float>(ref remainingTime, default(ForPrimitives)); NetworkManager.Singleton.CustomMessagingManager.SendNamedMessage("CM_ReqT", 0uL, val, (NetworkDelivery)3); ((FastBufferWriter)(ref val)).Dispose(); Debug.Log((object)$"[CurseNet] Transfer-Request an Host gesendet: {fromId}→{toId}"); } catch (Exception ex) { Debug.LogError((object)("[CurseNet] RequestTransfer Fehler: " + ex.Message)); } } } private static void OnCurseReceived(ulong senderId, FastBufferReader reader) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) if (IsHost) { return; } try { ulong playerClientId = default(ulong); ((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref playerClientId, default(ForPrimitives)); ApplyCurseLocally(playerClientId); } catch (Exception ex) { Debug.LogError((object)("[CurseNet] OnCurse Fehler: " + ex.Message)); } } private static void OnTransferReceived(ulong senderId, FastBufferReader reader) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: 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_0039: Unknown result type (might be due to invalid IL or missing references) if (IsHost) { return; } try { ulong fromId = default(ulong); ((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref fromId, default(ForPrimitives)); ulong toId = default(ulong); ((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref toId, default(ForPrimitives)); float remainingTime = default(float); ((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref remainingTime, default(ForPrimitives)); ApplyTransferLocally(fromId, toId, remainingTime); } catch (Exception ex) { Debug.LogError((object)("[CurseNet] OnTransfer Fehler: " + ex.Message)); } } private static void OnCleanReceived(ulong senderId, FastBufferReader reader) { if (IsHost) { return; } try { if ((Object)(object)Plugin.MaskedPlayer != (Object)null) { CursedMaskBehaviour.ShowPlayerNameStatic(Plugin.MaskedPlayer); } CursedMaskBehaviour.CleanupAllCurses(); Plugin.MaskedPlayer = null; Debug.Log((object)"[CurseNet] Cleanup empfangen"); } catch (Exception ex) { Debug.LogError((object)("[CurseNet] OnClean Fehler: " + ex.Message)); } } private static void OnReqTransferReceived(ulong senderId, FastBufferReader reader) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: 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_0039: Unknown result type (might be due to invalid IL or missing references) if (!IsHost) { return; } try { ulong num = default(ulong); ((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref num, default(ForPrimitives)); ulong num2 = default(ulong); ((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref num2, default(ForPrimitives)); float remainingTime = default(float); ((FastBufferReader)(ref reader)).ReadValueSafe<float>(ref remainingTime, default(ForPrimitives)); Debug.Log((object)$"[CurseNet] Transfer-Request empfangen: {num}→{num2}"); HostBroadcastTransfer(num, num2, remainingTime); } catch (Exception ex) { Debug.LogError((object)("[CurseNet] OnReqTransfer Fehler: " + ex.Message)); } } private static void OnReqCurseReceived(ulong senderId, FastBufferReader reader) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) if (!IsHost) { return; } try { ulong num = default(ulong); ((FastBufferReader)(ref reader)).ReadValueSafe<ulong>(ref num, default(ForPrimitives)); Debug.Log((object)$"[CurseNet] Client meldet: Spieler {num} ist verflucht"); HostBroadcastCurse(num); } catch (Exception ex) { Debug.LogError((object)("[CurseNet] OnReqCurse Fehler: " + ex.Message)); } } private static void ApplyCurseLocally(ulong playerClientId) { PlayerControllerB playerByClientId = GetPlayerByClientId(playerClientId); if (!((Object)(object)playerByClientId == (Object)null)) { Plugin.MaskedPlayer = playerByClientId; CursedMaskBehaviour.HidePlayerNameStatic(playerByClientId); Debug.Log((object)("[CurseNet] MaskedPlayer gesetzt: " + playerByClientId.playerUsername + " (fuer AI + Name)")); } } private static void ApplyTransferLocally(ulong fromId, ulong toId, float remainingTime) { PlayerControllerB playerByClientId = GetPlayerByClientId(fromId); PlayerControllerB playerByClientId2 = GetPlayerByClientId(toId); if ((Object)(object)playerByClientId != (Object)null) { CursedMaskBehaviour.ShowPlayerNameStatic(playerByClientId); } if ((Object)(object)playerByClientId2 != (Object)null) { Plugin.MaskedPlayer = playerByClientId2; CursedMaskBehaviour.HidePlayerNameStatic(playerByClientId2); } PlayerControllerB val = GameNetworkManager.Instance?.localPlayerController; if (!((Object)(object)val == (Object)null)) { if ((Object)(object)playerByClientId != (Object)null && val.actualClientId == fromId) { CursedMaskBehaviour.RemoveLocalCurse(); } if ((Object)(object)playerByClientId2 != (Object)null && val.actualClientId == toId) { CursedMaskBehaviour.ActivateLocalCurseWithTime(playerByClientId2, remainingTime); } Debug.Log((object)("[CurseNet] Transfer: " + playerByClientId?.playerUsername + " → " + playerByClientId2?.playerUsername)); } } internal static PlayerControllerB GetPlayerByClientId(ulong clientId) { try { if (StartOfRound.Instance?.allPlayerScripts == null) { return null; } PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if ((Object)(object)val != (Object)null && val.actualClientId == clientId) { return val; } } } catch { } return null; } private static void SendToAll(string msgName, Action<FastBufferWriter> write) { //IL_0018: 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) if (!_registered) { return; } try { FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(256, (Allocator)2, -1); write(val); NetworkManager.Singleton.CustomMessagingManager.SendNamedMessageToAll(msgName, val, (NetworkDelivery)3); ((FastBufferWriter)(ref val)).Dispose(); } catch (Exception ex) { Debug.LogError((object)("[CurseNet] SendToAll(" + msgName + ") Fehler: " + ex.Message)); } } } internal class CurseGlobalUpdater : MonoBehaviour { private static CurseGlobalUpdater _instance; internal static void EnsureExists() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown if (!((Object)(object)_instance != (Object)null)) { GameObject val = new GameObject("CurseGlobalUpdater"); Object.DontDestroyOnLoad((Object)val); _instance = val.AddComponent<CurseGlobalUpdater>(); } } private void Update() { if (!((Object)(object)Plugin.MaskedPlayer == (Object)null) && !Plugin.MaskedPlayer.isPlayerDead) { CursedMaskBehaviour.KeepNameHiddenStatic(); } } } [BepInPlugin("CursedMaskMod", "CursedMaskMod", "1.4.0")] public class Plugin : BaseUnityPlugin { internal static ManualLogSource Logger; private Harmony _harmony; internal static ConfigEntry<float> cfgTimerDuration; internal static ConfigEntry<bool> cfgVoiceMute; internal static ConfigEntry<bool> cfgMonsterInvisible; internal static ConfigEntry<int> cfgAutoAttachChance; internal static ConfigEntry<int> cfgShopPrice; internal static ConfigEntry<float> cfgTransferCooldown; internal static PlayerControllerB MaskedPlayer; internal static bool CurseActive; private void Awake() { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Expected O, but got Unknown //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Expected O, but got Unknown //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Expected O, but got Unknown //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Expected O, but got Unknown //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Expected O, but got Unknown Logger = ((BaseUnityPlugin)this).Logger; Logger.LogInfo((object)"CursedMaskMod v1.4.0 loaded."); cfgTimerDuration = ((BaseUnityPlugin)this).Config.Bind<float>("Gameplay", "Timer (Sekunden)", 60f, new ConfigDescription("Todestimer nach Aufsetzen der Maske", (AcceptableValueBase)(object)new AcceptableValueRange<float>(10f, 300f), Array.Empty<object>())); cfgVoiceMute = ((BaseUnityPlugin)this).Config.Bind<bool>("Gameplay", "Voice Mute", true, "Voice Chat stumm wenn Maske getragen wird"); cfgMonsterInvisible = ((BaseUnityPlugin)this).Config.Bind<bool>("Gameplay", "Monster-Unsichtbarkeit", true, "Monster ignorieren den Spieler mit Maske"); cfgAutoAttachChance = ((BaseUnityPlugin)this).Config.Bind<int>("Gameplay", "Auto-Aufsetz Chance (%)", 20, new ConfigDescription("Chance dass die Maske sich beim Halten/Switchen verflucht", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>())); cfgShopPrice = ((BaseUnityPlugin)this).Config.Bind<int>("Shop", "Shop-Preis", 0, new ConfigDescription("Preis im Shop (0 = gratis)", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 2000), Array.Empty<object>())); cfgTransferCooldown = ((BaseUnityPlugin)this).Config.Bind<float>("Gameplay", "Transfer-Cooldown (Sekunden)", 5f, new ConfigDescription("Cooldown nach Uebergabe der Maske", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 30f), Array.Empty<object>())); _harmony = new Harmony("CursedMaskMod"); _harmony.PatchAll(typeof(HauntedMask_EquipItem_Patch)); _harmony.PatchAll(typeof(HauntedMask_DiscardItem_Patch)); _harmony.PatchAll(typeof(HauntedMask_BeginAttachment_Patch)); _harmony.PatchAll(typeof(HauntedMask_Update_Patch)); _harmony.PatchAll(typeof(HauntedMask_LateUpdate_Patch)); _harmony.PatchAll(typeof(HauntedMask_MaskClampToHead_Patch)); _harmony.PatchAll(typeof(HauntedMask_ItemActivate_Patch)); _harmony.PatchAll(typeof(HauntedMask_AttachServerRpc_Patch)); _harmony.PatchAll(typeof(HauntedMask_AttachClientRpc_Patch)); _harmony.PatchAll(typeof(HauntedMask_AttachToPlayerOnLocalClient_Patch)); _harmony.PatchAll(typeof(HauntedMask_FinishAttaching_Patch)); _harmony.PatchAll(typeof(HauntedMask_PocketItem_Patch)); _harmony.PatchAll(typeof(HauntedMask_CreateMimic_Patch)); _harmony.PatchAll(typeof(EnemyAI_PlayerIsTargetable_Patch)); _harmony.PatchAll(typeof(EnemyAI_CheckLineOfSightForPlayer_Patch)); _harmony.PatchAll(typeof(EnemyAI_CheckLineOfSightForClosestPlayer_Patch)); _harmony.PatchAll(typeof(EnemyAI_GetClosestPlayer_Patch)); _harmony.PatchAll(typeof(Terminal_Awake_Patch)); SalesArrayHook.Install(); _harmony.PatchAll(typeof(Player_SwitchToItemSlot_Patch)); _harmony.PatchAll(typeof(Player_ScrollMouse_Patch)); _harmony.PatchAll(typeof(Player_BeginGrabObject_Patch)); _harmony.PatchAll(typeof(InteractTrigger_Interact_Patch)); _harmony.PatchAll(typeof(Player_KillPlayer_Patch)); _harmony.PatchAll(typeof(StartOfRound_ShipLeave_Patch)); _harmony.PatchAll(typeof(StartOfRound_EndOfGame_Patch)); _harmony.PatchAll(typeof(StartOfRound_ReviveDeadPlayers_Patch)); _harmony.PatchAll(typeof(StartOfRound_ResetShip_Patch)); _harmony.PatchAll(typeof(StartOfRound_Start_Patch)); _harmony.PatchAll(typeof(GameNetworkManager_Disconnect_Patch)); Logger.LogInfo((object)"Harmony patches applied (inkl. Netzwerk-Sync)."); } } [HarmonyPatch(typeof(StartOfRound), "Start")] internal static class StartOfRound_Start_Patch { [HarmonyPostfix] private static void Postfix() { CurseNetwork.Register(); CurseGlobalUpdater.EnsureExists(); Plugin.Logger.LogInfo((object)"[CursedMask] Netzwerk + GlobalUpdater initialisiert!"); } } [HarmonyPatch(typeof(GameNetworkManager), "Disconnect")] internal static class GameNetworkManager_Disconnect_Patch { [HarmonyPrefix] private static void Prefix() { try { CurseNetwork.Unregister(); CursedMaskBehaviour.CleanupAllCurses(); Plugin.MaskedPlayer = null; } catch { } } } [HarmonyPatch(typeof(Terminal), "Awake")] internal static class Terminal_Awake_Patch { [HarmonyPostfix] private static void Postfix(Terminal __instance) { try { Item val = null; if ((Object)(object)StartOfRound.Instance != (Object)null && (Object)(object)StartOfRound.Instance.allItemsList != (Object)null) { foreach (Item items in StartOfRound.Instance.allItemsList.itemsList) { if (!((Object)(object)items == (Object)null)) { string text = items.itemName?.ToLower() ?? ""; if (text.Contains("comedy") || text.Contains("tragedy")) { val = items; break; } } } } if ((Object)(object)val == (Object)null) { Plugin.Logger.LogWarning((object)"[CursedMask] Keine Maske in allItemsList gefunden!"); return; } int num = (val.creditsWorth = Plugin.cfgShopPrice.Value); Item[] buyableItemsList = __instance.buyableItemsList; Item[] array = buyableItemsList; foreach (Item val2 in array) { if ((Object)(object)val2 != (Object)null && val2.itemName == val.itemName) { Plugin.Logger.LogInfo((object)("[CursedMask] " + val.itemName + " ist bereits im Shop")); return; } } List<Item> list = new List<Item>(buyableItemsList); list.Add(val); __instance.buyableItemsList = list.ToArray(); List<int> list2 = ((__instance.itemSalesPercentages == null) ? new List<int>() : new List<int>(__instance.itemSalesPercentages)); while (list2.Count < __instance.buyableItemsList.Length) { list2.Add(100); } __instance.itemSalesPercentages = list2.ToArray(); int num2 = __instance.buyableItemsList.Length - 1; AddMaskToBuyKeywords(__instance, val, num2, num); Plugin.Logger.LogInfo((object)$"[CursedMask] {val.itemName} zum Shop hinzugefuegt! Index={num2}, Preis={num}"); } catch (Exception arg) { Plugin.Logger.LogError((object)$"[CursedMask] Terminal-Patch Fehler: {arg}"); } } private static void AddMaskToBuyKeywords(Terminal terminal, Item maskItem, int buyIndex, int price) { //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Expected O, but got Unknown //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Expected O, but got Unknown //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Expected O, but got Unknown TerminalNode val = ScriptableObject.CreateInstance<TerminalNode>(); val.displayText = "You have requested to order " + maskItem.itemName + ". Amount: [variableAmount].\nTotal cost of items: [totalCost].\n\nPlease CONFIRM or DENY.\n\n"; val.clearPreviousText = true; val.maxCharactersToType = 25; val.isConfirmationNode = true; val.buyItemIndex = buyIndex; val.overrideOptions = true; TerminalNode val2 = ScriptableObject.CreateInstance<TerminalNode>(); val2.displayText = "Ordered [variableAmount] " + maskItem.itemName + ". Your new balance is [playerCredits].\n\n"; val2.clearPreviousText = true; val2.maxCharactersToType = 25; val2.buyItemIndex = buyIndex; val2.isConfirmationNode = false; TerminalNode val3 = ScriptableObject.CreateInstance<TerminalNode>(); val3.displayText = "Cancelled order.\n\n"; val3.clearPreviousText = true; TerminalKeyword val4 = null; TerminalKeyword val5 = null; TerminalKeyword[] allKeywords = terminal.terminalNodes.allKeywords; foreach (TerminalKeyword val6 in allKeywords) { if (val6.word == "confirm") { val4 = val6; } if (val6.word == "deny") { val5 = val6; } } if ((Object)(object)val4 != (Object)null && (Object)(object)val5 != (Object)null) { val.terminalOptions = (CompatibleNoun[])(object)new CompatibleNoun[2] { new CompatibleNoun { noun = val4, result = val2 }, new CompatibleNoun { noun = val5, result = val3 } }; } TerminalKeyword val7 = ScriptableObject.CreateInstance<TerminalKeyword>(); val7.word = "mask"; val7.isVerb = false; val7.defaultVerb = null; TerminalKeyword val8 = null; allKeywords = terminal.terminalNodes.allKeywords; foreach (TerminalKeyword val9 in allKeywords) { if (val9.word == "buy") { val8 = val9; break; } } if ((Object)(object)val8 != (Object)null) { CompatibleNoun item = new CompatibleNoun { noun = val7, result = val }; List<CompatibleNoun> list = new List<CompatibleNoun>(); if (val8.compatibleNouns != null) { list.AddRange(val8.compatibleNouns); } list.Add(item); val8.compatibleNouns = list.ToArray(); } List<TerminalKeyword> list2 = new List<TerminalKeyword>(terminal.terminalNodes.allKeywords); list2.Add(val7); terminal.terminalNodes.allKeywords = list2.ToArray(); } } internal static class SalesArrayHook { [CompilerGenerated] private static class <>O { public static hook_SetItemSales <0>__Terminal_SetItemSales; } private static bool _hooked; internal static void Install() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown if (!_hooked) { object obj = <>O.<0>__Terminal_SetItemSales; if (obj == null) { hook_SetItemSales val = Terminal_SetItemSales; <>O.<0>__Terminal_SetItemSales = val; obj = (object)val; } Terminal.SetItemSales += (hook_SetItemSales)obj; _hooked = true; Plugin.Logger.LogInfo((object)"[CursedMask] MonoMod On-Hook fuer Terminal.SetItemSales installiert!"); } } private static void FixSalesArray(Terminal terminal) { if (terminal.buyableItemsList == null) { return; } int num = terminal.buyableItemsList.Length; if (terminal.itemSalesPercentages == null || terminal.itemSalesPercentages.Length < num) { List<int> list = ((terminal.itemSalesPercentages == null) ? new List<int>() : new List<int>(terminal.itemSalesPercentages)); while (list.Count < num) { list.Add(100); } terminal.itemSalesPercentages = list.ToArray(); Plugin.Logger.LogInfo((object)$"[CursedMask] itemSalesPercentages auf {num} erweitert"); } } private static void Terminal_SetItemSales(orig_SetItemSales orig, Terminal self) { try { FixSalesArray(self); } catch { } try { orig.Invoke(self); } catch (IndexOutOfRangeException) { Plugin.Logger.LogWarning((object)"[CursedMask] SetItemSales IndexOutOfRange abgefangen!"); } try { FixSalesArray(self); } catch { } } } [HarmonyPatch(typeof(HauntedMaskItem), "EquipItem")] internal static class HauntedMask_EquipItem_Patch { [HarmonyPostfix] private static void Postfix(HauntedMaskItem __instance) { CursedMaskBehaviour cursedMaskBehaviour = ((Component)__instance).GetComponent<CursedMaskBehaviour>(); if ((Object)(object)cursedMaskBehaviour == (Object)null) { cursedMaskBehaviour = ((Component)__instance).gameObject.AddComponent<CursedMaskBehaviour>(); Plugin.Logger.LogInfo((object)"[CursedMask] CursedMaskBehaviour hinzugefuegt"); } PlayerControllerB val = GameNetworkManager.Instance?.localPlayerController; if ((Object)(object)val == (Object)null || (Object)(object)((GrabbableObject)__instance).playerHeldBy == (Object)null || ((GrabbableObject)__instance).playerHeldBy != val) { return; } if (cursedMaskBehaviour.IsOnCooldown()) { Plugin.Logger.LogInfo((object)"[CursedMask] Transfer-Cooldown aktiv, kein Fluch."); return; } if (cursedMaskBehaviour.AlreadyCursed) { Plugin.Logger.LogInfo((object)"[CursedMask] Maske ist bereits verflucht! 100% Uebernahme!"); cursedMaskBehaviour.OnMaskEquipped(val); CurseNetwork.ClientNotifyCurse(val.actualClientId); return; } FieldInfo field = typeof(HauntedMaskItem).GetField("maskOn", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null && (bool)field.GetValue(__instance)) { cursedMaskBehaviour.OnMaskEquipped(val); CurseNetwork.ClientNotifyCurse(val.actualClientId); return; } int value = Plugin.cfgAutoAttachChance.Value; int num = Random.Range(0, 100); Plugin.Logger.LogInfo((object)$"[CursedMask] Wuerfeln: {num} (brauche < {value})"); if (num < value) { Plugin.Logger.LogInfo((object)"[CursedMask] FLUCH AKTIVIERT! Nur ICH weiss davon."); cursedMaskBehaviour.OnMaskEquipped(val); CurseNetwork.ClientNotifyCurse(val.actualClientId); } } } [HarmonyPatch(typeof(HauntedMaskItem), "DiscardItem")] internal static class HauntedMask_DiscardItem_Patch { [HarmonyPrefix] private static void Prefix(HauntedMaskItem __instance) { CursedMaskBehaviour component = ((Component)__instance).GetComponent<CursedMaskBehaviour>(); if ((Object)(object)component != (Object)null && component.IsTransferring) { component.OnMaskRemoved(); component.IsTransferring = false; Plugin.Logger.LogInfo((object)"[CursedMask] E-Transfer: Fluch vom Spieler entfernt"); } } } [HarmonyPatch(typeof(HauntedMaskItem), "BeginAttachment")] internal static class HauntedMask_BeginAttachment_Patch { [HarmonyPrefix] private static bool Prefix(HauntedMaskItem __instance) { MaskStateHelper.ResetVanillaMaskState(__instance); return false; } } internal static class MaskStateHelper { internal static void ResetVanillaMaskState(HauntedMaskItem mask) { try { BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; FieldInfo field = typeof(HauntedMaskItem).GetField("attaching", bindingAttr); if (field != null) { field.SetValue(mask, false); } FieldInfo field2 = typeof(HauntedMaskItem).GetField("maskOn", bindingAttr); if (field2 != null) { field2.SetValue(mask, false); } FieldInfo field3 = typeof(HauntedMaskItem).GetField("maskIsHaunted", bindingAttr); if (field3 != null) { field3.SetValue(mask, false); } FieldInfo field4 = typeof(HauntedMaskItem).GetField("finishedAttaching", bindingAttr); if (field4 != null) { field4.SetValue(mask, false); } FieldInfo field5 = typeof(HauntedMaskItem).GetField("clampedToHead", bindingAttr); if (field5 != null) { field5.SetValue(mask, false); } ((GrabbableObject)mask).grabbable = true; ((GrabbableObject)mask).grabbableToEnemies = true; if ((Object)(object)mask.maskEyesFilled != (Object)null && ((Renderer)mask.maskEyesFilled).enabled) { ((Renderer)mask.maskEyesFilled).enabled = false; } if ((Object)(object)mask.currentHeadMask != (Object)null && ((Component)mask.currentHeadMask).gameObject.activeSelf) { ((Component)mask.currentHeadMask).gameObject.SetActive(false); } } catch { } } internal static void SuppressVanillaAttaching(HauntedMaskItem mask) { try { BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; FieldInfo field = typeof(HauntedMaskItem).GetField("attaching", bindingAttr); if (field != null && (bool)field.GetValue(mask)) { field.SetValue(mask, false); } FieldInfo field2 = typeof(HauntedMaskItem).GetField("maskIsHaunted", bindingAttr); if (field2 != null && (bool)field2.GetValue(mask)) { field2.SetValue(mask, false); } FieldInfo field3 = typeof(HauntedMaskItem).GetField("maskOn", bindingAttr); if (field3 != null && (bool)field3.GetValue(mask)) { field3.SetValue(mask, false); } FieldInfo field4 = typeof(HauntedMaskItem).GetField("finishedAttaching", bindingAttr); if (field4 != null && (bool)field4.GetValue(mask)) { field4.SetValue(mask, false); } FieldInfo field5 = typeof(HauntedMaskItem).GetField("clampedToHead", bindingAttr); if (field5 != null && (bool)field5.GetValue(mask)) { field5.SetValue(mask, false); } if (!((GrabbableObject)mask).grabbable) { ((GrabbableObject)mask).grabbable = true; } if ((Object)(object)mask.maskEyesFilled != (Object)null && ((Renderer)mask.maskEyesFilled).enabled) { ((Renderer)mask.maskEyesFilled).enabled = false; } if ((Object)(object)mask.currentHeadMask != (Object)null && ((Component)mask.currentHeadMask).gameObject.activeSelf) { ((Component)mask.currentHeadMask).gameObject.SetActive(false); } } catch { } } internal static void EnsurePickupable(HauntedMaskItem mask) { try { ((GrabbableObject)mask).grabbable = true; ((GrabbableObject)mask).grabbableToEnemies = true; Collider[] componentsInChildren = ((Component)mask).GetComponentsInChildren<Collider>(true); foreach (Collider val in componentsInChildren) { if (!val.enabled) { val.enabled = true; } } Renderer[] componentsInChildren2 = ((Component)mask).GetComponentsInChildren<Renderer>(true); foreach (Renderer val2 in componentsInChildren2) { if (!val2.enabled) { val2.enabled = true; } } try { ScanNodeProperties componentInChildren = ((Component)mask).GetComponentInChildren<ScanNodeProperties>(true); if ((Object)(object)componentInChildren != (Object)null && !((Component)componentInChildren).gameObject.activeSelf) { ((Component)componentInChildren).gameObject.SetActive(true); } } catch { } try { ((GrabbableObject)mask).EnablePhysics(true); } catch { } } catch { } } } [HarmonyPatch(typeof(HauntedMaskItem), "Update")] internal static class HauntedMask_Update_Patch { [HarmonyPrefix] private static void Prefix(HauntedMaskItem __instance) { MaskStateHelper.SuppressVanillaAttaching(__instance); } [HarmonyPostfix] private static void Postfix(HauntedMaskItem __instance) { MaskStateHelper.SuppressVanillaAttaching(__instance); } } [HarmonyPatch(typeof(HauntedMaskItem), "LateUpdate")] internal static class HauntedMask_LateUpdate_Patch { [HarmonyPrefix] private static void Prefix(HauntedMaskItem __instance) { MaskStateHelper.SuppressVanillaAttaching(__instance); } [HarmonyPostfix] private static void Postfix(HauntedMaskItem __instance) { MaskStateHelper.SuppressVanillaAttaching(__instance); } } [HarmonyPatch(typeof(HauntedMaskItem), "MaskClampToHeadAnimationEvent")] internal static class HauntedMask_MaskClampToHead_Patch { [HarmonyPrefix] private static bool Prefix() { return false; } } [HarmonyPatch(typeof(HauntedMaskItem), "ItemActivate")] internal static class HauntedMask_ItemActivate_Patch { [HarmonyPrefix] private static bool Prefix() { return false; } } [HarmonyPatch(typeof(HauntedMaskItem), "AttachServerRpc")] internal static class HauntedMask_AttachServerRpc_Patch { [HarmonyPrefix] private static bool Prefix(HauntedMaskItem __instance) { MaskStateHelper.ResetVanillaMaskState(__instance); return false; } } [HarmonyPatch(typeof(HauntedMaskItem), "AttachClientRpc")] internal static class HauntedMask_AttachClientRpc_Patch { [HarmonyPrefix] private static bool Prefix(HauntedMaskItem __instance) { MaskStateHelper.ResetVanillaMaskState(__instance); return false; } } [HarmonyPatch(typeof(HauntedMaskItem), "AttachToPlayerOnLocalClient")] internal static class HauntedMask_AttachToPlayerOnLocalClient_Patch { [HarmonyPrefix] private static bool Prefix(HauntedMaskItem __instance) { MaskStateHelper.ResetVanillaMaskState(__instance); return false; } } [HarmonyPatch(typeof(HauntedMaskItem), "FinishAttaching")] internal static class HauntedMask_FinishAttaching_Patch { [HarmonyPrefix] private static bool Prefix(HauntedMaskItem __instance) { MaskStateHelper.ResetVanillaMaskState(__instance); return false; } } [HarmonyPatch(typeof(HauntedMaskItem), "PocketItem")] internal static class HauntedMask_PocketItem_Patch { [HarmonyPostfix] private static void Postfix(HauntedMaskItem __instance) { MaskStateHelper.SuppressVanillaAttaching(__instance); } } [HarmonyPatch(typeof(HauntedMaskItem), "CreateMimicServerRpc")] internal static class HauntedMask_CreateMimic_Patch { [HarmonyPrefix] private static bool Prefix() { return false; } } [HarmonyPatch(typeof(EnemyAI), "PlayerIsTargetable")] internal static class EnemyAI_PlayerIsTargetable_Patch { [HarmonyPostfix] private static void Postfix(PlayerControllerB playerScript, ref bool __result) { if (Plugin.cfgMonsterInvisible.Value && (Object)(object)Plugin.MaskedPlayer != (Object)null && playerScript == Plugin.MaskedPlayer) { __result = false; } } } [HarmonyPatch(typeof(EnemyAI), "CheckLineOfSightForPlayer")] internal static class EnemyAI_CheckLineOfSightForPlayer_Patch { [HarmonyPostfix] private static void Postfix(ref PlayerControllerB __result) { if (Plugin.cfgMonsterInvisible.Value && (Object)(object)__result != (Object)null && (Object)(object)Plugin.MaskedPlayer != (Object)null && __result == Plugin.MaskedPlayer && CurseHelper.HasOtherAlivePlayers()) { __result = null; } } } [HarmonyPatch(typeof(EnemyAI), "CheckLineOfSightForClosestPlayer")] internal static class EnemyAI_CheckLineOfSightForClosestPlayer_Patch { [HarmonyPostfix] private static void Postfix(ref PlayerControllerB __result) { if (Plugin.cfgMonsterInvisible.Value && (Object)(object)__result != (Object)null && (Object)(object)Plugin.MaskedPlayer != (Object)null && __result == Plugin.MaskedPlayer && CurseHelper.HasOtherAlivePlayers()) { __result = null; } } } [HarmonyPatch(typeof(EnemyAI), "GetClosestPlayer")] internal static class EnemyAI_GetClosestPlayer_Patch { [HarmonyPostfix] private static void Postfix(ref PlayerControllerB __result) { if (Plugin.cfgMonsterInvisible.Value && (Object)(object)__result != (Object)null && (Object)(object)Plugin.MaskedPlayer != (Object)null && __result == Plugin.MaskedPlayer && CurseHelper.HasOtherAlivePlayers()) { __result = null; } } } internal static class CurseHelper { internal static bool HasOtherAlivePlayers() { try { if ((Object)(object)StartOfRound.Instance == (Object)null) { return false; } PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; if (allPlayerScripts == null) { return false; } PlayerControllerB[] array = allPlayerScripts; foreach (PlayerControllerB val