From 5ef20c8da2549c23985facc89284098985111771 Mon Sep 17 00:00:00 2001
From: Dev <dev@dev.sp-tarkov.com>
Date: Sat, 22 Jul 2023 10:18:42 +0100
Subject: [PATCH] Update for new bot type

---
 Common.Models/BotType.cs                      |   3 +-
 Common.Models/Output/Output.cs                |  26 +-
 Common/Bot/BotParser.cs                       |  15 +-
 .../easy_marksman_BotGlobalSettings.txt       |   2 +-
 .../hard_marksman_BotGlobalSettings.txt       |   2 +-
 .../impossible_marksman_BotGlobalSettings.txt |   2 +-
 .../normal_arenaFighter_BotGlobalSettings.txt | 479 ++++++++++++++++++
 .../normal_bossZryachiy_BotGlobalSettings.txt |   1 +
 ...mal_followerZryachiy_BotGlobalSettings.txt |   1 +
 .../normal_marksman_BotGlobalSettings.txt     |   2 +-
 Generator/Generator.csproj                    |   7 +
 UniqueTemplates/Extensions/Bot.cs             |  78 ---
 12 files changed, 524 insertions(+), 94 deletions(-)
 create mode 100644 Generator/Assets/normal_arenaFighter_BotGlobalSettings.txt
 delete mode 100644 UniqueTemplates/Extensions/Bot.cs

diff --git a/Common.Models/BotType.cs b/Common.Models/BotType.cs
index 70b7a3b..39bdc1e 100644
--- a/Common.Models/BotType.cs
+++ b/Common.Models/BotType.cs
@@ -30,6 +30,7 @@
         followerbirdeye = 26,
         followerbigpipe = 27,
         bosszryachiy = 28,
-        followerzryachiy = 29
+        followerzryachiy = 29,
+        arenafighterevent = 30
     }
 }
diff --git a/Common.Models/Output/Output.cs b/Common.Models/Output/Output.cs
index 587a75e..20232a8 100644
--- a/Common.Models/Output/Output.cs
+++ b/Common.Models/Output/Output.cs
@@ -215,13 +215,13 @@ public class ItemChances
 {
     public ItemChances()
     {
-        specialItems = new MinMax(0, 1);
-        healing = new MinMax(1, 2);
-        drugs = new MinMax(0, 1);
-        stims = new MinMax(0, 1);
-        looseLoot = new MinMax(0, 3);
-        magazines = new MinMax(2, 4);
-        grenades = new MinMax(0, 5);
+        specialItems = new MinMaxWithWhitelist(0, 1, System.Array.Empty<string>());
+        healing = new MinMaxWithWhitelist(1, 2, System.Array.Empty<string>());
+        drugs = new MinMaxWithWhitelist(0, 1, System.Array.Empty<string>());
+        stims = new MinMaxWithWhitelist(0, 1, System.Array.Empty<string>());
+        looseLoot = new MinMaxWithWhitelist(0, 3, System.Array.Empty<string>());
+        magazines = new MinMaxWithWhitelist(2, 4, System.Array.Empty<string>());
+        grenades = new MinMaxWithWhitelist(0, 5, System.Array.Empty<string>());
     }
 
     public MinMax specialItems { get; set; }
@@ -244,3 +244,15 @@ public class MinMax
     public int min { get; set; }
     public int max { get; set; }
 }
+
+public class MinMaxWithWhitelist : MinMax
+{
+    public MinMaxWithWhitelist(int min, int max, string[] whitelist) : base(min, max)
+    {
+        this.min = min;
+        this.max = max;
+        this.whitelist = whitelist;
+    }
+
+    public string[] whitelist { get; set; }
+}
diff --git a/Common/Bot/BotParser.cs b/Common/Bot/BotParser.cs
index d18d369..ee3b1aa 100644
--- a/Common/Bot/BotParser.cs
+++ b/Common/Bot/BotParser.cs
@@ -29,7 +29,7 @@ public static class BotParser
         {
             MaxDegreeOfParallelism = Environment.ProcessorCount
         };
-        await Parallel.ForEachAsync(botFiles, parallelOptions, async(file, token) =>
+        await Parallel.ForEachAsync(botFiles, parallelOptions, async (file, token) =>
         {
             var splitFilePath = file.Split("\\");
 
@@ -53,7 +53,7 @@ public static class BotParser
                 throw;
             }
 
-            
+
             if (bots == null || bots.Count == 0)
             {
                 Console.WriteLine($"skipping file: {splitFilePath.Last()}. no bots found, ");
@@ -63,6 +63,11 @@ public static class BotParser
             Console.WriteLine($"parsing: {bots.Count} bots in file {splitFilePath.Last()}");
             foreach (var bot in bots)
             {
+                if (bot._id == "6483938c53cc9087c70eae86")
+                {
+                    Console.WriteLine("oh no");
+                }
+
                 if (!botTypes.Contains(bot.Info.Settings.Role.ToLower()))
                 {
                     continue;
@@ -74,8 +79,10 @@ public static class BotParser
                     dupeCount++;
                     continue;
                 }
-
-                parsedBotsDict.Add(bot._id, bot);
+                if (!parsedBotsDict.ContainsKey(bot._id))
+                {
+                    parsedBotsDict.Add(bot._id, bot);
+                }
             }
 
             totalDupeCount += dupeCount;
diff --git a/Generator/Assets/easy_marksman_BotGlobalSettings.txt b/Generator/Assets/easy_marksman_BotGlobalSettings.txt
index abcd208..749e085 100644
--- a/Generator/Assets/easy_marksman_BotGlobalSettings.txt
+++ b/Generator/Assets/easy_marksman_BotGlobalSettings.txt
@@ -342,7 +342,7 @@
     "FRIEND_DEAD_AGR_LOW": -0.2,
     "FRIEND_AGR_KILL": 0.2,
     "LAST_ENEMY_LOOK_TO": 40.0,
-    "CAN_RECEIVE_PLAYER_REQUESTS_SAVAGE": true,
+    "CAN_RECEIVE_PLAYER_REQUESTS_SAVAGE": false,
     "CAN_RECEIVE_PLAYER_REQUESTS_BEAR": false,
     "CAN_RECEIVE_PLAYER_REQUESTS_USEC": false,
     "CAN_USE_MEDS": true,
diff --git a/Generator/Assets/hard_marksman_BotGlobalSettings.txt b/Generator/Assets/hard_marksman_BotGlobalSettings.txt
index 4d4a180..c8b4a06 100644
--- a/Generator/Assets/hard_marksman_BotGlobalSettings.txt
+++ b/Generator/Assets/hard_marksman_BotGlobalSettings.txt
@@ -342,7 +342,7 @@
     "FRIEND_DEAD_AGR_LOW": -0.2,
     "FRIEND_AGR_KILL": 0.2,
     "LAST_ENEMY_LOOK_TO": 40.0,
-    "CAN_RECEIVE_PLAYER_REQUESTS_SAVAGE": true,
+    "CAN_RECEIVE_PLAYER_REQUESTS_SAVAGE": false,
     "CAN_RECEIVE_PLAYER_REQUESTS_BEAR": false,
     "CAN_RECEIVE_PLAYER_REQUESTS_USEC": false,
     "CAN_USE_MEDS": true,
diff --git a/Generator/Assets/impossible_marksman_BotGlobalSettings.txt b/Generator/Assets/impossible_marksman_BotGlobalSettings.txt
index d2223f6..871bc56 100644
--- a/Generator/Assets/impossible_marksman_BotGlobalSettings.txt
+++ b/Generator/Assets/impossible_marksman_BotGlobalSettings.txt
@@ -340,7 +340,7 @@
     "FRIEND_DEAD_AGR_LOW": -0.2,
     "FRIEND_AGR_KILL": 0.2,
     "LAST_ENEMY_LOOK_TO": 40.0,
-    "CAN_RECEIVE_PLAYER_REQUESTS_SAVAGE": true,
+    "CAN_RECEIVE_PLAYER_REQUESTS_SAVAGE": false,
     "CAN_RECEIVE_PLAYER_REQUESTS_BEAR": false,
     "CAN_RECEIVE_PLAYER_REQUESTS_USEC": false,
     "CAN_USE_MEDS": true,
diff --git a/Generator/Assets/normal_arenaFighter_BotGlobalSettings.txt b/Generator/Assets/normal_arenaFighter_BotGlobalSettings.txt
new file mode 100644
index 0000000..7e7af1f
--- /dev/null
+++ b/Generator/Assets/normal_arenaFighter_BotGlobalSettings.txt
@@ -0,0 +1,479 @@
+{
+  "Lay": {
+    "CHECK_SHOOT_WHEN_LAYING": false,
+    "DELTA_LAY_CHECK": 2.0,
+    "DELTA_GETUP": 2.7,
+    "DELTA_AFTER_GETUP": 10.0,
+    "CLEAR_POINTS_OF_SCARE_SEC": 20.0,
+    "MAX_LAY_TIME": 35.0,
+    "DELTA_WANT_LAY_CHECL_SEC": 5.0,
+    "ATTACK_LAY_CHANCE": 25.0,
+    "DIST_TO_COVER_TO_LAY": 3.5,
+    "DIST_TO_COVER_TO_LAY_SQRT": 12.25,
+    "DIST_GRASS_TERRAIN_SQRT": 0.160000011,
+    "DIST_ENEMY_NULL_DANGER_LAY": 15.0,
+    "DIST_ENEMY_NULL_DANGER_LAY_SQRT": 225.0,
+    "DIST_ENEMY_GETUP_LAY": 10.0,
+    "DIST_ENEMY_GETUP_LAY_SQRT": 100.0,
+    "DIST_ENEMY_CAN_LAY": 15.0,
+    "DIST_ENEMY_CAN_LAY_SQRT": 225.0,
+    "LAY_AIM": 0.6,
+    "MIN_CAN_LAY_DIST_SQRT": 121.0,
+    "MIN_CAN_LAY_DIST": 11.0,
+    "MAX_CAN_LAY_DIST_SQRT": 40000.0,
+    "MAX_CAN_LAY_DIST": 200.0,
+    "LAY_CHANCE_DANGER": 40.0,
+    "DAMAGE_TIME_TO_GETUP": 3
+  },
+  "Aiming": {
+    "MAX_AIM_PRECICING": 2.0,
+    "BETTER_PRECICING_COEF": 0.9,
+    "RECALC_DIST": 0.7,
+    "RECALC_SQR_DIST": 0.48999998,
+    "COEF_FROM_COVER": 0.45,
+    "PANIC_COEF": 1.2,
+    "PANIC_ACCURATY_COEF": 1.2,
+    "HARD_AIM": 0.75,
+    "PANIC_TIME": 2.0,
+    "RECALC_MUST_TIME": 3,
+    "DAMAGE_PANIC_TIME": 15.0,
+    "DANGER_UP_POINT": 1.3,
+    "MAX_AIMING_UPGRADE_BY_TIME": 0.25,
+    "DAMAGE_TO_DISCARD_AIM_0_100": 86.0,
+    "MIN_TIME_DISCARD_AIM_SEC": 0.3,
+    "MAX_TIME_DISCARD_AIM_SEC": 0.6,
+    "XZ_COEF": 0.40,
+    "SHOOT_TO_CHANGE_PRIORITY": 5525,
+    "BOTTOM_COEF": 0.1,
+    "FIRST_CONTACT_ADD_SEC": 0.1,
+    "FIRST_CONTACT_ADD_CHANCE_100": 80.0,
+    "BASE_HIT_AFFECTION_DELAY_SEC": 0.57,
+    "BASE_HIT_AFFECTION_MIN_ANG": 4.0,
+    "BASE_HIT_AFFECTION_MAX_ANG": 10.0,
+    "BASE_SHIEF": 0.05,
+    "SCATTERING_HAVE_DAMAGE_COEF": 2.0,
+    "SCATTERING_DIST_MODIF": 0.67,
+    "SCATTERING_DIST_MODIF_CLOSE": 0.6,
+    "AIMING_TYPE": 2,
+    "DIST_TO_SHOOT_TO_CENTER": 3.0,
+    "DIST_TO_SHOOT_NO_OFFSET": 3.0,
+    "SHPERE_FRIENDY_FIRE_SIZE": -0.1,
+    "COEF_IF_MOVE": 1.0,
+    "TIME_COEF_IF_MOVE": 1.1,
+    "BOT_MOVE_IF_DELTA": 3.01,
+    "NEXT_SHOT_MISS_CHANCE_100": 100.0,
+    "NEXT_SHOT_MISS_Y_OFFSET": 1.0,
+    "ANYTIME_LIGHT_WHEN_AIM_100": 10.0,
+    "ANY_PART_SHOOT_TIME": 5.0,
+    "WEAPON_ROOT_OFFSET": 0.35,
+    "MIN_DAMAGE_TO_GET_HIT_AFFETS": 1.0,
+    "MAX_AIM_TIME": 1.5,
+    "OFFSET_RECAL_ANYWAY_TIME": 1.0,
+    "BASE_SHIEF_STATIONARY_GRENADE": 1.1,
+    "XZ_COEF_STATIONARY_GRENADE": 0.8
+  },
+  "Look": {
+    "OLD_TIME_POINT": 11.0,
+    "WAIT_NEW_SENSOR": 2.1,
+    "WAIT_NEW__LOOK_SENSOR": 7.8,
+    "LOOK_AROUND_DELTA": 1.1,
+    "MAX_VISION_GRASS_METERS": 0.8,
+    "MAX_VISION_GRASS_METERS_FLARE": 8.0,
+    "MAX_VISION_GRASS_METERS_OPT": 0.9090909,
+    "MAX_VISION_GRASS_METERS_FLARE_OPT": 0.125,
+    "LightOnVisionDistance": 45.0,
+    "FAR_DISTANCE": 160.0,
+    "FarDeltaTimeSec": 3.0,
+    "MIDDLE_DIST": 90.0,
+    "MiddleDeltaTimeSec": 1.0,
+    "CloseDeltaTimeSec": 0.1,
+    "POSIBLE_VISION_SPACE": 1.2,
+    "GOAL_TO_FULL_DISSAPEAR": 0.2,
+    "GOAL_TO_FULL_DISSAPEAR_SHOOT": 0.03,
+    "BODY_DELTA_TIME_SEARCH_SEC": 1.7,
+    "COME_TO_BODY_DIST": 1.2,
+    "MARKSMAN_VISIBLE_DIST_COEF": 1.15,
+    "VISIBLE_DISNACE_WITH_LIGHT": 100.0,
+    "ENEMY_LIGHT_ADD": 48.0,
+    "ENEMY_LIGHT_START_DIST": 90.0,
+    "CAN_LOOK_TO_WALL": true,
+    "DIST_NOT_TO_IGNORE_WALL": 15.0,
+    "DIST_CHECK_WALL": 20.0,
+    "LOOK_LAST_POSENEMY_IF_NO_DANGER_SEC": 25.0,
+    "MIN_LOOK_AROUD_TIME": 20.0,
+    "OPTIMIZE_TO_ONLY_BODY": true
+  },
+  "Shoot": {
+    "RECOIL_TIME_NORMALIZE": 1.0,
+    "RECOIL_PER_METER": 0.02,
+    "MAX_RECOIL_PER_METER": 0.04,
+    "HORIZONT_RECOIL_COEF": 0.04,
+    "WAIT_NEXT_SINGLE_SHOT": 0.2,
+    "WAIT_NEXT_SINGLE_SHOT_LONG_MAX": 3.3,
+    "WAIT_NEXT_SINGLE_SHOT_LONG_MIN": 0.4,
+    "MARKSMAN_DIST_SEK_COEF": 44.0,
+    "FINGER_HOLD_SINGLE_SHOT": 0.14,
+    "BASE_AUTOMATIC_TIME": 0.2,
+    "AUTOMATIC_FIRE_SCATTERING_COEF": 1.5,
+    "CHANCE_TO_CHANGE_TO_AUTOMATIC_FIRE_100": 94.0,
+    "FAR_DIST_ENEMY": 20.0,
+    "SHOOT_FROM_COVER": 4,
+    "FAR_DIST_ENEMY_SQR": 400.0,
+    "MAX_DIST_COEF": 1.35,
+    "RECOIL_DELTA_PRESS": 0.15,
+    "RUN_DIST_NO_AMMO": 25.0,
+    "RUN_DIST_NO_AMMO_SQRT": 625.0,
+    "CAN_SHOOTS_TIME_TO_AMBUSH": 993,
+    "NOT_TO_SEE_ENEMY_TO_WANT_RELOAD_PERCENT": 0.5,
+    "NOT_TO_SEE_ENEMY_TO_WANT_RELOAD_SEC": 2.0,
+    "RELOAD_PECNET_NO_ENEMY": 0.6,
+    "CHANCE_TO_CHANGE_WEAPON": 80.0,
+    "CHANCE_TO_CHANGE_WEAPON_WITH_HELMET": 40.0,
+    "LOW_DIST_TO_CHANGE_WEAPON": 5.0,
+    "FAR_DIST_TO_CHANGE_WEAPON": 30.0,
+    "SUPPRESS_BY_SHOOT_TIME": 6.0,
+    "SUPPRESS_TRIGGERS_DOWN": 3,
+    "WAIT_NEXT_STATIONARY_GRENADE": 1.0,
+    "FINGER_HOLD_STATIONARY_GRENADE": 0.3,
+    "VALIDATE_MALFUNCTION_CHANCE": 100,
+    "REPAIR_MALFUNCTION_IMMEDIATE_CHANCE": 25,
+    "DELAY_BEFORE_EXAMINE_MALFUNCTION": 0.5,
+    "DELAY_BEFORE_FIX_MALFUNCTION": 0.5
+  },
+  "Move": {
+    "BASE_ROTATE_SPEED": 270.0,
+    "REACH_DIST": 0.5,
+    "REACH_DIST_RUN": 0.8,
+    "START_SLOW_DIST": 1.5,
+    "BASESTART_SLOW_DIST": 1.1,
+    "SLOW_COEF": 7.0,
+    "DIST_TO_CAN_CHANGE_WAY": 8.0,
+    "DIST_TO_START_RAYCAST": 15.0,
+    "BASE_START_SERACH": 35.0,
+    "UPDATE_TIME_RECAL_WAY": 7.0,
+    "FAR_DIST": 4.0,
+    "FAR_DIST_SQR": 16.0,
+    "DIST_TO_CAN_CHANGE_WAY_SQR": 64.0,
+    "DIST_TO_START_RAYCAST_SQR": 225.0,
+    "BASE_SQRT_START_SERACH": 1225.0,
+    "Y_APPROXIMATION": 0.7,
+    "DELTA_LAST_SEEN_ENEMY": 20.0,
+    "REACH_DIST_COVER": 2.0,
+    "RUN_TO_COVER_MIN": 2.0,
+    "CHANCE_TO_RUN_IF_NO_AMMO_0_100": 100.0,
+    "RUN_IF_CANT_SHOOT": false,
+    "RUN_IF_GAOL_FAR_THEN": 10.0,
+    "SEC_TO_CHANGE_TO_RUN": 3.0
+  },
+  "Grenade": {
+    "DELTA_NEXT_ATTEMPT_FROM_COVER": 5.0,
+    "DELTA_NEXT_ATTEMPT": 10.0,
+    "MIN_DIST_NOT_TO_THROW": 8.0,
+    "NEAR_DELTA_THROW_TIME_SEC": 2.0,
+    "MIN_THROW_GRENADE_DIST": 12.0,
+    "MIN_THROW_GRENADE_DIST_SQRT": 144.0,
+    "MIN_DIST_NOT_TO_THROW_SQR": 64.0,
+    "RUN_AWAY": 22.0,
+    "RUN_AWAY_SQR": 484.0,
+    "ADD_GRENADE_AS_DANGER": 65.0,
+    "ADD_GRENADE_AS_DANGER_SQR": 4225.0,
+    "CHANCE_TO_NOTIFY_ENEMY_GR_100": 100.0,
+    "GrenadePerMeter": 0.15,
+    "REQUEST_DIST_MUST_THROW_SQRT": 9.0,
+    "REQUEST_DIST_MUST_THROW": 3.0,
+    "BEWARE_TYPE": 2,
+    "SHOOT_TO_SMOKE_CHANCE_100": 50.0,
+    "CHANCE_RUN_FLASHED_100": 100.0,
+    "MAX_FLASHED_DIST_TO_SHOOT": 10.0,
+    "MAX_FLASHED_DIST_TO_SHOOT_SQRT": 100.0,
+    "FLASH_GRENADE_TIME_COEF": 0.25,
+    "SIZE_SPOTTED_COEF": 2.0,
+    "BE_ATTENTION_COEF": 4.0,
+    "TIME_SHOOT_TO_FLASH": 4.0,
+    "CLOSE_TO_SMOKE_TO_SHOOT": 10.0,
+    "CLOSE_TO_SMOKE_TO_SHOOT_SQRT": 100.0,
+    "CLOSE_TO_SMOKE_TIME_DELTA": 5.0,
+    "SMOKE_CHECK_DELTA": 1.0,
+    "DELTA_GRENADE_START_TIME": 0.01,
+    "AMBUSH_IF_SMOKE_IN_ZONE_100": 40.0,
+    "AMBUSH_IF_SMOKE_RETURN_TO_ATTACK_SEC": 30.0,
+    "NO_RUN_FROM_AI_GRENADES": true,
+	"MIN_THROW_DIST_PERCENT_0_1": 0.7,
+    "MAX_THROW_POWER": 18.7,
+    "GrenadePrecision": 0.1,
+    "STOP_WHEN_THROW_GRENADE": true,
+    "WAIT_TIME_TURN_AWAY": 0.2,
+    "SMOKE_SUPPRESS_DELTA": 20.0,
+    "DAMAGE_GRENADE_SUPPRESS_DELTA": 8.0,
+    "STUN_SUPPRESS_DELTA": 9.0,
+    "CHEAT_START_GRENADE_PLACE": false,
+    "CAN_THROW_STRAIGHT_CONTACT": true,
+    "STRAIGHT_CONTACT_DELTA_SEC": -1.0,
+    "ANG_TYPE": 4
+  },
+  "Change": {
+    "SMOKE_VISION_DIST": 0.6,
+    "SMOKE_GAIN_SIGHT": 1.6,
+    "SMOKE_SCATTERING": 1.6,
+    "SMOKE_PRECICING": 1.6,
+    "SMOKE_HEARING": 1.0,
+    "SMOKE_ACCURATY": 1.6,
+    "SMOKE_LAY_CHANCE": 1.6,
+    "FLASH_VISION_DIST": 0.05,
+    "FLASH_GAIN_SIGHT": 1.8,
+    "FLASH_SCATTERING": 1.6,
+    "FLASH_PRECICING": 1.6,
+    "FLASH_HEARING": 1.0,
+    "FLASH_ACCURATY": 1.6,
+    "FLASH_LAY_CHANCE": 1.0,
+    "STUN_HEARING": 0.01
+  },
+  "Cover": {
+    "RETURN_TO_ATTACK_AFTER_AMBUSH_MIN": 20.0,
+    "RETURN_TO_ATTACK_AFTER_AMBUSH_MAX": 50.0,
+    "SOUND_TO_GET_SPOTTED": 2.0,
+    "TIME_TO_MOVE_TO_COVER": 15.0,
+    "MAX_DIST_OF_COVER": 4.0,
+    "CHANGE_RUN_TO_COVER_SEC": 5.0,
+    "CHANGE_RUN_TO_COVER_SEC_GREANDE": 0.6,
+    "MIN_DIST_TO_ENEMY": 9.0,
+    "DIST_CANT_CHANGE_WAY": 5.0,
+    "DIST_CHECK_SFETY": 9.0,
+    "TIME_CHECK_SAFE": 2.0,
+    "HIDE_TO_COVER_TIME": 1.5,
+    "MAX_DIST_OF_COVER_SQR": 16.0,
+    "DIST_CANT_CHANGE_WAY_SQR": 25.0,
+    "SPOTTED_COVERS_RADIUS": 2.5,
+    "LOOK_LAST_ENEMY_POS_MOVING": 1.5,
+    "LOOK_TO_HIT_POINT_IF_LAST_ENEMY": 3.0,
+    "LOOK_LAST_ENEMY_POS_LOOKAROUND": 45.0,
+    "OFFSET_LOOK_ALONG_WALL_ANG": 20,
+    "SPOTTED_GRENADE_RADIUS": 16.0,
+    "MAX_SPOTTED_TIME_SEC": 55.0,
+    "WAIT_INT_COVER_FINDING_ENEMY": 2.0,
+    "CLOSE_DIST_POINT_SQRT": 4.0,
+    "DELTA_SEEN_FROM_COVE_LAST_POS": 15.0,
+    "MOVE_TO_COVER_WHEN_TARGET": false,
+    "RUN_COVER_IF_CAN_AND_NO_ENEMIES": false,
+    "SPOTTED_GRENADE_TIME": 7.0,
+    "DEPENDS_Y_DIST_TO_BOT": false,
+    "RUN_IF_FAR": 15.0,
+    "RUN_IF_FAR_SQRT": 225.0,
+    "STAY_IF_FAR": 25.0,
+    "STAY_IF_FAR_SQRT": 625.0,
+    "CHECK_COVER_ENEMY_LOOK": false,
+    "SHOOT_NEAR_TO_LEAVE": 2,
+    "SHOOT_NEAR_SEC_PERIOD": 0.5,
+    "HITS_TO_LEAVE_COVER": 1,
+    "HITS_TO_LEAVE_COVER_UNKNOWN": 1,
+    "DOG_FIGHT_AFTER_LEAVE": 4.0,
+    "NOT_LOOK_AT_WALL_IS_DANGER": true,
+    "MIN_DEFENCE_LEVEL": 5.0,
+    "GOOD_DIST_TO_POINT_COEF": 9999.0,
+    "ENEMY_DIST_TO_GO_OUT": 1.0,
+	"STATIONARY_WEAPON_NO_ENEMY_GETUP": 15.0,
+	"STATIONARY_WEAPON_MAX_DIST_TO_USE": 25
+  },
+  "Patrol": {
+    "LOOK_TIME_BASE": 12.0,
+    "RESERVE_TIME_STAY": 72.0,
+    "FRIEND_SEARCH_SEC": 12.0,
+    "TALK_DELAY": 1.1,
+    "MIN_TALK_DELAY": 35.0,
+    "TALK_DELAY_BIG": 45.1,
+    "CHANGE_WAY_TIME": 325.1,
+    "MIN_DIST_TO_CLOSE_TALK": 5.0,
+    "VISION_DIST_COEF_PEACE": 0.75,
+    "MIN_DIST_TO_CLOSE_TALK_SQR": 25.0,
+    "CHANCE_TO_CUT_WAY_0_100": 75.0,
+    "CUT_WAY_MIN_0_1": 0.4,
+    "CUT_WAY_MAX_0_1": 0.65,
+    "CHANCE_TO_CHANGE_WAY_0_100": 30.0,
+    "CHANCE_TO_SHOOT_DEADBODY": 52,
+    "SUSPETION_PLACE_LIFETIME": 7.0,
+    "RESERVE_OUT_TIME": 60.0,
+    "CLOSE_TO_SELECT_RESERV_WAY": 25.0,
+    "MAX_YDIST_TO_START_WARN_REQUEST_TO_REQUESTER": 5.0,
+    "CAN_CHECK_MAGAZINE": false,
+    "CAN_WATCH_SECOND_WEAPON": true
+  },
+  "Hearing": {
+    "BOT_CLOSE_PANIC_DIST": 1.0,
+    "CHANCE_TO_HEAR_SIMPLE_SOUND_0_1": 0.88,
+    "DISPERSION_COEF": 10.0,
+    "CLOSE_DIST": 26.0,
+    "FAR_DIST": 56.0,
+    "SOUND_DIR_DEEFREE": 30.0,
+    "DIST_PLACE_TO_FIND_POINT": 70.0,
+    "DEAD_BODY_SOUND_RAD": 30.0,
+    "LOOK_ONLY_DANGER": false,
+    "RESET_TIMER_DIST": 17.0,
+    "HEAR_DELAY_WHEN_PEACE": 0.0,
+    "HEAR_DELAY_WHEN_HAVE_SMT": 0.0,
+    "LOOK_ONLY_DANGER_DELTA": 9.0
+  },
+  "Mind": {
+    "MIN_SHOOTS_TIME": 2,
+    "MAX_SHOOTS_TIME": 4,
+    "TIME_TO_RUN_TO_COVER_CAUSE_SHOOT_SEC": 15.0,
+    "DAMAGE_REDUCTION_TIME_SEC": 20.0,
+    "MIN_DAMAGE_SCARE": 20.0,
+    "CHANCE_TO_RUN_CAUSE_DAMAGE_0_100": 35.0,
+    "TIME_TO_FORGOR_ABOUT_ENEMY_SEC": 52.0,
+    "TIME_TO_FIND_ENEMY": 22.0,
+    "MAX_AGGRO_BOT_DIST": 100.0,
+    "HIT_POINT_DETECTION": 4.0,
+    "DANGER_POINT_CHOOSE_COEF": 1.0,
+    "SIMPLE_POINT_CHOOSE_COEF": 0.4,
+    "LASTSEEN_POINT_CHOOSE_COEF": 0.2,
+    "COVER_DIST_COEF": 1.5,
+    "DIST_TO_FOUND_SQRT": 400.0,
+    "MAX_AGGRO_BOT_DIST_SQR": 10000.0,
+    "DIST_TO_STOP_RUN_ENEMY": 15.0,
+    "ENEMY_LOOK_AT_ME_ANG": 15.0,
+    "MIN_START_AGGRESION_COEF": 1.0,
+    "MAX_START_AGGRESION_COEF": 3.0,
+    "BULLET_FEEL_DIST": 360.0,
+    "BULLET_FEEL_CLOSE_SDIST": 1.0,
+    "ATTACK_IMMEDIATLY_CHANCE_0_100": 40.0,
+    "CHANCE_FUCK_YOU_ON_CONTACT_100": 0.01,
+    "FRIEND_DEAD_AGR_LOW": -0.2,
+    "FRIEND_AGR_KILL": 0.2,
+    "LAST_ENEMY_LOOK_TO": 40.0,
+    "CAN_RECEIVE_PLAYER_REQUESTS_SAVAGE": false,
+    "CAN_RECEIVE_PLAYER_REQUESTS_BEAR": false,
+    "CAN_RECEIVE_PLAYER_REQUESTS_USEC": false,
+    "CAN_USE_MEDS": true,
+    "SUSPETION_POINT_CHANCE_ADD100": 0.0,
+    "AMBUSH_WHEN_UNDER_FIRE": true,
+    "AMBUSH_WHEN_UNDER_FIRE_TIME_RESIST": 60.0,
+    "ATTACK_ENEMY_IF_PROTECT_DELTA_LAST_TIME_SEEN": 1.5,
+    "HOLD_IF_PROTECT_DELTA_LAST_TIME_SEEN": 8.5,
+    "FIND_COVER_TO_GET_POSITION_WITH_SHOOT": 2.0,
+    "PROTECT_TIME_REAL": true,
+    "CHANCE_SHOOT_WHEN_WARN_PLAYER_100": 25.0,
+    "CAN_PANIC_IS_PROTECT": false,
+    "NO_RUN_AWAY_FOR_SAFE": true,
+    "PART_PERCENT_TO_HEAL": 0.65,
+    "PROTECT_DELTA_HEAL_SEC": 10.0,
+    "CAN_STAND_BY": false,
+    "CAN_THROW_REQUESTS": true,
+    "GROUP_ANY_PHRASE_DELAY": 5.0,
+    "GROUP_EXACTLY_PHRASE_DELAY": 20.0,
+    "DIST_TO_ENEMY_YO_CAN_HEAL": 30.0,
+    "CHANCE_TO_STAY_WHEN_WARN_PLAYER_100": 80.0,
+    "DOG_FIGHT_OUT": 6.0,
+    "DOG_FIGHT_IN": 3.0,
+    "SHOOT_INSTEAD_DOG_FIGHT": 9.0,
+    "PISTOL_SHOTGUN_AMBUSH_DIST": 30.0,
+    "STANDART_AMBUSH_DIST": 100.0,
+    "AI_POWER_COEF": 120.0,
+    "COVER_SECONDS_AFTER_LOSE_VISION": 10.0,
+    "COVER_SELF_ALWAYS_IF_DAMAGED": false,
+    "SEC_TO_MORE_DIST_TO_RUN": 10.0,
+    "HEAL_DELAY_SEC": 5.0,
+    "AGGRESSOR_LOYALTY_BONUS": 0.0,
+    "HIT_DELAY_WHEN_HAVE_SMT": -1.0,
+    "HIT_DELAY_WHEN_PEACE": -1.0,
+    "TALK_WITH_QUERY": true,
+    "DEFAULT_SAVAGE_BEHAVIOUR": "Warn",
+    "DEFAULT_BEAR_BEHAVIOUR": "Attack",
+    "DEFAULT_USEC_BEHAVIOUR": "Attack",
+    "FRIENDLY_BOT_TYPES": [],
+    "WARN_BOT_TYPES": ["assault"],
+    "ENEMY_BOT_TYPES": [],
+    "REVENGE_BOT_TYPES": ["pmcBot", "gifter"],
+    "REVENGE_FOR_SAVAGE_PLAYERS": false
+  },
+  "Boss": {
+    "BOSS_DIST_TO_WARNING": 25.0,
+    "BOSS_DIST_TO_WARNING_SQRT": 625.0,
+    "BOSS_DIST_TO_WARNING_OUT": 30.0,
+    "BOSS_DIST_TO_WARNING_OUT_SQRT": 900.0,
+    "BOSS_DIST_TO_SHOOT": 7.0,
+    "BOSS_DIST_TO_SHOOT_SQRT": 49.0,
+    "CHANCE_TO_SEND_GRENADE_100": 100.0,
+    "MAX_DIST_COVER_BOSS": 65.0,
+    "MAX_DIST_COVER_BOSS_SQRT": 4225.0,
+    "MAX_DIST_DECIDER_TO_SEND": 35.0,
+    "MAX_DIST_DECIDER_TO_SEND_SQRT": 1225.0,
+    "TIME_AFTER_LOSE": 15.0,
+    "TIME_AFTER_LOSE_DELTA": 60.0,
+    "PERSONS_SEND": 2,
+    "DELTA_SEARCH_TIME": 18.0,
+    "COVER_TO_SEND": true,
+    "WAIT_NO_ATTACK_SAVAGE": 10.0,
+    "CHANCE_USE_RESERVE_PATROL_100": 30.0,
+    "KILLA_Y_DELTA_TO_BE_ENEMY_BOSS": 5.0,
+    "KILLA_DITANCE_TO_BE_ENEMY_BOSS": 45.0,
+    "KILLA_START_SEARCH_SEC": 40.0,
+    "KILLA_CONTUTION_TIME": 5.0,
+    "KILLA_CLOSE_ATTACK_DIST": 8.0,
+    "KILLA_MIDDLE_ATTACK_DIST": 22.0,
+    "KILLA_LARGE_ATTACK_DIST": 41.0,
+    "KILLA_SEARCH_METERS": 30.0,
+    "KILLA_DEF_DIST_SQRT": 225.0,
+    "KILLA_SEARCH_SEC_STOP_AFTER_COMING": 25.0,
+    "KILLA_DIST_TO_GO_TO_SUPPRESS": 6.0,
+    "KILLA_AFTER_GRENADE_SUPPRESS_DELAY": 2.0,
+    "KILLA_CLOSEATTACK_TIMES": 3,
+    "KILLA_CLOSEATTACK_DELAY": 10.0,
+    "KILLA_HOLD_DELAY": 5.0,
+    "KILLA_BULLET_TO_RELOAD": 15,
+    "SHALL_WARN": true,
+    "KILLA_ENEMIES_TO_ATTACK": 3,
+    "KILLA_ONE_IS_CLOSE": 30.0,
+    "KILLA_TRIGGER_DOWN_DELAY": 1.0,
+    "KILLA_WAIT_IN_COVER_COEF": 1.0
+  },
+  "Core": {
+    "VisibleAngle": 160.0,
+    "VisibleDistance": 142.0,
+    "GainSightCoef": 0.1,
+    "ScatteringPerMeter": 0.045,
+    "ScatteringClosePerMeter": 0.12,
+    "DamageCoeff": 1.0,
+    "HearingSense": 2.9,
+    "CanRun": true,
+    "CanGrenade": true,
+    "AimingType": "normal",
+    "PistolFireDistancePref": 35.0,
+    "ShotgunFireDistancePref": 50.0,
+    "RifleFireDistancePref": 100.0,
+    "AccuratySpeed": 0.2,
+    "WaitInCoverBetweenShotsSec": 0.3
+  },
+  "Scattering": {
+    "MinScatter": 0.03,
+    "WorkingScatter": 0.15,
+    "MaxScatter": 0.4,
+    "SpeedUp": 0.3,
+    "SpeedUpAim": 1.4,
+    "SpeedDown": -0.3,
+    "ToSlowBotSpeed": 1.5,
+    "ToLowBotSpeed": 2.4,
+    "ToUpBotSpeed": 3.6,
+    "MovingSlowCoef": 1.5,
+    "ToLowBotAngularSpeed": 80.0,
+    "ToStopBotAngularSpeed": 40.0,
+    "FromShot": 0.001,
+    "TracerCoef": 1.3,
+    "HandDamageScatteringMinMax": 0.7,
+    "HandDamageAccuracySpeed": 1.3,
+    "BloodFall": 1.45,
+    "Caution": 0.3,
+    "ToCaution": 0.6,
+    "RecoilControlCoefShootDone": 0.0003,
+    "RecoilControlCoefShootDoneAuto": 0.00015,
+    "AMPLITUDE_FACTOR": 0.25,
+    "AMPLITUDE_SPEED": 0.1,
+    "DIST_FROM_OLD_POINT_TO_NOT_AIM": 15.0,
+    "DIST_FROM_OLD_POINT_TO_NOT_AIM_SQRT": 225.0,
+    "DIST_NOT_TO_SHOOT": 0.3,
+    "PoseChnageCoef": 0.1,
+    "LayFactor": 0.1,
+    "RecoilYCoef": 0.0005,
+    "RecoilYCoefSppedDown": -0.52,
+    "RecoilYMax": 1.0
+  }
+}
\ No newline at end of file
diff --git a/Generator/Assets/normal_bossZryachiy_BotGlobalSettings.txt b/Generator/Assets/normal_bossZryachiy_BotGlobalSettings.txt
index ea756f1..87c1bae 100644
--- a/Generator/Assets/normal_bossZryachiy_BotGlobalSettings.txt
+++ b/Generator/Assets/normal_bossZryachiy_BotGlobalSettings.txt
@@ -111,6 +111,7 @@
   },
   "Shoot": {
     "RECOIL_TIME_NORMALIZE": 1.0,
+    "NO_OFFSET_SHOOTING_FROM_PLAYER": true,
     "RECOIL_PER_METER": 0.01,
     "MAX_RECOIL_PER_METER": 0.02,
     "HORIZONT_RECOIL_COEF": 0.02,
diff --git a/Generator/Assets/normal_followerZryachiy_BotGlobalSettings.txt b/Generator/Assets/normal_followerZryachiy_BotGlobalSettings.txt
index 24fe5c5..e4927a0 100644
--- a/Generator/Assets/normal_followerZryachiy_BotGlobalSettings.txt
+++ b/Generator/Assets/normal_followerZryachiy_BotGlobalSettings.txt
@@ -112,6 +112,7 @@
   "Shoot": {
     "RECOIL_TIME_NORMALIZE": 1.0,
     "RECOIL_PER_METER": 0.02,
+    "NO_OFFSET_SHOOTING_FROM_PLAYER": true,
     "MAX_RECOIL_PER_METER": 0.04,
     "HORIZONT_RECOIL_COEF": 0.04,
     "WAIT_NEXT_SINGLE_SHOT": 0.2,
diff --git a/Generator/Assets/normal_marksman_BotGlobalSettings.txt b/Generator/Assets/normal_marksman_BotGlobalSettings.txt
index 5c0d369..bbeaf23 100644
--- a/Generator/Assets/normal_marksman_BotGlobalSettings.txt
+++ b/Generator/Assets/normal_marksman_BotGlobalSettings.txt
@@ -342,7 +342,7 @@
     "FRIEND_DEAD_AGR_LOW": -0.2,
     "FRIEND_AGR_KILL": 0.2,
     "LAST_ENEMY_LOOK_TO": 40.0,
-    "CAN_RECEIVE_PLAYER_REQUESTS_SAVAGE": true,
+    "CAN_RECEIVE_PLAYER_REQUESTS_SAVAGE": false,
     "CAN_RECEIVE_PLAYER_REQUESTS_BEAR": false,
     "CAN_RECEIVE_PLAYER_REQUESTS_USEC": false,
     "CAN_USE_MEDS": true,
diff --git a/Generator/Generator.csproj b/Generator/Generator.csproj
index 0f41044..26596bd 100644
--- a/Generator/Generator.csproj
+++ b/Generator/Generator.csproj
@@ -16,6 +16,7 @@
     <None Remove="Assets\impossible_assault_BotGlobalSettings.txt" />
     <None Remove="Assets\impossible_cursedAssault_BotGlobalSettings.txt" />
     <None Remove="Assets\impossible_marksman_BotGlobalSettings.txt" />
+    <None Remove="Assets\normal_arenaFighterEvent_BotGlobalSettings.txt" />
     <None Remove="Assets\normal_assault_BotGlobalSettings.txt" />
     <None Remove="Assets\normal_bossBully_BotGlobalSettings.txt" />
     <None Remove="Assets\normal_bossGluhar_BotGlobalSettings.txt" />
@@ -174,4 +175,10 @@
     <Folder Include="Models\" />
   </ItemGroup>
 
+  <ItemGroup>
+    <Page Include="Assets\normal_arenaFighterEvent_BotGlobalSettings.txt">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </Page>
+  </ItemGroup>
+
 </Project>
diff --git a/UniqueTemplates/Extensions/Bot.cs b/UniqueTemplates/Extensions/Bot.cs
deleted file mode 100644
index 43301e1..0000000
--- a/UniqueTemplates/Extensions/Bot.cs
+++ /dev/null
@@ -1,78 +0,0 @@
-using Common.Models.Input;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace UniqueTemplates.Extensions
-{
-    public static class BotExtensions
-    {
-        public static bool ContainsBot(this List<Datum> list, Datum botToCheck)
-        {
-            foreach (var bot in list)
-            {
-                var botGear = GetEquippedGear(bot);
-                if (botGear.CheckMatch(botToCheck.GetEquippedGear()))
-                {
-                    return true;
-                }
-            }
-
-            return false;
-        }
-
-        public static EquippedGear GetEquippedGear(this Datum bot)
-        {
-            return new EquippedGear
-            {
-                ArmorVest = GeEquipmentItemTemplateIdOrNull(bot.Inventory.items, "ArmorVest"),
-                Backpack = GeEquipmentItemTemplateIdOrNull(bot.Inventory.items, "Backpack"),
-                Eyewear = GeEquipmentItemTemplateIdOrNull(bot.Inventory.items, "Eyewear"),
-                FaceCover = GeEquipmentItemTemplateIdOrNull(bot.Inventory.items, "FaceCover"),
-                FirstPrimaryWeapon = GeEquipmentItemTemplateIdOrNull(bot.Inventory.items, "FirstPrimaryWeapon"),
-                Headwear = GeEquipmentItemTemplateIdOrNull(bot.Inventory.items, "Headwear"),
-                Scabbard = GeEquipmentItemTemplateIdOrNull(bot.Inventory.items, "Scabbard"),
-                TacticalVest = GeEquipmentItemTemplateIdOrNull(bot.Inventory.items, "TacticalVest"),
-            };
-        }
-
-        private static string GeEquipmentItemTemplateIdOrNull(List<Item> inventoryItems, string itemTypeWanted)
-        {
-            var item = inventoryItems.FirstOrDefault(x => x.slotId == itemTypeWanted);
-            if (item == null)
-            {
-                return null;
-            }
-
-            return item._tpl;
-        }
-
-        public class EquippedGear
-        {
-            public string FirstPrimaryWeapon { get; set; }
-            public string TacticalVest { get; set; }
-            public string Headwear { get; set; }
-            public string Scabbard { get; set; }
-            public string Backpack { get; set; }
-            public string ArmorVest { get; set; }
-            public string FaceCover { get; set; }
-            public string Eyewear { get; set; }
-
-            public bool CheckMatch(EquippedGear gearToCheck)
-            {
-                if (gearToCheck.FirstPrimaryWeapon == FirstPrimaryWeapon
-                    && gearToCheck.TacticalVest == TacticalVest
-                    && gearToCheck.Headwear == Headwear
-                    && gearToCheck.Scabbard == Scabbard
-                    && gearToCheck.Backpack == Backpack
-                    && gearToCheck.ArmorVest == ArmorVest
-                    && gearToCheck.FaceCover == FaceCover
-                    && gearToCheck.Eyewear == Eyewear)
-                {
-                    return true;
-                }
-
-                return false;
-            }
-        }
-    }
-}