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 YippeeKeyMod v1.3.2
YippeeKey.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using CSync.Lib; using CSync.Util; using GameNetcodeStuff; using HarmonyLib; using Microsoft.CodeAnalysis; using Unity.Collections; using Unity.Netcode; using UnityEngine; using YippeeKey.ConfigSync; using YippeeKey.LocalScripts; using YippeeKey.NetcodePatcher; using YippeeKey.Patches; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("YippeeKey")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+4f6ffe2d4f5dee1cc95a5ff47ab3af046ed80b6b")] [assembly: AssemblyProduct("YippeeKey")] [assembly: AssemblyTitle("YippeeKey")] [assembly: AssemblyVersion("1.0.0.0")] [module: NetcodePatchedAssembly] internal class <Module> { static <Module>() { } } namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace YippeeKey { public sealed class NetworkHandlerYP : NetworkBehaviour { public static NetworkHandlerYP Instance { get; private set; } public override void OnNetworkSpawn() { YippeeKeyPlugin.Instance.Log("Despawning NetworkObject"); YippeeKeyPlugin.Instance.Log("NetworkManager existant? " + (((Object)(object)NetworkManager.Singleton != (Object)null) ? "Yes!" : "No")); if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer) { try { NetworkObject component = ((Component)this).gameObject.GetComponent<NetworkObject>(); YippeeKeyPlugin.Instance.Log("networkObject existant? " + (((Object)(object)component != (Object)null) ? "Yes!" : "No")); if (component != null) { component.Spawn(false); } } catch (Exception) { YippeeKeyPlugin.Instance.Log("networkObject was already spawned."); } } Instance = this; ((NetworkBehaviour)this).OnNetworkSpawn(); } [ServerRpc(RequireOwnership = false)] public void ScreamYippeeServerRPC(string eventName, bool isCallerDead) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(3132667294u, val, (RpcDelivery)0); bool flag = eventName != null; ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives)); if (flag) { ((FastBufferWriter)(ref val2)).WriteValueSafe(eventName, false); } ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref isCallerDead, default(ForPrimitives)); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3132667294u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { YippeeKeyPlugin.Instance.Log("Server event received"); YippeeKeyPlugin.Instance.Log("Notifying Clients"); ScreamYippeeClientRPC(eventName, isCallerDead); } } [ClientRpc] public void ScreamYippeeClientRPC(string eventName, bool isCallerDead) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(810594168u, val, (RpcDelivery)0); bool flag = eventName != null; ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives)); if (flag) { ((FastBufferWriter)(ref val2)).WriteValueSafe(eventName, false); } ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref isCallerDead, default(ForPrimitives)); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 810594168u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { YippeeKeyPlugin.Instance.Log("Event received from Server for " + eventName); NetworkObjectManagerYK.playYippeeAtPlayer(ref eventName, ref isCallerDead); } } protected override void __initializeVariables() { ((NetworkBehaviour)this).__initializeVariables(); } [RuntimeInitializeOnLoadMethod] internal static void InitializeRPCS_NetworkHandlerYP() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown NetworkManager.__rpc_func_table.Add(3132667294u, new RpcReceiveHandler(__rpc_handler_3132667294)); NetworkManager.__rpc_func_table.Add(810594168u, new RpcReceiveHandler(__rpc_handler_810594168)); } private static void __rpc_handler_3132667294(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { bool flag = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives)); string eventName = null; if (flag) { ((FastBufferReader)(ref reader)).ReadValueSafe(ref eventName, false); } bool isCallerDead = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref isCallerDead, default(ForPrimitives)); target.__rpc_exec_stage = (__RpcExecStage)1; ((NetworkHandlerYP)(object)target).ScreamYippeeServerRPC(eventName, isCallerDead); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_810594168(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { bool flag = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives)); string eventName = null; if (flag) { ((FastBufferReader)(ref reader)).ReadValueSafe(ref eventName, false); } bool isCallerDead = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref isCallerDead, default(ForPrimitives)); target.__rpc_exec_stage = (__RpcExecStage)2; ((NetworkHandlerYP)(object)target).ScreamYippeeClientRPC(eventName, isCallerDead); target.__rpc_exec_stage = (__RpcExecStage)0; } } protected internal override string __getTypeName() { return "NetworkHandlerYP"; } } [BepInPlugin("QMLCYipeeKey_plugin", "Yippee key", "1.3.2.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] internal sealed class YippeeKeyPlugin : BaseUnityPlugin { public const string GUID = "QMLCYipeeKey_plugin"; public const string Name = "Yippee key"; public const string Version = "1.3.2.0"; public AssetBundle? MainAssetBundle; public static YippeeKeyPlugin Instance; public YippeeSyncedConfig GetConfig; private Harmony harmony = new Harmony("net.quadmesh.yippeekey.plugin"); private void Awake() { //IL_00eb: Unknown result type (might be due to invalid IL or missing references) Instance = this; SetupConfigKeys(); string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location); string text = Path.Combine(directoryName, "yippeekey"); MainAssetBundle = AssetBundle.LoadFromFile(text); if ((Object)(object)MainAssetBundle != (Object)null) { ((BaseUnityPlugin)this).Logger.LogInfo((object)(((Object)MainAssetBundle).name + " Should be loaded succesfully.")); } Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "QMLCYipeeKey_plugin"); harmony.PatchAll(typeof(YippeeSyncedConfig)); NetcodePatcher(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Yippe mod ready!"); ((BaseUnityPlugin)this).Logger.LogInfo((object)("Debugging? [" + BeautifyBool(SyncedInstance<YippeeSyncedConfig>.Instance.DebugKey.Value) + "]")); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Key to use Yippe: '{SyncedInstance<YippeeSyncedConfig>.Instance.ConfigKey.Value}'"); } public void Log(string message) { if (SyncedInstance<YippeeSyncedConfig>.Default.DebugKey.Value) { ((BaseUnityPlugin)this).Logger.LogInfo((object)message); } } public static string BeautifyBool(bool value) { return value ? "Yes!" : "Nope."; } public void LogError(string message) { ((BaseUnityPlugin)this).Logger.LogError((object)message); } private void SetupConfigKeys() { GetConfig = new YippeeSyncedConfig(((BaseUnityPlugin)this).Config); } private static void NetcodePatcher() { Type[] types = Assembly.GetExecutingAssembly().GetTypes(); Type[] array = types; foreach (Type type in array) { MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); MethodInfo[] array2 = methods; foreach (MethodInfo methodInfo in array2) { object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false); if (customAttributes.Length != 0) { methodInfo.Invoke(null, null); } } } } } } namespace YippeeKey.Patches { [HarmonyPatch] internal class DeadBodyInfoPatch { [HarmonyPrefix] [HarmonyPatch(typeof(DeadBodyInfo), "DeactivateBody")] private static void ReparentOnRespawn(DeadBodyInfo __instance) { foreach (YippeeSoundManager value in NetworkObjectManagerYK.soundManagers.Values) { if (value.Player.isPlayerDead) { YippeeKeyPlugin.Instance.Log("Reparenting soundmanager to normal body"); ((Component)NetworkObjectManagerYK.soundManagers[((Object)((Component)__instance.playerScript).gameObject).name]).transform.SetParent(((Component)__instance.playerScript).transform); YippeeKeyPlugin.Instance.Log("Reparented " + ((Object)((Component)__instance).gameObject).name); } } } } [HarmonyPatch] public sealed class NetworkObjectManagerYK { public static Dictionary<string, YippeeSoundManager> soundManagers = new Dictionary<string, YippeeSoundManager>(); private static GameObject? networkPrefab = null; [HarmonyPostfix] [HarmonyPatch(typeof(GameNetworkManager), "Start")] public static void Init() { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown if ((Object)(object)networkPrefab != (Object)null) { YippeeKeyPlugin.Instance.Log("Networkmanager already exist"); } YippeeKeyPlugin.Instance.Log("Getting network prefab setup"); networkPrefab = (GameObject)YippeeKeyPlugin.Instance.MainAssetBundle.LoadAsset("NetworkHandlerYippeeKey"); YippeeKeyPlugin.Instance.Log("Adding NetworkHandlerYP"); networkPrefab.AddComponent<NetworkHandlerYP>(); YippeeKeyPlugin.Instance.Log("Adding Networked prefab"); NetworkManager.Singleton.AddNetworkPrefab(networkPrefab); } [HarmonyPostfix] [HarmonyPatch(typeof(StartOfRound), "Awake")] private static void SpawnNetworkHandler() { //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) YippeeKeyPlugin.Instance.Log("Spawning NetworkHandler"); if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer) { YippeeKeyPlugin.Instance.Log("NetworkHandler spawned!"); YippeeKeyPlugin.Instance.Log("Is networkPrefab existant? " + (((Object)(object)networkPrefab != (Object)null) ? "Yes!" : "Nope")); GameObject val = Object.Instantiate<GameObject>(networkPrefab, Vector3.zero, Quaternion.identity); YippeeKeyPlugin.Instance.Log("Is NetworkHandler existant? " + (((Object)(object)val != (Object)null) ? "Yes!" : "Nope")); NetworkObject component = val.GetComponent<NetworkObject>(); if (component != null) { component.Spawn(false); } } } [HarmonyPostfix] [HarmonyPatch(typeof(GameNetworkManager), "StartDisconnect")] private static void UnsubscribeFromHandler() { YippeeKeyPlugin.Instance.Log("UnSyncing config & Clearing Body references."); soundManagers.Clear(); ((SyncedInstance<YippeeSyncedConfig>)(object)SyncedInstance<YippeeSyncedConfig>.Instance).RevertSync(); } public static void SendYippeeEventToServer(string eventName, bool isCallerDead) { YippeeKeyPlugin.Instance.Log("Sending event to rest of lobby."); NetworkHandlerYP.Instance.ScreamYippeeServerRPC(eventName, isCallerDead); } public static void playYippeeAtPlayer(ref string playerName, ref bool isCallerDead) { //IL_0130: Unknown result type (might be due to invalid IL or missing references) if (!soundManagers.ContainsKey(playerName)) { YippeeKeyPlugin.Instance.LogError("Unable to get sound manager for " + playerName + "!"); } else if (SyncedInstance<YippeeSyncedConfig>.Instance.DeadPlayersYippeeAlivePlayers.Value || GameNetworkManager.Instance.localPlayerController.isPlayerDead) { GameObject gameObject = ((Component)soundManagers[playerName]).gameObject; Transform transform = gameObject.transform; YippeeKeyPlugin.Instance.Log(playerName + "'s transform gotten from dictionary."); soundManagers[playerName].Play(isCallerDead); if (!SyncedInstance<YippeeSyncedConfig>.Instance.NotifyEnemies.Value) { YippeeKeyPlugin.Instance.Log("Host-synced config dictates enemies are not alerted."); return; } if ((isCallerDead && !SyncedInstance<YippeeSyncedConfig>.Instance.DeadPlayerAlertsEnemyAI.Value) || !SyncedInstance<YippeeSyncedConfig>.Instance.DeadPlayersYippeeAlivePlayers.Value) { YippeeKeyPlugin.Instance.Log("Host-synced config dictates Dead players cannot alert enemies."); return; } YippeeKeyPlugin.Instance.Log("Host-synced config dictates enemies are alerted."); RoundManager.Instance.PlayAudibleNoise(transform.position, (float)SyncedInstance<YippeeSyncedConfig>.Instance.EnemyAIDetectionRange.Value, SyncedInstance<YippeeSyncedConfig>.Instance.EnemyAIDetectionVolume.Value, 0, false, 0); } } } [HarmonyPatch] internal sealed class PlayerControllerBPatch { [HarmonyPostfix] [HarmonyPatch(typeof(PlayerControllerB), "OnEnable")] private static void AddInputter(PlayerControllerB __instance) { YippeeInputter yippeeInputter = default(YippeeInputter); ((Component)__instance).gameObject.TryGetComponent<YippeeInputter>(ref yippeeInputter); if ((Object)(object)yippeeInputter == (Object)null) { YippeeKeyPlugin.Instance.Log("YippeInputter added!"); yippeeInputter = ((Component)__instance).gameObject.AddComponent<YippeeInputter>(); } YippeeKeyPlugin.Instance.Log("Setting SoundManager"); ((Component)yippeeInputter).gameObject.SetActive(true); AddSoundManagerToPlayer(__instance); } public static void AddSoundManagerToPlayer(PlayerControllerB playerController) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)((Component)playerController).gameObject.GetComponentInChildren<YippeeSoundManager>())) { YippeeKeyPlugin.Instance.Log("You already have a soundManager, there is no need to add another."); return; } GameObject val = (GameObject)YippeeKeyPlugin.Instance.MainAssetBundle.LoadAsset("YippeSound"); YippeeKeyPlugin.Instance.Log("Prefab for use, loaded!"); GameObject val2 = Object.Instantiate<GameObject>(val, new Vector3(((Component)playerController).gameObject.transform.position.x, ((Component)playerController).gameObject.transform.position.y + 2f, ((Component)playerController).gameObject.transform.position.z), ((Component)playerController).gameObject.transform.rotation, ((Component)playerController).gameObject.transform); YippeeSoundManager yippeeSoundManager = val2.AddComponent<YippeeSoundManager>(); yippeeSoundManager.Player = playerController; NetworkObjectManagerYK.soundManagers.Add(((Object)((Component)playerController).gameObject).name, yippeeSoundManager); YippeeKeyPlugin.Instance.Log("Soundmanager set for " + ((Object)((Component)playerController).gameObject).name); } [HarmonyPostfix] [HarmonyPatch(typeof(PlayerControllerB), "SpawnDeadBody")] private static void ReparentOnDeath(PlayerControllerB __instance) { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Invalid comparison between Unknown and I4 if (!((Object)(object)__instance.deadBody != (Object)null) || !((Behaviour)__instance.deadBody).enabled) { return; } YippeeKeyPlugin.Instance.Log("Reparenting soundmanager to dead body"); try { if ((int)__instance.causeOfDeath > 0) { ((Component)NetworkObjectManagerYK.soundManagers[((Object)((Component)__instance).gameObject).name]).transform.SetParent(((Component)__instance.deadBody).transform); YippeeKeyPlugin.Instance.Log("Reparented " + ((Object)((Component)__instance).gameObject).name); } } catch { YippeeKeyPlugin.Instance.LogError("Unable to set the YippeeSoundManager to the dead body, most likey Nullref."); } } } } namespace YippeeKey.LocalScripts { public class YippeeInputter : MonoBehaviour { private PlayerControllerB? _localPlayer; private bool cooldownActive = false; private float cooldown = SyncedInstance<YippeeSyncedConfig>.Instance.CooldownTime.Value; private float CoolDownStartTime => SyncedInstance<YippeeSyncedConfig>.Instance.CooldownTime.Value; private void Awake() { _localPlayer = ((Component)this).GetComponent<PlayerControllerB>(); } public void Update() { //IL_003a: Unknown result type (might be due to invalid IL or missing references) ManageCooldown(); if ((!SyncedInstance<YippeeSyncedConfig>.Instance.CooldownEnabled.Value || !cooldownActive) && UnityInput.Current.GetKeyDown(SyncedInstance<YippeeSyncedConfig>.Default.ConfigKey.Value) && IsLocal() && !GameNetworkManager.Instance.localPlayerController.inTerminalMenu && !GameNetworkManager.Instance.localPlayerController.quickMenuManager.isMenuOpen && !GameNetworkManager.Instance.localPlayerController.isTypingChat) { NetworkObjectManagerYK.SendYippeeEventToServer(((Object)((Component)GameNetworkManager.Instance.localPlayerController).gameObject).name, GameNetworkManager.Instance.localPlayerController.isPlayerDead); if (SyncedInstance<YippeeSyncedConfig>.Instance.CooldownEnabled.Value) { cooldownActive = true; YippeeKeyPlugin.Instance.Log("Cooldown active"); } } } private void ManageCooldown() { if (cooldownActive) { cooldown -= Time.deltaTime; YippeeKeyPlugin.Instance.Log($"{cooldown}"); if (cooldown <= 0f) { cooldownActive = false; cooldown = CoolDownStartTime; YippeeKeyPlugin.Instance.Log("Cooldown has wore off, time to Yippee!"); } } } private bool IsLocal() { return ((object)_localPlayer).Equals((object?)GameNetworkManager.Instance.localPlayerController); } } public sealed class YippeeSoundManager : MonoBehaviour { private PlayerControllerB player; public DeadBodyInfo DeadBody; public AudioSource YippeeAudio { get; private set; } = null; public ParticleSystem[] ParticleSystems { get; private set; } = (ParticleSystem[])(object)new ParticleSystem[3]; public PlayerControllerB Player { get { return player; } set { player = value; DeadBody = player.deadBody; } } private bool IsLocalPlayerDead => GameNetworkManager.Instance.localPlayerController.isPlayerDead; public void Play(bool isCallerDead) { if ((Object)(object)YippeeAudio == (Object)null) { YippeeAudio = ((Component)this).GetComponent<AudioSource>(); } ResetEffects(); RandomPitch(); if (isCallerDead) { PostMortem(); } PlayYippee(); WalkieTalkie.TransmitOneShotAudio(YippeeAudio, YippeeAudio.clip, 1f); if (!SyncedInstance<YippeeSyncedConfig>.Default.AllowVisuals.Value || (isCallerDead && !IsLocalPlayerDead)) { return; } if ((Object)(object)ParticleSystems[0] == (Object)null) { GetParticleSystems(); } ParticleSystem[] particleSystems = ParticleSystems; foreach (ParticleSystem val in particleSystems) { if (SyncedInstance<YippeeSyncedConfig>.Default.AllowParticeSpam.Value) { val.Stop(false); } else { val.Stop(false, (ParticleSystemStopBehavior)0); } val.Play(); } } public void OnDestroy() { NetworkObjectManagerYK.soundManagers.Remove(((Object)((Component)Player).gameObject).name); PlayerControllerBPatch.AddSoundManagerToPlayer(Player); } private void PlayYippee() { if (SyncedInstance<YippeeSyncedConfig>.Default.AllowYippeeOverlap.Value) { YippeeAudio.PlayOneShot(YippeeAudio.clip); } else { YippeeAudio.Stop(); YippeeAudio.Play(); } YippeeKeyPlugin.Instance.Log("Playing Yippee " + YippeeKeyPlugin.BeautifyBool(((Behaviour)YippeeAudio).enabled)); } private void GetParticleSystems() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown int num = 0; foreach (Transform item in ((Component)this).transform) { Transform val = item; ParticleSystems[num] = ((Component)val).GetComponent<ParticleSystem>(); num++; } } private void RandomPitch() { if (SyncedInstance<YippeeSyncedConfig>.Default.RandomPitchedYippee.Value) { YippeeAudio.pitch = Random.Range(0.95f, 1.05f); } } private void PostMortem() { if (IsLocalPlayerDead) { YippeeAudio.spatialBlend = 0f; YippeeAudio.reverbZoneMix = 0f; } else { YippeeAudio.volume *= 0.25f; YippeeAudio.pitch *= 0.75f; } } private void ResetEffects() { YippeeAudio.pitch = 1f; YippeeAudio.volume = SyncedInstance<YippeeSyncedConfig>.Default.YippeeVolume.Value; YippeeAudio.spatialBlend = 1f; YippeeAudio.reverbZoneMix = 1f; } } } namespace YippeeKey.ConfigSync { [DataContract] public class YippeeSyncedConfig : SyncedInstance<YippeeSyncedConfig> { public ConfigEntry<float> DisplayDebugInfo { get; private set; } [DataMember] public SyncedEntry<bool> NotifyEnemies { get; private set; } [DataMember] public SyncedEntry<int> EnemyAIDetectionRange { get; private set; } [DataMember] public SyncedEntry<float> EnemyAIDetectionVolume { get; private set; } [DataMember] public SyncedEntry<bool> CooldownEnabled { get; private set; } [DataMember] public SyncedEntry<float> CooldownTime { get; private set; } [DataMember] public SyncedEntry<bool> DeadPlayersYippeeAlivePlayers { get; private set; } [DataMember] public SyncedEntry<bool> DeadPlayerAlertsEnemyAI { get; private set; } public ConfigEntry<KeyCode> ConfigKey { get; private set; } public ConfigEntry<bool> DebugKey { get; private set; } public ConfigEntry<bool> AllowVisuals { get; private set; } public ConfigEntry<bool> AllowParticeSpam { get; private set; } public ConfigEntry<bool> AllowYippeeOverlap { get; private set; } public ConfigEntry<float> YippeeVolume { get; private set; } public ConfigEntry<bool> RandomPitchedYippee { get; private set; } public YippeeSyncedConfig(ConfigFile cfg) { //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Expected O, but got Unknown base.InitInstance(this); YippeeVolume = cfg.Bind<float>("Gameplay", "Yippee Audio Volume", 1f, "Volume of the Yippee sound itself.\nNote: This will not affect AI detection, only local sound."); NotifyEnemies = Extensions.BindSyncedEntry<bool>(cfg, "Gameplay", "Notify Enemy AI (HOST ONLY)", true, "Notify Enemies when someone shouts 'Yippee!'. This setting will only apply if you are the host."); CooldownEnabled = Extensions.BindSyncedEntry<bool>(cfg, "Gameplay", "Yippee cooldown (HOST ONLY)", false, "Enables cooldowns when you are hosting the instance"); CooldownTime = Extensions.BindSyncedEntry<float>(cfg, "Gameplay", "Yippee cooldown time (HOST ONLY)", 2f, "The time (in seconds) it will take for the cooldown to stop"); DeadPlayersYippeeAlivePlayers = Extensions.BindSyncedEntry<bool>(cfg, "Gameplay", "Dead players can Yippee (HOST ONLY)", true, "Allow dead players to yippee"); EnemyAIDetectionRange = Extensions.ToSyncedEntry<int>(cfg.Bind<int>("Gameplay Advanced", "EnemyAI detection range (HOST ONLY)", 10, new ConfigDescription("DetectionRange for EnemyAI when shouting 'Yippee!' (HOST ONLY)\nDo not mess with this value unless you know what you're doing!", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 100), Array.Empty<object>()))); EnemyAIDetectionVolume = Extensions.BindSyncedEntry<float>(cfg, "Gameplay Advanced", "EnemyAI detection volume (HOST ONLY)", 1f, "Detection volume for EnemyAI when shouting 'Yippee!' (HOST ONLY)\nNote: This is NOT the volume of the sound, only the volume of which the EnemyAI component hears the sound.\nDo not mess with this value unless you know what you're doing!"); DeadPlayerAlertsEnemyAI = Extensions.BindSyncedEntry<bool>(cfg, "Gameplay Advanced", "Dead players Yippee alerts AI (HOST ONLY)", false, "Dead players can yippe and alert AI (reduced range)"); ConfigKey = cfg.Bind<KeyCode>("Input", "Yippee Key Binding", (KeyCode)105, "The keybind you're using to shout 'Yippee!'"); RandomPitchedYippee = cfg.Bind<bool>("Audio", "Randomly pitched yippee", true, "Makes the pitch of the 'Yippee' when shouting be randomized"); AllowYippeeOverlap = cfg.Bind<bool>("Audio", "Allow overlapping Yippee", false, "Make the audio when spamming Yippe overlap instead of restarting\n(useful with 'Spam Particles')"); AllowVisuals = cfg.Bind<bool>("Visual", "Add visuals", true, "Adds visuals like particles when shouting 'Yippee!'"); AllowParticeSpam = cfg.Bind<bool>("Visual", "Spam particles", false, "Allows particles to be spammed\n(useful with 'Allow Yippee Overlap')"); DebugKey = cfg.Bind<bool>("Misc", "Show Debug Messages", false, "Whether or not debug messages appear inside the log"); RemoveOrphans(cfg); } private void RemoveOrphans(ConfigFile config) { PropertyInfo property = ((object)config).GetType().GetProperty("OrphanedEntries", BindingFlags.Instance | BindingFlags.NonPublic); Dictionary<ConfigDefinition, string> dictionary = (Dictionary<ConfigDefinition, string>)property.GetValue(config, null); dictionary.Clear(); config.Save(); } internal static void RequestSync() { //IL_002d: Unknown result type (might be due to invalid IL or missing references) if (!SyncedInstance<YippeeSyncedConfig>.IsClient) { return; } YippeeKeyPlugin.Instance.Log("Config Sync requested"); FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(ByteSerializer<YippeeSyncedConfig>.IntSize, (Allocator)2, -1); try { Extensions.SendMessage(val, "QMLCYipeeKey_plugin_OnRequestConfigSync", 0uL); } finally { ((IDisposable)(FastBufferWriter)(ref val)).Dispose(); } } internal static void OnRequestSync(ulong clientId, FastBufferReader _) { //IL_0048: 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_0061: Unknown result type (might be due to invalid IL or missing references) if (!SyncedInstance<YippeeSyncedConfig>.IsHost) { return; } YippeeKeyPlugin.Instance.Log("Syncing config"); byte[] array = ByteSerializer<YippeeSyncedConfig>.SerializeToBytes(SyncedInstance<YippeeSyncedConfig>.Instance); int num = array.Length; FastBufferWriter val = default(FastBufferWriter); ((FastBufferWriter)(ref val))..ctor(num + ByteSerializer<YippeeSyncedConfig>.IntSize, (Allocator)2, -1); try { ((FastBufferWriter)(ref val)).WriteValueSafe<int>(ref num, default(ForPrimitives)); ((FastBufferWriter)(ref val)).WriteBytesSafe(array, -1, 0); Extensions.SendMessage(val, "QMLCYipeeKey_plugin_OnReceiveConfigSync", clientId); } catch (Exception arg) { YippeeKeyPlugin.Instance.LogError($"Error occurred syncing config with client: {clientId}\n{arg}"); } finally { ((IDisposable)(FastBufferWriter)(ref val)).Dispose(); } } internal static void OnReceiveSync(ulong _, FastBufferReader reader) { //IL_0040: 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) YippeeKeyPlugin.Instance.Log("Config file received"); if (!((FastBufferReader)(ref reader)).TryBeginRead(ByteSerializer<YippeeSyncedConfig>.IntSize)) { YippeeKeyPlugin.Instance.LogError("Config sync error: Could not begin reading buffer."); return; } int num = default(int); ((FastBufferReader)(ref reader)).ReadValueSafe<int>(ref num, default(ForPrimitives)); if (!((FastBufferReader)(ref reader)).TryBeginRead(num)) { YippeeKeyPlugin.Instance.LogError("Config sync error: Host could not sync."); return; } byte[] array = new byte[num]; ((FastBufferReader)(ref reader)).ReadBytesSafe(ref array, num, 0); try { ((SyncedInstance<YippeeSyncedConfig>)(object)SyncedInstance<YippeeSyncedConfig>.Instance).SyncInstance(array); YippeeKeyPlugin.Instance.Log("Config Synced succesfully!"); YippeeKeyPlugin.Instance.Log("Default config working? " + ((SyncedInstance<YippeeSyncedConfig>.Default == null) ? "Nope" : "Yes!")); YippeeKeyPlugin.Instance.Log("Synced config working? " + ((SyncedInstance<YippeeSyncedConfig>.Instance == null) ? "Nope" : "Yes!")); YippeeKeyPlugin.Instance.Log($"AIdistance:\nlocal:{SyncedInstance<YippeeSyncedConfig>.Default.EnemyAIDetectionRange.Value}\nSynced:{SyncedInstance<YippeeSyncedConfig>.Instance.EnemyAIDetectionRange.Value}"); YippeeKeyPlugin.Instance.Log($"AIVolume:\nlocal:{SyncedInstance<YippeeSyncedConfig>.Default.EnemyAIDetectionVolume.Value}\nSynced:{SyncedInstance<YippeeSyncedConfig>.Instance.EnemyAIDetectionVolume.Value}"); YippeeKeyPlugin.Instance.Log($"NotifyAI:\nlocal:{SyncedInstance<YippeeSyncedConfig>.Default.NotifyEnemies.Value}\nSynced:{SyncedInstance<YippeeSyncedConfig>.Instance.NotifyEnemies.Value}"); YippeeKeyPlugin.Instance.Log($"CooldownEnabled:\nlocal:{SyncedInstance<YippeeSyncedConfig>.Default.CooldownEnabled.Value}\nSynced:{SyncedInstance<YippeeSyncedConfig>.Instance.CooldownEnabled.Value}"); YippeeKeyPlugin.Instance.Log($"CooldownTime:\nlocal:{SyncedInstance<YippeeSyncedConfig>.Default.CooldownTime.Value}\nSynced:{SyncedInstance<YippeeSyncedConfig>.Instance.CooldownTime.Value}"); YippeeKeyPlugin.Instance.Log($"DeadPlayersCanYippee:\nlocal:{SyncedInstance<YippeeSyncedConfig>.Default.DeadPlayersYippeeAlivePlayers.Value}\nSynced:{SyncedInstance<YippeeSyncedConfig>.Instance.DeadPlayersYippeeAlivePlayers.Value}"); YippeeKeyPlugin.Instance.Log($"DeadPlayerAlertEnemyAI:\nlocal:{SyncedInstance<YippeeSyncedConfig>.Default.DeadPlayerAlertsEnemyAI.Value}\nSynced:{SyncedInstance<YippeeSyncedConfig>.Instance.DeadPlayerAlertsEnemyAI.Value}"); } catch (Exception arg) { YippeeKeyPlugin.Instance.LogError($"Error syncing config instance!\n{arg}"); } } [HarmonyPostfix] [HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")] public static void InitializeLocalPlayer() { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown if (SyncedInstance<YippeeSyncedConfig>.IsHost) { SyncedInstance<YippeeSyncedConfig>.MessageManager.RegisterNamedMessageHandler("QMLCYipeeKey_plugin_OnRequestConfigSync", new HandleNamedMessageDelegate(OnRequestSync)); SyncedInstance<YippeeSyncedConfig>.Synced = true; } else { SyncedInstance<YippeeSyncedConfig>.Synced = false; SyncedInstance<YippeeSyncedConfig>.MessageManager.RegisterNamedMessageHandler("QMLCYipeeKey_plugin_OnReceiveConfigSync", new HandleNamedMessageDelegate(OnReceiveSync)); RequestSync(); } } } } namespace YippeeKey.NetcodePatcher { [AttributeUsage(AttributeTargets.Module)] internal class NetcodePatchedAssemblyAttribute : Attribute { } }