Decompiled source of QuestTimer v1.0.0

QuestTimer.dll

Decompiled a month ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
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 BepInEx.Logging;
using HarmonyLib;
using NodeCanvas.Framework;
using NodeCanvas.StateMachines;
using NodeCanvas.Tasks.Actions;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("OutwardModTemplate")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("OutwardModTemplate")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("c5450fe0-edcf-483f-b9ea-4b1ef9d36da7")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace QuestTimer;

internal class QuestObjectives
{
}
[BepInPlugin("Tchernobill.QuestTimer", "QuestTimer", "1.0.0")]
public class QuestTimer : BaseUnityPlugin
{
	public class QuestTimerMemo
	{
		public int gameHourAllowed;

		public float questStartTime;

		public QuestTimerMemo()
		{
			gameHourAllowed = -1;
			questStartTime = -1f;
		}
	}

	[HarmonyPatch(typeof(QuestLogDisplay), "Update")]
	public class QuestLogDisplay_Update
	{
		private static void Prefix(ref QuestLogDisplay __instance)
		{
			if (showQuestTimer.Value && (Object)(object)__instance != (Object)null && (!((Object)(object)__instance.m_currentJournal != (Object)null) || ((CharacterKnowledge)__instance.m_currentJournal).CurrentVersion == __instance.m_lastVersion) && (Object)(object)__instance.m_lastSelectedQuest != (Object)null && (Object)(object)__instance.m_lastSelectedQuest.RefQuest != (Object)null && !__instance.m_lastSelectedQuest.RefQuest.WasUpdated)
			{
				__instance.RefreshDisplayedQuest();
			}
		}
	}

	[HarmonyPatch(typeof(QuestLogDisplay), "RefreshDisplayedQuest")]
	public class QuestLogDisplay_RefreshDisplayedQuest
	{
		private static bool Prefix(ref QuestLogDisplay __instance)
		{
			//IL_02f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ee: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)__instance.m_lastSelectedQuest != (Object)null)
			{
				Quest refQuest = __instance.m_lastSelectedQuest.RefQuest;
				__instance.m_questDetailEntryCount = 0;
				if ((Object)(object)refQuest != (Object)null)
				{
					__instance.m_questDetailEntryCount = refQuest.LogEntries.Count;
					for (int i = 0; i < __instance.m_displayedQuestEntries.Count; i++)
					{
						((UIElement)__instance.m_displayedQuestEntries[i]).Hide();
					}
					for (int j = 0; j < __instance.m_questDetailEntryCount; j++)
					{
						QuestEntryDisplay val;
						if (j < __instance.m_displayedQuestEntries.Count)
						{
							val = __instance.m_displayedQuestEntries[j];
						}
						else
						{
							RectTransform obj = Object.Instantiate<RectTransform>(__instance.QuestDetailEntryPrefab);
							((Transform)obj).SetParent((Transform)(object)__instance.m_detailScrollRect.content);
							UnityEngineExtensions.ResetLocal((Transform)(object)obj, true);
							val = ((Component)obj).GetComponent<QuestEntryDisplay>();
							__instance.m_displayedQuestEntries.Add(val);
						}
						((Object)val).name = "EntryLog" + j;
						bool flag = refQuest.IsCompleted || refQuest.LogEntries[j].IsCompleted || (!PhotonNetwork.isNonMasterClientInRoom && refQuest.LogEntries[j].IsSimpleEntry && j != 0);
						bool flag2 = false;
						QuestTimerMemo questTimerMemo = null;
						if (!flag && Object.op_Implicit((Object)(object)val.m_lblLogDate) && showQuestTimer.Value)
						{
							questTimerMemo = getActiveEventTimeMemo(refQuest);
							if (questTimerMemo != null)
							{
								flag2 = true;
							}
						}
						if (flag2)
						{
							QuestLogEntry val2 = refQuest.LogEntries[j];
							if (Object.op_Implicit((Object)(object)val.m_lblText))
							{
								val.m_lblText.text = "- " + val2.Text;
							}
							if (val2 != null && val2.LogTime != 0f)
							{
								int num = Mathf.FloorToInt(val2.LogTime / 24f);
								int num2 = Mathf.FloorToInt(val2.LogTime - (float)(num * 24));
								int num3 = Mathf.FloorToInt((val2.LogTime - (float)(num * 24) - (float)num2) * 60f);
								string text = string.Format("{2} {0} {1}", (num + 1).ToString(), string.Format("{0}:{1}", num2, num3.ToString("00")), LocalizationManager.Instance.GetLoc("General_Day"));
								float num4 = questTimerMemo.questStartTime + (float)questTimerMemo.gameHourAllowed - EnvironmentConditions.GameTimeF;
								int num5 = Mathf.FloorToInt(num4 / 24f);
								int num6 = Mathf.FloorToInt(num4 - (float)(num5 * 24));
								int num7 = Mathf.FloorToInt((num4 - (float)(num5 * 24) - (float)num6) * 60f);
								string text2 = string.Format("{0}D{1}:{2}", num5.ToString(), num6, num7.ToString("00"));
								val.m_lblLogDate.text = text + "\n" + text2;
							}
							else
							{
								val.m_lblLogDate.text = string.Empty;
							}
						}
						else
						{
							val.SetDetail(refQuest.LogEntries[j]);
						}
						val.SetColor(flag ? Global.LIGHT_GRAY : Global.WHITE_GRAY);
						if (!((UIElement)val).IsDisplayed || flag2)
						{
							((UIElement)val).Show();
						}
					}
				}
				__instance.m_detailScrollRect.verticalNormalizedPosition = 1f;
				return false;
			}
			for (int k = 0; k < __instance.m_displayedQuestEntries.Count; k++)
			{
				((UIElement)__instance.m_displayedQuestEntries[k]).Hide();
			}
			return false;
		}
	}

	[HarmonyPatch(typeof(QuestEventManager), "CheckEventExpire", new Type[]
	{
		typeof(string),
		typeof(int)
	})]
	public class QuestEventManager_CheckEventExpire
	{
		private static List<string> loggedevents = new List<string>();

		private static void Prefix(ref QuestEventManager __instance, ref string _eventUID, ref int _gameHourAllowed)
		{
			QuestEventData questEvent = __instance.GetQuestEvent(_eventUID);
			if (questEvent != null)
			{
				QuestTimerMemo questTimerMemo = new QuestTimerMemo();
				questTimerMemo.questStartTime = questEvent.m_activationTime;
				questTimerMemo.gameHourAllowed = _gameHourAllowed;
				if (pendingEvents.ContainsKey(_eventUID))
				{
					pendingEvents[_eventUID] = questTimerMemo;
				}
				else
				{
					pendingEvents.Add(_eventUID, questTimerMemo);
				}
				if (!loggedevents.Contains(_eventUID))
				{
					loggedevents.Add(_eventUID);
					questEvent.GetParentFamilly();
				}
			}
		}
	}

	public const string GUID = "Tchernobill.QuestTimer";

	public const string NAME = "QuestTimer";

	public const string VERSION = "1.0.0";

	internal static ManualLogSource Log;

	public static ConfigEntry<bool> showQuestTimer;

	public static Dictionary<string, QuestTimerMemo> pendingEvents = new Dictionary<string, QuestTimerMemo>();

	internal void Awake()
	{
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		Log = ((BaseUnityPlugin)this).Logger;
		showQuestTimer = ((BaseUnityPlugin)this).Config.Bind<bool>("QuestTimer", "Show Quest Timers.", true, "Maybe consider not using the mod if you never set this on. ;)");
		new Harmony("Tchernobill.QuestTimer").PatchAll();
	}

	public static QuestTimerMemo getActiveEventTimeMemo(Quest refQuest)
	{
		if ((Object)(object)refQuest != (Object)null)
		{
			QuestProgress questProgress = refQuest.m_questProgress;
			if ((Object)(object)questProgress != (Object)null)
			{
				QuestTreeOwner questSequence = questProgress.m_questSequence;
				if ((Object)(object)questSequence != (Object)null)
				{
					QuestTree behaviour = ((GraphOwner<QuestTree>)(object)questSequence).behaviour;
					if ((Object)(object)behaviour != (Object)null)
					{
						List<ActionList> allTasksOfType = ((Graph)behaviour).GetAllTasksOfType<ActionList>();
						for (int i = 0; i < allTasksOfType.Count; i++)
						{
							ActionList val = allTasksOfType[i];
							for (int j = 0; j < val.actions.Count; j++)
							{
								ActionTask val2 = val.actions[j];
								SendQuestEvent val3 = (SendQuestEvent)(object)((val2 is SendQuestEvent) ? val2 : null);
								if (val3 != null && ((Task)val2).isActive)
								{
									string eventUID = val3.QuestEventRef.Event.EventUID;
									if (pendingEvents.ContainsKey(eventUID))
									{
										return pendingEvents[eventUID];
									}
								}
							}
						}
					}
				}
			}
		}
		return null;
	}
}