Decompiled source of IssaMod v0.0.29

IssaPlugin.dll

Decompiled 3 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.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using IssaPlugin.Items;
using IssaPlugin.Network;
using IssaPlugin.Overlays;
using IssaPlugin.Patches;
using Microsoft.CodeAnalysis;
using Mirror;
using Unity.Collections;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.Localization;
using UnityEngine.Rendering;

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

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace IssaPlugin
{
	public class AC130Config
	{
		private const string Section = "AC130";

		private const string MaydaySection = "AC130Mayday";

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> OrbitRadius { get; private set; }

		public ConfigEntry<float> OrbitSpeed { get; private set; }

		public ConfigEntry<float> Altitude { get; private set; }

		public ConfigEntry<float> Duration { get; private set; }

		public ConfigEntry<float> CameraPitch { get; private set; }

		public ConfigEntry<float> CameraDistance { get; private set; }

		public ConfigEntry<float> FireCooldown { get; private set; }

		public ConfigEntry<float> RocketAngularJitter { get; private set; }

		public ConfigEntry<float> BoostMultiplier { get; private set; }

		public ConfigEntry<float> AltitudeOffsetMax { get; private set; }

		public ConfigEntry<float> AltitudeAdjustSpeed { get; private set; }

		public ConfigEntry<float> ZoomFov { get; private set; }

		public ConfigEntry<float> ZoomSpeed { get; private set; }

		public ConfigEntry<float> ApproachDistance { get; private set; }

		public ConfigEntry<float> ApproachSpeed { get; private set; }

		public ConfigEntry<float> BaseFov { get; private set; }

		public ConfigEntry<float> YawLimit { get; private set; }

		public ConfigEntry<float> PitchLimit { get; private set; }

		public ConfigEntry<float> MouseSensitivity { get; private set; }

		public ConfigEntry<float> HeavyFireCooldown { get; private set; }

		public ConfigEntry<float> HeavyShotsBeforeReload { get; private set; }

		public ConfigEntry<float> HeavyReloadTime { get; private set; }

		public ConfigEntry<bool> MaydayEnabled { get; private set; }

		public ConfigEntry<Key> MaydayKey { get; private set; }

		public ConfigEntry<float> MaydayDiveSteepRate { get; private set; }

		public ConfigEntry<float> MaydayInitialDiveAngle { get; private set; }

		public ConfigEntry<float> MaydayMaxDiveAngle { get; private set; }

		public ConfigEntry<float> MaydayPullInfluence { get; private set; }

		public ConfigEntry<float> MaydayRollSpeed { get; private set; }

		public ConfigEntry<float> MaydaySpeed { get; private set; }

		public ConfigEntry<float> MaydayDrift { get; private set; }

		public ConfigEntry<float> MaydayCenterBias { get; private set; }

		public ConfigEntry<float> MaydayCamYawLimit { get; private set; }

		public ConfigEntry<float> MaydayCamPitchLimit { get; private set; }

		public ConfigEntry<float> MaydayShakeBase { get; private set; }

		public ConfigEntry<float> MaydayShakeMax { get; private set; }

		public ConfigEntry<float> MaydayExplosionScale { get; private set; }

		public ConfigEntry<float> MaydayExplosionDuration { get; private set; }

		public ConfigEntry<float> MaydayRollTurnRate { get; private set; }

		public ConfigEntry<float> HitsToMayday { get; private set; }

		public ConfigEntry<float> RocketProximityFuse { get; private set; }

		public ConfigEntry<bool> ApplyCoffeeBoostAfterwards { get; private set; }

		public ConfigEntry<float> ExplosionScale { get; private set; }

		public ConfigEntry<float> HeavyRocketExplosionScale { get; private set; }

		public AC130Config(ConfigFile cfg, GlobalConfig global)
		{
			Uses = cfg.Bind<float>("AC130", "Uses", 1f, "Number of AC130 uses per pickup.");
			GiveKey = cfg.Bind<Key>("AC130", "GiveKey", (Key)104, "Key to press to add the AC130 to your inventory.");
			OrbitRadius = cfg.Bind<float>("AC130", "OrbitRadius", 100f, "Radius in units of the circle the gunship flies around the map centre.");
			OrbitSpeed = cfg.Bind<float>("AC130", "OrbitSpeed", 6f, "Degrees per second at which the gunship orbits the map centre.");
			Altitude = cfg.Bind<float>("AC130", "Altitude", 140f, "Height above the map centre the gunship flies at.");
			Duration = cfg.Bind<float>("AC130", "Duration", 20f, "How many seconds the AC130 remains active before leaving.");
			CameraPitch = cfg.Bind<float>("AC130", "CameraPitch", 80f, "Camera pitch angle in degrees during the AC130 (0 = horizontal, 90 = straight down).");
			CameraDistance = cfg.Bind<float>("AC130", "CameraDistance", 80f, "Camera distance addition from the gunship pivot during the AC130.");
			FireCooldown = cfg.Bind<float>("AC130", "FireCooldown", 0.35f, "Minimum seconds between rocket fires.");
			HeavyFireCooldown = cfg.Bind<float>("AC130", "HeavyFireCooldown", 3f, "Minimum seconds between heavy (big shot) rocket fires.");
			HeavyShotsBeforeReload = cfg.Bind<float>("AC130", "HeavyShotsBeforeReload", 3f, "Number of big shots before the heavy rocket must reload.");
			HeavyReloadTime = cfg.Bind<float>("AC130", "HeavyReloadTime", 8f, "Time in seconds for the heavy rocket to reload after depleting all big shots.");
			RocketAngularJitter = cfg.Bind<float>("AC130", "RocketAngularJitter", 0.5f, "Random angular jitter in degrees applied to each rocket fired from the AC130.");
			BoostMultiplier = cfg.Bind<float>("AC130", "BoostMultiplier", 2.25f, "Multiplier applied to orbit speed when holding Left Shift.");
			AltitudeOffsetMax = cfg.Bind<float>("AC130", "AltitudeOffsetMax", 80f, "Maximum units the player can raise the gunship from its base altitude using Q/E.");
			AltitudeAdjustSpeed = cfg.Bind<float>("AC130", "AltitudeAdjustSpeed", 10f, "Units per second the gunship rises or descends when holding Q or E.");
			ZoomFov = cfg.Bind<float>("AC130", "ZoomFov", 20f, "Field of view when right-click zooming in the AC130. Lower values zoom in more (default camera FOV is typically 60).");
			ZoomSpeed = cfg.Bind<float>("AC130", "ZoomSpeed", 8f, "Speed at which the camera lerps to and from the zoomed FOV when right-clicking.");
			ApproachDistance = cfg.Bind<float>("AC130", "ApproachDistance", 200f, "How far away the AC130 spawns and flies in from before reaching the orbit point.");
			ApproachSpeed = cfg.Bind<float>("AC130", "ApproachSpeed", 60f, "Speed in units per second at which the AC130 flies in and out.");
			BaseFov = cfg.Bind<float>("AC130", "BaseFov", 60f, "Base field of view for the AC130 camera.");
			YawLimit = cfg.Bind<float>("AC130", "YawLimit", 40f, "How many degrees left/right the player can pan from the map centre.");
			PitchLimit = cfg.Bind<float>("AC130", "PitchLimit", 30f, "How many degrees up/down the player can pan from the map centre.");
			MouseSensitivity = cfg.Bind<float>("AC130", "MouseSensitivity", 0.15f, "How sensitive the player's mouse is to panning the camera.");
			ApplyCoffeeBoostAfterwards = cfg.Bind<bool>("AC130", "ApplyCoffeeBoostAfterwards", true, "Give the user of an AC130 a max coffee boost after the AC130 ends to make up for the time they spent sitting in the AC130, not golfing.");
			MaydayEnabled = cfg.Bind<bool>("AC130Mayday", "Enabled", true, "Whether the manual mayday self-destruct hotkey is available.");
			MaydayKey = cfg.Bind<Key>("AC130Mayday", "Key", (Key)27, "Hotkey to manually trigger mayday (self-destruct) while in an AC130 session.");
			MaydayDiveSteepRate = cfg.Bind<float>("AC130Mayday", "DiveSteepRate", 8f, "Degrees per second at which the dive pitch steepens toward vertical.");
			MaydayInitialDiveAngle = cfg.Bind<float>("AC130Mayday", "InitialDiveAngle", 20f, "Starting pitch angle (degrees below horizontal) when mayday begins.");
			MaydayMaxDiveAngle = cfg.Bind<float>("AC130Mayday", "MaxDiveAngle", 85f, "Maximum pitch angle (degrees below horizontal) the dive steepens to.");
			MaydayPullInfluence = cfg.Bind<float>("AC130Mayday", "PullInfluence", 6f, "Degrees per second of pitch influence the player has when holding W/S during mayday.");
			MaydayRollSpeed = cfg.Bind<float>("AC130Mayday", "RollSpeed", 45f, "Degrees per second the player can roll the gunship with A/D during mayday.");
			MaydaySpeed = cfg.Bind<float>("AC130Mayday", "Speed", 80f, "Forward speed of the gunship during the mayday dive in units per second.");
			MaydayDrift = cfg.Bind<float>("AC130Mayday", "Drift", 3f, "Maximum random lateral drift added to the dive direction per second.");
			MaydayCenterBias = cfg.Bind<float>("AC130Mayday", "CenterBias", 0.4f, "Lerp strength per second toward map centre during the dive. Higher = tighter spiral, lower = nearly straight. Default 0.4.");
			MaydayCamYawLimit = cfg.Bind<float>("AC130Mayday", "CamYawLimit", 25f, "How many degrees left/right the player can look during mayday.");
			MaydayCamPitchLimit = cfg.Bind<float>("AC130Mayday", "CamPitchLimit", 15f, "How many degrees up/down the player can look during mayday.");
			MaydayShakeBase = cfg.Bind<float>("AC130Mayday", "ShakeBase", 0.3f, "Camera shake intensity at the start of the mayday dive.");
			MaydayShakeMax = cfg.Bind<float>("AC130Mayday", "ShakeMax", 2.5f, "Maximum camera shake intensity at the end of the dive.");
			MaydayExplosionScale = cfg.Bind<float>("AC130Mayday", "ExplosionScale", 4f, "Explosion scale multiplier for the mayday crash. Affects blast radius, knockback, and VFX size.");
			MaydayExplosionDuration = cfg.Bind<float>("AC130Mayday", "ExplosionDuration", 12f, "How long (seconds) the crash explosion VFX lingers before being destroyed.");
			MaydayRollTurnRate = cfg.Bind<float>("AC130Mayday", "RollTurnRate", 45f, "Degrees per second of yaw the aircraft gains when fully banked (90° roll). Controls how tightly rolling steers the plane left/right.");
			HitsToMayday = cfg.Bind<float>("AC130Mayday", "HitsToMayday", 1f, "Number of rocket hits required to force the gunship into mayday. Only counts hits during an active session. Set to 0 to disable.");
			RocketProximityFuse = cfg.Bind<float>("AC130Mayday", "RocketProximityFuse", 4f, "Distance in metres at which a homing rocket detonates near the gunship. Must be less than 5 m so the explosion's overlap sphere (radius 5 m) still reaches the gunship and registers the hit.");
			ExplosionScale = cfg.Bind<float>("Explosions", "AC130Scale", 2.25f, "Multiplier for AC130 rocket explosions. Affects blast radius, knockback, and VFX size.");
			HeavyRocketExplosionScale = cfg.Bind<float>("Explosions", "AC130HeavyRocketScale", 5f, "Multiplier for AC130 heavy (big shot) rocket explosions. Affects blast radius, knockback, and VFX size.");
		}
	}
	public class AK47Config
	{
		private const string Section = "AK47";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> FireRate { get; private set; }

		public ConfigEntry<float> Inaccuracy { get; private set; }

		public ConfigEntry<float> MaxAimingDistance { get; private set; }

		public ConfigEntry<float> MaxShotDistance { get; private set; }

		public ConfigEntry<float> ScreenShakeIntensity { get; private set; }

		public AK47Config(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("AK47", "GiveKey", (Key)80, "Debug key to add the Sub-Machine Gun to your inventory.");
			Uses = cfg.Bind<float>("AK47", "Uses", 10f, "Total bullets per Sub-Machine Gun pickup. Each shot consumes one use.");
			FireRate = cfg.Bind<float>("AK47", "FireRate", 0.04f, "Seconds between each bullet in the burst.");
			Inaccuracy = cfg.Bind<float>("AK47", "Inaccuracy", 5f, "Random spread angle (degrees) applied to each bullet. Higher = less accurate.");
			MaxAimingDistance = cfg.Bind<float>("AK47", "MaxAimingDistance", 500f, "Max distance used when computing the aim point for each bullet.");
			MaxShotDistance = cfg.Bind<float>("AK47", "MaxShotDistance", 500f, "Max raycast distance for each bullet.");
			ScreenShakeIntensity = cfg.Bind<float>("AK47", "ScreenShakeIntensity", 0.25f, "Intensity of the screen shake when firing the AK47. 0 disables it. Higher values shake more.");
		}
	}
	public class BaseballBatConfig
	{
		private const string Section = "BaseballBat";

		public ConfigEntry<float> PowerMultiplier { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<Key> GiveKey { get; private set; }

		public BaseballBatConfig(ConfigFile cfg, GlobalConfig global)
		{
			PowerMultiplier = cfg.Bind<float>("BaseballBat", "PowerMultiplier", 3f, "Multiplier applied to the golf swing power when using the bat.");
			Uses = cfg.Bind<float>("BaseballBat", "Uses", 99f, "Number of swings before the bat is consumed. Set high for near-infinite use.");
			GiveKey = cfg.Bind<Key>("BaseballBat", "GiveKey", (Key)100, "Key to press to add the baseball bat to your inventory.");
		}
	}
	public class BearConfig
	{
		private const string Section = "Bear";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> Count { get; private set; }

		public ConfigEntry<float> SpawnRadius { get; private set; }

		public ConfigEntry<float> SessionDuration { get; private set; }

		public ConfigEntry<float> WalkSpeed { get; private set; }

		public ConfigEntry<float> RunSpeed { get; private set; }

		public ConfigEntry<float> ChargeSpeed { get; private set; }

		public ConfigEntry<float> TurnSpeed { get; private set; }

		public ConfigEntry<float> WanderRadius { get; private set; }

		public ConfigEntry<float> ChargeRange { get; private set; }

		public ConfigEntry<float> AttackRange { get; private set; }

		public ConfigEntry<float> AttackCooldown { get; private set; }

		public ConfigEntry<float> AttackAnimationDuration { get; private set; }

		public ConfigEntry<float> SpawnAnimationDuration { get; private set; }

		public ConfigEntry<float> DeathAnimationDuration { get; private set; }

		public ConfigEntry<float> StunDuration { get; private set; }

		public ConfigEntry<float> EnrageDuration { get; private set; }

		public ConfigEntry<float> EnrageSpeedMultiplier { get; private set; }

		public ConfigEntry<float> MaxHP { get; private set; }

		public ConfigEntry<float> DamageDuelingPistol { get; private set; }

		public ConfigEntry<float> DamageElephantGun { get; private set; }

		public ConfigEntry<float> DamageRocketDirect { get; private set; }

		public ConfigEntry<float> DamageRocketExplosion { get; private set; }

		public ConfigEntry<float> DamageGolfClub { get; private set; }

		public ConfigEntry<float> DamageBaseballBat { get; private set; }

		public ConfigEntry<float> DamageOrbitalLaser { get; private set; }

		public ConfigEntry<float> MeleeKnockbackForce { get; private set; }

		public ConfigEntry<float> BatKnockbackForce { get; private set; }

		public ConfigEntry<float> MaxClimbHeight { get; private set; }

		public ConfigEntry<float> TargetLockDuration { get; private set; }

		public ConfigEntry<float> TargetStealThreshold { get; private set; }

		public ConfigEntry<float> TargetAbandonDistance { get; private set; }

		public ConfigEntry<float> AggroStealThreshold { get; private set; }

		public ConfigEntry<float> AggroDuration { get; private set; }

		public ConfigEntry<float> MeleeHitRange { get; private set; }

		public ConfigEntry<bool> FriendlyFire { get; private set; }

		public ConfigEntry<bool> AttackFinishedPlayers { get; private set; }

		public BearConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("Bear", "GiveKey", (Key)89, "Debug key to add the Bear item to your inventory.");
			Uses = cfg.Bind<float>("Bear", "Uses", 1f, "Number of uses per Bear item pickup.");
			Count = cfg.Bind<float>("Bear", "BearCount", 2f, "Number of bears spawned per item use.");
			SpawnRadius = cfg.Bind<float>("Bear", "SpawnRadius", 15f, "Radius around the player within which bears spawn.");
			SessionDuration = cfg.Bind<float>("Bear", "SessionDuration", 60f, "Seconds before all remaining bears are forcibly despawned.");
			WalkSpeed = cfg.Bind<float>("Bear", "WalkSpeed", 4f, "Bear movement speed while wandering or obstructed (units/sec).");
			RunSpeed = cfg.Bind<float>("Bear", "RunSpeed", 9f, "Bear movement speed while pursuing a target (units/sec).");
			ChargeSpeed = cfg.Bind<float>("Bear", "ChargeSpeed", 14f, "Bear movement speed during the committed charge phase (units/sec).");
			TurnSpeed = cfg.Bind<float>("Bear", "TurnSpeed", 6f, "How quickly the bear rotates to face its movement direction.");
			WanderRadius = cfg.Bind<float>("Bear", "WanderRadius", 12f, "Radius of the area the bear wanders within when idle.");
			ChargeRange = cfg.Bind<float>("Bear", "ChargeRange", 10f, "Distance at which the bear commits to a charge attack (units).");
			AttackRange = cfg.Bind<float>("Bear", "AttackRange", 2.8f, "Distance at which the bear's attack swing connects (units).");
			AttackCooldown = cfg.Bind<float>("Bear", "AttackCooldown", 1.8f, "Seconds between the end of one attack and the start of the next pursuit.");
			AttackAnimationDuration = cfg.Bind<float>("Bear", "AttackAnimationDuration", 1.2f, "Total duration of the attack animation. Hit is applied at 55% of this value.");
			SpawnAnimationDuration = cfg.Bind<float>("Bear", "SpawnAnimationDuration", 2f, "Duration of the Buff/spawn-in animation before the bear begins hunting.");
			DeathAnimationDuration = cfg.Bind<float>("Bear", "DeathAnimationDuration", 2.5f, "How long the death animation plays before the bear is destroyed.");
			StunDuration = cfg.Bind<float>("Bear", "StunDuration", 2f, "Seconds the bear is stunned after being hit by an explosion.");
			EnrageDuration = cfg.Bind<float>("Bear", "EnrageDuration", 5f, "Seconds the bear runs at enrage speed after recovering from a stun.");
			EnrageSpeedMultiplier = cfg.Bind<float>("Bear", "EnrageSpeedMultiplier", 1.5f, "Speed multiplier applied to RunSpeed during enrage.");
			MaxHP = cfg.Bind<float>("Bear", "MaxHP", 100f, "Maximum HP for a bear. Each hit reduces HP by the weapon's damage value; bear dies at 0.");
			DamageDuelingPistol = cfg.Bind<float>("Bear", "DamageDuelingPistol", 25f, "HP damage dealt to a bear by a dueling pistol shot.");
			DamageElephantGun = cfg.Bind<float>("Bear", "DamageElephantGun", 50f, "HP damage dealt to a bear by an elephant gun shot.");
			DamageRocketDirect = cfg.Bind<float>("Bear", "DamageRocketDirect", 100f, "HP damage dealt to a bear by a direct rocket hit (explosion centre within 1.5 units).");
			DamageRocketExplosion = cfg.Bind<float>("Bear", "DamageRocketExplosion", 35f, "HP damage dealt to a bear by rocket splash damage (not a direct hit).");
			DamageGolfClub = cfg.Bind<float>("Bear", "DamageGolfClub", 25f, "HP damage dealt to a bear by a golf club swing.");
			DamageBaseballBat = cfg.Bind<float>("Bear", "DamageBaseballBat", 40f, "HP damage dealt to a bear by a baseball bat swing.");
			DamageOrbitalLaser = cfg.Bind<float>("Bear", "DamageOrbitalLaser", 100f, "HP damage dealt to a bear by the orbital laser.");
			MeleeKnockbackForce = cfg.Bind<float>("Bear", "MeleeKnockbackForce", 12f, "Impulse force applied to a bear's rigidbody when hit by a golf club swing.");
			BatKnockbackForce = cfg.Bind<float>("Bear", "BatKnockbackForce", 22f, "Impulse force applied to a bear's rigidbody when hit by a baseball bat swing.");
			MaxClimbHeight = cfg.Bind<float>("Bear", "MaxClimbHeight", 6f, "Max height difference (units) before a target is considered unreachable.");
			TargetLockDuration = cfg.Bind<float>("Bear", "TargetLockDuration", 8f, "Minimum seconds a bear keeps its target before re-evaluating.");
			TargetStealThreshold = cfg.Bind<float>("Bear", "TargetStealThreshold", 12f, "A new candidate must be this many units closer to steal the lock after the timer expires.");
			TargetAbandonDistance = cfg.Bind<float>("Bear", "TargetAbandonDistance", 65f, "If the locked target moves beyond this distance the lock is dropped immediately.");
			AggroStealThreshold = cfg.Bind<float>("Bear", "AggroStealThreshold", 4f, "A player who hit the bear can steal the lock if at least this many units closer (lower bar than normal steal).");
			AggroDuration = cfg.Bind<float>("Bear", "AggroDuration", 15f, "How long (seconds) aggro on a specific player lasts after they hit the bear.");
			MeleeHitRange = cfg.Bind<float>("Bear", "MeleeHitRange", 2.5f, "Radius (units) around the swing hitbox centre that counts as a golf-club/bat hit on a bear.");
			FriendlyFire = cfg.Bind<bool>("Bear", "FriendlyFire", false, "If false, bears will not target or attack the player who summoned them.");
			AttackFinishedPlayers = cfg.Bind<bool>("Bear", "AttackFinishedPlayers", false, "If true, bears will target players who have already holed out. If false, bears ignore them.");
		}
	}
	public class BlackHoleGrenadeConfig
	{
		private const string Section = "BlackHoleGrenade";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> ThrowSpeed { get; private set; }

		public ConfigEntry<float> MaxThrowSpeed { get; private set; }

		public ConfigEntry<float> LobAngle { get; private set; }

		public ConfigEntry<float> GraceTime { get; private set; }

		public ConfigEntry<float> SuckDuration { get; private set; }

		public ConfigEntry<float> SuckRadius { get; private set; }

		public ConfigEntry<float> SuckForce { get; private set; }

		public ConfigEntry<float> MaxSuckForce { get; private set; }

		public ConfigEntry<float> SpitForce { get; private set; }

		public ConfigEntry<float> SpitVfxScale { get; private set; }

		public ConfigEntry<float> KnockdownRadius { get; private set; }

		public ConfigEntry<bool> ExcludeThrower { get; private set; }

		public ConfigEntry<float> BonusGolfCartForceMultiplier { get; private set; }

		public ConfigEntry<bool> AffectsGolfBalls { get; private set; }

		public BlackHoleGrenadeConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("BlackHoleGrenade", "GiveKey", (Key)91, "Debug key to add the Black Hole Grenade to your inventory.");
			Uses = cfg.Bind<float>("BlackHoleGrenade", "Uses", 1f, "Number of uses per Black Hole Grenade pickup.");
			ThrowSpeed = cfg.Bind<float>("BlackHoleGrenade", "ThrowSpeed", 20f, "Initial throw speed in m/s.");
			MaxThrowSpeed = cfg.Bind<float>("BlackHoleGrenade", "MaxThrowSpeed", 30f, "Server-side clamp on throw speed to prevent exploits.");
			LobAngle = cfg.Bind<float>("BlackHoleGrenade", "LobAngle", 0.4f, "Upward component added to the throw direction to create an arc. 0 = flat, 1 = 45° upward.");
			GraceTime = cfg.Bind<float>("BlackHoleGrenade", "GraceTime", 0.35f, "Seconds after throwing before the grenade can stick to the ground.");
			SuckDuration = cfg.Bind<float>("BlackHoleGrenade", "SuckDuration", 6f, "How many seconds the suction phase lasts before spitting.");
			SuckRadius = cfg.Bind<float>("BlackHoleGrenade", "SuckRadius", 35f, "Radius in units of the suction field.");
			SuckForce = cfg.Bind<float>("BlackHoleGrenade", "SuckForce", 8f, "Suction acceleration (m/s²) applied at the outer edge of the suction field.");
			MaxSuckForce = cfg.Bind<float>("BlackHoleGrenade", "MaxSuckForce", 40f, "Suction acceleration (m/s²) applied right at the center of the black hole.");
			SpitForce = cfg.Bind<float>("BlackHoleGrenade", "SpitForce", 35f, "Speed (m/s) at which objects and players are ejected during the spit phase.");
			SpitVfxScale = cfg.Bind<float>("BlackHoleGrenade", "SpitVfxScale", 3f, "Scale of the explosion VFX played on all clients when the black hole collapses.");
			KnockdownRadius = cfg.Bind<float>("BlackHoleGrenade", "KnockdownRadius", 15f, "Distance from the black hole at which a player gets knocked down. Must be less than SuckRadius. Set to 0 to disable.");
			ExcludeThrower = cfg.Bind<bool>("BlackHoleGrenade", "ExcludeThrower", true, "If true, the player who threw the grenade is not affected by suction or spit.");
			BonusGolfCartForceMultiplier = cfg.Bind<float>("BlackHoleGrenade", "BonusGolfCartForceMultiplier", 2f, "Additional force multiplier applied to golf carts.");
			AffectsGolfBalls = cfg.Bind<bool>("BlackHoleGrenade", "AffectsGolfBalls", true, "If true, the black hole grenade sucks in and spits out golf balls. Set to false to leave golf balls unaffected.");
		}
	}
	public class DonutConfig
	{
		private const string Section = "Donut";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> Speed { get; private set; }

		public ConfigEntry<float> Altitude { get; private set; }

		public ConfigEntry<float> TerrainFollowSpeed { get; private set; }

		public ConfigEntry<float> TurnSpeed { get; private set; }

		public ConfigEntry<float> CameraPitch { get; private set; }

		public ConfigEntry<float> CameraDistance { get; private set; }

		public ConfigEntry<float> MouseSensitivity { get; private set; }

		public ConfigEntry<float> Duration { get; private set; }

		public ConfigEntry<float> LaserUses { get; private set; }

		public ConfigEntry<float> LaserAnticipationDuration { get; private set; }

		public ConfigEntry<float> LaserCooldown { get; private set; }

		public ConfigEntry<float> HitsToDestroy { get; private set; }

		public ConfigEntry<float> CrashImpactForce { get; private set; }

		public ConfigEntry<float> CrashDownwardForce { get; private set; }

		public ConfigEntry<float> CrashTorque { get; private set; }

		public ConfigEntry<float> CrashExplosionScale { get; private set; }

		public DonutConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("Donut", "GiveKey", (Key)86, "Debug key to add the Donut to your inventory.");
			Uses = cfg.Bind<float>("Donut", "Uses", 1f, "Number of Donut uses per pickup.");
			Speed = cfg.Bind<float>("Donut", "Speed", 30f, "Horizontal movement speed of the Donut in units per second.");
			Altitude = cfg.Bind<float>("Donut", "Altitude", 20f, "Height above terrain the Donut hovers at.");
			TerrainFollowSpeed = cfg.Bind<float>("Donut", "TerrainFollowSpeed", 5f, "How quickly the Donut adjusts its altitude to match terrain changes (lerp speed).");
			TurnSpeed = cfg.Bind<float>("Donut", "TurnSpeed", 8f, "How quickly the Donut rotates to face the movement direction (Slerp speed).");
			CameraPitch = cfg.Bind<float>("Donut", "CameraPitch", 60f, "Camera pitch angle in degrees during the Donut session (0 = horizontal, 90 = straight down).");
			CameraDistance = cfg.Bind<float>("Donut", "CameraDistance", 40f, "Camera distance addition from the Donut during the session.");
			MouseSensitivity = cfg.Bind<float>("Donut", "MouseSensitivity", 0.2f, "Mouse X sensitivity for rotating the Donut orbit camera.");
			Duration = cfg.Bind<float>("Donut", "Duration", 30f, "How many seconds the Donut session lasts before automatically ending.");
			LaserUses = cfg.Bind<float>("Donut", "LaserUses", 3f, "How many orbital laser strikes the player can fire during a Donut session.");
			LaserAnticipationDuration = cfg.Bind<float>("Donut", "LaserAnticipationDuration", 1.5f, "Seconds of anticipation before the orbital laser fires. The laser tracks the Donut during this window.");
			LaserCooldown = cfg.Bind<float>("Donut", "LaserCooldown", 3f, "Minimum seconds between orbital laser fires.");
			HitsToDestroy = cfg.Bind<float>("Donut", "HitsToDestroy", 1f, "Rocket hits required to shoot down the Donut. Set to 0 to make it invincible.");
			CrashImpactForce = cfg.Bind<float>("Donut", "CrashImpactForce", 500f, "Impulse force applied to the Donut in the direction of the rocket hit when shot down.");
			CrashDownwardForce = cfg.Bind<float>("Donut", "CrashDownwardForce", 15f, "Impulse force applied to the Donut in the downward direction.");
			CrashTorque = cfg.Bind<float>("Donut", "CrashTorque", 1.2f, "Magnitude of the random tumble torque applied to the Donut when shot down.");
			CrashExplosionScale = cfg.Bind<float>("Donut", "CrashExplosionScale", 4f, "Explosion scale multiplier for when a Donut crashes. Affects blast radius, knockback, and VFX size.");
		}
	}
	public class DroneSwarmConfig
	{
		private const string Section = "DroneSwarm";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> BaseDroneCount { get; private set; }

		public ConfigEntry<float> PerPlayerScalingFactor { get; private set; }

		public ConfigEntry<float> Altitude { get; private set; }

		public ConfigEntry<float> WanderRadius { get; private set; }

		public ConfigEntry<float> WanderSpeed { get; private set; }

		public ConfigEntry<float> WanderTurnRate { get; private set; }

		public ConfigEntry<float> AltitudeVariance { get; private set; }

		public ConfigEntry<float> CircleTimeMin { get; private set; }

		public ConfigEntry<float> CircleTimeMax { get; private set; }

		public ConfigEntry<float> DiveSpeed { get; private set; }

		public ConfigEntry<float> DiveAcceleration { get; private set; }

		public ConfigEntry<float> HomingStopDistance { get; private set; }

		public ConfigEntry<float> ArrivalRadius { get; private set; }

		public ConfigEntry<float> ExplosionScale { get; private set; }

		public ConfigEntry<bool> FriendlyFire { get; private set; }

		public ConfigEntry<bool> AttackFinishedPlayers { get; private set; }

		public ConfigEntry<float> MaxSessionDuration { get; private set; }

		public DroneSwarmConfig(ConfigFile cfg, GlobalConfig global)
		{
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Expected O, but got Unknown
			GiveKey = cfg.Bind<Key>("DroneSwarm", "GiveKey", (Key)77, "Debug key to add the Drone Swarm item to your inventory.");
			Uses = cfg.Bind<float>("DroneSwarm", "Uses", 1f, "Number of uses per Drone Swarm pickup.");
			BaseDroneCount = cfg.Bind<float>("DroneSwarm", "BaseDroneCount", 15f, "Number of drones spawned per use. Keep at or below 12 to avoid network overhead.");
			PerPlayerScalingFactor = cfg.Bind<float>("DroneSwarm", "PerPlayerScalingFactor", 0.1f, new ConfigDescription("Increase the DroneCount as: DroneCount = BaseDroneCount * (1 + [NumPlayers * PerPlayerScalingFactor]). Set to 0 to disable.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f), Array.Empty<object>()));
			Altitude = cfg.Bind<float>("DroneSwarm", "Altitude", 300f, "Height (metres) at which drones circle above the player centroid.");
			WanderRadius = cfg.Bind<float>("DroneSwarm", "WanderRadius", 150f, "Maximum distance (metres) from the wander centre a drone waypoint may be placed.");
			WanderSpeed = cfg.Bind<float>("DroneSwarm", "WanderSpeed", 125f, "Cruise speed (metres/second) while drones are wandering before they dive.");
			WanderTurnRate = cfg.Bind<float>("DroneSwarm", "WanderTurnRate", 45f, "Maximum steering rate (degrees/second) while wandering. Lower = lazier, wider arcs. Higher = tighter turns.");
			AltitudeVariance = cfg.Bind<float>("DroneSwarm", "AltitudeVariance", 25f, "Half-range (metres) of random altitude variation added to each waypoint. Drones pick altitudes between Altitude ± AltitudeVariance.");
			CircleTimeMin = cfg.Bind<float>("DroneSwarm", "CircleTimeMin", 3f, "Minimum seconds a drone circles before diving (randomised per drone).");
			CircleTimeMax = cfg.Bind<float>("DroneSwarm", "CircleTimeMax", 30f, "Maximum seconds a drone circles before diving (randomised per drone).");
			DiveSpeed = cfg.Bind<float>("DroneSwarm", "DiveSpeed", 20f, "Initial dive speed in metres per second.");
			DiveAcceleration = cfg.Bind<float>("DroneSwarm", "DiveAcceleration", 40f, "How many metres per second the dive speed increases each second.");
			HomingStopDistance = cfg.Bind<float>("DroneSwarm", "HomingStopDistance", 75f, "Distance from the target (metres) at which the drone stops tracking and flies straight, giving the target a chance to dodge. Set to 0 to always home.");
			ArrivalRadius = cfg.Bind<float>("DroneSwarm", "ArrivalRadius", 3f, "Distance from the aim point (metres) at which the drone detonates.");
			ExplosionScale = cfg.Bind<float>("DroneSwarm", "ExplosionScale", 1.05f, "Scale multiplier for the drone impact explosion radius and force.");
			FriendlyFire = cfg.Bind<bool>("DroneSwarm", "FriendlyFire", false, "If true, drones may target the player who summoned them.");
			AttackFinishedPlayers = cfg.Bind<bool>("DroneSwarm", "AttackFinishedPlayers", false, "If true, drones may target players who have already holed out.");
			MaxSessionDuration = cfg.Bind<float>("DroneSwarm", "MaxSessionDuration", 60f, "Safety cap (seconds) after which any remaining drones are force-destroyed.");
		}
	}
	public class FlamethrowerConfig
	{
		private const string Section = "Flamethrower";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> FuelPerUse { get; private set; }

		public ConfigEntry<float> BurnDuration { get; private set; }

		public ConfigEntry<float> BurnRequestInterval { get; private set; }

		public FlamethrowerConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("Flamethrower", "GiveKey", (Key)98, "Hotkey to give yourself a Flamethrower (debug/testing).");
			Uses = cfg.Bind<float>("Flamethrower", "Uses", 1f, "Number of fuel canisters per Flamethrower pickup. Each canister provides FuelPerUse seconds of fire.");
			FuelPerUse = cfg.Bind<float>("Flamethrower", "FuelPerUse", 3f, "Seconds of continuous fire provided by each fuel canister.");
			BurnDuration = cfg.Bind<float>("Flamethrower", "BurnDuration", 4f, "Seconds a hit player stays on fire after the last flamethrower contact. Resets on each new hit.");
			BurnRequestInterval = cfg.Bind<float>("Flamethrower", "BurnRequestInterval", 0.5f, "Minimum seconds between burn-request messages sent per victim while the flame collider overlaps them.");
		}
	}
	public class FreezeConfig
	{
		private const string Section = "FreezeWorld";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> Duration { get; private set; }

		public ConfigEntry<float> Friction { get; private set; }

		public ConfigEntry<float> Bounciness { get; private set; }

		public ConfigEntry<float> CartSidewaysStiffness { get; private set; }

		public ConfigEntry<float> GripRadius { get; private set; }

		public FreezeConfig(ConfigFile cfg, GlobalConfig global)
		{
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Expected O, but got Unknown
			GiveKey = cfg.Bind<Key>("FreezeWorld", "GiveKey", (Key)105, "Debug key to add the Freeze World item to your inventory.");
			Uses = cfg.Bind<float>("FreezeWorld", "Uses", 1f, "Number of uses per Freeze World pickup.");
			Duration = cfg.Bind<float>("FreezeWorld", "Duration", 15f, "Seconds the world stays frozen before physics and visuals are restored.");
			Friction = cfg.Bind<float>("FreezeWorld", "Friction", 0.05f, "Surface friction applied to all physics contacts during a freeze (0 = frictionless).");
			Bounciness = cfg.Bind<float>("FreezeWorld", "Bounciness", 0.2f, new ConfigDescription("Surface bounciness applied to all physics contacts during a freeze.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>()));
			CartSidewaysStiffness = cfg.Bind<float>("FreezeWorld", "CartSidewaysStiffness", 0.15f, "Sideways friction stiffness for golf cart wheel colliders while frozen (0 = no grip, 1 = normal). Lower values cause more drift.");
			GripRadius = cfg.Bind<float>("FreezeWorld", "GripRadius", 1.5f, "Distance (metres) from the local player's own ball within which normal traction is restored, allowing them to stop and take a shot.");
		}
	}
	public class GlobalConfig
	{
		private readonly Dictionary<int, ConfigEntry<bool>> _itemEnabledEntries = new Dictionary<int, ConfigEntry<bool>>();

		private readonly Dictionary<int, ConfigEntry<bool>> _itemWarningEnabledEntries = new Dictionary<int, ConfigEntry<bool>>();

		public const int PoolAhead = 0;

		public const int PoolLead = 1;

		public const int PoolBehind50 = 2;

		public const int PoolBehind125 = 3;

		public const int PoolBehind200 = 4;

		public const int PoolMobility = 5;

		private static readonly (int pool, string suffix)[] PoolSuffixes = new(int, string)[6]
		{
			(1, "Lead"),
			(2, "Behind50"),
			(3, "Behind125"),
			(4, "Behind200"),
			(0, "Ahead"),
			(5, "Mobility")
		};

		private readonly Dictionary<(int itemType, int pool), ConfigEntry<float>> _poolWeightEntries = new Dictionary<(int, int), ConfigEntry<float>>();

		public ConfigEntry<bool> CustomItemSpawnsEnabled { get; private set; }

		public ConfigEntry<float> CustomItemSpawnRate { get; private set; }

		public ConfigEntry<bool> AllowHotkeyItemGiving { get; private set; }

		public ConfigEntry<bool> BloodEffectsEnabled { get; private set; }

		public ConfigEntry<float> NumInventorySlots { get; private set; }

		public ConfigEntry<bool> FirstPlaceStarEnabled { get; private set; }

		public ConfigEntry<float> FirstPlaceStarHeight { get; private set; }

		public ConfigEntry<Key> SpawnConfigUIKey { get; private set; }

		public ConfigEntry<bool> WarningsEnabled { get; private set; }

		public ConfigEntry<float> WarningDuration { get; private set; }

		public ConfigEntry<bool> WarningShowForSelf { get; private set; }

		public ConfigEntry<bool> WarningSymbolEnabled { get; private set; }

		public ConfigEntry<float> WarningPrefabScale { get; private set; }

		public ConfigEntry<float> WarningSymbolAlpha { get; private set; }

		public ConfigEntry<float> WarningPiPScale { get; private set; }

		public bool GetItemEnabled(ItemType itemType)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected I4, but got Unknown
			ConfigEntry<bool> value;
			return !_itemEnabledEntries.TryGetValue((int)itemType, out value) || value.Value;
		}

		public void SetItemEnabled(ItemType itemType, bool enabled)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Expected I4, but got Unknown
			if (_itemEnabledEntries.TryGetValue((int)itemType, out var value))
			{
				value.Value = enabled;
			}
		}

		public bool GetItemWarningEnabled(ItemType itemType)
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected I4, but got Unknown
			ConfigEntry<bool> value;
			return WarningsEnabled.Value && _itemWarningEnabledEntries.TryGetValue((int)itemType, out value) && value.Value;
		}

		public float GetItemPoolWeight(ItemType itemType, int poolIndex)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Expected I4, but got Unknown
			ConfigEntry<float> value;
			return _poolWeightEntries.TryGetValue(((int)itemType, poolIndex), out value) ? value.Value : 0f;
		}

		public void SetItemPoolWeight(ItemType itemType, int poolIndex, float value)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected I4, but got Unknown
			if (_poolWeightEntries.TryGetValue(((int)itemType, poolIndex), out var value2))
			{
				value2.Value = value;
			}
		}

		public GlobalConfig(ConfigFile cfg)
		{
			CustomItemSpawnsEnabled = cfg.Bind<bool>("IssaPlugin", "Enabled", true, "Master kill-switch for allowing custom items to be spawned without having to set all spawn weights to 0.");
			CustomItemSpawnRate = cfg.Bind<float>("IssaPlugin", "CustomItemSpawnRate", 0.5f, "Global multiplier applied to every custom item's spawn weight. 1.0 = default, 0.5 = half as frequent, 0.0 = never spawn.");
			AllowHotkeyItemGiving = cfg.Bind<bool>("IssaPlugin", "AllowHotkeyItemGiving", false, "Whether non-host clients can use item hotkeys to give themselves items. The host is always exempt.");
			BloodEffectsEnabled = cfg.Bind<bool>("IssaPlugin", "BloodEffectsEnabled", true, "Whether blood splatter effects are shown when players are hit by guns. Each client sets this independently.");
			NumInventorySlots = cfg.Bind<float>("IssaPlugin", "NumInventorySlots", 6f, "Change the number of inventory slots available.");
			FirstPlaceStarEnabled = cfg.Bind<bool>("IssaPlugin", "FirstPlaceStarEnabled", false, "Show a gold star above the first-place player so they are easy to spot.");
			FirstPlaceStarHeight = cfg.Bind<float>("IssaPlugin", "FirstPlaceStarHeight", 1.5f, "Height in Unity units above the player's origin at which the gold star appears.");
			SpawnConfigUIKey = cfg.Bind<Key>("UI", "SpawnConfigUIKey", (Key)27, "Hotkey that opens/closes the Spawn Config GUI panel. The panel lets the host adjust per-pool spawn weights at runtime.");
			Reg(cfg, _itemEnabledEntries, 100, "BaseballBatEnabled", "Baseball Bat");
			Reg(cfg, _itemEnabledEntries, 101, "StealthBomberEnabled", "Stealth Bomber");
			Reg(cfg, _itemEnabledEntries, 102, "PredatorMissileEnabled", "Predator Missile");
			Reg(cfg, _itemEnabledEntries, 103, "AC130Enabled", "AC-130 Gunship");
			Reg(cfg, _itemEnabledEntries, 104, "FreezeEnabled", "Freeze World");
			Reg(cfg, _itemEnabledEntries, 105, "LowGravityEnabled", "Low Gravity");
			Reg(cfg, _itemEnabledEntries, 106, "SniperRifleEnabled", "Sniper Rifle");
			Reg(cfg, _itemEnabledEntries, 107, "DonutEnabled", "Donut");
			Reg(cfg, _itemEnabledEntries, 108, "JavelinEnabled", "Javelin");
			Reg(cfg, _itemEnabledEntries, 109, "StickyGrenadeEnabled", "Sticky Grenade");
			Reg(cfg, _itemEnabledEntries, 110, "BearEnabled", "Bear");
			Reg(cfg, _itemEnabledEntries, 111, "NukeEnabled", "Nuke");
			Reg(cfg, _itemEnabledEntries, 112, "BlackHoleGrenadeEnabled", "Black Hole Grenade");
			Reg(cfg, _itemEnabledEntries, 113, "PlaceableWallEnabled", "Placeable Wall");
			Reg(cfg, _itemEnabledEntries, 114, "AK47Enabled", "AK-47");
			Reg(cfg, _itemEnabledEntries, 115, "HarrierEnabled", "Harrier Jet");
			Reg(cfg, _itemEnabledEntries, 116, "PositionSwapEnabled", "Position Swap");
			Reg(cfg, _itemEnabledEntries, 117, "PoisonJarEnabled", "Poison Jar");
			Reg(cfg, _itemEnabledEntries, 118, "DroneSwarmEnabled", "Drone Swarm");
			Reg(cfg, _itemEnabledEntries, 119, "RedBullEnabled", "Red Bull");
			Reg(cfg, _itemEnabledEntries, 120, "SuperDonutEnabled", "Super Donut");
			Reg(cfg, _itemEnabledEntries, 121, "GravityGunEnabled", "Gravity Gun");
			Reg(cfg, _itemEnabledEntries, 122, "RocketTetherEnabled", "Rocket Tether");
			Reg(cfg, _itemEnabledEntries, 123, "JetpackEnabled", "Jetpack");
			Reg(cfg, _itemEnabledEntries, 124, "TeleporterEnabled", "Teleporter");
			Reg(cfg, _itemEnabledEntries, 125, "SpinachEnabled", "Spinach");
			Reg(cfg, _itemEnabledEntries, 126, "FlamethrowerEnabled", "Flamethrower");
			Reg(cfg, _itemEnabledEntries, 127, "RocketTetherGrenadeEnabled", "Rocket Tether Grenade");
			WarningsEnabled = cfg.Bind<bool>("Warnings", "Enabled", true, "Master toggle for all item-use warning banners and PiP cameras.");
			WarningDuration = cfg.Bind<float>("Warnings", "Duration", 5f, "How long (seconds) each warning banner and PiP camera is displayed.");
			WarningShowForSelf = cfg.Bind<bool>("Warnings", "ShowForSelf", false, "If true, the warning banner and PiP also appear for the player who used the item. Useful for testing.");
			WarningSymbolEnabled = cfg.Bind<bool>("Warnings", "WarningSymbolEnabled", true, "If true, the warning particle effect is shown. Each client can disable it locally.");
			WarningPrefabScale = cfg.Bind<float>("Warnings", "WarningSymbolScale", 0.75f, "Controls the size of the warning prefab.");
			WarningSymbolAlpha = cfg.Bind<float>("Warnings", "WarningSymbolAlpha", 0.5f, "Controls the alpha channel of the start color of the warning prefab.");
			WarningPiPScale = cfg.Bind<float>("Warnings", "PiPScale", 1f, "Scale multiplier for the PiP camera box (base size 320x180). Valid range: 0.5 (160x90) to 2.0 (640x360).");
			RegWarn(cfg, _itemWarningEnabledEntries, 100, "BaseballBatWarning", "Baseball Bat", defaultOn: false);
			RegWarn(cfg, _itemWarningEnabledEntries, 101, "BomberWarning", "Stealth Bomber", defaultOn: true);
			RegWarn(cfg, _itemWarningEnabledEntries, 102, "MissileWarning", "Predator Missile", defaultOn: true);
			RegWarn(cfg, _itemWarningEnabledEntries, 103, "AC130Warning", "AC-130 Gunship", defaultOn: true);
			RegWarn(cfg, _itemWarningEnabledEntries, 104, "FreezeWarning", "Freeze World", defaultOn: false);
			RegWarn(cfg, _itemWarningEnabledEntries, 105, "LowGravityWarning", "Low Gravity", defaultOn: false);
			RegWarn(cfg, _itemWarningEnabledEntries, 106, "SniperRifleWarning", "Sniper Rifle", defaultOn: false);
			RegWarn(cfg, _itemWarningEnabledEntries, 107, "DonutWarning", "Donut", defaultOn: true);
			RegWarn(cfg, _itemWarningEnabledEntries, 108, "JavelinWarning", "Javelin", defaultOn: false);
			RegWarn(cfg, _itemWarningEnabledEntries, 109, "StickyGrenadeWarning", "Sticky Grenade", defaultOn: false);
			RegWarn(cfg, _itemWarningEnabledEntries, 110, "BearWarning", "Bear", defaultOn: true);
			RegWarn(cfg, _itemWarningEnabledEntries, 111, "NukeWarning", "Nuke", defaultOn: true);
			RegWarn(cfg, _itemWarningEnabledEntries, 112, "BlackHoleGrenadeWarning", "Black Hole Grenade", defaultOn: false);
			RegWarn(cfg, _itemWarningEnabledEntries, 113, "PlaceableWallWarning", "Placeable Wall", defaultOn: false);
			RegWarn(cfg, _itemWarningEnabledEntries, 114, "AK47Warning", "AK-47", defaultOn: false);
			RegWarn(cfg, _itemWarningEnabledEntries, 115, "HarrierWarning", "Harrier Jet", defaultOn: true);
			RegWarn(cfg, _itemWarningEnabledEntries, 116, "PositionSwapWarning", "Position Swap", defaultOn: false);
			RegWarn(cfg, _itemWarningEnabledEntries, 117, "PoisonJarWarning", "Poison Jar", defaultOn: false);
			RegWarn(cfg, _itemWarningEnabledEntries, 118, "DroneSwarmWarning", "Drone Swarm", defaultOn: true);
			RegWarn(cfg, _itemWarningEnabledEntries, 119, "RedBullWarning", "Red Bull", defaultOn: false);
			RegWarn(cfg, _itemWarningEnabledEntries, 120, "SuperDonutWarning", "Super Donut", defaultOn: true);
			RegWarn(cfg, _itemWarningEnabledEntries, 121, "GravityGunWarning", "Gravity Gun", defaultOn: false);
			RegWarn(cfg, _itemWarningEnabledEntries, 122, "RocketTetherWarning", "Rocket Tether", defaultOn: false);
			RegWarn(cfg, _itemWarningEnabledEntries, 123, "JetpackWarning", "Jetpack", defaultOn: false);
			RegWarn(cfg, _itemWarningEnabledEntries, 124, "TeleporterWarning", "Teleporter", defaultOn: false);
			RegWarn(cfg, _itemWarningEnabledEntries, 125, "SpinachWarning", "Spinach", defaultOn: false);
			RegWarn(cfg, _itemWarningEnabledEntries, 126, "FlamethrowerWarning", "Flamethrower", defaultOn: false);
			RegWarn(cfg, _itemWarningEnabledEntries, 127, "RocketTetherGrenadeWarning", "Rocket Tether Grenade", defaultOn: false);
			BindAllItemPoolWeights(cfg);
			static void Reg(ConfigFile c, Dictionary<int, ConfigEntry<bool>> map, int id, string key, string label)
			{
				map[id] = c.Bind<bool>("ItemEnabled", key, true, "Whether the " + label + " is enabled and can spawn.");
			}
			static void RegWarn(ConfigFile c, Dictionary<int, ConfigEntry<bool>> map, int id, string key, string label, bool defaultOn)
			{
				map[id] = c.Bind<bool>("ItemWarnings", key, defaultOn, "Show a warning to all other players when " + label + " is used.");
			}
		}

		private void BindAllItemPoolWeights(ConfigFile cfg)
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Expected I4, but got Unknown
			foreach (CustomItemDefinition allItem in ItemRegistry.AllItems)
			{
				(int, string)[] poolSuffixes = PoolSuffixes;
				for (int i = 0; i < poolSuffixes.Length; i++)
				{
					var (num, text) = poolSuffixes[i];
					_poolWeightEntries[((int)allItem.ItemType, num)] = cfg.Bind<float>("ItemBoxSpawns", allItem.ConfigKeyPrefix + "Weight" + text, allItem.GetDefaultPoolWeight(num), "Spawn weight for " + allItem.DisplayName + " in the '" + text + "' pool. 0 = never spawns in this pool.");
				}
			}
		}
	}
	public class GravityGunConfig
	{
		private const string Section = "GravityGun";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> LockOnRange { get; private set; }

		public ConfigEntry<float> LockOnConeAngleDeg { get; private set; }

		public ConfigEntry<float> TetherRadius { get; private set; }

		public ConfigEntry<float> TetherDuration { get; private set; }

		public ConfigEntry<float> SpringForce { get; private set; }

		public ConfigEntry<float> MaxPullSpeed { get; private set; }

		public ConfigEntry<float> InputSendInterval { get; private set; }

		public GravityGunConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("GravityGun", "GiveKey", (Key)78, "Hotkey to give yourself a Gravity Gun (debug/testing).");
			Uses = cfg.Bind<float>("GravityGun", "Uses", 1f, "Number of uses per Gravity Gun pickup.");
			LockOnRange = cfg.Bind<float>("GravityGun", "LockOnRange", 45f, "Maximum distance (units) at which the Gravity Gun can lock onto a target.");
			LockOnConeAngleDeg = cfg.Bind<float>("GravityGun", "LockOnConeAngleDeg", 40f, "Half-angle (degrees) of the aim cone used to filter lock-on candidates.");
			TetherRadius = cfg.Bind<float>("GravityGun", "TetherRadius", 20f, "Distance (units) at which the target orbits the wielder while tethered.");
			TetherDuration = cfg.Bind<float>("GravityGun", "TetherDuration", 5f, "Maximum tether duration in seconds before automatic release.");
			SpringForce = cfg.Bind<float>("GravityGun", "SpringForce", 12f, "Spring stiffness coefficient; higher values pull the target faster.");
			MaxPullSpeed = cfg.Bind<float>("GravityGun", "MaxPullSpeed", 18f, "Maximum velocity change (m/s) applied to the target per physics tick.");
			InputSendInterval = cfg.Bind<float>("GravityGun", "InputSendInterval", 0.05f, "Interval (seconds) between aim-tick messages sent to the server (~20 Hz).");
		}
	}
	public class HarrierConfig
	{
		private const string Section = "HarrierJet";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> Altitude { get; private set; }

		public ConfigEntry<float> Duration { get; private set; }

		public ConfigEntry<float> FireInterval { get; private set; }

		public ConfigEntry<float> ApproachDistance { get; private set; }

		public ConfigEntry<float> ApproachSpeed { get; private set; }

		public ConfigEntry<float> DriftSpeed { get; private set; }

		public ConfigEntry<float> HoverRadius { get; private set; }

		public ConfigEntry<float> ExplosionScale { get; private set; }

		public ConfigEntry<float> RocketJitter { get; private set; }

		public ConfigEntry<bool> FriendlyFire { get; private set; }

		public ConfigEntry<float> HitsToDestroy { get; private set; }

		public ConfigEntry<float> CrashExplosionScale { get; private set; }

		public HarrierConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("HarrierJet", "GiveKey", (Key)93, "Debug key to add the Harrier Jet to your inventory.");
			Uses = cfg.Bind<float>("HarrierJet", "Uses", 1f, "Number of Harrier Jet uses per pickup.");
			Altitude = cfg.Bind<float>("HarrierJet", "Altitude", 175f, "Height above the map centre the Harrier hovers at while attacking.");
			Duration = cfg.Bind<float>("HarrierJet", "Duration", 30f, "How many seconds the Harrier remains on-station before flying out.");
			FireInterval = cfg.Bind<float>("HarrierJet", "FireInterval", 2.5f, "Seconds between each autonomous rocket fired by the Harrier.");
			ApproachDistance = cfg.Bind<float>("HarrierJet", "ApproachDistance", 600f, "How far away the Harrier spawns before flying in to its hover point.");
			ApproachSpeed = cfg.Bind<float>("HarrierJet", "ApproachSpeed", 100f, "Speed in units per second during fly-in and fly-out.");
			DriftSpeed = cfg.Bind<float>("HarrierJet", "DriftSpeed", 8f, "Units per second the Harrier drifts toward the player concentration centroid.");
			HoverRadius = cfg.Bind<float>("HarrierJet", "HoverRadius", 30f, "Maximum distance the Harrier can drift from its initial hover centre.");
			ExplosionScale = cfg.Bind<float>("HarrierJet", "ExplosionScale", 1.5f, "Scale multiplier applied to each rocket explosion from the Harrier.");
			RocketJitter = cfg.Bind<float>("HarrierJet", "RocketJitter", 4f, "Angular spread in degrees applied to each rocket. Higher = less accurate.");
			FriendlyFire = cfg.Bind<bool>("HarrierJet", "FriendlyFire", false, "If false, the Harrier will not target the player who summoned it.");
			HitsToDestroy = cfg.Bind<float>("HarrierJet", "HitsToDestroy", 3f, "Number of direct rocket hits required to shoot down the Harrier. Set to 0 to make it invincible.");
			CrashExplosionScale = cfg.Bind<float>("HarrierJet", "CrashExplosionScale", 3f, "Scale multiplier for the explosion spawned when the Harrier crashes into the ground.");
		}
	}
	public class HunterDroneConfig
	{
		private const string Section = "HunterDrone";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> LaunchSpeed { get; private set; }

		public ConfigEntry<float> Acceleration { get; private set; }

		public ConfigEntry<float> HomingStopDistance { get; private set; }

		public ConfigEntry<float> ArrivalRadius { get; private set; }

		public ConfigEntry<float> ExplosionScale { get; private set; }

		public ConfigEntry<float> ArmDelay { get; private set; }

		public ConfigEntry<bool> FriendlyFire { get; private set; }

		public ConfigEntry<bool> AttackFinishedPlayers { get; private set; }

		public HunterDroneConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("HunterDrone", "GiveKey", (Key)80, "Debug key to add the Hunter Drone item to your inventory.");
			Uses = cfg.Bind<float>("HunterDrone", "Uses", 1f, "Number of uses per Hunter Drone pickup.");
			LaunchSpeed = cfg.Bind<float>("HunterDrone", "LaunchSpeed", 90f, "Initial flight speed of the drone in metres per second.");
			Acceleration = cfg.Bind<float>("HunterDrone", "Acceleration", 25f, "How many metres per second the drone's speed increases each second.");
			HomingStopDistance = cfg.Bind<float>("HunterDrone", "HomingStopDistance", 10f, "Distance from the target (metres) at which the drone locks its aim point and flies straight, giving the target a brief chance to dodge. Set to 0 to always track the target.");
			ArrivalRadius = cfg.Bind<float>("HunterDrone", "ArrivalRadius", 2.5f, "Distance from the aim point (metres) at which the drone detonates.");
			ExplosionScale = cfg.Bind<float>("HunterDrone", "ExplosionScale", 1.2f, "Scale multiplier for the drone impact explosion radius and force.");
			ArmDelay = cfg.Bind<float>("HunterDrone", "ArmDelay", 0.2f, "Seconds after launch before the drone starts checking for collision. Prevents the drone from detonating on the thrower immediately after being thrown.");
			FriendlyFire = cfg.Bind<bool>("HunterDrone", "FriendlyFire", false, "If true, the drone may target the player who threw it.");
			AttackFinishedPlayers = cfg.Bind<bool>("HunterDrone", "AttackFinishedPlayers", false, "If true, the drone may target players who have already holed out.");
		}
	}
	public class JavelinConfig
	{
		private const string Section = "Javelin";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> ApexHeight { get; private set; }

		public ConfigEntry<float> AscentSpeed { get; private set; }

		public ConfigEntry<float> DiveSpeed { get; private set; }

		public ConfigEntry<float> DiveAcceleration { get; private set; }

		public ConfigEntry<float> ArrivalRadius { get; private set; }

		public ConfigEntry<float> Timeout { get; private set; }

		public ConfigEntry<float> ExplosionVfxDuration { get; private set; }

		public ConfigEntry<float> ExplosionScale { get; private set; }

		public JavelinConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("Javelin", "GiveKey", (Key)87, "Debug key to add the Javelin to your inventory.");
			Uses = cfg.Bind<float>("Javelin", "Uses", 1f, "Number of Javelin uses per pickup.");
			ApexHeight = cfg.Bind<float>("Javelin", "ApexHeight", 80f, "How many units above the launch point the rocket climbs before turning.");
			AscentSpeed = cfg.Bind<float>("Javelin", "AscentSpeed", 35f, "Speed in units per second during the upward climb phase.");
			DiveSpeed = cfg.Bind<float>("Javelin", "DiveSpeed", 55f, "Initial speed in units per second when the rocket begins its dive.");
			DiveAcceleration = cfg.Bind<float>("Javelin", "DiveAcceleration", 25f, "Additional speed gained per second during the dive phase.");
			ArrivalRadius = cfg.Bind<float>("Javelin", "ArrivalRadius", 3f, "Distance from the target position at which the rocket detonates.");
			Timeout = cfg.Bind<float>("Javelin", "Timeout", 20f, "Maximum seconds before the rocket force-detonates if it hasn't hit yet.");
			ExplosionVfxDuration = cfg.Bind<float>("Javelin", "ExplosionVfxDuration", 5f, "Seconds before the Javelin explosion VFX prefab is destroyed on each client.");
			ExplosionScale = cfg.Bind<float>("Explosions", "JavelinScale", 3.5f, "Multiplier for Javelin explosions. Affects blast radius, knockback, and VFX size.");
		}
	}
	public class JetpackConfig
	{
		private const string Section = "Jetpack";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> FuelPerUse { get; private set; }

		public ConfigEntry<float> ThrustForce { get; private set; }

		public ConfigEntry<bool> UseJumpToActivate { get; private set; }

		public JetpackConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("Jetpack", "GiveKey", (Key)69, "Hotkey to give yourself a Jetpack (debug/testing).");
			Uses = cfg.Bind<float>("Jetpack", "Uses", 1f, "Number of fuel canisters per Jetpack pickup. Each canister provides JetpackFuelPerUse seconds of thrust.");
			FuelPerUse = cfg.Bind<float>("Jetpack", "FuelPerUse", 1f, "Seconds of thrust provided by each fuel canister. When exhausted, one use is consumed.");
			ThrustForce = cfg.Bind<float>("Jetpack", "ThrustForce", 35f, "Upward acceleration (m/s²) applied each physics step while thrusting. Uses ForceMode.Acceleration.");
			UseJumpToActivate = cfg.Bind<bool>("Jetpack", "UseJumpToActivate", true, "When enabled, pressing Space (Jump) activates the jetpack even if it is not the active item. The fuel gauge is visible whenever the jetpack is in inventory.");
		}
	}
	public class LowGravityConfig
	{
		private const string Section = "LowGravity";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> Duration { get; private set; }

		public ConfigEntry<float> Scale { get; private set; }

		public LowGravityConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("LowGravity", "GiveKey", (Key)84, "Debug key to add the Low Gravity item to your inventory.");
			Uses = cfg.Bind<float>("LowGravity", "Uses", 1f, "Number of uses per Low Gravity pickup.");
			Duration = cfg.Bind<float>("LowGravity", "Duration", 20f, "Seconds the reduced gravity lasts before physics is restored.");
			Scale = cfg.Bind<float>("LowGravity", "GravityScale", 0.25f, "Fraction of normal gravity applied during the effect (e.g. 0.25 = 25%). Affects golf balls (Rigidbody) and player fall/jump height equally, since PlayerMovement reads Physics.gravity directly.");
		}
	}
	public static class ModConfig
	{
		public static GlobalConfig Global { get; private set; }

		public static BaseballBatConfig BaseballBat { get; private set; }

		public static StealthBomberConfig StealthBomber { get; private set; }

		public static PredatorMissileConfig PredatorMissile { get; private set; }

		public static AC130Config AC130 { get; private set; }

		public static FreezeConfig Freeze { get; private set; }

		public static LowGravityConfig LowGravity { get; private set; }

		public static SniperRifleConfig SniperRifle { get; private set; }

		public static DonutConfig Donut { get; private set; }

		public static JavelinConfig Javelin { get; private set; }

		public static StickyGrenadeConfig StickyGrenade { get; private set; }

		public static BearConfig Bear { get; private set; }

		public static NukeConfig Nuke { get; private set; }

		public static BlackHoleGrenadeConfig BlackHoleGrenade { get; private set; }

		public static PlaceableWallConfig PlaceableWall { get; private set; }

		public static AK47Config AK47 { get; private set; }

		public static HarrierConfig Harrier { get; private set; }

		public static PositionSwapConfig PositionSwap { get; private set; }

		public static PoisonJarConfig PoisonJar { get; private set; }

		public static DroneSwarmConfig DroneSwarm { get; private set; }

		public static RedBullConfig RedBull { get; private set; }

		public static SuperDonutConfig SuperDonut { get; private set; }

		public static GravityGunConfig GravityGun { get; private set; }

		public static RocketTetherConfig RocketTether { get; private set; }

		public static JetpackConfig Jetpack { get; private set; }

		public static TeleporterConfig Teleporter { get; private set; }

		public static SpinachConfig Spinach { get; private set; }

		public static FlamethrowerConfig Flamethrower { get; private set; }

		public static RocketTetherGrenadeConfig RocketTetherGrenade { get; private set; }

		public static WindStormConfig WindStorm { get; private set; }

		public static HunterDroneConfig HunterDrone { get; private set; }

		public static void Initialize(ConfigFile cfg)
		{
			Global = new GlobalConfig(cfg);
			BaseballBat = new BaseballBatConfig(cfg, Global);
			StealthBomber = new StealthBomberConfig(cfg, Global);
			PredatorMissile = new PredatorMissileConfig(cfg, Global);
			AC130 = new AC130Config(cfg, Global);
			Freeze = new FreezeConfig(cfg, Global);
			LowGravity = new LowGravityConfig(cfg, Global);
			SniperRifle = new SniperRifleConfig(cfg, Global);
			Donut = new DonutConfig(cfg, Global);
			Javelin = new JavelinConfig(cfg, Global);
			StickyGrenade = new StickyGrenadeConfig(cfg, Global);
			Bear = new BearConfig(cfg, Global);
			Nuke = new NukeConfig(cfg, Global);
			BlackHoleGrenade = new BlackHoleGrenadeConfig(cfg, Global);
			PlaceableWall = new PlaceableWallConfig(cfg, Global);
			AK47 = new AK47Config(cfg, Global);
			Harrier = new HarrierConfig(cfg, Global);
			PositionSwap = new PositionSwapConfig(cfg, Global);
			PoisonJar = new PoisonJarConfig(cfg, Global);
			DroneSwarm = new DroneSwarmConfig(cfg, Global);
			RedBull = new RedBullConfig(cfg, Global);
			SuperDonut = new SuperDonutConfig(cfg, Global);
			GravityGun = new GravityGunConfig(cfg, Global);
			RocketTether = new RocketTetherConfig(cfg, Global);
			Jetpack = new JetpackConfig(cfg, Global);
			Teleporter = new TeleporterConfig(cfg, Global);
			Spinach = new SpinachConfig(cfg, Global);
			Flamethrower = new FlamethrowerConfig(cfg, Global);
			RocketTetherGrenade = new RocketTetherGrenadeConfig(cfg, Global);
			WindStorm = new WindStormConfig(cfg, Global);
			HunterDrone = new HunterDroneConfig(cfg, Global);
		}

		public static bool GetItemEnabled(ItemType itemType)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return Global.GetItemEnabled(itemType);
		}

		public static void SetItemEnabled(ItemType itemType, bool enabled)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			Global.SetItemEnabled(itemType, enabled);
		}

		public static float GetItemPoolWeight(ItemType t, int pool)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return Global.GetItemPoolWeight(t, pool);
		}

		public static void SetItemPoolWeight(ItemType t, int pool, float v)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			Global.SetItemPoolWeight(t, pool, v);
		}

		public static bool GetItemWarningEnabled(ItemType itemType)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return Global.GetItemWarningEnabled(itemType);
		}
	}
	public class NukeConfig
	{
		private const string Section = "Nuke";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> DropHeight { get; private set; }

		public ConfigEntry<float> DropSpeed { get; private set; }

		public ConfigEntry<float> ExplosionScale { get; private set; }

		public ConfigEntry<float> SkyBlastForce { get; private set; }

		public ConfigEntry<float> SkyBlastRadius { get; private set; }

		public ConfigEntry<float> SkyBlastVerticalBias { get; private set; }

		public ConfigEntry<float> ExplosionVfxDuration { get; private set; }

		public ConfigEntry<float> ExplosionVfxScale { get; private set; }

		public ConfigEntry<bool> ExcludeThrower { get; private set; }

		public NukeConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("Nuke", "GiveKey", (Key)90, "Debug key to add the Nuke to your inventory.");
			Uses = cfg.Bind<float>("Nuke", "Uses", 1f, "Number of uses per Nuke pickup.");
			DropHeight = cfg.Bind<float>("Nuke", "DropHeight", 300f, "Units above the map centre at which the nuke bomb spawns.");
			DropSpeed = cfg.Bind<float>("Nuke", "DropSpeed", 80f, "Downward speed of the falling nuke bomb in units per second.");
			SkyBlastForce = cfg.Bind<float>("Nuke", "SkyBlastForce", 350f, "Extra upward impulse force applied to all rigidbodies within SkyBlastRadius after detonation. Stacks on top of the standard explosion knockback.");
			SkyBlastRadius = cfg.Bind<float>("Nuke", "SkyBlastRadius", 350f, "Radius (units) of the secondary sky blast. Should be large enough to cover the whole map so no one escapes.");
			SkyBlastVerticalBias = cfg.Bind<float>("Nuke", "SkyBlastVerticalBias", 0.7f, "Controls how much of the sky blast force goes upward versus outward (0 = all outward, 1 = all straight up). The horizontal direction is still relative to the explosion point, so players are pushed away from the blast site.");
			ExplosionVfxDuration = cfg.Bind<float>("Nuke", "ExplosionVfxDuration", 8f, "Seconds before the nuke explosion VFX prefab is destroyed on each client.");
			ExplosionVfxScale = cfg.Bind<float>("Nuke", "ExplosionVfxScale", 5f, "Uniform scale applied to the nuke explosion VFX transform on each client. Increase this to make the particle systems appear larger.");
			ExcludeThrower = cfg.Bind<bool>("Nuke", "ExcludeThrower", true, "If true, the sky blast does not apply force to the player who activated the nuke.");
			ExplosionScale = cfg.Bind<float>("Explosions", "NukeScale", 6f, "Explosion scale multiplier for the Nuke's detonation rocket. Affects blast radius, knockback force, and VFX size.");
		}
	}
	public class PlaceableWallConfig
	{
		private const string Section = "PlaceableWall";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> MaxPlacementDistance { get; private set; }

		public ConfigEntry<float> MinHoleDistance { get; private set; }

		public ConfigEntry<float> HealthPoints { get; private set; }

		public ConfigEntry<float> VelocityImpactFactor { get; private set; }

		public ConfigEntry<float> TorsionMultiplier { get; private set; }

		public ConfigEntry<float> RotationStep { get; private set; }

		public ConfigEntry<float> DebrisLifetime { get; private set; }

		public ConfigEntry<float> RocketExplosionForce { get; private set; }

		public ConfigEntry<float> DamageGolfClub { get; private set; }

		public ConfigEntry<float> DamageBaseballBat { get; private set; }

		public PlaceableWallConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("PlaceableWall", "GiveKey", (Key)92, "Debug key to add the Placeable Wall to your inventory.");
			Uses = cfg.Bind<float>("PlaceableWall", "Uses", 1f, "Number of wall placements per pickup.");
			MaxPlacementDistance = cfg.Bind<float>("PlaceableWall", "MaxPlacementDistance", 20f, "Maximum distance (units) from the player's camera at which a wall can be placed.");
			MinHoleDistance = cfg.Bind<float>("PlaceableWall", "MinHoleDistance", 3f, "Minimum XZ distance (units) from the hole centre that a wall may be placed. Prevents blocking the hole entirely. Set to 0 to disable the check.");
			HealthPoints = cfg.Bind<float>("PlaceableWall", "HealthPoints", 3f, "Number of golf club or baseball bat hits required to destroy the wall. Rocket hits always destroy in one shot.");
			VelocityImpactFactor = cfg.Bind<float>("PlaceableWall", "VelocityImpactFactor", 2.5f, "Degree to which the velocity of an object colliding with the placeable wall will damage it. Default: 2.5.");
			TorsionMultiplier = cfg.Bind<float>("PlaceableWall", "TorsionMultiplier", 0.002f, "Degree to which torque (spin) damages the bricks of the placeable wall. Default: 0.002.");
			RotationStep = cfg.Bind<float>("PlaceableWall", "RotationStep", 45f, "Degrees the wall rotates per scroll-wheel tick during the placement preview. Scroll up rotates clockwise, scroll down rotates counter-clockwise.");
			DebrisLifetime = cfg.Bind<float>("PlaceableWall", "DebrisLifetime", 30f, "Seconds before detached wall debris (bricks/pillars) are automatically destroyed.");
			RocketExplosionForce = cfg.Bind<float>("PlaceableWall", "RocketExplosionForce", 600f, "Impulse force (per brick) applied by a rocket explosion to detached wall debris.");
			DamageGolfClub = cfg.Bind<float>("PlaceableWall", "DamageGolfClub", 1f, "Damage dealt to a wall chunk per golf club swing.");
			DamageBaseballBat = cfg.Bind<float>("PlaceableWall", "DamageBaseballBat", 2f, "Damage dealt to a wall chunk per baseball bat swing.");
		}
	}
	public class PoisonJarConfig
	{
		private const string JarSection = "PoisonJar";

		private const string OverlaySection = "PoisonOverlay";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> ThrowSpeed { get; private set; }

		public ConfigEntry<float> LobAngle { get; private set; }

		public ConfigEntry<float> Radius { get; private set; }

		public ConfigEntry<float> Duration { get; private set; }

		public ConfigEntry<bool> GhostEnabled { get; private set; }

		public ConfigEntry<float> GhostOffsetX { get; private set; }

		public ConfigEntry<float> GhostOffsetY { get; private set; }

		public ConfigEntry<float> GhostAlpha { get; private set; }

		public ConfigEntry<float> RollFreq1 { get; private set; }

		public ConfigEntry<float> RollAmp1 { get; private set; }

		public ConfigEntry<float> RollFreq2 { get; private set; }

		public ConfigEntry<float> RollAmp2 { get; private set; }

		public ConfigEntry<float> RollFreq3 { get; private set; }

		public ConfigEntry<float> RollAmp3 { get; private set; }

		public ConfigEntry<float> FovFreq1 { get; private set; }

		public ConfigEntry<float> FovAmp1 { get; private set; }

		public ConfigEntry<float> FovFreq2 { get; private set; }

		public ConfigEntry<float> FovAmp2 { get; private set; }

		public ConfigEntry<float> VigPulseFreq1 { get; private set; }

		public ConfigEntry<float> VigPulseFreq2 { get; private set; }

		public ConfigEntry<float> VigBaseAlpha { get; private set; }

		public ConfigEntry<float> VigPulseAmp1 { get; private set; }

		public ConfigEntry<float> VigPulseAmp2 { get; private set; }

		public ConfigEntry<float> TintBaseAlpha { get; private set; }

		public ConfigEntry<float> TintPulseAmp { get; private set; }

		public ConfigEntry<float> TintPulseFreq { get; private set; }

		public ConfigEntry<bool> AimNoiseEnabled { get; private set; }

		public ConfigEntry<float> AimNoiseYawAmp { get; private set; }

		public ConfigEntry<float> AimNoiseYawFreq { get; private set; }

		public ConfigEntry<float> AimNoisePitchAmp { get; private set; }

		public ConfigEntry<float> AimNoisePitchFreq { get; private set; }

		public PoisonJarConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("PoisonJar", "GiveKey", (Key)82, "Debug key to add the Poison Jar to your inventory.");
			Uses = cfg.Bind<float>("PoisonJar", "Uses", 1f, "Number of uses per Poison Jar pickup.");
			ThrowSpeed = cfg.Bind<float>("PoisonJar", "ThrowSpeed", 18f, "Initial throw speed in metres per second.");
			LobAngle = cfg.Bind<float>("PoisonJar", "LobAngle", 0.35f, "Upward component added to the throw direction (0 = flat, 1 = 45° up).");
			Radius = cfg.Bind<float>("PoisonJar", "Radius", 2f, "Radius in metres of the poison AoE. Also scales the splash VFX.");
			Duration = cfg.Bind<float>("PoisonJar", "Duration", 10f, "How long (seconds) the poison visual lasts on affected players.");
			GhostEnabled = cfg.Bind<bool>("PoisonOverlay", "GhostEnabled", true, "Enable the double-vision ghost image.");
			GhostOffsetX = cfg.Bind<float>("PoisonOverlay", "GhostOffsetX", 0.04f, "Horizontal ghost offset as a fraction of screen width (e.g. 0.04 = 4%).");
			GhostOffsetY = cfg.Bind<float>("PoisonOverlay", "GhostOffsetY", 0.01f, "Vertical ghost offset as a fraction of screen height.");
			GhostAlpha = cfg.Bind<float>("PoisonOverlay", "GhostAlpha", 0.35f, "Opacity of the ghost image (0–1).");
			RollFreq1 = cfg.Bind<float>("PoisonOverlay", "RollFreq1", 1f, "Primary lean frequency (Hz).");
			RollAmp1 = cfg.Bind<float>("PoisonOverlay", "RollAmp1", 4.5f, "Primary lean amplitude (degrees).");
			RollFreq2 = cfg.Bind<float>("PoisonOverlay", "RollFreq2", 0.28f, "Slow drift frequency (Hz).");
			RollAmp2 = cfg.Bind<float>("PoisonOverlay", "RollAmp2", 12f, "Slow drift amplitude (degrees).");
			RollFreq3 = cfg.Bind<float>("PoisonOverlay", "RollFreq3", 1.35f, "Subtle tremor frequency (Hz).");
			RollAmp3 = cfg.Bind<float>("PoisonOverlay", "RollAmp3", 5f, "Subtle tremor amplitude (degrees).");
			FovFreq1 = cfg.Bind<float>("PoisonOverlay", "FovFreq1", 0.5f, "Primary FOV breathing frequency (Hz).");
			FovAmp1 = cfg.Bind<float>("PoisonOverlay", "FovAmp1", 5f, "Primary FOV breathing amplitude (degrees).");
			FovFreq2 = cfg.Bind<float>("PoisonOverlay", "FovFreq2", 1.2f, "Secondary FOV breathing frequency (Hz).");
			FovAmp2 = cfg.Bind<float>("PoisonOverlay", "FovAmp2", 8f, "Secondary FOV breathing amplitude (degrees).");
			VigPulseFreq1 = cfg.Bind<float>("PoisonOverlay", "VigPulseFreq1", 1.2f, "Vignette primary pulse frequency (Hz).");
			VigPulseFreq2 = cfg.Bind<float>("PoisonOverlay", "VigPulseFreq2", 6f, "Vignette secondary pulse frequency (Hz).");
			VigBaseAlpha = cfg.Bind<float>("PoisonOverlay", "VigBaseAlpha", 0.5f, "Vignette base opacity (0–1).");
			VigPulseAmp1 = cfg.Bind<float>("PoisonOverlay", "VigPulseAmp1", 0.15f, "Vignette primary pulse amplitude.");
			VigPulseAmp2 = cfg.Bind<float>("PoisonOverlay", "VigPulseAmp2", 0.08f, "Vignette secondary pulse amplitude.");
			TintBaseAlpha = cfg.Bind<float>("PoisonOverlay", "TintBaseAlpha", 0.1f, "Full-screen tint base opacity (0–1).");
			TintPulseAmp = cfg.Bind<float>("PoisonOverlay", "TintPulseAmp", 0.05f, "Full-screen tint pulse amplitude.");
			TintPulseFreq = cfg.Bind<float>("PoisonOverlay", "TintPulseFreq", 3f, "Full-screen tint pulse frequency (Hz).");
			AimNoiseEnabled = cfg.Bind<bool>("PoisonOverlay", "AimNoiseEnabled", true, "If true, adds sinusoidal yaw and pitch drift to make aiming harder while poisoned.");
			AimNoiseYawAmp = cfg.Bind<float>("PoisonOverlay", "AimNoiseYawAmp", 2.5f, "Yaw (horizontal) aim drift amplitude in degrees.");
			AimNoiseYawFreq = cfg.Bind<float>("PoisonOverlay", "AimNoiseYawFreq", 0.8f, "Yaw aim drift frequency in Hz.");
			AimNoisePitchAmp = cfg.Bind<float>("PoisonOverlay", "AimNoisePitchAmp", 1.5f, "Pitch (vertical) aim drift amplitude in degrees.");
			AimNoisePitchFreq = cfg.Bind<float>("PoisonOverlay", "AimNoisePitchFreq", 1.1f, "Pitch aim drift frequency in Hz.");
		}
	}
	public class PositionSwapConfig
	{
		private const string Section = "PositionSwap";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> Delay { get; private set; }

		public PositionSwapConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("PositionSwap", "GiveKey", (Key)81, "Debug key to add the Position Swap item to your inventory.");
			Uses = cfg.Bind<float>("PositionSwap", "Uses", 1f, "Number of uses per Position Swap pickup.");
			Delay = cfg.Bind<float>("PositionSwap", "Delay", 3f, "Seconds between selecting a swap target and the swap executing. During this time a warning orb appears under both players.");
		}
	}
	public class PredatorMissileConfig
	{
		private const string Section = "PredatorMissile";

		public ConfigEntry<float> Altitude { get; private set; }

		public ConfigEntry<float> FallSpeed { get; private set; }

		public ConfigEntry<float> SteerSpeed { get; private set; }

		public ConfigEntry<float> Timeout { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> ExplosionScale { get; private set; }

		public PredatorMissileConfig(ConfigFile cfg, GlobalConfig global)
		{
			Altitude = cfg.Bind<float>("PredatorMissile", "Altitude", 175f, "Height above the player where the missile spawns.");
			FallSpeed = cfg.Bind<float>("PredatorMissile", "FallSpeed", 50f, "Downward speed of the missile in units per second.");
			SteerSpeed = cfg.Bind<float>("PredatorMissile", "SteerSpeed", 35f, "Horizontal steering speed when directing the missile.");
			Timeout = cfg.Bind<float>("PredatorMissile", "Timeout", 15f, "Maximum seconds before the missile auto-detonates.");
			Uses = cfg.Bind<float>("PredatorMissile", "Uses", 1f, "Number of missile uses per pickup.");
			GiveKey = cfg.Bind<Key>("PredatorMissile", "GiveKey", (Key)102, "Key to press to add the predator missile to your inventory.");
			ExplosionScale = cfg.Bind<float>("Explosions", "PredatorMissileScale", 3f, "Multiplier for Predator Missile explosions. Affects blast radius, knockback, and VFX size.");
		}
	}
	public class RedBullConfig
	{
		private const string Section = "RedBull";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> Duration { get; private set; }

		public ConfigEntry<float> ExtraSpeedMultiplier { get; private set; }

		public ConfigEntry<float> JumpBonus { get; private set; }

		public ConfigEntry<float> DispenserChance { get; private set; }

		public RedBullConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("RedBull", "GiveKey", (Key)79, "Hotkey to give yourself a Red Bull (debug/testing).");
			Uses = cfg.Bind<float>("RedBull", "Uses", 1f, "Number of uses per Red Bull item.");
			Duration = cfg.Bind<float>("RedBull", "Duration", 10f, "How long the Red Bull speed and jump boost lasts (seconds).");
			ExtraSpeedMultiplier = cfg.Bind<float>("RedBull", "ExtraSpeedMultiplier", 1.625f, "Additional speed multiplier applied on top of the coffee speed-boost factor while Red Bull is active.");
			JumpBonus = cfg.Bind<float>("RedBull", "JumpBonus", 10f, "Extra upward velocity (m/s) added to each jump while Red Bull is active.");
			DispenserChance = cfg.Bind<float>("RedBull", "DispenserChance", 0.25f, "Probability (0–1) that the coffee dispenser gives a Red Bull instead of a coffee. 0 = never, 1 = always.");
		}
	}
	public class RocketTetherConfig
	{
		private const string Section = "RocketTether";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> LockOnRange { get; private set; }

		public ConfigEntry<float> LockOnConeAngleDeg { get; private set; }

		public ConfigEntry<float> TetherDuration { get; private set; }

		public ConfigEntry<float> SpringForce { get; private set; }

		public ConfigEntry<float> MaxPullSpeed { get; private set; }

		public ConfigEntry<float> NaturalLength { get; private set; }

		public ConfigEntry<float> RocketSpeed { get; private set; }

		public ConfigEntry<float> ExplosionForce { get; private set; }

		public ConfigEntry<float> ExplosionRadius { get; private set; }

		public RocketTetherConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("RocketTether", "GiveKey", (Key)79, "Hotkey to give yourself a Rocket Tether (debug/testing).");
			Uses = cfg.Bind<float>("RocketTether", "Uses", 1f, "Number of uses per Rocket Tether pickup.");
			LockOnRange = cfg.Bind<float>("RocketTether", "LockOnRange", 40f, "Maximum distance (units) at which the Rocket Tether can lock onto a target.");
			LockOnConeAngleDeg = cfg.Bind<float>("RocketTether", "LockOnConeAngleDeg", 60f, "Full angle (degrees) of the aim cone used to filter lock-on candidates.");
			TetherDuration = cfg.Bind<float>("RocketTether", "TetherDuration", 8f, "Duration in seconds before the tether automatically disconnects.");
			SpringForce = cfg.Bind<float>("RocketTether", "SpringForce", 5f, "Spring stiffness coefficient; multiplied by stretch distance to compute pull speed.");
			MaxPullSpeed = cfg.Bind<float>("RocketTether", "MaxPullSpeed", 20f, "Maximum velocity change (m/s) applied to each player per physics tick.");
			NaturalLength = cfg.Bind<float>("RocketTether", "NaturalLength", 5f, "Distance (units) below which no force is applied. Set >0 for a rope with slack.");
			RocketSpeed = cfg.Bind<float>("RocketTether", "RocketSpeed", 35f, "Upward speed (m/s) of the rocket during its flight.");
			ExplosionForce = cfg.Bind<float>("RocketTether", "ExplosionForce", 100f, "Peak velocity change (m/s, VelocityChange) applied at the explosion centre.");
			ExplosionRadius = cfg.Bind<float>("RocketTether", "ExplosionRadius", 50f, "Radius (units) within which the explosion affects nearby players.");
		}
	}
	public class RocketTetherGrenadeConfig
	{
		private const string Section = "RocketTetherGrenade";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<bool> ExcludeThrower { get; private set; }

		public ConfigEntry<float> ThrowSpeed { get; private set; }

		public ConfigEntry<float> LobAngle { get; private set; }

		public ConfigEntry<float> BlastRadius { get; private set; }

		public ConfigEntry<int> MaxVictims { get; private set; }

		public ConfigEntry<float> TetherDuration { get; private set; }

		public ConfigEntry<float> RocketSpeed { get; private set; }

		public ConfigEntry<float> SpringForce { get; private set; }

		public ConfigEntry<float> MaxPullSpeed { get; private set; }

		public ConfigEntry<float> NaturalLength { get; private set; }

		public ConfigEntry<float> ExplosionForce { get; private set; }

		public ConfigEntry<float> ExplosionRadius { get; private set; }

		public RocketTetherGrenadeConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("RocketTetherGrenade", "GiveKey", (Key)0, "Hotkey to give yourself a Rocket Tether Grenade (debug/testing).");
			Uses = cfg.Bind<float>("RocketTetherGrenade", "Uses", 1f, "Number of uses per Rocket Tether Grenade pickup.");
			ThrowSpeed = cfg.Bind<float>("RocketTetherGrenade", "ThrowSpeed", 18f, "Initial speed (m/s) of the thrown grenade.");
			LobAngle = cfg.Bind<float>("RocketTetherGrenade", "LobAngle", 0.4f, "Upward angle added to the camera forward direction when throwing (0 = flat, 1 = straight up).");
			BlastRadius = cfg.Bind<float>("RocketTetherGrenade", "BlastRadius", 12f, "Radius (units) within which players are tethered on landing.");
			MaxVictims = cfg.Bind<int>("RocketTetherGrenade", "MaxVictims", 4, "Maximum number of players that can be simultaneously tethered by one grenade.");
			ExcludeThrower = cfg.Bind<bool>("RocketTetherGrenade", "ExcludeThrower", true, "If true, the thrower cannot tether themselves with a grenade.");
			TetherDuration = cfg.Bind<float>("RocketTetherGrenade", "TetherDuration", 6f, "Duration (seconds) before each victim's rocket explodes.");
			RocketSpeed = cfg.Bind<float>("RocketTetherGrenade", "RocketSpeed", 35f, "Upward speed (m/s) of each victim's rocket during its flight.");
			SpringForce = cfg.Bind<float>("RocketTetherGrenade", "SpringForce", 5f, "Spring stiffness coefficient; multiplied by stretch distance to compute pull speed.");
			MaxPullSpeed = cfg.Bind<float>("RocketTetherGrenade", "MaxPullSpeed", 20f, "Maximum velocity change (m/s) applied to each victim per physics tick.");
			NaturalLength = cfg.Bind<float>("RocketTetherGrenade", "NaturalLength", 5f, "Distance (units) below which no pull force is applied (rope slack).");
			ExplosionForce = cfg.Bind<float>("RocketTetherGrenade", "ExplosionForce", 80f, "Peak velocity change (m/s, VelocityChange) at each victim's explosion centre.");
			ExplosionRadius = cfg.Bind<float>("RocketTetherGrenade", "ExplosionRadius", 50f, "Radius (units) within which each victim's explosion affects nearby players.");
		}
	}
	public class SniperRifleConfig
	{
		private const string Section = "SniperRifle";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> MaxAimingDistance { get; private set; }

		public ConfigEntry<float> MaxShotDistance { get; private set; }

		public ConfigEntry<float> ScopedInaccuracy { get; private set; }

		public ConfigEntry<float> HipFireInaccuracy { get; private set; }

		public ConfigEntry<float> ZoomFov { get; private set; }

		public ConfigEntry<float> ZoomSpeed { get; private set; }

		public ConfigEntry<float> ShotDuration { get; private set; }

		public ConfigEntry<float> MinZoomFov { get; private set; }

		public ConfigEntry<float> MaxZoomFov { get; private set; }

		public ConfigEntry<float> ScrollSensitivity { get; private set; }

		public ConfigEntry<float> ScreenShakeIntensity { get; private set; }

		public SniperRifleConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("SniperRifle", "GiveKey", (Key)85, "Debug key to add the Sniper Rifle to your inventory.");
			Uses = cfg.Bind<float>("SniperRifle", "Uses", 5f, "Number of shots per Sniper Rifle pickup.");
			MaxAimingDistance = cfg.Bind<float>("SniperRifle", "MaxAimingDistance", 1000f, "Maximum distance (units) the aim-point raycast travels when computing where the barrel points.");
			MaxShotDistance = cfg.Bind<float>("SniperRifle", "MaxShotDistance", 1000f, "Maximum distance (units) the bullet raycast travels before missing.");
			ScopedInaccuracy = cfg.Bind<float>("SniperRifle", "ScopedInaccuracy", 0.05f, "Maximum random angular deviation (degrees) when firing while scoped. Lower = more precise.");
			HipFireInaccuracy = cfg.Bind<float>("SniperRifle", "HipFireInaccuracy", 3f, "Maximum random angular deviation (degrees) when firing from the hip (not scoped).");
			ZoomFov = cfg.Bind<float>("SniperRifle", "ZoomFov", 15f, "Camera field of view while the scope is active. Lower values zoom in more.");
			ZoomSpeed = cfg.Bind<float>("SniperRifle", "ZoomSpeed", 10f, "Speed at which the camera lerps to and from the scoped FOV.");
			ShotDuration = cfg.Bind<float>("SniperRifle", "ShotDuration", 0.6f, "Seconds the shot animation plays before the item use state resets.");
			MinZoomFov = cfg.Bind<float>("SniperRifle", "MinZoomFov", 5f, "Minimum FOV reachable by scrolling in (maximum zoom). Lower = more zoomed.");
			MaxZoomFov = cfg.Bind<float>("SniperRifle", "MaxZoomFov", 40f, "Maximum FOV reachable by scrolling out (minimum zoom). Must be above MinZoomFov.");
			ScrollSensitivity = cfg.Bind<float>("SniperRifle", "ScrollSensitivity", 5f, "FOV units changed per scroll notch. Higher values zoom faster.");
			ScreenShakeIntensity = cfg.Bind<float>("SniperRifle", "ScreenShakeIntensity", 0.65f, "Intensity of the screen shake when firing the Sniper Rifle. 0 disables it. Higher values shake more.");
		}
	}
	public class SpinachConfig
	{
		private const string Section = "Spinach";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> PowerMultiplier { get; private set; }

		public ConfigEntry<float> Duration { get; private set; }

		public SpinachConfig(ConfigFile cfg, GlobalConfig global)
		{
			Duration = cfg.Bind<float>("Spinach", "Duration", 30f, "Duration in seconds of the spinach.");
			PowerMultiplier = cfg.Bind<float>("Spinach", "PowerMultiplier", 2.5f, "Swing power multiplier.");
			Uses = cfg.Bind<float>("Spinach", "Uses", 1f, "Number of uses");
			GiveKey = cfg.Bind<Key>("Spinach", "GiveKey", (Key)99, "Key to press to get the spinach item.");
		}
	}
	public class StealthBomberConfig
	{
		private const string Section = "StealthBomber";

		public ConfigEntry<float> Altitude { get; private set; }

		public ConfigEntry<float> Speed { get; private set; }

		public ConfigEntry<float> RocketInterval { get; private set; }

		public ConfigEntry<float> Spread { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> WaitTime { get; private set; }

		public ConfigEntry<float> StripLength { get; private set; }

		public ConfigEntry<float> RocketAngularJitter { get; private set; }

		public ConfigEntry<float> RocketSpawnDepth { get; private set; }

		public ConfigEntry<float> TargetingZoomSpeed { get; private set; }

		public ConfigEntry<float> TargetMoveSpeed { get; private set; }

		public ConfigEntry<float> TargetRotateSpeed { get; private set; }

		public ConfigEntry<float> ApproachDistance { get; private set; }

		public ConfigEntry<float> HitsToDestroy { get; private set; }

		public ConfigEntry<float> CrashImpactForce { get; private set; }

		public ConfigEntry<float> CrashDownwardForce { get; private set; }

		public ConfigEntry<float> CrashTorque { get; private set; }

		public ConfigEntry<float> ExplosionScale { get; private set; }

		public StealthBomberConfig(ConfigFile cfg, GlobalConfig global)
		{
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Expected O, but got Unknown
			Altitude = cfg.Bind<float>("StealthBomber", "Altitude", 60f, "Height above the map the bombing run flies at.");
			Speed = cfg.Bind<float>("StealthBomber", "Speed", 35f, "Speed of the bombing run in units per second.");
			ApproachDistance = cfg.Bind<float>("StealthBomber", "ApproachDistance", 300f, "How far away the bomber visual spawns from the targeting strip in units.");
			RocketInterval = cfg.Bind<float>("StealthBomber", "RocketInterval", 0.75f, "Seconds between each rocket drop during a bombing run.");
			Spread = cfg.Bind<float>("StealthBomber", "Spread", 25f, new ConfigDescription("Random lateral spread in units for each rocket's drop position.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(25f, 100f), Array.Empty<object>()));
			Uses = cfg.Bind<float>("StealthBomber", "Uses", 1f, "Number of bombing runs per pickup.");
			GiveKey = cfg.Bind<Key>("StealthBomber", "GiveKey", (Key)101, "Key to press to add the stealth bomber to your inventory.");
			WaitTime = cfg.Bind<float>("StealthBomber", "WaitTime", 1.5f, "Seconds to wait before starting the bombing run.");
			StripLength = cfg.Bind<float>("StealthBomber", "StripLength", 300f, "Length of the targeting strip in units.");
			TargetingZoomSpeed = cfg.Bind<float>("StealthBomber", "TargetingZoomSpeed", 5f, "Speed at which the camera zooms in/out during bomber targeting.");
			RocketAngularJitter = cfg.Bind<float>("StealthBomber", "RocketAngularJitter", 0.8f, "Random angular jitter in degrees for each rocket's rotation.");
			RocketSpawnDepth = cfg.Bind<float>("StealthBomber", "RocketSpawnDepth", 5f, "How far below the bomber (in units) rockets spawn, to avoid colliding with the bomber on creation.");
			TargetMoveSpeed = cfg.Bind<float>("StealthBomber", "TargetMoveSpeed", 50f, "How fast the targeting strip moves with WASD.");
			TargetRotateSpeed = cfg.Bind<float>("StealthBomber", "TargetRotateSpeed", 90f, "Rotation speed of the targeting strip in degrees per second (Q/E).");
			HitsToDestroy = cfg.Bind<float>("StealthBomber", "HitsToDestroy", 1f, "Rocket hits required to shoot down the bomber and cancel its run. Set to 0 to make it invincible.");
			CrashImpactForce = cfg.Bind<float>("StealthBomber", "CrashImpactForce", 500f, "Impulse force applied to the stealth bomber in the direction of the rocket hit when shot down.");
			CrashDownwardForce = cfg.Bind<float>("StealthBomber", "CrashDownwardForce", 15f, "Impulse force applied to the stealth bomber in the downward direction.");
			CrashTorque = cfg.Bind<float>("StealthBomber", "CrashTorque", 1.2f, "Magnitude of the random tumble torque applied to the stealth bomber when shot down.");
			ExplosionScale = cfg.Bind<float>("Explosions", "StealthBomberScale", 1.5f, "Multiplier for Stealth Bomber rocket explosions. Affects blast radius, knockback, and VFX size.");
		}
	}
	public class StickyGrenadeConfig
	{
		private const string Section = "StickyGrenade";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> ThrowSpeed { get; private set; }

		public ConfigEntry<float> MaxThrowSpeed { get; private set; }

		public ConfigEntry<float> LobAngle { get; private set; }

		public ConfigEntry<float> FuseTime { get; private set; }

		public ConfigEntry<float> GraceTime { get; private set; }

		public ConfigEntry<float> StickRadius { get; private set; }

		public ConfigEntry<float> ExplosionScale { get; private set; }

		public StickyGrenadeConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("StickyGrenade", "GiveKey", (Key)88, "Debug key to add the StickyGrenade grenade to your inventory.");
			Uses = cfg.Bind<float>("StickyGrenade", "Uses", 2f, "Number of StickyGrenade grenades per pickup.");
			ThrowSpeed = cfg.Bind<float>("StickyGrenade", "ThrowSpeed", 22f, "Initial speed in units per second when the grenade is thrown.");
			MaxThrowSpeed = cfg.Bind<float>("StickyGrenade", "MaxThrowSpeed", 35f, "Server-side cap on throw speed to prevent exploits.");
			LobAngle = cfg.Bind<float>("StickyGrenade", "LobAngle", 0.25f, "Upward component added to the throw direction for a natural lob arc. 0 = perfectly flat, 1 = 45 degrees upward.");
			FuseTime = cfg.Bind<float>("StickyGrenade", "FuseTime", 3.5f, "Seconds from when the grenade sticks until it detonates.");
			GraceTime = cfg.Bind<float>("StickyGrenade", "GraceTime", 0.35f, "Seconds after throwing before the grenade can stick to anything. Prevents the grenade from immediately sticking to the thrower.");
			StickRadius = cfg.Bind<float>("StickyGrenade", "StickRadius", 0.55f, "Radius of the overlap sphere used to detect stick targets each FixedUpdate.");
			ExplosionScale = cfg.Bind<float>("Explosions", "StickyGrenadeScale", 4f, "Multiplier for StickyGrenade explosions. Affects blast radius, knockback, and VFX size.");
		}
	}
	public class SuperDonutConfig
	{
		private const string Section = "SuperDonut";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public SuperDonutConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("SuperDonut", "GiveKey", (Key)78, "Hotkey to give yourself a Super Donut (debug/testing).");
			Uses = cfg.Bind<float>("SuperDonut", "Uses", 1f, "Number of Super Donut uses per pickup.");
		}
	}
	public class TeleporterConfig
	{
		private const string Section = "Teleporter";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> TargetMoveSpeed { get; private set; }

		public ConfigEntry<float> MarkerRadius { get; private set; }

		public TeleporterConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("Teleporter", "GiveKey", (Key)68, "Hotkey to give yourself a Teleporter (debug/testing). Key.None = disabled.");
			Uses = cfg.Bind<float>("Teleporter", "Uses", 1f, "Number of uses per Teleporter pickup.");
			TargetMoveSpeed = cfg.Bind<float>("Teleporter", "TargetMoveSpeed", 60f, "Speed (units/second) at which the target marker moves during the targeting phase.");
			MarkerRadius = cfg.Bind<float>("Teleporter", "MarkerRadius", 1f, "Radius (units) of the circular target marker disc shown in the targeting UI.");
		}
	}
	public class WindStormConfig
	{
		private const string Section = "WindStorm";

		public ConfigEntry<Key> GiveKey { get; private set; }

		public ConfigEntry<float> Uses { get; private set; }

		public ConfigEntry<float> Duration { get; private set; }

		public ConfigEntry<float> StormSpeed { get; private set; }

		public ConfigEntry<bool> ExcludeActivator { get; private set; }

		public ConfigEntry<float> DirectionChangeInterval { get; private set; }

		public ConfigEntry<float> DirectionChangeRange { get; private set; }

		public ConfigEntry<bool> AffectPlayers { get; private set; }

		public ConfigEntry<float> PlayerWindFactor { get; private set; }

		public WindStormConfig(ConfigFile cfg, GlobalConfig global)
		{
			GiveKey = cfg.Bind<Key>("WindStorm", "GiveKey", (Key)0, "Debug key to add the Wind Storm item to your inventory.");
			Uses = cfg.Bind<float>("WindStorm", "Uses", 1f, "Number of uses per Wind Storm pickup.");
			Duration = cfg.Bind<float>("WindStorm", "Duration", 15f, "Seconds the wind storm lasts before wind returns to normal.");
			StormSpeed = cfg.Bind<float>("WindStorm", "StormSpeed", 150f, "Wind speed (km/h) applied during the storm. The base game High preset maxes out at 99 km/h.");
			ExcludeActivator = cfg.Bind<bool>("WindStorm", "ExcludeActivator", true, "When true, the player who activates the storm is immune — their ball is unaffected by the storm wind. When false, everyone including the activator is hit by the storm.");
			DirectionChangeInterval = cfg.Bind<float>("WindStorm", "DirectionChangeInterval", 2f, "Seconds between each wind direction shift during the storm. Smaller values produce more turbulent, rapidly-changing gusts.");
			DirectionChangeRange = cfg.Bind<float>("WindStorm", "DirectionChangeRange", 45f, "Maximum degrees the wind direction can shift each interval (random walk). E.g. 45 means the angle changes by a random amount in [-45, +45] per tick.");
			AffectPlayers = cfg.Bind<bool>("WindStorm", "AffectPlayers", true, "When true, storm wind is applied as a force to knocked-out player bodies. Set false to limit the effect to golf balls only.");
			PlayerWindFactor = cfg.Bind<float>("WindStorm", "PlayerWindFactor", 0.15f, "Strength of wind applied to players as a fraction of the storm wind vector. 0.1 is a noticeable nudge; 0.5 noticeably impedes movement.");
		}
	}
	public class ItemConfigSyncer : MonoBehaviour
	{
		[CompilerGenerated]
		private sealed class <Start>d__1 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public ItemConfigSyncer <>4__this;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0029: Unknown result type (might be due to invalid IL or missing references)
				//IL_0033: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					break;
				case 1:
					<>1__state = -1;
					if (NetworkServer.active)
					{
						Broadcast();
					}
					break;
				}
				<>2__current = (object)new WaitForSeconds(5f);
				<>1__state = 1;
				return true;
			}

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

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedEx