Decompiled source of DamageRecall v0.1.1

DamageRecall.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
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 BepInEx;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("DamageRecall")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("DamageRecall")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("7f263ae6-0fe6-4598-a59c-811ba2be2a29")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace DamageRecall;

[BepInPlugin("com.low.damagerecall", "Damage Recall", "0.1.1")]
public class DamageRecallPlugin : BaseUnityPlugin
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static UnityAction <>9__10_0;

		internal void <CreatePopup>b__10_0()
		{
			popupRoot.SetActive(false);
		}
	}

	[CompilerGenerated]
	private sealed class <ExecuteAfterDelay>d__9 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public DamageRecallPlugin <>4__this;

		private GameObject <target>5__2;

		private GameObject <initCheck>5__3;

		private float <timeout>5__4;

		private float <elapsed>5__5;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <ExecuteAfterDelay>d__9(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<target>5__2 = null;
			<initCheck>5__3 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Expected O, but got Unknown
			int num = <>1__state;
			DamageRecallPlugin damageRecallPlugin = <>4__this;
			switch (num)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<target>5__2 = null;
				<initCheck>5__3 = null;
				<timeout>5__4 = 5f;
				<elapsed>5__5 = 0f;
				break;
			case 1:
				<>1__state = -1;
				break;
			}
			if ((Object)(object)<initCheck>5__3 == (Object)null && <elapsed>5__5 < <timeout>5__4)
			{
				<initCheck>5__3 = GameObject.Find("TavernMaster/Canvas/Plate/Statistics/DamageMeterContainer/DamageMeter/ViewPort/Content/Prototype(Clone)");
				if (!((Object)(object)<target>5__2 != (Object)null))
				{
					<elapsed>5__5 += 0.2f;
					<>2__current = (object)new WaitForSeconds(0.2f);
					<>1__state = 1;
					return true;
				}
			}
			if ((Object)(object)<initCheck>5__3 == (Object)null)
			{
				((BaseUnityPlugin)damageRecallPlugin).Logger.LogError((object)"DamageMeter not found after waiting — cannot copy.");
				return false;
			}
			((BaseUnityPlugin)damageRecallPlugin).Logger.LogInfo((object)"DamageMeter found — creating persistent copy.");
			<target>5__2 = GameObject.Find("TavernMaster/Canvas/Plate/Statistics/DamageMeterContainer/DamageMeter");
			damageRecallPlugin.CopyDamageMeter(<target>5__2);
			return false;
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	private static GameObject popupRoot;

	private GameObject persistentDamageMeter;

	private bool isVisible;

	private void EnsureHideManagerGameObjectDisabled()
	{
		try
		{
			string path = Path.Combine(Paths.ConfigPath, "BepInEx.cfg");
			if (!File.Exists(path))
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)"BepInEx.cfg not found — cannot verify HideManagerGameObject.");
				return;
			}
			string[] array = File.ReadAllLines(path);
			bool flag = false;
			for (int i = 0; i < array.Length; i++)
			{
				if (array[i].Trim().StartsWith("HideManagerGameObject") && !array[i].Contains("true"))
				{
					array[i] = "HideManagerGameObject = true";
					flag = true;
				}
			}
			if (flag)
			{
				File.WriteAllLines(path, array);
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Patched BepInEx.cfg → HideManagerGameObject = true");
			}
			else
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)"HideManagerGameObject already set to true.");
			}
		}
		catch (Exception arg)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)$"Failed to update BepInEx.cfg: {arg}");
		}
	}

	private void Awake()
	{
		EnsureHideManagerGameObjectDisabled();
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Damage Recall loaded.");
		SceneManager.sceneLoaded += OnSceneLoaded;
		SceneManager.sceneUnloaded += OnSceneUnloaded;
	}

	private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
	{
		switch (((Scene)(ref scene)).name)
		{
		case "GameScene":
			persistentDamageMeter = GameObject.Find("PersistedDamageMeter");
			if ((Object)(object)persistentDamageMeter != (Object)null)
			{
				persistentDamageMeter.SetActive(false);
				GameObject val = GameObject.Find("Canvas");
				if ((Object)(object)val != (Object)null)
				{
					persistentDamageMeter.transform.SetParent(val.transform, false);
					((BaseUnityPlugin)this).Logger.LogInfo((object)"Reattached PersistedDamageMeter to GameScene Canvas.");
				}
			}
			break;
		case "HumanTavernScene":
			((MonoBehaviour)this).StartCoroutine(ExecuteAfterDelay());
			break;
		case "TitleScene":
			CreatePopup();
			break;
		}
	}

	private void OnSceneUnloaded(Scene scene)
	{
		if (((Scene)(ref scene)).name == "GameScene")
		{
			persistentDamageMeter = GameObject.Find("PersistedDamageMeter");
			if ((Object)(object)persistentDamageMeter != (Object)null)
			{
				persistentDamageMeter.SetActive(false);
				Object.Destroy((Object)(object)persistentDamageMeter);
			}
		}
	}

	private void Update()
	{
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		if (!Input.GetKeyDown((KeyCode)96))
		{
			return;
		}
		Scene activeScene = SceneManager.GetActiveScene();
		if (((Scene)(ref activeScene)).name == "GameScene")
		{
			if ((Object)(object)persistentDamageMeter == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogInfo((object)"No persisted damage meter found");
				return;
			}
			isVisible = !isVisible;
			persistentDamageMeter.SetActive(isVisible);
			((BaseUnityPlugin)this).Logger.LogInfo((object)$"PersistedDamageMeter visibility toggled: {isVisible}");
		}
	}

	private void CopyDamageMeter(GameObject sourceMeter)
	{
		//IL_0027: 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)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = Object.Instantiate<GameObject>(sourceMeter);
		((Object)val).name = "PersistedDamageMeter";
		val.transform.position = new Vector3(-440f, -320f, 0f);
		Scene sceneByName = SceneManager.GetSceneByName("PersistentScene");
		SceneManager.MoveGameObjectToScene(val, sceneByName);
		persistentDamageMeter = val;
	}

	[IteratorStateMachine(typeof(<ExecuteAfterDelay>d__9))]
	private IEnumerator ExecuteAfterDelay()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <ExecuteAfterDelay>d__9(0)
		{
			<>4__this = this
		};
	}

	private void CreatePopup()
	{
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Expected O, but got Unknown
		//IL_0082: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00de: Unknown result type (might be due to invalid IL or missing references)
		//IL_0106: Unknown result type (might be due to invalid IL or missing references)
		//IL_0120: Unknown result type (might be due to invalid IL or missing references)
		//IL_0134: Unknown result type (might be due to invalid IL or missing references)
		//IL_0143: Unknown result type (might be due to invalid IL or missing references)
		//IL_0149: Expected O, but got Unknown
		//IL_0179: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ed: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
		//IL_0227: Unknown result type (might be due to invalid IL or missing references)
		//IL_0237: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ad: Expected O, but got Unknown
		GameObject val = GameObject.Find("Canvas");
		if (!Object.op_Implicit((Object)(object)val))
		{
			((BaseUnityPlugin)this).Logger.LogWarning((object)"Canvas not found in scene!");
			return;
		}
		if ((Object)(object)popupRoot != (Object)null)
		{
			popupRoot.transform.SetParent(val.transform, false);
			return;
		}
		popupRoot = new GameObject("ModPopup");
		popupRoot.transform.SetParent(val.transform, false);
		RectTransform obj = popupRoot.AddComponent<RectTransform>();
		obj.sizeDelta = new Vector2(400f, 200f);
		obj.anchoredPosition = Vector2.zero;
		((Graphic)popupRoot.AddComponent<Image>()).color = new Color(0f, 0f, 0f, 0.75f);
		GameObject val2 = new GameObject("PopupText");
		val2.transform.SetParent(popupRoot.transform, false);
		Text obj2 = val2.AddComponent<Text>();
		obj2.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
		obj2.text = "Damage Recall loaded.\n\nDamage from previous played day can now be opened and closed using the ~ key.";
		obj2.alignment = (TextAnchor)4;
		((Graphic)obj2).color = Color.white;
		RectTransform component = val2.GetComponent<RectTransform>();
		component.sizeDelta = new Vector2(380f, 120f);
		component.anchoredPosition = new Vector2(0f, 40f);
		GameObject val3 = new GameObject("CloseButton");
		val3.transform.SetParent(popupRoot.transform, false);
		((Graphic)val3.AddComponent<Image>()).color = new Color(0.8f, 0.2f, 0.2f, 1f);
		ButtonClickedEvent onClick = val3.AddComponent<Button>().onClick;
		object obj3 = <>c.<>9__10_0;
		if (obj3 == null)
		{
			UnityAction val4 = delegate
			{
				popupRoot.SetActive(false);
			};
			<>c.<>9__10_0 = val4;
			obj3 = (object)val4;
		}
		((UnityEvent)onClick).AddListener((UnityAction)obj3);
		RectTransform component2 = val3.GetComponent<RectTransform>();
		component2.sizeDelta = new Vector2(120f, 40f);
		component2.anchoredPosition = new Vector2(0f, -60f);
		GameObject val5 = new GameObject("ButtonText");
		val5.transform.SetParent(val3.transform, false);
		Text obj4 = val5.AddComponent<Text>();
		obj4.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
		obj4.text = "Close";
		obj4.alignment = (TextAnchor)4;
		((Graphic)obj4).color = Color.white;
		val5.GetComponent<RectTransform>().sizeDelta = component2.sizeDelta;
	}
}