using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using AIGraph;
using BepInEx;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using GTFO.API;
using GameData;
using Gear;
using HarmonyLib;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppSystem;
using Il2CppSystem.Collections.Generic;
using LevelGeneration;
using Localization;
using Microsoft.CodeAnalysis;
using Player;
using TerminalConsumables.API;
using TerminalConsumables.Managers;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("TerminalConsumables")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+81bf65273f068924b785f3edad33d1f5b3ccdaf5")]
[assembly: AssemblyProduct("TerminalConsumables")]
[assembly: AssemblyTitle("TerminalConsumables")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
}
namespace TerminalConsumables
{
[BepInPlugin("Dinorush.TerminalConsumables", "TerminalConsumables", "1.1.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
internal sealed class EntryPoint : BasePlugin
{
public const string MODNAME = "TerminalConsumables";
public override void Load()
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
new Harmony("TerminalConsumables").PatchAll();
LevelAPI.OnLevelCleanup += TerminalItemManager.OnLevelCleanup;
((BasePlugin)this).Log.LogMessage((object)"Loaded TerminalConsumables");
}
}
}
namespace TerminalConsumables.Utils
{
internal static class DinoLogger
{
private static ManualLogSource logger = Logger.CreateLogSource("TerminalConsumables");
public static void Log(string format, params object[] args)
{
Log(string.Format(format, args));
}
public static void Log(string str)
{
if (logger != null)
{
logger.Log((LogLevel)8, (object)str);
}
}
public static void Warning(string format, params object[] args)
{
Warning(string.Format(format, args));
}
public static void Warning(string str)
{
if (logger != null)
{
logger.Log((LogLevel)4, (object)str);
}
}
public static void Error(string format, params object[] args)
{
Error(string.Format(format, args));
}
public static void Error(string str)
{
if (logger != null)
{
logger.Log((LogLevel)2, (object)str);
}
}
public static void Debug(string format, params object[] args)
{
Debug(string.Format(format, args));
}
public static void Debug(string str)
{
if (logger != null)
{
logger.Log((LogLevel)32, (object)str);
}
}
}
}
namespace TerminalConsumables.Patches
{
[HarmonyPatch]
internal static class PickupPatches
{
[HarmonyPatch(typeof(ConsumablePickup_Core), "Setup")]
[HarmonyWrapSafe]
[HarmonyPostfix]
private static void PostSetup(ConsumablePickup_Core __instance, ItemDataBlock data)
{
if (data.registerInTerminalSystem && !string.IsNullOrEmpty(data.terminalItemShortName) && !string.IsNullOrEmpty(LocalizedText.op_Implicit(data.terminalItemLongName)))
{
TerminalItemManager.AddTerminalItem((ItemInLevel)(object)__instance);
}
}
[HarmonyPatch(typeof(ResourcePackPickup), "OnSyncStateChange")]
[HarmonyWrapSafe]
[HarmonyPrefix]
private static void FixDroppedPackArea(ResourcePackPickup __instance, ePickupItemStatus status, ref pPickupPlacement placement)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
AIG_CourseNode val = default(AIG_CourseNode);
if ((int)status == 0 && ((pCourseNode)(ref placement.node)).TryGet(ref val))
{
__instance.m_terminalItem.SpawnNode = val;
__instance.m_terminalItem.FloorItemLocation = val.m_zone.NavInfo.GetFormattedText((LG_NavInfoFormat)7);
}
}
[HarmonyPatch(typeof(LG_ComputerTerminalCommandInterpreter), "Query")]
[HarmonyPrefix]
private static bool Prefix(LG_ComputerTerminalCommandInterpreter __instance, string param1)
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
iTerminalItem terminalItem = default(iTerminalItem);
if (!LG_LevelInteractionManager.TryGetTerminalInterface(param1.ToUpper(), __instance.m_terminal.SpawnNode.m_dimension.DimensionIndex, ref terminalItem))
{
return true;
}
if (!TerminalItemManager.HasTerminal(terminalItem))
{
return true;
}
__instance.AddOutput((TerminalLineType)2, "Querying " + param1.ToUpper(), 3f, (TerminalSoundType)0, (TerminalSoundType)0);
__instance.AddOutputEmptyLine(0f);
TerminalItemManager.DoQueryOutput(terminalItem, __instance);
__instance.AddOutputEmptyLine(0f);
return false;
}
}
}
namespace TerminalConsumables.Managers
{
internal static class TerminalItemManager
{
public struct QueryInfo
{
public ItemInLevel item;
public bool ammoRel;
public QueryTextOverride? queryTextOverride;
}
private static readonly Dictionary<IntPtr, QueryInfo> _terminalInfo = new Dictionary<IntPtr, QueryInfo>();
public static bool ModifyTerminalItem(iTerminalItem? terminalItem, bool ammoRel = true, QueryTextOverride? queryOverride = null)
{
if (terminalItem == null)
{
return false;
}
if (!_terminalInfo.TryGetValue(((Il2CppObjectBase)terminalItem).Pointer, out var value))
{
value.item = ((Component)((Il2CppObjectBase)terminalItem).Cast<LG_GenericTerminalItem>()).GetComponent<ItemInLevel>();
if ((Object)(object)value.item == (Object)null)
{
return false;
}
}
value.ammoRel = ammoRel;
value.queryTextOverride = queryOverride;
_terminalInfo[((Il2CppObjectBase)terminalItem).Pointer] = value;
return true;
}
public static iTerminalItem AddTerminalItem(ItemInLevel item, bool ammoRel = true, QueryTextOverride? queryOverride = null)
{
iTerminalItem terminalItem = ((Component)item).GetComponent<iTerminalItem>();
if (terminalItem != null)
{
ModifyTerminalItem(terminalItem, ammoRel, queryOverride);
return terminalItem;
}
ItemDataBlock itemDataBlock = ((Item)item).ItemDataBlock;
string itemKey = itemDataBlock.terminalItemShortName;
if (itemDataBlock.addSerialNumberToName)
{
itemKey = itemKey + "_" + SerialGenerator.GetUniqueSerialNo();
}
terminalItem = ((Il2CppObjectBase)((Component)item).gameObject.AddComponent<LG_GenericTerminalItem>()).Cast<iTerminalItem>();
terminalItem.FloorItemType = (eFloorInventoryObjectType)7;
terminalItem.FloorItemStatus = (eFloorInventoryObjectStatus)0;
terminalItem.Setup(itemKey, (AIG_CourseNode)null);
item.internalSync.OnSyncStateChange += Action<ePickupItemStatus, pPickupPlacement, PlayerAgent, bool>.op_Implicit((Action<ePickupItemStatus, pPickupPlacement, PlayerAgent, bool>)delegate(ePickupItemStatus status, pPickupPlacement placement, PlayerAgent player, bool isRecall)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0005: Invalid comparison between Unknown and I4
AIG_CourseNode val = default(AIG_CourseNode);
if ((int)status != 0)
{
if ((int)status == 1)
{
LG_LevelInteractionManager.DeregisterTerminalItem(terminalItem);
}
}
else if (((pCourseNode)(ref placement.node)).TryGet(ref val))
{
terminalItem.SpawnNode = val;
terminalItem.FloorItemLocation = val.m_zone.NavInfo.GetFormattedText((LG_NavInfoFormat)7);
LG_LevelInteractionManager.RegisterTerminalItem(terminalItem, itemKey);
}
});
_terminalInfo.Add(((Il2CppObjectBase)terminalItem).Pointer, new QueryInfo
{
item = item,
ammoRel = ammoRel,
queryTextOverride = queryOverride
});
return terminalItem;
}
public static void DoQueryOutput(iTerminalItem terminalItem, LG_ComputerTerminalCommandInterpreter interpreter)
{
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
//IL_0107: 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_00cd: Unknown result type (might be due to invalid IL or missing references)
if (!_terminalInfo.TryGetValue(((Il2CppObjectBase)terminalItem).Pointer, out var value))
{
return;
}
ItemInLevel item = value.item;
string pingStatus = interpreter.GetPingStatus(terminalItem);
List<string> defaultDetails = interpreter.GetDefaultDetails(terminalItem, pingStatus);
List<string> list = new List<string>(defaultDetails.Count);
Enumerator<string> enumerator = defaultDetails.GetEnumerator();
while (enumerator.MoveNext())
{
string current = enumerator.Current;
list.Add(current);
}
List<string> list2;
if (value.queryTextOverride != null)
{
list2 = value.queryTextOverride(item, terminalItem, list);
}
else
{
ItemDataBlock itemDataBlock = ((Item)item).ItemDataBlock;
list2 = new List<string>
{
"----------------------------------------------------------------",
"CONSUMABLE - " + ((Object)itemDataBlock.terminalItemLongName).ToString()
};
if (itemDataBlock.ConsumableAmmoMax > 0 && value.ammoRel)
{
list2.Add("CAPACITY: " + (((Item)item).pItemData.custom.ammo / (float)itemDataBlock.ConsumableAmmoMax).ToString("P0"));
}
else
{
list2.Add("CAPACITY: " + ((Item)item).pItemData.custom.ammo.ToString("N0"));
}
list2.AddRange(list);
}
foreach (string item2 in list2)
{
interpreter.AddOutput(item2, false);
}
}
public static bool HasTerminal(iTerminalItem terminalItem)
{
return _terminalInfo.ContainsKey(((Il2CppObjectBase)terminalItem).Pointer);
}
internal static void OnLevelCleanup()
{
_terminalInfo.Clear();
}
}
}
namespace TerminalConsumables.API
{
public delegate List<string> QueryTextOverride(ItemInLevel item, iTerminalItem terminalItem, List<string> defaultDetails);
public static class TerminalAPI
{
public static iTerminalItem RegisterTerminalItem(ItemInLevel item, bool ammoRel = true, QueryTextOverride? queryOverride = null)
{
return TerminalItemManager.AddTerminalItem(item, ammoRel, queryOverride);
}
public static bool ModifyTerminalItem(iTerminalItem? terminalItem, bool ammoRel = true, QueryTextOverride? queryOverride = null)
{
return TerminalItemManager.ModifyTerminalItem(terminalItem, ammoRel, queryOverride);
}
public static bool ModifyTerminalItem(ItemInLevel item, bool ammoRel = true, QueryTextOverride? queryOverride = null)
{
return ModifyTerminalItem(((Component)item).GetComponent<iTerminalItem>(), ammoRel, queryOverride);
}
}
}