Decompiled source of BloodRefill v2.0.0

VMods.BloodRefill.dll

Decompiled 6 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.Json;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using Bloodstone.API;
using HarmonyLib;
using Il2CppInterop.Runtime;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSystem;
using Microsoft.CodeAnalysis;
using ProjectM;
using ProjectM.CastleBuilding;
using ProjectM.Network;
using ProjectM.UI;
using Stunlock.Core;
using Stunlock.Localization;
using Unity.Collections;
using Unity.Collections.LowLevel.Unsafe;
using Unity.Entities;
using UnityEngine;
using VMods.BloodRefill.Commands;
using VMods.Shared;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("VMods.BloodRefill")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Allows a player to refill their blood pool")]
[assembly: AssemblyFileVersion("2.0.0.0")]
[assembly: AssemblyInformationalVersion("2.0.0+bb83ee9224aaa22b693e8480f0407a15d7ba6d01")]
[assembly: AssemblyProduct("VMods.BloodRefill")]
[assembly: AssemblyTitle("VMods.BloodRefill")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.0.0.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]
	internal sealed class IsUnmanagedAttribute : Attribute
	{
	}
	[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 VMods.Shared
{
	[HarmonyPatch]
	public static class SaveHook
	{
		[HarmonyPatch(typeof(TriggerPersistenceSaveSystem), "TriggerSave")]
		[HarmonyPrefix]
		private static void TriggerSave()
		{
			SaveSystem.SaveAll();
		}

		[HarmonyPatch(typeof(ServerBootstrapSystem), "OnDestroy")]
		[HarmonyPrefix]
		private static void OnDestroy()
		{
			SaveSystem.SaveAll();
		}
	}
	public enum BloodType
	{
		Frailed = 447918373,
		Creature = 524822543,
		Warrior = -516976528,
		Rogue = -1620185637,
		Brute = 804798592,
		Scholar = 1476452791,
		Worker = -1776904174,
		VBlood = -338774148,
		Mutant = 1821108694,
		DraculaTheImmortal = 2010023718,
		Draculin = 1328126535,
		GateBoss = 910644396
	}
	public static class BloodTypeExtensions
	{
		public static readonly Dictionary<BloodType, PrefabGUID> BloodTypeToPrefabGUIDMapping = new Dictionary<BloodType, PrefabGUID>
		{
			[BloodType.Creature] = new PrefabGUID(1897056612),
			[BloodType.Warrior] = new PrefabGUID(-1128238456),
			[BloodType.Rogue] = new PrefabGUID(-1030822544),
			[BloodType.Brute] = new PrefabGUID(-1464869978),
			[BloodType.Scholar] = new PrefabGUID(-700632469),
			[BloodType.Worker] = new PrefabGUID(-1342764880),
			[BloodType.Mutant] = new PrefabGUID(572729167),
			[BloodType.Draculin] = new PrefabGUID(-669027288)
		};

		public static bool ParseBloodType(this PrefabGUID prefabGUID, out BloodType bloodType)
		{
			int guidHash = ((PrefabGUID)(ref prefabGUID)).GuidHash;
			if (!Enum.IsDefined(typeof(BloodType), guidHash))
			{
				bloodType = BloodType.Frailed;
				return false;
			}
			bloodType = (BloodType)guidHash;
			return true;
		}

		public static BloodType? ToBloodType(this PrefabGUID prefabGUID)
		{
			int guidHash = ((PrefabGUID)(ref prefabGUID)).GuidHash;
			if (!Enum.IsDefined(typeof(BloodType), guidHash))
			{
				return null;
			}
			return (BloodType)guidHash;
		}

		public static PrefabGUID ToPrefabGUID(this BloodType bloodType)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			return BloodTypeToPrefabGUIDMapping[bloodType];
		}

		public static void ApplyToPlayer(this BloodType bloodType, User user, float quality, int addAmount)
		{
			//IL_0002: 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_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			ConsumeBloodDebugEvent val = default(ConsumeBloodDebugEvent);
			val.Source = bloodType.ToPrefabGUID();
			val.Quality = quality;
			val.Amount = addAmount;
			ConsumeBloodDebugEvent val2 = val;
			VWorld.Server.GetExistingSystemManaged<DebugEventsSystem>().ConsumeBloodEvent(user.Index, ref val2);
		}
	}
	[HarmonyPatch]
	public static class DeathHook
	{
		public delegate void DeathEventHandler(DeathEvent deathEvent);

		public static event DeathEventHandler DeathEvent;

		private static void FireDeathEvent(DeathEvent deathEvent)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			DeathHook.DeathEvent?.Invoke(deathEvent);
		}

		[HarmonyPatch(typeof(DeathEventListenerSystem), "OnUpdate")]
		[HarmonyPostfix]
		private static void OnUpdate(DeathEventListenerSystem __instance)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: 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_001f: 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_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (!VWorld.IsServer)
				{
					return;
				}
				EntityQuery deathEventQuery = __instance._DeathEventQuery;
				if (!((EntityQuery)(ref deathEventQuery)).IsEmpty)
				{
					deathEventQuery = __instance._DeathEventQuery;
					Enumerator<DeathEvent> enumerator = ((EntityQuery)(ref deathEventQuery)).ToComponentDataArray<DeathEvent>(AllocatorHandle.op_Implicit((Allocator)2)).GetEnumerator();
					while (enumerator.MoveNext())
					{
						FireDeathEvent(enumerator.Current);
					}
				}
			}
			catch (Exception ex)
			{
				Utils.Logger.LogError((object)ex.Message);
			}
		}
	}
	public static class Utils
	{
		private struct FakeNull
		{
			public int value;

			public bool has_value;
		}

		private static ComponentType[] _containerComponents;

		public static World CurrentWorld => VWorld.Game;

		public static ManualLogSource Logger { get; private set; }

		public static string PluginName { get; private set; }

		private static ComponentType[] ContainerComponents
		{
			get
			{
				//IL_0014: 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)
				//IL_0025: 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_003b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0047: Unknown result type (might be due to invalid IL or missing references)
				//IL_004c: Unknown result type (might be due to invalid IL or missing references)
				if (_containerComponents == null)
				{
					_containerComponents = (ComponentType[])(object)new ComponentType[4]
					{
						ComponentType.ReadOnly(Il2CppType.Of<Team>()),
						ComponentType.ReadOnly(Il2CppType.Of<CastleHeartConnection>()),
						ComponentType.ReadOnly(Il2CppType.Of<InventoryBuffer>()),
						ComponentType.ReadOnly(Il2CppType.Of<NameableInteractable>())
					};
				}
				return _containerComponents;
			}
		}

		public static void Initialize(ManualLogSource logger, string pluginName)
		{
			Logger = logger;
			PluginName = pluginName;
		}

		public static void Deinitialize()
		{
			Logger = null;
		}

		public static NativeArray<Entity> GetStashEntities(EntityManager entityManager)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: 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)
			EntityQuery val = ((EntityManager)(ref entityManager)).CreateEntityQuery(ContainerComponents);
			return ((EntityQuery)(ref val)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2));
		}

		public static IEnumerable<Entity> GetAlliedStashes(EntityManager entityManager, Entity character)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: 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)
			Enumerator<Entity> enumerator = GetStashEntities(entityManager).GetEnumerator();
			Team val = default(Team);
			Team val2 = default(Team);
			while (enumerator.MoveNext())
			{
				Entity current = enumerator.Current;
				if (((EntityManager)(ref entityManager)).HasComponent<Team>(current) && ((EntityManager)(ref entityManager)).HasComponent<Team>(character))
				{
					((EntityManager)(ref entityManager)).TryGetComponentData<Team>(current, ref val);
					((EntityManager)(ref entityManager)).TryGetComponentData<Team>(character, ref val2);
					if (Team.IsAllies(val, val2))
					{
						yield return current;
					}
				}
			}
		}

		public static int GetStashItemCount(EntityManager entityManager, Entity character, PrefabGUID itemGUID, StoredBlood? storedBlood = null)
		{
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: 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_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: 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_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: 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_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: 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_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			int num = 0;
			int num2 = 0;
			DynamicBuffer<InventoryBuffer> val = default(DynamicBuffer<InventoryBuffer>);
			StoredBlood val3 = default(StoredBlood);
			foreach (Entity alliedStash in GetAlliedStashes(entityManager, character))
			{
				((EntityManager)(ref entityManager)).TryGetBuffer<InventoryBuffer>(alliedStash, ref val);
				for (int i = 0; i < val.Length; i++)
				{
					InventoryBuffer val2 = val[i];
					if (!(val2.ItemType == itemGUID))
					{
						continue;
					}
					if (storedBlood.HasValue)
					{
						((EntityManager)(ref entityManager)).TryGetComponentData<StoredBlood>(val2.ItemEntity._Entity, ref val3);
						if (storedBlood.Value.BloodType != val3.BloodType || storedBlood.Value.BloodQuality != val3.BloodQuality)
						{
							continue;
						}
					}
					num += val2.Amount;
				}
				num2++;
			}
			if (num2 != 0)
			{
				return num;
			}
			return -1;
		}

		public static string GetItemName(PrefabGUID itemGUID, GameDataSystem gameDataSystem = null, EntityManager? entityManager = null, PrefabLookupMap? prefabLookupMap = null)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: 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_001a: 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_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: 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)
			//IL_006e: 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_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			if (itemGUID == PrefabGUID.Empty)
			{
				return string.Empty;
			}
			EntityManager valueOrDefault = entityManager.GetValueOrDefault();
			if (!entityManager.HasValue)
			{
				valueOrDefault = CurrentWorld.EntityManager;
				entityManager = valueOrDefault;
			}
			if (gameDataSystem == null)
			{
				gameDataSystem = CurrentWorld.GetExistingSystemManaged<GameDataSystem>();
			}
			PrefabLookupMap valueOrDefault2 = prefabLookupMap.GetValueOrDefault();
			if (!prefabLookupMap.HasValue)
			{
				valueOrDefault2 = ((PrefabCollectionSystem_Base)CurrentWorld.GetExistingSystemManaged<PrefabCollectionSystem>()).PrefabLookupMap;
				prefabLookupMap = valueOrDefault2;
			}
			try
			{
				AssetGuid val = GameplayHelper.TryGetItemName(gameDataSystem, entityManager.Value, prefabLookupMap.Value, itemGUID);
				if (Localization.HasKey(val))
				{
					return Localization.Get(val, true);
				}
			}
			catch (Exception)
			{
			}
			return $"[{itemGUID}]";
		}

		public static void SendMessage(Entity userEntity, string message, ServerChatMessageType messageType)
		{
			//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_0015: 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_001f: Unknown result type (might be due to invalid IL or missing references)
			if (VWorld.IsServer)
			{
				EntityManager entityManager = VWorld.Server.EntityManager;
				User val = default(User);
				((EntityManager)(ref entityManager)).TryGetComponentData<User>(userEntity, ref val);
				ServerChatUtils.SendSystemMessageToClient(entityManager, val, message);
			}
		}

		public static bool TryGetPrefabGUIDForItemName(GameDataSystem gameDataSystem, LocalizationKey itemName, out PrefabGUID prefabGUID)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			return TryGetPrefabGUIDForItemName(gameDataSystem, Localization.Get(itemName, true), out prefabGUID);
		}

		public static bool TryGetPrefabGUIDForItemName(GameDataSystem gameDataSystem, string itemName, out PrefabGUID prefabGUID)
		{
			//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_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: 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)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: 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)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			Enumerator<PrefabGUID, ItemData> enumerator = gameDataSystem.ItemHashLookupMap.GetEnumerator();
			while (enumerator.MoveNext())
			{
				KeyValue<PrefabGUID, ItemData> current = enumerator.Current;
				if (Localization.Get(gameDataSystem.ManagedDataRegistry.GetOrDefault<ManagedItemData>(current.Key, (ManagedItemData)null).Name, false) == itemName)
				{
					prefabGUID = current.Key;
					return true;
				}
			}
			prefabGUID = PrefabGUID.Empty;
			return false;
		}

		public static bool TryGiveItem(EntityManager entityManager, NativeParallelHashMap<PrefabGUID, ItemData>? itemDataMap, Entity recipient, PrefabGUID itemType, int amount, out int remainingitems, bool dropRemainder = false)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: 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_002c: 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_003a: 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_0043: 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_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//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_0062: 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_0020: 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)
			NativeParallelHashMap<PrefabGUID, ItemData> valueOrDefault = itemDataMap.GetValueOrDefault();
			if (!itemDataMap.HasValue)
			{
				valueOrDefault = CurrentWorld.GetExistingSystemManaged<GameDataSystem>().ItemHashLookupMap;
				itemDataMap = valueOrDefault;
			}
			AddItemResponse val = InventoryUtilitiesServer.TryAddItem(AddItemSettings.Create(entityManager, itemDataMap.Value, false, default(Entity), default(Nullable_Unboxed<int>), false, false, dropRemainder, default(Nullable_Unboxed<int>)), recipient, itemType, amount);
			remainingitems = val.RemainingAmount;
			return ((AddItemResponse)(ref val)).Success;
		}

		public static void ApplyBuff(Entity user, Entity character, PrefabGUID buffGUID)
		{
			//IL_0002: 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_0012: 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_0018: 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)
			FromCharacter fromCharacter = default(FromCharacter);
			fromCharacter.User = user;
			fromCharacter.Character = character;
			ApplyBuff(fromCharacter, buffGUID);
		}

		public static void ApplyBuff(FromCharacter fromCharacter, PrefabGUID buffGUID)
		{
			//IL_000c: 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_001a: 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_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)
			DebugEventsSystem existingSystemManaged = VWorld.Server.GetExistingSystemManaged<DebugEventsSystem>();
			ApplyBuffDebugEvent val = new ApplyBuffDebugEvent
			{
				BuffPrefabGUID = buffGUID
			};
			existingSystemManaged.ApplyBuff(fromCharacter, val);
		}

		public static void RemoveBuff(FromCharacter fromCharacter, PrefabGUID buffGUID)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//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)
			RemoveBuff(fromCharacter.Character, buffGUID);
		}

		public static void RemoveBuff(Entity charEntity, PrefabGUID buffGUID, EntityManager? entityManager = null)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: 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_001e: 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_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)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			EntityManager value = entityManager.GetValueOrDefault();
			if (!entityManager.HasValue)
			{
				value = CurrentWorld.EntityManager;
				entityManager = value;
			}
			if (BuffUtility.HasBuff(entityManager.Value, charEntity, PrefabIdentifier.op_Implicit(buffGUID)))
			{
				Entity val = default(Entity);
				BuffUtility.TryGetBuff(entityManager.Value, charEntity, PrefabIdentifier.op_Implicit(buffGUID), ref val);
				value = entityManager.Value;
				((EntityManager)(ref value)).AddComponent<DestroyTag>(val);
			}
		}

		public static string GetCharacterName(ulong platformId, EntityManager? entityManager = null)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: 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_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: 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_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: 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_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: 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_007b: Unknown result type (might be due to invalid IL or missing references)
			EntityManager value = entityManager.GetValueOrDefault();
			if (!entityManager.HasValue)
			{
				value = CurrentWorld.EntityManager;
				entityManager = value;
			}
			value = entityManager.Value;
			EntityQuery val = ((EntityManager)(ref value)).CreateEntityQuery((ComponentType[])(object)new ComponentType[1] { ComponentType.ReadOnly<User>() });
			Enumerator<Entity> enumerator = ((EntityQuery)(ref val)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2)).GetEnumerator();
			User val2 = default(User);
			while (enumerator.MoveNext())
			{
				Entity current = enumerator.Current;
				value = entityManager.Value;
				((EntityManager)(ref value)).TryGetComponentData<User>(current, ref val2);
				if (val2.PlatformId == platformId)
				{
					return ((object)(FixedString64Bytes)(ref val2.CharacterName)).ToString();
				}
			}
			return null;
		}

		public static AdminLevel GetAdminLevel(Entity userEntity, EntityManager? entityManager = null)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: 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_001e: 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_0039: Unknown result type (might be due to invalid IL or missing references)
			EntityManager value = entityManager.GetValueOrDefault();
			if (!entityManager.HasValue)
			{
				value = CurrentWorld.EntityManager;
				entityManager = value;
			}
			value = entityManager.Value;
			AdminUser val = default(AdminUser);
			if (((EntityManager)(ref value)).TryGetComponentData<AdminUser>(userEntity, ref val))
			{
				return val.Level;
			}
			return (AdminLevel)0;
		}

		public static void LogAllComponentTypes(Entity entity, EntityManager? entityManager = null)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//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_0015: 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_0041: Expected O, but got Unknown
			//IL_0024: 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_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: 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_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Expected O, but got Unknown
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Expected O, but got Unknown
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			if (entity == Entity.Null)
			{
				return;
			}
			EntityManager value = entityManager.GetValueOrDefault();
			if (!entityManager.HasValue)
			{
				value = CurrentWorld.EntityManager;
				entityManager = value;
			}
			ManualLogSource logger = Logger;
			bool flag = default(bool);
			BepInExMessageLogInterpolatedStringHandler val = new BepInExMessageLogInterpolatedStringHandler(3, 0, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("---");
			}
			logger.LogMessage(val);
			value = entityManager.Value;
			Enumerator<ComponentType> enumerator = ((EntityManager)(ref value)).GetComponentTypes(entity, (Allocator)2).GetEnumerator();
			while (enumerator.MoveNext())
			{
				ComponentType current = enumerator.Current;
				ManualLogSource logger2 = Logger;
				val = new BepInExMessageLogInterpolatedStringHandler(30, 3, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Component Type: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<ComponentType>(current);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" (Shared? ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<bool>(((ComponentType)(ref current)).IsSharedComponent);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(") | ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(((ComponentType)(ref current)).GetManagedType().FullName);
				}
				logger2.LogMessage(val);
			}
			ManualLogSource logger3 = Logger;
			val = new BepInExMessageLogInterpolatedStringHandler(3, 0, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("---");
			}
			logger3.LogMessage(val);
		}

		public static void LogAllComponentTypes(EntityQuery entityQuery)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			//IL_0033: 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_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Expected O, but got Unknown
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Expected O, but got Unknown
			Il2CppStructArray<ComponentType> queryTypes = ((EntityQuery)(ref entityQuery)).GetQueryTypes();
			ManualLogSource logger = Logger;
			bool flag = default(bool);
			BepInExMessageLogInterpolatedStringHandler val = new BepInExMessageLogInterpolatedStringHandler(3, 0, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("---");
			}
			logger.LogMessage(val);
			foreach (ComponentType item in (Il2CppArrayBase<ComponentType>)(object)queryTypes)
			{
				ManualLogSource logger2 = Logger;
				val = new BepInExMessageLogInterpolatedStringHandler(22, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Query Component Type: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<ComponentType>(item);
				}
				logger2.LogMessage(val);
			}
			ManualLogSource logger3 = Logger;
			val = new BepInExMessageLogInterpolatedStringHandler(3, 0, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("---");
			}
			logger3.LogMessage(val);
		}
	}
	public static class VModsVExtensionsOverride
	{
		public delegate void ActionRefVmod<T>(ref T item);

		public static void WithComponentDataVmod<T>(this Entity entity, ActionRefVmod<T> action) where T : struct
		{
			//IL_0005: 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_000d: 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_002b: Unknown result type (might be due to invalid IL or missing references)
			EntityManager entityManager = VWorld.Game.EntityManager;
			T item = default(T);
			((EntityManager)(ref entityManager)).TryGetComponentData<T>(entity, ref item);
			action(ref item);
			entityManager = VWorld.Game.EntityManager;
			((EntityManager)(ref entityManager)).SetComponentData<T>(entity, item);
		}

		public static void WithComponentDataVmodAOT<T>(this Entity entity, ActionRefVmod<T> action) where T : unmanaged
		{
			//IL_0005: 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_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_0026: Unknown result type (might be due to invalid IL or missing references)
			T item = VWorld.Game.EntityManager.GetComponentDataAOT<T>(entity);
			action(ref item);
			EntityManager entityManager = VWorld.Game.EntityManager;
			((EntityManager)(ref entityManager)).SetComponentData<T>(entity, item);
		}

		private static Type GetType<T>()
		{
			return Il2CppType.Of<T>();
		}

		public unsafe static T GetComponentDataAOT<T>(this EntityManager entityManager, Entity entity) where T : unmanaged
		{
			//IL_0005: 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_000d: 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)
			TypeIndex typeIndex = TypeManager.GetTypeIndex(GetType<T>());
			T* componentDataRawRW = (T*)((EntityManager)(ref entityManager)).GetComponentDataRawRW(entity, typeIndex);
			return *componentDataRawRW;
		}
	}
}
namespace VMods.BloodRefill
{
	public static class BloodRefillConfig
	{
		public static ConfigEntry<bool> BloodRefillEnabled { get; private set; }

		public static ConfigEntry<bool> BloodRefillCreatureEnabled { get; private set; }

		public static ConfigEntry<bool> BloodRefillWarriorEnabled { get; private set; }

		public static ConfigEntry<bool> BloodRefillRogueEnabled { get; private set; }

		public static ConfigEntry<bool> BloodRefillBruteEnabled { get; private set; }

		public static ConfigEntry<bool> BloodRefillScholarEnabled { get; private set; }

		public static ConfigEntry<bool> BloodRefillWorkerEnabled { get; private set; }

		public static ConfigEntry<bool> BloodRefillMutantEnabled { get; private set; }

		public static ConfigEntry<bool> BloodRefillVBloodEnabled { get; private set; }

		public static ConfigEntry<bool> BloodRefillDraculinEnabled { get; private set; }

		public static ConfigEntry<bool> BloodRefillGateBossEnabled { get; private set; }

		public static ConfigEntry<bool> BloodRefillDraculaTheImmortalEnabled { get; private set; }

		public static ConfigEntry<bool> BloodRefillRequiresFeeding { get; private set; }

		public static ConfigEntry<bool> BloodRefillRequiresSameBloodType { get; private set; }

		public static ConfigEntry<bool> BloodRefillExcludeVBloodFromSameBloodTypeCheck { get; private set; }

		public static ConfigEntry<float> BloodRefillDifferentBloodTypeMultiplier { get; private set; }

		public static ConfigEntry<int> BloodRefillVBloodRefillType { get; private set; }

		public static ConfigEntry<int> BloodRefillBloodRefillType { get; private set; }

		public static ConfigEntry<float> BloodRefillVBloodRefillMultiplier { get; private set; }

		public static ConfigEntry<bool> BloodRefillRandomRefill { get; private set; }

		public static ConfigEntry<float> BloodRefillAmount { get; private set; }

		public static ConfigEntry<float> BloodRefillMultiplier { get; private set; }

		public static ConfigEntry<bool> BloodRefillSendRefillMessage { get; private set; }

		public static ConfigEntry<float> BloodRefillBloodCutoffThreshold { get; private set; }

		public static ConfigEntry<float> BloodRefillVBloodCutoffThreshold { get; private set; }

		public static void Initialize(ConfigFile config)
		{
			BloodRefillEnabled = config.Bind<bool>("BloodRefillConfig", "BloodRefillEnabled", true, "Enabled/disable the blood refilling system.");
			BloodRefillRequiresFeeding = config.Bind<bool>("BloodRefillConfig", "BloodRefillRequiresFeeding", true, "When enabled, blood can only be refilled when feeding (i.e. when aborting the feed).");
			BloodRefillRequiresSameBloodType = config.Bind<bool>("BloodRefillConfig", "BloodRefillRequiresSameBloodType", true, "When enabled, blood can only be refilled when the target has the same blood type.");
			BloodRefillCreatureEnabled = config.Bind<bool>("BloodRefillConfig", "BloodRefillCreatureEnabled", true, "When enabled, creature blood can be refilled.");
			BloodRefillWarriorEnabled = config.Bind<bool>("BloodRefillConfig", "BloodRefillWarriorEnabled", true, "When enabled, warrior blood can be refilled.");
			BloodRefillRogueEnabled = config.Bind<bool>("BloodRefillConfig", "BloodRefillRogueEnabled", true, "When enabled, rogue blood can be refilled.");
			BloodRefillBruteEnabled = config.Bind<bool>("BloodRefillConfig", "BloodRefillBruteEnabled", true, "When enabled, brute blood can be refilled.");
			BloodRefillScholarEnabled = config.Bind<bool>("BloodRefillConfig", "BloodRefillScholarEnabled", true, "When enabled, scholar blood can be refilled.");
			BloodRefillScholarEnabled = config.Bind<bool>("BloodRefillConfig", "BloodRefillScholarEnabled", true, "When enabled, scholar blood can be refilled.");
			BloodRefillWorkerEnabled = config.Bind<bool>("BloodRefillConfig", "BloodRefillWorkerEnabled", true, "When enabled, worker blood can be refilled.");
			BloodRefillMutantEnabled = config.Bind<bool>("BloodRefillConfig", "BloodRefillMutantEnabled", true, "When enabled, mutant blood can be refilled.");
			BloodRefillVBloodEnabled = config.Bind<bool>("BloodRefillConfig", "BloodRefillVBloodEnabled", true, "When enabled, V-blood can be refilled.");
			BloodRefillDraculinEnabled = config.Bind<bool>("BloodRefillConfig", "BloodRefillDraculinEnabled", true, "When enabled, Draculin blood can be refilled.");
			BloodRefillGateBossEnabled = config.Bind<bool>("BloodRefillConfig", "BloodRefillGateBossEnabled", true, "When enabled, GateBoss blood can be refilled.");
			BloodRefillDraculaTheImmortalEnabled = config.Bind<bool>("BloodRefillConfig", "BloodRefillDraculaTheImmortalEnabled", true, "When enabled, DraculaTheImmortal blood can be refilled.");
			BloodRefillExcludeVBloodFromSameBloodTypeCheck = config.Bind<bool>("BloodRefillConfig", "BloodRefillExcludeVBloodFromSameBloodTypeCheck", true, "When enabled, V-blood is excluded from the 'same blood type' check (i.e. it's always considered to be 'the same blood type' as the player's blood type).");
			BloodRefillVBloodRefillType = config.Bind<int>("BloodRefillConfig", "BloodRefillVBloodRefillType", 3, "0 = disabled (i.e. normal refill); 1 = fully refill; 2 = refill based on V-blood monster level; 3 = refill based on V-blood monster level but not if the player is above BloodRefillVBloodCutoffThreshold % of blood quality. only works when BloodRefillVBloodEnabled is enabled.");
			BloodRefillBloodRefillType = config.Bind<int>("BloodRefillConfig", "BloodRefillBloodRefillType", 1, "0 = disabled (i.e. normal refill); 1 = normal refill but not if the player is above BloodRefillBloodCutoffThreshold % of blood quality.");
			BloodRefillBloodCutoffThreshold = config.Bind<float>("BloodRefillConfig", "BloodRefillBloodCutoffThreshold", 95f, "[Only applies when BloodRefillBloodRefillType is set to 1] The blood quality percentage cutoff threshold (i.e. if the player's blood quality is above this threshold, npc blood will not refill the player's blood).");
			BloodRefillVBloodCutoffThreshold = config.Bind<float>("BloodRefillConfig", "BloodRefillVBloodCutoffThreshold", 95f, "[Only applies when BloodRefillVBloodRefillType is set to 3] The blood quality percentage cutoff threshold (i.e. if the player's blood quality is above this threshold, V-blood will not refill the player's blood).");
			BloodRefillVBloodRefillMultiplier = config.Bind<float>("BloodRefillConfig", "BloodRefillVBloodRefillMultiplier", 0.1f, "[Only applies when BloodRefillVBloodRefillType is set to 2 or 3] The multiplier used in the V-blood refill calculation ('EnemyLevel' * 'BloodRefillVBloodRefillMultiplier' * 'BloodRefillMultiplier').");
			BloodRefillRandomRefill = config.Bind<bool>("BloodRefillConfig", "BloodRefillRandomRefill", true, "When enabled, the amount of refilled blood is randomized (between 1 and the calculated refillable amount).");
			BloodRefillAmount = config.Bind<float>("BloodRefillConfig", "BloodRefillAmount", 1f, "The maximum amount of blood to refill with no level difference, a matching blood type and quality (Expressed in Litres of blood).");
			BloodRefillMultiplier = config.Bind<float>("BloodRefillConfig", "BloodRefillMultiplier", 0.5f, "The multiplier used in the blood refill calculation. [Formula: (('Enemy Level' / 'Player Level') * ((100 - ('Player Blood Quality %' - 'Enemy Blood Quality %')) / 100)) * 'BloodRefillAmount' * '(If applicable) BloodRefillDifferentBloodTypeMultiplier' * 'BloodRefillMultiplier']");
			BloodRefillDifferentBloodTypeMultiplier = config.Bind<float>("BloodRefillConfig", "BloodRefillDifferentBloodTypeMultiplier", 0.1f, "The multiplier used in the blood refill calculation as a penalty for feeding on a different blood type (only works when BloodRefillRequiresSameBloodType is disabled).");
			BloodRefillSendRefillMessage = config.Bind<bool>("BloodRefillConfig", "BloodRefillSendRefillMessage", false, "When enabled, a refill chat message is sent to the player.");
		}
	}
	[BepInPlugin("VMods.BloodRefill", "VMods.BloodRefill", "2.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[Reloadable]
	public class Plugin : BasePlugin, IRunOnInitialized
	{
		private Harmony _hooks;

		public sealed override void Load()
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			if (!VWorld.IsServer)
			{
				ManualLogSource log = ((BasePlugin)this).Log;
				bool flag = default(bool);
				BepInExMessageLogInterpolatedStringHandler val = new BepInExMessageLogInterpolatedStringHandler(40, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("VMods.BloodRefill");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" only needs to be installed server side.");
				}
				log.LogMessage(val);
			}
			else
			{
				Utils.Initialize(((BasePlugin)this).Log, "VMods.BloodRefill");
				BloodRefillConfig.Initialize(((BasePlugin)this).Config);
			}
		}

		public void OnGameInitialized()
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Expected O, but got Unknown
			try
			{
				if (!VWorld.IsClient)
				{
					BloodRefillSystem.Initialize();
					_hooks = Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null);
					ManualLogSource log = ((BasePlugin)this).Log;
					bool flag = default(bool);
					BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(22, 2, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Plugin ");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("VMods.BloodRefill");
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" (v");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("2.0.0");
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral(") is loaded!");
					}
					log.LogInfo(val);
				}
			}
			catch (Exception ex)
			{
				((BasePlugin)this).Log.LogWarning((object)("An error occured:" + ex.Message));
			}
		}

		public sealed override bool Unload()
		{
			if (VWorld.IsClient)
			{
				return true;
			}
			SaveSystem.SaveAll();
			Harmony hooks = _hooks;
			if (hooks != null)
			{
				hooks.UnpatchSelf();
			}
			BloodRefillSystem.Deinitialize();
			((BasePlugin)this).Config.Clear();
			Utils.Deinitialize();
			return true;
		}
	}
	public static class BloodRefillSystem
	{
		public class BloodRefillData
		{
			public bool ShowRefillMessages { get; set; }
		}

		private const string BloodRefillFileName = "BloodRefill.json";

		private static Dictionary<ulong, BloodRefillData> _bloodRefills;

		public static void Initialize()
		{
			_bloodRefills = SaveSystem.Load("BloodRefill.json", () => new Dictionary<ulong, BloodRefillData>());
			SaveSystem.SaveEvent += Save;
			DeathHook.DeathEvent += OnDeath;
		}

		public static void Deinitialize()
		{
			DeathHook.DeathEvent -= OnDeath;
			SaveSystem.SaveEvent -= Save;
		}

		public static void Save()
		{
			SaveSystem.Save("BloodRefill.json", _bloodRefills);
		}

		private static void OnDeath(DeathEvent deathEvent)
		{
			//IL_0005: 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_000d: 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_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_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: 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_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: 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_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: 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_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02da: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0300: Unknown result type (might be due to invalid IL or missing references)
			//IL_0302: Unknown result type (might be due to invalid IL or missing references)
			//IL_0319: Unknown result type (might be due to invalid IL or missing references)
			//IL_0320: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_0436: Unknown result type (might be due to invalid IL or missing references)
			//IL_038b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0527: Unknown result type (might be due to invalid IL or missing references)
			//IL_0511: Unknown result type (might be due to invalid IL or missing references)
			//IL_0513: Unknown result type (might be due to invalid IL or missing references)
			//IL_047b: Unknown result type (might be due to invalid IL or missing references)
			//IL_047d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0487: Unknown result type (might be due to invalid IL or missing references)
			//IL_0498: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c0: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				EntityManager entityManager = VWorld.Server.EntityManager;
				PlayerCharacter val = default(PlayerCharacter);
				bool flag = ((EntityManager)(ref entityManager)).TryGetComponentData<PlayerCharacter>(deathEvent.Killer, ref val);
				Equipment val2 = default(Equipment);
				bool flag2 = ((EntityManager)(ref entityManager)).TryGetComponentData<Equipment>(deathEvent.Killer, ref val2);
				Blood val3 = default(Blood);
				bool flag3 = ((EntityManager)(ref entityManager)).TryGetComponentData<Blood>(deathEvent.Killer, ref val3);
				Movement val4 = default(Movement);
				bool flag4 = ((EntityManager)(ref entityManager)).TryGetComponentData<Movement>(deathEvent.Died, ref val4);
				UnitLevel val5 = default(UnitLevel);
				bool flag5 = ((EntityManager)(ref entityManager)).TryGetComponentData<UnitLevel>(deathEvent.Died, ref val5);
				BloodConsumeSource val6 = default(BloodConsumeSource);
				bool flag6 = ((EntityManager)(ref entityManager)).TryGetComponentData<BloodConsumeSource>(deathEvent.Died, ref val6);
				if (!BloodRefillConfig.BloodRefillEnabled.Value || !flag || !flag2 || !flag3 || !flag4 || !flag5 || !flag6)
				{
					return;
				}
				PlayerCharacter val7 = default(PlayerCharacter);
				((EntityManager)(ref entityManager)).TryGetComponentData<PlayerCharacter>(deathEvent.Killer, ref val7);
				Equipment val8 = default(Equipment);
				((EntityManager)(ref entityManager)).TryGetComponentData<Equipment>(deathEvent.Killer, ref val8);
				Blood val9 = default(Blood);
				((EntityManager)(ref entityManager)).TryGetComponentData<Blood>(deathEvent.Killer, ref val9);
				UnitLevel val10 = default(UnitLevel);
				((EntityManager)(ref entityManager)).TryGetComponentData<UnitLevel>(deathEvent.Died, ref val10);
				BloodConsumeSource val11 = default(BloodConsumeSource);
				((EntityManager)(ref entityManager)).TryGetComponentData<BloodConsumeSource>(deathEvent.Died, ref val11);
				Entity userEntity = val7.UserEntity;
				User val12 = default(User);
				((EntityManager)(ref entityManager)).TryGetComponentData<User>(userEntity, ref val12);
				bool flag7 = deathEvent.Source.Index == 0 || deathEvent.Killer.Index == deathEvent.Source.Index;
				if (!val9.BloodType.ParseBloodType(out var bloodType) || !val11.UnitBloodType._Value.ParseBloodType(out var bloodType2) || (!BloodRefillConfig.BloodRefillCreatureEnabled.Value && bloodType2 == BloodType.Creature) || (!BloodRefillConfig.BloodRefillWarriorEnabled.Value && bloodType2 == BloodType.Warrior) || (!BloodRefillConfig.BloodRefillRogueEnabled.Value && bloodType2 == BloodType.Rogue) || (!BloodRefillConfig.BloodRefillBruteEnabled.Value && bloodType2 == BloodType.Brute) || (!BloodRefillConfig.BloodRefillScholarEnabled.Value && bloodType2 == BloodType.Scholar) || (!BloodRefillConfig.BloodRefillWorkerEnabled.Value && bloodType2 == BloodType.Worker) || (!BloodRefillConfig.BloodRefillMutantEnabled.Value && bloodType2 == BloodType.Mutant) || (!BloodRefillConfig.BloodRefillVBloodEnabled.Value && bloodType2 == BloodType.VBlood) || (!BloodRefillConfig.BloodRefillDraculinEnabled.Value && bloodType2 == BloodType.Draculin) || (!BloodRefillConfig.BloodRefillGateBossEnabled.Value && bloodType2 == BloodType.GateBoss) || (!BloodRefillConfig.BloodRefillDraculaTheImmortalEnabled.Value && bloodType2 == BloodType.DraculaTheImmortal))
				{
					return;
				}
				bool flag8 = bloodType2 == BloodType.VBlood;
				if (!flag8 && BloodRefillConfig.BloodRefillRequiresFeeding.Value && !flag7)
				{
					return;
				}
				bool flag9 = bloodType == bloodType2 || (BloodRefillConfig.BloodRefillExcludeVBloodFromSameBloodTypeCheck.Value && flag8);
				if (BloodRefillConfig.BloodRefillRequiresSameBloodType.Value && !flag9)
				{
					return;
				}
				float num = (flag9 ? 1f : BloodRefillConfig.BloodRefillDifferentBloodTypeMultiplier.Value);
				float num2 = ModifiableFloat.op_Implicit(val8.WeaponLevel) + ModifiableFloat.op_Implicit(val8.ArmorLevel) + ModifiableFloat.op_Implicit(val8.SpellLevel);
				float num3 = ModifiableInt.op_Implicit(val10.Level);
				float num4 = num3 / num2;
				float num5 = (100f - (val9.Quality - val11.BloodQuality)) / 100f;
				float num6 = num4 * num5;
				float num7 = BloodRefillConfig.BloodRefillAmount.Value * 10f * num6;
				num7 *= num;
				if (BloodRefillConfig.BloodRefillRandomRefill.Value)
				{
					num7 = Random.RandomRange(1f, num7);
				}
				if (!flag8)
				{
					int value = BloodRefillConfig.BloodRefillBloodRefillType.Value;
					if (value != 0 && value == 1 && val9.Quality > BloodRefillConfig.BloodRefillBloodCutoffThreshold.Value)
					{
						return;
					}
				}
				else
				{
					switch (BloodRefillConfig.BloodRefillVBloodRefillType.Value)
					{
					case 1:
						num7 = ModifiableFloat.op_Implicit(val9.MaxBlood) - val9.Value;
						break;
					case 2:
						num7 = num3 * BloodRefillConfig.BloodRefillVBloodRefillMultiplier.Value;
						break;
					case 3:
						if (val9.Quality > BloodRefillConfig.BloodRefillVBloodCutoffThreshold.Value)
						{
							return;
						}
						num7 = num3 * BloodRefillConfig.BloodRefillVBloodRefillMultiplier.Value;
						break;
					}
				}
				num7 *= BloodRefillConfig.BloodRefillMultiplier.Value;
				BloodRefillData value2;
				bool flag10 = BloodRefillConfig.BloodRefillSendRefillMessage.Value && (!_bloodRefills.TryGetValue(val12.PlatformId, out value2) || value2.ShowRefillMessages);
				if (num7 > 0f)
				{
					int num8 = (int)Math.Ceiling(num7);
					if (num8 > 0)
					{
						if (flag10)
						{
							float num9 = Math.Min(ModifiableFloat.op_Implicit(val9.MaxBlood), val9.Value + (float)num8);
							float value3 = (float)(int)((num9 - val9.Value) * 10f) / 100f;
							float value4 = (float)(int)Math.Round(num9) / 10f;
							Utils.SendMessage(userEntity, $"+{value3}L Blood ({value4}L)", (ServerChatMessageType)7);
						}
						bloodType.ApplyToPlayer(val12, val9.Quality, num8);
						return;
					}
				}
				if (flag10)
				{
					Utils.SendMessage(userEntity, "No blood gained from the enemy.", (ServerChatMessageType)7);
				}
			}
			catch (Exception ex)
			{
				Utils.Logger.LogError((object)ex.Message);
			}
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "VMods.BloodRefill";

		public const string PLUGIN_NAME = "VMods.BloodRefill";

		public const string PLUGIN_VERSION = "2.0.0";
	}
}
namespace VMods.BloodRefill.Commands
{
	public class SaveSystem
	{
		public delegate void SaveEventHandler();

		private static string ConfigStoragePath = Paths.ConfigPath + "\\VMods\\Storage";

		private static readonly JsonSerializerOptions JsonOptions = new JsonSerializerOptions
		{
			WriteIndented = false,
			IncludeFields = false
		};

		public static event SaveEventHandler SaveEvent;

		private static void FireSaveEvent()
		{
			SaveSystem.SaveEvent?.Invoke();
		}

		public static void SaveAll()
		{
			FireSaveEvent();
		}

		public static void Save<T>(string filename, T data)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Expected O, but got Unknown
			try
			{
				File.WriteAllText(Path.Combine(ConfigStoragePath, filename), JsonSerializer.Serialize(data, JsonOptions));
			}
			catch (Exception ex)
			{
				ManualLogSource logger = Utils.Logger;
				bool flag = default(bool);
				BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(28, 3, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Failed to save ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(filename);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("! - Error: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ex.Message);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\r\n");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ex.StackTrace);
				}
				logger.LogError(val);
			}
		}

		public static T Load<T>(string filename, Func<T> getDefaultValue)
		{
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Expected O, but got Unknown
			try
			{
				if (!Directory.Exists(ConfigStoragePath))
				{
					Directory.CreateDirectory(ConfigStoragePath);
				}
				string path = Path.Combine(ConfigStoragePath, filename);
				if (!File.Exists(path))
				{
					return getDefaultValue();
				}
				return JsonSerializer.Deserialize<T>(File.ReadAllText(path));
			}
			catch (Exception ex)
			{
				ManualLogSource logger = Utils.Logger;
				bool flag = default(bool);
				BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(28, 3, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Failed to load ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(filename);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("! - Error: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ex.Message);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\r\n");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ex.StackTrace);
				}
				logger.LogError(val);
				return getDefaultValue();
			}
		}
	}
}