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 Lost Seer Flasher v1.3.3
plugins/LostSeerFlasher.dll
Decompiled 16 hours agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using On.RoR2; using RoR2; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("LostSeerFlasher")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("LostSeerFlasher")] [assembly: AssemblyTitle("LostSeerFlasher")] [assembly: AssemblyVersion("1.0.0.0")] namespace LostSeerFlasher; [BepInPlugin("com.YourUsername.LostSeerFlasher", "Lost Seer Flasher", "1.3.3")] public class LostSeerFlasherPlugin : BaseUnityPlugin { private ConfigEntry<float> fadeInDurationConfig; private ConfigEntry<float> stayDurationConfig; private ConfigEntry<float> fadeOutDurationConfig; private ConfigEntry<float> animationFpsConfig; private List<List<Texture2D>> flashSequences = new List<List<Texture2D>>(); private float flashTimer = 0f; private List<Texture2D> currentSequence = null; private float fadeInDuration => fadeInDurationConfig.Value; private float stayDuration => stayDurationConfig.Value; private float fadeOutDuration => fadeOutDurationConfig.Value; private float animationFps => animationFpsConfig.Value; private float TotalDuration => fadeInDuration + stayDuration + fadeOutDuration; public void Awake() { //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Expected O, but got Unknown fadeInDurationConfig = ((BaseUnityPlugin)this).Config.Bind<float>("Timings", "Fade In Duration", 0.1f, "How long it takes for the image to go from invisible to fully bright (in seconds)."); stayDurationConfig = ((BaseUnityPlugin)this).Config.Bind<float>("Timings", "Stay Duration", 0.25f, "How long the image remains completely solid on the screen (in seconds)."); fadeOutDurationConfig = ((BaseUnityPlugin)this).Config.Bind<float>("Timings", "Fade Out Duration", 0.4f, "How long it takes for the image to completely fade away into transparency (in seconds)."); animationFpsConfig = ((BaseUnityPlugin)this).Config.Bind<float>("Animations", "Animation FPS", 20f, "How many frames per second animated sequences should play at."); LoadImages(); HealthComponent.TakeDamageProcess += new hook_TakeDamageProcess(HealthComponent_TakeDamageProcess); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Lost Seer Flasher initialized successfully!"); } private void LoadImages() { //IL_0206: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Expected O, but got Unknown string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location); ((BaseUnityPlugin)this).Logger.LogInfo((object)("Scanning folder for images: " + directoryName)); if (!Directory.Exists(directoryName)) { ((BaseUnityPlugin)this).Logger.LogError((object)"Plugin directory does not exist!"); return; } string[] files = Directory.GetFiles(directoryName); List<string> list = new List<string> { ".png", ".jpg", ".jpeg" }; Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>(); int num = 0; string[] array = files; foreach (string text in array) { string extension = Path.GetExtension(text); if (!list.Contains(extension.ToLower())) { continue; } string fileName = Path.GetFileName(text); if (string.Equals(fileName, "icon.png", StringComparison.OrdinalIgnoreCase)) { ((BaseUnityPlugin)this).Logger.LogInfo((object)"Successfully bypassed icon.png"); continue; } num++; string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(text); string key = fileNameWithoutExtension; int num2 = fileNameWithoutExtension.LastIndexOf('_'); if (num2 > 0 && int.TryParse(fileNameWithoutExtension.Substring(num2 + 1), out var _)) { key = fileNameWithoutExtension.Substring(0, num2); } if (!dictionary.ContainsKey(key)) { dictionary[key] = new List<string>(); } dictionary[key].Add(text); } ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Found {num} valid image file(s) split across {dictionary.Count} distinct sequence group(s)."); foreach (KeyValuePair<string, List<string>> item in dictionary) { List<string> value = item.Value; value.Sort((string a, string b) => GetFrameNumber(a).CompareTo(GetFrameNumber(b))); List<Texture2D> list2 = new List<Texture2D>(); foreach (string item2 in value) { try { byte[] array2 = File.ReadAllBytes(item2); Texture2D val = new Texture2D(2, 2); if (ImageConversion.LoadImage(val, array2)) { list2.Add(val); } } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("Failed to load image file " + item2 + ": " + ex.Message)); } } if (list2.Count > 0) { flashSequences.Add(list2); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Successfully loaded sequence group '{item.Key}' containing {list2.Count} frame(s)."); } } ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Total flash pool loaded: {flashSequences.Count} sequence(s) ready to trigger."); } private int GetFrameNumber(string filePath) { string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(filePath); int num = fileNameWithoutExtension.LastIndexOf('_'); if (num > 0 && int.TryParse(fileNameWithoutExtension.Substring(num + 1), out var result)) { return result; } return 0; } private void HealthComponent_TakeDamageProcess(orig_TakeDamageProcess orig, HealthComponent self, DamageInfo damageInfo) { //IL_000b: 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_001a: 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_0029: Invalid comparison between Unknown and I4 orig.Invoke(self, damageInfo); if ((int)DamageTypeCombo.op_Implicit(damageInfo.damageType & DamageTypeCombo.op_Implicit((DamageType)65536)) == 65536 && Object.op_Implicit((Object)(object)damageInfo.attacker)) { CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>(); if ((Object)(object)component != (Object)null && component.isPlayerControlled) { TriggerFlash(); } } } private void TriggerFlash() { if (flashSequences.Count == 0) { ((BaseUnityPlugin)this).Logger.LogWarning((object)"Void Death triggered, but the image flash pool is empty!"); return; } int index = Random.Range(0, flashSequences.Count); currentSequence = flashSequences[index]; flashTimer = TotalDuration; ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Flash Triggered! Playing sequence with {currentSequence.Count} frame(s) for a total of {TotalDuration} seconds."); } public void Update() { if (flashTimer > 0f) { flashTimer -= Time.deltaTime; } } public void OnGUI() { //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) if (flashTimer > 0f && currentSequence != null && currentSequence.Count > 0) { float num = TotalDuration - flashTimer; float num2 = 0f; if (fadeInDuration > 0f && num < fadeInDuration) { num2 = num / fadeInDuration; } else if (num < fadeInDuration + stayDuration) { num2 = 1f; } else if (fadeOutDuration > 0f) { float num3 = num - (fadeInDuration + stayDuration); num2 = 1f - num3 / fadeOutDuration; } else { num2 = 0f; } num2 = Mathf.Clamp01(num2); int index = 0; if (currentSequence.Count > 1 && animationFps > 0f) { index = Mathf.FloorToInt(num * animationFps) % currentSequence.Count; } Texture2D val = currentSequence[index]; if ((Object)(object)val != (Object)null) { GUI.color = new Color(1f, 1f, 1f, num2); GUI.DrawTexture(new Rect(0f, 0f, (float)Screen.width, (float)Screen.height), (Texture)(object)val, (ScaleMode)2); GUI.color = Color.white; } } } }