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;
}
}