Decompiled source of Lost Seer Flasher v1.3.3

plugins/LostSeerFlasher.dll

Decompiled 16 hours ago
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<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;
			}
		}
	}
}