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 FapEnergy v1.0.0
com.github.zehsteam.FapEnergy.dll
Decompiled 4 hours agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using Dawn; using GameNetcodeStuff; using HarmonyLib; using LethalConfig; using LethalConfig.ConfigItems; using LethalConfig.ConfigItems.Options; using Microsoft.CodeAnalysis; using Unity.Netcode; using UnityEngine; using UnityEngine.UI; using com.github.zehsteam.FapEnergy.Dependencies; using com.github.zehsteam.FapEnergy.Extensions; using com.github.zehsteam.FapEnergy.Helpers; using com.github.zehsteam.FapEnergy.Managers; using com.github.zehsteam.FapEnergy.NetcodePatcher; using com.github.zehsteam.FapEnergy.Objects; using com.github.zehsteam.FapEnergy.Patches; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Zehs")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyCopyright("Copyright © 2026 Zehs")] [assembly: AssemblyDescription("Marketed as “fuel for maximum performance,” FAP keeps things vague, which is probably for the best. Need to power through work? FAP. Suddenly deep-cleaning your house at midnight? FAP. Considering texting your ex? Maybe put the can down first.")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+0d95f599460d6e2e8c4441ac18668d82f556df9e")] [assembly: AssemblyProduct("FapEnergy")] [assembly: AssemblyTitle("com.github.zehsteam.FapEnergy")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: NetcodePatchedAssembly] [CompilerGenerated] internal sealed class <>z__ReadOnlyList<T> : IEnumerable, ICollection, IList, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection<T>, IList<T> { int ICollection.Count => _items.Count; bool ICollection.IsSynchronized => false; object ICollection.SyncRoot => this; object IList.this[int index] { get { return _items[index]; } set { throw new NotSupportedException(); } } bool IList.IsFixedSize => true; bool IList.IsReadOnly => true; int IReadOnlyCollection<T>.Count => _items.Count; T IReadOnlyList<T>.this[int index] => _items[index]; int ICollection<T>.Count => _items.Count; bool ICollection<T>.IsReadOnly => true; T IList<T>.this[int index] { get { return _items[index]; } set { throw new NotSupportedException(); } } public <>z__ReadOnlyList(List<T> items) { _items = items; } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)_items).GetEnumerator(); } void ICollection.CopyTo(Array array, int index) { ((ICollection)_items).CopyTo(array, index); } int IList.Add(object value) { throw new NotSupportedException(); } void IList.Clear() { throw new NotSupportedException(); } bool IList.Contains(object value) { return ((IList)_items).Contains(value); } int IList.IndexOf(object value) { return ((IList)_items).IndexOf(value); } void IList.Insert(int index, object value) { throw new NotSupportedException(); } void IList.Remove(object value) { throw new NotSupportedException(); } void IList.RemoveAt(int index) { throw new NotSupportedException(); } IEnumerator<T> IEnumerable<T>.GetEnumerator() { return ((IEnumerable<T>)_items).GetEnumerator(); } void ICollection<T>.Add(T item) { throw new NotSupportedException(); } void ICollection<T>.Clear() { throw new NotSupportedException(); } bool ICollection<T>.Contains(T item) { return _items.Contains(item); } void ICollection<T>.CopyTo(T[] array, int arrayIndex) { _items.CopyTo(array, arrayIndex); } bool ICollection<T>.Remove(T item) { throw new NotSupportedException(); } int IList<T>.IndexOf(T item) { return _items.IndexOf(item); } void IList<T>.Insert(int index, T item) { throw new NotSupportedException(); } void IList<T>.RemoveAt(int index) { throw new NotSupportedException(); } } namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace com.github.zehsteam.FapEnergy { internal static class Assets { public static readonly string AssetBundleFileName = "fapenergy_assets"; public static AssetBundle AssetBundle { get; private set; } public static bool IsLoaded { get; private set; } public static Item FapEnergyDrink { get; private set; } public static void Load() { string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string text = Path.Combine(directoryName, AssetBundleFileName); if (!File.Exists(text)) { Logger.LogFatal("Failed to load assets. AssetBundle file could not be found at path \"" + text + "\". Make sure the \"" + AssetBundleFileName + "\" file is in the same folder as the mod's DLL file."); } else { AssetBundle = AssetBundle.LoadFromFile(text); if ((Object)(object)AssetBundle == (Object)null) { Logger.LogFatal("Failed to load assets. AssetBundle is null."); return; } OnAssetBundleLoaded(AssetBundle); IsLoaded = true; } } private static void OnAssetBundleLoaded(AssetBundle assetBundle) { FapEnergyDrink = LoadAsset<Item>("FapEnergyDrink", assetBundle); } private static T LoadAsset<T>(string name, AssetBundle assetBundle) where T : Object { if (string.IsNullOrWhiteSpace(name)) { Logger.LogError("Failed to load asset of type \"" + typeof(T).Name + "\" from AssetBundle. Name is null or whitespace."); return default(T); } if ((Object)(object)assetBundle == (Object)null) { Logger.LogError("Failed to load asset of type \"" + typeof(T).Name + "\" with name \"" + name + "\" from AssetBundle. AssetBundle is null."); return default(T); } T val = assetBundle.LoadAsset<T>(name); if ((Object)(object)val == (Object)null) { Logger.LogError("Failed to load asset of type \"" + typeof(T).Name + "\" with name \"" + name + "\" from AssetBundle. No asset found with that type and name."); return default(T); } return val; } private static bool TryLoadAsset<T>(string name, AssetBundle assetBundle, out T asset) where T : Object { asset = LoadAsset<T>(name, assetBundle); return (Object)(object)asset != (Object)null; } } public static class FapEnergyKeys { public static readonly NamespacedKey<DawnItemInfo> FapEnergyDrink = NamespacedKey<DawnItemInfo>.From("fap_energy", "fap_energy_drink"); } internal static class Logger { public static ManualLogSource ManualLogSource { get; private set; } public static bool IsExtendedLoggingEnabled => ConfigManager.Misc_ExtendedLogging?.Value ?? false; public static void Initialize(ManualLogSource manualLogSource) { ManualLogSource = manualLogSource; } public static void LogDebug(object data) { Log((LogLevel)32, data); } public static void LogInfo(object data, bool extended = false) { Log((LogLevel)16, data, extended); } public static void LogMessage(object data, bool extended = false) { Log((LogLevel)8, data, extended); } public static void LogWarning(object data, bool extended = false) { Log((LogLevel)4, data, extended); } public static void LogError(object data, bool extended = false) { Log((LogLevel)2, data, extended); } public static void LogFatal(object data, bool extended = false) { Log((LogLevel)1, data, extended); } public static void Log(LogLevel logLevel, object data, bool extended = false) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) if (!extended || IsExtendedLoggingEnabled) { ManualLogSource manualLogSource = ManualLogSource; if (manualLogSource != null) { manualLogSource.Log(logLevel, data); } } } } [BepInPlugin("com.github.zehsteam.FapEnergy", "FapEnergy", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] internal class Plugin : BaseUnityPlugin { private readonly Harmony _harmony = new Harmony("com.github.zehsteam.FapEnergy"); internal static Plugin Instance { get; private set; } private void Awake() { Instance = this; Logger.Initialize(Logger.CreateLogSource("com.github.zehsteam.FapEnergy")); Logger.LogInfo("FapEnergy has awoken!"); _harmony.PatchAll(typeof(StartOfRound_Patches)); _harmony.PatchAll(typeof(PlayerControllerB_Patches)); Assets.Load(); if (Assets.IsLoaded) { ConfigManager.Initialize(((BaseUnityPlugin)this).Config); PlayerControllerB_Patches.Initialize(); RegisterItems(); NetworkUtils.NetcodePatcherAwake(); } } private void RegisterItems() { int spawnWeight = ConfigManager.FapEnergyDrink_SpawnWeight.Value; DawnLib.DefineItem(FapEnergyKeys.FapEnergyDrink, Assets.FapEnergyDrink, (Action<ItemInfoBuilder>)delegate(ItemInfoBuilder builder) { builder.DefineScrap((Action<ScrapBuilder>)delegate(ScrapBuilder scrapBuilder) { scrapBuilder.SetWeights((Action<WeightTableBuilder<DawnMoonInfo, SpawnWeightContext>>)delegate(WeightTableBuilder<DawnMoonInfo, SpawnWeightContext> weightTableBuilder) { weightTableBuilder.SetGlobalWeight(spawnWeight); }); }); }); DawnLib.RegisterNetworkPrefab(Assets.FapEnergyDrink.spawnPrefab); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "com.github.zehsteam.FapEnergy"; public const string PLUGIN_NAME = "FapEnergy"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace com.github.zehsteam.FapEnergy.Patches { [HarmonyPatch(typeof(PlayerControllerB))] internal static class PlayerControllerB_Patches { private static Color? _defaultSprintMeterUIColor; public static bool StaminaUIEffectsEnabled => ConfigManager.FapEnergyDrink_StaminaUIEffectsEnabled.Value; public static void Initialize() { FapEnergyStaminaEffect.OnStateChanged = (Action<FapEnergyStaminaEffect.States>)Delegate.Combine(FapEnergyStaminaEffect.OnStateChanged, new Action<FapEnergyStaminaEffect.States>(OnStaminaEffectStateChanged)); Application.quitting += delegate { FapEnergyStaminaEffect.OnStateChanged = (Action<FapEnergyStaminaEffect.States>)Delegate.Remove(FapEnergyStaminaEffect.OnStateChanged, new Action<FapEnergyStaminaEffect.States>(OnStaminaEffectStateChanged)); }; } [HarmonyPatch("LateUpdate")] [HarmonyPostfix] private static void LateUpdate_Patch(PlayerControllerB __instance) { if (!PlayerUtils.IsLocalPlayer(__instance)) { return; } FapEnergyStaminaEffect.Tick(); if (FapEnergyStaminaEffect.State == FapEnergyStaminaEffect.States.InfiniteStamina) { __instance.sprintMeter = 1f; } if (FapEnergyStaminaEffect.State == FapEnergyStaminaEffect.States.StaminaDrained) { __instance.sprintMeter = 0f; if (StaminaUIEffectsEnabled) { float value = 1f - FapEnergyStaminaEffect.StateProgress; SetSprintMeterUIFillAmount(__instance.sprintMeterUI, value); } } } private static void OnStaminaEffectStateChanged(FapEnergyStaminaEffect.States state) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB localPlayerScript = PlayerUtils.LocalPlayerScript; if ((Object)(object)localPlayerScript == (Object)null) { return; } if (!_defaultSprintMeterUIColor.HasValue && FapEnergyStaminaEffect.PreviousState == FapEnergyStaminaEffect.States.None) { _defaultSprintMeterUIColor = ((Graphic)localPlayerScript.sprintMeterUI).color; } if (StaminaUIEffectsEnabled) { if (1 == 0) { } Color val = (Color)(state switch { FapEnergyStaminaEffect.States.InfiniteStamina => Color32.op_Implicit(new Color32((byte)151, (byte)187, (byte)36, byte.MaxValue)), FapEnergyStaminaEffect.States.StaminaDrained => Color32.op_Implicit(new Color32(byte.MaxValue, (byte)0, (byte)0, byte.MaxValue)), _ => ((??)_defaultSprintMeterUIColor) ?? Color32.op_Implicit(new Color32(byte.MaxValue, (byte)118, (byte)0, byte.MaxValue)), }); if (1 == 0) { } Color color = val; ((Graphic)localPlayerScript.sprintMeterUI).color = color; } } private static void SetSprintMeterUIFillAmount(Image image, float value) { if (!((Object)(object)image == (Object)null)) { image.fillAmount = Utils.Remap(value, 0f, 1f, 0.29767f, 0.911f); } } } [HarmonyPatch(typeof(StartOfRound))] internal static class StartOfRound_Patches { [HarmonyPatch("Start")] [HarmonyPostfix] private static void Start_Patch() { ItemHelper.OnLobbyLoaded(); } [HarmonyPatch("EndOfGame")] [HarmonyPostfix] private static void EndOfGame_Patch() { FapEnergyStaminaEffect.Reset(); } [HarmonyPatch("OnLocalDisconnect")] [HarmonyPostfix] private static void OnLocalDisconnect_Patch() { FapEnergyStaminaEffect.Reset(); } } } namespace com.github.zehsteam.FapEnergy.MonoBehaviours { public abstract class AdvancedGrabbableObject : GrabbableObject { public int UniqueId { get; private set; } public string SaveKey => $"{((object)this).GetType().Name}_{UniqueId}"; public virtual void Awake() { if (NetworkUtils.IsServer) { UniqueId = Random.Range(0, 1000000); } } public override void OnNetworkSpawn() { ((NetworkBehaviour)this).OnNetworkSpawn(); if (NetworkUtils.IsServer) { NetworkManager.Singleton.OnClientConnectedCallback += OnClientConnected_Server; } } public override void OnNetworkDespawn() { ((NetworkBehaviour)this).OnNetworkDespawn(); if (NetworkUtils.IsServer) { NetworkManager.Singleton.OnClientConnectedCallback -= OnClientConnected_Server; } } protected virtual void OnClientConnected_Server(ulong clientId) { } public override int GetItemDataToSave() { return UniqueId; } public override void LoadItemSaveData(int saveData) { ((GrabbableObject)this).LoadItemSaveData(saveData); UniqueId = saveData; } protected override void __initializeVariables() { ((GrabbableObject)this).__initializeVariables(); } protected override void __initializeRpcs() { ((GrabbableObject)this).__initializeRpcs(); } protected internal override string __getTypeName() { return "AdvancedGrabbableObject"; } } public class AdvancedNoisemakerProp : AdvancedGrabbableObject { [Space(20f)] [Header("Advanced Noisemaker Prop")] [Space(5f)] public AudioSourceGroup NoiseAudio; public WeightedList<AudioClip> NoiseSFX; [Space(10f)] public float MinVolume = 1f; public float MaxVolume = 1f; public float MinPitch = 1f; public float MaxPitch = 1f; [Space(10f)] public bool UseDynamicCooldown; [Space(10f)] public bool IsEnemyAudible = true; public float EnemyAudibleNoiseRange = 65f; public override void ItemActivate(bool used, bool buttonDown = true) { if (NoiseSFX != null && NoiseSFX.Count != 0 && NoiseSFX.TryGetRandomIndex(out var index)) { PlaySound(index); } } public void PlaySound(int index) { if (NoiseSFX.IsValidIndex(index)) { PlaySound_Rpc(index); PlaySound_Local(index); } } [Rpc(/*Could not decode attribute arguments.*/)] protected void PlaySound_Rpc(int index) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Invalid comparison between Unknown and I4 //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004b: 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_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: 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_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1) { RpcAttributeParams val = new RpcAttributeParams { RequireOwnership = false }; RpcParams val2 = default(RpcParams); FastBufferWriter val3 = ((NetworkBehaviour)this).__beginSendRpc(3275817297u, val2, val, (SendTo)5, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val3, index); ((NetworkBehaviour)this).__endSendRpc(ref val3, 3275817297u, val2, val, (SendTo)5, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; PlaySound_Local(index); } } } public void PlaySound_Local(int index) { if (NoiseSFX.TryGet(index, out var value)) { PlaySound_Local(value); OnPlayedSoundFromIndex(index); } } public float PlaySound_Local(AudioClip clip) { if ((Object)(object)clip == (Object)null) { return 0f; } if (UseDynamicCooldown) { ((GrabbableObject)this).currentUseCooldown = clip.length; } NoiseAudio.Stop(); float num = Random.Range(MinVolume, MaxVolume); float pitch = Random.Range(MinPitch, MaxPitch); NoiseAudio.Volume = num; NoiseAudio.Pitch = pitch; NoiseAudio.PlayOneShot(clip); WalkieTalkie.TransmitOneShotAudio(NoiseAudio.Main, clip, num); if (IsEnemyAudible) { ((GrabbableObject)(object)this).MakeEnemyAudibleNoise(EnemyAudibleNoiseRange, num, MinVolume); } return clip.length; } protected virtual void OnPlayedSoundFromIndex(int index) { } protected override void __initializeVariables() { base.__initializeVariables(); } protected override void __initializeRpcs() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown ((NetworkBehaviour)this).__registerRpc(3275817297u, new RpcReceiveHandler(__rpc_handler_3275817297), "PlaySound_Rpc"); base.__initializeRpcs(); } private static void __rpc_handler_3275817297(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: 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_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int index = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref index); target.__rpc_exec_stage = (__RpcExecStage)1; ((AdvancedNoisemakerProp)(object)target).PlaySound_Rpc(index); target.__rpc_exec_stage = (__RpcExecStage)0; } } protected internal override string __getTypeName() { return "AdvancedNoisemakerProp"; } } public class FapEnergyDrink : AdvancedNoisemakerProp { private static readonly List<FapEnergyDrink> _instances = new List<FapEnergyDrink>(); [Space(20f)] [Header("Fap Energy Drink")] [Space(5f)] public AudioSourceGroup RandomMusicAudio; public AudioClip[] RandomMusic = Array.Empty<AudioClip>(); [HideInInspector] public NetworkVariable<bool> UsedInfiniteStamina = new NetworkVariable<bool>(false, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)1); private float _randomMusicTimer; public bool InfiniteStaminaEffectEnabled => ConfigManager.FapEnergyDrink_InfiniteStaminaEffectEnabled.Value; public bool RandomMusicEnabled => ConfigManager.FapEnergyDrink_RandomMusicEnabled.Value; public float RandomMusicChance => ConfigManager.FapEnergyDrink_RandomMusicChance.Value; public float RandomMusicRollChanceCooldown => ConfigManager.FapEnergyDrink_RandomMusicRollChanceCooldown.Value; public float RandomMusicSuccessMinCooldown => ConfigManager.FapEnergyDrink_RandomMusicSuccessMinCooldown.Value; public float RandomMusicSuccessMaxCooldown => ConfigManager.FapEnergyDrink_RandomMusicSuccessMaxCooldown.Value; public float RandomMusicSuccessCooldown => Random.Range(RandomMusicSuccessMinCooldown, RandomMusicSuccessMaxCooldown); public bool RandomMusicOnlyAllowSingleInstance => ConfigManager.FapEnergyDrink_RandomMusicOnlyAllowSingleInstance.Value; public override void Awake() { base.Awake(); _randomMusicTimer = RandomMusicRollChanceCooldown; } private void OnEnable() { if (!_instances.Contains(this)) { _instances.Add(this); } } private void OnDisable() { _instances.Remove(this); } public override void Update() { ((GrabbableObject)this).Update(); RandomMusicTick_Server(); } private void RandomMusicTick_Server() { if (!NetworkUtils.IsServer || !RandomMusicEnabled || RandomMusicAudio.IsPlaying || (RandomMusicOnlyAllowSingleInstance && IsAnyInstancePlayingRandomMusic()) || ((GrabbableObject)this).isHeld || !((GrabbableObject)this).isInFactory || ((GrabbableObject)this).isInShipRoom || ((GrabbableObject)this).isInElevator) { return; } if (_randomMusicTimer <= 0f) { if (Utils.RollPercentChance(RandomMusicChance)) { PlayRandomMusic(); _randomMusicTimer = RandomMusicSuccessCooldown; } else { _randomMusicTimer = RandomMusicRollChanceCooldown; } } else { _randomMusicTimer -= Time.deltaTime; } } private bool IsAnyInstancePlayingRandomMusic() { return _instances.Any((FapEnergyDrink x) => x.RandomMusicAudio.IsPlaying); } private void PlayRandomMusic() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) int index = Random.Range(0, RandomMusic.Length); PlayRandomMusic_Rpc(index); } [Rpc(/*Could not decode attribute arguments.*/)] private void PlayRandomMusic_Rpc(int index, RpcParams rpcParams = default(RpcParams)) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Invalid comparison between Unknown and I4 //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004b: 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_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: 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_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1) { RpcAttributeParams val = new RpcAttributeParams { RequireOwnership = false }; FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendRpc(1625127774u, rpcParams, val, (SendTo)6, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, index); ((NetworkBehaviour)this).__endSendRpc(ref val2, 1625127774u, rpcParams, val, (SendTo)6, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; ulong senderClientId = rpcParams.Receive.SenderClientId; if (index >= 0 && index < RandomMusic.Length) { AudioClip clip = RandomMusic[index]; RandomMusicAudio.Play(clip); } } } [Rpc(/*Could not decode attribute arguments.*/)] private void StopRandomMusic_Rpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004b: 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_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_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1) { RpcAttributeParams val = default(RpcAttributeParams); RpcParams val2 = default(RpcParams); FastBufferWriter val3 = ((NetworkBehaviour)this).__beginSendRpc(50365314u, val2, val, (SendTo)6, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendRpc(ref val3, 50365314u, val2, val, (SendTo)6, (RpcDelivery)0); } if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1) { ((NetworkBehaviour)this).__rpc_exec_stage = (__RpcExecStage)0; RandomMusicAudio.Stop(); } } } public override void GrabItem() { ((GrabbableObject)this).GrabItem(); if (((NetworkBehaviour)this).IsOwner) { StopRandomMusic_Rpc(); } } public override void SetControlTipsForItem() { string[] array = ((!UsedInfiniteStamina.Value) ? new string[1] { "Drink : [LMB]".RichColor("#97bb24") } : new string[1] { "Interact : [LMB]" }); HUDManager.Instance.ChangeControlTipMultiple(array, true, ((GrabbableObject)this).itemProperties); } public override void LoadItemSaveData(int saveData) { base.LoadItemSaveData(saveData); UsedInfiniteStamina.Value = GameSaveFileHelper.Load(base.SaveKey + "_UsedInfiniteStamina", defaultValue: false); } public override int GetItemDataToSave() { GameSaveFileHelper.Save(base.SaveKey + "_UsedInfiniteStamina", UsedInfiniteStamina.Value); return base.GetItemDataToSave(); } public override void ItemActivate(bool used, bool buttonDown = true) { base.ItemActivate(used, buttonDown); if (!StartOfRound.Instance.inShipPhase && !StartOfRound.Instance.shipIsLeaving) { TryUseInfiniteStamina(); } } private void TryUseInfiniteStamina() { if (InfiniteStaminaEffectEnabled && FapEnergyStaminaEffect.State != FapEnergyStaminaEffect.States.InfiniteStamina && !UsedInfiniteStamina.Value) { UsedInfiniteStamina.Value = true; FapEnergyStaminaEffect.Apply(); ((GrabbableObject)this).SetControlTipsForItem(); } } private void ApplyConfigSettings() { } public static void OnConfigSettingsChanged() { foreach (FapEnergyDrink instance in _instances) { instance.ApplyConfigSettings(); } } protected override void __initializeVariables() { if (UsedInfiniteStamina == null) { throw new Exception("FapEnergyDrink.UsedInfiniteStamina cannot be null. All NetworkVariableBase instances must be initialized."); } ((NetworkVariableBase)UsedInfiniteStamina).Initialize((NetworkBehaviour)(object)this); ((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)UsedInfiniteStamina, "UsedInfiniteStamina"); ((NetworkBehaviour)this).NetworkVariableFields.Add((NetworkVariableBase)(object)UsedInfiniteStamina); base.__initializeVariables(); } protected override void __initializeRpcs() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown ((NetworkBehaviour)this).__registerRpc(1625127774u, new RpcReceiveHandler(__rpc_handler_1625127774), "PlayRandomMusic_Rpc"); ((NetworkBehaviour)this).__registerRpc(50365314u, new RpcReceiveHandler(__rpc_handler_50365314), "StopRandomMusic_Rpc"); base.__initializeRpcs(); } private static void __rpc_handler_1625127774(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: 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_0031: 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_0040: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int index = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref index); RpcParams ext = rpcParams.Ext; target.__rpc_exec_stage = (__RpcExecStage)1; ((FapEnergyDrink)(object)target).PlayRandomMusic_Rpc(index, ext); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_50365314(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = (__RpcExecStage)1; ((FapEnergyDrink)(object)target).StopRandomMusic_Rpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } protected internal override string __getTypeName() { return "FapEnergyDrink"; } } } namespace com.github.zehsteam.FapEnergy.Objects { internal static class FapEnergyStaminaEffect { public enum States { None, InfiniteStamina, StaminaDrained } public static Action<States> OnStateChanged; private static float _timeSinceStartedState; public static States State { get; private set; } public static States PreviousState { get; private set; } public static float ElapsedStateTime => Time.realtimeSinceStartup - _timeSinceStartedState; public static float StateProgress { get; private set; } public static void Apply() { SetState(States.InfiniteStamina); } public static void Reset() { SetState(States.None); } private static void SetState(States state) { PreviousState = State; State = state; StateProgress = 0f; OnStateChanged?.Invoke(state); _timeSinceStartedState = Time.realtimeSinceStartup; } public static void Tick() { switch (State) { case States.None: break; case States.InfiniteStamina: InfiniteStamina_Tick(); break; case States.StaminaDrained: StaminaDrained_Tick(); break; } } private static void InfiniteStamina_Tick() { float value = ConfigManager.FapEnergyDrink_InfiniteStaminaDuration.Value; StateProgress = ElapsedStateTime / value; if (ElapsedStateTime > value) { SetState(States.StaminaDrained); } } private static void StaminaDrained_Tick() { float value = ConfigManager.FapEnergyDrink_StaminaDrainedDuration.Value; StateProgress = ElapsedStateTime / value; if (ElapsedStateTime > value) { Reset(); } } } [Serializable] public class AudioSourceGroup { public AudioSource Main; public AudioSource Far; public bool IsPlaying => Main.isPlaying; public float Volume { get { return Main.volume; } set { Main.volume = value; AudioSource far = Far; if (far != null) { far.volume = value; } } } public float Pitch { get { return Main.pitch; } set { Main.pitch = value; AudioSource far = Far; if (far != null) { far.pitch = value; } } } public AudioClip Clip { get { return Main.clip; } set { Main.clip = value; AudioSource far = Far; if (far != null) { far.clip = value; } } } public void Play() { Main.Play(); AudioSource far = Far; if (far != null) { far.Play(); } } public void Play(AudioClip clip) { if (IsPlaying) { Stop(); } Clip = clip; Play(); } public void Stop() { Main.Stop(); AudioSource far = Far; if (far != null) { far.Stop(); } } public void PlayOneShot(AudioClip clip) { PlayOneShot(clip, Volume); } public float PlayOneShot(AudioClip clip, float volumeScale) { if ((Object)(object)clip == (Object)null) { return 0f; } Main.PlayOneShot(clip, volumeScale); AudioSource far = Far; if (far != null) { far.PlayOneShot(clip, volumeScale); } return clip.length; } } [Serializable] public class WeightedList<T> { public List<WeightedItem<T>> List = new List<WeightedItem<T>>(); public IReadOnlyList<WeightedItem<T>> ValidList { get { List<WeightedItem<T>> list = new List<WeightedItem<T>>(); list.AddRange(List.Where((WeightedItem<T> x) => x.Weight > 0)); return new <>z__ReadOnlyList<WeightedItem<T>>(list); } } public int Count => ValidList.Count; public int GetRandomIndex() { if (List == null || List.Count == 0 || ValidList.Count == 0) { return -1; } return Utils.GetRandomIndexFromWeightList(ValidList.Select((WeightedItem<T> x) => x.Weight).ToList()); } public bool TryGetRandomIndex(out int index) { index = GetRandomIndex(); return IsValidIndex(index); } public T GetRandom() { if (!TryGetRandom(out var value)) { return default(T); } return value; } public bool TryGetRandom(out T value) { if (!TryGetRandomIndex(out var index)) { value = default(T); return false; } value = ValidList[index].Value; return true; } public bool TryGet(int index, out T value) { if (!IsValidIndex(index)) { value = default(T); return false; } value = ValidList[index].Value; return true; } public bool IsValidIndex(int index) { return index >= 0 && index < ValidList.Count; } } [Serializable] public class WeightedItem<T> { public T Value; public int Weight; public WeightedItem(T value, int weight) { Value = value; Weight = weight; } } } namespace com.github.zehsteam.FapEnergy.Managers { internal static class ConfigManager { public static ConfigFile ConfigFile { get; private set; } public static ConfigEntry<bool> Misc_ExtendedLogging { get; private set; } public static ConfigEntry<int> FapEnergyDrink_SpawnWeight { get; private set; } public static ConfigEntry<bool> FapEnergyDrink_InfiniteStaminaEffectEnabled { get; private set; } public static ConfigEntry<float> FapEnergyDrink_InfiniteStaminaDuration { get; private set; } public static ConfigEntry<float> FapEnergyDrink_StaminaDrainedDuration { get; private set; } public static ConfigEntry<bool> FapEnergyDrink_StaminaUIEffectsEnabled { get; private set; } public static ConfigEntry<bool> FapEnergyDrink_RandomMusicEnabled { get; private set; } public static ConfigEntry<float> FapEnergyDrink_RandomMusicChance { get; private set; } public static ConfigEntry<float> FapEnergyDrink_RandomMusicRollChanceCooldown { get; private set; } public static ConfigEntry<float> FapEnergyDrink_RandomMusicSuccessMinCooldown { get; private set; } public static ConfigEntry<float> FapEnergyDrink_RandomMusicSuccessMaxCooldown { get; private set; } public static ConfigEntry<bool> FapEnergyDrink_RandomMusicOnlyAllowSingleInstance { get; private set; } public static void Initialize(ConfigFile configFile) { ConfigFile = configFile; BindConfigs(); } private static void BindConfigs() { ConfigHelper.SkipAutoGen(); Misc_ExtendedLogging = ConfigHelper.Bind("Misc", "ExtendedLogging", defaultValue: false, "Enable extended logging."); FapEnergyDrink_SpawnWeight = ConfigHelper.Bind("Fap Energy Drink", "SpawnWeight", 20, "How likely this item will spawn."); FapEnergyDrink_SpawnWeight.SettingChanged += delegate { ItemHelper.UpdateScrapRarity(Assets.FapEnergyDrink, FapEnergyDrink_SpawnWeight.Value); }; FapEnergyDrink_InfiniteStaminaEffectEnabled = ConfigHelper.Bind("Fap Energy Drink", "InfiniteStaminaEnabled", defaultValue: true, "If enabled, using this item will temporary give you inifinte stamina."); FapEnergyDrink_InfiniteStaminaDuration = ConfigHelper.Bind("Fap Energy Drink", "InfiniteStaminaDuration", 30f, "The duration in seconds you will have infinite stamina for."); FapEnergyDrink_StaminaDrainedDuration = ConfigHelper.Bind("Fap Energy Drink", "StaminaDrainedDuration", 10f, "The duration in seconds your stamina will be completely drained for after having infinite stamina."); FapEnergyDrink_StaminaUIEffectsEnabled = ConfigHelper.Bind("Fap Energy Drink", "StaminaUIEffectsEnabled", defaultValue: true, "If enabled, infinite/drained stamina will change the stamina UI."); FapEnergyDrink_RandomMusicEnabled = ConfigHelper.Bind("Fap Energy Drink", "RandomMusicEnabled", defaultValue: true, "If enabled, this item will have a chance to randomly play music while inside the facility."); FapEnergyDrink_RandomMusicChance = ConfigHelper.Bind("Fap Energy Drink", "RandomMusicChance", 10f, "The percent chance for random music to start playing."); FapEnergyDrink_RandomMusicRollChanceCooldown = ConfigHelper.Bind("Fap Energy Drink", "RandomMusicRollChanceCooldown", 15f, "The cooldown in seconds between each time RandomMusicChance is rolled."); FapEnergyDrink_RandomMusicSuccessMinCooldown = ConfigHelper.Bind("Fap Energy Drink", "RandomMusicSuccessMinCooldown", 30f, "The minimum cooldown in seconds after random music successfully plays."); FapEnergyDrink_RandomMusicSuccessMaxCooldown = ConfigHelper.Bind("Fap Energy Drink", "RandomMusicSuccessMaxCooldown", 60f, "The maximum cooldown in seconds after random music successfully plays."); FapEnergyDrink_RandomMusicOnlyAllowSingleInstance = ConfigHelper.Bind("Fap Energy Drink", "RandomMusicOnlyAllowSingleInstance", defaultValue: false, "If enabled, will only allow a single item instance to play random music at a time."); } } } namespace com.github.zehsteam.FapEnergy.Helpers { internal static class ConfigHelper { public static void SkipAutoGen() { if (LethalConfigProxy.IsInstalled) { LethalConfigProxy.SkipAutoGen(); } } public static void AddButton(string section, string name, string buttonText, string description, Action callback) { if (LethalConfigProxy.IsInstalled) { LethalConfigProxy.AddButton(section, name, buttonText, description, callback); } } public static ConfigEntry<T> Bind<T>(string section, string key, T defaultValue, string description, bool requiresRestart = false, AcceptableValueBase acceptableValues = null, Action<T> settingChanged = null, ConfigFile configFile = null) { if (configFile == null) { configFile = ConfigManager.ConfigFile; } ConfigEntry<T> configEntry = configFile.Bind(section, key, defaultValue, description, acceptableValues); if (settingChanged != null) { configEntry.SettingChanged += delegate { settingChanged?.Invoke(configEntry.Value); }; } if (LethalConfigProxy.IsInstalled) { LethalConfigProxy.AddConfig<T>(configEntry, requiresRestart); } return configEntry; } } internal static class GameSaveFileHelper { private static string GetCurrentSaveFilePath() { if ((Object)(object)GameNetworkManager.Instance == (Object)null) { Logger.LogWarning("GameSaveFileHelper: GetCurrentSaveFilePath() GameNetworkManager instance is null. Returning an empty string."); return string.Empty; } return GameNetworkManager.Instance.currentSaveFileName; } public static bool KeyExists(string key) { if (!NetworkUtils.IsServer) { return false; } return ES3.KeyExists(key, GetCurrentSaveFilePath()); } public static T Load<T>(string key, T defaultValue = default(T)) { if (!NetworkUtils.IsServer) { return defaultValue; } if (TryLoad<T>(key, out var value)) { return value; } return defaultValue; } public static bool TryLoad<T>(string key, out T value) { if (!NetworkUtils.IsServer) { value = default(T); return false; } value = ES3.Load<T>(key, GetCurrentSaveFilePath()); return value != null; } public static bool Save<T>(string key, T value) { if (!NetworkUtils.IsServer) { return false; } ES3.Save<T>(key, value, GetCurrentSaveFilePath()); return true; } } internal static class ItemHelper { private static readonly Dictionary<Item, int> _spawnWeightsToUpdate = new Dictionary<Item, int>(); public static void UpdateScrapRarity(Item item, int rarity) { if ((Object)(object)item == (Object)null) { Logger.LogError("[ItemHelper] Failed to update scrap item rarity. Item is null."); return; } if ((Object)(object)StartOfRound.Instance == (Object)null) { Logger.LogWarning("[ItemHelper] Failed to update scrap item rarity. StartOfRound instance is null."); _spawnWeightsToUpdate[item] = rarity; return; } SelectableLevel[] levels = StartOfRound.Instance.levels; foreach (SelectableLevel val in levels) { foreach (SpawnableItemWithRarity item2 in val.spawnableScrap) { if (!((Object)(object)item2.spawnableItem != (Object)(object)item)) { item2.rarity = rarity; Logger.LogInfo(string.Format("[{0}] Updated \"{1}\" scrap item rarity to {2} on \"{3}\".", "ItemHelper", item.itemName, rarity, val.PlanetName)); } } } } public static void OnLobbyLoaded() { if (_spawnWeightsToUpdate.Count == 0) { return; } foreach (KeyValuePair<Item, int> item in _spawnWeightsToUpdate) { UpdateScrapRarity(item.Key, item.Value); } _spawnWeightsToUpdate.Clear(); } } internal static class NetworkUtils { public static bool IsConnected { get { NetworkManager singleton = NetworkManager.Singleton; return singleton != null && singleton.IsConnectedClient; } } public static bool IsServer { get { NetworkManager singleton = NetworkManager.Singleton; return singleton != null && singleton.IsServer; } } public static ulong LocalClientId { get { NetworkManager singleton = NetworkManager.Singleton; return (singleton != null) ? singleton.LocalClientId : 0; } } public static int ConnectedPlayerCount => GameNetworkManager.Instance?.connectedPlayers ?? 0; public static bool IsLocalClientId(ulong clientId) { return clientId == LocalClientId; } public static bool HasClient(ulong clientId) { if ((Object)(object)NetworkManager.Singleton == (Object)null) { return false; } return NetworkManager.Singleton.ConnectedClients.ContainsKey(clientId); } public static bool IsNetworkPrefab(GameObject prefab) { IReadOnlyList<NetworkPrefab> prefabs = NetworkManager.Singleton.NetworkConfig.Prefabs.Prefabs; return prefabs.Any((NetworkPrefab x) => (Object)(object)x.Prefab == (Object)(object)prefab); } public static bool AddNetworkPrefab(GameObject prefab) { if ((Object)(object)prefab == (Object)null) { Logger.LogError("Failed to register network prefab. GameObject is null."); return false; } if ((Object)(object)NetworkManager.Singleton == (Object)null) { Logger.LogError("Failed to register network prefab. NetworkManager Singleton is null."); return false; } NetworkManager.Singleton.AddNetworkPrefab(prefab); Logger.LogInfo("Registered \"" + ((Object)prefab).name + "\" network prefab."); return true; } public static void NetcodePatcherAwake() { try { Assembly executingAssembly = Assembly.GetExecutingAssembly(); Type[] types = executingAssembly.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) { try { object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false); if (customAttributes.Length != 0) { try { methodInfo.Invoke(null, null); } catch (TargetInvocationException ex) { Logger.LogWarning("Failed to invoke method " + methodInfo.Name + ": " + ex.Message); } } } catch (Exception ex2) { Logger.LogWarning("Error processing method " + methodInfo.Name + " in type " + type.Name + ": " + ex2.Message); } } } } catch (Exception ex3) { Logger.LogError("An error occurred in NetcodePatcherAwake: " + ex3.Message); } } } internal static class PlayerUtils { public static PlayerControllerB LocalPlayerScript => GameNetworkManager.Instance?.localPlayerController ?? null; public static PlayerControllerB[] AllPlayerScripts => StartOfRound.Instance?.allPlayerScripts ?? Array.Empty<PlayerControllerB>(); public static PlayerControllerB[] ConnectedPlayerScripts => AllPlayerScripts.Where(IsConnected).ToArray(); public static PlayerControllerB[] AlivePlayerScripts => ConnectedPlayerScripts.Where((PlayerControllerB x) => !x.isPlayerDead).ToArray(); public static PlayerControllerB[] DeadPlayerScripts => ConnectedPlayerScripts.Where((PlayerControllerB x) => x.isPlayerDead).ToArray(); public static bool IsLocalPlayer(PlayerControllerB playerScript) { if ((Object)(object)playerScript == (Object)null) { return false; } return (Object)(object)playerScript == (Object)(object)LocalPlayerScript; } public static bool IsConnected(PlayerControllerB playerScript) { if ((Object)(object)playerScript == (Object)null) { return false; } return playerScript.isPlayerControlled || playerScript.isPlayerDead; } public static PlayerControllerB GetPlayerScriptByClientId(ulong clientId) { return ((IEnumerable<PlayerControllerB>)ConnectedPlayerScripts).FirstOrDefault((Func<PlayerControllerB, bool>)((PlayerControllerB playerScript) => playerScript.actualClientId == clientId)); } public static bool TryGetPlayerScriptByClientId(ulong clientId, out PlayerControllerB playerScript) { playerScript = GetPlayerScriptByClientId(clientId); return (Object)(object)playerScript != (Object)null; } public static PlayerControllerB GetPlayerScriptByPlayerId(int playerId) { if (playerId < 0 || playerId > ConnectedPlayerScripts.Length - 1) { return null; } return ConnectedPlayerScripts[playerId]; } public static bool TryGetPlayerScriptByPlayerId(int playerId, out PlayerControllerB playerScript) { playerScript = GetPlayerScriptByPlayerId(playerId); return (Object)(object)playerScript != (Object)null; } public static PlayerControllerB GetPlayerScriptByUsername(string username) { PlayerControllerB val = null; PlayerControllerB[] source = ConnectedPlayerScripts.OrderByDescending((PlayerControllerB x) => x.playerUsername.Length).ToArray(); val = ((IEnumerable<PlayerControllerB>)source).FirstOrDefault((Func<PlayerControllerB, bool>)((PlayerControllerB x) => x.playerUsername.StartsWith(username, StringComparison.OrdinalIgnoreCase))); if (val == null) { val = ((IEnumerable<PlayerControllerB>)source).FirstOrDefault((Func<PlayerControllerB, bool>)((PlayerControllerB x) => x.playerUsername.Contains(username, StringComparison.OrdinalIgnoreCase))); } return val; } public static bool TryGetPlayerScriptByUsername(string username, out PlayerControllerB playerScript) { playerScript = GetPlayerScriptByUsername(username); return (Object)(object)playerScript != (Object)null; } public static PlayerControllerB GetRandomPlayerScript(PlayerControllerB[] playerScripts, bool excludeLocal = false) { if (playerScripts == null || playerScripts.Length == 0) { return null; } PlayerControllerB[] array = playerScripts.Where((PlayerControllerB playerScript) => !excludeLocal || !IsLocalPlayer(playerScript)).ToArray(); if (array.Length == 0) { return null; } return array[Random.Range(0, array.Length)]; } public static bool TryGetRandomPlayerScript(PlayerControllerB[] playerScripts, out PlayerControllerB playerScript, bool excludeLocal = false) { playerScript = GetRandomPlayerScript(playerScripts, excludeLocal); return (Object)(object)playerScript != (Object)null; } } internal static class Utils { public static bool RollPercentChance(float percent) { if (percent <= 0f) { return false; } if (percent >= 100f) { return true; } return Random.value * 100f <= percent; } public static int GetRandomIndexFromWeightList(List<int> weightList) { List<(int, int)> list = new List<(int, int)>(); for (int i = 0; i < weightList.Count; i++) { int num = weightList[i]; if (num > 0) { list.Add((i, num)); } } int num2 = 0; foreach (var item4 in list) { int item = item4.Item2; num2 += item; } if (num2 == 0) { return -1; } int num3 = Random.Range(0, num2); int num4 = 0; foreach (var item5 in list) { int item2 = item5.Item1; int item3 = item5.Item2; num4 += item3; if (num3 < num4) { return item2; } } throw new InvalidOperationException("Weights are not properly specified."); } public static float Remap(float value, float fromMin, float fromMax, float toMin, float toMax) { return Mathf.Lerp(toMin, toMax, Mathf.InverseLerp(fromMin, fromMax, value)); } } } namespace com.github.zehsteam.FapEnergy.Extensions { internal static class ConfigFileExtensions { public static ConfigEntry<T> Bind<T>(this ConfigFile configFile, string section, string key, T defaultValue, string description, AcceptableValueBase acceptableValues) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown if (acceptableValues == null) { return configFile.Bind<T>(section, key, defaultValue, description); } return configFile.Bind<T>(section, key, defaultValue, new ConfigDescription(description, acceptableValues, Array.Empty<object>())); } } internal static class GrabbableObjectExtensions { public static void MakeEnemyAudibleNoise(this GrabbableObject grabbableObject, float noiseRange, float noiseLoudness, float minNoiseLoudness) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)grabbableObject == (Object)null)) { bool flag = grabbableObject.isInElevator && StartOfRound.Instance.hangarDoorsClosed; RoundManager.Instance.PlayAudibleNoise(((Component)grabbableObject).transform.position, noiseRange, noiseLoudness, 0, flag, 0); if (minNoiseLoudness >= 0.6f && (Object)(object)grabbableObject.playerHeldBy != (Object)null) { grabbableObject.playerHeldBy.timeSinceMakingLoudNoise = 0f; } } } } internal static class StringExtensions { public static bool IsHexColor(this string s) { return Regex.IsMatch(s, "^#?([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$"); } public static string RichColor(this string s, string colorHex) { if (string.IsNullOrWhiteSpace(colorHex)) { colorHex = "#FFFFFF"; } return "<color=" + colorHex + ">" + s + "</color>"; } } } namespace com.github.zehsteam.FapEnergy.Dependencies { internal static class LethalConfigProxy { public const string PLUGIN_GUID = "ainavt.lc.lethalconfig"; public static bool IsInstalled => Chainloader.PluginInfos.ContainsKey("ainavt.lc.lethalconfig"); [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void SkipAutoGen() { LethalConfigManager.SkipAutoGen(); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static object AddConfig<T>(ConfigEntry<T> configEntry, bool requiresRestart = false) { //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Expected O, but got Unknown //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Expected O, but got Unknown //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Expected O, but got Unknown //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Expected O, but got Unknown //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Expected O, but got Unknown if (typeof(T).IsEnum) { MethodInfo methodInfo = AccessTools.Method(typeof(LethalConfigProxy), "AddEnumDropdown", (Type[])null, (Type[])null); MethodInfo methodInfo2 = methodInfo.MakeGenericMethod(typeof(T)); object? obj = methodInfo2.Invoke(null, new object[2] { configEntry, requiresRestart }); return (obj is BaseConfigItem) ? obj : null; } AcceptableValueBase acceptableValues = ((ConfigEntryBase)configEntry).Description.AcceptableValues; if (acceptableValues != null) { if (acceptableValues is AcceptableValueRange<float> || acceptableValues is AcceptableValueRange<int>) { return AddConfigSlider<T>(configEntry, requiresRestart); } if (acceptableValues is AcceptableValueList<string>) { return AddConfigDropdown<T>(configEntry, requiresRestart); } } if (configEntry is ConfigEntry<string> val && IsConfigEntryForHexColor(val)) { return AddConfigItem((BaseConfigItem)new HexColorInputFieldConfigItem(val, requiresRestart)); } if (1 == 0) { } BaseConfigItem result; if (!(configEntry is ConfigEntry<int> val2)) { if (!(configEntry is ConfigEntry<float> val3)) { if (!(configEntry is ConfigEntry<bool> val4)) { if (!(configEntry is ConfigEntry<string> val5)) { throw new NotSupportedException($"Unsupported type: {typeof(T)}"); } result = AddConfigItem((BaseConfigItem)new TextInputFieldConfigItem(val5, requiresRestart)); } else { result = AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(val4, requiresRestart)); } } else { result = AddConfigItem((BaseConfigItem)new FloatInputFieldConfigItem(val3, requiresRestart)); } } else { result = AddConfigItem((BaseConfigItem)new IntInputFieldConfigItem(val2, requiresRestart)); } if (1 == 0) { } return result; } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static object AddButton(string section, string name, string buttonText, string description, Action callback) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown BaseConfigItem configItem = (BaseConfigItem)new GenericButtonConfigItem(section, name, description, buttonText, (GenericButtonHandler)delegate { callback?.Invoke(); }); return AddConfigItem(configItem); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static BaseConfigItem AddConfigSlider<T>(ConfigEntry<T> configEntry, bool requiresRestart = false) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown if (1 == 0) { } BaseConfigItem result; if (!(configEntry is ConfigEntry<float> val)) { if (!(configEntry is ConfigEntry<int> val2)) { throw new NotSupportedException($"Slider not supported for type: {typeof(T)}"); } result = AddConfigItem((BaseConfigItem)new IntSliderConfigItem(val2, requiresRestart)); } else { result = AddConfigItem((BaseConfigItem)new FloatSliderConfigItem(val, requiresRestart)); } if (1 == 0) { } return result; } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static BaseConfigItem AddConfigDropdown<T>(ConfigEntry<T> configEntry, bool requiresRestart = false) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Expected O, but got Unknown if (1 == 0) { } if (configEntry is ConfigEntry<string> val) { BaseConfigItem result = AddConfigItem((BaseConfigItem)new TextDropDownConfigItem(val, requiresRestart)); if (1 == 0) { } return result; } throw new NotSupportedException($"Dropdown not supported for type: {typeof(T)}"); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static BaseConfigItem AddEnumDropdown<T>(ConfigEntry<T> configEntry, bool requiresRestart = false) where T : Enum { return AddConfigItem((BaseConfigItem)(object)new EnumDropDownConfigItem<T>(configEntry, requiresRestart)); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static bool IsConfigEntryForHexColor(ConfigEntry<string> configEntry) { if (!(((ConfigEntryBase)configEntry).DefaultValue is string s)) { return false; } return s.IsHexColor(); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static BaseConfigItem AddConfigItem(BaseConfigItem configItem) { LethalConfigManager.AddConfigItem(configItem); return configItem; } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } } namespace __GEN { internal class NetworkVariableSerializationHelper { [RuntimeInitializeOnLoadMethod] internal static void InitializeSerialization() { NetworkVariableSerializationTypes.InitializeSerializer_UnmanagedByMemcpy<bool>(); NetworkVariableSerializationTypes.InitializeEqualityChecker_UnmanagedIEquatable<bool>(); } } } namespace com.github.zehsteam.FapEnergy.NetcodePatcher { [AttributeUsage(AttributeTargets.Module)] internal class NetcodePatchedAssemblyAttribute : Attribute { } }