diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalAimingSettings.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalAimingSettings.cs
new file mode 100644
index 00000000..17263ea8
--- /dev/null
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalAimingSettings.cs
@@ -0,0 +1,312 @@
+using System.Text.Json.Serialization;
+
+namespace SPTarkov.Server.Core.Models.Eft.Bot.GlobalSettings;
+
+///
+/// See BotGlobalAimingSettings in the client, this record should match that
+///
+public record BotGlobalAimingSettings
+{
+ [JsonPropertyName("MAX_AIM_PRECICING")]
+ public float MaxAimPrecicing { get; set; }
+
+ [JsonPropertyName("BETTER_PRECICING_COEF")]
+ public float BetterPrecicingCoef { get; set; }
+
+ [JsonPropertyName("RECLC_Y_DIST")]
+ public float ReclcYDist { get; set; }
+
+ [JsonPropertyName("RECALC_DIST")]
+ public float RecalcDist { get; set; }
+
+ [JsonPropertyName("RECALC_SQR_DIST")]
+ public float RecalcSqrDist { get; set; }
+
+ [JsonPropertyName("COEF_FROM_COVER")]
+ public float CoefFromCover { get; set; }
+
+ [JsonPropertyName("PANIC_COEF")]
+ public float PanicCoef { get; set; }
+
+ [JsonPropertyName("PANIC_ACCURATY_COEF")]
+ public float PanicAccuratyCoef { get; set; }
+
+ [JsonPropertyName("HARD_AIM")]
+ public float HardAim { get; set; }
+
+ [JsonPropertyName("HARD_AIM_CHANCE_100")]
+ public int HardAimChance100 { get; set; }
+
+ [JsonPropertyName("PANIC_TIME")]
+ public float PanicTime { get; set; }
+
+ [JsonPropertyName("RECALC_MUST_TIME")]
+ public int RecalcMustTime { get; set; }
+
+ [JsonPropertyName("RECALC_MUST_TIME_MIN")]
+ public int RecalcMustTimeMin { get; set; }
+
+ [JsonPropertyName("RECALC_MUST_TIME_MAX")]
+ public int RecalcMustTimeMax { get; set; }
+
+ [JsonPropertyName("DAMAGE_PANIC_TIME")]
+ public float DamagePanicTime { get; set; }
+
+ [JsonPropertyName("DANGER_UP_POINT")]
+ public float DangerUpPoint { get; set; }
+
+ [JsonPropertyName("MAX_AIMING_UPGRADE_BY_TIME")]
+ public float MaxAimingUpgradeByTime { get; set; }
+
+ [JsonPropertyName("DAMAGE_TO_DISCARD_AIM_0_100")]
+ public float DamageToDiscardAim0100 { get; set; }
+
+ [JsonPropertyName("MIN_TIME_DISCARD_AIM_SEC")]
+ public float MinTimeDiscardAimSec { get; set; }
+
+ [JsonPropertyName("MAX_TIME_DISCARD_AIM_SEC")]
+ public float MaxTimeDiscardAimSec { get; set; }
+
+ [JsonPropertyName("XZ_COEF")]
+ public float XzCoef { get; set; }
+
+ [JsonPropertyName("XZ_COEF_STATIONARY_BULLET")]
+ public float XzCoefStationaryBullet { get; set; }
+
+ [JsonPropertyName("XZ_COEF_STATIONARY_GRENADE")]
+ public float XzCoefStationaryGrenade { get; set; }
+
+ [JsonPropertyName("SHOOT_TO_CHANGE_PRIORITY")]
+ public int ShootToChangePriority { get; set; }
+
+ [JsonPropertyName("BOTTOM_COEF")]
+ public float BottomCoef { get; set; }
+
+ [JsonPropertyName("FIRST_CONTACT_ADD_SEC")]
+ public float FirstContactAddSec { get; set; }
+
+ [JsonPropertyName("FIRST_CONTACT_ADD_CHANCE_100")]
+ public float FirstContactAddChance100 { get; set; }
+
+ [JsonPropertyName("BASE_HIT_AFFECTION_DELAY_SEC")]
+ public float BaseHitAffectionDelaySec { get; set; }
+
+ [JsonPropertyName("BASE_HIT_AFFECTION_MIN_ANG")]
+ public float BaseHitAffectionMinAng { get; set; }
+
+ [JsonPropertyName("BASE_HIT_AFFECTION_MAX_ANG")]
+ public float BaseHitAffectionMaxAng { get; set; }
+
+ [JsonPropertyName("BASE_SHIEF")]
+ public float BaseShief { get; set; }
+
+ [JsonPropertyName("BASE_SHIEF_STATIONARY_BULLET")]
+ public float BaseShiefStationaryBullet { get; set; }
+
+ [JsonPropertyName("BASE_SHIEF_STATIONARY_GRENADE")]
+ public float BaseShiefStationaryGrenade { get; set; }
+
+ [JsonPropertyName("SCATTERING_HAVE_DAMAGE_COEF")]
+ public float ScatteringHaveDamageCoef { get; set; }
+
+ [JsonPropertyName("SCATTERING_DIST_MODIF")]
+ public float ScatteringDistModif { get; set; }
+
+ [JsonPropertyName("SCATTERING_DIST_MODIF_CLOSE")]
+ public float ScatteringDistModifClose { get; set; }
+
+ [JsonPropertyName("AIMING_TYPE")]
+ public int AimingType { get; set; }
+
+ [JsonPropertyName("DIST_TO_SHOOT_TO_CENTER")]
+ public float DistToShootToCenter { get; set; }
+
+ [JsonPropertyName("DIST_TO_SHOOT_NO_OFFSET")]
+ public float DistToShootNoOffset { get; set; }
+
+ [JsonPropertyName("SHPERE_FRIENDY_FIRE_SIZE")]
+ public float ShpereFriendyFireSize { get; set; }
+
+ [JsonPropertyName("COEF_IF_MOVE")]
+ public float CoefIfMove { get; set; }
+
+ [JsonPropertyName("TIME_COEF_IF_MOVE")]
+ public float TimeCoefIfMove { get; set; }
+
+ [JsonPropertyName("BOT_MOVE_IF_DELTA")]
+ public float BotMoveIfDelta { get; set; }
+
+ [JsonPropertyName("NEXT_SHOT_MISS_CHANCE_100")]
+ public float NextShotMissChance100 { get; set; }
+
+ [JsonPropertyName("NEXT_SHOT_MISS_Y_OFFSET")]
+ public float NextShotMissYOffset { get; set; }
+
+ [JsonPropertyName("ANYTIME_LIGHT_WHEN_AIM_100")]
+ public float AnytimeLightWhenAim100 { get; set; }
+
+ [JsonPropertyName("ANY_PART_SHOOT_TIME")]
+ public float AnyPartShootTime { get; set; }
+
+ [JsonPropertyName("WEAPON_ROOT_OFFSET")]
+ public float WeaponRootOffset { get; set; }
+
+ [JsonPropertyName("MIN_DAMAGE_TO_GET_HIT_AFFETS")]
+ public float MinDamageToGetHitAffets { get; set; }
+
+ [JsonPropertyName("MAX_AIM_TIME")]
+ public float MaxAimTime { get; set; }
+
+ [JsonPropertyName("OFFSET_RECAL_ANYWAY_TIME")]
+ public float OffsetRecalAnywayTime { get; set; }
+
+ [JsonPropertyName("Y_TOP_OFFSET_COEF")]
+ public float YTopOffsetCoef { get; set; }
+
+ [JsonPropertyName("Y_BOTTOM_OFFSET_COEF")]
+ public float YBottomOffsetCoef { get; set; }
+
+ [JsonPropertyName("STATIONARY_LEAVE_HALF_DEGREE")]
+ public float StationaryLeaveHalfDegree { get; set; }
+
+ [JsonPropertyName("BAD_SHOOTS_MIN")]
+ public int BadShootsMin { get; set; }
+
+ [JsonPropertyName("BAD_SHOOTS_MAX")]
+ public int BadShootsMax { get; set; }
+
+ [JsonPropertyName("BAD_SHOOTS_OFFSET")]
+ public float BadShootsOffset { get; set; }
+
+ [JsonPropertyName("BAD_SHOOTS_MAIN_COEF")]
+ public float BadShootsMainCoef { get; set; }
+
+ [JsonPropertyName("START_TIME_COEF")]
+ public float StartTimeCoef { get; set; }
+
+ [JsonPropertyName("AIMING_ON_WAY")]
+ public float AimingOnWay { get; set; }
+
+ [JsonPropertyName("FIRST_CONTACT_HARD_TO_SEE_MISS_SHOOTS_DISTANCE")]
+ public float FirstContactHardToSeeMissShootsDistance { get; set; }
+
+ [JsonPropertyName("FIRST_CONTACT_HARD_TO_SEE_MISS_SHOOTS_COUNT")]
+ public int FirstContactHardToSeeMissShootsCount { get; set; }
+
+ [JsonPropertyName("MISS_FIRST_SOOTS")]
+ public int MissFirstSoots { get; set; }
+
+ [JsonPropertyName("MISS_ON_START")]
+ public int MissOnStart { get; set; }
+
+ [JsonPropertyName("MISS_DIST")]
+ public float MissDist { get; set; }
+
+ [JsonPropertyName("UnderbarrelLauncherAiming")]
+ public required BotUnderbarrelLauncherAimingSettings UnderbarrelLauncherAiming { get; set; }
+}
+
+///
+/// See BotUnderbarrelLauncherAimingSettings in the client, this record should match that
+///
+public record BotUnderbarrelLauncherAimingSettings
+{
+ [JsonPropertyName("AIMING_ON_WAY")]
+ public float AimingOnWay { get; set; }
+
+ [JsonPropertyName("ANYTIME_LIGHT_WHEN_AIM_100")]
+ public float AnytimeLightWhenAim100 { get; set; }
+
+ [JsonPropertyName("BAD_SHOOTS_MIN")]
+ public int BadShootsMin { get; set; }
+
+ [JsonPropertyName("BAD_SHOOTS_MAX")]
+ public int BadShootsMax { get; set; }
+
+ [JsonPropertyName("START_TIME_COEF")]
+ public float StartTimeCoef { get; set; }
+
+ [JsonPropertyName("DAMAGE_TO_DISCARD_AIM_0_100")]
+ public float DamageToDiscardAim0100 { get; set; }
+
+ [JsonPropertyName("MIN_TIME_DISCARD_AIM_SEC")]
+ public float MinTimeDiscardAimSec { get; set; }
+
+ [JsonPropertyName("MAX_TIME_DISCARD_AIM_SEC")]
+ public float MaxTimeDiscardAimSec { get; set; }
+
+ [JsonPropertyName("MAX_AIM_PRECICING")]
+ public float MaxAimPrecicing { get; set; }
+
+ [JsonPropertyName("MAX_AIMING_UPGRADE_BY_TIME")]
+ public float MaxAimingUpgradeByTime { get; set; }
+
+ [JsonPropertyName("BOT_MOVE_IF_DELTA")]
+ public float BotMoveIfDelta { get; set; }
+
+ [JsonPropertyName("PANIC_TIME")]
+ public float PanicTime { get; set; }
+
+ [JsonPropertyName("RECALC_MUST_TIME_MIN")]
+ public int RecalcMustTimeMin { get; set; }
+
+ [JsonPropertyName("RECALC_MUST_TIME_MAX")]
+ public int RecalcMustTimeMax { get; set; }
+
+ [JsonPropertyName("RECLC_Y_DIST")]
+ public float ReclcYDist { get; set; }
+
+ [JsonPropertyName("RECALC_SQR_DIST")]
+ public float RecalcSqrDist { get; set; }
+
+ [JsonPropertyName("TIME_COEF_IF_MOVE")]
+ public float TimeCoefIfMove { get; set; }
+
+ [JsonPropertyName("PANIC_COEF")]
+ public float PanicCoef { get; set; }
+
+ [JsonPropertyName("COEF_FROM_COVER")]
+ public float CoefFromCover { get; set; }
+
+ [JsonPropertyName("BOTTOM_COEF")]
+ public float BottomCoef { get; set; }
+
+ [JsonPropertyName("MAX_AIM_TIME")]
+ public float MaxAimTime { get; set; }
+
+ [JsonPropertyName("SCATTERING_DIST_MODIF")]
+ public float ScatteringDistModif { get; set; }
+
+ [JsonPropertyName("SCATTERING_DIST_MODIF_CLOSE")]
+ public float ScatteringDistModifClose { get; set; }
+
+ [JsonPropertyName("DIST_TO_SHOOT_NO_OFFSET")]
+ public float DistToShootNoOffset { get; set; }
+
+ [JsonPropertyName("PANIC_ACCURATY_COEF")]
+ public float PanicAccuratyCoef { get; set; }
+
+ [JsonPropertyName("HARD_AIM")]
+ public float HardAim { get; set; }
+
+ [JsonPropertyName("COEF_IF_MOVE")]
+ public float CoefIfMove { get; set; }
+
+ [JsonPropertyName("Y_TOP_OFFSET_COEF")]
+ public float YTopOffsetCoef { get; set; }
+
+ [JsonPropertyName("Y_BOTTOM_OFFSET_COEF")]
+ public float YBottomOffsetCoef { get; set; }
+
+ [JsonPropertyName("NEXT_SHOT_MISS_Y_OFFSET")]
+ public float NextShotMissYOffset { get; set; }
+
+ [JsonPropertyName("BAD_SHOOTS_OFFSET")]
+ public float BadShootsOffset { get; set; }
+
+ [JsonPropertyName("BAD_SHOOTS_MAIN_COEF")]
+ public float BadShootsMainCoef { get; set; }
+
+ [JsonPropertyName("OFFSET_RECAL_ANYWAY_TIME")]
+ public float OffsetRecalAnywayTime { get; set; }
+}
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalCoreSettings.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalCoreSettings.cs
new file mode 100644
index 00000000..3b8bca6e
--- /dev/null
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalCoreSettings.cs
@@ -0,0 +1,60 @@
+using System.Text.Json.Serialization;
+
+namespace SPTarkov.Server.Core.Models.Eft.Bot.GlobalSettings;
+
+///
+/// See GClass611 (To be remapped to BotGlobalsCoreSettingsClass) in the client, this record should match that
+///
+public record BotGlobalCoreSettings
+{
+ [JsonPropertyName("VisibleAngle")]
+ public float VisibleAngle { get; set; }
+
+ [JsonPropertyName("VisibleDistance")]
+ public float VisibleDistance { get; set; }
+
+ [JsonPropertyName("GainSightCoef")]
+ public float GainSightCoef { get; set; }
+
+ [JsonPropertyName("ScatteringPerMeter")]
+ public float ScatteringPerMeter { get; set; }
+
+ [JsonPropertyName("ScatteringClosePerMeter")]
+ public float ScatteringClosePerMeter { get; set; }
+
+ [JsonPropertyName("DamageCoeff")]
+ public float DamageCoeff { get; set; }
+
+ [JsonPropertyName("HearingSense")]
+ public float HearingSense { get; set; }
+
+ [JsonPropertyName("CanRun")]
+ public bool CanRun { get; set; }
+
+ [JsonPropertyName("CanGrenade")]
+ public bool CanGrenade { get; set; }
+
+ [JsonPropertyName("AimingType")]
+ public EAimingType AimingType { get; set; }
+
+ [JsonPropertyName("PistolFireDistancePref")]
+ public float PistolFireDistancePref { get; set; }
+
+ [JsonPropertyName("ShotgunFireDistancePref")]
+ public float ShotgunFireDistancePref { get; set; }
+
+ [JsonPropertyName("RifleFireDistancePref")]
+ public float RifleFireDistancePref { get; set; }
+
+ [JsonPropertyName("AccuratySpeed")]
+ public float AccuratySpeed { get; set; }
+
+ [JsonPropertyName("WaitInCoverBetweenShotsSec")]
+ public float WaitInCoverBetweenShotsSec { get; set; }
+
+ public enum EAimingType
+ {
+ normal,
+ regular,
+ }
+}
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalLayData.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalLayData.cs
new file mode 100644
index 00000000..73503802
--- /dev/null
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalLayData.cs
@@ -0,0 +1,93 @@
+using System.Text.Json.Serialization;
+
+namespace SPTarkov.Server.Core.Models.Eft.Common.Tables;
+
+///
+/// See BotGlobalLayData in the client, this record should match that
+///
+public record BotGlobalLayData
+{
+ [JsonPropertyName("CHECK_SHOOT_WHEN_LAYING")]
+ public bool CheckShootWhenLaying { get; set; }
+
+ [JsonPropertyName("DELTA_LAY_CHECK")]
+ public float DeltaLayCheck { get; set; }
+
+ [JsonPropertyName("DELTA_GETUP")]
+ public float DeltaGetup { get; set; }
+
+ [JsonPropertyName("DELTA_AFTER_GETUP")]
+ public float DeltaAfterGetup { get; set; }
+
+ [JsonPropertyName("CLEAR_POINTS_OF_SCARE_SEC")]
+ public float ClearPointsOfScareSec { get; set; }
+
+ [JsonPropertyName("MAX_LAY_TIME")]
+ public float MaxLayTime { get; set; }
+
+ [JsonPropertyName("DELTA_WANT_LAY_CHECL_SEC")]
+ public float DeltaWantLayCheckSec { get; set; }
+
+ [JsonPropertyName("ATTACK_LAY_CHANCE")]
+ public float AttackLayChance { get; set; }
+
+ [JsonPropertyName("DIST_TO_COVER_TO_LAY")]
+ public float DistToCoverToLay { get; set; }
+
+ [JsonPropertyName("DIST_TO_COVER_TO_LAY_SQRT")]
+ public float DistToCoverToLaySqrt { get; set; }
+
+ [JsonPropertyName("DIST_GRASS_TERRAIN_SQRT")]
+ public float DistGrassTerrainSqrt { get; set; }
+
+ [JsonPropertyName("DIST_ENEMY_NULL_DANGER_LAY")]
+ public float DistEnemyNullDangerLay { get; set; }
+
+ [JsonPropertyName("DIST_ENEMY_NULL_DANGER_LAY_SQRT")]
+ public float DistEnemyNullDangerLaySqrt { get; set; }
+
+ [JsonPropertyName("DIST_ENEMY_GETUP_LAY")]
+ public float DistEnemyGetupLay { get; set; }
+
+ [JsonPropertyName("DIST_ENEMY_GETUP_LAY_SQRT")]
+ public float DistEnemyGetupLaySqrt { get; set; }
+
+ [JsonPropertyName("DIST_ENEMY_CAN_LAY")]
+ public float DistEnemyCanLay { get; set; }
+
+ [JsonPropertyName("DIST_ENEMY_CAN_LAY_SQRT")]
+ public float DistEnemyCanLaySqrt { get; set; }
+
+ [JsonPropertyName("LAY_AIM")]
+ public float LayAim { get; set; }
+
+ [JsonPropertyName("MIN_CAN_LAY_DIST_SQRT")]
+ public float MinCanLayDistSqrt { get; set; }
+
+ [JsonPropertyName("MIN_CAN_LAY_DIST")]
+ public float MinCanLayDist { get; set; }
+
+ [JsonPropertyName("MAX_CAN_LAY_DIST_SQRT")]
+ public float MaxCanLayDistSqrt { get; set; }
+
+ [JsonPropertyName("MAX_CAN_LAY_DIST")]
+ public float MaxCanLayDist { get; set; }
+
+ [JsonPropertyName("LAY_CHANCE_DANGER")]
+ public float LayChanceDanger { get; set; }
+
+ [JsonPropertyName("DAMAGE_TIME_TO_GETUP")]
+ public int DamageTimeToGetup { get; set; }
+
+ [JsonPropertyName("SHALL_GETUP_ON_ROTATE")]
+ public bool ShallGetupOnRotate { get; set; }
+
+ [JsonPropertyName("SHALL_LAY_WITHOUT_CHECK")]
+ public bool ShallLayWithoutCheck { get; set; }
+
+ [JsonPropertyName("IF_NO_ENEMY")]
+ public bool IfNoEnemy { get; set; }
+
+ [JsonPropertyName("SHALL_LAY_PROBABILTY_WHEN_ARTILLERY")]
+ public int ShallLayProbabilityWhenArtillery { get; set; }
+}
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalLookData.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalLookData.cs
new file mode 100644
index 00000000..361ac5fb
--- /dev/null
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalLookData.cs
@@ -0,0 +1,201 @@
+using System.Text.Json.Serialization;
+
+namespace SPTarkov.Server.Core.Models.Eft.Bot.GlobalSettings;
+
+///
+/// See BotGlobalLookData in the client, this record should match that
+///
+public record BotGlobalLookData
+{
+ [JsonPropertyName("OLD_TIME_POINT")]
+ public float OldTimePoint { get; set; }
+
+ [JsonPropertyName("WAIT_NEW_SENSOR")]
+ public float WaitNewSensor { get; set; }
+
+ [JsonPropertyName("WAIT_NEW__LOOK_SENSOR")]
+ public float WaitNewLookSensor { get; set; }
+
+ [JsonPropertyName("LOOK_AROUND_DELTA")]
+ public float LookAroundDelta { get; set; }
+
+ [JsonPropertyName("MAX_VISION_GRASS_METERS")]
+ public float MaxVisionGrassMeters { get; set; }
+
+ [JsonPropertyName("MAX_VISION_GRASS_METERS_FLARE")]
+ public float MaxVisionGrassMetersFlare { get; set; }
+
+ [JsonPropertyName("MAX_VISION_GRASS_METERS_OPT")]
+ public float MaxVisionGrassMetersOpt { get; set; }
+
+ [JsonPropertyName("MAX_VISION_GRASS_METERS_FLARE_OPT")]
+ public float MaxVisionGrassMetersFlareOpt { get; set; }
+
+ [JsonPropertyName("LightOnVisionDistance")]
+ public float LightOnVisionDistance { get; set; }
+
+ [JsonPropertyName("FAR_DISTANCE")]
+ public float FarDistance { get; set; }
+
+ [JsonPropertyName("FarDeltaTimeSec")]
+ public float FarDeltaTimeSec { get; set; }
+
+ [JsonPropertyName("MIDDLE_DIST")]
+ public float MiddleDist { get; set; }
+
+ [JsonPropertyName("MiddleDeltaTimeSec")]
+ public float MiddleDeltaTimeSec { get; set; }
+
+ [JsonPropertyName("CloseDeltaTimeSec")]
+ public float CloseDeltaTimeSec { get; set; }
+
+ [JsonPropertyName("POSIBLE_VISION_SPACE")]
+ public float PosibleVisionSpace { get; set; }
+
+ [JsonPropertyName("VISIBILITY_CHANGE_SPEED")]
+ public float VisibilityChangeSpeed { get; set; }
+
+ [JsonPropertyName("MIN_DISTANCE_VISIBILITY_CHANGE_SPEED_K")]
+ public float MinDistanceVisibilityChangeSpeedK { get; set; }
+
+ [JsonPropertyName("MAX_DISTANCE_VISIBILITY_CHANGE_SPEED_K")]
+ public float MaxDistanceVisibilityChangeSpeedK { get; set; }
+
+ [JsonPropertyName("GOAL_TO_FULL_DISSAPEAR")]
+ public float GoalToFullDissapear { get; set; }
+
+ [JsonPropertyName("GOAL_TO_FULL_DISSAPEAR_GREEN")]
+ public float GoalToFullDissapearGreen { get; set; }
+
+ [JsonPropertyName("GOAL_TO_FULL_DISSAPEAR_SHOOT")]
+ public float GoalToFullDissapearShoot { get; set; }
+
+ [JsonPropertyName("BODY_DELTA_TIME_SEARCH_SEC")]
+ public float BodyDeltaTimeSearchSec { get; set; }
+
+ [JsonPropertyName("COME_TO_BODY_DIST")]
+ public float ComeToBodyDist { get; set; }
+
+ [JsonPropertyName("MARKSMAN_VISIBLE_DIST_COEF")]
+ public float MarksmanVisibleDistCoef { get; set; }
+
+ [JsonPropertyName("VISIBLE_DISNACE_WITH_LIGHT")]
+ public float VisibleDisnaceWithLight { get; set; }
+
+ [JsonPropertyName("ENEMY_LIGHT_ADD")]
+ public float EnemyLightAdd { get; set; }
+
+ [JsonPropertyName("ENEMY_LIGHT_START_DIST")]
+ public float EnemyLightStartDist { get; set; }
+
+ [JsonPropertyName("DIST_NOT_TO_IGNORE_WALL")]
+ public float DistNotToIgnoreWall { get; set; }
+
+ [JsonPropertyName("DIST_CHECK_WALL")]
+ public float DistCheckWall { get; set; }
+
+ [JsonPropertyName("LOOK_LAST_POSENEMY_IF_NO_DANGER_SEC")]
+ public float LookLastPosenemyIfNoDangerSec { get; set; }
+
+ [JsonPropertyName("MIN_LOOK_AROUD_TIME")]
+ public float MinLookAroudTime { get; set; }
+
+ [JsonPropertyName("LOOK_THROUGH_GRASS")]
+ public bool LookThroughGrass { get; set; }
+
+ [JsonPropertyName("LOOK_THROUGH_GRASS_DIST_METERS")]
+ public float LookThroughGrassDistMeters { get; set; }
+
+ [JsonPropertyName("SEC_REPEATED_SEEN")]
+ public float SecRepeatedSeen { get; set; }
+
+ [JsonPropertyName("DIST_SQRT_REPEATED_SEEN")]
+ public double DistSqrtRepeatedSeen { get; set; }
+
+ [JsonPropertyName("DIST_REPEATED_SEEN")]
+ public double DistRepeatedSeen { get; set; }
+
+ [JsonPropertyName("COEF_REPEATED_SEEN")]
+ public float CoefRepeatedSeen { get; set; }
+
+ [JsonPropertyName("MAX_DIST_CLAMP_TO_SEEN_SPEED")]
+ public float MaxDistClampToSeenSpeed { get; set; }
+
+ [JsonPropertyName("NIGHT_VISION_ON")]
+ public float NightVisionOn { get; set; }
+
+ [JsonPropertyName("NIGHT_VISION_OFF")]
+ public float NightVisionOff { get; set; }
+
+ [JsonPropertyName("NIGHT_VISION_DIST")]
+ public float NightVisionDist { get; set; }
+
+ [JsonPropertyName("VISIBLE_ANG_LIGHT")]
+ public float VisibleAngLight { get; set; }
+
+ [JsonPropertyName("VISIBLE_ANG_NIGHTVISION")]
+ public float VisibleAngNightvision { get; set; }
+
+ [JsonPropertyName("NO_GREEN_DIST")]
+ public float NoGreenDist { get; set; }
+
+ [JsonPropertyName("NO_GRASS_DIST")]
+ public float NoGrassDist { get; set; }
+
+ [JsonPropertyName("INSIDE_BUSH_COEF")]
+ public float InsideBushCoef { get; set; }
+
+ [JsonPropertyName("SELF_NIGHTVISION")]
+ public bool SelfNightvision { get; set; }
+
+ [JsonPropertyName("FULL_SECTOR_VIEW")]
+ public bool FullSectorView { get; set; }
+
+ [JsonPropertyName("LOOK_THROUGH_PERIOD_BY_HIT")]
+ public float LookThroughPeriodByHit { get; set; }
+
+ [JsonPropertyName("CHECK_HEAD_ANY_DIST")]
+ public bool CheckHeadAnyDist { get; set; }
+
+ [JsonPropertyName("MIDDLE_DIST_CAN_SHOOT_HEAD")]
+ public bool MiddleDistCanShootHead { get; set; }
+
+ [JsonPropertyName("CAN_USE_LIGHT")]
+ public bool CanUseLight { get; set; }
+
+ [JsonPropertyName("RAIN_DEBUFF_MAXVISIBILITY_MULTIPLYER")]
+ public float RainDebuffMaxvisibilityMultiplyer { get; set; }
+
+ [JsonPropertyName("FOG_DEBUFF_MAXVISIBILITY_MULTIPLYER")]
+ public float FogDebuffMaxvisibilityMultiplyer { get; set; }
+
+ [JsonPropertyName("RAIN_DEBUFF_SEENCOEFF_MULTIPLYER")]
+ public float RainDebuffSeencoeffMultiplyer { get; set; }
+
+ [JsonPropertyName("FOG_DEBUFF_SEENCOEFF_MULTIPLYER")]
+ public float FogDebuffSeencoeffMultiplyer { get; set; }
+
+ [JsonPropertyName("SHOOT_FROM_EYES")]
+ public bool ShootFromEyes { get; set; }
+
+ [JsonPropertyName("ANGLE_FOR_GETUP")]
+ public float AngleForGetup { get; set; }
+
+ [JsonPropertyName("MINIMUM_VISIBLE_DIST")]
+ public float MinimumVisibleDist { get; set; }
+
+ [JsonPropertyName("CAN_USE_STRIBOSCOPE")]
+ public float CanUseStriboscope { get; set; }
+
+ [JsonPropertyName("LOOK_TO_ENEMY_TIME")]
+ public float LookToEnemyTime { get; set; }
+
+ [JsonPropertyName("ANGLE_VISION_COEF_FILTER")]
+ public float AngleVisionCoefFilter { get; set; }
+
+ [JsonPropertyName("HEAD_ROTATE_SPEED")]
+ public float HeadRotateSpeed { get; set; }
+
+ [JsonPropertyName("VISIBILITY_LEVEL_TO_TURN_HEAD")]
+ public float VisibilityLevelToTurnHead { get; set; }
+}
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalPatrolSettings.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalPatrolSettings.cs
new file mode 100644
index 00000000..7c6a824f
--- /dev/null
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalPatrolSettings.cs
@@ -0,0 +1,201 @@
+using System.Text.Json.Serialization;
+
+namespace SPTarkov.Server.Core.Models.Eft.Bot.GlobalSettings;
+
+///
+/// See BotGlobalPatrolSettings in the client, this record should match that
+///
+public class BotGlobalPatrolSettings
+{
+ [JsonPropertyName("LOOK_TIME_BASE")]
+ public float LookTimeBase { get; set; }
+
+ [JsonPropertyName("RESERVE_TIME_STAY")]
+ public float ReserveTimeStay { get; set; }
+
+ [JsonPropertyName("RESERVE_LOOT_TIME_STAY")]
+ public float ReserveLootTimeStay { get; set; }
+
+ [JsonPropertyName("FRIEND_SEARCH_SEC")]
+ public float FriendSearchSeconds { get; set; }
+
+ [JsonPropertyName("TALK_DELAY")]
+ public float TalkDelay { get; set; }
+
+ [JsonPropertyName("MIN_TALK_DELAY")]
+ public float MinTalkDelay { get; set; }
+
+ [JsonPropertyName("TALK_DELAY_BIG")]
+ public float TalkDelayBig { get; set; }
+
+ [JsonPropertyName("CHANGE_WAY_TIME")]
+ public float ChangeWayTime { get; set; }
+
+ [JsonPropertyName("MIN_DIST_TO_CLOSE_TALK")]
+ public float MinDistToCloseTalk { get; set; }
+
+ [JsonPropertyName("VISION_DIST_COEF_PEACE")]
+ public float VisionDistanceCoefPeace { get; set; }
+
+ [JsonPropertyName("MIN_DIST_TO_CLOSE_TALK_SQR")]
+ public float MinDistToCloseTalkSqr { get; set; }
+
+ [JsonPropertyName("CHANCE_TO_CUT_WAY_0_100")]
+ public float ChanceToCutWay { get; set; }
+
+ [JsonPropertyName("CUT_WAY_MIN_0_1")]
+ public float CutWayMin { get; set; }
+
+ [JsonPropertyName("CUT_WAY_MAX_0_1")]
+ public float CutWayMax { get; set; }
+
+ [JsonPropertyName("CHANCE_TO_CHANGE_WAY_0_100")]
+ public float ChanceToChangeWay { get; set; }
+
+ [JsonPropertyName("CHANCE_TO_SHOOT_DEADBODY")]
+ public int ChanceToShootDeadBody { get; set; }
+
+ [JsonPropertyName("SUSPETION_PLACE_LIFETIME")]
+ public float SuspicionPlaceLifetime { get; set; }
+
+ [JsonPropertyName("RESERVE_OUT_TIME")]
+ public float ReserveOutTime { get; set; }
+
+ [JsonPropertyName("CLOSE_TO_SELECT_RESERV_WAY")]
+ public float CloseToSelectReserveWay { get; set; }
+
+ [JsonPropertyName("MAX_YDIST_TO_START_WARN_REQUEST_TO_REQUESTER")]
+ public float MaxYDistToStartWarnRequest { get; set; }
+
+ [JsonPropertyName("MAX_YDIST_TO_START_WARN_REQUEST_TO_REQUESTER_ALLY")]
+ public float MaxYDistToStartWarnRequestAlly { get; set; }
+
+ [JsonPropertyName("CAN_CHOOSE_RESERV")]
+ public bool CanChooseReserve { get; set; }
+
+ [JsonPropertyName("USE_ONLY_RESERV")]
+ public bool UseOnlyReserve { get; set; }
+
+ [JsonPropertyName("HEAD_TURN_PERIOD_TIME")]
+ public float HeadTurnPeriodTime { get; set; }
+
+ [JsonPropertyName("HEAD_FRONT_PERIOD_TIME")]
+ public float HeadFrontPeriodTime { get; set; }
+
+ [JsonPropertyName("CHANCE_TO_PLAY_GESTURE_WHEN_CLOSE")]
+ public float ChanceToPlayGestureWhenClose { get; set; }
+
+ [JsonPropertyName("HEAD_TURN_SPEED")]
+ public float HeadTurnSpeed { get; set; }
+
+ [JsonPropertyName("HEAD_ANG_ROTATE")]
+ public float HeadAngleRotate { get; set; }
+
+ [JsonPropertyName("LOOT_PATROL_POTENTIAL_CLUSTERS_AMOUNT")]
+ public int LootPatrolPotentialClustersAmount { get; set; }
+
+ [JsonPropertyName("CHANCE_TO_PLAY_VOICE_WHEN_CLOSE")]
+ public float ChanceToPlayVoiceWhenClose { get; set; }
+
+ [JsonPropertyName("GO_TO_NEXT_POINT_DELTA")]
+ public float GoToNextPointDelta { get; set; }
+
+ [JsonPropertyName("GO_TO_NEXT_POINT_DELTA_RESERV_WAY")]
+ public float GoToNextPointDeltaReserveWay { get; set; }
+
+ [JsonPropertyName("DEAD_BODY_SEE_DIST")]
+ public float DeadBodySeeDistance { get; set; }
+
+ [JsonPropertyName("DEAD_BODY_LEAVE_DIST")]
+ public float DeadBodyLeaveDistance { get; set; }
+
+ [JsonPropertyName("CAN_LOOK_TO_DEADBODIES")]
+ public bool CanLookToDeadBodies { get; set; }
+
+ [JsonPropertyName("GESTURE_LENGTH")]
+ public float GestureLength { get; set; }
+
+ [JsonPropertyName("SHALL_STOP_IN_PEACEFUL_ACTION")]
+ public bool ShallStopInPeacefulAction { get; set; }
+
+ [JsonPropertyName("FORCE_OPPONENT_TO_PEAEFUL")]
+ public bool ForceOpponentToPeaceful { get; set; }
+
+ [JsonPropertyName("RESERVE_USE_SURGE_TIME_STAY")]
+ public float ReserveUseSurgeTimeStay { get; set; }
+
+ [JsonPropertyName("RESERV_CAN_USE_MEDS")]
+ public bool ReserveCanUseMeds { get; set; }
+
+ [JsonPropertyName("USE_PATROL_POINT_ACTION_MOVE_BY_RESERVE_WAY")]
+ public bool UsePatrolPointActionMoveByReserveWay { get; set; }
+
+ [JsonPropertyName("USE_SURGIAL_KIT_OVER_THE_BODY_CAHNCE_100")]
+ public float UseSurgicalKitChance { get; set; }
+
+ [JsonPropertyName("USE_SURGIAL_KIT_OVER_THE_BODY_SECOND_CAHNCE_100")]
+ public float UseSurgicalKitSecondChance { get; set; }
+
+ [JsonPropertyName("FOLLOWER_START_MOVE_DELAY")]
+ public float FollowerStartMoveDelay { get; set; }
+
+ [JsonPropertyName("USE_CHACHE_WAYS")]
+ public bool UseCachedWays { get; set; }
+
+ [JsonPropertyName("ITEMS_TO_DROP")]
+ public string ItemsToDrop { get; set; }
+
+ [JsonPropertyName("SPRINT_BETWEEN_CACHED_POINTS")]
+ public float SprintBetweenCachedPoints { get; set; }
+
+ [JsonPropertyName("CHECK_MAGAZIN_PERIOD")]
+ public float CheckMagazinePeriod { get; set; }
+
+ [JsonPropertyName("EAT_DRINK_PERIOD")]
+ public float EatDrinkPeriod { get; set; }
+
+ [JsonPropertyName("WATCH_SECOND_WEAPON_PERIOD")]
+ public float WatchSecondWeaponPeriod { get; set; }
+
+ [JsonPropertyName("CAN_WATCH_SECOND_WEAPON")]
+ public bool CanWatchSecondWeapon { get; set; }
+
+ [JsonPropertyName("DEAD_BODY_LOOK_PERIOD")]
+ public float DeadBodyLookPeriod { get; set; }
+
+ [JsonPropertyName("CAN_HARD_AIM")]
+ public bool CanHardAim { get; set; }
+
+ [JsonPropertyName("CAN_PEACEFUL_LOOK")]
+ public bool CanPeacefulLook { get; set; }
+
+ [JsonPropertyName("CAN_FRIENDLY_TILT")]
+ public bool CanFriendlyTilt { get; set; }
+
+ [JsonPropertyName("CAN_GESTUS")]
+ public bool CanGestus { get; set; }
+
+ [JsonPropertyName("TRY_CHOOSE_RESERV_WAY_ON_START")]
+ public bool TryChooseReserveWayOnStart { get; set; }
+
+ [JsonPropertyName("CAN_CHECK_MAGAZINE")]
+ public bool CanCheckMagazine { get; set; }
+
+ [JsonPropertyName("PICKUP_ITEMS_TO_BACKPACK_OR_CONTAINER")]
+ public bool PickupItemsToBackpackOrContainer { get; set; }
+
+ [JsonPropertyName("DO_RANDOM_DROP_ITEM")]
+ public bool DoRandomDropItem { get; set; }
+
+ [JsonPropertyName("STAY_AFTER_LOOT_TIME_MIN")]
+ public float StayAfterLootTimeMin { get; set; }
+
+ [JsonPropertyName("STAY_AFTER_LOOT_TIME_MAX")]
+ public float StayAfterLootTimeMax { get; set; }
+
+ [JsonPropertyName("USE_REAL_LOOTING")]
+ public bool UseRealLooting { get; set; }
+
+ [JsonPropertyName("DEAD_BODY_DROP_ITEM_PROBABILITY")]
+ public float DeadBodyDropItemProbability { get; set; }
+}
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalShootData.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalShootData.cs
new file mode 100644
index 00000000..dac8712a
--- /dev/null
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalShootData.cs
@@ -0,0 +1,285 @@
+using System.Text.Json.Serialization;
+
+namespace SPTarkov.Server.Core.Models.Eft.Bot.GlobalSettings;
+
+///
+/// See BotGlobalShootData in the client, this record should match that
+///
+public record BotGlobalShootData
+{
+ [JsonPropertyName("SWITCH_TO_UNDERBARREL_WEAPON_COOLDOWN")]
+ public float SwitchToUnderbarrelWeaponCooldown { get; set; }
+
+ [JsonPropertyName("MIN_TIME_TO_CHECK_FORCE_SWITCH_TO_GRENADE_LAUNCHER")]
+ public float MinTimeToCheckForceSwitchToGrenadeLauncher { get; set; }
+
+ [JsonPropertyName("MAX_TIME_TO_CHECK_FORCE_SWITCH_TO_GRENADE_LAUNCHER")]
+ public float MaxTimeToCheckForceSwitchToGrenadeLauncher { get; set; }
+
+ [JsonPropertyName("MAX_TIME_SEEN_TO_SWITCH_TO_GRENADE_LAUNCHER")]
+ public float MaxTimeSeenToSwitchToGrenadeLauncher { get; set; }
+
+ [JsonPropertyName("MAX_SUCCESS_GRENADE_LAUNCHER_SHOOT_ATTEMPTS")]
+ public uint MaxSuccessGrenadeLauncherShootAttempts { get; set; }
+
+ [JsonPropertyName("SHOOT_PROBABILITY_GRENADE_LAUNCHER")]
+ public float ShootProbabilityGrenadeLauncher { get; set; }
+
+ [JsonPropertyName("LOW_DIST_K_FOR_GRENADE_LAUNCHER")]
+ public float LowDistKForGrenadeLauncher { get; set; }
+
+ [JsonPropertyName("DEFAULT_LOW_DIST_TO_USE_GRENADE_LAUNCHER")]
+ public float DefaultLowDistToUseGrenadeLauncher { get; set; }
+
+ [JsonPropertyName("DISTANCE_TO_TARGET_NEAR_ENEMY_TRESHOLD")]
+ public float DistanceToTargetNearEnemyTreshold { get; set; }
+
+ [JsonPropertyName("DISTANCE_TO_TARGET_NEAR_ENEMY_DEVIATION")]
+ public float DistanceToTargetNearEnemyDeviation { get; set; }
+
+ [JsonPropertyName("RECOIL_TIME_NORMALIZE")]
+ public float RecoilTimeNormalize { get; set; }
+
+ [JsonPropertyName("RECOIL_PER_METER")]
+ public float RecoilPerMeter { get; set; }
+
+ [JsonPropertyName("MAX_RECOIL_PER_METER")]
+ public float MaxRecoilPerMeter { get; set; }
+
+ [JsonPropertyName("HORIZONT_RECOIL_COEF")]
+ public float HorizontRecoilCoef { get; set; }
+
+ [JsonPropertyName("WAIT_NEXT_SINGLE_SHOT")]
+ public float WaitNextSingleShot { get; set; }
+
+ [JsonPropertyName("WAIT_NEXT_STATIONARY_BULLET")]
+ public float WaitNextStationaryBullet { get; set; }
+
+ [JsonPropertyName("WAIT_NEXT_STATIONARY_GRENADE")]
+ public float WaitNextStationaryGrenade { get; set; }
+
+ [JsonPropertyName("WAIT_NEXT_SINGLE_SHOT_LONG_MAX")]
+ public float WaitNextSingleShotLongMax { get; set; }
+
+ [JsonPropertyName("WAIT_NEXT_SINGLE_SHOT_LONG_MIN")]
+ public float WaitNextSingleShotLongMin { get; set; }
+
+ [JsonPropertyName("NEXT_SINGLE_SHOT_PAUSE")]
+ public float NextSingleShotPause { get; set; }
+
+ [JsonPropertyName("SINGLE_SHOT_SERIES_TIME_MIN")]
+ public float SingleShotSeriesTimeMin { get; set; }
+
+ [JsonPropertyName("SINGLE_SHOT_SERIES_TIME_MAX")]
+ public float SingleShotSeriesTimeMax { get; set; }
+
+ [JsonPropertyName("USE_SINGLE_SHOT_SERIES")]
+ public bool UseSingleShotSeries { get; set; }
+
+ [JsonPropertyName("MARKSMAN_DIST_SEK_COEF")]
+ public float MarksmanDistSekCoef { get; set; }
+
+ [JsonPropertyName("FINGER_HOLD_SINGLE_SHOT")]
+ public float FingerHoldSingleShot { get; set; }
+
+ [JsonPropertyName("FINGER_HOLD_STATIONARY_BULLET")]
+ public float FingerHoldStationaryBullet { get; set; }
+
+ [JsonPropertyName("FINGER_HOLD_STATIONARY_GRENADE")]
+ public float FingerHoldStationaryGrenade { get; set; }
+
+ [JsonPropertyName("BASE_AUTOMATIC_TIME")]
+ public float BaseAutomaticTime { get; set; }
+
+ [JsonPropertyName("AUTOMATIC_FIRE_SCATTERING_COEF")]
+ public float AutomaticFireScatteringCoef { get; set; }
+
+ [JsonPropertyName("CHANCE_TO_CHANGE_TO_AUTOMATIC_FIRE_100")]
+ public float ChanceToChangeToAutomaticFire100 { get; set; }
+
+ [JsonPropertyName("FAR_DIST_ENEMY")]
+ public float FarDistEnemy { get; set; }
+
+ [JsonPropertyName("SHOOT_FROM_COVER")]
+ public int ShootFromCover { get; set; }
+
+ [JsonPropertyName("FAR_DIST_ENEMY_SQR")]
+ public float FarDistEnemySqr { get; set; }
+
+ [JsonPropertyName("MAX_DIST_COEF")]
+ public float MaxDistCoef { get; set; }
+
+ [JsonPropertyName("RECOIL_DELTA_PRESS")]
+ public float RecoilDeltaPress { get; set; }
+
+ [JsonPropertyName("RUN_DIST_NO_AMMO")]
+ public float RunDistNoAmmo { get; set; }
+
+ [JsonPropertyName("RUN_DIST_NO_AMMO_SQRT")]
+ public float RunDistNoAmmoSqrt { get; set; }
+
+ [JsonPropertyName("CAN_SHOOTS_TIME_TO_AMBUSH")]
+ public int CanShootsTimeToAmbush { get; set; }
+
+ [JsonPropertyName("NOT_TO_SEE_ENEMY_TO_WANT_RELOAD_PERCENT")]
+ public float NotToSeeEnemyToWantReloadPercent { get; set; }
+
+ [JsonPropertyName("NOT_TO_SEE_ENEMY_TO_WANT_RELOAD_SEC")]
+ public float NotToSeeEnemyToWantReloadSec { get; set; }
+
+ [JsonPropertyName("RELOAD_PECNET_NO_ENEMY")]
+ public float ReloadPecnetNoEnemy { get; set; }
+
+ [JsonPropertyName("CHANCE_TO_CHANGE_WEAPON")]
+ public float ChanceToChangeWeapon { get; set; }
+
+ [JsonPropertyName("CHANCE_TO_CHANGE_WEAPON_WITH_HELMET")]
+ public float ChanceToChangeWeaponWithHelmet { get; set; }
+
+ [JsonPropertyName("LOW_DIST_TO_CHANGE_WEAPON")]
+ public float LowDistToChangeWeapon { get; set; }
+
+ [JsonPropertyName("FAR_DIST_TO_CHANGE_WEAPON")]
+ public float FarDistToChangeWeapon { get; set; }
+
+ [JsonPropertyName("SUPPRESS_BY_SHOOT_TIME")]
+ public float SuppressByShootTime { get; set; }
+
+ [JsonPropertyName("SUPPRESS_TRIGGERS_DOWN")]
+ public int SuppressTriggersDown { get; set; }
+
+ [JsonPropertyName("SUPPRESS_TRIGGERS_DOWN_AS_LIST")]
+ public int SuppressTriggersDownAsList { get; set; }
+
+ [JsonPropertyName("DIST_TO_CHANGE_TO_MAIN")]
+ public float DistToChangeToMain { get; set; }
+
+ [JsonPropertyName("AGS_17_DIST_TO_LEAVE")]
+ public float Ags17DistToLeave { get; set; }
+
+ [JsonPropertyName("DIST_TO_HIT_MELEE")]
+ public float DistToHitMelee { get; set; }
+
+ [JsonPropertyName("DIST_TO_HIT_MELEE_CONTINUE_COMBO")]
+ public float DistToHitMeleeContinueCombo { get; set; }
+
+ [JsonPropertyName("DIST_TO_STOP_SPRINT_MELEE")]
+ public float DistToStopSprintMelee { get; set; }
+
+ [JsonPropertyName("TRY_HIT_PERIOD_MELEE")]
+ public float TryHitPeriodMelee { get; set; }
+
+ [JsonPropertyName("BLOCK_PERIOD_WHEN_LAY")]
+ public float BlockPeriodWhenLay { get; set; }
+
+ [JsonPropertyName("CHANGE_WEAPON_PERIOD")]
+ public float ChangeWeaponPeriod { get; set; }
+
+ [JsonPropertyName("USE_MELEE_COMBOS")]
+ public bool UseMeleeCombos { get; set; }
+
+ [JsonPropertyName("MELEE_RESET_HIT_TIME")]
+ public float MeleeResetHitTime { get; set; }
+
+ [JsonPropertyName("MELEE_STOP_MOVE_DISTANCE")]
+ public float MeleeStopMoveDistance { get; set; }
+
+ [JsonPropertyName("VALIDATE_MALFUNCTION_CHANCE")]
+ public int ValidateMalfunctionChance { get; set; }
+
+ [JsonPropertyName("REPAIR_MALFUNCTION_IMMEDIATE_CHANCE")]
+ public int RepairMalfunctionImmediateChance { get; set; }
+
+ [JsonPropertyName("DELAY_BEFORE_EXAMINE_MALFUNCTION")]
+ public float DelayBeforeExamineMalfunction { get; set; }
+
+ [JsonPropertyName("DELAY_BEFORE_FIX_MALFUNCTION")]
+ public float DelayBeforeFixMalfunction { get; set; }
+
+ [JsonPropertyName("TRY_CHANGE_WEAPON_INSTEAD_RELOAD")]
+ public bool TryChangeWeaponInsteadReload { get; set; }
+
+ [JsonPropertyName("MELEE_ATTACK_ZIG_ZAG")]
+ public bool MeleeAttackZigZag { get; set; }
+
+ [JsonPropertyName("MIN_DIST_TO_ENEMY_TO_CHANGE_WEAPON_INSTEAD_RELOAD")]
+ public float MinDistToEnemyToChangeWeaponInsteadReload { get; set; }
+
+ [JsonPropertyName("CHANCE_TO_CHANGE_WEAPON_INSTEAD_RELOAD")]
+ public float ChanceToChangeWeaponInsteadReload { get; set; }
+
+ [JsonPropertyName("CHANCE_TO_CHANGE_WEAPON_INSTEAD_RELOAD_ENEMY_WITHOUT_HELM")]
+ public float ChanceToChangeWeaponInsteadReloadEnemyWithoutHelm { get; set; }
+
+ [JsonPropertyName("MELEE_STOP_DIST")]
+ public float MeleeStopDist { get; set; }
+
+ [JsonPropertyName("BLOCK_STEERING")]
+ public bool BlockSteering { get; set; }
+
+ [JsonPropertyName("USE_BTR_CANSHOOT")]
+ public bool UseBtrCanshoot { get; set; }
+
+ [JsonPropertyName("FAR_DISTANCE_ALL_WEAPONS")]
+ public float FarDistanceAllWeapons { get; set; }
+
+ [JsonPropertyName("FAR_DISTANCE_PISTOLS")]
+ public float FarDistancePistols { get; set; }
+
+ [JsonPropertyName("FAR_DISTANCE_SHOTGUNS")]
+ public float FarDistanceShotguns { get; set; }
+
+ [JsonPropertyName("FAR_DIST_EYE_CONTACT_TIME_TO_CHANGE_COVER")]
+ public float FarDistEyeContactTimeToChangeCover { get; set; }
+
+ [JsonPropertyName("CHANGE_TO_MAIN_WEAPON_WHEN_PATROL")]
+ public bool ChangeToMainWeaponWhenPatrol { get; set; }
+
+ [JsonPropertyName("SHOOT_IMMEDIATELY_DIST")]
+ public float ShootImmediatelyDist { get; set; }
+
+ [JsonPropertyName("CAN_STOP_SHOOT_CAUSE_ANIMATOR")]
+ public bool CanStopShootCauseAnimator { get; set; }
+
+ [JsonPropertyName("TRY_CHANGE_WEAPON_WHEN_RELOAD")]
+ public bool TryChangeWeaponWhenReload { get; set; }
+
+ [JsonPropertyName("CHANGE_TO_MAIN_WHEN_SUPPORT_NO_AMMO")]
+ public bool ChangeToMainWhenSupportNoAmmo { get; set; }
+
+ [JsonPropertyName("LAST_SEEN_TIME_TO_START_SUPPRESS_STATIONARY_AGS")]
+ public float LastSeenTimeToStartSuppressStationaryAgs { get; set; }
+
+ [JsonPropertyName("STATIONARY_GRENADE_MIN_DIST_TO_TAKE")]
+ public float StationaryGrenadeMinDistToTake { get; set; }
+
+ [JsonPropertyName("STATIONARY_SIMPLE_MIN_DIST_TO_TAKE")]
+ public double StationarySimpleMinDistToTake { get; set; }
+
+ [JsonPropertyName("NO_OFFSET_SHOOTING_FROM_PLAYER")]
+ public bool NoOffsetShootingFromPlayer { get; set; }
+
+ [JsonPropertyName("ALTERNATIVE_KNIFE_KICK")]
+ public bool AlternativeKnifeKick { get; set; }
+
+ [JsonPropertyName("DITANCE_TO_OFF_AUTO_FIRE")]
+ public float DistanceToOffAutoFire { get; set; }
+
+ [JsonPropertyName("DITANCE_TO_ON_AUTO_FIRE")]
+ public float DistanceToOnAutoFire { get; set; }
+
+ [JsonPropertyName("MISS_ON_CRITICAL_DIST")]
+ public float MissOnCriticalDist { get; set; }
+
+ [JsonPropertyName("MISS_AFTER_SPRINT")]
+ public bool MissAfterSprint { get; set; }
+
+ [JsonPropertyName("MISS_TO_HEAD")]
+ public bool MissToHead { get; set; }
+
+ [JsonPropertyName("MISS_ON_MOVE")]
+ public bool MissOnMove { get; set; }
+
+ [JsonPropertyName("MISS_ON_TRANSITION")]
+ public bool MissOnTransition { get; set; }
+}
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsBossSettings.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsBossSettings.cs
new file mode 100644
index 00000000..8907c94a
--- /dev/null
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsBossSettings.cs
@@ -0,0 +1,399 @@
+using System.Text.Json.Serialization;
+
+namespace SPTarkov.Server.Core.Models.Eft.Bot.GlobalSettings;
+
+///
+/// See BotGlobalsBossSettings in the client, this record should match that
+///
+public record BotGlobalsBossSettings
+{
+ [JsonPropertyName("BOSS_DIST_TO_WARNING")]
+ public float BossDistToWarning { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_WARNING_ALLY")]
+ public float BossDistToWarningAlly { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_WARNING_SQRT")]
+ public float BossDistToWarningSqrt { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_WARNING_SQRT_ALLY")]
+ public float BossDistToWarningSqrtAlly { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_WARNING_USEC")]
+ public float BossDistToWarningUsec { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_WARNING_USEC_ALLY")]
+ public float BossDistToWarningUsecAlly { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_WARNING_SQRT_USEC")]
+ public float BossDistToWarningSqrtUsec { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_WARNING_SQRT_USEC_ALLY")]
+ public float BossDistToWarningSqrtUsecAlly { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_WARNING_BEAR")]
+ public float BossDistToWarningBear { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_WARNING_BEAR_ALLY")]
+ public float BossDistToWarningBearAlly { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_WARNING_SQRT_BEAR")]
+ public float BossDistToWarningSqrtBear { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_WARNING_SQRT_BEAR_ALLY")]
+ public float BossDistToWarningSqrtBearAlly { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_WARNING_OUT")]
+ public float BossDistToWarningOut { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_WARNING_OUT_ALLY")]
+ public float BossDistToWarningOutAlly { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_WARNING_OUT_SQRT")]
+ public float BossDistToWarningOutSqrt { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_WARNING_OUT_SQRT_ALLY")]
+ public float BossDistToWarningOutSqrtAlly { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_SHOOT")]
+ public float BossDistToShoot { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_SHOOT_ALLY")]
+ public float BossDistToShootAlly { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_SHOOT_SQRT")]
+ public float BossDistToShootSqrt { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_SHOOT_SQRT_ALLY")]
+ public float BossDistToShootSqrtAlly { get; set; }
+
+ [JsonPropertyName("CHANCE_TO_SEND_GRENADE_100")]
+ public float ChanceToSendGrenade100 { get; set; }
+
+ [JsonPropertyName("MAX_DIST_COVER_BOSS")]
+ public float MaxDistCoverBoss { get; set; }
+
+ [JsonPropertyName("MAX_DIST_COVER_BOSS_SQRT")]
+ public float MaxDistCoverBossSqrt { get; set; }
+
+ [JsonPropertyName("MAX_DIST_DECIDER_TO_SEND")]
+ public float MaxDistDeciderToSend { get; set; }
+
+ [JsonPropertyName("MAX_DIST_DECIDER_TO_SEND_SQRT")]
+ public float MaxDistDeciderToSendSqrt { get; set; }
+
+ [JsonPropertyName("TIME_AFTER_LOSE")]
+ public float TimeAfterLose { get; set; }
+
+ [JsonPropertyName("TIME_AFTER_LOSE_DELTA")]
+ public float TimeAfterLoseDelta { get; set; }
+
+ [JsonPropertyName("PERSONS_SEND")]
+ public int PersonsSend { get; set; }
+
+ [JsonPropertyName("DELTA_SEARCH_TIME")]
+ public float DeltaSearchTime { get; set; }
+
+ [JsonPropertyName("COVER_TO_SEND")]
+ public bool CoverToSend { get; set; }
+
+ [JsonPropertyName("WAIT_NO_ATTACK_SAVAGE")]
+ public float WaitNoAttackSavage { get; set; }
+
+ [JsonPropertyName("CHANCE_USE_RESERVE_PATROL_100")]
+ public float ChanceUseReservePatrol100 { get; set; }
+
+ [JsonPropertyName("WARN_PLAYER_PERIOD")]
+ public float WarnPlayerPeriod { get; set; }
+
+ [JsonPropertyName("EFFECT_REGENERATION_PER_MIN")]
+ public float EffectRegenerationPerMin { get; set; }
+
+ [JsonPropertyName("EFFECT_PAINKILLER")]
+ public bool EffectPainkiller { get; set; }
+
+ [JsonPropertyName("DISABLE_METABOLISM")]
+ public bool DisableMetabolism { get; set; }
+
+ [JsonPropertyName("KILLA_Y_DELTA_TO_BE_ENEMY_BOSS")]
+ public float KillaYDeltaToBeEnemyBoss { get; set; }
+
+ [JsonPropertyName("KILLA_DITANCE_TO_BE_ENEMY_BOSS")]
+ public float KillaDitanceToBeEnemyBoss { get; set; }
+
+ [JsonPropertyName("KILLA_START_SEARCH_SEC")]
+ public float KillaStartSearchSec { get; set; }
+
+ [JsonPropertyName("KILLA_CONTUTION_TIME")]
+ public float KillaContutionTime { get; set; }
+
+ [JsonPropertyName("KILLA_CLOSE_ATTACK_DIST")]
+ public float KillaCloseAttackDist { get; set; }
+
+ [JsonPropertyName("KILLA_MIDDLE_ATTACK_DIST")]
+ public float KillaMiddleAttackDist { get; set; }
+
+ [JsonPropertyName("KILLA_LARGE_ATTACK_DIST")]
+ public float KillaLargeAttackDist { get; set; }
+
+ [JsonPropertyName("KILLA_SEARCH_METERS")]
+ public float KillaSearchMeters { get; set; }
+
+ [JsonPropertyName("KILLA_DEF_DIST_SQRT")]
+ public float KillaDefDistSqrt { get; set; }
+
+ [JsonPropertyName("KILLA_SEARCH_SEC_STOP_AFTER_COMING")]
+ public float KillaSearchSecStopAfterComing { get; set; }
+
+ [JsonPropertyName("KILLA_DIST_TO_GO_TO_SUPPRESS")]
+ public float KillaDistToGoToSuppress { get; set; }
+
+ [JsonPropertyName("KILLA_AFTER_GRENADE_SUPPRESS_DELAY")]
+ public float KillaAfterGrenadeSuppressDelay { get; set; }
+
+ [JsonPropertyName("KILLA_CLOSEATTACK_TIMES")]
+ public int KillaCloseattackTimes { get; set; }
+
+ [JsonPropertyName("KILLA_CLOSEATTACK_DELAY")]
+ public float KillaCloseattackDelay { get; set; }
+
+ [JsonPropertyName("KILLA_HOLD_DELAY")]
+ public float KillaHoldDelay { get; set; }
+
+ [JsonPropertyName("KILLA_BULLET_TO_RELOAD")]
+ public int KillaBulletToReload { get; set; }
+
+ [JsonPropertyName("PERCENT_BULLET_TO_RELOAD")]
+ public float PercentBulletToReload { get; set; }
+
+ [JsonPropertyName("SHALL_WARN")]
+ public bool ShallWarn { get; set; }
+
+ [JsonPropertyName("KILLA_ENEMIES_TO_ATTACK")]
+ public int KillaEnemiesToAttack { get; set; }
+
+ [JsonPropertyName("KILLA_ONE_IS_CLOSE")]
+ public float KillaOneIsClose { get; set; }
+
+ [JsonPropertyName("KILLA_TRIGGER_DOWN_DELAY")]
+ public float KillaTriggerDownDelay { get; set; }
+
+ [JsonPropertyName("KILLA_WAIT_IN_COVER_COEF")]
+ public float KillaWaitInCoverCoef { get; set; }
+
+ [JsonPropertyName("TAGILLA_Y_DELTA_TO_BE_ENEMY_BOSS")]
+ public float TagillaYDeltaToBeEnemyBoss { get; set; }
+
+ [JsonPropertyName("TAGILLA_SAVAGE_HELP_SQR_DIST")]
+ public float TagillaSavageHelpSqrDist { get; set; }
+
+ [JsonPropertyName("TAGILLA_FORCED_CLOSE_ATTACK_DIST")]
+ public float TagillaForcedCloseAttackDist { get; set; }
+
+ [JsonPropertyName("TAGILLA_FIRST_ASSAULT_RADIUS")]
+ public float TagillaFirstAssaultRadius { get; set; }
+
+ [JsonPropertyName("TAGILLA_FIRST_ASSAULT_CHANCE")]
+ public float TagillaFirstAssaultChance { get; set; }
+
+ [JsonPropertyName("TAGILLA_SECOND_ASSAULT_RADIUS")]
+ public float TagillaSecondAssaultRadius { get; set; }
+
+ [JsonPropertyName("TAGILLA_SECOND_ASSAULT_CHANCE")]
+ public float TagillaSecondAssaultChance { get; set; }
+
+ [JsonPropertyName("TAGILLA_FEEL_ENEMY_DIST_SQR")]
+ public float TagillaFeelEnemyDistSqr { get; set; }
+
+ [JsonPropertyName("TAGILLA_TIME_TO_PURSUIT_WITHOUT_HITS")]
+ public float TagillaTimeToPursuitWithoutHits { get; set; }
+
+ [JsonPropertyName("TAGILLA_MELEE_ATTACK_NEXT_DECISION_PERIOD")]
+ public float TagillaMeleeAttackNextDecisionPeriod { get; set; }
+
+ [JsonPropertyName("TAGILLA_MELEE_CHANCE_RELOAD")]
+ public float TagillaMeleeChanceReload { get; set; }
+
+ [JsonPropertyName("TAGILLA_MELEE_CHANCE_INTERACTION")]
+ public float TagillaMeleeChanceInteraction { get; set; }
+
+ [JsonPropertyName("TAGILLA_MELEE_CHANCE_INVENTORY")]
+ public float TagillaMeleeChanceInventory { get; set; }
+
+ [JsonPropertyName("TAGILLA_MELEE_CHANCE_MEDS")]
+ public float TagillaMeleeChanceMeds { get; set; }
+
+ [JsonPropertyName("TAGILLA_MELEE_CHANCE_FORCED")]
+ public float TagillaMeleeChanceForced { get; set; }
+
+ [JsonPropertyName("TAGILLA_MIN_TIME_TO_REPEAT_MELEE_ASSAULT")]
+ public float TagillaMinTimeToRepeatMeleeAssault { get; set; }
+
+ [JsonPropertyName("KOJANIY_DIST_WHEN_READY")]
+ public float KojaniyDistWhenReady { get; set; }
+
+ [JsonPropertyName("KOJANIY_DIST_TO_BE_ENEMY")]
+ public float KojaniyDistToBeEnemy { get; set; }
+
+ [JsonPropertyName("KOJANIY_MIN_DIST_TO_LOOT")]
+ public float KojaniyMinDistToLoot { get; set; }
+
+ [JsonPropertyName("KOJANIY_MIN_DIST_TO_LOOT_SQRT")]
+ public float KojaniyMinDistToLootSqrt { get; set; }
+
+ [JsonPropertyName("KOJANIY_DIST_ENEMY_TOO_CLOSE")]
+ public float KojaniyDistEnemyTooClose { get; set; }
+
+ [JsonPropertyName("KOJANIY_MANY_ENEMIES_COEF")]
+ public float KojaniyManyEnemiesCoef { get; set; }
+
+ [JsonPropertyName("KOJANIY_FIGHT_CENTER_POS_ME")]
+ public bool KojaniyFightCenterPosMe { get; set; }
+
+ [JsonPropertyName("KOJANIY_DIST_CORE_SPOS_RECALC")]
+ public float KojaniyDistCoreSposRecalc { get; set; }
+
+ [JsonPropertyName("KOJANIY_DIST_CORE_SPOS_RECALC_SQRT")]
+ public float KojaniyDistCoreSposRecalcSqrt { get; set; }
+
+ [JsonPropertyName("KOJANIY_START_SUPPERS_SHOOTS_SEC")]
+ public float KojaniyStartSuppersShootsSec { get; set; }
+
+ [JsonPropertyName("KOJANIY_START_NEXT_SUPPERS_SHOOTS_SEC")]
+ public float KojaniyStartNextSuppersShootsSec { get; set; }
+
+ [JsonPropertyName("KOJANIY_SAFE_ENEMIES")]
+ public int KojaniySafeEnemies { get; set; }
+
+ [JsonPropertyName("KOJANIY_TAKE_CARE_ABOULT_ENEMY_DELTA")]
+ public float KojaniyTakeCareAboultEnemyDelta { get; set; }
+
+ [JsonPropertyName("KOJANIY_WANNA_GO_TO_CLOSEST_COVER")]
+ public float KojaniyWannaGoToClosestCover { get; set; }
+
+ [JsonPropertyName("GLUHAR_FOLLOWER_PATH_NAME")]
+ public string GluharFollowerPathName { get; set; }
+
+ [JsonPropertyName("GLUHAR_FOLLOWER_SCOUT_DIST_START_ATTACK")]
+ public float GluharFollowerScoutDistStartAttack { get; set; }
+
+ [JsonPropertyName("GLUHAR_FOLLOWER_SCOUT_DIST_END_ATTACK")]
+ public float GluharFollowerScoutDistEndAttack { get; set; }
+
+ [JsonPropertyName("GLUHAR_BOSS_WANNA_ATTACK_CHANCE_0_100")]
+ public float GluharBossWannaAttackChance0100 { get; set; }
+
+ [JsonPropertyName("GLUHAR_ASSAULT_ATTACK_DIST")]
+ public float GluharAssaultAttackDist { get; set; }
+
+ [JsonPropertyName("GLUHAR_STOP_ASSAULT_ATTACK_DIST")]
+ public float GluharStopAssaultAttackDist { get; set; }
+
+ [JsonPropertyName("GLUHAR_TIME_TO_ASSAULT")]
+ public float GluharTimeToAssault { get; set; }
+
+ [JsonPropertyName("DIST_TO_PROTECT_BOSS")]
+ public float DistToProtectBoss { get; set; }
+
+ [JsonPropertyName("GLUHAR_SEC_TO_REINFORSMENTS")]
+ public float GluharSecToReinforsments { get; set; }
+
+ [JsonPropertyName("GLUHAR_REINFORSMENTS_BY_EXIT")]
+ public bool GluharReinforsmentsByExit { get; set; }
+
+ [JsonPropertyName("GLUHAR_REINFORSMENTS_BY_EVENT")]
+ public bool GluharReinforsmentsByEvent { get; set; }
+
+ [JsonPropertyName("GLUHAR_REINFORSMENTS_BY_PLAYER_COME_TO_ZONE")]
+ public bool GluharReinforsmentsByPlayerComeToZone { get; set; }
+
+ [JsonPropertyName("GLUHAR_FOLLOWERS_TO_REINFORSMENTS")]
+ public int GluharFollowersToReinforsments { get; set; }
+
+ [JsonPropertyName("GLUHAR_FOLLOWERS_SECURITY")]
+ public int GluharFollowersSecurity { get; set; }
+
+ [JsonPropertyName("GLUHAR_FOLLOWERS_ASSAULT")]
+ public int GluharFollowersAssault { get; set; }
+
+ [JsonPropertyName("GLUHAR_FOLLOWERS_SCOUT")]
+ public int GluharFollowersScout { get; set; }
+
+ [JsonPropertyName("GLUHAR_FOLLOWERS_SNIPE")]
+ public int GluharFollowersSnipe { get; set; }
+
+ [JsonPropertyName("GLUHAR_BOSS_DIST_TO_ENEMY_WANT_KILL")]
+ public float GluharBossDistToEnemyWantKill { get; set; }
+
+ [JsonPropertyName("IF_I_HITTED_GO_AWAY_SEC_HIT")]
+ public float IfIHittedGoAwaySecHit { get; set; }
+
+ [JsonPropertyName("DIST_TO_START_RUN_FOR_COVER_WITH_STOP")]
+ public float DistToStartRunForCoverWithStop { get; set; }
+
+ [JsonPropertyName("DELTA_DIST_DEST_BOSS_START_RUN_FOR_COVER_WITH_STOP")]
+ public float DeltaDistDestBossStartRunForCoverWithStop { get; set; }
+
+ [JsonPropertyName("SANITAR_ONLY_FIGHT_COVERS")]
+ public bool SanitarOnlyFightCovers { get; set; }
+
+ [JsonPropertyName("SANITAR_TWO_COVER_TACTIC")]
+ public bool SanitarTwoCoverTactic { get; set; }
+
+ [JsonPropertyName("COUNT_FOLLOWERS_TO_WARN")]
+ public int CountFollowersToWarn { get; set; }
+
+ [JsonPropertyName("RUN_HIDE_CAN_USE_TREE_COVRES")]
+ public bool RunHideCanUseTreeCovres { get; set; }
+
+ [JsonPropertyName("SECTANT_INDOOR_DIST_NOT_TO_ATTACK")]
+ public float SectantIndoorDistNotToAttack { get; set; }
+
+ [JsonPropertyName("SET_CHEAT_VISIBLE_WHEN_ADD_TO_ENEMY")]
+ public bool SetCheatVisibleWhenAddToEnemy { get; set; }
+
+ [JsonPropertyName("TOTAL_TIME_KILL")]
+ public float TotalTimeKill { get; set; }
+
+ [JsonPropertyName("TOTAL_TIME_KILL_AFTER_WARN")]
+ public float TotalTimeKillAfterWarn { get; set; }
+
+ [JsonPropertyName("COME_INSIDE_TIMES")]
+ public int ComeInsideTimes { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_WARNING_OUT_DELTA")]
+ public float BossDistToWarningOutDelta { get; set; }
+
+ [JsonPropertyName("BOSS_DIST_TO_WARNING_OUT_DELTA_ALLY")]
+ public float BossDistToWarningOutDeltaAlly { get; set; }
+
+ [JsonPropertyName("TOTAL_TIME_KILL_AFTER_START_WARN")]
+ public float TotalTimeKillAfterStartWarn { get; set; }
+
+ [JsonPropertyName("BIG_PIPE_ARTILLERY_COUNT")]
+ public int BigPipeArtilleryCount { get; set; }
+
+ [JsonPropertyName("BOSS_ZRYACHIY_TELEPORT_CHANCE")]
+ public float BossZryachiyTeleportChance { get; set; }
+
+ [JsonPropertyName("BOSS_ZRYACHIY_MIN_DIST_TO_TELEPORT")]
+ public float BossZryachiyMinDistToTeleport { get; set; }
+
+ [JsonPropertyName("BOSS_ZRYACHIY_TELEPORT_CAN_SECONDS_FROM_START")]
+ public float BossZryachiyTeleportCanSecondsFromStart { get; set; }
+
+ [JsonPropertyName("BOSS_ZRYACHIY_MIN_DIST_TO_NEXT_COVER")]
+ public float BossZryachiyMinDistToNextCover { get; set; }
+
+ [JsonPropertyName("BOSS_ZRYACHIY_POSSIBLE_FOG")]
+ public float BossZryachiyPossibleFog { get; set; }
+
+ [JsonPropertyName("NOT_ADD_TO_ENEMY_ON_KILLS")]
+ public bool NotAddToEnemyOnKills { get; set; }
+
+ [JsonPropertyName("ALLOW_REQUEST_SELF")]
+ public bool AllowRequestSelf { get; set; }
+
+ [JsonPropertyName("TAGILLA_MELEE_ATTACK_IF_NO_SHOOT")]
+ public float TagillaMeleeAttackIfNoShoot { get; set; }
+}
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsChangeSettings.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsChangeSettings.cs
new file mode 100644
index 00000000..3ed4c854
--- /dev/null
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsChangeSettings.cs
@@ -0,0 +1,57 @@
+using System.Text.Json.Serialization;
+
+namespace SPTarkov.Server.Core.Models.Eft.Bot.GlobalSettings;
+
+///
+/// See BotGlobalsChangeSettings in the client, this record should match that
+///
+public record BotGlobalsChangeSettings
+{
+ [JsonPropertyName("SMOKE_VISION_DIST")]
+ public float SmokeVisionDist { get; set; }
+
+ [JsonPropertyName("SMOKE_GAIN_SIGHT")]
+ public float SmokeGainSight { get; set; }
+
+ [JsonPropertyName("SMOKE_SCATTERING")]
+ public float SmokeScattering { get; set; }
+
+ [JsonPropertyName("SMOKE_PRECICING")]
+ public float SmokePrecicing { get; set; }
+
+ [JsonPropertyName("SMOKE_HEARING")]
+ public float SmokeHearing { get; set; }
+
+ [JsonPropertyName("SMOKE_ACCURATY")]
+ public float SmokeAccuraty { get; set; }
+
+ [JsonPropertyName("SMOKE_LAY_CHANCE")]
+ public float SmokeLayChance { get; set; }
+
+ [JsonPropertyName("FLASH_VISION_DIST")]
+ public float FlashVisionDist { get; set; }
+
+ [JsonPropertyName("FLASH_GAIN_SIGHT")]
+ public float FlashGainSight { get; set; }
+
+ [JsonPropertyName("FLASH_SCATTERING")]
+ public float FlashScattering { get; set; }
+
+ [JsonPropertyName("FLASH_PRECICING")]
+ public float FlashPrecicing { get; set; }
+
+ [JsonPropertyName("FLASH_HEARING")]
+ public float FlashHearing { get; set; }
+
+ [JsonPropertyName("FLASH_ACCURATY")]
+ public float FlashAccuraty { get; set; }
+
+ [JsonPropertyName("FLASH_LAY_CHANCE")]
+ public float FlashLayChance { get; set; }
+
+ [JsonPropertyName("STUN_HEARING")]
+ public float StunHearing { get; set; }
+
+ [JsonPropertyName("INVISIBLE_ON_CLIENT")]
+ public bool InvisibleOnClient { get; set; }
+}
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsCoverSettings.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsCoverSettings.cs
new file mode 100644
index 00000000..57df54d6
--- /dev/null
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsCoverSettings.cs
@@ -0,0 +1,210 @@
+using System.Text.Json.Serialization;
+
+namespace SPTarkov.Server.Core.Models.Eft.Bot.GlobalSettings;
+
+///
+/// See BotGlobalsCoverSettings in the client, this record should match that
+///
+public record BotGlobalsCoverSettings
+{
+ [JsonPropertyName("RETURN_TO_ATTACK_AFTER_AMBUSH_MIN")]
+ public float ReturnToAttackAfterAmbushMin { get; set; }
+
+ [JsonPropertyName("RETURN_TO_ATTACK_AFTER_AMBUSH_MAX")]
+ public float ReturnToAttackAfterAmbushMax { get; set; }
+
+ [JsonPropertyName("SOUND_TO_GET_SPOTTED")]
+ public float SoundToGetSpotted { get; set; }
+
+ [JsonPropertyName("TIME_TO_MOVE_TO_COVER")]
+ public float TimeToMoveToCover { get; set; }
+
+ [JsonPropertyName("MAX_DIST_OF_COVER")]
+ public float MaxDistOfCover { get; set; }
+
+ [JsonPropertyName("CHANGE_RUN_TO_COVER_SEC")]
+ public float ChangeRunToCoverSec { get; set; }
+
+ [JsonPropertyName("CHANGE_RUN_TO_COVER_SEC_GREANDE")]
+ public float ChangeRunToCoverSecGreande { get; set; }
+
+ [JsonPropertyName("MIN_DIST_TO_ENEMY")]
+ public float MinDistToEnemy { get; set; }
+
+ [JsonPropertyName("DIST_CANT_CHANGE_WAY")]
+ public float DistCantChangeWay { get; set; }
+
+ [JsonPropertyName("DIST_CHECK_SFETY")]
+ public float DistCheckSfety { get; set; }
+
+ [JsonPropertyName("TIME_CHECK_SAFE")]
+ public float TimeCheckSafe { get; set; }
+
+ [JsonPropertyName("HIDE_TO_COVER_TIME")]
+ public float HideToCoverTime { get; set; }
+
+ [JsonPropertyName("MAX_DIST_OF_COVER_SQR")]
+ public float MaxDistOfCoverSqr { get; set; }
+
+ [JsonPropertyName("DIST_CANT_CHANGE_WAY_SQR")]
+ public float DistCantChangeWaySqr { get; set; }
+
+ [JsonPropertyName("SPOTTED_COVERS_RADIUS")]
+ public float SpottedCoversRadius { get; set; }
+
+ [JsonPropertyName("LOOK_LAST_ENEMY_POS_MOVING")]
+ public float LookLastEnemyPosMoving { get; set; }
+
+ [JsonPropertyName("LOOK_LAST_ENEMY_POS_LONG")]
+ public float LookLastEnemyPosLong { get; set; }
+
+ [JsonPropertyName("LOOK_LAST_ENEMY_POS_DIST")]
+ public float LookLastEnemyPosDist { get; set; }
+
+ [JsonPropertyName("LOOK_TO_HIT_POINT_IF_LAST_ENEMY")]
+ public float LookToHitPointIfLastEnemy { get; set; }
+
+ [JsonPropertyName("LOOK_LAST_ENEMY_POS_LOOKAROUND")]
+ public float LookLastEnemyPosLookaround { get; set; }
+
+ [JsonPropertyName("OFFSET_LOOK_ALONG_WALL_ANG")]
+ public int OffsetLookAlongWallAng { get; set; }
+
+ [JsonPropertyName("SPOTTED_GRENADE_RADIUS")]
+ public float SpottedGrenadeRadius { get; set; }
+
+ [JsonPropertyName("MAX_SPOTTED_TIME_SEC")]
+ public float MaxSpottedTimeSec { get; set; }
+
+ [JsonPropertyName("WAIT_INT_COVER_FINDING_ENEMY")]
+ public float WaitIntCoverFindingEnemy { get; set; }
+
+ [JsonPropertyName("CLOSE_DIST_POINT_SQRT")]
+ public float CloseDistPointSqrt { get; set; }
+
+ [JsonPropertyName("DELTA_SEEN_FROM_COVE_LAST_POS")]
+ public float DeltaSeenFromCoveLastPos { get; set; }
+
+ [JsonPropertyName("MOVE_TO_COVER_WHEN_TARGET")]
+ public bool MoveToCoverWhenTarget { get; set; }
+
+ [JsonPropertyName("RUN_COVER_IF_CAN_AND_NO_ENEMIES")]
+ public bool RunCoverIfCanAndNoEnemies { get; set; }
+
+ [JsonPropertyName("SPOTTED_GRENADE_TIME")]
+ public float SpottedGrenadeTime { get; set; }
+
+ [JsonPropertyName("DEPENDS_Y_DIST_TO_BOT")]
+ public bool DependsYDistToBot { get; set; }
+
+ [JsonPropertyName("RUN_IF_FAR")]
+ public float RunIfFar { get; set; }
+
+ [JsonPropertyName("RUN_IF_FAR_SQRT")]
+ public float RunIfFarSqrt { get; set; }
+
+ [JsonPropertyName("STAY_IF_FAR")]
+ public float StayIfFar { get; set; }
+
+ [JsonPropertyName("STAY_IF_FAR_SQRT")]
+ public float StayIfFarSqrt { get; set; }
+
+ [JsonPropertyName("CHECK_COVER_ENEMY_LOOK")]
+ public bool CheckCoverEnemyLook { get; set; }
+
+ [JsonPropertyName("SHOOT_NEAR_TO_LEAVE")]
+ public int ShootNearToLeave { get; set; }
+
+ [JsonPropertyName("SHOOT_NEAR_SEC_PERIOD")]
+ public float ShootNearSecPeriod { get; set; }
+
+ [JsonPropertyName("HITS_TO_LEAVE_COVER")]
+ public int HitsToLeaveCover { get; set; }
+
+ [JsonPropertyName("HITS_TO_LEAVE_COVER_UNKNOWN")]
+ public int HitsToLeaveCoverUnknown { get; set; }
+
+ [JsonPropertyName("DOG_FIGHT_AFTER_LEAVE")]
+ public float DogFightAfterLeave { get; set; }
+
+ [JsonPropertyName("NOT_LOOK_AT_WALL_IS_DANGER")]
+ public bool NotLookAtWallIsDanger { get; set; }
+
+ [JsonPropertyName("MIN_DEFENCE_LEVEL")]
+ public float MinDefenceLevel { get; set; }
+
+ [JsonPropertyName("REWORK_NOT_TO_SHOOT")]
+ public bool ReworkNotToShoot { get; set; }
+
+ [JsonPropertyName("DELETE_POINTS_BEHIND_ENEMIES")]
+ public bool DeletePointsBehindEnemies { get; set; }
+
+ [JsonPropertyName("GOOD_DIST_TO_POINT_COEF")]
+ public float GoodDistToPointCoef { get; set; }
+
+ [JsonPropertyName("ENEMY_DIST_TO_GO_OUT")]
+ public float EnemyDistToGoOut { get; set; }
+
+ [JsonPropertyName("CHECK_CLOSEST_FRIEND")]
+ public bool CheckClosestFriend { get; set; }
+
+ [JsonPropertyName("MIN_TO_ENEMY_TO_BE_NOT_SAFE_SQRT")]
+ public float MinToEnemyToBeNotSafeSqrt { get; set; }
+
+ [JsonPropertyName("MIN_TO_ENEMY_TO_BE_NOT_SAFE")]
+ public float MinToEnemyToBeNotSafe { get; set; }
+
+ [JsonPropertyName("SIT_DOWN_WHEN_HOLDING")]
+ public bool SitDownWhenHolding { get; set; }
+
+ [JsonPropertyName("STATIONARY_WEAPON_NO_ENEMY_GETUP")]
+ public float StationaryWeaponNoEnemyGetup { get; set; }
+
+ [JsonPropertyName("STATIONARY_WEAPON_MAX_DIST_TO_USE")]
+ public float StationaryWeaponMaxDistToUse { get; set; }
+
+ [JsonPropertyName("STATIONARY_SPOTTED_TIMES_TO_LEAVE")]
+ public int StationarySpottedTimesToLeave { get; set; }
+
+ [JsonPropertyName("STATIONARY_CAN_USE")]
+ public bool StationaryCanUse { get; set; }
+
+ [JsonPropertyName("CAN_END_SHOOT_FROM_COVER_CAUSE_STATIONARY")]
+ public bool CanEndShootFromCoverCauseStationary { get; set; }
+
+ [JsonPropertyName("CAN_END_SHOOT_FROM_COVER_CAUSE_STATIONARY_DELTA")]
+ public float CanEndShootFromCoverCauseStationaryDelta { get; set; }
+
+ [JsonPropertyName("CAN_END_SHOOT_FROM_COVER_CAUSE_STATIONARY_RADIUS")]
+ public float CanEndShootFromCoverCauseStationaryRadius { get; set; }
+
+ [JsonPropertyName("END_HOLD_IF_ENEMY_CLOSE_AND_VISIBLE")]
+ public float EndHoldIfEnemyCloseAndVisible { get; set; }
+
+ [JsonPropertyName("DIST_MAX_REWORK_NOT_TO_SHOOT")]
+ public float DistMaxReworkNotToShoot { get; set; }
+
+ [JsonPropertyName("SDIST_MAX_REWORK_NOT_TO_SHOOT")]
+ public float SdistMaxReworkNotToShoot { get; set; }
+
+ [JsonPropertyName("USE_DANGER_AREAS")]
+ public bool UseDangerAreas { get; set; }
+
+ [JsonPropertyName("MAX_ITERATIONS")]
+ public int MaxIterations { get; set; }
+
+ [JsonPropertyName("CHANGE_COVER_IF_CANT_SHOOT_SEC")]
+ public float ChangeCoverIfCantShootSec { get; set; }
+
+ [JsonPropertyName("SHALL_CHANGE_COVER_IF_CAN_SHOOT")]
+ public bool ShallChangeCoverIfCanShoot { get; set; }
+
+ [JsonPropertyName("CHECK_CLOSEST_FRIEND_DIST")]
+ public float CheckClosestFriendDist { get; set; }
+
+ [JsonPropertyName("CAN_LAY_TO_COVER_DIST_LOOK_TO_ENEMY")]
+ public float CanLayToCoverDistLookToEnemy { get; set; }
+
+ [JsonPropertyName("CAN_LAY_TO_COVER")]
+ public bool CanLayToCover { get; set; }
+}
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsGrenadeSettings.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsGrenadeSettings.cs
new file mode 100644
index 00000000..321fced1
--- /dev/null
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsGrenadeSettings.cs
@@ -0,0 +1,162 @@
+using System.Text.Json.Serialization;
+
+namespace SPTarkov.Server.Core.Models.Eft.Bot.GlobalSettings;
+
+///
+/// See BotGlobalsGrenadeSettings in the client, this record should match that
+///
+public record BotGlobalsGrenadeSettings
+{
+ [JsonPropertyName("DELTA_NEXT_ATTEMPT_FROM_COVER")]
+ public float DeltaNextAttemptFromCover { get; set; }
+
+ [JsonPropertyName("DELTA_NEXT_ATTEMPT")]
+ public float DeltaNextAttempt { get; set; }
+
+ [JsonPropertyName("MIN_DIST_NOT_TO_THROW")]
+ public float MinDistNotToThrow { get; set; }
+
+ [JsonPropertyName("NEAR_DELTA_THROW_TIME_SEC")]
+ public float NearDeltaThrowTimeSec { get; set; }
+
+ [JsonPropertyName("MIN_THROW_GRENADE_DIST")]
+ public float MinThrowGrenadeDist { get; set; }
+
+ [JsonPropertyName("MIN_THROW_GRENADE_DIST_SQRT")]
+ public float MinThrowGrenadeDistSqrt { get; set; }
+
+ [JsonPropertyName("MIN_DIST_NOT_TO_THROW_SQR")]
+ public float MinDistNotToThrowSqr { get; set; }
+
+ [JsonPropertyName("RUN_AWAY")]
+ public float RunAway { get; set; }
+
+ [JsonPropertyName("RUN_AWAY_SQR")]
+ public float RunAwaySqr { get; set; }
+
+ [JsonPropertyName("ADD_GRENADE_AS_DANGER")]
+ public float AddGrenadeAsDanger { get; set; }
+
+ [JsonPropertyName("ADD_GRENADE_AS_DANGER_SQR")]
+ public float AddGrenadeAsDangerSqr { get; set; }
+
+ [JsonPropertyName("CHANCE_TO_NOTIFY_ENEMY_GR_100")]
+ public float ChanceToNotifyEnemyGr100 { get; set; }
+
+ [JsonPropertyName("GrenadePerMeter")]
+ public float GrenadePerMeter { get; set; }
+
+ [JsonPropertyName("REQUEST_DIST_MUST_THROW_SQRT")]
+ public float RequestDistMustThrowSqrt { get; set; }
+
+ [JsonPropertyName("REQUEST_DIST_MUST_THROW")]
+ public float RequestDistMustThrow { get; set; }
+
+ [JsonPropertyName("BEWARE_TYPE")]
+ public int BewareType { get; set; }
+
+ [JsonPropertyName("SHOOT_TO_SMOKE_CHANCE_100")]
+ public float ShootToSmokeChance100 { get; set; }
+
+ [JsonPropertyName("CHANCE_RUN_FLASHED_100")]
+ public float ChanceRunFlashed100 { get; set; }
+
+ [JsonPropertyName("MAX_FLASHED_DIST_TO_SHOOT")]
+ public float MaxFlashedDistToShoot { get; set; }
+
+ [JsonPropertyName("MAX_FLASHED_DIST_TO_SHOOT_SQRT")]
+ public float MaxFlashedDistToShootSqrt { get; set; }
+
+ [JsonPropertyName("FLASH_GRENADE_TIME_COEF")]
+ public float FlashGrenadeTimeCoef { get; set; }
+
+ [JsonPropertyName("SIZE_SPOTTED_COEF")]
+ public float SizeSpottedCoef { get; set; }
+
+ [JsonPropertyName("BE_ATTENTION_COEF")]
+ public float BeAttentionCoef { get; set; }
+
+ [JsonPropertyName("TIME_SHOOT_TO_FLASH")]
+ public float TimeShootToFlash { get; set; }
+
+ [JsonPropertyName("CLOSE_TO_SMOKE_TO_SHOOT")]
+ public float CloseToSmokeToShoot { get; set; }
+
+ [JsonPropertyName("CLOSE_TO_SMOKE_TO_SHOOT_SQRT")]
+ public float CloseToSmokeToShootSqrt { get; set; }
+
+ [JsonPropertyName("CLOSE_TO_SMOKE_TIME_DELTA")]
+ public float CloseToSmokeTimeDelta { get; set; }
+
+ [JsonPropertyName("SMOKE_CHECK_DELTA")]
+ public float SmokeCheckDelta { get; set; }
+
+ [JsonPropertyName("DELTA_GRENADE_START_TIME")]
+ public float DeltaGrenadeStartTime { get; set; }
+
+ [JsonPropertyName("AMBUSH_IF_SMOKE_IN_ZONE_100")]
+ public float AmbushIfSmokeInZone100 { get; set; }
+
+ [JsonPropertyName("AMBUSH_IF_SMOKE_RETURN_TO_ATTACK_SEC")]
+ public float AmbushIfSmokeReturnToAttackSec { get; set; }
+
+ [JsonPropertyName("NO_RUN_FROM_AI_GRENADES")]
+ public bool NoRunFromAiGrenades { get; set; }
+
+ [JsonPropertyName("MAX_THROW_POWER")]
+ public float MaxThrowPower { get; set; }
+
+ [JsonPropertyName("GrenadePrecision")]
+ public float GrenadePrecision { get; set; }
+
+ [JsonPropertyName("GRENADE_PRECISION_PORTALS")]
+ public float GrenadePrecisionPortals { get; set; }
+
+ [JsonPropertyName("STOP_WHEN_THROW_GRENADE")]
+ public bool StopWhenThrowGrenade { get; set; }
+
+ [JsonPropertyName("WAIT_TIME_TURN_AWAY")]
+ public float WaitTimeTurnAway { get; set; }
+
+ [JsonPropertyName("SMOKE_SUPPRESS_DELTA")]
+ public float SmokeSuppressDelta { get; set; }
+
+ [JsonPropertyName("DAMAGE_GRENADE_SUPPRESS_DELTA")]
+ public float DamageGrenadeSuppressDelta { get; set; }
+
+ [JsonPropertyName("STUN_SUPPRESS_DELTA")]
+ public float StunSuppressDelta { get; set; }
+
+ [JsonPropertyName("CHEAT_START_GRENADE_PLACE")]
+ public bool CheatStartGrenadePlace { get; set; }
+
+ [JsonPropertyName("CAN_THROW_STRAIGHT_CONTACT")]
+ public bool CanThrowStraightContact { get; set; }
+
+ [JsonPropertyName("STRAIGHT_CONTACT_DELTA_SEC")]
+ public float StraightContactDeltaSec { get; set; }
+
+ [JsonPropertyName("ANG_TYPE")]
+ public int AngType { get; set; }
+
+ [JsonPropertyName("MIN_THROW_DIST_PERCENT_0_1")]
+ public float MinThrowDistPercent01 { get; set; }
+
+ [JsonPropertyName("FLASH_MODIF_IS_NIGHTVISION")]
+ public float FlashModifIsNightvision { get; set; }
+
+ [JsonPropertyName("FIRST_TIME_SEEN_DELTA_CAN_THROW")]
+ public float FirstTimeSeenDeltaCanThrow { get; set; }
+
+ [JsonPropertyName("SHALL_GETUP")]
+ public bool ShallGetup { get; set; }
+
+ [JsonPropertyName("CAN_LAY")]
+ public bool CanLay { get; set; }
+
+ [JsonPropertyName("IGNORE_SMOKE_GRENADE")]
+ public bool IgnoreSmokeGrenade { get; set; }
+
+ [JsonPropertyName("CAN_THROW_FROM_ANY_PLACE")]
+ public bool CanThrowFromAnyPlace { get; set; }
+}
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsHearingSettings.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsHearingSettings.cs
new file mode 100644
index 00000000..c511a8a4
--- /dev/null
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsHearingSettings.cs
@@ -0,0 +1,54 @@
+using System.Text.Json.Serialization;
+
+namespace SPTarkov.Server.Core.Models.Eft.Bot.GlobalSettings;
+
+///
+/// See BotGlobasHearingSettings in the client (Yes, with the typo), this record should match that
+///
+public record BotGlobalsHearingSettings
+{
+ [JsonPropertyName("BOT_CLOSE_PANIC_DIST")]
+ public float BotClosePanicDist { get; set; }
+
+ [JsonPropertyName("CHANCE_TO_HEAR_SIMPLE_SOUND_0_1")]
+ public float ChanceToHearSimpleSound01 { get; set; }
+
+ [JsonPropertyName("DISPERSION_COEF")]
+ public float DispersionCoef { get; set; }
+
+ [JsonPropertyName("DISPERSION_COEF_GUN")]
+ public float DispersionCoefGun { get; set; }
+
+ [JsonPropertyName("CLOSE_DIST")]
+ public float CloseDist { get; set; }
+
+ [JsonPropertyName("FAR_DIST")]
+ public float FarDist { get; set; }
+
+ [JsonPropertyName("SOUND_DIR_DEEFREE")]
+ public float SoundDirDeefree { get; set; }
+
+ [JsonPropertyName("DIST_PLACE_TO_FIND_POINT")]
+ public float DistPlaceToFindPoint { get; set; }
+
+ [JsonPropertyName("DEAD_BODY_SOUND_RAD")]
+ public float DeadBodySoundRad { get; set; }
+
+ [JsonPropertyName("LOOK_ONLY_DANGER")]
+ public bool LookOnlyDanger { get; set; }
+
+ [JsonPropertyName("RESET_TIMER_DIST")]
+ public float ResetTimerDist { get; set; }
+
+ [JsonPropertyName("HEAR_DELAY_WHEN_PEACE")]
+ public float HearDelayWhenPeace { get; set; }
+
+ [JsonPropertyName("HEAR_DELAY_WHEN_HAVE_SMT")]
+ public float HearDelayWhenHaveSmt { get; set; }
+
+ [JsonPropertyName("LOOK_ONLY_DANGER_DELTA")]
+ public float LookOnlyDangerDelta { get; set; }
+
+ [JsonPropertyName("ENEMY_SNIPER_SHOOT_DIST")]
+ public float EnemySniperShootDist { get; set; }
+}
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsMindSettings.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsMindSettings.cs
new file mode 100644
index 00000000..5606ffb0
--- /dev/null
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsMindSettings.cs
@@ -0,0 +1,430 @@
+using System.Text.Json.Serialization;
+using SPTarkov.Server.Core.Models.Eft.Common;
+
+///
+/// See BotGlobalsMindSettings in the client, this record should match that
+///
+namespace SPTarkov.Server.Core.Models.Eft.Bot.GlobalSettings;
+
+public record BotGlobalsMindSettings
+{
+ [JsonPropertyName("GRENADE_DAMAGE_IGNORE")]
+ public bool GrenadeDamageIgnore { get; set; }
+
+ [JsonPropertyName("MIN_SHOOTS_TIME")]
+ public int MinShootsTime { get; set; }
+
+ [JsonPropertyName("MAX_SHOOTS_TIME")]
+ public int MaxShootsTime { get; set; }
+
+ [JsonPropertyName("TIME_TO_RUN_TO_COVER_CAUSE_SHOOT_SEC")]
+ public float TimeToRunToCoverCauseShootSec { get; set; }
+
+ [JsonPropertyName("DAMAGE_REDUCTION_TIME_SEC")]
+ public float DamageReductionTimeSec { get; set; }
+
+ [JsonPropertyName("MIN_DAMAGE_SCARE")]
+ public float MinDamageScare { get; set; }
+
+ [JsonPropertyName("CHANCE_TO_RUN_CAUSE_DAMAGE_0_100")]
+ public float ChanceToRunCauseDamage0100 { get; set; }
+
+ [JsonPropertyName("TIME_TO_FORGOR_ABOUT_ENEMY_SEC")]
+ public float TimeToForgorAboutEnemySec { get; set; }
+
+ [JsonPropertyName("TIME_TO_FIND_ENEMY")]
+ public float TimeToFindEnemy { get; set; }
+
+ [JsonPropertyName("MAX_AGGRO_BOT_DIST")]
+ public float MaxAggroBotDist { get; set; }
+
+ [JsonPropertyName("HIT_POINT_DETECTION")]
+ public float HitPointDetection { get; set; }
+
+ [JsonPropertyName("DANGER_POINT_CHOOSE_COEF")]
+ public float DangerPointChooseCoef { get; set; }
+
+ [JsonPropertyName("SIMPLE_POINT_CHOOSE_COEF")]
+ public float SimplePointChooseCoef { get; set; }
+
+ [JsonPropertyName("LASTSEEN_POINT_CHOOSE_COEF")]
+ public float LastseenPointChooseCoef { get; set; }
+
+ [JsonPropertyName("COVER_DIST_COEF")]
+ public float CoverDistCoef { get; set; }
+
+ [JsonPropertyName("DIST_TO_FOUND_SQRT")]
+ public float DistToFoundSqrt { get; set; }
+
+ [JsonPropertyName("SEARCH_TARGET")]
+ public bool SearchTarget { get; set; }
+
+ [JsonPropertyName("ENEMY_BY_GROUPS_PMC_PLAYERS")]
+ public bool EnemyByGroupsPmcPlayers { get; set; }
+
+ [JsonPropertyName("ENEMY_BY_GROUPS_SAVAGE_PLAYERS")]
+ public bool EnemyByGroupsSavagePlayers { get; set; }
+
+ [JsonPropertyName("BOSS_IGNORE_LOYALTY")]
+ public bool BossIgnoreLoyalty { get; set; }
+
+ [JsonPropertyName("DEFAULT_BEAR_BEHAVIOUR")]
+ public EWarnBehaviour DefaultBearBehaviour { get; set; }
+
+ [JsonPropertyName("DEFAULT_USEC_BEHAVIOUR")]
+ public EWarnBehaviour DefaultUsecBehaviour { get; set; }
+
+ [JsonPropertyName("DEFAULT_SAVAGE_BEHAVIOUR")]
+ public EWarnBehaviour DefaultSavageBehaviour { get; set; }
+
+ [JsonPropertyName("FRIENDLY_BOT_TYPES")]
+ public WildSpawnType[] FriendlyBotTypes { get; set; }
+
+ [JsonPropertyName("WARN_BOT_TYPES")]
+ public WildSpawnType[] WarnBotTypes { get; set; }
+
+ [JsonPropertyName("ENEMY_BOT_TYPES")]
+ public WildSpawnType[] EnemyBotTypes { get; set; }
+
+ [JsonPropertyName("REVENGE_BOT_TYPES")]
+ public WildSpawnType[] RevengeBotTypes { get; set; }
+
+ [JsonPropertyName("FOLLOWER_AND_BOSS_WARN_EQUAL_PRIORITY")]
+ public bool FollowerAndBossWarnEqualPriority { get; set; }
+
+ [JsonPropertyName("MUTUAL_IGNORE_FRIENDLY_FIRE")]
+ public bool MutualIgnoreFriendlyFire { get; set; }
+
+ [JsonPropertyName("MAX_AGGRO_BOT_DIST_UPPER_LIMIT")]
+ public float MaxAggroBotDistUpperLimit { get; set; }
+
+ [JsonPropertyName("MAX_AGGRO_BOT_DIST_SQR_UPPER_LIMIT")]
+ public float MaxAggroBotDistSqrUpperLimit { get; set; }
+
+ [JsonPropertyName("MAX_AGGRO_BOT_DIST_SQR")]
+ public float MaxAggroBotDistSqr { get; set; }
+
+ [JsonPropertyName("DIST_TO_STOP_RUN_ENEMY")]
+ public float DistToStopRunEnemy { get; set; }
+
+ [JsonPropertyName("ENEMY_LOOK_AT_ME_ANG")]
+ public float EnemyLookAtMeAng { get; set; }
+
+ [JsonPropertyName("MIN_START_AGGRESION_COEF")]
+ public float MinStartAggresionCoef { get; set; }
+
+ [JsonPropertyName("MAX_START_AGGRESION_COEF")]
+ public float MaxStartAggresionCoef { get; set; }
+
+ [JsonPropertyName("BULLET_FEEL_DIST")]
+ public float BulletFeelDist { get; set; }
+
+ [JsonPropertyName("BULLET_FEEL_CLOSE_SDIST")]
+ public float BulletFeelCloseSdist { get; set; }
+
+ [JsonPropertyName("ATTACK_IMMEDIATLY_CHANCE_0_100")]
+ public float AttackImmediatlyChance0100 { get; set; }
+
+ [JsonPropertyName("CHANCE_FUCK_YOU_ON_CONTACT_100")]
+ public float ChanceFuckYouOnContact100 { get; set; }
+
+ [JsonPropertyName("FRIEND_DEAD_AGR_LOW")]
+ public float FriendDeadAgrLow { get; set; }
+
+ [JsonPropertyName("FRIEND_AGR_KILL")]
+ public float FriendAgrKill { get; set; }
+
+ [JsonPropertyName("LAST_ENEMY_LOOK_TO")]
+ public float LastEnemyLookTo { get; set; }
+
+ [JsonPropertyName("CAN_RECEIVE_PLAYER_REQUESTS_BEAR")]
+ public bool CanReceivePlayerRequestsBear { get; set; }
+
+ [JsonPropertyName("CAN_RECEIVE_PLAYER_REQUESTS_USEC")]
+ public bool CanReceivePlayerRequestsUsec { get; set; }
+
+ [JsonPropertyName("CAN_RECEIVE_PLAYER_REQUESTS_SAVAGE")]
+ public bool CanReceivePlayerRequestsSavage { get; set; }
+
+ [JsonPropertyName("REVENGE_TO_GROUP")]
+ public bool RevengeToGroup { get; set; }
+
+ [JsonPropertyName("REVENGE_FOR_SAVAGE_PLAYERS")]
+ public bool RevengeForSavagePlayers { get; set; }
+
+ [JsonPropertyName("CAN_USE_MEDS")]
+ public bool CanUseMeds { get; set; }
+
+ [JsonPropertyName("SUSPETION_POINT_CHANCE_ADD100")]
+ public float SuspetionPointChanceAdd100 { get; set; }
+
+ [JsonPropertyName("AMBUSH_WHEN_UNDER_FIRE")]
+ public bool AmbushWhenUnderFire { get; set; }
+
+ [JsonPropertyName("AMBUSH_WHEN_UNDER_FIRE_TIME_RESIST")]
+ public float AmbushWhenUnderFireTimeResist { get; set; }
+
+ [JsonPropertyName("CAN_LOOT_BOSS_CLUSTER")]
+ public bool CanLootBossCluster { get; set; }
+
+ [JsonPropertyName("ATTACK_ENEMY_IF_PROTECT_DELTA_LAST_TIME_SEEN")]
+ public float AttackEnemyIfProtectDeltaLastTimeSeen { get; set; }
+
+ [JsonPropertyName("HOLD_IF_PROTECT_DELTA_LAST_TIME_SEEN")]
+ public float HoldIfProtectDeltaLastTimeSeen { get; set; }
+
+ [JsonPropertyName("FIND_COVER_TO_GET_POSITION_WITH_SHOOT")]
+ public float FindCoverToGetPositionWithShoot { get; set; }
+
+ [JsonPropertyName("PROTECT_TIME_REAL")]
+ public bool ProtectTimeReal { get; set; }
+
+ [JsonPropertyName("CHANCE_SHOOT_WHEN_WARN_PLAYER_100")]
+ public float ChanceShootWhenWarnPlayer100 { get; set; }
+
+ [JsonPropertyName("CAN_PANIC_IS_PROTECT")]
+ public bool CanPanicIsProtect { get; set; }
+
+ [JsonPropertyName("NO_RUN_AWAY_FOR_SAFE")]
+ public bool NoRunAwayForSafe { get; set; }
+
+ [JsonPropertyName("PART_PERCENT_TO_HEAL")]
+ public float PartPercentToHeal { get; set; }
+
+ [JsonPropertyName("PROTECT_DELTA_HEAL_SEC")]
+ public float ProtectDeltaHealSec { get; set; }
+
+ [JsonPropertyName("CAN_STAND_BY")]
+ public bool CanStandBy { get; set; }
+
+ [JsonPropertyName("CAN_THROW_REQUESTS")]
+ public bool CanThrowRequests { get; set; }
+
+ [JsonPropertyName("GROUP_ANY_PHRASE_DELAY")]
+ public float GroupAnyPhraseDelay { get; set; }
+
+ [JsonPropertyName("GROUP_EXACTLY_PHRASE_DELAY")]
+ public float GroupExactlyPhraseDelay { get; set; }
+
+ [JsonPropertyName("GROUP_EXACTLY_PHRASE_DELAY_MAX")]
+ public float GroupExactlyPhraseDelayMax { get; set; }
+
+ [JsonPropertyName("DIST_TO_ENEMY_YO_CAN_HEAL")]
+ public float DistToEnemyYoCanHeal { get; set; }
+
+ [JsonPropertyName("CHANCE_TO_STAY_WHEN_WARN_PLAYER_100")]
+ public float ChanceToStayWhenWarnPlayer100 { get; set; }
+
+ [JsonPropertyName("DOG_FIGHT_OUT")]
+ public float DogFightOut { get; set; }
+
+ [JsonPropertyName("DOG_FIGHT_IN")]
+ public float DogFightIn { get; set; }
+
+ [JsonPropertyName("SHOOT_INSTEAD_DOG_FIGHT")]
+ public float ShootInsteadDogFight { get; set; }
+
+ [JsonPropertyName("PISTOL_SHOTGUN_AMBUSH_DIST")]
+ public float PistolShotgunAmbushDist { get; set; }
+
+ [JsonPropertyName("STANDART_AMBUSH_DIST")]
+ public float StandartAmbushDist { get; set; }
+
+ [JsonPropertyName("AI_POWER_COEF")]
+ public float AiPowerCoef { get; set; }
+
+ [JsonPropertyName("COVER_SECONDS_AFTER_LOSE_VISION")]
+ public float CoverSecondsAfterLoseVision { get; set; }
+
+ [JsonPropertyName("COVER_SELF_ALWAYS_IF_DAMAGED")]
+ public bool CoverSelfAlwaysIfDamaged { get; set; }
+
+ [JsonPropertyName("SEC_TO_MORE_DIST_TO_RUN")]
+ public float SecToMoreDistToRun { get; set; }
+
+ [JsonPropertyName("HEAL_DELAY_SEC")]
+ public float HealDelaySec { get; set; }
+
+ [JsonPropertyName("HIT_DELAY_WHEN_HAVE_SMT")]
+ public float HitDelayWhenHaveSmt { get; set; }
+
+ [JsonPropertyName("HIT_DELAY_WHEN_PEACE")]
+ public float HitDelayWhenPeace { get; set; }
+
+ [JsonPropertyName("TALK_WITH_QUERY")]
+ public bool TalkWithQuery { get; set; }
+
+ [JsonPropertyName("DANGER_EXPIRE_TIME_MIN")]
+ public float DangerExpireTimeMin { get; set; }
+
+ [JsonPropertyName("DANGER_EXPIRE_TIME_MAX")]
+ public float DangerExpireTimeMax { get; set; }
+
+ [JsonPropertyName("PANIC_RUN_WEIGHT")]
+ public float PanicRunWeight { get; set; }
+
+ [JsonPropertyName("PANIC_SIT_WEIGHT")]
+ public float PanicSitWeight { get; set; }
+
+ [JsonPropertyName("PANIC_LAY_WEIGHT")]
+ public float PanicLayWeight { get; set; }
+
+ [JsonPropertyName("PANIC_NONE_WEIGHT")]
+ public float PanicNoneWeight { get; set; }
+
+ [JsonPropertyName("PANIC_SIT_WEIGHT_PEACE")]
+ public float PanicSitWeightPeace { get; set; }
+
+ [JsonPropertyName("CAN_EXECUTE_REQUESTS")]
+ public bool CanExecuteRequests { get; set; }
+
+ [JsonPropertyName("CAN_WARN_SELF")]
+ public bool CanWarnSelf { get; set; }
+
+ [JsonPropertyName("DIST_TO_ENEMY_SPOTTED_ON_HIT")]
+ public float DistToEnemySpottedOnHit { get; set; }
+
+ [JsonPropertyName("UNDER_FIRE_PERIOD")]
+ public float UnderFirePeriod { get; set; }
+
+ [JsonPropertyName("MEDS_ONLY_SAFE_CONTAINER")]
+ public bool MedsOnlySafeContainer { get; set; }
+
+ [JsonPropertyName("CAN_DROP_ITEMS")]
+ public bool CanDropItems { get; set; }
+
+ [JsonPropertyName("CAN_TAKE_ITEMS")]
+ public bool CanTakeItems { get; set; }
+
+ [JsonPropertyName("THROW_DIST_TO_SEE")]
+ public float ThrowDistToSee { get; set; }
+
+ [JsonPropertyName("CAN_TAKE_ANY_ITEM")]
+ public bool CanTakeAnyItem { get; set; }
+
+ [JsonPropertyName("WILL_PERSUE_AXEMAN")]
+ public bool WillPersueAxeman { get; set; }
+
+ [JsonPropertyName("MAX_DIST_TO_RUN_PERSUE_AXEMAN")]
+ public float MaxDistToRunPersueAxeman { get; set; }
+
+ [JsonPropertyName("MAX_DIST_TO_PERSUE_AXEMAN")]
+ public float MaxDistToPersueAxeman { get; set; }
+
+ [JsonPropertyName("SURGE_KIT_ONLY_SAFE_CONTAINER")]
+ public bool SurgeKitOnlySafeContainer { get; set; }
+
+ [JsonPropertyName("CAN_USE_LONG_COVER_POINTS")]
+ public bool CanUseLongCoverPoints { get; set; }
+
+ [JsonPropertyName("CAN_USE_FOOD_DRINK")]
+ public bool CanUseFoodDrink { get; set; }
+
+ [JsonPropertyName("FOOD_DRINK_DELAY_SEC")]
+ public float FoodDrinkDelaySec { get; set; }
+
+ [JsonPropertyName("HOW_WORK_OVER_DEAD_BODY")]
+ public int HowWorkOverDeadBody { get; set; }
+
+ [JsonPropertyName("DEADBODYWORK_INITIAL_DELAY")]
+ public float DeadbodyworkInitialDelay { get; set; }
+
+ [JsonPropertyName("DEADBODYWORK_CHECK_ITEMS_DELAY")]
+ public float DeadbodyworkCheckItemsDelay { get; set; }
+
+ [JsonPropertyName("DEADBODYWORK_MOVE_ITEMS_DELAY")]
+ public float DeadbodyworkMoveItemsDelay { get; set; }
+
+ [JsonPropertyName("DEADBODYWORK_DROP_ITEMS_DELAY")]
+ public float DeadbodyworkDropItemsDelay { get; set; }
+
+ [JsonPropertyName("CAN_TALK")]
+ public bool CanTalk { get; set; }
+
+ [JsonPropertyName("ACTIVE_FORCE_ATTACK_EVENTS")]
+ public bool ActiveForceAttackEvents { get; set; }
+
+ [JsonPropertyName("ACTIVE_FOLLOW_PLAYER_EVENTS")]
+ public bool ActiveFollowPlayerEvents { get; set; }
+
+ [JsonPropertyName("MAY_BE_CALLED_FOR_HELP")]
+ public bool MayBeCalledForHelp { get; set; }
+
+ [JsonPropertyName("GIFTER_ADDITIONAL_GIFTS")]
+ public int GifterAdditionalGifts { get; set; }
+
+ [JsonPropertyName("ANGLE_TO_SHOOT_BTR")]
+ public float AngleToShootBtr { get; set; }
+
+ [JsonPropertyName("ROTATION_SPEED_BTR")]
+ public float RotationSpeedBtr { get; set; }
+
+ [JsonPropertyName("IGNORE_ANOTHER_BOTS_BEING_HIT")]
+ public bool IgnoreAnotherBotsBeingHit { get; set; }
+
+ [JsonPropertyName("AVOID_BTR_RADIUS_SQR")]
+ public float AvoidBtrRadiusSqr { get; set; }
+
+ [JsonPropertyName("SNIPER_FIRE_IMMUNE")]
+ public bool SniperFireImmune { get; set; }
+
+ [JsonPropertyName("USE_ADD_TO_ENEMY_VALIDATION")]
+ public bool UseAddToEnemyValidation { get; set; }
+
+ [JsonPropertyName("VALID_REASONS_TO_ADD_ENEMY")]
+ public EBotEnemyCause[] ValidReasonsToAddEnemy { get; set; }
+
+ [JsonPropertyName("CHECK_MARK_OF_UNKNOWS")]
+ public bool CheckMarkOfUnknows { get; set; }
+
+ [JsonPropertyName("SDIST_TO_DELIVER_INFO_WHEN_ENEMY")]
+ public float SdistToDeliverInfoWhenEnemy { get; set; }
+
+ [JsonPropertyName("TRIPWIRE_INERT_TIME")]
+ public int TripwireInertTime { get; set; }
+
+ [JsonPropertyName("IGNORE_TRAP")]
+ public bool IgnoreTrap { get; set; }
+
+ [JsonPropertyName("CHANCE_TO_IGNORE_TRIPWIRE")]
+ public float ChanceToIgnoreTripwire { get; set; }
+
+ [JsonPropertyName("CHACE_TO_DEACTIVATE")]
+ public float ChaceToDeactivate { get; set; }
+
+ [JsonPropertyName("REACT_ADD_DRUNK_ENEMY")]
+ public bool ReactAddDrunkEnemy { get; set; }
+
+ [JsonPropertyName("DIST_TO_HIDE_ASSAULT")]
+ public float DistToHideAssault { get; set; }
+
+ [JsonPropertyName("KEEP_ZONE_ON_SPAWN_TIME_SEC")]
+ public float KeepZoneOnSpawnTimeSec { get; set; }
+
+ [JsonPropertyName("IGNORE_DANGER_PLACES")]
+ public bool IgnoreDangerPlaces { get; set; }
+
+ [JsonPropertyName("PUSH_AND_SUPPRESS_HIDE")]
+ public float PushAndSuppressHide { get; set; }
+
+ [JsonPropertyName("PUSH_AND_SUPPRESS_PUSH")]
+ public float PushAndSuppressPush { get; set; }
+
+ [JsonPropertyName("AGGRESSOR_LOYALTY_BONUS")]
+ public float AggressorLoyaltyBonus { get; set; }
+
+ public enum EWarnBehaviour
+ {
+ Neutral,
+ Warn,
+ AlwaysEnemies,
+ }
+
+ public enum EBotEnemyCause
+ {
+ PlayerKilledBot,
+ PlayerShotAtBot,
+ PlayerInRestrictedArea,
+ PlayerTrespassingBossZone,
+ }
+}
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsMoveSettings.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsMoveSettings.cs
new file mode 100644
index 00000000..0cc7f997
--- /dev/null
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsMoveSettings.cs
@@ -0,0 +1,111 @@
+using System.Text.Json.Serialization;
+
+namespace SPTarkov.Server.Core.Models.Eft.Bot.GlobalSettings;
+
+public record BotGlobalsMoveSettings
+{
+ [JsonPropertyName("BASE_ROTATE_SPEED")]
+ public float BaseRotateSpeed { get; set; }
+
+ [JsonPropertyName("REACH_DIST")]
+ public float ReachDistance { get; set; }
+
+ [JsonPropertyName("REACH_DIST_RUN")]
+ public float ReachDistanceRun { get; set; }
+
+ [JsonPropertyName("START_SLOW_DIST")]
+ public float StartSlowDistance { get; set; }
+
+ [JsonPropertyName("BASESTART_SLOW_DIST")]
+ public float BaseStartSlowDistance { get; set; }
+
+ [JsonPropertyName("SLOW_COEF")]
+ public float SlowCoefficient { get; set; }
+
+ [JsonPropertyName("DIST_TO_CAN_CHANGE_WAY")]
+ public float DistanceToCanChangeWay { get; set; }
+
+ [JsonPropertyName("DIST_TO_START_RAYCAST")]
+ public float DistanceToStartRaycast { get; set; }
+
+ [JsonPropertyName("BASE_START_SERACH")]
+ public float BaseStartSearch { get; set; }
+
+ [JsonPropertyName("UPDATE_TIME_RECAL_WAY")]
+ public float UpdateTimeRecalculateWay { get; set; }
+
+ [JsonPropertyName("FAR_DIST")]
+ public float FarDistance { get; set; }
+
+ [JsonPropertyName("FAR_DIST_SQR")]
+ public float FarDistanceSqr { get; set; }
+
+ [JsonPropertyName("DIST_TO_CAN_CHANGE_WAY_SQR")]
+ public float DistanceToCanChangeWaySqr { get; set; }
+
+ [JsonPropertyName("DIST_TO_START_RAYCAST_SQR")]
+ public float DistanceToStartRaycastSqr { get; set; }
+
+ [JsonPropertyName("BASE_SQRT_START_SERACH")]
+ public float BaseSqrtStartSearch { get; set; }
+
+ [JsonPropertyName("Y_APPROXIMATION")]
+ public float YApproximation { get; set; }
+
+ [JsonPropertyName("DELTA_LAST_SEEN_ENEMY")]
+ public float DeltaLastSeenEnemy { get; set; }
+
+ [JsonPropertyName("REACH_DIST_COVER")]
+ public float ReachDistanceCover { get; set; }
+
+ [JsonPropertyName("RUN_TO_COVER_MIN")]
+ public float RunToCoverMin { get; set; }
+
+ [JsonPropertyName("CHANCE_TO_RUN_IF_NO_AMMO_0_100")]
+ public float ChanceToRunIfNoAmmo { get; set; }
+
+ [JsonPropertyName("RUN_IF_CANT_SHOOT")]
+ public bool RunIfCantShoot { get; set; }
+
+ [JsonPropertyName("RUN_IF_GAOL_FAR_THEN")]
+ public float RunIfGoalFarThen { get; set; }
+
+ [JsonPropertyName("SEC_TO_CHANGE_TO_RUN")]
+ public float SecondsToChangeToRun { get; set; }
+
+ [JsonPropertyName("ETERNITY_STAMINA")]
+ public bool EternityStamina { get; set; }
+
+ [JsonPropertyName("STOP_SPRINT_AT_TREE")]
+ public bool StopSprintAtTree { get; set; }
+
+ [JsonPropertyName("WAIT_DOOR_OPEN_SEC")]
+ public float WaitDoorOpenSeconds { get; set; }
+
+ [JsonPropertyName("BREACH_CHANCE_100")]
+ public float BreachChance { get; set; }
+
+ [JsonPropertyName("FIRST_TURN_SPEED")]
+ public float FirstTurnSpeed { get; set; }
+
+ [JsonPropertyName("FIRST_TURN_BIG_SPEED")]
+ public float FirstTurnBigSpeed { get; set; }
+
+ [JsonPropertyName("TURN_SPEED_ON_SPRINT")]
+ public float TurnSpeedOnSprint { get; set; }
+
+ [JsonPropertyName("NO_ZIG_ZAG")]
+ public bool NoZigZag { get; set; }
+
+ [JsonPropertyName("CAN_SPRINT_GO_TO_SOME_POINT")]
+ public bool CanSprintGoToSomePoint { get; set; }
+
+ [JsonPropertyName("DIST_SPRINT_GO_TO_SOME_POINT")]
+ public float DistanceSprintGoToSomePoint { get; set; }
+
+ [JsonPropertyName("MELEE_ATTACK_ZIG_ZAG")]
+ public bool MeleeAttackZigZag { get; set; }
+
+ [JsonPropertyName("MELEE_ATTACK_OPTIMIZE")]
+ public bool MeleeAttackOptimize { get; set; }
+}
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsScatteringSettings.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsScatteringSettings.cs
new file mode 100644
index 00000000..8805042f
--- /dev/null
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Bot/GlobalSettings/BotGlobalsScatteringSettings.cs
@@ -0,0 +1,99 @@
+using System.Text.Json.Serialization;
+
+namespace SPTarkov.Server.Core.Models.Eft.Bot.GlobalSettings;
+
+public record BotGlobalsScatteringSettings
+{
+ [JsonPropertyName("min_scatter")]
+ public float MinScatter { get; set; }
+
+ [JsonPropertyName("working_scatter")]
+ public float WorkingScatter { get; set; }
+
+ [JsonPropertyName("max_scatter")]
+ public float MaxScatter { get; set; }
+
+ [JsonPropertyName("scatter_speed_up")]
+ public float SpeedUp { get; set; }
+
+ [JsonPropertyName("scatter_speed_up_aim")]
+ public float SpeedUpAim { get; set; }
+
+ [JsonPropertyName("scatter_speed_down")]
+ public float SpeedDown { get; set; }
+
+ [JsonPropertyName("to_slow_bot_speed")]
+ public float ToSlowBotSpeed { get; set; }
+
+ [JsonPropertyName("to_low_bot_speed")]
+ public float ToLowBotSpeed { get; set; }
+
+ [JsonPropertyName("to_up_bot_speed")]
+ public float ToUpBotSpeed { get; set; }
+
+ [JsonPropertyName("moving_slow_coef")]
+ public float MovingSlowCoef { get; set; }
+
+ [JsonPropertyName("to_low_angular_speed")]
+ public float ToLowBotAngularSpeed { get; set; }
+
+ [JsonPropertyName("to_stop_angular_speed")]
+ public float ToStopBotAngularSpeed { get; set; }
+
+ [JsonPropertyName("scatter_from_shot")]
+ public float FromShot { get; set; }
+
+ [JsonPropertyName("tracer_coef")]
+ public float TracerCoef { get; set; }
+
+ [JsonPropertyName("hand_damage_scattering")]
+ public float HandDamageScatteringMinMax { get; set; }
+
+ [JsonPropertyName("hand_damage_accuracy_speed")]
+ public float HandDamageAccuracySpeed { get; set; }
+
+ [JsonPropertyName("blood_fall_coef")]
+ public float BloodFall { get; set; }
+
+ [JsonPropertyName("caution_threshold")]
+ public float Caution { get; set; }
+
+ [JsonPropertyName("to_caution_coef")]
+ public float ToCaution { get; set; }
+
+ [JsonPropertyName("recoil_control_coef_single")]
+ public float RecoilControlCoefShootDone { get; set; }
+
+ [JsonPropertyName("recoil_control_coef_auto")]
+ public float RecoilControlCoefShootDoneAuto { get; set; }
+
+ [JsonPropertyName("amplitude_factor")]
+ public float AmplitudeFactor { get; set; }
+
+ [JsonPropertyName("amplitude_speed")]
+ public float AmplitudeSpeed { get; set; }
+
+ [JsonPropertyName("dist_to_not_aim")]
+ public float DistFromOldPointToNotAim { get; set; }
+
+ [JsonPropertyName("dist_to_not_aim_sqrt")]
+ public float DistFromOldPointToNotAimSqrt { get; set; }
+
+ [JsonPropertyName("min_dist_to_shoot")]
+ public float DistNotToShoot { get; set; }
+
+ [JsonPropertyName("pose_change_coef")]
+ public float PoseChangeCoef { get; set; }
+
+ [JsonPropertyName("lay_factor")]
+ public float LayFactor { get; set; }
+
+ [JsonPropertyName("recoil_y_coef")]
+ public float RecoilYCoef { get; set; }
+
+ [JsonPropertyName("recoil_y_speed_down")]
+ public float RecoilYCoefSpeedDown { get; set; }
+
+ [JsonPropertyName("recoil_y_max")]
+ public float RecoilYMax { get; set; }
+}
diff --git a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotType.cs b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotType.cs
index a30665f3..bf2cb15b 100644
--- a/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotType.cs
+++ b/Libraries/SPTarkov.Server.Core/Models/Eft/Common/Tables/BotType.cs
@@ -1,6 +1,7 @@
using System.Text.Json;
using System.Text.Json.Serialization;
using SPTarkov.Server.Core.Models.Common;
+using SPTarkov.Server.Core.Models.Eft.Bot.GlobalSettings;
using SPTarkov.Server.Core.Models.Enums;
using SPTarkov.Server.Core.Utils.Json.Converters;
@@ -72,202 +73,38 @@ public record Chances
public Dictionary EquipmentModsChances { get; set; }
}
-/* record removed in favor of Dictionary
- used to be used in:
- Chances.WeaponModsChances
- Chances.EquipmentModsChances
- GenerateWeaponRequest.ModSpawnChances
-public record ModsChances
-{
-
-
- [JsonPropertyName("mod_charge")]
-public double? ModCharge { get; set; }
-
- [JsonPropertyName("mod_bipod")]
-public double? ModBipod { get; set; }
-
- [JsonPropertyName("mod_barrel")]
-public double? ModBarrel { get; set; }
-
- [JsonPropertyName("mod_catch")]
-public double? ModCatch { get; set; }
-
- [JsonPropertyName("mod_gas_block")]
-public double? ModGasBlock { get; set; }
-
- [JsonPropertyName("mod_hammer")]
-public double? ModHammer { get; set; }
-
- [JsonPropertyName("mod_equipment")]
-public double? ModEquipment { get; set; }
-
- [JsonPropertyName("mod_equipment_000")]
-public double? ModEquipment000 { get; set; }
-
- [JsonPropertyName("mod_equipment_001")]
-public double? ModEquipment001 { get; set; }
-
- [JsonPropertyName("mod_equipment_002")]
-public double? ModEquipment002 { get; set; }
-
- [JsonPropertyName("mod_flashlight")]
-public double? ModFlashlight { get; set; }
-
- [JsonPropertyName("mod_foregrip")]
-public double? ModForegrip { get; set; }
-
- [JsonPropertyName("mod_launcher")]
-public double? ModLauncher { get; set; }
-
- [JsonPropertyName("mod_magazine")]
-public double? ModMagazine { get; set; }
-
- [JsonPropertyName("mod_mount")]
-public double? ModMount { get; set; }
-
- [JsonPropertyName("mod_mount_000")]
-public double? ModMount000 { get; set; }
-
- [JsonPropertyName("mod_mount_001")]
-public double? ModMount001 { get; set; }
-
- [JsonPropertyName("mod_muzzle")]
-public double? ModMuzzle { get; set; }
-
- [JsonPropertyName("mod_nvg")]
-public double? ModNvg { get; set; }
-
- [JsonPropertyName("mod_pistol_grip")]
-public double? ModPistolGrip { get; set; }
-
- [JsonPropertyName("mod_reciever")]
-public double? ModReceiver { get; set; }
-
- [JsonPropertyName("mod_scope")]
-public double? ModScope { get; set; }
-
- [JsonPropertyName("mod_scope_000")]
-public double? ModScope000 { get; set; }
-
- [JsonPropertyName("mod_scope_001")]
-public double? ModScope001 { get; set; }
-
- [JsonPropertyName("mod_scope_002")]
-public double? ModScope002 { get; set; }
-
- [JsonPropertyName("mod_scope_003")]
-public double? ModScope003 { get; set; }
-
- [JsonPropertyName("mod_sight_front")]
-public double? ModSightFront { get; set; }
-
- [JsonPropertyName("mod_sight_rear")]
-public double? ModSightRear { get; set; }
-
- [JsonPropertyName("mod_stock")]
-public double? ModStock { get; set; }
-
- [JsonPropertyName("mod_stock_000")]
-public double? ModStock000 { get; set; }
-
- [JsonPropertyName("mod_stock_002")]
-public double? ModStock002 { get; set; }
-
- [JsonPropertyName("mod_stock_akms")]
-public double? ModStockAkms { get; set; }
-
- [JsonPropertyName("mod_tactical")]
-public double? ModTactical { get; set; }
-
- [JsonPropertyName("mod_tactical_000")]
-public double? ModTactical000 { get; set; }
-
- [JsonPropertyName("mod_tactical_001")]
-public double? ModTactical001 { get; set; }
-
- [JsonPropertyName("mod_tactical_002")]
-public double? ModTactical002 { get; set; }
-
- [JsonPropertyName("mod_tactical_2")]
-public double? ModTactical2 { get; set; }
-
- [JsonPropertyName("mod_tactical_003")]
-public double? ModTactical003 { get; set; }
-
- [JsonPropertyName("mod_handguard")]
-public double? ModHandguard { get; set; }
-
- [JsonPropertyName("back_plate")]
-public double? BackPlate { get; set; }
-
- [JsonPropertyName("front_plate")]
-public double? FrontPlate { get; set; }
-
- [JsonPropertyName("left_side_plate")]
-public double? LeftSidePlate { get; set; }
-
- [JsonPropertyName("right_side_plate")]
-public double? RightSidePlate { get; set; }
-
- [JsonPropertyName("mod_mount_002")]
-public double? ModMount002 { get; set; }
-
- [JsonPropertyName("mod_mount_003")]
-public double? ModMount003 { get; set; }
-
- [JsonPropertyName("mod_mount_004")]
-public double? ModMount004 { get; set; }
-
- [JsonPropertyName("mod_mount_005")]
-public double? ModMount005 { get; set; }
-
- [JsonPropertyName("mod_mount_006")]
-public double? ModMount006 { get; set; }
-
- [JsonPropertyName("mod_muzzle_000")]
-public double? ModMuzzle000 { get; set; }
-
- [JsonPropertyName("mod_muzzle_001")]
-public double? ModMuzzle001 { get; set; }
-
- [JsonPropertyName("mod_pistol_grip_akms")]
-public double? ModPistolGripAkms { get; set; }
-
- [JsonPropertyName("mod_pistolgrip")]
-public double? ModPistol_Grip { get; set; }
-}
-*/
-
+///
+/// See BotSettingsComponents in the client, this record should match that
+///
public record DifficultyCategories
{
- public Dictionary? Aiming { get; set; } // TODO: string | number | boolean
+ public required BotGlobalAimingSettings Aiming { get; set; }
- public Dictionary? Boss { get; set; } // TODO: string | number | boolean
+ public required BotGlobalsBossSettings Boss { get; set; }
- public Dictionary? Change { get; set; } // TODO: string | number | boolean
+ public required BotGlobalsChangeSettings Change { get; set; }
- public Dictionary? Core { get; set; } // TODO: string | number | boolean
+ public required BotGlobalCoreSettings Core { get; set; }
- public Dictionary? Cover { get; set; } // TODO: string | number | boolean
+ public required BotGlobalsCoverSettings Cover { get; set; }
- public Dictionary? Grenade { get; set; } // TODO: string | number | boolean
+ public required BotGlobalsGrenadeSettings Grenade { get; set; }
- public Dictionary? Hearing { get; set; } // TODO: string | number | boolean
+ public required BotGlobalsHearingSettings Hearing { get; set; }
- public Dictionary? Lay { get; set; } // TODO: string | number | boolean
+ public required BotGlobalLayData Lay { get; set; }
- public Dictionary? Look { get; set; } // TODO: string | number | boolean
+ public required BotGlobalLookData Look { get; set; }
- public Dictionary? Mind { get; set; } // TODO: string | number | boolean | string[]
+ public required BotGlobalsMindSettings Mind { get; set; }
- public Dictionary? Move { get; set; } // TODO: string | number | boolean
+ public required BotGlobalsMoveSettings Move { get; set; }
- public Dictionary? Patrol { get; set; } // TODO: string | number | boolean
+ public required BotGlobalPatrolSettings Patrol { get; set; }
- public Dictionary? Scattering { get; set; } // TODO: string | number | boolean
+ public required BotGlobalsScatteringSettings Scattering { get; set; }
- public Dictionary? Shoot { get; set; } // TODO: string | number | boolean
+ public required BotGlobalShootData Shoot { get; set; }
}
public record Experience
diff --git a/Libraries/SPTarkov.Server.Core/Services/SeasonalEventService.cs b/Libraries/SPTarkov.Server.Core/Services/SeasonalEventService.cs
index f0234eaf..9ff3125a 100644
--- a/Libraries/SPTarkov.Server.Core/Services/SeasonalEventService.cs
+++ b/Libraries/SPTarkov.Server.Core/Services/SeasonalEventService.cs
@@ -925,24 +925,16 @@ public class SeasonalEventService(
var gifterPatrolValues = gifterBot.BotDifficulty[difficulty].Patrol;
// Read existing value from property
- var existingItems = Enumerable.Empty();
- if (gifterPatrolValues.TryGetValue("ITEMS_TO_DROP", out var jsonElement) && jsonElement.ValueKind == JsonValueKind.String)
- {
- var existingCsv = jsonElement.GetString();
- if (!string.IsNullOrWhiteSpace(existingCsv))
- {
- existingItems = existingCsv.Split(',');
- }
- }
+ var existingItems = string.IsNullOrWhiteSpace(gifterPatrolValues.ItemsToDrop)
+ ? Enumerable.Empty()
+ : gifterPatrolValues.ItemsToDrop.Split(',');
// Merge existing and new tpls we want
var combinedItems = new HashSet(existingItems);
combinedItems.UnionWith(gifterBot.BotInventory.Items.Backpack.Keys.Select(x => x.ToString()));
// Turn set into a comma separated list ready for insertion
- var finalItemsCsv = string.Join(",", combinedItems);
-
- gifterPatrolValues["ITEMS_TO_DROP"] = JsonDocument.Parse($"\"{finalItemsCsv}\"").RootElement.Clone();
+ gifterPatrolValues.ItemsToDrop = string.Join(",", combinedItems);
}
}