From 1881a0842a91f3e3d65d264e2d3fcbfb9dc2083d Mon Sep 17 00:00:00 2001 From: micyael Date: Tue, 23 Apr 2024 10:15:29 +0000 Subject: [PATCH 01/15] Fixed incorrect handbook price using CustomItemService (!301) The handbookPriceRoubles member of base class NewItemDetails was never used to create the new item. Co-authored-by: Refringe Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/301 Co-authored-by: micyael Co-committed-by: micyael --- .gitea/workflows/clear-itemdb-cache.yaml | 21 +++++++++++++++++++ project/src/services/mod/CustomItemService.ts | 4 ++-- 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 .gitea/workflows/clear-itemdb-cache.yaml diff --git a/.gitea/workflows/clear-itemdb-cache.yaml b/.gitea/workflows/clear-itemdb-cache.yaml new file mode 100644 index 00000000..8783caa3 --- /dev/null +++ b/.gitea/workflows/clear-itemdb-cache.yaml @@ -0,0 +1,21 @@ +name: Clear Item DB Website Cache + +on: + push: + branches: [ master ] + +jobs: + clear-cache: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - id: filter + uses: dorny/paths-filter@v3.0.2 + with: + list-files: shell + filters: | + database: + - 'project/assets/database/**' + - name: Send Refresh Request + if: steps.filter.outputs.database == 'true' + run: curl --max-time 30 https://db.sp-tarkov.com/api/refresh diff --git a/project/src/services/mod/CustomItemService.ts b/project/src/services/mod/CustomItemService.ts index 2f5954d5..5018a0d9 100644 --- a/project/src/services/mod/CustomItemService.ts +++ b/project/src/services/mod/CustomItemService.ts @@ -72,7 +72,7 @@ export class CustomItemService this.addToItemsDb(newItemId, itemClone); - this.addToHandbookDb(newItemId, newItemDetails.handbookParentId, newItemDetails.fleaPriceRoubles); + this.addToHandbookDb(newItemId, newItemDetails.handbookParentId, newItemDetails.handbookPriceRoubles); this.addToLocaleDbs(newItemDetails.locales, newItemId); @@ -116,7 +116,7 @@ export class CustomItemService this.addToItemsDb(newItem._id, newItem); - this.addToHandbookDb(newItem._id, newItemDetails.handbookParentId, newItemDetails.fleaPriceRoubles); + this.addToHandbookDb(newItem._id, newItemDetails.handbookParentId, newItemDetails.handbookPriceRoubles); this.addToLocaleDbs(newItemDetails.locales, newItem._id); From 9862336645a86b25d81e5cff916834653a5f75ab Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 23 Apr 2024 11:16:28 +0100 Subject: [PATCH 02/15] Remove file added by mistake --- .gitea/workflows/clear-itemdb-cache.yaml | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 .gitea/workflows/clear-itemdb-cache.yaml diff --git a/.gitea/workflows/clear-itemdb-cache.yaml b/.gitea/workflows/clear-itemdb-cache.yaml deleted file mode 100644 index 8783caa3..00000000 --- a/.gitea/workflows/clear-itemdb-cache.yaml +++ /dev/null @@ -1,21 +0,0 @@ -name: Clear Item DB Website Cache - -on: - push: - branches: [ master ] - -jobs: - clear-cache: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - id: filter - uses: dorny/paths-filter@v3.0.2 - with: - list-files: shell - filters: | - database: - - 'project/assets/database/**' - - name: Send Refresh Request - if: steps.filter.outputs.database == 'true' - run: curl --max-time 30 https://db.sp-tarkov.com/api/refresh From 522306b9b15632990d588b25e7876318b815a511 Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 23 Apr 2024 17:08:20 +0100 Subject: [PATCH 03/15] Fixed error message inside `isModCompatible()` not showing the name of a mod correctly --- project/src/loaders/PreAkiModLoader.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/src/loaders/PreAkiModLoader.ts b/project/src/loaders/PreAkiModLoader.ts index df9ffc74..6d6f56d8 100644 --- a/project/src/loaders/PreAkiModLoader.ts +++ b/project/src/loaders/PreAkiModLoader.ts @@ -617,7 +617,7 @@ export class PreAkiModLoader implements IModLoader this.logger.error( this.localisationService.getText("modloader-incompatible_mod_found", { author: mod.author, - modName: mod.name, + name: mod.name, incompatibleModName: incompatibleModName, }), ); From 8761462acdec62c18d6c14040a756c56858f7a94 Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 23 Apr 2024 17:14:21 +0100 Subject: [PATCH 04/15] Update server locales with data from crowdin --- .../assets/database/locales/server/ar.json | 43 +++++- .../assets/database/locales/server/da.json | 2 + .../assets/database/locales/server/hu.json | 124 ++++++++++++++++++ .../assets/database/locales/server/ko.json | 21 ++- .../assets/database/locales/server/zh-TW.json | 1 + 5 files changed, 189 insertions(+), 2 deletions(-) diff --git a/project/assets/database/locales/server/ar.json b/project/assets/database/locales/server/ar.json index e2ebc1a5..61c03c56 100644 --- a/project/assets/database/locales/server/ar.json +++ b/project/assets/database/locales/server/ar.json @@ -40,6 +40,7 @@ "bot-unable_to_find_spawn_limits_fallback_to_defaults": "تعذر العثور على حدود الظهور للدور: %s، يتم الرجوع إلى القيم الافتراضية\n\n\n\n\n\n\n", "bot-unable_to_get_bot_difficulty_fallback_to_assault": "تعذر العثور على البوت: {{botType}} صعوبة {{difficulty}}، يتم استخدام صعوبة الهجوم كبديل\n\n\n\n\n\n\n", "bot-unable_to_get_bot_fallback_to_assault": "تعذر العثور على روبوت: %s JSON، يتم استخدام بوت الهجوم كبديل\n\n\n\n\n\n\n", + "bot-weapon_contains_invalid_item": "مرفق السلاح المطلوبة: '{{modSlot}}' على سلاح: {{weaponTpl}} لديه عنصر غير صالح: {{modName}}", "bot-weapon_generated_incorrect_using_default": "تم إنشاء السلاح %s بشكل غير صحيح، يتم الرجوع إلى إعداد السلاح، انظر الخطأ أعلاه.\n\n\n\n\n\n\n", "bot-weapon_missing_magazine_or_chamber": "السلاح بالنمط: {{weaponId}} لا يحتوي على مخزن أو حجرة - {{botRole}}\n\n\n\n\n\n\n", "bot-weapon_missing_mod_slot": "الفتحة: {{modSlot}} لا توجد للسلاح: {{weaponId}} {{weaponName}} على {{botRole}}\n\n\n\n\n\n\n", @@ -51,6 +52,7 @@ "bot-unable_to_find_bot_in_cache": "تعذر العثور على الروبوت في الذاكرة التخزين المؤقتة بالاسم: %s\n\n\n\n\n\n\n", "bot-missing_application_context": "لا يمكن لـ applicationContext العثور على قيمة %s. هل قمت بإعادة تشغيل الخادم دون إعادة تشغيل اللعبة؟\n\n\n\n\n\n\n", "client_request": "[طلب السيرفر] %s\n\n\n\n\n\n\n", + "client_request_ip": "[طلب الجهاز] {{ip}} {{url}}", "customisation-item_already_purchased": "تم شراء العنصر الخاص بالملابس {{itemId}} {{itemName}} بالفعل.\n\n\n\n\n\n\n", "customisation-unable_to_find_suit_by_id": "تعذر العثور على عرض لبيع ملابس التاجر بالرقم: %s\n\n\n\n\n\n\n", "customisation-unable_to_find_clothing_item_in_inventory": "لم يتم العثور على عنصر الملابس في المخزون بالرقم: %s\n\n\n\n\n\n\n", @@ -112,6 +114,9 @@ "location-spawn_point_count_requested_vs_found": "{{requested}} تم طلب مناطق الانتشار بينما {{found}} متوفرة {{mapName}}", "location-unable_to_reparent_item": "فشل إنشاء العنصر() ، غير قادر على إعادة الربط مع الاصل {{tpl}}، معرف الاصل: {{parentId}}", "location-unable_to_find_airdrop_drop_config_of_type": "غير قادر على العثور على إعدادات ضبط إسقاط الطائرة للنوع: %s، العودة إلى نوع الإسقاط: مختلط ", + "location-unable_to_fix_broken_waves_missing_base": "%s هو json أساسي مفقود، نحن نتجنب إصلاح إصلاح موجة الخريطة إصلاحات", + "location-missing_dynamic_template": "لا تحتوي نقطة التكاثر الديناميكية المختارة %s على قالب، تخطي", + "location-spawnpoint_missing_items": "نقطة التكاثر الديناميكية المختارة %s لا تحتوي على عناصر، تخطي", "loot-item_missing_parentid": "العنصر: %s يفتقد قيمة parentId، لا يمكن استخدام العنصر كغنيمة.\n\n\n\n\n\n\n", "loot-non_item_picked_as_sealed_weapon_crate_reward": "سلاح غير صالح: %s، تم اختياره كمكافأة لصندوق السلاح المختوم، تعذر إنشاء الغنيمة.\n\n\n\n\n\n\n", "mailsend-missing_trader": "تعذر إرسال رسالة من النوع: {{messageType}} إلى اللاعب: {{sessionId}}، نظرًا لأن التاجر المحدد كان فارغًا.\n\n\n\n\n\n\n", @@ -160,16 +165,27 @@ "player-attempt_to_increment_skill_with_negative_value": "غير قادر على زيادة المهارة: %s بمقدار سلبي", "port_already_in_use": "المنفذ %s قيد الاستخدام مسبقا، تحقق مما إذا كان الخادم قيد التشغيل بالفعل", "profile_saved": "تم حفظ تغييرات الملف الشخصي %s", + "profile_save_callback_error": "خطأ أثناء تنفيذ: onBeforeSaveCallback: {{callback}}, {{error}}", "profile-unable_to_find_profile_by_id_cannot_delete": "غير قادر على حذف الملف الشخصي بالمعرف: %s، لا يوجد ملف تعريف له", + "quest-compare_operator_unhandled": "لم يتم التعامل مع عامل التشغيل %s بشكل افتراضي [loyaltyRequirementCheck()]", + "quest-item_not_found_in_inventory": "العنصر الذي يحتوي على %s غير موجود في المخزون [changeItemStack()]", "quest-no_skill_found": "لم يتم العثور على المهارة %s", "quest-handover_wrong_item": "غير قادر على تسليم العنصر للمهمة {{questId}}، التسليم المتوقع: {{requiredTpl}} ولكن تم تسليمه: {{handedInTpl}}", "quest-reward_type_not_handled": "نوع مكافأة المهمة: {{rewardType}} لم يتم التعامل معه من أجل المهمة: {{questId}} بالاسم: {{questName}}", "quest-unable_to_find_compare_condition": "طريقة مقارنة غير معروفة: %s", + "quest-unable_to_find_matching_hideout_production": "غير قادر على العثور على مخطط مطابق للمهمة: {{questName}}، تم العثور على عدد: {{matchCount}}", "ragfair-invalid_player_offer_request": "غير قادر على تقديم العرض، الطلب غير صالح", "ragfair-missing_barter_scheme": "فشلت محاولة توليد عرض للتجار في السوق السوداء في العثور على مخطط مقايضة لمعرف العنصر: {{itemId}} tpl: {{tpl}} على {{name}}", + "ragfair-no_trader_assorts_cant_generate_flea_offers": "غير قادر على إنشاء عروض مزاد للتاجر %s، لم يتم العثور على تشكيلة", + "ragfair-offer_not_found_in_profile": "لم نتمكن من العثور على عرض بمعرف: {{offerId}} في الملف الشخصي لإزالته", "ragfair-offer_not_found_in_profile_short": "العرض غير موجود في الملف الشخصي", + "ragfair-offer_not_found_unable_to_hide": "معرف العرض: %s غير موجود، غير قادر على إخفاء العرض", "ragfair-unable_to_find_item_in_inventory": "غير قادر على العثور على العنصر بالمعرف: {{id}} في المخزون", + "ragfair-unable_to_find_offer_to_remove": "لم نتمكن من العثور على العرض وإزالته بالمعرف: %s", + "ragfair-unable_to_find_requested_items_in_inventory": "يتعذر علينا العثور على أي عناصر مطلوبة في المخزون", + "ragfair-unable_to_pay_commission_fee": "غير قادر على دفع رسوم العمولة:%s روبل", "ragfair-offer_no_longer_exists": "العرض لم يعد متوفرًا", + "ragfair-unable_to_purchase_0_count_item": "يتعذر علينا شراء العنصر: %s بعدد 0", "ragfair-unable_to_place_offer_with_no_requirements": "غير قادر على وضع عرض دون متطلبات", "ragfair-unable_to_find_locale_by_key": "تعذر العثور على لغة EFT بالمفتاح: %s", "route_onupdate_no_response": "عند التحديث: الطريق %s لا يبلغ عن النجاح أو الفشل", @@ -191,6 +207,8 @@ "server_start_meme_10": "جاري تشغيل عملية التعدين على هذه الحاسبة... وداعاً كارت الشاشة", "server_start_meme_12": "نحن نحاول الوصول إليك حول ضمان سيارتك الموسع", "server_start_meme_13": "ඞ ... مريب", + "server_start_meme_22": "تحسّن", + "server_start_meme_23": "SPT يحافظ على سلامة عذريتك منذ عام 2018", "server_start_success": "نتمنى لك لعباً سعيداً", "server_start_player_active_botreload_skill": "شخصيتك لديها مهارة 'BotReload' نشطة، سيؤدي هذا إلى إعادة تلقيم الأسلحة بسرعة غير طبيعية، تجاهل هذه الرسالة إن كانت مقصودة", "started_webserver_success": "بدأ خادم الويب في %s", @@ -231,5 +249,28 @@ "pmcresponse-victim_positive_19": "معركة جيدة", "pmcresponse-victim_positive_20": "أنت لاعب تصعب هزيمته", "pmcresponse-victim_positive_21": "عمل رائع، كانت هذه غدرة جميلة", - "pmcresponse-victim_positive_22": "كان يجب أن أكون أكثر حذراً، عمل جيد" + "pmcresponse-victim_positive_22": "كان يجب أن أكون أكثر حذراً، عمل جيد", + "pmcresponse-victim_positive_23": "لقد كنت متسرعًا للغاية، كان يجب أن أحيط وانتظر", + "pmcresponse-victim_positive_24": "سأتعلم من هذا، أحسنت", + "pmcresponse-victim_positive_25": "اللعنة، ظننت أنني أصبتك", + "pmcresponse-victim_positive_26": "كفو", + "pmcresponse-victim_positive_27": "كفو يالذيب", + "pmcresponse-victim_negative_6": "بكم الهاك؟", + "pmcresponse-victim_negative_7": ":(", + "pmcresponse-victim_negative_10": "كنت بعيد عن الكمبيوتر!!", + "pmcresponse-victim_negative_11": "بلغت عليك يا غشاش", + "pmcresponse-victim_negative_12": "بس جبتني عشان اللاق", + "pmcresponse-victim_negative_13": "لازم العب SPT عشان ابعد نفسي من غشاشين زيك", + "pmcresponse-victim_negative_14": "لو كنت أعرف الخريطة بشكل أفضل لكنت فزت", + "pmcresponse-victim_negative_15": "كامبر حيوان ثاني", + "pmcresponse-victim_negative_16": "لو كانت معركة عادلة كنت سأفوز", + "pmcresponse-victim_negative_17": "أتمنى أن تبيع أرباحك للتاجر الخطأ", + "pmcresponse-victim_negative_18": "آمل أن تسجل أرباحك في المزاد بسعر خاطئ", + "pmcresponse-victim_negative_19": "1 مقابل 1، يا مهووس سأفوز", + "pmcresponse-victim_negative_20": "تعطل مسدسي وإلا كنت قتلتك", + "pmcresponse-victim_negative_21": "يا فار", + "pmcresponse-victim_negative_22": "أنت تختبئ في الزاوية مثل الفار", + "pmcresponse-victim_negative_23": "أتمنى أن ترتطم إصبع قدمك بقطعة أثاث", + "pmcresponse-victim_negative_24": "لماذا قتلتني، سأخبر أمي", + "pmcresponse-victim_negative_25": "سأخبر الآدمن عليك" } diff --git a/project/assets/database/locales/server/da.json b/project/assets/database/locales/server/da.json index 2e89e913..394ce34e 100644 --- a/project/assets/database/locales/server/da.json +++ b/project/assets/database/locales/server/da.json @@ -41,6 +41,8 @@ "bot-unable_to_get_bot_fallback_to_assault": "Kan ikke finde bot: %s JSON, ved hjælp af angreb bot som tilbagefald", "bot-weapon_generated_incorrect_using_default": "Våben %s blev genereret forkert, og faldt tilbage til forudindstillede våben se fejl ovenfor", "bot-weapon_missing_magazine_or_chamber": "Våben med tpl: {{weaponId}} har ingen magasin eller kammer - {{botRole}}", + "bot-unable_to_find_loot_n_value_for_bot": "Kunne ikke lokalisere loot N værdi for bot: %s, udnytter scav n værdi istedet", + "event-unhandled_event": "[UHÅNDTERET EVENT]%s", "executing_startup_callbacks": "Server: udførelse af opstartstilbagekald...", "gameevent-bot_not_found": "addEventGearToScavs() - kan ikke finde bot af typen %s i databasen, spring over", "gameevent-no_gear_data": "Ingen geardata i sæsonhændelser.json config til begivenhed %s", diff --git a/project/assets/database/locales/server/hu.json b/project/assets/database/locales/server/hu.json index 77e0fc8e..e6043be4 100644 --- a/project/assets/database/locales/server/hu.json +++ b/project/assets/database/locales/server/hu.json @@ -32,15 +32,115 @@ "bot-single_bot_generation_not_found_in_cache": "Bot: %s hiányzik a gyorsítótárban, terem új, ez okozhat \njátszma lemaradást", "bot-unable_to_add_mod_item_invalid": "Módosítás: {{itemName}} nem érvényes, Nem adható a réshez: '{{modSlot}}' a \ntárgyon: {{parentItemName}}, kihagyjuk", "bot-unable_to_add_mods_to_weapon_missing_ammo_slot": "Nem lehet adni módosítást a fegyverhez: {{weaponName}} {{weaponId}} mert hiányzik szabad hej, töltény, vagy vegyverkamra - {{botRole}}", + "bot-unable_to_filter_mod_slot_all_blacklisted": "Nem lehet dinamikusan szűrt fegyvertartozék-állományt létrehozni, mert a tiltólista kiszűrte az összes tartozékot a következő helyre: %s, lista figyelmen kívül hagyása és az állomány újragenerálása", + "bot-unable_to_filter_mods_all_blacklisted": "Nem lehet szűrni a modokat a következő helyhez: {{slotName}} a {{itemName}}-n, mivel minden elem tiltólistára került, tiltólista figyelmen kívül hagyása", "bot-unable_to_find_ammo_item": "Nem található lőszer sablon a tpl: %s", "bot-unable_to_find_default_magazine_item": "Hiányzik fegyvertár sablon: %s az adatbázisban", "bot-unable_to_find_magazine_item": "Hiányzik fegyvertár sablon: %s az adatbázisban", "bot-unable_to_find_spawn_limits_fallback_to_defaults": "Hiányzik spaw határ a szerepnek: %s, fisszaesik az alap beállítás", "bot-unable_to_get_bot_difficulty_fallback_to_assault": "Hiányzó Bot typus: {{botType}} nehézség szint {{difficulty}}, Visszaesik Assault nehézségre", "bot-unable_to_get_bot_fallback_to_assault": "Hiányzó Bot: %s JSON, Visszaállítas az Assault Bot tipusra", + "bot-weapon_contains_invalid_item": "Szükséges hely: '{{modSlot}}' a fegyveren: {{weaponTpl}}} érvénytelen elemmel rendelkezik: {{modName}}", + "bot-weapon_generated_incorrect_using_default": "A fegyver %s hibásan lett generálva, visszaáll az előre beállított fegyverre. Lásd a fenti hibaüzenetet", + "bot-weapon_missing_magazine_or_chamber": "Fegyver tpl: {{weaponId}} nincs tár vagy kamra - {{botRole}}", + "bot-weapon_missing_mod_slot": "Slot: {{modSlot}}' nem létezik a fegyverhez: {{weaponId}} {{weaponName}} on {{botRole}}", + "bot-weapons_required_slot_missing_item": "A(z) {{modName}} {{slotId}} szükséges '{{modSlot}}' helye üres volt a következőn: {{botRole}}", + "bot-item_missing_props_property": "A tárgy {{itemTpl}} {{name}} elemnek hiányzik a _props tulajdonsága", + "bot-unable_to_fill_camora_slot_mod_pool_empty": "{{weaponId}} - {{weaponName}} számára nem lehet betölteni a fegyverkamra slotokat. A modtár üres volt, dinamikus generálás megpróbálása", + "bot-unable_to_edit_limits_of_unknown_map": "Nem lehet szerkeszteni a következő térkép bot-korlátait: %s, mert nem található", + "bot-unable_to_find_loot_n_value_for_bot": "Nem sikerült megtalálni a loot N értéket a bothoz: %s, helyette scav n érték használva", + "bot-unable_to_find_bot_in_cache": "Nem sikerült megtalálni a botot a gyorsítótárban a következő névvel: %s", + "bot-missing_application_context": "applicationContext nem találta %s értéket. Újraindítottad a szervert a játék újraindítása nélkül?", + "client_request": "[Kliens kérés] %s", + "client_request_ip": "[Kliens kérés] {{ip}} {{url}}", "customisation-item_already_purchased": "Öltözet {{itemId}} {{itemName}} már megvásárolt", + "customisation-unable_to_find_suit_by_id": "Nem található ajánlat a következő azonosítóval: %s", "customisation-unable_to_find_clothing_item_in_inventory": "Öltözet darab hiányzik a leltárban: %s", + "dialog-missing_item_template": "Nem található a tpl {{tpl}} elem az adatbázisban, nem lehet {{type}} típusú üzenetet küldeni, kihagyva", + "event-unhandled_event": "[KEZELETLEN ESEMÉNY] %s", + "executing_startup_callbacks": "Kiszolgáló: indítási visszahívások végrehajtása...", + "fence-unable_to_find_assort_by_id": "Nem található meg Fence választéka a következő azonosítóhoz: %s", + "fixer-mod_item_found": "Elem: %s megtalálható a profilban, de nem létezik az items db-ben. Hibaüzeneteket fogsz kapni, ez azért lehet, mert egy modolt tárgyat használtál, és eltávolítottad a modot anélkül, hogy törölted volna a készletedből azokat. NE HASZNÁLD EZT A PROFILT. Nyisd meg az Aki_Data\\Server\\configs\\core.json-t, szerkeszd a 'removeModItemsFromProfile' beállítást igaz értékre. Ez lehetővé teszi a szerver számára, hogy módosítsd a profilod és remélhetőleg eltávolítsd a hibás elemeket", + "fixer-updated_pockets": "Frissített 'pocket' tárgy az új, 18876-os verzióra, amely x3 speciális slotot tartalmaz", + "gameevent-bot_not_found": "addEventGearToScavs() - nem találja a %s típusú botot az adatbázisban, kihagyás", + "gameevent-no_gear_data": "A seasonalevents.json konfigban nincsenek felszerelés adatok a következő eseményhez %s", + "hideout-missing_recipe_for_area": "Nem talált receptet: %s a terület típusához", + "hideout-missing_recipe_in_db": "Nem sikerült megtalálni a receptet a következőkkel _id: %s", "hideout-no_bitcoins_to_collect": "Nincs elvitelre kész bitcoin", + "hideout-unable_to_find_area": "Nem sikerült megtalálni a rejtekhelyet: %s a profilban", + "hideout-unable_to_find_area_in_database": "Nem sikerült megtalálni a következő területet: %s az adatbázisban", + "hideout-unable_to_find_item_in_inventory": "Nem sikerült megtalálni a %s azonosítóval rendelkező elemet a készletben", + "hideout-unable_to_find_item_to_remove_from_area": "Nem talál semmilyen objektumot, amelyet el lehetne távolítani a következő területen lévő helyről: %s", + "hideout-unable_to_find_production_in_profile_by_recipie_id": "Nem található a gyártási recept azonosítója %s a profilban", + "hideout-unable_to_find_scav_case_recipie_in_database": "Failed to find Scav Case recipe with id: %s in database", + "hideout-unable_to_find_scavcase_requested_item_in_profile_inventory": "Nem található a ScavCase által kért elem: %s", + "hideout-unhandled_remove_item_from_area_request": "Kezeletlen kísérlet egy tárgy eltávolítására a rejtekhely területéről: %s", + "http-unknown_error": "Ismeretlen hiba történt", + "health-healing_item_not_found": "Nem található meg a gyógyító tárgy %s a játékos készletében", + "health-unable_to_find_item_to_consume": "Nem található meg a fogyasztható tárgy %s a játékos készletében", + "importing_database": "Adatbázis importálása...", + "importing_database_finish": "Az adatbázis importálása befejeződött", + "validation_not_found": "A checks.dat fájl nem található. A fájl érvényesítése kihagyva.", + "validation_error_decode": "Nem sikerült dekódolni a checks.dat fájlt. Fájl hitelesítése kihagyva.", + "validation_error_file": "A következő fájl érvényesítés sikertelen volt %s", + "validation_error_exception": "Kivétel keletkezett a fájl ellenőrzése közben: %s", + "importing_spt_configs": "Konfigurációk importálása...", + "inraid-missing_standing_for_kill": "Hírnév a gyilkossághoz nem található meg {{victimSide}}:{{victimRole}} számára", + "insurance-missing_insurance_price_multiplier": "Nincs biztosítási szorzót a kereskedőhöz: %s, ellenőrizd, hogy létezik-e az InsuranceConfig.js fájlban, most visszaáll az alapértelmezett értékre: 0.3", + "inventory-edit_trader_item": "Nem lehet szerkeszteni egy kereskedő tárgyát", + "inventory-examine_item_does_not_exist": "examineItem() - Nincs találat az %s azonosítóra", + "inventory-fill_container_failed": "fillContainerMapWithItem() hibával tért vissza %s", + "inventory-invalid_item_missing_from_db": "Elem: %s nem kérhető le az adatbázisból", + "inventory-invalid_move_to_container": "Megkísérelt egy tárgyat áthelyezni slot id: {{slotId}} helyről a következő helyre {{container}}, a profil sérülése megelőzésre került", + "inventory-no_stash_space": "Nincs elég hely a tárolóban", + "inventory-unable_to_fill_container": "[OOB] a tételhez: {{id}}; Hibaüzenet: {{error}}", + "inventory-unable_to_find_item": "getExaminedItemTpl() Nem lehet megtalálni a következő elemet tpl: %s adatbázisban vagy a piacon", + "inventory-unable_to_find_stash": "Nincs rejtekhely találva", + "inventory-return_default_size": "A %s elem alapértelmezett 1x1-es méretre állítása", + "inventory-item_missing_props_property": "Tárgy tpl: {{itemTpl}} név: {{itemName}} hiányzik egy props tulajdonság, a méret nem szerezhető meg hozzá", + "inventory-get_item_size_item_not_found_by_tpl": "getSizeByInventoryItemHash() Tárgy tpl: %s nem található", + "inventory-item_to_toggle_missing_upd": "Készlet tárgy, _id: %s, hiányol egy upd elemet, hozzáadás", + "inventory-unable_to_toggle_item_not_found": "A következő azonosítójú készletelemet nem lehet váltani: %s, a tétel nem található", + "inventory-missing_stash_size": "Nem lehet meghatározni a készlet méretét, mivel nincs készlet a játékos leltárában", + "inventory-stash_not_found": "Nem sikerült megtalálni a %s rejtekhelyet a db-ben", + "item-durability_value_invalid_use_default": "getRepairableItemQualityValue() fegyver tpl: %s tartóssági érték érvénytelen, visszaállítás alapértelmezett értékre: 1", + "linux_use_priviledged_port_non_root": "A nem gyökér folyamatok nem tudnak 1024 alatti portokhoz kötődni", + "location-containers_generated_success": "Összesen %s statikus konténer generálva", + "location-critical_error_see_log": "Kritikus hiba történt a zsákmány generálásakor, lásd a szervernaplót a részletekért", + "location-dynamic_items_spawned_success": "Összesen %s dinamikus tárgy létrehozva", + "location-generated_success": "Létrehozott hely %s", + "location-missing_root_item": "createItem() sikertelen, root item is null, tpl: {{tpl}}, parentId: {{parentId}}", + "location-preset_not_found": "előbeállítás nem található a következőhöz: {{tpl}}, defaultPreset: {{defaultId}} name: {{defaultName}}, parentId: {{parentId}}", + "location-spawn_point_count_requested_vs_found": "{{requested}} spawn pont lett kérve, míg {{found}} található {{mapName}}", + "location-unable_to_reparent_item": "createItem() sikertelen, nem lehet újra hozzárendelni {{tpl}}, parentId: {{parentId}}", + "location-unable_to_find_airdrop_drop_config_of_type": "Nem sikerült megtalálni az airdrop konfigurációs beállításait a következő típushoz: %s, visszaállítás a következő típusra: változó ", + "location-unable_to_fix_broken_waves_missing_base": "A %s fájlból hiányzik a base json, a map wave javítások kihagyása", + "location-missing_dynamic_template": "A kiválasztott dinamikus spawn pont %s nem rendelkezik sablonnal, kihagyás", + "location-spawnpoint_missing_items": "A választott dinamikus spawn pont %s nem tartalmaz tárgyakat, kihagyásra kerül", + "loot-item_missing_parentid": "Tárgy: %s nem rendelkezik parentId értékkel, nem lehet zsákmányként használni", + "loot-non_item_picked_as_sealed_weapon_crate_reward": "Érvénytelen fegyver: %s, mint jutalom lett kiválasztva a lezárt fegyverládához, nem lehet zsákmányt létrehozni", + "mailsend-missing_trader": "Nem lehet üzenettípust küldeni: {{messageType}} a játékosnak: {{sessionId}}, a megadott kereskedő enum értéke null volt", + "mailsend-missing_npc_dialog": "Nem sikerült üzenetet küldeni a %s címről. Nem létező párbeszédpanel", + "mailsend-missing_parent": "Nem találok egy elemet slotId-vel: rejtekhely az üzenetnek: {{traderId}} feladó: {{sender}}", + "mod-send_bundle_url": "[CSOMAG]: %s", + "modloader-checked": "ellenőrizve", + "modloader-checking_mod": "ellenőrzés: %s", + "modloader-cyclic_dependency": "Ciklikus függőséget észleltünk. Ezt a hibát javítani kell. A szerver nem tud elindulni amíg ez meg nem történik, és le fog állni", + "modloader-load_order_conflict": "`{{modOneName}}` és`{{modTwoName}}` modoknak ellentmondásos betöltési sorrend követelményei vannak, a szerver nem tud elindulni amíg ezt nem javítják, és leáll", + "modloader-dependency_container_not_initalized": "A dependency container lekérve, de nincs inicializálva", + "modloader-error_parsing_mod_load_order": "Hiba a mod betöltési sorrendjének elemzésekor", + "modloader-incompatibilities_not_string_array": "A Mod %s package.json „incompatibilities” tulajdonságának karakterlánc tömbnek kell lennie", + "modloader-incompatible_mod_found": "{{author}}-{{name}} mod nem kompatibilis a következővel: {{incompatibleModName}}", + "modloader-invalid_akiversion_field": "A mod %s érvénytelen semver karakterláncot tartalmaz az akiVersion mezőben. Példák az érvényes értékekre: https://github.com/npm/node-semver#versions", + "modloader-invalid_version_property": "A(z) %s mod package.json fájlja érvénytelen verziójú karakterláncot tartalmaz", + "modloader-not_correct_mod_folder": "A mods mappában létezik egy (%s) nevű mappa. Helytelenül telepítettél egy modot. Lehet, hogy egy mod tartalmát tévedésből közvetlenül a mod mappába csomagoltad. A modok helyes telepítésével kapcsolatban lásd a webhelyek GYIK-jét és a mod oldalát hogyan kell azt helyesen telepíteni", + "modloader-is_client_mod": "A következő mod (%s) egy kliens mod és a következő mappába kell helyezni: /spt/bepinex/plugins", + "modloader-installing_external_dependencies": "A segédprogramok telepítése a következőhö modhoz: {{name}}, {{author}} által készítve", + "modloader-installing_external_dependencies_disabled": "A(z) {{name}} mod, melyet {{author}} készített, külső függőségeket igényel, de ez a funkció jelenleg ki van kapcsolva. Lépj a(z) \"{{configPath}}\" helyre, állítsd a(z) \"{{configOption}}\" értékét igazra (true), és indítsd újra a szervert.\nEnnek engedélyezésével elfogadod minden felelősséget amiért a(z) {{name}} letölt a gépedre.", + "modloader-skipped_mod": "A következő mod betöltésének kihagyása: {{mod}}", + "modloader-loaded_mod": "Mod: {{name}} verzió: {{version}} by: {{author}} betöltve", + "modloader-loading_mods": "ModLoader: %s szervermodok betöltése...", + "modloader-main_property_not_js": "A mod %s package.json fő tulajdonsága egy .js fájl kell legyen", "modloader-main_property_points_to_nothing": "A %s mod package.json fő tulajdonsága egy nem létező fájlra mutat", "modloader-missing_akiversion_field": "%s modnak hiányzik az akiVersion mezője, valószínűleg azért, mert elavult és nem kompatibilis az AKI jelenlegi verziójával", "modloader-missing_dependency": "{{mod}} mod a következőnek a telepítését igényli {{modDependency}}.", @@ -68,10 +168,34 @@ "profile_save_callback_error": "Hiba az onBeforeSaveCallback végrehajtása közben: {{callback}}, {{error}}", "profile-unable_to_find_profile_by_id_cannot_delete": "Nem sikerült törölni a következő azonosítóval rendelkező profilt: %s, nem találtunk ilyen azonosítóval rendelkező profilt", "quest-compare_operator_unhandled": "loyaltyRequirementCheck() operátor %s nem kezelt, alapértelmezett értékre állítva: hamis", + "quest-item_not_found_in_inventory": "changeItemStack() A _id: %s azonosítóval rendelkező elem nem található a készletben", + "quest-no_skill_found": "%s képesség nem található", + "quest-handover_wrong_item": "Nem sikerült leadni a {{questId}} küldetéshez tartozó tárgyat, elvárt tpl: {{requiredTpl}}, de leadva: {{handedInTpl}}", + "quest-reward_type_not_handled": "A küldetés jutalom típusa: {{rewardType}} nem kezelt küldetés: {{questId}} név: {{questName}}", + "quest-unable_to_find_compare_condition": "Nem felismert összehasonlítási módszer: %s", + "quest-unable_to_find_matching_hideout_production": "Nem találtam megfelelő receptet a rejtekhelyen a küldetéshez: {{questName}}, találatok: {{matchCount}}", + "ragfair-invalid_player_offer_request": "Nem lehet ajánlatot tenni, a kérés érvénytelen", + "ragfair-missing_barter_scheme": "generateFleaOffersForTrader() Nem sikerült megtalálni a barterScheme-t az Item Id: {{itemId}} tpl: {{tpl}} on {{name}}", + "ragfair-no_trader_assorts_cant_generate_flea_offers": "Nem sikerült ajánlatot generálni %s kereskedő számára, nem találtunk választékot", + "ragfair-offer_not_found_in_profile": "Nem található ajánlat azonosítóval: {{offerId}} a profilban az eltávolításhoz", + "ragfair-offer_not_found_in_profile_short": "Ajánlat nem található a profilban", + "ragfair-offer_not_found_unable_to_hide": "hideItem() offerId: %s nem található, nem lehet elrejteni az ajánlatot", + "ragfair-tpl_not_a_valid_item": "generateFleaOffersForTrader() tpl: %s nem érvényes elem, kihagyás", + "ragfair-unable_to_find_item_in_inventory": "Nem sikerült megtalálni a {{id}} azonosítóval rendelkező tárgyat a készletben", + "ragfair-unable_to_find_offer_to_remove": "Nem sikerült megtalálni az eltávolítandó ajánlatot a következő azonosítóval: %s", + "ragfair-unable_to_find_requested_items_in_inventory": "Nem találhatók a kért tárgyak a leltárban", + "ragfair-unable_to_pay_commission_fee": "Nem lehet kifizetni a jutalékot: %s rubel", + "ragfair-offer_no_longer_exists": "Az ajánlat már nem létezik", + "ragfair-unable_to_purchase_0_count_item": "Nem lehet megvásárolni a terméket: %s 0-ás darabszámmal", + "ragfair-unable_to_place_offer_with_no_requirements": "Nem lehet ajánlatot tenni követelmények nélkül", + "ragfair-unable_to_find_locale_by_key": "Nem sikerült megtalálni az EFT helyét a következő kulccsal: %s", + "ragfair-unable_to_adjust_stack_count_assort_not_found": "Kereskedő: {{traderId}} piaci ajánlat: {{offerId}} nem módosítható a kereskedői kínálat értékének megfelelő darabszámmal (a kínálat nem található)", + "ragfair-unable_to_remove_offer_not_found_in_profile": "Nem található ajánlat: {{offerId}} a profilban: {{profileId}}, mivel az ajánlat nincs meghatározva, létrehozás", "ragfair-unable_to_find_item_price_for_item_in_flea_handbook": "Nem sikerült megtalálni az élő-piaci vagy kézikönyvi árat %s esetében, alapértelmezett érték 1-re állítva, ha ez egy modolt tárgy, lépj kapcsolatba annak készítőjével", "ragfair-unable_to_find_preset_with_id": "Nem sikerült megtalálni a beállítást az azonosítóval: %s, a meglévő fegyveralap aktuális ára kerül felhasználásra", "ragfair-unable_to_remove_offer_doesnt_exist": "Nem lehet eltávolítani az ajánlatot a következő azonosítóval: %s, mivel nem található meg a piacon", "repeatable-accepted_repeatable_quest_not_found_in_active_quests": "Elfogadtál egy ismételhető küldetést: %s, amely nem található az activeQuests tömbben. Kérjük, jelentsd ezt a hibát", + "repeatable-completion_quest_whitelist_too_small_or_blacklist_too_restrictive": "Befejezési küldetés generálása: Nincsenek tételek. Vagy az engedélyezőlista túl kicsi, vagy a tiltólista túl korlátozó", "repeatable-difficulty_was_nan": "Ismételhető jutalom generálása: A nehézség értéke NaN. Beállítás 1-re.", "repeatable-no_reward_item_found_in_price_range": "Ismételhető jutalom generálása: Nem található tárgy az ártartományban {{minPrice}}-tól {{roublesBudget}}-ig", "repeatable-quest_handover_failed_condition_already_satisfied": "Küldetés átadási hiba: a feltétel már teljesült? qid: {{questId}}, condition: {{conditionId}}, profileCounter:{{profileCounter}}, value:{{value}}", diff --git a/project/assets/database/locales/server/ko.json b/project/assets/database/locales/server/ko.json index 045c1531..e1c149ef 100644 --- a/project/assets/database/locales/server/ko.json +++ b/project/assets/database/locales/server/ko.json @@ -40,6 +40,7 @@ "bot-unable_to_find_spawn_limits_fallback_to_defaults": "해당되는 봇 타입에 대한 생성 제약을 찾을 수 없음: %s, 기본값을 사용합니다", "bot-unable_to_get_bot_difficulty_fallback_to_assault": "해당되는 봇 타입의 난이도를 찾을 수 없음: {{botType}} 난이도 {{difficulty}}, assault 봇 타입의 난이도를 사용합니다", "bot-unable_to_get_bot_fallback_to_assault": "해당되는 봇 타입을 찾을 수 없음: %s JSON, assault 봇 타입을 사용합니다", + "bot-weapon_contains_invalid_item": "{{weaponTpl}} 무기에 있는 요구된{{modSlot}} 슬롯에 부적합한 아이템{{modName}} 이 있습니다.", "bot-weapon_generated_incorrect_using_default": "무기 %s 이(가) 잘못 생성되었습니다, 무기 프리셋을 사용합니다, 위의 오류를 참조하세요", "bot-weapon_missing_magazine_or_chamber": "무기 tpl: %s 은(는) 탄창 또는 약실(chamber)이 없습니다", "bot-weapon_missing_mod_slot": "슬롯 '{{modSlot}}' 이 다음의 무기에 없음: {{weaponName}} - {{weaponId}}", @@ -51,6 +52,7 @@ "bot-unable_to_find_bot_in_cache": "캐시 내부에서 %s 라는 봇을 찾을 수 없었습니다", "bot-missing_application_context": "applicationContext가 %s 값을 찾을 수 없었습니다. 게임을 재시작하지 않고 서버를 재시작했습니까?", "client_request": "[클라이언트 요청] %s", + "client_request_ip": "클라이언트 요청{{ip}}{{url}}", "customisation-item_already_purchased": "의류 아이템 {{itemId}} {{itemName}} 은(는) 이미 구매했습니다", "customisation-unable_to_find_suit_by_id": "%s 해당 아이디를 가진 거래상의 수트 거래 항목을 찾을 수 없었습니다", "customisation-unable_to_find_clothing_item_in_inventory": "%s 해당 아이디를 가진 옷가지 아이템을 인벤토리에서 찾을 수 없었습니다", @@ -259,6 +261,7 @@ "websocket-pinging_player": "[WS] 플레이어 핑: %s", "websocket-player_connected": "[WS] 플레이어: %s 이(가) 접속 됨", "websocket-received_message": "[WS] %s 사용자로부터 메시지를 받음", + "websocket-socket_lost_deleting_handle": "[ws] 소켓 로스트, 핸들 삭제중", "websocket-started": "시작된 웹소켓 서버 %s", "pmcresponse-victim_positive_1": "나이스 샷", "pmcresponse-victim_positive_2": "잘쏘네", @@ -369,6 +372,7 @@ "pmcresponse-victim_negative_40": "느금마한테 제삿상 차려놓으라 해 금방 간다", "pmcresponse-victim_negative_41": "여동생이랑 뽀뽀연습할새끼", "pmcresponse-victim_negative_42": "좆밥냄새나는 6.9한남 수준 ㅎ", + "pmcresponse-victim_negative_43": "폭력을 택할 이유는 없었다", "pmcresponse-victim_negative_44": "기숙사에서 1대1 ㄱ? 안오면 쫄?", "pmcresponse-victim_negative_45": "{{playerSide}} 해버렸노 ㅋㅋㅋ", "pmcresponse-victim_negative_46": "{{playerLevel}}랩 인데 이건 에바지 ㅅㅂ", @@ -380,10 +384,12 @@ "pmcresponse-victim_negative_52": "오늘은 손이 덜풀렸지만 담엔 찢어버린다 ㅋㅋ", "pmcresponse-victim_negative_53": "오늘은 니 조상님이 살려줬네", "pmcresponse-victim_negative_54": "풀무장으로 돌아온다 딱대라", + "pmcresponse-victim_negative_55": "이번엔 조졌지만 담은 안그럴꺼야", "pmcresponse-victim_negative_56": "내 레덱스 바로 빤쓰에 넣어버렸노 ㅋㅋ", "pmcresponse-victim_negative_57": "랩키 바로 장례치러놨다", "pmcresponse-victim_negative_58": "내 열쇠들 빤쓰에 있다 ㅅㄱ", "pmcresponse-victim_negative_59": "빤쓰안에 다 넣었쥬? 파밍할거 없쥬? 좆같쥬?", + "pmcresponse-victim_negative_60": "얘네만 간신히 빤스로 건져왔어, 네건 없다구", "pmcresponse-victim_negative_61": "상남자 특 감마컨에 다 쑤셔박음", "pmcresponse-victim_negative_62": "애미뒤진새끼 특 니처럼 행동함", "pmcresponse-victim_negative_63": "병신 같은새끼", @@ -396,6 +402,7 @@ "pmcresponse-victim_negative_70": "총알값이 더나올걸 ㅋㅋ tr", "pmcresponse-victim_negative_71": "KDA 보니까 좆밥이네 ㅋㅋㅋ", "pmcresponse-victim_negative_72": "사기총 써서 잡았노 ㅋㅋㅋ 밸런스 좆망겜", + "pmcresponse-victim_negative_73": "우왕 날 죽였네 ㅎ 진짜 겁나게 잘하시네잉 ㅋ()", "pmcresponse-victim_negative_74": "너 같은 캠퍼들 때문에 게임이 망하는 거야", "pmcresponse-victim_negative_75": "니랑 다르게 난 탈콥 밖에도 인생이 있음 ㅎ", "pmcresponse-victim_negative_76": "ㅅㅂ 총 잼걸려서 죽었다", @@ -427,6 +434,7 @@ "pmcresponse-victim_plead_1": "그냥 퀘스트중이였어 ", "pmcresponse-victim_plead_2": "그냥 퀘스트 하는 중인데 왜 죽여?", "pmcresponse-victim_plead_3": "좋겠다 난 이제 새 장비 살 돈도 없는데", + "pmcresponse-victim_plead_4": "브로! 나 늅이야! 예초기 너무하네;;", "pmcresponse-victim_plead_5": "니때매 퀘스트 다 조졌다 ㅋㅋ", "pmcresponse-victim_plead_6": "내 장비 이미 다 숨겨놨어", "pmcresponse-victim_plead_7": "QEQE못봤어?", @@ -506,10 +514,14 @@ "pmcresponse-killer_negative_13": "좆밥허접새끼의 명복을 빕니다 ㅎ", "pmcresponse-killer_negative_14": "또 다른 더러운 쥐새끼를 찾았군", "pmcresponse-killer_negative_15": "그것참 보기 안쓰럽네", + "pmcresponse-killer_negative_16": "좀 견딜 줄 알았는데 허접이네", + "pmcresponse-killer_negative_17": "템 보험 안했길 바랄께. 내가 압수할꺼걸랑.", "pmcresponse-killer_negative_18": "유튜브나 공략좀 보고와라 좆밥아", "pmcresponse-killer_negative_19": "독택 수집 개꿀 ㅎ", "pmcresponse-killer_negative_20": "싱글탈콥이나 해라 허접새끼야", + "pmcresponse-killer_negative_21": "컷", "pmcresponse-killer_negative_22": "너무 허접새끼 잡은것같아서 미안하네 ㅎㅎ", + "pmcresponse-killer_negative_23": "{{playerSide}} 들은 다 이따위야?", "pmcresponse-killer_negative_24": "템 잘먹었다 꺼~억", "pmcresponse-killer_negative_25": "ㅋㅋㅋ 템들 다 좆구려서 걍 펜스한테 팔았음", "pmcresponse-killer_negative_26": "{{playerSide}} 평균 수준", @@ -582,7 +594,14 @@ "launcher-profile_leftbehind": "스탠다드 + 더 큰 보관함 크기(10x38), 추가 장비/아이템, 500달러", "launcher-profile_preparetoescape": "레프트 비하인드와 동일 더 큰 보관함 크기(10x48), 추가 장비/아이템, 상인과의 시작 평판 상승, 250유로", "launcher-profile-edgeofdarkness": "프리페어 투 이스케이프와 동일 더 큰 은신처 크기(10x68), 추가 장비/아이템, 상인과의 높은 시작 평판, 1000달러, 500유로", + "launcher-profile_spteasystart": "루블/달러/유로 많이, 일부 편의성 스킬 20렙, 상인 우호도 최대, 15렙으로 시작, 미리 완료된 퀘스트 없음", "launcher-profile_sptzerotohero": "루블/달러/유로, 상인 대표, 칼 1개, 퀘스트 완료 등 거의 아무것도 없이 시작하세요.", "launcher-profile_sptdeveloper": "테스트 프로필, 시작 레벨은 69, 많은 루블/달러/유로, USEC는 모든 퀘스트를 시작할 준비가 된 상태로 시작, BEAR는 모든 퀘스트를 제출할 준비가 된 상태로 시작, 무적 발라 클라바", - "launcher-missing_property": "프로필: %s 은(는) descriptionLocaleKey 속성이 누락되어 있습니다" + "launcher-missing_property": "프로필: %s 은(는) descriptionLocaleKey 속성이 누락되어 있습니다", + "release-beta-disclaimer": "확인을 누름으로써 추가지원은 없을것임과 해당 버전은 게임플레이 목적이 아닌 디버깅 용도임에 동의합니다. 모드들은 비활성화 되어있습니다. 빈번하게 새로운 프로필이 요구될 가능성이 높습니다. 발견하는 모든 버그는 웹사이트의 이슈 페이지나 디스코드 리포트 채널에 올려주십시오. 시간제한 내에 확인을 누르지 않으면 게임이 닫힙니다.", + "release-beta-disclaimer-mods-enabled": "확인을 누름으로써 추가지원은 없을것임과 해당 버전은 게임플레이 목적이 아닌 디버깅 용도임에 동의합니다. 모드들은 활성화 되어있습니다. 모드 관련한 이슈는 보고하지 마십시오. 모드 제작자에게 업데이트된 버젼을 요구하지 마십시오. 이외의 발견하는 모든 버그는 웹사이트의 이슈 페이지나 디스코드 리포트 채널에 올려주십시오. 시간제한 내에 확인을 누르지 않으면 게임이 닫힙니다.", + "release-beta-disclaimer-accept": "사용자가 베타 주의사항에 동의하였음", + "release-server-mods-debug-message": "서버 모드 로딩 완료", + "release-plugins-loaded-debug-message": "클라이언트 모드 로딩 완료", + "release-illegal-plugins-loaded": "화이트 리스트에 없는 플러그인들이 한개 이상 탐지되었습니다. SPT 블리딩 엣지 빌드에서는 모드는 사용할 수 었습니다. 사용불가 플러그인:" } diff --git a/project/assets/database/locales/server/zh-TW.json b/project/assets/database/locales/server/zh-TW.json index 1707d809..fcf52d1b 100644 --- a/project/assets/database/locales/server/zh-TW.json +++ b/project/assets/database/locales/server/zh-TW.json @@ -60,6 +60,7 @@ "importing_database": "正在導入資料庫…", "importing_database_finish": "資料庫導入完成", "importing_spt_configs": "導入配置中…", + "inventory-edit_trader_item": "無法編輯商人的物品", "modloader-checked": "已檢查", "modloader-checking_mod": "檢查中: %s", "modloader-cyclic_dependency": "發現Cyclic dependency(循環依賴). 此錯誤必須修復. 修復前伺服器無法啟動, 伺服器將關閉", From 0ab5ca6dee4098ab659d810f34cf6bd3375b20dd Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 23 Apr 2024 19:38:45 +0100 Subject: [PATCH 05/15] Prevent check from failing when upd object is missing --- project/src/services/FenceService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/src/services/FenceService.ts b/project/src/services/FenceService.ts index 67cc6c8d..dc2f1028 100644 --- a/project/src/services/FenceService.ts +++ b/project/src/services/FenceService.ts @@ -180,7 +180,7 @@ export class FenceService ): void { // Is preset - if (item.upd.sptPresetId) + if (item.upd?.sptPresetId) { if (assort.barter_scheme[item._id]) { From d41a40b2d23d00b12f2ec0281f1cf384d17c84e8 Mon Sep 17 00:00:00 2001 From: Terkoiz Date: Tue, 23 Apr 2024 19:16:56 +0000 Subject: [PATCH 06/15] Updated the PMC name list with more modders and prominent community members (!303) Co-authored-by: Terkoiz Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/303 Co-authored-by: Terkoiz Co-committed-by: Terkoiz --- project/assets/database/bots/types/bear.json | 13 +++++++++++-- project/assets/database/bots/types/usec.json | 13 +++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/project/assets/database/bots/types/bear.json b/project/assets/database/bots/types/bear.json index ba953fb8..d135d38e 100644 --- a/project/assets/database/bots/types/bear.json +++ b/project/assets/database/bots/types/bear.json @@ -2324,7 +2324,7 @@ "SlejmUr", "bandit", "Junko Space Mommy", - "civiciam", + "MoxoPixel", "FlashMode", "Pettan", "Oraceon", @@ -2485,7 +2485,16 @@ "ixcetotis", "btdc00", "Bnuy", - "Choccy" + "Choccy", + "LunnayaLuna", + "Tyfon", + "weewoo", + "Mattdokn", + "BlackDeathGER", + "Gizzy", + "LuckyCharmT", + "Rena-chan", + "HB" ], "generation": { "items": { diff --git a/project/assets/database/bots/types/usec.json b/project/assets/database/bots/types/usec.json index 9b930075..983b3201 100644 --- a/project/assets/database/bots/types/usec.json +++ b/project/assets/database/bots/types/usec.json @@ -2321,7 +2321,7 @@ "SlejmUr", "bandit", "Junko Space Mommy", - "civiciam", + "MoxoPixel", "FlashMode", "Pettan", "Oraceon", @@ -2482,7 +2482,16 @@ "ixcetotis", "btdc00", "Bnuy", - "Choccy" + "Choccy", + "LunnayaLuna", + "Tyfon", + "weewoo", + "Mattdokn", + "BlackDeathGER", + "Gizzy", + "LuckyCharmT", + "Rena-chan", + "HB" ], "generation": { "items": { From 96208ed95f6a7b17c9542a6886eb8fbb14dbc5fb Mon Sep 17 00:00:00 2001 From: nader Date: Tue, 23 Apr 2024 19:21:21 +0000 Subject: [PATCH 07/15] add getters (and additional setter) to FenceService (!304) resubmitting PR targeting 3.8.1-DEV Co-authored-by: Nader Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/304 Co-authored-by: nader Co-committed-by: nader --- project/src/services/FenceService.ts | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/project/src/services/FenceService.ts b/project/src/services/FenceService.ts index dc2f1028..16609722 100644 --- a/project/src/services/FenceService.ts +++ b/project/src/services/FenceService.ts @@ -71,6 +71,33 @@ export class FenceService this.fenceAssort = assort; } + /** + * Replace discount fence assort with new assort + * @param assort New assorts to replace old with + */ + public setDiscountFenceAssort(assort: ITraderAssort): void + { + this.fenceDiscountAssort = assort; + } + + /** + * Get main fence assort + * @return ITraderAssort + */ + public getMainFenceAssort(): ITraderAssort + { + return this.fenceAssort; + } + + /** + * Get discount fence assort + * @return ITraderAssort + */ + public getDiscountFenceAssort(): ITraderAssort + { + return this.fenceDiscountAssort; + } + /** * Replace high rep level fence assort with new assort * @param discountAssort New assorts to replace old with From d49bf4a378f5a2bdd7cce05b0e1ed31b6477003d Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 23 Apr 2024 21:07:34 +0100 Subject: [PATCH 08/15] Replace single letter variables with better names --- project/src/controllers/DialogueController.ts | 12 +++--- .../generators/BotEquipmentModGenerator.ts | 38 ++++++++++--------- project/src/generators/LocationGenerator.ts | 36 ++++++++++-------- 3 files changed, 47 insertions(+), 39 deletions(-) diff --git a/project/src/controllers/DialogueController.ts b/project/src/controllers/DialogueController.ts index 9013825c..6bc4546b 100644 --- a/project/src/controllers/DialogueController.ts +++ b/project/src/controllers/DialogueController.ts @@ -131,7 +131,7 @@ export class DialogueController // User to user messages are special in that they need the player to exist in them, add if they don't if ( messageType === MessageType.USER_MESSAGE - && !dialog.Users?.find((x) => x._id === profile.characters.pmc.sessionId) + && !dialog.Users?.find((userDialog) => userDialog._id === profile.characters.pmc.sessionId) ) { if (!dialog.Users) @@ -230,9 +230,9 @@ export class DialogueController { result.push(...dialogUsers); - // Player doesnt exist, add them in before returning - if (!result.find((x) => x._id === fullProfile.info.id)) + if (!result.find((userDialog) => userDialog._id === fullProfile.info.id)) { + // Player doesnt exist, add them in before returning const pmcProfile = fullProfile.characters.pmc; result.push({ _id: fullProfile.info.id, @@ -278,7 +278,7 @@ export class DialogueController */ protected messagesHaveUncollectedRewards(messages: Message[]): boolean { - return messages.some((x) => x.items?.data?.length > 0); + return messages.some((message) => message.items?.data?.length > 0); } /** @@ -391,7 +391,7 @@ export class DialogueController { const timeNow = this.timeUtil.getTimestamp(); const dialogs = this.dialogueHelper.getDialogsForProfile(sessionId); - return dialogs[dialogueId].messages.filter((x) => timeNow < (x.dt + x.maxStorageTime)); + return dialogs[dialogueId].messages.filter((message) => timeNow < (message.dt + message.maxStorageTime)); } /** @@ -401,7 +401,7 @@ export class DialogueController */ protected getMessagesWithAttachments(messages: Message[]): Message[] { - return messages.filter((x) => x.items?.data?.length > 0); + return messages.filter((message) => message.items?.data?.length > 0); } /** diff --git a/project/src/generators/BotEquipmentModGenerator.ts b/project/src/generators/BotEquipmentModGenerator.ts index dc0612d5..3ba207da 100644 --- a/project/src/generators/BotEquipmentModGenerator.ts +++ b/project/src/generators/BotEquipmentModGenerator.ts @@ -234,8 +234,8 @@ export class BotEquipmentModGenerator } // Get the front/back/side weights based on bots level - const plateSlotWeights = settings.botEquipmentConfig?.armorPlateWeighting?.find((x) => - settings.botLevel >= x.levelRange.min && settings.botLevel <= x.levelRange.max + const plateSlotWeights = settings.botEquipmentConfig?.armorPlateWeighting?.find((armorWeight) => + settings.botLevel >= armorWeight.levelRange.min && settings.botLevel <= armorWeight.levelRange.max ); if (!plateSlotWeights) { @@ -261,10 +261,10 @@ export class BotEquipmentModGenerator const chosenArmorPlateLevel = this.weightedRandomHelper.getWeightedValue(plateWeights); // Convert the array of ids into database items - const platesFromDb = existingPlateTplPool.map((x) => this.itemHelper.getItem(x)[1]); + const platesFromDb = existingPlateTplPool.map((plateTpl) => this.itemHelper.getItem(plateTpl)[1]); // Filter plates to the chosen level based on its armorClass property - const filteredPlates = platesFromDb.filter((x) => x._props.armorClass === chosenArmorPlateLevel); + const filteredPlates = platesFromDb.filter((item) => item._props.armorClass === chosenArmorPlateLevel); if (filteredPlates.length === 0) { this.logger.debug( @@ -306,7 +306,7 @@ export class BotEquipmentModGenerator // Only return the items ids result.result = Result.SUCCESS; - result.plateModTpls = filteredPlates.map((x) => x._id); + result.plateModTpls = filteredPlates.map((item) => item._id); return result; } @@ -468,8 +468,10 @@ export class BotEquipmentModGenerator // Handguard mod can take a sub handguard mod + weapon has no UBGL (takes same slot) // Force spawn chance to be 100% to ensure it gets added if ( - modSlot === "mod_handguard" && modToAddTemplate._props.Slots.find((x) => x._name === "mod_handguard") - && !weapon.find((x) => x.slotId === "mod_launcher") + modSlot === "mod_handguard" && modToAddTemplate._props.Slots.find((slot) => + slot._name === "mod_handguard" + ) + && !weapon.find((item) => item.slotId === "mod_launcher") ) { // Needed for handguards with lower @@ -479,8 +481,8 @@ export class BotEquipmentModGenerator // If stock mod can take a sub stock mod, force spawn chance to be 100% to ensure sub-stock gets added // Or if mod_stock is configured to be forced on if ( - modSlot === "mod_stock" && (modToAddTemplate._props.Slots.find((x) => - x._name.includes("mod_stock") || botEquipConfig.forceStock + modSlot === "mod_stock" && (modToAddTemplate._props.Slots.find((slot) => + slot._name.includes("mod_stock") || botEquipConfig.forceStock )) ) { @@ -1174,7 +1176,7 @@ export class BotEquipmentModGenerator botEquipBlacklist: EquipmentFilterDetails, ): void { - const desiredSlotObject = modTemplate._props.Slots.find((x) => x._name.includes(desiredSlotName)); + const desiredSlotObject = modTemplate._props.Slots.find((slot) => slot._name.includes(desiredSlotName)); if (desiredSlotObject) { const supportedSubMods = desiredSlotObject._props.filters[0].Filter; @@ -1260,7 +1262,7 @@ export class BotEquipmentModGenerator const blacklist = this.itemFilterService.getBlacklistedItems().concat( botEquipBlacklist.equipment[modSlot] || [], ); - result = allowedMods.filter((x) => !blacklist.includes(x)); + result = allowedMods.filter((tpl) => !blacklist.includes(tpl)); return result; } @@ -1286,7 +1288,7 @@ export class BotEquipmentModGenerator weaponName: parentTemplate._name, }), ); - const camoraSlots = parentTemplate._props.Slots.filter((x) => x._name.startsWith("camora")); + const camoraSlots = parentTemplate._props.Slots.filter((slot) => slot._name.startsWith("camora")); // Attempt to generate camora slots for item modPool[parentTemplate._id] = {}; @@ -1420,16 +1422,16 @@ export class BotEquipmentModGenerator { // Check to see if mount has a scope slot (only include primary slot, ignore the rest like the backup sight slots) // Should only find 1 as there's currently no items with a mod_scope AND a mod_scope_000 - const scopeSlot = itemDetails._props.Slots.filter((x) => - ["mod_scope", "mod_scope_000"].includes(x._name) + const scopeSlot = itemDetails._props.Slots.filter((slot) => + ["mod_scope", "mod_scope_000"].includes(slot._name) ); // Mods scope slot found must allow ALL whitelisted scope types OR be a mount if ( - scopeSlot?.every((x) => - x._props.filters[0].Filter.every((x) => - this.itemHelper.isOfBaseclasses(x, whitelistedSightTypes) - || this.itemHelper.isOfBaseclass(x, BaseClasses.MOUNT) + scopeSlot?.every((slot) => + slot._props.filters[0].Filter.every((tpl) => + this.itemHelper.isOfBaseclasses(tpl, whitelistedSightTypes) + || this.itemHelper.isOfBaseclass(tpl, BaseClasses.MOUNT) ) ) ) diff --git a/project/src/generators/LocationGenerator.ts b/project/src/generators/LocationGenerator.ts index b185c74b..1b83642e 100644 --- a/project/src/generators/LocationGenerator.ts +++ b/project/src/generators/LocationGenerator.ts @@ -218,8 +218,8 @@ export class LocationGenerator for (const chosenContainerId of chosenContainerIds) { // Look up container object from full list of containers on map - const containerObject = staticRandomisableContainersOnMap.find((x) => - x.template.Id === chosenContainerId + const containerObject = staticRandomisableContainersOnMap.find((staticContainer) => + staticContainer.template.Id === chosenContainerId ); if (!containerObject) { @@ -262,10 +262,10 @@ export class LocationGenerator */ protected getRandomisableContainersOnMap(staticContainers: IStaticContainerData[]): IStaticContainerData[] { - return staticContainers.filter((x) => - x.probability !== 1 && !x.template.IsAlwaysSpawn + return staticContainers.filter((staticContainer) => + staticContainer.probability !== 1 && !staticContainer.template.IsAlwaysSpawn && !this.locationConfig.containerRandomisationSettings.containerTypesToNotRandomise.includes( - x.template.Items[0]._tpl, + staticContainer.template.Items[0]._tpl, ) ); } @@ -277,10 +277,10 @@ export class LocationGenerator */ protected getGuaranteedContainers(staticContainersOnMap: IStaticContainerData[]): IStaticContainerData[] { - return staticContainersOnMap.filter((x) => - x.probability === 1 || x.template.IsAlwaysSpawn + return staticContainersOnMap.filter((staticContainer) => + staticContainer.probability === 1 || staticContainer.template.IsAlwaysSpawn || this.locationConfig.containerRandomisationSettings.containerTypesToNotRandomise.includes( - x.template.Items[0]._tpl, + staticContainer.template.Items[0]._tpl, ) ); } @@ -659,7 +659,9 @@ export class LocationGenerator } // Filter out duplicate locationIds - chosenSpawnpoints = [...new Map(chosenSpawnpoints.map((x) => [x.locationId, x])).values()]; + chosenSpawnpoints = [ + ...new Map(chosenSpawnpoints.map((spawnPoint) => [spawnPoint.locationId, spawnPoint])).values(), + ]; // Do we have enough items in pool to fulfill requirement const tooManySpawnPointsRequested = (desiredSpawnpointCount - chosenSpawnpoints.length) > 0; @@ -702,7 +704,7 @@ export class LocationGenerator { if ( !seasonalEventActive && seasonalItemTplBlacklist.includes( - spawnPoint.template.Items.find((x) => x._id === itemDist.composedKey.key)._tpl, + spawnPoint.template.Items.find((item) => item._id === itemDist.composedKey.key)._tpl, ) ) { @@ -753,7 +755,9 @@ export class LocationGenerator for (const itemTpl of lootToForceSingleAmountOnMap) { // Get all spawn positions for item tpl in forced loot array - const items = forcedSpawnPoints.filter((x) => x.template.Items[0]._tpl === itemTpl); + const items = forcedSpawnPoints.filter((forcedSpawnPoint) => + forcedSpawnPoint.template.Items[0]._tpl === itemTpl + ); if (!items || items.length === 0) { this.logger.debug( @@ -776,7 +780,7 @@ export class LocationGenerator // Choose 1 out of all found spawn positions for spawn id and add to loot array for (const spawnPointLocationId of spawnpointArray.draw(1, false)) { - const itemToAdd = items.find((x) => x.locationId === spawnPointLocationId); + const itemToAdd = items.find((item) => item.locationId === spawnPointLocationId); const lootItem = itemToAdd.template; lootItem.Root = this.objectId.generate(); lootItem.Items[0]._id = lootItem.Root; @@ -812,7 +816,9 @@ export class LocationGenerator locationTemplateToAdd.Items[0]._id = locationTemplateToAdd.Root; // Push forced location into array as long as it doesnt exist already - const existingLocation = lootLocationTemplates.find((x) => x.Id === locationTemplateToAdd.Id); + const existingLocation = lootLocationTemplates.find((spawnPoint) => + spawnPoint.Id === locationTemplateToAdd.Id + ); if (!existingLocation) { lootLocationTemplates.push(locationTemplateToAdd); @@ -839,7 +845,7 @@ export class LocationGenerator staticAmmoDist: Record, ): IContainerItem { - const chosenItem = spawnPoint.template.Items.find((x) => x._id === chosenComposedKey); + const chosenItem = spawnPoint.template.Items.find((item) => item._id === chosenComposedKey); const chosenTpl = chosenItem._tpl; const itemTemplate = this.itemHelper.getItem(chosenTpl)[1]; @@ -942,7 +948,7 @@ export class LocationGenerator return items.find((v) => v._tpl === chosenTpl && v.parentId === undefined); } - return items.find((x) => x._tpl === chosenTpl); + return items.find((item) => item._tpl === chosenTpl); } // TODO: rewrite, BIG yikes From 6e262a228fb3da984f7aee1dfa5ba19e6dfb3c9c Mon Sep 17 00:00:00 2001 From: Dev Date: Tue, 23 Apr 2024 22:41:00 +0100 Subject: [PATCH 09/15] Add optional param to ignore raid settings chosen by player during `getAllBotDifficulties()` --- project/src/controllers/BotController.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/project/src/controllers/BotController.ts b/project/src/controllers/BotController.ts index 908333a5..c2fafbfb 100644 --- a/project/src/controllers/BotController.ts +++ b/project/src/controllers/BotController.ts @@ -86,16 +86,17 @@ export class BotController * Adjust PMC settings to ensure they engage the correct bot types * @param type what bot the server is requesting settings for * @param diffLevel difficulty level server requested settings for + * @param ignoreRaidSettings should raid settings chosen pre-raid be ignored * @returns Difficulty object */ - public getBotDifficulty(type: string, diffLevel: string): Difficulty + public getBotDifficulty(type: string, diffLevel: string, ignoreRaidSettings = false): Difficulty { let difficulty = diffLevel.toLowerCase(); const raidConfig = this.applicationContext.getLatestValue(ContextVariableType.RAID_CONFIGURATION)?.getValue< IGetRaidConfigurationRequestData >(); - if (!raidConfig) + if (!(raidConfig || ignoreRaidSettings)) { this.logger.error( this.localisationService.getText("bot-missing_application_context", "RAID_CONFIGURATION"), @@ -158,7 +159,7 @@ export class BotController result[botType] = {}; for (const difficulty of botDifficulties) { - result[botType][difficulty] = this.getBotDifficulty(botType, difficulty); + result[botType][difficulty] = this.getBotDifficulty(botType, difficulty, true); } } From 316234e9aeb46af03206787d9f01786789c6f93d Mon Sep 17 00:00:00 2001 From: DrakiaXYZ Date: Wed, 24 Apr 2024 07:13:31 +0000 Subject: [PATCH 10/15] Fix TradersInfo nextResupply if it is null in profile data (!305) Add test covering fixNullTraderNextResupply Co-authored-by: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com> Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/305 Co-authored-by: DrakiaXYZ Co-committed-by: DrakiaXYZ --- project/src/services/ProfileFixerService.ts | 17 ++++++++ .../services/ProfileFixerService.test.ts | 39 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 project/tests/services/ProfileFixerService.test.ts diff --git a/project/src/services/ProfileFixerService.ts b/project/src/services/ProfileFixerService.ts index 015a0514..28205ee0 100644 --- a/project/src/services/ProfileFixerService.ts +++ b/project/src/services/ProfileFixerService.ts @@ -157,6 +157,7 @@ export class ProfileFixerService } this.fixNullTraderSalesSums(pmcProfile); + this.fixNullTraderNextResupply(pmcProfile); this.updateProfileQuestDataValues(pmcProfile); } @@ -1430,4 +1431,20 @@ export class ProfileFixerService } } } + + /** + * If someone has run a mod from pre-3.8.0, it results in an invalid `nextResupply` value + * Resolve this by setting the nextResupply to 0 if it's null + */ + protected fixNullTraderNextResupply(pmcProfile: IPmcData): void + { + for (const [traderId, trader] of Object.entries(pmcProfile.TradersInfo)) + { + if (trader && trader.nextResupply === null) + { + this.logger.warning(`trader ${traderId} has a null nextResupply value, resetting to 0`); + trader.nextResupply = 0; + } + } + } } diff --git a/project/tests/services/ProfileFixerService.test.ts b/project/tests/services/ProfileFixerService.test.ts new file mode 100644 index 00000000..bc9b6c89 --- /dev/null +++ b/project/tests/services/ProfileFixerService.test.ts @@ -0,0 +1,39 @@ +import { ProfileFixerService } from "@spt-aki/services/ProfileFixerService"; +import { container } from "tsyringe"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("ProfileFixerService", () => +{ + let profileFixerService: any; // Using "any" to access private/protected methods without type errors. + + beforeEach(() => + { + profileFixerService = container.resolve("ProfileFixerService"); + }); + + afterEach(() => + { + vi.restoreAllMocks(); + }); + + describe("FixPmcProfileIssues", () => + { + it("should reset nextResupply to 0 when it is null", () => + { + const pmcProfile = { TradersInfo: { traderId: { nextResupply: null } } }; + + profileFixerService.fixNullTraderNextResupply(pmcProfile); + + expect(pmcProfile.TradersInfo.traderId.nextResupply).toBe(0); + }); + + it("should not reset nextResupply to 0 when it is not null", () => + { + const pmcProfile = { TradersInfo: { traderId: { nextResupply: 1234 } } }; + + profileFixerService.fixNullTraderNextResupply(pmcProfile); + + expect(pmcProfile.TradersInfo.traderId.nextResupply).toBe(1234); + }); + }); +}); From 60eb6bfe809c6ea6742e8c2345776034d836e52a Mon Sep 17 00:00:00 2001 From: Dev Date: Wed, 24 Apr 2024 10:09:37 +0100 Subject: [PATCH 11/15] Improve data returned from `getAllBotDifficulties()` --- project/src/controllers/BotController.ts | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/project/src/controllers/BotController.ts b/project/src/controllers/BotController.ts index c2fafbfb..30967cee 100644 --- a/project/src/controllers/BotController.ts +++ b/project/src/controllers/BotController.ts @@ -13,6 +13,7 @@ import { IBotCore } from "@spt-aki/models/eft/common/tables/IBotCore"; import { Difficulty } from "@spt-aki/models/eft/common/tables/IBotType"; import { IGetRaidConfigurationRequestData } from "@spt-aki/models/eft/match/IGetRaidConfigurationRequestData"; import { ConfigTypes } from "@spt-aki/models/enums/ConfigTypes"; +import { WildSpawnTypeNumber } from "@spt-aki/models/enums/WildSpawnTypeNumber"; import { BotGenerationDetails } from "@spt-aki/models/spt/bots/BotGenerationDetails"; import { IBotConfig } from "@spt-aki/models/spt/config/IBotConfig"; import { IPmcConfig } from "@spt-aki/models/spt/config/IPmcConfig"; @@ -146,23 +147,31 @@ export class BotController const result = {}; const botDb = this.databaseServer.getTables().bots.types; - const botTypes = Object.keys(botDb); - for (const botType of botTypes) + const botTypes = Object.keys(WildSpawnTypeNumber).filter((v) => Number.isNaN(Number(v))); + for (let botType of botTypes) { + const enumType = botType.toLowerCase(); + // sptBear/sptUsec need to be converted into `usec`/`bear` so we can read difficulty settings from bots/types + botType = this.botHelper.isBotPmc(botType) + ? this.botHelper.getPmcSideByRole(botType).toLowerCase() + : botType.toLowerCase(); + const botDetails = botDb[botType]; - if (!botDetails.difficulty) + if (!botDetails?.difficulty) { continue; } - const botDifficulties = Object.keys(botDetails.difficulty); - result[botType] = {}; + const botDifficulties = Object.keys(botDetails.difficulty); + result[enumType] = {}; for (const difficulty of botDifficulties) { - result[botType][difficulty] = this.getBotDifficulty(botType, difficulty, true); + result[enumType][difficulty] = this.getBotDifficulty(enumType, difficulty, true); } } + result["core"] = this.getBotCoreDifficulty(); + return result; } From 76db8ca5e8169d1a7d89634071485bbd4f3b4fd9 Mon Sep 17 00:00:00 2001 From: Dev Date: Wed, 24 Apr 2024 12:39:49 +0100 Subject: [PATCH 12/15] Add `assaultGroup` bot with their settings from game client --- .../database/bots/types/assaultgroup.json | 2263 +++++++++++++++++ 1 file changed, 2263 insertions(+) create mode 100644 project/assets/database/bots/types/assaultgroup.json diff --git a/project/assets/database/bots/types/assaultgroup.json b/project/assets/database/bots/types/assaultgroup.json new file mode 100644 index 00000000..a907a431 --- /dev/null +++ b/project/assets/database/bots/types/assaultgroup.json @@ -0,0 +1,2263 @@ +{ + "appearance": { + "body": { + "619238266c614e6d15792bca": 1 + }, + "feet": { + "5f5e410c6bdad616ad46d60b": 1 + }, + "hands": { + "618cf9540a5a59657e5f5677": 1 + }, + "head": { + "5d28afe786f774292668618d": 1 + }, + "voice": { + "Scav_5": 1 + } + }, + "experience": { + "level": { + "min": 0, + "max": 1 + }, + "reward": { + "min": -1, + "max": -1 + }, + "standingForKill": -0.03, + "aggressorBonus": 0.01 + }, + "health": { + "Hydration": { + "min": 100, + "max": 100 + }, + "Energy": { + "min": 100, + "max": 100 + }, + "Temperature": { + "min": 36, + "max": 40 + }, + "BodyParts": [ + { + "Head": { + "min": 35, + "max": 35 + }, + "Chest": { + "min": 85, + "max": 85 + }, + "Stomach": { + "min": 70, + "max": 70 + }, + "LeftArm": { + "min": 60, + "max": 60 + }, + "RightArm": { + "min": 60, + "max": 60 + }, + "LeftLeg": { + "min": 65, + "max": 65 + }, + "RightLeg": { + "min": 65, + "max": 65 + } + } + ] + }, + "skills": { + "Common": {} + }, + "inventory": { + "equipment": { + "Headwear": { + "59e770f986f7742cbe3164ef": 1 + }, + "Earpiece": {}, + "FaceCover": { + "59e7715586f7742ee5789605": 1 + }, + "ArmorVest": {}, + "Eyewear": {}, + "ArmBand": {}, + "TacticalVest": { + "64be7110bf597ba84a0a41ea": 1 + }, + "Backpack": {}, + "FirstPrimaryWeapon": {}, + "SecondPrimaryWeapon": {}, + "Holster": { + "5448bd6b4bdc2dfc2f8b4569": 1 + }, + "Scabbard": { + "57e26fc7245977162a14b800": 1 + }, + "Pockets": { + "557ffd194bdc2d28148b457f": 1 + }, + "SecuredContainer": { + "5c0a794586f77461c458f892": 1 + } + }, + "Ammo": { + "Caliber9x18PM": { + "57371eb62459776125652ac1": 1 + } + }, + "mods": { + "5448bd6b4bdc2dfc2f8b4569": { + "mod_reciever": [ + "6374a822e629013b9c0645c8" + ], + "mod_pistolgrip": [ + "6374a7e7417239a7bf00f042" + ], + "mod_magazine": [ + "5448c12b4bdc2d02308b456f" + ], + "patron_in_weapon": [ + "57371eb62459776125652ac1" + ] + } + }, + "items": { + "TacticalVest": { + "5448c12b4bdc2d02308b456f": 1 + }, + "Pockets": { + "544fb37f4bdc2dee738b4567": 1 + }, + "Backpack": {}, + "SecuredContainer": { + "57371eb62459776125652ac1": 1 + }, + "SpecialLoot": {} + } + }, + "firstName": [ + "Гоша" + ], + "lastName": [ + "Статтеринг" + ], + "difficulty": { + "easy": { + "Lay": { + "CHECK_SHOOT_WHEN_LAYING": false, + "DELTA_LAY_CHECK": 2, + "DELTA_GETUP": 5, + "DELTA_AFTER_GETUP": 10, + "CLEAR_POINTS_OF_SCARE_SEC": 20, + "MAX_LAY_TIME": 35, + "DELTA_WANT_LAY_CHECL_SEC": 5, + "ATTACK_LAY_CHANCE": 25, + "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, + "DIST_ENEMY_NULL_DANGER_LAY_SQRT": 225, + "DIST_ENEMY_GETUP_LAY": 10, + "DIST_ENEMY_GETUP_LAY_SQRT": 100, + "DIST_ENEMY_CAN_LAY": 15, + "DIST_ENEMY_CAN_LAY_SQRT": 225, + "LAY_AIM": 0.6, + "MIN_CAN_LAY_DIST_SQRT": 121, + "MIN_CAN_LAY_DIST": 11, + "MAX_CAN_LAY_DIST_SQRT": 40000, + "MAX_CAN_LAY_DIST": 200, + "LAY_CHANCE_DANGER": 40, + "DAMAGE_TIME_TO_GETUP": 3 + }, + "Aiming": { + "MAX_AIM_PRECICING": 3, + "BETTER_PRECICING_COEF": 0.7, + "RECALC_DIST": 0.7, + "RECALC_SQR_DIST": 0.48999998, + "COEF_FROM_COVER": 0.8, + "PANIC_COEF": 1.2, + "PANIC_ACCURATY_COEF": 1.2, + "HARD_AIM": 0.75, + "HARD_AIM_CHANCE_100": 10, + "PANIC_TIME": 2, + "RECALC_MUST_TIME": 3, + "DAMAGE_PANIC_TIME": 15, + "DANGER_UP_POINT": 1.3, + "MAX_AIMING_UPGRADE_BY_TIME": 0.85, + "DAMAGE_TO_DISCARD_AIM_0_100": 100, + "MIN_TIME_DISCARD_AIM_SEC": 2.9, + "MAX_TIME_DISCARD_AIM_SEC": 3.2, + "XZ_COEF": 0.75, + "SHOOT_TO_CHANGE_PRIORITY": 5525, + "BOTTOM_COEF": 0.3, + "FIRST_CONTACT_ADD_SEC": 0.1, + "FIRST_CONTACT_ADD_CHANCE_100": 80, + "BASE_HIT_AFFECTION_DELAY_SEC": 1.77, + "BASE_HIT_AFFECTION_MIN_ANG": 14, + "BASE_HIT_AFFECTION_MAX_ANG": 28, + "BASE_SHIEF": 1, + "SCATTERING_HAVE_DAMAGE_COEF": 2, + "SCATTERING_DIST_MODIF": 0.7, + "SCATTERING_DIST_MODIF_CLOSE": 0.85, + "AIMING_TYPE": 5, + "DIST_TO_SHOOT_TO_CENTER": 3, + "DIST_TO_SHOOT_NO_OFFSET": 3, + "SHPERE_FRIENDY_FIRE_SIZE": -1, + "COEF_IF_MOVE": 1.7, + "TIME_COEF_IF_MOVE": 1.5, + "BOT_MOVE_IF_DELTA": 0.01, + "NEXT_SHOT_MISS_CHANCE_100": 100, + "NEXT_SHOT_MISS_Y_OFFSET": 1, + "ANYTIME_LIGHT_WHEN_AIM_100": -1, + "ANY_PART_SHOOT_TIME": 30, + "WEAPON_ROOT_OFFSET": 0.35, + "MIN_DAMAGE_TO_GET_HIT_AFFETS": 1, + "MAX_AIM_TIME": 1.5, + "OFFSET_RECAL_ANYWAY_TIME": 1, + "Y_TOP_OFFSET_COEF": 0.001, + "Y_BOTTOM_OFFSET_COEF": 0.015, + "BASE_SHIEF_STATIONARY_GRENADE": 1.1, + "XZ_COEF_STATIONARY_GRENADE": 0.8 + }, + "Look": { + "OLD_TIME_POINT": 11, + "WAIT_NEW_SENSOR": 2.1, + "WAIT_NEW__LOOK_SENSOR": 7.8, + "LOOK_AROUND_DELTA": 1.1, + "MAX_VISION_GRASS_METERS": 0.4, + "MAX_VISION_GRASS_METERS_FLARE": 7, + "MAX_VISION_GRASS_METERS_OPT": 0.9090909, + "MAX_VISION_GRASS_METERS_FLARE_OPT": 0.125, + "LightOnVisionDistance": 30, + "FAR_DISTANCE": 160, + "FarDeltaTimeSec": 3, + "MIDDLE_DIST": 90, + "MiddleDeltaTimeSec": 1, + "CloseDeltaTimeSec": 0.1, + "POSIBLE_VISION_SPACE": 1.2, + "GOAL_TO_FULL_DISSAPEAR": 0.25, + "GOAL_TO_FULL_DISSAPEAR_SHOOT": 0.0001, + "BODY_DELTA_TIME_SEARCH_SEC": 1.7, + "COME_TO_BODY_DIST": 1.2, + "MARKSMAN_VISIBLE_DIST_COEF": 1.15, + "VISIBLE_DISNACE_WITH_LIGHT": 43, + "ENEMY_LIGHT_ADD": 45, + "ANGLE_FOR_GETUP": 30, + "ENEMY_LIGHT_START_DIST": 40, + "CAN_LOOK_TO_WALL": false, + "CHECK_HEAD_ANY_DIST": false, + "DIST_NOT_TO_IGNORE_WALL": 15, + "DIST_CHECK_WALL": 20, + "LOOK_LAST_POSENEMY_IF_NO_DANGER_SEC": 25, + "MIN_LOOK_AROUD_TIME": 20, + "OPTIMIZE_TO_ONLY_BODY": true + }, + "Shoot": { + "RECOIL_TIME_NORMALIZE": 2, + "RECOIL_PER_METER": 0.1, + "CAN_STOP_SHOOT_CAUSE_ANIMATOR": true, + "MAX_RECOIL_PER_METER": 0.2, + "HORIZONT_RECOIL_COEF": 0.4, + "WAIT_NEXT_SINGLE_SHOT": 0.3, + "WAIT_NEXT_SINGLE_SHOT_LONG_MAX": 3.3, + "WAIT_NEXT_SINGLE_SHOT_LONG_MIN": 0.8, + "MARKSMAN_DIST_SEK_COEF": 44, + "FINGER_HOLD_SINGLE_SHOT": 0.14, + "BASE_AUTOMATIC_TIME": 0.1, + "AUTOMATIC_FIRE_SCATTERING_COEF": 1.5, + "CHANCE_TO_CHANGE_TO_AUTOMATIC_FIRE_100": 76, + "FAR_DIST_ENEMY": 20, + "SHOOT_FROM_COVER": 4, + "FAR_DIST_ENEMY_SQR": 400, + "MAX_DIST_COEF": 1.35, + "RECOIL_DELTA_PRESS": 0.15, + "RUN_DIST_NO_AMMO": 25, + "RUN_DIST_NO_AMMO_SQRT": 625, + "CAN_SHOOTS_TIME_TO_AMBUSH": 333, + "NOT_TO_SEE_ENEMY_TO_WANT_RELOAD_PERCENT": 0.5, + "NOT_TO_SEE_ENEMY_TO_WANT_RELOAD_SEC": 2, + "RELOAD_PECNET_NO_ENEMY": 0.6, + "CHANCE_TO_CHANGE_WEAPON": 0, + "CHANCE_TO_CHANGE_WEAPON_WITH_HELMET": 0, + "LOW_DIST_TO_CHANGE_WEAPON": 10, + "FAR_DIST_TO_CHANGE_WEAPON": 50, + "SUPPRESS_BY_SHOOT_TIME": 6, + "SUPPRESS_TRIGGERS_DOWN": 3, + "WAIT_NEXT_STATIONARY_GRENADE": 1, + "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, + "REACH_DIST": 0.5, + "REACH_DIST_RUN": 0.8, + "START_SLOW_DIST": 1.5, + "BASESTART_SLOW_DIST": 1.1, + "SLOW_COEF": 7, + "DIST_TO_CAN_CHANGE_WAY": 8, + "DIST_TO_START_RAYCAST": 15, + "BASE_START_SERACH": 35, + "UPDATE_TIME_RECAL_WAY": 7, + "FAR_DIST": 4, + "FAR_DIST_SQR": 16, + "DIST_TO_CAN_CHANGE_WAY_SQR": 64, + "DIST_TO_START_RAYCAST_SQR": 225, + "BASE_SQRT_START_SERACH": 1225, + "Y_APPROXIMATION": 0.7, + "DELTA_LAST_SEEN_ENEMY": 20, + "REACH_DIST_COVER": 2, + "RUN_TO_COVER_MIN": 2, + "CHANCE_TO_RUN_IF_NO_AMMO_0_100": 100, + "RUN_IF_CANT_SHOOT": false, + "RUN_IF_GAOL_FAR_THEN": 10, + "SEC_TO_CHANGE_TO_RUN": 3 + }, + "Grenade": { + "DELTA_NEXT_ATTEMPT_FROM_COVER": 5, + "DELTA_NEXT_ATTEMPT": 10, + "MIN_DIST_NOT_TO_THROW": 8, + "NEAR_DELTA_THROW_TIME_SEC": 2, + "MIN_THROW_GRENADE_DIST": 12, + "MIN_THROW_GRENADE_DIST_SQRT": 144, + "MIN_DIST_NOT_TO_THROW_SQR": 64, + "RUN_AWAY": 22, + "RUN_AWAY_SQR": 484, + "ADD_GRENADE_AS_DANGER": 65, + "ADD_GRENADE_AS_DANGER_SQR": 4225, + "CHANCE_TO_NOTIFY_ENEMY_GR_100": 99, + "GrenadePerMeter": 0.2, + "REQUEST_DIST_MUST_THROW_SQRT": 4, + "REQUEST_DIST_MUST_THROW": 2, + "BEWARE_TYPE": 2, + "SHOOT_TO_SMOKE_CHANCE_100": 30, + "CHANCE_RUN_FLASHED_100": 0, + "MAX_FLASHED_DIST_TO_SHOOT": 10, + "MAX_FLASHED_DIST_TO_SHOOT_SQRT": 100, + "FLASH_GRENADE_TIME_COEF": 0.3, + "SIZE_SPOTTED_COEF": 2, + "BE_ATTENTION_COEF": 4, + "TIME_SHOOT_TO_FLASH": 4, + "CLOSE_TO_SMOKE_TO_SHOOT": 5, + "CLOSE_TO_SMOKE_TO_SHOOT_SQRT": 25, + "CLOSE_TO_SMOKE_TIME_DELTA": 7, + "SMOKE_CHECK_DELTA": 1, + "DELTA_GRENADE_START_TIME": 0.7, + "AMBUSH_IF_SMOKE_IN_ZONE_100": 40, + "AMBUSH_IF_SMOKE_RETURN_TO_ATTACK_SEC": 30, + "NO_RUN_FROM_AI_GRENADES": false, + "MAX_THROW_POWER": 15.7, + "GrenadePrecision": 0.3, + "STOP_WHEN_THROW_GRENADE": true, + "WAIT_TIME_TURN_AWAY": 0.2, + "SMOKE_SUPPRESS_DELTA": 20, + "DAMAGE_GRENADE_SUPPRESS_DELTA": 8, + "STUN_SUPPRESS_DELTA": 9, + "CHEAT_START_GRENADE_PLACE": false, + "CAN_THROW_STRAIGHT_CONTACT": true, + "STRAIGHT_CONTACT_DELTA_SEC": -1, + "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, + "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, + "FLASH_ACCURATY": 1.6, + "FLASH_LAY_CHANCE": 1, + "STUN_HEARING": 0.01 + }, + "Cover": { + "RETURN_TO_ATTACK_AFTER_AMBUSH_MIN": 20, + "RETURN_TO_ATTACK_AFTER_AMBUSH_MAX": 50, + "SOUND_TO_GET_SPOTTED": 2, + "TIME_TO_MOVE_TO_COVER": 15, + "MAX_DIST_OF_COVER": 4, + "CHANGE_RUN_TO_COVER_SEC": 5, + "CHANGE_RUN_TO_COVER_SEC_GREANDE": 0.6, + "MIN_DIST_TO_ENEMY": 9, + "DIST_CANT_CHANGE_WAY": 5, + "DIST_CHECK_SFETY": 9, + "TIME_CHECK_SAFE": 2, + "HIDE_TO_COVER_TIME": 1.5, + "MAX_DIST_OF_COVER_SQR": 16, + "DIST_CANT_CHANGE_WAY_SQR": 25, + "SPOTTED_COVERS_RADIUS": 3, + "LOOK_LAST_ENEMY_POS_MOVING": 1.5, + "LOOK_TO_HIT_POINT_IF_LAST_ENEMY": 3, + "LOOK_LAST_ENEMY_POS_LOOKAROUND": 45, + "OFFSET_LOOK_ALONG_WALL_ANG": 20, + "SPOTTED_GRENADE_RADIUS": 16, + "MAX_SPOTTED_TIME_SEC": 45, + "WAIT_INT_COVER_FINDING_ENEMY": 2, + "CLOSE_DIST_POINT_SQRT": 4, + "DELTA_SEEN_FROM_COVE_LAST_POS": 15, + "MOVE_TO_COVER_WHEN_TARGET": false, + "RUN_COVER_IF_CAN_AND_NO_ENEMIES": false, + "SPOTTED_GRENADE_TIME": 7, + "DEPENDS_Y_DIST_TO_BOT": false, + "RUN_IF_FAR": 10, + "RUN_IF_FAR_SQRT": 225, + "STAY_IF_FAR": 25, + "STAY_IF_FAR_SQRT": 625, + "CHECK_COVER_ENEMY_LOOK": true, + "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, + "NOT_LOOK_AT_WALL_IS_DANGER": true, + "MIN_DEFENCE_LEVEL": 22, + "GOOD_DIST_TO_POINT_COEF": 1.8, + "ENEMY_DIST_TO_GO_OUT": 1, + "STATIONARY_WEAPON_NO_ENEMY_GETUP": 20, + "STATIONARY_WEAPON_MAX_DIST_TO_USE": 25 + }, + "Patrol": { + "DEAD_BODY_LOOK_PERIOD": 8, + "LOOK_TIME_BASE": 12, + "CAN_CHOOSE_RESERV": false, + "DO_RANDOM_DROP_ITEM": true, + "TRY_CHOOSE_RESERV_WAY_ON_START": false, + "CAN_LOOK_TO_DEADBODIES": true, + "CAN_FRIENDLY_TILT": true, + "CAN_HARD_AIM": true, + "RESERVE_TIME_STAY": 72, + "FRIEND_SEARCH_SEC": 12, + "TALK_DELAY": 1.1, + "MIN_TALK_DELAY": 35, + "TALK_DELAY_BIG": 15.1, + "CHANGE_WAY_TIME": 125.1, + "MIN_DIST_TO_CLOSE_TALK": 5, + "VISION_DIST_COEF_PEACE": 0.5, + "MIN_DIST_TO_CLOSE_TALK_SQR": 25, + "CHANCE_TO_CUT_WAY_0_100": 75, + "CUT_WAY_MIN_0_1": 0.4, + "CUT_WAY_MAX_0_1": 0.65, + "CHANCE_TO_CHANGE_WAY_0_100": 50, + "CHANCE_TO_SHOOT_DEADBODY": 52, + "SUSPETION_PLACE_LIFETIME": 7, + "RESERVE_OUT_TIME": 30, + "CLOSE_TO_SELECT_RESERV_WAY": 25, + "MAX_YDIST_TO_START_WARN_REQUEST_TO_REQUESTER": 5, + "CAN_WATCH_SECOND_WEAPON": true + }, + "Hearing": { + "BOT_CLOSE_PANIC_DIST": 2, + "CHANCE_TO_HEAR_SIMPLE_SOUND_0_1": 0.45, + "DISPERSION_COEF": 1.6, + "CLOSE_DIST": 10, + "FAR_DIST": 30, + "SOUND_DIR_DEEFREE": 30, + "DIST_PLACE_TO_FIND_POINT": 70, + "DEAD_BODY_SOUND_RAD": 30, + "LOOK_ONLY_DANGER": false, + "RESET_TIMER_DIST": 17, + "HEAR_DELAY_WHEN_PEACE": 0.85, + "HEAR_DELAY_WHEN_HAVE_SMT": 0.56, + "LOOK_ONLY_DANGER_DELTA": 9 + }, + "Mind": { + "HOW_WORK_OVER_DEAD_BODY": 2, + "MIN_SHOOTS_TIME": 2, + "MAX_SHOOTS_TIME": 4, + "TIME_LEAVE_MAP": 23, + "TIME_TO_RUN_TO_COVER_CAUSE_SHOOT_SEC": 15, + "DAMAGE_REDUCTION_TIME_SEC": 20, + "MIN_DAMAGE_SCARE": 20, + "CHANCE_TO_RUN_CAUSE_DAMAGE_0_100": 35, + "TIME_TO_FORGOR_ABOUT_ENEMY_SEC": 52, + "TIME_TO_FIND_ENEMY": 22, + "MAX_AGGRO_BOT_DIST": 100, + "HIT_POINT_DETECTION": 4, + "DANGER_POINT_CHOOSE_COEF": 1, + "FOLLOWER_AND_BOSS_WARN_EQUAL_PRIORITY": true, + "SIMPLE_POINT_CHOOSE_COEF": 0.4, + "LASTSEEN_POINT_CHOOSE_COEF": 0.2, + "COVER_DIST_COEF": 1.5, + "DIST_TO_FOUND_SQRT": 400, + "MAX_AGGRO_BOT_DIST_SQR": 10000, + "DIST_TO_STOP_RUN_ENEMY": 15, + "ENEMY_LOOK_AT_ME_ANG": 15, + "MIN_START_AGGRESION_COEF": 1, + "MAX_START_AGGRESION_COEF": 3, + "BULLET_FEEL_DIST": 360, + "BULLET_FEEL_CLOSE_SDIST": 1, + "ATTACK_IMMEDIATLY_CHANCE_0_100": 40, + "CHANCE_FUCK_YOU_ON_CONTACT_100": 10, + "FRIEND_DEAD_AGR_LOW": -0.2, + "FRIEND_AGR_KILL": 0.2, + "LAST_ENEMY_LOOK_TO": 40, + "SURGE_KIT_ONLY_SAFE_CONTAINER": false, + "CHECK_MARK_OF_UNKNOWS": true, + "CAN_RECEIVE_PLAYER_REQUESTS_SAVAGE": true, + "CAN_RECEIVE_PLAYER_REQUESTS_BEAR": false, + "CAN_RECEIVE_PLAYER_REQUESTS_USEC": false, + "CAN_TAKE_ITEMS": true, + "CAN_USE_MEDS": true, + "SUSPETION_POINT_CHANCE_ADD100": 0, + "AMBUSH_WHEN_UNDER_FIRE": true, + "AMBUSH_WHEN_UNDER_FIRE_TIME_RESIST": 60, + "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, + "PROTECT_TIME_REAL": true, + "CHANCE_SHOOT_WHEN_WARN_PLAYER_100": 25, + "CAN_PANIC_IS_PROTECT": false, + "NO_RUN_AWAY_FOR_SAFE": false, + "PART_PERCENT_TO_HEAL": 0.65, + "PROTECT_DELTA_HEAL_SEC": 10, + "CAN_STAND_BY": true, + "CAN_THROW_REQUESTS": true, + "GROUP_ANY_PHRASE_DELAY": 1, + "GROUP_EXACTLY_PHRASE_DELAY": 24, + "DIST_TO_ENEMY_YO_CAN_HEAL": 30, + "CHANCE_TO_STAY_WHEN_WARN_PLAYER_100": 80, + "DOG_FIGHT_OUT": 6, + "DOG_FIGHT_IN": 3, + "SHOOT_INSTEAD_DOG_FIGHT": 9, + "PISTOL_SHOTGUN_AMBUSH_DIST": 60, + "STANDART_AMBUSH_DIST": 200, + "AI_POWER_COEF": 120, + "COVER_SECONDS_AFTER_LOSE_VISION": 10, + "COVER_SELF_ALWAYS_IF_DAMAGED": false, + "SEC_TO_MORE_DIST_TO_RUN": 10, + "HEAL_DELAY_SEC": 5, + "HIT_DELAY_WHEN_HAVE_SMT": -1, + "HIT_DELAY_WHEN_PEACE": -1, + "TALK_WITH_QUERY": true, + "WILL_PERSUE_AXEMAN": true, + "MAY_BE_CALLED_FOR_HELP": true + }, + "Boss": { + "BOSS_DIST_TO_WARNING": 34, + "BOSS_DIST_TO_WARNING_SQRT": 1156, + "BOSS_DIST_TO_WARNING_OUT": 43, + "BOSS_DIST_TO_WARNING_OUT_SQRT": 1849, + "BOSS_DIST_TO_SHOOT": 16, + "BOSS_DIST_TO_SHOOT_SQRT": 256, + "CHANCE_TO_SEND_GRENADE_100": 100, + "MAX_DIST_COVER_BOSS": 25, + "MAX_DIST_COVER_BOSS_SQRT": 625, + "MAX_DIST_DECIDER_TO_SEND": 35, + "MAX_DIST_DECIDER_TO_SEND_SQRT": 1225, + "TIME_AFTER_LOSE": 15, + "TIME_AFTER_LOSE_DELTA": 60, + "PERSONS_SEND": 2, + "DELTA_SEARCH_TIME": 18, + "COVER_TO_SEND": true, + "WAIT_NO_ATTACK_SAVAGE": 10, + "CHANCE_USE_RESERVE_PATROL_100": 50, + "KILLA_Y_DELTA_TO_BE_ENEMY_BOSS": 5, + "KILLA_DITANCE_TO_BE_ENEMY_BOSS": 45, + "KILLA_START_SEARCH_SEC": 40, + "KILLA_CONTUTION_TIME": 5, + "KILLA_CLOSE_ATTACK_DIST": 8, + "KILLA_MIDDLE_ATTACK_DIST": 22, + "KILLA_LARGE_ATTACK_DIST": 41, + "KILLA_SEARCH_METERS": 30, + "KILLA_DEF_DIST_SQRT": 225, + "KILLA_SEARCH_SEC_STOP_AFTER_COMING": 25, + "KILLA_DIST_TO_GO_TO_SUPPRESS": 6, + "KILLA_AFTER_GRENADE_SUPPRESS_DELAY": 2, + "KILLA_CLOSEATTACK_TIMES": 3, + "KILLA_CLOSEATTACK_DELAY": 10, + "KILLA_HOLD_DELAY": 5, + "KILLA_BULLET_TO_RELOAD": 15, + "SHALL_WARN": true, + "KILLA_ENEMIES_TO_ATTACK": 3, + "KILLA_ONE_IS_CLOSE": 30, + "KILLA_TRIGGER_DOWN_DELAY": 1, + "KILLA_WAIT_IN_COVER_COEF": 1 + }, + "Core": { + "VisibleAngle": 130, + "VisibleDistance": 110, + "GainSightCoef": 0.2, + "ScatteringPerMeter": 0.07, + "ScatteringClosePerMeter": 0.12, + "DamageCoeff": 1, + "HearingSense": 1.05, + "CanRun": true, + "CanGrenade": true, + "AimingType": "normal", + "PistolFireDistancePref": 35, + "ShotgunFireDistancePref": 50, + "RifleFireDistancePref": 100, + "AccuratySpeed": 0.3, + "WaitInCoverBetweenShotsSec": 1.5 + }, + "Scattering": { + "MinScatter": 0.015, + "WorkingScatter": 0.15, + "MaxScatter": 0.3, + "SpeedUp": 0.6, + "SpeedUpAim": 1.8, + "SpeedDown": -0.2, + "ToSlowBotSpeed": 1.8, + "ToLowBotSpeed": 2.8, + "ToUpBotSpeed": 4.3, + "MovingSlowCoef": 1.4, + "ToLowBotAngularSpeed": 140, + "ToStopBotAngularSpeed": 80, + "FromShot": 0.001, + "TracerCoef": 1.3, + "HandDamageScatteringMinMax": 0.7, + "HandDamageAccuracySpeed": 1.3, + "BloodFall": 1.45, + "Caution": 0.03, + "ToCaution": 0.6, + "RecoilControlCoefShootDone": 0.0003, + "RecoilControlCoefShootDoneAuto": 0.00015, + "AMPLITUDE_FACTOR": 0.015, + "AMPLITUDE_SPEED": 0.001, + "DIST_FROM_OLD_POINT_TO_NOT_AIM": 15, + "DIST_FROM_OLD_POINT_TO_NOT_AIM_SQRT": 225, + "DIST_NOT_TO_SHOOT": 0.3, + "PoseChnageCoef": 0.1, + "LayFactor": 0.1, + "RecoilYCoef": 0.0005, + "RecoilYCoefSppedDown": -0.52, + "RecoilYMax": 1 + } + }, + "normal": { + "Lay": { + "CHECK_SHOOT_WHEN_LAYING": false, + "DELTA_LAY_CHECK": 2, + "DELTA_GETUP": 5, + "DELTA_AFTER_GETUP": 10, + "CLEAR_POINTS_OF_SCARE_SEC": 20, + "MAX_LAY_TIME": 35, + "DELTA_WANT_LAY_CHECL_SEC": 5, + "ATTACK_LAY_CHANCE": 25, + "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, + "DIST_ENEMY_NULL_DANGER_LAY_SQRT": 225, + "DIST_ENEMY_GETUP_LAY": 10, + "DIST_ENEMY_GETUP_LAY_SQRT": 100, + "DIST_ENEMY_CAN_LAY": 15, + "DIST_ENEMY_CAN_LAY_SQRT": 225, + "LAY_AIM": 0.6, + "MIN_CAN_LAY_DIST_SQRT": 121, + "MIN_CAN_LAY_DIST": 11, + "MAX_CAN_LAY_DIST_SQRT": 40000, + "MAX_CAN_LAY_DIST": 200, + "LAY_CHANCE_DANGER": 40, + "DAMAGE_TIME_TO_GETUP": 3 + }, + "Aiming": { + "MAX_AIM_PRECICING": 2, + "BETTER_PRECICING_COEF": 0.8, + "RECALC_DIST": 0.7, + "RECALC_SQR_DIST": 0.48999998, + "COEF_FROM_COVER": 0.75, + "PANIC_COEF": 1.2, + "PANIC_ACCURATY_COEF": 1.2, + "HARD_AIM": 0.75, + "HARD_AIM_CHANCE_100": 50, + "PANIC_TIME": 2, + "RECALC_MUST_TIME": 3, + "DAMAGE_PANIC_TIME": 15, + "DANGER_UP_POINT": 1.3, + "MAX_AIMING_UPGRADE_BY_TIME": 0.85, + "DAMAGE_TO_DISCARD_AIM_0_100": 96, + "MIN_TIME_DISCARD_AIM_SEC": 2.3, + "MAX_TIME_DISCARD_AIM_SEC": 3.1, + "XZ_COEF": 0.65, + "SHOOT_TO_CHANGE_PRIORITY": 5525, + "BOTTOM_COEF": 0.25, + "FIRST_CONTACT_ADD_SEC": 0.05, + "FIRST_CONTACT_ADD_CHANCE_100": 80, + "BASE_HIT_AFFECTION_DELAY_SEC": 1.17, + "BASE_HIT_AFFECTION_MIN_ANG": 14, + "BASE_HIT_AFFECTION_MAX_ANG": 24, + "BASE_SHIEF": 0.8, + "SCATTERING_HAVE_DAMAGE_COEF": 2, + "SCATTERING_DIST_MODIF": 0.7, + "SCATTERING_DIST_MODIF_CLOSE": 0.82, + "AIMING_TYPE": 5, + "DIST_TO_SHOOT_TO_CENTER": 3, + "DIST_TO_SHOOT_NO_OFFSET": 3, + "SHPERE_FRIENDY_FIRE_SIZE": -1, + "COEF_IF_MOVE": 1.6, + "TIME_COEF_IF_MOVE": 1.5, + "BOT_MOVE_IF_DELTA": 0.01, + "NEXT_SHOT_MISS_CHANCE_100": 100, + "NEXT_SHOT_MISS_Y_OFFSET": 1, + "ANYTIME_LIGHT_WHEN_AIM_100": -1, + "ANY_PART_SHOOT_TIME": 30, + "WEAPON_ROOT_OFFSET": 0.35, + "MIN_DAMAGE_TO_GET_HIT_AFFETS": 1, + "MAX_AIM_TIME": 1.5, + "OFFSET_RECAL_ANYWAY_TIME": 1, + "Y_TOP_OFFSET_COEF": 0.001, + "Y_BOTTOM_OFFSET_COEF": 0.015, + "BASE_SHIEF_STATIONARY_GRENADE": 1.1, + "XZ_COEF_STATIONARY_GRENADE": 0.8 + }, + "Look": { + "OLD_TIME_POINT": 11, + "WAIT_NEW_SENSOR": 2.1, + "ANGLE_FOR_GETUP": 30, + "WAIT_NEW__LOOK_SENSOR": 7.8, + "LOOK_AROUND_DELTA": 1.1, + "MAX_VISION_GRASS_METERS": 0.4, + "MAX_VISION_GRASS_METERS_FLARE": 7, + "MAX_VISION_GRASS_METERS_OPT": 0.9090909, + "MAX_VISION_GRASS_METERS_FLARE_OPT": 0.125, + "LightOnVisionDistance": 30, + "FAR_DISTANCE": 160, + "FarDeltaTimeSec": 3, + "MIDDLE_DIST": 90, + "MiddleDeltaTimeSec": 1, + "CloseDeltaTimeSec": 0.1, + "POSIBLE_VISION_SPACE": 1.2, + "GOAL_TO_FULL_DISSAPEAR": 0.25, + "GOAL_TO_FULL_DISSAPEAR_SHOOT": 0.0001, + "BODY_DELTA_TIME_SEARCH_SEC": 1.7, + "COME_TO_BODY_DIST": 1.2, + "MARKSMAN_VISIBLE_DIST_COEF": 1.15, + "VISIBLE_DISNACE_WITH_LIGHT": 43, + "ENEMY_LIGHT_ADD": 45, + "ENEMY_LIGHT_START_DIST": 40, + "CAN_LOOK_TO_WALL": false, + "CHECK_HEAD_ANY_DIST": false, + "DIST_NOT_TO_IGNORE_WALL": 15, + "DIST_CHECK_WALL": 20, + "LOOK_LAST_POSENEMY_IF_NO_DANGER_SEC": 25, + "MIN_LOOK_AROUD_TIME": 20, + "OPTIMIZE_TO_ONLY_BODY": true + }, + "Shoot": { + "RECOIL_TIME_NORMALIZE": 2, + "CAN_STOP_SHOOT_CAUSE_ANIMATOR": true, + "RECOIL_PER_METER": 0.1, + "MAX_RECOIL_PER_METER": 0.2, + "HORIZONT_RECOIL_COEF": 0.4, + "WAIT_NEXT_SINGLE_SHOT": 0.3, + "WAIT_NEXT_SINGLE_SHOT_LONG_MAX": 3.3, + "WAIT_NEXT_SINGLE_SHOT_LONG_MIN": 0.8, + "MARKSMAN_DIST_SEK_COEF": 44, + "FINGER_HOLD_SINGLE_SHOT": 0.14, + "BASE_AUTOMATIC_TIME": 0.1, + "AUTOMATIC_FIRE_SCATTERING_COEF": 1.5, + "CHANCE_TO_CHANGE_TO_AUTOMATIC_FIRE_100": 76, + "FAR_DIST_ENEMY": 20, + "SHOOT_FROM_COVER": 4, + "FAR_DIST_ENEMY_SQR": 400, + "MAX_DIST_COEF": 1.35, + "RECOIL_DELTA_PRESS": 0.15, + "RUN_DIST_NO_AMMO": 25, + "RUN_DIST_NO_AMMO_SQRT": 625, + "CAN_SHOOTS_TIME_TO_AMBUSH": 333, + "NOT_TO_SEE_ENEMY_TO_WANT_RELOAD_PERCENT": 0.5, + "NOT_TO_SEE_ENEMY_TO_WANT_RELOAD_SEC": 2, + "RELOAD_PECNET_NO_ENEMY": 0.6, + "CHANCE_TO_CHANGE_WEAPON": 0, + "CHANCE_TO_CHANGE_WEAPON_WITH_HELMET": 0, + "LOW_DIST_TO_CHANGE_WEAPON": 10, + "FAR_DIST_TO_CHANGE_WEAPON": 50, + "SUPPRESS_BY_SHOOT_TIME": 6, + "SUPPRESS_TRIGGERS_DOWN": 3, + "WAIT_NEXT_STATIONARY_GRENADE": 1, + "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, + "REACH_DIST": 0.5, + "REACH_DIST_RUN": 0.8, + "START_SLOW_DIST": 1.5, + "BASESTART_SLOW_DIST": 1.1, + "SLOW_COEF": 7, + "DIST_TO_CAN_CHANGE_WAY": 8, + "DIST_TO_START_RAYCAST": 15, + "BASE_START_SERACH": 35, + "UPDATE_TIME_RECAL_WAY": 7, + "FAR_DIST": 4, + "FAR_DIST_SQR": 16, + "DIST_TO_CAN_CHANGE_WAY_SQR": 64, + "DIST_TO_START_RAYCAST_SQR": 225, + "BASE_SQRT_START_SERACH": 1225, + "Y_APPROXIMATION": 0.7, + "DELTA_LAST_SEEN_ENEMY": 20, + "REACH_DIST_COVER": 2, + "RUN_TO_COVER_MIN": 2, + "CHANCE_TO_RUN_IF_NO_AMMO_0_100": 100, + "RUN_IF_CANT_SHOOT": false, + "RUN_IF_GAOL_FAR_THEN": 10, + "SEC_TO_CHANGE_TO_RUN": 3 + }, + "Grenade": { + "DELTA_NEXT_ATTEMPT_FROM_COVER": 5, + "DELTA_NEXT_ATTEMPT": 10, + "MIN_DIST_NOT_TO_THROW": 8, + "NEAR_DELTA_THROW_TIME_SEC": 2, + "MIN_THROW_GRENADE_DIST": 12, + "MIN_THROW_GRENADE_DIST_SQRT": 144, + "MIN_DIST_NOT_TO_THROW_SQR": 64, + "RUN_AWAY": 22, + "RUN_AWAY_SQR": 484, + "ADD_GRENADE_AS_DANGER": 65, + "ADD_GRENADE_AS_DANGER_SQR": 4225, + "CHANCE_TO_NOTIFY_ENEMY_GR_100": 99, + "GrenadePerMeter": 0.15, + "REQUEST_DIST_MUST_THROW_SQRT": 4, + "REQUEST_DIST_MUST_THROW": 2, + "BEWARE_TYPE": 2, + "SHOOT_TO_SMOKE_CHANCE_100": 30, + "CHANCE_RUN_FLASHED_100": 0, + "MAX_FLASHED_DIST_TO_SHOOT": 10, + "MAX_FLASHED_DIST_TO_SHOOT_SQRT": 100, + "FLASH_GRENADE_TIME_COEF": 0.3, + "SIZE_SPOTTED_COEF": 2, + "BE_ATTENTION_COEF": 4, + "TIME_SHOOT_TO_FLASH": 4, + "CLOSE_TO_SMOKE_TO_SHOOT": 5, + "CLOSE_TO_SMOKE_TO_SHOOT_SQRT": 25, + "CLOSE_TO_SMOKE_TIME_DELTA": 7, + "SMOKE_CHECK_DELTA": 1, + "DELTA_GRENADE_START_TIME": 0.7, + "AMBUSH_IF_SMOKE_IN_ZONE_100": 40, + "AMBUSH_IF_SMOKE_RETURN_TO_ATTACK_SEC": 30, + "NO_RUN_FROM_AI_GRENADES": false, + "MAX_THROW_POWER": 16.7, + "GrenadePrecision": 0.2, + "STOP_WHEN_THROW_GRENADE": true, + "WAIT_TIME_TURN_AWAY": 0.2, + "SMOKE_SUPPRESS_DELTA": 20, + "DAMAGE_GRENADE_SUPPRESS_DELTA": 8, + "STUN_SUPPRESS_DELTA": 9, + "CHEAT_START_GRENADE_PLACE": false, + "CAN_THROW_STRAIGHT_CONTACT": true, + "STRAIGHT_CONTACT_DELTA_SEC": -1, + "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, + "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, + "FLASH_ACCURATY": 1.6, + "FLASH_LAY_CHANCE": 1, + "STUN_HEARING": 0.01 + }, + "Cover": { + "RETURN_TO_ATTACK_AFTER_AMBUSH_MIN": 20, + "RETURN_TO_ATTACK_AFTER_AMBUSH_MAX": 50, + "SOUND_TO_GET_SPOTTED": 2, + "TIME_TO_MOVE_TO_COVER": 15, + "MAX_DIST_OF_COVER": 4, + "CHANGE_RUN_TO_COVER_SEC": 5, + "CHANGE_RUN_TO_COVER_SEC_GREANDE": 0.6, + "MIN_DIST_TO_ENEMY": 9, + "DIST_CANT_CHANGE_WAY": 5, + "DIST_CHECK_SFETY": 9, + "TIME_CHECK_SAFE": 2, + "HIDE_TO_COVER_TIME": 1.5, + "MAX_DIST_OF_COVER_SQR": 16, + "DIST_CANT_CHANGE_WAY_SQR": 25, + "SPOTTED_COVERS_RADIUS": 3, + "LOOK_LAST_ENEMY_POS_MOVING": 1.5, + "LOOK_TO_HIT_POINT_IF_LAST_ENEMY": 3, + "LOOK_LAST_ENEMY_POS_LOOKAROUND": 45, + "OFFSET_LOOK_ALONG_WALL_ANG": 20, + "SPOTTED_GRENADE_RADIUS": 16, + "MAX_SPOTTED_TIME_SEC": 45, + "WAIT_INT_COVER_FINDING_ENEMY": 2, + "CLOSE_DIST_POINT_SQRT": 4, + "DELTA_SEEN_FROM_COVE_LAST_POS": 15, + "MOVE_TO_COVER_WHEN_TARGET": false, + "RUN_COVER_IF_CAN_AND_NO_ENEMIES": false, + "SPOTTED_GRENADE_TIME": 7, + "DEPENDS_Y_DIST_TO_BOT": false, + "RUN_IF_FAR": 7, + "RUN_IF_FAR_SQRT": 225, + "STAY_IF_FAR": 25, + "STAY_IF_FAR_SQRT": 625, + "CHECK_COVER_ENEMY_LOOK": true, + "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, + "NOT_LOOK_AT_WALL_IS_DANGER": true, + "MIN_DEFENCE_LEVEL": 22, + "GOOD_DIST_TO_POINT_COEF": 1.8, + "ENEMY_DIST_TO_GO_OUT": 1, + "STATIONARY_WEAPON_NO_ENEMY_GETUP": 20, + "STATIONARY_WEAPON_MAX_DIST_TO_USE": 25 + }, + "Patrol": { + "DEAD_BODY_LOOK_PERIOD": 8, + "LOOK_TIME_BASE": 12, + "CAN_FRIENDLY_TILT": true, + "CAN_HARD_AIM": true, + "CAN_CHOOSE_RESERV": false, + "DO_RANDOM_DROP_ITEM": true, + "TRY_CHOOSE_RESERV_WAY_ON_START": false, + "CAN_LOOK_TO_DEADBODIES": true, + "RESERVE_TIME_STAY": 72, + "FRIEND_SEARCH_SEC": 12, + "TALK_DELAY": 1.1, + "MIN_TALK_DELAY": 35, + "TALK_DELAY_BIG": 15.1, + "CHANGE_WAY_TIME": 125.1, + "MIN_DIST_TO_CLOSE_TALK": 5, + "VISION_DIST_COEF_PEACE": 0.75, + "MIN_DIST_TO_CLOSE_TALK_SQR": 25, + "CHANCE_TO_CUT_WAY_0_100": 75, + "CUT_WAY_MIN_0_1": 0.4, + "CUT_WAY_MAX_0_1": 0.65, + "CHANCE_TO_CHANGE_WAY_0_100": 50, + "CHANCE_TO_SHOOT_DEADBODY": 52, + "SUSPETION_PLACE_LIFETIME": 7, + "RESERVE_OUT_TIME": 30, + "CLOSE_TO_SELECT_RESERV_WAY": 25, + "MAX_YDIST_TO_START_WARN_REQUEST_TO_REQUESTER": 5, + "CAN_WATCH_SECOND_WEAPON": true + }, + "Hearing": { + "BOT_CLOSE_PANIC_DIST": 2, + "CHANCE_TO_HEAR_SIMPLE_SOUND_0_1": 0.65, + "DISPERSION_COEF": 2.6, + "CLOSE_DIST": 10, + "FAR_DIST": 30, + "SOUND_DIR_DEEFREE": 30, + "DIST_PLACE_TO_FIND_POINT": 70, + "DEAD_BODY_SOUND_RAD": 30, + "LOOK_ONLY_DANGER": false, + "RESET_TIMER_DIST": 17, + "HEAR_DELAY_WHEN_PEACE": 0.75, + "HEAR_DELAY_WHEN_HAVE_SMT": 0.5, + "LOOK_ONLY_DANGER_DELTA": 9 + }, + "Mind": { + "HOW_WORK_OVER_DEAD_BODY": 2, + "MIN_SHOOTS_TIME": 2, + "MAX_SHOOTS_TIME": 4, + "TIME_LEAVE_MAP": 23, + "TIME_TO_RUN_TO_COVER_CAUSE_SHOOT_SEC": 15, + "DAMAGE_REDUCTION_TIME_SEC": 20, + "MIN_DAMAGE_SCARE": 20, + "CHANCE_TO_RUN_CAUSE_DAMAGE_0_100": 35, + "TIME_TO_FORGOR_ABOUT_ENEMY_SEC": 52, + "TIME_TO_FIND_ENEMY": 22, + "MAX_AGGRO_BOT_DIST": 100, + "HIT_POINT_DETECTION": 4, + "DANGER_POINT_CHOOSE_COEF": 1, + "SIMPLE_POINT_CHOOSE_COEF": 0.4, + "LASTSEEN_POINT_CHOOSE_COEF": 0.2, + "COVER_DIST_COEF": 1.5, + "DIST_TO_FOUND_SQRT": 400, + "MAX_AGGRO_BOT_DIST_SQR": 10000, + "FOLLOWER_AND_BOSS_WARN_EQUAL_PRIORITY": true, + "CHECK_MARK_OF_UNKNOWS": true, + "DIST_TO_STOP_RUN_ENEMY": 15, + "ENEMY_LOOK_AT_ME_ANG": 15, + "MIN_START_AGGRESION_COEF": 1, + "MAX_START_AGGRESION_COEF": 3, + "CAN_TAKE_ITEMS": true, + "BULLET_FEEL_DIST": 360, + "BULLET_FEEL_CLOSE_SDIST": 1, + "ATTACK_IMMEDIATLY_CHANCE_0_100": 40, + "CHANCE_FUCK_YOU_ON_CONTACT_100": 10, + "FRIEND_DEAD_AGR_LOW": -0.2, + "FRIEND_AGR_KILL": 0.2, + "LAST_ENEMY_LOOK_TO": 40, + "SURGE_KIT_ONLY_SAFE_CONTAINER": false, + "CAN_RECIVE_PLAYER_REQUESTS": true, + "CAN_RECEIVE_PLAYER_REQUESTS_SAVAGE": true, + "CAN_RECEIVE_PLAYER_REQUESTS_BEAR": false, + "CAN_RECEIVE_PLAYER_REQUESTS_USEC": false, + "DEFAULT_ENEMY_SAVAGE": true, + "WARN_BOT_TYPES": [], + "ENEMY_BOT_TYPES": [], + "CAN_USE_MEDS": true, + "SUSPETION_POINT_CHANCE_ADD100": 0, + "AMBUSH_WHEN_UNDER_FIRE": true, + "AMBUSH_WHEN_UNDER_FIRE_TIME_RESIST": 60, + "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, + "PROTECT_TIME_REAL": true, + "CHANCE_SHOOT_WHEN_WARN_PLAYER_100": 25, + "CAN_PANIC_IS_PROTECT": false, + "NO_RUN_AWAY_FOR_SAFE": false, + "PART_PERCENT_TO_HEAL": 0.65, + "PROTECT_DELTA_HEAL_SEC": 10, + "CAN_STAND_BY": true, + "CAN_THROW_REQUESTS": true, + "GROUP_ANY_PHRASE_DELAY": 1, + "GROUP_EXACTLY_PHRASE_DELAY": 20, + "DIST_TO_ENEMY_YO_CAN_HEAL": 30, + "CHANCE_TO_STAY_WHEN_WARN_PLAYER_100": 80, + "DOG_FIGHT_OUT": 6, + "DOG_FIGHT_IN": 3, + "SHOOT_INSTEAD_DOG_FIGHT": 9, + "PISTOL_SHOTGUN_AMBUSH_DIST": 60, + "STANDART_AMBUSH_DIST": 200, + "AI_POWER_COEF": 120, + "COVER_SECONDS_AFTER_LOSE_VISION": 10, + "COVER_SELF_ALWAYS_IF_DAMAGED": false, + "SEC_TO_MORE_DIST_TO_RUN": 10, + "HEAL_DELAY_SEC": 5, + "HIT_DELAY_WHEN_HAVE_SMT": -1, + "HIT_DELAY_WHEN_PEACE": -1, + "TALK_WITH_QUERY": true, + "WILL_PERSUE_AXEMAN": true, + "MAY_BE_CALLED_FOR_HELP": true + }, + "Boss": { + "BOSS_DIST_TO_WARNING": 34, + "BOSS_DIST_TO_WARNING_SQRT": 1156, + "BOSS_DIST_TO_WARNING_OUT": 43, + "BOSS_DIST_TO_WARNING_OUT_SQRT": 1849, + "BOSS_DIST_TO_SHOOT": 16, + "BOSS_DIST_TO_SHOOT_SQRT": 256, + "CHANCE_TO_SEND_GRENADE_100": 100, + "MAX_DIST_COVER_BOSS": 25, + "MAX_DIST_COVER_BOSS_SQRT": 625, + "MAX_DIST_DECIDER_TO_SEND": 35, + "MAX_DIST_DECIDER_TO_SEND_SQRT": 1225, + "TIME_AFTER_LOSE": 15, + "TIME_AFTER_LOSE_DELTA": 60, + "PERSONS_SEND": 2, + "DELTA_SEARCH_TIME": 18, + "COVER_TO_SEND": true, + "WAIT_NO_ATTACK_SAVAGE": 10, + "CHANCE_USE_RESERVE_PATROL_100": 50, + "KILLA_Y_DELTA_TO_BE_ENEMY_BOSS": 5, + "KILLA_DITANCE_TO_BE_ENEMY_BOSS": 45, + "KILLA_START_SEARCH_SEC": 40, + "KILLA_CONTUTION_TIME": 5, + "KILLA_CLOSE_ATTACK_DIST": 8, + "KILLA_MIDDLE_ATTACK_DIST": 22, + "KILLA_LARGE_ATTACK_DIST": 41, + "KILLA_SEARCH_METERS": 30, + "KILLA_DEF_DIST_SQRT": 225, + "KILLA_SEARCH_SEC_STOP_AFTER_COMING": 25, + "KILLA_DIST_TO_GO_TO_SUPPRESS": 6, + "KILLA_AFTER_GRENADE_SUPPRESS_DELAY": 2, + "KILLA_CLOSEATTACK_TIMES": 3, + "KILLA_CLOSEATTACK_DELAY": 10, + "KILLA_HOLD_DELAY": 5, + "KILLA_BULLET_TO_RELOAD": 15, + "SHALL_WARN": true, + "KOJANIY_DIST_WHEN_READY": 40, + "KOJANIY_DIST_TO_BE_ENEMY": 200, + "KOJANIY_MIN_DIST_TO_LOOT": 20, + "KOJANIY_MIN_DIST_TO_LOOT_SQRT": 400, + "KOJANIY_DIST_ENEMY_TOO_CLOSE": 17, + "KOJANIY_MANY_ENEMIES_COEF": 1.5, + "KILLA_ENEMIES_TO_ATTACK": 3, + "KILLA_ONE_IS_CLOSE": 30, + "KILLA_TRIGGER_DOWN_DELAY": 1, + "KILLA_WAIT_IN_COVER_COEF": 1 + }, + "Core": { + "VisibleAngle": 130, + "VisibleDistance": 120, + "GainSightCoef": 0.2, + "ScatteringPerMeter": 0.05, + "ScatteringClosePerMeter": 0.1, + "DamageCoeff": 1, + "HearingSense": 1.85, + "CanRun": true, + "CanGrenade": true, + "AimingType": "normal", + "PistolFireDistancePref": 35, + "ShotgunFireDistancePref": 50, + "RifleFireDistancePref": 100, + "AccuratySpeed": 0.3, + "WaitInCoverBetweenShotsSec": 1.5 + }, + "Scattering": { + "MinScatter": 0.015, + "WorkingScatter": 0.15, + "MaxScatter": 0.3, + "SpeedUp": 0.6, + "SpeedUpAim": 1.8, + "SpeedDown": -0.2, + "ToSlowBotSpeed": 1.8, + "ToLowBotSpeed": 2.8, + "ToUpBotSpeed": 4.3, + "MovingSlowCoef": 1.4, + "ToLowBotAngularSpeed": 140, + "ToStopBotAngularSpeed": 80, + "FromShot": 0.001, + "TracerCoef": 1.3, + "HandDamageScatteringMinMax": 0.7, + "HandDamageAccuracySpeed": 1.3, + "BloodFall": 1.45, + "Caution": 0.03, + "ToCaution": 0.6, + "RecoilControlCoefShootDone": 0.0003, + "RecoilControlCoefShootDoneAuto": 0.00015, + "AMPLITUDE_FACTOR": 0.015, + "AMPLITUDE_SPEED": 0.001, + "DIST_FROM_OLD_POINT_TO_NOT_AIM": 15, + "DIST_FROM_OLD_POINT_TO_NOT_AIM_SQRT": 225, + "DIST_NOT_TO_SHOOT": 0.3, + "PoseChnageCoef": 0.1, + "LayFactor": 0.1, + "RecoilYCoef": 0.0005, + "RecoilYCoefSppedDown": -0.52, + "RecoilYMax": 1 + } + }, + "hard": { + "Lay": { + "CHECK_SHOOT_WHEN_LAYING": false, + "DELTA_LAY_CHECK": 2, + "DELTA_GETUP": 5, + "DELTA_AFTER_GETUP": 10, + "CLEAR_POINTS_OF_SCARE_SEC": 20, + "MAX_LAY_TIME": 35, + "DELTA_WANT_LAY_CHECL_SEC": 5, + "ATTACK_LAY_CHANCE": 25, + "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, + "DIST_ENEMY_NULL_DANGER_LAY_SQRT": 225, + "DIST_ENEMY_GETUP_LAY": 10, + "DIST_ENEMY_GETUP_LAY_SQRT": 100, + "DIST_ENEMY_CAN_LAY": 15, + "DIST_ENEMY_CAN_LAY_SQRT": 225, + "LAY_AIM": 0.6, + "MIN_CAN_LAY_DIST_SQRT": 121, + "MIN_CAN_LAY_DIST": 11, + "MAX_CAN_LAY_DIST_SQRT": 40000, + "MAX_CAN_LAY_DIST": 200, + "LAY_CHANCE_DANGER": 40, + "DAMAGE_TIME_TO_GETUP": 3 + }, + "Aiming": { + "MAX_AIM_PRECICING": 2, + "BETTER_PRECICING_COEF": 0.8, + "RECALC_DIST": 0.7, + "RECALC_SQR_DIST": 0.48999998, + "COEF_FROM_COVER": 0.65, + "PANIC_COEF": 1.2, + "PANIC_ACCURATY_COEF": 1.2, + "HARD_AIM": 0.75, + "HARD_AIM_CHANCE_100": 80, + "PANIC_TIME": 2, + "RECALC_MUST_TIME": 3, + "DAMAGE_PANIC_TIME": 15, + "DANGER_UP_POINT": 1.3, + "MAX_AIMING_UPGRADE_BY_TIME": 0.85, + "DAMAGE_TO_DISCARD_AIM_0_100": 96, + "MIN_TIME_DISCARD_AIM_SEC": 2.3, + "MAX_TIME_DISCARD_AIM_SEC": 2.6, + "XZ_COEF": 0.65, + "SHOOT_TO_CHANGE_PRIORITY": 5525, + "BOTTOM_COEF": 0.2, + "FIRST_CONTACT_ADD_SEC": 0.05, + "FIRST_CONTACT_ADD_CHANCE_100": 80, + "BASE_HIT_AFFECTION_DELAY_SEC": 0.27, + "BASE_HIT_AFFECTION_MIN_ANG": 14, + "BASE_HIT_AFFECTION_MAX_ANG": 18, + "BASE_SHIEF": 0.5, + "SCATTERING_HAVE_DAMAGE_COEF": 2, + "SCATTERING_DIST_MODIF": 0.65, + "SCATTERING_DIST_MODIF_CLOSE": 0.8, + "AIMING_TYPE": 5, + "DIST_TO_SHOOT_TO_CENTER": 3, + "DIST_TO_SHOOT_NO_OFFSET": 3, + "SHPERE_FRIENDY_FIRE_SIZE": -1, + "COEF_IF_MOVE": 1.5, + "TIME_COEF_IF_MOVE": 1.5, + "BOT_MOVE_IF_DELTA": 0.01, + "NEXT_SHOT_MISS_CHANCE_100": 100, + "NEXT_SHOT_MISS_Y_OFFSET": 1, + "ANYTIME_LIGHT_WHEN_AIM_100": -1, + "ANY_PART_SHOOT_TIME": 30, + "WEAPON_ROOT_OFFSET": 0.35, + "MIN_DAMAGE_TO_GET_HIT_AFFETS": 1, + "MAX_AIM_TIME": 1.5, + "OFFSET_RECAL_ANYWAY_TIME": 1, + "Y_TOP_OFFSET_COEF": 0.001, + "Y_BOTTOM_OFFSET_COEF": 0.015, + "BASE_SHIEF_STATIONARY_GRENADE": 1.1, + "XZ_COEF_STATIONARY_GRENADE": 0.8 + }, + "Look": { + "OLD_TIME_POINT": 11, + "WAIT_NEW_SENSOR": 2.1, + "WAIT_NEW__LOOK_SENSOR": 7.8, + "LOOK_AROUND_DELTA": 1.1, + "ANGLE_FOR_GETUP": 30, + "MAX_VISION_GRASS_METERS": 0.4, + "MAX_VISION_GRASS_METERS_FLARE": 7, + "MAX_VISION_GRASS_METERS_OPT": 0.9090909, + "MAX_VISION_GRASS_METERS_FLARE_OPT": 0.125, + "LightOnVisionDistance": 30, + "FAR_DISTANCE": 160, + "FarDeltaTimeSec": 3, + "MIDDLE_DIST": 90, + "MiddleDeltaTimeSec": 1, + "CloseDeltaTimeSec": 0.1, + "POSIBLE_VISION_SPACE": 1.2, + "GOAL_TO_FULL_DISSAPEAR": 0.25, + "GOAL_TO_FULL_DISSAPEAR_SHOOT": 0.0001, + "BODY_DELTA_TIME_SEARCH_SEC": 1.7, + "COME_TO_BODY_DIST": 1.2, + "MARKSMAN_VISIBLE_DIST_COEF": 1.15, + "VISIBLE_DISNACE_WITH_LIGHT": 43, + "ENEMY_LIGHT_ADD": 45, + "ENEMY_LIGHT_START_DIST": 40, + "CAN_LOOK_TO_WALL": false, + "CHECK_HEAD_ANY_DIST": false, + "DIST_NOT_TO_IGNORE_WALL": 15, + "DIST_CHECK_WALL": 20, + "LOOK_LAST_POSENEMY_IF_NO_DANGER_SEC": 25, + "MIN_LOOK_AROUD_TIME": 20, + "OPTIMIZE_TO_ONLY_BODY": true + }, + "Shoot": { + "RECOIL_TIME_NORMALIZE": 2, + "RECOIL_PER_METER": 0.1, + "CAN_STOP_SHOOT_CAUSE_ANIMATOR": true, + "MAX_RECOIL_PER_METER": 0.2, + "HORIZONT_RECOIL_COEF": 0.4, + "WAIT_NEXT_SINGLE_SHOT": 0.3, + "WAIT_NEXT_SINGLE_SHOT_LONG_MAX": 3.3, + "WAIT_NEXT_SINGLE_SHOT_LONG_MIN": 0.8, + "MARKSMAN_DIST_SEK_COEF": 44, + "FINGER_HOLD_SINGLE_SHOT": 0.14, + "BASE_AUTOMATIC_TIME": 0.1, + "AUTOMATIC_FIRE_SCATTERING_COEF": 1.5, + "CHANCE_TO_CHANGE_TO_AUTOMATIC_FIRE_100": 76, + "FAR_DIST_ENEMY": 20, + "SHOOT_FROM_COVER": 4, + "FAR_DIST_ENEMY_SQR": 400, + "MAX_DIST_COEF": 1.35, + "RECOIL_DELTA_PRESS": 0.15, + "RUN_DIST_NO_AMMO": 25, + "RUN_DIST_NO_AMMO_SQRT": 625, + "CAN_SHOOTS_TIME_TO_AMBUSH": 333, + "NOT_TO_SEE_ENEMY_TO_WANT_RELOAD_PERCENT": 0.5, + "NOT_TO_SEE_ENEMY_TO_WANT_RELOAD_SEC": 2, + "RELOAD_PECNET_NO_ENEMY": 0.6, + "CHANCE_TO_CHANGE_WEAPON": 0, + "CHANCE_TO_CHANGE_WEAPON_WITH_HELMET": 0, + "LOW_DIST_TO_CHANGE_WEAPON": 10, + "FAR_DIST_TO_CHANGE_WEAPON": 50, + "SUPPRESS_BY_SHOOT_TIME": 6, + "SUPPRESS_TRIGGERS_DOWN": 3, + "WAIT_NEXT_STATIONARY_GRENADE": 1, + "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, + "REACH_DIST": 0.5, + "REACH_DIST_RUN": 0.8, + "START_SLOW_DIST": 1.5, + "BASESTART_SLOW_DIST": 1.1, + "SLOW_COEF": 7, + "DIST_TO_CAN_CHANGE_WAY": 8, + "DIST_TO_START_RAYCAST": 15, + "BASE_START_SERACH": 35, + "UPDATE_TIME_RECAL_WAY": 7, + "FAR_DIST": 4, + "FAR_DIST_SQR": 16, + "DIST_TO_CAN_CHANGE_WAY_SQR": 64, + "DIST_TO_START_RAYCAST_SQR": 225, + "BASE_SQRT_START_SERACH": 1225, + "Y_APPROXIMATION": 0.7, + "DELTA_LAST_SEEN_ENEMY": 20, + "REACH_DIST_COVER": 2, + "RUN_TO_COVER_MIN": 2, + "CHANCE_TO_RUN_IF_NO_AMMO_0_100": 100, + "RUN_IF_CANT_SHOOT": false, + "RUN_IF_GAOL_FAR_THEN": 10, + "SEC_TO_CHANGE_TO_RUN": 3 + }, + "Grenade": { + "DELTA_NEXT_ATTEMPT_FROM_COVER": 5, + "DELTA_NEXT_ATTEMPT": 10, + "MIN_DIST_NOT_TO_THROW": 8, + "NEAR_DELTA_THROW_TIME_SEC": 2, + "MIN_THROW_GRENADE_DIST": 12, + "MIN_THROW_GRENADE_DIST_SQRT": 144, + "MIN_DIST_NOT_TO_THROW_SQR": 64, + "RUN_AWAY": 22, + "RUN_AWAY_SQR": 484, + "ADD_GRENADE_AS_DANGER": 65, + "ADD_GRENADE_AS_DANGER_SQR": 4225, + "CHANCE_TO_NOTIFY_ENEMY_GR_100": 99, + "GrenadePerMeter": 0.1, + "REQUEST_DIST_MUST_THROW_SQRT": 4, + "REQUEST_DIST_MUST_THROW": 2, + "BEWARE_TYPE": 2, + "SHOOT_TO_SMOKE_CHANCE_100": 30, + "CHANCE_RUN_FLASHED_100": 0, + "MAX_FLASHED_DIST_TO_SHOOT": 10, + "MAX_FLASHED_DIST_TO_SHOOT_SQRT": 100, + "FLASH_GRENADE_TIME_COEF": 0.3, + "SIZE_SPOTTED_COEF": 2, + "BE_ATTENTION_COEF": 4, + "TIME_SHOOT_TO_FLASH": 4, + "CLOSE_TO_SMOKE_TO_SHOOT": 5, + "CLOSE_TO_SMOKE_TO_SHOOT_SQRT": 25, + "CLOSE_TO_SMOKE_TIME_DELTA": 7, + "SMOKE_CHECK_DELTA": 1, + "DELTA_GRENADE_START_TIME": 0.7, + "AMBUSH_IF_SMOKE_IN_ZONE_100": 40, + "AMBUSH_IF_SMOKE_RETURN_TO_ATTACK_SEC": 30, + "NO_RUN_FROM_AI_GRENADES": false, + "MAX_THROW_POWER": 16.7, + "GrenadePrecision": 0.1, + "STOP_WHEN_THROW_GRENADE": true, + "WAIT_TIME_TURN_AWAY": 0.2, + "SMOKE_SUPPRESS_DELTA": 20, + "DAMAGE_GRENADE_SUPPRESS_DELTA": 8, + "STUN_SUPPRESS_DELTA": 9, + "CHEAT_START_GRENADE_PLACE": false, + "CAN_THROW_STRAIGHT_CONTACT": true, + "STRAIGHT_CONTACT_DELTA_SEC": -1, + "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, + "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, + "FLASH_ACCURATY": 1.6, + "FLASH_LAY_CHANCE": 1, + "STUN_HEARING": 0.01 + }, + "Cover": { + "RETURN_TO_ATTACK_AFTER_AMBUSH_MIN": 20, + "RETURN_TO_ATTACK_AFTER_AMBUSH_MAX": 50, + "SOUND_TO_GET_SPOTTED": 2, + "TIME_TO_MOVE_TO_COVER": 15, + "MAX_DIST_OF_COVER": 4, + "CHANGE_RUN_TO_COVER_SEC": 5, + "CHANGE_RUN_TO_COVER_SEC_GREANDE": 0.6, + "MIN_DIST_TO_ENEMY": 9, + "DIST_CANT_CHANGE_WAY": 5, + "DIST_CHECK_SFETY": 9, + "TIME_CHECK_SAFE": 2, + "HIDE_TO_COVER_TIME": 1.5, + "MAX_DIST_OF_COVER_SQR": 16, + "DIST_CANT_CHANGE_WAY_SQR": 25, + "SPOTTED_COVERS_RADIUS": 3, + "LOOK_LAST_ENEMY_POS_MOVING": 1.5, + "LOOK_TO_HIT_POINT_IF_LAST_ENEMY": 3, + "LOOK_LAST_ENEMY_POS_LOOKAROUND": 45, + "OFFSET_LOOK_ALONG_WALL_ANG": 20, + "SPOTTED_GRENADE_RADIUS": 16, + "MAX_SPOTTED_TIME_SEC": 45, + "WAIT_INT_COVER_FINDING_ENEMY": 2, + "CLOSE_DIST_POINT_SQRT": 4, + "DELTA_SEEN_FROM_COVE_LAST_POS": 15, + "MOVE_TO_COVER_WHEN_TARGET": false, + "RUN_COVER_IF_CAN_AND_NO_ENEMIES": false, + "SPOTTED_GRENADE_TIME": 7, + "DEPENDS_Y_DIST_TO_BOT": false, + "RUN_IF_FAR": 10, + "RUN_IF_FAR_SQRT": 225, + "STAY_IF_FAR": 25, + "STAY_IF_FAR_SQRT": 625, + "CHECK_COVER_ENEMY_LOOK": true, + "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, + "NOT_LOOK_AT_WALL_IS_DANGER": true, + "MIN_DEFENCE_LEVEL": 22, + "GOOD_DIST_TO_POINT_COEF": 1.8, + "ENEMY_DIST_TO_GO_OUT": 1, + "STATIONARY_WEAPON_NO_ENEMY_GETUP": 20, + "STATIONARY_WEAPON_MAX_DIST_TO_USE": 25 + }, + "Patrol": { + "DEAD_BODY_LOOK_PERIOD": 8, + "LOOK_TIME_BASE": 12, + "CAN_LOOK_TO_DEADBODIES": true, + "CAN_CHOOSE_RESERV": false, + "DO_RANDOM_DROP_ITEM": true, + "TRY_CHOOSE_RESERV_WAY_ON_START": false, + "CAN_FRIENDLY_TILT": true, + "CAN_HARD_AIM": true, + "RESERVE_TIME_STAY": 72, + "FRIEND_SEARCH_SEC": 12, + "TALK_DELAY": 1.1, + "MIN_TALK_DELAY": 35, + "TALK_DELAY_BIG": 15.1, + "CHANGE_WAY_TIME": 125.1, + "MIN_DIST_TO_CLOSE_TALK": 5, + "VISION_DIST_COEF_PEACE": 0.75, + "MIN_DIST_TO_CLOSE_TALK_SQR": 25, + "CHANCE_TO_CUT_WAY_0_100": 75, + "CUT_WAY_MIN_0_1": 0.4, + "CUT_WAY_MAX_0_1": 0.65, + "CHANCE_TO_CHANGE_WAY_0_100": 50, + "CHANCE_TO_SHOOT_DEADBODY": 52, + "SUSPETION_PLACE_LIFETIME": 7, + "RESERVE_OUT_TIME": 30, + "CLOSE_TO_SELECT_RESERV_WAY": 25, + "MAX_YDIST_TO_START_WARN_REQUEST_TO_REQUESTER": 5, + "CAN_WATCH_SECOND_WEAPON": true + }, + "Hearing": { + "BOT_CLOSE_PANIC_DIST": 2, + "CHANCE_TO_HEAR_SIMPLE_SOUND_0_1": 0.7, + "DISPERSION_COEF": 3.6, + "CLOSE_DIST": 10, + "FAR_DIST": 30, + "SOUND_DIR_DEEFREE": 30, + "DIST_PLACE_TO_FIND_POINT": 70, + "DEAD_BODY_SOUND_RAD": 30, + "LOOK_ONLY_DANGER": false, + "RESET_TIMER_DIST": 17, + "HEAR_DELAY_WHEN_PEACE": 0.75, + "HEAR_DELAY_WHEN_HAVE_SMT": 0.5, + "LOOK_ONLY_DANGER_DELTA": 9 + }, + "Mind": { + "HOW_WORK_OVER_DEAD_BODY": 2, + "MIN_SHOOTS_TIME": 2, + "MAX_SHOOTS_TIME": 4, + "TIME_LEAVE_MAP": 23, + "TIME_TO_RUN_TO_COVER_CAUSE_SHOOT_SEC": 15, + "DAMAGE_REDUCTION_TIME_SEC": 20, + "MIN_DAMAGE_SCARE": 20, + "CHANCE_TO_RUN_CAUSE_DAMAGE_0_100": 35, + "TIME_TO_FORGOR_ABOUT_ENEMY_SEC": 52, + "TIME_TO_FIND_ENEMY": 22, + "MAX_AGGRO_BOT_DIST": 100, + "HIT_POINT_DETECTION": 4, + "DANGER_POINT_CHOOSE_COEF": 1, + "SIMPLE_POINT_CHOOSE_COEF": 0.4, + "LASTSEEN_POINT_CHOOSE_COEF": 0.2, + "FOLLOWER_AND_BOSS_WARN_EQUAL_PRIORITY": true, + "COVER_DIST_COEF": 1.5, + "DIST_TO_FOUND_SQRT": 400, + "MAX_AGGRO_BOT_DIST_SQR": 10000, + "DIST_TO_STOP_RUN_ENEMY": 15, + "CAN_TAKE_ITEMS": true, + "CHECK_MARK_OF_UNKNOWS": true, + "ENEMY_LOOK_AT_ME_ANG": 15, + "MIN_START_AGGRESION_COEF": 1, + "MAX_START_AGGRESION_COEF": 3, + "BULLET_FEEL_DIST": 360, + "BULLET_FEEL_CLOSE_SDIST": 1, + "ATTACK_IMMEDIATLY_CHANCE_0_100": 40, + "CHANCE_FUCK_YOU_ON_CONTACT_100": 10, + "FRIEND_DEAD_AGR_LOW": -0.2, + "FRIEND_AGR_KILL": 0.2, + "LAST_ENEMY_LOOK_TO": 40, + "SURGE_KIT_ONLY_SAFE_CONTAINER": false, + "CAN_RECEIVE_PLAYER_REQUESTS_SAVAGE": true, + "CAN_RECEIVE_PLAYER_REQUESTS_BEAR": false, + "CAN_RECEIVE_PLAYER_REQUESTS_USEC": false, + "CAN_USE_MEDS": true, + "SUSPETION_POINT_CHANCE_ADD100": 0, + "AMBUSH_WHEN_UNDER_FIRE": true, + "AMBUSH_WHEN_UNDER_FIRE_TIME_RESIST": 60, + "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, + "PROTECT_TIME_REAL": true, + "CHANCE_SHOOT_WHEN_WARN_PLAYER_100": 25, + "CAN_PANIC_IS_PROTECT": false, + "NO_RUN_AWAY_FOR_SAFE": false, + "PART_PERCENT_TO_HEAL": 0.65, + "PROTECT_DELTA_HEAL_SEC": 10, + "CAN_STAND_BY": true, + "CAN_THROW_REQUESTS": true, + "GROUP_ANY_PHRASE_DELAY": 1, + "GROUP_EXACTLY_PHRASE_DELAY": 24, + "DIST_TO_ENEMY_YO_CAN_HEAL": 30, + "CHANCE_TO_STAY_WHEN_WARN_PLAYER_100": 80, + "DOG_FIGHT_OUT": 6, + "DOG_FIGHT_IN": 3, + "SHOOT_INSTEAD_DOG_FIGHT": 9, + "PISTOL_SHOTGUN_AMBUSH_DIST": 60, + "STANDART_AMBUSH_DIST": 200, + "AI_POWER_COEF": 120, + "COVER_SECONDS_AFTER_LOSE_VISION": 10, + "COVER_SELF_ALWAYS_IF_DAMAGED": false, + "SEC_TO_MORE_DIST_TO_RUN": 10, + "HEAL_DELAY_SEC": 5, + "HIT_DELAY_WHEN_HAVE_SMT": -1, + "HIT_DELAY_WHEN_PEACE": -1, + "TALK_WITH_QUERY": true, + "WILL_PERSUE_AXEMAN": true, + "MAY_BE_CALLED_FOR_HELP": true + }, + "Boss": { + "BOSS_DIST_TO_WARNING": 34, + "BOSS_DIST_TO_WARNING_SQRT": 1156, + "BOSS_DIST_TO_WARNING_OUT": 43, + "BOSS_DIST_TO_WARNING_OUT_SQRT": 1849, + "BOSS_DIST_TO_SHOOT": 16, + "BOSS_DIST_TO_SHOOT_SQRT": 256, + "CHANCE_TO_SEND_GRENADE_100": 100, + "MAX_DIST_COVER_BOSS": 25, + "MAX_DIST_COVER_BOSS_SQRT": 625, + "MAX_DIST_DECIDER_TO_SEND": 35, + "MAX_DIST_DECIDER_TO_SEND_SQRT": 1225, + "TIME_AFTER_LOSE": 15, + "TIME_AFTER_LOSE_DELTA": 60, + "PERSONS_SEND": 2, + "DELTA_SEARCH_TIME": 18, + "COVER_TO_SEND": true, + "WAIT_NO_ATTACK_SAVAGE": 10, + "CHANCE_USE_RESERVE_PATROL_100": 50, + "KILLA_Y_DELTA_TO_BE_ENEMY_BOSS": 5, + "KILLA_DITANCE_TO_BE_ENEMY_BOSS": 45, + "KILLA_START_SEARCH_SEC": 40, + "KILLA_CONTUTION_TIME": 5, + "KILLA_CLOSE_ATTACK_DIST": 8, + "KILLA_MIDDLE_ATTACK_DIST": 22, + "KILLA_LARGE_ATTACK_DIST": 41, + "KILLA_SEARCH_METERS": 30, + "KILLA_DEF_DIST_SQRT": 225, + "KILLA_SEARCH_SEC_STOP_AFTER_COMING": 25, + "KILLA_DIST_TO_GO_TO_SUPPRESS": 6, + "KILLA_AFTER_GRENADE_SUPPRESS_DELAY": 2, + "KILLA_CLOSEATTACK_TIMES": 3, + "KILLA_CLOSEATTACK_DELAY": 10, + "KILLA_HOLD_DELAY": 5, + "KILLA_BULLET_TO_RELOAD": 15, + "SHALL_WARN": true, + "KOJANIY_DIST_WHEN_READY": 40, + "KOJANIY_DIST_TO_BE_ENEMY": 200, + "KOJANIY_MIN_DIST_TO_LOOT": 20, + "KOJANIY_MIN_DIST_TO_LOOT_SQRT": 400, + "KOJANIY_DIST_ENEMY_TOO_CLOSE": 17, + "KOJANIY_MANY_ENEMIES_COEF": 1.5, + "KILLA_ENEMIES_TO_ATTACK": 3, + "KILLA_ONE_IS_CLOSE": 30, + "KILLA_TRIGGER_DOWN_DELAY": 1, + "KILLA_WAIT_IN_COVER_COEF": 1 + }, + "Core": { + "VisibleAngle": 140, + "VisibleDistance": 130, + "GainSightCoef": 0.1, + "ScatteringPerMeter": 0.05, + "ScatteringClosePerMeter": 0.1, + "DamageCoeff": 1, + "HearingSense": 2.85, + "CanRun": true, + "CanGrenade": true, + "AimingType": "normal", + "PistolFireDistancePref": 35, + "ShotgunFireDistancePref": 50, + "RifleFireDistancePref": 100, + "AccuratySpeed": 0.3, + "WaitInCoverBetweenShotsSec": 1.5 + }, + "Scattering": { + "MinScatter": 0.015, + "WorkingScatter": 0.15, + "MaxScatter": 0.3, + "SpeedUp": 0.6, + "SpeedUpAim": 1.8, + "SpeedDown": -0.2, + "ToSlowBotSpeed": 1.8, + "ToLowBotSpeed": 2.8, + "ToUpBotSpeed": 4.3, + "MovingSlowCoef": 1.4, + "ToLowBotAngularSpeed": 140, + "ToStopBotAngularSpeed": 80, + "FromShot": 0.001, + "TracerCoef": 1.3, + "HandDamageScatteringMinMax": 0.7, + "HandDamageAccuracySpeed": 1.3, + "BloodFall": 1.45, + "Caution": 0.03, + "ToCaution": 0.6, + "RecoilControlCoefShootDone": 0.0003, + "RecoilControlCoefShootDoneAuto": 0.00015, + "AMPLITUDE_FACTOR": 0.015, + "AMPLITUDE_SPEED": 0.001, + "DIST_FROM_OLD_POINT_TO_NOT_AIM": 15, + "DIST_FROM_OLD_POINT_TO_NOT_AIM_SQRT": 225, + "DIST_NOT_TO_SHOOT": 0.3, + "PoseChnageCoef": 0.1, + "LayFactor": 0.1, + "RecoilYCoef": 0.0005, + "RecoilYCoefSppedDown": -0.52, + "RecoilYMax": 1 + } + }, + "impossible": { + "Lay": { + "CHECK_SHOOT_WHEN_LAYING": false, + "DELTA_LAY_CHECK": 2, + "DELTA_GETUP": 5, + "DELTA_AFTER_GETUP": 10, + "CLEAR_POINTS_OF_SCARE_SEC": 20, + "MAX_LAY_TIME": 35, + "DELTA_WANT_LAY_CHECL_SEC": 5, + "ATTACK_LAY_CHANCE": 25, + "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, + "DIST_ENEMY_NULL_DANGER_LAY_SQRT": 225, + "DIST_ENEMY_GETUP_LAY": 10, + "DIST_ENEMY_GETUP_LAY_SQRT": 100, + "DIST_ENEMY_CAN_LAY": 15, + "DIST_ENEMY_CAN_LAY_SQRT": 225, + "LAY_AIM": 0.6, + "MIN_CAN_LAY_DIST_SQRT": 121, + "MIN_CAN_LAY_DIST": 11, + "MAX_CAN_LAY_DIST_SQRT": 40000, + "MAX_CAN_LAY_DIST": 200, + "LAY_CHANCE_DANGER": 40, + "DAMAGE_TIME_TO_GETUP": 3 + }, + "Aiming": { + "DEAD_BODY_LOOK_PERIOD": 8, + "MAX_AIM_PRECICING": 4, + "BETTER_PRECICING_COEF": 0.7, + "RECALC_DIST": 0.7, + "RECALC_SQR_DIST": 0.48999998, + "COEF_FROM_COVER": 0.65, + "PANIC_COEF": 1.2, + "PANIC_ACCURATY_COEF": 1.2, + "HARD_AIM": 0.75, + "PANIC_TIME": 2, + "CAN_HARD_AIM": true, + "RECALC_MUST_TIME": 3, + "DAMAGE_PANIC_TIME": 15, + "DANGER_UP_POINT": 1.3, + "MAX_AIMING_UPGRADE_BY_TIME": 0.4, + "DAMAGE_TO_DISCARD_AIM_0_100": 86, + "MIN_TIME_DISCARD_AIM_SEC": 0.3, + "MAX_TIME_DISCARD_AIM_SEC": 0.9, + "XZ_COEF": 0.15, + "SHOOT_TO_CHANGE_PRIORITY": 5525, + "BOTTOM_COEF": 0.1, + "FIRST_CONTACT_ADD_SEC": 0.01, + "FIRST_CONTACT_ADD_CHANCE_100": 80, + "BASE_HIT_AFFECTION_DELAY_SEC": 0.17, + "BASE_HIT_AFFECTION_MIN_ANG": 4, + "BASE_HIT_AFFECTION_MAX_ANG": 8, + "BASE_SHIEF": 0.05, + "SCATTERING_HAVE_DAMAGE_COEF": 2, + "SCATTERING_DIST_MODIF": 0.55, + "SCATTERING_DIST_MODIF_CLOSE": 0.6, + "AIMING_TYPE": 4, + "DIST_TO_SHOOT_TO_CENTER": 3, + "DIST_TO_SHOOT_NO_OFFSET": 3, + "SHPERE_FRIENDY_FIRE_SIZE": -1, + "COEF_IF_MOVE": 1, + "TIME_COEF_IF_MOVE": 1.1, + "BOT_MOVE_IF_DELTA": 0.01, + "NEXT_SHOT_MISS_CHANCE_100": 100, + "NEXT_SHOT_MISS_Y_OFFSET": 1, + "ANYTIME_LIGHT_WHEN_AIM_100": -1, + "ANY_PART_SHOOT_TIME": 10, + "WEAPON_ROOT_OFFSET": 0.35, + "MIN_DAMAGE_TO_GET_HIT_AFFETS": 1, + "MAX_AIM_TIME": 1.5, + "OFFSET_RECAL_ANYWAY_TIME": 1, + "BASE_SHIEF_STATIONARY_GRENADE": 1.1, + "XZ_COEF_STATIONARY_GRENADE": 0.2 + }, + "Look": { + "OLD_TIME_POINT": 11, + "WAIT_NEW_SENSOR": 2.1, + "WAIT_NEW__LOOK_SENSOR": 7.8, + "LOOK_AROUND_DELTA": 1.1, + "ANGLE_FOR_GETUP": 30, + "MAX_VISION_GRASS_METERS": 0.8, + "MAX_VISION_GRASS_METERS_FLARE": 8, + "MAX_VISION_GRASS_METERS_OPT": 0.9090909, + "MAX_VISION_GRASS_METERS_FLARE_OPT": 0.125, + "LightOnVisionDistance": 30, + "FAR_DISTANCE": 160, + "FarDeltaTimeSec": 3, + "MIDDLE_DIST": 90, + "MiddleDeltaTimeSec": 1, + "CloseDeltaTimeSec": 0.1, + "POSIBLE_VISION_SPACE": 1.2, + "GOAL_TO_FULL_DISSAPEAR": 0.5, + "GOAL_TO_FULL_DISSAPEAR_SHOOT": 0.0005, + "BODY_DELTA_TIME_SEARCH_SEC": 1.7, + "COME_TO_BODY_DIST": 1.2, + "MARKSMAN_VISIBLE_DIST_COEF": 1.15, + "VISIBLE_DISNACE_WITH_LIGHT": 43, + "ENEMY_LIGHT_ADD": 45, + "ENEMY_LIGHT_START_DIST": 40, + "CAN_LOOK_TO_WALL": false, + "DIST_NOT_TO_IGNORE_WALL": 15, + "DIST_CHECK_WALL": 20, + "LOOK_LAST_POSENEMY_IF_NO_DANGER_SEC": 25, + "MIN_LOOK_AROUD_TIME": 20, + "OPTIMIZE_TO_ONLY_BODY": true + }, + "Shoot": { + "RECOIL_TIME_NORMALIZE": 2, + "RECOIL_PER_METER": 0.1, + "MAX_RECOIL_PER_METER": 0.2, + "HORIZONT_RECOIL_COEF": 0.4, + "WAIT_NEXT_SINGLE_SHOT": 0.3, + "WAIT_NEXT_SINGLE_SHOT_LONG_MAX": 3.3, + "WAIT_NEXT_SINGLE_SHOT_LONG_MIN": 0.8, + "MARKSMAN_DIST_SEK_COEF": 44, + "FINGER_HOLD_SINGLE_SHOT": 0.14, + "BASE_AUTOMATIC_TIME": 0.1, + "AUTOMATIC_FIRE_SCATTERING_COEF": 1.5, + "CHANCE_TO_CHANGE_TO_AUTOMATIC_FIRE_100": 76, + "FAR_DIST_ENEMY": 20, + "SHOOT_FROM_COVER": 4, + "FAR_DIST_ENEMY_SQR": 400, + "MAX_DIST_COEF": 1.35, + "RECOIL_DELTA_PRESS": 0.15, + "RUN_DIST_NO_AMMO": 25, + "RUN_DIST_NO_AMMO_SQRT": 625, + "CAN_SHOOTS_TIME_TO_AMBUSH": 333, + "NOT_TO_SEE_ENEMY_TO_WANT_RELOAD_PERCENT": 0.5, + "NOT_TO_SEE_ENEMY_TO_WANT_RELOAD_SEC": 2, + "RELOAD_PECNET_NO_ENEMY": 0.6, + "CHANCE_TO_CHANGE_WEAPON": 0, + "CHANCE_TO_CHANGE_WEAPON_WITH_HELMET": 0, + "LOW_DIST_TO_CHANGE_WEAPON": 10, + "FAR_DIST_TO_CHANGE_WEAPON": 50, + "SUPPRESS_BY_SHOOT_TIME": 6, + "SUPPRESS_TRIGGERS_DOWN": 3, + "WAIT_NEXT_STATIONARY_GRENADE": 1, + "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, + "REACH_DIST": 0.5, + "REACH_DIST_RUN": 0.8, + "START_SLOW_DIST": 1.5, + "BASESTART_SLOW_DIST": 1.1, + "SLOW_COEF": 7, + "DIST_TO_CAN_CHANGE_WAY": 8, + "DIST_TO_START_RAYCAST": 15, + "BASE_START_SERACH": 35, + "UPDATE_TIME_RECAL_WAY": 7, + "FAR_DIST": 4, + "FAR_DIST_SQR": 16, + "DIST_TO_CAN_CHANGE_WAY_SQR": 64, + "DIST_TO_START_RAYCAST_SQR": 225, + "BASE_SQRT_START_SERACH": 1225, + "Y_APPROXIMATION": 0.7, + "DELTA_LAST_SEEN_ENEMY": 20, + "REACH_DIST_COVER": 2, + "RUN_TO_COVER_MIN": 2, + "CHANCE_TO_RUN_IF_NO_AMMO_0_100": 100, + "RUN_IF_CANT_SHOOT": false, + "RUN_IF_GAOL_FAR_THEN": 10, + "SEC_TO_CHANGE_TO_RUN": 3 + }, + "Grenade": { + "DELTA_NEXT_ATTEMPT_FROM_COVER": 5, + "DELTA_NEXT_ATTEMPT": 10, + "MIN_DIST_NOT_TO_THROW": 8, + "NEAR_DELTA_THROW_TIME_SEC": 2, + "MIN_THROW_GRENADE_DIST": 12, + "MIN_THROW_GRENADE_DIST_SQRT": 144, + "MIN_DIST_NOT_TO_THROW_SQR": 64, + "RUN_AWAY": 22, + "RUN_AWAY_SQR": 484, + "ADD_GRENADE_AS_DANGER": 65, + "ADD_GRENADE_AS_DANGER_SQR": 4225, + "CHANCE_TO_NOTIFY_ENEMY_GR_100": 99, + "GrenadePerMeter": 0.1, + "REQUEST_DIST_MUST_THROW_SQRT": 4, + "REQUEST_DIST_MUST_THROW": 2, + "BEWARE_TYPE": 2, + "SHOOT_TO_SMOKE_CHANCE_100": 30, + "CHANCE_RUN_FLASHED_100": 0, + "MAX_FLASHED_DIST_TO_SHOOT": 10, + "MAX_FLASHED_DIST_TO_SHOOT_SQRT": 100, + "FLASH_GRENADE_TIME_COEF": 0.3, + "SIZE_SPOTTED_COEF": 2, + "BE_ATTENTION_COEF": 4, + "TIME_SHOOT_TO_FLASH": 4, + "CLOSE_TO_SMOKE_TO_SHOOT": 5, + "CLOSE_TO_SMOKE_TO_SHOOT_SQRT": 25, + "CLOSE_TO_SMOKE_TIME_DELTA": 7, + "SMOKE_CHECK_DELTA": 1, + "DELTA_GRENADE_START_TIME": 0.7, + "AMBUSH_IF_SMOKE_IN_ZONE_100": 40, + "AMBUSH_IF_SMOKE_RETURN_TO_ATTACK_SEC": 30, + "NO_RUN_FROM_AI_GRENADES": false, + "MAX_THROW_POWER": 19, + "MIN_THROW_DIST_PERCENT_0_1": 0.8, + "GrenadePrecision": 0.01, + "STOP_WHEN_THROW_GRENADE": true, + "WAIT_TIME_TURN_AWAY": 0.2, + "SMOKE_SUPPRESS_DELTA": 20, + "DAMAGE_GRENADE_SUPPRESS_DELTA": 8, + "STUN_SUPPRESS_DELTA": 9, + "CHEAT_START_GRENADE_PLACE": false, + "CAN_THROW_STRAIGHT_CONTACT": true, + "STRAIGHT_CONTACT_DELTA_SEC": -1, + "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, + "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, + "FLASH_ACCURATY": 1.6, + "FLASH_LAY_CHANCE": 1, + "STUN_HEARING": 0.01 + }, + "Cover": { + "RETURN_TO_ATTACK_AFTER_AMBUSH_MIN": 20, + "RETURN_TO_ATTACK_AFTER_AMBUSH_MAX": 50, + "SOUND_TO_GET_SPOTTED": 2, + "TIME_TO_MOVE_TO_COVER": 15, + "MAX_DIST_OF_COVER": 4, + "CHANGE_RUN_TO_COVER_SEC": 5, + "CHANGE_RUN_TO_COVER_SEC_GREANDE": 0.6, + "MIN_DIST_TO_ENEMY": 9, + "DIST_CANT_CHANGE_WAY": 5, + "DIST_CHECK_SFETY": 9, + "TIME_CHECK_SAFE": 2, + "HIDE_TO_COVER_TIME": 1.5, + "MAX_DIST_OF_COVER_SQR": 16, + "DIST_CANT_CHANGE_WAY_SQR": 25, + "SPOTTED_COVERS_RADIUS": 3, + "LOOK_LAST_ENEMY_POS_MOVING": 1.5, + "LOOK_TO_HIT_POINT_IF_LAST_ENEMY": 3, + "LOOK_LAST_ENEMY_POS_LOOKAROUND": 45, + "OFFSET_LOOK_ALONG_WALL_ANG": 20, + "SPOTTED_GRENADE_RADIUS": 16, + "MAX_SPOTTED_TIME_SEC": 45, + "WAIT_INT_COVER_FINDING_ENEMY": 2, + "CLOSE_DIST_POINT_SQRT": 4, + "DELTA_SEEN_FROM_COVE_LAST_POS": 15, + "MOVE_TO_COVER_WHEN_TARGET": false, + "RUN_COVER_IF_CAN_AND_NO_ENEMIES": false, + "SPOTTED_GRENADE_TIME": 7, + "DEPENDS_Y_DIST_TO_BOT": false, + "RUN_IF_FAR": 15, + "RUN_IF_FAR_SQRT": 225, + "STAY_IF_FAR": 25, + "STAY_IF_FAR_SQRT": 625, + "CHECK_COVER_ENEMY_LOOK": true, + "SHOOT_NEAR_TO_LEAVE": 2, + "SHOOT_NEAR_SEC_PERIOD": 1, + "HITS_TO_LEAVE_COVER": 2, + "HITS_TO_LEAVE_COVER_UNKNOWN": 2, + "DOG_FIGHT_AFTER_LEAVE": 4, + "NOT_LOOK_AT_WALL_IS_DANGER": true, + "MIN_DEFENCE_LEVEL": 22, + "GOOD_DIST_TO_POINT_COEF": 1.8, + "ENEMY_DIST_TO_GO_OUT": 1, + "STATIONARY_WEAPON_NO_ENEMY_GETUP": 20, + "STATIONARY_WEAPON_MAX_DIST_TO_USE": 40 + }, + "Patrol": { + "LOOK_TIME_BASE": 12, + "CAN_LOOK_TO_DEADBODIES": true, + "RESERVE_TIME_STAY": 72, + "CAN_CHOOSE_RESERV": false, + "TRY_CHOOSE_RESERV_WAY_ON_START": false, + "FRIEND_SEARCH_SEC": 12, + "TALK_DELAY": 1.1, + "MIN_TALK_DELAY": 35, + "TALK_DELAY_BIG": 15.1, + "CHANGE_WAY_TIME": 125.1, + "MIN_DIST_TO_CLOSE_TALK": 5, + "VISION_DIST_COEF_PEACE": 1, + "MIN_DIST_TO_CLOSE_TALK_SQR": 25, + "CHANCE_TO_CUT_WAY_0_100": 75, + "CUT_WAY_MIN_0_1": 0.4, + "CUT_WAY_MAX_0_1": 0.65, + "CHANCE_TO_CHANGE_WAY_0_100": 50, + "CHANCE_TO_SHOOT_DEADBODY": 52, + "SUSPETION_PLACE_LIFETIME": 7, + "RESERVE_OUT_TIME": 30, + "CLOSE_TO_SELECT_RESERV_WAY": 25, + "MAX_YDIST_TO_START_WARN_REQUEST_TO_REQUESTER": 5, + "CAN_WATCH_SECOND_WEAPON": true + }, + "Hearing": { + "BOT_CLOSE_PANIC_DIST": 2, + "CHANCE_TO_HEAR_SIMPLE_SOUND_0_1": 0.95, + "DISPERSION_COEF": 10.6, + "CLOSE_DIST": 20, + "FAR_DIST": 60, + "SOUND_DIR_DEEFREE": 30, + "DIST_PLACE_TO_FIND_POINT": 70, + "DEAD_BODY_SOUND_RAD": 30, + "LOOK_ONLY_DANGER": false, + "RESET_TIMER_DIST": 17, + "HEAR_DELAY_WHEN_PEACE": 0.5, + "HEAR_DELAY_WHEN_HAVE_SMT": 0.5, + "LOOK_ONLY_DANGER_DELTA": 9 + }, + "Mind": { + "MIN_SHOOTS_TIME": 2, + "MAX_SHOOTS_TIME": 4, + "TIME_LEAVE_MAP": 23, + "TIME_TO_RUN_TO_COVER_CAUSE_SHOOT_SEC": 15, + "DAMAGE_REDUCTION_TIME_SEC": 20, + "MIN_DAMAGE_SCARE": 20, + "CHANCE_TO_RUN_CAUSE_DAMAGE_0_100": 35, + "TIME_TO_FORGOR_ABOUT_ENEMY_SEC": 52, + "TIME_TO_FIND_ENEMY": 22, + "MAX_AGGRO_BOT_DIST": 100, + "HIT_POINT_DETECTION": 4, + "DANGER_POINT_CHOOSE_COEF": 1, + "SIMPLE_POINT_CHOOSE_COEF": 0.4, + "LASTSEEN_POINT_CHOOSE_COEF": 0.2, + "FOLLOWER_AND_BOSS_WARN_EQUAL_PRIORITY": true, + "COVER_DIST_COEF": 1.5, + "DIST_TO_FOUND_SQRT": 400, + "MAX_AGGRO_BOT_DIST_SQR": 10000, + "DIST_TO_STOP_RUN_ENEMY": 15, + "ENEMY_LOOK_AT_ME_ANG": 15, + "MIN_START_AGGRESION_COEF": 1, + "MAX_START_AGGRESION_COEF": 3, + "CAN_TAKE_ITEMS": true, + "CHECK_MARK_OF_UNKNOWS": true, + "BULLET_FEEL_DIST": 160, + "BULLET_FEEL_CLOSE_SDIST": 1, + "ATTACK_IMMEDIATLY_CHANCE_0_100": 40, + "CHANCE_FUCK_YOU_ON_CONTACT_100": 0.01, + "FRIEND_DEAD_AGR_LOW": -0.2, + "FRIEND_AGR_KILL": 0.2, + "LAST_ENEMY_LOOK_TO": 40, + "SURGE_KIT_ONLY_SAFE_CONTAINER": false, + "CAN_RECEIVE_PLAYER_REQUESTS_SAVAGE": true, + "CAN_RECEIVE_PLAYER_REQUESTS_BEAR": false, + "CAN_RECEIVE_PLAYER_REQUESTS_USEC": false, + "CAN_USE_MEDS": true, + "SUSPETION_POINT_CHANCE_ADD100": 0, + "AMBUSH_WHEN_UNDER_FIRE": true, + "AMBUSH_WHEN_UNDER_FIRE_TIME_RESIST": 60, + "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, + "PROTECT_TIME_REAL": true, + "CHANCE_SHOOT_WHEN_WARN_PLAYER_100": 25, + "CAN_PANIC_IS_PROTECT": false, + "NO_RUN_AWAY_FOR_SAFE": false, + "PART_PERCENT_TO_HEAL": 0.65, + "PROTECT_DELTA_HEAL_SEC": 10, + "CAN_STAND_BY": true, + "CAN_THROW_REQUESTS": true, + "GROUP_ANY_PHRASE_DELAY": -1, + "GROUP_EXACTLY_PHRASE_DELAY": 20, + "DIST_TO_ENEMY_YO_CAN_HEAL": 30, + "CHANCE_TO_STAY_WHEN_WARN_PLAYER_100": 80, + "DOG_FIGHT_OUT": 6, + "DOG_FIGHT_IN": 3, + "SHOOT_INSTEAD_DOG_FIGHT": 9, + "PISTOL_SHOTGUN_AMBUSH_DIST": 60, + "STANDART_AMBUSH_DIST": 200, + "AI_POWER_COEF": 120, + "COVER_SECONDS_AFTER_LOSE_VISION": 10, + "COVER_SELF_ALWAYS_IF_DAMAGED": false, + "SEC_TO_MORE_DIST_TO_RUN": 10, + "HEAL_DELAY_SEC": 5, + "HIT_DELAY_WHEN_HAVE_SMT": -1, + "HIT_DELAY_WHEN_PEACE": -1, + "TALK_WITH_QUERY": true, + "WILL_PERSUE_AXEMAN": true, + "MAY_BE_CALLED_FOR_HELP": true + }, + "Boss": { + "BOSS_DIST_TO_WARNING": 34, + "BOSS_DIST_TO_WARNING_SQRT": 1156, + "BOSS_DIST_TO_WARNING_OUT": 43, + "BOSS_DIST_TO_WARNING_OUT_SQRT": 1849, + "BOSS_DIST_TO_SHOOT": 16, + "BOSS_DIST_TO_SHOOT_SQRT": 256, + "CHANCE_TO_SEND_GRENADE_100": 100, + "MAX_DIST_COVER_BOSS": 25, + "MAX_DIST_COVER_BOSS_SQRT": 625, + "MAX_DIST_DECIDER_TO_SEND": 35, + "MAX_DIST_DECIDER_TO_SEND_SQRT": 1225, + "TIME_AFTER_LOSE": 15, + "TIME_AFTER_LOSE_DELTA": 60, + "PERSONS_SEND": 2, + "DELTA_SEARCH_TIME": 18, + "COVER_TO_SEND": true, + "WAIT_NO_ATTACK_SAVAGE": 10, + "CHANCE_USE_RESERVE_PATROL_100": 50, + "KILLA_Y_DELTA_TO_BE_ENEMY_BOSS": 5, + "KILLA_DITANCE_TO_BE_ENEMY_BOSS": 45, + "KILLA_START_SEARCH_SEC": 40, + "KILLA_CONTUTION_TIME": 5, + "KILLA_CLOSE_ATTACK_DIST": 8, + "KILLA_MIDDLE_ATTACK_DIST": 22, + "KILLA_LARGE_ATTACK_DIST": 41, + "KILLA_SEARCH_METERS": 30, + "KILLA_DEF_DIST_SQRT": 225, + "KILLA_SEARCH_SEC_STOP_AFTER_COMING": 25, + "KILLA_DIST_TO_GO_TO_SUPPRESS": 6, + "KILLA_AFTER_GRENADE_SUPPRESS_DELAY": 2, + "KILLA_CLOSEATTACK_TIMES": 3, + "KILLA_CLOSEATTACK_DELAY": 10, + "KILLA_HOLD_DELAY": 5, + "KILLA_BULLET_TO_RELOAD": 15, + "SHALL_WARN": true, + "KOJANIY_DIST_WHEN_READY": 40, + "KOJANIY_DIST_TO_BE_ENEMY": 200, + "KOJANIY_MIN_DIST_TO_LOOT": 20, + "KOJANIY_MIN_DIST_TO_LOOT_SQRT": 400, + "KOJANIY_DIST_ENEMY_TOO_CLOSE": 17, + "KOJANIY_MANY_ENEMIES_COEF": 1.5, + "KILLA_ENEMIES_TO_ATTACK": 3, + "KILLA_ONE_IS_CLOSE": 30, + "KILLA_TRIGGER_DOWN_DELAY": 1, + "KILLA_WAIT_IN_COVER_COEF": 1 + }, + "Core": { + "VisibleAngle": 140, + "VisibleDistance": 137, + "GainSightCoef": 0.01, + "ScatteringPerMeter": 0.05, + "ScatteringClosePerMeter": 0.1, + "DamageCoeff": 1, + "HearingSense": 3.85, + "CanRun": true, + "CanGrenade": true, + "AimingType": "normal", + "PistolFireDistancePref": 35, + "ShotgunFireDistancePref": 50, + "RifleFireDistancePref": 100, + "AccuratySpeed": 0.3, + "WaitInCoverBetweenShotsSec": 1.5 + }, + "Scattering": { + "MinScatter": 0.015, + "WorkingScatter": 0.15, + "MaxScatter": 0.3, + "SpeedUp": 0.6, + "SpeedUpAim": 1.8, + "SpeedDown": -0.2, + "ToSlowBotSpeed": 1.8, + "ToLowBotSpeed": 2.8, + "ToUpBotSpeed": 4.3, + "MovingSlowCoef": 1.4, + "ToLowBotAngularSpeed": 140, + "ToStopBotAngularSpeed": 80, + "FromShot": 0.001, + "TracerCoef": 1.3, + "HandDamageScatteringMinMax": 0.7, + "HandDamageAccuracySpeed": 1.3, + "BloodFall": 1.45, + "Caution": 0.03, + "ToCaution": 0.6, + "RecoilControlCoefShootDone": 0.0003, + "RecoilControlCoefShootDoneAuto": 0.00015, + "AMPLITUDE_FACTOR": 0.015, + "AMPLITUDE_SPEED": 0.001, + "DIST_FROM_OLD_POINT_TO_NOT_AIM": 15, + "DIST_FROM_OLD_POINT_TO_NOT_AIM_SQRT": 225, + "DIST_NOT_TO_SHOOT": 0.3, + "PoseChnageCoef": 0.1, + "LayFactor": 0.1, + "RecoilYCoef": 0.0005, + "RecoilYCoefSppedDown": -0.52, + "RecoilYMax": 1 + } + } + }, + "chances": { + "equipment": { + "Headwear": 100, + "Earpiece": 0, + "FaceCover": 100, + "ArmorVest": 0, + "Eyewear": 0, + "ArmBand": 0, + "TacticalVest": 100, + "Backpack": 0, + "FirstPrimaryWeapon": 0, + "SecondPrimaryWeapon": 0, + "Holster": 100, + "Scabbard": 100, + "Pockets": 100, + "SecuredContainer": 100 + }, + "weaponMods": { + "mod_magazine": 100, + "mod_sight_rear": 0 + }, + "equipmentMods": {} + }, + "generation": { + "items": { + "specialItems": { + "weights": { + "0": 1, + "1": 0 + }, + "whitelist": [] + }, + "healing": { + "weights": { + "0": 1, + "1": 2, + "2": 1 + }, + "whitelist": [] + }, + "drugs": { + "weights": { + "0": 1, + "1": 2, + "2": 0 + }, + "whitelist": [] + }, + "stims": { + "weights": { + "0": 2, + "1": 1, + "2": 0 + }, + "whitelist": [] + }, + "food": { + "weights": { + "0": 10, + "1": 5, + "2": 2 + }, + "whitelist": [] + }, + "drink": { + "weights": { + "0": 10, + "1": 5, + "2": 2 + }, + "whitelist": [] + }, + "currency": { + "weights": { + "0": 20, + "1": 5, + "2": 1 + }, + "whitelist": [] + }, + "backpackLoot": { + "weights": { + "0": 1, + "1": 1, + "2": 2, + "3": 1, + "4": 1, + "5": 1, + "6": 1, + "7": 0 + }, + "whitelist": [] + }, + "pocketLoot": { + "weights": { + "0": 1, + "1": 6, + "2": 3, + "3": 1, + "4": 1 + }, + "whitelist": [] + }, + "vestLoot": { + "weights": { + "0": 1, + "1": 1, + "2": 2, + "3": 1, + "4": 0, + "5": 0, + "6": 0 + }, + "whitelist": [] + }, + "magazines": { + "weights": { + "0": 0, + "1": 0, + "2": 1, + "3": 3, + "4": 1 + }, + "whitelist": [] + }, + "grenades": { + "weights": { + "0": 1, + "1": 2, + "2": 1, + "3": 1, + "4": 0, + "5": 0 + }, + "whitelist": [] + } + } + } +} \ No newline at end of file From a3c8faaaaacccc94ebd05f721fa5514e9f771537 Mon Sep 17 00:00:00 2001 From: Dev Date: Wed, 24 Apr 2024 13:05:37 +0100 Subject: [PATCH 13/15] Remove core from `getAllBotDifficulties()` --- project/src/controllers/BotController.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/project/src/controllers/BotController.ts b/project/src/controllers/BotController.ts index 30967cee..b89d64f2 100644 --- a/project/src/controllers/BotController.ts +++ b/project/src/controllers/BotController.ts @@ -170,8 +170,6 @@ export class BotController } } - result["core"] = this.getBotCoreDifficulty(); - return result; } From d68734e5711d2a9c66a17ff6ef54b83fad2f15c2 Mon Sep 17 00:00:00 2001 From: Refringe Date: Wed, 24 Apr 2024 09:37:16 -0400 Subject: [PATCH 14/15] Limits Glukhar Labs Access Cards This change limits the number of Labs Access Cards that can spawn on on Glukhar and his guards to one. We had a report of three spawning on Glukhar, and two spawning on one of his guards, all in the same raid. --- project/assets/configs/bot.json | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/project/assets/configs/bot.json b/project/assets/configs/bot.json index 706a822f..62dd816a 100644 --- a/project/assets/configs/bot.json +++ b/project/assets/configs/bot.json @@ -320,7 +320,9 @@ "bossbully": { "5448ba0b4bdc2d02308b456c": 1 }, - "bossgluhar": {}, + "bossgluhar": { + "5c94bbff86f7747ee735c08f": 1 + }, "bosskilla": {}, "bosskojaniy": { "5d08d21286f774736e7c94c3": 1, @@ -340,16 +342,20 @@ "5448ba0b4bdc2d02308b456c": 1 }, "followergluharassault": { - "5c0fa877d174af02a012e1cf": 1 + "5c0fa877d174af02a012e1cf": 1, + "5c94bbff86f7747ee735c08f": 1 }, "followergluharscout": { - "5c0fa877d174af02a012e1cf": 1 + "5c0fa877d174af02a012e1cf": 1, + "5c94bbff86f7747ee735c08f": 1 }, "followergluharsecurity": { - "5c0fa877d174af02a012e1cf": 1 + "5c0fa877d174af02a012e1cf": 1, + "5c94bbff86f7747ee735c08f": 1 }, "followergluharsnipe": { - "5c0fa877d174af02a012e1cf": 1 + "5c0fa877d174af02a012e1cf": 1, + "5c94bbff86f7747ee735c08f": 1 }, "followerkojaniy": { "5448e8d64bdc2dce718b4568": 2 From d8504950f26a85a3ba681c6cd8a9abc79a9924d6 Mon Sep 17 00:00:00 2001 From: Refringe Date: Wed, 24 Apr 2024 09:57:17 -0400 Subject: [PATCH 15/15] Additional Card Limits to Glukhar Guards This refines the previous commit to only allowing Glukhar to spawn a Labs access key card. His guards will not spawn any. --- project/assets/configs/bot.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/project/assets/configs/bot.json b/project/assets/configs/bot.json index 62dd816a..1e4efb5f 100644 --- a/project/assets/configs/bot.json +++ b/project/assets/configs/bot.json @@ -343,19 +343,19 @@ }, "followergluharassault": { "5c0fa877d174af02a012e1cf": 1, - "5c94bbff86f7747ee735c08f": 1 + "5c94bbff86f7747ee735c08f": 0 }, "followergluharscout": { "5c0fa877d174af02a012e1cf": 1, - "5c94bbff86f7747ee735c08f": 1 + "5c94bbff86f7747ee735c08f": 0 }, "followergluharsecurity": { "5c0fa877d174af02a012e1cf": 1, - "5c94bbff86f7747ee735c08f": 1 + "5c94bbff86f7747ee735c08f": 0 }, "followergluharsnipe": { "5c0fa877d174af02a012e1cf": 1, - "5c94bbff86f7747ee735c08f": 1 + "5c94bbff86f7747ee735c08f": 0 }, "followerkojaniy": { "5448e8d64bdc2dce718b4568": 2