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 KenjiLib v0.7.1
KenjiLib.dll
Decompiled 2 weeks agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using JLL.Components; using Microsoft.CodeAnalysis; using Unity.Netcode; using UnityEngine; using UnityEngine.Events; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: IgnoresAccessChecksTo("JLL")] [assembly: IgnoresAccessChecksTo("JLLItemsModule")] [assembly: IgnoresAccessChecksTo("LethalLevelLoader")] [assembly: IgnoresAccessChecksTo("LethalLevelLoader.Patcher")] [assembly: IgnoresAccessChecksTo("WesleyMoonScripts")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("KenjiLib")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("KenjiLib")] [assembly: AssemblyTitle("KenjiLib")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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 KenjiLib { [BepInPlugin("rectorado.KenjiLib", "KenjiLib", "0.7.1")] public class KenjiLib : BaseUnityPlugin { private const string modGUID = "rectorado.KenjiLib"; private const string modName = "KenjiLib"; public const string ModVersion = "0.7.1"; internal static ManualLogSource mls; private ConfigEntry<LogSeverity> logSeverityConfig; public static KenjiLib Instance { get; private set; } public void Awake() { Instance = this; mls = Logger.CreateLogSource("rectorado.KenjiLib"); logSeverityConfig = ((BaseUnityPlugin)this).Config.Bind<LogSeverity>("Logging", "Logging Output", LogSeverity.User, "Select maximum log severity to output (ImportantOnly, User, Debug, Kenji)."); KLogger.Init(((BaseUnityPlugin)this).Logger, logSeverityConfig.Value); try { ((BaseUnityPlugin)this).Config.Save(); ((BaseUnityPlugin)this).Logger.LogWarning((object)$"KenjiLib: Config loaded. Logging level set to [{logSeverityConfig.Value}]"); KLogger.Kenji("Hi, I hope you like logs."); } catch (Exception arg) { ((BaseUnityPlugin)this).Logger.LogError((object)$"KenjiLib: Failed to save config on Awake: {arg}"); } KLogger.Info("KenjiLib v0.7.1 loaded successfully. :3"); logSeverityConfig.SettingChanged += delegate { KLogger.CurrentSeverity = logSeverityConfig.Value; ((BaseUnityPlugin)this).Logger.LogWarning((object)$"KenjiLib: LogSeverity changed to {KLogger.CurrentSeverity}"); }; } } public enum LogSeverity { ImportantOnly, User, Debug, Kenji } public static class KLogger { public static ManualLogSource mls; private static LogSeverity currentSeverity = LogSeverity.User; public static LogSeverity CurrentSeverity { get { return currentSeverity; } set { currentSeverity = value; } } public static void Init(ManualLogSource source, LogSeverity severity) { mls = source; currentSeverity = severity; } public static void Log(LogSeverity severity, string message) { if (mls != null && severity <= currentSeverity) { switch (severity) { case LogSeverity.ImportantOnly: mls.LogError((object)message); mls.LogWarning((object)message); break; case LogSeverity.User: mls.LogInfo((object)("[Info] " + message)); break; case LogSeverity.Debug: mls.LogInfo((object)("[Debug] " + message)); break; case LogSeverity.Kenji: mls.LogWarning((object)("[Kenji] " + message)); break; } } } public static void Error(string message) { Log(LogSeverity.ImportantOnly, message); } public static void Warning(string message) { Log(LogSeverity.ImportantOnly, message); } public static void Info(string message) { Log(LogSeverity.User, message); } public static void Debug(string message) { Log(LogSeverity.Debug, message); } public static void Kenji(string message) { Log(LogSeverity.Kenji, message); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "KenjiLib"; public const string PLUGIN_NAME = "KenjiLib"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace KenjiLib.Scripts { internal class KDestroyAroundShip : MonoBehaviour { private static readonly ManualLogSource mls = Logger.CreateLogSource("KDestroyAroundShip"); [Header("Destroy Around Ship")] [Tooltip("If Enabled, destroy objects around the designated point bellow")] public bool DestroyAroundShip = true; [Tooltip("The position of the ship, can be customized to be any other center point.")] [SerializeField] public Vector3 CheckPosition = new Vector3(0f, 0f, -14f); [Tooltip("The distance from center where objects will be destroyed.")] [SerializeField] public int Distance = 16; [Tooltip("Shows a red sphere around the affected area")] [SerializeField] public bool ShowGizmo = true; [Header("Extra")] [Tooltip("If Enabled, destroy objects around the main entrance")] public bool DestroyAroundMainEntrance = false; [Tooltip("Distance from the main entrance where the object will be destroyed")] public int MainEntranceDistance = 16; [Tooltip("If Enabled, destroy objects around the fire exit")] public bool DestroyAroundFireExit = false; [Tooltip("Distance from the fire exit where the object will be destroyed")] public int FireExitDistance = 16; private void OnDrawGizmos() { //IL_000c: 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) if (ShowGizmo) { Gizmos.color = Color.red; Gizmos.DrawWireSphere(CheckPosition, (float)Distance); } } private void Awake() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0228: Unknown result type (might be due to invalid IL or missing references) //IL_022d: Unknown result type (might be due to invalid IL or missing references) //IL_0235: Unknown result type (might be due to invalid IL or missing references) //IL_023a: Unknown result type (might be due to invalid IL or missing references) EntranceTeleport[] array = Object.FindObjectsOfType<EntranceTeleport>(); if (DestroyAroundShip && Vector3.Distance(((Component)this).transform.position, CheckPosition) < (float)Distance) { Object.Destroy((Object)(object)((Component)this).gameObject); KLogger.Debug($"KDestroyAroundShip: Destroyed {((Object)((Component)this).gameObject).name} because it was within {Distance} units of the designated point"); } if (DestroyAroundMainEntrance) { EntranceTeleport val = null; if (array != null && array.Length != 0) { EntranceTeleport[] array2 = array; foreach (EntranceTeleport val2 in array2) { if ((Object)(object)val2 == (Object)null) { continue; } try { if (val2.entranceId == 0) { val = val2; break; } } catch { } } } if ((Object)(object)val == (Object)null) { KLogger.Error("KDestroyAroundShip: No Main Entrance was found. Skipping."); KLogger.Debug("KDestroyAroundShip: No EntranceTeleport with entranceId == 0 was found. Skipping DestroyAroundMainEntrance."); KLogger.Kenji("This should NOT happen by default on a moon that has a Main Entrance, please check or contact me."); } else { Vector3 position = ((Component)val).transform.position; if (Vector3.Distance(((Component)this).transform.position, position) < (float)MainEntranceDistance) { Object.Destroy((Object)(object)((Component)this).gameObject); KLogger.Info($"KDestroyAroundShip: Destroyed {((Object)((Component)this).gameObject).name} because it was within {MainEntranceDistance} units of the main entrance"); } } } if (!DestroyAroundFireExit) { return; } EntranceTeleport val3 = null; if (array != null && array.Length != 0) { EntranceTeleport[] array3 = array; foreach (EntranceTeleport val4 in array3) { if ((Object)(object)val4 == (Object)null) { continue; } try { if (val4.entranceId != 0) { val3 = val4; break; } } catch { } } } if ((Object)(object)val3 == (Object)null) { KLogger.Warning("KDestroyAroundShip: No Fire Exit were found. Skipping."); KLogger.Debug("KDestroyAroundShip: No EntranceTeleport with entranceId != 0 was found. Skipping DestroyAroundFireExit."); KLogger.Kenji("This is very unlikely to happen if there are Fire Exits on the moon, please check or contact me."); return; } Vector3 position2 = ((Component)val3).transform.position; if (Vector3.Distance(((Component)this).transform.position, position2) < (float)FireExitDistance) { Object.Destroy((Object)(object)((Component)this).gameObject); KLogger.Info($"KDestroyAroundShip: Destroyed {((Object)((Component)this).gameObject).name} because it was within {FireExitDistance} units of a fire exit"); } } } internal class KHealingArea : MonoBehaviour { [Header("Healing Area")] [Tooltip("When active, will heal players within the specified distance.")] public bool IsHealingAreaActive = true; [Space(3f)] [Tooltip("The distance from center where objects will be healed.")] public int Distance = 15; [Tooltip("How much health will be restored per tick.")] public float healRate = 1f; [Tooltip("The time between each healing tick in seconds. At 0, healing will occur every frame.")] public float healTickInterval = 0.5f; private float healAccumulator = 1f; [Space(3f)] [Header("Extras")] [Tooltip("If true, the HUD will flash red like the player was hurt.")] public bool hudUpdateLikeHurting = false; [Tooltip("Shows a green wireframe sphere around the healing area")] public bool ShowGizmo = true; private float tickTimer = 0f; private void OnDrawGizmos() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) if (ShowGizmo) { Gizmos.color = Color.green; Gizmos.DrawWireSphere(((Component)this).gameObject.transform.position, (float)Distance); } } private void Update() { //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) EnsureValidRuntimeValues(); if (!IsHealingAreaActive) { return; } PlayerControllerB val = GameNetworkManager.Instance?.localPlayerController; if ((Object)(object)val == (Object)null) { healAccumulator = 0f; return; } Vector3 val2 = ((Component)val).transform.position - ((Component)this).transform.position; float sqrMagnitude = ((Vector3)(ref val2)).sqrMagnitude; float num = Distance; if (sqrMagnitude <= num * num) { if (healTickInterval > 0f) { tickTimer += Time.deltaTime; if (tickTimer >= healTickInterval) { UpdatePlayerHealing(val, tickTimer); tickTimer = 0f; } } else { UpdatePlayerHealing(val, Time.deltaTime); } } else { healAccumulator = 0f; tickTimer = 0f; } } private void UpdatePlayerHealing(PlayerControllerB localPlayer, float deltaTime) { if (!IsHealingAreaActive) { return; } if (!localPlayer.isPlayerDead && localPlayer.health < 100) { healAccumulator += healRate * deltaTime; KLogger.Debug($"KHealingArea: Healed player {localPlayer.playerClientId} for {healRate} health."); if (healAccumulator >= 1f) { int num = (int)healAccumulator; healAccumulator -= num; localPlayer.health = Mathf.Min(100, localPlayer.health + num); if (localPlayer.health >= 20 && (localPlayer.criticallyInjured || localPlayer.bleedingHeavily)) { localPlayer.criticallyInjured = false; localPlayer.bleedingHeavily = false; } HUDManager.Instance.UpdateHealthUI(localPlayer.health, hudUpdateLikeHurting); localPlayer.DamagePlayerServerRpc(0, localPlayer.health); } } else { healAccumulator = 0f; } } private void OnValidate() { if (Distance < 0) { KLogger.Warning($"KHealingArea: Negative Distance was set up ({Distance}), clamped to 0."); Distance = 0; } if (healRate < 0f) { KLogger.Warning($"KHealingArea: Negative healRate was set up ({healRate}), clamped to 0."); healRate = 0f; } if (healTickInterval < 0f) { KLogger.Warning($"KHealingArea: Negative healTickInterval was set up ({healTickInterval}), clamped to 0.5."); healTickInterval = 0.5f; } } private void EnsureValidRuntimeValues() { if (Distance < 0) { Distance = 0; } if (healRate < 0f) { healRate = 0f; } if (healTickInterval < 0f) { healTickInterval = 0f; } } } internal class KHelmetCondensation : MonoBehaviour { [Header("Helmet Condensation")] [Tooltip("When enabled, helmet condensation will be turned on when looking up.")] public bool onEnable = false; [Space(3f)] [Tooltip("When enabled, if there's a custom material set up it will apply it.")] [HideInInspector] public bool useCustomMaterial = false; [Tooltip("The custom material to use for the helmet condensation effect, if there's none, the default material will be used.")] [HideInInspector] public Material customHelmetCondensationMaterial; private Material originalHelmetCondensationMaterial; private bool originalMaterialStored = false; public void OnEnable() { if (onEnable) { if (!originalMaterialStored && (Object)(object)HUDManager.Instance != (Object)null) { originalHelmetCondensationMaterial = HUDManager.Instance.helmetCondensationMaterial; originalMaterialStored = true; KLogger.Debug("Stored original helmet condensation material: " + (((Object)(object)originalHelmetCondensationMaterial != (Object)null) ? ((Object)originalHelmetCondensationMaterial).name : "null")); } KLogger.Debug("Helmet Condensation is enabled."); Update(); if (useCustomMaterial) { if ((Object)(object)customHelmetCondensationMaterial != (Object)null) { ApplyCustomHelmetCondensationMaterial(); KLogger.Debug("Custom helmet condensation material applied."); } else { KLogger.Warning("Custom material is not set, using default."); } } } else { KLogger.Info("Helmet Condensation is disabled."); } } private void OnDisable() { if ((Object)(object)HUDManager.Instance != (Object)null) { KLogger.Info("Helmet Condensation is disabled."); if (originalMaterialStored) { HUDManager.Instance.helmetCondensationMaterial = originalHelmetCondensationMaterial; KLogger.Debug("Restored original helmet condensation material."); } } } private void Update() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)HUDManager.Instance != (Object)null && !TimeOfDay.Instance.insideLighting && Vector3.Angle(((Component)GameNetworkManager.Instance.localPlayerController.gameplayCamera).transform.forward, Vector3.up) < 45f) { HUDManager.Instance.increaseHelmetCondensation = true; } } public void ApplyCustomHelmetCondensationMaterial() { if ((Object)(object)HUDManager.Instance != (Object)null && (Object)(object)customHelmetCondensationMaterial != (Object)null) { if (!originalMaterialStored) { originalHelmetCondensationMaterial = HUDManager.Instance.helmetCondensationMaterial; originalMaterialStored = true; KLogger.Debug("Stored original helmet condensation material before applying custom one."); } HUDManager.Instance.helmetCondensationMaterial = customHelmetCondensationMaterial; KLogger.Debug("Applied custom helmet condensation material."); } else { KLogger.Warning("Cannot apply custom helmet condensation material."); } } } internal class KHudMessages : MonoBehaviour { [Header("Display Status Effect")] [Tooltip("When called, display a custom status effect.")] [SerializeField] [TextArea(2, 20)] public string customStatusEffectMessage = "VISIBILITY LOW!\n\nSteam leak detected in area"; [Space(3f)] [Header("Display Ship Message")] [Tooltip("When called, display a custom ship message.")] [SerializeField] public DialogueSegment[] customShipMessage; [Space(3f)] [Header("Extra HUD Stuff")] [Tooltip("(NOT WORKING, for now it will always be 10 seconds) When called, display the Gunkfish's slime on the visor this amount of seconds.")] public float customSlimeOnFace = 10f; private string StatusEffectMessageProperty { get { return customStatusEffectMessage; } set { customStatusEffectMessage = value; } } public void displayStatusEffect() { if ((Object)(object)HUDManager.Instance != (Object)null) { HUDManager.Instance.DisplayStatusEffect(customStatusEffectMessage); KLogger.Debug("Displayed status effect: " + customStatusEffectMessage); } else { KLogger.Warning("Cannot display status effect."); } } public void displayShipMessage() { if ((Object)(object)HUDManager.Instance != (Object)null) { HUDManager.Instance.ReadDialogue(customShipMessage); KLogger.Debug($"Displayed ship message: {customShipMessage}"); } else { KLogger.Warning("Cannot display ship message."); } } [ServerRpc(RequireOwnership = false)] public void SlimeOnFaceServerRpc(int playerId) { SlimeOnFaceClientRpc(playerId); } [ClientRpc] public void SlimeOnFaceClientRpc(int playerId) { if (playerId != (int)GameNetworkManager.Instance.localPlayerController.playerClientId) { StartOfRound.Instance.allPlayerScripts[playerId].slimeOnFace = customSlimeOnFace; ((Component)StartOfRound.Instance.allPlayerScripts[playerId].slimeOnFaceDecals[0]).gameObject.SetActive(true); ((Component)StartOfRound.Instance.allPlayerScripts[playerId].slimeOnFaceDecals[1]).gameObject.SetActive(true); KLogger.Debug($"Displayed slime on face for {customSlimeOnFace} seconds."); } else { KLogger.Warning("Cannot display slime on face for local player."); } } public void displaySlimeOnFace() { if ((Object)(object)HUDManager.Instance != (Object)null) { HUDManager.Instance.DisplaySpitOnHelmet(); } else { KLogger.Warning("Cannot display slime on face."); } } } public class KLightsEvent : MonoBehaviour { public enum OnEnableTrigger { FlickerLights, PermanentPowerOff, AppyEvent, PowerBackOn } private EnemyType radMechEnemyType; private const bool skipIfAlreadyPoweredOff = true; [Header("Lights Event")] [Tooltip("Trigger the selected event when this gameobject is enabled.")] [SerializeField] private bool triggerOnEnable = false; [Tooltip("Select the event to trigger.")] [SerializeField] private OnEnableTrigger LightEvent = OnEnableTrigger.FlickerLights; [Header("Run after light events")] [Tooltip("If true, the specified Event will be triggered after the light events.")] [SerializeField] private bool triggerAfterLightEvents = false; [Tooltip("Event to trigger after the light events.")] public UnityEvent afterLightEvents; [Space(3f)] [Header("JLL Appy Event")] [Tooltip("Trigger the JLL appy event when Permanent Power Off or Appy Event is triggered. This will only work if JLL is installed.")] [SerializeField] private bool triggerJLLAppyEvent = false; [Space(3f)] [Header("Extra")] [Tooltip("If true, the permanent power off will also wake the Oldbirds.")] [SerializeField] private bool permanentPowerOffActivatesOldbirds = false; [Tooltip("If true, the Oldbirds will be awoken when this gameobject is enabled.")] [SerializeField] public bool awakeOldbirdsIfEnabled = false; private void OnEnable() { if (triggerOnEnable) { switch (LightEvent) { case OnEnableTrigger.FlickerLights: TriggerFlickerLights(); break; case OnEnableTrigger.PermanentPowerOff: TriggerPermanentPowerOffEvent(); break; case OnEnableTrigger.AppyEvent: TriggerAppyEvent(); break; case OnEnableTrigger.PowerBackOn: TriggerPowerBackOn(); break; } } } public void TriggerFlickerLights() { if ((Object)(object)RoundManager.Instance == (Object)null) { KLogger.Error("RoundManager.Instance is null. Cannot trigger Flicker Lights."); return; } RoundManager.Instance.FlickerLights(false, false); KLogger.Debug("Triggered Flicker Lights."); if (triggerAfterLightEvents) { UnityEvent obj = afterLightEvents; if (obj != null) { obj.Invoke(); } } } public void TriggerPermanentPowerOffEvent() { if ((Object)(object)RoundManager.Instance == (Object)null) { KLogger.Error("RoundManager.Instance is null. Cannot trigger Permanent Power Off."); return; } if (RoundManager.Instance.powerOffPermanently) { KLogger.Warning("Permanent Power Off is already active. Skipping trigger."); return; } ((MonoBehaviour)this).StartCoroutine(PermanentPowerOffRoutine()); KLogger.Debug("Triggered Permanent Power Off."); if (triggerAfterLightEvents) { UnityEvent obj = afterLightEvents; if (obj != null) { obj.Invoke(); } } } public void TriggerAppyEvent() { if ((Object)(object)RoundManager.Instance == (Object)null) { KLogger.Error("RoundManager.Instance is null. Cannot trigger Appy Event."); return; } if (RoundManager.Instance.powerOffPermanently) { KLogger.Warning("Permanent Power Off is already active. Skipping Appy Event trigger."); return; } ((MonoBehaviour)this).StartCoroutine(TriggerAppyEventRoutine()); KLogger.Debug("Triggered Appy Event."); if (triggerAfterLightEvents) { UnityEvent obj = afterLightEvents; if (obj != null) { obj.Invoke(); } } } public void TriggerPowerBackOn() { if ((Object)(object)RoundManager.Instance == (Object)null) { KLogger.Error("RoundManager.Instance is null. Cannot trigger Power Back On."); return; } RoundManager.Instance.SwitchPower(true); RoundManager.Instance.powerOffPermanently = false; KLogger.Debug("Triggered Power Back On."); } private void awakeOldbirdsifEnabled() { if (awakeOldbirdsIfEnabled) { awakeOldbirds(); } } public void awakeOldbirds() { //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)RoundManager.Instance == (Object)null) { KLogger.Error("RoundManager.Instance is null. Cannot awake Oldbirds."); } else if (((NetworkBehaviour)RoundManager.Instance).IsServer && (Object)(object)radMechEnemyType != (Object)null) { EnemyAINestSpawnObject[] array = Object.FindObjectsByType<EnemyAINestSpawnObject>((FindObjectsSortMode)0); for (int i = 0; i < array.Length; i++) { if ((Object)(object)array[i].enemyType == (Object)(object)radMechEnemyType) { RoundManager.Instance.SpawnEnemyGameObject(RoundManager.Instance.outsideAINodes[0].transform.position, 0f, -1, radMechEnemyType); } } } else { KLogger.Warning("Not the server or radMechEnemyType is null. Cannot awake Oldbirds."); } } private IEnumerator PermanentPowerOffRoutine() { RoundManager.Instance.FlickerLights(false, false); yield return (object)new WaitForSeconds(2.5f); RoundManager.Instance.SwitchPower(false); RoundManager.Instance.powerOffPermanently = true; if (permanentPowerOffActivatesOldbirds && ((NetworkBehaviour)RoundManager.Instance).IsServer && (Object)(object)radMechEnemyType != (Object)null) { EnemyAINestSpawnObject[] array = Object.FindObjectsByType<EnemyAINestSpawnObject>((FindObjectsSortMode)0); for (int a = 0; a < array.Length; a++) { if ((Object)(object)array[a].enemyType == (Object)(object)radMechEnemyType) { RoundManager.Instance.SpawnEnemyGameObject(RoundManager.Instance.outsideAINodes[0].transform.position, 0f, -1, radMechEnemyType); } } } if (!triggerJLLAppyEvent) { yield break; } try { if (JLevelEventTriggers.EventTriggers != null && JLevelEventTriggers.EventTriggers.Count > 0) { for (int i = 0; i < JLevelEventTriggers.EventTriggers.Count; i++) { JLevelEventTriggers obj = JLevelEventTriggers.EventTriggers[i]; if (obj != null) { obj.InvokeApparatus(); } } KLogger.Debug("Invoked JLL AppyEvent after PermanentPowerOff."); } else { KLogger.Warning("JLevelEventTriggers.EventTriggers is null or empty; nothing to invoke."); } } catch (Exception arg) { KLogger.Error($"Exception while invoking JLL EventTriggers: {arg}"); } } private IEnumerator TriggerAppyEventRoutine() { if (((NetworkBehaviour)RoundManager.Instance).IsServer && Random.Range(0, 100) < 70 && RoundManager.Instance.minEnemiesToSpawn < 2) { RoundManager.Instance.minEnemiesToSpawn = 2; } yield return (object)new WaitForSeconds(1f); RoundManager.Instance.FlickerLights(false, false); yield return (object)new WaitForSeconds(2.5f); RoundManager.Instance.SwitchPower(false); RoundManager.Instance.powerOffPermanently = true; yield return (object)new WaitForSeconds(0.75f); HUDManager.Instance.RadiationWarningHUD(); if (!((NetworkBehaviour)RoundManager.Instance).IsServer || (Object)(object)radMechEnemyType == (Object)null) { yield break; } EnemyAINestSpawnObject[] array = Object.FindObjectsByType<EnemyAINestSpawnObject>((FindObjectsSortMode)0); for (int a = 0; a < array.Length; a++) { if ((Object)(object)array[a].enemyType == (Object)(object)radMechEnemyType) { RoundManager.Instance.SpawnEnemyGameObject(RoundManager.Instance.outsideAINodes[0].transform.position, 0f, -1, radMechEnemyType); } if (!triggerJLLAppyEvent) { continue; } try { if (JLevelEventTriggers.EventTriggers != null && JLevelEventTriggers.EventTriggers.Count > 0) { for (int i = 0; i < JLevelEventTriggers.EventTriggers.Count; i++) { JLevelEventTriggers obj = JLevelEventTriggers.EventTriggers[i]; if (obj != null) { obj.InvokeApparatus(); } } KLogger.Debug("Invoked JLLAppyEvent after AppyEvent."); KLogger.Kenji("Naming everything the same thing is a bad idea, but I did it anyway. JLLAppyEvent and AppyEvent are not the same thing, but they have the same name. This is a warning to future me."); } else { KLogger.Warning("JLevelEventTriggers.EventTriggers is null or empty; nothing to invoke."); } } catch (Exception ex) { Exception ex2 = ex; KLogger.Error($"Exception while invoking JLL EventTriggers: {ex2}"); } } } } internal class KRunOnUpdate : MonoBehaviour { [Header("Run On Update")] [Tooltip("When enabled, the specified action will be executed every frame. Please be careful with this action as it may impact performance.")] public bool onEnable = false; [Space(3f)] [Tooltip("The action to execute every frame when enabled.")] public UnityEvent onUpdate; public void UpdateOnEnable() { if (onEnable && onUpdate != null) { KLogger.Debug("Attempting to execute action onUpdate."); Update(); } else { KLogger.Warning("The script is disabled or there's no action to execute, skipping."); } } public void Update() { UnityEvent obj = onUpdate; if (obj != null) { obj.Invoke(); } } } internal class KWeatherExtras : MonoBehaviour { public enum WeatherVariablesValues { Custom, WeatherRegistry, Eclipsed, Foggy, Flooded, Stormy } public enum VariableMath { Add, Multiply } [Header("Eclipse-like Weather event")] [Tooltip("When enabled, will mimic an eclipse-like extra enemy spawning.")] public bool EnableCustomEclipse = false; [Tooltip("The moon's weather variable value used for the extra enemy spawns. WeatherRegistry uses the one set on WeatherRegistry's custom weather options or by default the current weather's variables.")] public WeatherVariablesValues weatherVariablesValuesCustomEclipse = WeatherVariablesValues.Eclipsed; [Space(2f)] [Tooltip("When enabled, will apply a math operation to the weather variable value.")] public bool useVariableModifier = false; [Tooltip("The math operation to apply to the weather variable value.")] public VariableMath variableModifier = VariableMath.Multiply; [Tooltip("The value used by the modifier (added or multiplied).")] public float variableModifierValue = 1f; [Space(3f)] [Header("Flooded-like Weather object")] [Tooltip("When enabled, will mimic the flooded behaviour on a certain gameobject.")] public bool EnableCustomFlooded = false; [Tooltip("The moon's weather variables values used for the gameobjects movement. WeatherRegistry uses the one set on WeatherRegistry's custom weather options or by default the current weather's variables.")] public WeatherVariablesValues weatherVariablesValuesCustomFlooded = WeatherVariablesValues.Flooded; [Tooltip("The gameobject that will be moved when the flooded weather is enabled.")] public GameObject objectToMoveFlooded; [Tooltip("The audio source for the custom flooded weather.")] public AudioSource customFloodedAudio; private float customFloodLevelOffset; [Space(3f)] [Header("Stormy Lightnings")] [Tooltip("When enabled, will enable lightnings.")] public bool EnableCustomStormy = false; private string stormyObjectName = "Systems/GameSystems/TimeAndWeather/Stormy"; [Space(3f)] [Header("Custom Variables")] [Tooltip("Weather variable 1 used on the Custom option.")] public int customWeatherVariable1 = 0; [Tooltip("Weather variable 2 used on the Custom option.")] public int customWeatherVariable2 = 0; public static (int value1, int value2) GetWeatherValuesForLevel(SelectableLevel level, LevelWeatherType levelWeatherType) { //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) Dictionary<LevelWeatherType, (int, int)> dictionary = level.randomWeathers.ToDictionary((RandomWeatherWithVariables randomWeather) => randomWeather.weatherType, (RandomWeatherWithVariables randomWeather) => (weatherVariable: randomWeather.weatherVariable, weatherVariable2: randomWeather.weatherVariable2)); return dictionary.ContainsKey(levelWeatherType) ? dictionary[levelWeatherType] : (value1: 0, value2: 0); } private void OnEnable() { //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01d5: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Expected O, but got Unknown //IL_0231: Unknown result type (might be due to invalid IL or missing references) try { if (EnableCustomEclipse) { int weatherVariable = GetWeatherVariable(weatherVariablesValuesCustomEclipse); KLogger.Info($"KWeatherExtras: Custom Eclipse enabled. weatherVariable1 gathered from {weatherVariablesValuesCustomEclipse} = {weatherVariable}"); int num = weatherVariable; if (useVariableModifier) { num = ApplyVariableModifier(weatherVariable, variableModifier, variableModifierValue); KLogger.Debug($"KWeatherExtras: Applying modifier {variableModifier} {variableModifierValue} to the base value {weatherVariable}. Total = {num}"); } else { KLogger.Debug($"KWeatherExtras: No variable modifier used. value={weatherVariable}"); } RoundManager.Instance.minOutsideEnemiesToSpawn = num; RoundManager.Instance.minEnemiesToSpawn = num; KLogger.Debug($"KWeatherExtras: Outside enemies to spawn set to {num}"); KLogger.Debug($"KWeatherExtras: Inside enemies to spawn set to {num}"); } if (EnableCustomFlooded) { if ((Object)(object)objectToMoveFlooded == (Object)null) { KLogger.Error("KWeatherExtras: Custom Flooded is enabled but the GameObject to move is missing! Please assign a GameObject."); return; } int weatherVariable2 = GetWeatherVariable(weatherVariablesValuesCustomFlooded); int weatherVariable3 = GetWeatherVariable2(weatherVariablesValuesCustomFlooded); KLogger.Info($"KWeatherExtras: Custom Flooded enabled. weatherVariable1 gathered from {weatherVariablesValuesCustomFlooded} = {weatherVariable2}"); KLogger.Info($"KWeatherExtras: Custom Flooded enabled. weatherVariable2 gathered from {weatherVariablesValuesCustomFlooded} = {weatherVariable3}"); if ((Object)(object)TimeOfDay.Instance != (Object)null) { ((Component)this).transform.position = new Vector3(0f, (float)weatherVariable2, 0f); TimeOfDay.Instance.onTimeSync.AddListener(new UnityAction(OnGlobalTimeSync)); } if ((Object)(object)customFloodedAudio == (Object)null) { EnsureCustomFloodedAudio(); KLogger.Warning($"KWeatherExtras: Custom AudioSource is missing! Created {customFloodedAudio}"); KLogger.Debug($"KWeatherExtras: Created {((Object)((Component)customFloodedAudio).gameObject).name} in {((Component)customFloodedAudio).transform.position}."); KLogger.Kenji("KWeatherExtras: It automatically created an empty AudioSource for it to not error. PLEASE add a custom one to ensure that it works correctly."); } } if (EnableCustomStormy) { KLogger.Info("KWeatherExtras: Custom Stormy enabled. Enabling lightnings."); if ((Object)(object)TimeOfDay.Instance != (Object)null) { InvokeStormyLightnings(); } } } catch (Exception arg) { KLogger.Error($"KWeatherExtras: Error trying to enable - {arg}"); } } private void EnsureCustomFloodedAudio() { //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected O, but got Unknown //IL_00b2: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)objectToMoveFlooded != (Object)null)) { return; } Transform parent = objectToMoveFlooded.transform.parent; string text = ((Object)objectToMoveFlooded).name + "_FloodAudio"; object obj2; if (!((Object)(object)parent != (Object)null)) { GameObject obj = GameObject.Find(text); obj2 = ((obj != null) ? obj.transform : null); } else { obj2 = parent.Find(text); } Transform val = (Transform)obj2; GameObject val2; if ((Object)(object)val != (Object)null) { val2 = ((Component)val).gameObject; } else { val2 = new GameObject(text); if ((Object)(object)parent != (Object)null) { val2.transform.SetParent(parent); } val2.transform.position = objectToMoveFlooded.transform.position; } AudioSource val3 = val2.GetComponent<AudioSource>() ?? val2.AddComponent<AudioSource>(); val3.playOnAwake = false; val3.loop = true; val3.spatialBlend = 1f; val3.volume = 0f; customFloodedAudio = val3; } private int ApplyVariableModifier(int baseValue, VariableMath math, float modifier) { switch (math) { case VariableMath.Add: if (modifier < 0f && baseValue + (int)modifier < 0) { KLogger.Warning($"KWeatherExtras: Applying modifier {math} {modifier} would result in a negative value. Clamping to 0."); return 0; } return baseValue + (int)modifier; case VariableMath.Multiply: if (modifier < 0f && (float)baseValue * modifier < 0f) { KLogger.Warning($"KWeatherExtras: Applying modifier {math} {modifier} would result in a negative value. Clamping to 0."); return 0; } return (int)((float)baseValue * modifier); default: return baseValue; } } public void InvokeStormyLightnings() { GameObject val = GameObject.Find(stormyObjectName); if ((Object)(object)val == (Object)null) { KLogger.Warning("KWeatherExtras: No GameObject named '" + stormyObjectName + "' found."); } else if ((Object)(object)val != (Object)null) { val.SetActive(true); KLogger.Debug("KWeatherExtras: Invoked Lightnings."); } } private int GetWeatherVariable(WeatherVariablesValues source) { switch (source) { case WeatherVariablesValues.WeatherRegistry: if ((Object)(object)TimeOfDay.Instance != (Object)null) { try { return (int)TimeOfDay.Instance.currentWeatherVariable; } catch (Exception arg) { KLogger.Error($"KWeatherExtras: Error obtaining WeatherVariable - {arg}"); return 0; } } KLogger.Warning("KWeatherExtras: TimeOfDay.Instance is null. Returning 0 as default value."); return 0; case WeatherVariablesValues.Custom: if ((Object)(object)TimeOfDay.Instance != (Object)null && customWeatherVariable1 >= 0) { return customWeatherVariable1; } KLogger.Error("KWeatherExtras: Error obtaining Custom WeatherVariable 1 or it is negative, defaulting to 0."); return 0; case WeatherVariablesValues.Eclipsed: if ((Object)(object)TimeOfDay.Instance != (Object)null && (Object)(object)TimeOfDay.Instance.currentLevel != (Object)null) { return GetWeatherValuesForLevel(TimeOfDay.Instance.currentLevel, (LevelWeatherType)5).value1; } KLogger.Error("KWeatherExtras: Error obtaining Eclipsed WeatherVariable 1, defaulting to 0."); return 0; case WeatherVariablesValues.Foggy: if ((Object)(object)TimeOfDay.Instance != (Object)null && (Object)(object)TimeOfDay.Instance.currentLevel != (Object)null) { return GetWeatherValuesForLevel(TimeOfDay.Instance.currentLevel, (LevelWeatherType)3).value1; } KLogger.Error("KWeatherExtras: Error obtaining Foggy WeatherVariable 1, defaulting to 0."); return 0; case WeatherVariablesValues.Flooded: if ((Object)(object)TimeOfDay.Instance != (Object)null && (Object)(object)TimeOfDay.Instance.currentLevel != (Object)null) { return GetWeatherValuesForLevel(TimeOfDay.Instance.currentLevel, (LevelWeatherType)4).value1; } KLogger.Error("KWeatherExtras: Error obtaining Flooded WeatherVariable 1, defaulting to 0."); return 0; case WeatherVariablesValues.Stormy: if ((Object)(object)TimeOfDay.Instance != (Object)null && (Object)(object)TimeOfDay.Instance.currentLevel != (Object)null) { return GetWeatherValuesForLevel(TimeOfDay.Instance.currentLevel, (LevelWeatherType)2).value1; } KLogger.Error("KWeatherExtras: Error obtaining Stormy WeatherVariable 1, defaulting to 0."); return 0; default: return (int)source; } } private int GetWeatherVariable2(WeatherVariablesValues source) { switch (source) { case WeatherVariablesValues.WeatherRegistry: if ((Object)(object)TimeOfDay.Instance != (Object)null) { try { return (int)TimeOfDay.Instance.currentWeatherVariable2; } catch (Exception arg) { KLogger.Error($"KWeatherExtras: Error obtaining WeatherVariable2 - {arg}"); return 0; } } KLogger.Error("KWeatherExtras: TimeOfDay.Instance is null. Returning 0 as default value."); return 0; case WeatherVariablesValues.Custom: if ((Object)(object)TimeOfDay.Instance != (Object)null && customWeatherVariable2 >= 0) { return customWeatherVariable2; } KLogger.Error("KWeatherExtras: Error obtaining Custom WeatherVariable 2 or it is negative, defaulting to 0."); return 0; case WeatherVariablesValues.Eclipsed: if ((Object)(object)TimeOfDay.Instance != (Object)null && (Object)(object)TimeOfDay.Instance.currentLevel != (Object)null) { return GetWeatherValuesForLevel(TimeOfDay.Instance.currentLevel, (LevelWeatherType)5).value2; } KLogger.Error("KWeatherExtras: Error obtaining Eclipsed WeatherVariable 2, defaulting to 0."); return 0; case WeatherVariablesValues.Foggy: if ((Object)(object)TimeOfDay.Instance != (Object)null && (Object)(object)TimeOfDay.Instance.currentLevel != (Object)null) { return GetWeatherValuesForLevel(TimeOfDay.Instance.currentLevel, (LevelWeatherType)3).value2; } KLogger.Error("KWeatherExtras: Error obtaining WeatherVariable2."); return 0; case WeatherVariablesValues.Flooded: if ((Object)(object)TimeOfDay.Instance != (Object)null && (Object)(object)TimeOfDay.Instance.currentLevel != (Object)null) { return GetWeatherValuesForLevel(TimeOfDay.Instance.currentLevel, (LevelWeatherType)4).value2; } KLogger.Error("KWeatherExtras: Error obtaining Flooded WeatherVariable 2, defaulting to 0."); return 0; case WeatherVariablesValues.Stormy: if ((Object)(object)TimeOfDay.Instance != (Object)null && (Object)(object)TimeOfDay.Instance.currentLevel != (Object)null) { return GetWeatherValuesForLevel(TimeOfDay.Instance.currentLevel, (LevelWeatherType)2).value2; } KLogger.Error("KWeatherExtras: Error obtaining Stormy WeatherVariable 2, defaulting to 0."); return 0; default: return (int)source; } } private void OnDisable() { //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Expected O, but got Unknown if ((Object)(object)customFloodedAudio != (Object)null) { customFloodedAudio.volume = 0f; } customFloodLevelOffset = 0f; if ((Object)(object)TimeOfDay.Instance != (Object)null) { TimeOfDay.Instance.onTimeSync.RemoveListener(new UnityAction(OnGlobalTimeSync)); } ((Component)this).transform.position = new Vector3(0f, -50f, 0f); } private void OnGlobalTimeSync() { int weatherVariable = GetWeatherVariable2(weatherVariablesValuesCustomFlooded); customFloodLevelOffset = Mathf.Clamp(TimeOfDay.Instance.globalTime / 1080f, 0f, 100f) * (float)weatherVariable; } private void Update() { //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) int weatherVariable = GetWeatherVariable(weatherVariablesValuesCustomFlooded); int weatherVariable2 = GetWeatherVariable2(weatherVariablesValuesCustomFlooded); if ((Object)(object)TimeOfDay.Instance == (Object)null && EnableCustomFlooded) { return; } ((Component)this).transform.position = Vector3.MoveTowards(((Component)this).transform.position, new Vector3(0f, (float)weatherVariable, 0f) + Vector3.up * customFloodLevelOffset, 0.5f * Time.deltaTime); if ((Object)(object)customFloodedAudio == (Object)null) { return; } if (GameNetworkManager.Instance.localPlayerController.isInsideFactory) { customFloodedAudio.volume = 0f; return; } ((Component)customFloodedAudio).transform.position = new Vector3(((Component)GameNetworkManager.Instance.localPlayerController).transform.position.x, ((Component)this).transform.position.y + 3f, ((Component)GameNetworkManager.Instance.localPlayerController).transform.position.z); if (Physics.Linecast(((Component)GameNetworkManager.Instance.localPlayerController.gameplayCamera).transform.position, ((Component)customFloodedAudio).transform.position, StartOfRound.Instance.collidersAndRoomMaskAndDefault, (QueryTriggerInteraction)1)) { customFloodedAudio.volume = Mathf.Lerp(customFloodedAudio.volume, 0f, 0.5f * Time.deltaTime); } else { customFloodedAudio.volume = Mathf.Lerp(customFloodedAudio.volume, 1f, 0.5f * Time.deltaTime); } } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }