Decompiled source of PVP Mod v1.2.0

plugins/PVPMod.dll

Decompiled 2 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using HG.Reflection;
using HarmonyLib;
using IL.RoR2;
using Microsoft.CodeAnalysis;
using Mono.Cecil;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.RoR2;
using R2API;
using R2API.Networking;
using R2API.Networking.Interfaces;
using R2API.Utils;
using RiskOfOptions;
using RiskOfOptions.Options;
using RoR2;
using RoR2.ContentManagement;
using RoR2.ExpansionManagement;
using TMPro;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: OptIn]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("PVPMod")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+f44dff5d1956c703c2531653a260287999688725")]
[assembly: AssemblyProduct("PVPMod")]
[assembly: AssemblyTitle("PVPMod")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace PVPMod
{
	[Serializable]
	[BepInPlugin("com.brynzananas.pvpmod", "PVP mod", "1.2.0")]
	[BepInDependency("com.bepis.r2api", "5.1.7")]
	[BepInDependency("com.bepis.r2api.teams", "1.0.1")]
	[BepInDependency("com.bepis.r2api.networking", "1.0.2")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
	public class PVPModPlugin : BaseUnityPlugin
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static Action<ItemDef> <0>__StrongerDeathMarkEvents;

			public static Action<ItemDef> <1>__IncreaseDamageByShieldAndReduceShieldRechargeTimeEvents;

			public static Action<ItemDef> <2>__AddVenomOnHitUnderQuestionableConditionsEvents;

			public static CustomDotDamageEvaluation <3>__VenomDamageEvaluation;

			public static EventHandler <4>__PVPItemRewardTier1Weight_SettingChanged;

			public static Action<TeleporterInteraction> <5>__TeleporterInteraction_onTeleporterChargedGlobal;

			public static Action<Stage> <6>__Stage_onServerStageBegin;

			public static Action<TeamComponent, TeamIndex> <7>__TeamComponent_onJoinTeamGlobal;

			public static Action<TeamComponent, TeamIndex> <8>__TeamComponent_onLeaveTeamGlobal;

			public static Action<DamageReport> <9>__GlobalEventManager_onCharacterDeathGlobal;

			public static hook_SetTeamExperience <10>__TeamManager_SetTeamExperience;

			public static Action <11>__InitLanguageTokens;

			public static EventHandler <12>__StrongerDeathMarkMinimumDebuffsToTrigger_SettingChanged;
		}

		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static CollectContentPackProvidersDelegate <>9__98_0;

			public static Func<Instruction, bool> <>9__114_3;

			public static Func<Instruction, bool> <>9__114_4;

			public static Func<Instruction, bool> <>9__114_5;

			public static Func<Instruction, bool> <>9__114_6;

			public static Func<Instruction, bool> <>9__116_2;

			public static Func<Instruction, bool> <>9__116_3;

			public static Func<Instruction, bool> <>9__116_4;

			public static Func<Instruction, bool> <>9__116_5;

			internal void <Awake>b__98_0(AddContentPackProviderDelegate addContentPackProvider)
			{
				addContentPackProvider.Invoke((IContentPackProvider)(object)new PVPModContentPack());
			}

			internal bool <StrongerDeathMarkEvents>b__114_3(Instruction x)
			{
				return ILPatternMatchingExt.MatchLdarg(x, 0);
			}

			internal bool <StrongerDeathMarkEvents>b__114_4(Instruction x)
			{
				return ILPatternMatchingExt.MatchLdfld<HealthComponent>(x, "body");
			}

			internal bool <StrongerDeathMarkEvents>b__114_5(Instruction x)
			{
				return ILPatternMatchingExt.MatchLdsfld(x, typeof(Buffs), "DeathMark");
			}

			internal bool <StrongerDeathMarkEvents>b__114_6(Instruction x)
			{
				return ILPatternMatchingExt.MatchCallvirt<CharacterBody>(x, "HasBuff");
			}

			internal bool <IncreaseDamageByShieldAndReduceShieldRechargeTimeEvents>b__116_2(Instruction x)
			{
				return ILPatternMatchingExt.MatchLdarg(x, 0);
			}

			internal bool <IncreaseDamageByShieldAndReduceShieldRechargeTimeEvents>b__116_3(Instruction x)
			{
				return ILPatternMatchingExt.MatchLdfld<HealthComponent>(x, "body");
			}

			internal bool <IncreaseDamageByShieldAndReduceShieldRechargeTimeEvents>b__116_4(Instruction x)
			{
				return ILPatternMatchingExt.MatchLdsfld(x, typeof(Buffs), "DeathMark");
			}

			internal bool <IncreaseDamageByShieldAndReduceShieldRechargeTimeEvents>b__116_5(Instruction x)
			{
				return ILPatternMatchingExt.MatchCallvirt<CharacterBody>(x, "HasBuff");
			}
		}

		public const string ModGuid = "com.brynzananas.pvpmod";

		public const string ModName = "PVP mod";

		public const string ModVer = "1.2.0";

		public static List<TeamIndex> playerTeamIndeces = new List<TeamIndex>();

		public static List<TeamDef> playerTeamDefs = new List<TeamDef>();

		public static List<CharacterBody> activePVPBodies = new List<CharacterBody>();

		private static int _extraPlayerTeamsCount;

		public static DotIndex VenomDotIndex;

		public static DotDef VenomDot;

		public static List<ConfigEntryBase> configs = new List<ConfigEntryBase>();

		public static ConfigEntry<bool> EnablePVP;

		public static ConfigEntry<bool> EnableContent;

		public static ConfigEntry<float> PVPCountdownTimer;

		public static ConfigEntry<int> PVPItemRewardAmount;

		public static ConfigEntry<float> PVPItemRewardTier1Weight;

		public static ConfigEntry<float> PVPItemRewardTier2Weight;

		public static ConfigEntry<float> PVPItemRewardTier3Weight;

		public static ConfigEntry<float> PVPItemRewardBossWeight;

		public static ConfigEntry<float> PVPItemRewardEquipmentWeight;

		public static ConfigEntry<float> PVPItemRewardLunarItemWeight;

		public static ConfigEntry<float> PVPItemRewardLunarEquipmentWeight;

		public static ConfigEntry<float> PVPItemRewardLunarCombinedWeight;

		public static ConfigEntry<float> PVPItemRewardTier1VoidWeight;

		public static ConfigEntry<float> PVPItemRewardTier2VoidWeight;

		public static ConfigEntry<float> PVPItemRewardTier3VoidWeight;

		public static ConfigEntry<float> PVPItemRewardBossVoidWeight;

		public static ConfigEntry<int> PVPLoserLoseItemsAmount;

		public static ConfigEntry<ItemTier> PVPLoserLoseItemsRarity;

		public static ConfigEntry<int> PVPLoserSpinelAfflictionsAmount;

		public static ConfigEntry<int> StrongerDeathMarkMinimumDebuffsToTrigger;

		public static ConfigEntry<bool> StrongerDeathMarkCountDebuffStacks;

		public static ConfigEntry<float> StrongerDeathMarkDebuffDuration;

		public static ConfigEntry<float> StrongerDeathMarkDebuffDurationPerStack;

		public static ConfigEntry<float> StrongerDeathMarkDebuffDamageIncrease;

		public static ConfigEntry<float> StrongerDeathMarkDebuffDamageIncreasePerStack;

		public static ConfigEntry<float> IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldToDamageMultiplier;

		public static ConfigEntry<float> IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldToDamageMultiplierPerStack;

		public static ConfigEntry<float> IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldRegenSpeedIncrease;

		public static ConfigEntry<float> IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldRegenSpeedIncreasePerStack;

		public static ConfigEntry<bool> AddVenomOnHitUnderQuestionableConditionsTranscendenceCondition;

		public static ConfigEntry<bool> AddVenomOnHitUnderQuestionableConditionsWingsCondition;

		public static ConfigEntry<float> AddVenomOnHitUnderQuestionableConditionsVenomDuration;

		public static ConfigEntry<float> AddVenomOnHitUnderQuestionableConditionsVenomDurationPerStack;

		public static ConfigEntry<float> AddVenomOnHitUnderQuestionableConditionsVenomVictimDamageMultiplier;

		public static ConfigEntry<float> AddVenomOnHitUnderQuestionableConditionsVenomVictimDamageMultiplierPerStack;

		public static ConfigEntry<bool> AddVenomOnHitUnderQuestionableConditionsVenomVictimDamageStack;

		public static ConfigEntry<float> AddVenomOnHitUnderQuestionableConditionsVenomAttackerShieldRecharge;

		public static ConfigEntry<float> AddVenomOnHitUnderQuestionableConditionsVenomAttackerShieldRechargePerStack;

		public static ConfigEntry<bool> AddVenomOnHitUnderQuestionableConditionsVenomAttackerShieldRechargeStack;

		public static ConfigEntry<bool> AddVenomOnHitUnderQuestionableConditionsVenomHemorrageStack;

		public static ConfigEntry<float> AddVenomOnHitUnderQuestionableConditionsVenomHemorrageDuration;

		public static ConfigEntry<float> AddVenomOnHitUnderQuestionableConditionsVenomHemorrageDamageMultiplier;

		public static BasicPickupDropTable PVPItemReward;

		public static ExpansionDef DLC1Expansion;

		public static bool pvpEnabled;

		private static bool hooksSet;

		private static bool thisIsStupid;

		public static bool startingPVP = false;

		public static float startingStopwatch;

		public static GameObject PVPCountdownPrefab;

		public static List<PlayerCharacterMasterController> losers = new List<PlayerCharacterMasterController>();

		public static int neededVotes;

		public static List<NetworkUser> networkUsers = new List<NetworkUser>();

		public static bool calling;

		public static bool riskOfOptionsEnabled { get; private set; }

		public static PVPModPlugin instance { get; private set; }

		public static PluginInfo PInfo { get; private set; }

		public static ConfigFile configFile { get; private set; }

		public static AssetBundle assetBundle { get; private set; }

		public static PVPModItemDef StrongerDeathMark { get; private set; }

		public static PVPModItemDef IncreaseDamageByShieldAndReduceShieldRechargeTime { get; private set; }

		public static PVPModItemDef AddVenomOnHitUnderQuestionableConditions { get; private set; }

		public static BuffDef StrongerDeathMarkBuff { get; private set; }

		public static BuffDef VenomBuff { get; private set; }

		public static int extraPlayerTeamsCount
		{
			get
			{
				return _extraPlayerTeamsCount;
			}
			set
			{
				if (_extraPlayerTeamsCount != value)
				{
					_extraPlayerTeamsCount = value;
					Init();
				}
			}
		}

		public void Awake()
		{
			//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_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_020d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			//IL_0218: Expected O, but got Unknown
			instance = this;
			PInfo = ((BaseUnityPlugin)this).Info;
			configFile = ((BaseUnityPlugin)this).Config;
			riskOfOptionsEnabled = Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions");
			extraPlayerTeamsCount = 16;
			SetHooks();
			SetConfigs();
			DLC1Expansion = Addressables.LoadAssetAsync<ExpansionDef>((object)"RoR2/DLC1/Common/DLC1.asset").WaitForCompletion();
			assetBundle = AssetBundle.LoadFromFileAsync(Path.Combine(Path.GetDirectoryName(PInfo.Location), "assetbundles", "pvpmod")).assetBundle;
			Material[] array = assetBundle.LoadAllAssets<Material>();
			foreach (Material val in array)
			{
				if (((Object)val.shader).name.StartsWith("StubbedRoR2"))
				{
					string text = ((Object)val.shader).name.Replace("StubbedRoR2", "RoR2") + ".shader";
					Shader val2 = Addressables.LoadAssetAsync<Shader>((object)text).WaitForCompletion();
					if (Object.op_Implicit((Object)(object)val2))
					{
						val.shader = val2;
					}
				}
			}
			PVPItemReward = assetBundle.LoadAsset<BasicPickupDropTable>("Assets/PVPmod/pdPVPItemReward.asset");
			PVPCountdownPrefab = assetBundle.LoadAsset<GameObject>("Assets/PVPmod/PVPCountdown.prefab");
			SetWeights();
			StrongerDeathMark = assetBundle.LoadAsset<PVPModItemDef>("Assets/PVPmod/StrongerDeathMark.asset").RegisterItemDef(StrongerDeathMarkEvents);
			IncreaseDamageByShieldAndReduceShieldRechargeTime = assetBundle.LoadAsset<PVPModItemDef>("Assets/PVPmod/IncreaseDamageByShieldAndReduceShieldRechargeTime.asset").RegisterItemDef(IncreaseDamageByShieldAndReduceShieldRechargeTimeEvents);
			AddVenomOnHitUnderQuestionableConditions = assetBundle.LoadAsset<PVPModItemDef>("Assets/PVPmod/AddVenomOnHitUnderQuestionableConditions.asset").RegisterItemDef(AddVenomOnHitUnderQuestionableConditionsEvents);
			if (EnableContent.Value)
			{
				object obj = <>c.<>9__98_0;
				if (obj == null)
				{
					CollectContentPackProvidersDelegate val3 = delegate(AddContentPackProviderDelegate addContentPackProvider)
					{
						addContentPackProvider.Invoke((IContentPackProvider)(object)new PVPModContentPack());
					};
					<>c.<>9__98_0 = val3;
					obj = (object)val3;
				}
				ContentManager.collectContentPackProviders += (CollectContentPackProvidersDelegate)obj;
			}
			NetworkingAPI.RegisterMessageType<SpawnPVPCountdown>();
		}

		public static void AddVenomOnHitUnderQuestionableConditionsEvents(ItemDef itemDef)
		{
			//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_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Expected O, but got Unknown
			//IL_007d: 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_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Expected O, but got Unknown
			VenomBuff = assetBundle.LoadAsset<BuffDef>("Assets/PVPmod/bdVenom.asset").RegisterBuffDef<BuffDef>((Action<BuffDef>)null);
			VenomDot = new DotDef
			{
				interval = 1f,
				damageCoefficient = 1f,
				damageColorIndex = (DamageColorIndex)2,
				associatedBuff = VenomBuff
			};
			DotDef venomDot = VenomDot;
			object obj2 = <>O.<3>__VenomDamageEvaluation;
			if (obj2 == null)
			{
				CustomDotDamageEvaluation val = VenomDamageEvaluation;
				<>O.<3>__VenomDamageEvaluation = val;
				obj2 = (object)val;
			}
			VenomDotIndex = DotAPI.RegisterDotDef(venomDot, (CustomDotBehaviour)null, (CustomDotVisual)null, (CustomDotDamageEvaluation)obj2);
			AddVenomOnHitUnderQuestionableConditionsTranscendenceCondition = Utils.CreateConfig(((Object)itemDef).name, "Transcendence Condition", defaultValue: true, "");
			AddVenomOnHitUnderQuestionableConditionsWingsCondition = Utils.CreateConfig(((Object)itemDef).name, "Active Milky Chrisalis Condition", defaultValue: true, "");
			AddVenomOnHitUnderQuestionableConditionsVenomDuration = Utils.CreateConfig(((Object)itemDef).name, "Venom Duration", 5f, "");
			AddVenomOnHitUnderQuestionableConditionsVenomDurationPerStack = Utils.CreateConfig(((Object)itemDef).name, "Venom Duration Per Stack", 1f, "");
			AddVenomOnHitUnderQuestionableConditionsVenomAttackerShieldRecharge = Utils.CreateConfig(((Object)itemDef).name, "Recharge Shield Percentage", 5f, "");
			AddVenomOnHitUnderQuestionableConditionsVenomAttackerShieldRechargePerStack = Utils.CreateConfig(((Object)itemDef).name, "Recharge Shield Percentage Per Stack", 1f, "");
			AddVenomOnHitUnderQuestionableConditionsVenomAttackerShieldRechargeStack = Utils.CreateConfig(((Object)itemDef).name, "Recharge Shield Percentage Stack", defaultValue: true, "");
			AddVenomOnHitUnderQuestionableConditionsVenomVictimDamageMultiplier = Utils.CreateConfig(((Object)itemDef).name, "Victim Damage Percentage", 5f, "");
			AddVenomOnHitUnderQuestionableConditionsVenomVictimDamageMultiplierPerStack = Utils.CreateConfig(((Object)itemDef).name, "Victim Damage Percentage Per Stack", 1f, "");
			AddVenomOnHitUnderQuestionableConditionsVenomVictimDamageStack = Utils.CreateConfig(((Object)itemDef).name, "Victim Damage Stack", defaultValue: true, "");
			AddVenomOnHitUnderQuestionableConditionsVenomHemorrageStack = Utils.CreateConfig(((Object)itemDef).name, "Hemorrage Stack", defaultValue: true, "");
			AddVenomOnHitUnderQuestionableConditionsVenomHemorrageDuration = Utils.CreateConfig(((Object)itemDef).name, "Hemorrage Duration", 15f, "");
			AddVenomOnHitUnderQuestionableConditionsVenomHemorrageDamageMultiplier = Utils.CreateConfig(((Object)itemDef).name, "Hemorrage Damage Percentage", 100f, "");
			AddVenomOnHitUnderQuestionableConditionsTranscendenceCondition.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			AddVenomOnHitUnderQuestionableConditionsWingsCondition.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			AddVenomOnHitUnderQuestionableConditionsVenomDuration.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			AddVenomOnHitUnderQuestionableConditionsVenomDurationPerStack.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			AddVenomOnHitUnderQuestionableConditionsVenomAttackerShieldRecharge.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			AddVenomOnHitUnderQuestionableConditionsVenomAttackerShieldRechargePerStack.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			AddVenomOnHitUnderQuestionableConditionsVenomVictimDamageMultiplier.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			AddVenomOnHitUnderQuestionableConditionsVenomVictimDamageMultiplierPerStack.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			AddVenomOnHitUnderQuestionableConditionsVenomVictimDamageStack.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			AddVenomOnHitUnderQuestionableConditionsVenomHemorrageStack.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			AddVenomOnHitUnderQuestionableConditionsVenomHemorrageDuration.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			AddVenomOnHitUnderQuestionableConditionsVenomHemorrageDamageMultiplier.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			GlobalEventManager.onServerDamageDealt += GlobalEventManager_onServerDamageDealt;
			void GlobalEventManager_onServerDamageDealt(DamageReport obj)
			{
				//IL_000c: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
				if (!((Enum)obj.damageInfo.damageType.damageType).HasFlag((Enum)(object)(DamageType)67108864))
				{
					CharacterBody attackerBody = obj.attackerBody;
					Inventory val2 = ((attackerBody != null) ? attackerBody.inventory : null);
					if (Object.op_Implicit((Object)(object)val2) && (val2.GetItemCountEffective(Items.ShieldOnly) > 0 || !AddVenomOnHitUnderQuestionableConditionsTranscendenceCondition.Value))
					{
						int itemCountEffective = val2.GetItemCountEffective(itemDef);
						if (itemCountEffective > 0)
						{
							JetpackController val3 = JetpackController.FindJetpackController(obj.attacker);
							if (Object.op_Implicit((Object)(object)val3) || !AddVenomOnHitUnderQuestionableConditionsWingsCondition.Value)
							{
								DotController.InflictDot(((Component)obj.victim).gameObject, obj.attacker, obj.damageInfo.inflictedHurtbox, VenomDotIndex, Utils.GetStackingFloat(AddVenomOnHitUnderQuestionableConditionsVenomDuration.Value, AddVenomOnHitUnderQuestionableConditionsVenomDurationPerStack.Value, itemCountEffective), 1f, (uint?)null);
							}
						}
					}
				}
			}
		}

		public static void VenomDamageEvaluation(DotController self, PendingDamage pendingDamage)
		{
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0169: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			//IL_0191: Unknown result type (might be due to invalid IL or missing references)
			//IL_0197: Unknown result type (might be due to invalid IL or missing references)
			//IL_019c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a3: Expected O, but got Unknown
			CharacterBody val = (Object.op_Implicit((Object)(object)pendingDamage.attackerObject) ? pendingDamage.attackerObject.GetComponent<CharacterBody>() : null);
			if (!Object.op_Implicit((Object)(object)val))
			{
				return;
			}
			Inventory inventory = val.inventory;
			if (!Object.op_Implicit((Object)(object)inventory))
			{
				return;
			}
			int itemCountEffective = inventory.GetItemCountEffective((ItemDef)(object)AddVenomOnHitUnderQuestionableConditions);
			int buffCount = self.victimBody.GetBuffCount(VenomBuff);
			CharacterBody victimBody = self.victimBody;
			float num2 = (victimBody.damage *= Utils.GetStackingFloat(AddVenomOnHitUnderQuestionableConditionsVenomVictimDamageMultiplier.Value, AddVenomOnHitUnderQuestionableConditionsVenomVictimDamageMultiplierPerStack.Value, itemCountEffective) / 100f);
			float num3 = num2;
			if (Object.op_Implicit((Object)(object)val))
			{
				HealthComponent healthComponent = val.healthComponent;
				if (Object.op_Implicit((Object)(object)healthComponent))
				{
					healthComponent.RechargeShield(val.maxShield * Utils.GetStackingFloat(AddVenomOnHitUnderQuestionableConditionsVenomAttackerShieldRecharge.Value, AddVenomOnHitUnderQuestionableConditionsVenomAttackerShieldRechargePerStack.Value, itemCountEffective) / 100f * (AddVenomOnHitUnderQuestionableConditionsVenomAttackerShieldRechargeStack.Value ? ((float)buffCount) : 1f));
				}
				if (val.damage > num3)
				{
					num3 = val.damage;
				}
			}
			DamageInfo val2 = new DamageInfo
			{
				damage = num3 * (float)buffCount * (AddVenomOnHitUnderQuestionableConditionsVenomVictimDamageStack.Value ? ((float)buffCount) : 1f),
				damageColorIndex = (DamageColorIndex)9,
				attacker = pendingDamage.attackerObject,
				inflictor = pendingDamage.attackerObject,
				position = ((Component)self).transform.position,
				inflictedHurtbox = pendingDamage.hitHurtBox,
				procCoefficient = 0f,
				damageType = DamageTypeCombo.op_Implicit((DamageType)67108864)
			};
			self.victimHealthComponent.TakeDamageProcess(val2);
			for (int i = 0; i < ((!AddVenomOnHitUnderQuestionableConditionsVenomHemorrageStack.Value) ? 1 : buffCount); i++)
			{
				DotController.InflictDot(self.victimObject, val2.attacker, pendingDamage.hitHurtBox, (DotIndex)6, AddVenomOnHitUnderQuestionableConditionsVenomHemorrageDuration.Value, AddVenomOnHitUnderQuestionableConditionsVenomHemorrageDamageMultiplier.Value / 100f, (uint?)null);
			}
			self.victimBody.AddTimedBuff(Buffs.HealingDisabled, VenomDot.interval + Time.fixedDeltaTime);
			self.victimBody.AddTimedBuff(Buffs.Slow50, VenomDot.interval + Time.fixedDeltaTime);
			self.victimBody.AddTimedBuff(Buffs.Weak, VenomDot.interval + Time.fixedDeltaTime);
		}

		public static void InitLanguageTokens()
		{
			Utils.AddLanguageToken(((ItemDef)StrongerDeathMark).nameToken, "Chaotic Death Mark of Doom");
			Utils.AddLanguageToken(((ItemDef)StrongerDeathMark).pickupToken, string.Format("Enemies with {0}{1}{2} or more {3} are marked for death, taking bonus damage.", "<style=cIsDamage>", StrongerDeathMarkMinimumDebuffsToTrigger.Value, "</style>", StrongerDeathMarkCountDebuffStacks.Value ? "debuff stacks" : "debuffs"));
			Utils.AddLanguageToken(((ItemDef)StrongerDeathMark).descriptionToken, string.Format("Enemies with {0}{1}{2}, or more {3} are {4}marked for death{5}, increasing damage taken by {6}{7}%{8} {9}(+{10}% per stack){11} from all sources for {12}{13}{14} {15} (+{16} per stack){17} seconds.", "<style=cIsDamage>", StrongerDeathMarkMinimumDebuffsToTrigger.Value, "</style>", StrongerDeathMarkCountDebuffStacks.Value ? "debuff stacks" : "debuffs", "<style=cIsDamage>", "</style>", "<style=cIsDamage>", StrongerDeathMarkDebuffDamageIncrease.Value, "</style>", "<style=cStack>", StrongerDeathMarkDebuffDamageIncreasePerStack.Value, "</style>", "<style=cIsUtility>", StrongerDeathMarkDebuffDuration.Value, "</style>", "<style=cStack>", StrongerDeathMarkDebuffDuration.Value, "</style>"));
			Utils.AddLanguageToken(((ItemDef)IncreaseDamageByShieldAndReduceShieldRechargeTime).nameToken, "Exoskeleton Of Ruinous Powers");
			Utils.AddLanguageToken(((ItemDef)IncreaseDamageByShieldAndReduceShieldRechargeTime).pickupToken, "Increase damage by max shield and reduce shield recharge start time.");
			Utils.AddLanguageToken(((ItemDef)IncreaseDamageByShieldAndReduceShieldRechargeTime).descriptionToken, string.Format("Deal {0}{1}%{2} {3}(+{4}% per stack){5} of your max shields as {6}damage{7}. Reduce shield recharge start time by {8}{9}%{10} {11}(+{12}% per stack){13}.", "<style=cIsHealing>", IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldToDamageMultiplier.Value, "</style>", "<style=cStack>", IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldToDamageMultiplierPerStack.Value, "</style>", "<style=cIsDamage>", "</style>", "<style=cIsUtility>", IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldRegenSpeedIncrease.Value, "</style>", "<style=cStack>", IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldRegenSpeedIncreasePerStack.Value, "</style>"));
			Utils.AddLanguageToken(((ItemDef)AddVenomOnHitUnderQuestionableConditions).nameToken, "Decaying Siphonbrood Venom");
			bool value = AddVenomOnHitUnderQuestionableConditionsTranscendenceCondition.Value;
			bool value2 = AddVenomOnHitUnderQuestionableConditionsWingsCondition.Value;
			string text;
			if (value || value2)
			{
				text = "While you have";
				if (value)
				{
					text += " Transcendence";
				}
				if (value2)
				{
					if (value)
					{
						text += " and";
					}
					text += " Milky Chrysalis activated";
				}
				text += " hitting an enemy injects Decaying Venom.";
			}
			else
			{
				text = "Hitting an enemy injects Decaying Venom.";
			}
			string value3 = text + string.Format(" While enemy has Decaying Venom you {0}regenerate {1}%{2} {3}(+{4}% per stack){5} of your {6}maximum shield{7} per second. Deals {8}{9}%{10} {11}(+{12}% per stack){13} of the victim's {14}maximum damage{15} per second, or an amount per second equivalent to your {16}damage stat{17}, whichever is greater. Lasts {18}{19} seconds{20} {21}(+{22} seconds per stack){23}. Enemy affected gains 1 Hemorrhage stack per second, Healing Disabled, Slowed and Weak while this is active", "<style=cIsHealing>", AddVenomOnHitUnderQuestionableConditionsVenomAttackerShieldRecharge.Value, "</style>", "<style=cStack>", AddVenomOnHitUnderQuestionableConditionsVenomAttackerShieldRechargePerStack.Value, "</style>", "<style=cIsHealing>", "</style>", "<style=cIsDamage>", AddVenomOnHitUnderQuestionableConditionsVenomVictimDamageMultiplier.Value, "</style>", "<style=cStack>", AddVenomOnHitUnderQuestionableConditionsVenomVictimDamageMultiplierPerStack.Value, "</style>", "<style=cIsDamage>", "</style>", "<style=cIsDamage>", "</style>", "<style=cIsUtility>", AddVenomOnHitUnderQuestionableConditionsVenomDuration.Value, "</style>", "<style=cStack>", AddVenomOnHitUnderQuestionableConditionsVenomDurationPerStack.Value, "</style>");
			Utils.AddLanguageToken(((ItemDef)AddVenomOnHitUnderQuestionableConditions).pickupToken, text);
			Utils.AddLanguageToken(((ItemDef)AddVenomOnHitUnderQuestionableConditions).descriptionToken, value3);
		}

		public static void SetConfigs()
		{
			EnablePVP = Utils.CreateConfig("Main", "Enable PVP", defaultValue: true, "Enable Players Versus Players after teleporter charge?");
			EnableContent = Utils.CreateConfig("Main", "Enable content", defaultValue: true, "Enable all mod content?");
			PVPCountdownTimer = Utils.CreateConfig("PVP", "Countdown timer", 3f, "Control countdown timer that begins PVP");
			PVPItemRewardAmount = Utils.CreateConfig("PVP", "Item reward amount", 1, "Control how much items will be spawned on pvp win. Items spawn on the teleporter");
			PVPItemRewardTier1Weight = Utils.CreateConfig("PVP", "Item reward common rarity weight", 100f, "Control weight for common rarity on random item reward selection");
			PVPItemRewardTier2Weight = Utils.CreateConfig("PVP", "Item reward uncommon rarity weight", 0f, "Control weight for uncommon rarity on random item reward selection");
			PVPItemRewardTier3Weight = Utils.CreateConfig("PVP", "Item reward legendary rarity weight", 0f, "Control weight for legendary rarity on random item reward selection");
			PVPItemRewardBossWeight = Utils.CreateConfig("PVP", "Item reward boss rarity weight", 0f, "Control weight for boss rarity on random item reward selection");
			PVPItemRewardEquipmentWeight = Utils.CreateConfig("PVP", "Item reward equipment rarity weight", 0f, "Control weight for equipment rarity on random item reward selection");
			PVPItemRewardLunarItemWeight = Utils.CreateConfig("PVP", "Item reward lunar item rarity weight", 0f, "Control weight for lunar item rarity on random item reward selection");
			PVPItemRewardLunarEquipmentWeight = Utils.CreateConfig("PVP", "Item reward lunar equipment rarity weight", 0f, "Control weight for lunar equipment rarity on random item reward selection");
			PVPItemRewardLunarCombinedWeight = Utils.CreateConfig("PVP", "Item reward lunar combined rarity weight", 0f, "Control weight for lunar combined rarity on random item reward selection");
			PVPItemRewardTier1VoidWeight = Utils.CreateConfig("PVP", "Item reward void common rarity weight", 0f, "Control weight for void common rarity on random item reward selection");
			PVPItemRewardTier2VoidWeight = Utils.CreateConfig("PVP", "Item reward void uncommon rarity weight", 0f, "Control weight for void uncommon rarity on random item reward selection");
			PVPItemRewardTier3VoidWeight = Utils.CreateConfig("PVP", "Item reward void legendary rarity weight", 0f, "Control weight for void legendary rarity on random item reward selection");
			PVPItemRewardBossVoidWeight = Utils.CreateConfig("PVP", "Item reward void boss rarity weight", 0f, "Control weight for void boss rarity on random item reward selection");
			PVPLoserLoseItemsAmount = Utils.CreateConfig("PVP", "Lose items amount", 1, "Control how much items PVP losers will lose?");
			PVPLoserLoseItemsRarity = Utils.CreateConfig<ItemTier>("PVP", "Lose items rarity", (ItemTier)0, "Control which rarity of an item would be removed on PVP lose?");
			PVPLoserSpinelAfflictionsAmount = Utils.CreateConfig("PVP", "Gain Tonic Affliction", 0, "Control how much Tonic Afflictions PVP losers will get?");
			PVPItemRewardTier1Weight.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			PVPItemRewardTier2Weight.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			PVPItemRewardTier3Weight.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			PVPItemRewardBossWeight.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			PVPItemRewardEquipmentWeight.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			PVPItemRewardLunarItemWeight.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			PVPItemRewardLunarEquipmentWeight.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			PVPItemRewardLunarCombinedWeight.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			PVPItemRewardTier1VoidWeight.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			PVPItemRewardTier2VoidWeight.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			PVPItemRewardTier3VoidWeight.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
			PVPItemRewardBossVoidWeight.SettingChanged += PVPItemRewardTier1Weight_SettingChanged;
		}

		private static void PVPItemRewardTier1Weight_SettingChanged(object sender, EventArgs e)
		{
			SetWeights();
		}

		public void OnDestroy()
		{
			UnsetHooks();
		}

		private static void SetHooks()
		{
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Expected O, but got Unknown
			if (!hooksSet)
			{
				hooksSet = true;
				TeleporterInteraction.onTeleporterChargedGlobal += TeleporterInteraction_onTeleporterChargedGlobal;
				Stage.onServerStageBegin += Stage_onServerStageBegin;
				TeamComponent.onJoinTeamGlobal += TeamComponent_onJoinTeamGlobal;
				TeamComponent.onLeaveTeamGlobal += TeamComponent_onLeaveTeamGlobal;
				GlobalEventManager.onCharacterDeathGlobal += GlobalEventManager_onCharacterDeathGlobal;
				object obj = <>O.<10>__TeamManager_SetTeamExperience;
				if (obj == null)
				{
					hook_SetTeamExperience val = TeamManager_SetTeamExperience;
					<>O.<10>__TeamManager_SetTeamExperience = val;
					obj = (object)val;
				}
				TeamManager.SetTeamExperience += (hook_SetTeamExperience)obj;
				RoR2Application.onLoadFinished = (Action)Delegate.Combine(RoR2Application.onLoadFinished, new Action(InitLanguageTokens));
			}
		}

		private static void TeamManager_SetTeamExperience(orig_SetTeamExperience orig, TeamManager self, TeamIndex teamIndex, ulong newExperience)
		{
			//IL_0003: 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_004f: 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_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_0061: Unknown result type (might be due to invalid IL or missing references)
			orig.Invoke(self, teamIndex, newExperience);
			if (thisIsStupid || !pvpEnabled || !playerTeamIndeces.Contains(teamIndex))
			{
				return;
			}
			thisIsStupid = true;
			self.SetTeamExperience((TeamIndex)1, newExperience);
			foreach (TeamIndex playerTeamIndece in playerTeamIndeces)
			{
				if (playerTeamIndece != teamIndex)
				{
					self.SetTeamExperience(playerTeamIndece, newExperience);
				}
			}
			thisIsStupid = false;
		}

		public static void SetWeights()
		{
			bool flag = Object.op_Implicit((Object)(object)Run.instance) && Run.instance.IsExpansionEnabled(DLC1Expansion);
			PVPItemReward.tier1Weight = PVPItemRewardTier1Weight.Value;
			PVPItemReward.tier2Weight = PVPItemRewardTier2Weight.Value;
			PVPItemReward.tier3Weight = PVPItemRewardTier3Weight.Value;
			PVPItemReward.bossWeight = PVPItemRewardBossWeight.Value;
			PVPItemReward.equipmentWeight = PVPItemRewardEquipmentWeight.Value;
			PVPItemReward.lunarItemWeight = PVPItemRewardLunarItemWeight.Value;
			PVPItemReward.lunarEquipmentWeight = PVPItemRewardLunarEquipmentWeight.Value;
			PVPItemReward.lunarCombinedWeight = PVPItemRewardLunarCombinedWeight.Value;
			PVPItemReward.voidTier1Weight = (flag ? PVPItemRewardTier1VoidWeight.Value : 0f);
			PVPItemReward.voidTier2Weight = (flag ? PVPItemRewardTier2VoidWeight.Value : 0f);
			PVPItemReward.voidTier3Weight = (flag ? PVPItemRewardTier3VoidWeight.Value : 0f);
			PVPItemReward.voidBossWeight = (flag ? PVPItemRewardBossVoidWeight.Value : 0f);
		}

		private static void TeamComponent_onLeaveTeamGlobal(TeamComponent arg1, TeamIndex arg2)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			CharacterBody body = arg1.body;
			if (!((Object)(object)body == (Object)null) && body.isPlayerControlled && playerTeamIndeces.Contains(arg2) && activePVPBodies.Contains(body))
			{
				activePVPBodies.Remove(body);
			}
		}

		private static void TeamComponent_onJoinTeamGlobal(TeamComponent arg1, TeamIndex arg2)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			CharacterBody body = arg1.body;
			if (!((Object)(object)body == (Object)null) && body.isPlayerControlled && playerTeamIndeces.Contains(arg2) && !activePVPBodies.Contains(body))
			{
				activePVPBodies.Add(body);
			}
		}

		private static void GlobalEventManager_onCharacterDeathGlobal(DamageReport obj)
		{
			//IL_001d: 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_0028: Unknown result type (might be due to invalid IL or missing references)
			if (!pvpEnabled || !NetworkServer.active)
			{
				return;
			}
			TeamIndex victimTeamIndex = obj.victimTeamIndex;
			if (!playerTeamIndeces.Contains(victimTeamIndex))
			{
				return;
			}
			if (Object.op_Implicit((Object)(object)obj.victimMaster) && Object.op_Implicit((Object)(object)obj.victimMaster.playerCharacterMasterController) && !losers.Contains(obj.victimMaster.playerCharacterMasterController))
			{
				losers.Add(obj.victimMaster.playerCharacterMasterController);
			}
			int num = 0;
			CharacterBody val = null;
			foreach (CharacterBody activePVPBody in activePVPBodies)
			{
				if (!((Object)(object)activePVPBody == (Object)null) && activePVPBody.isPlayerControlled && Object.op_Implicit((Object)(object)activePVPBody.master) && !activePVPBody.master.IsDeadAndOutOfLivesServer())
				{
					val = activePVPBody;
					num++;
				}
			}
			if (num <= 1)
			{
				EndPVP(punish: true);
				SpawnItems();
			}
		}

		public static void SpawnItems()
		{
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: 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_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)Run.instance == (Object)null) && Run.instance.bossRewardRng != null && !((Object)(object)TeleporterInteraction.instance == (Object)null) && !((Object)(object)TeleporterInteraction.instance.bossGroup == (Object)null) && PVPItemRewardAmount.Value > 0)
			{
				float num = 360f / (float)PVPItemRewardAmount.Value;
				Vector3 val = Quaternion.AngleAxis((float)Random.Range(0, 360), Vector3.up) * (Vector3.up * 40f + Vector3.forward * 5f);
				Quaternion val2 = Quaternion.AngleAxis(num, Vector3.up);
				for (int i = 0; i < PVPItemRewardAmount.Value; i++)
				{
					UniquePickup val3 = ((PickupDropTable)PVPItemReward).GeneratePickup(Run.instance.bossRewardRng);
					PickupDropletController.CreatePickupDroplet(val3, TeleporterInteraction.instance.bossGroup.dropPosition.position, val);
					val = val2 * val;
				}
			}
		}

		private static void StrongerDeathMarkEvents(ItemDef itemDef)
		{
			StrongerDeathMarkBuff = assetBundle.LoadAsset<BuffDef>("Assets/PVPmod/bdStrongerDeathMark.asset").RegisterBuffDef<BuffDef>((Action<BuffDef>)StrongerDeathMarkBuffEvents);
			StrongerDeathMarkMinimumDebuffsToTrigger = Utils.CreateConfig(((Object)itemDef).name, "Minimum debuffs", 15, "Minimum debuffs needed for adding damage increase debuff on debuff addition");
			StrongerDeathMarkCountDebuffStacks = Utils.CreateConfig(((Object)itemDef).name, "Count stacks", defaultValue: true, "Count debuff stacks for effect triggering");
			StrongerDeathMarkDebuffDuration = Utils.CreateConfig(((Object)itemDef).name, "Debuff duration", 10f, "Control debuff duration in seconds");
			StrongerDeathMarkDebuffDurationPerStack = Utils.CreateConfig(((Object)itemDef).name, "Debuff duration per stack", 5f, "Control debuff duration per stack in seconds");
			StrongerDeathMarkDebuffDamageIncrease = Utils.CreateConfig(((Object)itemDef).name, "Debuff damage multiplier", 600f, "Control debuff taken damage multiplier in percentage");
			StrongerDeathMarkDebuffDamageIncreasePerStack = Utils.CreateConfig(((Object)itemDef).name, "Debuff damage multiplier per stack", 300f, "Control debuff taken damage multiplier per stack in percentage");
			StrongerDeathMarkMinimumDebuffsToTrigger.SettingChanged += StrongerDeathMarkMinimumDebuffsToTrigger_SettingChanged;
			StrongerDeathMarkCountDebuffStacks.SettingChanged += StrongerDeathMarkMinimumDebuffsToTrigger_SettingChanged;
			StrongerDeathMarkDebuffDuration.SettingChanged += StrongerDeathMarkMinimumDebuffsToTrigger_SettingChanged;
			StrongerDeathMarkDebuffDurationPerStack.SettingChanged += StrongerDeathMarkMinimumDebuffsToTrigger_SettingChanged;
			StrongerDeathMarkDebuffDamageIncrease.SettingChanged += StrongerDeathMarkMinimumDebuffsToTrigger_SettingChanged;
			StrongerDeathMarkDebuffDamageIncreasePerStack.SettingChanged += StrongerDeathMarkMinimumDebuffsToTrigger_SettingChanged;
			void StrongerDeathMarkBuffEvents(BuffDef buffDef)
			{
				//IL_001c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0026: Expected O, but got Unknown
				//IL_002f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0039: Expected O, but got Unknown
				CharacterBody.HandleCascadingBuffs += new hook_HandleCascadingBuffs(CharacterBody_HandleCascadingBuffs);
				HealthComponent.TakeDamageProcess += new Manipulator(HealthComponent_TakeDamageProcess);
				void CharacterBody_HandleCascadingBuffs(orig_HandleCascadingBuffs orig, CharacterBody self)
				{
					//IL_0014: 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_006b: Unknown result type (might be due to invalid IL or missing references)
					//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
					//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
					//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
					orig.Invoke(self);
					int num = Util.GetItemCountGlobal(itemDef.itemIndex, true, true) - (Object.op_Implicit((Object)(object)self.teamComponent) ? Util.GetItemCountForTeam(self.teamComponent.teamIndex, itemDef.itemIndex, true, true) : (Object.op_Implicit((Object)(object)self.inventory) ? self.inventory.GetItemCountEffective(itemDef) : 0));
					if (num > 0 && !self.HasBuff(buffDef))
					{
						int num2 = 0;
						BuffIndex[] debuffBuffIndices = BuffCatalog.debuffBuffIndices;
						foreach (BuffIndex val2 in debuffBuffIndices)
						{
							if (self.HasBuff(val2))
							{
								num2 += ((!StrongerDeathMarkCountDebuffStacks.Value) ? 1 : self.GetBuffCount(val2));
							}
						}
						if (num2 >= StrongerDeathMarkMinimumDebuffsToTrigger.Value)
						{
							self.AddTimedBuff(buffDef, Utils.GetStackingFloat(StrongerDeathMarkDebuffDuration.Value, StrongerDeathMarkDebuffDurationPerStack.Value, num));
						}
					}
				}
				float HandleStrongerDeathMark(CharacterBody characterBody, DamageInfo damageInfo)
				{
					if (!characterBody.HasBuff(buffDef) || (Object)(object)damageInfo.attacker == (Object)null)
					{
						return 1f;
					}
					CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>();
					if ((Object)(object)component == (Object)null)
					{
						return StrongerDeathMarkDebuffDamageIncrease.Value / 100f + 1f;
					}
					Inventory inventory = component.inventory;
					if ((Object)(object)inventory == (Object)null)
					{
						return StrongerDeathMarkDebuffDamageIncrease.Value / 100f + 1f;
					}
					int itemCount = inventory.GetItemCount(itemDef);
					if (itemCount <= 0)
					{
						return StrongerDeathMarkDebuffDamageIncrease.Value / 100f + 1f;
					}
					return Utils.GetStackingFloat(StrongerDeathMarkDebuffDamageIncrease.Value, StrongerDeathMarkDebuffDamageIncreasePerStack.Value, itemCount) / 100f + 1f;
				}
				void HealthComponent_TakeDamageProcess(ILContext il)
				{
					//IL_0008: Unknown result type (might be due to invalid IL or missing references)
					//IL_000e: Expected O, but got Unknown
					//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
					//IL_0104: Unknown result type (might be due to invalid IL or missing references)
					//IL_0124: Unknown result type (might be due to invalid IL or missing references)
					//IL_0144: Unknown result type (might be due to invalid IL or missing references)
					//IL_0156: Unknown result type (might be due to invalid IL or missing references)
					//IL_0162: Unknown result type (might be due to invalid IL or missing references)
					ILCursor val = new ILCursor(il);
					ILLabel iLLabel = null;
					int locId = 0;
					if (val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[6]
					{
						(Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 0),
						(Instruction x) => ILPatternMatchingExt.MatchLdfld<HealthComponent>(x, "body"),
						(Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Buffs), "DeathMark"),
						(Instruction x) => ILPatternMatchingExt.MatchCallvirt<CharacterBody>(x, "HasBuff"),
						(Instruction x) => ILPatternMatchingExt.MatchBrfalse(x, ref iLLabel),
						(Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ref locId)
					}))
					{
						val.GotoLabel(iLLabel, (MoveType)0, false);
						Instruction prev = val.Emit(OpCodes.Ldarg_0).Prev;
						iLLabel.Target = prev;
						val.Emit(OpCodes.Ldfld, AccessTools.Field(typeof(HealthComponent), "body"));
						val.Emit(OpCodes.Ldarg_1);
						val.EmitDelegate<Func<CharacterBody, DamageInfo, float>>((Func<CharacterBody, DamageInfo, float>)HandleStrongerDeathMark);
						val.Emit(OpCodes.Ldloc, locId);
						val.Emit(OpCodes.Mul);
						val.Emit(OpCodes.Stloc, locId);
					}
					else
					{
						((BaseUnityPlugin)instance).Logger.LogError((object)(((MemberReference)il.Method).Name + " IL Hook failed!"));
					}
				}
			}
		}

		private static void StrongerDeathMarkMinimumDebuffsToTrigger_SettingChanged(object sender, EventArgs e)
		{
			InitLanguageTokens();
		}

		private static void IncreaseDamageByShieldAndReduceShieldRechargeTimeEvents(ItemDef itemDef)
		{
			//IL_013d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0147: Expected O, but got Unknown
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Expected O, but got Unknown
			IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldToDamageMultiplier = Utils.CreateConfig(((Object)itemDef).name, "Max shield to damage multiplier", 5f, "Control max shield to damage multiplier in percentage");
			IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldToDamageMultiplierPerStack = Utils.CreateConfig(((Object)itemDef).name, "Max shield to damage multiplier per stack", 2.5f, "Control max shield to damage multiplier per stack in percentage");
			IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldRegenSpeedIncrease = Utils.CreateConfig(((Object)itemDef).name, "Shield regen cooldown reduction", 30f, "Control shield regeneration cooldown reduction in percentage");
			IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldRegenSpeedIncreasePerStack = Utils.CreateConfig(((Object)itemDef).name, "Shield regen cooldown reduction per stack", 15f, "Control shield regeneration cooldown reduction in percentage");
			IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldToDamageMultiplier.SettingChanged += StrongerDeathMarkMinimumDebuffsToTrigger_SettingChanged;
			IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldToDamageMultiplierPerStack.SettingChanged += StrongerDeathMarkMinimumDebuffsToTrigger_SettingChanged;
			IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldRegenSpeedIncrease.SettingChanged += StrongerDeathMarkMinimumDebuffsToTrigger_SettingChanged;
			IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldRegenSpeedIncreasePerStack.SettingChanged += StrongerDeathMarkMinimumDebuffsToTrigger_SettingChanged;
			HealthComponent.TakeDamageProcess += new Manipulator(HealthComponent_TakeDamageProcess);
			CharacterBody.OnInventoryChanged += new hook_OnInventoryChanged(CharacterBody_OnInventoryChanged);
			void CharacterBody_OnInventoryChanged(orig_OnInventoryChanged orig, CharacterBody self)
			{
				orig.Invoke(self);
				if (NetworkServer.active)
				{
					self.AddItemBehavior<IncreaseDamageByShieldAndReduceShieldRechargeTimeBehaviour>(Object.op_Implicit((Object)(object)self.inventory) ? self.inventory.GetItemCount(itemDef) : 0);
				}
			}
			float HandleIncreaseDamageByShieldAndReduceShieldRechargeTime(CharacterBody characterBody, DamageInfo damageInfo)
			{
				if ((Object)(object)damageInfo.attacker == (Object)null)
				{
					return 1f;
				}
				CharacterBody component = damageInfo.attacker.GetComponent<CharacterBody>();
				if ((Object)(object)component == (Object)null)
				{
					return 1f;
				}
				Inventory inventory = component.inventory;
				if ((Object)(object)inventory == (Object)null)
				{
					return component.maxShield * IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldToDamageMultiplier.Value / 100f + 1f;
				}
				int itemCount = inventory.GetItemCount(itemDef);
				if (itemCount <= 0)
				{
					return component.maxShield * IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldToDamageMultiplier.Value / 100f + 1f;
				}
				return component.maxShield * Utils.GetStackingFloat(IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldToDamageMultiplier.Value, IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldToDamageMultiplierPerStack.Value, itemCount) / 100f + 1f;
			}
			void HealthComponent_TakeDamageProcess(ILContext il)
			{
				//IL_0008: Unknown result type (might be due to invalid IL or missing references)
				//IL_000e: Expected O, but got Unknown
				//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
				//IL_0104: Unknown result type (might be due to invalid IL or missing references)
				//IL_0124: Unknown result type (might be due to invalid IL or missing references)
				//IL_0144: Unknown result type (might be due to invalid IL or missing references)
				//IL_0156: Unknown result type (might be due to invalid IL or missing references)
				//IL_0162: Unknown result type (might be due to invalid IL or missing references)
				ILCursor val = new ILCursor(il);
				ILLabel iLLabel = null;
				int locId = 0;
				if (val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[6]
				{
					(Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 0),
					(Instruction x) => ILPatternMatchingExt.MatchLdfld<HealthComponent>(x, "body"),
					(Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Buffs), "DeathMark"),
					(Instruction x) => ILPatternMatchingExt.MatchCallvirt<CharacterBody>(x, "HasBuff"),
					(Instruction x) => ILPatternMatchingExt.MatchBrfalse(x, ref iLLabel),
					(Instruction x) => ILPatternMatchingExt.MatchLdloc(x, ref locId)
				}))
				{
					val.GotoLabel(iLLabel, (MoveType)0, false);
					Instruction prev = val.Emit(OpCodes.Ldarg_0).Prev;
					iLLabel.Target = prev;
					val.Emit(OpCodes.Ldfld, AccessTools.Field(typeof(HealthComponent), "body"));
					val.Emit(OpCodes.Ldarg_1);
					val.EmitDelegate<Func<CharacterBody, DamageInfo, float>>((Func<CharacterBody, DamageInfo, float>)HandleIncreaseDamageByShieldAndReduceShieldRechargeTime);
					val.Emit(OpCodes.Ldloc, locId);
					val.Emit(OpCodes.Add);
					val.Emit(OpCodes.Stloc, locId);
				}
				else
				{
					((BaseUnityPlugin)instance).Logger.LogError((object)(((MemberReference)il.Method).Name + " IL Hook failed!"));
				}
			}
		}

		private static void UnsetHooks()
		{
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Expected O, but got Unknown
			if (hooksSet)
			{
				hooksSet = false;
				TeleporterInteraction.onTeleporterChargedGlobal -= TeleporterInteraction_onTeleporterChargedGlobal;
				Stage.onServerStageBegin -= Stage_onServerStageBegin;
				TeamComponent.onJoinTeamGlobal -= TeamComponent_onJoinTeamGlobal;
				TeamComponent.onLeaveTeamGlobal -= TeamComponent_onLeaveTeamGlobal;
				GlobalEventManager.onCharacterDeathGlobal -= GlobalEventManager_onCharacterDeathGlobal;
				object obj = <>O.<10>__TeamManager_SetTeamExperience;
				if (obj == null)
				{
					hook_SetTeamExperience val = TeamManager_SetTeamExperience;
					<>O.<10>__TeamManager_SetTeamExperience = val;
					obj = (object)val;
				}
				TeamManager.SetTeamExperience -= (hook_SetTeamExperience)obj;
				RoR2Application.onLoadFinished = (Action)Delegate.Remove(RoR2Application.onLoadFinished, new Action(InitLanguageTokens));
			}
		}

		private static void Stage_onServerStageBegin(Stage obj)
		{
			EndPVP(punish: false);
		}

		private static void TeleporterInteraction_onTeleporterChargedGlobal(TeleporterInteraction obj)
		{
			if (EnablePVP.Value)
			{
				StartPVP();
			}
		}

		public static void StartPVP()
		{
			if (NetworkServer.active)
			{
				calling = false;
				int count = GetAlivePlayers().Count;
				if (count > 1)
				{
					startingPVP = true;
					startingStopwatch = PVPCountdownTimer.Value;
					NetMessageExtensions.Send((INetMessage)(object)new SpawnPVPCountdown(startingStopwatch), (NetworkDestination)1);
				}
			}
		}

		public static void BeginPVP()
		{
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0155: Unknown result type (might be due to invalid IL or missing references)
			//IL_015f: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			SetWeights();
			if (!NetworkServer.active || pvpEnabled)
			{
				return;
			}
			calling = false;
			int count = GetAlivePlayers().Count;
			if (count <= 1)
			{
				return;
			}
			count = PlayerCharacterMasterController.instances.Count;
			pvpEnabled = true;
			losers.Clear();
			networkUsers.Clear();
			int count2 = playerTeamDefs.Count;
			int num = 0;
			for (int i = 0; i < count2; i++)
			{
				TeamIndex val = playerTeamIndeces[i];
				TeamManager.instance.SetTeamExperience(val, TeamManager.instance.GetTeamExperience((TeamIndex)1));
			}
			int num2 = 0;
			while (num2 < count)
			{
				PlayerCharacterMasterController val2 = PlayerCharacterMasterController.instances[num2];
				if (!((Object)(object)val2 == (Object)null))
				{
					CharacterMaster master = val2.master;
					if (!((Object)(object)master == (Object)null))
					{
						TeamIndex val3 = (TeamIndex)(-1);
						while (num > count2 - 1)
						{
							num -= extraPlayerTeamsCount;
						}
						val3 = playerTeamIndeces[num];
						TeamComponent val4 = (Object.op_Implicit((Object)(object)master.GetBody()) ? master.GetBody().teamComponent : null);
						if (Object.op_Implicit((Object)(object)val4))
						{
							val4.teamIndex = val3;
						}
						master.teamIndex = val3;
						ChangeMinionsTeam(val2, val3);
					}
				}
				num2++;
				num++;
			}
		}

		public static void EndPVP(bool punish)
		{
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
			if (!NetworkServer.active || !pvpEnabled)
			{
				return;
			}
			calling = false;
			int count = PlayerCharacterMasterController.instances.Count;
			pvpEnabled = false;
			startingPVP = false;
			networkUsers.Clear();
			int count2 = playerTeamDefs.Count;
			for (int i = 0; i < count; i++)
			{
				PlayerCharacterMasterController val = PlayerCharacterMasterController.instances[i];
				if ((Object)(object)val == (Object)null)
				{
					continue;
				}
				CharacterMaster master = val.master;
				if ((Object)(object)master == (Object)null)
				{
					continue;
				}
				TeamIndex teamIndex = (TeamIndex)1;
				TeamComponent val2 = (Object.op_Implicit((Object)(object)master.GetBody()) ? master.GetBody().teamComponent : null);
				if (Object.op_Implicit((Object)(object)val2))
				{
					val2.teamIndex = teamIndex;
				}
				master.teamIndex = teamIndex;
				ChangeMinionsTeam(val, teamIndex);
				if (!punish)
				{
					continue;
				}
				Inventory inventory = master.inventory;
				if (!Object.op_Implicit((Object)(object)inventory) || !master.IsDeadAndOutOfLivesServer() || !losers.Contains(val))
				{
					continue;
				}
				losers.Remove(val);
				int value = PVPLoserSpinelAfflictionsAmount.Value;
				if (value > 0)
				{
					inventory.GiveItem(Items.TonicAffliction, value);
				}
				List<ItemDef> list = new List<ItemDef>();
				int num = 0;
				for (int j = 0; j < ItemCatalog.itemCount; j++)
				{
					int num2 = inventory.permanentItemStacks.inner.sparseValues[j];
					if (num2 <= 0)
					{
						continue;
					}
					ItemDef itemDef = ItemCatalog.GetItemDef((ItemIndex)j);
					if (!((Object)(object)itemDef == (Object)null) && itemDef.canRemove && itemDef.tier == PVPLoserLoseItemsRarity.Value)
					{
						for (int k = 0; k < num2; k++)
						{
							list.Add(itemDef);
							num++;
						}
					}
				}
				int value2 = PVPLoserLoseItemsAmount.Value;
				for (int l = 0; l < value2; l++)
				{
					if (num <= 0)
					{
						break;
					}
					ItemDef val3 = list[Random.Range(0, num)];
					inventory.RemoveItemPermanent(val3, 1);
					list.Remove(val3);
					num--;
				}
			}
		}

		public static void ChangeMinionsTeam(PlayerCharacterMasterController playerCharacterMasterController, TeamIndex teamIndex)
		{
			//IL_001f: 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_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			MinionGroup val = null;
			for (int i = 0; i < MinionGroup.instancesList.Count; i++)
			{
				MinionGroup val2 = MinionGroup.instancesList[i];
				if (MinionGroup.instancesList[i].ownerId == ((NetworkBehaviour)playerCharacterMasterController).netId)
				{
					val = val2;
					break;
				}
			}
			if (val == null)
			{
				return;
			}
			MinionOwnership[] members = val.members;
			foreach (MinionOwnership val3 in members)
			{
				if ((Object)(object)val3 == (Object)null)
				{
					continue;
				}
				CharacterMaster component = ((Component)val3).GetComponent<CharacterMaster>();
				if ((Object)(object)component == (Object)null)
				{
					continue;
				}
				component.teamIndex = teamIndex;
				CharacterBody body = component.GetBody();
				if (!((Object)(object)body == (Object)null))
				{
					TeamComponent teamComponent = body.teamComponent;
					if (!((Object)(object)teamComponent == (Object)null))
					{
						teamComponent.teamIndex = teamIndex;
					}
				}
			}
		}

		public void FixedUpdate()
		{
			if (NetworkServer.active && startingPVP)
			{
				startingStopwatch -= Time.fixedDeltaTime;
				if (startingStopwatch <= 0f)
				{
					BeginPVP();
					startingPVP = false;
				}
			}
			if ((Object)(object)Run.instance == (Object)null)
			{
				return;
			}
			TeamDef val = TeamCatalog.teamDefs[1];
			foreach (TeamDef playerTeamDef in playerTeamDefs)
			{
				playerTeamDef.softCharacterLimit = val.softCharacterLimit;
				playerTeamDef.friendlyFireScaling = val.friendlyFireScaling;
				playerTeamDef.levelUpEffect = val.levelUpEffect;
				playerTeamDef.nameToken = val.nameToken;
			}
		}

		public static void Init()
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			playerTeamDefs.Clear();
			playerTeamIndeces.Clear();
			for (int i = 0; i < extraPlayerTeamsCount; i++)
			{
				CreateTeam("Player" + (i + 1));
			}
		}

		public static TeamIndex CreateTeam(string name)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Expected O, but got Unknown
			//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_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: 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_004a: Expected O, but got Unknown
			//IL_004c: 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_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			TeamBehavior val = new TeamBehavior(name, (TeamClassification)4);
			string text = "TEAM_" + name.ToUpper() + "_NAME";
			TeamDef val2 = new TeamDef
			{
				softCharacterLimit = 20,
				friendlyFireScaling = 0.5f,
				levelUpEffect = null,
				nameToken = "TEAM_PLAYER_NAME"
			};
			TeamIndex val3 = TeamsAPI.RegisterTeam(val2, val);
			playerTeamDefs.Add(val2);
			playerTeamIndeces.Add(val3);
			return val3;
		}

		[ConCommand(/*Could not decode attribute arguments.*/)]
		public static void CallPVPVote(ConCommandArgs args)
		{
			//IL_003b: 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_0052: 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_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Expected O, but got Unknown
			if (!calling && !pvpEnabled)
			{
				int count = GetAlivePlayers().Count;
				if (count > 1)
				{
					neededVotes = count - 1;
					networkUsers.Add(args.sender);
					calling = true;
					Chat.SendBroadcastChat((ChatMessageBase)new UserChatMessage
					{
						sender = ((Component)args.sender).gameObject,
						text = " has called for PVP. Type `pvp_accept` in the console to proceed. Needed votes: " + neededVotes
					});
				}
			}
		}

		[ConCommand(/*Could not decode attribute arguments.*/)]
		public static void AcceptPVPVote(ConCommandArgs args)
		{
			//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_0014: 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_0034: Expected O, but got Unknown
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Expected O, but got Unknown
			//IL_0086: 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_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Expected O, but got Unknown
			if (!calling)
			{
				Chat.SendBroadcastChat((ChatMessageBase)new UserChatMessage
				{
					sender = ((Component)args.sender).gameObject,
					text = " wanted to accept PVP call but it has not been called yet. Use `pvp_call` to call it."
				});
			}
			if (!pvpEnabled && !networkUsers.Contains(args.sender))
			{
				neededVotes--;
				networkUsers.Add(args.sender);
				if (neededVotes <= 0)
				{
					Chat.SendBroadcastChat((ChatMessageBase)new UserChatMessage
					{
						sender = ((Component)args.sender).gameObject,
						text = " has voted for PVP. Starting PVP!"
					});
					StartPVP();
					calling = false;
				}
				else
				{
					Chat.SendBroadcastChat((ChatMessageBase)new UserChatMessage
					{
						sender = ((Component)args.sender).gameObject,
						text = " has voted for PVP. Needed votes: " + neededVotes
					});
				}
			}
		}

		[ConCommand(/*Could not decode attribute arguments.*/)]
		public static void EndPVP(ConCommandArgs args)
		{
			//IL_0027: 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_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Expected O, but got Unknown
			if (pvpEnabled)
			{
				int count = GetAlivePlayers().Count;
				if (count > 1)
				{
					Chat.SendBroadcastChat((ChatMessageBase)new UserChatMessage
					{
						sender = ((Component)args.sender).gameObject,
						text = " has called for PVP. Type `pvp_accept` in the console to proceed. Needed votes: " + neededVotes
					});
					EndPVP(punish: true);
				}
			}
		}

		public static List<PlayerCharacterMasterController> GetAlivePlayers()
		{
			List<PlayerCharacterMasterController> list = new List<PlayerCharacterMasterController>();
			foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances)
			{
				if (!Object.op_Implicit((Object)(object)instance.master) || !instance.master.IsDeadAndOutOfLivesServer())
				{
					list.Add(instance);
				}
			}
			return list;
		}
	}
	public class IncreaseDamageByShieldAndReduceShieldRechargeTimeBehaviour : ItemBehavior
	{
		public void FixedUpdate()
		{
			HealthComponent healthComponent = base.body.healthComponent;
			if (!((Object)(object)healthComponent == (Object)null) && !healthComponent.isShieldRegenForced)
			{
				float num = Utils.GetStackingFloat(PVPModPlugin.IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldRegenSpeedIncrease.Value, PVPModPlugin.IncreaseDamageByShieldAndReduceShieldRechargeTimeShieldRegenSpeedIncreasePerStack.Value, base.stack) / 100f + 1f;
				float num2 = 7f / num;
				if (base.body.outOfDangerStopwatch >= num2)
				{
					healthComponent.ForceShieldRegen();
					Util.PlaySound("Play_item_proc_personal_shield_recharge", ((Component)this).gameObject);
				}
			}
		}
	}
	public class PVPCountdown : MonoBehaviour
	{
		public TextMeshProUGUI textMeshProUGUI;

		public float countdown = 3f;

		public void Update()
		{
			countdown -= Time.deltaTime;
			if (countdown <= -1f)
			{
				Object.Destroy((Object)(object)((Component)this).gameObject);
			}
			if (Object.op_Implicit((Object)(object)textMeshProUGUI))
			{
				((TMP_Text)textMeshProUGUI).text = ((countdown > 0f) ? ("PVP STARTS IN " + Mathf.Ceil(countdown)) : "FIGHT!");
			}
		}
	}
	public class SpawnPVPCountdown : INetMessage, ISerializableObject
	{
		public float countdown;

		public SpawnPVPCountdown()
		{
		}

		public SpawnPVPCountdown(float countdown)
		{
			this.countdown = countdown;
		}

		public void Deserialize(NetworkReader reader)
		{
			countdown = reader.ReadSingle();
		}

		public void OnReceived()
		{
			GameObject val = Object.Instantiate<GameObject>(PVPModPlugin.PVPCountdownPrefab);
			PVPCountdown component = val.GetComponent<PVPCountdown>();
			component.countdown = countdown;
		}

		public void Serialize(NetworkWriter writer)
		{
			writer.Write(countdown);
		}
	}
	[CreateAssetMenu(menuName = "PVPMod/PVPModItemDef")]
	public class PVPModItemDef : ItemDef
	{
		[Serializable]
		public struct ItemTierSprite
		{
			public ItemTier itemTier;

			public Sprite sprite;
		}

		public ItemTierSprite[] itemTierSprites;
	}
	public class PVPModContentPack : IContentPackProvider
	{
		[CompilerGenerated]
		private sealed class <FinalizeAsync>d__5 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public FinalizeAsyncArgs args;

			public PVPModContentPack <>4__this;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <FinalizeAsync>d__5(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				if (<>1__state != 0)
				{
					return false;
				}
				<>1__state = -1;
				args.ReportProgress(1f);
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <GenerateContentPackAsync>d__6 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public GetContentPackAsyncArgs args;

			public PVPModContentPack <>4__this;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <GenerateContentPackAsync>d__6(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				if (<>1__state != 0)
				{
					return false;
				}
				<>1__state = -1;
				ContentPack.Copy(<>4__this.contentPack, args.output);
				args.ReportProgress(1f);
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <LoadStaticContentAsync>d__7 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public LoadStaticContentAsyncArgs args;

			public PVPModContentPack <>4__this;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <LoadStaticContentAsync>d__7(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				if (<>1__state != 0)
				{
					return false;
				}
				<>1__state = -1;
				<>4__this.contentPack.identifier = <>4__this.identifier;
				<>4__this.contentPack.itemDefs.Add(items.ToArray());
				<>4__this.contentPack.buffDefs.Add(buffs.ToArray());
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		internal ContentPack contentPack = new ContentPack();

		public static List<ItemDef> items = new List<ItemDef>();

		public static List<BuffDef> buffs = new List<BuffDef>();

		public string identifier => "com.brynzananas.pvpmod.ContentProvider";

		[IteratorStateMachine(typeof(<FinalizeAsync>d__5))]
		public IEnumerator FinalizeAsync(FinalizeAsyncArgs args)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <FinalizeAsync>d__5(0)
			{
				<>4__this = this,
				args = args
			};
		}

		[IteratorStateMachine(typeof(<GenerateContentPackAsync>d__6))]
		public IEnumerator GenerateContentPackAsync(GetContentPackAsyncArgs args)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GenerateContentPackAsync>d__6(0)
			{
				<>4__this = this,
				args = args
			};
		}

		[IteratorStateMachine(typeof(<LoadStaticContentAsync>d__7))]
		public IEnumerator LoadStaticContentAsync(LoadStaticContentAsyncArgs args)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <LoadStaticContentAsync>d__7(0)
			{
				<>4__this = this,
				args = args
			};
		}
	}
	public static class Utils
	{
		public const string damagePrefix = "<style=cIsDamage>";

		public const string stackPrefix = "<style=cStack>";

		public const string utilityPrefix = "<style=cIsUtility>";

		public const string healingPrefix = "<style=cIsHealing>";

		public const string endPrefix = "</style>";

		public static void AddLanguageToken(string token, string value)
		{
			AddLanguageToken(token, value, "en");
		}

		public static void AddLanguageToken(string token, string value, string language)
		{
			Language val = Language.languagesByName[language];
			if (val.stringsByToken.ContainsKey(token))
			{
				val.stringsByToken[token] = value;
			}
			else
			{
				val.stringsByToken.Add(token, value);
			}
		}

		public static ConfigEntry<T> CreateConfig<T>(string section, string field, T defaultValue, string description)
		{
			return CreateConfig(section, field, defaultValue, description, riskOfOptionsRestartRequired: false);
		}

		public static ConfigEntry<T> CreateConfig<T>(string section, string field, T defaultValue, string description, bool riskOfOptionsRestartRequired)
		{
			ConfigEntry<T> val = PVPModPlugin.configFile.Bind<T>(section, field, defaultValue, description);
			if (PVPModPlugin.riskOfOptionsEnabled)
			{
				ModCompatabilities.RiskOfOptionsCompatAbility.HandleConfig(val, defaultValue, riskOfOptionsRestartRequired);
			}
			PVPModPlugin.configs.Add((ConfigEntryBase)(object)val);
			return val;
		}

		public static T RegisterItemDef<T>(this T itemDef, Action<ItemDef> onItemDefAdded = null) where T : ItemDef
		{
			//IL_0034: 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_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			ConfigEntry<bool> val = CreateConfig(((Object)(object)itemDef).name, "Enable", defaultValue: true, "Enable this item?", riskOfOptionsRestartRequired: true);
			ConfigEntry<ItemTier> val2 = CreateConfig<ItemTier>(((Object)(object)itemDef).name, "Rarity", ((ItemDef)itemDef).tier, "Control rarity of this item", riskOfOptionsRestartRequired: true);
			PVPModItemDef pVPModItemDef = itemDef as PVPModItemDef;
			if (Object.op_Implicit((Object)(object)pVPModItemDef))
			{
				PVPModItemDef.ItemTierSprite[] itemTierSprites = pVPModItemDef.itemTierSprites;
				for (int i = 0; i < itemTierSprites.Length; i++)
				{
					PVPModItemDef.ItemTierSprite itemTierSprite = itemTierSprites[i];
					if (itemTierSprite.itemTier == val2.Value)
					{
						((ItemDef)pVPModItemDef).pickupIconSprite = itemTierSprite.sprite;
						((ItemDef)pVPModItemDef).deprecatedTier = val2.Value;
						break;
					}
				}
			}
			if (val == null || val.Value)
			{
				PVPModContentPack.items.Add((ItemDef)(object)itemDef);
				onItemDefAdded?.Invoke((ItemDef)(object)itemDef);
			}
			return itemDef;
		}

		public static T RegisterBuffDef<T>(this T buffDef, Action<BuffDef> onBuffDefAdded = null) where T : BuffDef
		{
			PVPModContentPack.buffs.Add((BuffDef)(object)buffDef);
			onBuffDefAdded?.Invoke((BuffDef)(object)buffDef);
			return buffDef;
		}

		public static float GetStackingFloat(float baseValue, float stackValue, int stacks)
		{
			return baseValue + (float)(stacks - 1) * stackValue;
		}
	}
	public static class ModCompatabilities
	{
		public static class RiskOfOptionsCompatAbility
		{
			public const string ModGUID = "com.rune580.riskofoptions";

			public static void HandleConfig<T>(ConfigEntry<T> configEntry, T value, bool restartRequired)
			{
				//IL_001a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0024: Expected O, but got Unknown
				//IL_003e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0048: Expected O, but got Unknown
				//IL_0062: Unknown result type (might be due to invalid IL or missing references)
				//IL_006c: Expected O, but got Unknown
				//IL_0086: Unknown result type (might be due to invalid IL or missing references)
				//IL_0090: Expected O, but got Unknown
				//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d8: Expected O, but got Unknown
				if (value is float)
				{
					ModSettingsManager.AddOption((BaseOption)new FloatFieldOption(configEntry as ConfigEntry<float>, restartRequired));
				}
				if (value is bool)
				{
					ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(configEntry as ConfigEntry<bool>, restartRequired));
				}
				if (value is int)
				{
					ModSettingsManager.AddOption((BaseOption)new IntFieldOption(configEntry as ConfigEntry<int>, restartRequired));
				}
				if (value is string)
				{
					ModSettingsManager.AddOption((BaseOption)new StringInputFieldOption(configEntry as ConfigEntry<string>, restartRequired));
				}
				if (value is Enum)
				{
					Enum @enum = value as Enum;
					if (!@enum.GetType().GetCustomAttributes<FlagsAttribute>().Any())
					{
						ModSettingsManager.AddOption((BaseOption)new ChoiceOption((ConfigEntryBase)(object)configEntry, restartRequired));
					}
				}
			}
		}
	}
}