using 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 fadeInDurationConfig; private ConfigEntry stayDurationConfig; private ConfigEntry fadeOutDurationConfig; private ConfigEntry animationFpsConfig; private List> flashSequences = new List>(); private float flashTimer = 0f; private List 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("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("Timings", "Stay Duration", 0.25f, "How long the image remains completely solid on the screen (in seconds)."); fadeOutDurationConfig = ((BaseUnityPlugin)this).Config.Bind("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("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 list = new List { ".png", ".jpg", ".jpeg" }; Dictionary> dictionary = new Dictionary>(); 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(); } 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> item in dictionary) { List value = item.Value; value.Sort((string a, string b) => GetFrameNumber(a).CompareTo(GetFrameNumber(b))); List list2 = new List(); 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(); 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; } } } }