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 LethalStatus v1.0.0
LethalStatus.dll
Decompiled 2 hours agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LegaFusionCore; using LegaFusionCore.Behaviours; using LegaFusionCore.Managers; using LegaFusionCore.Managers.NetworkManagers; using LegaFusionCore.Registries; using LegaFusionCore.Utilities; using LethalLib.Modules; using LethalStatus.Managers; using LethalStatus.NetcodePatcher; using LethalStatus.Patches; using LethalStatus.StatusEffects; using Microsoft.CodeAnalysis; using Unity.Netcode; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("LethalStatus")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("LethalStatus")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("5bce09cd-b6d2-4d04-bfe7-0ad46e4d55f8")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: IgnoresAccessChecksTo("AmazingAssets.TerrainToMesh")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("ClientNetworkTransform")] [assembly: IgnoresAccessChecksTo("com.olegknyazev.softmask")] [assembly: IgnoresAccessChecksTo("DissonanceVoip")] [assembly: IgnoresAccessChecksTo("DunGen")] [assembly: IgnoresAccessChecksTo("DunGen.Integration.ASPP")] [assembly: IgnoresAccessChecksTo("DunGen.Integration.UnityNav")] [assembly: IgnoresAccessChecksTo("EasyTextEffects")] [assembly: IgnoresAccessChecksTo("Facepunch Transport for Netcode for GameObjects")] [assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")] [assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")] [assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging")] [assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging.DocCodeExamples")] [assembly: IgnoresAccessChecksTo("Unity.Burst")] [assembly: IgnoresAccessChecksTo("Unity.Burst.Unsafe")] [assembly: IgnoresAccessChecksTo("Unity.Collections")] [assembly: IgnoresAccessChecksTo("Unity.Collections.LowLevel.ILSupport")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")] [assembly: IgnoresAccessChecksTo("Unity.Jobs")] [assembly: IgnoresAccessChecksTo("Unity.Mathematics")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.Common")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.MetricTypes")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStats")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Component")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Configuration")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Implementation")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsReporting")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkProfiler.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkSolutionInterface")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Components")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.Networking.Transport")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Csg")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.KdTree")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Poly2Tri")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Stl")] [assembly: IgnoresAccessChecksTo("Unity.Profiling.Core")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Config.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")] [assembly: IgnoresAccessChecksTo("Unity.Services.Authentication")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Analytics")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Components")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Configuration")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Device")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments.Internal")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Internal")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Networking")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Registration")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Scheduler")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Telemetry")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Threading")] [assembly: IgnoresAccessChecksTo("Unity.Services.QoS")] [assembly: IgnoresAccessChecksTo("Unity.Services.Relay")] [assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")] [assembly: IgnoresAccessChecksTo("Unity.Timeline")] [assembly: IgnoresAccessChecksTo("Unity.VisualEffectGraph.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.XR.CoreUtils")] [assembly: IgnoresAccessChecksTo("Unity.XR.Management")] [assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR")] [assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.ConformanceAutomation")] [assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.MetaQuestSupport")] [assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.MockRuntime")] [assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.OculusQuestSupport")] [assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.RuntimeDebugger")] [assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.SpatialTracking")] [assembly: IgnoresAccessChecksTo("UnityEngine.UI")] [assembly: IgnoresAccessChecksTo("UnityEngine.XR.LegacyInputHelpers")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: NetcodePatchedAssembly] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace LethalStatus { [BepInPlugin("Lega.LethalStatus", "Lethal Status", "1.0.0")] public class LethalStatus : BaseUnityPlugin { internal const string modGUID = "Lega.LethalStatus"; internal const string modName = "Lethal Status"; internal const string modVersion = "1.0.0"; private readonly Harmony harmony = new Harmony("Lega.LethalStatus"); internal static readonly AssetBundle bundle = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "lethalstatus")); internal static ManualLogSource mls; public static GameObject managerPrefab = NetworkPrefabs.CreateNetworkPrefab("LethalStatusNetworkManager"); public static Material bloodShaderObj; public static Material frostShaderObj; public static Material poisonShaderObj; public static Material lightningShaderObj; public static Material fireShaderObj; public static GameObject frostAuraObj; public static GameObject poisonAuraObj; public static GameObject lightningAuraObj; public static GameObject fireAuraObj; public void Awake() { mls = Logger.CreateLogSource("StrangerThings"); LoadManager(); NetcodePatcher(); LoadPrefabs(); LoadNetworkPrefabs(); harmony.PatchAll(typeof(LFCEnemyDamageBehaviourPatch)); harmony.PatchAll(typeof(MenuManagerPatch)); harmony.PatchAll(typeof(PlayerControllerBPatch)); harmony.PatchAll(typeof(StartOfRoundPatch)); } public static void LoadManager() { Utilities.FixMixerGroups(managerPrefab); managerPrefab.AddComponent<LSNetworkManager>(); } 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); } } } } public void LoadPrefabs() { bloodShaderObj = bundle.LoadAsset<Material>("Assets/Shaders/Blood.mat"); frostShaderObj = bundle.LoadAsset<Material>("Assets/Shaders/Frost.mat"); poisonShaderObj = bundle.LoadAsset<Material>("Assets/Shaders/Poison.mat"); lightningShaderObj = bundle.LoadAsset<Material>("Assets/Shaders/Lightning.mat"); fireShaderObj = bundle.LoadAsset<Material>("Assets/Shaders/Fire.mat"); } public void LoadNetworkPrefabs() { HashSet<GameObject> hashSet = new HashSet<GameObject> { frostAuraObj = bundle.LoadAsset<GameObject>("Assets/Particles/Frost.prefab"), poisonAuraObj = bundle.LoadAsset<GameObject>("Assets/Particles/Poison.prefab"), lightningAuraObj = bundle.LoadAsset<GameObject>("Assets/Particles/Lightning.prefab"), fireAuraObj = bundle.LoadAsset<GameObject>("Assets/Particles/Fire.prefab") }; foreach (GameObject item in hashSet) { NetworkPrefabs.RegisterNetworkPrefab(item); Utilities.FixMixerGroups(item); } } } public static class MyPluginInfo { public const string PLUGIN_GUID = "LethalStatus"; public const string PLUGIN_NAME = "LethalStatus"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace LethalStatus.StatusEffects { public class BleedingEffect : LSStatusEffectRegistry.StatusEffect { public BleedingEffect(int playerWhoHit, int duration, int totalDamage, EnemyAI enemyWhoHit = null, Action onApply = null, Action onExpire = null, Action onTick = null) : base(LSStatusEffectRegistry.StatusEffectType.BLEEDING, playerWhoHit, duration, totalDamage, enemyWhoHit, onApply, onExpire, onTick) { } public override void Apply(GameObject entity) { base.Apply(entity); PlayerControllerB safeComponent = LFCUtilities.GetSafeComponent<PlayerControllerB>(entity); if (LFCUtilities.ShouldBeLocalPlayer(safeComponent)) { LFCCustomPassManager.SetupScreenFilter(LethalStatus.bloodShaderObj, "Lethal Status" + ((Object)LethalStatus.bloodShaderObj).name); } } public override void Tick(GameObject entity) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) base.Tick(entity); LFCGlobalManager.PlayParticle("Lethal StatusBloodParticle", entity.transform.position, Quaternion.identity, true, 1f, true); } public override void Expire(GameObject entity) { base.Expire(entity); PlayerControllerB safeComponent = LFCUtilities.GetSafeComponent<PlayerControllerB>(entity); if (LFCUtilities.ShouldBeLocalPlayer(safeComponent)) { LFCCustomPassManager.RemoveFiltersByTag("Lethal Status" + ((Object)LethalStatus.bloodShaderObj).name); } } } public class FrostEffect : LSStatusEffectRegistry.StatusEffect { public FrostEffect(int playerWhoHit, int duration, int totalDamage, EnemyAI enemyWhoHit = null, Action onApply = null, Action onExpire = null, Action onTick = null) : base(LSStatusEffectRegistry.StatusEffectType.FROST, playerWhoHit, duration, totalDamage, enemyWhoHit, onApply, onExpire, onTick) { } public override void Apply(GameObject entity) { base.Apply(entity); EnemyAI safeComponent = LFCUtilities.GetSafeComponent<EnemyAI>(entity); if ((Object)(object)safeComponent != (Object)null && !safeComponent.isEnemyDead) { LFCEnemySpeedBehaviour component = ((Component)safeComponent).GetComponent<LFCEnemySpeedBehaviour>(); if (component != null) { component.AddSpeedData(LSStatusEffectRegistry.StatusEffectType.FROST.ToString(), -0.67f, safeComponent.agent.speed); } LSManager.PlayAuraParticle(entity, LethalStatus.frostAuraObj, base.Duration); return; } PlayerControllerB safeComponent2 = LFCUtilities.GetSafeComponent<PlayerControllerB>(entity); if ((Object)(object)safeComponent2 != (Object)null && !safeComponent2.isPlayerDead) { if (LFCUtilities.ShouldBeLocalPlayer(safeComponent2)) { LFCStatRegistry.AddModifier("Speed", "Lethal Status" + ((Object)LethalStatus.frostShaderObj).name, -100f); LFCCustomPassManager.SetupScreenFilter(LethalStatus.frostShaderObj, "Lethal Status" + ((Object)LethalStatus.frostShaderObj).name); } else { LSManager.PlayAuraParticle(entity, LethalStatus.frostAuraObj, base.Duration); } } } public override void Expire(GameObject entity) { base.Expire(entity); EnemyAI safeComponent = LFCUtilities.GetSafeComponent<EnemyAI>(entity); if ((Object)(object)safeComponent != (Object)null) { LFCEnemySpeedBehaviour component = ((Component)safeComponent).GetComponent<LFCEnemySpeedBehaviour>(); if (component != null) { component.RemoveSpeedData(LSStatusEffectRegistry.StatusEffectType.FROST.ToString()); } return; } PlayerControllerB safeComponent2 = LFCUtilities.GetSafeComponent<PlayerControllerB>(entity); if (LFCUtilities.ShouldBeLocalPlayer(safeComponent2)) { LFCStatRegistry.RemoveModifier("Speed", "Lethal Status" + ((Object)LethalStatus.frostShaderObj).name); LFCCustomPassManager.RemoveFiltersByTag("Lethal Status" + ((Object)LethalStatus.frostShaderObj).name); } } } public class LightningEffect : LSStatusEffectRegistry.StatusEffect { private readonly HashSet<ulong> affectedIds = new HashSet<ulong>(); private readonly Collider[] overlapBuffer = (Collider[])(object)new Collider[64]; public float AoERadius = 3f; public int AoEMask = 1084754248; public LightningEffect(int playerWhoHit, int duration, int totalDamage, EnemyAI enemyWhoHit = null, Action onApply = null, Action onExpire = null, Action onTick = null) : base(LSStatusEffectRegistry.StatusEffectType.LIGHTNING, playerWhoHit, duration, totalDamage, enemyWhoHit, onApply, onExpire, onTick) { } public override void Apply(GameObject entity) { PlayerControllerB safeComponent = LFCUtilities.GetSafeComponent<PlayerControllerB>(entity); if (LFCUtilities.ShouldBeLocalPlayer(safeComponent)) { LFCCustomPassManager.SetupScreenFilter(LethalStatus.lightningShaderObj, "Lethal Status" + ((Object)LethalStatus.lightningShaderObj).name); } else { LSManager.PlayAuraParticle(entity, LethalStatus.lightningAuraObj, base.Duration); } } public override void Tick(GameObject entity) { //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0078: 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_02d6: Unknown result type (might be due to invalid IL or missing references) //IL_02dc: Unknown result type (might be due to invalid IL or missing references) //IL_0282: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Unknown result type (might be due to invalid IL or missing references) //IL_02c4: Unknown result type (might be due to invalid IL or missing references) base.Tick(entity); if (base.PassedTime != base.Duration / 2 && base.PassedTime != base.Duration) { return; } LFCGlobalManager.PlayParticle("Lethal Status" + ((Object)LegaFusionCore.lightningExplosionParticle).name, entity.transform.position, entity.transform.rotation, true, 1f, true); LFCGlobalManager.PlayAudio("Lethal Status" + ((Object)LegaFusionCore.lightningExplosionAudio).name, entity.transform.position, true); if (!LFCUtilities.IsServer) { return; } PlayerControllerB safeComponent = LFCUtilities.GetSafeComponent<PlayerControllerB>(entity); PlayerControllerB val = ((base.PlayerWhoHit != -1) ? StartOfRound.Instance.allPlayerObjects[base.PlayerWhoHit].GetComponent<PlayerControllerB>() : null); int num = Physics.OverlapSphereNonAlloc(entity.transform.position, AoERadius, overlapBuffer, AoEMask, (QueryTriggerInteraction)2); PlayerControllerB val3 = default(PlayerControllerB); EnemyAICollisionDetect val4 = default(EnemyAICollisionDetect); for (int i = 0; i < num; i++) { Collider val2 = overlapBuffer[i]; if ((Object)(object)val2 == (Object)null) { continue; } if (LFCUtilities.TryGetComponentInParent<PlayerControllerB>(((Component)val2).gameObject, ref val3) && !val3.isPlayerDead) { if ((Object)(object)val3 != (Object)(object)safeComponent && (Object)(object)val3 != (Object)(object)val && affectedIds.Add(0x8000000000000000uL | val3.playerClientId)) { if (!LSStatusEffectRegistry.HasStatus(((Component)val3).gameObject, LSStatusEffectRegistry.StatusEffectType.LIGHTNING)) { LSNetworkManager.Instance.ApplyStatusEveryoneRpc(((Object)(object)val != (Object)null) ? ((int)val.playerClientId) : (-1), (int)val3.playerClientId, 3, base.Duration, ((Object)(object)safeComponent != (Object)null) ? base.TotalDamage : (base.TotalDamage / 10), NetworkObjectReference.op_Implicit(((Object)(object)EnemyWhoHit != (Object)null) ? ((NetworkBehaviour)EnemyWhoHit).NetworkObject : null)); } LFCNetworkManager.Instance.DamagePlayerEveryoneRpc((int)val3.playerClientId, 10, true, true, 11); } } else { if (!LFCUtilities.TryGetComponentInParent<EnemyAICollisionDetect>(((Component)val2).gameObject, ref val4)) { continue; } EnemyAI mainScript = val4.mainScript; if ((Object)(object)mainScript != (Object)null && !mainScript.isEnemyDead && (Object)(object)((NetworkBehaviour)mainScript).NetworkObject != (Object)null && (Object)(object)mainScript != (Object)(object)EnemyWhoHit && affectedIds.Add(((NetworkBehaviour)mainScript).NetworkObjectId)) { if (!LSStatusEffectRegistry.HasStatus(((Component)mainScript).gameObject, LSStatusEffectRegistry.StatusEffectType.LIGHTNING)) { LSNetworkManager.Instance.ApplyStatusEveryoneRpc(((Object)(object)val != (Object)null) ? ((int)val.playerClientId) : (-1), NetworkObjectReference.op_Implicit(((NetworkBehaviour)mainScript).NetworkObject), 3, base.Duration, ((Object)(object)safeComponent != (Object)null) ? (base.TotalDamage * 10) : base.TotalDamage, NetworkObjectReference.op_Implicit(((Object)(object)EnemyWhoHit != (Object)null) ? ((NetworkBehaviour)EnemyWhoHit).NetworkObject : null)); } PlayerControllerB val5 = val; mainScript.HitEnemyOnLocalClient(1, default(Vector3), val5, true, -1); } } } } public override void Expire(GameObject entity) { base.Expire(entity); PlayerControllerB safeComponent = LFCUtilities.GetSafeComponent<PlayerControllerB>(entity); if (LFCUtilities.ShouldBeLocalPlayer(safeComponent)) { LFCCustomPassManager.RemoveFiltersByTag("Lethal Status" + ((Object)LethalStatus.lightningShaderObj).name); } } } public class LSStatusEffectRegistry : MonoBehaviour { public enum StatusEffectType { BLEEDING, FROST, POISON, LIGHTNING, FEAR } public abstract class StatusEffect { public EnemyAI EnemyWhoHit; public Action OnApply; public Action OnExpire; public Action OnTick; public StatusEffectType EffectType { get; } public int PlayerWhoHit { get; } public int Duration { get; } public float EndTime { get; private set; } public int TotalDamage { get; } public int DamagePerTick { get; } public int PassedTime { get; private set; } public float NextTickTime { get; private set; } public float RemainingTime => EndTime - Time.time; protected StatusEffect(StatusEffectType effectType, int playerWhoHit, int duration, int totalDamage, EnemyAI enemyWhoHit, Action onApply, Action onExpire, Action onTick) { EffectType = effectType; PlayerWhoHit = playerWhoHit; Duration = duration; EndTime = Time.time + (float)duration; TotalDamage = totalDamage; EnemyWhoHit = enemyWhoHit; OnApply = onApply; OnExpire = onExpire; OnTick = onTick; DamagePerTick = ((duration > 0) ? (totalDamage / duration) : 0); PassedTime = 0; NextTickTime = Time.time + 1f; } public virtual void Apply(GameObject entity) { OnApply?.Invoke(); } public virtual void Tick(GameObject entity) { OnTick?.Invoke(); if (DamagePerTick != 0) { ApplyDamage(entity, DamagePerTick, PlayerWhoHit); } PassedTime++; NextTickTime += 1f; } public virtual void Expire(GameObject entity) { OnExpire?.Invoke(); } public bool ShouldTick() { return Time.time >= NextTickTime; } public bool IsExpired() { return Time.time >= EndTime; } protected void ApplyDamage(GameObject entity, int damage, int playerWhoHit) { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)entity != (Object)null) { EnemyAI safeComponent = LFCUtilities.GetSafeComponent<EnemyAI>(entity); if ((Object)(object)safeComponent != (Object)null && !safeComponent.isEnemyDead && LFCEnemyManager.CanDie(safeComponent)) { LFCEnemyDamageBehaviour.DamageEnemy(safeComponent, damage, playerWhoHit, true, -1, true); } PlayerControllerB safeComponent2 = LFCUtilities.GetSafeComponent<PlayerControllerB>(entity); if ((Object)(object)safeComponent2 != (Object)null && !safeComponent2.isPlayerDead) { safeComponent2.DamagePlayer(damage, true, true, (CauseOfDeath)0, 0, false, default(Vector3)); } } } } private static readonly Dictionary<GameObject, Dictionary<StatusEffectType, StatusEffect>> activeEffects = new Dictionary<GameObject, Dictionary<StatusEffectType, StatusEffect>>(); private static LSStatusEffectRegistry _instance; public static LSStatusEffectRegistry Instance { get { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown if ((Object)(object)_instance == (Object)null) { GameObject val = new GameObject("StatusEffect"); _instance = val.AddComponent<LSStatusEffectRegistry>(); Object.DontDestroyOnLoad((Object)(object)val); } return _instance; } } private void Update() { List<(GameObject, StatusEffectType)> list = new List<(GameObject, StatusEffectType)>(); List<GameObject> list2 = new List<GameObject>(); foreach (KeyValuePair<GameObject, Dictionary<StatusEffectType, StatusEffect>> item in activeEffects.ToList()) { GameObject key = item.Key; if ((Object)(object)key == (Object)null) { list2.Add(key); continue; } Dictionary<StatusEffectType, StatusEffect> value = item.Value; foreach (KeyValuePair<StatusEffectType, StatusEffect> item2 in value.ToList()) { StatusEffect value2 = item2.Value; if (value2.ShouldTick()) { value2.Tick(key); } if (value2.IsExpired()) { list.Add((key, item2.Key)); } } } list2.ForEach(delegate(GameObject e) { activeEffects.Remove(e); }); list.ForEach(delegate((GameObject, StatusEffectType) e) { RemoveStatus(e.Item1, e.Item2); }); } public static void ApplyStatus(GameObject entity, StatusEffectType type, int playerWhoHit, int duration, int totalDamage = 0, EnemyAI enemyWhoHit = null, Action onApply = null, Action onExpire = null, Action onTick = null) { StatusEffect statusEffect = type switch { StatusEffectType.BLEEDING => new BleedingEffect(playerWhoHit, duration, totalDamage, enemyWhoHit, onApply, onExpire, onTick), StatusEffectType.FROST => new FrostEffect(playerWhoHit, duration, totalDamage, enemyWhoHit, onApply, onExpire, onTick), StatusEffectType.POISON => new PoisonEffect(playerWhoHit, duration, totalDamage, enemyWhoHit, onApply, onExpire, onTick), StatusEffectType.LIGHTNING => new LightningEffect(playerWhoHit, duration, totalDamage, enemyWhoHit, onApply, onExpire, onTick), _ => null, }; if (statusEffect != null) { ApplyStatus(entity, statusEffect); } } public static void ApplyStatus(GameObject entity, StatusEffect effect) { _ = Instance; if (!activeEffects.ContainsKey(entity)) { activeEffects[entity] = new Dictionary<StatusEffectType, StatusEffect>(); } Dictionary<StatusEffectType, StatusEffect> dictionary = activeEffects[entity]; if (dictionary.TryGetValue(effect.EffectType, out var value)) { if (effect.RemainingTime > value.RemainingTime) { value.Expire(entity); dictionary[effect.EffectType] = effect; effect.Apply(entity); } } else { dictionary[effect.EffectType] = effect; effect.Apply(entity); } } public static void RemoveStatus(GameObject entity, StatusEffectType effectType) { if (activeEffects.TryGetValue(entity, out var value) && value.TryGetValue(effectType, out var value2)) { value2.Expire(entity); value.Remove(effectType); } } public static bool HasStatus(GameObject target, StatusEffectType effectType) { if (activeEffects.TryGetValue(target, out var value)) { return value.ContainsKey(effectType); } return false; } public static void ClearStatus() { foreach (GameObject entity in activeEffects.Keys.ToList()) { if (activeEffects.TryGetValue(entity, out var value)) { value.Keys.ToList().ForEach(delegate(StatusEffectType e) { RemoveStatus(entity, e); }); activeEffects.Remove(entity); } } } } public class PoisonEffect : LSStatusEffectRegistry.StatusEffect { public PoisonEffect(int playerWhoHit, int duration, int totalDamage, EnemyAI enemyWhoHit = null, Action onApply = null, Action onExpire = null, Action onTick = null) : base(LSStatusEffectRegistry.StatusEffectType.POISON, playerWhoHit, duration, totalDamage, enemyWhoHit, onApply, onExpire, onTick) { } public override void Apply(GameObject entity) { base.Apply(entity); PlayerControllerB safeComponent = LFCUtilities.GetSafeComponent<PlayerControllerB>(entity); if (LFCUtilities.ShouldBeLocalPlayer(safeComponent)) { LFCCustomPassManager.SetupScreenFilter(LethalStatus.poisonShaderObj, "Lethal Status" + ((Object)LethalStatus.poisonShaderObj).name); } else { LSManager.PlayAuraParticle(entity, LethalStatus.poisonAuraObj, base.Duration); } } public override void Expire(GameObject entity) { base.Expire(entity); PlayerControllerB safeComponent = LFCUtilities.GetSafeComponent<PlayerControllerB>(entity); if (LFCUtilities.ShouldBeLocalPlayer(safeComponent)) { LFCCustomPassManager.RemoveFiltersByTag("Lethal Status" + ((Object)LethalStatus.poisonShaderObj).name); } } } } namespace LethalStatus.Patches { public class LFCEnemyDamageBehaviourPatch { [HarmonyPatch(typeof(LFCEnemyDamageBehaviour), "DamageEnemy")] [HarmonyPrefix] public static void DamageEnemy(EnemyAI enemy, ref int force, int playerWhoHit) { if (LSStatusEffectRegistry.HasStatus(((Component)enemy).gameObject, LSStatusEffectRegistry.StatusEffectType.POISON)) { force = (int)((double)force * 1.5); } PlayerControllerB val = ((playerWhoHit == -1) ? null : StartOfRound.Instance.allPlayerObjects[playerWhoHit].GetComponent<PlayerControllerB>()); if ((Object)(object)val != (Object)null && LSStatusEffectRegistry.HasStatus(((Component)enemy).gameObject, LSStatusEffectRegistry.StatusEffectType.BLEEDING)) { int num = Mathf.CeilToInt((float)force / 10f); LFCPlayerManager.HealPlayerOnLocalClient(val, num); } } } public class MenuManagerPatch { [HarmonyPatch(typeof(MenuManager), "Awake")] [HarmonyPostfix] private static void AwakeMenu() { LSStatusEffectRegistry.ClearStatus(); } } public class PlayerControllerBPatch { [HarmonyPatch(typeof(PlayerControllerB), "DamagePlayer")] [HarmonyPrefix] private static void DamagePlayer(PlayerControllerB __instance, ref int damageNumber) { if (LFCUtilities.ShouldBeLocalPlayer(__instance) && LSStatusEffectRegistry.HasStatus(((Component)__instance).gameObject, LSStatusEffectRegistry.StatusEffectType.POISON)) { damageNumber = Mathf.CeilToInt((float)damageNumber * 1.5f); } } } public class StartOfRoundPatch { [HarmonyPatch(typeof(StartOfRound), "Start")] [HarmonyBefore(new string[] { "evaisa.lethallib" })] [HarmonyPostfix] private static void StartRound(StartOfRound __instance) { if (NetworkManager.Singleton.IsHost && (Object)(object)LSNetworkManager.Instance == (Object)null) { GameObject val = Object.Instantiate<GameObject>(LethalStatus.managerPrefab, ((Component)__instance).transform.parent); val.GetComponent<NetworkObject>().Spawn(false); LethalStatus.mls.LogInfo((object)"Spawning LSNetworkManager"); } } [HarmonyPatch(typeof(StartOfRound), "ShipLeave")] [HarmonyPostfix] public static void EndRound() { LSStatusEffectRegistry.ClearStatus(); } [HarmonyPatch(typeof(StartOfRound), "OnDisable")] [HarmonyPostfix] public static void OnDisable() { LSNetworkManager.Instance = null; } } } namespace LethalStatus.Managers { public class LSManager { public static void PlayAuraParticle(GameObject entity, GameObject prefab, int duration) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005b: 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_0070: Unknown result type (might be due to invalid IL or missing references) BoxCollider val = default(BoxCollider); if (LFCUtilities.TryGetComponentInChildren<BoxCollider>(entity, ref val)) { Bounds bounds = ((Collider)val).bounds; Vector3 size = ((Bounds)(ref bounds)).size; bounds = ((Collider)val).bounds; GameObject val2 = Object.Instantiate<GameObject>(prefab, ((Bounds)(ref bounds)).center, Quaternion.identity, entity.transform); val2.transform.localScale = prefab.transform.localScale * Mathf.Max(new float[3] { size.x, size.y, size.z }); Object.Destroy((Object)(object)val2, (float)duration); } } } public class LSNetworkManager : NetworkBehaviour { public static LSNetworkManager Instance; public void Awake() { Instance = this; } [Rpc(/*Could not decode attribute arguments.*/)] public void ApplyStatusEveryoneRpc(int playerId, NetworkObjectReference enemyObj, int type, int duration, int totalDamage = 0, NetworkObjectReference enemyWhoHitObj = default(NetworkObjectReference)) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_010e: 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_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_011d: 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) { RpcAttributeParams val = new RpcAttributeParams { RequireOwnership = false }; RpcParams val2 = default(RpcParams); FastBufferWriter val3 = ((NetworkBehaviour)this).__beginSendRpc(737427483u, val2, val, (SendTo)6, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val3, playerId); ((FastBufferWriter)(ref val3)).WriteValueSafe<NetworkObjectReference>(ref enemyObj, default(ForNetworkSerializable)); BytePacker.WriteValueBitPacked(val3, type); BytePacker.WriteValueBitPacked(val3, duration); BytePacker.WriteValueBitPacked(val3, totalDamage); ((FastBufferWriter)(ref val3)).WriteValueSafe<NetworkObjectReference>(ref enemyWhoHitObj, default(ForNetworkSerializable)); ((NetworkBehaviour)this).__endSendRpc(ref val3, 737427483u, val2, val, (SendTo)6, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1) { base.__rpc_exec_stage = (__RpcExecStage)0; NetworkObject val4 = default(NetworkObject); if (((NetworkObjectReference)(ref enemyObj)).TryGet(ref val4, (NetworkManager)null)) { EnemyAI componentInChildren = ((Component)val4).gameObject.GetComponentInChildren<EnemyAI>(); NetworkObject val5 = default(NetworkObject); EnemyAI enemyWhoHit = (((NetworkObjectReference)(ref enemyWhoHitObj)).TryGet(ref val5, (NetworkManager)null) ? ((Component)val5).gameObject.GetComponentInChildren<EnemyAI>() : null); LSStatusEffectRegistry.ApplyStatus(((Component)componentInChildren).gameObject, (LSStatusEffectRegistry.StatusEffectType)type, playerId, duration, totalDamage, enemyWhoHit); } } } [Rpc(/*Could not decode attribute arguments.*/)] public void ApplyStatusEveryoneRpc(int playerId, int targetId, int type, int duration, int totalDamage = 0, NetworkObjectReference enemyWhoHitObj = default(NetworkObjectReference)) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_0100: 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_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: 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_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 1) { RpcAttributeParams val = new RpcAttributeParams { RequireOwnership = false }; RpcParams val2 = default(RpcParams); FastBufferWriter val3 = ((NetworkBehaviour)this).__beginSendRpc(3145769591u, val2, val, (SendTo)6, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val3, playerId); BytePacker.WriteValueBitPacked(val3, targetId); BytePacker.WriteValueBitPacked(val3, type); BytePacker.WriteValueBitPacked(val3, duration); BytePacker.WriteValueBitPacked(val3, totalDamage); ((FastBufferWriter)(ref val3)).WriteValueSafe<NetworkObjectReference>(ref enemyWhoHitObj, default(ForNetworkSerializable)); ((NetworkBehaviour)this).__endSendRpc(ref val3, 3145769591u, val2, val, (SendTo)6, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1) { base.__rpc_exec_stage = (__RpcExecStage)0; PlayerControllerB component = StartOfRound.Instance.allPlayerObjects[targetId].GetComponent<PlayerControllerB>(); NetworkObject val4 = default(NetworkObject); EnemyAI enemyWhoHit = (((NetworkObjectReference)(ref enemyWhoHitObj)).TryGet(ref val4, (NetworkManager)null) ? ((Component)val4).gameObject.GetComponentInChildren<EnemyAI>() : null); LSStatusEffectRegistry.ApplyStatus(((Component)component).gameObject, (LSStatusEffectRegistry.StatusEffectType)type, playerId, duration, totalDamage, enemyWhoHit); } } } protected override void __initializeVariables() { ((NetworkBehaviour)this).__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(737427483u, new RpcReceiveHandler(__rpc_handler_737427483), "ApplyStatusEveryoneRpc"); ((NetworkBehaviour)this).__registerRpc(3145769591u, new RpcReceiveHandler(__rpc_handler_3145769591), "ApplyStatusEveryoneRpc"); ((NetworkBehaviour)this).__initializeRpcs(); } private static void __rpc_handler_737427483(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: 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) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int playerId = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref playerId); NetworkObjectReference enemyObj = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref enemyObj, default(ForNetworkSerializable)); int type = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref type); int duration = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref duration); int totalDamage = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref totalDamage); NetworkObjectReference enemyWhoHitObj = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref enemyWhoHitObj, default(ForNetworkSerializable)); target.__rpc_exec_stage = (__RpcExecStage)1; ((LSNetworkManager)(object)target).ApplyStatusEveryoneRpc(playerId, enemyObj, type, duration, totalDamage, enemyWhoHitObj); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3145769591(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_003d: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int playerId = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref playerId); int targetId = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref targetId); int type = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref type); int duration = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref duration); int totalDamage = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref totalDamage); NetworkObjectReference enemyWhoHitObj = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref enemyWhoHitObj, default(ForNetworkSerializable)); target.__rpc_exec_stage = (__RpcExecStage)1; ((LSNetworkManager)(object)target).ApplyStatusEveryoneRpc(playerId, targetId, type, duration, totalDamage, enemyWhoHitObj); target.__rpc_exec_stage = (__RpcExecStage)0; } } [MethodImpl(MethodImplOptions.NoInlining)] protected internal override string __getTypeName() { return "LSNetworkManager"; } } } 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() { } } } namespace LethalStatus.NetcodePatcher { [AttributeUsage(AttributeTargets.Module)] internal class NetcodePatchedAssemblyAttribute : Attribute { } }