using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using BepInEx;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using BepInEx.Unity.IL2CPP.Utils.Collections;
using DailyQuest.Models;
using DailyQuest.Services;
using HarmonyLib;
using Il2CppInterop.Runtime;
using Il2CppSystem.Collections.Generic;
using Microsoft.CodeAnalysis;
using ProjectM;
using ProjectM.Network;
using ProjectM.Physics;
using ProjectM.Scripting;
using ProjectM.Shared;
using Stunlock.Core;
using Unity.Collections;
using Unity.Entities;
using UnityEngine;
using VampireCommandFramework;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("DailyQuest")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Daily quest mod for V Rising servers")]
[assembly: AssemblyFileVersion("1.0.4.0")]
[assembly: AssemblyInformationalVersion("1.0.4")]
[assembly: AssemblyProduct("DailyQuest")]
[assembly: AssemblyTitle("DailyQuest")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.4.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace DailyQuest
{
internal static class Core
{
private static World _server;
private static MonoBehaviour monoBehaviour;
private static bool _hasInitialized;
public const int MAX_REPLY_LENGTH = 509;
public static World Server
{
get
{
if (_server == null)
{
_server = GetWorld("Server");
}
return _server;
}
}
public static EntityManager EntityManager => Server.EntityManager;
public static GameDataSystem GameDataSystem => Server.GetExistingSystemManaged<GameDataSystem>();
public static PrefabCollectionSystem PrefabCollectionSystem { get; internal set; }
public static PrefabCollectionSystem PrefabCollection => Server.GetExistingSystemManaged<PrefabCollectionSystem>();
public static ServerScriptMapper ServerScriptMapper { get; internal set; }
public static ServerGameManager ServerGameManager => ServerScriptMapper.GetServerGameManager();
public static ManualLogSource Log => Plugin.PluginLog;
public static void LogException(Exception e, [CallerMemberName] string caller = null)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
ManualLogSource log = Log;
bool flag = default(bool);
BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(51, 5, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Failure in ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(caller);
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\nMessage: ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(e.Message);
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" Inner:");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(e.InnerException?.Message);
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\n\nStack: ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(e.StackTrace);
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\nInner Stack: ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(e.InnerException?.StackTrace);
}
log.LogError(val);
}
internal static bool IsServerReady()
{
if (_server == null)
{
_server = GetWorld("Server");
}
if (_server == null)
{
return false;
}
PrefabCollectionSystem existingSystemManaged = _server.GetExistingSystemManaged<PrefabCollectionSystem>();
return existingSystemManaged != null;
}
internal static void InitializeAfterLoaded()
{
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
//IL_00b5: Expected O, but got Unknown
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Expected O, but got Unknown
if (_hasInitialized)
{
return;
}
if (!IsServerReady())
{
Log.LogWarning((object)"Server world is not ready yet.");
return;
}
PrefabCollectionSystem = Server.GetExistingSystemManaged<PrefabCollectionSystem>();
ServerScriptMapper = Server.GetExistingSystemManaged<ServerScriptMapper>();
QuestService.Initialize();
bool flag = default(bool);
if (!WebhookService.Reload(out var error))
{
ManualLogSource log = Log;
BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(36, 1, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Failed to load webhook_config.json: ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(error);
}
log.LogWarning(val);
}
_hasInitialized = true;
ManualLogSource log2 = Log;
BepInExInfoLogInterpolatedStringHandler val2 = new BepInExInfoLogInterpolatedStringHandler(10, 1, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>("InitializeAfterLoaded");
((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" completed");
}
log2.LogInfo(val2);
}
private static World GetWorld(string name)
{
Enumerator<World> enumerator = World.s_AllWorlds.GetEnumerator();
while (enumerator.MoveNext())
{
World current = enumerator.Current;
if (current.Name == name)
{
return current;
}
}
return null;
}
public static Coroutine StartCoroutine(IEnumerator routine)
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Expected O, but got Unknown
if ((Object)(object)monoBehaviour == (Object)null)
{
GameObject val = new GameObject("DailyQuest");
monoBehaviour = (MonoBehaviour)(object)val.AddComponent<IgnorePhysicsDebugSystem>();
Object.DontDestroyOnLoad((Object)(object)val);
}
return monoBehaviour.StartCoroutine(CollectionExtensions.WrapToIl2Cpp(routine));
}
public static void StopCoroutine(Coroutine coroutine)
{
if (!((Object)(object)monoBehaviour == (Object)null))
{
monoBehaviour.StopCoroutine(coroutine);
}
}
}
public static class ECSExtensions
{
public delegate void ActionRef<T>(ref T item);
public unsafe static void Write<T>(this Entity entity, T componentData) where T : struct
{
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
ComponentType val = default(ComponentType);
((ComponentType)(ref val))..ctor(Il2CppType.Of<T>(), (AccessMode)0);
byte[] array = StructureToByteArray(componentData);
int num = Marshal.SizeOf<T>();
fixed (byte* ptr = array)
{
EntityManager entityManager = Core.EntityManager;
((EntityManager)(ref entityManager)).SetComponentDataRaw(entity, val.TypeIndex, (void*)ptr, num);
}
}
public static void With<T>(this Entity entity, ActionRef<T> action) where T : struct
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
T item = entity.ReadRW<T>();
action(ref item);
EntityManager entityManager = Core.EntityManager;
((EntityManager)(ref entityManager)).SetComponentData<T>(entity, item);
}
public unsafe static T ReadRW<T>(this Entity entity) where T : struct
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
ComponentType val = default(ComponentType);
((ComponentType)(ref val))..ctor(Il2CppType.Of<T>(), (AccessMode)0);
EntityManager entityManager = Core.EntityManager;
void* componentDataRawRW = ((EntityManager)(ref entityManager)).GetComponentDataRawRW(entity, val.TypeIndex);
return Marshal.PtrToStructure<T>(new IntPtr(componentDataRawRW));
}
public static byte[] StructureToByteArray<T>(T structure) where T : struct
{
int num = Marshal.SizeOf(structure);
byte[] array = new byte[num];
IntPtr intPtr = Marshal.AllocHGlobal(num);
Marshal.StructureToPtr(structure, intPtr, fDeleteOld: true);
Marshal.Copy(intPtr, array, 0, num);
Marshal.FreeHGlobal(intPtr);
return array;
}
public unsafe static T Read<T>(this Entity entity) where T : struct
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
ComponentType val = default(ComponentType);
((ComponentType)(ref val))..ctor(Il2CppType.Of<T>(), (AccessMode)0);
EntityManager entityManager = Core.EntityManager;
void* componentDataRawRO = ((EntityManager)(ref entityManager)).GetComponentDataRawRO(entity, val.TypeIndex);
return Marshal.PtrToStructure<T>(new IntPtr(componentDataRawRO));
}
public static DynamicBuffer<T> ReadBuffer<T>(this Entity entity) where T : struct
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: 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)
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
EntityManager entityManager = Core.Server.EntityManager;
return ((EntityManager)(ref entityManager)).GetBuffer<T>(entity, false);
}
public static bool Has<T>(this Entity entity)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
ComponentType val = default(ComponentType);
((ComponentType)(ref val))..ctor(Il2CppType.Of<T>(), (AccessMode)0);
EntityManager entityManager = Core.EntityManager;
return ((EntityManager)(ref entityManager)).HasComponent(entity, val);
}
public static string LookupName(this PrefabGUID prefabGuid)
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
PrefabCollectionSystem existingSystemManaged = Core.Server.GetExistingSystemManaged<PrefabCollectionSystem>();
NativeParallelHashMap<PrefabGUID, Entity> guidToEntityMap = existingSystemManaged._PrefabLookupMap.GuidToEntityMap;
object result;
if (!guidToEntityMap.ContainsKey(prefabGuid))
{
result = "GUID Not Found";
}
else
{
PrefabLookupMap prefabLookupMap = existingSystemManaged._PrefabLookupMap;
result = ((PrefabLookupMap)(ref prefabLookupMap)).GetName(prefabGuid) + " PrefabGuid(" + ((PrefabGUID)(ref prefabGuid)).GuidHash + ")";
}
return (string)result;
}
public static string PrefabName(this PrefabGUID prefabGuid)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
return prefabGuid.LookupName();
}
public static string EntityName(this Entity entity)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
string text = string.Empty;
if (entity.Has<NameableInteractable>())
{
NameableInteractable val = entity.Read<NameableInteractable>();
text = ((object)(FixedString64Bytes)(ref val.Name)).ToString();
}
if (string.IsNullOrEmpty(text) && entity.Has<PrefabGUID>())
{
text = entity.Read<PrefabGUID>().PrefabName();
}
if (string.IsNullOrEmpty(text))
{
text = ((object)(Entity)(ref entity)).ToString();
}
return text;
}
public static void Add<T>(this Entity entity)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
ComponentType val = default(ComponentType);
((ComponentType)(ref val))..ctor(Il2CppType.Of<T>(), (AccessMode)0);
EntityManager entityManager = Core.EntityManager;
((EntityManager)(ref entityManager)).AddComponent(entity, val);
}
public static void Remove<T>(this Entity entity)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
ComponentType val = default(ComponentType);
((ComponentType)(ref val))..ctor(Il2CppType.Of<T>(), (AccessMode)0);
EntityManager entityManager = Core.EntityManager;
((EntityManager)(ref entityManager)).RemoveComponent(entity, val);
}
}
internal static class Helper
{
private static readonly HashSet<int> SoulShards = new HashSet<int> { 666638454, -1581189572, -1260254082, -21943750, 1286615355 };
public static PrefabGUID GetPrefabGUID(Entity entity)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
EntityManager entityManager = Core.EntityManager;
try
{
return ((EntityManager)(ref entityManager)).GetComponentData<PrefabGUID>(entity);
}
catch
{
return new PrefabGUID(0);
}
}
public static Entity AddItemToInventory(Entity recipient, PrefabGUID guid, int amount)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: 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_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: 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)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
try
{
ServerGameManager serverGameManager = Core.Server.GetExistingSystemManaged<ServerScriptMapper>()._ServerGameManager;
AddItemResponse val = ((ServerGameManager)(ref serverGameManager)).TryAddInventoryItem(recipient, guid, amount);
return val.NewEntity;
}
catch (Exception e)
{
Core.LogException(e, "AddItemToInventory");
}
return default(Entity);
}
private static void HandleEquipment(Entity itemEntity, bool repair)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
if (!(itemEntity == Entity.Null) && itemEntity.Has<Durability>())
{
Durability val = itemEntity.Read<Durability>();
val.Value = (repair ? val.MaxDurability : 0f);
itemEntity.Write<Durability>(val);
}
}
public static void RepairArmor(Entity character, bool repair = true)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: 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_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
if (character.Has<Equipment>())
{
Equipment val = character.Read<Equipment>();
HandleEquipment(((NetworkedEntity)(ref val.ArmorChestSlot.SlotEntity)).GetEntityOnServer(), repair);
HandleEquipment(((NetworkedEntity)(ref val.ArmorGlovesSlot.SlotEntity)).GetEntityOnServer(), repair);
HandleEquipment(((NetworkedEntity)(ref val.ArmorLegsSlot.SlotEntity)).GetEntityOnServer(), repair);
HandleEquipment(((NetworkedEntity)(ref val.ArmorFootgearSlot.SlotEntity)).GetEntityOnServer(), repair);
}
}
public static void RepairAmulet(Entity character, bool repair = true)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: 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_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
if (!character.Has<Equipment>())
{
return;
}
Equipment val = character.Read<Equipment>();
Entity entityOnServer = ((NetworkedEntity)(ref val.GrimoireSlot.SlotEntity)).GetEntityOnServer();
if (!(entityOnServer == Entity.Null) && entityOnServer.Has<PrefabGUID>())
{
PrefabGUID val2 = entityOnServer.Read<PrefabGUID>();
if (!SoulShards.Contains(((PrefabGUID)(ref val2)).GuidHash))
{
HandleEquipment(entityOnServer, repair);
}
}
}
public static void RepairWeapon(Entity character, bool repair = true)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: 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)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: 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_009e: Unknown result type (might be due to invalid IL or missing references)
//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
//IL_00c1: Invalid comparison between Unknown and I4
//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
Entity val = default(Entity);
if (!InventoryUtilities.TryGetInventoryEntity<EntityManager>(Core.EntityManager, character, ref val, 0))
{
return;
}
ServerScriptMapper existingSystemManaged = Core.Server.GetExistingSystemManaged<ServerScriptMapper>();
if (existingSystemManaged == null)
{
return;
}
ServerGameManager serverGameManager = existingSystemManaged._ServerGameManager;
DynamicBuffer<InventoryBuffer> val2 = default(DynamicBuffer<InventoryBuffer>);
if (!((ServerGameManager)(ref serverGameManager)).TryGetBuffer<InventoryBuffer>(val, ref val2))
{
return;
}
for (int i = 0; i < 8 && i < val2.Length; i++)
{
InventoryBuffer val3 = val2[i];
Entity entityOnServer = ((NetworkedEntity)(ref val3.ItemEntity)).GetEntityOnServer();
if (!(entityOnServer == Entity.Null) && entityOnServer.Has<Durability>() && entityOnServer.Has<EquippableData>())
{
EquippableData val4 = entityOnServer.Read<EquippableData>();
if ((int)val4.EquipmentType == 2)
{
HandleEquipment(entityOnServer, repair);
}
}
}
}
}
[BepInPlugin("DailyQuest", "DailyQuest", "1.0.4")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Plugin : BasePlugin
{
internal static Harmony Harmony;
internal static ManualLogSource PluginLog;
public static ManualLogSource LogInstance { get; private set; }
public override void Load()
{
//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
//IL_00c1: Expected O, but got Unknown
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Expected O, but got Unknown
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
//IL_00f7: Expected O, but got Unknown
if (Application.productName != "VRisingServer")
{
return;
}
PluginLog = ((BasePlugin)this).Log;
LogInstance = ((BasePlugin)this).Log;
ManualLogSource log = ((BasePlugin)this).Log;
bool flag = default(bool);
BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(27, 2, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Plugin ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("DailyQuest");
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" version ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("1.0.4");
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" is loaded!");
}
log.LogInfo(val);
try
{
QuestService.EnsureFilesExist();
WebhookService.EnsureFilesExist();
((BasePlugin)this).Log.LogInfo((object)"DailyQuest config files ensured.");
}
catch (Exception ex)
{
ManualLogSource log2 = ((BasePlugin)this).Log;
BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(35, 1, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Failed to create DailyQuest files: ");
((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<Exception>(ex);
}
log2.LogError(val2);
}
Harmony = new Harmony("dailyquest");
Harmony.PatchAll(Assembly.GetExecutingAssembly());
CommandRegistry.RegisterAll();
Core.StartCoroutine(InitializeWhenReady());
}
private IEnumerator InitializeWhenReady()
{
while (!Core.IsServerReady())
{
yield return null;
}
try
{
Core.InitializeAfterLoaded();
((BasePlugin)this).Log.LogInfo((object)"DailyQuest initialized.");
}
catch (Exception e)
{
ManualLogSource log = ((BasePlugin)this).Log;
bool flag = default(bool);
BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(34, 1, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("DailyQuest initialization failed: ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(e);
}
log.LogError(val);
}
}
public override bool Unload()
{
CommandRegistry.UnregisterAssembly();
Harmony harmony = Harmony;
if (harmony != null)
{
harmony.UnpatchSelf();
}
return true;
}
}
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "DailyQuest";
public const string PLUGIN_NAME = "DailyQuest";
public const string PLUGIN_VERSION = "1.0.4";
}
}
namespace DailyQuest.Services
{
internal static class QuestService
{
private static readonly string CONFIG_DIR = Path.Combine(Paths.ConfigPath, "DailyQuest");
private static readonly string CONFIG_FILE = Path.Combine(CONFIG_DIR, "quest_config.json");
private static readonly string PLAYER_FILE = Path.Combine(CONFIG_DIR, "quest_player.json");
private static readonly object _lock = new object();
private static QuestConfig _config = new QuestConfig();
private static Dictionary<string, QuestDef> _questsById = new Dictionary<string, QuestDef>(StringComparer.Ordinal);
private static List<QuestDef> _enabledQuests = new List<QuestDef>();
private static List<QuestDef> _enabledEasyQuests = new List<QuestDef>();
private static List<QuestDef> _enabledMediumQuests = new List<QuestDef>();
private static List<QuestDef> _enabledHardQuests = new List<QuestDef>();
private static Dictionary<string, PlayerQuestState> _players = new Dictionary<string, PlayerQuestState>();
private static DateTime _lastDate = DateTime.MinValue.Date;
private const int SaveIntervalSeconds = 10;
private static bool _dirty;
private static DateTime _nextSave = DateTime.MinValue;
private static Coroutine _tickCoroutine;
private static bool _initialized;
private static readonly JsonSerializerOptions JsonOpts = new JsonSerializerOptions
{
WriteIndented = true,
AllowTrailingCommas = true,
ReadCommentHandling = JsonCommentHandling.Skip,
PropertyNameCaseInsensitive = true
};
public static string BuildStatusText(ulong sid, string playerName)
{
EnsureAssignedForToday(sid, playerName);
lock (_lock)
{
string key = sid.ToString();
if (!_players.TryGetValue(key, out var value) || value == null)
{
return "<color=red>No data.</color>";
}
QuestDef questById_NoLock = GetQuestById_NoLock(value.EasyQuestId);
QuestDef questById_NoLock2 = GetQuestById_NoLock(value.MediumQuestId);
QuestDef questById_NoLock3 = GetQuestById_NoLock(value.HardQuestId);
string text = BuildQuestBlock_NoLock("1", questById_NoLock, value.EasyProgress, value.EasyClaimed);
string text2 = BuildQuestBlock_NoLock("2", questById_NoLock2, value.MediumProgress, value.MediumClaimed);
string text3 = BuildQuestBlock_NoLock("3", questById_NoLock3, value.HardProgress, value.HardClaimed);
return "<color=yellow>Daily Quests (Reset in " + GetNextResetText() + ")</color>\n" + text + "\n\n" + text2 + "\n\n" + text3 + "\n";
}
}
public static string BuildPlayerStatusTextByName(string playerName)
{
if (string.IsNullOrWhiteSpace(playerName))
{
return "<color=red>Invalid player name.</color>";
}
lock (_lock)
{
EnsureInitialized_NoLock();
PlayerQuestState playerQuestState = _players.Values.FirstOrDefault((PlayerQuestState x) => x != null && !string.IsNullOrWhiteSpace(x.Name) && string.Equals(x.Name, playerName, StringComparison.OrdinalIgnoreCase));
if (playerQuestState == null)
{
return "<color=red>Player not found in quest data.</color>";
}
QuestDef questById_NoLock = GetQuestById_NoLock(playerQuestState.EasyQuestId);
QuestDef questById_NoLock2 = GetQuestById_NoLock(playerQuestState.MediumQuestId);
QuestDef questById_NoLock3 = GetQuestById_NoLock(playerQuestState.HardQuestId);
string text = BuildAdminQuestLine_NoLock("1", questById_NoLock, playerQuestState.EasyProgress, playerQuestState.EasyClaimed);
string text2 = BuildAdminQuestLine_NoLock("2", questById_NoLock2, playerQuestState.MediumProgress, playerQuestState.MediumClaimed);
string text3 = BuildAdminQuestLine_NoLock("3", questById_NoLock3, playerQuestState.HardProgress, playerQuestState.HardClaimed);
string b = DateTime.Now.ToString("yyyy-MM-dd");
bool flag = string.Equals(playerQuestState.Date, b, StringComparison.Ordinal);
string text4 = "<color=yellow>Daily Quest: <color=white>" + playerQuestState.Name + "</color></color>";
string text5 = (flag ? ("<color=#87CEFA>Quest Date</color>: " + playerQuestState.Date) : ("<color=#87CEFA>Quest Date</color>: " + playerQuestState.Date + " (Outdated)"));
return text4 + "\n" + text + "\n" + text2 + "\n" + text3 + "\n" + text5;
}
}
private static string BuildQuestBlock_NoLock(string label, QuestDef quest, int progress, bool claimed)
{
if (quest != null)
{
int num = Math.Max(0, quest.RequiredKills);
int num2 = Math.Max(0, progress);
if (num2 > num)
{
num2 = num;
}
string rewardDisplay_NoLock = GetRewardDisplay_NoLock(quest);
string value = ((num <= 0 || num2 < num) ? $"Progress {num2}/{num}" : (claimed ? "Reward claimed" : "Completed! Claim with .quest reward"));
return $"<color=#87CEFA>Quest {label}</color>: {quest.Name} x{num}\nReward: {rewardDisplay_NoLock}\nStatus: {value}";
}
return $"<color=#87CEFA>Quest {label}</color>: <color=yellow>No quest {label.ToLowerInvariant()} configured.</color>";
}
private static string BuildAdminQuestLine_NoLock(string label, QuestDef quest, int progress, bool claimed)
{
if (quest == null)
{
return "<color=#87CEFA>Quest " + label + "</color>: <color=yellow>No quest configured.</color>";
}
int num = Math.Max(0, quest.RequiredKills);
int num2 = Math.Max(0, progress);
if (num2 > num)
{
num2 = num;
}
string value = (claimed ? "(Reward claimed)" : ((num2 >= num) ? "(Completed)" : $"({num2}/{num})"));
string value2 = (string.IsNullOrWhiteSpace(quest.Name) ? ("Quest " + label) : quest.Name);
return $"<color=#87CEFA>Quest {label}</color>: {value2} {value}";
}
private static void SendQuestToast(User user, string label, string questName, int prog, int need, bool done)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_014b: Unknown result type (might be due to invalid IL or missing references)
//IL_0150: Unknown result type (might be due to invalid IL or missing references)
if (!(user == default(User)) && user.IsConnected)
{
if (need < 0)
{
need = 0;
}
if (prog < 0)
{
prog = 0;
}
if (prog > need)
{
prog = need;
}
string value = (done ? $"<color=green>{prog}/{need}</color>, Claim: <color=green>.quest reward</color>" : $"<color=yellow>{prog}/{need}</color>, Details: <color=green>.quest daily</color>");
string text = $"<color=#87CEFA>Quest {label}</color>: <color=white>{questName}</color> {value}";
FixedString512Bytes val = default(FixedString512Bytes);
((FixedString512Bytes)(ref val))..ctor(text);
ServerChatUtils.SendSystemMessageToClient(Core.EntityManager, user, ref val);
}
}
private static string GetRewardDisplay_NoLock(QuestDef quest)
{
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
if (quest?.Reward == null)
{
return "None";
}
string value = quest.Reward.Name ?? "";
int amount = quest.Reward.Amount;
if (string.IsNullOrWhiteSpace(value))
{
int prefab = quest.Reward.Prefab;
if (prefab != 0)
{
try
{
value = ECSExtensions.LookupName(new PrefabGUID(prefab));
}
catch
{
value = prefab.ToString();
}
}
else
{
value = "Unknown";
}
}
return $"{Math.Max(0, amount)}x {value}";
}
public static void Initialize()
{
lock (_lock)
{
EnsureFilesExist();
LoadConfig_NoLock(createIfMissing: true);
LoadPlayers_NoLock();
_lastDate = DateTime.Now.Date;
if (_tickCoroutine == null)
{
_tickCoroutine = Core.StartCoroutine(TickLoop());
}
_initialized = true;
}
Core.Log.LogInfo((object)"[Quest] QuestService initialized");
}
public static void Reload()
{
lock (_lock)
{
EnsureFilesExist();
LoadConfig_NoLock(createIfMissing: false);
_initialized = true;
}
Core.Log.LogInfo((object)"[Quest] quest_config.json reloaded");
}
public static void EnsureAssignedForToday(ulong sid, string playerName)
{
if (sid == 0)
{
return;
}
lock (_lock)
{
EnsureInitialized_NoLock();
string text = TodayString();
string key = sid.ToString();
bool flag = false;
if (!_players.TryGetValue(key, out var value) || value == null)
{
value = new PlayerQuestState
{
SteamId = sid,
Name = (playerName ?? ""),
Date = text,
EasyQuestId = "",
EasyProgress = 0,
EasyClaimed = false,
MediumQuestId = "",
MediumProgress = 0,
MediumClaimed = false,
HardQuestId = "",
HardProgress = 0,
HardClaimed = false
};
flag = true;
}
else
{
string text2 = playerName ?? value.Name ?? "";
if (!string.Equals(value.Name, text2, StringComparison.Ordinal))
{
value.Name = text2;
flag = true;
}
}
if (!string.Equals(value.Date, text, StringComparison.Ordinal))
{
value.Date = text;
value.EasyQuestId = "";
value.EasyProgress = 0;
value.EasyClaimed = false;
value.MediumQuestId = "";
value.MediumProgress = 0;
value.MediumClaimed = false;
value.HardQuestId = "";
value.HardProgress = 0;
value.HardClaimed = false;
flag = true;
}
if (string.IsNullOrWhiteSpace(value.EasyQuestId))
{
List<QuestDef> pool = ((_enabledEasyQuests.Count > 0) ? _enabledEasyQuests : _enabledQuests);
value.EasyQuestId = PickQuestId_NoLock(sid, text, "easy", pool);
value.EasyProgress = 0;
value.EasyClaimed = false;
flag = true;
}
if (string.IsNullOrWhiteSpace(value.MediumQuestId))
{
value.MediumQuestId = PickQuestId_NoLock(sid, text, "medium", _enabledMediumQuests);
value.MediumProgress = 0;
value.MediumClaimed = false;
flag = true;
}
if (string.IsNullOrWhiteSpace(value.HardQuestId))
{
value.HardQuestId = PickQuestId_NoLock(sid, text, "hard", _enabledHardQuests);
value.HardProgress = 0;
value.HardClaimed = false;
flag = true;
}
if (flag)
{
_players[key] = value;
MarkDirty_NoLock();
}
}
}
public static bool TryClaim(ChatCommandContext ctx, ulong sid, string playerName, Entity characterEntity)
{
//IL_005a: 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_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_014b: Unknown result type (might be due to invalid IL or missing references)
//IL_014d: Unknown result type (might be due to invalid IL or missing references)
//IL_0229: Unknown result type (might be due to invalid IL or missing references)
//IL_022b: Unknown result type (might be due to invalid IL or missing references)
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_0396: Unknown result type (might be due to invalid IL or missing references)
//IL_019c: Unknown result type (might be due to invalid IL or missing references)
//IL_027a: Unknown result type (might be due to invalid IL or missing references)
EnsureAssignedForToday(sid, playerName);
lock (_lock)
{
string key = sid.ToString();
if (!_players.TryGetValue(key, out var value) || value == null)
{
ctx.Reply("<color=red>No quest data.</color>");
return false;
}
Entity senderUserEntity = ctx.Event.SenderUserEntity;
bool flag = false;
List<string> list = new List<string>(3);
if (TryClaimOne_NoLock(ctx, senderUserEntity, characterEntity, "1", value.EasyQuestId, value.EasyProgress, value.EasyClaimed, out var replyText))
{
value.EasyClaimed = true;
ctx.Reply(replyText);
flag = true;
if (_config.RepairOnClaim)
{
try
{
Helper.RepairAmulet(characterEntity);
}
catch (Exception e)
{
Core.LogException(e, "TryClaim");
}
}
QuestDef questById_NoLock = GetQuestById_NoLock(value.EasyQuestId);
int value2 = Math.Max(0, questById_NoLock?.RequiredKills ?? 0);
list.Add((questById_NoLock != null) ? $"{questById_NoLock.Name} x{value2}" : "Quest 1");
}
if (TryClaimOne_NoLock(ctx, senderUserEntity, characterEntity, "2", value.MediumQuestId, value.MediumProgress, value.MediumClaimed, out var replyText2))
{
value.MediumClaimed = true;
ctx.Reply(replyText2);
flag = true;
if (_config.RepairOnClaim)
{
try
{
Helper.RepairArmor(characterEntity);
}
catch (Exception e2)
{
Core.LogException(e2, "TryClaim");
}
}
QuestDef questById_NoLock2 = GetQuestById_NoLock(value.MediumQuestId);
int value3 = Math.Max(0, questById_NoLock2?.RequiredKills ?? 0);
list.Add((questById_NoLock2 != null) ? $"{questById_NoLock2.Name} x{value3}" : "Quest 2");
}
if (TryClaimOne_NoLock(ctx, senderUserEntity, characterEntity, "3", value.HardQuestId, value.HardProgress, value.HardClaimed, out var replyText3))
{
value.HardClaimed = true;
ctx.Reply(replyText3);
flag = true;
if (_config.RepairOnClaim)
{
try
{
Helper.RepairWeapon(characterEntity);
}
catch (Exception e3)
{
Core.LogException(e3, "TryClaim");
}
}
QuestDef questById_NoLock3 = GetQuestById_NoLock(value.HardQuestId);
int value4 = Math.Max(0, questById_NoLock3?.RequiredKills ?? 0);
list.Add((questById_NoLock3 != null) ? $"{questById_NoLock3.Name} x{value4}" : "Quest 3");
}
if (!flag)
{
return false;
}
_players[key] = value;
MarkDirty_NoLock();
ForceSave_NoLock();
string text = string.Join(", ", list);
string text2 = $"<color=white>{playerName}</color> completed and claimed rewards for: {text}. Use <color=green>.quest daily</color> to check your quests.";
FixedString512Bytes val = default(FixedString512Bytes);
((FixedString512Bytes)(ref val))..ctor(text2);
ServerChatUtils.SendSystemMessageToAllClients(Core.EntityManager, ref val);
TrySendClaimWebhook(playerName, text);
return true;
}
}
private static void TrySendClaimWebhook(string playerName, string list)
{
string message = "**[Daily quest]** - **" + playerName + "** has completed and claimed the rewards for " + list;
SendClaimWebhookAsync(message);
}
private static async Task SendClaimWebhookAsync(string message)
{
try
{
var (ok, error) = await WebhookService.SendAsync(message).ConfigureAwait(continueOnCapturedContext: false);
if (!ok && !string.IsNullOrWhiteSpace(error) && !string.Equals(error, "Webhook is disabled.", StringComparison.Ordinal) && !string.Equals(error, "Webhook URL is empty.", StringComparison.Ordinal))
{
ManualLogSource log = Core.Log;
bool flag = default(bool);
BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(10, 1, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[Webhook] ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(error);
}
log.LogWarning(val);
}
}
catch (Exception ex)
{
Exception e = ex;
Core.LogException(e, "SendClaimWebhookAsync");
}
}
public static void OnKilledPrefab(ulong sid, int diedPrefabGuidHash, User user, string playerNameForEnsure = "")
{
//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
//IL_0281: Unknown result type (might be due to invalid IL or missing references)
if (sid == 0L || diedPrefabGuidHash == 0)
{
return;
}
EnsureAssignedForToday(sid, playerNameForEnsure);
lock (_lock)
{
string key = sid.ToString();
if (!_players.TryGetValue(key, out var value) || value == null)
{
return;
}
bool flag = false;
QuestDef questById_NoLock = GetQuestById_NoLock(value.EasyQuestId);
if (questById_NoLock != null && questById_NoLock.TargetPrefabs != null && questById_NoLock.TargetPrefabs.Length != 0 && questById_NoLock.TargetPrefabs.Contains(diedPrefabGuidHash))
{
int num = Math.Max(0, questById_NoLock.RequiredKills);
if (num > 0 && value.EasyProgress < num)
{
value.EasyProgress++;
if (value.EasyProgress > num)
{
value.EasyProgress = num;
}
flag = true;
SendQuestToast(user, "1", questById_NoLock.Name, value.EasyProgress, num, value.EasyProgress >= num);
}
}
QuestDef questById_NoLock2 = GetQuestById_NoLock(value.MediumQuestId);
if (questById_NoLock2 != null && questById_NoLock2.TargetPrefabs != null && questById_NoLock2.TargetPrefabs.Length != 0 && questById_NoLock2.TargetPrefabs.Contains(diedPrefabGuidHash))
{
int num2 = Math.Max(0, questById_NoLock2.RequiredKills);
if (num2 > 0 && value.MediumProgress < num2)
{
value.MediumProgress++;
if (value.MediumProgress > num2)
{
value.MediumProgress = num2;
}
flag = true;
SendQuestToast(user, "2", questById_NoLock2.Name, value.MediumProgress, num2, value.MediumProgress >= num2);
}
}
QuestDef questById_NoLock3 = GetQuestById_NoLock(value.HardQuestId);
if (questById_NoLock3 != null && questById_NoLock3.TargetPrefabs != null && questById_NoLock3.TargetPrefabs.Length != 0 && questById_NoLock3.TargetPrefabs.Contains(diedPrefabGuidHash))
{
int num3 = Math.Max(0, questById_NoLock3.RequiredKills);
if (num3 > 0 && value.HardProgress < num3)
{
value.HardProgress++;
if (value.HardProgress > num3)
{
value.HardProgress = num3;
}
flag = true;
SendQuestToast(user, "3", questById_NoLock3.Name, value.HardProgress, num3, value.HardProgress >= num3);
}
}
if (flag)
{
_players[key] = value;
MarkDirty_NoLock();
}
}
}
private static void EnsureInitialized_NoLock()
{
if (!_initialized)
{
EnsureFilesExist();
LoadConfig_NoLock(createIfMissing: true);
LoadPlayers_NoLock();
_lastDate = DateTime.Now.Date;
_initialized = true;
Core.Log.LogInfo((object)"[Quest] QuestService lazy-initialized");
}
}
private static bool TryClaimOne_NoLock(ChatCommandContext ctx, Entity userEntity, Entity characterEntity, string label, string questId, int progress, bool alreadyClaimed, out string replyText)
{
//IL_0157: Unknown result type (might be due to invalid IL or missing references)
//IL_0158: Unknown result type (might be due to invalid IL or missing references)
//IL_015b: Unknown result type (might be due to invalid IL or missing references)
replyText = "";
if (string.IsNullOrWhiteSpace(questId))
{
ctx.Reply("<color=yellow>Quest " + label + " not assigned today.</color>");
return false;
}
QuestDef questById_NoLock = GetQuestById_NoLock(questId);
if (questById_NoLock == null)
{
ctx.Reply("<color=red>Quest " + label + " not found in config.</color>");
return false;
}
int num = Math.Max(0, questById_NoLock.RequiredKills);
if (num <= 0)
{
ctx.Reply("<color=red>Quest " + label + " has invalid requiredKills.</color>");
return false;
}
if (progress < num)
{
ctx.Reply("<color=yellow>Quest " + label + " not completed yet.</color> Use <color=green>.quest daily</color> to check.");
return false;
}
if (alreadyClaimed)
{
ctx.Reply("<color=yellow>Quest " + label + " reward already claimed today.</color>");
return false;
}
if (!TryResolveRewardPrefab_NoLock(questById_NoLock, out var rewardPrefab, out var rewardName))
{
ctx.Reply("<color=red>Reward prefab not configured correctly.</color>");
return false;
}
int num2 = Math.Max(0, questById_NoLock.Reward?.Amount ?? 0);
if (num2 <= 0)
{
ctx.Reply("<color=red>Reward amount invalid.</color>");
return false;
}
Helper.AddItemToInventory(characterEntity, rewardPrefab, num2);
replyText = $"<color=green>Quest {label} reward claimed</color> <color=#87CEFA>{num2}x {rewardName}</color>";
return true;
}
private static void RollDateIfNeeded_NoLock()
{
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
DateTime date = DateTime.Now.Date;
if (!(date == _lastDate))
{
_lastDate = date;
ManualLogSource log = Core.Log;
bool flag = default(bool);
BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(26, 1, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[Quest] New day detected: ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<DateTime>(_lastDate, "yyyy-MM-dd");
}
log.LogInfo(val);
}
}
private static string TodayString()
{
return DateTime.Now.ToString("yyyy-MM-dd");
}
private static string GetNextResetText()
{
DateTime now = DateTime.Now;
DateTime dateTime = now.Date.AddDays(1.0);
TimeSpan timeSpan = dateTime - now;
if (timeSpan < TimeSpan.Zero)
{
timeSpan = TimeSpan.Zero;
}
int value = (int)timeSpan.TotalHours;
return $"{value:00}:{timeSpan.Minutes:00}:{timeSpan.Seconds:00}";
}
private static QuestDef GetQuestById_NoLock(string id)
{
if (string.IsNullOrWhiteSpace(id))
{
return null;
}
if (_questsById.TryGetValue(id, out var value))
{
return value;
}
return _config?.Quests?.FirstOrDefault((QuestDef x) => x != null && string.Equals(x.Id, id, StringComparison.Ordinal));
}
private static string PickQuestId_NoLock(ulong sid, string date, string difficulty, List<QuestDef> pool)
{
if (pool == null || pool.Count == 0)
{
return "";
}
int seed = HashCode.Combine(sid, date, difficulty);
Random random = new Random(seed);
return pool[random.Next(pool.Count)]?.Id ?? "";
}
private static bool TryResolveRewardPrefab_NoLock(QuestDef quest, out PrefabGUID rewardPrefab, out string rewardName)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
rewardPrefab = new PrefabGUID(0);
rewardName = "Reward";
if (quest?.Reward == null)
{
return false;
}
int prefab = quest.Reward.Prefab;
if (prefab == 0)
{
return false;
}
rewardPrefab = new PrefabGUID(prefab);
rewardName = quest.Reward.Name;
if (string.IsNullOrWhiteSpace(rewardName))
{
try
{
rewardName = rewardPrefab.LookupName();
}
catch
{
rewardName = prefab.ToString();
}
}
return true;
}
private static void MarkDirty_NoLock()
{
_dirty = true;
if (_nextSave == DateTime.MinValue)
{
_nextSave = DateTime.Now.AddSeconds(10.0);
}
}
internal static void Tick()
{
lock (_lock)
{
RollDateIfNeeded_NoLock();
if (_dirty && (!(_nextSave != DateTime.MinValue) || !(DateTime.Now < _nextSave)))
{
SavePlayers_NoLock();
_dirty = false;
_nextSave = DateTime.MinValue;
}
}
}
private static void ForceSave_NoLock()
{
SavePlayers_NoLock();
_dirty = false;
_nextSave = DateTime.MinValue;
}
private static IEnumerator TickLoop()
{
while (true)
{
try
{
Tick();
}
catch (Exception ex)
{
Exception e = ex;
Core.LogException(e, "TickLoop");
}
yield return (object)new WaitForSeconds(1f);
}
}
public static void EnsureFilesExist()
{
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Expected O, but got Unknown
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Expected O, but got Unknown
try
{
Directory.CreateDirectory(CONFIG_DIR);
bool flag = default(bool);
if (!File.Exists(CONFIG_FILE))
{
File.WriteAllText(CONFIG_FILE, "{\n \"GearRepairOnClaim\": false,\n \"Quests\": [\n {\n \"ID\": \"1_1\",\n \"Name\": \"kill Wolves\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -1418430647,\n -1554428547,\n -578677530,\n 134039094,\n -218175217,\n 572729167,\n 616274140\n ],\n \"RequiredKills\": 30,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_2\",\n \"Name\": \"kill Deer\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 1897056612,\n -575831311,\n 1780171587\n ],\n \"RequiredKills\": 20,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_3\",\n \"Name\": \"kill Moose\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -831097925,\n 2097040330,\n -779632831,\n 1570140219\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_4\",\n \"Name\": \"kill Crows\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -221278041,\n 1239832946,\n -2002658567,\n 1029047051\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_5\",\n \"Name\": \"kill Sheep\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 947731555,\n 1635167941,\n 1012307512\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_6\",\n \"Name\": \"kill Cow\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 721166952\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_7\",\n \"Name\": \"kill Flying Skull\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -236166535\n ],\n \"RequiredKills\": 20,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_8\",\n \"Name\": \"kill Undead Assassin\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -1365627158\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_9\",\n \"Name\": \"kill Horses\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 1149585723,\n -1502865710\n ],\n \"RequiredKills\": 25,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_10\",\n \"Name\": \"kill Bears\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 1043643344,\n -1391546313,\n 2041915372,\n -559819989,\n 1938756250,\n -1697944553\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_11\",\n \"Name\": \"kill Pigs\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -1356006948,\n 1420480270\n ],\n \"RequiredKills\": 20,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_12\",\n \"Name\": \"kill Treant\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -1089337069\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_13\",\n \"Name\": \"kill Stone Golems / Elementals\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -779411607,\n 20817667\n ],\n \"RequiredKills\": 20,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_14\",\n \"Name\": \"kill Iron Golem\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 763796308\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_15\",\n \"Name\": \"kill Scarecrow\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -1750347680\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_16\",\n \"Name\": \"kill Mutant Spitter\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 1092792896\n ],\n \"RequiredKills\": 20,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_17\",\n \"Name\": \"kill Rathorror\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -375581934\n ],\n \"RequiredKills\": 30,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_18\",\n \"Name\": \"kill Abomination\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 823276204\n ],\n \"RequiredKills\": 8,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_19\",\n \"Name\": \"kill Spiders\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 1078424589,\n -764515001,\n 2103131615,\n 2136899683,\n 342127250,\n -548489519\n ],\n \"RequiredKills\": 40,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_20\",\n \"Name\": \"kill Mosquito\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -744966291\n ],\n \"RequiredKills\": 30,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_21\",\n \"Name\": \"kill Night Lurker\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -2046268156\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_22\",\n \"Name\": \"kill Ghost Crossbowman\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -85729652\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_23\",\n \"Name\": \"kill Ghost Warrior\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -1618703048\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_24\",\n \"Name\": \"kill Banshee\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -1146194149\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_25\",\n \"Name\": \"kill Ghost Guardian\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -458883491\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_26\",\n \"Name\": \"kill Ghost Assassin\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 849891426\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_27\",\n \"Name\": \"kill Worm Terror\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 658578725\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_28\",\n \"Name\": \"kill Sister\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 1772642154\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_29\",\n \"Name\": \"kill Dunley Villagers\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 1887807944,\n 525027204\n ],\n \"RequiredKills\": 20,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_30\",\n \"Name\": \"kill Bell Ringer\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -1670130821\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_31\",\n \"Name\": \"kill Hound\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -249647316\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_32\",\n \"Name\": \"kill Nun\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -700632469\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_33\",\n \"Name\": \"kill Militia Archer\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 203103783\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_34\",\n \"Name\": \"kill Militia Veteran\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 2005508157\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_35\",\n \"Name\": \"kill Pyro\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -322293503\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_36\",\n \"Name\": \"kill Technician\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 820492683\n ],\n \"RequiredKills\": 25,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_37\",\n \"Name\": \"kill Tractor Beamer\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -293507834\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_38\",\n \"Name\": \"kill Railgunner\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 1732477970\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_39\",\n \"Name\": \"kill Sentry Officer\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 1401026468\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"2_1\",\n \"Name\": \"kill Werewolf\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n -951976780\n ],\n \"RequiredKills\": 20,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_2\",\n \"Name\": \"kill Witch\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n -56441915\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_3\",\n \"Name\": \"kill Corrupted Mantraps\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 1527640414,\n 1906792990,\n -1915060856,\n 358623979,\n 2107764370\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_4\",\n \"Name\": \"Cut down Corrupt Trees\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n -1378837905,\n 861604950,\n 735695679\n ],\n \"RequiredKills\": 25,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_5\",\n \"Name\": \"kill Corrupted Treants\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 1496810447,\n 358623979,\n 2107764370\n ],\n \"RequiredKills\": 12,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_6\",\n \"Name\": \"kill Driller\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 709450349\n ],\n \"RequiredKills\": 12,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_7\",\n \"Name\": \"kill Lightning Protector\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 1655577903\n ],\n \"RequiredKills\": 12,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_8\",\n \"Name\": \"kill Gattler\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n -884401089\n ],\n \"RequiredKills\": 12,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_9\",\n \"Name\": \"kill Zapper\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n -2018710724\n ],\n \"RequiredKills\": 12,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_10\",\n \"Name\": \"kill Gloomrot Villagers\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 1216169364,\n -732208863\n ],\n \"RequiredKills\": 25,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_11\",\n \"Name\": \"kill Silverlight Villagers\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n -1224027101,\n -2025921616\n ],\n \"RequiredKills\": 25,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_12\",\n \"Name\": \"kill Devoted\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 1660801216\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_13\",\n \"Name\": \"kill Slave Masters\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 891705701,\n -240536861\n ],\n \"RequiredKills\": 12,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_14\",\n \"Name\": \"kill Footman\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 2128996433\n ],\n \"RequiredKills\": 20,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_15\",\n \"Name\": \"kill Rifleman\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 1148936156\n ],\n \"RequiredKills\": 20,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_16\",\n \"Name\": \"kill Cleric\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n -1464869978\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_17\",\n \"Name\": \"kill Knights\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n -930333806,\n 794228023\n ],\n \"RequiredKills\": 18,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_18\",\n \"Name\": \"kill Paladin\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 1728773109\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_19\",\n \"Name\": \"kill Lightweaver\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 1185952775\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_20\",\n \"Name\": \"kill Priest\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 1406393857\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_21\",\n \"Name\": \"kill Cardinal Aide\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 1745498602\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_22\",\n \"Name\": \"kill Sanguinary Guards\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 1144208724,\n -669027288\n ],\n \"RequiredKills\": 20,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_23\",\n \"Name\": \"kill Exsanguinator\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n -1076780215\n ],\n \"RequiredKills\": 28,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_24\",\n \"Name\": \"kill Nightmares\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n -981051151,\n -1009917656\n ],\n \"RequiredKills\": 30,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_25\",\n \"Name\": \"kill Blood Prophets\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n -2080231735,\n 1912966420\n ],\n \"RequiredKills\": 30,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_26\",\n \"Name\": \"kill Dreadhorns\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n -1140588645,\n 981369753\n ],\n \"RequiredKills\": 25,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_27\",\n \"Name\": \"kill Dark Temptresses\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 2111003460,\n -494298686\n ],\n \"RequiredKills\": 30,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_28\",\n \"Name\": \"kill Slaughterbeasts\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 2049379982,\n -653348998\n ],\n \"RequiredKills\": 30,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_29\",\n \"Name\": \"kill Gargoyles\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n -65981941,\n -392776091,\n 280858720\n ],\n \"RequiredKills\": 20,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_30\",\n \"Name\": \"kill DartFlinger\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 1209580976\n ],\n \"RequiredKills\": 20,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_31\",\n \"Name\": \"kill Lurker\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n -1733829912\n ],\n \"RequiredKills\": 20,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_32\",\n \"Name\": \"kill Alchemist\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 326501064\n ],\n \"RequiredKills\": 18,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_33\",\n \"Name\": \"kill Dreadcleaver\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 1864177126\n ],\n \"RequiredKills\": 18,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_34\",\n \"Name\": \"kill Viper\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n -436956599\n ],\n \"RequiredKills\": 18,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_35\",\n \"Name\": \"kill Sentinel\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 1531777139\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"2_36\",\n \"Name\": \"kill Striker\",\n \"Difficulty\": \"medium\",\n \"TargetPrefabs\": [\n 761646020\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 576389135,\n \"Name\": \"Greater Stygian Shards\",\n \"Amount\": 800\n }\n },\n {\n \"ID\": \"3_1\",\n \"Name\": \"kill Dracula\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -327335305\n ],\n \"RequiredKills\": 3,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_2\",\n \"Name\": \"kill Megara\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 591725925\n ],\n \"RequiredKills\": 3,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_3\",\n \"Name\": \"kill Adam\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 1233988687\n ],\n \"RequiredKills\": 3,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_4\",\n \"Name\": \"kill Solarus\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -740796338\n ],\n \"RequiredKills\": 4,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_5\",\n \"Name\": \"kill Talzur\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -393555055\n ],\n \"RequiredKills\": 4,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_6\",\n \"Name\": \"kill General Valencia\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 495971434\n ],\n \"RequiredKills\": 5,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_7\",\n \"Name\": \"kill Lord Styx\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 1112948824\n ],\n \"RequiredKills\": 5,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_8\",\n \"Name\": \"kill Gorecrusher\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -1936575244\n ],\n \"RequiredKills\": 5,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_9\",\n \"Name\": \"kill Dantos\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 173259239\n ],\n \"RequiredKills\": 6,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_10\",\n \"Name\": \"kill Simon Belmont\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 336560131\n ],\n \"RequiredKills\": 5,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_11\",\n \"Name\": \"kill Azariel\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 114912615\n ],\n \"RequiredKills\": 6,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_12\",\n \"Name\": \"kill Voltatia\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 2054432370\n ],\n \"RequiredKills\": 6,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_13\",\n \"Name\": \"kill Lucile\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 1295855316\n ],\n \"RequiredKills\": 6,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_14\",\n \"Name\": \"kill Terrorclaw\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -1347412392\n ],\n \"RequiredKills\": 6,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_15\",\n \"Name\": \"kill Matka\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -910296704\n ],\n \"RequiredKills\": 6,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_16\",\n \"Name\": \"kill Stavros\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -1669199769\n ],\n \"RequiredKills\": 6,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_17\",\n \"Name\": \"kill Jakira\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -1383529374\n ],\n \"RequiredKills\": 6,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_18\",\n \"Name\": \"kill Henry Blackbrew\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 814083983\n ],\n \"RequiredKills\": 6,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_19\",\n \"Name\": \"kill Mairwyn\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -2013903325\n ],\n \"RequiredKills\": 7,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_20\",\n \"Name\": \"kill Morian\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 685266977\n ],\n \"RequiredKills\": 7,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_21\",\n \"Name\": \"kill Baron du Bouchon\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 192051202\n ],\n \"RequiredKills\": 8,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_22\",\n \"Name\": \"kill Sir Magnus\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -26105228\n ],\n \"RequiredKills\": 8,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_23\",\n \"Name\": \"kill Cyril\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 326378955\n ],\n \"RequiredKills\": 8,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_24\",\n \"Name\": \"kill Willfred\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -1007062401\n ],\n \"RequiredKills\": 8,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_25\",\n \"Name\": \"kill Albert\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -203043163\n ],\n \"RequiredKills\": 8,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_26\",\n \"Name\": \"kill Foulrot\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -1208888966\n ],\n \"RequiredKills\": 8,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_27\",\n \"Name\": \"kill Ben\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 109969450\n ],\n \"RequiredKills\": 8,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_28\",\n \"Name\": \"kill Ungora\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -548489519\n ],\n \"RequiredKills\": 8,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_29\",\n \"Name\": \"kill Angram\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 106480588\n ],\n \"RequiredKills\": 9,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_30\",\n \"Name\": \"kill Domina\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -1101874342\n ],\n \"RequiredKills\": 9,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_31\",\n \"Name\": \"kill Ziva\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 172235178\n ],\n \"RequiredKills\": 9,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_32\",\n \"Name\": \"kill Octavian\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 1688478381\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_33\",\n \"Name\": \"kill General Cassius\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -496360395\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_34\",\n \"Name\": \"kill Raziel\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -680831417\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_35\",\n \"Name\": \"kill Jade\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -1968372384\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_36\",\n \"Name\": \"kill Gaius\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -753453016\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_37\",\n \"Name\": \"kill General Elena\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 795262842\n ],\n \"RequiredKills\": 11,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_38\",\n \"Name\": \"kill Frostmaw\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 24378719\n ],\n \"RequiredKills\": 11,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_39\",\n \"Name\": \"kill Terah\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -1065970933\n ],\n \"RequiredKills\": 11,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_40\",\n \"Name\": \"kill Primal Blood Souls\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n -440174408,\n -427888732,\n 1990744594,\n -943858353,\n -1805216630,\n -982850914,\n -1189707552,\n 282791819,\n -1160778038,\n 468179469,\n 2079933370,\n 666177656\n ],\n \"RequiredKills\": 12,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n },\n {\n \"ID\": \"3_41\",\n \"Name\": \"kill Lesser Blood Souls\",\n \"Difficulty\": \"hard\",\n \"TargetPrefabs\": [\n 1854211210,\n 17609984,\n -1420322422,\n 478580792,\n 1318855899,\n 1494126678,\n -1381375644,\n -1822337177,\n -989493184,\n 2009018555\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 28358550,\n \"Name\": \"Primal Stygian Shards\",\n \"Amount\": 400\n }\n }\n ]\n}");
ManualLogSource log = Core.Log;
BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(24, 1, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[Quest] Created config: ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(CONFIG_FILE);
}
log.LogInfo(val);
}
if (!File.Exists(PLAYER_FILE))
{
File.WriteAllText(PLAYER_FILE, "{}");
ManualLogSource log2 = Core.Log;
BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(29, 1, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[Quest] Created player data: ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(PLAYER_FILE);
}
log2.LogInfo(val);
}
}
catch (Exception e)
{
Core.LogException(e, "EnsureFilesExist");
}
}
private static void RebuildQuestIndex_NoLock()
{
//IL_0154: Unknown result type (might be due to invalid IL or missing references)
//IL_015b: Expected O, but got Unknown
_questsById = new Dictionary<string, QuestDef>(StringComparer.Ordinal);
_enabledQuests = new List<QuestDef>();
_enabledEasyQuests = new List<QuestDef>();
_enabledMediumQuests = new List<QuestDef>();
_enabledHardQuests = new List<QuestDef>();
if (_config?.Quests == null)
{
Core.Log.LogWarning((object)"[Quest] _config.Quests is null");
return;
}
foreach (QuestDef quest in _config.Quests)
{
if (quest != null)
{
if (!string.IsNullOrWhiteSpace(quest.Id))
{
_questsById[quest.Id] = quest;
}
_enabledQuests.Add(quest);
string text = (quest.Difficulty ?? "easy").Trim().ToLowerInvariant();
if (text == "hard")
{
_enabledHardQuests.Add(quest);
}
else if (text == "medium")
{
_enabledMediumQuests.Add(quest);
}
else
{
_enabledEasyQuests.Add(quest);
}
}
}
ManualLogSource log = Core.Log;
bool flag = default(bool);
BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(50, 4, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[Quest] Loaded quests: all ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(_enabledQuests.Count);
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(", easy ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(_enabledEasyQuests.Count);
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(", medium ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(_enabledMediumQuests.Count);
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(", hard ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<int>(_enabledHardQuests.Count);
}
log.LogInfo(val);
}
private static void LoadConfig_NoLock(bool createIfMissing)
{
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
//IL_0097: Expected O, but got Unknown
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Expected O, but got Unknown
Directory.CreateDirectory(CONFIG_DIR);
if (!File.Exists(CONFIG_FILE))
{
bool flag = default(bool);
if (!createIfMissing)
{
ManualLogSource log = Core.Log;
BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(26, 1, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[Quest] Config not found: ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(CONFIG_FILE);
}
log.LogWarning(val);
_config = new QuestConfig();
RebuildQuestIndex_NoLock();
return;
}
File.WriteAllText(CONFIG_FILE, "{\n \"GearRepairOnClaim\": false,\n \"Quests\": [\n {\n \"ID\": \"1_1\",\n \"Name\": \"kill Wolves\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -1418430647,\n -1554428547,\n -578677530,\n 134039094,\n -218175217,\n 572729167,\n 616274140\n ],\n \"RequiredKills\": 30,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_2\",\n \"Name\": \"kill Deer\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 1897056612,\n -575831311,\n 1780171587\n ],\n \"RequiredKills\": 20,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_3\",\n \"Name\": \"kill Moose\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -831097925,\n 2097040330,\n -779632831,\n 1570140219\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_4\",\n \"Name\": \"kill Crows\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -221278041,\n 1239832946,\n -2002658567,\n 1029047051\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_5\",\n \"Name\": \"kill Sheep\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 947731555,\n 1635167941,\n 1012307512\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_6\",\n \"Name\": \"kill Cow\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 721166952\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_7\",\n \"Name\": \"kill Flying Skull\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -236166535\n ],\n \"RequiredKills\": 20,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_8\",\n \"Name\": \"kill Undead Assassin\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -1365627158\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_9\",\n \"Name\": \"kill Horses\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 1149585723,\n -1502865710\n ],\n \"RequiredKills\": 25,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_10\",\n \"Name\": \"kill Bears\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n 1043643344,\n -1391546313,\n 2041915372,\n -559819989,\n 1938756250,\n -1697944553\n ],\n \"RequiredKills\": 15,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_11\",\n \"Name\": \"kill Pigs\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -1356006948,\n 1420480270\n ],\n \"RequiredKills\": 20,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_12\",\n \"Name\": \"kill Treant\",\n \"Difficulty\": \"easy\",\n \"TargetPrefabs\": [\n -1089337069\n ],\n \"RequiredKills\": 10,\n \"Reward\": {\n \"Prefab\": 2103989354,\n \"Name\": \"Stygian Shards\",\n \"Amount\": 1200\n }\n },\n {\n \"ID\": \"1_13\",\n \"Name\": \"kill Stone Golems / Elementals\",