Decompiled source of CasualAmmo v1.0.13

BepInEx\plugins\CasualAmmo\CasualAmmo.dll

Decompiled 3 weeks ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using Gear;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Player;
using SNetwork;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("CasualAmmo")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+09d2c2ea46df3a13308590212e56ee5e753f33be")]
[assembly: AssemblyProduct("CasualAmmo")]
[assembly: AssemblyTitle("CasualAmmo")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[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 CasualAmmo
{
	[BepInPlugin("com.privatecoop.gtfo.casualammo", "Casual Ammo", "1.0.13")]
	public sealed class Plugin : BasePlugin
	{
		public const string PluginGuid = "com.privatecoop.gtfo.casualammo";

		public const string PluginName = "Casual Ammo";

		public const string PluginVersion = "1.0.13";

		private static readonly Harmony Harmony = new Harmony("com.privatecoop.gtfo.casualammo");

		internal static ManualLogSource Logger = null;

		internal static ConfigEntry<bool> EnableMod = null;

		internal static ConfigEntry<AmmoRestoreMode> RestoreMode = null;

		internal static ConfigEntry<float> RestoreMultiplier = null;

		internal static ConfigEntry<float> MunitionPackCharges = null;

		internal static ConfigEntry<bool> InfiniteReserveAmmo = null;

		internal static ConfigEntry<bool> PrivateLobbyWarning = null;

		internal static bool IsEnabled => EnableMod?.Value ?? false;

		internal static float DesiredPackPercent => Math.Clamp(MunitionPackCharges.Value, 0f, 100f);

		public override void Load()
		{
			Logger = ((BasePlugin)this).Log;
			BindConfig();
			LogStartupConfiguration();
			if (!EnableMod.Value)
			{
				Logger.LogInfo((object)"EnableMod is false; Casual Ammo patches were not applied.");
				return;
			}
			Harmony.PatchAll(typeof(Plugin).Assembly);
			Logger.LogInfo((object)"Harmony patches applied.");
		}

		public override bool Unload()
		{
			Harmony.UnpatchSelf();
			return true;
		}

		private void BindConfig()
		{
			EnableMod = ((BasePlugin)this).Config.Bind<bool>("General", "EnableMod", true, "Enables or disables all Casual Ammo changes.");
			RestoreMode = ((BasePlugin)this).Config.Bind<AmmoRestoreMode>("Ammo Restore", "AmmoRestoreMode", AmmoRestoreMode.FullRestore, "FullRestore, Multiplier, or Disabled.");
			RestoreMultiplier = ((BasePlugin)this).Config.Bind<float>("Ammo Restore", "RestoreMultiplier", 10f, "Multiplier applied to munitions pack ammo restore when AmmoRestoreMode is Multiplier.");
			MunitionPackCharges = ((BasePlugin)this).Config.Bind<float>("Munitions Packs", "MunitionPackCharges", 999f, "Minimum ammo capacity shown/stored on weapon munitions packs.");
			InfiniteReserveAmmo = ((BasePlugin)this).Config.Bind<bool>("Reserve Ammo", "InfiniteReserveAmmo", false, "When enabled, weapon reserve ammo storage is refilled to a very high cap after setup.");
			PrivateLobbyWarning = ((BasePlugin)this).Config.Bind<bool>("Safety", "PrivateLobbyWarning", true, "Logs a private-lobby-only warning on startup.");
		}

		private static void LogStartupConfiguration()
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Expected O, but got Unknown
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Expected O, but got Unknown
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Expected O, but got Unknown
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Expected O, but got Unknown
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Expected O, but got Unknown
			if (PrivateLobbyWarning.Value)
			{
				Logger.LogWarning((object)"Casual Ammo is intended for private cooperative lobbies only. Do not use it in public matchmaking.");
			}
			ManualLogSource logger = Logger;
			bool flag = default(bool);
			BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(12, 1, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("EnableMod = ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<bool>(EnableMod.Value);
			}
			logger.LogInfo(val);
			ManualLogSource logger2 = Logger;
			val = new BepInExInfoLogInterpolatedStringHandler(18, 1, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("AmmoRestoreMode = ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<AmmoRestoreMode>(RestoreMode.Value);
			}
			logger2.LogInfo(val);
			ManualLogSource logger3 = Logger;
			val = new BepInExInfoLogInterpolatedStringHandler(20, 1, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("RestoreMultiplier = ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(RestoreMultiplier.Value);
			}
			logger3.LogInfo(val);
			ManualLogSource logger4 = Logger;
			val = new BepInExInfoLogInterpolatedStringHandler(49, 2, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("MunitionPackCharges = ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(MunitionPackCharges.Value);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" (resolved pack percent = ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(DesiredPackPercent);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral(")");
			}
			logger4.LogInfo(val);
			ManualLogSource logger5 = Logger;
			val = new BepInExInfoLogInterpolatedStringHandler(22, 1, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("InfiniteReserveAmmo = ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<bool>(InfiniteReserveAmmo.Value);
			}
			logger5.LogInfo(val);
			if (EnableMod.Value)
			{
				Logger.LogInfo((object)"Patch plan: PlayerAgent.GiveAmmoRel adjusts standard/special weapon ammo restore only; class/tool ammo is left unchanged.");
				Logger.LogInfo((object)"Patch plan: ResourcePackPickup.OnInteractionPickUp logs and tops up weapon munitions packs on pickup.");
				Logger.LogInfo((object)"Patch plan: ResourcePackPickup.UpdateAmmo keeps weapon munitions packs stocked.");
				Logger.LogInfo((object)"Patch plan: ResourcePackFirstPerson.OnWield/ApplyPack tops up the equipped weapon munitions pack.");
				Logger.LogInfo((object)"Patch plan: ResourcePackFirstPerson.ApplyPack is replaced for weapon munitions packs to grant ammo without consuming the pack.");
				Logger.LogInfo((object)"Patch plan: PUI_Inventory.SetSlotAmmo keeps the resource-pack HUD display at the configured pack percent only while a weapon munitions pack is equipped.");
				Logger.LogInfo((object)"Patch plan: PlayerAmmoStorage.UpdateAmmoInPack and InventorySlotAmmo.AddAmmo force positive standard/special weapon ammo additions to full.");
				Logger.LogInfo((object)"Patch plan: PlayerAmmoStorage.SetupAmmoType only changes reserves when InfiniteReserveAmmo is true.");
			}
		}

		internal static bool IsWeaponAmmoPack(ResourcePackPickup pack)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Invalid comparison between Unknown and I4
			if ((Object)(object)pack != (Object)null)
			{
				return (int)pack.m_packType == 1;
			}
			return false;
		}

		internal static bool IsWeaponAmmo(AmmoType type)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Invalid comparison between Unknown and I4
			if ((int)type <= 1)
			{
				return true;
			}
			return false;
		}
	}
	public enum AmmoRestoreMode
	{
		FullRestore,
		Multiplier,
		Disabled
	}
	[HarmonyPatch(typeof(PlayerAgent), "GiveAmmoRel")]
	internal static class PlayerAgentGiveAmmoRelPatch
	{
		private static void Prefix(ref float ammoStandardRel, ref float ammoSpecialRel, ref float ammoClassRel)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Expected O, but got Unknown
			if (!Plugin.IsEnabled || Plugin.RestoreMode.Value == AmmoRestoreMode.Disabled)
			{
				return;
			}
			bool flag = default(bool);
			switch (Plugin.RestoreMode.Value)
			{
			case AmmoRestoreMode.FullRestore:
			{
				ManualLogSource logger2 = Plugin.Logger;
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(85, 3, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Casual Ammo GiveAmmoRel hook: restore standard/special ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(ammoStandardRel, "0.###");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("/");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(ammoSpecialRel, "0.###");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" -> 1/1; class/tool remains ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(ammoClassRel, "0.###");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(".");
				}
				logger2.LogWarning(val);
				if (ammoStandardRel > 0f)
				{
					ammoStandardRel = 1f;
				}
				if (ammoSpecialRel > 0f)
				{
					ammoSpecialRel = 1f;
				}
				break;
			}
			case AmmoRestoreMode.Multiplier:
			{
				float num = Math.Max(0f, Plugin.RestoreMultiplier.Value);
				ManualLogSource logger = Plugin.Logger;
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(81, 4, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Casual Ammo GiveAmmoRel hook: restore standard/special ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(ammoStandardRel, "0.###");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("/");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(ammoSpecialRel, "0.###");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" x ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(num, "0.###");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("; class/tool remains ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(ammoClassRel, "0.###");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(".");
				}
				logger.LogWarning(val);
				if (ammoStandardRel > 0f)
				{
					ammoStandardRel *= num;
				}
				if (ammoSpecialRel > 0f)
				{
					ammoSpecialRel *= num;
				}
				break;
			}
			}
		}
	}
	[HarmonyPatch]
	internal static class ResourcePackPickupOnInteractionPickUpPatch
	{
		private static MethodBase TargetMethod()
		{
			return AccessTools.Method(typeof(ResourcePackPickup), "OnInteractionPickUp", new Type[1] { typeof(PlayerAgent) }, (Type[])null);
		}

		private static void Prefix(ResourcePackPickup __instance, PlayerAgent player)
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Expected O, but got Unknown
			//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_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Invalid comparison between Unknown and I4
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: Expected O, but got Unknown
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Expected O, but got Unknown
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			if (!Plugin.IsEnabled || (Object)(object)__instance == (Object)null)
			{
				return;
			}
			eResourceContainerSpawnType packType = __instance.m_packType;
			float num = -1f;
			bool flag = default(bool);
			try
			{
				num = ((Item)__instance).Get_pItemData().custom.ammo;
			}
			catch (Exception ex)
			{
				ManualLogSource logger = Plugin.Logger;
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(68, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Ammo pack pickup detected, but current pack ammo could not be read: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ex.Message);
				}
				logger.LogWarning(val);
			}
			if ((int)packType == 1)
			{
				float num2 = Math.Max(num, Plugin.DesiredPackPercent);
				__instance.UpdateAmmo(num2);
				ManualLogSource logger2 = Plugin.Logger;
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(77, 3, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Casual Ammo pickup hook: weapon munitions pack picked up by ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(GetPlayerLabel(player));
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(". Pack ammo ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(num, "0.##");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" -> ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(num2, "0.##");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(".");
				}
				logger2.LogWarning(val);
			}
			else
			{
				ManualLogSource logger3 = Plugin.Logger;
				BepInExInfoLogInterpolatedStringHandler val2 = new BepInExInfoLogInterpolatedStringHandler(78, 3, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Casual Ammo pickup hook: non-weapon resource pack picked up by ");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(GetPlayerLabel(player));
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(". Type=");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<eResourceContainerSpawnType>(packType);
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(", ammo=");
					((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<float>(num, "0.##");
					((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(".");
				}
				logger3.LogInfo(val2);
			}
		}

		private static string GetPlayerLabel(PlayerAgent player)
		{
			if ((Object)(object)player == (Object)null)
			{
				return "unknown player";
			}
			try
			{
				SNet_Player owner = player.Owner;
				return ((owner != null) ? owner.NickName : null) ?? "unknown player";
			}
			catch
			{
				return "unknown player";
			}
		}
	}
	[HarmonyPatch(typeof(ResourcePackFirstPerson), "OnWield")]
	internal static class ResourcePackFirstPersonOnWieldPatch
	{
		private static void Postfix(ResourcePackFirstPerson __instance)
		{
			ResourcePackHudState.UpdateEquippedPack(__instance);
			EquippedResourcePackAmmo.TryTopUp(__instance, "OnWield", forceWrite: true);
		}
	}
	[HarmonyPatch]
	internal static class ResourcePackFirstPersonApplyPackPatch
	{
		private static MethodBase TargetMethod()
		{
			return AccessTools.Method(typeof(ResourcePackFirstPerson), "ApplyPack", (Type[])null, (Type[])null);
		}

		private static bool Prefix(ResourcePackFirstPerson __instance)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Invalid comparison between Unknown and I4
			EquippedResourcePackAmmo.TryTopUp(__instance, "ApplyPack prefix", forceWrite: true);
			if (!Plugin.IsEnabled || (Object)(object)__instance == (Object)null || (int)__instance.m_packType != 1)
			{
				return true;
			}
			iResourcePackReceiver val = __instance.m_actionReceiver ?? __instance.m_lastActionReceiver;
			if (val == null)
			{
				Plugin.Logger.LogWarning((object)"Casual Ammo non-consuming ApplyPack: no action receiver found; allowing original ApplyPack.");
				return true;
			}
			PlayerAgent owner = ((Item)__instance).Owner;
			Plugin.Logger.LogWarning((object)"Casual Ammo non-consuming ApplyPack: granting full standard/special ammo through the resource receiver and skipping original pack consumption.");
			val.GiveAmmoRel(owner, 1f, 1f, 0f);
			EquippedResourcePackAmmo.TryTopUp(__instance, "ApplyPack manual grant", forceWrite: true);
			return false;
		}

		private static void Postfix(ResourcePackFirstPerson __instance)
		{
			EquippedResourcePackAmmo.TryTopUp(__instance, "ApplyPack postfix", forceWrite: true);
		}
	}
	internal static class EquippedResourcePackAmmo
	{
		internal static void TryTopUp(ResourcePackFirstPerson pack, string reason, bool forceWrite = false)
		{
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Expected O, but got Unknown
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Invalid comparison between Unknown and I4
			//IL_001c: 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_0045: 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_0060: Expected O, but got Unknown
			if (!Plugin.IsEnabled || (Object)(object)pack == (Object)null || (int)pack.m_packType != 1)
			{
				return;
			}
			bool flag = default(bool);
			try
			{
				pItemData_Custom customData = ((Item)pack).GetCustomData();
				float ammo = customData.ammo;
				float num = Math.Max(ammo, Plugin.DesiredPackPercent);
				if (forceWrite || num > ammo)
				{
					customData.ammo = num;
					((Item)pack).SetCustomData(customData, true);
				}
				if (ammo < num)
				{
					ManualLogSource logger = Plugin.Logger;
					BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(67, 3, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Casual Ammo equipped pack hook (");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(reason);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("): weapon munitions pack ammo ");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(ammo, "0.##");
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" -> ");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(num, "0.##");
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral(".");
					}
					logger.LogWarning(val);
				}
			}
			catch (Exception ex)
			{
				ManualLogSource logger2 = Plugin.Logger;
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(42, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Casual Ammo equipped pack hook (");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(reason);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(") failed: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ex.Message);
				}
				logger2.LogWarning(val);
			}
		}
	}
	internal static class ResourcePackHudState
	{
		internal static bool EquippedPackIsWeaponAmmo { get; private set; }

		internal static void UpdateEquippedPack(ResourcePackFirstPerson pack)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Invalid comparison between Unknown and I4
			EquippedPackIsWeaponAmmo = Plugin.IsEnabled && (Object)(object)pack != (Object)null && (int)pack.m_packType == 1;
		}
	}
	[HarmonyPatch(typeof(ResourcePackPickup), "UpdateAmmo")]
	internal static class ResourcePackPickupUpdateAmmoPatch
	{
		private static void Prefix(ResourcePackPickup __instance, ref float ammo)
		{
			if (Plugin.IsEnabled && Plugin.IsWeaponAmmoPack(__instance))
			{
				ammo = Math.Max(ammo, Plugin.DesiredPackPercent);
			}
		}
	}
	[HarmonyPatch(typeof(PUI_Inventory), "SetSlotAmmo")]
	internal static class PuiInventorySetSlotAmmoPatch
	{
		private static void Prefix(InventorySlot slot, ref int clipAbs, ref int inPackAbs, ref float inPackRel)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Invalid comparison between Unknown and I4
			if (Plugin.IsEnabled && (int)slot == 4 && ResourcePackHudState.EquippedPackIsWeaponAmmo)
			{
				float desiredPackPercent = Plugin.DesiredPackPercent;
				inPackAbs = Math.Max(inPackAbs, (int)Math.Round(desiredPackPercent));
				inPackRel = Math.Max(inPackRel, desiredPackPercent / 100f);
			}
		}
	}
	[HarmonyPatch(typeof(PlayerAmmoStorage), "SetupAmmoType")]
	internal static class PlayerAmmoStorageSetupAmmoTypePatch
	{
		private const float ReserveCap = 999f;

		private static void Postfix(PlayerAmmoStorage __instance, AmmoType type)
		{
			//IL_0013: 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)
			if (Plugin.IsEnabled && Plugin.InfiniteReserveAmmo.Value && Plugin.IsWeaponAmmo(type))
			{
				InventorySlotAmmo inventorySlotAmmo = __instance.GetInventorySlotAmmo(type);
				if (inventorySlotAmmo != null)
				{
					inventorySlotAmmo.AmmoMaxCap = Math.Max(inventorySlotAmmo.AmmoMaxCap, 999f);
					inventorySlotAmmo.AmmoInPack = inventorySlotAmmo.AmmoMaxCap;
					__instance.UpdateSlotAmmoUI(inventorySlotAmmo, 0);
				}
			}
		}
	}
	[HarmonyPatch(typeof(PlayerAmmoStorage), "UpdateAmmoInPack")]
	internal static class PlayerAmmoStorageUpdateAmmoInPackPatch
	{
		private static void Prefix(PlayerAmmoStorage __instance, AmmoType ammoType, ref float delta)
		{
			//IL_0000: 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_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			if (ShouldForceFull(ammoType, delta))
			{
				float num = SafeGetAmmo(__instance, ammoType);
				delta = 1f;
				ManualLogSource logger = Plugin.Logger;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(97, 3, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Casual Ammo storage hook: UpdateAmmoInPack(");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<AmmoType>(ammoType);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(") positive delta detected. Before=");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(num, "0.###");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(", forcing delta to ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(delta, "0.###");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(".");
				}
				logger.LogWarning(val);
			}
		}

		private static void Postfix(PlayerAmmoStorage __instance, AmmoType ammoType, float delta)
		{
			//IL_0000: 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)
			if (ShouldForceFull(ammoType, delta))
			{
				ForceStorageFull(__instance, ammoType, "UpdateAmmoInPack");
			}
		}

		private static bool ShouldForceFull(AmmoType ammoType, float delta)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			if (Plugin.IsEnabled && Plugin.RestoreMode.Value == AmmoRestoreMode.FullRestore && Plugin.IsWeaponAmmo(ammoType))
			{
				return delta > 0f;
			}
			return false;
		}

		private static float SafeGetAmmo(PlayerAmmoStorage storage, AmmoType ammoType)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				return storage.GetAmmoInPack(ammoType);
			}
			catch
			{
				return -1f;
			}
		}

		internal static void ForceStorageFull(PlayerAmmoStorage storage, AmmoType ammoType, string reason)
		{
			//IL_0001: 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_0129: Expected O, but got Unknown
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Expected O, but got Unknown
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: 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)
			bool flag = default(bool);
			try
			{
				InventorySlotAmmo inventorySlotAmmo = storage.GetInventorySlotAmmo(ammoType);
				BepInExWarningLogInterpolatedStringHandler val;
				if (inventorySlotAmmo == null)
				{
					ManualLogSource logger = Plugin.Logger;
					val = new BepInExWarningLogInterpolatedStringHandler(53, 2, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Casual Ammo storage hook (");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(reason);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("): no slot ammo found for ");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<AmmoType>(ammoType);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral(".");
					}
					logger.LogWarning(val);
					return;
				}
				float ammoInPack = inventorySlotAmmo.AmmoInPack;
				inventorySlotAmmo.AmmoInPack = Math.Max(inventorySlotAmmo.AmmoInPack, inventorySlotAmmo.AmmoMaxCap);
				storage.UpdateSlotAmmoUI(inventorySlotAmmo, 0);
				ManualLogSource logger2 = Plugin.Logger;
				val = new BepInExWarningLogInterpolatedStringHandler(47, 5, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Casual Ammo storage hook (");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(reason);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("): ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<AmmoType>(ammoType);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" ammo ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(ammoInPack, "0.###");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" -> ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(inventorySlotAmmo.AmmoInPack, "0.###");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" / cap ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(inventorySlotAmmo.AmmoMaxCap, "0.###");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(".");
				}
				logger2.LogWarning(val);
			}
			catch (Exception ex)
			{
				ManualLogSource logger3 = Plugin.Logger;
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(41, 3, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Casual Ammo storage hook (");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(reason);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(") failed for ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<AmmoType>(ammoType);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(": ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ex.Message);
				}
				logger3.LogWarning(val);
			}
		}
	}
	[HarmonyPatch(typeof(InventorySlotAmmo), "AddAmmo")]
	internal static class InventorySlotAmmoAddAmmoPatch
	{
		private static void Postfix(InventorySlotAmmo __instance, float ammoAmount)
		{
			//IL_0017: 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_005a: Expected O, but got Unknown
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			if (Plugin.IsEnabled && Plugin.RestoreMode.Value == AmmoRestoreMode.FullRestore && __instance != null && Plugin.IsWeaponAmmo(__instance.AmmoType) && !(ammoAmount <= 0f))
			{
				float ammoInPack = __instance.AmmoInPack;
				__instance.AmmoInPack = Math.Max(__instance.AmmoInPack, __instance.AmmoMaxCap);
				ManualLogSource logger = Plugin.Logger;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(54, 5, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Casual Ammo slot hook: AddAmmo(");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<AmmoType>(__instance.AmmoType);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(", ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(ammoAmount, "0.###");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(") forced ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(ammoInPack, "0.###");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" -> ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(__instance.AmmoInPack, "0.###");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" / cap ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<float>(__instance.AmmoMaxCap, "0.###");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(".");
				}
				logger.LogWarning(val);
			}
		}
	}
}