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 LegaFusionCore v1.0.9
LegaFusionCore.dll
Decompiled 3 weeks ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LegaFusionCore.Behaviours; using LegaFusionCore.Behaviours.Addons; using LegaFusionCore.Behaviours.Shaders; using LegaFusionCore.CustomInputs; using LegaFusionCore.Managers; using LegaFusionCore.Managers.NetworkManagers; using LegaFusionCore.ModsCompat; using LegaFusionCore.NetcodePatcher; using LegaFusionCore.Patches; using LegaFusionCore.Registries; using LegaFusionCore.Utilities; using LethalCompanyInputUtils.Api; using LethalLib.Modules; using Microsoft.CodeAnalysis; using TMPro; using Unity.Netcode; using UnityEngine; using UnityEngine.AI; using UnityEngine.InputSystem; using UnityEngine.Rendering.HighDefinition; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("LegaFusionCore")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("LegaFusionCore")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("7dc7a313-3468-48ad-8189-4f22764cd9ee")] [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("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("UnityEngine.ARModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UI")] [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 LegaFusionCore { public class Constants { public const string STAT_SPEED = "Speed"; public const string KNIFE_PREFAB = "KnifeItem"; public const string MOUTH_DOG_PREFAB = "MouthDog"; public const string EARTH_LEVIATHAN_PREFAB = "SandWorm"; public const string BLOOD_PARTICLES = "BloodParticle"; public const string GROUND_PARTICLES = "AppearFromGround1"; public const string MESSAGE_NO_SHIP_ENERGY = "Not enough energy left..."; public const string MESSAGE_DEFAULT_ITEM_CHARGER = "(Requires battery-powered item)"; public const string MESSAGE_DEFAULT_SHIP_LEVER = "[Wait for ship to land]"; } [BepInPlugin("Lega.LegaFusionCore", "Lega Fusion Core", "1.0.8")] public class LegaFusionCore : BaseUnityPlugin { public const string modGUID = "Lega.LegaFusionCore"; public const string modName = "Lega Fusion Core"; public const string modVersion = "1.0.8"; private readonly Harmony harmony = new Harmony("Lega.LegaFusionCore"); private static readonly AssetBundle bundle = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "legafusioncore")); internal static ManualLogSource mls; public static GameObject managerPrefab = NetworkPrefabs.CreateNetworkPrefab("LFCNetworkManager"); public static Material wallhackShader; public static Material transparentShader; public static Material bloodShader; public static Material frostShader; public static Material poisonShader; public static Material lightningShader; public static GameObject smokeParticle; public static GameObject darkExplosionParticle; public static GameObject brownExplosionParticle; public static GameObject poisonExplosionParticle; public static GameObject lightningExplosionParticle; public static GameObject bluePortalParticle; public static GameObject redPortalParticle; public static GameObject poofExplosionAudio; public static GameObject poisonExplosionAudio; public static GameObject lightningExplosionAudio; public static GameObject hitProjectileAudio; public void Awake() { mls = Logger.CreateLogSource("LegaFusionCore"); LoadManager(); NetcodePatcher(); LoadPrefabs(); LoadNetworkPrefabs(); harmony.PatchAll(typeof(MenuManagerPatch)); harmony.PatchAll(typeof(StartOfRoundPatch)); harmony.PatchAll(typeof(RoundManagerPatch)); harmony.PatchAll(typeof(NetworkBehaviourPatch)); harmony.PatchAll(typeof(HangarShipDoorPatch)); harmony.PatchAll(typeof(ItemChargerPatch)); harmony.PatchAll(typeof(ManualCameraRendererPatch)); harmony.PatchAll(typeof(ShipLightsPatch)); harmony.PatchAll(typeof(ShipTeleporterPatch)); harmony.PatchAll(typeof(TVScriptPatch)); harmony.PatchAll(typeof(PlayerControllerBPatch)); harmony.PatchAll(typeof(GrabbableObjectPatch)); harmony.PatchAll(typeof(EnemyAIPatch)); harmony.PatchAll(typeof(VehicleControllerPatch)); GeneralImprovementsSoftCompat.Patch(harmony); GoodItemScanSoftCompat.Patch(harmony); ModelReplacementAPISoftCompat.Patch(harmony); MoreCompantSoftCompat.Patch(harmony); NameplateTweaksSoftCompat.Patch(harmony); SelfSortingStorageSoftCompat.Patch(harmony); } public static void LoadManager() { Utilities.FixMixerGroups(managerPrefab); managerPrefab.AddComponent<LFCNetworkManager>(); } 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.ContainsGenericParameters) { methodInfo.Invoke(null, null); } } } } public static void LoadPrefabs() { wallhackShader = bundle.LoadAsset<Material>("Assets/Shaders/M_Wallhack.mat"); transparentShader = bundle.LoadAsset<Material>("Assets/Shaders/M_Transparent.mat"); bloodShader = bundle.LoadAsset<Material>("Assets/Shaders/M_Blood.mat"); frostShader = bundle.LoadAsset<Material>("Assets/Shaders/M_Frost.mat"); poisonShader = bundle.LoadAsset<Material>("Assets/Shaders/M_Poison.mat"); lightningShader = bundle.LoadAsset<Material>("Assets/Shaders/M_Lightning.mat"); } public void LoadNetworkPrefabs() { HashSet<GameObject> hashSet = new HashSet<GameObject> { smokeParticle = bundle.LoadAsset<GameObject>("Assets/Particles/SmokeParticle.prefab"), darkExplosionParticle = bundle.LoadAsset<GameObject>("Assets/Particles/DarkExplosionParticle.prefab"), brownExplosionParticle = bundle.LoadAsset<GameObject>("Assets/Particles/BrownExplosionParticle.prefab"), poisonExplosionParticle = bundle.LoadAsset<GameObject>("Assets/Particles/PoisonExplosionParticle.prefab"), lightningExplosionParticle = bundle.LoadAsset<GameObject>("Assets/Particles/LightningExplosionParticle.prefab"), bluePortalParticle = bundle.LoadAsset<GameObject>("Assets/Particles/BluePortalParticle.prefab"), redPortalParticle = bundle.LoadAsset<GameObject>("Assets/Particles/RedPortalParticle.prefab"), poofExplosionAudio = bundle.LoadAsset<GameObject>("Assets/Audios/PoofExplosionAudio.prefab"), poisonExplosionAudio = bundle.LoadAsset<GameObject>("Assets/Audios/PoisonExplosionAudio.prefab"), lightningExplosionAudio = bundle.LoadAsset<GameObject>("Assets/Audios/LightningExplosionAudio.prefab"), hitProjectileAudio = bundle.LoadAsset<GameObject>("Assets/Audios/HitProjectileAudio.prefab") }; foreach (GameObject item in hashSet) { NetworkPrefabs.RegisterNetworkPrefab(item); Utilities.FixMixerGroups(item); LFCPrefabRegistry.RegisterPrefab("Lega Fusion Core" + ((Object)item).name, item); } } } public static class MyPluginInfo { public const string PLUGIN_GUID = "LegaFusionCore"; public const string PLUGIN_NAME = "LegaFusionCore"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace LegaFusionCore.Utilities { public static class LFCUtilities { public static PlayerControllerB LocalPlayer => GameNetworkManager.Instance?.localPlayerController; public static bool IsServer { get { if ((Object)(object)LocalPlayer != (Object)null) { if (!((NetworkBehaviour)LocalPlayer).IsServer) { return ((NetworkBehaviour)LocalPlayer).IsHost; } return true; } return false; } } public static bool ShouldBeLocalPlayer(PlayerControllerB player) { if ((Object)(object)player != (Object)null) { return (Object)(object)player == (Object)(object)GameNetworkManager.Instance?.localPlayerController; } return false; } public static bool ShouldNotBeLocalPlayer(PlayerControllerB player) { if ((Object)(object)player != (Object)null) { return (Object)(object)player != (Object)(object)GameNetworkManager.Instance?.localPlayerController; } return false; } public static ulong EncodePlayerId(ulong playerClientId) { return 0x8000000000000000uL | playerClientId; } public static bool TryGetComponentInParent<T>(this GameObject gameObject, out T result) where T : Component { result = gameObject.GetComponentInParent<T>(); return (Object)(object)result != (Object)null; } public static bool TryGetComponentInChildren<T>(this GameObject gameObject, out T result) where T : Component { result = gameObject.GetComponentInChildren<T>(); return (Object)(object)result != (Object)null; } public static void Shuffle<T>(IList<T> list) { for (int num = list.Count - 1; num > 0; num--) { int num2 = Random.Range(0, num + 1); int index = num2; int index2 = num; T value = list[num]; T value2 = list[num2]; list[index] = value; list[index2] = value2; } } public static string GetGameObjectName(GameObject gObject) { if ((Object)(object)gObject == (Object)null) { return string.Empty; } string text = ((Object)gObject).name ?? string.Empty; if (text.EndsWith("(Clone)", StringComparison.Ordinal)) { string text2 = text; int length = "(Clone)".Length; text = text2.Substring(0, text2.Length - length); } return text.Trim(); } public static bool HasNameFromList(string name, string listName) { if (string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(listName)) { return false; } string[] array = listName.Split(','); foreach (string text in array) { string text2 = text.Trim(); if (text2.Length != 0 && string.Equals(text2, name, StringComparison.Ordinal)) { return true; } } return false; } public static void UpdateTimer(ref float timer, float cooldown, bool isActive, Action onReady) { if (isActive) { timer += Time.deltaTime; if (timer >= cooldown) { timer = 0f; onReady?.Invoke(); } } } public static GameObject GetPrefabFromName(string name) { GameObject val = null; IEnumerable<NetworkPrefabsList> networkPrefabsLists = NetworkManager.Singleton.NetworkConfig.Prefabs.NetworkPrefabsLists; foreach (NetworkPrefabsList item in networkPrefabsLists ?? Enumerable.Empty<NetworkPrefabsList>()) { IEnumerable<NetworkPrefab> prefabList = item.PrefabList; foreach (NetworkPrefab item2 in prefabList ?? Enumerable.Empty<NetworkPrefab>()) { if (((Object)item2.Prefab).name.Equals(name)) { val = item2.Prefab; if ((Object)(object)val != (Object)null) { break; } } } } return val; } public static T GetSafeComponent<T>(GameObject gameObject) where T : Component { if (!((Object)(object)gameObject == (Object)null)) { if (gameObject != null && Object.op_Implicit((Object)(object)gameObject)) { return gameObject.GetComponent<T>(); } } return default(T); } public static void SetAddonComponent<T>(GrabbableObject grabbableObject, string addonName, bool isPassive = false) where T : AddonComponent { T val = ((Component)grabbableObject).gameObject.AddComponent<T>(); val.grabbableObject = grabbableObject; val.addonName = addonName; val.isPassive = isPassive; ScanNodeProperties componentInChildren = ((Component)grabbableObject).gameObject.GetComponentInChildren<ScanNodeProperties>(); if ((Object)(object)componentInChildren != (Object)null) { componentInChildren.subText = componentInChildren.subText + ((componentInChildren.subText != null) ? "\n" : "") + "Addon: " + addonName; } } public static T GetAddonComponent<T>(PlayerControllerB player) where T : AddonComponent { if ((Object)(object)player == (Object)null) { return null; } T val = null; for (int i = 0; i < player.ItemSlots.Length; i++) { val = GetAddonComponent<T>(player.ItemSlots[i]); if ((Object)(object)val != (Object)null) { break; } } return val; } public static T GetAddonComponent<T>(GrabbableObject grabbableObject) where T : AddonComponent { if (grabbableObject == null) { return null; } return ((Component)grabbableObject).GetComponent<T>(); } } } namespace LegaFusionCore.Registries { public class LFCObjectStateRegistry { private static readonly Dictionary<FlashlightItem, HashSet<string>> flickeringFlashlightRegistry = new Dictionary<FlashlightItem, HashSet<string>>(); public static void AddFlickeringFlashlight(FlashlightItem flashlight, string tag) { if (!flickeringFlashlightRegistry.TryGetValue(flashlight, out var value)) { value = new HashSet<string>(); flickeringFlashlightRegistry[flashlight] = value; } if (value.Add(tag) && value.Count == 1) { SetFlickeringFlashlightEnabled(flashlight, enabled: true); } } public static void RemoveFlickeringFlashlight(FlashlightItem flashlight, string tag) { if (flickeringFlashlightRegistry.TryGetValue(flashlight, out var value) && value.Remove(tag) && value.Count == 0) { SetFlickeringFlashlightEnabled(flashlight, enabled: false); } } public static void ClearFlickeringFlashlight() { foreach (FlashlightItem flashlight in flickeringFlashlightRegistry.Keys.ToList()) { if (flickeringFlashlightRegistry.TryGetValue(flashlight, out var value)) { value.ToList().ForEach(delegate(string t) { RemoveFlickeringFlashlight(flashlight, t); }); flickeringFlashlightRegistry.Remove(flashlight); } } } public static bool IsFlickeringFlashlight(FlashlightItem flashlight) { if (flickeringFlashlightRegistry.TryGetValue(flashlight, out var value)) { return value.Count > 0; } return false; } private static void SetFlickeringFlashlightEnabled(FlashlightItem flashlight, bool enabled) { if ((Object)(object)flashlight != (Object)null) { if (enabled) { flashlight.flashlightAudio.PlayOneShot(flashlight.flashlightFlicker); WalkieTalkie.TransmitOneShotAudio(flashlight.flashlightAudio, flashlight.flashlightFlicker, 0.8f); flashlight.flashlightInterferenceLevel = 1; } else { flashlight.flashlightInterferenceLevel = 0; } } } } public static class LFCPlayerActionRegistry { private static readonly Dictionary<string, HashSet<string>> lockRegistry = new Dictionary<string, HashSet<string>>(); public static void AddLock(string actionName, string tag) { if (!lockRegistry.TryGetValue(actionName, out var value)) { value = new HashSet<string>(); lockRegistry[actionName] = value; } SetActionEnabled(actionName, enabled: false); value.Add(tag); } public static void RemoveLock(string actionName, string tag) { if (lockRegistry.TryGetValue(actionName, out var value) && value.Remove(tag) && value.Count == 0) { SetActionEnabled(actionName, enabled: true); } } public static bool IsLocked(string actionName) { if (lockRegistry.TryGetValue(actionName, out var value)) { return value.Count > 0; } return false; } private static void SetActionEnabled(string actionName, bool enabled) { InputAction val = IngamePlayerSettings.Instance.playerInput.actions.FindAction(actionName, false); if (val == null) { LegaFusionCore.mls.LogWarning((object)("Action '" + actionName + "' not found")); } else if (enabled) { val.Enable(); } else { val.Disable(); } } } public static class LFCPoweredLightsRegistry { private static readonly Dictionary<Animator, HashSet<string>> lockRegistry = new Dictionary<Animator, HashSet<string>>(); public static void AddLock(Animator poweredLight, string tag) { if (!lockRegistry.TryGetValue(poweredLight, out var value)) { value = new HashSet<string>(); lockRegistry[poweredLight] = value; } SetPoweredLightEnabled(poweredLight, enabled: false); value.Add(tag); } public static void RemoveLock(Animator poweredLight, string tag) { if (lockRegistry.TryGetValue(poweredLight, out var value) && value.Remove(tag) && value.Count == 0) { SetPoweredLightEnabled(poweredLight, enabled: true); } } public static void ClearLocks() { foreach (Animator poweredLight in lockRegistry.Keys.ToList()) { if (lockRegistry.TryGetValue(poweredLight, out var value)) { value.ToList().ForEach(delegate(string t) { RemoveLock(poweredLight, t); }); lockRegistry.Remove(poweredLight); } } } public static bool IsLocked(Animator poweredLight) { if (lockRegistry.TryGetValue(poweredLight, out var value)) { return value.Count > 0; } return false; } private static void SetPoweredLightEnabled(Animator poweredLight, bool enabled) { if ((Object)(object)poweredLight != (Object)null && (Object)(object)((Component)poweredLight).gameObject != (Object)null) { poweredLight.SetBool("on", enabled); } } } public static class LFCPrefabRegistry { private static readonly Dictionary<string, GameObject> registry = new Dictionary<string, GameObject>(); public static void RegisterPrefab(string tag, GameObject prefab) { if (!registry.ContainsKey(tag)) { registry.Add(tag, prefab); } } public static GameObject GetPrefab(string tag) { registry.TryGetValue(tag, out var value); return value; } } public static class LFCShaderFilterRegistry { private static readonly Dictionary<string, Func<GameObject, bool>> filters = new Dictionary<string, Func<GameObject, bool>>(); public static void AddFilter(string modName, Func<GameObject, bool> filter) { if (string.IsNullOrEmpty(modName)) { LegaFusionCore.mls.LogWarning((object)"[RendererVisibilityRegistry] Mod name is null or empty."); } else if (filter == null) { LegaFusionCore.mls.LogWarning((object)("[RendererVisibilityRegistry] Null filter provided for " + modName)); } else { filters[modName] = filter; } } public static void RemoveFilter(string modName) { if (!string.IsNullOrEmpty(modName)) { filters.Remove(modName); } } public static bool ShouldRender(GameObject sourceObject) { foreach (KeyValuePair<string, Func<GameObject, bool>> filter in filters) { try { if (!filter.Value(sourceObject)) { return false; } } catch (Exception arg) { LegaFusionCore.mls.LogWarning((object)$"[RendererVisibilityRegistry] Filter '{filter.Key}' threw an exception: {arg}"); } } return true; } } public static class LFCShipFeatureRegistry { public enum ShipFeatureType { SHIP_LIGHTS, MAP_SCREEN, SHIP_DOORS, SHIP_LEVER, SHIP_TERMINAL, ITEM_CHARGER, SHIP_TV, SHIP_TELEPORTERS, SMART_CUPBOARD } private static readonly Dictionary<ShipFeatureType, HashSet<string>> lockRegistry = new Dictionary<ShipFeatureType, HashSet<string>>(); private static HangarShipDoor shipDoor; private static StartMatchLever shipLever; private static Terminal shipTerminal; private static ItemCharger itemCharger; private static TVScript shipTV; private static List<ShipTeleporter> shipTeleporters = new List<ShipTeleporter>(); public static void AddLock(ShipFeatureType featureType, string tag) { if (!lockRegistry.TryGetValue(featureType, out var value)) { value = new HashSet<string>(); lockRegistry[featureType] = value; } SetFeatureEnabled(featureType, enabled: false); value.Add(tag); } public static void RemoveLock(ShipFeatureType featureType, string tag) { if (lockRegistry.TryGetValue(featureType, out var value) && value.Remove(tag) && value.Count == 0) { SetFeatureEnabled(featureType, enabled: true); } } public static void ClearLocks(string tag) { foreach (ShipFeatureType item in lockRegistry.Keys.ToList()) { if (lockRegistry.TryGetValue(item, out var value) && value.Contains(tag)) { RemoveLock(item, tag); } } } public static void ClearLocks() { foreach (ShipFeatureType featureType in lockRegistry.Keys.ToList()) { if (lockRegistry.TryGetValue(featureType, out var value)) { value.ToList().ForEach(delegate(string t) { RemoveLock(featureType, t); }); } } } public static bool IsLocked(ShipFeatureType featureType) { if (lockRegistry.TryGetValue(featureType, out var value)) { return value.Count > 0; } return false; } private static void SetFeatureEnabled(ShipFeatureType featureType, bool enabled) { switch (featureType) { case ShipFeatureType.SHIP_LIGHTS: SetShipLights(enabled); break; case ShipFeatureType.MAP_SCREEN: SetMapScreen(enabled); break; case ShipFeatureType.SHIP_DOORS: SetShipDoors(enabled); break; case ShipFeatureType.SHIP_LEVER: SetShipLever(enabled); break; case ShipFeatureType.SHIP_TERMINAL: SetShipTerminal(enabled); break; case ShipFeatureType.ITEM_CHARGER: SetItemCharger(enabled); break; case ShipFeatureType.SHIP_TV: SetShipTV(enabled); break; case ShipFeatureType.SHIP_TELEPORTERS: SetShipTeleporters(enabled); break; case ShipFeatureType.SMART_CUPBOARD: SetSmartCupboard(enabled); break; default: LegaFusionCore.mls.LogWarning((object)$"[ShipFeatureRegistry] Unknown feature '{featureType}'"); break; } } private static void SetShipLights(bool enabled) { ShipLights val = StartOfRound.Instance?.shipRoomLights; if ((Object)(object)val != (Object)null) { val.areLightsOn = enabled; val.shipLightsAnimator.SetBool("lightsOn", val.areLightsOn); } } private static void SetMapScreen(bool enabled) { ManualCameraRenderer val = StartOfRound.Instance?.mapScreen; if ((Object)(object)val != (Object)null && (Object)(object)((Component)val).gameObject != (Object)null) { val.SwitchScreenOn(enabled); } } private static void SetShipDoors(bool enabled) { if (shipDoor == null) { shipDoor = Object.FindObjectOfType<HangarShipDoor>(); } if (!((Object)(object)shipDoor == (Object)null)) { shipDoor.hydraulicsScreenDisplayed = enabled; shipDoor.hydraulicsDisplay.SetActive(enabled); shipDoor.SetDoorButtonsEnabled(enabled); if (!enabled) { StartOfRound.Instance.shipDoorsAnimator.SetBool("Closed", enabled); shipDoor.SetDoorOpen(); } } } private static void SetShipLever(bool enabled) { if (shipLever == null) { shipLever = Object.FindObjectOfType<StartMatchLever>(); } if (!((Object)(object)shipLever == (Object)null)) { shipLever.triggerScript.disabledHoverTip = (enabled ? "[Wait for ship to land]" : "Not enough energy left..."); shipLever.triggerScript.interactable = enabled; } } private static void SetShipTerminal(bool enabled) { if (shipTerminal == null) { shipTerminal = Object.FindObjectOfType<Terminal>(); } if (!((Object)(object)shipTerminal == (Object)null)) { if (!enabled) { shipTerminal.terminalTrigger.disabledHoverTip = "Not enough energy left..."; } shipTerminal.terminalTrigger.interactable = enabled; } } private static void SetItemCharger(bool enabled) { if (itemCharger == null) { itemCharger = Object.FindObjectOfType<ItemCharger>(); } if (!((Object)(object)itemCharger == (Object)null)) { itemCharger.triggerScript.disabledHoverTip = (enabled ? "(Requires battery-powered item)" : "Not enough energy left..."); itemCharger.triggerScript.interactable = enabled; } } private static void SetShipTV(bool enabled) { if (shipTV == null) { shipTV = Object.FindObjectOfType<TVScript>(); } if (!((Object)(object)shipTV == (Object)null)) { shipTV.TurnTVOnOff(enabled); } } private static void SetShipTeleporters(bool enabled) { shipTeleporters.RemoveAll((ShipTeleporter t) => (Object)(object)t == (Object)null); if (shipTeleporters.Count == 0) { shipTeleporters = Object.FindObjectsOfType<ShipTeleporter>().ToList(); } foreach (ShipTeleporter shipTeleporter in shipTeleporters) { shipTeleporter.buttonTrigger.interactable = enabled; } } private static void SetSmartCupboard(bool enabled) { SelfSortingStorageSoftCompat.SwitchLights(enabled); } public static void ResetCache() { shipDoor = null; shipLever = null; shipTerminal = null; itemCharger = null; shipTV = null; shipTeleporters.Clear(); } } public static class LFCSpawnableItemRegistry { public class SpawnableItem { public Type Type { get; } public Item Item { get; } public int MinSpawn { get; } public int MaxSpawn { get; } public int Rarity { get; } public int MinValue { get; } public int MaxValue { get; } public SpawnableItem(Type type, Item item, int minSpawn, int maxSpawn, int rarity, int minValue, int maxValue) { Type = type; Item = item; MinSpawn = minSpawn; MaxSpawn = maxSpawn; Rarity = rarity; MinValue = minValue; MaxValue = maxValue; base..ctor(); } public override bool Equals(object obj) { if (obj is SpawnableItem spawnableItem) { return (Object)(object)spawnableItem.Item == (Object)(object)Item; } return false; } public override int GetHashCode() { return ((object)Item)?.GetHashCode() ?? 0; } } private static readonly HashSet<SpawnableItem> spawnableItems = new HashSet<SpawnableItem>(); public static void Add(Type type, Item item, int minSpawn, int maxSpawn, int rarity, int minValue = 0, int maxValue = 0) { LFCObjectsManager.RegisterObject(type, item); spawnableItems.Add(new SpawnableItem(type, item, minSpawn, maxSpawn, rarity, minValue, maxValue)); } public static IReadOnlyCollection<SpawnableItem> GetAll() { return spawnableItems; } } public static class LFCSpawnRegistry { private static readonly Dictionary<Type, HashSet<Component>> registry = new Dictionary<Type, HashSet<Component>>(); public static void Add(Component obj) { if (!((Object)(object)obj == (Object)null)) { Type type = ((object)obj).GetType(); if (!registry.TryGetValue(type, out var value)) { value = new HashSet<Component>(); registry[type] = value; } if (!value.Contains(obj)) { value.Add(obj); } } } public static void Remove(Component obj) { if ((Object)(object)obj == (Object)null) { return; } Type type = ((object)obj).GetType(); if (registry.TryGetValue(type, out var value)) { value.RemoveWhere((Component c) => (Object)(object)c == (Object)null || (Object)(object)c == (Object)(object)obj); } } public static List<T> GetAllAs<T>() where T : Component { List<T> list = new List<T>(); foreach (KeyValuePair<Type, HashSet<Component>> item in registry) { item.Value.RemoveWhere((Component c) => (Object)(object)c == (Object)null); foreach (Component item2 in item.Value) { if ((Object)(object)item2 != (Object)null) { T val = (T)(object)((item2 is T) ? item2 : null); if (val != null) { list.Add(val); } } } } return list; } public static HashSet<Component> GetSetExact<T>() where T : Component { if (!registry.TryGetValue(typeof(T), out var value)) { return null; } return value; } public static void Clear() { registry.Clear(); } } public static class LFCStatRegistry { private class StatEntry { public float baseValue; public float? minValue; public float? maxValue; public readonly Dictionary<string, float> modifiers = new Dictionary<string, float>(); public float FinalValue { get { float num = 1f + modifiers.Values.Sum(); float num2 = baseValue * num; if (minValue.HasValue) { num2 = Mathf.Max(minValue.Value, num2); } if (maxValue.HasValue) { num2 = Mathf.Min(maxValue.Value, num2); } return num2; } } } private static readonly Dictionary<string, StatEntry> stats = new Dictionary<string, StatEntry>(); public static void RegisterStat(string id, float baseValue, float? min = null, float? max = null) { stats[id] = new StatEntry { baseValue = baseValue, minValue = min, maxValue = max }; } public static void SetBaseValue(string id, float newBase) { if (stats.TryGetValue(id, out var value)) { value.baseValue = newBase; } } public static void AddModifier(string id, string tag, float value) { if (stats.TryGetValue(id, out var value2)) { value2.modifiers[tag] = value; } } public static void RemoveModifier(string id, string tag) { if (stats.TryGetValue(id, out var value)) { value.modifiers.Remove(tag); } } public static bool HasModifier(string id, string sourceTag) { if (stats.TryGetValue(id, out var value)) { return value.modifiers.ContainsKey(sourceTag); } return false; } public static bool HasModifierWithTagPrefix(string id, string tagPrefix) { if (stats.TryGetValue(id, out var value)) { foreach (string key in value.modifiers.Keys) { if (key != null && key.StartsWith(tagPrefix, StringComparison.Ordinal)) { return true; } } } return false; } public static float? GetFinalValue(string id) { if (!stats.TryGetValue(id, out var value)) { return null; } return value.FinalValue; } public static float GetSumModifier(string id) { if (!stats.TryGetValue(id, out var value)) { return 0f; } return value.modifiers.Values.Sum(); } public static void ClearModifiers(string id) { if (stats.TryGetValue(id, out var value)) { value.modifiers.Clear(); } } public static void ClearModifiersWithTagPrefix(string id, string tagPrefix) { if (!stats.TryGetValue(id, out var value)) { return; } foreach (string item in value.modifiers.Keys.ToList()) { if (item != null && item.StartsWith(tagPrefix, StringComparison.Ordinal)) { value.modifiers.Remove(item); } } } } public class LFCStatusEffectRegistry : 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, playHitSFX: 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)); } } } } public class BleedingEffect : StatusEffect { public BleedingEffect(int playerWhoHit, int duration, int totalDamage, EnemyAI enemyWhoHit = null, Action onApply = null, Action onExpire = null, Action onTick = null) : base(StatusEffectType.BLEEDING, playerWhoHit, duration, totalDamage, enemyWhoHit, onApply, onExpire, onTick) { } public override void Apply(GameObject entity) { //IL_0049: 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) base.Apply(entity); PlayerControllerB safeComponent = LFCUtilities.GetSafeComponent<PlayerControllerB>(entity); if ((Object)(object)safeComponent == (Object)null || LFCUtilities.ShouldNotBeLocalPlayer(safeComponent)) { CustomPassManager.SetupAuraForObjects((GameObject[])(object)new GameObject[1] { entity.gameObject }, LegaFusionCore.bloodShader, "Lega Fusion Core" + ((Object)LegaFusionCore.bloodShader).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("Lega Fusion CoreBloodParticle", entity.transform.position, Quaternion.identity); } public override void Expire(GameObject entity) { base.Expire(entity); CustomPassManager.RemoveAuraFromObjects((GameObject[])(object)new GameObject[1] { entity.gameObject }, "Lega Fusion Core" + ((Object)LegaFusionCore.bloodShader).name); } } public class FrostEffect : StatusEffect { public FrostEffect(int playerWhoHit, int duration, int totalDamage, EnemyAI enemyWhoHit = null, Action onApply = null, Action onExpire = null, Action onTick = null) : base(StatusEffectType.FROST, playerWhoHit, duration, totalDamage, enemyWhoHit, onApply, onExpire, onTick) { } public override void Apply(GameObject entity) { //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) base.Apply(entity); EnemyAI safeComponent = LFCUtilities.GetSafeComponent<EnemyAI>(entity); if ((Object)(object)safeComponent != (Object)null && !safeComponent.isEnemyDead) { ((Component)safeComponent).GetComponent<LFCEnemySpeedBehaviour>()?.AddSpeedData(StatusEffectType.FROST.ToString(), -0.67f, safeComponent.agent.speed); CustomPassManager.SetupAuraForObjects((GameObject[])(object)new GameObject[1] { entity.gameObject }, LegaFusionCore.frostShader, "Lega Fusion Core" + ((Object)LegaFusionCore.frostShader).name); return; } PlayerControllerB safeComponent2 = LFCUtilities.GetSafeComponent<PlayerControllerB>(entity); if ((Object)(object)safeComponent2 != (Object)null && !safeComponent2.isPlayerDead) { if (LFCUtilities.ShouldBeLocalPlayer(safeComponent2)) { LFCStatRegistry.AddModifier("Speed", "Lega Fusion Core" + ((Object)LegaFusionCore.frostShader).name, -100f); return; } CustomPassManager.SetupAuraForObjects((GameObject[])(object)new GameObject[1] { entity.gameObject }, LegaFusionCore.frostShader, "Lega Fusion Core" + ((Object)LegaFusionCore.frostShader).name); } } public override void Expire(GameObject entity) { base.Expire(entity); CustomPassManager.RemoveAuraFromObjects((GameObject[])(object)new GameObject[1] { entity.gameObject }, "Lega Fusion Core" + ((Object)LegaFusionCore.frostShader).name); EnemyAI safeComponent = LFCUtilities.GetSafeComponent<EnemyAI>(entity); if ((Object)(object)safeComponent != (Object)null) { ((Component)safeComponent).GetComponent<LFCEnemySpeedBehaviour>()?.RemoveSpeedData(StatusEffectType.FROST.ToString()); return; } PlayerControllerB safeComponent2 = LFCUtilities.GetSafeComponent<PlayerControllerB>(entity); if (LFCUtilities.ShouldBeLocalPlayer(safeComponent2)) { LFCStatRegistry.RemoveModifier("Speed", "Lega Fusion Core" + ((Object)LegaFusionCore.frostShader).name); } } } public class PoisonEffect : StatusEffect { public PoisonEffect(int playerWhoHit, int duration, int totalDamage, EnemyAI enemyWhoHit = null, Action onApply = null, Action onExpire = null, Action onTick = null) : base(StatusEffectType.POISON, playerWhoHit, duration, totalDamage, enemyWhoHit, onApply, onExpire, onTick) { } public override void Apply(GameObject entity) { //IL_0049: 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) base.Apply(entity); PlayerControllerB safeComponent = LFCUtilities.GetSafeComponent<PlayerControllerB>(entity); if ((Object)(object)safeComponent == (Object)null || LFCUtilities.ShouldNotBeLocalPlayer(safeComponent)) { CustomPassManager.SetupAuraForObjects((GameObject[])(object)new GameObject[1] { entity.gameObject }, LegaFusionCore.poisonShader, "Lega Fusion Core" + ((Object)LegaFusionCore.poisonShader).name); } } public override void Expire(GameObject entity) { base.Expire(entity); CustomPassManager.RemoveAuraFromObjects((GameObject[])(object)new GameObject[1] { entity.gameObject }, "Lega Fusion Core" + ((Object)LegaFusionCore.poisonShader).name); } } public class LightningEffect : 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(StatusEffectType.LIGHTNING, playerWhoHit, duration, totalDamage, enemyWhoHit, onApply, onExpire, onTick) { } public override void Apply(GameObject entity) { //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB safeComponent = LFCUtilities.GetSafeComponent<PlayerControllerB>(entity); if ((Object)(object)safeComponent == (Object)null || LFCUtilities.ShouldNotBeLocalPlayer(safeComponent)) { CustomPassManager.SetupAuraForObjects((GameObject[])(object)new GameObject[1] { entity.gameObject }, LegaFusionCore.lightningShader, "Lega Fusion Core" + ((Object)LegaFusionCore.lightningShader).name); } } 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_0077: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_02d5: Unknown result type (might be due to invalid IL or missing references) //IL_02db: Unknown result type (might be due to invalid IL or missing references) //IL_0281: Unknown result type (might be due to invalid IL or missing references) //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_02c3: Unknown result type (might be due to invalid IL or missing references) base.Tick(entity); if (base.PassedTime != base.Duration / 2 && base.PassedTime != base.Duration) { return; } LFCGlobalManager.PlayParticle("Lega Fusion Core" + ((Object)LegaFusionCore.lightningExplosionParticle).name, entity.transform.position, entity.transform.rotation); LFCGlobalManager.PlayAudio("Lega Fusion Core" + ((Object)LegaFusionCore.lightningExplosionAudio).name, entity.transform.position); 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); for (int i = 0; i < num; i++) { Collider val2 = overlapBuffer[i]; if ((Object)(object)val2 == (Object)null) { continue; } if (((Component)val2).gameObject.TryGetComponentInParent<PlayerControllerB>(out PlayerControllerB result) && !result.isPlayerDead) { if ((Object)(object)result != (Object)(object)safeComponent && (Object)(object)result != (Object)(object)val && affectedIds.Add(0x8000000000000000uL | result.playerClientId)) { if (!HasStatus(((Component)result).gameObject, StatusEffectType.LIGHTNING)) { LFCNetworkManager.Instance.ApplyStatusEveryoneRpc(((Object)(object)val != (Object)null) ? ((int)val.playerClientId) : (-1), (int)result.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)result.playerClientId, 10, hasDamageSFX: true, callRPC: true, 11); } } else { if (!((Component)val2).gameObject.TryGetComponentInParent<EnemyAICollisionDetect>(out EnemyAICollisionDetect result2)) { continue; } EnemyAI mainScript = result2.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 (!HasStatus(((Component)mainScript).gameObject, StatusEffectType.LIGHTNING)) { LFCNetworkManager.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 val3 = val; mainScript.HitEnemyOnLocalClient(1, default(Vector3), val3, true, -1); } } } } public override void Expire(GameObject entity) { base.Expire(entity); CustomPassManager.RemoveAuraFromObjects((GameObject[])(object)new GameObject[1] { entity.gameObject }, "Lega Fusion Core" + ((Object)LegaFusionCore.lightningShader).name); } } private static readonly Dictionary<GameObject, Dictionary<StatusEffectType, StatusEffect>> activeEffects = new Dictionary<GameObject, Dictionary<StatusEffectType, StatusEffect>>(); private static LFCStatusEffectRegistry _instance; public static LFCStatusEffectRegistry 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<LFCStatusEffectRegistry>(); 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 LFCVisibilityRegistry { private sealed class EntityState { public readonly HashSet<string> tags = new HashSet<string>(); public readonly HashSet<Renderer> disabledRenderers = new HashSet<Renderer>(); public readonly HashSet<Light> disabledLights = new HashSet<Light>(); public readonly HashSet<Rigidbody> disabledGravitys = new HashSet<Rigidbody>(); public readonly HashSet<PlayerPhysicsRegion> disabledPhysicsRegions = new HashSet<PlayerPhysicsRegion>(); public readonly HashSet<Collider> disabledColliders = new HashSet<Collider>(); public readonly HashSet<TextMeshProUGUI> disabledTextMeshes = new HashSet<TextMeshProUGUI>(); public readonly HashSet<InteractTrigger> disabledInteractTriggers = new HashSet<InteractTrigger>(); public readonly HashSet<AnimatedObjectTrigger> disabledAnimatedTriggers = new HashSet<AnimatedObjectTrigger>(); public readonly HashSet<ParticleSystem> disabledParticles = new HashSet<ParticleSystem>(); public readonly Dictionary<AudioSource, float> audioVolumes = new Dictionary<AudioSource, float>(); } private static readonly Dictionary<GameObject, EntityState> visibilityStates = new Dictionary<GameObject, EntityState>(); public static void Hide(GameObject entity, string tag) { if (!((Object)(object)entity == (Object)null)) { if (string.IsNullOrWhiteSpace(tag)) { tag = "default"; } CleanupDeadEntries(); if (!visibilityStates.TryGetValue(entity, out var value)) { value = new EntityState(); visibilityStates[entity] = value; } HideInternal(entity, value); value.tags.Add(tag); } } public static void Restore(GameObject entity, string tag) { if (!((Object)(object)entity == (Object)null) && visibilityStates.TryGetValue(entity, out var value)) { if (string.IsNullOrWhiteSpace(tag)) { tag = "default"; } value.tags.Remove(tag); if (value.tags.Count <= 0) { RestoreInternal(entity, value); } } } public static void ForceRestore(GameObject entity) { if ((Object)(object)entity != (Object)null && visibilityStates.TryGetValue(entity, out var value)) { RestoreInternal(entity, value); } } public static bool IsHidden(GameObject entity) { if ((Object)(object)entity != (Object)null) { return visibilityStates.ContainsKey(entity); } return false; } private static void HideInternal(GameObject entity, EntityState state) { if ((Object)(object)LFCUtilities.LocalPlayer != (Object)null && entity.TryGetComponentInParent<VehicleController>(out VehicleController result)) { result.startKeyIgnitionTrigger.SetActive(false); result.removeKeyIgnitionTrigger.SetActive(false); result.backDoorContainer.SetActive(false); result.destroyedTruckMesh.SetActive(false); result.truckDestroyedExplosion.SetActive(false); result.backLightsContainer.SetActive(false); result.frontCabinLightContainer.SetActive(false); result.headlightsContainer.SetActive(false); result.SetVehicleCollisionForPlayer(false, LFCUtilities.LocalPlayer); } Renderer[] componentsInChildren = entity.GetComponentsInChildren<Renderer>(true); foreach (Renderer val in componentsInChildren) { if ((Object)(object)val != (Object)null && val.enabled) { val.enabled = false; state.disabledRenderers.Add(val); } } Light[] componentsInChildren2 = entity.GetComponentsInChildren<Light>(true); foreach (Light val2 in componentsInChildren2) { if ((Object)(object)val2 != (Object)null && ((Behaviour)val2).enabled) { ((Behaviour)val2).enabled = false; state.disabledLights.Add(val2); } } Rigidbody[] componentsInChildren3 = entity.GetComponentsInChildren<Rigidbody>(true); foreach (Rigidbody val3 in componentsInChildren3) { if ((Object)(object)val3 != (Object)null && val3.useGravity) { val3.useGravity = false; state.disabledGravitys.Add(val3); } } PlayerPhysicsRegion[] componentsInChildren4 = entity.GetComponentsInChildren<PlayerPhysicsRegion>(true); foreach (PlayerPhysicsRegion val4 in componentsInChildren4) { if ((Object)(object)val4 != (Object)null && !val4.disablePhysicsRegion) { val4.disablePhysicsRegion = true; state.disabledPhysicsRegions.Add(val4); } } Collider[] componentsInChildren5 = entity.GetComponentsInChildren<Collider>(true); foreach (Collider val5 in componentsInChildren5) { if ((Object)(object)val5 != (Object)null && val5.enabled) { val5.enabled = false; state.disabledColliders.Add(val5); } } TextMeshProUGUI[] componentsInChildren6 = entity.GetComponentsInChildren<TextMeshProUGUI>(true); foreach (TextMeshProUGUI val6 in componentsInChildren6) { if ((Object)(object)val6 != (Object)null && ((Behaviour)val6).enabled) { ((Behaviour)val6).enabled = false; state.disabledTextMeshes.Add(val6); } } InteractTrigger[] componentsInChildren7 = entity.GetComponentsInChildren<InteractTrigger>(true); foreach (InteractTrigger val7 in componentsInChildren7) { if ((Object)(object)val7 != (Object)null && val7.interactable) { val7.interactable = false; state.disabledInteractTriggers.Add(val7); } } ParticleSystem[] componentsInChildren8 = entity.GetComponentsInChildren<ParticleSystem>(true); foreach (ParticleSystem val8 in componentsInChildren8) { if ((Object)(object)val8 != (Object)null && val8.isPlaying) { val8.Stop(true, (ParticleSystemStopBehavior)1); state.disabledParticles.Add(val8); } } AudioSource[] componentsInChildren9 = entity.GetComponentsInChildren<AudioSource>(true); foreach (AudioSource val9 in componentsInChildren9) { if ((Object)(object)val9 != (Object)null && val9.volume > 0f) { state.audioVolumes[val9] = val9.volume; val9.volume = 0f; } } } private static void RestoreInternal(GameObject entity, EntityState state) { if ((Object)(object)LFCUtilities.LocalPlayer != (Object)null && entity.TryGetComponentInParent<VehicleController>(out VehicleController result)) { if (!result.carDestroyed) { result.startKeyIgnitionTrigger.SetActive(true); result.removeKeyIgnitionTrigger.SetActive(true); result.backDoorContainer.SetActive(true); result.backLightsContainer.SetActive(true); result.frontCabinLightContainer.SetActive(true); result.headlightsContainer.SetActive(true); } else { result.destroyedTruckMesh.SetActive(true); } result.SetVehicleCollisionForPlayer(true, LFCUtilities.LocalPlayer); } foreach (Renderer disabledRenderer in state.disabledRenderers) { if ((Object)(object)disabledRenderer != (Object)null) { disabledRenderer.enabled = true; } } foreach (Light disabledLight in state.disabledLights) { if ((Object)(object)disabledLight != (Object)null) { ((Behaviour)disabledLight).enabled = true; CullFactorySoftCompat.RefreshLightPosition(disabledLight); } } foreach (Collider disabledCollider in state.disabledColliders) { if ((Object)(object)disabledCollider != (Object)null) { disabledCollider.enabled = true; } } foreach (PlayerPhysicsRegion disabledPhysicsRegion in state.disabledPhysicsRegions) { if ((Object)(object)disabledPhysicsRegion != (Object)null) { disabledPhysicsRegion.disablePhysicsRegion = false; } } foreach (Rigidbody disabledGravity in state.disabledGravitys) { if ((Object)(object)disabledGravity != (Object)null) { disabledGravity.useGravity = true; } } foreach (TextMeshProUGUI disabledTextMesh in state.disabledTextMeshes) { if ((Object)(object)disabledTextMesh != (Object)null) { ((Behaviour)disabledTextMesh).enabled = true; } } foreach (InteractTrigger disabledInteractTrigger in state.disabledInteractTriggers) { if ((Object)(object)disabledInteractTrigger != (Object)null) { disabledInteractTrigger.interactable = true; } } foreach (ParticleSystem disabledParticle in state.disabledParticles) { if ((Object)(object)disabledParticle != (Object)null && (Object)(object)((Component)disabledParticle).gameObject != (Object)null) { disabledParticle.Play(true); } } foreach (KeyValuePair<AudioSource, float> audioVolume in state.audioVolumes) { if ((Object)(object)audioVolume.Key != (Object)null) { audioVolume.Key.volume = audioVolume.Value; } } if (entity.TryGetComponentInParent<GrabbableObject>(out GrabbableObject result2)) { CullFactorySoftCompat.RefreshGrabbableObjectPosition(result2); } state.tags.Clear(); visibilityStates.Remove(entity); } private static void CleanupDeadEntries() { List<GameObject> list = null; foreach (KeyValuePair<GameObject, EntityState> visibilityState in visibilityStates) { if ((Object)(object)visibilityState.Key == (Object)null) { if (list == null) { list = new List<GameObject>(); } list.Add(visibilityState.Key); } } if (list == null) { return; } foreach (GameObject item in list) { visibilityStates.Remove(item); } } } } namespace LegaFusionCore.Patches { public class EnemyAIPatch { [HarmonyPatch(typeof(EnemyAI), "Start")] [HarmonyPostfix] public static void PostStart(EnemyAI __instance) { LFCEnemySpeedBehaviour lFCEnemySpeedBehaviour = default(LFCEnemySpeedBehaviour); if (!((Component)__instance).TryGetComponent<LFCEnemySpeedBehaviour>(ref lFCEnemySpeedBehaviour)) { LFCEnemySpeedBehaviour lFCEnemySpeedBehaviour2 = ((Component)__instance).gameObject.AddComponent<LFCEnemySpeedBehaviour>(); lFCEnemySpeedBehaviour2.enemy = __instance; } LFCEnemyDamageBehaviour.InitExtendedHP(__instance); } [HarmonyPatch(typeof(EnemyAI), "HitEnemy")] [HarmonyPostfix] public static void HitEnemyPostfix(EnemyAI __instance, int force = 1, PlayerControllerB playerWhoHit = null, bool playHitSFX = false, int hitID = -1) { int rateHP = LFCEnemyDamageBehaviour.rateHP; int num = Mathf.CeilToInt((float)(LFCEnemyDamageBehaviour.GetExtendedHP(__instance) / rateHP)); if (num >= __instance.enemyHP) { int playerWhoHit2 = (((Object)(object)playerWhoHit != (Object)null) ? ((int)playerWhoHit.playerClientId) : (-1)); LFCEnemyDamageBehaviour.DamageEnemy(__instance, force * rateHP, playerWhoHit2, playHitSFX, hitID, callHitEnemy: false); } } [HarmonyPatch(typeof(EnemyAI), "OnDestroy")] [HarmonyPostfix] public static void OnDestroyPostfix(EnemyAI __instance) { LFCEnemyDamageBehaviour.extendedEnemyHP.Remove(__instance); } } public class GrabbableObjectPatch { [HarmonyPatch(typeof(GrabbableObject), "SetScrapValue")] [HarmonyPostfix] private static void SetAddonScanNode(ref GrabbableObject __instance) { AddonComponent component = ((Component)__instance).gameObject.GetComponent<AddonComponent>(); if ((Object)(object)component != (Object)null) { ScanNodeProperties componentInChildren = ((Component)__instance).gameObject.GetComponentInChildren<ScanNodeProperties>(); string text = "Addon: " + component.addonName; if ((Object)(object)componentInChildren != (Object)null && (componentInChildren.subText == null || !componentInChildren.subText.Contains(text))) { componentInChildren.subText = componentInChildren.subText + ((componentInChildren.subText != null) ? "\n" : "") + text; } } } [HarmonyPatch(typeof(GrabbableObject), "GrabItem")] [HarmonyPostfix] private static void GrabObject(ref GrabbableObject __instance) { if (LFCUtilities.ShouldBeLocalPlayer(__instance.playerHeldBy)) { ((Component)__instance).gameObject.GetComponent<AddonComponent>()?.StartCooldown(30); } } [HarmonyPatch(typeof(GrabbableObject), "SetControlTipsForItem")] [HarmonyPostfix] private static void SetControlTipsForAddon(ref GrabbableObject __instance) { AddonComponent component = ((Component)__instance).gameObject.GetComponent<AddonComponent>(); if (!((Object)(object)component == (Object)null) && !component.isPassive) { component.SetTipsForItem(new string[1] { AddonInput.Instance.GetAddonToolTip() }); } } [HarmonyPatch(typeof(GrabbableObject), "DestroyObjectInHand")] [HarmonyPostfix] private static void DestroyObjectRenderers(ref GrabbableObject __instance) { Renderer[] componentsInChildren = ((Component)__instance).gameObject.GetComponentsInChildren<Renderer>(); foreach (Renderer val in componentsInChildren) { Object.Destroy((Object)(object)val); } } } public class HangarShipDoorPatch { [HarmonyPatch(typeof(HangarShipDoor), "Update")] [HarmonyPostfix] private static void UpdateShipDoor(HangarShipDoor __instance) { if (LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.SHIP_DOORS)) { __instance.doorPower = 0f; ((TMP_Text)__instance.doorPowerDisplay).text = "0%"; } } } public class ItemChargerPatch { [HarmonyPatch(typeof(ItemCharger), "Update")] [HarmonyPostfix] private static void UpdateItemCharger(ref ItemCharger __instance) { if (LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.ITEM_CHARGER)) { __instance.triggerScript.disabledHoverTip = "Not enough energy left..."; __instance.triggerScript.interactable = false; } } } public class ManualCameraRendererPatch { [HarmonyPatch(typeof(ManualCameraRenderer), "SwitchScreenButton")] [HarmonyPrefix] private static bool SwitchScreenButton() { return !LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.MAP_SCREEN); } [HarmonyPatch(typeof(ManualCameraRenderer), "SwitchScreenOn")] [HarmonyPrefix] private static bool SwitchScreenOn() { return !LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.MAP_SCREEN); } [HarmonyPatch(typeof(ManualCameraRenderer), "SwitchScreenOnClientRpc")] [HarmonyPrefix] private static bool SwitchScreenOnClientRpc() { return !LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.MAP_SCREEN); } } public class MenuManagerPatch { [HarmonyPatch(typeof(MenuManager), "Awake")] [HarmonyPostfix] private static void AwakeMenu() { LFCStatusEffectRegistry.ClearStatus(); LFCShipFeatureRegistry.ResetCache(); LFCShipFeatureRegistry.ClearLocks(); LFCPoweredLightsRegistry.ClearLocks(); LFCObjectStateRegistry.ClearFlickeringFlashlight(); } } public class NetworkBehaviourPatch { private static readonly Type[] trackedTypes = new Type[5] { typeof(GrabbableObject), typeof(EnemyAI), typeof(EntranceTeleport), typeof(Turret), typeof(Landmine) }; [HarmonyPatch(typeof(NetworkBehaviour), "InternalOnNetworkSpawn")] [HarmonyPostfix] private static void SpawnNetworkBehaviour(ref NetworkBehaviour __instance) { Type[] array = trackedTypes; foreach (Type type in array) { if (type.IsInstanceOfType(__instance)) { LFCSpawnRegistry.Add((Component)(object)__instance); break; } } } [HarmonyPatch(typeof(NetworkBehaviour), "InternalOnNetworkDespawn")] [HarmonyPostfix] private static void DestroyNetworkBehaviour(ref NetworkBehaviour __instance) { Type[] array = trackedTypes; foreach (Type type in array) { if (type.IsInstanceOfType(__instance)) { LFCSpawnRegistry.Remove((Component)(object)__instance); break; } } } } public class PlayerControllerBPatch { [HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")] [HarmonyPostfix] private static void ConnectPlayer(ref PlayerControllerB __instance) { if (LFCUtilities.ShouldBeLocalPlayer(__instance)) { LFCStatRegistry.RegisterStat("Speed", __instance.movementSpeed, __instance.movementSpeed / 10f); } } [HarmonyPatch(typeof(PlayerControllerB), "Update")] [HarmonyPrefix] private static void UpdatePlayer(ref PlayerControllerB __instance) { if (LFCUtilities.ShouldBeLocalPlayer(__instance)) { __instance.movementSpeed = LFCStatRegistry.GetFinalValue("Speed") ?? __instance.movementSpeed; } } [HarmonyPatch(typeof(PlayerControllerB), "DamagePlayer")] [HarmonyPrefix] private static void DamagePlayer(ref PlayerControllerB __instance, ref int damageNumber) { if (LFCUtilities.ShouldBeLocalPlayer(__instance) && LFCStatusEffectRegistry.HasStatus(((Component)__instance).gameObject, LFCStatusEffectRegistry.StatusEffectType.POISON)) { damageNumber = Mathf.CeilToInt((float)damageNumber * 1.5f); } } } public class RoundManagerPatch { [HarmonyPatch(typeof(RoundManager), "SpawnScrapInLevel")] [HarmonyPostfix] private static void SpawnNewItems(ref RoundManager __instance) { Random random = new Random(); foreach (LFCSpawnableItemRegistry.SpawnableItem item in LFCSpawnableItemRegistry.GetAll()) { for (int i = 0; i < item.MaxSpawn; i++) { if (i < item.MinSpawn || random.Next(0, 100) <= item.Rarity) { LFCObjectsManager.SpawnNewObject(__instance, item.Item, item.MinValue, item.MaxValue); } } } } [HarmonyTranspiler] [HarmonyPatch(/*Could not decode attribute arguments.*/)] private static IEnumerable<CodeInstruction> TurnOnLights(IEnumerable<CodeInstruction> instructions, ILGenerator il) { //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Expected O, but got Unknown //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Expected O, but got Unknown //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Expected O, but got Unknown //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Expected O, but got Unknown //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(instructions); MethodInfo methodInfo = AccessTools.Method(typeof(Animator), "SetBool", new Type[2] { typeof(string), typeof(bool) }, (Type[])null); MethodInfo methodInfo2 = AccessTools.Method(typeof(LFCPoweredLightsRegistry), "IsLocked", new Type[1] { typeof(Animator) }, (Type[])null); for (int i = 0; i < list.Count; i++) { if (!CodeInstructionExtensions.Calls(list[i], methodInfo)) { continue; } int num = -1; for (int num2 = i; num2 >= 0; num2--) { if (list[num2].opcode == OpCodes.Ldstr && list[num2].operand is string text && text == "on") { num = num2; break; } } if (num == -1) { continue; } int num3 = num - 1; if (num3 >= 0) { Label label = il.DefineLabel(); Label label2 = il.DefineLabel(); if (i + 1 < list.Count) { list[i + 1].labels.Add(label2); } List<CodeInstruction> list2 = new List<CodeInstruction>(5) { new CodeInstruction(OpCodes.Dup, (object)null), new CodeInstruction(OpCodes.Call, (object)methodInfo2), new CodeInstruction(OpCodes.Brfalse_S, (object)label), new CodeInstruction(OpCodes.Pop, (object)null), new CodeInstruction(OpCodes.Br_S, (object)label2) }; int num4 = num3 + 1; list.InsertRange(num4, list2); list[num4 + list2.Count].labels.Add(label); i += list2.Count; } } return list; } } public class ShipLightsPatch { [HarmonyPatch(typeof(ShipLights), "SetShipLightsBoolean")] [HarmonyPrefix] private static bool SetShipLightsBoolean() { return !LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.SHIP_LIGHTS); } [HarmonyPatch(typeof(ShipLights), "SetShipLightsClientRpc")] [HarmonyPrefix] private static bool SetShipLightsClientRpc() { return !LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.SHIP_LIGHTS); } [HarmonyPatch(typeof(ShipLights), "SetShipLightsOnLocalClientOnly")] [HarmonyPrefix] private static bool SetShipLightsOnLocalClientOnly() { return !LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.SHIP_LIGHTS); } [HarmonyPatch(typeof(ShipLights), "ToggleShipLights")] [HarmonyPrefix] private static bool ToggleShipLights() { return !LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.SHIP_LIGHTS); } [HarmonyPatch(typeof(ShipLights), "ToggleShipLightsOnLocalClientOnly")] [HarmonyPrefix] private static bool ToggleShipLightsOnLocalClientOnly() { return !LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.SHIP_LIGHTS); } } public class ShipTeleporterPatch { [HarmonyPatch(typeof(ShipTeleporter), "Update")] [HarmonyPostfix] private static void UpdateShipTeleporter(ref ShipTeleporter __instance) { if (LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.SHIP_TELEPORTERS)) { __instance.buttonTrigger.disabledHoverTip = "Not enough energy left..."; __instance.buttonTrigger.interactable = false; } } } public class StartOfRoundPatch { [HarmonyPatch(typeof(StartOfRound), "Start")] [HarmonyBefore(new string[] { "evaisa.lethallib" })] [HarmonyPostfix] private static void StartRound(ref StartOfRound __instance) { LoadVanillaPrefabs(); AddonInput.Instance.EnableInput(); if (NetworkManager.Singleton.IsHost && (Object)(object)LFCNetworkManager.Instance == (Object)null) { GameObject val = Object.Instantiate<GameObject>(LegaFusionCore.managerPrefab, ((Component)__instance).transform.parent); val.GetComponent<NetworkObject>().Spawn(false); LegaFusionCore.mls.LogInfo((object)"Spawning LFCNetworkManager"); } } public static void LoadVanillaPrefabs() { LoadVanillaParticle("KnifeItem", "BloodParticle"); LoadVanillaParticle("SandWorm", "AppearFromGround1"); } public static void LoadVanillaParticle(string prefabName, string particleName) { GameObject prefabFromName = LFCUtilities.GetPrefabFromName(prefabName); if ((Object)(object)prefabFromName != (Object)null) { ParticleSystem val = ((IEnumerable<ParticleSystem>)prefabFromName.GetComponentsInChildren<ParticleSystem>(true)).FirstOrDefault((Func<ParticleSystem, bool>)((ParticleSystem p) => ((Object)((Component)p).gameObject).name.Equals(particleName))); if ((Object)(object)val != (Object)null) { GameObject val2 = Object.Instantiate<GameObject>(((Component)val).gameObject); ((Object)val2).name = ((Object)((Component)val).gameObject).name; val2.SetActive(false); Object.DontDestroyOnLoad((Object)(object)val2); LFCPrefabRegistry.RegisterPrefab("Lega Fusion Core" + ((Object)val2).name, val2); } } } [HarmonyPatch(typeof(StartOfRound), "ShipLeave")] [HarmonyPostfix] public static void EndRound() { LFCStatusEffectRegistry.ClearStatus(); LFCShipFeatureRegistry.ClearLocks(); LFCPoweredLightsRegistry.ClearLocks(); LFCObjectStateRegistry.ClearFlickeringFlashlight(); foreach (AddonComponent item in from g in Object.FindObjectsOfType<GrabbableObject>() select ((Component)g).GetComponent<AddonComponent>()) { if (!((Object)(object)item == (Object)null)) { item.StopCooldown(); } } } [HarmonyPatch(typeof(StartOfRound), "OnDisable")] [HarmonyPostfix] public static void OnDisable() { AddonInput.Instance.DisableInput(); LFCNetworkManager.Instance = null; LFCSpawnRegistry.Clear(); } } public class TVScriptPatch { [HarmonyPatch(typeof(TVScript), "TurnTVOnOff")] [HarmonyPrefix] private static bool TurnTVOnOff() { return !LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.SHIP_TV); } [HarmonyPatch(typeof(TVScript), "SwitchTVLocalClient")] [HarmonyPrefix] private static bool SwitchTVLocalClient() { return !LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.SHIP_TV); } [HarmonyPatch(typeof(TVScript), "TurnOnTVClientRpc")] [HarmonyPrefix] private static bool TurnOnTVClientRpc() { return !LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.SHIP_TV); } [HarmonyPatch(typeof(TVScript), "TurnOnTVAndSyncClientRpc")] [HarmonyPrefix] private static bool TurnOnTVAndSyncClientRpc() { return !LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.SHIP_TV); } [HarmonyPatch(typeof(TVScript), "TurnOffTVClientRpc")] [HarmonyPrefix] private static bool TurnOffTVClientRpc() { return !LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.SHIP_TV); } } public class VehicleControllerPatch { [HarmonyPatch(typeof(VehicleController), "Update")] [HarmonyPostfix] private static void UpdateVehicle(ref VehicleController __instance) { if (LFCVisibilityRegistry.IsHidden(((Component)__instance).gameObject)) { __instance.driverSideDoorTrigger.interactable = false; __instance.passengerSideDoorTrigger.interactable = false; } } [HarmonyPatch(typeof(VehicleController), "EnableVehicleCollisionForAllPlayers")] [HarmonyPrefix] private static bool EnableVehicleCollisionForAllPlayers(ref VehicleController __instance) { return !LFCVisibilityRegistry.IsHidden(((Component)__instance).gameObject); } [HarmonyPatch(typeof(VehicleController), "SetVehicleCollisionForPlayer")] [HarmonyPrefix] private static bool SetVehicleCollisionForPlayer(ref VehicleController __instance, bool setEnabled) { if (setEnabled) { return !LFCVisibilityRegistry.IsHidden(((Component)__instance).gameObject); } return true; } } } namespace LegaFusionCore.ModsCompat { public static class CullFactorySoftCompat { private static readonly bool CullFactoryAvailable; private static readonly MethodInfo RefreshGrabbableMethod; private static readonly MethodInfo RefreshLightMethod; static CullFactorySoftCompat() { if (Chainloader.PluginInfos.TryGetValue("com.fumiko.CullFactory", out var value) && value.Metadata.Version >= new Version(1, 5, 0)) { Type type = Type.GetType("CullFactory.Behaviours.API.DynamicObjectsAPI, CullFactory"); if (type != null) { RefreshGrabbableMethod = type.GetMethod("RefreshGrabbableObjectPosition", BindingFlags.Static | BindingFlags.Public); RefreshLightMethod = type.GetMethod("RefreshLightPosition", BindingFlags.Static | BindingFlags.Public); CullFactoryAvailable = RefreshGrabbableMethod != null && RefreshLightMethod != null; } } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void RefreshGrabbableObjectPosition(GrabbableObject item) { item.EnableItemMeshes(true); if (CullFactoryAvailable) { RefreshGrabbableMethod?.Invoke(null, new object[1] { item }); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void RefreshLightPosition(Light light) { if (CullFactoryAvailable) { RefreshLightMethod?.Invoke(null, new object[1] { light }); } } } public static class GeneralImprovementsSoftCompat { public static void Patch(Harmony harmony) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown Type type = Type.GetType("GeneralImprovements.Patches.ManualCameraRendererPatch, GeneralImprovements"); if (type != null) { MethodInfo methodInfo = AccessTools.Method(type, "SwitchScreenOn", (Type[])null, (Type[])null); if (methodInfo != null) { HarmonyMethod val = new HarmonyMethod(AccessTools.Method(typeof(GeneralImprovementsSoftCompat), "SwitchScreenOn", (Type[])null, (Type[])null)); harmony.Patch((MethodBase)methodInfo, val, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static bool SwitchScreenOn() { return !LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.MAP_SCREEN); } } public static class GoodItemScanSoftCompat { public static void Patch(Harmony harmony) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown Type type = Type.GetType("GoodItemScan.Scanner, GoodItemScan"); if (type != null) { MethodInfo methodInfo = AccessTools.Method(type, "ScanNodes", (Type[])null, (Type[])null); if (methodInfo != null) { HarmonyMethod val = new HarmonyMethod(AccessTools.Method(typeof(GoodItemScanSoftCompat), "ScanNodes", (Type[])null, (Type[])null)); harmony.Patch((MethodBase)methodInfo, val, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static void ScanNodes(ref ScanNodeProperties[] scanNodes) { if (scanNodes != null && scanNodes.Length != 0) { Collider val = default(Collider); scanNodes = scanNodes.Where((ScanNodeProperties n) => (Object)(object)n != (Object)null && ((Component)n).TryGetComponent<Collider>(ref val) && val.enabled).ToArray(); } } } public static class ModelReplacementAPISoftCompat { private static FieldInfo fiController; private static Type viewStateType; public static void Patch(Harmony harmony) { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Expected O, but got Unknown //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Expected O, but got Unknown Type type = Type.GetType("ModelReplacement.ViewStateManager, ModelReplacementAPI"); if (type != null) { MethodInfo methodInfo = AccessTools.Method(type, "SetPlayerRenderers", (Type[])null, (Type[])null); if (methodInfo != null) { HarmonyMethod val = new HarmonyMethod(AccessTools.Method(typeof(ModelReplacementAPISoftCompat), "SetPlayerRenderers", (Type[])null, (Type[])null)); harmony.Patch((MethodBase)methodInfo, val, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } MethodInfo methodInfo2 = AccessTools.Method(type, "GetViewState", (Type[])null, (Type[])null); if (methodInfo2 != null) { HarmonyMethod val2 = new HarmonyMethod(AccessTools.Method(typeof(ModelReplacementAPISoftCompat), "GetViewState", (Type[])null, (Type[])null)); harmony.Patch((MethodBase)methodInfo2, (HarmonyMethod)null, val2, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); viewStateType = Type.GetType("ModelReplacement.ViewState, ModelReplacementAPI"); } Type type2 = Type.GetType("ModelReplacement.Monobehaviors.ManagerBase, ModelReplacementAPI"); if (type2 != null) { fiController = AccessTools.Field(type2, "controller"); } } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static void SetPlayerRenderers(object __instance, ref bool enabled, ref bool helmetShadow) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown PlayerControllerB val = (PlayerControllerB)(fiController?.GetValue(__instance)); if ((Object)(object)val != (Object)null && LFCVisibilityRegistry.IsHidden(((Component)val).gameObject)) { if (enabled) { enabled = false; } if (helmetShadow) { helmetShadow = false; } } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static void GetViewState(object __instance, ref object __result) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown if (viewStateType != null) { PlayerControllerB val = (PlayerControllerB)(fiController?.GetValue(__instance)); if ((Object)(object)val != (Object)null && LFCVisibilityRegistry.IsHidden(((Component)val).gameObject)) { __result = Enum.Parse(viewStateType, "None"); } } } } public static class MoreCompantSoftCompat { public static void Patch(Harmony harmony) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown Type type = Type.GetType("MoreCompany.Cosmetics.CosmeticApplication, MoreCompany"); if (type != null) { MethodInfo methodInfo = AccessTools.Method(type, "UpdateAllCosmeticVisibilities", (Type[])null, (Type[])null); if (methodInfo != null) { HarmonyMethod val = new HarmonyMethod(AccessTools.Method(typeof(MoreCompantSoftCompat), "UpdateAllCosmeticVisibilities", (Type[])null, (Type[])null)); harmony.Patch((MethodBase)methodInfo, val, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static bool UpdateAllCosmeticVisibilities(object __instance) { MonoBehaviour val = (MonoBehaviour)((__instance is MonoBehaviour) ? __instance : null); if (val != null) { PlayerControllerB componentInParent = ((Component)val).GetComponentInParent<PlayerControllerB>(); object obj = ((componentInParent != null) ? ((Component)componentInParent).gameObject : null); if (obj == null) { EnemyAI componentInParent2 = ((Component)val).GetComponentInParent<EnemyAI>(); obj = ((componentInParent2 != null) ? ((Component)componentInParent2).gameObject : null) ?? ((Component)((Component)val).transform.root).gameObject; } GameObject val2 = (GameObject)obj; return !LFCVisibilityRegistry.IsHidden(val2.gameObject); } return true; } } public static class NameplateTweaksSoftCompat { public static void Patch(Harmony harmony) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown Type type = Type.GetType("NameplateTweaks.Patches, NameplateTweaks"); if (type != null) { MethodInfo methodInfo = AccessTools.Method(type, "PlayerUpdate", (Type[])null, (Type[])null); if (methodInfo != null) { HarmonyMethod val = new HarmonyMethod(AccessTools.Method(typeof(NameplateTweaksSoftCompat), "PlayerUpdate", (Type[])null, (Type[])null)); harmony.Patch((MethodBase)methodInfo, (HarmonyMethod)null, val, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static void PlayerUpdate(object __0) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB val = (PlayerControllerB)((__0 is PlayerControllerB) ? __0 : null); if (LFCVisibilityRegistry.IsHidden(((Component)val).gameObject)) { val.usernameAlpha.alpha = 0f; val.usernameBillboard.localScale = Vector3.zero; Canvas usernameCanvas = val.usernameCanvas; if (usernameCanvas != null) { ((Component)usernameCanvas).gameObject.SetActive(false); } } } } public static class SelfSortingStorageSoftCompat { private static Type LightButtonType; private static MethodInfo SwitchLightsMethod; public static void Patch(Harmony harmony) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Expected O, but got Unknown Type type = Type.GetType("SelfSortingStorage.Utils.Effects, SelfSortingStorage"); if (type != null) { MethodInfo methodInfo = AccessTools.Method(type, "IsTriggerValid", (Type[])null, (Type[])null); if (methodInfo != null) { HarmonyMethod val = new HarmonyMethod(AccessTools.Method(typeof(SelfSortingStorageSoftCompat), "IsTriggerValid", (Type[])null, (Type[])null)); harmony.Patch((MethodBase)methodInfo, val, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } LightButtonType = Type.GetType("SelfSortingStorage.Buttons.LightButton, SelfSortingStorage"); if (LightButtonType != null) { SwitchLightsMethod = AccessTools.Method(LightButtonType, "SwitchLights", (Type[])null, (Type[])null); if (SwitchLightsMethod != null) { HarmonyMethod val2 = new HarmonyMethod(AccessTools.Method(typeof(SelfSortingStorageSoftCompat), "PreSwitchLights", (Type[])null, (Type[])null)); harmony.Patch((MethodBase)SwitchLightsMethod, val2, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static bool IsTriggerValid(out string notValidText) { if (LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.SMART_CUPBOARD)) { notValidText = "Not enough energy left..."; return false; } notValidText = "[Nothing to store]"; return true; } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static bool PreSwitchLights() { return !LFCShipFeatureRegistry.IsLocked(LFCShipFeatureRegistry.ShipFeatureType.SMART_CUPBOARD); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void SwitchLights(bool on) { if (LightButtonType != null) { Object val = Object.FindObjectOfType(LightButtonType); if (SwitchLightsMethod != null && val != (Object)null) { SwitchLightsMethod.Invoke(val, new object[1] { on }); } } } } public static class SellBodiesFixedSoftCompat { private static readonly BaseUnityPlugin SellBodiesInstance; static SellBodiesFixedSoftCompat() { if (Chainloader.PluginInfos.TryGetValue("Entity378.sellbodies", out var value)) { SellBodiesInstance = value.Instance; } } public static void RegisterBody(string enemyName, Item item, int minValue, int maxValue, bool enabled) { if ((Object)(object)SellBodiesInstance != (Object)null && (Object)(object)item != (Object)null) { Utilities.FixMixerGroups(item.spawnPrefab); item.spawnPrefab.AddComponent(AccessTools.TypeByName("BodySyncer")); item.minValue = minValue; item.maxValue = maxValue; NetworkPrefabs.RegisterNetworkPrefab(item.spawnPrefab); Items.RegisterItem(item); if (enabled && AccessTools.Field(((object)SellBodiesInstance).GetType(), "BodySpawns")?.GetValue(SellBodiesInstance) is IDictionary dictionary) { dictionary[enemyName] = item; } } } } } namespace LegaFusionCore.Managers { public static class LFCEnemyManager { public static bool CanDie(EnemyAI enemy) { if ((Object)(object)enemy?.enemyType == (Object)null) { return false; } string[] source = new string[11] { "Spring", "Jester", "Clay Surgeon", "Red Locust Bees", "Earth Leviathan", "Girl", "Blob", "Butler Bees", "RadMech", "Docile Locust Bees", "Puffer" }; if (enemy.enemyType.canDie) { return !source.Contains(enemy.enemyType.enemyName); } return false; } public static bool FoundClosestPlayerInRange(this EnemyAI enemy, int range, int senseRange, float width = 60f, bool cannotBeInShip = false) { PlayerControllerB val = enemy.CheckLineOfSightForPlayer(width, range, senseRange); if ((Object)(object)val != (Object)null && enemy.PlayerIsTargetable(val, cannotBeInShip, false)) { return Object.op_Implicit((Object)(object)(enemy.targetPlayer = val)); } return false; } public static bool TargetClosestPlayerInAnyCase(this EnemyAI enemy, out float distance, bool cannotBeInShip = false) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) enemy.mostOptimalDistance = 2000f; distance = enemy.mostOptimalDistance; enemy.targetPlayer = null; for (int i = 0; i < StartOfRound.Instance.connectedPlayersAmount + 1; i++) { PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[i]; if (enemy.PlayerIsTargetable(val, cannotBeInShip, false)) { enemy.tempDist = Vector3.Distance(((Component)enemy).transform.position, ((Component)StartOfRound.Instance.allPlayerScripts[i]).transform.position); if (enemy.tempDist < enemy.mostOptimalDistance) { distance = enemy.tempDist; enemy.mostOptimalDistance = enemy.tempDist; enemy.targetPlayer = StartOfRound.Instance.allPlayerScripts[i]; } } } return (Object)(object)enemy.targetPlayer != (Object)null; } public static bool TargetOutsideChasedPlayer(this EnemyAI enemy) { if ((Object)(object)enemy.targetPlayer != (Object)null && enemy.targetPlayer.isInsideFactory == enemy.isOutside) { enemy.GoTowardsEntrance(); return true; } return false; } public static void GoTowardsEntrance(this EnemyAI enemy) { //IL_000d: 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_0046: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) EntranceTeleport closestEntrance = enemy.GetClosestEntrance(); if (Vector3.Distance(((Component)enemy).transform.position, closestEntrance.entrancePoint.position) < 1f) { Vector3 entranceExitPosition = GetEntranceExitPosition(closestEntrance); ((MonoBehaviour)enemy).StartCoroutine(enemy.GoTowardsCoroutine(entranceExitPosition)); } else { enemy.SetDestinationToPosition(closestEntrance.entrancePoint.position, false); } } public static EntranceTeleport GetClosestEntrance(this EnemyAI enemy) { return (from e in LFCSpawnRegistry.GetAllAs<EntranceTeleport>() where e.isEntranceToBuilding == enemy.isOutside orderby Vector3.Distance(((Component)enemy).transform.position, e.entrancePoint.position) select e).FirstOrDefault(); } public static Vector3 GetEntranceExitPosition(EntranceTeleport entranceTeleport) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) EntranceTeleport? obj = ((IEnumerable<EntranceTeleport>)LFCSpawnRegistry.GetAllAs<EntranceTeleport>()).FirstOrDefault((Func<EntranceTeleport, bool>)((EntranceTeleport e) => e.isEntranceToBuilding != entranceTeleport.isEntranceToBuilding && e.entranceId == entranceTeleport.entranceId)); if (obj == null) { return Vector3.zero; } return obj.entrancePoint.position; } public static IEnumerator GoTowardsCoroutine(this EnemyAI enemy, Vector3 position) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) yield return (object)new WaitForSeconds(1f); LFCNetworkManager.Instance.TeleportEnemyEveryoneRpc(NetworkObjectReference.op_Implicit(enemy.thisNetworkObject), position, !enemy.isOutside); } public static void TeleportEnemy(this EnemyAI enemy, Vector3 teleportPosition, bool isOutside) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)enemy != (Object)null) { enemy.SetEnemyOutside(isOutside); enemy.serverPosition = teleportPosition; ((Component)enemy).transform.position = teleportPosition; enemy.agent.Warp(teleportPosition); enemy.SyncPositionToClients(); } } public static bool TryGetSafeRandomNavMeshPosition(this EnemyAI enemy, Vector3 origin, float radius, out Vector3 position, int maxAttempts = 15) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: 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_0025: 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_005c: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) enemy.path1 = new NavMeshPath(); for (int i = 0; i < maxAttempts; i++) { position = RoundManager.Instance.GetRandomNavMeshPositionInRadius(origin, radius, default(NavMeshHit)); if (enemy.agent.CalculatePath(position, enemy.path1) && (int)enemy.path1.status == 0) { return true; } } position = origin; return false; } public static IEnumerator WaitForFullAnimation(this EnemyAI enemy, string clipName, float maxDuration = 10f, int layer = 0) { float timer = 0f; while (true) { AnimatorClipInfo[] currentAnimatorClipInfo = enemy.creatureAnimator.GetCurrentAnimatorClipInfo(layer); if (currentAnimatorClipInfo.Length != 0 && ((Object)((AnimatorClipInfo)(ref currentAnimatorClipInfo[0])).clip).name.Contains(clipName)) { break; } timer += Time.deltaTime; if (timer > maxDuration) { yield break; } yield return null; } while (true) { AnimatorStateInfo currentAnimatorStateInfo = enemy.creatureAnimator.GetCurrentAnimatorStateInfo(layer); if (((AnimatorStateInfo)(ref currentAnimatorStateInfo)).normalizedTime < 1f) { timer += Time.deltaTime; if (timer > maxDuration) { break; } yield return null; continue; } break; } } } public static class LFCGlobalManager { public static void PlayParticle(string tag, Vector3 position, Quaternion rotation, float scaleFactor = 1f, bool active = true) { //IL_0027: 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) GameObject prefab = LFCPrefabRegistry.GetPrefab(tag); if ((Object)(object)prefab == (Object)null) { LegaFusionCore.mls.LogWarning((object)("[PlayParticle] No prefab found for the tag: " + tag)); } else { PlayParticle(prefab, position, rotation, scaleFactor, active); } } public static void PlayParticle(GameObject prefab, Vector3 position, Quaternion rotation, float scaleFactor = 1f, bool active = true) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: 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_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might