Decompiled source of ColorBubble v1.0.3

ColorBubble.dll

Decompiled 5 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("ColorBubble")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ColorBubble")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("cc3703b3-081f-495a-8c37-88808386fd15")]
[assembly: AssemblyFileVersion("1.0.3")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.3.0")]
[module: UnverifiableCode]
namespace ColorBubble;

[BepInPlugin("org.ssmvc.colorbubble", "ColorBubble", "1.0.3")]
[BepInProcess("valheim.exe")]
public class ColorBubble : BaseUnityPlugin
{
	[HarmonyPatch(typeof(SE_Shield))]
	private static class ShieldPatch
	{
		[HarmonyPatch("OnDamaged")]
		[HarmonyPrefix]
		public static void OnDamagedPrefix(SE_Shield __instance, HitData hit, Character attacker)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			if (Enabled.Value && ShowBubbleHits.Value && hit.GetTotalDamage() > 0f)
			{
				DamageText.instance.ShowText((DamageModifier)0, hit.m_point, hit.GetTotalDamage(), false);
			}
		}

		[HarmonyPatch("Setup")]
		[HarmonyPostfix]
		public static void SetupPostfix(SE_Shield __instance, Character character)
		{
			if (!Enabled.Value || !EnableBubbleColor.Value || (BubbleColorSelfOnly.Value && character != Player.m_localPlayer))
			{
				return;
			}
			GameObject[] startEffectInstances = ((StatusEffect)__instance).m_startEffectInstances;
			foreach (GameObject val in startEffectInstances)
			{
				if (((Object)val).name.StartsWith("vfx_StaffShield"))
				{
					RecolorBubble(val);
				}
			}
		}

		public static void LoadTexture(string path, ref Material material)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Expected O, but got Unknown
			byte[] array = File.ReadAllBytes(path);
			Texture2D val = new Texture2D(1, 1);
			ImageConversion.LoadImage(val, array);
			material.mainTexture = (Texture)(object)val;
		}
	}

	[HarmonyPatch(typeof(StatusEffect), "GetIconText")]
	private static class StatusEffectPatch
	{
		public static void Postfix(StatusEffect __instance, ref string __result)
		{
			if (!Enabled.Value)
			{
				return;
			}
			SE_Shield val = (SE_Shield)(object)((__instance is SE_Shield) ? __instance : null);
			if (val != null)
			{
				if (ShowBubblePercent.Value && ShowBubbleHitPoints.Value)
				{
					__result += "\r\n";
				}
				if (ShowBubblePercent.Value)
				{
					__result += $" ({100f - val.m_damage / val.m_totalAbsorbDamage * 100f:##}%)";
				}
				if (ShowBubbleHitPoints.Value)
				{
					__result += $" ({val.m_totalAbsorbDamage - val.m_damage:####})";
				}
			}
		}
	}

	public const string PluginGUID = "org.ssmvc.colorbubble";

	public const string PluginName = "ColorBubble";

	public const string PluginVersion = "1.0.3";

	private static Harmony _harmony;

	private static Texture _defaultTexture;

	public static ConfigEntry<bool> Enabled { get; set; }

	public static ConfigEntry<bool> EnableBubbleColor { get; set; }

	public static ConfigEntry<Color> BubbleColor { get; set; }

	public static ConfigEntry<bool> BubbleColorSelfOnly { get; set; }

	public static ConfigEntry<bool> ShowBubblePercent { get; set; }

	public static ConfigEntry<bool> ShowBubbleHitPoints { get; set; }

	public static ConfigEntry<bool> ShowBubbleHits { get; set; }

	public static ConfigEntry<float> ShaderVelocity { get; set; }

	public static ConfigEntry<float> ShaderRefraction { get; set; }

	public static ConfigEntry<float> ShaderGlossiness { get; set; }

	public static ConfigEntry<float> ShaderMetallic { get; set; }

	public static ConfigEntry<bool> ShaderTexture { get; set; }

	public void Awake()
	{
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		_harmony = Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "org.ssmvc.colorbubble");
		Enabled = ((BaseUnityPlugin)this).Config.Bind<bool>("_Global", "isModEnabled", true, "Globally enable or disable this mod.");
		EnableBubbleColor = ((BaseUnityPlugin)this).Config.Bind<bool>("Color", "Enable Bubble Color", true, "Enable or disable the bubble color");
		BubbleColor = ((BaseUnityPlugin)this).Config.Bind<Color>("Color", "Bubble Color", new Color(1f, 0f, 0f, 0.5f), (ConfigDescription)null);
		ShowBubblePercent = ((BaseUnityPlugin)this).Config.Bind<bool>("Misc", "Show Bubble Percent", true, "Show remaining bubble integrity");
		ShowBubbleHitPoints = ((BaseUnityPlugin)this).Config.Bind<bool>("Misc", "Show Bubble HitPoints", false, "Show remaining bubble hit points");
		ShowBubbleHits = ((BaseUnityPlugin)this).Config.Bind<bool>("Misc", "Show Bubble Hits", true, "Show bubble damage taken");
		BubbleColorSelfOnly = ((BaseUnityPlugin)this).Config.Bind<bool>("Misc", "Self Only", false, "Do not apply bubble colors to other player/creature bubbles");
		ShaderVelocity = ((BaseUnityPlugin)this).Config.Bind<float>("Shader", "ShaderVelocity", 5f, "Wavy Speed");
		ShaderRefraction = ((BaseUnityPlugin)this).Config.Bind<float>("Shader", "ShaderRefraction", 0.1f, "Bubble Distortion");
		ShaderGlossiness = ((BaseUnityPlugin)this).Config.Bind<float>("Shader", "ShaderGlossiness", 0.8f, "Bubble Glossiness");
		ShaderMetallic = ((BaseUnityPlugin)this).Config.Bind<float>("Shader", "ShaderMetallic", 1f, "Bubble Metallic");
		ShaderTexture = ((BaseUnityPlugin)this).Config.Bind<bool>("Shader", "DisableTexture", false, "Makes bubble more smoother");
		((BaseUnityPlugin)this).Config.SettingChanged += UpdateBubble;
	}

	private void UpdateBubble(object sender, SettingChangedEventArgs e)
	{
		if (Enabled.Value && EnableBubbleColor.Value)
		{
			Transform val = ((Component)Player.m_localPlayer).transform.Find("vfx_StaffShield(Clone)");
			if (Object.op_Implicit((Object)(object)val))
			{
				RecolorBubble(((Component)val).gameObject);
			}
		}
	}

	public void OnDestroy()
	{
		Harmony harmony = _harmony;
		if (harmony != null)
		{
			harmony.UnpatchSelf();
		}
	}

	private static void RecolorBubble(GameObject effect)
	{
		//IL_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0069: Expected O, but got Unknown
		MeshRenderer componentInChildren = effect.GetComponentInChildren<MeshRenderer>();
		if (!((Object)(object)componentInChildren == (Object)null))
		{
			((Renderer)componentInChildren).material.mainTexture = _defaultTexture ?? (_defaultTexture = ((Renderer)componentInChildren).material.mainTexture);
			((Renderer)componentInChildren).material.color = BubbleColor.Value;
			if (ShaderTexture.Value)
			{
				((Renderer)componentInChildren).material.mainTexture = (Texture)new Texture2D(1, 1);
			}
			((Renderer)componentInChildren).material.SetFloat("_WaveVel", ShaderVelocity.Value);
			((Renderer)componentInChildren).material.SetFloat("_RefractionIntensity", ShaderRefraction.Value);
			((Renderer)componentInChildren).material.SetFloat("_Glossiness", ShaderGlossiness.Value);
			((Renderer)componentInChildren).material.SetFloat("_Metallic", ShaderMetallic.Value);
		}
	}

	public static List<Vector3> GetCirclePoints3D(int n, float radius)
	{
		//IL_0032: Unknown result type (might be due to invalid IL or missing references)
		List<Vector3> list = new List<Vector3>();
		for (int i = 0; i < n; i++)
		{
			float num = (float)Math.PI * 2f * (float)i / (float)n;
			float num2 = radius * Mathf.Cos(num);
			float num3 = radius * Mathf.Sin(num);
			list.Add(new Vector3(num2, 0f, num3));
		}
		return list;
	}

	public static Color[] GenerateRainbowColors(int n)
	{
		//IL_0026: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: Unknown result type (might be due to invalid IL or missing references)
		Color[] array = (Color[])(object)new Color[n];
		float num = 1f / (float)n;
		for (int i = 0; i < n; i++)
		{
			float num2 = (float)i * num;
			array[i] = Color.HSVToRGB(num2, 1f, 1f);
		}
		return array;
	}
}
public class RotateColor : MonoBehaviour
{
	public float Alpha = 0.5f;

	public static Color GetRainbowColor(float time, float duration, float alpha)
	{
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: 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)
		Color result = Color.HSVToRGB(time % duration / duration, 1f, 1f);
		result.a = alpha;
		return result;
	}

	public void Update()
	{
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		((Renderer)((Component)this).GetComponentInChildren<MeshRenderer>()).material.color = GetRainbowColor(Time.time, 1f, Alpha);
	}
}