using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using Agents;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using CellMenu;
using GameData;
using Gear;
using HarmonyLib;
using Il2CppSystem.Collections.Generic;
using Microsoft.CodeAnalysis;
using Player;
using SNetwork;
using TMPro;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("GTFO.EZ")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+3e5eb696c43e14971850374c057f0d0cb9c2ec9f")]
[assembly: AssemblyProduct("GTFO.EZ")]
[assembly: AssemblyTitle("GTFO.EZ")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
[CompilerGenerated]
[Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace GTFO.EZ
{
[BepInPlugin("MindAttic.GTFO.EZ", "GTFO.EZ", "8.0.0")]
[BepInProcess("GTFO.exe")]
public class Plugin : BasePlugin
{
public const string GUID = "MindAttic.GTFO.EZ";
public const string NAME = "GTFO.EZ";
public const string VERSION = "8.0.0";
internal static readonly string EasterEggMessage = "GTFO.EZ v" + "8.0.0".Split('.')[0] + " Active - Goo goo. Gah gah.";
internal static ManualLogSource Logger = null;
internal static ConfigEntry<float> HealthMultiplier = null;
internal static ConfigEntry<float> HealthRegenRateMultiplier = null;
internal static ConfigEntry<float> HealthRegenCapMultiplier = null;
internal static ConfigEntry<bool> RemoveCombatStaminaPenalty = null;
internal static ConfigEntry<float> FallDamageMultiplier = null;
internal static ConfigEntry<float> FallDamageMinHeightMultiplier = null;
internal static ConfigEntry<float> FallDamageMaxHeightMultiplier = null;
internal static ConfigEntry<float> AmmoMultiplier = null;
internal static ConfigEntry<float> FlashlightAngleMultiplier = null;
internal static ConfigEntry<float> FlashlightIntensityMultiplier = null;
internal static ConfigEntry<float> DetectionDistanceMultiplier = null;
internal static ConfigEntry<float> WalkSpeedMultiplier = null;
internal static ConfigEntry<float> RunSpeedMultiplier = null;
internal static ConfigEntry<float> AirSpeedMultiplier = null;
internal static ConfigEntry<float> CrouchSpeedMultiplier = null;
internal static ConfigEntry<float> LadderSpeedMultiplier = null;
internal static ConfigEntry<float> JumpHeightMultiplier = null;
internal static ConfigEntry<float> FriendlyFireMultiplier = null;
internal static ConfigEntry<float> BatteryCapacityMultiplier = null;
internal static ConfigEntry<float> SmallBatteryDrainMultiplier = null;
internal static ConfigEntry<float> MediumBatteryDrainMultiplier = null;
internal static ConfigEntry<float> LargeBatteryDrainMultiplier = null;
internal static ConfigEntry<float> NoAirDamageMultiplier = null;
internal static ConfigEntry<float> NoAirDepletionTimeMultiplier = null;
internal static ConfigEntry<float> FogDensityMultiplier = null;
internal static ConfigEntry<float> EnemyHealthMultiplier = null;
internal static ConfigEntry<float> EnemyMeleeDamageMultiplier = null;
internal static ConfigEntry<float> EnemyTentacleDamageMultiplier = null;
internal static ConfigEntry<float> ConsumableSpawnMultiplier = null;
internal static ConfigEntry<float> BigPickupSpawnMultiplier = null;
internal static ConfigEntry<float> ReviveDurationMultiplier = null;
internal static ConfigEntry<float> FlashlightItemSpawnWeightMultiplier = null;
internal static ConfigEntry<float> GlowstickSpawnWeightMultiplier = null;
internal static ConfigEntry<float> CFoamGrenadeSpawnWeightMultiplier = null;
internal static ConfigEntry<float> FogRepellerSpawnWeightMultiplier = null;
internal static ConfigEntry<float> LockMelterSpawnWeightMultiplier = null;
internal static ConfigEntry<float> ExplosiveTripMineSpawnWeightMultiplier = null;
internal static ConfigEntry<float> MeleeBuffSyringeSpawnWeightMultiplier = null;
internal static ConfigEntry<float> HealthSyringeSpawnWeightMultiplier = null;
internal static ConfigEntry<float> CFoamTripmineSpawnWeightMultiplier = null;
internal static ConfigEntry<bool> BotsAlwaysEquipSentryGun = null;
internal static ConfigEntry<float> HealthPackResourceMultiplier = null;
internal static ConfigEntry<float> DisinfectionResourceMultiplier = null;
internal static ConfigEntry<float> WeaponAmmoResourceMultiplier = null;
internal static ConfigEntry<float> ToolAmmoResourceMultiplier = null;
internal static ConfigEntry<float> CommodityValueMultiplier = null;
internal static ConfigEntry<float> CommodityInContainerChanceMultiplier = null;
internal static ConfigEntry<float> ArtifactInContainerChanceMultiplier = null;
internal static ConfigEntry<float> LargeCommodityPackChanceMultiplier = null;
internal static ConfigEntry<float> MediumCommodityPackChanceMultiplier = null;
internal static ConfigEntry<float> ResourceContainerReuseChanceMultiplier = null;
internal static ConfigEntry<float> MaxPacksPerContainerMultiplier = null;
internal static ConfigEntry<float> EmptyWeakContainersPerZoneMultiplier = null;
internal static ConfigEntry<float> EmptySecureContainersPerZoneMultiplier = null;
internal static ConfigEntry<float> LootPerZoneMultiplier = null;
internal static ConfigEntry<float> AirPerZoneMultiplier = null;
internal static ConfigEntry<float> AirPerZoneInNoAirZoneMultiplier = null;
internal static ConfigEntry<float> TerminalsPerZoneMultiplier = null;
internal static ConfigEntry<float> LockedWeakContainerWithPackChanceMultiplier = null;
internal static ConfigEntry<float> ResourcePackSizeMultiplier = null;
internal static ConfigEntry<float> EnemyPatrolGroupsPerZoneMultiplier = null;
internal static ConfigEntry<float> StaticEnemiesMaxPerZoneMultiplier = null;
internal static ConfigEntry<float> StaticEnemiesMaxSmallAreaMultiplier = null;
internal static ConfigEntry<float> StaticEnemiesMaxMediumAreaMultiplier = null;
internal static ConfigEntry<float> StaticEnemiesMaxLargeAreaMultiplier = null;
internal static ConfigEntry<float> StaticEnemiesMaxHugeAreaMultiplier = null;
internal static ConfigEntry<float> EnemyPopulationPerZoneMultiplier = null;
internal static ConfigEntry<float> TentacleTrapHealthMultiplier = null;
internal static ConfigEntry<float> TentacleTrapAttackDamageMultiplier = null;
internal static ConfigEntry<float> TentacleTrapMaxPerZoneMultiplier = null;
internal static ConfigEntry<float> TentacleTrapMaxSmallAreaMultiplier = null;
internal static ConfigEntry<float> TentacleTrapMaxMediumAreaMultiplier = null;
internal static ConfigEntry<float> TentacleTrapMaxLargeAreaMultiplier = null;
internal static ConfigEntry<float> TentacleTrapMaxHugeAreaMultiplier = null;
internal static ConfigEntry<float> ParasiteNestHealthMultiplier = null;
internal static ConfigEntry<float> ParasiteNestAttackDamageMultiplier = null;
internal static ConfigEntry<float> ParasiteNestMaxPerZoneMultiplier = null;
internal static ConfigEntry<float> ParasiteNestMaxSmallAreaMultiplier = null;
internal static ConfigEntry<float> ParasiteNestMaxMediumAreaMultiplier = null;
internal static ConfigEntry<float> ParasiteNestMaxLargeAreaMultiplier = null;
internal static ConfigEntry<float> ParasiteNestMaxHugeAreaMultiplier = null;
internal static ConfigEntry<float> LevelGenVoxelCoverageMultiplier = null;
internal static ConfigEntry<float> LevelGenVoxelCoverageRandomnessMultiplier = null;
internal static ConfigEntry<float> ArtifactsPerSegmentMultiplier = null;
internal static ConfigEntry<float> ArtifactsPerLayerMultiplier = null;
internal static ConfigEntry<float> WeakDoor4x4HealthMultiplier = null;
internal static ConfigEntry<float> WeakDoor8x4HealthMultiplier = null;
internal static ConfigEntry<float> WeakDoorNoLockWeightMultiplier = null;
internal static ConfigEntry<float> WeakDoorMeleeLockWeightMultiplier = null;
internal static ConfigEntry<float> WeakDoorHackableLockWeightMultiplier = null;
internal static ConfigEntry<float> WeakDoorUnlockedOpenChanceMultiplier = null;
internal static ConfigEntry<float> WeakDoorWallRemoverOpenChanceMultiplier = null;
internal static ConfigEntry<float> WeakDoorLockHealthMultiplier = null;
internal static ConfigEntry<float> GlueVolumeToDoorHealthConversionMultiplier = null;
internal static ConfigEntry<float> GlueVolumeForDoorMaxStateMultiplier = null;
internal static readonly Dictionary<string, ConfigEntry<float>> MeleeMultipliers = new Dictionary<string, ConfigEntry<float>>();
internal static readonly string[] MeleeArchetypes = new string[4] { "Bat", "Hammer", "Knife", "Spear" };
private static readonly (string FieldKey, string ActionType, string DisplayName, string Description)[] MeleeStatDefs = new(string, string, string, string)[19]
{
("LightAttackDamage", "Light Attack", "Damage Multiplier", "Multiplies light-attack damage."),
("LightStaggerMulti", "Light Attack", "Stagger Multiplier", "Multiplies stagger force from a light attack."),
("LightPrecisionMulti", "Light Attack", "Precision Damage Multiplier", "Multiplies the weak-point damage bonus on a light attack."),
("LightEnvironmentMulti", "Light Attack", "Environment Damage Multiplier", "Multiplies light-attack damage dealt to doors/props/environment."),
("LightBackstabberMulti", "Light Attack", "Backstab Damage Multiplier", "Multiplies the backstab damage bonus on a light attack."),
("LightSleeperMulti", "Light Attack", "Sleeper Damage Multiplier", "Multiplies the sleeping-enemy damage bonus on a light attack."),
("LightAttackStaminaCost", "Light Attack", "Stamina Cost Multiplier", "Multiplies stamina cost for a light attack."),
("ChargedAttackDamage", "Charged Attack", "Damage Multiplier", "Multiplies charged (heavy) attack damage."),
("ChargedStaggerMulti", "Charged Attack", "Stagger Multiplier", "Multiplies stagger force from a charged attack."),
("ChargedPrecisionMulti", "Charged Attack", "Precision Damage Multiplier", "Multiplies the weak-point damage bonus on a charged attack."),
("ChargedEnvironmentMulti", "Charged Attack", "Environment Damage Multiplier", "Multiplies charged-attack damage dealt to doors/props/environment."),
("ChargedBackstabberMulti", "Charged Attack", "Backstab Damage Multiplier", "Multiplies the backstab damage bonus on a charged attack."),
("ChargedSleeperMulti", "Charged Attack", "Sleeper Damage Multiplier", "Multiplies the sleeping-enemy damage bonus on a charged attack."),
("ChargedAttackStaminaCost", "Charged Attack", "Stamina Cost Multiplier", "Multiplies stamina cost for a charged attack."),
("PushDamageSphereRadius", "Push", "Hit Detection Radius Multiplier", "Multiplies the hit-detection radius of the push attack."),
("PushStaminaCost", "Push", "Stamina Cost Multiplier", "Multiplies stamina cost for a push."),
("CameraDamageRayLength", "General", "Reach Multiplier", "Multiplies attack reach."),
("AttackSphereRadius", "General", "Hit Detection Radius Multiplier", "Multiplies the hit-detection radius of light and charged attacks."),
("PlayerRunSpeedMultiWhileCharging", "General", "Charge Move Speed Multiplier", "Multiplies move speed while charging a heavy attack.")
};
internal static readonly string[] WeaponTypeCategories = new string[21]
{
"Bullpup", "DMR", "Gauss_Rifle", "HEL_Shotgun", "HighCalPistol", "MachineGun", "MachineGun_LowRPM", "Pistol", "Pistol_Stagger", "Precision_Rifle",
"Revolver", "Rifle", "RifleCQB", "RifleHeavy", "SMG", "SMGHeavy", "SMG_PDW", "SawedOffShotgun", "Scattergun", "Shotgun",
"Sniper"
};
internal static readonly (uint ArchetypeId, string TypeCategory, string Label)[] WeaponArchetypes = new(uint, string, string)[49]
{
(51u, "Bullpup", "Bullpup Semi"),
(50u, "Bullpup", "Bullpup Burst"),
(49u, "Bullpup", "Bullpup Auto"),
(53u, "Bullpup", "Bullpup SemiBurst"),
(25u, "DMR", "DMR Semi"),
(26u, "DMR", "DMR Burst"),
(27u, "DMR", "DMR Auto (Long gun)"),
(28u, "DMR", "DMR SemiBurst"),
(65u, "Gauss_Rifle", "Gauss Rifle Semi"),
(81u, "HEL_Shotgun", "HEL Shotgun Semi"),
(78u, "HEL_Shotgun", "HEL Shotgun Burst"),
(80u, "HighCalPistol", "HighCalPistol"),
(59u, "MachineGun", "MachineGun Auto"),
(21u, "MachineGun_LowRPM", "MachineGun LowRPM Semi"),
(22u, "MachineGun_LowRPM", "MachineGun LowRPM Burst"),
(23u, "MachineGun_LowRPM", "MachineGun LowRPM Auto"),
(24u, "MachineGun_LowRPM", "MachineGun LowRPM SemiBurst"),
(41u, "Pistol", "Pistol Semi"),
(42u, "Pistol", "Pistol Burst"),
(43u, "Pistol", "Pistol Auto"),
(44u, "Pistol", "Pistol SemiBurst"),
(66u, "Pistol_Stagger", "Pistol Stagger Auto"),
(79u, "Precision_Rifle", "Precision Rifle"),
(37u, "Revolver", "Revolver Semi"),
(38u, "Revolver", "Revolver Burst"),
(39u, "Revolver", "Revolver Auto (Autorevolver)"),
(40u, "Revolver", "Revolver SemiBurst"),
(1u, "Rifle", "Rifle Semi"),
(3u, "Rifle", "Rifle Burst"),
(5u, "Rifle", "Rifle Auto"),
(16u, "Rifle", "Rifle SemiBurst (Semi Burst Rifle)"),
(76u, "RifleCQB", "RifleCQB"),
(73u, "RifleHeavy", "RifleHeavy Auto"),
(17u, "SMG", "SMG Semi"),
(18u, "SMG", "SMG Burst"),
(19u, "SMG", "SMG Auto"),
(20u, "SMG", "SMG SemiBurst"),
(69u, "SMGHeavy", "SMGHeavy Auto"),
(77u, "SMG_PDW", "SMG PDW"),
(45u, "SawedOffShotgun", "SawedOffShotgun Semi"),
(72u, "Scattergun", "Scattergun Burst"),
(33u, "Shotgun", "Shotgun Semi"),
(34u, "Shotgun", "Shotgun Burst"),
(35u, "Shotgun", "Shotgun Auto"),
(36u, "Shotgun", "Shotgun SemiBurst"),
(29u, "Sniper", "Sniper Semi"),
(30u, "Sniper", "Sniper Burst (Railgun)"),
(31u, "Sniper", "Sniper Auto (Coilgun)"),
(32u, "Sniper", "Sniper SemiBurst")
};
private static readonly (string FieldKey, string DisplayName, string Description)[] WeaponCoreStatDefs = new(string, string, string)[5]
{
("Damage", "Damage Multiplier", "Multiplies this weapon's base damage per hit."),
("StaggerDamageMulti", "Stagger Multiplier", "Multiplies stagger force dealt per hit."),
("PrecisionDamageMulti", "Precision Damage Multiplier", "Multiplies the weak-point/headshot damage bonus."),
("DefaultClipSize", "Clip Size Multiplier", "Multiplies magazine/clip size."),
("DefaultReloadTime", "Reload Time Multiplier", "Multiplies time to reload.")
};
internal static readonly Dictionary<string, ConfigEntry<float>> WeaponTypeMultipliers = new Dictionary<string, ConfigEntry<float>>();
internal static readonly Dictionary<string, ConfigEntry<float>> WeaponIndividualMultipliers = new Dictionary<string, ConfigEntry<float>>();
internal static ConfigEntry<float> WeaponCostOfBulletMultiplier = null;
internal static ConfigEntry<float> WeaponShotDelayMultiplier = null;
internal static ConfigEntry<float> WeaponHipFireSpreadMultiplier = null;
internal static ConfigEntry<float> WeaponAimSpreadMultiplier = null;
internal static ConfigEntry<float> WeaponPiercingDamageCountLimitMultiplier = null;
internal static ConfigEntry<float> WeaponBurstDelayMultiplier = null;
internal static ConfigEntry<float> WeaponBurstShotCountMultiplier = null;
internal static ConfigEntry<float> WeaponShotgunBulletCountMultiplier = null;
internal static ConfigEntry<float> WeaponShotgunConeSizeMultiplier = null;
internal static ConfigEntry<float> WeaponShotgunBulletSpreadMultiplier = null;
internal static ConfigEntry<float> WeaponSpecialChargetupTimeMultiplier = null;
internal static ConfigEntry<float> WeaponSpecialCooldownTimeMultiplier = null;
internal static ConfigEntry<float> WeaponSpecialSemiBurstCountTimeoutMultiplier = null;
internal static ConfigEntry<float> WeaponEquipTransitionTimeMultiplier = null;
internal static ConfigEntry<float> WeaponAimTransitionTimeMultiplier = null;
internal static ConfigEntry<float> WeaponShellCasingSizeMultiplier = null;
internal static ConfigEntry<float> SentryStartFireDelayMultiplier = null;
internal static ConfigEntry<float> SentryRotationSpeedMultiplier = null;
internal static ConfigEntry<float> SentryDetectionMaxRangeMultiplier = null;
internal static ConfigEntry<float> SentryDetectionMaxAngleMultiplier = null;
internal static ConfigEntry<float> SentryLongRangeThresholdMultiplier = null;
internal static ConfigEntry<float> SentryShortRangeThresholdMultiplier = null;
internal static ConfigEntry<float> SentryStartFireDelayTagMultiplier = null;
internal static ConfigEntry<float> SentryRotationSpeedTagMultiplier = null;
internal static ConfigEntry<float> SentryDamageTagMultiplier = null;
internal static ConfigEntry<float> SentryStaggerDamageTagMultiplier = null;
internal static ConfigEntry<float> SentryCostOfBulletTagMultiplier = null;
internal static ConfigEntry<float> SentryShotDelayTagMultiplier = null;
public override void Load()
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Expected O, but got Unknown
Logger = ((BasePlugin)this).Log;
BindConfig();
new Harmony("MindAttic.GTFO.EZ").PatchAll();
ManualLogSource logger = Logger;
bool flag = default(bool);
BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(10, 2, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("GTFO.EZ");
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" v");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("8.0.0");
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" loaded.");
}
logger.LogInfo(val);
}
private void BindConfig()
{
HealthMultiplier = ((BasePlugin)this).Config.Bind<float>("Health", "Max Health Multiplier", 2f, "Multiplies player max health. Vanilla 25 -> 50 at the default 2.0.");
HealthRegenRateMultiplier = ((BasePlugin)this).Config.Bind<float>("Health", "Health Regen Rate Multiplier", 0.5f, "Multiplies health regen per second. Vanilla 0.2/s -> 0.1/s at the default 0.5.");
HealthRegenCapMultiplier = ((BasePlugin)this).Config.Bind<float>("Health", "Health Regen Cap Multiplier", 0.5f, "Multiplies how much of max health can regenerate without a med kit. Vanilla 20% -> 10% at the default 0.5. Regen delay is left at vanilla on purpose - fast regen with no delay is overpowered.");
RemoveCombatStaminaPenalty = ((BasePlugin)this).Config.Bind<bool>("Stamina", "Remove Combat Stamina Penalty", true, "Makes stamina regen while in combat as fast as out of combat, and removes the 90% stamina cap while in combat.");
FallDamageMultiplier = ((BasePlugin)this).Config.Bind<float>("Fall Damage", "Fall Damage Multiplier", 0.1f, "Multiplies fall damage dealt once you're past the no-damage height. Default 0.1 (10% of normal) on top of the height change below.");
FallDamageMinHeightMultiplier = ((BasePlugin)this).Config.Bind<float>("Fall Damage", "Fall Damage Min Height Multiplier", 1f, "Multiplies the minimum fall height before any damage is taken. Left at vanilla (1.0) - the 10% damage multiplier above already does the work.");
FallDamageMaxHeightMultiplier = ((BasePlugin)this).Config.Bind<float>("Fall Damage", "Fall Damage Max Height Multiplier", 1.5f, "Multiplies the fall height at which damage maxes out. Vanilla 20m -> 30m at the default 1.5.");
AmmoMultiplier = ((BasePlugin)this).Config.Bind<float>("Ammo", "Weapon Ammo Multiplier", 1.5f, "Multiplies max reserve ammo, starting ammo, and refill amounts for standard/special/consumable ammo. Deliberately not paired with a damage buff - that combination was reported as overtuned.");
FlashlightAngleMultiplier = ((BasePlugin)this).Config.Bind<float>("Lighting", "Flashlight Angle Multiplier", 1f, "Multiplies the cone angle of headlamps and weapon-mounted lights. Left at vanilla (1.0) by default.");
FlashlightIntensityMultiplier = ((BasePlugin)this).Config.Bind<float>("Lighting", "Flashlight Intensity Multiplier", 1f, "Multiplies the brightness of headlamps and weapon-mounted lights. Left at vanilla (1.0) by default - brighter lights make you more visible to enemies too.");
DetectionDistanceMultiplier = ((BasePlugin)this).Config.Bind<float>("Enemy Detection", "Movement Detection Distance Multiplier", 0.75f, "Multiplies how far enemies can detect player movement noise. 0.75 on an 8m base gives 6m.");
WalkSpeedMultiplier = ((BasePlugin)this).Config.Bind<float>("Movement", "Walk Speed Multiplier", 1f, "Multiplies walking move speed. Left at vanilla (1.0) by default.");
RunSpeedMultiplier = ((BasePlugin)this).Config.Bind<float>("Movement", "Run Speed Multiplier", 1f, "Multiplies sprinting move speed. Left at vanilla (1.0) by default.");
AirSpeedMultiplier = ((BasePlugin)this).Config.Bind<float>("Movement", "Air Speed Multiplier", 1f, "Multiplies mid-air move speed (control while jumping/falling). Left at vanilla (1.0) by default.");
CrouchSpeedMultiplier = ((BasePlugin)this).Config.Bind<float>("Movement", "Crouch Speed Multiplier", 1f, "Multiplies crouched move speed. Left at vanilla (1.0) by default.");
LadderSpeedMultiplier = ((BasePlugin)this).Config.Bind<float>("Movement", "Ladder Speed Multiplier", 1f, "Multiplies ladder climb speed. Left at vanilla (1.0) by default.");
JumpHeightMultiplier = ((BasePlugin)this).Config.Bind<float>("Movement", "Jump Height Multiplier", 1f, "Multiplies jump height (initial jump velocity). Left at vanilla (1.0) by default.");
FriendlyFireMultiplier = ((BasePlugin)this).Config.Bind<float>("Combat", "Friendly Fire Multiplier", 1f, "Multiplies damage taken from teammates' weapons. Left at vanilla (1.0) by default.");
BatteryCapacityMultiplier = ((BasePlugin)this).Config.Bind<float>("Utility", "Battery Capacity Multiplier", 1f, "Multiplies max battery charge for flashlights and powered tools. Left at vanilla (1.0) by default.");
SmallBatteryDrainMultiplier = ((BasePlugin)this).Config.Bind<float>("Utility", "Small Battery Drain Multiplier", 1f, "Multiplies battery drain per second for small powered tools. Left at vanilla (1.0) by default.");
MediumBatteryDrainMultiplier = ((BasePlugin)this).Config.Bind<float>("Utility", "Medium Battery Drain Multiplier", 1f, "Multiplies battery drain per second for medium powered tools. Left at vanilla (1.0) by default.");
LargeBatteryDrainMultiplier = ((BasePlugin)this).Config.Bind<float>("Utility", "Large Battery Drain Multiplier", 1f, "Multiplies battery drain per second for large powered tools. Left at vanilla (1.0) by default.");
NoAirDamageMultiplier = ((BasePlugin)this).Config.Bind<float>("Environment", "No-Air Damage Multiplier", 1f, "Multiplies the damage rate from suffocating in no-air zones once your air runs out. Left at vanilla (1.0) by default.");
NoAirDepletionTimeMultiplier = ((BasePlugin)this).Config.Bind<float>("Environment", "No-Air Depletion Time Multiplier", 1f, "Multiplies how long your air meter lasts in no-air zones before it empties. Left at vanilla (1.0) by default.");
FogDensityMultiplier = ((BasePlugin)this).Config.Bind<float>("Environment", "Fog Density Multiplier", 0.1f, "Multiplies the density of the visual fog that limits visibility. Default 0.1 (90% reduction) - vanilla fog was judged more annoying than fun.");
EnemyHealthMultiplier = ((BasePlugin)this).Config.Bind<float>("Enemy Balance", "Enemy Health Multiplier", 1f, "Multiplies max health for every enemy type. Left at vanilla (1.0) by default.");
EnemyMeleeDamageMultiplier = ((BasePlugin)this).Config.Bind<float>("Enemy Balance", "Enemy Melee Damage Multiplier", 1f, "Multiplies melee attack damage for every enemy type. Left at vanilla (1.0) by default.");
EnemyTentacleDamageMultiplier = ((BasePlugin)this).Config.Bind<float>("Enemy Balance", "Enemy Tentacle Damage Multiplier", 1f, "Multiplies tentacle attack damage (Striker/Tank grabs, Scout tentacles, etc.) for every enemy type. Left at vanilla (1.0) by default.");
ConsumableSpawnMultiplier = ((BasePlugin)this).Config.Bind<float>("Loot", "Consumable Spawn Multiplier", 1f, "Multiplies how many consumables (med/ammo packs, syringes, etc.) spawn per zone. Left at vanilla (1.0) by default.");
BigPickupSpawnMultiplier = ((BasePlugin)this).Config.Bind<float>("Loot", "Big Pickup Spawn Multiplier", 1f, "Multiplies how many big pickups (fog turbines, artifacts, etc.) spawn per zone. Left at vanilla (1.0) by default.");
ReviveDurationMultiplier = ((BasePlugin)this).Config.Bind<float>("Interactions", "Revive Duration Multiplier", 0.33f, "Multiplies how long it takes to revive a downed teammate. Lower is faster. Default 0.33 (33% of vanilla).");
FlashlightItemSpawnWeightMultiplier = ((BasePlugin)this).Config.Bind<float>("Loot", "Long Range Flashlight Spawn Weight Multiplier", 1f, "Multiplies how likely a Long Range Flashlight is picked when a consumable spawns. Left at vanilla (1.0) by default.");
GlowstickSpawnWeightMultiplier = ((BasePlugin)this).Config.Bind<float>("Loot", "Glow Stick Spawn Weight Multiplier", 0f, "Multiplies how likely a glow stick (either color) is picked when a consumable spawns. Defaults to 0 (disabled) - other consumables fill those slots.");
CFoamGrenadeSpawnWeightMultiplier = ((BasePlugin)this).Config.Bind<float>("Loot", "C-Foam Grenade Spawn Weight Multiplier", 0f, "Multiplies how likely a C-Foam Grenade is picked when a consumable spawns. Defaults to 0 (disabled) - other consumables fill those slots.");
FogRepellerSpawnWeightMultiplier = ((BasePlugin)this).Config.Bind<float>("Loot", "Fog Repeller Spawn Weight Multiplier", 1f, "Multiplies how likely a Fog Repeller is picked when a consumable spawns. Left at vanilla (1.0) by default.");
LockMelterSpawnWeightMultiplier = ((BasePlugin)this).Config.Bind<float>("Loot", "Lock Melter Spawn Weight Multiplier", 0f, "Multiplies how likely a Lock Melter is picked when a consumable spawns. Defaults to 0 (disabled) - other consumables fill those slots.");
ExplosiveTripMineSpawnWeightMultiplier = ((BasePlugin)this).Config.Bind<float>("Loot", "Explosive Trip Mine Spawn Weight Multiplier", 1f, "Multiplies how likely an Explosive Trip Mine is picked when a consumable spawns. Left at vanilla (1.0) by default.");
MeleeBuffSyringeSpawnWeightMultiplier = ((BasePlugin)this).Config.Bind<float>("Loot", "Melee Buff Syringe Spawn Weight Multiplier", 1f, "Multiplies how likely a IIx (melee buff) Syringe is picked when a consumable spawns. Left at vanilla (1.0) by default.");
HealthSyringeSpawnWeightMultiplier = ((BasePlugin)this).Config.Bind<float>("Loot", "Health Syringe Spawn Weight Multiplier", 1f, "Multiplies how likely a I2-LP (health) Syringe is picked when a consumable spawns. Left at vanilla (1.0) by default.");
CFoamTripmineSpawnWeightMultiplier = ((BasePlugin)this).Config.Bind<float>("Loot", "C-Foam Tripmine Spawn Weight Multiplier", 1f, "Multiplies how likely a C-Foam Tripmine is picked when a consumable spawns. Left at vanilla (1.0) by default.");
BotsAlwaysEquipSentryGun = ((BasePlugin)this).Config.Bind<bool>("Bots", "Bots Always Equip Sentry Gun", false, "Forces any bot's Tool slot to the basic Sentry Gun the moment it gets gear, whether it's filling an empty slot or replacing a player. Off by default - bot loadouts can already be set manually in COMS; this is here for anyone who wants it automatic instead.");
HealthPackResourceMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Health Pack Resource Multiplier", 1f, "Multiplies the health-pack resource budget distributed per zone. Left at vanilla (1.0) by default.");
DisinfectionResourceMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Disinfection Resource Multiplier", 1f, "Multiplies the infection-cure resource budget distributed per zone. Left at vanilla (1.0) by default.");
WeaponAmmoResourceMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Weapon Ammo Resource Multiplier", 1f, "Multiplies the weapon ammo-pack resource budget distributed per zone. Left at vanilla (1.0) by default.");
ToolAmmoResourceMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Tool Ammo Resource Multiplier", 1f, "Multiplies the tool ammo (sentries, C-foam launcher, etc.) resource budget per zone. Left at vanilla (1.0) by default.");
CommodityValueMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Commodity Value Multiplier", 1f, "Multiplies the total commodity (crafting material) value distributed per zone. Left at vanilla (1.0) by default.");
CommodityInContainerChanceMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Commodity In Container Chance Multiplier", 1f, "Multiplies the chance a resource container holds a commodity. Left at vanilla (1.0) by default.");
ArtifactInContainerChanceMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Artifact In Container Chance Multiplier", 1f, "Multiplies the chance a resource container holds an artifact. Left at vanilla (1.0) by default.");
LargeCommodityPackChanceMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Large Commodity Pack Chance Multiplier", 1f, "Multiplies the chance a commodity spawn is a large pack instead of small. Left at vanilla (1.0) by default.");
MediumCommodityPackChanceMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Medium Commodity Pack Chance Multiplier", 1f, "Multiplies the chance a commodity spawn is a medium pack instead of small. Left at vanilla (1.0) by default.");
ResourceContainerReuseChanceMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Resource Container Reuse Chance Multiplier", 1f, "Multiplies the chance a resource container gets reused for a second pack. Left at vanilla (1.0) by default.");
MaxPacksPerContainerMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Max Packs Per Container Multiplier", 1f, "Multiplies the max number of packs a single resource container can hold. Left at vanilla (1.0) by default.");
EmptyWeakContainersPerZoneMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Empty Weak Containers Per Zone Multiplier", 1f, "Multiplies how many empty weak (cardboard box) containers spawn per zone. Left at vanilla (1.0) by default.");
EmptySecureContainersPerZoneMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Empty Secure Containers Per Zone Multiplier", 1f, "Multiplies how many empty secure (locker) containers spawn per zone. Left at vanilla (1.0) by default.");
LootPerZoneMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Loot Per Zone Multiplier", 1f, "Multiplies the general loot budget distributed per zone. Left at vanilla (1.0) by default.");
AirPerZoneMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Air Per Zone Multiplier", 1f, "Multiplies the breathable-air resource budget per zone. Left at vanilla (1.0) by default.");
AirPerZoneInNoAirZoneMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Air Per Zone In No-Air Zone Multiplier", 1f, "Multiplies the air resource budget per zone specifically inside no-air areas. Left at vanilla (1.0) by default.");
TerminalsPerZoneMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Terminals Per Zone Multiplier", 1f, "Multiplies how many terminals spawn per zone. Left at vanilla (1.0) by default.");
LockedWeakContainerWithPackChanceMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Locked Weak Container With Pack Chance Multiplier", 1f, "Multiplies the chance a weak container holding a pack is locked. Left at vanilla (1.0) by default.");
ResourcePackSizeMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Resources", "Resource Pack Size Multiplier", 1f, "Multiplies the size of every resource pack tier (small/medium/large). Left at vanilla (1.0) by default.");
EnemyPatrolGroupsPerZoneMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Enemy Patrol Groups Per Zone Multiplier", 1f, "Multiplies how many roaming enemy patrol groups spawn per zone. Left at vanilla (1.0) by default.");
StaticEnemiesMaxPerZoneMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Static Enemies Max Per Zone Multiplier", 1f, "Multiplies the max number of stationary (sleeper) enemies per zone. Left at vanilla (1.0) by default.");
StaticEnemiesMaxSmallAreaMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Static Enemies Max Small Area Multiplier", 1f, "Multiplies the max stationary enemies allowed in a small area. Left at vanilla (1.0) by default.");
StaticEnemiesMaxMediumAreaMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Static Enemies Max Medium Area Multiplier", 1f, "Multiplies the max stationary enemies allowed in a medium area. Left at vanilla (1.0) by default.");
StaticEnemiesMaxLargeAreaMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Static Enemies Max Large Area Multiplier", 1f, "Multiplies the max stationary enemies allowed in a large area. Left at vanilla (1.0) by default.");
StaticEnemiesMaxHugeAreaMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Static Enemies Max Huge Area Multiplier", 1f, "Multiplies the max stationary enemies allowed in a huge area. Left at vanilla (1.0) by default.");
EnemyPopulationPerZoneMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Enemy Population Per Zone Multiplier", 1f, "Multiplies the overall enemy population budget per zone. Left at vanilla (1.0) by default.");
TentacleTrapHealthMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Tentacle Trap Health Multiplier", 1f, "Multiplies max health for tentacle traps. Left at vanilla (1.0) by default.");
TentacleTrapAttackDamageMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Tentacle Trap Attack Damage Multiplier", 1f, "Multiplies attack damage dealt by tentacle traps. Left at vanilla (1.0) by default.");
TentacleTrapMaxPerZoneMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Tentacle Trap Max Per Zone Multiplier", 1f, "Multiplies the max number of tentacle traps per zone. Left at vanilla (1.0) by default.");
TentacleTrapMaxSmallAreaMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Tentacle Trap Max Small Area Multiplier", 1f, "Multiplies the max tentacle traps allowed in a small area. Left at vanilla (1.0) by default.");
TentacleTrapMaxMediumAreaMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Tentacle Trap Max Medium Area Multiplier", 1f, "Multiplies the max tentacle traps allowed in a medium area. Left at vanilla (1.0) by default.");
TentacleTrapMaxLargeAreaMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Tentacle Trap Max Large Area Multiplier", 1f, "Multiplies the max tentacle traps allowed in a large area. Left at vanilla (1.0) by default.");
TentacleTrapMaxHugeAreaMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Tentacle Trap Max Huge Area Multiplier", 1f, "Multiplies the max tentacle traps allowed in a huge area. Left at vanilla (1.0) by default.");
ParasiteNestHealthMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Parasite Nest Health Multiplier", 1f, "Multiplies max health for parasite nests. Left at vanilla (1.0) by default.");
ParasiteNestAttackDamageMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Parasite Nest Attack Damage Multiplier", 1f, "Multiplies attack damage dealt by parasite nests. Left at vanilla (1.0) by default.");
ParasiteNestMaxPerZoneMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Parasite Nest Max Per Zone Multiplier", 1f, "Multiplies the max number of parasite nests per zone. Left at vanilla (1.0) by default.");
ParasiteNestMaxSmallAreaMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Parasite Nest Max Small Area Multiplier", 1f, "Multiplies the max parasite nests allowed in a small area. Left at vanilla (1.0) by default.");
ParasiteNestMaxMediumAreaMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Parasite Nest Max Medium Area Multiplier", 1f, "Multiplies the max parasite nests allowed in a medium area. Left at vanilla (1.0) by default.");
ParasiteNestMaxLargeAreaMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Parasite Nest Max Large Area Multiplier", 1f, "Multiplies the max parasite nests allowed in a large area. Left at vanilla (1.0) by default.");
ParasiteNestMaxHugeAreaMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Enemies", "Parasite Nest Max Huge Area Multiplier", 1f, "Multiplies the max parasite nests allowed in a huge area. Left at vanilla (1.0) by default.");
LevelGenVoxelCoverageMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Level Gen", "Voxel Coverage Area Multiplier", 1f, "Multiplies an internal level-generation area-coverage factor. Left at vanilla (1.0) by default.");
LevelGenVoxelCoverageRandomnessMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Level Gen", "Voxel Coverage Area Randomness Multiplier", 1f, "Multiplies the randomness factor in that same level-generation coverage scoring. Left at vanilla (1.0) by default.");
ArtifactsPerSegmentMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Level Gen", "Artifacts Per Segment Multiplier", 1f, "Multiplies how many artifacts can spawn per level segment. Left at vanilla (1.0) by default.");
ArtifactsPerLayerMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Level Gen", "Artifacts Per Layer Multiplier", 1f, "Multiplies how many artifacts can spawn per level layer. Left at vanilla (1.0) by default.");
WeakDoor4x4HealthMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Doors", "Weak Door 4x4 Health Multiplier", 1f, "Multiplies the health of small (4x4) weak doors. Left at vanilla (1.0) by default.");
WeakDoor8x4HealthMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Doors", "Weak Door 8x4 Health Multiplier", 1f, "Multiplies the health of large (8x4) weak doors. Left at vanilla (1.0) by default.");
WeakDoorNoLockWeightMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Doors", "Weak Door No-Lock Weight Multiplier", 1f, "Multiplies the odds a weak door spawns with no lock at all. Left at vanilla (1.0) by default.");
WeakDoorMeleeLockWeightMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Doors", "Weak Door Melee Lock Weight Multiplier", 1f, "Multiplies the odds a weak door spawns with a melee-breakable lock. Left at vanilla (1.0) by default.");
WeakDoorHackableLockWeightMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Doors", "Weak Door Hackable Lock Weight Multiplier", 1f, "Multiplies the odds a weak door spawns with a hackable lock. Left at vanilla (1.0) by default.");
WeakDoorUnlockedOpenChanceMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Doors", "Weak Door Unlocked Open Chance Multiplier", 1f, "Multiplies the chance an unlocked weak door starts already open. Left at vanilla (1.0) by default.");
WeakDoorWallRemoverOpenChanceMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Doors", "Weak Door Wall Remover Open Chance Multiplier", 1f, "Multiplies the chance a door starts open where a wall-remover charge was used. Left at vanilla (1.0) by default.");
WeakDoorLockHealthMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Doors", "Weak Door Lock Health Multiplier", 1f, "Multiplies the health of a weak door's lock itself (separate from the door). Left at vanilla (1.0) by default.");
GlueVolumeToDoorHealthConversionMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Doors", "Glue Volume To Door Health Conversion Multiplier", 1f, "Multiplies how effectively C-Foam volume converts into door damage. Left at vanilla (1.0) by default.");
GlueVolumeForDoorMaxStateMultiplier = ((BasePlugin)this).Config.Bind<float>("Expedition Doors", "Glue Volume For Door Max State Multiplier", 1f, "Multiplies how much C-Foam volume is needed to fully seal a door. Left at vanilla (1.0) by default.");
string[] meleeArchetypes = MeleeArchetypes;
foreach (string text in meleeArchetypes)
{
(string, string, string, string)[] meleeStatDefs = MeleeStatDefs;
for (int j = 0; j < meleeStatDefs.Length; j++)
{
(string, string, string, string) tuple = meleeStatDefs[j];
string text2 = "Melee - " + text + " - " + tuple.Item2;
ConfigEntry<float> value = ((BasePlugin)this).Config.Bind<float>(text2, tuple.Item3, 1f, tuple.Item4 + " Left at vanilla (1.0) by default.");
MeleeMultipliers[text + "." + tuple.Item1] = value;
}
}
meleeArchetypes = WeaponTypeCategories;
foreach (string text3 in meleeArchetypes)
{
(string, string, string)[] weaponCoreStatDefs = WeaponCoreStatDefs;
for (int j = 0; j < weaponCoreStatDefs.Length; j++)
{
(string, string, string) tuple2 = weaponCoreStatDefs[j];
string text4 = "Weapon Type - " + text3.Replace('_', ' ');
ConfigEntry<float> value2 = ((BasePlugin)this).Config.Bind<float>(text4, tuple2.Item2, 1f, tuple2.Item3 + " Applies to every fire-mode variant of this weapon type. Left at vanilla (1.0) by default.");
WeaponTypeMultipliers[text3 + "." + tuple2.Item1] = value2;
}
}
(uint, string, string)[] weaponArchetypes = WeaponArchetypes;
for (int i = 0; i < weaponArchetypes.Length; i++)
{
(uint, string, string) tuple3 = weaponArchetypes[i];
(string, string, string)[] weaponCoreStatDefs = WeaponCoreStatDefs;
for (int j = 0; j < weaponCoreStatDefs.Length; j++)
{
(string, string, string) tuple4 = weaponCoreStatDefs[j];
string text5 = "Weapon - " + tuple3.Item3;
ConfigEntry<float> value3 = ((BasePlugin)this).Config.Bind<float>(text5, tuple4.Item2, 1f, tuple4.Item3 + " Stacks multiplicatively with this weapon's type-level multiplier. Left at vanilla (1.0) by default.");
WeaponIndividualMultipliers[$"{tuple3.Item1}.{tuple4.Item1}"] = value3;
}
}
WeaponCostOfBulletMultiplier = ((BasePlugin)this).Config.Bind<float>("Weapon - Other", "Ammo Cost Per Shot Multiplier", 1f, "Multiplies how much reserve ammo each shot consumes, for every weapon and sentry. Left at vanilla (1.0) by default.");
WeaponShotDelayMultiplier = ((BasePlugin)this).Config.Bind<float>("Weapon - Other", "Shot Delay Multiplier", 1f, "Multiplies the delay between shots (fire rate) for every weapon and sentry. Left at vanilla (1.0) by default.");
WeaponHipFireSpreadMultiplier = ((BasePlugin)this).Config.Bind<float>("Weapon - Other", "Hip-Fire Spread Multiplier", 1f, "Multiplies bullet spread while firing from the hip, for every weapon. Left at vanilla (1.0) by default.");
WeaponAimSpreadMultiplier = ((BasePlugin)this).Config.Bind<float>("Weapon - Other", "Aim Spread Multiplier", 1f, "Multiplies bullet spread while aiming down sights, for every weapon. Left at vanilla (1.0) by default.");
WeaponPiercingDamageCountLimitMultiplier = ((BasePlugin)this).Config.Bind<float>("Weapon - Other", "Piercing Target Count Multiplier", 1f, "Multiplies how many enemies a piercing bullet can hit in one shot, for every weapon that pierces. Left at vanilla (1.0) by default.");
WeaponBurstDelayMultiplier = ((BasePlugin)this).Config.Bind<float>("Weapon - Other", "Burst Delay Multiplier", 1f, "Multiplies the delay between shots within a burst, for every burst-fire weapon. Left at vanilla (1.0) by default.");
WeaponBurstShotCountMultiplier = ((BasePlugin)this).Config.Bind<float>("Weapon - Other", "Burst Shot Count Multiplier", 1f, "Multiplies how many rounds fire per burst, for every burst-fire weapon. Left at vanilla (1.0) by default.");
WeaponShotgunBulletCountMultiplier = ((BasePlugin)this).Config.Bind<float>("Weapon - Other", "Shotgun Pellet Count Multiplier", 1f, "Multiplies how many pellets a shotgun blast fires, for every shotgun. Left at vanilla (1.0) by default.");
WeaponShotgunConeSizeMultiplier = ((BasePlugin)this).Config.Bind<float>("Weapon - Other", "Shotgun Cone Size Multiplier", 1f, "Multiplies the spread cone size of a shotgun blast, for every shotgun. Left at vanilla (1.0) by default.");
WeaponShotgunBulletSpreadMultiplier = ((BasePlugin)this).Config.Bind<float>("Weapon - Other", "Shotgun Pellet Spread Multiplier", 1f, "Multiplies how spread out individual pellets are within a shotgun blast. Left at vanilla (1.0) by default.");
WeaponSpecialChargetupTimeMultiplier = ((BasePlugin)this).Config.Bind<float>("Weapon - Other", "Special Charge-Up Time Multiplier", 1f, "Multiplies charge-up time for weapons with a special charged shot. Left at vanilla (1.0) by default.");
WeaponSpecialCooldownTimeMultiplier = ((BasePlugin)this).Config.Bind<float>("Weapon - Other", "Special Cooldown Time Multiplier", 1f, "Multiplies cooldown time for weapons with a special charged shot. Left at vanilla (1.0) by default.");
WeaponSpecialSemiBurstCountTimeoutMultiplier = ((BasePlugin)this).Config.Bind<float>("Weapon - Other", "Semi-Burst Timeout Multiplier", 1f, "Multiplies the window to chain shots into a semi-burst, for weapons with that firing mode. Left at vanilla (1.0) by default.");
WeaponEquipTransitionTimeMultiplier = ((BasePlugin)this).Config.Bind<float>("Weapon - Other", "Equip Transition Time Multiplier", 1f, "Multiplies how long it takes to raise a weapon after switching to it. Left at vanilla (1.0) by default.");
WeaponAimTransitionTimeMultiplier = ((BasePlugin)this).Config.Bind<float>("Weapon - Other", "Aim Transition Time Multiplier", 1f, "Multiplies how long it takes to raise sights when aiming down sights. Left at vanilla (1.0) by default.");
WeaponShellCasingSizeMultiplier = ((BasePlugin)this).Config.Bind<float>("Weapon - Other", "Shell Casing Size Multiplier", 1f, "Multiplies the visual size of ejected shell casings. Purely cosmetic. Left at vanilla (1.0) by default.");
SentryStartFireDelayMultiplier = ((BasePlugin)this).Config.Bind<float>("Sentries", "Start Fire Delay Multiplier", 1f, "Multiplies how long a sentry waits after detecting a target before it opens fire. Left at vanilla (1.0) by default.");
SentryRotationSpeedMultiplier = ((BasePlugin)this).Config.Bind<float>("Sentries", "Rotation Speed Multiplier", 1f, "Multiplies how fast a sentry turns to track targets. Left at vanilla (1.0) by default.");
SentryDetectionMaxRangeMultiplier = ((BasePlugin)this).Config.Bind<float>("Sentries", "Detection Max Range Multiplier", 1f, "Multiplies the maximum range at which a sentry can detect targets. Left at vanilla (1.0) by default.");
SentryDetectionMaxAngleMultiplier = ((BasePlugin)this).Config.Bind<float>("Sentries", "Detection Max Angle Multiplier", 1f, "Multiplies the detection cone angle a sentry scans. Left at vanilla (1.0) by default.");
SentryLongRangeThresholdMultiplier = ((BasePlugin)this).Config.Bind<float>("Sentries", "Long Range Threshold Multiplier", 1f, "Multiplies the distance beyond which a sentry treats a target as long-range. Left at vanilla (1.0) by default.");
SentryShortRangeThresholdMultiplier = ((BasePlugin)this).Config.Bind<float>("Sentries", "Short Range Threshold Multiplier", 1f, "Multiplies the distance within which a sentry treats a target as short-range. Left at vanilla (1.0) by default.");
SentryStartFireDelayTagMultiplier = ((BasePlugin)this).Config.Bind<float>("Sentries", "Tagged-Target Start Fire Delay Multiplier", 1f, "Multiplies the start-fire-delay multiplier applied against a tagged (scanned) target. Left at vanilla (1.0) by default.");
SentryRotationSpeedTagMultiplier = ((BasePlugin)this).Config.Bind<float>("Sentries", "Tagged-Target Rotation Speed Multiplier", 1f, "Multiplies the rotation-speed multiplier applied against a tagged (scanned) target. Left at vanilla (1.0) by default.");
SentryDamageTagMultiplier = ((BasePlugin)this).Config.Bind<float>("Sentries", "Tagged-Target Damage Multiplier", 1f, "Multiplies the damage multiplier applied against a tagged (scanned) target. Left at vanilla (1.0) by default.");
SentryStaggerDamageTagMultiplier = ((BasePlugin)this).Config.Bind<float>("Sentries", "Tagged-Target Stagger Multiplier", 1f, "Multiplies the stagger multiplier applied against a tagged (scanned) target. Left at vanilla (1.0) by default.");
SentryCostOfBulletTagMultiplier = ((BasePlugin)this).Config.Bind<float>("Sentries", "Tagged-Target Ammo Cost Multiplier", 1f, "Multiplies the ammo-cost multiplier applied against a tagged (scanned) target. Left at vanilla (1.0) by default.");
SentryShotDelayTagMultiplier = ((BasePlugin)this).Config.Bind<float>("Sentries", "Tagged-Target Shot Delay Multiplier", 1f, "Multiplies the shot-delay multiplier applied against a tagged (scanned) target. Left at vanilla (1.0) by default.");
}
}
}
namespace GTFO.EZ.Patches
{
[HarmonyPatch(typeof(PlayerBackpackManager))]
internal static class BotSentryEquipPatch
{
private static GearIDRange? _sentryGear;
private static GearIDRange? GetSentryGear()
{
if (_sentryGear != null)
{
return _sentryGear;
}
GearDataBlock block = GameDataBlockBase<GearDataBlock>.GetBlock(Gear.Basic_SentryGun);
ItemDataBlock val = ((block != null) ? GameDataBlockBase<ItemDataBlock>.GetBlock(block.baseItemID) : null);
GearIDRange sentryGear = default(GearIDRange);
if (val == null || !GearManager.TryGetGearFromItem((InventorySlot)3, val, ref sentryGear))
{
Plugin.Logger.LogWarning((object)"GTFO.EZ: could not resolve Sentry Gun gear for bots.");
return null;
}
_sentryGear = sentryGear;
return _sentryGear;
}
[HarmonyPatch("GiveFavoriteGearToBot")]
[HarmonyPostfix]
private static void GiveFavoriteGearToBot_Postfix(SNet_Player bot)
{
if (Plugin.BotsAlwaysEquipSentryGun.Value)
{
GearIDRange sentryGear = GetSentryGear();
if (sentryGear != null)
{
PlayerBackpackManager.EquipBotGear(bot, sentryGear);
}
}
}
[HarmonyPatch("CopyGearToBot")]
[HarmonyPostfix]
private static void CopyGearToBot_Postfix(SNet_Player bot)
{
if (Plugin.BotsAlwaysEquipSentryGun.Value)
{
GearIDRange sentryGear = GetSentryGear();
if (sentryGear != null)
{
PlayerBackpackManager.EquipBotGear(bot, sentryGear);
}
}
}
}
[HarmonyPatch(typeof(GameDataInit), "Initialize")]
internal static class GameDataInit_Initialize_Patch
{
private static readonly Dictionary<uint, Func<float>> ConsumableWeightMultipliers = new Dictionary<uint, Func<float>>
{
{
30u,
() => Plugin.FlashlightItemSpawnWeightMultiplier.Value
},
{
114u,
() => Plugin.GlowstickSpawnWeightMultiplier.Value
},
{
174u,
() => Plugin.GlowstickSpawnWeightMultiplier.Value
},
{
115u,
() => Plugin.CFoamGrenadeSpawnWeightMultiplier.Value
},
{
117u,
() => Plugin.FogRepellerSpawnWeightMultiplier.Value
},
{
116u,
() => Plugin.LockMelterSpawnWeightMultiplier.Value
},
{
139u,
() => Plugin.ExplosiveTripMineSpawnWeightMultiplier.Value
},
{
142u,
() => Plugin.MeleeBuffSyringeSpawnWeightMultiplier.Value
},
{
140u,
() => Plugin.HealthSyringeSpawnWeightMultiplier.Value
},
{
144u,
() => Plugin.CFoamTripmineSpawnWeightMultiplier.Value
}
};
private static readonly Dictionary<uint, (string Category, string Label)> WeaponArchetypeOwners = BuildWeaponArchetypeOwners();
[HarmonyPostfix]
private static void Postfix()
{
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Expected O, but got Unknown
try
{
ApplyPlayerTweaks();
ApplyFlashlightTweaks();
ApplyDetectionTweaks();
ApplyEnemyBalanceTweaks();
ApplyFogTweaks();
ApplyLootTweaks();
ApplyExpeditionBalanceTweaks();
ApplyMeleeTweaks();
ApplyWeaponTweaks();
Plugin.Logger.LogInfo((object)"GTFO.EZ tweaks applied. Goo goo. Gah gah.");
}
catch (Exception ex)
{
ManualLogSource logger = Plugin.Logger;
bool flag = default(bool);
BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(32, 1, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("GTFO.EZ failed to apply tweaks: ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
}
logger.LogError(val);
}
}
private static void ApplyPlayerTweaks()
{
PlayerDataBlock block = GameDataBlockBase<PlayerDataBlock>.GetBlock(1u);
if (block == null)
{
Plugin.Logger.LogWarning((object)"PlayerDataBlock (id 1) not found, skipping player tweaks.");
return;
}
float value = Plugin.HealthMultiplier.Value;
block.health *= value;
block.healthRegenPerSecond *= Plugin.HealthRegenRateMultiplier.Value;
block.healthRegenRelMax = Math.Min(1f, block.healthRegenRelMax * Plugin.HealthRegenCapMultiplier.Value);
if (Plugin.RemoveCombatStaminaPenalty.Value)
{
block.StaminaRegenNotRestingInCombat = block.StaminaRegenNotRestingOutOfCombat;
block.StaminaRegenRestingInCombat = block.StaminaRegenRestingOutOfCombat;
block.StaminaMaximumCapWhenInCombat = 1f;
}
float value2 = Plugin.FallDamageMultiplier.Value;
block.fallDamageMin *= value2;
block.fallDamageMax *= value2;
block.fallDamageMinHeight *= Plugin.FallDamageMinHeightMultiplier.Value;
block.fallDamageMaxHeight *= Plugin.FallDamageMaxHeightMultiplier.Value;
float value3 = Plugin.AmmoMultiplier.Value;
block.AmmoStandardInitial = ScaleInt(block.AmmoStandardInitial, value3);
block.AmmoStandardMaxCap = ScaleInt(block.AmmoStandardMaxCap, value3);
block.AmmoStandardResourcePackMaxCap = ScaleInt(block.AmmoStandardResourcePackMaxCap, value3);
block.AmmoSpecialInitial = ScaleInt(block.AmmoSpecialInitial, value3);
block.AmmoSpecialMaxCap = ScaleInt(block.AmmoSpecialMaxCap, value3);
block.AmmoSpecialResourcePackMaxCap = ScaleInt(block.AmmoSpecialResourcePackMaxCap, value3);
block.AmmoClassInitial = ScaleInt(block.AmmoClassInitial, value3);
block.AmmoClassMaxCap = ScaleInt(block.AmmoClassMaxCap, value3);
block.AmmoClassResourcePackMaxCap = ScaleInt(block.AmmoClassResourcePackMaxCap, value3);
block.walkMoveSpeed *= Plugin.WalkSpeedMultiplier.Value;
block.runMoveSpeed *= Plugin.RunSpeedMultiplier.Value;
block.airMoveSpeed *= Plugin.AirSpeedMultiplier.Value;
block.crouchMoveSpeed *= Plugin.CrouchSpeedMultiplier.Value;
block.ladderMoveSpeed *= Plugin.LadderSpeedMultiplier.Value;
block.jumpVelInitial *= Plugin.JumpHeightMultiplier.Value;
block.friendlyFireMulti *= Plugin.FriendlyFireMultiplier.Value;
block.battery = ScaleInt(block.battery, Plugin.BatteryCapacityMultiplier.Value);
block.smallBatteryConsumtionPerSec *= Plugin.SmallBatteryDrainMultiplier.Value;
block.mediumBatteryConsumtionPerSec *= Plugin.MediumBatteryDrainMultiplier.Value;
block.largeBatteryConsumtionPerSec *= Plugin.LargeBatteryDrainMultiplier.Value;
block.noAirDamageRel *= Plugin.NoAirDamageMultiplier.Value;
block.noAirTimeToEmpty *= Plugin.NoAirDepletionTimeMultiplier.Value;
}
private static void ApplyFlashlightTweaks()
{
float value = Plugin.FlashlightAngleMultiplier.Value;
float value2 = Plugin.FlashlightIntensityMultiplier.Value;
foreach (FlashlightSettingsDataBlock allBlock in GameDataBlockBase<FlashlightSettingsDataBlock>.GetAllBlocks())
{
allBlock.angle *= value;
allBlock.intensity *= value2;
}
}
private static void ApplyDetectionTweaks()
{
float value = Plugin.DetectionDistanceMultiplier.Value;
foreach (EnemyDetectionDataBlock allBlock in GameDataBlockBase<EnemyDetectionDataBlock>.GetAllBlocks())
{
allBlock.movementDetectionDistance *= value;
}
}
private static void ApplyEnemyBalanceTweaks()
{
float value = Plugin.EnemyHealthMultiplier.Value;
float value2 = Plugin.EnemyMeleeDamageMultiplier.Value;
float value3 = Plugin.EnemyTentacleDamageMultiplier.Value;
foreach (EnemyBalancingDataBlock allBlock in GameDataBlockBase<EnemyBalancingDataBlock>.GetAllBlocks())
{
HealthData health = allBlock.Health;
health.HealthMax *= value;
allBlock.Health = health;
allBlock.MeleeAttackDamage *= value2;
allBlock.TentacleAttackDamage *= value3;
}
}
private static void ApplyFogTweaks()
{
float value = Plugin.FogDensityMultiplier.Value;
foreach (FogSettingsDataBlock allBlock in GameDataBlockBase<FogSettingsDataBlock>.GetAllBlocks())
{
allBlock.FogDensity *= value;
}
}
private static void ApplyLootTweaks()
{
float value = Plugin.ConsumableSpawnMultiplier.Value;
foreach (ConsumableDistributionDataBlock allBlock in GameDataBlockBase<ConsumableDistributionDataBlock>.GetAllBlocks())
{
allBlock.SpawnsPerZone = ScaleInt(allBlock.SpawnsPerZone, value);
Enumerator<ConsumableSpawnData> enumerator2 = allBlock.SpawnData.GetEnumerator();
while (enumerator2.MoveNext())
{
ConsumableSpawnData current2 = enumerator2.Current;
if (ConsumableWeightMultipliers.TryGetValue(current2.ItemID, out Func<float> value2))
{
current2.Weight *= value2();
}
}
}
float value3 = Plugin.BigPickupSpawnMultiplier.Value;
foreach (BigPickupDistributionDataBlock allBlock2 in GameDataBlockBase<BigPickupDistributionDataBlock>.GetAllBlocks())
{
allBlock2.SpawnsPerZone = ScaleInt(allBlock2.SpawnsPerZone, value3);
}
}
private static void ApplyExpeditionBalanceTweaks()
{
foreach (ExpeditionBalanceDataBlock allBlock in GameDataBlockBase<ExpeditionBalanceDataBlock>.GetAllBlocks())
{
allBlock.HealthPerZone *= Plugin.HealthPackResourceMultiplier.Value;
allBlock.DisinfectionPerZone *= Plugin.DisinfectionResourceMultiplier.Value;
allBlock.WeaponAmmoPerZone *= Plugin.WeaponAmmoResourceMultiplier.Value;
allBlock.ToolAmmoPerZone *= Plugin.ToolAmmoResourceMultiplier.Value;
allBlock.CommodityValuePerZone *= Plugin.CommodityValueMultiplier.Value;
allBlock.ChanceToPutCommodityInResourceContainer *= Plugin.CommodityInContainerChanceMultiplier.Value;
allBlock.ChanceToPutArtifactInResourceContainer *= Plugin.ArtifactInContainerChanceMultiplier.Value;
allBlock.ChanceToSpawnCommodityLargePack *= Plugin.LargeCommodityPackChanceMultiplier.Value;
allBlock.ChanceToSpawnCommodityMediumPack *= Plugin.MediumCommodityPackChanceMultiplier.Value;
allBlock.ChanceToReUseResourceContainer *= Plugin.ResourceContainerReuseChanceMultiplier.Value;
allBlock.MaxPacksPerResourceContainer = ScaleInt(allBlock.MaxPacksPerResourceContainer, Plugin.MaxPacksPerContainerMultiplier.Value);
allBlock.EmptyWeakResourceContainersPerZone *= Plugin.EmptyWeakContainersPerZoneMultiplier.Value;
allBlock.EmptySecureResourceContainersPerZone *= Plugin.EmptySecureContainersPerZoneMultiplier.Value;
allBlock.LootPerZone *= Plugin.LootPerZoneMultiplier.Value;
allBlock.AirPerZone *= Plugin.AirPerZoneMultiplier.Value;
allBlock.AirPerZoneInNoAir *= Plugin.AirPerZoneInNoAirZoneMultiplier.Value;
allBlock.TerminalsPerZone *= Plugin.TerminalsPerZoneMultiplier.Value;
allBlock.WeakResourceContainerWithPackChanceForLocked *= Plugin.LockedWeakContainerWithPackChanceMultiplier.Value;
float value = Plugin.ResourcePackSizeMultiplier.Value;
for (int i = 0; i < allBlock.ResourcePackSizes.Count; i++)
{
List<float> resourcePackSizes = allBlock.ResourcePackSizes;
int num = i;
resourcePackSizes[num] *= value;
}
allBlock.EnemyPatrolGroupsPerZone = ScaleInt(allBlock.EnemyPatrolGroupsPerZone, Plugin.EnemyPatrolGroupsPerZoneMultiplier.Value);
allBlock.StaticEnemiesMaxPerZone = ScaleInt(allBlock.StaticEnemiesMaxPerZone, Plugin.StaticEnemiesMaxPerZoneMultiplier.Value);
allBlock.StaticEnemiesMaxSmallArea = ScaleInt(allBlock.StaticEnemiesMaxSmallArea, Plugin.StaticEnemiesMaxSmallAreaMultiplier.Value);
allBlock.StaticEnemiesMaxMediumArea = ScaleInt(allBlock.StaticEnemiesMaxMediumArea, Plugin.StaticEnemiesMaxMediumAreaMultiplier.Value);
allBlock.StaticEnemiesMaxLargeArea = ScaleInt(allBlock.StaticEnemiesMaxLargeArea, Plugin.StaticEnemiesMaxLargeAreaMultiplier.Value);
allBlock.StaticEnemiesMaxHugeArea = ScaleInt(allBlock.StaticEnemiesMaxHugeArea, Plugin.StaticEnemiesMaxHugeAreaMultiplier.Value);
allBlock.EnemyPopulationPerZone *= Plugin.EnemyPopulationPerZoneMultiplier.Value;
allBlock.VoxelCoverageAreaMultiplier *= Plugin.LevelGenVoxelCoverageMultiplier.Value;
allBlock.VoxelCoverageAreaScoringRandomMultiplier *= Plugin.LevelGenVoxelCoverageRandomnessMultiplier.Value;
allBlock.ArtifactsPerSegment = ScaleInt(allBlock.ArtifactsPerSegment, Plugin.ArtifactsPerSegmentMultiplier.Value);
allBlock.ArtifactsPerLayer = ScaleInt(allBlock.ArtifactsPerLayer, Plugin.ArtifactsPerLayerMultiplier.Value);
allBlock.WeakDoor4x4Health *= Plugin.WeakDoor4x4HealthMultiplier.Value;
allBlock.WeakDoor8x4Health *= Plugin.WeakDoor8x4HealthMultiplier.Value;
allBlock.WeakDoorChanceLockWeightNoLock *= Plugin.WeakDoorNoLockWeightMultiplier.Value;
allBlock.WeakDoorChanceLockWeightMeleeLock *= Plugin.WeakDoorMeleeLockWeightMultiplier.Value;
allBlock.WeakDoorChanceLockWeightHackableLock *= Plugin.WeakDoorHackableLockWeightMultiplier.Value;
allBlock.WeakDoorUnlockedChanceForOpen *= Plugin.WeakDoorUnlockedOpenChanceMultiplier.Value;
allBlock.WeakDoorOpenChanceForWallRemoverUsed *= Plugin.WeakDoorWallRemoverOpenChanceMultiplier.Value;
allBlock.WeakDoorLockHealth *= Plugin.WeakDoorLockHealthMultiplier.Value;
allBlock.GlueVolumeToDoorHealthConversion *= Plugin.GlueVolumeToDoorHealthConversionMultiplier.Value;
allBlock.GlueVolumeForDoorGlueMaxState *= Plugin.GlueVolumeForDoorMaxStateMultiplier.Value;
ApplyStaticEnemyData(allBlock.TentacleTraps, Plugin.TentacleTrapHealthMultiplier.Value, Plugin.TentacleTrapAttackDamageMultiplier.Value, Plugin.TentacleTrapMaxPerZoneMultiplier.Value, Plugin.TentacleTrapMaxSmallAreaMultiplier.Value, Plugin.TentacleTrapMaxMediumAreaMultiplier.Value, Plugin.TentacleTrapMaxLargeAreaMultiplier.Value, Plugin.TentacleTrapMaxHugeAreaMultiplier.Value);
ApplyStaticEnemyData(allBlock.ParasiteNests, Plugin.ParasiteNestHealthMultiplier.Value, Plugin.ParasiteNestAttackDamageMultiplier.Value, Plugin.ParasiteNestMaxPerZoneMultiplier.Value, Plugin.ParasiteNestMaxSmallAreaMultiplier.Value, Plugin.ParasiteNestMaxMediumAreaMultiplier.Value, Plugin.ParasiteNestMaxLargeAreaMultiplier.Value, Plugin.ParasiteNestMaxHugeAreaMultiplier.Value);
}
}
private static void ApplyStaticEnemyData(StaticEnemyData? data, float healthMult, float attackDamageMult, float maxPerZoneMult, float maxSmallAreaMult, float maxMediumAreaMult, float maxLargeAreaMult, float maxHugeAreaMult)
{
if (data != null)
{
data.Health *= healthMult;
data.AttackDamage *= attackDamageMult;
data.MaxPerZone = ScaleInt(data.MaxPerZone, maxPerZoneMult);
data.MaxSmallArea = ScaleInt(data.MaxSmallArea, maxSmallAreaMult);
data.MaxMediumArea = ScaleInt(data.MaxMediumArea, maxMediumAreaMult);
data.MaxLargeArea = ScaleInt(data.MaxLargeArea, maxLargeAreaMult);
data.MaxHugeArea = ScaleInt(data.MaxHugeArea, maxHugeAreaMult);
}
}
private static void ApplyMeleeTweaks()
{
//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
//IL_01af: Unknown result type (might be due to invalid IL or missing references)
//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
//IL_0214: Unknown result type (might be due to invalid IL or missing references)
//IL_0219: Unknown result type (might be due to invalid IL or missing references)
//IL_0235: Unknown result type (might be due to invalid IL or missing references)
foreach (MeleeArchetypeDataBlock allBlock in GameDataBlockBase<MeleeArchetypeDataBlock>.GetAllBlocks())
{
string publicName = allBlock.PublicName;
allBlock.LightAttackDamage *= MeleeMult(publicName, "LightAttackDamage");
allBlock.ChargedAttackDamage *= MeleeMult(publicName, "ChargedAttackDamage");
allBlock.LightStaggerMulti *= MeleeMult(publicName, "LightStaggerMulti");
allBlock.ChargedStaggerMulti *= MeleeMult(publicName, "ChargedStaggerMulti");
allBlock.LightPrecisionMulti *= MeleeMult(publicName, "LightPrecisionMulti");
allBlock.ChargedPrecisionMulti *= MeleeMult(publicName, "ChargedPrecisionMulti");
allBlock.LightEnvironmentMulti *= MeleeMult(publicName, "LightEnvironmentMulti");
allBlock.ChargedEnvironmentMulti *= MeleeMult(publicName, "ChargedEnvironmentMulti");
allBlock.LightBackstabberMulti *= MeleeMult(publicName, "LightBackstabberMulti");
allBlock.ChargedBackstabberMulti *= MeleeMult(publicName, "ChargedBackstabberMulti");
allBlock.LightSleeperMulti *= MeleeMult(publicName, "LightSleeperMulti");
allBlock.ChargedSleeperMulti *= MeleeMult(publicName, "ChargedSleeperMulti");
allBlock.CameraDamageRayLength *= MeleeMult(publicName, "CameraDamageRayLength");
allBlock.AttackSphereRadius *= MeleeMult(publicName, "AttackSphereRadius");
allBlock.PushDamageSphereRadius *= MeleeMult(publicName, "PushDamageSphereRadius");
allBlock.PlayerRunSpeedMultiWhileCharging *= MeleeMult(publicName, "PlayerRunSpeedMultiWhileCharging");
float num = MeleeMult(publicName, "LightAttackStaminaCost");
ActionCost lightAttackStaminaCost = allBlock.LightAttackStaminaCost;
lightAttackStaminaCost.baseStaminaCostInCombat *= num;
lightAttackStaminaCost.baseStaminaCostOutOfCombat *= num;
allBlock.LightAttackStaminaCost = lightAttackStaminaCost;
float num2 = MeleeMult(publicName, "ChargedAttackStaminaCost");
ActionCost chargedAttackStaminaCost = allBlock.ChargedAttackStaminaCost;
chargedAttackStaminaCost.baseStaminaCostInCombat *= num2;
chargedAttackStaminaCost.baseStaminaCostOutOfCombat *= num2;
allBlock.ChargedAttackStaminaCost = chargedAttackStaminaCost;
float num3 = MeleeMult(publicName, "PushStaminaCost");
ActionCost pushStaminaCost = allBlock.PushStaminaCost;
pushStaminaCost.baseStaminaCostInCombat *= num3;
pushStaminaCost.baseStaminaCostOutOfCombat *= num3;
allBlock.PushStaminaCost = pushStaminaCost;
}
}
private static float MeleeMult(string archetypeName, string fieldKey)
{
if (!Plugin.MeleeMultipliers.TryGetValue(archetypeName + "." + fieldKey, out ConfigEntry<float> value))
{
return 1f;
}
return value.Value;
}
private static Dictionary<uint, (string Category, string Label)> BuildWeaponArchetypeOwners()
{
Dictionary<uint, (string, string)> dictionary = new Dictionary<uint, (string, string)>();
(uint, string, string)[] weaponArchetypes = Plugin.WeaponArchetypes;
for (int i = 0; i < weaponArchetypes.Length; i++)
{
(uint, string, string) tuple = weaponArchetypes[i];
dictionary[tuple.Item1] = (tuple.Item2, tuple.Item3);
}
return dictionary;
}
private static void ApplyWeaponTweaks()
{
foreach (ArchetypeDataBlock allBlock in GameDataBlockBase<ArchetypeDataBlock>.GetAllBlocks())
{
if (WeaponArchetypeOwners.TryGetValue(((GameDataBlockBase<ArchetypeDataBlock>)(object)allBlock).persistentID, out (string, string) value))
{
allBlock.Damage *= WeaponMult(((GameDataBlockBase<ArchetypeDataBlock>)(object)allBlock).persistentID, value.Item1, "Damage");
allBlock.StaggerDamageMulti *= WeaponMult(((GameDataBlockBase<ArchetypeDataBlock>)(object)allBlock).persistentID, value.Item1, "StaggerDamageMulti");
allBlock.PrecisionDamageMulti *= WeaponMult(((GameDataBlockBase<ArchetypeDataBlock>)(object)allBlock).persistentID, value.Item1, "PrecisionDamageMulti");
allBlock.DefaultClipSize = ScaleInt(allBlock.DefaultClipSize, WeaponMult(((GameDataBlockBase<ArchetypeDataBlock>)(object)allBlock).persistentID, value.Item1, "DefaultClipSize"));
allBlock.DefaultReloadTime *= WeaponMult(((GameDataBlockBase<ArchetypeDataBlock>)(object)allBlock).persistentID, value.Item1, "DefaultReloadTime");
}
allBlock.CostOfBullet *= Plugin.WeaponCostOfBulletMultiplier.Value;
allBlock.ShotDelay *= Plugin.WeaponShotDelayMultiplier.Value;
allBlock.HipFireSpread *= Plugin.WeaponHipFireSpreadMultiplier.Value;
allBlock.AimSpread *= Plugin.WeaponAimSpreadMultiplier.Value;
allBlock.PiercingDamageCountLimit = ScaleInt(allBlock.PiercingDamageCountLimit, Plugin.WeaponPiercingDamageCountLimitMultiplier.Value);
allBlock.BurstDelay *= Plugin.WeaponBurstDelayMultiplier.Value;
allBlock.BurstShotCount = ScaleInt(allBlock.BurstShotCount, Plugin.WeaponBurstShotCountMultiplier.Value);
allBlock.ShotgunBulletCount = ScaleInt(allBlock.ShotgunBulletCount, Plugin.WeaponShotgunBulletCountMultiplier.Value);
allBlock.ShotgunConeSize = ScaleInt(allBlock.ShotgunConeSize, Plugin.WeaponShotgunConeSizeMultiplier.Value);
allBlock.ShotgunBulletSpread = ScaleInt(allBlock.ShotgunBulletSpread, Plugin.WeaponShotgunBulletSpreadMultiplier.Value);
allBlock.SpecialChargetupTime *= Plugin.WeaponSpecialChargetupTimeMultiplier.Value;
allBlock.SpecialCooldownTime *= Plugin.WeaponSpecialCooldownTimeMultiplier.Value;
allBlock.SpecialSemiBurstCountTimeout *= Plugin.WeaponSpecialSemiBurstCountTimeoutMultiplier.Value;
allBlock.EquipTransitionTime *= Plugin.WeaponEquipTransitionTimeMultiplier.Value;
allBlock.AimTransitionTime *= Plugin.WeaponAimTransitionTimeMultiplier.Value;
allBlock.ShellCasingSize *= Plugin.WeaponShellCasingSizeMultiplier.Value;
allBlock.Sentry_StartFireDelay *= Plugin.SentryStartFireDelayMultiplier.Value;
allBlock.Sentry_RotationSpeed *= Plugin.SentryRotationSpeedMultiplier.Value;
allBlock.Sentry_DetectionMaxRange *= Plugin.SentryDetectionMaxRangeMultiplier.Value;
allBlock.Sentry_DetectionMaxAngle *= Plugin.SentryDetectionMaxAngleMultiplier.Value;
allBlock.Sentry_LongRangeThreshold *= Plugin.SentryLongRangeThresholdMultiplier.Value;
allBlock.Sentry_ShortRangeThreshold *= Plugin.SentryShortRangeThresholdMultiplier.Value;
allBlock.Sentry_StartFireDelayTagMulti *= Plugin.SentryStartFireDelayTagMultiplier.Value;
allBlock.Sentry_RotationSpeedTagMulti *= Plugin.SentryRotationSpeedTagMultiplier.Value;
allBlock.Sentry_DamageTagMulti *= Plugin.SentryDamageTagMultiplier.Value;
allBlock.Sentry_StaggerDamageTagMulti *= Plugin.SentryStaggerDamageTagMultiplier.Value;
allBlock.Sentry_CostOfBulletTagMulti *= Plugin.SentryCostOfBulletTagMultiplier.Value;
allBlock.Sentry_ShotDelayTagMulti *= Plugin.SentryShotDelayTagMultiplier.Value;
}
}
private static float WeaponMult(uint archetypeId, string category, string fieldKey)
{
ConfigEntry<float> value;
float num = (Plugin.WeaponTypeMultipliers.TryGetValue(category + "." + fieldKey, out value) ? value.Value : 1f);
ConfigEntry<float> value2;
float num2 = (Plugin.WeaponIndividualMultipliers.TryGetValue($"{archetypeId}.{fieldKey}", out value2) ? value2.Value : 1f);
return num * num2;
}
private static int ScaleInt(int value, float multiplier)
{
return (int)Math.Round((float)value * multiplier);
}
}
[HarmonyPatch(typeof(PlayerAgent), "Setup")]
internal static class PlayerAgent_Setup_Patch
{
private const float EasyModeAnnouncementDelaySeconds = 90f;
private const float EasyModeAnnouncementDurationSeconds = 15f;
[HarmonyPostfix]
private static void Postfix(PlayerAgent __instance)
{
if (((Agent)__instance).IsLocallyOwned)
{
PlayerGuiLayer playerLayer = GuiManager.PlayerLayer;
if (playerLayer != null)
{
playerLayer.ShowWardenIntel(Plugin.EasterEggMessage, 90f, 15f);
}
}
}
}
[HarmonyPatch(typeof(Interact_Revive), "Setup")]
internal static class Interact_Revive_Setup_Patch
{
[HarmonyPostfix]
private static void Postfix(Interact_Revive __instance)
{
((Interact_Timed)__instance).InteractDuration = ((Interact_Timed)__instance).InteractDuration * Plugin.ReviveDurationMultiplier.Value;
}
}
[HarmonyPatch(typeof(CM_PageRundown_New), "UpdateHeaderText")]
internal static class CM_PageRundown_New_UpdateHeaderText_Patch
{
private static readonly string[] BreakTag = new string[1] { "<br>" };
[HarmonyPostfix]
private static void Postfix(CM_PageRundown_New __instance)
{
TextMeshPro textRundownHeader = __instance.m_textRundownHeader;
if (!((Object)(object)textRundownHeader == (Object)null))
{
string text = (((TMP_Text)textRundownHeader).text.Contains("<br>") ? ((TMP_Text)textRundownHeader).text.Split(BreakTag, StringSplitOptions.None)[0] : ((TMP_Text)textRundownHeader).text);
((TMP_Text)textRundownHeader).SetText(text + "<br><size=50%>" + Plugin.EasterEggMessage + "</size>", true);
}
}
}
}